UFN_GROUPSALESDEFAULT_GETCAPACITYFORDATESEXCLUDINGRESERVATION
Returns a table with capacity remaining for dates in group sales excluding the capacity used from the reservation passed in.
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@STARTDATE | date | IN | |
@ENDDATE | date | IN | |
@IGNORERESERVATIONID | uniqueidentifier | IN |
Definition
Copy
CREATE function dbo.UFN_GROUPSALESDEFAULT_GETCAPACITYFORDATESEXCLUDINGRESERVATION
(
@STARTDATE date = null,
@ENDDATE date = null,
@IGNORERESERVATIONID uniqueidentifier = null
)
returns @DATESWITHCAPACITY table(COMPAREDATE date, CAPACITY int)
as
begin
with ITINERARIES_CTE as (
select
isnull(min(ITINERARYDATES.STARTDATE), RESERVATION.ARRIVALDATE) as STARTDATE,
isnull(max(ITINERARYDATES.ENDDATE), RESERVATION.ARRIVALDATE) as ENDDATE,
ITINERARYCAPACITIES.QUANTITY
from
dbo.ITINERARY
inner join
dbo.RESERVATION on RESERVATION.ID = ITINERARY.RESERVATIONID
inner join
dbo.SALESORDER on SALESORDER.ID = ITINERARY.RESERVATIONID
outer apply (
select min(STARTDATE) as STARTDATE, max(ENDDATE) as ENDDATE
from dbo.ITINERARYITEM
where ITINERARYID = ITINERARY.ID
) ITINERARYDATES
cross apply (
select sum(ITINERARYATTENDEE.QUANTITY) as QUANTITY
from dbo.ITINERARYATTENDEE
where ITINERARYATTENDEE.ITINERARYID = ITINERARY.ID
) ITINERARYCAPACITIES
where
SALESORDER.STATUSCODE <> 5 -- Cancelled
and (@IGNORERESERVATIONID is null or ITINERARY.RESERVATIONID <> @IGNORERESERVATIONID)
and (
RESERVATION.ARRIVALDATE <= @ENDDATE
-- This check seems strange, but it helps take advantage of the
-- ARRIVALDATE index. The following check will give us the actual results.
and RESERVATION.ARRIVALDATE >= dateadd(day, -5, @STARTDATE)
and isnull(ITINERARYDATES.ENDDATE, RESERVATION.ARRIVALDATE) >= @STARTDATE
)
group by
ITINERARY.ID, ITINERARYDATES.STARTDATE, ITINERARYDATES.ENDDATE, RESERVATION.ARRIVALDATE, ITINERARYCAPACITIES.QUANTITY
)
insert into @DATESWITHCAPACITY
select
D.DATE,
sum(ITINERARIES_CTE.QUANTITY) as CAPACITY
from
dbo.UFN_CALENDARDATES(@STARTDATE, @ENDDATE, 1) as D
inner join
ITINERARIES_CTE on D.DATE between ITINERARIES_CTE.STARTDATE and ITINERARIES_CTE.ENDDATE
group by
D.DATE
option (recompile);
return;
end