USP_TRACK_APPLYTRACKTOITINERARY
Applies valid track items to an itinerary.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | IN | |
@TRACKID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.USP_TRACK_APPLYTRACKTOITINERARY
(
@ID uniqueidentifier,
@TRACKID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier
)
as
begin
declare @RESERVATIONDATE datetime
declare @RESERVATIONID uniqueidentifier
select
@RESERVATIONDATE = ARRIVALDATE,
@RESERVATIONID = RESERVATION.ID
from dbo.RESERVATION
inner join dbo.ITINERARY on
ITINERARY.RESERVATIONID = RESERVATION.ID
where
ITINERARY.ID = @ID
/* Fix up the change agent ID incase we were passed null. */
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output
/* Setup the current date */
declare @CURRENTDATE datetime;
set @CURRENTDATE = getdate();
/* First clear the itinerary */
exec dbo.USP_ITINERARY_CLEAR @ID, @RESERVATIONID, @CHANGEAGENTID;
/* Update existing required resources with the max of the existing qty and the new track qty */
update dbo.ITINERARYRESOURCE set
QUANTITYNEEDED = case
when (TRACKRESOURCE.QUANTITYNEEDED > ITINERARYRESOURCE.QUANTITYNEEDED) then
TRACKRESOURCE.QUANTITYNEEDED
else ITINERARYRESOURCE.QUANTITYNEEDED
end,
PRICE = COALESCE(RESOURCEPRICING.PRICE, 0),
PRICINGSTRUCTURECODE = COALESCE(RESOURCEPRICING.PRICINGSTRUCTURECODE,0),
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from dbo.ITINERARYRESOURCE
inner join dbo.TRACKRESOURCE on ITINERARYRESOURCE.RESOURCEID = TRACKRESOURCE.RESOURCEID
left join dbo.RESOURCEPRICING on TRACKRESOURCE.RESOURCEID = RESOURCEPRICING.ID
where
TRACKRESOURCE.TRACKID = @TRACKID and
ITINERARYRESOURCE.ITINERARYID = @ID
/* Now add the new itinerary resources */
insert into dbo.ITINERARYRESOURCE
(
ITINERARYID,
RESOURCEID,
QUANTITYNEEDED,
PRICE,
PRICINGSTRUCTURECODE,
PERTICKETQUANTITY,
PERTICKETDIVISOR,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
)
select
@ID,
TRACKRESOURCE.RESOURCEID,
TRACKRESOURCE.QUANTITYNEEDED,
COALESCE(RESOURCEPRICING.PRICE, 0),
COALESCE(RESOURCEPRICING.PRICINGSTRUCTURECODE,0),
RESOURCE.PERTICKETQUANTITY,
RESOURCE.PERTICKETDIVISOR,
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
from dbo.TRACKRESOURCE
inner join RESOURCE on TRACKRESOURCE.RESOURCEID = RESOURCE.ID
left join dbo.RESOURCEPRICING on TRACKRESOURCE.RESOURCEID = RESOURCEPRICING.ID
left join dbo.ITINERARYRESOURCE EXISTING_ITINERARYRESOURCE on EXISTING_ITINERARYRESOURCE.RESOURCEID = TRACKRESOURCE.RESOURCEID and EXISTING_ITINERARYRESOURCE.ITINERARYID = @ID
where
TRACKRESOURCE.TRACKID = @TRACKID and
EXISTING_ITINERARYRESOURCE.ID is null
/* Now add the new itinerary staff resources */
/* For these we have to preprocess them to create jobs. So first get the track version. */
declare @STAFFRESOURCES xml;
set @STAFFRESOURCES = dbo.UFN_TRACK_GETSTAFFRESOURCES_TOITEMLISTXML(@TRACKID);
/* Get the total attendees for the itinerary */
declare @ATTENDEECOUNT decimal;
select @ATTENDEECOUNT = sum(ITINERARYATTENDEE.QUANTITY)
from dbo.ITINERARYATTENDEE
where ITINERARYATTENDEE.ITINERARYID = @ID;
/* Process the staff resources and add them to the itinerary */
exec dbo.USP_TRACK_STAFFRESOURCES_PROCESS @STAFFRESOURCES output, @CHANGEAGENTID, @ATTENDEECOUNT;
/* For everything to work, we need to integrate the existing itinerary staffing resources after jobs are configured so we can match up */
set @STAFFRESOURCES =
(
select
[FILLEDBYCODE],
[ID],
[JOBID],
[QUANTITYNEEDED],
[VOLUNTEERTYPEID],
[PRICE],
[PRICINGSTRUCTURECODE]
from
(
select
T.c.value('(FILLEDBYCODE)[1]','tinyint') AS 'FILLEDBYCODE',
COALESCE(ITINERARYSTAFFRESOURCE.ID, T.c.value('(ID)[1]','uniqueidentifier')) AS 'ID',
T.c.value('(JOBID)[1]','uniqueidentifier') AS 'JOBID',
case
when VOLUNTEERTYPE.CAPACITYPERRESOURCE > 0 then
ceiling(@ATTENDEECOUNT / VOLUNTEERTYPE.CAPACITYPERRESOURCE)
else
case when ITINERARYSTAFFRESOURCE.QUANTITYNEEDED > T.c.value('(QUANTITYNEEDED)[1]','integer') then
ITINERARYSTAFFRESOURCE.QUANTITYNEEDED
else
T.c.value('(QUANTITYNEEDED)[1]','integer')
end
end as 'QUANTITYNEEDED',
T.c.value('(VOLUNTEERTYPEID)[1]','uniqueidentifier') AS 'VOLUNTEERTYPEID',
T.c.value('(PRICE)[1]','money') AS 'PRICE',
T.c.value('(PRICINGSTRUCTURECODE)[1]','tinyint') AS 'PRICINGSTRUCTURECODE'
from @STAFFRESOURCES.nodes('/STAFFRESOURCES/ITEM') T(c)
inner join dbo.VOLUNTEERTYPE on VOLUNTEERTYPE.ID = T.c.value('(VOLUNTEERTYPEID)[1]','uniqueidentifier')
left join dbo.VOLUNTEERTYPEPRICING on VOLUNTEERTYPE.ID = VOLUNTEERTYPEPRICING.ID
left join ITINERARYSTAFFRESOURCE on
ITINERARYSTAFFRESOURCE.VOLUNTEERTYPEID = T.c.value('(VOLUNTEERTYPEID)[1]','uniqueidentifier') and
(
(ITINERARYSTAFFRESOURCE.JOBID is null and T.c.value('(JOBID)[1]','uniqueidentifier') is null) or
ITINERARYSTAFFRESOURCE.JOBID = T.c.value('(JOBID)[1]','uniqueidentifier')
) and
ITINERARYSTAFFRESOURCE.ITINERARYID = @ID
union all
select
FILLEDBYCODE, ID, JOBID, QUANTITYNEEDED, VOLUNTEERTYPEID, PRICE, PRICINGSTRUCTURECODE
from ITINERARYSTAFFRESOURCE
left join @STAFFRESOURCES.nodes('/STAFFRESOURCES/ITEM') T(c) on
ITINERARYSTAFFRESOURCE.VOLUNTEERTYPEID = T.c.value('(VOLUNTEERTYPEID)[1]','uniqueidentifier') and
(
(ITINERARYSTAFFRESOURCE.JOBID is null and T.c.value('(JOBID)[1]','uniqueidentifier') is null) or
ITINERARYSTAFFRESOURCE.JOBID = T.c.value('(JOBID)[1]','uniqueidentifier')
)
where ITINERARYSTAFFRESOURCE.ITINERARYID = @id
and T.c.value('(ID)[1]','uniqueidentifier') is null
) S
for xml raw('ITEM'),type,elements,root('STAFFRESOURCES'),BINARY BASE64
)
exec dbo.USP_ITINERARY_GETSTAFFRESOURCES_UPDATEFROMXML @ID, @STAFFRESOURCES, @CHANGEAGENTID, @CURRENTDATE;
/* Now start working on inserting the itinerary items */
declare @ITEMS table
(
TRACKITEMID uniqueidentifier,
EVENTID uniqueidentifier,
PROGRAMID uniqueidentifier,
NAME nvarchar(100),
NOTES nvarchar(500),
BLOCKEVENT bit,
STARTTIME dbo.UDT_HOURMINUTE,
ENDTIME dbo.UDT_HOURMINUTE,
STARTDATE datetime,
ENDDATE datetime,
EVENTLOCATIONID uniqueidentifier,
ITEMTYPECODE tinyint
)
insert into @ITEMS
select
ID,
null,
PROGRAMID,
NAME,
NOTES,
BLOCKEVENT,
STARTTIME,
ENDTIME,
dateadd(day,(STARTDAY),@RESERVATIONDATE),
dateadd(day,(ENDDAY),@RESERVATIONDATE),
EVENTLOCATIONID,
TYPECODE
from dbo.TRACKITEM
where TRACKID = @TRACKID
declare @ITINERARYITEMS xml
set @ITINERARYITEMS =
(
select
TRACKITEMID,
EVENTID,
PROGRAMID,
NAME,
NOTES,
BLOCKEVENT,
STARTTIME,
ENDTIME,
STARTDATE,
ENDDATE,
EVENTLOCATIONID,
ITEMTYPECODE
from @ITEMS
for xml raw ('ITEM'), type, elements, root('ITINERARYITEMS'), BINARY BASE64
)
exec dbo.USP_ITINERARY_INSERTITEMS @ID, @ITINERARYITEMS, @CHANGEAGENTID, 0;
end