﻿<?xml version="1.0" encoding="utf-8"?>
<ReportsExport>
  <Reports>
    <Report id="2674cfb1-549c-403b-9044-5b8127b510c2" codekey="Handelshof_AuswertungWBTs" categoryCodekey="LearningPrograms" name="Auswertung WBTs" description="Stellt alle rezertifizierungspflichtigen WBTs mit Status für jeden Nutzer dar.">
      <MetaData created="2019-07-02T10:27:48" createdBy="Rolle Administrator (Administrator)" createdBy_user_id="12" modified="2019-07-02T11:20:18" modifiedBy="Rolle Administrator" />
      <ExecutionDetails format="TableResult" commandType="SqlCommandOrQuery" exportHandler="" adminControl="" exportMultipleTablesToSheets="False" datesWithTime="False" extraParams="" />
      <Mandators mandatorMode="IncludeMandators" mandator_id="96ba2868-8baf-4e69-b1fb-d2cc6d6832e8" mandatorName="handelshofakademie" isStandard="False" isUsedByMenu="False" />
      <Parameters>
        <Parameter id="74fc2209-57cf-4c12-8795-61ef97b9cf4f" isRequired="False" allowMultiSelect="True" name="Target Groups available for Current User" contextName="Zielgruppe" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
        <Parameter id="6ae269c9-c842-4fd6-96c7-0a6125828996" isRequired="False" allowMultiSelect="True" name="Bereich" contextName="Abteilung" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
      </Parameters>
      <Roles>
        <Role id="80" />
        <Role id="90" />
      </Roles>
      <command>
        -- Test Data -------------------------------------------------------------
        --DECLARE @current_mandator_id UNIQUEIDENTIFIER;
        --DECLARE @current_user_id INT;
        --DECLARE @availableTargetGroupIds dbo.typeIntList;
        --DECLARE @division dbo.typeStringList;

        --SET @current_mandator_id = '96BA2868-8BAF-4E69-B1FB-D2CC6D6832E8';
        --SET @current_user_id = 12;
        --INSERT INTO @availableTargetGroupIds VALUES (14), (12)
        --INSERT INTO @division VALUES ('Abteilung')
        -- End Test Data ---------------------------------------------------------

        -- All users which the current user is permitted to see
        CREATE TABLE #VisibleUsers
        (
        intUserCn INT
        )

        DECLARE @CurrentUserSecurityId INT;
        DECLARE @CurrentUserOrgUnitIds typeGuidList;
        DECLARE @CurrentUserIsOrgUnitManager BIT;
        DECLARE @CurrentUserAuthorisedForAllOUs BIT;
        DECLARE @CurrentUserAuthorisedForAllTGs BIT;

        INSERT INTO @CurrentUserOrgUnitIds
        SELECT * FROM dbo.fn_GetUserOrganisationUnits(@current_user_id)

        SET @CurrentUserIsOrgUnitManager = CASE WHEN
        EXISTS(SELECT * FROM tblUsersOrganisationUnits WHERE user_id =  @current_user_id and position = 1)
        THEN 1 ELSE 0 END

        SELECT
        @CurrentUserSecurityId = u.SecurityID
        FROM
        tableUsers u
        WHERE
        intUserCn = @current_user_id

        SET @CurrentUserAuthorisedForAllOUs = IIF
        (
        EXISTS
        (
        SELECT
        *
        FROM
        tblRolesFunctions rf
        INNER JOIN tblFunctions f
        ON  f.id = rf.function_id
        WHERE
        rf.role_id = @CurrentUserSecurityId
        AND f.shortcut = 'FcnIsAuthorizedForAllOrgUnits'
        ),
        1,
        0
        );

        SET @CurrentUserAuthorisedForAllTGs = IIF
        (
        EXISTS
        (
        SELECT
        *
        FROM
        tblRolesFunctions rf
        INNER JOIN tblFunctions f
        ON  f.id = rf.function_id
        WHERE
        rf.role_id = @CurrentUserSecurityId
        AND f.shortcut = 'FcnIsAuthorizedForAllTGs'
        ),
        1,
        0
        );

        IF @CurrentUserSecurityId = 100 OR @CurrentUserAuthorisedForAllOUs = 1 OR @CurrentUserAuthorisedForAllTGs = 1
        BEGIN
        -- If the user is Platform Admin, or is authorised for all OUs or TGs then simply add all users for this mandator
        INSERT INTO
        #VisibleUsers
        SELECT
        intUserCn
        FROM
        v_users
        WHERE
        mandator_id = @current_mandator_id
        END
        ELSE
        BEGIN
        IF @CurrentUserIsOrgUnitManager = 1
        BEGIN
        -- Get all users belonging to organisation units of the current users level or below if the
        -- user is OU manager
        WITH CurrentUserOrgUnits(id) AS
        (
        -- The current users OU, also the start of the recursion
        SELECT * FROM @CurrentUserOrgUnitIds

        UNION ALL

        SELECT
        ou.id
        FROM
        tblOrganisationUnits ou
        -- This is where the CTE recurses onto itself
        JOIN CurrentUserOrgUnits cou
        ON cou.id = ou.parent_id
        WHERE
        ou.deleted IS NULL
        AND ou.nodeType = 10
        )
        INSERT INTO
        #VisibleUsers
        SELECT
        DISTINCT u.user_id
        FROM
        tblUsersOrganisationUnits u
        INNER JOIN CurrentUserOrgUnits cuou
        ON  cuou.id = u.organisationUnit_id
        END

        -- Add any users that belong to target groups the current user is a manager of
        INSERT INTO
        #VisibleUsers
        SELECT
        u.intUserCn
        FROM
        v_Users u
        INNER JOIN tblUsersTargetGroups utg
        ON  utg.UserCn = u.intUserCn
        JOIN tblTargetGroupManagers tgm
        ON  tgm.targetGroup_id = utg.targetGroup_id
        LEFT JOIN #VisibleUsers vu
        ON  vu.intUserCn = utg.UserCn
        WHERE
        tgm.user_id = @current_user_id
        AND vu.intUserCn IS NULL

        END


        CREATE TABLE #Result
        (
        intUserCn INT,
        item_id UNIQUEIDENTIFIER,
        bestStatus INT NULL,
        lastPassedEver datetime NULL
        )

        DECLARE @hasTargetGroupFilter BIT = IIF(EXISTS(SELECT * FROM @availableTargetGroupIds), 1, 0);
        DECLARE @hasDivisionFilter BIT = IIF(EXISTS(SELECT * FROM @division), 1, 0);

        INSERT INTO
        #Result
        SELECT
        u.intUserCn,
        i.id,
        -1,
        NULL
        FROM
        tableUsers u
        INNER JOIN #VisibleUsers vu
        ON  vu.intUserCn = u.intUserCn
        INNER JOIN tblStatusUserItemOverride suio
        ON u.intUserCn = suio.user_id
        INNER JOIN tblItems i
        ON  i.id = suio.item_id
        WHERE
        1 = 1
        AND i.itemType_id = 1 -- Themes
        AND i.deleted IS NULL
        -- Item available for recertification
        AND i.overrideSpanMonths IS NOT NULL
        AND
        (
        @hasTargetGroupFilter = 0
        OR
        EXISTS
        (
        SELECT
        *
        FROM
        tblUsersTargetGroups utg
        INNER JOIN @availableTargetGroupIds atg
        ON atg.value = utg.targetGroup_id
        WHERE
        UserCn = u.intUserCn
        )
        )
        AND
        (
        @hasDivisionFilter = 0
        OR
        EXISTS
        (
        SELECT
        *
        FROM
        @division
        WHERE
        value LIKE u.division
        )
        )    AND dbo.fn_IsUserExcludedFromRecertification(u.intUserCn, i.id) = 0


        -- checking for last status information for the users with endDate NULL and not overwritten
        -- so we also get the lastPassedDate
        UPDATE
        #Result
        SET
        bestStatus = ISNULL
        (
        suih.status,
        ISNULL(dbo.fn_GetUserItemStatus(#Result.intUserCn, #Result.item_id),0)
        ),
        lastPassedEver = suih.startDate
        FROM
        #Result
        LEFT JOIN tblStatusUserItemHistory suih
        ON  suih.user_id = #Result.intUserCn
        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

        SELECT
        CASE u.blocked
        WHEN 0
        THEN 'Ja'
        ELSE
        'Nein'
        END                    AS 'Nutzer gesperrt? Ja / nein',
        u.descUserCn           AS 'Kennung',
        u.Nachname             AS 'Name',
        u.Vorname,
        ISNULL(u.division, '') AS 'Abteilung',
        ISNULL(STUFF((SELECT ', ' + title 
        FROM tblOrganisationUnits
        JOIN tblUsersOrganisationUnits ON tblUsersOrganisationUnits.organisationUnit_id = tblOrganisationUnits.id
        WHERE tblUsersOrganisationUnits.user_id = u.intUserCn
        ORDER BY title
        FOR XML PATH(''), TYPE
        ).value('.','NVARCHAR(MAX)'), 1, 1,''),
        '')  AS 'Organisationseinheit',
        u.office               AS 'Dienststelle',
        ISNULL(STUFF((SELECT ', ' + title
        FROM tblTargetGroups tg
        JOIN tblUsersTargetGroups utg ON utg.targetGroup_id = tg.id
        WHERE utg.UserCn = u.intUserCn
        AND tg.defaultforlibrary = 0
        FOR XML PATH(''), TYPE).value('.','NVARCHAR(MAX)'),
        1, 1, ''), '') AS 'Zielgruppen',
        i.title AS 'Lernprogramm',
        CASE ISNULL(NULLIF(r.bestStatus,-1),0)
        WHEN 0 THEN
        'Nicht bearbeitet'
        WHEN 1 THEN
        'In Bearbeitung'
        WHEN 2 THEN
        'Bearbeitet'
        END AS 'Status',
        CASE ai.item_id
        WHEN NULL THEN
        'nicht zugewiesen'
        ELSE
        'Zugewiesen'
        END AS 'Zugewiesen',
        FORMAT(lastPassedEver, 'dd.MM.yyyy') AS 'Zuletzt erfolgreich durchgeführt'
        FROM
        #Result r
        INNER JOIN tableUsers u
        ON  u.intUserCn = r.intUserCn
        INNER JOIN tblItems i
        ON i.id = r.item_id
        LEFT JOIN v_UsersAssignedItems ai
        ON  ai.item_id = r.item_id
        AND ai.user_id = r.intUserCn

        DROP TABLE #VisibleUsers;
        DROP TABLE #Result;
      </command>
    </Report>
  </Reports>
  <Parameters>
    <Parameter id="74fc2209-57cf-4c12-8795-61ef97b9cf4f" isSystem="True" name="Target Groups available for Current User" reportParameterType_id="37683520-d150-4e2c-8343-1aa8eabfdb67" queryParameterName="@availableTargetGroupIds" />
    <Parameter id="6ae269c9-c842-4fd6-96c7-0a6125828996" isSystem="False" name="Bereich" reportParameterType_id="e7333e57-684c-4b48-93fe-fd396d5f3559" queryParameterName="@division" />
  </Parameters>
  <ParameterTypes>
    <ParameterType id="37683520-d150-4e2c-8343-1aa8eabfdb67" isSystem="True" name="Target Groups available for Current User" datatype="IntegerDDL" dataValueField="id" dataTextField="title">
      <query>
          SELECT
          id,
          title
          FROM
          tblTargetGroups
          WHERE
          mandator_id = @current_mandator_id
          AND
          (
          -- User is Platform Admin or Org Unit Manager
          EXISTS
          (
          SELECT
          *
          FROM
          v_Users
          WHERE
          intUserCn = @current_user_id
          AND
          (
          securityId = 100
          OR EXISTS(SELECT * FROM tblUsersOrganisationUnits WHERE user_id = @current_user_id AND position &gt; 0)
          )
          )
          OR
          -- User is Target Group Manager for the TG
          EXISTS
          (
          SELECT
          *
          FROM
          tblTargetGroupManagers
          WHERE
          tblTargetGroupManagers.user_id = @current_user_id
          AND tblTargetGroupManagers.targetGroup_id = tblTargetGroups.id
          )
          OR
          -- User is authorised for all target groups, or all OUs
          EXISTS
          (
          SELECT
          *
          FROM
          tblRolesFunctions
          JOIN tblRoles
          ON  tblRoles.id = tblRolesFunctions.role_id
          JOIN tblFunctions
          ON  tblFunctions.id = tblRolesFunctions.function_id
          AND
          (
          tblFunctions.shortcut = 'FcnIsAuthorizedForAllTGs'
          OR
          tblFunctions.shortcut = 'FcnIsAuthorizedForAllOrgUnits'
          )
          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 defaultforlibrary = 0
          ORDER BY
          title;
      </query>
    </ParameterType>
    <ParameterType id="e7333e57-684c-4b48-93fe-fd396d5f3559" isSystem="False" name="Bereich" datatype="StringDDL" dataValueField="division" dataTextField="division">
      <query>
        SELECT DISTINCT division
        FROM v_Users
        WHERE v_Users.mandator_id = @current_mandator_id AND division IS NOT NULL AND division != ''
        ORDER BY division
      </query>
    </ParameterType>
  </ParameterTypes>
</ReportsExport>