USP_SALESORDER_CLEAR
Removes items associated with a sales order.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@CURRENTDATE | datetime | IN |
Definition
Copy
CREATE procedure dbo.USP_SALESORDER_CLEAR
(
@ID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier,
@CURRENTDATE datetime = null
)
as
set nocount on;
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
if @CURRENTDATE is null
set @CURRENTDATE = getdate();
begin try
exec dbo.USP_SALESORDER_ISCOMPLETE_RAISERROR @ID, @EXCLUDEGROUPSALES = 1;
declare @ORDERSTATUS tinyint;
declare @SALESMETHODTYPECODE tinyint;
declare @REVENUEID uniqueidentifier;
select
@ORDERSTATUS = STATUSCODE,
@SALESMETHODTYPECODE = SALESMETHODTYPECODE,
@REVENUEID = REVENUEID
from
dbo.SALESORDER
where
ID = @ID;
exec dbo.USP_SALESORDERTAXEXEMPTINFO_DELETEBYID_WITHCHANGEAGENTID @ID, @CHANGEAGENTID;
declare @e int;
declare @contextCache varbinary(128);
set @contextCache = CONTEXT_INFO();
if not @CHANGEAGENTID is null
set CONTEXT_INFO @CHANGEAGENTID;
-- Update quantity for merchandise items
with MERCHANDISEITEMS_CTE as (
select
MERCHANDISEPRODUCTINSTANCEID,
QUANTITY
from dbo.SALESORDERITEMMERCHANDISE SOIM
inner join dbo.SALESORDERITEM SOI on SOIM.ID = SOI.ID
where SOI.SALESORDERID = @ID
)
update dbo.MERCHANDISEPRODUCTINSTANCE set
ONHANDQUANTITY = ONHANDQUANTITY + MI.QUANTITY,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from MERCHANDISEITEMS_CTE MI
where ID = MI.MERCHANDISEPRODUCTINSTANCEID
--Remove SalesOrderNotes (before items, since notes can have an item reference)
delete from dbo.SALESORDERNOTE
where SALESORDERID = @ID
-- Remove taxes before removing fees and tickets
delete from dbo.SALESORDERITEMTAX
where TAXITEMID in
(select ID from dbo.SALESORDERITEM where SALESORDERID = @ID)
-- Fees need to be deleted before the item they are linked to
delete from dbo.SALESORDERITEM
where SALESORDERID = @ID and TYPECODE = 3;
-- Fees are no longer considered deleted
delete from dbo.SALESORDERFEEDELETED
where SALESORDERID = @ID;
-- Drop the discounts
delete from dbo.SALESORDERMANUALDISCOUNT
where SALESORDERID = @ID;
delete from dbo.SALESORDERADJUSTABLEDISCOUNT
where SALESORDERID = @ID;
delete from dbo.SALESORDERMEMBERSHIPPROMO
where SALESORDERID = @ID;
--Drop the discount limits
delete from dbo.[SALESORDERDISCOUNTLIMITOVERRIDE]
where [SALESORDERID] = @ID;
-- Clear any sponsorship opportunity reservations.
declare @SPONSORSHIPOPPORTUNITYID uniqueidentifier
declare sponsorships_cursor cursor LOCAL FAST_FORWARD for
select SPONSORSHIPOPPORTUNITYID
from dbo.SALESORDERITEMSPONSORSHIP SOIS
inner join dbo.SALESORDERITEM SOI on SOIS.ID = SOI.ID
where SOI.SALESORDERID = @ID
OPEN sponsorships_cursor
FETCH NEXT FROM sponsorships_cursor
INTO @SPONSORSHIPOPPORTUNITYID
while @@FETCH_STATUS = 0
begin
exec dbo.USP_SPONSORSHIPOPPORTUNITY_UNLOCK @SPONSORSHIPOPPORTUNITYID, 0
FETCH NEXT FROM sponsorships_cursor
INTO @SPONSORSHIPOPPORTUNITYID
end
close sponsorships_cursor
deallocate sponsorships_cursor
-- Registrants
declare @REGISTRANTS table (
ID uniqueidentifier,
GUESTOFREGISTRANTID uniqueidentifier
);
declare @HASPREREGISTEREDTICKETS bit = 0;
insert into @REGISTRANTS
(
ID,
GUESTOFREGISTRANTID
)
select
REGISTRANT.ID,
REGISTRANT.GUESTOFREGISTRANTID
from
dbo.SALESORDERITEM
inner join
dbo.SALESORDERITEMTICKETREGISTRANT on SALESORDERITEMTICKETREGISTRANT.SALESORDERITEMTICKETID = SALESORDERITEM.ID
inner join
dbo.REGISTRANT on REGISTRANT.ID = SALESORDERITEMTICKETREGISTRANT.REGISTRANTID
where
SALESORDERITEM.SALESORDERID = @ID;
if @@rowcount > 0 begin
set @HASPREREGISTEREDTICKETS = 1;
insert into @REGISTRANTS
(
ID,
GUESTOFREGISTRANTID
)
select
GUESTOFREGISTRANTID,
null
from
@REGISTRANTS
where
GUESTOFREGISTRANTID not in (select ID from @REGISTRANTS);
end
delete from dbo.SALESORDERITEM
where SALESORDERID = @ID;
if @HASPREREGISTEREDTICKETS = 1 begin
-- Delete guests
delete from dbo.REGISTRANT
where ID in (select ID from @REGISTRANTS where GUESTOFREGISTRANTID is not null);
-- Delete hosts if they don't have anymore guests and don't have their own ticket
delete from dbo.REGISTRANT
where ID in (
select REGISTRANTSTODELETE.ID from @REGISTRANTS as REGISTRANTSTODELETE
left outer join dbo.REGISTRANT on REGISTRANT.GUESTOFREGISTRANTID = REGISTRANTSTODELETE.ID
left outer join dbo.SALESORDERITEMTICKETREGISTRANT on SALESORDERITEMTICKETREGISTRANT.REGISTRANTID = REGISTRANTSTODELETE.ID
where REGISTRANT.ID is null and SALESORDERITEMTICKETREGISTRANT.ID is null
);
-- Update hosts who still have guests and don't have a ticket and delete their preferences
update dbo.REGISTRANT set
WILLNOTATTEND = 1,
ATTENDED = 0,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where ID in (
select REGISTRANTSTODELETE.ID from @REGISTRANTS as REGISTRANTSTODELETE
left outer join dbo.SALESORDERITEMTICKETREGISTRANT on SALESORDERITEMTICKETREGISTRANT.REGISTRANTID = REGISTRANTSTODELETE.ID
where SALESORDERITEMTICKETREGISTRANT.ID is null
)
and WILLNOTATTEND <> 1;
-- TODO: Make this more efficient
delete from dbo.REGISTRANTPREFERENCE
where REGISTRANTID in (
select REGISTRANTSTODELETE.ID from @REGISTRANTS as REGISTRANTSTODELETE
left outer join dbo.SALESORDERITEMTICKETREGISTRANT on SALESORDERITEMTICKETREGISTRANT.REGISTRANTID = REGISTRANTSTODELETE.ID
where SALESORDERITEMTICKETREGISTRANT.ID is null
);
end
-- Drop auto apply discount information
delete from dbo.SALESORDERITEMDISCOUNTOPTION
where SALESORDERID = @ID;
delete from dbo.SALESORDERAVAILABLEDISCOUNTGROUPCOMBINATION
where SALESORDERID = @ID;
delete from dbo.SALESORDERDISCOUNTSCENARIOCOMBINATION
where SALESORDERID = @ID;
delete from dbo.SALESORDERITEMSCENARIOSDONE
where SALESORDERID = @ID;
-- Reset the delivery method if there is only one
declare @DELIVERYMETHODID uniqueidentifier;
--Default delivery method on clear (except in case of online sales)
if @SALESMETHODTYPECODE <> 2 begin
select @DELIVERYMETHODID = DELIVERYMETHOD.ID
from dbo.SALESMETHODDELIVERYMETHOD
inner join dbo.SALESMETHOD on SALESMETHOD.ID = SALESMETHODDELIVERYMETHOD.SALESMETHODID
inner join dbo.DELIVERYMETHOD on DELIVERYMETHOD.ID = SALESMETHODDELIVERYMETHOD.DELIVERYMETHODID
where
SALESMETHOD.TYPECODE = @SALESMETHODTYPECODE and
DELIVERYMETHOD.ISACTIVE = 1 and
SALESMETHODDELIVERYMETHOD.ISDEFAULT = 1
end
-- Delete any information about BBPAY transactions associated with this order
delete from dbo.SALESORDERBBPAYTRANSACTION
where SALESORDERID = @ID;
-- Blank out the order
update dbo.SALESORDER set
CONSTITUENTID = case
when @SALESMETHODTYPECODE = 2 then
CONSTITUENTID
else null
end,
RECIPIENTID = null,
ADDRESSID = null,
PHONEID = null,
EMAILADDRESSID = null,
DELIVERYMETHODID = @DELIVERYMETHODID,
TRANSACTIONDATE = null,
SAMEASPATRON = 1,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where ID = @ID
if not @contextCache is null
set CONTEXT_INFO @contextCache
select @e=@@error;
if @e<>0 return -456; --always return non-zero sp result if an error occurs
if @REVENUEID is not null begin
exec dbo.USP_REVENUE_DELETE @REVENUEID, @CHANGEAGENTID
end
declare @PAYMENTID uniqueidentifier;
declare payments_cursor cursor LOCAL FAST_FORWARD for
select PAYMENTID from dbo.SALESORDERPAYMENT where SALESORDERID = @ID;
OPEN payments_cursor
FETCH NEXT FROM payments_cursor
INTO @PAYMENTID
while @@FETCH_STATUS = 0 begin
exec dbo.USP_REVENUE_DELETE @PAYMENTID, @CHANGEAGENTID
FETCH NEXT FROM payments_cursor
INTO @PAYMENTID
end
close payments_cursor
deallocate payments_cursor
-- If this was a reserved or unresolved order, we need to delete it completely.
if @ORDERSTATUS in (6,7) begin
exec dbo.USP_SALESORDER_DELETEBYID_WITHCHANGEAGENTID @ID, @CHANGEAGENTID
--delete the sponsorship row in cms_sessionvariablebackup
delete from dbo.CMS_SESSIONVARIABLEBACKUP where KEYGUID = @ID;
end
end try
begin catch
exec dbo.USP_RAISE_ERROR;
return 1;
end catch
return 0;