USP_TICKET_SCAN
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.USP_TICKET_SCAN (
@ID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier
)
as
set nocount on;
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
declare @CURRENTDATE datetime = getdate();
declare @CURRENTDATEWITHTIMEOFFSET datetimeoffset = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULTDATEWITHTIMEOFFSET(getutcdate(), 1);
declare @STATUSCODE tinyint;
declare @CURRENTSCANDATEWITHTIMEOFFSET datetimeoffset;
declare @SWAPREFUNDTICKETID uniqueidentifier;
select
@STATUSCODE = STATUSCODE,
@CURRENTSCANDATEWITHTIMEOFFSET = SCANDATEWITHTIMEOFFSET
from
dbo.TICKET
where
ID = @ID;
begin try
if @STATUSCODE = 2 -- Refunded
begin
set @SWAPREFUNDTICKETID = dbo.UFN_TICKET_GETNEXTACTIVE(@ID);
if @SWAPREFUNDTICKETID is null
raiserror('BBERR_NOACTIVETICKETAVAILABLE', 13, 1);
-- Swap monetary details between scanned and swapped ticket. Updates both at the same time.
-- Be careful; if you mess with the where clause, you might accidentally update all the tickets in the entire DB. Possibly more than once.
update dbo.TICKET
set
STATUSCODE = SWAPPEDTICKET.STATUSCODE,
SCANDATEWITHTIMEOFFSET = case when TICKET.ID = @SWAPREFUNDTICKETID then null else @CURRENTDATEWITHTIMEOFFSET end,
AMOUNTPAID = SWAPPEDTICKET.AMOUNTPAID,
ITEMLEVELDISCOUNTSAPPLIED = SWAPPEDTICKET.ITEMLEVELDISCOUNTSAPPLIED,
ORDERLEVELDISCOUNTSAPPLIED = SWAPPEDTICKET.ORDERLEVELDISCOUNTSAPPLIED,
APPLIEDTOMEMBERSHIP = SWAPPEDTICKET.APPLIEDTOMEMBERSHIP,
APPLIEDTOMEMBERSHIPSALESORDERID = SWAPPEDTICKET.APPLIEDTOMEMBERSHIPSALESORDERID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from dbo.TICKET
inner join dbo.TICKET SWAPPEDTICKET on TICKET.ID <> SWAPPEDTICKET.ID
where
TICKET.ID in (@ID, @SWAPREFUNDTICKETID)
and SWAPPEDTICKET.ID in (@ID, @SWAPREFUNDTICKETID);
-- Move existing refunds also (no financial repercussions, because all relevant money values were moved above).
update dbo.CREDITITEM_EXT
set SALESORDERITEMIZEDITEMID =
case SALESORDERITEMIZEDITEMID
when @SWAPREFUNDTICKETID then @ID
when @ID then @SWAPREFUNDTICKETID
else SALESORDERITEMIZEDITEMID
end
where SALESORDERITEMIZEDITEMID in (@ID, @SWAPREFUNDTICKETID);
end
else begin
if @CURRENTSCANDATEWITHTIMEOFFSET is not null
raiserror('BBERR_ALREADYSCANNED', 13, 1);
update dbo.TICKET set
STATUSCODE = 0, -- Active
SCANDATEWITHTIMEOFFSET = @CURRENTDATEWITHTIMEOFFSET,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
ID = @ID;
end
end try
begin catch
exec dbo.USP_RAISE_ERROR;
return 1;
end catch
return 0;