USP_DATAFORMTEMPLATE_VIEW_COMBINATIONONLINE
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | IN | |
@DATALOADED | bit | INOUT | |
@NAME | nvarchar(100) | INOUT | |
@PUBLICDESCRIPTION | nvarchar(max) | INOUT | |
@EVENTSSAMEDAY | bit | INOUT | |
@ISACTIVE | bit | INOUT | |
@CURRENTLYAVAILABLEFORSALEONLINE | bit | INOUT | |
@PROGRAMGROUPS | xml | INOUT | |
@ACKNOWLEDGEMENTEMAILTEMPLATEID | int | INOUT |
Definition
Copy
CREATE procedure dbo.USP_DATAFORMTEMPLATE_VIEW_COMBINATIONONLINE
(
@ID uniqueidentifier,
@DATALOADED bit = 0 output,
@NAME nvarchar(100) = null output,
@PUBLICDESCRIPTION nvarchar(max) = null output,
@EVENTSSAMEDAY bit = null output,
@ISACTIVE bit = null output,
@CURRENTLYAVAILABLEFORSALEONLINE bit = null output,
@PROGRAMGROUPS xml = null output,
@ACKNOWLEDGEMENTEMAILTEMPLATEID integer = null output
)
as
set nocount on;
set @DATALOADED = 0;
-- Online sales method
declare @SALESMETHODID uniqueidentifier = dbo.UFN_SALESMETHOD_GETIDFROMTYPECODE(2);
declare @ONSALEHORIZON int;
select
@ONSALEHORIZON = ONSALEHORIZON
from dbo.PROGRAMTICKETPARTCONTENT;
select
@DATALOADED = 1,
@NAME = COMBINATION.NAME,
@PUBLICDESCRIPTION = COMBINATION.PUBLICDESCRIPTION,
@EVENTSSAMEDAY = COMBINATION.EVENTSSAMEDAY,
@ISACTIVE = COMBINATION.ISACTIVE,
@CURRENTLYAVAILABLEFORSALEONLINE = dbo.UFN_COMBINATION_AVAILABLEFORORDER(@ID, @SALESMETHODID),
@ACKNOWLEDGEMENTEMAILTEMPLATEID = COMBINATION_MICROSITEEMAILTEMPLATE.EMAILTEMPLATEID
from dbo.COMBINATION
left outer join dbo.COMBINATION_MICROSITEEMAILTEMPLATE
on COMBINATION.ID = COMBINATION_MICROSITEEMAILTEMPLATE.COMBINATIONID
and COMBINATION_MICROSITEEMAILTEMPLATE.ACTIVE = 1
where COMBINATION.ID = @ID;
declare @CURRENTDATETIMEWITHOFFSET datetimeoffset = sysdatetimeoffset();
declare @ENDDATE datetime = dbo.UFN_DATE_GETLATESTTIME(DATEADD(dd, @ONSALEHORIZON, getDate()));
declare @ENDDATETIMEWITHOFFSET datetimeoffset = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULTDATEWITHTIMEOFFSET(@ENDDATE, 0);
declare @PROGRAMGROUP table (
ID uniqueidentifier primary key clustered,
NAME nvarchar(100),
PUBLICDESCRIPTION nvarchar(max),
IDSETREGISTERID uniqueidentifier,
ALLOWSCONFLICTS bit
);
insert into @PROGRAMGROUP
(ID, NAME, PUBLICDESCRIPTION, IDSETREGISTERID, ALLOWSCONFLICTS)
select
PROGRAMGROUP.ID,
PROGRAMGROUP.NAME,
PROGRAMGROUP.PUBLICDESCRIPTION,
PROGRAMGROUP.IDSETREGISTERID,
PROGRAMGROUP.ALLOWSCONFLICTS
from dbo.PROGRAMGROUP
where PROGRAMGROUP.COMBINATIONID = @ID;
declare @PROGRAMGROUPPROGRAMS table (
ID uniqueidentifier,
PROGRAMGROUPID uniqueidentifier,
PROGRAMID uniqueidentifier,
PROGRAMISACTIVE bit,
PROGRAMISPREREGISTERED bit,
ISDAILYADMISSION bit,
EVENTID uniqueidentifier,
NAME nvarchar(100),
PUBLICDESCRIPTION nvarchar(max),
DATEADDED datetime
);
insert into @PROGRAMGROUPPROGRAMS
(PROGRAMGROUPID, PROGRAMID, PROGRAMISACTIVE, PROGRAMISPREREGISTERED, ISDAILYADMISSION, NAME, PUBLICDESCRIPTION, DATEADDED)
select
PROGRAMGROUPPROGRAM.PROGRAMGROUPID,
PROGRAMGROUPPROGRAM.PROGRAMID,
PROGRAM.ISACTIVE as PROGRAMISACTIVE,
PROGRAM.ISPREREGISTERED as PROGRAMISPREREGISTERED,
PROGRAM.ISDAILYADMISSION,
PROGRAM.NAME,
PROGRAM.PUBLICDESCRIPTIONHTML as PUBLICDESCRIPTION,
PROGRAMGROUPPROGRAM.DATEADDED
from dbo.PROGRAMGROUP
inner join dbo.PROGRAMGROUPPROGRAM
on PROGRAMGROUP.ID = PROGRAMGROUPPROGRAM.PROGRAMGROUPID
inner join dbo.PROGRAM
on PROGRAMGROUPPROGRAM.PROGRAMID = PROGRAM.ID
where PROGRAMGROUP.COMBINATIONID = @ID
and PROGRAMGROUP.IDSETREGISTERID is null
and (
-- Scheduled events
(
PROGRAM.ISDAILYADMISSION = 0
and PROGRAM.ISPREREGISTERED = 0
) or
-- Daily admissions
(
[PROGRAM].[ISDAILYADMISSION] = 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
)
)
);
insert into @PROGRAMGROUPPROGRAMS
(PROGRAMGROUPID, PROGRAMID, PROGRAMISACTIVE, PROGRAMISPREREGISTERED, ISDAILYADMISSION, NAME, PUBLICDESCRIPTION, DATEADDED)
select
PROGRAMGROUPPROGRAM.PROGRAMGROUPID,
PROGRAMGROUPPROGRAM.PROGRAMID,
PROGRAM.ISACTIVE as PROGRAMISACTIVE,
PROGRAM.ISPREREGISTERED as PROGRAMISPREREGISTERED,
PROGRAM.ISDAILYADMISSION,
PROGRAM.NAME,
PROGRAM.PUBLICDESCRIPTIONHTML as PUBLICDESCRIPTION,
PROGRAMGROUPPROGRAM.DATEADDED
from dbo.PROGRAMGROUP
inner join dbo.PROGRAMGROUPPROGRAM
on PROGRAMGROUP.ID = PROGRAMGROUPPROGRAM.PROGRAMGROUPID
cross apply dbo.UFN_IDSETREADER_GETRESULTS_GUID(PROGRAMGROUP.IDSETREGISTERID) as AVAILABLEPROGRAMS
inner join dbo.PROGRAM
on AVAILABLEPROGRAMS.ID = PROGRAM.ID
where PROGRAMGROUP.COMBINATIONID = @ID
and PROGRAMGROUP.IDSETREGISTERID is not null
-- Scheduled events
and (
(
[PROGRAM].[ISDAILYADMISSION] = 0
and [PROGRAM].[ISPREREGISTERED] = 0
)
-- Daily admissions
or (
[PROGRAM].[ISDAILYADMISSION] = 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
)
)
);
-- If you have one or more scheduled programs
-- ensure a day exists from now until the OnSaleHorizon
-- where at least one event exists for each scheduled program with Availability > 0
-- that can be sold today
if exists(select 1 from @PROGRAMGROUPPROGRAMS where ISDAILYADMISSION = 0)
begin
declare @EVENTS table (
ID uniqueidentifier,
PROGRAMID uniqueidentifier,
NAME nvarchar(100),
SUPERCEDESPROGRAMPUBLICDESCRIPTION bit,
PUBLICDESCRIPTIONHTML nvarchar(max),
EVENTDATE date,
STARTTIME dbo.UDT_HOURMINUTE,
ENDTIME dbo.UDT_HOURMINUTE,
CAPACITY integer,
AVAILABILITY integer
);
insert into @EVENTS
(ID, PROGRAMID, NAME, SUPERCEDESPROGRAMPUBLICDESCRIPTION, PUBLICDESCRIPTIONHTML, EVENTDATE, STARTTIME, ENDTIME, CAPACITY, AVAILABILITY)
select
[EVENT].ID,
[EVENT].PROGRAMID,
[EVENT].NAME,
[EVENT].SUPERCEDESPROGRAMPUBLICDESCRIPTION,
[EVENT].PUBLICDESCRIPTIONHTML,
[EVENT].STARTDATE as EVENTDATE,
[EVENT].STARTTIME,
[EVENT].ENDTIME,
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 [EVENT].PROGRAMID is not null
and EVENTAVAILABILITY.QUANTITY > 0
and EVENTAVAILABILITY.AVAILABLEFORSALE = 1;
create table #PROGRAMGROUPPROGRAMEVENTS_CTE (
PROGRAMGROUPID uniqueidentifier,
ISDAILYADMISSION bit,
ID uniqueidentifier,
EVENTDATE date,
AVAILABILITY integer,
unique clustered (PROGRAMGROUPID,ID)
);
-- Find first date that all program groups have at least 1 event with ISDAILYADMISSION = 1 or availability > 0
declare @FIRSTAVAILABLEDATE datetime = null;
insert into #PROGRAMGROUPPROGRAMEVENTS_CTE
select
PROGRAMGROUPPROGRAM.PROGRAMGROUPID,
PROGRAMGROUPPROGRAM.ISDAILYADMISSION,
[EVENTS].ID,
[EVENTS].EVENTDATE,
[EVENTS].AVAILABILITY
from @PROGRAMGROUPPROGRAMS PROGRAMGROUPPROGRAM
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)
select
@FIRSTAVAILABLEDATE = min(EVENTDATE)
from #PROGRAMGROUPPROGRAMEVENTS_CTE PROGRAMGROUPPROGRAMEVENTS
where not exists(
select 1
from @PROGRAMGROUP PROGRAMGROUPS
left outer join #PROGRAMGROUPPROGRAMEVENTS_CTE PROGRAMGROUPPROGRAMEVENTS2
on PROGRAMGROUPS.ID = PROGRAMGROUPPROGRAMEVENTS2.PROGRAMGROUPID
and (
PROGRAMGROUPPROGRAMEVENTS2.ISDAILYADMISSION = 1
or (
PROGRAMGROUPPROGRAMEVENTS2.EVENTDATE = PROGRAMGROUPPROGRAMEVENTS.EVENTDATE
and PROGRAMGROUPPROGRAMEVENTS2.AVAILABILITY > 0)
)
where PROGRAMGROUPPROGRAMEVENTS2.PROGRAMGROUPID is null
);
-- No date with the OnSaleHorizon where combination is available for sale
if @CURRENTLYAVAILABLEFORSALEONLINE = 1 and @FIRSTAVAILABLEDATE is null
set @CURRENTLYAVAILABLEFORSALEONLINE = 0;
end
-- Assumes only 1 program per program group
set @PROGRAMGROUPS = (
select
PROGRAMGROUPS.ID,
PROGRAMGROUPS.NAME,
PROGRAMGROUPS.PUBLICDESCRIPTION,
PROGRAMGROUPS.IDSETREGISTERID,
PROGRAMGROUPS.ALLOWSCONFLICTS,
(
select top 1
PROGRAMGROUPPROGRAMS.ID,
PROGRAMGROUPPROGRAMS.PROGRAMID,
PROGRAMGROUPPROGRAMS.PROGRAMISACTIVE,
PROGRAMGROUPPROGRAMS.PROGRAMISPREREGISTERED,
PROGRAMGROUPPROGRAMS.NAME,
PROGRAMGROUPPROGRAMS.PUBLICDESCRIPTION,
PROGRAMGROUPPROGRAMS.ISDAILYADMISSION
from @PROGRAMGROUPPROGRAMS PROGRAMGROUPPROGRAMS
where PROGRAMGROUPPROGRAMS.PROGRAMGROUPID = PROGRAMGROUPS.ID
order by PROGRAMGROUPPROGRAMS.DATEADDED asc
for xml raw ('ITEM'), type, elements, root('PROGRAMGROUPPROGRAMS'), BINARY BASE64
)
from @PROGRAMGROUP PROGRAMGROUPS
for xml raw ('ITEM'), type, elements, root('PROGRAMGROUPS'), BINARY BASE64
)
return 0;