﻿<?xml version="1.0" encoding="utf-8"?>
<ReportsExport>
  <Reports>
    <Report id="a1250649-0252-4263-8208-5561aa0c3bf2" codekey="BISS_I2" categoryCodekey="UserStats" name="I2" description="">
      <MetaData created="2010-12-10T10:04:24" createdBy="Administrator BISS" createdBy_user_id="3" modified="2016-03-31T12:06:58" modifiedBy="Gabi Wappler" />
      <ExecutionDetails format="TableResult" commandType="SqlCommandOrQuery" exportHandler="" adminControl="" exportMultipleTablesToSheets="False" datesWithTime="False" extraParams="" />
      <Mandators mandatorMode="OnlyOwner" mandator_id="cf85efc9-150b-4eee-8c20-929a112b658c" mandatorName="BISS" isStandard="False" isUsedByMenu="False" />
      <Roles>
        <Role id="90" />
      </Roles>
      <command>
        -- This report creates a list of all users along with their assigned modules and the 'Modulende' state. 'Modulende' means the last changed date
        -- of a module status of the module. It's only filled if the module status is 'completed'/'green'.

SET LANGUAGE 'German'

--DECLARE @current_mandator_id UNIQUEIDENTIFIER
--SELECT @current_mandator_id = id   FROM tblMandators WHERE name = 'testallfeatures' and deleted is null
-- select id from tblMandators where name='BISS'

        -- Step 0: Check/Create a table which holds a the module/user_id tupel for all results already delivered

IF(NOT EXISTS(SELECT *
                FROM dbo.sysobjects
               WHERE id = OBJECT_ID(N'[dbo].[tblXBissUsersModulesResults]')))
    CREATE TABLE [dbo].[tblXBissUsersModulesResults]([user_id] [INT] NOT NULL, 
                                                     [module_id] [UNIQUEIDENTIFIER] NOT NULL, 
                                                     [created] [DATETIME] NOT NULL
                                                                          DEFAULT(GETDATE())
                                                                          CONSTRAINT [PK_tblXBissUsersModulesResults] PRIMARY KEY CLUSTERED([user_id] ASC, [module_id] ASC))
    ON [PRIMARY]

        -- Step 1: Recalculate the module state in case this is not cached anymore for the user

DECLARE @eduOffer_id UNIQUEIDENTIFIER
DECLARE @user_id INT
DECLARE @configuration INT
SET @configuration = 0

DECLARE @cursorChecker CURSOR
SET @cursorChecker = CURSOR STATIC FORWARD_ONLY
    FOR SELECT DISTINCT(tblEduOffersModules.eduOffer_id)AS 'eduOffer_id', 
                       tblUsersTargetGroups.userCn AS 'user_id'
          FROM tblModules
               INNER JOIN tblEduOffersModules ON tblEduOffersModules.module_id = tblModules.id
               INNER JOIN tblEduOffersTargetGroups ON tblEduOffersTargetGroups.eduOffer_Id = tblEduOffersModules.eduOffer_id
               INNER JOIN tblUsersTargetGroups ON tblUsersTargetGroups.targetGroup_id = tblEduOffersTargetGroups.targetGroup_id
               LEFT OUTER JOIN tblStatusUserModule ON tblStatusUserModule.module_id = tblModules.id
                                                  AND tblStatusUserModule.user_id = @user_id
         WHERE tblModules.mandator_id = @current_mandator_id
           AND tblStatusUserModule.status IS NULL
           AND NOT EXISTS(
                          SELECT *
                            FROM tblXBissUsersModulesResults
                           WHERE tblXBissUsersModulesResults.user_id = tblUsersTargetGroups.userCn
                             AND tblXBissUsersModulesResults.module_id = tblModules.id)

OPEN @cursorChecker

FETCH next FROM @cursorChecker INTO @eduOffer_id, @user_id
WHILE(@@fetch_status &lt;&gt; -1)
        BEGIN
        --select @eduOffer_id, @user_id
        EXEC sp_CheckEduOfferCache @current_mandator_id, @eduOffer_id, NULL, NULL, @user_id
        FETCH next FROM @cursorChecker INTO @eduOffer_id, @user_id
        END

        CLOSE @cursorChecker
        DEALLOCATE @cursorChecker

        -- Step 2: create a temp table which holds all necessary values

        BEGIN TRANSACTION

        DECLARE @runtime DATETIME
        SET @runtime = GETDATE()

        SELECT DISTINCT(tblModules.id)AS 'module_id',
        tblItems.tag AS 'module_tag',
        tblItems.titleForLearners,
        tblItems.title,
        tblUsersTargetGroups.userCn AS 'user_id',
        tblStatusUserItemHistory.status
        , tblStatusUserItemHistory.startDate as moduleStart
        INTO #tblResults
        FROM tblModules
        INNER JOIN tblItems ON tblItems.id = tblModules.id
        INNER JOIN tblEduOffersModules ON tblEduOffersModules.module_id = tblModules.id
        INNER JOIN tblEduOffersTargetGroups ON tblEduOffersTargetGroups.eduOffer_Id = tblEduOffersModules.eduOffer_id
        INNER JOIN tblUsersTargetGroups ON tblUsersTargetGroups.targetGroup_id = tblEduOffersTargetGroups.targetGroup_id
        LEFT OUTER JOIN tblStatusUserItemHistory ON tblStatusUserItemHistory.item_id = tblModules.id
        AND tblStatusUserItemHistory.user_id = tblUsersTargetGroups.userCn
        AND tblStatusUserItemHistory.status = 2 and endDate IS NULL
        WHERE tblModules.mandator_id = @current_mandator_id
        AND tblStatusUserItemHistory.status = 2 and tblItems.title like 'EL-%'
        AND NOT EXISTS(
        SELECT *
        FROM tblXBissUsersModulesResults
        WHERE tblXBissUsersModulesResults.user_id = tblUsersTargetGroups.userCn
        AND tblXBissUsersModulesResults.module_id = tblModules.id)

        COMMIT TRANSACTION

        -- Step 3: Update the calculated values and filter out what is not needed


        ALTER TABLE #tblResults
        ADD UserID NVARCHAR(256)

        UPDATE #tblResults
        SET UserID = v_Users.descUserCn
        FROM v_Users
        WHERE user_id = intUserCn

        UPDATE #tblResults
        SET UserID = SUBSTRING(UserID, 2, 255)
        WHERE UserID LIKE('b%')

        -- deliver the results
        SELECT CASE
        WHEN CHARINDEX(';', #tblResults.title) &gt; 4 THEN SUBSTRING(#tblResults.title, 4, CHARINDEX(';', #tblResults.title) - 4)
           ELSE SUBSTRING(#tblResults.title, 4, 255)
       END AS 'Modulnummer', 
       CASE
           WHEN CHARINDEX(';', #tblResults.title) &gt; 4 THEN LTRIM(SUBSTRING(#tblResults.title, CHARINDEX(';', #tblResults.title) + 1, 255))
        ELSE LTRIM(SUBSTRING(#tblResults.title, 4, 255))
        END AS 'Modultitel',
        module_tag AS 'Modul-Kennzeichen',
        CONVERT(VARCHAR(32), moduleStart, 104)  AS 'Modulende',
        CASE
        WHEN(v_Users.data1 IS NULL OR v_Users.data1 = '')THEN #tblResults.UserID
        ELSE 'M' + v_Users.data1
        END COLLATE Latin1_General_CI_AS AS 'UserID',
        '' AS '-'
        FROM #tblResults
        INNER JOIN v_Users ON v_Users.intUserCn = #tblResults.user_id
        --order by user_id, module_id

        INSERT INTO tblXBissUsersModulesResults
        SELECT #tblResults.user_id AS 'user_id',
        #tblResults.module_id AS 'module_id',
        GETDATE()AS 'created'
        FROM #tblResults

DROP TABLE #tblResults
</command>
    </Report>
  </Reports>
</ReportsExport>