USP_ITINERARYITEM_RESOURCES_SALESORDERSYNC
Updates the sales order to reflect changes
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ITINERARYITEMID | uniqueidentifier | IN | |
@SALESORDERID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.USP_ITINERARYITEM_RESOURCES_SALESORDERSYNC
(
@ITINERARYITEMID uniqueidentifier,
@SALESORDERID uniqueidentifier = null,
@CHANGEAGENTID uniqueidentifier = null
)
as
begin
set nocount on;
if @SALESORDERID is null
select @SALESORDERID = ITINERARY.RESERVATIONID
from dbo.ITINERARY
inner join dbo.ITINERARYITEM on ITINERARY.ID = ITINERARYITEM.ITINERARYID
where ITINERARYITEM.ID = @ITINERARYITEMID
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
declare @CURRENTDATE as datetime
set @CURRENTDATE = getdate()
declare @ATTENDEECOUNT int
set @ATTENDEECOUNT = coalesce
(
(
select sum(QUANTITY) from dbo.ITINERARYATTENDEE
inner join dbo.ITINERARYITEM on ITINERARYATTENDEE.ITINERARYID = ITINERARYITEM.ITINERARYID
where ITINERARYITEM.ID = @ITINERARYITEMID
),0
)
declare @STARTDATETIME datetime;
declare @ENDDATETIME datetime;
select
@STARTDATETIME = STARTDATETIME,
@ENDDATETIME = ENDDATETIME
from dbo.ITINERARYITEM
where ID = @ITINERARYITEMID
declare @DURATION as decimal(20,4)
if @ENDDATETIME is null or @STARTDATETIME is null
set @DURATION = 0
else
set @DURATION = datediff(s, @STARTDATETIME, @ENDDATETIME) / (3600.0)
-- We only need to worry about updates and deletes here as the database integrity requires that there
-- already are no sales order items which are no longer needed.
declare @ORDERITEMS table
(
ID uniqueidentifier,
ITINERARYITEMRESOURCEID uniqueidentifier,
DESCRIPTION nvarchar(255),
QUANTITY decimal(20,4),
PRICE money,
PRICINGSTRUCTURECODE tinyint
);
insert into @ORDERITEMS
select
SALESORDERITEM.ID as ID,
ITINERARYITEMRESOURCE.ID as ITINERARYITEMRESOURCEID,
ITINERARYITEM.NAME + ' - ' + RESOURCE.NAME as DESCRIPTION,
case RESOURCE.ISPERTICKETITEM
when 0 then
case ITINERARYITEMRESOURCE.PRICINGSTRUCTURECODE
when 2 then ITINERARYITEMRESOURCE.QUANTITYNEEDED * @DURATION
else ITINERARYITEMRESOURCE.QUANTITYNEEDED
end
else
dbo.UFN_RESOURCE_CALCULATEPERTICKETQUANTITY_2
(
(@ATTENDEECOUNT * ITINERARYITEMRESOURCE.PERTICKETQUANTITY),
ITINERARYITEMRESOURCE.PERTICKETDIVISOR
) *
case ITINERARYITEMRESOURCE.PRICINGSTRUCTURECODE
when 2 then @DURATION
else 1
end
end as QUANTITY,
case ITINERARYITEMRESOURCE.PRICINGSTRUCTURECODE
when 0 then 0
else ITINERARYITEMRESOURCE.PRICE
end as PRICE,
case RESERVATION.PRICINGCODE
when 1 then
case coalesce(RESERVATIONRATESCALE.INCLUDEALLRESOURCES, 0)
when 1 then 1
else
case when RESERVATIONRATESCALERESOURCE.ID is null
then 0
else 1
end
end
else
case coalesce(SALESORDERITEM.PRICINGSTRUCTURECODE,0)
when 2 then 2
else 0
end
end as PRICINGSTRUCTURECODE
from dbo.ITINERARYITEMRESOURCE
inner join dbo.RESOURCE on ITINERARYITEMRESOURCE.RESOURCEID = RESOURCE.ID
inner join dbo.ITINERARYITEM on ITINERARYITEMRESOURCE.ITINERARYITEMID = ITINERARYITEM.ID
inner join dbo.ITINERARY on ITINERARYITEM.ITINERARYID = ITINERARY.ID
inner join dbo.RESERVATION on ITINERARY.RESERVATIONID = RESERVATION.ID
left join dbo.SALESORDERITEMITINERARYITEMRESOURCE on
ITINERARYITEMRESOURCE.ID = SALESORDERITEMITINERARYITEMRESOURCE.ITINERARYITEMRESOURCEID
left join dbo.SALESORDERITEM on
SALESORDERITEMITINERARYITEMRESOURCE.SALESORDERITEMID = SALESORDERITEM.ID
left join dbo.RESERVATIONRATESCALE on
RESERVATION.ID = RESERVATIONRATESCALE.ID
left join dbo.RESERVATIONRATESCALERESOURCE on
RESERVATIONRATESCALE.ID = RESERVATIONRATESCALERESOURCE.RESERVATIONRATESCALEID and
RESOURCE.ID = RESERVATIONRATESCALERESOURCE.RESOURCEID
where
ITINERARYITEMRESOURCE.ITINERARYITEMID = @ITINERARYITEMID and
ITINERARYITEM.INVALIDREASONCODE = 0
update dbo.SALESORDERITEM set
SALESORDERITEM.DESCRIPTION = UPDATEVALUES.DESCRIPTION,
SALESORDERITEM.QUANTITY = UPDATEVALUES.QUANTITY,
SALESORDERITEM.PRICE = UPDATEVALUES.PRICE,
SALESORDERITEM.PRICINGSTRUCTURECODE = UPDATEVALUES.PRICINGSTRUCTURECODE,
SALESORDERITEM.CHANGEDBYID = @CHANGEAGENTID,
SALESORDERITEM.DATECHANGED = @CURRENTDATE
from @ORDERITEMS as UPDATEVALUES
where
SALESORDERITEM.ID = UPDATEVALUES.ID and
(
SALESORDERITEM.DESCRIPTION <> UPDATEVALUES.DESCRIPTION or
SALESORDERITEM.QUANTITY <> UPDATEVALUES.QUANTITY or
SALESORDERITEM.PRICE <> UPDATEVALUES.PRICE or
SALESORDERITEM.PRICINGSTRUCTURECODE <> UPDATEVALUES.PRICINGSTRUCTURECODE
)
delete from @ORDERITEMS
where ID is not null
update @ORDERITEMS set ID = newid()
insert into dbo.SALESORDERITEM
(
ID,
SALESORDERID,
TYPECODE,
DESCRIPTION,
QUANTITY,
PRICE,
PRICINGSTRUCTURECODE,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED
)
select
ORDERITEMS.ID,
@SALESORDERID,
9, --Itinerary Item Supply/Equipment Resource
ORDERITEMS.DESCRIPTION,
ORDERITEMS.QUANTITY,
ORDERITEMS.PRICE,
ORDERITEMS.PRICINGSTRUCTURECODE,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE
from @ORDERITEMS ORDERITEMS
insert into dbo.SALESORDERITEMITINERARYITEMRESOURCE
(
SALESORDERITEMID,
ITINERARYITEMRESOURCEID,
RESOURCENAME,
RESOURCECATEGORYNAME,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED
)
select
ORDERITEMS.ID,
ORDERITEMS.ITINERARYITEMRESOURCEID,
coalesce((
select [RESOURCE].[NAME]
from dbo.[ITINERARYITEMRESOURCE]
inner join dbo.[RESOURCE]
on [ITINERARYITEMRESOURCE].[RESOURCEID] = [RESOURCE].[ID]
where [ITINERARYITEMRESOURCE].[ID] = ORDERITEMS.ITINERARYITEMRESOURCEID
),''),
coalesce((
select [RESOURCECATEGORYCODE].[DESCRIPTION]
from dbo.[ITINERARYITEMRESOURCE]
inner join dbo.[RESOURCE]
on [ITINERARYITEMRESOURCE].[RESOURCEID] = [RESOURCE].[ID]
inner join dbo.[RESOURCECATEGORYCODE]
on [RESOURCE].[RESOURCECATEGORYCODEID] = [RESOURCECATEGORYCODE].[ID]
where [ITINERARYITEMRESOURCE].[ID] = ORDERITEMS.ITINERARYITEMRESOURCEID
),''),
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE
from @ORDERITEMS ORDERITEMS
end