﻿<?xml version="1.0" encoding="utf-8"?>
<ReportsExport>
  <Reports>
    <Report id="020877f5-f568-4195-b37f-2edfa6e9ccfe" codekey="MaxUserRolesPerTimeRange" categoryCodekey="UserStats" name="Höchste Nutzerzahl im Zeitraum" description="Der Report ermittelt für einen vorgegebenen Zeitraum die maximalen Nutzerzahlen (je Rolle und gesamt) je Mandant. Dabei werden die Werte desjenigen Zeitpunkts ausgegeben, zu welchem die Summe der Nutzer jeweils den höchsten Wert hat (Die Maxima der einzeln">
      <MetaData created="2017-11-27T11:03:57" createdBy="Administrator Zentrale (Administrator)" createdBy_user_id="2" modified="2018-05-09T11:34:21" modifiedBy="Administrator Zentrale" />
      <ExecutionDetails format="TableResult" commandType="SqlCommandOrQuery" exportHandler="" adminControl="" exportMultipleTablesToSheets="False" datesWithTime="False" extraParams="" />
      <Mandators mandatorMode="ExcludeMandators" mandator_id="7da81670-5067-49c3-a371-379bb5dc4f11" isStandard="False" isUsedByMenu="False" />
      <Parameters>
        <Parameter id="35d53ae4-4c93-455f-9ef2-0bb4c8671b1b" isRequired="False" allowMultiSelect="False" name="AllMandators" contextName="AllMandators" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
        <Parameter id="d8e4595f-8bdd-4a54-9298-8f378450e6a0" isRequired="False" allowMultiSelect="False" name="Zeitraum" contextName="Zeitraum" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
      </Parameters>
      <Roles>
        <Role id="85" />
        <Role id="90" />
      </Roles>
      <command>
        --DECLARE @mandator_id UNIQUEIDENTIFIER
        --DECLARE @current_mandator_id UNIQUEIDENTIFIER
        --DECLARE @current_user_id INT
        --DECLARE @dateRange_start DATETIME
        --DECLARE @dateRange_end DATETIME

        --SET @current_user_id = 2
        --SET @mandator_id = 'D22C23C4-ACC8-4161-BF4D-50F63E395573'
        --SET @dateRange_start = '2018-03-08'
        --SET @dateRange_end = '2018-03-16'

        DECLARE @start_helper DATETIME
        DECLARE @end_helper DATETIME
        DECLARE @current_user_role INT
        DECLARE @mandatorRanges TABLE
        (
        id UNIQUEIDENTIFIER,
        startDate DATETIME,
        endDate DATETIME
        )
        SET @current_user_role = ISNULL(
        (
        SELECT SecurityID
        FROM v_Users
        WHERE intUserCn = @current_user_id
        ), 10)
        IF(@mandator_id IS NULL
        AND @current_user_role &lt; 100)
        BEGIN
        SET @mandator_id = @current_mandator_id  --select @mandator_id = mandator_id from v_Users where intUserCn = @current_user_id
        END

        --DECLARE @start DATETIME
        --DECLARE @end DATETIME
        DECLARE @roleIds TABLE(roleId INT)
        -- preparing a helping table to calculate the days for the query of the users for the day
        DECLARE @dayList TABLE
        ([start] DATETIME,
        [end]   DATETIME,
        mandator_id UNIQUEIDENTIFIER
        )
        DECLARE @result TABLE
        (mandator_id         UNIQUEIDENTIFIER,
        lerner              INT DEFAULT(0), --10
        fuehrungskraft      INT DEFAULT(0), --55
        zgv                 INT DEFAULT(0), -- 70
        koordinator         INT DEFAULT(0), --80
        administrator       INT DEFAULT(0), -- 90
        seminarverwaltung   INT DEFAULT(0), --91
        mandatenwechseln    INT DEFAULT(0), --92
        bildungsmanager     INT DEFAULT(0), --93
        verantwortlicher    INT DEFAULT(0), --94
        seminarmanager      INT DEFAULT(0), --95
        bildungskoordinator INT DEFAULT(0), --96
        organisator         INT DEFAULT(0), --97
        maxDate             DATETIME NULL
        )
        DECLARE @resultHelper TABLE
        (mandator_id UNIQUEIDENTIFIER,
        roleId      INT,
        userCount   INT,
        [day]       DATETIME
        )

        -- preparing all the roles for the queries
        INSERT INTO @roleIds
        SELECT 10
        UNION ALL
        SELECT 55
        UNION ALL
        SELECT 70
        UNION ALL
        SELECT 80
        UNION ALL
        SELECT 90
        UNION ALL
        SELECT 91
        UNION ALL
        SELECT 92
        UNION ALL
        SELECT 93
        UNION ALL
        SELECT 94
        UNION ALL
        SELECT 95
        UNION ALL
        SELECT 96
        UNION ALL
        SELECT 97
        --setting the daterange for the query of the users to have a start and end day information
        -- preparing the daterange information for the query of the users
        INSERT INTO @mandatorRanges
        SELECT tableUsers.mandator_id,
        CASE WHEN (@dateRange_start IS NOT NULL)
        THEN
        CAST(CONVERT(NVARCHAR(32), @dateRange_start, 112) AS DATETIME)
        ELSE
        DATEADD(day, DATEDIFF(day, 0, MIN(tableUsers.created)), 0)
        END,
        CASE WHEN (@dateRange_end IS NOT NULL)
        THEN
        DATEADD(second, -1, DATEADD(day, 1, CAST(CONVERT(NVARCHAR(32), @dateRange_end, 112) AS DATETIME)))
        ELSE
        DATEADD(day, DATEDIFF(day, 0, MAX(tableUsers.created)), 1)
        END
        FROM tableUsers
        WHERE mandator_id = ISNULL(@mandator_id, mandator_id)
          AND userType = 0 -- Normal user
        GROUP BY mandator_id

        --getting for each day in the daterange a single record making the query easier via join condition
        INSERT INTO @dayList
        SELECT DISTINCT
        DATEADD(day, DATEDIFF(day, 0, tableUsers.created), 0),
        DATEADD(second, -1, DATEADD(DAY, 1, CAST(CONVERT(NVARCHAR(32), tableUsers.created, 112) AS DATETIME))),
        tableUsers.mandator_id
        FROM tableUsers
        INNER JOIN @mandatorRanges AS A ON A.id = tableUsers.mandator_id
        WHERE tableUsers.created BETWEEN A.startDate AND A.endDate
          AND tableUsers.userType = 0 -- Normal user

        DECLARE @minHelper DATETIME
        DECLARE @maxHelper DATETIME

        -- if we don't have any created users for the partition we will take the first time partition available
        SELECT @minHelper = MIN(startDate), @maxHelper = DATEADD(SECOND, -1, MAX(endDate)) FROM @mandatorRanges
        INSERT INTO @dayList
        SELECT
        ISNULL(DATEADD(day, DATEDIFF(day, 0, @dateRange_start), 0), @minHelper),
        ISNULL(DATEADD(second, -1, DATEADD(DAY, DATEDIFF(day, 0, @dateRange_start), 1)), @maxHelper),
        B.id
        FROM @mandatorRanges AS B
        WHERE NOT EXISTS (SELECT * FROM @dayList AS A WHERE A.mandator_id = B.id)

        --getting the users which are in the daterange selected active per day and grouped by mandator and security id
        INSERT INTO @resultHelper
        SELECT tableUsers.mandator_id,
        SecurityID,
        COUNT(*),
        dayRows.[start] AS Users
        FROM tableUsers
        INNER JOIN @roleIds AS roles ON roles.roleId = tableUsers.SecurityID -- checking against the defined list of roles
        INNER JOIN @dayList AS dayRows ON dayRows.mandator_id = tableUsers.mandator_id AND tableUsers.created &lt; dayRows.[end]
        AND (ISNULL(tableUsers.deleted, dayRows.[end]) &gt;= dayRows.[end]) -- getting all users which are created before the dayswitch
        WHERE tableUsers.mandator_id = ISNULL(@mandator_id, tableUsers.mandator_id) --getting either the given mandator or all entries
          AND tableUsers.userType = 0 -- Normal user
        GROUP BY tableUsers.mandator_id,
        SecurityId,
        dayRows.[start]

        --removing those entries which don't have th biggest SUM per day to only have the maximum users per day in the output
        DELETE delTable
        FROM
        (
        SELECT mandator_id,
        day,
        ROW_NUMBER() OVER(PARTITION BY mandator_id ORDER BY userPerDay DESC) AS rowNumber
        FROM
        (
        SELECT TOP 100 PERCENT mandator_id,
        day,
        SUM(userCount) AS userPerDay
        FROM @resultHelper
        GROUP BY mandator_id,
        day
        ORDER BY mandator_id
        ) AS A
        ) AS ordering, @resultHelper AS delTable
        WHERE delTable.mandator_id = ordering.mandator_id
        AND delTable.day = ordering.day
        AND ordering.rowNumber &gt; 1


        -- preparing the users output by mandator and the date information
        INSERT INTO @result
        (mandator_id,
        maxDate
        )
        SELECT id,
        [day]
        FROM tblMandators
        LEFT JOIN @resultHelper AS helper ON helper.mandator_id = tblMandators.id
        ORDER BY mandator_id,
        [day]
        -- writing column / role information to the result table
        UPDATE upTable
        SET
        lerner = ISNULL(userCount, 0)
        FROM @result AS upTable
        INNER JOIN @resultHelper AS helper ON helper.mandator_id = upTable.mandator_id
        AND helper.roleId = 10
        UPDATE upTable
        SET
        fuehrungskraft = ISNULL(userCount, 0)
        FROM @result AS upTable
        INNER JOIN @resultHelper AS helper ON helper.mandator_id = upTable.mandator_id
        AND helper.roleId = 55
        UPDATE upTable
        SET
        zgv = ISNULL(userCount, 0)
        FROM @result AS upTable
        INNER JOIN @resultHelper AS helper ON helper.mandator_id = upTable.mandator_id
        AND helper.roleId = 70
        UPDATE upTable
        SET
        koordinator = ISNULL(userCount, 0)
        FROM @result AS upTable
        INNER JOIN @resultHelper AS helper ON helper.mandator_id = upTable.mandator_id
        AND helper.roleId = 80
        UPDATE upTable
        SET
        administrator = ISNULL(userCount, 0)
        FROM @result AS upTable
        INNER JOIN @resultHelper AS helper ON helper.mandator_id = upTable.mandator_id
        AND helper.roleId = 90
        UPDATE upTable
        SET
        seminarverwaltung = ISNULL(userCount, 0)
        FROM @result AS upTable
        INNER JOIN @resultHelper AS helper ON helper.mandator_id = upTable.mandator_id
        AND helper.roleId = 91
        UPDATE upTable
        SET
        mandatenwechseln = ISNULL(userCount, 0)
        FROM @result AS upTable
        INNER JOIN @resultHelper AS helper ON helper.mandator_id = upTable.mandator_id
        AND helper.roleId = 92
        UPDATE upTable
        SET
        bildungsmanager = ISNULL(userCount, 0)
        FROM @result AS upTable
        INNER JOIN @resultHelper AS helper ON helper.mandator_id = upTable.mandator_id
        AND helper.roleId = 93
        UPDATE upTable
        SET
        verantwortlicher = ISNULL(userCount, 0)
        FROM @result AS upTable
        INNER JOIN @resultHelper AS helper ON helper.mandator_id = upTable.mandator_id
        AND helper.roleId = 94
        UPDATE upTable
        SET
        seminarmanager = ISNULL(userCount, 0)
        FROM @result AS upTable
        INNER JOIN @resultHelper AS helper ON helper.mandator_id = upTable.mandator_id
        AND helper.roleId = 95
        UPDATE upTable
        SET
        bildungskoordinator = ISNULL(userCount, 0)
        FROM @result AS upTable
        INNER JOIN @resultHelper AS helper ON helper.mandator_id = upTable.mandator_id
        AND helper.roleId = 96
        UPDATE upTable
        SET
        organisator = ISNULL(userCount, 0)
        FROM @result AS upTable
        INNER JOIN @resultHelper AS helper ON helper.mandator_id = upTable.mandator_id
        AND helper.roleId = 97

        -- OUTPUT for the Report
        SELECT DISTINCT
        tblMandators.name AS 'Mandant',
        lerner AS 'Lerner',
        fuehrungskraft AS 'Führungskraft',
        zgv AS 'ZGV',
        koordinator AS 'Koordinator',
        administrator AS 'Administrator',
        seminarverwaltung AS 'Seminarverwaltung',
        mandatenwechseln AS 'Mandantenwechseln',
        bildungsmanager AS 'Bildungsmanager',
        verantwortlicher AS 'Verantwortlicher',
        seminarmanager AS 'Seminarmanager',
        bildungskoordinator AS 'Bildungskoordinator',
        organisator AS 'Organisator',
        (
        SELECT SUM(A.userCount)
        FROM @resultHelper AS A
        WHERE A.mandator_id = tblMandators.id
        GROUP BY A.mandator_id
        ) AS 'Gesamt',
        maxDate AS 'Datum'
        FROM tblMandators
        INNER JOIN @result AS res ON res.mandator_id = tblMandators.id
        AND ISNULL(@mandator_id, tblMandators.id) = tblMandators.id
        AND tblMandators.isTemplate = 0
        ORDER BY tblMandators.name
      </command>
    </Report>
  </Reports>
  <Parameters>
    <Parameter id="35d53ae4-4c93-455f-9ef2-0bb4c8671b1b" isSystem="False" name="AllMandators" reportParameterType_id="17a098cd-8e46-43ad-8350-4dab86f7cf9d" queryParameterName="@mandator_id" />
    <Parameter id="d8e4595f-8bdd-4a54-9298-8f378450e6a0" isSystem="True" name="Zeitraum" reportParameterType_id="abff13be-91c3-4ee1-93a3-7292f8e013ba" queryParameterName="@dateRange" />
  </Parameters>
  <ParameterTypes>
    <ParameterType id="17a098cd-8e46-43ad-8350-4dab86f7cf9d" isSystem="False" name="AllMandators" datatype="GuidDDL" dataValueField="id" dataTextField="name">
      <query>
        IF(EXISTS(SELECT *
        FROM v_Users
        WHERE intUserCn = @current_user_id AND SecurityID = 100))
        BEGIN
        SELECT id,
        name
        FROM tblMandators
        WHERE isTemplate = 0
        ORDER BY name
        END
        ELSE
        BEGIN
        SELECT id,
        name
        FROM tblMandators
        WHERE id = @current_mandator_id
        AND EXISTS(
        SELECT *
        FROM v_Users
        WHERE intUserCn = @current_user_id AND SecurityID &gt;= 90)
        END
      </query>
    </ParameterType>
    <ParameterType id="abff13be-91c3-4ee1-93a3-7292f8e013ba" isSystem="True" name="DateRange" datatype="DateRange" dataValueField="" dataTextField="" />
  </ParameterTypes>
</ReportsExport>