UFN_COMBINATION_PROGRAMSAVAILABLE
Determines if the programs in a combination are available for order.
Return
Return Type |
---|
bit |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@COMBINATIONID | uniqueidentifier | IN | |
@SALESMETHODID | uniqueidentifier | IN | |
@DATESELECTTYPE | tinyint | IN | |
@STARTDATE | datetime | IN | |
@ENDDATE | datetime | IN | |
@SHOWPAST | bit | IN |
Definition
Copy
CREATE function [dbo].[UFN_COMBINATION_PROGRAMSAVAILABLE]
(
@COMBINATIONID uniqueidentifier,
@SALESMETHODID uniqueidentifier,
@DATESELECTTYPE tinyint,
@STARTDATE datetime,
@ENDDATE datetime,
@SHOWPAST bit
)
returns bit
with execute as caller
as begin
-- if there is no program groups in the combination, return 0
if not exists (
select PROGRAMGROUP.ID
from dbo.PROGRAMGROUP
where PROGRAMGROUP.COMBINATIONID = @COMBINATIONID)
return 0;
declare @SAMEDAYEVENTS bit = 0;
declare @CURRENTDATE datetime = getdate();
select @SAMEDAYEVENTS = EVENTSSAMEDAY
from dbo.COMBINATION where ID = @COMBINATIONID
-- Program groups that have only scheduled events
-- These are the program groups that need to be checked
-- if the available events are on the same day
declare @PROGRAMGROUP table (
ID uniqueidentifier
)
insert into @PROGRAMGROUP
select PROGRAMGROUP.ID
from PROGRAMGROUP where PROGRAMGROUP.COMBINATIONID = @COMBINATIONID
and NOT exists (
select PROGRAMGROUP.ID
from dbo.PROGRAMGROUPPROGRAM
inner join dbo.PROGRAM on PROGRAMGROUPPROGRAM.PROGRAMID = PROGRAM.ID
where PROGRAMGROUPPROGRAM.PROGRAMGROUPID = PROGRAMGROUP.ID
and PROGRAM.ISDAILYADMISSION = 1
)
and NOT exists (
select PROGRAMGROUP.ID
from dbo.UFN_IDSETREADER_GETRESULTS_GUID(PROGRAMGROUP.IDSETREGISTERID) as PROGRAMGROUPPROGRAM
inner join dbo.PROGRAM on PROGRAMGROUPPROGRAM.ID = PROGRAM.ID
where PROGRAM.ISDAILYADMISSION = 1
)
-- Number of events that occur on the same day
declare @PROGRAMGROUPCOUNTS int
if @SAMEDAYEVENTS = 1
select @PROGRAMGROUPCOUNTS = isnull(count(ID), 0)
from @PROGRAMGROUP
else
set @PROGRAMGROUPCOUNTS = 0
-- table variable to save the programs from the selection
declare @AVAILABLEPROGRAMS table (
PROGRAMGROUPID uniqueidentifier,
PROGRAMID uniqueidentifier
)
insert into @AVAILABLEPROGRAMS
select PROGRAMGROUP.ID, SELECTION.ID
from dbo.PROGRAMGROUP
cross apply dbo.UFN_IDSETREADER_GETRESULTS_GUID(PROGRAMGROUP.IDSETREGISTERID) AS SELECTION
-- Check if selection returns anything
if exists (select PROGRAMGROUP.ID
from dbo.PROGRAMGROUP
where (PROGRAMGROUP.IDSETREGISTERID is not null) and
PROGRAMGROUP.ID not in (select PROGRAMGROUPID from @AVAILABLEPROGRAMS) and
PROGRAMGROUP.COMBINATIONID = @COMBINATIONID
)
return 0;
insert into @AVAILABLEPROGRAMS
select PROGRAMGROUP.ID as PROGRAMGROUPID, PROGRAMGROUPPROGRAM.PROGRAMID as PROGRAMID
from dbo.PROGRAMGROUP
inner join dbo.PROGRAMGROUPPROGRAM on PROGRAMGROUP.ID = PROGRAMGROUPPROGRAM.PROGRAMGROUPID
where PROGRAMGROUP.COMBINATIONID = @COMBINATIONID and (PROGRAMGROUP.IDSETREGISTERID is null);
-- Check availability of the programs in the combination
if exists(
select ID
from @PROGRAMGROUP
where ID not in
(
select PROGRAMGROUP.ID
from dbo.PROGRAMGROUP
where PROGRAMGROUP.COMBINATIONID = @COMBINATIONID and
(
exists
(
select EVENTDATE, count(PROGRAMGROUPID)
from
(
select distinct EVENT.STARTDATE as EVENTDATE, PROGRAMGROUPID
from @AVAILABLEPROGRAMS as AVAILABLEPROGRAMS
inner join dbo.PROGRAM on AVAILABLEPROGRAMS.PROGRAMID = PROGRAM.ID
inner join dbo.[EVENT] on [EVENT].[PROGRAMID] = AVAILABLEPROGRAMS.[PROGRAMID]
inner join dbo.UFN_EVENT_GETAVAILABILITYWITHEVENTS() as AVAILABLE on EVENT.ID = AVAILABLE.EVENTID
where
[PROGRAM].[ISDAILYADMISSION] = 0 and
[PROGRAM].[ISACTIVE] = 1 and
[EVENT].[ISACTIVE] = 1 and
(
((@DATESELECTTYPE = 0 and [EVENT].[STARTDATETIME] >= @CURRENTDATE)
or (@DATESELECTTYPE <> 0 and
([EVENT].[STARTDATETIME] between @STARTDATE and @ENDDATE or
(@STARTDATE between [EVENT].[STARTDATETIME] and [EVENT].[ENDDATETIME]))))
)
and exists ( --Can be sold today and with this sales method
select [EVENTSALESMETHOD].[EVENTID]
from dbo.[EVENTSALESMETHOD]
inner join dbo.[EVENT] on [EVENTSALESMETHOD].[EVENTID] = [EVENT].[ID]
inner join dbo.[PROGRAMSALESMETHOD] on [EVENT].[PROGRAMID] = [PROGRAMSALESMETHOD].[PROGRAMID]
where
[EVENTSALESMETHOD].[EVENTID] = [EVENT].[ID] and
[EVENTSALESMETHOD].[SALESMETHODID] = @SALESMETHODID and
@CURRENTDATE >= [EVENTSALESMETHOD].[ONSALEDATETIME] and
@CURRENTDATE <= case [PROGRAMSALESMETHOD].[ONSALEENDTYPECODE]
when 0 then [EVENT].[STARTDATETIME]
when 1 then dateadd(mi, -1 * [PROGRAMSALESMETHOD].[ONSALEENDINTERVAL], [EVENT].[STARTDATETIME])
when 2 then dateadd(hh, -1 * [PROGRAMSALESMETHOD].[ONSALEENDINTERVAL], [EVENT].[STARTDATETIME])
when 3 then dateadd(mi, [PROGRAMSALESMETHOD].[ONSALEENDINTERVAL], [EVENT].[STARTDATETIME])
end
)
) as PROGRAMGROUPAVAILABLEDATES
where EVENTDATE is not null
group by (EVENTDATE)
having count(PROGRAMGROUPID) >= @PROGRAMGROUPCOUNTS
)
)
)
)
return 0;
-- Check availability of daily admission only program group
if not exists(
select PROGRAMGROUPID
from @AVAILABLEPROGRAMS as AVAILABLEPROGRAMS
inner join dbo.PROGRAM on AVAILABLEPROGRAMS.PROGRAMID = PROGRAM.ID
inner join dbo.[PROGRAMSALESMETHOD] on [PROGRAMSALESMETHOD].[PROGRAMID] = [PROGRAM].[ID]
where
[PROGRAMSALESMETHOD].[SALESMETHODID] = @SALESMETHODID and
[PROGRAM].[ISDAILYADMISSION] = 1 and
[PROGRAM].[ISACTIVE] = 1 and
AVAILABLEPROGRAMS.PROGRAMGROUPID not in (
select PROGRAMGROUPID
from @AVAILABLEPROGRAMS as PROGRAMS
inner join dbo.PROGRAM on PROGRAMS.PROGRAMID = PROGRAM.ID
where [PROGRAM].[ISDAILYADMISSION] = 0
) and
(
@DATESELECTTYPE = 0 or
@STARTDATE <= @ENDDATE
)
) and exists (
select PROGRAMGROUPID
from @AVAILABLEPROGRAMS as AVAILABLEPROGRAMS
inner join dbo.PROGRAM on AVAILABLEPROGRAMS.PROGRAMID = PROGRAM.ID
where
[PROGRAM].[ISDAILYADMISSION] = 1 and
AVAILABLEPROGRAMS.PROGRAMGROUPID not in (
select PROGRAMGROUPID
from @AVAILABLEPROGRAMS as PROGRAMS
inner join dbo.PROGRAM on PROGRAMS.PROGRAMID = PROGRAM.ID
where [PROGRAM].[ISDAILYADMISSION] = 0
)
)
return 0;
return 1;
end