USP_DATAFORMTEMPLATE_ADD_SALESORDERCOMBINATION
The save procedure used by the add dataform template "Sales Order Item Ticket Combination Add Data Form".
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | INOUT | The output parameter indicating the ID of the record added. |
@COMBINATIONID | uniqueidentifier | IN | Input parameter indicating the context ID for the record being added. |
@CHANGEAGENTID | uniqueidentifier | IN | Input parameter indicating the ID of the change agent invoking the procedure. |
@DATESELECTTYPE | int | IN | Date |
@STARTDATE | datetime | IN | From |
@ENDDATE | datetime | IN | To |
@ORDERID | uniqueidentifier | IN | Order ID |
@COMBINATIONNAME | nvarchar(100) | IN | Name |
@SAMEDAYEVENT | bit | IN | Same day event |
@PROGRAMGROUPS | xml | IN | Program group |
@PRICETYPES | xml | IN | Prices |
@ALLOWPASTEVENTS | bit | IN | Allow sales to past 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 | |
@TICKETCOMBINATIONID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.USP_DATAFORMTEMPLATE_ADD_SALESORDERCOMBINATION
(
@ID uniqueidentifier = null output,
@COMBINATIONID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier = null,
@DATESELECTTYPE int = 2,
@STARTDATE datetime = null,
@ENDDATE datetime = null,
@ORDERID uniqueidentifier = null,
@COMBINATIONNAME nvarchar(100) = null,
@SAMEDAYEVENT bit = null,
@PROGRAMGROUPS xml = null,
@PRICETYPES xml = null,
@ALLOWPASTEVENTS bit = 0,
@DATA xml = null,
@OPTIONS xml = null,
@CALLBACKURL nvarchar(255) = '',
@SYSTEMTYPENAME nvarchar(255) = '',
@ASSEMBLYNAME nvarchar(255) = '',
@ATTRIBUTES xml = null,
@CATEGORYNAME nvarchar(255) = '',
@EXPIREDCALLBACKURL nvarchar(255) = '',
@TICKETCOMBINATIONID uniqueidentifier = null
)
as
set nocount on;
if @ID is null
set @ID = newid()
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output
declare @CURRENTDATE datetime
set @CURRENTDATE = getdate()
declare @CURRENTDATETIMEWITHOFFSET datetimeoffset = sysdatetimeoffset();
declare @SALESMETHODID uniqueidentifier;
declare @SALESMETHODTYPECODE tinyint;
select
@SALESMETHODID = [SALESMETHOD].[ID],
@SALESMETHODTYPECODE = [SALESMETHOD].[TYPECODE]
from dbo.[SALESORDER]
inner join dbo.[SALESMETHOD]
on [SALESORDER].[SALESMETHODTYPECODE] = [SALESMETHOD].[TYPECODE]
where [SALESORDER].[ID] = @ORDERID;
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 newid(),
T.items.value('(QUANTITY)[1]','integer'),
T.items.value('(PRICETYPECODEID)[1]', 'uniqueidentifier'),
T.items.value('(PRICETYPE)[1]','nvarchar(100)'),
PROGRAMGROUPPRICE.FACEPRICE,
T.items.value('(EVENTID)[1]', 'uniqueidentifier'),
T.items.value('(PROGRAMGROUPID)[1]', 'uniqueidentifier'),
case T.items.value('(ISDAILYADMISSION)[1]', 'bit')
when 1 then PROGRAM.NAME
when 0 then EVENT.NAME
end,
T.items.value('(ISDAILYADMISSION)[1]', 'bit')
from @PRICETYPES.nodes('/PRICETYPES/ITEM') T(items)
inner join (
dbo.COMBINATIONPRICETYPE
inner join dbo.PROGRAMGROUPPRICE
on PROGRAMGROUPPRICE.COMBINATIONPRICETYPEID = COMBINATIONPRICETYPE.ID
)
on
COMBINATIONPRICETYPE.PRICETYPECODEID = T.items.value('(PRICETYPECODEID)[1]', 'uniqueidentifier') and
PROGRAMGROUPPRICE.PROGRAMGROUPID = T.items.value('(PROGRAMGROUPID)[1]', 'uniqueidentifier')
left join dbo.PROGRAM
on PROGRAM.ID = T.items.value('(EVENTID)[1]', 'uniqueidentifier')
left join dbo.EVENT
on EVENT.ID = T.items.value('(EVENTID)[1]', 'uniqueidentifier')
where T.items.value('(QUANTITY)[1]','integer') > 0 and
COMBINATIONPRICETYPE.COMBINATIONID = @COMBINATIONID;
begin try
exec dbo.USP_SALESORDER_ISCOMPLETE_RAISERROR @ORDERID, @EXCLUDEGROUPSALES = 1;
-- Check that the events have not already ended
declare @EVENTENDDATETIMEWITHOFFSET datetimeoffset
select @EVENTENDDATETIMEWITHOFFSET = min([EVENTTIMES].[EVENTOFFTIME])
from (
select
case
when [PROGRAMSALESMETHOD].[ID] is null then [EVENT].[ENDDATETIMEWITHOFFSET]
when [PROGRAMSALESMETHOD].[ONSALEENDTYPECODE] = 0 then [EVENT].[STARTDATETIMEWITHOFFSET]
when [PROGRAMSALESMETHOD].[ONSALEENDTYPECODE] = 1 then dateadd(mi, -1 * [PROGRAMSALESMETHOD].[ONSALEENDINTERVAL], [EVENT].[STARTDATETIMEWITHOFFSET])
when [PROGRAMSALESMETHOD].[ONSALEENDTYPECODE] = 2 then dateadd(hh, -1 * [PROGRAMSALESMETHOD].[ONSALEENDINTERVAL], [EVENT].[STARTDATETIMEWITHOFFSET])
when [PROGRAMSALESMETHOD].[ONSALEENDTYPECODE] = 3 then dateadd(mi, [PROGRAMSALESMETHOD].[ONSALEENDINTERVAL], [EVENT].[STARTDATETIMEWITHOFFSET])
end as [EVENTOFFTIME]
from dbo.[EVENT]
inner join @ORDERITEMS [ITEMS]
on [ITEMS].[PROGRAMID] = [EVENT].[ID]
inner join dbo.[PROGRAM]
on [EVENT].[PROGRAMID] = [PROGRAM].[ID]
left join dbo.[PROGRAMSALESMETHOD]
on
[PROGRAM].[ID] = [PROGRAMSALESMETHOD].[PROGRAMID] and
[PROGRAMSALESMETHOD].[SALESMETHODID] = @SALESMETHODID and
[ITEMS].[ISDAILYADMISSION] = 0
) as [EVENTTIMES]
if (@CURRENTDATETIMEWITHOFFSET >= @EVENTENDDATETIMEWITHOFFSET) and @ALLOWPASTEVENTS = 0
begin
raiserror('ERR_PASTEVENT', 13, 1);
end
-- Check event availability
if exists(
select [EVENT].[ID]
from dbo.[EVENT]
inner join @ORDERITEMS ITEMS on [EVENT].[ID] = ITEMS.PROGRAMID and ITEMS.ISDAILYADMISSION = 0
group by EVENT.ID
having sum(ITEMS.QUANTITY) > dbo.UFN_EVENT_GETAVAILABILITY(EVENT.ID)
)
begin
raiserror('ERR_TICKETINSERT_UNAVAILABLE', 13, 1)
end
--For online, we need to make sure that this ticket can be delivered
if @SALESMETHODTYPECODE = 2
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
-- 4/20/09, LeeCh, Bug 19897, Starts
-- Check if total overflows by
-- adding the total in new order items and
-- the total in existing order items
-- An overflow error will be processed in the
-- catch block
declare @TOTAL money;
-- total in new order items
select @TOTAL = SUM(QUANTITY * PRICE)
from @ORDERITEMS;
-- total in existing order items
select @TOTAL = @TOTAL + isnull(SUM(SALESORDERITEM.TOTAL), 0)
from dbo.SALESORDERITEM
left join dbo.SALESORDERITEMFEE on
SALESORDERITEM.ID = SALESORDERITEMFEE.ID
where
SALESORDERITEM.SALESORDERID = @ORDERID and
(
SALESORDERITEM.TYPECODE <> 3 or
(SALESORDERITEM.TYPECODE = 3 and SALESORDERITEMFEE.APPLIESTOCODE = 0)
)
-- 4/20/09, LeeCh, Bug 19897, Ends
declare @EXISTINGTICKETCOMBINATIONID uniqueidentifier;
-- Check if need to update the quantity of existing tickets
select
@EXISTINGTICKETCOMBINATIONID = EXISTINGCOMBOTICKETS.TICKETCOMBINATIONID
from (
select PROGRAMGROUPID, PROGRAMID, ISDAILYADMISSION
from @ORDERITEMS
group by PROGRAMGROUPID, PROGRAMID, ISDAILYADMISSION
) as NEWCOMBOTICKETS
inner join (
select
PROGRAMGROUPID,
PROGRAMID,
EVENTID,
TICKETCOMBINATIONID
from dbo.SALESORDERITEM
inner join dbo.SALESORDERITEMTICKET
on SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
inner join dbo.SALESORDERITEMTICKETCOMBINATION
on SALESORDERITEMTICKET.ID = SALESORDERITEMTICKETCOMBINATION.ID
where COMBINATIONID = @COMBINATIONID and SALESORDERITEM.SALESORDERID = @ORDERID
group by PROGRAMGROUPID, PROGRAMID, EVENTID, TICKETCOMBINATIONID
) as EXISTINGCOMBOTICKETS
on NEWCOMBOTICKETS.PROGRAMGROUPID = EXISTINGCOMBOTICKETS.PROGRAMGROUPID
and (
(NEWCOMBOTICKETS.PROGRAMID = EXISTINGCOMBOTICKETS.PROGRAMID and NEWCOMBOTICKETS.ISDAILYADMISSION = 1)
or (NEWCOMBOTICKETS.PROGRAMID = EXISTINGCOMBOTICKETS.EVENTID and NEWCOMBOTICKETS.ISDAILYADMISSION = 0)
)
group by EXISTINGCOMBOTICKETS.TICKETCOMBINATIONID
having COUNT(*) = (
select
COUNT(*)
from (
select
PROGRAMGROUPID,
PROGRAMID
from @ORDERITEMS
group by PROGRAMGROUPID, PROGRAMID
) as NEWCOMBOTICKETS
)
if @EXISTINGTICKETCOMBINATIONID is not null
begin
update dbo.SALESORDERITEM set
SALESORDERITEM.QUANTITY = SALESORDERITEM.QUANTITY + ITEMS.QUANTITY,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from @ORDERITEMS ITEMS
where
SALESORDERID = @ORDERID and
SALESORDERITEM.ID in (
select SALESORDERITEMTICKET.ID
from dbo.SALESORDERITEMTICKET
inner join dbo.SALESORDERITEMTICKETCOMBINATION
on SALESORDERITEMTICKET.ID = SALESORDERITEMTICKETCOMBINATION.ID
where
(
(ITEMS.PROGRAMID = SALESORDERITEMTICKET.PROGRAMID and ITEMS.ISDAILYADMISSION = 1) or
(ITEMS.PROGRAMID = SALESORDERITEMTICKET.EVENTID and ITEMS.ISDAILYADMISSION = 0)
) and
COMBINATIONID = @COMBINATIONID and
ITEMS.PROGRAMGROUPID = SALESORDERITEMTICKETCOMBINATION.PROGRAMGROUPID and
SALESORDERITEMTICKET.PRICETYPECODEID = ITEMS.PRICETYPECODEID and
SALESORDERITEMTICKETCOMBINATION.TICKETCOMBINATIONID = @EXISTINGTICKETCOMBINATIONID
);
if @CALLBACKURL is not null
set @CALLBACKURL = replace(@CALLBACKURL, cast(@TICKETCOMBINATIONID as nvarchar(36)), cast(@EXISTINGTICKETCOMBINATIONID as nvarchar(36)));
if @EXPIREDCALLBACKURL is not null
set @EXPIREDCALLBACKURL = replace(@EXPIREDCALLBACKURL, cast(@TICKETCOMBINATIONID as nvarchar(36)), cast(@EXISTINGTICKETCOMBINATIONID as nvarchar(36)));
set @TICKETCOMBINATIONID = @EXISTINGTICKETCOMBINATIONID;
end
else
begin
if @TICKETCOMBINATIONID is null
or @TICKETCOMBINATIONID = '00000000-0000-0000-0000-000000000000'
set @TICKETCOMBINATIONID = newid();
end
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 1
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
(
(ITEMS.PROGRAMID = SALESORDERITEMTICKET.PROGRAMID and ITEMS.ISDAILYADMISSION = 1) or
(ITEMS.PROGRAMID = SALESORDERITEMTICKET.EVENTID and ITEMS.ISDAILYADMISSION = 0)
) and
SALESORDERITEMTICKET.PRICETYPECODEID = ITEMS.PRICETYPECODEID and
SALESORDERITEMTICKETCOMBINATION.TICKETCOMBINATIONID = @TICKETCOMBINATIONID
);
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
ITEMS.ID in (
select ID
from dbo.SALESORDERITEM
where SALESORDERID = @ORDERID
);
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
ITEMS.ID in (
select ID
from dbo.SALESORDERITEM
where SALESORDERID = @ORDERID
);
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;
select top 1 @ID = [SALESORDERITEM].[ID]
from dbo.[SALESORDERITEMTICKETCOMBINATION]
inner join dbo.[SALESORDERITEM]
on [SALESORDERITEMTICKETCOMBINATION].[ID] = [SALESORDERITEM].[ID]
where
[SALESORDERITEMTICKETCOMBINATION].[COMBINATIONID] = @COMBINATIONID and
[SALESORDERITEM].[SALESORDERID] = @ORDERID
end try
begin catch
-- 4/20/09, LeeCh, Bug 19897, Starts
-- catch the datatype money overflow error,
if ERROR_NUMBER() = 8115
begin
raiserror('ERR_TICKETINSERT_MONEYOVERFLOW', 13, 1)
end
-- 4/20/09, LeeCh, Bug 19897, Ends
exec dbo.USP_RAISE_ERROR
return 1
end catch
return 0;