﻿<?xml version="1.0" encoding="utf-8"?>
<ReportsExport>
  <Reports>
    <Report id="51A2A4CC-FC8C-4138-93FF-9FBA06DB50B5" codekey="ChangeUserItemStatusDates" categoryCodekey="Testing" name="Change User Item Status Dates" description="Modifies basically all user item dates for WBTs, for all item types updates tblStatusUserItemHistory, assignment, score, certificate, certification period and rating dates.">
      <MetaData created="2012-04-12T12:53:11" createdBy="Administrator, VIWIS (Administrator)" createdBy_user_id="3" modified="2020-02-20T11:53:20" modifiedBy="Rolle, Administrator (Administrator)" modifiedBy_user_id="12" />
      <ExecutionDetails format="TableResult" commandType="SqlCommandOrQuery" exportHandler="" adminControl="" exportMultipleTablesToSheets="False" datesWithTime="False" extraParams="" />
      <Mandators mandatorMode="ExcludeMandators" mandator_id="96ba2868-8baf-4e69-b1fb-d2cc6d6832e8" isStandard="False" isUsedByMenu="False" />
      <Parameters>
        <Parameter id="ca406f5d-c0f6-414b-97b2-1382f42684f0" isRequired="False" allowMultiSelect="False" name="Benutzer" contextName="User" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
        <Parameter id="aee9472c-2d96-4e67-b86b-e4c2cbff8ca3" isRequired="False" allowMultiSelect="False" name="BausteinTyp (nur mit Status, schöne Namen)" contextName="Item type" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
        <Parameter id="24d85b3a-ea7b-4262-b2f6-32e62f3efe07" isRequired="False" allowMultiSelect="False" name="AuswahlItems per Typ" contextName="Items for type" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
        <Parameter id="4efd6f77-3f44-4854-be04-fec6d9b0cdae" isRequired="False" allowMultiSelect="False" name="Months to back date" contextName="Months to back date" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
        <Parameter id="6e2f61d6-8f74-4b8b-bdf8-1f6385a83f92" isRequired="False" allowMultiSelect="False" name="Seconds to back date" contextName="Seconds to back date" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
        <Parameter id="a623a20e-a41f-48a3-be9b-e627c4a80595" isRequired="False" allowMultiSelect="False" name="BeforeDate" contextName="BeforeDate" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
        <Parameter id="7a721121-2d2e-4a3d-b9e6-c6aa238e7ab2" isRequired="True" allowMultiSelect="False" name="Auswahl (ja/nein)" contextName="Change data (ja/nein)" defaultValue="0" renderHint="Undefined" disableParameter="DontDisable" />
      </Parameters>
      <Roles />
      <command>
        -- Start test variable area
        -- DECLARE @mandator_id UNIQUEIDENTIFIER
        -- SELECT @mandator_id = id FROM tblMandators WHERE name = 'TestAllFeatures'
        -- DECLARE @user_id INT = 60696;
        -- DECLARE @months INT = 13;
        -- DECLARE @secondsFineAdjustment INT = 30;
        -- DECLARE @item_id UNIQUEIDENTIFIER = '1d2148d0-05b3-4774-84db-20b0bd6b0f66';
        -- DECLARE @itemType NVARCHAR(50) = 'Theme'
        -- DECLARE @beforeDate DATETIME = NULL;
        -- End test variable area

        -- do the data manipulation
        IF(@selection_yesno=1)
        BEGIN
          IF(@user_id is null or @item_id is null or @months is null)
          BEGIN
            if(@user_id is null) select 'Please select user.' as 'Data manipulation precondition'
            if(@item_id is null) select 'Please select item.' as 'Data manipulation precondition'
            if(@months is null and @secondsFineAdjustment IS NULL) select 'Please select months and/or seconds fine adjustment.' as 'Data manipulation precondition'
          END
          ELSE
          BEGIN
            -- Negate or default the adjustment values.  Negated so that a positive value puts the date back in time
            SET @months = ISNULL(-@months, 0);
            SET @secondsFineAdjustment = ISNULL(-@secondsFineAdjustment, 0);
            
          -- ------------------------------------------------------------------------------
          -- Synchronise with the query from IntegrationTestBase.UpdateAllUserItemStatusDates below
          -- ------------------------------------------------------------------------------

-- For some date only adjustments seconds adjustment is not allowed, so get this roughly right
-- by calculating the amount of days in the seconds adjustment
DECLARE @daysFromSecondsAdjustment INT;
SELECT @daysFromSecondsAdjustment = @secondsFineAdjustment / 86400;

-- Get a list of the statuses that need to be updated
CREATE TABLE #Statuses
(
    StatusId UNIQUEIDENTIFIER PRIMARY KEY
)

INSERT INTO
    #Statuses
SELECT
    suih.id
FROM
    tblStatusUserItemHistory suih
    JOIN tblItems i
        ON  i.id = suih.item_id
WHERE
    suih.user_id = @user_id
    AND suih.item_id = @item_id
    AND (@beforeDate IS NULL OR suih.startDate &lt; @beforeDate);

-- Back date the primary status rows, valid for all item types
UPDATE
    suih
SET
    startDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, startDate)),
    endDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, endDate)),
    created = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, created)),
    overrideDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, overrideDate)),
    voluntaryOverrideDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, voluntaryOverrideDate))
FROM
    tblStatusUserItemHistory suih
    JOIN #Statuses
        ON  #Statuses.StatusId = suih.id

UPDATE
    tblUsersItemsRatings
SET
    created = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, created))
WHERE
    user_id = @user_id
    AND item_id = @item_id
    AND (@beforeDate IS NULL OR created &lt; @beforeDate);

UPDATE
    tblUserItemScores
SET
    created = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, created)),
    startDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, startDate)),
    endDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, endDate))
WHERE
    user_id = @user_id
    AND item_id = @item_id
    AND (@beforeDate IS NULL OR created &lt; @beforeDate);

UPDATE
    tblUserItemCertificate
SET
    received = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, received))
WHERE
    user_id = @user_id
    AND item_id = @item_id
    AND (@beforeDate IS NULL OR received &lt; @beforeDate);

UPDATE
    tblStatusUserItemOverride
SET
    assignedDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, assignedDate)),
    lastStatusCriteriaChangeDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, lastStatusCriteriaChangeDate)),
    overrideAlertSentDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, overrideAlertSentDate)),
    overrideFinalAlertSentDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, overrideFinalAlertSentDate)),
    overrideDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, overrideDate)),
    readyForNewCreditPointsDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, readyForNewCreditPointsDate)),
    voluntaryOverrideDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, voluntaryOverrideDate)),
    periodStart = DATEADD(d, @daysFromSecondsAdjustment, DATEADD(MM, @months, periodStart))
WHERE
    user_id = @user_id
    AND item_id = @item_id
    AND (@beforeDate IS NULL OR assignedDate &lt; @beforeDate);

-- Back date any direct assignment
UPDATE
    tblUsersItemsAssignments
SET
    assignedDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, assignedDate))
WHERE
    user_id = @user_id
    AND item_id = @item_id
    AND (@beforeDate IS NULL OR assignedDate &lt; @beforeDate);

UPDATE
    tblUserItemPeriodHistory
SET
    created = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, created)),
    periodStart = DATEADD(d, @daysFromSecondsAdjustment, DATEADD(MM, @months, periodStart))
WHERE
    user_id = @user_id
    AND item_id = @item_id
    AND (@beforeDate IS NULL OR created &lt; @beforeDate);

-- Extra steps specific to item types
IF @itemType = 'Test'
BEGIN
    UPDATE
        tblTasTestSessions
    SET
        startDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, startDate)),
        endDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, endDate))
    WHERE
        user_id = @user_id
        AND test_id = @item_id
        AND (@beforeDate IS NULL OR startDate &lt; @beforeDate);
		
    UPDATE
        tblTasStatsTestSessions
    SET
        endDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, endDate))
    WHERE
        user_id = @user_id
        AND test_id = @item_id
        AND (@beforeDate IS NULL OR endDate &lt; @beforeDate);
END
		
IF @itemType = 'Theme'
BEGIN
    UPDATE
        tblStatsThemeSessions
    SET
        startTime = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, startTime)),
        lastPingTime = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, lastPingTime))
    WHERE
        user_id = @user_id
        AND theme_id = @item_id
        AND (@beforeDate IS NULL OR startTime &lt; @beforeDate);

    UPDATE
        ts
    SET
        ts.startDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, ts.startDate)),
        ts.endDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, ts.endDate))
    FROM
        tblThemeSessions ts
        JOIN tblStatusUserItemHistory suih
            ON  suih.session_id = ts.id
        JOIN #Statuses
            ON  #Statuses.StatusId = suih.id
    WHERE
        (@beforeDate IS NULL OR ts.startDate &lt; @beforeDate);

    UPDATE
        tblSCORMData
    SET
        [TimeStamp] = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, [TimeStamp]))
    WHERE
        UserId = @user_id
        AND theme_id = @item_id
        AND (@beforeDate IS NULL OR [TimeStamp] &lt; @beforeDate);

    UPDATE
        tblThemeSessionSCORMData
    SET
        [timeStamp] = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, [timeStamp]))
    WHERE
        user_id = @user_id
        AND theme_id = @item_id
        AND (@beforeDate IS NULL OR [timeStamp] &lt; @beforeDate);

    UPDATE
        tblStatusUserCourse
    SET
        LastChanged = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, LastChanged)),
        BestCompleteDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, BestCompleteDate)),
        BestExamsDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, BestExamsDate)),
        BestExercisesDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, BestExercisesDate))
    WHERE
        UserId = @user_id
        AND theme_id = @item_id
        AND (@beforeDate IS NULL OR LastChanged &lt; @beforeDate);

    UPDATE
        tblStatusUserCourseHistory
    SET
        themeSessionStartTime = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, themeSessionStartTime))
    WHERE
        user_id = @user_id
        AND theme_id = @item_id
        AND (@beforeDate IS NULL OR themeSessionStartTime &lt; @beforeDate);
END
ELSE IF @itemType = &apos;Test&apos;
BEGIN
    UPDATE
        tblTasStatsTestSessions
    SET
        endDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, endDate))
    WHERE
        user_id = @user_id
        AND test_id = @item_id
        AND (@beforeDate IS NULL OR endDate &lt; @beforeDate);

    UPDATE
        tblTasTestSessions
    SET
        lastPing = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, lastPing)),
        startDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, startDate)),
        endDate = DATEADD(s, @secondsFineAdjustment, DATEADD(MM, @months, endDate))
    WHERE
        user_id = @user_id
        AND test_id = @item_id
        AND (@beforeDate IS NULL OR startDate &lt; @beforeDate);
END

DROP TABLE #Statuses;

          -- ------------------------------------------------------------------------------
          -- End of synchronisation with the query from IntegrationTestBase.UpdateAllUserItemStatusDates
          -- ------------------------------------------------------------------------------
        end
        end
        else
          -- list data
          SELECT
            suih.startDate as 'Status date',
			c.received as 'Cert date',
			o.assignedDate as 'Assigned date',
			o.overrideDate as 'Override date',
			o.readyForNewCreditPointsDate as 'New ET date',
			et.startDate as 'Last ET date',
            case
              when suih.status = 0 Then 'started'
              when suih.status = 1 Then 'in progress'
              when suih.status = 2 Then 'passed'
              when suih.status = 3 then 'failed'
              else '-'
            end as 'Status',
            u.descUserCn as 'Logon',
            u.Nachname as 'Lastname',
            u.Vorname as 'Firstname',
            it.codekey as 'ItemType',
            i.Title as 'Item',
            case when ei.id is null then 'no' else 'yes' end as 'External',
            case when i.deleted is null then 'no' else 'yes' end as 'Deleted',
            case when c.id is null then 'no' else 'yes' end as 'Certificate',
            et.educationTime as 'ET',
            CASE
              WHEN EXISTS(select 1 from tblUserItemScores where referenceScore_id = et.id)
                THEN 'yes'
              ELSE 'no'
            END as 'Corrections'
          FROM
            tblStatusUserItemHistory suih
            JOIN tblItems i
              ON i.id = suih.item_id
            JOIN tblItemTypes it
              ON it.id = i.itemType_id
            JOIN tableUsers u
              ON u.intusercn = suih.user_id
            LEFT JOIN tblUserItemCertificate c
              ON c.status_id = suih.id
            LEFT JOIN tblUserItemScores et
              ON et.status_id = suih.id
            LEFT JOIN tblExternalItems ei
              ON ei.id = i.id
            LEFT JOIN tblStatusUserItemOverride o
              ON o.item_id = i.id AND o.user_id = suih.user_id
          WHERE
            (@item_id IS NULL OR suih.item_id = @item_id)
            AND (@user_id IS NULL or suih.user_id = @user_id)
            AND (@itemType IS NULL or it.codekey = @itemType)
            AND (@beforeDate IS NULL OR suih.startDate &lt; @beforeDate)
          ORDER BY
            suih.startDate, suih.endDate
      </command>
    </Report>
  </Reports>
  <Parameters>
    <Parameter id="ca406f5d-c0f6-414b-97b2-1382f42684f0" isSystem="True" name="Benutzer" reportParameterType_id="1f6b4472-1471-441e-a195-454faa229f22" queryParameterName="@user_id" />
    <Parameter id="aee9472c-2d96-4e67-b86b-e4c2cbff8ca3" isSystem="True" name="BausteinTyp (nur mit Status, schöne Namen)" reportParameterType_id="32872b47-da0f-49d9-8853-0aa4760c5a11" queryParameterName="@itemType" />
    <Parameter id="24d85b3a-ea7b-4262-b2f6-32e62f3efe07" isSystem="False" name="AuswahlItems per Typ" reportParameterType_id="17ff1e13-3694-470a-b49a-39365569a442" queryParameterName="@item_id" />
    <Parameter id="4efd6f77-3f44-4854-be04-fec6d9b0cdae" isSystem="True" name="Months to back date" reportParameterType_id="51b6166f-7a5a-4db3-b4ae-d9b9632dc129" queryParameterName="@months" />
    <Parameter id="6e2f61d6-8f74-4b8b-bdf8-1f6385a83f92" isSystem="False" name="Seconds to back date" reportParameterType_id="e1b4dcd5-a86b-44c1-b9fe-edeb4ff012a1" queryParameterName="@secondsFineAdjustment" />
    <Parameter id="a623a20e-a41f-48a3-be9b-e627c4a80595" isSystem="True" name="BeforeDate" reportParameterType_id="0ba091dc-d92d-482a-bf93-a2a17e41e56c" queryParameterName="@beforeDate" />
    <Parameter id="7a721121-2d2e-4a3d-b9e6-c6aa238e7ab2" isSystem="True" name="Auswahl (ja/nein)" reportParameterType_id="411ec93b-ab23-41ba-91d6-e7dc0235b5af" queryParameterName="@selection_yesno" />
    <Parameter id="93ea204b-dc5e-4c5e-a2fb-5bddfba00150" mandator_id="96ba2868-8baf-4e69-b1fb-d2cc6d6832e8" isSystem="False" name="BausteinTyp" reportParameterType_id="cf9a5701-3e0a-4d05-94f5-c9351e09b7ff" queryParameterName="@itemType" />
    <Parameter id="17e1339a-f602-4ddb-a763-50b517d774de" mandator_id="96ba2868-8baf-4e69-b1fb-d2cc6d6832e8" isSystem="False" name="Wahrheitswert" reportParameterType_id="411ec93b-ab23-41ba-91d6-e7dc0235b5af" queryParameterName="@boolean" />
  </Parameters>
  <ParameterTypes>
    <ParameterType id="1f6b4472-1471-441e-a195-454faa229f22" isSystem="True" name="User" datatype="User" dataValueField="" dataTextField="" />
    <ParameterType id="32872b47-da0f-49d9-8853-0aa4760c5a11" isSystem="True" name="ItemType (with Status, nice names)" datatype="StringDDL" dataValueField="codekey" dataTextField="text">
      <query>
		  DECLARE @itemTypes AS TABLE (
		  codekey NVARCHAR(50),
		  text NVARCHAR(50)
		  )

		  INSERT INTO @itemTypes VALUES ('Theme', 'Lernprogramm')
		  INSERT INTO @itemTypes VALUES ('Test', 'Test')
		  INSERT INTO @itemTypes VALUES ('Poll', 'Poll')
		  INSERT INTO @itemTypes VALUES ('Document', 'Dokument')
		  INSERT INTO @itemTypes VALUES ('Training', 'Seminar')
		  INSERT INTO @itemTypes VALUES ('Video', 'Video')
		  INSERT INTO @itemTypes VALUES ('Module', 'Modul')

		  SELECT codekey, text FROM @itemTypes ORDER BY text
	  </query>
    </ParameterType>
    <ParameterType id="17ff1e13-3694-470a-b49a-39365569a442" isSystem="False" name="AuswahlItems (Typ)" datatype="GuidDDL" dataValueField="ItemID" dataTextField="title">
      <query>
        if @boolean = 1
        begin
        select tblItems.title + case when deleted is null then '' else ' (deleted)' end as title,
        tblExternalItems.id as itemId
        from tblExternalItems
        inner join tblItems on tblItems.id = tblExternalItems.id
        where  tblItems.mandator_id = @current_mandator_id
        order by title
        end
        else
        begin
        select title + case when deleted is null then '' else ' (deleted)' end as title,
        tblItems.id as itemId
        from tblItems
        inner join tblItemTypes on tblItemTypes.id = tblItems.itemType_id
        where tblItemTypes.codekey = @itemType and tblItems.mandator_id = @current_mandator_id
        order by title
        end
      </query>
      <Parameters>
        <Parameter id="93ea204b-dc5e-4c5e-a2fb-5bddfba00150" isRequired="False" allowMultiSelect="False" name="BausteinTyp" contextName="BausteinTyp" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
        <Parameter id="17e1339a-f602-4ddb-a763-50b517d774de" isRequired="False" allowMultiSelect="False" name="Wahrheitswert" contextName="Wahrheitswert" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
      </Parameters>
    </ParameterType>
    <ParameterType id="51b6166f-7a5a-4db3-b4ae-d9b9632dc129" isSystem="True" name="Months" datatype="Integer" dataValueField="" dataTextField="" />
    <ParameterType id="e1b4dcd5-a86b-44c1-b9fe-edeb4ff012a1" isSystem="False" name="Integer" datatype="Integer" dataValueField="" dataTextField="" />
    <ParameterType id="0ba091dc-d92d-482a-bf93-a2a17e41e56c" isSystem="True" name="BeforeDate" datatype="Date" dataValueField="" dataTextField="" />
    <ParameterType id="411ec93b-ab23-41ba-91d6-e7dc0235b5af" isSystem="True" name="Boolean" datatype="StringDDL" dataValueField="Value" dataTextField="Text">
      <query>
        SELECT 0 AS Value, 'Nein' AS Text
        UNION
        SELECT 1 AS Value, 'Ja' AS Text
      </query>
    </ParameterType>
    <ParameterType id="cf9a5701-3e0a-4d05-94f5-c9351e09b7ff" isSystem="True" name="ItemType (all)" datatype="StringDDL" dataValueField="value" dataTextField="text">
      <query>SELECT codekey value, codekey text FROM tblItemTypes</query>
    </ParameterType>
  </ParameterTypes>
</ReportsExport>