USP_LOCATIONAVAILABILITY_GETLOCATIONSINUSE
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@LOCATIONSSELECTED | xml | IN | |
@STARTDATE | date | IN | |
@ENDDATE | date | IN |
Definition
Copy
CREATE procedure dbo.USP_LOCATIONAVAILABILITY_GETLOCATIONSINUSE
(
@LOCATIONSSELECTED xml = null
, @STARTDATE date = null
, @ENDDATE date = null
)
as
begin
-- do not use down to the second. All types we care about are to the minute.
declare @EARLIESTTIME time(0) = '00:00:00';
declare @LATESTTIME time(0) = '23:59:00';
declare @LOCATIONLIST as table
(
ID uniqueidentifier
);
insert into @LOCATIONLIST
select
T.c.value('(ID)[1]','uniqueidentifier') as 'ID'
from @LOCATIONSSELECTED.nodes('/LOCATIONSSELECTED/ITEM') T(c);
-- Unroll the events into entries by day.
-- Might need to be a Temp Table instead considering the record counts that could occur.
declare @EVENTDATA as table
(
ID uniqueidentifier,
NAME nvarchar(100),
PROGRAMID uniqueidentifier,
EVENTLOCATIONID uniqueidentifier,
CAPACITY int,
STARTDATE date,
ENDDATE date,
STARTTIME time(0),
ENDTIME time(0)
);
insert into @EVENTDATA
select
e.ID,
e.NAME,
e.PROGRAMID,
e.EVENTLOCATIONID,
e.CAPACITY,
d.[DAY] STARTDATE,
d.[DAY] ENDDATE,
case
when d.[DAY] = e.STARTDATE then
case e.STARTTIME
when '' then @EARLIESTTIME
else convert(time(0), e.STARTDATETIME)
end
else @EARLIESTTIME
end as STARTTIME,
case
when d.[DAY] = e.ENDDATE then
case e.ENDTIME
when '' then @LATESTTIME
else convert(time(0), e.ENDDATETIME)
end
else @LATESTTIME
end as ENDTIME
from dbo.EVENT e
inner join
(
select DATEADD(D, NUM, @STARTDATE) as [DAY]
from dbo.NUMBERS
) as D on D.[DAY] <= ENDDATE and D.[DAY] >= STARTDATE
left join dbo.PROGRAM p on e.PROGRAMID = p.ID
where
e.ISACTIVE = 1
-- Currently Programs are being treated as higher than events for active status.
and (coalesce(p.ISACTIVE, 1) = 1);
select
NAME,
LOCATIONID,
LOCATIONNAME,
STARTDATE,
ENDDATE,
STARTTIME,
ENDTIME,
QUANTITYUSED,
EVENTCAPACITY,
LOCATIONCAPACITY,
ENTRYTYPE
from (
select
p.NAME as NAME,
el.ID as LOCATIONID,
el.NAME as LOCATIONNAME,
e.STARTDATE as STARTDATE,
e.ENDDATE as ENDDATE,
e.STARTTIME as STARTTIME,
e.ENDTIME as ENDTIME,
TICKETCOUNTS.INUSE as QUANTITYUSED,
e.CAPACITY as EVENTCAPACITY,
el.CAPACITY as LOCATIONCAPACITY,
0 as ENTRYTYPE -- events
from @LOCATIONLIST ll
inner join dbo.EVENTLOCATION el on el.ID = ll.ID
inner join dbo.PROGRAMEVENTLOCATION pel on pel.EVENTLOCATIONID = el.ID
inner join @EVENTDATA e on e.ID = pel.EVENTID
inner join dbo.PROGRAM p on p.ID = e.PROGRAMID
inner join dbo.V_PROGRAMEVENT_TICKETCOUNTS as TICKETCOUNTS on TICKETCOUNTS.ID = e.ID
where
(e.STARTDATE >= @STARTDATE or @STARTDATE is null)
and (e.ENDDATE <= @ENDDATE or @ENDDATE is null)
and (e.STARTTIME >= @EARLIESTTIME or @EARLIESTTIME is null)
and (e.ENDTIME <= @LATESTTIME or @LATESTTIME is null)
union all
-- Events
select
e.NAME as NAME,
el.ID as LOCATIONID,
el.NAME as LOCATIONNAME,
e.STARTDATE as STARTDATE,
e.ENDDATE as ENDDATE,
e.STARTTIME as STARTIME,
e.ENDTIME as ENDTIME,
count(r.ID) as QUANTITYUSED,
max(e.CAPACITY) as EVENTCAPACITY,
max(el.CAPACITY) as LOCATIONCAPACITY,
1 as ENTRYTYPE -- Programs
from @LOCATIONLIST ll
inner join dbo.EVENTLOCATION el on el.ID = ll.ID
inner join @EVENTDATA e on e.EVENTLOCATIONID = el.ID
left join dbo.REGISTRANT r ON r.EVENTID = e.ID and r.WILLNOTATTEND = 0 and r.ISCANCELLED = 0
where
(e.STARTDATE >= @STARTDATE or @STARTDATE is null)
and (e.ENDDATE <= @ENDDATE or @ENDDATE is null)
and (e.STARTTIME >= @EARLIESTTIME or @EARLIESTTIME is null)
and (e.ENDTIME <= @LATESTTIME or @LATESTTIME is null)
group by
e.NAME,
el.ID,
el.NAME,
e.STARTDATE,
e.ENDDATE,
e.STARTTIME,
e.ENDTIME
union all
-- Custom Itineraries from Group Sales - uses same unroll method for events
select
i.NAME as NAME,
t.EVENTLOCATIONID as LOCATIONID,
el.NAME as LOCATIONNAME,
d.[DAY] as STARTDATE,
d.[DAY] as ENDDATE,
case
when d.[DAY] = t.STARTDATE then
case t.STARTTIME
when '' then @EARLIESTTIME
else convert(time(0), t.STARTDATETIME)
end
else @EARLIESTTIME
end as STARTTIME,
case
when d.[DAY] = t.ENDDATE then
case t.ENDTIME
when '' then @LATESTTIME
else convert(time(0), t.ENDDATETIME)
end
else @LATESTTIME
end as ENDTIME,
case when T.BLOCKEVENT = 1
then el.CAPACITY
else a.QUANTITY
end as QUANTITYUSED,
el.CAPACITY as EVENTCAPACITY,
el.CAPACITY as LOCATIONCAPACITY,
2 as ENTRYTYPE -- Custom Items
from @LOCATIONLIST ll
inner join dbo.EVENTLOCATION el on el.ID = ll.ID
inner join dbo.ITINERARYITEM T on T.EVENTLOCATIONID = el.ID
inner join dbo.ITINERARY I on T.ITINERARYID = I.ID
inner join dbo.ITINERARYATTENDEE A on A.ITINERARYID = I.ID
inner join
(
select DATEADD(D,NUM, @STARTDATE) as [DAY] from NUMBERS
) as D on D.[DAY] <= ENDDATE and D.[DAY] >= STARTDATE
where
t.ITEMTYPECODE = 2
and t.INVALIDREASONCODE <> 1
) L
where L.STARTDATE < L.ENDDATE or (L.STARTDATE = L.ENDDATE and L.STARTTIME < L.ENDTIME)
order by
LOCATIONNAME, STARTDATE, STARTTIME;
end;