﻿<?xml version="1.0" encoding="utf-8"?>
<ReportsExport>
  <Reports>
    <Report id="a986ea1c-8881-4458-8fe8-218ee98d1c8e" codekey="CO-Auswertung" categoryCodekey="UserStats" name="CO-Report local add-on compliance training." description="&lt;b&gt;This report is only available for specific purposes due to local regulatory requirements.&lt;/b&gt;&lt;br&gt;
It can only be performed after it has been agreed and defined with Global Compliance and Legal, Global HR and Local Compliance.&lt;br&gt;
&lt;font color=&quot;red&quot;&gt;If you run the report without being authorised to do so, an error message will be displayed.&lt;/font&gt;&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Dieser Bericht ist nur für bestimmte Zwecke verfügbar, falls lokale regulatorische Anforderungen bestehen.&lt;/b&gt;&lt;br&gt;
Er kann nur ausgeführt werden, nachdem er mit Global Compliance and Legal, Global HR und Local Compliance abgestimmt und definiert wurde.&lt;br&gt;
&lt;font color=&quot;red&quot;&gt;Wenn Sie den Bericht ausführen, ohne dazu berechtigt zu sein, wird eine Fehlermeldung angezeigt.&lt;/font&gt;">
      <MetaData created="2023-04-27T11:13:18" createdBy="Rolle, Administrator (Administrator)" createdBy_user_id="12" modified="2023-04-27T14:49:17" modifiedBy="Rolle, Administrator (Administrator)" modifiedBy_user_id="12" />
      <ExecutionDetails format="TableResult" commandType="SqlCommandOrQuery" exportHandler="" adminControl="" exportMultipleTablesToSheets="True" datesWithTime="False" extraParams="" />
      <Mandators mandatorMode="OnlyOwner" mandator_id="96ba2868-8baf-4e69-b1fb-d2cc6d6832e8" mandatorName="ELECT" isStandard="False" isUsedByMenu="False" />
      <Parameters>
        <Parameter id="76f4d3c5-2618-4c32-bade-747a2fd8b2ad" isRequired="False" allowMultiSelect="True" name="Target Groups Current Mandator" contextName="Target Groups" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
      </Parameters>
      <Roles>
        <Role id="80" />
      </Roles>
      <command>-- ---------------------------------------------------------------------------
-- Testing area
-- ---------------------------------------------------------------------------
--DECLARE @current_mandator_id UNIQUEIDENTIFIER
--SET @current_mandator_id = 'D5A90A49-E697-4AEB-8A5B-298782815490' -- ELECT
--DECLARE @current_user_id INT = 2 -- Administrator

--DECLARE @targetGroup_id dbo.typeIntList;
--INSERT INTO
--    @targetGroup_id
--VALUES
--    (493) --TargetGroupAllUsers
-- ---------------------------------------------------------------------------
-- End Testing area
-- ---------------------------------------------------------------------------

IF OBJECT_ID('tempdb..#UserWbtAuthorizations') IS NOT NULL
    DROP TABLE #UserWbtAuthorizations;

CREATE TABLE #UserWbtAuthorizations
(
    authorizedUserLogon NVARCHAR(64),
    authorizedWbtTitle NVARCHAR(255)
)

INSERT INTO
    #UserWbtAuthorizations (authorizedUserLogon, authorizedWbtTitle)
/* White list of user logon and WBT title */
VALUES
    ('sd_complianceofficer', 'Test: Allgemeines Gleichbehandlungsgesetz - General Equal Treatment Act 2021 DE/EN'),
    ('sd_complianceofficer', 'Test: Anti-corruption - Korruptionsprävention EN/DE/FR')

IF OBJECT_ID('tempdb..#AuthorizedWbts') IS NOT NULL
    DROP TABLE #AuthorizedWbts;

CREATE TABLE #AuthorizedWbts
(
    authorizedWbtId UNIQUEIDENTIFIER
)

INSERT INTO
    #AuthorizedWbts(authorizedWbtId)
SELECT
    i.id
FROM
    #UserWbtAuthorizations uwa
    JOIN v_Users u
        ON  u.descUserCn = uwa.authorizedUserLogon
    JOIN tblItems i
        ON  i.title = uwa.authorizedWbtTitle
WHERE
    u.intUserCn = @current_user_id
    AND i.mandator_id = @current_mandator_id
    AND i.deleted IS NULL
    AND i.itemType_id = 1 -- WBT item type

-- No authorized WBTs found, not authorized!
IF NOT EXISTS(SELECT * FROM #AuthorizedWbts)
BEGIN
    SELECT  'Not authorized'
END
ELSE
BEGIN
    DECLARE @role_id INT
    SELECT @role_id = SecurityID FROM v_Users WHERE intUserCn = @current_user_id

    -- Get a list of the applicable users for the selected managed target groups
    IF OBJECT_ID('tempdb..#userTargetGroups') IS NOT NULL
        DROP TABLE #userTargetGroups;

    CREATE TABLE #userTargetGroups(
        user_id INT
    )

    INSERT INTO
        #userTargetGroups
    SELECT DISTINCT
        tblUsersTargetGroups.UserCn
    FROM
        @targetGroup_id AS requestedTargetGroups  --@hlpTargetGroups
        JOIN tblUsersTargetGroups
            ON requestedTargetGroups.value = tblUsersTargetGroups.targetGroup_id
        JOIN v_Users
            ON v_Users.intUserCn = UserCn
            AND v_Users.mandator_id = @current_mandator_id
            AND v_Users.userStatus = 1


    IF OBJECT_ID('tempdb..#userManagers') IS NOT NULL
        DROP TABLE #userManagers;

    CREATE TABLE #userManagers(
        user_id INT,
        fullName NVARCHAR(500)
    )

    INSERT INTO
        #userManagers
    SELECT
        #userTargetGroups.user_id, Nachname + ', ' + Vorname
    FROM
        v_Users
        JOIN tblUsersOrganisationRolesUsers
            ON v_Users.intUserCn = tblUsersOrganisationRolesUsers.userIs_id
        JOIN #userTargetGroups
            ON #userTargetGroups.user_id = tblUsersOrganisationRolesUsers.userFor_id
    WHERE
        v_Users.userStatus = 1


    IF OBJECT_ID('tempdb..#Result') IS NOT NULL
        DROP TABLE #Result;

    CREATE TABLE #Result
    (
        user_id INT,
        item_id UNIQUEIDENTIFIER,
        itemType_id INT,
        codeKey NVARCHAR(200),
        excludedInTargetGroup INT,

        overrideInitialMonths INT,
        overrideSpanMonths INT,
        assignedDate DATETIME NULL,
        overrideDate DATETIME NULL,
        voluntaryOverrideDate DATETIME NULL,
        status INT NULL,
        lastPassedEver DATETIME NULL,

        version INT NULL
    )


    INSERT INTO
        #Result
    SELECT
        v_UsersAssignedItems.user_id,
        v_UsersAssignedItems.item_id,
        v_UsersAssignedItems.itemType_id,
        'Theme',
        0,
        0,
        0,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL
    FROM
        v_UsersAssignedItems
    WHERE
        -- For the relevant users
        EXISTS
        (
            SELECT TOP 1
                *
            FROM
                #userTargetGroups
            WHERE
                #userTargetGroups.user_id = v_UsersAssignedItems.user_id
        )
        -- And the selected authorized WBTs
        AND EXISTS
        (
            SELECT
                *
            FROM
                #AuthorizedWbts
            WHERE
                #AuthorizedWbts.authorizedWbtId = v_UsersAssignedItems.item_id
        )

    UPDATE
        #Result
    SET
        overrideSpanMonths = tblItems.overrideSpanMonths,
        overrideInitialMonths = tblItems.overrideInitialMonths
    FROM
        #Result
        JOIN tblItems
            ON tblItems.id = #Result.item_id

    UPDATE
        #Result
    SET
        excludedInTargetGroup = dbo.fn_IsUserExcludedFromRecertification(#Result.user_id, #REsult.item_id)
    
    UPDATE
        #Result
    SET
        assignedDate = tblStatusUserItemOverride.assignedDate,
        overrideDate = tblStatusUserItemOverride.overrideDate,
        voluntaryOverrideDate = tblStatusUserItemOverride.voluntaryOverrideDate
    FROM
        #Result
        JOIN tblStatusUserItemOverride
            ON tblStatusUserItemOverride.user_id = #Result.user_id
            AND tblStatusUserItemOverride.item_id = #Result.item_id


    PRINT 'GETTING MAINVERSIONS'
    IF OBJECT_ID('tempdb..#itemMainVersion') IS NOT NULL
        DROP TABLE #itemMainVersion;
    
    CREATE TABLE #itemMainVersion(
        item_id UNIQUEIDENTIFIER,
        mainVersion INT
    )

    INSERT INTO
        #itemMainVersion
    SELECT
        item_id,
        (
            SELECT MAX(mainVersion)
            FROM tblVersionMap
            WHERE id = #Result.item_id
        )
    FROM
        #Result
    GROUP BY
        item_id

    -- for all users which don't have any status we know there is no status or lastpastdate
    PRINT 'SETTING NONE VERSIONS'
    UPDATE
        #Result
    SET
        status = -1,
        lastPassedEver = NULL,
        version = innerQuery.mainVersion
    FROM
        #Result
        JOIN #itemMainVersion AS innerQuery
            ON innerQuery.item_id = #Result.item_id
    WHERE
        NOT EXISTS
        (
            SELECT
                *
            FROM
                tblStatusUserItemHistory
            WHERE
                user_id = #Result.user_id
                AND item_id = #Result.item_id
        )

    -- checking for last status information for the users with endDate NULL and not overwritten
    -- so we also get the lastPassedDate
    PRINT 'GETTING GREEN STATUS AND LAST PASSED EVER'

    UPDATE
        #Result
    SET
        status = suih.status,
        lastPassedEver = suih.startDate,
        version = suih.item_version
    FROM
        #Result
        JOIN tblStatusUserItemHistory suih
            ON suih.user_id = #Result.user_id
            AND suih.item_id = #Result.item_id
            AND suih.endDate IS NULL
            AND suih.status = 2
            AND suih.overrideDate IS NULL
            AND suih.voluntaryOverrideDate IS NULL

    -- if there are not entries with status available get them via status calculation
    IF EXISTS
    (
        SELECT
            *
        FROM
            #Result
        WHERE
            #Result.status IS NULL
    )
    BEGIN
        -- for those entries without status we have to take the mainversion of the item
        PRINT 'GETTIG MISSING STATUSES'
        UPDATE
            #Result
        SET
            status = ISNULL(dbo.fn_GetUserItemStatus(user_id, #Result.item_id), 0),
            version = innerQuery.mainVersion
        FROM
            #Result
            JOIN #itemMainVersion AS innerQuery
                ON innerQuery.item_id = #Result.item_id
        WHERE
            #Result.status IS NULL
    END

    IF OBJECT_ID('tempdb..#allContents') IS NOT NULL
        DROP TABLE #allContents;

    ;WITH CTE AS
    (
        SELECT
            #Result.*,
            customAttribute1 as Location,
            CASE
                WHEN status = -1
                    THEN NULL
                ELSE
                    CASE
                        WHEN lastPassedEver IS NULL
                            THEN dbo.fn_GetUserPlainModuleItemLastPassedEver(#Result.user_id, #Result.item_id)
                        ELSE lastPassedEver
                    END
            END AS lastPassedEverCalculated
        FROM
            #Result
            LEFT JOIN tblUserCustomAttributes
                on  tblUserCustomAttributes.user_id = #Result.user_id
    )
    SELECT
        user_id,
        Location,
        codekey,
        itemType_id,
        item_id,
        lastPassedEver,
        CASE ISNULL(NULLIF(status, -1), 0)
            WHEN 0 THEN 'not attempted'
            WHEN 1 THEN 'in progress'
            WHEN 2 THEN 'completed'
            WHEN 3 THEN 'failed'
        END AS ActualLearningStatus,
        CASE
            WHEN overrideSpanMonths IS NULL OR excludedInTargetGroup = 1
                THEN 'No'
            ELSE 'Yes'
        END AS RecertificationYesNo,
        CASE
            WHEN status = -1 OR lastPassedEverCalculated IS NULL
                THEN CASE
                    WHEN ISNULL(overrideInitialMonths, 0) &gt; 0 AND excludedInTargetGroup = 0
                        THEN FORMAT(DATEADD(MONTH, overrideInitialMonths, assignedDate), 'dd MMMM yyyy')
                    ELSE NULL -- no recertification information for this item for this user
                END
            ELSE CASE
                WHEN lastPassedEverCalculated IS NOT NULL
                AND excludedInTargetGroup = 0
                AND ISNULL(overrideInitialMonths, 0) &gt; 0
                    THEN FORMAT(DATEADD(MONTH, overrideSpanMonths, lastPassedEverCalculated), 'dd MMMM yyyy')
                ELSE NULL -- no recertification information for this item for this user
            END
        END AS ValidUntil,
        CASE
            WHEN ISNULL(overrideInitialMonths, 0) &gt; 0
                THEN IIF(overrideDate IS NULL, 'valid', 'invalid')
            ELSE NULL
        END AS RecertificationStatus,
        FORMAT(assignedDate, 'dd MMMM yyyy') as AssignedSince,
        overrideSpanMonths,
        excludedInTargetGroup
    INTO
        #allContents
    FROM
        CTE


    SELECT
        descUserCn AS 'descUserCn/Personalnummer',
        Nachname AS 'Last name',
        Vorname AS 'First name',
        Location,
        division AS Department,
        CASE
            WHEN v_Users.userStatus = 1
                THEN 'Active'
            ELSE CASE
                WHEN v_Users.userStatus = 3
                    THEN 'Absent'
                ELSE 'Unknown'
            END
        END AS 'Status',
        ISNULL(#userManagers.fullName,'') AS 'Manager',
        codekey AS 'Item type',
        ISNULL(tblItems.titleForLearners, tblItems.title) AS 'Item title',
        ISNULL(tblThemes.learningDuration,0) AS 'Learning Time',
        lastPassedEver AS 'Most recently performed successfully',
        ActualLearningStatus AS 'Actual learning status',
        RecertificationYesNo AS 'Recertification Yes/No',
        ValidUntil AS 'Valid until',
        RecertificationStatus 'Recertification status',
        AssignedSince as 'Assigned since'
    FROM
        #allContents
        JOIN v_Users
            ON v_Users.intUserCn = #allContents.user_id
        JOIN tblItems
            ON tblItems.id = item_id
        JOIN tblThemes
            ON tblThemes.id = item_id
        LEFT JOIN #userManagers
            ON #userManagers.user_id = #allContents.user_id
    ORDER BY
        Nachname, Vorname, User, tblItems.itemType_id, ISNULL(tblItems.titleForLearners, tblItems.title)

    -- Test output of authorized users and WBTs
    SELECT
        uwa.authorizedUserLogon as AuthorizedUserLogon,
        i.title as AuthorizedWbtTitle
    FROM
        #UserWbtAuthorizations uwa
        LEFT JOIN tblItems i
            ON  i.title = uwa.authorizedWbtTitle
    WHERE
        i.mandator_id = @current_mandator_id
        AND i.deleted IS NULL
        AND i.itemType_id = 1 -- WBT item type
    ORDER BY
        AuthorizedUserLogon, AuthorizedWbtTitle
END</command>
    </Report>
  </Reports>
  <Parameters>
    <Parameter id="76f4d3c5-2618-4c32-bade-747a2fd8b2ad" isSystem="False" name="Target Groups Current Mandator" reportParameterType_id="4123c2c2-d408-476a-82bf-ca77f9ecf944" queryParameterName="@targetGroup_id" />
  </Parameters>
  <ParameterTypes>
    <ParameterType id="4123c2c2-d408-476a-82bf-ca77f9ecf944" isSystem="False" name="TargetGroup" datatype="IntegerDDL" dataValueField="id" dataTextField="title">
      <query>
        SELECT id, title
        FROM tblTargetGroups
        WHERE(mandator_id = @current_mandator_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 = tblTargetGroups.id)
        OR EXISTS(SELECT *
        FROM tblRolesFunctions
        JOIN tblRoles ON tblRoles.id = tblRolesFunctions.role_id
        JOIN tblFunctions ON tblFunctions.id = tblRolesFunctions.function_id
        JOIN v_Users ON v_Users.intUserCn = @current_user_id
        WHERE tblFunctions.shortcut = 'FcnIsAuthorizedForAllTGs' AND tblRoles.id = v_Users.SecurityID))
        AND defaultforlibrary = 0
        ORDER BY title
      </query>
    </ParameterType>
  </ParameterTypes>
</ReportsExport>