USP_DATAFORMTEMPLATE_EDIT_GROUPSALESCHECKINVISITOR_2
The save procedure used by the edit dataform template "Group Sales Check In Visitor Edit Data Form".
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | IN | The input ID parameter indicating the ID of the record being edited. |
@CHANGEAGENTID | uniqueidentifier | IN | Input parameter indicating the ID of the change agent invoking the procedure. |
@ITINERARIES | xml | IN | |
@PRICETYPES | xml | IN | |
@RESOURCES | xml | IN | Resources |
@STAFFRESOURCES | xml | IN | Staffing resources |
@UPDATERATESCALE | bit | IN | Update group rate based on new number of visitors |
@IGNORECONFLICTS | bit | IN | Ignore conflicts when checking in |
@ADDITIONALPRICETYPES | xml | IN | |
@UPDATEPERTICKETBALANCE | bit | IN | Update order balance based on new number of visitors |
Definition
Copy
CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_GROUPSALESCHECKINVISITOR_2
(
@ID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier = null,
@ITINERARIES xml,
@PRICETYPES xml,
@RESOURCES xml,
@STAFFRESOURCES xml,
@UPDATERATESCALE bit,
@IGNORECONFLICTS bit,
@ADDITIONALPRICETYPES xml,
@UPDATEPERTICKETBALANCE bit
)
as
set nocount on;
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output
declare @CURRENTDATE datetime
set @CURRENTDATE = getdate()
declare @EMPTYGUID uniqueidentifier = '00000000-0000-0000-0000-000000000000';
set @UPDATERATESCALE = isnull(@UPDATERATESCALE, 1);
set @UPDATEPERTICKETBALANCE = isnull(@UPDATEPERTICKETBALANCE, 1);
declare @ARRIVALDATE date;
declare @PRICINGCODE tinyint;
select
@ARRIVALDATE = ARRIVALDATE,
@PRICINGCODE = PRICINGCODE
from dbo.RESERVATION
where ID = @ID
begin try
declare @VISITORCOUNT integer;
select @VISITORCOUNT = coalesce(sum(T.itineraries.value('(QUANTITY)[1]', 'integer')), 0)
from @ITINERARIES.nodes('/ITINERARIES/ITEM') T(itineraries)
if @VISITORCOUNT = 0
raiserror('BBERR_INVALIDVISITORCOUNT', 13, 1);
if (@IGNORECONFLICTS = 0)
begin
declare @MAXIMUMCAPACITY int;
select @MAXIMUMCAPACITY = MAXIMUMCAPACITY
from dbo.GROUPSALESDEFAULT
if (@MAXIMUMCAPACITY > 0)
begin
if (@VISITORCOUNT > dbo.UFN_GROUPSALESCAPACITY_CAPACITYREMAINING(@ARRIVALDATE, @ID))
raiserror('ERR_EXCEEDSCAPACITY', 13, 1);
end
end
if @IGNORECONFLICTS = 1 begin
update dbo.ITINERARYRESOURCE set
IGNORESQUANTITYFORCAPACITY = 1,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from @RESOURCES.nodes('/RESOURCES/ITEM') T(c)
where ID = T.c.value('(ID)[1]','uniqueidentifier')
update dbo.ITINERARYSTAFFRESOURCE set
IGNORESQUANTITYFORCAPACITY = 1,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from @STAFFRESOURCES.nodes('/STAFFRESOURCES/ITEM') T(c)
where ID = T.c.value('(ID)[1]','uniqueidentifier')
update dbo.ITINERARYITEMRESOURCE set
IGNORESQUANTITYFORCAPACITY = 1,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from @RESOURCES.nodes('/RESOURCES/ITEM') T(c)
where ID = T.c.value('(ID)[1]','uniqueidentifier')
update dbo.ITINERARYITEMSTAFFRESOURCE set
IGNORESQUANTITYFORCAPACITY = 1,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from @STAFFRESOURCES.nodes('/STAFFRESOURCES/ITEM') T(c)
where ID = T.c.value('(ID)[1]','uniqueidentifier')
end
-- Determine if the order has changed before updating the itinerary tables
declare @ORDER xml;
declare @ORDERHASCHANGED bit;
set @ORDER = (
select @ITINERARIES, @RESOURCES, @STAFFRESOURCES
for xml raw('ITEM'), type, elements, root('ORDERS'), binary base64
);
set @ORDERHASCHANGED = dbo.UFN_RESERVATION_HAVEQUANTITIESCHANGED(@ID, @ORDER);
if @ORDERHASCHANGED = 1 begin
exec dbo.USP_RESERVATION_GETATTENDEES_UPDATEFROMXML @ID, @ITINERARIES, @CHANGEAGENTID, @CURRENTDATE;
declare @ITINERARYRESOURCES table
(
ITINERARYID uniqueidentifier,
STARTDATETIME datetime,
ENDDATETIME datetime,
RESOURCES xml,
STAFFRESOURCES xml
);
insert into @ITINERARYRESOURCES(ITINERARYID)
select distinct
T.c.value('(ITINERARYID)[1]','uniqueidentifier') AS 'ITINERARYID'
from @RESOURCES.nodes('/RESOURCES/ITEM') T(c)
where
T.c.value('(ITINERARYITEMID)[1]','uniqueidentifier') = @EMPTYGUID or
T.c.value('(ITINERARYITEMID)[1]','uniqueidentifier') is null
insert into @ITINERARYRESOURCES (ITINERARYID)
select distinct
T.c.value('(ITINERARYID)[1]','uniqueidentifier') AS 'ITINERARYID'
from @STAFFRESOURCES.nodes('/STAFFRESOURCES/ITEM') T(c)
where
(
T.c.value('(ITINERARYITEMID)[1]','uniqueidentifier') = @EMPTYGUID or
T.c.value('(ITINERARYITEMID)[1]','uniqueidentifier') is null
) and
not exists
(
select 1 from @ITINERARYRESOURCES
where ITINERARYID = T.c.value('(ITINERARYID)[1]','uniqueidentifier')
)
update @ITINERARYRESOURCES set
[@ITINERARYRESOURCES].STARTDATETIME = ITINERARY.STARTDATETIME,
[@ITINERARYRESOURCES].ENDDATETIME = ITINERARY.ENDDATETIME
from dbo.ITINERARY with (nolock)
where
ITINERARY.ID = [@ITINERARYRESOURCES].ITINERARYID
update @ITINERARYRESOURCES set
RESOURCES = (
select
T.c.value('(ID)[1]','uniqueidentifier') AS 'ID',
T.c.value('(QUANTITYNEEDED)[1]','int') AS 'QUANTITYNEEDED',
T.c.value('(RESOURCEID)[1]','uniqueidentifier') AS 'RESOURCEID',
T.c.value('(ISPERTICKETITEM)[1]','bit') AS 'ISPERTICKETITEM',
T.c.value('(PRICE)[1]','money') AS 'PRICE',
T.c.value('(PRICINGSTRUCTURECODE)[1]','tinyint') AS 'PRICINGSTRUCTURECODE',
T.c.value('(PERTICKETQUANTITY)[1]','int') AS 'PERTICKETQUANTITY',
T.c.value('(PERTICKETDIVISOR)[1]','int') AS 'PERTICKETDIVISOR'
from @RESOURCES.nodes('/RESOURCES/ITEM') T(c)
where
T.c.value('(ITINERARYID)[1]','uniqueidentifier') = [@ITINERARYRESOURCES].ITINERARYID and
(
T.c.value('(ITINERARYITEMID)[1]','uniqueidentifier') = @EMPTYGUID or
T.c.value('(ITINERARYITEMID)[1]','uniqueidentifier') is null
) and
(
T.c.value('(QUANTITYNEEDED)[1]','int') > 0 or
T.c.value('(ISPERTICKETITEM)[1]','bit') = 1
)
for xml raw('ITEM'),type,elements,root('RESOURCES'),binary base64
),
STAFFRESOURCES = (
select
T.c.value('(ID)[1]','uniqueidentifier') AS 'ID',
T.c.value('(QUANTITYNEEDED)[1]','int') AS 'QUANTITYNEEDED',
T.c.value('(VOLUNTEERTYPEID)[1]','uniqueidentifier') AS 'VOLUNTEERTYPEID',
T.c.value('(JOBOCCURRENCEID)[1]','uniqueidentifier') AS 'JOBOCCURRENCEID',
T.c.value('(FILLEDBYCODE)[1]','tinyint') AS 'FILLEDBYCODE'
from @STAFFRESOURCES.nodes('/STAFFRESOURCES/ITEM') T(c)
where
T.c.value('(ITINERARYID)[1]','uniqueidentifier') = [@ITINERARYRESOURCES].ITINERARYID and
(
T.c.value('(ITINERARYITEMID)[1]','uniqueidentifier') = @EMPTYGUID or
T.c.value('(ITINERARYITEMID)[1]','uniqueidentifier') is null
)
for xml raw('ITEM'),type,elements,root('STAFFRESOURCES'),binary base64
)
declare @THISITINERARYID uniqueidentifier
declare @THISSTARTDATETIME datetime
declare @THISENDDATETIME datetime
declare @THISRESOURCES xml
declare @THISSTAFFRESOURCES xml
declare RESOURCES_CURSOR cursor local fast_forward for
select ITINERARYID, STARTDATETIME, ENDDATETIME, RESOURCES, STAFFRESOURCES
from @ITINERARYRESOURCES
open RESOURCES_CURSOR
fetch next from RESOURCES_CURSOR
into @THISITINERARYID, @THISSTARTDATETIME, @THISENDDATETIME, @THISRESOURCES, @THISSTAFFRESOURCES
while @@FETCH_STATUS = 0 begin
exec dbo.USP_ITINERARYRESOURCE_GETRESOURCES_UPDATEFROMXML @THISITINERARYID,@THISRESOURCES,@CHANGEAGENTID,@CURRENTDATE;
update dbo.ITINERARYSTAFFRESOURCE with (rowlock) set
QUANTITYNEEDED = T.c.value('(QUANTITYNEEDED)[1]','int'),
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from @THISSTAFFRESOURCES.nodes('/STAFFRESOURCES/ITEM') T(c)
where
ID = T.c.value('(ID)[1]','uniqueidentifier') and
T.c.value('(QUANTITYNEEDED)[1]','int') > 0
declare @contextCache varbinary(128);
declare @e int;
set @contextCache = CONTEXT_INFO();
/* set CONTEXT_INFO to @CHANGEAGENTID */
if not @CHANGEAGENTID is null
set CONTEXT_INFO @CHANGEAGENTID;
delete from dbo.ITINERARYSTAFFRESOURCE
where
exists
(
select 1 from @THISSTAFFRESOURCES.nodes('/STAFFRESOURCES/ITEM') T(c)
where
[ITINERARYSTAFFRESOURCE].ID = T.c.value('(ID)[1]','uniqueidentifier') and
T.c.value('(QUANTITYNEEDED)[1]','int') <= 0
)
select @e=@@error;
/* reset CONTEXT_INFO to previous value */
if not @contextCache is null
set CONTEXT_INFO @contextCache;
if @e <> 0
return 2;
update dbo.JOBOCCURRENCE set
VOLUNTEERSNEEDED = T.c.value('(QUANTITYNEEDED)[1]','int'),
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from @THISSTAFFRESOURCES.nodes('/STAFFRESOURCES/ITEM') T(c)
where
ID = T.c.value('(JOBOCCURRENCEID)[1]','uniqueidentifier')
exec dbo.USP_ITINERARY_CHECKPERTICKETRESOURCES @THISITINERARYID;
fetch next from RESOURCES_CURSOR
into @THISITINERARYID, @THISSTARTDATETIME, @THISENDDATETIME, @THISRESOURCES, @THISSTAFFRESOURCES
end
close RESOURCES_CURSOR
deallocate RESOURCES_CURSOR
declare @ITINERARYITEMRESOURCES table
(
ITINERARYID uniqueidentifier,
ITINERARYITEMID uniqueidentifier,
STARTDATETIME datetime,
ENDDATETIME datetime,
RESOURCES xml,
STAFFRESOURCES xml
);
insert into @ITINERARYITEMRESOURCES (ITINERARYID, ITINERARYITEMID)
select distinct
T.c.value('(ITINERARYID)[1]','uniqueidentifier') AS 'ITINERARYID',
T.c.value('(ITINERARYITEMID)[1]','uniqueidentifier') AS 'ITINERARYITEMID'
from @RESOURCES.nodes('/RESOURCES/ITEM') T(c)
where
T.c.value('(ITINERARYITEMID)[1]','uniqueidentifier') <> @EMPTYGUID
insert into @ITINERARYITEMRESOURCES (ITINERARYID, ITINERARYITEMID)
select distinct
T.c.value('(ITINERARYID)[1]','uniqueidentifier') AS 'ITINERARYID',
T.c.value('(ITINERARYITEMID)[1]','uniqueidentifier') AS 'ITINERARYITEMID'
from @STAFFRESOURCES.nodes('/STAFFRESOURCES/ITEM') T(c)
where
T.c.value('(ITINERARYITEMID)[1]','uniqueidentifier') <> @EMPTYGUID and
not exists
(
select 1 from @ITINERARYITEMRESOURCES
where ITINERARYITEMID = T.c.value('(ITINERARYITEMID)[1]','uniqueidentifier')
)
update @ITINERARYITEMRESOURCES set
[@ITINERARYITEMRESOURCES].STARTDATETIME = ITINERARYITEM.STARTDATETIME,
[@ITINERARYITEMRESOURCES].ENDDATETIME = ITINERARYITEM.ENDDATETIME
from dbo.ITINERARYITEM with (nolock)
where
ITINERARYITEM.ID = [@ITINERARYITEMRESOURCES].ITINERARYITEMID
update @ITINERARYITEMRESOURCES set
RESOURCES = (
select
T.c.value('(ID)[1]','uniqueidentifier') AS 'ID',
T.c.value('(QUANTITYNEEDED)[1]','int') AS 'QUANTITYNEEDED',
T.c.value('(RESOURCEID)[1]','uniqueidentifier') AS 'RESOURCEID',
T.c.value('(ISPERTICKETITEM)[1]','bit') AS 'ISPERTICKETITEM',
T.c.value('(PRICE)[1]','money') AS 'PRICE',
T.c.value('(PRICINGSTRUCTURECODE)[1]','tinyint') AS 'PRICINGSTRUCTURECODE',
T.c.value('(PERTICKETQUANTITY)[1]','int') AS 'PERTICKETQUANTITY',
T.c.value('(PERTICKETDIVISOR)[1]','int') AS 'PERTICKETDIVISOR'
from @RESOURCES.nodes('/RESOURCES/ITEM') T(c)
where
T.c.value('(ITINERARYITEMID)[1]','uniqueidentifier') = [@ITINERARYITEMRESOURCES].ITINERARYITEMID and
(
T.c.value('(QUANTITYNEEDED)[1]','int') > 0 or
T.c.value('(ISPERTICKETITEM)[1]','bit') = 1
)
for xml raw('ITEM'),type,elements,root('RESOURCES'),binary base64
),
STAFFRESOURCES = (
select
T.c.value('(ID)[1]','uniqueidentifier') AS 'ID',
T.c.value('(QUANTITYNEEDED)[1]','int') AS 'QUANTITYNEEDED',
T.c.value('(VOLUNTEERTYPEID)[1]','uniqueidentifier') AS 'VOLUNTEERTYPEID',
case
when T.c.value('(JOBID)[1]','uniqueidentifier') = @EMPTYGUID then null
else T.c.value('(JOBID)[1]','uniqueidentifier')
end as 'JOBID',
T.c.value('(FILLEDBYCODE)[1]','tinyint') AS 'FILLEDBYCODE',
T.c.value('(PRICE)[1]','money') AS 'PRICE',
T.c.value('(PRICINGSTRUCTURECODE)[1]','tinyint') AS 'PRICINGSTRUCTURECODE'
from @STAFFRESOURCES.nodes('/STAFFRESOURCES/ITEM') T(c)
where
T.c.value('(ITINERARYITEMID)[1]','uniqueidentifier') = [@ITINERARYITEMRESOURCES].ITINERARYITEMID and
T.c.value('(QUANTITYNEEDED)[1]','int') > 0
for xml raw('ITEM'),type,elements,root('STAFFRESOURCES'),binary base64
)
declare @THISITINERARYITEMID uniqueidentifier
declare ITEMRESOURCES_CURSOR cursor local fast_forward for
select ITINERARYID, ITINERARYITEMID, STARTDATETIME, ENDDATETIME, RESOURCES, STAFFRESOURCES
from @ITINERARYITEMRESOURCES
open ITEMRESOURCES_CURSOR
fetch next from ITEMRESOURCES_CURSOR
into @THISITINERARYID, @THISITINERARYITEMID, @THISSTARTDATETIME, @THISENDDATETIME, @THISRESOURCES, @THISSTAFFRESOURCES
while @@FETCH_STATUS = 0 begin
exec dbo.USP_ITINERARYITEMRESOURCE_GETRESOURCES_UPDATEFROMXML @THISITINERARYITEMID,@THISRESOURCES,@CHANGEAGENTID,@CURRENTDATE;
exec dbo.USP_ITINERARYITEM_GETSTAFFRESOURCES_UPDATEFROMXML @THISITINERARYITEMID, @THISSTAFFRESOURCES, @CHANGEAGENTID, @CURRENTDATE;
exec dbo.USP_ITINERARY_CHECKPERTICKETRESOURCES @THISITINERARYID;
fetch next from ITEMRESOURCES_CURSOR
into @THISITINERARYID, @THISITINERARYITEMID, @THISSTARTDATETIME, @THISENDDATETIME, @THISRESOURCES, @THISSTAFFRESOURCES
end
close ITEMRESOURCES_CURSOR
deallocate ITEMRESOURCES_CURSOR
-- Conflict Checking must be done after all resources are updated to ensure
-- there are no false positives for old conflicts
if @IGNORECONFLICTS = 0
begin
declare @CONFLICTRESOURCES table
(
ITINERARYID uniqueidentifier,
ITINERARYITEMID uniqueidentifier,
STARTTIME datetime,
ENDTIME datetime,
RESOURCES xml,
STAFFRESOURCES xml
)
insert into @CONFLICTRESOURCES
select
ITINERARY.ID,
null,
ITINERARY.STARTDATETIME,
ITINERARY.ENDDATETIME,
dbo.UFN_ITINERARYRESOURCE_GETRESOURCES_TOITEMLISTXML(ITINERARY.ID),
dbo.UFN_ITINERARY_GETSTAFFRESOURCES_TOITEMLISTXML(ITINERARY.ID)
from dbo.ITINERARY
where
ITINERARY.RESERVATIONID = @ID and
(
exists
(select 1 from dbo.ITINERARYRESOURCE where ITINERARYID = ITINERARY.ID)
or
exists
(select 1 from dbo.ITINERARYSTAFFRESOURCE where ITINERARYID = ITINERARY.ID)
)
union all
select
ITINERARY.ID,
ITINERARYITEM.ID,
ITINERARYITEM.STARTDATETIME,
ITINERARYITEM.ENDDATETIME,
dbo.UFN_ITINERARYITEMRESOURCE_GETRESOURCES_TOITEMLISTXML(ITINERARYITEM.ID),
dbo.UFN_ITINERARYITEM_GETSTAFFRESOURCES_TOITEMLISTXML(ITINERARYITEM.ID)
from dbo.ITINERARYITEM
inner join dbo.ITINERARY on ITINERARY.ID = ITINERARYITEM.ITINERARYID
where
ITINERARY.RESERVATIONID = @ID and
(
exists
(select 1 from dbo.ITINERARYITEMRESOURCE where ITINERARYITEMID = ITINERARYITEM.ID)
or
exists
(select 1 from dbo.ITINERARYITEMSTAFFRESOURCE where ITINERARYITEMID = ITINERARYITEM.ID)
)
if exists
(
select top 1 1 from @CONFLICTRESOURCES
where
dbo.UFN_CONFLICTCHECK_CONFLICTSEXIST
(
STARTTIME, ENDTIME,
null, RESOURCES, null,
null, ITINERARYID, ITINERARYITEMID,
0,
1, -- Ignore Itinerary
1, -- Ignore Itinerary Item
0
) = 1
)
begin
raiserror('BBERR_RESOURCECONFLICTSEXIST', 13, 1);
end
if exists
(
select top 1 1 from @CONFLICTRESOURCES
where
dbo.UFN_CONFLICTCHECK_CONFLICTSEXIST
(
STARTTIME, ENDTIME,
null, null, STAFFRESOURCES,
null, ITINERARYID, ITINERARYITEMID,
0,
1, -- Ignore Itinerary
1, -- Ignore Itinerary Item
0
) = 1
)
begin
raiserror('BBERR_STAFFRESOURCECONFLICTSEXIST', 13, 1);
end
end
exec dbo.USP_RESERVATION_UPDATEATTENDEES @ID, @IGNORECONFLICTS, @CHANGEAGENTID, @CURRENTDATE, @UPDATEPERTICKETBALANCE, 0;
declare @CALCULATEFEESDISCOUNTSANDTAXES bit = 0;
if ((@PRICINGCODE = 1 and @UPDATERATESCALE = 1) or @UPDATEPERTICKETBALANCE = 1) and @ORDERHASCHANGED = 1 begin
set @CALCULATEFEESDISCOUNTSANDTAXES = 1;
end
-- USP_RESERVATION_UPDATEFLATRATE also calls resource sync functions
exec dbo.USP_RESERVATION_UPDATEFLATRATE @ID, @CHANGEAGENTID, @CURRENTDATE, @UPDATERATESCALE, @CALCULATEFEESDISCOUNTSANDTAXES;
end
exec dbo.USP_RESERVATION_COMPLETEORDER_IMPLEMENTATION @ID, @CHANGEAGENTID;
end try
begin catch
exec dbo.USP_RAISE_ERROR
return 1
end catch
return 0;