﻿<?xml version="1.0" encoding="utf-8"?>
<ReportsExport>
  <Reports>
    <Report id="34a92dab-a66c-4adc-922e-af9c8a0fae20" codekey="MonthlyLearningProgramProgressByTargetGroups" categoryCodekey="LearningPrograms" name="Monthly report for learning programs" description="Shows a list of themes, grouped and ordered by module title and theme title.  For each theme there are statistics for the total number of learners with access to the theme, the learners who have used the theme (actual), the average learning status and the change in the number of actual learners from the previous month.">
      <MetaData created="2018-08-23T09:19:36" createdBy="Rolle Administrator (Administrator)" createdBy_user_id="37276" modified="2019-12-18T17:21:47" modifiedBy="Administrator ELECT" />
      <ExecutionDetails format="TableResult" commandType="SqlCommandOrQuery" exportHandler="" adminControl="" exportMultipleTablesToSheets="False" datesWithTime="False" extraParams="" />
      <Mandators mandatorMode="IncludeMandators" mandator_id="d5a90a49-e697-4aeb-8a5b-298782815490" isStandard="False" isUsedByMenu="False">
        <Mandator mandatorName="ELECT" />
        <Mandator mandatorName="munichre-anticorruption" />
      </Mandators>
      <Parameters>
        <Parameter id="93460158-2520-48a7-ac64-9350fa3d159f" isRequired="False" allowMultiSelect="True" name="Zielgruppen Multiselektion" contextName="Zielgruppen Multiselektion" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
      </Parameters>
      <Roles>
        <Role id="30" />
        <Role id="90" />
      </Roles>
      <command>
        ---- START DEBUG
        --       DECLARE @current_mandator_id UNIQUEIDENTIFIER
        --       SET @current_mandator_id = (SELECT tblMandators.id FROM tblMandators WHERE tblMandators.name='elect')

        --       DECLARE @targetGroupId AS dbo.typeIntList
        --       INSERT INTO @targetGroupId (value)
        --       SELECT  id
        --       FROM    tblTargetGroups
        --       WHERE   title IN ('R&amp;C_PAK1_all')
        --      -- END DEBUG

        DECLARE @targetGroupsWithTitles TABLE
        (
        id INT PRIMARY KEY,
        title NVARCHAR(2048)
        );

        DECLARE @usersForSelectedTargetGroups TABLE
        (
        [user_id] INT PRIMARY KEY
        );

        DECLARE @currentAssignments TABLE
        (
        learningProgramTitle NVARCHAR(255),
        moduleTitle NVARCHAR(255),
        learningProgram_id UNIQUEIDENTIFIER,
        totalUsersAssignedToItem INT
        );

        DECLARE @statusBefore TABLE
        (
        learningProgram_id UNIQUEIDENTIFIER PRIMARY KEY,
        userCount INT,
        complete FLOAT
        );

        DECLARE @results TABLE
        (
        learningProgram_id UNIQUEIDENTIFIER,
        module_id UNIQUEIDENTIFIER,
        learningProgramOrder INT,
        moduleOrder INT,
        themeTitle NVARCHAR(255),
        moduleTitle NVARCHAR(255),
        actualLearners INT,
        totalUsersAssignedToItem INT,
        averageLearningStatusActual DECIMAL(5,2),
        actualLearnersBefore INT,
        actualLearnersDiff INT
        )

        DECLARE @keyDate DATETIME = CURRENT_TIMESTAMP;
        DECLARE @compareDate DATETIME = DATEADD( MONTH, -1, @keyDate);

        INSERT INTO
        @targetGroupsWithTitles (id, title)
        SELECT
        id, title
        FROM
        tblTargetGroups AS tg
        INNER JOIN  @targetGroupId AS selectedTGs
        ON  selectedTGs.value = tg.id

        -- Get all users that are currently assigned to at least one of the selected target group(s)
        INSERT INTO
        @usersForSelectedTargetGroups([user_id])
        SELECT DISTINCT
        utg.userCn
        FROM
        tblUsersTargetGroups utg
        INNER JOIN @targetGroupsWithTitles tg
        ON tg.id = utg.targetGroup_id

        -- The distinct list of themes available to users, who themselves are available via the target group selection
        ;WITH UserThemes AS
        (
        SELECT DISTINCT
        t.id
        FROM
        tblThemes t
        WHERE
        EXISTS
        (
        SELECT  *
        FROM    tblModuleItems mi
        WHERE
        mi.item_id = t.id
        AND EXISTS
        (
        SELECT  *
        FROM    tblItems modi
        WHERE
        modi.id = mi.module_id
        AND modi.deleted IS NULL
        -- Hide some special modules that we don't want to report on
        AND modi.title NOT LIKE '%testing area%'
        AND modi.title NOT LIKE '%ausblenden%'
        AND EXISTS
        (
        SELECT  *
        FROM    tblEduOffersModules eom
        WHERE
        eom.module_id = modi.id
        AND EXISTS
        (
        SELECT  *
        FROM    tblEduOffersTargetGroups eotg
        WHERE
        eotg.eduOffer_id = eom.eduOffer_id
        AND EXISTS
        (
        SELECT  *
        FROM    tblUsersTargetGroups utg
        WHERE
        utg.targetGroup_id = eotg.targetGroup_id
        AND EXISTS
        (
        SELECT  *
        FROM    @usersForSelectedTargetGroups ustg
        WHERE   ustg.[user_id] = utg.UserCn
        )
        )
        )
        )
        )
        )
        ),
        -- For each theme get only one module id: the one meeting our criteria with the lowest sorted TfL/title
        ThemeModules AS
        (
        SELECT
        ut.id AS learningProgram_id,
        (
        SELECT TOP 1
        modi.id
        FROM
        tblItems modi
        INNER JOIN tblModuleItems mi
        ON  mi.module_id = modi.id
        WHERE
        mi.item_id = ut.id
        AND modi.deleted IS NULL
        -- Hide some special modules that we don't want to report on
        AND modi.title NOT LIKE '%testing area%'
        AND modi.title NOT LIKE '%ausblenden%'
        ORDER BY
        ISNULL(modi.titleForLearners, modi.title)
        ) AS module_id
        FROM
        UserThemes ut
        )
        INSERT INTO
        @currentAssignments(learningProgram_id, learningProgramTitle, moduleTitle, totalUsersAssignedToItem)
        SELECT
        ti.id AS learningProgram_id,
        ti.title AS learningProgramTitle,
        ISNULL(modi.titleForLearners, modi.title) AS moduleTitle,
        0
        FROM
        ThemeModules tm
        INNER JOIN tblItems ti
        ON  ti.id = tm.learningProgram_id
        INNER JOIN tblItems modi
        ON  modi.id = tm.module_id

        -- Figure out the total amount of distinct users who have access to each of the learning programs
        ;WITH LearningProgramUserCounts AS
        (
        select ca.learningProgram_id, COUNT(DISTINCT user_id) AS userCount
        FROM @currentAssignments AS ca
        INNER JOIN v_UsersAssignedItems ON ca.learningProgram_id = item_id
        INNER JOIN tblUsersTargetGroups As utg ON utg.UserCn = user_id
        INNER JOIN @targetGroupId AS tg ON tg.value = utg.targetGroup_id
        GROUP BY
        ca.learningProgram_id
        )
        UPDATE
        ca
        SET
        ca.totalUsersAssignedToItem = ISNULL(lpuc.userCount,0)
        FROM
        @currentAssignments ca
        INNER JOIN LearningProgramUserCounts lpuc
        ON  lpuc.learningProgram_id = ca.learningProgram_id

        INSERT INTO
        @statusBefore(learningProgram_id, userCount, complete)
        SELECT
        t.theme_id, ISNULL(COUNT(t.user_id), 0), ISNULL(AVG(t.complete), 0)
        FROM
        (
        SELECT
        h.theme_id,
        h.user_id,
        MAX(h.themeSessionStartTime) latest,
        (
        SELECT
        MAX(b.complete) as complete
        FROM
        tblStatusUserCourseHistory b
        where
        b.user_id = h.user_id
        and b.themeSessionStartTime = MAX(h.themeSessionStartTime)
        ) as complete
        FROM
        @usersForSelectedTargetGroups ustg
        INNER JOIN tblStatusUserCourseHistory h
        ON ustg.user_id = h.user_id
        INNER JOIN @currentAssignments ca
        ON  ca.learningProgram_id = h.theme_id
        INNER JOIN tblItems
        ON tblItems.id = h.theme_id
        WHERE
        tblItems.deleted IS NULL
        AND h.themeSessionStartTime &lt;= @compareDate
        GROUP BY
        h.user_id, h.theme_id
        ) t
        GROUP BY
        t.theme_id

        INSERT INTO
        @results
        (
        learningProgram_id,
        themeTitle,
        moduleTitle,
        totalUsersAssignedToItem,
        actualLearners,
        averageLearningStatusActual,
        actualLearnersBefore
        )
        SELECT
        ca.learningProgram_id,
        ca.learningProgramTitle,
        ca.moduleTitle,
        ca.totalUsersAssignedToItem,
        ISNULL(COUNT(distinct suc.UserId), 0),
        ISNULL(AVG(suc.complete), 0),
        ISNULL(sb.userCount, 0)
        FROM
        @currentAssignments ca
        LEFT JOIN tblStatusUserCourse suc
        ON suc.theme_id = ca.learningProgram_id
        INNER JOIN @usersForSelectedTargetGroups u
        ON u.user_id = suc.UserId
        LEFT JOIN @statusBefore sb
        ON sb.learningProgram_id = ca.learningProgram_id
        GROUP BY
        ca.learningProgram_id,
        ca.learningProgramTitle,
        ca.moduleTitle,
        sb.userCount,
        ca.totalUsersAssignedToItem

        UPDATE
        @results
        SET
        actualLearnersDiff = actualLearners - actualLearnersBefore

        ---------------------------------
        -- Output -----------------------
        ---------------------------------

        SELECT
        themeTitle AS 'Module / learning programs',
        moduleTitle AS 'Module title',
        actualLearners AS 'Actual learners',
        totalUsersAssignedToItem AS 'Total users assigned to item',
        CAST(averageLearningStatusActual AS NVARCHAR(10)) + '%' AS 'Average learning status of actual learners',
        actualLearnersBefore AS 'Actual learners previous month',
        actualLearnersDiff AS 'Difference actual learners compared to previous month'
        FROM
        @results
        ORDER BY
        moduleTitle, themeTitle
      </command>
    </Report>
  </Reports>
  <Parameters>
    <Parameter id="93460158-2520-48a7-ac64-9350fa3d159f" isSystem="True" name="Zielgruppen Multiselektion" reportParameterType_id="f4c178f7-fa5a-4229-92ea-2839c7c82ea4" queryParameterName="@targetGroupId" />
  </Parameters>
  <ParameterTypes>
    <ParameterType id="f4c178f7-fa5a-4229-92ea-2839c7c82ea4" isSystem="False" name="Auswhal Target Groups CurrentMandator" 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
        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 defaultforlibrary = 0
        ORDER BY
        title
      </query>
    </ParameterType>
  </ParameterTypes>
</ReportsExport>