USP_DATALIST_COMBINATIONAVAILABLEDATES

Parameters

Parameter Parameter Type Mode Description
@COMBINATIONID uniqueidentifier IN
@SALESMETHODTYPECODE tinyint IN
@STARTDATE datetime IN
@ENDDATE datetime IN

Definition

Copy


CREATE procedure dbo.USP_DATALIST_COMBINATIONAVAILABLEDATES
(
    @COMBINATIONID uniqueidentifier = null,
    @SALESMETHODTYPECODE tinyint = null,
    @STARTDATE datetime = null,
    @ENDDATE datetime = null
)
as
    set nocount on;

    -- Default to Online sales

    if @SALESMETHODTYPECODE is null
        set @SALESMETHODTYPECODE = 2;

    declare @SALESMETHODID uniqueidentifier;
    set @SALESMETHODID = dbo.UFN_SALESMETHOD_GETIDFROMTYPECODE(@SALESMETHODTYPECODE);

    declare @CURRENTDATETIMEWITHOFFSET datetimeoffset = sysdatetimeoffset(); 
    declare @STARTDATETIMEWITHOFFSET datetimeoffset = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULTDATEWITHTIMEOFFSET(@STARTDATE, 0);
    declare @ENDDATETIMEWITHOFFSET datetimeoffset = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULTDATEWITHTIMEOFFSET(@ENDDATE, 0);

    set @ENDDATE = dbo.UFN_DATE_GETLATESTTIME(@ENDDATE);

    declare @HASDELIVERYMETHOD bit;
    declare @HASUNRESTRICTEDDELIVERY bit;
    declare @EARLIESTVALIDEVENTTIMEWITHOFFSET datetimeoffset(3) = null;

    select 
        @HASDELIVERYMETHOD = [HASDELIVERYMETHOD],
        @HASUNRESTRICTEDDELIVERY = [HASUNRESTRICTEDDELIVERY], 
        @EARLIESTVALIDEVENTTIMEWITHOFFSET = [EARLIESTVALIDEVENTDATETIMEWITHOFFSET]
    from dbo.UFN_DELIVERYMETHOD_INFO_BYSALESMETHODID(@SALESMETHODID);

    declare @PROGRAMGROUP table (
        ID uniqueidentifier primary key clustered,
        NAME nvarchar(100),
        IDSETREGISTERID uniqueidentifier
    );

    insert into @PROGRAMGROUP
        (ID, NAME, IDSETREGISTERID)
    select
        PROGRAMGROUP.ID,
        PROGRAMGROUP.NAME,
        PROGRAMGROUP.IDSETREGISTERID
    from dbo.PROGRAMGROUP
    where PROGRAMGROUP.COMBINATIONID = @COMBINATIONID;

    declare @EVENTS table (
        ID uniqueidentifier,
        PROGRAMID uniqueidentifier,
        NAME nvarchar(100),
        EVENTDATE date,
        STARTTIME dbo.UDT_HOURMINUTE,
        ENDTIME dbo.UDT_HOURMINUTE,
        STARTDATETIMEWITHOFFSET datetimeoffset,
        ENDDATETIMEWITHOFFSET datetimeoffset,
        CAPACITY integer,
        AVAILABILITY integer
    );

    insert into @EVENTS
        (ID, PROGRAMID, NAME, EVENTDATE, STARTTIME, ENDTIME, STARTDATETIMEWITHOFFSET, ENDDATETIMEWITHOFFSET, CAPACITY, AVAILABILITY)
        select
            [EVENT].ID,
            [EVENT].PROGRAMID,
            [EVENT].NAME,
            [EVENT].STARTDATE as EVENTDATE,
            [EVENT].STARTTIME,
            [EVENT].ENDTIME,
            [EVENT].STARTDATETIMEWITHOFFSET,
            [EVENT].ENDDATETIMEWITHOFFSET,
            coalesce([EVENT].CAPACITY, 0) as CAPACITY,
            EVENTAVAILABILITY.QUANTITY as AVAILABILITY
        from dbo.UFN_EVENT_GETAVAILABILITYWITHEVENTS_BYDATE(4, @CURRENTDATETIMEWITHOFFSET, @ENDDATETIMEWITHOFFSET, @CURRENTDATETIMEWITHOFFSET, @SALESMETHODID, 0, convert(date, @CURRENTDATETIMEWITHOFFSET), convert(date, @ENDDATETIMEWITHOFFSET), getDate()) EVENTAVAILABILITY
        inner join dbo.[EVENT]
            on EVENTAVAILABILITY.EVENTID = [EVENT].ID
        where [EVENT].ISACTIVE = 1
            and EVENTAVAILABILITY.QUANTITY > 0
            and (
                @HASDELIVERYMETHOD = 1
                and (
                    @HASUNRESTRICTEDDELIVERY =  1
                    or [EVENT].STARTDATETIMEWITHOFFSET > @EARLIESTVALIDEVENTTIMEWITHOFFSET
                )
            );

    create table #PROGRAMGROUPPROGRAMS (
        ID uniqueidentifier,
        PROGRAMGROUPID uniqueidentifier,
        PROGRAMID uniqueidentifier,
        PROGRAMISACTIVE bit,
        PROGRAMISPREREGISTERED bit,
        ISDAILYADMISSION bit,
        EVENTID uniqueidentifier,
        NAME nvarchar(100) collate DATABASE_DEFAULT,
        EVENTDATE date,
        STARTDATETIMEWITHOFFSET datetimeoffset(3),
        ENDDATETIMEWITHOFFSET datetimeoffset(3),
        CAPACITY integer,        
        AVAILABILITY integer,
        unique clustered (PROGRAMGROUPID,ID,EVENTID)
    );

    insert into #PROGRAMGROUPPROGRAMS
        (ID, PROGRAMGROUPID, PROGRAMID, PROGRAMISACTIVE, PROGRAMISPREREGISTERED, ISDAILYADMISSION, EVENTID, NAME, EVENTDATE, STARTDATETIMEWITHOFFSET, ENDDATETIMEWITHOFFSET, CAPACITY, AVAILABILITY)
    select
        PROGRAMGROUPPROGRAM.ID,
        PROGRAMGROUPPROGRAM.PROGRAMGROUPID,
        PROGRAMGROUPPROGRAM.PROGRAMID,
        PROGRAM.ISACTIVE as PROGRAMISACTIVE,
        PROGRAM.ISPREREGISTERED as PROGRAMISPREREGISTERED,
        PROGRAM.ISDAILYADMISSION,
        [EVENTS].ID as EVENTID,
        coalesce([EVENTS].NAME, PROGRAM.NAME) as NAME,
        [EVENTS].EVENTDATE,
        [EVENTS].STARTDATETIMEWITHOFFSET,
        [EVENTS].ENDDATETIMEWITHOFFSET,
        [EVENTS].CAPACITY,
        [EVENTS].AVAILABILITY
    from dbo.PROGRAMGROUP
    inner join dbo.PROGRAMGROUPPROGRAM
        on PROGRAMGROUP.ID = PROGRAMGROUPPROGRAM.PROGRAMGROUPID
    inner join dbo.PROGRAM 
        on PROGRAMGROUPPROGRAM.PROGRAMID = PROGRAM.ID    
    left outer join @EVENTS [EVENTS] 
        on PROGRAMGROUPPROGRAM.PROGRAMID = [EVENTS].PROGRAMID 
    left join dbo.[EVENT_MICROSITEEMAILTEMPLATE] on
        ([EVENTS].ID = EVENT_MICROSITEEMAILTEMPLATE.EVENTID) and (EVENT_MICROSITEEMAILTEMPLATE.ACTIVE = 1)
    left join dbo.[PROGRAM_MICROSITEEMAILTEMPLATE] on
        (PROGRAM.ID = PROGRAM_MICROSITEEMAILTEMPLATE.PROGRAMID) and (PROGRAM_MICROSITEEMAILTEMPLATE.ACTIVE = 1)   
    where PROGRAMGROUP.COMBINATIONID = @COMBINATIONID
        and PROGRAMGROUP.IDSETREGISTERID is null
        and (
            -- Scheduled events        

            (
                PROGRAM.ISDAILYADMISSION = 0 
                and PROGRAM.ISPREREGISTERED = 0 
                and PROGRAM.ISACTIVE = 1 
            ) or
            -- Daily admissions

            (
                [PROGRAM].[ISDAILYADMISSION] = 1 
                and [PROGRAM].[ISACTIVE] = 1 
                and exists 
                    ( --Can be sold today and with this sales method

                        select 
                            [PROGRAMSALESMETHOD].[PROGRAMID]
                        from 
                            dbo.[PROGRAMSALESMETHOD]
                        where
                            [PROGRAMSALESMETHOD].[PROGRAMID] =  [PROGRAM].[ID] and
                            [PROGRAMSALESMETHOD].[SALESMETHODID] = @SALESMETHODID 
                    )                 
                and @CURRENTDATETIMEWITHOFFSET <= @ENDDATETIMEWITHOFFSET                
            )
        );


    insert into #PROGRAMGROUPPROGRAMS
        (ID, PROGRAMGROUPID, PROGRAMID, PROGRAMISACTIVE, PROGRAMISPREREGISTERED, ISDAILYADMISSION, EVENTID, NAME, EVENTDATE, STARTDATETIMEWITHOFFSET, ENDDATETIMEWITHOFFSET, CAPACITY, AVAILABILITY)
    select
        PROGRAMGROUPPROGRAM.ID,
        PROGRAMGROUPPROGRAM.PROGRAMGROUPID,
        PROGRAMGROUPPROGRAM.PROGRAMID,
        PROGRAM.ISACTIVE as PROGRAMISACTIVE,
        PROGRAM.ISPREREGISTERED as PROGRAMISPREREGISTERED,
        PROGRAM.ISDAILYADMISSION,
        [EVENTS].ID as EVENTID,
        coalesce([EVENTS].NAME, PROGRAM.NAME) as NAME,
        [EVENTS].EVENTDATE,
        [EVENTS].STARTDATETIMEWITHOFFSET,
        [EVENTS].ENDDATETIMEWITHOFFSET,
        [EVENTS].CAPACITY,
        [EVENTS].AVAILABILITY
    from dbo.PROGRAMGROUP
    inner join dbo.PROGRAMGROUPPROGRAM
        on PROGRAMGROUP.ID = PROGRAMGROUPPROGRAM.PROGRAMGROUPID
    cross apply dbo.UFN_IDSETREADER_GETRESULTS_GUID(PROGRAMGROUP.IDSETREGISTERID) as AVAILABLEPROGRAMS
        --on PROGRAMGROUPPROGRAM.PROGRAMID = AVAILABLEPROGRAMS.ID

    inner join dbo.PROGRAM 
        on AVAILABLEPROGRAMS.ID = PROGRAM.ID
    left outer join @EVENTS [EVENTS] 
        on PROGRAMGROUPPROGRAM.PROGRAMID = [EVENTS].PROGRAMID 
    left join dbo.[EVENT_MICROSITEEMAILTEMPLATE] 
        on [EVENTS].[ID] = EVENT_MICROSITEEMAILTEMPLATE.EVENTID 
        and EVENT_MICROSITEEMAILTEMPLATE.ACTIVE = 1
    left join dbo.PROGRAM_MICROSITEEMAILTEMPLATE 
        on PROGRAM.ID = PROGRAM_MICROSITEEMAILTEMPLATE.PROGRAMID 
        and PROGRAM_MICROSITEEMAILTEMPLATE.ACTIVE = 1
    where PROGRAMGROUP.COMBINATIONID = @COMBINATIONID
        and PROGRAMGROUP.IDSETREGISTERID is not null
        -- Scheduled events

        and (
            (
                [PROGRAM].[ISDAILYADMISSION] = 0 
                and [PROGRAM].[ISPREREGISTERED] = 0 
            ) 
            -- Daily admissions

            or (
                [PROGRAM].[ISDAILYADMISSION] = 1 
                and [PROGRAM].[ISACTIVE] = 1 
                and @CURRENTDATETIMEWITHOFFSET <= @ENDDATETIMEWITHOFFSET
                and exists 
                    ( --Can be sold today and with this sales method

                        select 
                            [PROGRAMSALESMETHOD].[PROGRAMID]
                        from 
                            dbo.[PROGRAMSALESMETHOD]
                        where
                            [PROGRAMSALESMETHOD].[PROGRAMID] =  [PROGRAM].[ID] and
                            [PROGRAMSALESMETHOD].[SALESMETHODID] = @SALESMETHODID 
                    )                 
            )
        );

    select distinct
        EVENTDATE as AVIALABLEDATE
    from #PROGRAMGROUPPROGRAMS PROGRAMGROUPPROGRAMS
    where not exists(
        select 1
        from @PROGRAMGROUP PROGRAMGROUPS
        left outer join #PROGRAMGROUPPROGRAMS PROGRAMGROUPPROGRAMS2
            on PROGRAMGROUPS.ID = PROGRAMGROUPPROGRAMS2.PROGRAMGROUPID
            and (
                PROGRAMGROUPPROGRAMS2.ISDAILYADMISSION = 1 
                or (
                    PROGRAMGROUPPROGRAMS2.EVENTDATE = PROGRAMGROUPPROGRAMS.EVENTDATE
                    and PROGRAMGROUPPROGRAMS2.AVAILABILITY > 0)
            )
        where PROGRAMGROUPPROGRAMS2.PROGRAMGROUPID is null
    );