USP_RESERVATION_UPDATEITEMQUANTITIES
Update item quantities on a reservation with removed and altered price types on an itinerary.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@CURRENTDATE | datetime | IN | |
@UPDATEPERTICKETBALANCE | bit | IN |
Definition
Copy
CREATE procedure dbo.USP_RESERVATION_UPDATEITEMQUANTITIES
(
@ID uniqueidentifier = null,
@CHANGEAGENTID uniqueidentifier = null,
@CURRENTDATE datetime = null,
@UPDATEPERTICKETBALANCE bit = 1
)
as
begin
set nocount on;
if @CURRENTDATE is null
set @CURRENTDATE = getdate()
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output
declare @SOI table
(
ID uniqueidentifier,
PRICETYPECODEID uniqueidentifier,
EVENTID uniqueidentifier,
PROGRAMID uniqueidentifier,
QUANTITY int
);
with CTE_DISTINCT as
(
select distinct
ITINERARYATTENDEE.QUANTITY as QUANTITY,
ITINERARYATTENDEE.PRICETYPECODEID as PRICETYPECODEID,
PROGRAMID,
STARTDATE,
ITINERARY.ID
from dbo.ITINERARY
inner join dbo.ITINERARYATTENDEE on
ITINERARY.ID = ITINERARYATTENDEE.ITINERARYID
inner join dbo.ITINERARYITEM on
ITINERARY.ID = ITINERARYITEM.ITINERARYID
inner join dbo.PROGRAM on
ITINERARYITEM.PROGRAMID = PROGRAM.ID
where
ITINERARY.RESERVATIONID = @ID and
ITEMTYPECODE = 1
)
insert into @SOI
(ID, PRICETYPECODEID, PROGRAMID, QUANTITY)
select
SALESORDERITEM.ID,
SALESORDERITEMTICKET.PRICETYPECODEID,
SALESORDERITEMTICKET.PROGRAMID,
sum(T.QUANTITY)
from dbo.SALESORDERITEM with (nolock)
inner join dbo.SALESORDERITEMTICKET with (nolock) on
SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
inner join CTE_DISTINCT T on
T.PROGRAMID = SALESORDERITEMTICKET.PROGRAMID
where
SALESORDERITEMTICKET.PRICETYPECODEID = T.PRICETYPECODEID and
SALESORDERID = @ID and
TYPECODE = 0
group by SALESORDERITEM.ID, SALESORDERITEMTICKET.PRICETYPECODEID, SALESORDERITEMTICKET.PROGRAMID, SALESORDERITEM.TOTAL;
with CTE_DISTINCT_EVENTS as
(
select distinct
ITINERARYATTENDEE.QUANTITY as QUANTITY,
ITINERARYATTENDEE.PRICETYPECODEID as PRICETYPECODEID,
EVENTID,
ITINERARY.ID
from dbo.ITINERARY
inner join dbo.ITINERARYATTENDEE on
ITINERARY.ID = ITINERARYATTENDEE.ITINERARYID
inner join dbo.ITINERARYITEM on
ITINERARY.ID = ITINERARYITEM.ITINERARYID
inner join dbo.EVENT on
ITINERARYITEM.EVENTID = EVENT.ID
where
ITINERARY.RESERVATIONID = @ID and
ITEMTYPECODE = 0
)
insert into @SOI
(ID, PRICETYPECODEID, EVENTID, QUANTITY)
select
SALESORDERITEM.ID,
SALESORDERITEMTICKET.PRICETYPECODEID,
SALESORDERITEMTICKET.EVENTID,
sum(E.QUANTITY)
from dbo.SALESORDERITEM with (nolock)
inner join dbo.SALESORDERITEMTICKET with (nolock) on
SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
inner join CTE_DISTINCT_EVENTS E on
E.EVENTID = SALESORDERITEMTICKET.EVENTID
where
SALESORDERITEMTICKET.PRICETYPECODEID = E.PRICETYPECODEID and
SALESORDERID = @ID and
TYPECODE = 0
group by SALESORDERITEM.ID, SALESORDERITEMTICKET.PRICETYPECODEID, SALESORDERITEMTICKET.EVENTID, SALESORDERITEM.TOTAL;
declare @contextCache varbinary(128);
declare @e int;
if @UPDATEPERTICKETBALANCE = 1
begin
update dbo.[SALESORDERITEM] set
QUANTITY = SOI.QUANTITY,
DATECHANGED = @CURRENTDATE,
CHANGEDBYID = @CHANGEAGENTID
from @SOI SOI
where
SALESORDERITEM.ID = SOI.ID and
SALESORDERITEM.QUANTITY <> SOI.QUANTITY;
-- cache current context information
set @contextCache = CONTEXT_INFO();
-- set CONTEXT_INFO to @CHANGEAGENTID
if not @CHANGEAGENTID is null
set CONTEXT_INFO @CHANGEAGENTID;
-- delete fees from non-existent price types
with DELETEFEES_CTE as
(
select SALESORDERITEMFEE.ID
from dbo.SALESORDERITEM with (nolock)
inner join dbo.SALESORDERITEMFEE with (nolock) on
SALESORDERITEM.ID = SALESORDERITEMFEE.SALESORDERITEMID
where
SALESORDERITEM.SALESORDERID = @ID and
(
SALESORDERITEM.QUANTITY = 0 or
SALESORDERITEM.ID not in (select ID from @SOI)
)
)
delete from dbo.[SALESORDERITEM] with (rowlock)
from DELETEFEES_CTE
where
DELETEFEES_CTE.ID = SALESORDERITEM.ID
-- Order level discounts will need to be recalculated so go ahead and delete
-- them to avoid FK_SALESORDERITEMORDERDISCOUNTDETAIL_SALESORDERITEMID
delete from dbo.SALESORDERITEMORDERDISCOUNTDETAIL with (rowlock)
where (select SALESORDERID from dbo.SALESORDERITEM where ID = SALESORDERITEMORDERDISCOUNTDETAIL.SALESORDERITEMORDERDISCOUNTID) = @ID;
if exists (select 1 from dbo.SALESORDER where STATUSCODE = 1 and ID = @ID) begin
delete from dbo.TICKET with (rowlock)
where
(
TICKET.SALESORDERITEMTICKETID in
(
select
SALESORDERITEMTICKET.ID
from
dbo.SALESORDERITEMTICKET
inner join dbo.SALESORDERITEM on SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
where
SALESORDERITEMTICKET.ID = TICKET.SALESORDERITEMTICKETID and SALESORDERITEM.SALESORDERID = @ID
and TICKET.ID not in
(
select
SALESORDERITEMTICKET.ID
from
dbo.SALESORDERITEMTICKET
inner join
dbo.TICKET on TICKET.SALESORDERITEMTICKETID = SALESORDERITEMTICKET.ID
inner join
@SOI SOI on SOI.ID = SALESORDERITEMTICKET.ID
)
)
)
or
TICKET.ID in
(
select
SALESORDERITEMTICKET.ID
from
dbo.SALESORDERITEMTICKET
inner join
dbo.TICKET on TICKET.SALESORDERITEMTICKETID = SALESORDERITEMTICKET.ID
inner join
dbo.SALESORDERITEM on SALESORDERITEM.ID = TICKET.SALESORDERITEMTICKETID
where
SALESORDERITEM.SALESORDERID = @ID
and SALESORDERITEM.QUANTITY = 0
)
end
-- delete non-existent price types
delete dbo.SALESORDERITEM with (rowlock)
where
TYPECODE = 0 and
SALESORDERITEM.SALESORDERID = @ID and
(
SALESORDERITEM.QUANTITY = 0 or
SALESORDERITEM.ID not in (select ID from @SOI)
)
select @e=@@error;
-- reset CONTEXT_INFO to previous value
if not @contextCache is null
set CONTEXT_INFO @contextCache;
if @e <> 0
return 2;
end
else
begin
-- Update flat rate tickets
update dbo.SALESORDERITEM set
SALESORDERITEM.QUANTITY = SOI.QUANTITY,
SALESORDERITEM.DATECHANGED = @CURRENTDATE,
SALESORDERITEM.CHANGEDBYID = @CHANGEAGENTID
from
@SOI SOI
where
SALESORDERITEM.ID = SOI.ID
and SALESORDERITEM.PRICINGSTRUCTURECODE = 1 -- Flat rate
and SALESORDERITEM.QUANTITY <> SOI.QUANTITY;
-- cache current context information
set @contextCache = CONTEXT_INFO();
-- set CONTEXT_INFO to @CHANGEAGENTID
if not @CHANGEAGENTID is null
set CONTEXT_INFO @CHANGEAGENTID;
-- delete fees from non-existent flat rate price types
with DELETEFEES_CTE as
(
select SALESORDERITEMFEE.ID
from dbo.SALESORDERITEM with (nolock)
inner join dbo.SALESORDERITEMFEE with (nolock) on
SALESORDERITEM.ID = SALESORDERITEMFEE.SALESORDERITEMID
where
SALESORDERITEM.SALESORDERID = @ID and
SALESORDERITEM.PRICINGSTRUCTURECODE = 1 and -- Flat rate
(
SALESORDERITEM.QUANTITY = 0 or
SALESORDERITEM.ID not in (select ID from @SOI)
)
)
delete from dbo.[SALESORDERITEM]
from DELETEFEES_CTE
where
DELETEFEES_CTE.ID = SALESORDERITEM.ID
-- delete non-existent flat rate price types
delete dbo.SALESORDERITEM with (rowlock)
where
TYPECODE = 0 and
SALESORDERITEM.SALESORDERID = @ID and
SALESORDERITEM.PRICINGSTRUCTURECODE = 1 and -- Flat rate
(
SALESORDERITEM.QUANTITY = 0 or
SALESORDERITEM.ID not in (select ID from @SOI)
)
select @e=@@error;
-- reset CONTEXT_INFO to previous value
if not @contextCache is null
set CONTEXT_INFO @contextCache;
if @e <> 0
return 2;
-- Update non-flat rate tickets
update dbo.[SALESORDERITEM] set
QUANTITY = SOI.QUANTITY,
PRICINGSTRUCTURECODE = 2, -- Override rate
FLATRATEPRICE = TOTAL,
DATECHANGED = @CURRENTDATE,
CHANGEDBYID = @CHANGEAGENTID
from
@SOI SOI
where
SALESORDERITEM.ID = SOI.ID
and SALESORDERITEM.PRICINGSTRUCTURECODE <> 1 -- Not flat rate
and SALESORDERITEM.QUANTITY <> SOI.QUANTITY;
-- This handles the scenario of reducing the quantity of a price type to zero
update dbo.SALESORDERITEM set
QUANTITY = 0,
PRICINGSTRUCTURECODE = 2, -- Override rate
FLATRATEPRICE = TOTAL,
DATECHANGED = @CURRENTDATE,
CHANGEDBYID = @CHANGEAGENTID
where
SALESORDERITEM.SALESORDERID = @ID
and SALESORDERITEM.TYPECODE = 0 -- Ticket
and SALESORDERITEM.ID not in (select ID from @SOI);
end
return 0;
end