USP_REPORT_EVENTATTENDANCE

Parameters

Parameter Parameter Type Mode Description
@FROMDATE datetime IN
@TODATE datetime IN
@EVENTTYPE tinyint IN
@USERNAME nvarchar(100) IN
@INCLUDEINACTIVE bit IN

Definition

Copy


create procedure dbo.USP_REPORT_EVENTATTENDANCE 
(
    @FROMDATE datetime = null,
    @TODATE datetime = null,
    @EVENTTYPE tinyint = 0
    @USERNAME nvarchar(100) = null,
    @INCLUDEINACTIVE bit = 0
)
as
    set nocount on;
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

    declare @APPUSERID uniqueidentifier;
    select @APPUSERID = ID from dbo.APPUSER where USERNAME = @USERNAME;

    set @FROMDATE = dbo.UFN_DATE_GETEARLIESTTIME(@FROMDATE);
    set @TODATE = dbo.UFN_DATE_GETLATESTTIME(@TODATE);
    declare @CURRDATE datetime = getdate();

    declare @FROMDATETIMEOFFSET datetimeoffset = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULTDATEWITHTIMEOFFSET(@FROMDATE, 0);
    declare @TODATETIMEOFFSET datetimeoffset = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULTDATEWITHTIMEOFFSET(@TODATE, 0);

    -- These security checks deactivate links to pages that the user

    -- has been denied. This is merely a convenience, not the actual security.

    -- Therefore it has been designed to 'fail open', i.e. show the links

    -- if the user is not found.

    declare @GRANTEDPREREGISTEREDROSTER bit = 1;
    declare @GRANTEDSCHEDULEDEVENTDETAILREPORT bit = 1;
    declare @GRANTEDEVENTPROFILEREPORT bit = 1;

    if @APPUSERID is not null and dbo.UFN_APPUSER_ISSYSADMIN(@APPUSERID) <> 1 begin
        select @GRANTEDPREREGISTEREDROSTER = dbo.UFN_SECURITY_APPUSER_GRANTED_DASHBOARD_IN_SYSTEMROLE(@APPUSERID, 'ce1594d7-911a-498e-a67a-2c2968f16c40');
        select @GRANTEDSCHEDULEDEVENTDETAILREPORT = dbo.UFN_SECURITY_APPUSER_GRANTED_REPORT_IN_SYSTEMROLE(@APPUSERID, '0db13684-bf29-48ea-b584-f00ad03e860d');
        select @GRANTEDEVENTPROFILEREPORT = dbo.UFN_SECURITY_APPUSER_GRANTED_REPORT_IN_SYSTEMROLE(@APPUSERID, '672c39eb-a5d5-452c-9111-55e202488ede');
    end

    -- EVENTTYPE: 0 = all, 1 = daily admission, 2 = scheduled events, 3 = special events


    declare @RETURNTABLE table 
    (
        EVENTNAME nvarchar(100),
        STARTDATE date,
        STARTTIME nvarchar(8),
        CAPACITY int,
        EVENTURL nvarchar(255),
        PRICETYPE nvarchar(100),
        PRICETYPEREGISTEREDCOUNT int,
        PRICETYPEATTENDINGCOUNT int,
        EVENTTYPE tinyint,
        AVAILABILITYDRAIN int,
        STARTTIMENOFORMAT int,
        SCANNEDCOUNT int,
        SOLD int,
        EVENTID uniqueidentifier
    );

    declare @PROGRAMS table
    (
        EVENTNAME nvarchar(100),
        STARTDATE date,
        PRICETYPE nvarchar(100),
        SCANNEDCOUNT int,
        SOLD int,
        unique clustered (EVENTNAME,STARTDATE,PRICETYPE)
    );

    -- Insert daily admission data into temp table

    if @EVENTTYPE = 1 or @EVENTTYPE = 0 -- Daily admission or All types of events

    begin
        insert into @PROGRAMS
        select
            PROGRAM.NAME,
            SALESORDER.DATE as STARTDATE,
            dbo.UFN_PRICETYPECODE_GETDESCRIPTION(SALESORDERITEMTICKET.PRICETYPECODEID) PRICETYPE,
            0,
            sum(SALESORDERITEM.QUANTITY - isnull(CANCELLEDTICKETS.QUANTITY,0)) as SOLD
        from
            dbo.SALESORDERITEMTICKET 
        inner join
            dbo.SALESORDERITEM on SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
        inner join (
            select RESERVATION.ID, RESERVATION.ARRIVALDATE as DATE
            from dbo.SALESORDER
            inner join dbo.RESERVATION on RESERVATION.ID = SALESORDER.ID
            where RESERVATION.ARRIVALDATE between @FROMDATE and @TODATE
                and (SALESORDER.STATUSCODE = 1 or (SALESORDER.SALESMETHODTYPECODE = 3 and SALESORDER.STATUSCODE <> 5))

            union all

            select SALESORDER.ID, cast(SALESORDER.TRANSACTIONDATE as date) as DATE
            from dbo.SALESORDER
            left join dbo.RESERVATION on RESERVATION.ID = SALESORDER.ID
            where
                SALESORDER.TRANSACTIONDATE between @FROMDATE and @TODATE
                and RESERVATION.ID is null
                and (SALESORDER.STATUSCODE = 1 or (SALESORDER.SALESMETHODTYPECODE = 3 and SALESORDER.STATUSCODE <> 5))
        ) as SALESORDER on SALESORDER.ID = SALESORDERITEM.SALESORDERID
        inner join
            dbo.PROGRAM on SALESORDERITEMTICKET.PROGRAMID = PROGRAM.ID
        left join
            dbo.SALESORDERRESERVEDITEM on SALESORDERITEM.ID = SALESORDERRESERVEDITEM.ID
        left join
            dbo.RESERVATION on SALESORDER.ID = RESERVATION.ID
        left outer join (
            select T. SALESORDERITEMTICKETID, count(*) as QUANTITY from dbo.TICKET T where T.STATUSCODE = 2  group by T.SALESORDERITEMTICKETID
        ) as CANCELLEDTICKETS on CANCELLEDTICKETS.SALESORDERITEMTICKETID = SALESORDERITEMTICKET.ID
        where PROGRAM.ISDAILYADMISSION = 1
            and (@INCLUDEINACTIVE = 1 or PROGRAM.ISACTIVE = 1)
            and (SALESORDERRESERVEDITEM.EXPIRATIONDATE is null or SALESORDERRESERVEDITEM.EXPIRATIONDATE >= @CURRDATE)
        group by 
            SALESORDERITEMTICKET.PRICETYPECODEID, PROGRAM.NAME, SALESORDER.DATE
        order by SALESORDER.DATE;

        declare @TICKETSSCANNED as table
        (
            SCANNED int,
            SCANDATE date,
            PROGRAMNAME nvarchar(200),
            PRICETYPENAME nvarchar(100),
            unique clustered (PROGRAMNAME,SCANDATE,PRICETYPENAME)
        )
        insert into @TICKETSSCANNED
        select
            count(*),
            convert(date, TICKET.SCANDATEWITHTIMEOFFSET),
            PROGRAM.NAME,
            dbo.UFN_PRICETYPECODE_GETDESCRIPTION(TICKET.PRICETYPECODEID)
        from
            dbo.TICKET
        inner join
            dbo.PROGRAM on PROGRAM.ID = TICKET.PROGRAMID
        where
            TICKET.EVENTID is null and TICKET.SALESORDERITEMTICKETID is not null
            and SCANDATEWITHTIMEOFFSET between @FROMDATETIMEOFFSET and @TODATETIMEOFFSET
            and (@INCLUDEINACTIVE = 1 or PROGRAM.ISACTIVE = 1)
        group by convert(date, TICKET.SCANDATEWITHTIMEOFFSET), TICKET.PRICETYPECODEID, PROGRAM.NAME

        merge @PROGRAMS as SOLDTICKETS
        using @TICKETSSCANNED as SCANNEDTICKETS on (
            SOLDTICKETS.STARTDATE = SCANNEDTICKETS.SCANDATE
            and SOLDTICKETS.EVENTNAME = SCANNEDTICKETS.PROGRAMNAME
            and SOLDTICKETS.PRICETYPE = SCANNEDTICKETS.PRICETYPENAME
        )
        when matched then
            update set SOLDTICKETS.SCANNEDCOUNT = SCANNEDTICKETS.SCANNED
        when not matched then
            insert (
                EVENTNAME,
                STARTDATE,
                PRICETYPE,
                SCANNEDCOUNT,
                SOLD
            )
            values (
                SCANNEDTICKETS.PROGRAMNAME,
                SCANNEDTICKETS.SCANDATE,
                SCANNEDTICKETS.PRICETYPENAME,
                SCANNEDTICKETS.SCANNED,
                0
            );
    end

    -- Insert scheduled event data into temp table

    if @EVENTTYPE = 2 or @EVENTTYPE = 0 begin -- Scheduled Event or All

        insert into @RETURNTABLE
        select
            [EVENT].NAME,
            [EVENT].STARTDATE, 
            dbo.UFN_HOURMINUTE_DISPLAYTIME([EVENT].STARTTIME) STARTTIME, 
            [EVENT].CAPACITY as CAPACITY,
            case
                when PROGRAM.ISPREREGISTERED = 1 then
                    case
                        when @GRANTEDPREREGISTEREDROSTER = 1 then
                            'http://www.blackbaud.com/PREREGISTEREDEVENTID?PREREGISTEREDEVENTID=' + convert(nvarchar(36), [EVENT].ID)
                        else
                            null
                    end
                else
                    case
                        when @GRANTEDSCHEDULEDEVENTDETAILREPORT = 1 then
                            'http://www.blackbaud.com/SCHEDULEDEVENTID?SCHEDULEDEVENTID=' + convert(nvarchar(36), [EVENT].ID)
                        else
                            null
                    end
            end as EVENTURL,
            dbo.UFN_PRICETYPECODE_GETDESCRIPTION(SALESORDERITEMTICKET.PRICETYPECODEID) as PRICETYPE,
            PREREGATTENDANCE.REGISTERED as PRICETYPEREGISTEREDCOUNT,
            PREREGATTENDANCE.ATTENDED as PRICETYPEATTENDINGCOUNT,
            2 as EVENTTYPE,
            sum(
                case
                    when SALESORDERRESERVEDITEM.EXPIRATIONDATE is null or SALESORDERRESERVEDITEM.EXPIRATIONDATE >= @CURRDATE then
                        isnull(SALESORDERITEM.QUANTITY, 0) - isnull(CANCELLEDTICKETS.QUANTITY,0)
                    else
                        0
                end
            ) as AVAILABILITYDRAIN,
            case
                when len([EVENT].STARTTIME) = 0 then 0
                else cast([EVENT].STARTTIME as int)
            end as STARTTIMENOFORMAT,
            isnull(TICKETSSCANNED.TICKETCOUNT,0),
            sum(
                case
                    when (SALESORDER.SALESMETHODTYPECODE = 3 and SALESORDER.STATUSCODE <> 5) or SALESORDER.STATUSCODE = 1 then  -- (Group Sales and Cancelled) or Complete

                        isnull(SALESORDERITEM.QUANTITY, 0) - isnull(CANCELLEDTICKETS.QUANTITY,0)
                    else
                        0
                end
            ) as SOLD,
            EVENT.ID
        from dbo.[EVENT]
        inner join dbo.PROGRAM on [EVENT].PROGRAMID = PROGRAM.ID
        left join dbo.SALESORDERITEMTICKET on SALESORDERITEMTICKET.EVENTID = [EVENT].ID
        left join dbo.SALESORDERITEM on SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
        left join dbo.SALESORDER on SALESORDERITEM.SALESORDERID = SALESORDER.ID
        left join dbo.SALESORDERRESERVEDITEM on SALESORDERITEM.ID = SALESORDERRESERVEDITEM.ID
        left outer join (
            select T.SALESORDERITEMTICKETID, count(*) as QUANTITY from dbo.TICKET T where T.STATUSCODE = 2 group by T.SALESORDERITEMTICKETID
        ) as CANCELLEDTICKETS on CANCELLEDTICKETS.SALESORDERITEMTICKETID = SALESORDERITEMTICKET.ID
        left outer join (
            select
                T.EVENTID,
                T.PRICETYPECODEID,
                T.SALESORDERITEMTICKETID,
                count(*) as TICKETCOUNT
            from
                dbo.TICKET T
            where
                T.SCANDATEWITHTIMEOFFSET is not null
            group by
                T.EVENTID, T.PRICETYPECODEID, T.SALESORDERITEMTICKETID
        ) as TICKETSSCANNED on TICKETSSCANNED.EVENTID = [EVENT].ID and TICKETSSCANNED.PRICETYPECODEID = SALESORDERITEMTICKET.PRICETYPECODEID and TICKETSSCANNED.SALESORDERITEMTICKETID = SALESORDERITEMTICKET.ID
        outer apply (
            select
                sum(case 
                    when REGISTRANT.ID is not null and REGISTRANT.ISCANCELLED = 0
                        then 1
                    else 0
                end) as REGISTERED,
                sum(case
                    when REGISTRANT.ATTENDED = 1 and REGISTRANT.ISCANCELLED = 0
                        then 1
                    else 0
                end) as ATTENDED
            from 
                dbo.SALESORDERITEMTICKETREGISTRANT
            inner join
                dbo.REGISTRANT on SALESORDERITEMTICKETREGISTRANT.REGISTRANTID = REGISTRANT.ID
            where
                SALESORDERITEMTICKETREGISTRANT.SALESORDERITEMTICKETID = SALESORDERITEMTICKET.ID
        ) as PREREGATTENDANCE
        where [EVENT].STARTDATE between @FROMDATE and @TODATE
            and (@INCLUDEINACTIVE = 1 or PROGRAM.ISACTIVE = 1)
        group by 
            SALESORDERITEMTICKET.PRICETYPECODEID, [EVENT].STARTDATETIME,
            [EVENT].NAME, [EVENT].STARTDATE, [EVENT].STARTTIME, [EVENT].CAPACITY, [EVENT].ID, TICKETSSCANNED.TICKETCOUNT,
            PREREGATTENDANCE.REGISTERED, PREREGATTENDANCE.ATTENDED, PROGRAM.ISPREREGISTERED, SALESORDERITEMTICKET.ID
        order by 
            [EVENT].STARTDATETIME;
    end

    -- Insert special event data into temp table

    if @EVENTTYPE = 3 or @EVENTTYPE = 0 begin -- BBEC Event or All

        insert into @RETURNTABLE
        select
            [EVENT].NAME, 
            [EVENT].STARTDATE, 
            dbo.UFN_HOURMINUTE_DISPLAYTIME([EVENT].STARTTIME) STARTTIME,
            [EVENT].CAPACITY as CAPACITY,
            case
                when @GRANTEDEVENTPROFILEREPORT = 1 then 'http://www.blackbaud.com/SPECIALEVENTID?SPECIALEVENTID=' + CONVERT(nvarchar(36), [EVENT].ID)
                else null
            end  EVENTURL,
            isnull(dbo.UFN_EVENTREGISTRATIONTYPE_GETDESCRIPTION(EVENTPRICE.EVENTREGISTRATIONTYPEID), 'No option selected'),
            count(REGISTRANT.ID) as PRICETYPEREGISTEREDCOUNT,
            count(nullif(REGISTRANT.ATTENDED, 0)) as PRICETYPEATTENDINGCOUNT,
            3 as EVENTTYPE,
            count(REGISTRANT.ID) as AVAILABILITYDRAIN,
            case
                when len([EVENT].STARTTIME) = 0 then 0
                else cast([EVENT].STARTTIME as int)
            end as STARTTIMENOFORMAT, 
            null as SCANNEDCOUNT,
            null as SOLD,
            EVENT.ID
        from 
            dbo.[EVENT] 
        left outer join 
            dbo.REGISTRANT on REGISTRANT.EVENTID = [EVENT].ID
        left outer join 
            dbo.REGISTRANTREGISTRATIONMAP on REGISTRANT.ID = REGISTRANTREGISTRATIONMAP.REGISTRANTID
        left outer join 
            dbo.REGISTRANTREGISTRATION on REGISTRANTREGISTRATIONMAP.REGISTRANTREGISTRATIONID = REGISTRANTREGISTRATION.ID
        left outer join 
            dbo.EVENTPRICE on REGISTRANTREGISTRATION.EVENTPRICEID = EVENTPRICE.ID
        where
            [EVENT].PROGRAMID is null
            and (@INCLUDEINACTIVE = 1 or [EVENT].ISACTIVE = 1)
            and [EVENT].STARTDATE between @FROMDATE and @TODATE
            and (
                REGISTRANT.ID is null
                or (
                    REGISTRANT.WILLNOTATTEND = 0
                    and dbo.[UFN_REGISTRANT_ISCANCELLED](REGISTRANT.ID) = 0
                )
            )
        group by 
            EVENTPRICE.EVENTREGISTRATIONTYPEID, [EVENT].ID, [EVENT].NAME, [EVENT].STARTDATE, [EVENT].STARTTIME, [EVENT].CAPACITY, [EVENT].STARTDATETIME
        order by 
            [EVENT].STARTDATETIME asc
    end;

    declare @EVENTCAPACITY table 
    (
        EVENTNAME nvarchar(100) primary key,
        TOTALCAPACITY bigint
    );
    insert into @EVENTCAPACITY
    select TC.EVENTNAME,sum(cast(TC.CAPACITY as bigint))
    from (select distinct RT.EVENTID,RT.CAPACITY,RT.EVENTNAME from @RETURNTABLE RT) TC
    group by TC.EVENTNAME;

    select   
        RT.EVENTNAME,
        STARTDATE,
        STARTTIME,
        CAPACITY,
        EVENTURL, 
        PRICETYPE,
        PRICETYPEATTENDINGCOUNT as PRICETYPECOUNT,  
        EVENTTYPE, 
        PRICETYPEREGISTEREDCOUNT,
        PRICETYPEATTENDINGCOUNT,
        AVAILABILITYDRAIN,
        STARTTIMENOFORMAT,
        SCANNEDCOUNT,
        SOLD,
        T.TOTALCAPACITY
    from  
        @RETURNTABLE RT
    left outer join
        @EVENTCAPACITY T on T.EVENTNAME = RT.EVENTNAME

    union all

    select
        P.EVENTNAME,
        STARTDATE,
        null,
        null,
        null,
        PRICETYPE,
        null,
        1,
        null,
        null,
        null,
        0,
        SCANNEDCOUNT,
        SOLD,
        T.TOTALCAPACITY
    from
        @PROGRAMS P
    left outer join
        @EVENTCAPACITY T on T.EVENTNAME = P.EVENTNAME;