﻿<?xml version="1.0" encoding="utf-8"?>
<ReportsExport>
	<Reports>
		<Report id="f7c12284-bdb6-4da4-a04c-56210377c01f" codekey="HUKeLearning_Auswertung_Bildungszeit_Qualifizierun" categoryCodekey="CreditPoints" name="Auswertung Bildungszeit (Qualifizierung)" description="">
			<MetaData created="2021-10-08T17:33:16" createdBy="251_LastName, 251_FirstName (251)" createdBy_user_id="251" modified="2022-10-21T17:12:35" modifiedBy="Administrator_LastName, Administrator_FirstName (Administrator)" modifiedBy_user_id="243" />
			<ExecutionDetails format="TableResult" commandType="SqlCommandOrQuery" exportHandler="" adminControl="" exportMultipleTablesToSheets="False" datesWithTime="False" extraParams="" />
			<Mandators mandatorMode="OnlyOwner" mandator_id="f7a65c38-6ce4-41c9-aaf7-c6111449f0f0" mandatorName="HUKeLearning" isStandard="False" isUsedByMenu="False" />
			<Parameters>
				<Parameter id="79fd307f-f3f9-4345-a628-2551cc5ba444" isRequired="False" allowMultiSelect="False" name="Datum" contextName="Datum" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
				<Parameter id="a5485539-67e0-4912-8255-8081a54efb3c" isRequired="False" allowMultiSelect="False" name="Zielgruppe" contextName="Zielgruppe" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
				<Parameter id="7958af06-3e85-4dbe-b2ea-114699e66aa5" isRequired="False" allowMultiSelect="False" name="Qualification" contextName="Qualification" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
			</Parameters>
			<Roles>
				<Role id="20" />
				<Role id="55" />
				<Role id="80" />
				<Role id="90" />
			</Roles>
			<command>
				--DECLARE @current_mandator_id UNIQUEIDENTIFIER = 'F7A65C38-6CE4-41C9-AAF7-C6111449F0F0'
				--DECLARE @current_user_id INT = 243--dbo.fn_GetAutoScriptUserId(@current_mandator_id)
				--DECLARE @qualification_id UNIQUEIDENTIFIER = '80755E96-CF51-47EC-86CE-D6F157FC7904'
				--DECLARE @targetGroup_id INT = 474 -- 228
				--DECLARE @date DATE = '2020-12-01'

				DECLARE @planwert INT
				SET @planwert = MONTH(@date)
				IF(@planwert &gt; 9)
				SET @planwert = 15


				DECLARE @mandator_name AS NVARCHAR(255)
				DECLARE @queryOutputColumns NVARCHAR(MAX)
				CREATE TABLE #queryOutputColumns
				(
				mandatorName NVARCHAR(255),
				[columns] NVARCHAR(MAX)
				)
				CREATE TABLE #ResultTable
				(
				user_id NVARCHAR(64),
				lastname NVARCHAR(128),
				firstname NVARCHAR(128),
				username NVARCHAR(128),
				division NVARCHAR(128),
				eintrittsdatum NVARCHAR(64),
				austrittsdatum NVARCHAR(64),
				qualification_id NVARCHAR(64),
				qualificationPeriod_id NVARCHAR(64),
				status NVARCHAR(8),
				currentEducationTime REAL,
				seminarEducationTime REAL,
				qualificationMinTime INT,
				startDate DATETIME,
				endDate DATETIME,
				employeeId NVARCHAR(50) NULL,
				potentialEducationTime INT NULL
				)

				DECLARE @OrgUnits TABLE
				(
				id UNIQUEIDENTIFIER,
				parent_id UNIQUEIDENTIFIER,
				parentTitle NVARCHAR(256),
				title NVARCHAR(256),
				nodeType INT,
				codekey NVARCHAR(256),
				mandator_id UNIQUEIDENTIFIER,
				mandatorName NVARCHAR(256),
				orgUnitPath NVARCHAR(750)
				)
				INSERT INTO #queryOutputColumns
				SELECT 'ergo-ecampus-at', '
				lastname AS ''Name'',
				firstname AS ''Vorname'',
				username ''Kennung'',
				rt.division ''Abteilung'',
				uca.customAttribute5 AS [Eintrittsdatum],
				uca.customAttribute6 AS [Austrittsdatum],
				(SELECT customAttribute3 FROM tblUserCustomAttributes WHERE user_id = rt.user_id) AS ''Ressort'',
				(SELECT customAttribute4 FROM tblUserCustomAttributes WHERE user_id = rt.user_id) AS ''Bereich'',
				status ''Status'',
				dbo.fn_GetEducationTimeString(currentEducationTime) ''Ist-BZ'',
				dbo.fn_GetEducationTimeString(seminarEducationTime) ''Seminar'',
				dbo.fn_GetEducationTimeString(qualificationMinTime) ''Soll-BZ'',
				DATEADD(dd, 0, DATEDIFF(dd, 0, startDate)) ''Beginn'',
				DATEADD(dd, 0, DATEDIFF(dd, 0, endDate)) ''End'''
				INSERT INTO #queryOutputColumns
				SELECT 'Continentale', '
				lastname AS ''Name'',
				firstname AS ''Vorname'',
				username ''Kennung'',
				employeeId AS ''Interne ID'',
				rt.division ''Abteilung'',
				status ''Status'',
				dbo.fn_GetEducationTimeString(currentEducationTime) ''Ist-BZ'',
				dbo.fn_GetEducationTimeString(seminarEducationTime) ''Seminar'',
				dbo.fn_GetEducationTimeString(qualificationMinTime) ''Soll-BZ'',
				DATEADD(dd, 0, DATEDIFF(dd, 0, startDate)) ''Beginn'',
				DATEADD(dd, 0, DATEDIFF(dd, 0, endDate)) ''End'''

				INSERT @OrgUnits
				EXEC dbo.sp_GetOrganisationUnitsForUser @mandator_id = @current_mandator_id, @user_id = @current_user_id

				SELECT @mandator_name = name FROM tblMandators WHERE id = @current_mandator_id


				INSERT INTO #ResultTable
				SELECT DISTINCT
				u.intUserCn AS user_id,
				u.Nachname AS lastname,
				u.Vorname AS firstname,
				u.descUserCn AS username,
				u.division AS division,
				uca.customAttribute5 AS [Eintrittsdatum],
				uca.customAttribute6 AS [Austrittsdatum],
				q.id,
				uqp.id,
				'Grau' AS status,
				uqp.currentEducationTime,
				0 AS seminarEducationTime,
				q.minTime AS qualificationMinTime,
				DATEFROMPARTS(YEAR(@date), 1, 1) AS startDate,
				DATEFROMPARTS(YEAR(@date), 12, 31) AS endDate,
				u.employeeId,
				0
				FROM v_Users u
				INNER JOIN tblUserQualificationPeriods uqp ON u.intUserCn = uqp.user_id
				INNER JOIN tblQualifications q ON uqp.qualification_id = q.id
				INNER JOIN tblUserCustomAttributes uca ON uca.user_id = u.intUserCn
				LEFT OUTER JOIN tblUsersTargetGroups utg ON u.intUserCn = utg.UserCn
				INNER JOIN tblTargetGroups tg ON utg.targetGroup_id = tg.id
				WHERE u.mandator_id = @current_mandator_id
				AND q.id = @qualification_id
				AND uqp.startDate &lt;= @date
				AND YEAR(@date) = YEAR(uqp.startDate)
				AND YEAR(uqp.startDate) &lt;&gt; YEAR(ISNULL(uqp.endDate, DATEADD(MONTH, q.periodDurationMonths, uqp.startDate))) -- to make sure any invalid periods aren't taken
				AND ISNULL(@targetGroup_id, tg.id) = tg.id
				AND (EXISTS(SELECT * FROM v_Users WHERE intUserCn = @current_user_id AND securityId = 100)
				OR EXISTS(SELECT * FROM tblTargetGroupManagers WHERE tblTargetGroupManagers.user_id = @current_user_id
				AND tblTargetGroupManagers.targetGroup_id = tg.id)
				OR EXISTS(SELECT * FROM @OrgUnits AS OrgUnits JOIN tblUsersOrganisationUnits ON organisationunit_id = OrgUnits.id AND user_id = u.intUserCn)
				OR EXISTS(SELECT *
				FROM tblRolesFunctions
				JOIN tblRoles ON tblRoles.id = tblRolesFunctions.role_id
				JOIN tblFunctions ON tblFunctions.id = tblRolesFunctions.function_id
				AND tblFunctions.shortcut = 'FcnIsAuthorizedForAllTGs'
				INNER JOIN v_Users
				ON  v_Users.SecurityID = tblRoles.id
				WHERE
				tblRolesFunctions.mandator_id = @current_mandator_id
				AND v_Users.intUserCn = @current_user_id))
				AND tg.mandator_id = @current_mandator_id
				AND defaultforlibrary = 0
				AND u.blocked = 0 AND ISNULL(u.userStatus,0) &lt;&gt; 2 -- only none blocked and not resigned users

				UPDATE #ResultTable
				SET currentEducationTime = ISNULL(userScores.totalEducationTime, 0),
				seminarEducationTime = ISNULL(userScores.totalSeminarEducationTime, 0)
				FROM #ResultTable AS res
				LEFT JOIN
				(
				SELECT DISTINCT
				user_id,
				qualificationPeriod_id,
				SUM(educationTime) AS totalEducationTime,
				SUM(seminarEducationTime) AS totalSeminarEducationTime
				FROM
				(
				SELECT
				tbluserItemScores.user_id,
				tblUserQualificationPeriods.id AS qualificationPeriod_id,
				ISNULL(tbluserItemScores.educationTime, 0) AS educationTime,
				(SELECT ISNULL(tbluserItemScores.educationTime, 0)
				--FROM tblItems AS A
				-- changes RCZ Optimizations
				FROM v_Items AS A
				WHERE A.item_id= tbluserItemScores.item_id
				AND (itemType_id = 2
				OR itemType_id = 8)) AS seminarEducationTime
				FROM
				tblUserItemScores
				INNER JOIN tblItems ON tblItems.id = tblUserItemscores.item_id
				INNER JOIN tblUserItemScoresQualifications
				ON tblUserItemScores.id = tblUserItemScoresQualifications.useritemscore_id
				INNER JOIN tblQualifications ON tblQualifications.id = tblUserItemScoresQualifications.qualification_id
				INNER JOIN tblUserQualificationPeriods
				ON tblUserQualificationPeriods.user_id = tblUserItemScores.user_id
				AND tblUserQualificationPeriods.qualification_id = tblUserItemScoresQualifications.qualification_id
				-- AND tblUserQualificationPeriods.endDate IS NULL
				WHERE
				tblUserItemScoresQualifications.qualification_id = @qualification_id
				AND YEAR(tblUserItemScores.startDate) = YEAR(@date)
				AND tblUserItemScores.startDate &lt;= @date
				AND (tblUserItemScores.endDate IS NULL OR
				tblUserItemScores.endDate &lt;= @date)
				--changes RCZ Optimizations
				AND tblItems.deleted IS NULL
				AND ISNULL(tblItems.educationTime,0) &gt; 0
				---	Bausteintypen (Module, Lernprogramme, SeminarTitel, Tests)
				AND tblItems.itemType_id IN (0,1,2,8,1001)
				) AS A
				GROUP BY
				qualificationPeriod_id, user_id
				) AS userScores
				ON userScores.user_id = res.user_id
				AND res.qualificationPeriod_id = userScores.qualificationPeriod_id
				WHERE startDate IS NOT NULL


				-- we have to add additional educationTime to the items the user has assigned and where he may can recieve educationTime
				-- this is the section for the TESTS
				;WITH CTE
				(
				user_id, item_id, itemEducationTime
				) AS
				(
				SELECT user_id, item_id, itemEducationTime
				FROM v_UsersAssignedScoreableItems
				INNER JOIN tblTasTests ON tblTasTests.id = v_UsersAssignedScoreableItems.item_id
				CROSS APPLY
				[dbo].[fn_GetPotentialUserCreditPoints](
				v_UsersAssignedScoreableItems.user_id,
				v_UsersAssignedScoreableItems.item_id,
				/* status information of the given item (0,1,2), NULL is used for tests!!! */
				2, NULL) as potentialTime
				WHERE
				(
				-- check for grey and red status where user could achieve educationTime
				(SELECT TOP 1 ISNULL(status,0) FROM tblStatusUserItemHistory AS suih WHERE suih.user_id = v_UsersAssignedScoreableItems.user_id AND suih.item_id = v_UsersAssignedScoreableItems.item_id) IN (0,3)
				)
				AND EXISTS(SELECT TOP 1 * FROM #ResultTable WHERE #ResultTable.user_id = v_UsersAssignedScoreableItems.user_id)
				AND EXISTS(SELECT TOP 1 * FROM tblQualificationsItems AS qi WHERE qi.item_id = v_UsersAssignedScoreableItems.item_id)
				)
				UPDATE #ResultTable
				SET potentialEducationTime = potentialEducationTime + ISNULL((SELECT SUM(itemEducationTime) FROM CTE WHERE CTE.user_id = #ResultTable.user_id GROUP BY CTE.user_id),0)
				FROM #ResultTable

				-- we have to add additional educationTime to the items the user has assigned and where he may can recieve educationTime
				-- this is the section for the Themes
				;WITH CTE
				(
				user_id, item_id, itemEducationTime
				) AS
				(
				SELECT user_id, item_id, itemEducationTime
				FROM v_UsersAssignedScoreableItems
				INNER JOIN tblThemes ON tblThemes.id = v_UsersAssignedScoreableItems.item_id
				CROSS APPLY
				[dbo].[fn_GetPotentialUserCreditPoints](
				v_UsersAssignedScoreableItems.user_id,
				v_UsersAssignedScoreableItems.item_id,
				/* status information of the given item (0,1,2), NULL is used for tests!!! */
				2, NULL) as potentialTime
				WHERE
				(
				-- check for yellow status where user could achieve educationTime
				(SELECT TOP 1 ISNULL(status,0) FROM tblStatusUserItemHistory AS suih WHERE suih.user_id = v_UsersAssignedScoreableItems.user_id AND suih.item_id = v_UsersAssignedScoreableItems.item_id) = 1
				)
				AND EXISTS(SELECT TOP 1 * FROM #ResultTable WHERE #ResultTable.user_id = v_UsersAssignedScoreableItems.user_id)
				AND EXISTS(SELECT TOP 1 * FROM tblQualificationsItems AS qi WHERE qi.item_id = v_UsersAssignedScoreableItems.item_id)
				)
				UPDATE #ResultTable
				SET potentialEducationTime = potentialEducationTime + ISNULL((SELECT SUM(itemEducationTime) FROM CTE WHERE CTE.user_id = #ResultTable.user_id GROUP BY CTE.user_id),0)
				FROM #ResultTable

				-- we have to add additional educationTime to the items the user has assigned and where he may can recieve educationTime
				-- this is the section for the Modules
				;WITH CTE
				(
				user_id, item_id, itemEducationTime
				) AS
				(
				SELECT user_id, item_id, itemEducationTime
				FROM v_UsersAssignedScoreableItems
				INNER JOIN tblModules ON tblModules.id = v_UsersAssignedScoreableItems.item_id
				CROSS APPLY
				[dbo].[fn_GetPotentialUserCreditPoints](
				v_UsersAssignedScoreableItems.user_id,
				v_UsersAssignedScoreableItems.item_id,
				/* status information of the given item (0,1,2), NULL is used for tests!!! */
				2, NULL) as potentialTime
				WHERE
				(
				-- check for yellow status where user could achieve educationTime
				(SELECT TOP 1 ISNULL(status,0) FROM tblStatusUserItemHistory AS suih WHERE suih.user_id = v_UsersAssignedScoreableItems.user_id AND suih.item_id = v_UsersAssignedScoreableItems.item_id) IN (0,1,3)
				)
				AND EXISTS(SELECT TOP 1 * FROM #ResultTable WHERE #ResultTable.user_id = v_UsersAssignedScoreableItems.user_id)
				AND EXISTS(SELECT TOP 1 * FROM tblQualificationsItems AS qi WHERE qi.item_id = v_UsersAssignedScoreableItems.item_id)
				)
				UPDATE #ResultTable
				SET potentialEducationTime = potentialEducationTime + ISNULL((SELECT SUM(itemEducationTime) FROM CTE WHERE CTE.user_id = #ResultTable.user_id GROUP BY CTE.user_id),0)
				FROM #ResultTable

				-- we have to add additional educationTime to the items the user has assigned and where he may can recieve educationTime
				-- this is the section for the Trainings which are not yet completed
				;WITH CTE
				(
				user_id, item_id, itemEducationTime
				) AS
				(
				SELECT user_id, item_id, itemEducationTime
				FROM v_UsersAssignedScoreableItems
				-- trainingTitles are assigned as scoreable Items in the view
				INNER JOIN tblTrainingTitles AS tt ON tt.id = v_UsersAssignedScoreableItems.item_id
				-- checking against the trainings
				INNER JOIN tblTrainings AS t ON t.trainingTitle_id = tt.id
				CROSS APPLY
				[dbo].[fn_GetPotentialUserCreditPoints](
				v_UsersAssignedScoreableItems.user_id,
				t.id,
				/* status information of the given item (0,1,2), NULL is used for tests!!! */
				2, NULL) as potentialTime
				WHERE
				(
				-- check for the correct status of the training if not yet completed
				EXISTS(SELECT TOP 1 * FROM
				tblUserTrainingStatus
				WHERE status &lt; 2 -- not yet completed
				AND actionclass_id IN (20,30,60,70)
				AND v_UsersAssignedScoreableItems.user_id = tblUserTrainingStatus.user_id
				AND t.id = tblUserTrainingStatus.training_id
				)
				)
				AND EXISTS(SELECT TOP 1 * FROM #ResultTable WHERE #ResultTable.user_id = v_UsersAssignedScoreableItems.user_id)
				AND EXISTS(SELECT TOP 1 * FROM tblQualificationsItems AS qi WHERE qi.item_id = v_UsersAssignedScoreableItems.item_id)
				)
				UPDATE #ResultTable
				SET potentialEducationTime = potentialEducationTime + ISNULL((SELECT SUM(itemEducationTime) FROM CTE WHERE CTE.user_id = #ResultTable.user_id GROUP BY CTE.user_id),0)
				FROM #ResultTable

				UPDATE #ResultTable
				SET status = CASE
				WHEN currentEducationTime &gt;= 15 * 60 THEN 'Grün'
				WHEN currentEducationTime &lt; 15 * 60
				AND currentEducationTime &gt;= 5 * 60 THEN 'Gelb'
				WHEN currentEducationTime &lt; 5 * 60 THEN 'Rot'
				ELSE 'Grau'
				END
				FROM #ResultTable AS res
				LEFT JOIN tblQualificationExchangers
				ON tblQualificationExchangers.qualification_id = res.qualification_id
				AND tblQualificationExchangers.exchangerCodeKey = 'GDVIMPORTPOINT'
				AND tblQualificationExchangers.isActive = 1
				WHERE (ISNULL(res.qualificationMinTime, 0) &gt; 0)  /* hasQuota = 1 */
				AND (tblQualificationExchangers.id IS NULL
				OR /* checking if the user is tpservice */
				(
				SELECT ISNULL(isTpService, 0)
				FROM tblUserGdvAttributes
				WHERE user_id = res.user_id) = 1
				AND /* and the qualification has a exporter of type GDVIMPORTPOINTS */
				tblQualificationExchangers.id IS NOT NULL)

				SELECT @queryOutputColumns = columns FROM #queryOutputColumns WHERE mandatorName = @mandator_name

				IF @queryOutputColumns IS NOT NULL
				BEGIN
				DECLARE @executionQuery NVARCHAR(MAX)
				SET @executionQuery = 'SELECT '
				SET @executionQuery = @executionQuery + ' ' + @queryOutputColumns + ' '
				SET @executionQuery = @executionQuery + '
				FROM #ResultTable AS rt
				LEFT JOIN tableUsers AS tu ON tu.intUserCn = rt.user_id
				ORDER BY lastname ASC, firstname ASC
				'
				EXEC (@executionQuery)
				END
				ELSE
				BEGIN
				SELECT
				lastname AS 'Name',
				firstname AS 'Vorname',
				rt.employeeId 'Kennung',
				rt.division 'Abteilung',
				[eintrittsDatum] AS "Eintrittsdatum",
				[austrittsDatum] AS "Austrittsdatum",
				CASE
				WHEN currentEducationTime &gt;= 15 * 60 THEN 'Grün'
				WHEN (@planwert = 1 OR @planwert = 2) AND currentEducationTime &gt; 0 THEN 'Gelb'
				WHEN currentEducationTime &gt; @planwert * 60 THEN 'Gelb'
				WHEN currentEducationTime &lt; @planwert * 60 THEN 'Rot'
				ELSE 'Grau'
				END AS 'Status',
				dbo.fn_GetEducationTimeString(currentEducationTime) 'Ist-BZ',
				@planwert 'Planwert',
				dbo.fn_GetEducationTimeString(qualificationMinTime+potentialEducationTime) 'Soll-BZ',
				DATEADD(dd, 0, DATEDIFF(dd, 0, startDate)) 'Beginn',
				DATEADD(dd, 0, DATEDIFF(dd, 0, endDate)) 'End'
				FROM #ResultTable AS rt
				LEFT JOIN tableUsers AS tu ON tu.intUserCn = rt.user_id
				WHERE (TRY_CAST(eintrittsdatum AS date) &lt;= @date OR eintrittsdatum = '' OR eintrittsdatum IS NULL)
				AND (TRY_CAST(austrittsdatum AS date) &gt;= @date OR austrittsdatum = '' OR austrittsdatum IS NULL)
				ORDER BY lastname ASC, firstname ASC
				END

				DROP TABLE #ResultTable
				DROP TABLE #queryOutputColumns
			</command>
		</Report>
	</Reports>
	<Parameters>
		<Parameter id="79fd307f-f3f9-4345-a628-2551cc5ba444" isSystem="True" name="Datum" reportParameterType_id="74253ba7-a386-4620-bff7-b65c16fe1e64" queryParameterName="@date" />
		<Parameter id="a5485539-67e0-4912-8255-8081a54efb3c" isSystem="True" name="Zielgruppe" reportParameterType_id="9ae252e1-18b4-4b71-982c-e27b2d3a5287" queryParameterName="@targetGroup_id" />
		<Parameter id="7958af06-3e85-4dbe-b2ea-114699e66aa5" isSystem="True" name="Qualification" reportParameterType_id="e629bb84-0db6-4d66-8009-b781cea6a13e" queryParameterName="@qualification_id" />
	</Parameters>
	<ParameterTypes>
		<ParameterType id="74253ba7-a386-4620-bff7-b65c16fe1e64" isSystem="True" name="Date" datatype="Date" dataValueField="" dataTextField="" />
		<ParameterType id="9ae252e1-18b4-4b71-982c-e27b2d3a5287" isSystem="True" name="TargetGroup" datatype="TargetGroup" dataValueField="" dataTextField="" />
		<ParameterType id="e629bb84-0db6-4d66-8009-b781cea6a13e" isSystem="True" name="Qualifications" datatype="StringDDL" dataValueField="id" dataTextField="title">
			<query>
				SELECT tblObjects.id, tblObjects.title
				FROM tblQualifications
				INNER JOIN tblObjects ON tblObjects.id = tblQualifications.id
				WHERE tblObjects.mandator_id = @current_mandator_id AND tblObjects.deleted IS NULL
				ORDER BY tblObjects.title
			</query>
		</ParameterType>
	</ParameterTypes>
</ReportsExport>