USP_DATAFORMTEMPLATE_EDIT_ITINERARYGROUP
The save procedure used by the edit dataform template "Itinerary Group 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. |
@LEADERID | uniqueidentifier | IN | Leader |
@NAME | nvarchar(154) | IN | Name |
@ATTENDEES | xml | IN | Visitors |
@EXCEEDCAPACITY | bit | IN | Exceed capacity available |
@GROUPSALESGROUPTYPECODEID | uniqueidentifier | IN | Group type |
@IGNORECONFLICTS | bit | IN | Ignore conflicts when saving |
Definition
Copy
CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_ITINERARYGROUP (
@ID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier = null,
@LEADERID uniqueidentifier,
@NAME nvarchar(154),
@ATTENDEES xml,
@EXCEEDCAPACITY bit,
@GROUPSALESGROUPTYPECODEID uniqueidentifier,
@IGNORECONFLICTS bit
)
as
set nocount on;
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output
declare @CURRENTDATE datetime
set @CURRENTDATE = getdate()
declare @NEWATTENDEECOUNT decimal;
select
@NEWATTENDEECOUNT = isnull(sum(QUANTITY),0)
from dbo.UFN_ITINERARY_GETATTENDEES_FROMITEMLISTXML(@ATTENDEES);
declare @OLDATTENDEECOUNT int;
select
@OLDATTENDEECOUNT = isnull(sum(ITINERARYATTENDEE.QUANTITY),0)
from dbo.ITINERARYATTENDEE
where ITINERARYATTENDEE.ITINERARYID = @ID;
begin try
declare @START datetime;
declare @END datetime;
declare @RESERVATIONID uniqueidentifier;
declare @CURRENTGROUPSALESGROUPTYPECODEID uniqueidentifier = null;
declare @STATUSCODE tinyint;
select
@START = isnull(ITINERARY.STARTDATETIME, RESERVATION.ARRIVALDATE),
@END = isnull(ITINERARY.ENDDATETIME, RESERVATION.ARRIVALDATE),
@RESERVATIONID = RESERVATION.ID,
@CURRENTGROUPSALESGROUPTYPECODEID = ITINERARY.GROUPSALESGROUPTYPECODEID,
@STATUSCODE = SALESORDER.STATUSCODE
from dbo.RESERVATION
inner join dbo.ITINERARY on
RESERVATION.ID = ITINERARY.RESERVATIONID
inner join dbo.SALESORDER on
SALESORDER.ID = RESERVATION.ID
where ITINERARY.ID = @ID;
update dbo.ITINERARY set
NAME = @NAME,
LEADERID = @LEADERID,
GROUPSALESGROUPTYPECODEID = @GROUPSALESGROUPTYPECODEID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where ID = @ID;
if @STATUSCODE = 5
raiserror('BBERR_INVALIDSTATUS', 13, 1);
if (@GROUPSALESGROUPTYPECODEID is not null) and (@CURRENTGROUPSALESGROUPTYPECODEID is null or (@CURRENTGROUPSALESGROUPTYPECODEID != @GROUPSALESGROUPTYPECODEID))
or exists
(
select
PRICETYPECODEID,
QUANTITY
from (
select distinct
PRICETYPECODEID as PRICETYPECODEID,
QUANTITY as QUANTITY
from
dbo.ITINERARY
inner join
dbo.ITINERARYATTENDEE on ITINERARY.ID = ITINERARYATTENDEE.ITINERARYID
where
ITINERARY.ID = @ID
union all
select distinct
T.attendees.value('(PRICETYPECODEID)[1]', 'uniqueidentifier') as PRICETYPECODEID,
T.attendees.value('(QUANTITY)[1]', 'integer') as QUANTITY
from
@ATTENDEES.nodes('/ATTENDEES/ITEM') T(attendees)
where
T.attendees.value('(QUANTITY)[1]', 'integer') > 0
) [ITINERARIES]
group by
PRICETYPECODEID,
QUANTITY
having
count(*) = 1
)
begin
-- Validate that the attendee count is not greater than the capacity available
if @EXCEEDCAPACITY = 0
begin
declare @MAXIMUMCAPACITY int;
select @MAXIMUMCAPACITY = MAXIMUMCAPACITY
from dbo.GROUPSALESDEFAULT
if @MAXIMUMCAPACITY > 0
begin
if @NEWATTENDEECOUNT > dbo.UFN_GROUPSALESCAPACITY_MINCAPACITYREMAININGFORDATES(@START, @END, @ID, 1)
raiserror('ERR_EXCEEDSCAPACITY', 13, 1);
end
end
declare @ITINERARYITEMSEXIST bit = 0;
if exists
(
select 1 from dbo.ITINERARYITEM
where
ITINERARYITEM.ITINERARYID = @ID and
ITINERARYITEM.ITEMTYPECODE <> 3
)
set @ITINERARYITEMSEXIST = 1;
-- Validate the the itinerary does not already have a group type
if @CURRENTGROUPSALESGROUPTYPECODEID is not null and
@CURRENTGROUPSALESGROUPTYPECODEID != @GROUPSALESGROUPTYPECODEID
raiserror('ERR_ITINERARY_ALREADYASSOCIATEDWITHGROUPTYPE', 13, 1);
if @NAME = '' and @LEADERID is not null
set @NAME = dbo.UFN_CONSTITUENT_BUILDNAME(@LEADERID);
exec dbo.USP_ITINERARY_GETATTENDEES_UPDATEFROMXML @ID, @ATTENDEES, @CHANGEAGENTID, @CURRENTDATE;
if @CURRENTGROUPSALESGROUPTYPECODEID is null and
@GROUPSALESGROUPTYPECODEID is not null
begin
exec dbo.USP_ITINERARY_LOADREQUIREDRESOURCESBYGROUPTYPE @ID, @CHANGEAGENTID;
end
if @NEWATTENDEECOUNT <> @OLDATTENDEECOUNT
begin
update dbo.ITINERARYSTAFFRESOURCE
set QUANTITYNEEDED = ceiling(@NEWATTENDEECOUNT / VOLUNTEERTYPE.CAPACITYPERRESOURCE),
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from dbo.ITINERARYSTAFFRESOURCE
inner join dbo.VOLUNTEERTYPE on
ITINERARYSTAFFRESOURCE.VOLUNTEERTYPEID = VOLUNTEERTYPE.ID
where
ITINERARYSTAFFRESOURCE.ITINERARYID = @ID and
VOLUNTEERTYPE.CAPACITYPERRESOURCE > 0 and
ITINERARYSTAFFRESOURCE.QUANTITYNEEDED <> ceiling(@NEWATTENDEECOUNT / VOLUNTEERTYPE.CAPACITYPERRESOURCE);
if @ITINERARYITEMSEXIST = 1
update dbo.ITINERARYITEMSTAFFRESOURCE set
QUANTITYNEEDED = ceiling(@NEWATTENDEECOUNT / VOLUNTEERTYPE.CAPACITYPERRESOURCE),
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from dbo.ITINERARYITEMSTAFFRESOURCE
inner join dbo.VOLUNTEERTYPE on
ITINERARYITEMSTAFFRESOURCE.VOLUNTEERTYPEID = VOLUNTEERTYPE.ID
inner join dbo.ITINERARYITEM on
ITINERARYITEMSTAFFRESOURCE.ITINERARYITEMID = ITINERARYITEM.ID
where
ITINERARYITEM.ITINERARYID = @ID and
VOLUNTEERTYPE.CAPACITYPERRESOURCE > 0 and
ITINERARYITEMSTAFFRESOURCE.QUANTITYNEEDED <> ceiling(@NEWATTENDEECOUNT / VOLUNTEERTYPE.CAPACITYPERRESOURCE);
/* Since the number of attendees has changed we need to make sure to update the
resource sales order items. This has been incorporated into Update Flat Rate */
end
exec dbo.USP_ITINERARY_UPDATEITEMQUANTITIES @ID, @CHANGEAGENTID;
exec dbo.USP_RESERVATION_UPDATEFLATRATE @RESERVATIONID, @CHANGEAGENTID, @CURRENTDATE;
--Check for conflicts, happens after loading group type so we just need to check in one place
if @ITINERARYITEMSEXIST = 1
begin
exec dbo.USP_ITINERARY_CHECKPERTICKETRESOURCES @ID;
if @IGNORECONFLICTS = 0
begin
/* Get the resources from the itinerary AND the group type */
declare @RESOURCES xml;
set @RESOURCES = dbo.UFN_ITINERARYRESOURCE_GETRESOURCES_TOITEMLISTXML(@ID);
/* Get the staff resources from the itinerary AND the group type */
declare @STAFFRESOURCES xml;
set @STAFFRESOURCES = dbo.UFN_ITINERARY_GETSTAFFRESOURCES_TOITEMLISTXML(@ID);
/* Check for conflicts with the combined resources */
if dbo.UFN_CONFLICTCHECK_CONFLICTSEXIST
(
@START,@END,
null, @RESOURCES, @STAFFRESOURCES,
null, @ID, null,
0,
1, -- Ignore Itinerary Resources
0,
0
) = 1
begin
raiserror('BBERR_CONFLICTSEXIST', 13, 1);
return 1;
end
declare @CONFLICTRESOURCES table
(
ITINERARYITEMID uniqueidentifier,
STARTTIME datetime,
ENDTIME datetime,
RESOURCES xml,
STAFFRESOURCES xml
)
insert into @CONFLICTRESOURCES
select
ITINERARYITEM.ID,
ITINERARYITEM.STARTDATETIME,
ITINERARYITEM.ENDDATETIME,
dbo.UFN_ITINERARYITEMRESOURCE_GETRESOURCES_TOITEMLISTXML(ITINERARYITEM.ID),
dbo.UFN_ITINERARYITEM_GETSTAFFRESOURCES_TOITEMLISTXML(ITINERARYITEM.ID)
from dbo.ITINERARYITEM
where
ITINERARYID = @ID and
(
exists
(
select 1 from dbo.ITINERARYITEMRESOURCE
inner join dbo.RESOURCE on RESOURCE.ID = ITINERARYITEMRESOURCE.RESOURCEID
where
ITINERARYITEMID = ITINERARYITEM.ID and
RESOURCE.ISPERTICKETITEM = 1
)
or
exists
(
select 1 from dbo.ITINERARYITEMSTAFFRESOURCE
inner join dbo.VOLUNTEERTYPE on VOLUNTEERTYPE.ID = ITINERARYITEMSTAFFRESOURCE.VOLUNTEERTYPEID
where
ITINERARYITEMID = ITINERARYITEM.ID and
VOLUNTEERTYPE.CAPACITYPERRESOURCE > 0
)
)
if exists
(
select top 1 1 from @CONFLICTRESOURCES
where
dbo.UFN_CONFLICTCHECK_CONFLICTSEXIST
(
STARTTIME,ENDTIME,
null, RESOURCES, STAFFRESOURCES,
null, @ID, ITINERARYITEMID,
0,
1, -- Ignore Itinerary
1, -- Ignore Itinerary Item
0
) = 1
)
begin
raiserror('BBERR_ITINERARYITEMCONFLICTSEXIST', 13, 1);
return 1;
end
end
end
if @STATUSCODE = 1
exec dbo.USP_RESERVATION_ADJUSTCOMPLETEDORDER @RESERVATIONID, @CHANGEAGENTID, @CURRENTDATE
end
end try
begin catch
exec dbo.USP_RAISE_ERROR
return 1
end catch
return 0;