USP_DATAFORMTEMPLATE_EDIT_SALESORDERITEMTICKETCOMBINATION
The save procedure used by the edit dataform template "Sales Order Item Ticket Combination 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. |
@ORDERID | uniqueidentifier | IN | Order ID |
@TICKETCOMBINATIONID | uniqueidentifier | IN | Ticket combination ID |
@PRICETYPES | xml | IN | Prices |
@EVENTS | xml | IN | Events |
@DATA | xml | IN | |
@OPTIONS | xml | IN | |
@CALLBACKURL | nvarchar(255) | IN | |
@SYSTEMTYPENAME | nvarchar(255) | IN | |
@ASSEMBLYNAME | nvarchar(255) | IN | |
@ATTRIBUTES | xml | IN | |
@CATEGORYNAME | nvarchar(255) | IN | |
@EXPIREDCALLBACKURL | nvarchar(255) | IN |
Definition
Copy
CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_SALESORDERITEMTICKETCOMBINATION (
@ID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier = null,
@ORDERID uniqueidentifier,
@TICKETCOMBINATIONID uniqueidentifier,
@PRICETYPES xml,
@EVENTS xml,
@DATA xml,
@OPTIONS xml,
@CALLBACKURL nvarchar(255),
@SYSTEMTYPENAME nvarchar(255),
@ASSEMBLYNAME nvarchar(255),
@ATTRIBUTES xml,
@CATEGORYNAME nvarchar(255),
@EXPIREDCALLBACKURL nvarchar(255)
)
as
set nocount on;
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output
declare @CURRENTDATE datetime
set @CURRENTDATE = getdate()
declare @COMBINATIONID uniqueidentifier;
select top 1 @COMBINATIONID = COMBINATIONID
from dbo.SALESORDERITEMTICKETCOMBINATION
where ID = @ID;
declare @COMBINATIONPROGRAMS table (
PROGRAMID uniqueidentifier,
PROGRAMGROUPID uniqueidentifier,
ISDAILYADMISSION bit
);
insert into @COMBINATIONPROGRAMS
(
PROGRAMID,
PROGRAMGROUPID,
ISDAILYADMISSION
)
select distinct
T.items.value('(ID)[1]','uniqueidentifier'),
T.items.value('(PROGRAMGROUPID)[1]','uniqueidentifier'),
T.items.value('(ISDAILYADMISSION)[1]','bit')
from @EVENTS.nodes('/EVENTS/ITEM') T(items)
-- Get new order items
-- price types and quantity are from input parameter
-- the rest information is from existing order items
declare @ORDERITEMS table (
ID uniqueidentifier,
QUANTITY int,
PRICETYPECODEID uniqueidentifier,
PRICETYPE nvarchar(100),
PRICE money,
PROGRAMID uniqueidentifier,
PROGRAMGROUPID uniqueidentifier,
DESCRIPTION nvarchar(100),
ISDAILYADMISSION bit
);
insert into @ORDERITEMS
select isnull(SALESORDERITEMTICKET.ID, newid()),
T.items.value('(QUANTITY)[1]','integer'),
T.items.value('(PRICETYPECODEID)[1]', 'uniqueidentifier'),
T.items.value('(PRICETYPE)[1]','nvarchar(100)'),
T.items.value('(FACEPRICE)[1]','money'),
PROGRAMS.PROGRAMID,
PROGRAMS.PROGRAMGROUPID,
case PROGRAMS.ISDAILYADMISSION
when 1 then PROGRAM.NAME
when 0 then EVENT.NAME
end,
PROGRAMS.ISDAILYADMISSION
from @PRICETYPES.nodes('/PRICETYPES/ITEM') T(items)
full outer join @COMBINATIONPROGRAMS PROGRAMS
on PROGRAMS.PROGRAMID is not null
left join (
dbo.SALESORDERITEMTICKET
inner join dbo.SALESORDERITEMTICKETCOMBINATION
on SALESORDERITEMTICKET.ID = SALESORDERITEMTICKETCOMBINATION.ID
)
on
(
(
PROGRAMS.PROGRAMGROUPID = SALESORDERITEMTICKETCOMBINATION.PROGRAMGROUPID and
T.items.value('(PRICETYPECODEID)[1]', 'uniqueidentifier') = SALESORDERITEMTICKET.PRICETYPECODEID and
SALESORDERITEMTICKETCOMBINATION.TICKETCOMBINATIONID = @TICKETCOMBINATIONID
)
)
left join dbo.PROGRAM on PROGRAM.ID = PROGRAMS.PROGRAMID
left join dbo.EVENT on EVENT.ID = PROGRAMS.PROGRAMID
where T.items.value('(QUANTITY)[1]','integer') > 0;
-- Update face price with actual program/event price
-- The face price get from input is combo price
update @ORDERITEMS set PRICE = PROGRAMGROUPPRICE.FACEPRICE
from @ORDERITEMS ITEMS
inner join dbo.PROGRAMGROUP on PROGRAMGROUP.ID = ITEMS.PROGRAMGROUPID
inner join dbo.PROGRAMGROUPPRICE on PROGRAMGROUPPRICE.PROGRAMGROUPID = PROGRAMGROUP.ID
inner join (dbo.COMBINATIONPRICETYPE inner join dbo.COMBINATION on COMBINATION.ID = COMBINATIONPRICETYPE.COMBINATIONID)
on COMBINATIONPRICETYPE.PRICETYPECODEID = ITEMS.PRICETYPECODEID and COMBINATIONPRICETYPE.ID = PROGRAMGROUPPRICE.COMBINATIONPRICETYPEID
where COMBINATION.ID = @COMBINATIONID
begin try
exec dbo.USP_SALESORDER_ISCOMPLETE_RAISERROR @ORDERID, @EXCLUDEGROUPSALES = 1;
-- Check if total of the order overflows
declare @TOTAL money;
-- Total of new order items
select @TOTAL = SUM(QUANTITY * PRICE)
from @ORDERITEMS;
-- total of existing order items - excludes the same combo
select @TOTAL = @TOTAL + isnull(SUM(SALESORDERITEM.TOTAL), 0)
from dbo.SALESORDERITEM
left join dbo.SALESORDERITEMFEE on SALESORDERITEM.ID = SALESORDERITEMFEE.ID
inner join dbo.SALESORDERITEMTICKET on SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
left join dbo.SALESORDERITEMTICKETCOMBINATION on SALESORDERITEMTICKET.ID = SALESORDERITEMTICKETCOMBINATION.ID
where
SALESORDERITEM.SALESORDERID = @ORDERID and
(
(SALESORDERITEMTICKETCOMBINATION.TICKETCOMBINATIONID is null) or
(
not SALESORDERITEMTICKETCOMBINATION.TICKETCOMBINATIONID is null and
SALESORDERITEMTICKETCOMBINATION.TICKETCOMBINATIONID <> @TICKETCOMBINATIONID
)
) and
(
SALESORDERITEM.TYPECODE <> 3 or
(SALESORDERITEM.TYPECODE = 3 and SALESORDERITEMFEE.APPLIESTOCODE = 0)
)
-- Check availability of scheduled events
if exists (
select 1
from (
select
PROGRAMID as [EVENTID],
sum(QUANTITY) as [QUANTITY]
from @ORDERITEMS [ITEMS]
where ITEMS.ISDAILYADMISSION = 0
group by PROGRAMID
) [ITEMSEVENTS]
where dbo.UFN_SALESORDERTICKET_VALIDQUANTITY([ITEMSEVENTS].[EVENTID], @ORDERID, [ITEMSEVENTS].[QUANTITY]) = 0
)
begin
raiserror('ERR_TICKETINSERT_UNAVAILABLE', 13, 1)
end
declare @SALESORDERSTATUSCODE tinyint;
declare @SALESMETHODID uniqueidentifier;
declare @SALESMETHODTYPECODE tinyint;
select
@SALESORDERSTATUSCODE = [SALESORDER].[STATUSCODE],
@SALESMETHODID = [SALESMETHOD].[ID],
@SALESMETHODTYPECODE = [SALESMETHOD].[TYPECODE]
from dbo.[SALESORDER]
inner join dbo.[SALESMETHOD]
on [SALESORDER].[SALESMETHODTYPECODE] = [SALESMETHOD].[TYPECODE]
where [SALESORDER].[ID] = @ORDERID;
--For online, we need to make sure that this ticket can be delivered
if @SALESMETHODTYPECODE = 2 and @SALESORDERSTATUSCODE <> 7 --unless it's an unresolved order
begin
declare @HASUNRESTRICTEDDELIVERYMETHOD bit = 0
declare @EARLIESTVALIDEVENTDATETIMEWITHOFFSET datetimeoffset = null
declare @DELIVERYMETHODEXISTS bit = 0
exec dbo.USP_DELIVERYMETHOD_INFO_BYSALESMETHODID
@SALESMETHODID,
@DELIVERYMETHODEXISTS output,
@HASUNRESTRICTEDDELIVERYMETHOD output,
@EARLIESTVALIDEVENTDATETIMEWITHOFFSET output
if @DELIVERYMETHODEXISTS = 1
begin
if @HASUNRESTRICTEDDELIVERYMETHOD = 0
begin
if exists(select 1 from @ORDERITEMS ORDERITEMS inner join dbo.[EVENT] on ORDERITEMS.PROGRAMID = [EVENT].ID where @EARLIESTVALIDEVENTDATETIMEWITHOFFSET > [EVENT].[STARTDATETIMEWITHOFFSET])
raiserror('ERR_HASNODELIVERYMETHOD', 13, 1)
end
end
else
raiserror('ERR_HASNODELIVERYMETHOD', 13, 1)
end
declare @contextCache varbinary(128);
declare @e int;
-- cache current context information
set @contextCache = CONTEXT_INFO();
-- set CONTEXT_INFO to @CHANGEAGENTID
if not @CHANGEAGENTID is null
set CONTEXT_INFO @CHANGEAGENTID;
-- delete any fees attached to items no longer in the table
delete from dbo.[SALESORDERITEM]
where ID in (
select SALESORDERITEM.ID from SALESORDERITEM
inner join dbo.SALESORDERITEMFEE on
SALESORDERITEM.ID = SALESORDERITEMFEE.ID
where
SALESORDERITEMFEE.SALESORDERITEMID in (
select SALESORDERITEM.ID
from dbo.SALESORDERITEM
inner join dbo.SALESORDERITEMTICKET on SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
inner join dbo.SALESORDERITEMTICKETCOMBINATION on SALESORDERITEMTICKET.ID = SALESORDERITEMTICKETCOMBINATION.ID
where
SALESORDERID = @ORDERID
and SALESORDERITEMTICKETCOMBINATION.TICKETCOMBINATIONID = @TICKETCOMBINATIONID
EXCEPT select ID from @ORDERITEMS
)
)
-- delete any items that no longer exist in the XML table
delete from dbo.[SALESORDERITEM]
where [SALESORDERITEM].ID in (
select SALESORDERITEM.ID
from dbo.SALESORDERITEM
inner join dbo.SALESORDERITEMTICKET on SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
inner join dbo.SALESORDERITEMTICKETCOMBINATION on SALESORDERITEMTICKET.ID = SALESORDERITEMTICKETCOMBINATION.ID
where
SALESORDERID = @ORDERID
and SALESORDERITEMTICKETCOMBINATION.TICKETCOMBINATIONID = @TICKETCOMBINATIONID
EXCEPT select ID from @ORDERITEMS
)
select @e=@@error;
-- reset CONTEXT_INFO to previous value
if not @contextCache is null
set CONTEXT_INFO @contextCache;
if @e <> 0
return 2;
-- update the items that exist in the XML table and the db
update dbo.[SALESORDERITEM]
set
[SALESORDERITEM].[QUANTITY]=ITEMS.[QUANTITY],
[SALESORDERITEM].[DESCRIPTION]=ITEMS.DESCRIPTION + ' - ' + ITEMS.PRICETYPE,
[SALESORDERITEM].CHANGEDBYID = @CHANGEAGENTID,
[SALESORDERITEM].DATECHANGED = @CURRENTDATE
from dbo.[SALESORDERITEM]
inner join @ORDERITEMS as [ITEMS] on [SALESORDERITEM].ID = [ITEMS].ID
update dbo.[SALESORDERITEMTICKET]
set
[SALESORDERITEMTICKET].[PROGRAMID] = case when ITEMS.ISDAILYADMISSION = 1 then ITEMS.[PROGRAMID] else (select [PROGRAMID] from dbo.[EVENT] where [ID] = ITEMS.[PROGRAMID]) end,
[SALESORDERITEMTICKET].[EVENTID] = case when ITEMS.ISDAILYADMISSION = 0 then ITEMS.[PROGRAMID] end,
[SALESORDERITEMTICKET].CHANGEDBYID = @CHANGEAGENTID,
[SALESORDERITEMTICKET].DATECHANGED = @CURRENTDATE
from dbo.[SALESORDERITEMTICKET]
inner join @ORDERITEMS as [ITEMS] on [SALESORDERITEMTICKET].ID = [ITEMS].ID
if @@Error <> 0
return 3;
-- insert new items
insert into dbo.SALESORDERITEM (
ID,
SALESORDERID,
TYPECODE,
DESCRIPTION,
QUANTITY,
PRICE,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED,
DATA,
OPTIONS,
CALLBACKURL,
SYSTEMTYPENAME,
ASSEMBLYNAME,
ATTRIBUTES,
CATEGORYNAME,
EXPIREDCALLBACKURL
)
select
ITEMS.ID,
@ORDERID,
0,
ITEMS.DESCRIPTION + ' - ' + ITEMS.PRICETYPE,
ITEMS.QUANTITY,
ITEMS.PRICE,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE,
@DATA,
@OPTIONS,
@CALLBACKURL,
@SYSTEMTYPENAME,
@ASSEMBLYNAME,
@ATTRIBUTES,
@CATEGORYNAME,
@EXPIREDCALLBACKURL
from @ORDERITEMS ITEMS
where not exists (select ID from dbo.[SALESORDERITEM] as data where data.ID = [ITEMS].ID)
if @@Error <> 0
return 4;
insert into dbo.SALESORDERITEMTICKET
(
ID,
PROGRAMID,
EVENTID,
PROGRAMNAME,
PROGRAMCATEGORYNAME,
PRICETYPECODEID,
PRICE,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED
)
select
ITEMS.ID,
case ITEMS.ISDAILYADMISSION
when 1 then ITEMS.PROGRAMID
else (select PROGRAMID from dbo.EVENT where ID = ITEMS.PROGRAMID)
end,
case ITEMS.ISDAILYADMISSION
when 0 then ITEMS.PROGRAMID
else null
end,
case ITEMS.ISDAILYADMISSION
when 1 then coalesce((select [NAME] from dbo.[PROGRAM] where [ID] = ITEMS.PROGRAMID),'')
when 0 then coalesce((
select [PROGRAM].[NAME]
from dbo.[EVENT]
inner join dbo.[PROGRAM]
on [EVENT].[PROGRAMID] = [PROGRAM].[ID]
where [EVENT].[ID] = ITEMS.PROGRAMID
),'')
end,
case ITEMS.ISDAILYADMISSION
when 1 then coalesce((
select [PROGRAMCATEGORYCODE].[DESCRIPTION]
from dbo.[PROGRAM]
inner join dbo.[PROGRAMCATEGORYCODE]
on [PROGRAM].[PROGRAMCATEGORYCODEID] = [PROGRAMCATEGORYCODE].[ID]
where [PROGRAM].[ID] = ITEMS.PROGRAMID
),'')
when 0 then coalesce((
select [PROGRAMCATEGORYCODE].[DESCRIPTION]
from dbo.[EVENT]
inner join dbo.[PROGRAM]
on [EVENT].[PROGRAMID] = [PROGRAM].[ID]
inner join dbo.[PROGRAMCATEGORYCODE]
on [PROGRAM].[PROGRAMCATEGORYCODEID] = [PROGRAMCATEGORYCODE].[ID]
where [EVENT].[ID] = ITEMS.PROGRAMID
),'')
end,
ITEMS.PRICETYPECODEID,
ITEMS.PRICE,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE
from @ORDERITEMS ITEMS
where not exists (select ID from dbo.[SALESORDERITEMTICKET] as data where data.ID = [ITEMS].ID)
insert into dbo.SALESORDERITEMTICKETCOMBINATION
(
ID,
COMBINATIONID,
PROGRAMGROUPID,
TICKETCOMBINATIONID,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED
)
select
ITEMS.ID,
@COMBINATIONID,
ITEMS.PROGRAMGROUPID,
@TICKETCOMBINATIONID,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE
from @ORDERITEMS ITEMS
where not exists (select ID from dbo.[SALESORDERITEMTICKETCOMBINATION] as data where data.ID = [ITEMS].ID)
if @@Error <> 0
return 4;
exec dbo.USP_SALESORDER_CALCULATEFEES @ORDERID, @CHANGEAGENTID;
exec dbo.USP_SALESORDER_APPLYITEMDISCOUNTS @ORDERID, @CHANGEAGENTID;
exec dbo.USP_SALESORDER_APPLYORDERDISCOUNTS @ORDERID, @CHANGEAGENTID;
exec dbo.USP_SALESORDER_CALCULATETAXES @ORDERID, @CHANGEAGENTID;
end try
begin catch
-- catch the datatype money overflow error,
if ERROR_NUMBER() = 8115
begin
raiserror('ERR_TICKETINSERT_MONEYOVERFLOW', 13, 1)
end
exec dbo.USP_RAISE_ERROR
return 1
end catch
return 0;