﻿<?xml version="1.0" encoding="utf-8"?>
<ReportsExport>
  <Reports>
    <Report id="10c37158-7594-44b4-8ec6-5627ab5b14e7" codekey="ApetitoLearningStates" categoryCodekey="UserStats" name="Apetito Academy Lernstände und Zertifikate" description="Listet für eine gewählte Zielgruppe deren User mit Lernständen / Zertifikaten zu Tests und Lernprogrammen">
      <MetaData created="2012-11-01T16:04:34" createdBy="Administrator Apetito-Academy (Administrator)" createdBy_user_id="3" modified="2015-11-30T10:49:56" modifiedBy="Rolle Administrator" />
      <ExecutionDetails format="TableResult" commandType="SqlCommandOrQuery" exportHandler="" adminControl="" exportMultipleTablesToSheets="False" datesWithTime="False" extraParams="" />
      <Mandators mandatorMode="OnlyOwner" mandator_id="96ba2868-8baf-4e69-b1fb-d2cc6d6832e8" mandatorName="Apetito-Academy" isStandard="False" isUsedByMenu="False" />
      <Parameters>
        <Parameter id="a5485539-67e0-4912-8255-8081a54efb3c" isRequired="False" allowMultiSelect="False" name="Zielgruppe" contextName="Zielgruppe" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
      </Parameters>
      <Roles>
        <Role id="90" />
      </Roles>
      <command>
        --Information for debugging
        --DEBUG START
        --DECLARE @eduOffer_id UNIQUEIDENTIFIER
        --SELECT TOP 1
        --        @eduOffer_id = Edu.id
        --FROM    tblEduOffers AS Edu
        --        INNER JOIN tblMandators AS Mand ON Edu.mandator_id = Mand.id
        --WHERE   Mand.name = 'BISS'
        --DECLARE @targetGroup_id INT
        --DECLARE @current_mandator_id UNIQUEIDENTIFIER
        --SELECT  @current_mandator_id = tblMandators.id
        --FROM    tblMandators
        --WHERE   tblMandators.name = 'viwis'
        --SELECT TOP 1
        --        @targetGroup_id = tblTargetGroups.id
        --FROM    tblTargetGroups
        --        INNER JOIN tblMandators ON tblTargetGroups.mandator_id = tblMandators.id
        --WHERE   tblMandators.name = 'Apetito-Academy'
        --SET @targetGroup_id = 493
        --set @targetGroup_Id=null

        --DEBUG STOP
        -- The report without debugging information starts here



        --Step 1: helping object for holding temporary information

        CREATE TABLE #tmpUsers(UserCn INT,
        LastName NVARCHAR(128),
        FirstName NVARCHAR(128),
        Account NVARCHAR(64),
        Position NVARCHAR(128),
        Company NVARCHAR(128),
        Department NVARCHAR(128),
        Area NVARCHAR(128),
        AreaAD NVARCHAR(255),
        created DATETIME,
        blocked TINYINT,
        accountExpiresOn DATETIME NULL,
        TargetGroupID INT,
        TargetGroup NVARCHAR(255),
        TargetGroupCount INT)

        CREATE TABLE #tmpResult(UserId INT,
        ItemOrder INT,
        TestTitle VARCHAR(255)NULL,
        TestDate DATETIME NULL,
        TestResultState NVARCHAR(20),
        TestResultPercent NVARCHAR(20)NULL,
        TestCertificateReceived NVARCHAR(5)NULL,
        TestCertificateDate DATETIME,
        ThemeTitle VARCHAR(255)NULL,
        ThemeLearningStatus NVARCHAR(20)NULL,
        ThemeSessionOverallDuration INT NULL,
        -- Minutes
        ThemeCertificateReceived NVARCHAR(5)NULL,
        ThemeCertificateDate DATETIME,
        ThemeInvocations INT,
        ThemeLastInvocation DATETIME)

        -- Step 2 - Request user information; we split this to an extra table to
        --          + Separate 'interests' (maybe better maintainable not doing everything at once)
        --          + Not all data is held redundant for the learning status joins
        --          + Split information gives us a little flexibility for better output

        IF @targetGroup_id IS NOT NULL
        BEGIN
        DECLARE @targetGroup NVARCHAR(255)
        SELECT @targetGroup = tblTargetGroups.title
        FROM tblTargetGroups
        WHERE tblTargetGroups.id = @targetGroup_id
        INSERT INTO #tmpUsers(UserCn,
        LastName,
        FirstName,
        Account,
        Position,
        Company,
        Department,
        Area,
        AreaAD,
        created,
        blocked,
        accountExpiresOn,
        TargetGroupID,
        TargetGroup,
        TargetGroupCount)
        SELECT v_Users.intUserCn,
        v_Users.Nachname,
        v_Users.Vorname,
        v_Users.descUserCn,
        v_Users.title,
        -- as 'Funktion'
        v_Users.companyAD,
        v_Users.division, -- as 'Betrieb'?
        v_Users.office, -- as 'Gebiet'
        (SELECT customAttribute1 FROM tblUserCustomAttributes WHERE tblUserCustomAttributes.user_id = v_Users.intUserCn),-- as 'Geschäftsbereich' :(
        v_Users.created, -- as 'Zugang seit'
        v_Users.blocked,
        v_Users.accountExpiresOn, -- as 'Gültig bis'
        @targetGroup_id,
        @targetGroup,
        1
        FROM v_Users
        INNER JOIN tblUsersTargetGroups ON v_Users.intUserCn = tblUsersTargetGroups.UserCn
        WHERE tblUsersTargetGroups.targetGroup_id = ISNULL(@targetGroup_id, tblUsersTargetGroups.targetGroup_id)
        END
        ELSE
        BEGIN
        INSERT INTO #tmpUsers(UserCn,
        LastName,
        FirstName,
        Account,
        Position,
        Company,
        Department,
        Area,
        AreaAD,
        created,
        blocked,
        accountExpiresOn,
        TargetGroupID,
        TargetGroup,
        TargetGroupCount)
        SELECT v_Users.intUserCn,
        v_Users.Nachname,
        v_Users.Vorname,
        v_Users.descUserCn,
        v_Users.title,
        -- as 'Funktion'
        v_Users.companyAD,
        v_Users.division, -- as 'Betrieb'?
        v_Users.office, -- as 'Gebiet'
        (SELECT customAttribute1 FROM tblUserCustomAttributes WHERE tblUserCustomAttributes.user_id = v_Users.intUserCn),-- as 'Geschäftsbereich' :(
        v_Users.created, -- as 'Zugang seit'
        v_Users.blocked,
        v_Users.accountExpiresOn, -- as 'Gültig bis'
        NULL,
        (
        SELECT TOP 1 tg.title
        FROM tblUsersTargetGroups AS ut
        INNER JOIN tblTargetGroups AS tg ON ut.targetGroup_id = tg.id
        WHERE v_Users.intUserCn = ut.UserCn AND tg.title &lt;&gt; 'Bibliothek'), 
        t.groupCount
          FROM v_Users
               INNER JOIN(
                          SELECT tblUsersTargetGroups.UserCn, 
                                 COUNT(tblUsersTargetGroups.Targetgroup_id)AS groupCount
                            FROM tblUsersTargetGroups
                           GROUP BY tblUsersTargetGroups.UserCn)AS t ON v_Users.intUserCn = t.userCn
         WHERE v_Users.mandator_id = @current_mandator_id
        END


        -- Step 3: Get WBT information:
        -- Note: Since we don't directly store certificate data within table, the first date the 'passed' requirements were met by the learner
        --       is regarded as 'Certificate date'
        IF @targetGroup_id IS NOT NULL
        BEGIN
        INSERT INTO #tmpResult(UserId, 
        ItemOrder,
        ThemeTitle,
        ThemeLearningStatus,
        ThemeSessionOverallDuration,
        ThemeLastInvocation,
        ThemeInvocations,
        ThemeCertificateReceived,
                               ThemeCertificateDate)
        SELECT #tmpUsers.UserCn, 
        1,
        tblItems.title,
               CASE
                   WHEN learningStates.learningStatus IS NULL
        OR (tblThemes.StatusThreshold IS NOT NULL
                     AND learningStates.learningStatus &lt; tblThemes.StatusThreshold)THEN 'nicht bearbeitet'
        ELSE CAST(learningStates.learningStatus AS NVARCHAR) + '%'
        END,
        themeSessions.OverallDurationInMinutes,
        themeSessions.LastInvocation,
        themeSessions.TotalInvocations,
               CASE
                   WHEN certificateDates.certificateDate IS NOT NULL THEN 'ja'
        ELSE 'nein'
        END,
        certificateDates.certificateDate
          FROM #tmpUsers
        INNER JOIN tblEduOffersTargetGroups ON #tmpUsers.TargetGroupID = tblEduOffersTargetGroups.targetGroup_id
        INNER JOIN tblEduOffersModules ON tblEduOffersTargetGroups.eduOffer_id = tblEduOffersModules.eduOffer_id
        INNER JOIN tblModuleItems ON tblEduOffersModules.module_id = tblModuleItems.module_id
        INNER JOIN tblThemes ON tblModuleItems.item_id = tblThemes.id
        INNER JOIN tblItems ON tblItems.id = tblThemes.id
               LEFT  JOIN(
                          SELECT tblStatsThemeSessions.user_id, 
        tblStatsThemeSessions.theme_id,
        SUM(tblStatsThemeSessions.durationSeconds) / 60 AS OverallDurationInMinutes,
                                 COUNT(tblStatsThemeSessions.id)AS TotalInvocations, 
                                 MAX(tblStatsThemeSessions.lastPingTime)AS LastInvocation
                            FROM tblStatsThemeSessions
        GROUP BY tblStatsThemeSessions.user_id,
                                    tblStatsThemeSessions.theme_id) AS themeSessions ON #tmpUsers.UserCn = themeSessions.user_id
        AND tblThemes.id = themeSessions.theme_id
               LEFT JOIN(
                         SELECT o.user_id, 
        o.theme_id,
        MAX(o.complete) AS learningStatus
                           FROM(
                                SELECT user_id AS user_id, 
        theme_id AS theme_id,
        complete AS complete
                                  FROM tblStatusUserCourseHistory
        UNION
        SELECT s.userid AS user_id,
        s.theme_id AS theme_id,
        s.complete AS complete
                                  FROM tblStatusUserCourse AS s)AS o
        GROUP BY o.user_id,
                                   o.theme_id)AS learningStates ON themeSessions.user_id = learningStates.user_id
        AND themeSessions.theme_id = learningStates.theme_id
               LEFT JOIN(
                         SELECT o.user_id, 
        o.theme_id,
                                MIN(o.lastPingTime)AS certificateDate
                           FROM(
                                SELECT h.user_id AS user_id, 
        h.theme_id AS theme_id,
        s.lastPingTime AS lastPingTime,
        h.complete,
        h.exams,
        h.exercises
                                  FROM tblStatusUserCourseHistory AS h
                                       INNER JOIN tblStatsThemeSessions AS s ON h.themeSession_id = s.id
        UNION
        SELECT h.userid AS user_id,
        h.theme_id AS theme_id,
        h.LastChanged AS lastPingTime,
        h.complete,
        h.exams,
        h.exercises
                                  FROM tblStatusUserCourse AS h)AS o
                               INNER JOIN tblThemes AS t ON o.theme_id = t.id
        INNER JOIN tblItems ON tblItems.id = t.id
                          WHERE(t.calcStatusIncludeCompleted = 0 OR o.complete = 100)
                           AND (t.calcStatusIncludeExams = 0 OR o.exams = 100)
                           AND (t.calcStatusIncludeExercises = 0 OR o.exercises = 100)
        AND tblItems.certificate_id IS NOT NULL
        GROUP BY o.user_id,
                                   o.theme_id)AS certificateDates ON certificateDates.user_id = themeSessions.user_id
        AND certificateDates.theme_id = themeSessions.theme_id
        WHERE tblItems.deleted IS NULL
        END
        ELSE
        BEGIN
        INSERT INTO #tmpResult(UserId, 
        ItemOrder,
        ThemeTitle,
        ThemeLearningStatus,
        ThemeSessionOverallDuration,
        ThemeLastInvocation,
        ThemeInvocations,
        ThemeCertificateReceived,
                               ThemeCertificateDate)
        SELECT DISTINCT #tmpUsers.UserCn, 
        1,
        tblItems.title,
                        CASE
                            WHEN learningStates.learningStatus IS NULL
        OR (tblThemes.StatusThreshold IS NOT NULL
                              AND learningStates.learningStatus &lt; tblThemes.StatusThreshold)THEN 'nicht bearbeitet'
        ELSE CAST(learningStates.learningStatus AS NVARCHAR) + '%'
        END,
        themeSessions.OverallDurationInMinutes,
        themeSessions.LastInvocation,
        themeSessions.TotalInvocations,
                        CASE
                            WHEN certificateDates.certificateDate IS NOT NULL THEN 'ja'
        ELSE 'nein'
        END,
        certificateDates.certificateDate
          FROM #tmpUsers
        INNER JOIN tblUsersTargetGroups ON #tmpUsers.UserCn = tblUsersTargetGroups.UserCn
        INNER JOIN tblEduOffersTargetGroups ON tblUsersTargetGroups.TargetGroup_ID = tblEduOffersTargetGroups.targetGroup_id
        INNER JOIN tblEduOffersModules ON tblEduOffersTargetGroups.eduOffer_id = tblEduOffersModules.eduOffer_id
        INNER JOIN tblModuleItems ON tblEduOffersModules.module_id = tblModuleItems.module_id
        INNER JOIN tblThemes ON tblModuleItems.item_id = tblThemes.id
        INNER JOIN tblItems ON tblItems.id = tblThemes.id
               LEFT  JOIN(
                          SELECT tblStatsThemeSessions.user_id, 
        tblStatsThemeSessions.theme_id,
        SUM(tblStatsThemeSessions.durationSeconds) / 60 AS OverallDurationInMinutes,
                                 COUNT(tblStatsThemeSessions.id)AS TotalInvocations, 
                                 MAX(tblStatsThemeSessions.lastPingTime)AS LastInvocation
                            FROM tblStatsThemeSessions
        GROUP BY tblStatsThemeSessions.user_id,
                                    tblStatsThemeSessions.theme_id)AS themeSessions ON #tmpUsers.UserCn = themeSessions.user_id
        AND tblThemes.id = themeSessions.theme_id
               LEFT JOIN(
                         SELECT o.user_id, 
        o.theme_id,
                                MAX(o.complete)AS learningStatus
                           FROM(
                                SELECT user_id AS user_id, 
        theme_id AS theme_id,
        complete AS complete
                                  FROM tblStatusUserCourseHistory
        UNION
        SELECT s.userid AS user_id,
        s.theme_id AS theme_id,
        s.complete AS complete
                                  FROM tblStatusUserCourse AS s)AS o
        GROUP BY o.user_id,
                                   o.theme_id)AS learningStates ON themeSessions.user_id = learningStates.user_id
        AND themeSessions.theme_id = learningStates.theme_id
               LEFT JOIN(
                         SELECT o.user_id, 
        o.theme_id,
                                MIN(o.lastPingTime)AS certificateDate
                           FROM(
                                SELECT h.user_id AS user_id, 
        h.theme_id AS theme_id,
        s.lastPingTime AS lastPingTime,
        h.complete,
        h.exams,
        h.exercises
                                  FROM tblStatusUserCourseHistory AS h
                                       INNER JOIN tblStatsThemeSessions AS s ON h.themeSession_id = s.id
        UNION
        SELECT h.userid AS user_id,
        h.theme_id AS theme_id,
        h.LastChanged AS lastPingTime,
        h.complete,
        h.exams,
        h.exercises
                                  FROM tblStatusUserCourse AS h)AS o
                               INNER JOIN tblThemes AS t ON o.theme_id = t.id
        INNER JOIN tblItems ON tblItems.id = t.id
                          WHERE(t.calcStatusIncludeCompleted = 0 OR o.complete = 100)
                           AND (t.calcStatusIncludeExams = 0 OR o.exams = 100)
                           AND (t.calcStatusIncludeExercises = 0 OR o.exercises = 100)
        AND tblItems.certificate_id IS NOT NULL
        GROUP BY o.user_id,
                                   o.theme_id)AS certificateDates ON certificateDates.user_id = themeSessions.user_id
        AND certificateDates.theme_id = themeSessions.theme_id
        WHERE tblItems.deleted IS NULL
        END
        -- SELECT * FROM #tmpResult
        -- DELETE FROM #tmpResult

        -- Step 4: Get Test information:
        IF @targetGroup_id IS NOT NULL
        BEGIN
        INSERT INTO #tmpResult(UserId, 
        ItemOrder,
        TestTitle,
        TestResultPercent,
        TestResultState,
        TestCertificateReceived,
                               TestCertificateDate)
        SELECT #tmpUsers.UserCn, 
        2,
        tblItems.title,
        testStatus.pctQuestions,
               CASE
                   WHEN testStatus.passed IS NULL THEN 'nicht bearbeitet'
        WHEN testStatus.passed = 1 THEN 'bestanden'
        ELSE 'nicht bestanden'
        END,
               CASE
                   WHEN certificateDates.certificateDate IS NOT NULL THEN 'ja'
        ELSE 'nein'
        END,
        certificateDates.certificateDate
          FROM #tmpUsers
        INNER JOIN tblEduOffersTargetGroups ON #tmpUsers.TargetGroupId = tblEduOffersTargetGroups.targetGroup_id
        INNER JOIN tblEduOffersModules ON tblEduOffersTargetGroups.eduOffer_id = tblEduOffersModules.eduOffer_id
        INNER JOIN tblModuleItems ON tblEduOffersModules.module_id = tblModuleItems.module_id
        INNER JOIN tblTasTests ON tblModuleItems.item_id = tblTasTests.id
        AND tblTasTests.mode = 1
        INNER JOIN tblItems on tblTasTests.id=tblItems.id
        LEFT JOIN (SELECT   user_id,
        test_id,
                                CAST(MAX(pctQuestions)AS NVARCHAR) + '%' AS pctQuestions, 
                                MAX(enddate)AS LastInvocation, 
                                MAX(passed)AS passed
                           FROM tblTasStatsTestSessions
        GROUP BY user_id,
                                   test_id)AS testStatus ON #tmpUsers.UserCn = testStatus.user_id AND tblTasTests.id = testStatus.test_id
               LEFT JOIN(
                         SELECT s.user_id, 
        s.test_id,
                                MIN(s.endDate)AS certificateDate
                           FROM tblTasStatsTestSessions AS s
                                INNER JOIN tblTasTests AS t ON s.test_id = t.id
        INNER JOIN tblItems ON tblItems.id = t.id
                          WHERE s.passed = 1 AND tblItems.certificate_id IS NOT NULL
        GROUP BY s.user_id,
                                   s.test_id)AS certificateDates ON #tmpUsers.UserCn = certificateDates.user_id
        AND tblTasTests.id = certificateDates.test_id
        END
        ELSE
        BEGIN
        INSERT INTO #tmpResult(UserId, 
        ItemOrder,
        TestTitle,
        TestResultPercent,
        TestResultState,
        TestCertificateReceived,
                               TestCertificateDate)
        SELECT DISTINCT #tmpUsers.UserCn, 
        2,
        tblItems.title,
        testStatus.pctQuestions,
                        CASE
                            WHEN testStatus.passed IS NULL THEN 'nicht bearbeitet'
        WHEN testStatus.passed = 1 THEN 'bestanden'
        ELSE 'nicht bestanden'
        END,
                        CASE
                            WHEN certificateDates.certificateDate IS NOT NULL THEN 'ja'
        ELSE 'nein'
        END,
        certificateDates.certificateDate
          FROM #tmpUsers
        INNER JOIN tblUsersTargetGroups ON #tmpUsers.UserCn = tblUsersTargetGroups.userCn
        INNER JOIN tblEduOffersTargetGroups ON tblUsersTargetGroups.TargetGroup_Id = tblEduOffersTargetGroups.targetGroup_id
        INNER JOIN tblEduOffersModules ON tblEduOffersTargetGroups.eduOffer_id = tblEduOffersModules.eduOffer_id
        INNER JOIN tblModuleItems ON tblEduOffersModules.module_id = tblModuleItems.module_id
        INNER JOIN tblTasTests ON tblModuleItems.item_id = tblTasTests.id
        AND tblTasTests.mode = 1
        INNER JOIN tblItems on tblTasTests.id=tblItems.id
        LEFT JOIN (SELECT   user_id,
        test_id,
                                CAST(MAX(pctQuestions)AS NVARCHAR) + '%' AS pctQuestions, 
                                MAX(enddate)AS LastInvocation, 
                                MAX(passed)AS passed
                           FROM tblTasStatsTestSessions
        GROUP BY user_id,
                                   test_id)AS testStatus ON #tmpUsers.UserCn = testStatus.user_id AND tblTasTests.id = testStatus.test_id
               LEFT JOIN(
                         SELECT s.user_id, 
        s.test_id,
                                MIN(s.endDate)AS certificateDate
                           FROM tblTasStatsTestSessions AS s
                                INNER JOIN tblTasTests AS t ON s.test_id = t.id
        INNER JOIN tblItems ON tblItems.id = t.id
                          WHERE s.passed = 1 AND tblItems.certificate_id IS NOT NULL
        GROUP BY s.user_id,
                                   s.test_id)AS certificateDates ON #tmpUsers.UserCn = certificateDates.user_id
        AND tblTasTests.id = certificateDates.test_id
        END

        -- Step 5: Output - the 'cascading' select is due to internal ordering which's internal columns are not to be returned

SELECT result.LastName AS 'Nachname', 
        result.FirstName AS 'Vorname',
        result.Account AS 'Kennung',
        result.Position AS 'Funktion',
        result.Company AS 'Firma',
        result.Department AS 'Betrieb',
        result.Area AS 'Gebiet',
        result.AreaAD AS 'Geschäftsbereich',
        result.created AS 'Zugang seit',
       CASE WHEN result.blocked &gt; 0 THEN 'X' ELSE NULL END AS 'Gesperrt',
        result.accountExpiresOn AS 'Gültig bis',
       result.TargetGroup + CASE
                                WHEN result.TargetGroupCount &gt; 2 THEN ' (+)'
        ELSE ''
        END AS 'Zielgruppe',
        result.ThemeTitle AS 'WBT-Titel',
        result.ThemeLearningStatus AS 'Lernstand',
        result.ThemeCertificateReceived AS 'WBT-Zertifikat erhalten',
        result.ThemeCertificateDate AS 'Datum Zertifikat',
        result.ThemeSessionOverallDuration AS 'Bearbeitungsdauer',
        result.ThemeLastInvocation AS 'Letzter Aufruf',
        result.TestTitle AS 'Test',
        result.TestResultState AS 'Status',
        result.TestResultPercent AS 'Prozent',
        result.TestCertificateDate AS 'Testdatum',
        result.TestCertificateReceived AS 'Zertifikat erhalten'
  FROM(
       SELECT *
         FROM #tmpResult
        INNER JOIN #tmpUsers ON #tmpResult.UserId = #tmpUsers.UserCn
        --ORDER BY LastName, FirstName, Account, ItemOrder, ThemeTitle, TestTitle
      )AS result
 ORDER BY result.LastName, result.FirstName, result.Account, result.TestTitle, result.ThemeTitle

        -- Step 6: removing temporary table from storage
        DROP TABLE #tmpResult
        DROP TABLE #tmpUsers
      </command>
    </Report>
  </Reports>
  <Parameters>
    <Parameter id="a5485539-67e0-4912-8255-8081a54efb3c" isSystem="True" name="Zielgruppe" reportParameterType_id="9ae252e1-18b4-4b71-982c-e27b2d3a5287" queryParameterName="@targetGroup_id" />
  </Parameters>
  <ParameterTypes>
    <ParameterType id="9ae252e1-18b4-4b71-982c-e27b2d3a5287" isSystem="True" name="TargetGroup" datatype="TargetGroup" dataValueField="" dataTextField="" />
  </ParameterTypes>
</ReportsExport>