USP_REPORT_STAFFINGREPORT

Parameters

Parameter Parameter Type Mode Description
@STARTDATE datetime IN
@ENDDATE datetime IN
@TICKETORDERFILTER bit IN
@STARTTIME nvarchar(10) IN
@ENDTIME nvarchar(10) IN
@DAYOFWEEK int IN
@PROGRAMID uniqueidentifier IN
@PROGRAMQUERY uniqueidentifier IN
@SALESMETHODID uniqueidentifier IN
@SALESMETHODQUERY uniqueidentifier IN

Definition

Copy

      create procedure dbo.USP_REPORT_STAFFINGREPORT
      (
        @STARTDATE datetime = null,
        @ENDDATE datetime = null,
        @TICKETORDERFILTER bit = null,
        @STARTTIME nvarchar(10) = null,
        @ENDTIME nvarchar(10) = null,
        @DAYOFWEEK integer = null,
        @PROGRAMID uniqueidentifier = null,
        @PROGRAMQUERY uniqueidentifier = null
        @SALESMETHODID uniqueidentifier = null,
        @SALESMETHODQUERY uniqueidentifier = null
      )
      as
          set nocount on;
        begin

            set @STARTDATE = dbo.UFN_DATE_GETEARLIESTTIME(@STARTDATE)
            set @ENDDATE = dbo.UFN_DATE_GETLATESTTIME(@ENDDATE)

            --calculate the total number of days

            declare @TOTALNUMBEROFDAYS integer = datediff(day, @STARTDATE, @ENDDATE) + 1

            --in order to get the correct number of days to divide by

            declare @NUMBEROFDAYSPERWEEKDAY integer = @TOTALNUMBEROFDAYS / 7
            declare @NUMBEROFEXTRADAYS integer = @TOTALNUMBEROFDAYS % 7
            declare @STARTWEEKDAY tinyint = datepart(dw, @STARTDATE)

            -- Single day of week

            declare @DAYS table([DAY] integer, [NUMBEROFDAYS] integer);
            if @DAYOFWEEK < 8
            begin
                insert into @DAYS ([DAY], [NUMBEROFDAYS]) values (@DAYOFWEEK, @NUMBEROFDAYSPERWEEKDAY);
            end;

            -- Mon - Fri

            if @DAYOFWEEK = 8
            begin
                insert into @DAYS ([DAY], [NUMBEROFDAYS]) values (2, @NUMBEROFDAYSPERWEEKDAY);
                insert into @DAYS ([DAY], [NUMBEROFDAYS]) values (3, @NUMBEROFDAYSPERWEEKDAY);
                insert into @DAYS ([DAY], [NUMBEROFDAYS]) values (4, @NUMBEROFDAYSPERWEEKDAY);
                insert into @DAYS ([DAY], [NUMBEROFDAYS]) values (5, @NUMBEROFDAYSPERWEEKDAY);
                insert into @DAYS ([DAY], [NUMBEROFDAYS]) values (6, @NUMBEROFDAYSPERWEEKDAY);
            end;

            -- Sat - Sun

            if @DAYOFWEEK = 9
            begin
                insert into @DAYS ([DAY], [NUMBEROFDAYS]) values (1, @NUMBEROFDAYSPERWEEKDAY);
                insert into @DAYS ([DAY], [NUMBEROFDAYS]) values (7, @NUMBEROFDAYSPERWEEKDAY);
            end;

            -- All week

            if @DAYOFWEEK = 10
            begin
                insert into @DAYS ([DAY], [NUMBEROFDAYS]) values (1, @NUMBEROFDAYSPERWEEKDAY);
                insert into @DAYS ([DAY], [NUMBEROFDAYS]) values (2, @NUMBEROFDAYSPERWEEKDAY);
                insert into @DAYS ([DAY], [NUMBEROFDAYS]) values (3, @NUMBEROFDAYSPERWEEKDAY);
                insert into @DAYS ([DAY], [NUMBEROFDAYS]) values (4, @NUMBEROFDAYSPERWEEKDAY);
                insert into @DAYS ([DAY], [NUMBEROFDAYS]) values (5, @NUMBEROFDAYSPERWEEKDAY);
                insert into @DAYS ([DAY], [NUMBEROFDAYS]) values (6, @NUMBEROFDAYSPERWEEKDAY);
                insert into @DAYS ([DAY], [NUMBEROFDAYS]) values (7, @NUMBEROFDAYSPERWEEKDAY);
            end

            --Add on the extra days

            update @DAYS set [NUMBEROFDAYS] = [NUMBEROFDAYS] + 1
            where [DAY] between @STARTWEEKDAY and @STARTWEEKDAY + @NUMBEROFEXTRADAYS - 1
            or [DAY] + 7 between @STARTWEEKDAY and @STARTWEEKDAY + @NUMBEROFEXTRADAYS - 1


            declare @STARTHOUR integer = (datepart(hh,convert(datetime,@STARTTIME)));
            declare @ENDHOUR integer = (datepart(hh,convert(datetime,@ENDTIME))) - 1;

            --Case when we're ending at 11:59 and the hour is 24

            if @ENDHOUR = -1
                set @ENDHOUR = 23

            -- Dummy data that does not affect totals or averages, but will ensure that all days and time

            -- periods are shown in the graphs and table

            declare @DUMMYDATA table(TOTALQUANTITY integer,TRANSACTIONDAY integer,TRANSACTIONHOUR integer, NUMBEROFDAYS integer)
            declare @DAYCOUNT tinyint = 1
            declare @HOURCOUNT tinyint
            declare @NUMBEROFDAYS integer
            while @DAYCOUNT < 8
            begin
                set @HOURCOUNT = 0

                set @NUMBEROFDAYS = 0
                select @NUMBEROFDAYS = NUMBEROFDAYS from @DAYS D where D.DAY = @DAYCOUNT

                while @HOURCOUNT < 24
                begin
                if (@HOURCOUNT between @STARTHOUR and @ENDHOUR)
                begin
                    insert into @DUMMYDATA (TOTALQUANTITY, TRANSACTIONDAY, TRANSACTIONHOUR, NUMBEROFDAYS)
                    values (0, @DAYCOUNT, @HOURCOUNT, @NUMBEROFDAYS)
                end
                set @HOURCOUNT = @HOURCOUNT + 1
                end
                set @DAYCOUNT = @DAYCOUNT + 1
            end

            declare @PROGRAMS table (
                ID uniqueidentifier
            )
            if @PROGRAMID is null and @PROGRAMQUERY is null
                insert into @PROGRAMS
                select ID from dbo.PROGRAM
            else if @PROGRAMID is not null
                insert into @PROGRAMS
                values(@PROGRAMID)
            else
                insert into @PROGRAMS
                select ID
                from dbo.UFN_IDSETREADER_GETRESULTS_GUID(@PROGRAMQUERY)

            declare @SALESMETHODS table (
                TYPECODE tinyint
            )
            if @SALESMETHODID is null and @SALESMETHODQUERY is null
                insert into @SALESMETHODS
                select TYPECODE from dbo.SALESMETHOD
            else if @SALESMETHODID is not null
                insert into @SALESMETHODS
                select TYPECODE from dbo.SALESMETHOD where ID = @SALESMETHODID
            else
                insert into @SALESMETHODS
                select TYPECODE 
                from dbo.SALESMETHOD
                inner join dbo.UFN_IDSETREADER_GETRESULTS_GUID(@SALESMETHODQUERY) [SMS] on
                    SALESMETHOD.ID = [SMS].ID

            -- Tickets

            if @TICKETORDERFILTER = 0
            begin
                --update the dummy dada to include the actual data

                update D
                    set D.TOTALQUANTITY = D.TOTALQUANTITY + DATA.TOTALQUANTITY
                from (
                    select 
                        sum(SOI.QUANTITY) as TOTALQUANTITY, 
                        [DATEPARTS].[DAY] as TRANSACTIONDAY,
                        [DATEPARTS].[HOUR] as TRANSACTIONHOUR
                    from dbo.SALESORDER as SO
                    inner join @SALESMETHODS [SALESMETHODS] on
                        SO.SALESMETHODTYPECODE = [SALESMETHODS].[TYPECODE]
                    inner join dbo.SALESORDERITEM as SOI on SO.ID = SOI.SALESORDERID
                    inner join dbo.SALESORDERITEMTICKET as SOIT on SOI.ID = SOIT.ID
                    left outer join dbo.[EVENT] as E on E.ID = SOIT.EVENTID
                    inner join @PROGRAMS [PROGRAMS] on
                        SOIT.PROGRAMID = [PROGRAMS].ID or
                        E.[PROGRAMID] = [PROGRAMS].ID
                    cross apply(
                        select 
                            datepart(dw,[SO].[TRANSACTIONDATE]) [DAY],
                            datepart(hh,[SO].[TRANSACTIONDATE]) [HOUR]
                    ) as [DATEPARTS]
                    inner join @DAYS [DAYS] on
                        [DATEPARTS].[DAY] = [DAYS].[DAY] and
                        [DATEPARTS].[HOUR] between @STARTHOUR and @ENDHOUR
                    where
                        SOI.TYPECODE = 0 and --This shouldn't be necessary since we're inner joining on SALESORDERITEMTICKET

                        SO.STATUSCODE = 1 and
                        [SO].[TRANSACTIONDATE] between @STARTDATE and @ENDDATE
                    group by 
                        [DATEPARTS].[DAY],
                        [DATEPARTS].[HOUR]
                ) DATA
                inner join @DUMMYDATA
                on 
                    D.TRANSACTIONHOUR = DATA.TRANSACTIONHOUR and 
                    D.TRANSACTIONDAY = DATA.TRANSACTIONDAY
            end

            -- Orders

            if @TICKETORDERFILTER = 1
            begin
                --update the dummy dada to include the actual data

                update D
                set D.TOTALQUANTITY = D.TOTALQUANTITY + DATA.TOTALQUANTITY
                from (
                    select 
                        count(distinct SO.[ID]) as TOTALQUANTITY, 
                        [DATEPARTS].[DAY] as TRANSACTIONDAY,
                        [DATEPARTS].[HOUR] as TRANSACTIONHOUR
                    from dbo.SALESORDER as SO
                    inner join @SALESMETHODS [SALESMETHODS] on
                        SO.SALESMETHODTYPECODE = [SALESMETHODS].[TYPECODE]
                    inner join dbo.SALESORDERITEM as SOI on SO.ID = SOI.SALESORDERID
                    --Since we aren't just reporting on tickets, these next 3 are left joins. We'll do the program check in the where clause (which would essentially make this like @TICKETORDERFILTER = 0)

                    left join dbo.SALESORDERITEMTICKET as SOIT on SOI.ID = SOIT.ID
                    left outer join dbo.[EVENT] as E on E.ID = SOIT.EVENTID
                    left join @PROGRAMS [PROGRAMS] on 
                        SOIT.PROGRAMID = [PROGRAMS].ID or
                        E.[PROGRAMID] = [PROGRAMS].ID
                    cross apply(
                        select 
                            datepart(dw,[SO].[TRANSACTIONDATE]) [DAY],
                            datepart(hh,[SO].[TRANSACTIONDATE]) [HOUR]
                    ) as [DATEPARTS]
                    inner join @DAYS [DAYS] on
                        [DATEPARTS].[DAY] = [DAYS].[DAY] and
                        [DATEPARTS].[HOUR] between @STARTHOUR and @ENDHOUR
                    where
                        SO.STATUSCODE = 1 and
                        [SO].[TRANSACTIONDATE] between @STARTDATE and @ENDDATE and
                        (--Program report parameter check

                            (@PROGRAMID is null and @PROGRAMQUERY is null) or
                            [PROGRAMS].ID is not null
                        )
                    group by 
                        [DATEPARTS].[DAY],
                        [DATEPARTS].[HOUR]
                ) DATA
                inner join @DUMMYDATA
                on 
                    D.TRANSACTIONHOUR = DATA.TRANSACTIONHOUR and 
                    D.TRANSACTIONDAY = DATA.TRANSACTIONDAY
            end



            --update dummy data to include subtotal columns and rows for the grid

            --Include the subtotals for the hours

            insert into @DUMMYDATA (TOTALQUANTITY, TRANSACTIONDAY, TRANSACTIONHOUR, NUMBEROFDAYS)
            select
                sum(TOTALQUANTITY),
                8,
                TRANSACTIONHOUR,
                sum(NUMBEROFDAYS)
            from
                @DUMMYDATA
            group by TRANSACTIONHOUR

            --Include the subtotals for the days

            insert into @DUMMYDATA (TOTALQUANTITY, TRANSACTIONDAY, TRANSACTIONHOUR, NUMBEROFDAYS)
            select
                sum(TOTALQUANTITY),
                TRANSACTIONDAY,
                25,
                NUMBEROFDAYS
            from
                @DUMMYDATA
            where TRANSACTIONDAY <> 8
            group by TRANSACTIONDAY, NUMBEROFDAYS

            select TOTALQUANTITY, TRANSACTIONDAY, TRANSACTIONHOUR, NUMBEROFDAYS from @DUMMYDATA

        end