USP_SALESORDERITEMTICKETS_ADD

Add sales order item tickets to a sales order.

Parameters

Parameter Parameter Type Mode Description
@SALESORDERID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@CURRENTDATE datetime IN
@EVENTID uniqueidentifier IN
@PRICETYPES xml IN
@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
@ACKNOWLEDGEMENT nvarchar(max) IN
@ALLOWPASTEVENTS bit IN

Definition

Copy


            CREATE procedure dbo.USP_SALESORDERITEMTICKETS_ADD
            (
                @SALESORDERID uniqueidentifier,
                @CHANGEAGENTID uniqueidentifier = null,
                @CURRENTDATE datetime = null,
                @EVENTID uniqueidentifier,
                @PRICETYPES xml,
                @DATA xml = null,
                @OPTIONS xml = null,
                @CALLBACKURL nvarchar(255) = '',
                @SYSTEMTYPENAME nvarchar(255) = '',
                @ASSEMBLYNAME nvarchar(255) = '',
                @ATTRIBUTES xml = null,
                @CATEGORYNAME nvarchar(255) = '',
                @EXPIREDCALLBACKURL nvarchar(255) = '',
                @ACKNOWLEDGEMENT nvarchar(max) = '',
                @ALLOWPASTEVENTS bit = 0
            )
            as
                set nocount on;

                if @CHANGEAGENTID is null  
                    exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;

                if @CURRENTDATE is null
                    set @CURRENTDATE = getdate();

                declare @SALESMETHODTYPECODE tinyint;
                declare @SALESORDERSTATUSCODE tinyint;
                declare @SALESMETHODID uniqueidentifier;

                select
                    @SALESMETHODTYPECODE = SALESORDER.SALESMETHODTYPECODE,
                    @SALESORDERSTATUSCODE = SALESORDER.STATUSCODE,
                    @SALESMETHODID = SALESMETHOD.ID
                from dbo.[SALESORDER]
                inner join dbo.SALESMETHOD on SALESMETHOD.TYPECODE = SALESORDER.SALESMETHODTYPECODE
                where SALESORDER.ID = @SALESORDERID

                -- Check that event has not already gone past the off sale time                

                declare @CURRENTDATETIMEWITHOFFSET datetimeoffset = sysdatetimeoffset()

                declare @DESCRIPTION nvarchar(100);
                declare @PROGRAMID uniqueidentifier;
                declare @EVENTENDDATETIMEWITHOFFSET datetimeoffset;

                select
                    @DESCRIPTION = EVENT.NAME,
                    @PROGRAMID = EVENT.PROGRAMID,
                    @EVENTENDDATETIMEWITHOFFSET = 
                    case
                        when [PROGRAMSALESMETHOD].[ID] is null then [EVENT].[STARTDATETIMEWITHOFFSET]
                        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
                from dbo.[EVENT]
                left join dbo.[PROGRAMSALESMETHOD]
                    on 
                        [EVENT].[PROGRAMID] = [PROGRAMSALESMETHOD].[PROGRAMID] and
                        [PROGRAMSALESMETHOD].[SALESMETHODID] = @SALESMETHODID
                where 
                    [EVENT].[ID] = @EVENTID;

                if (@CURRENTDATETIMEWITHOFFSET >= @EVENTENDDATETIMEWITHOFFSET) and @ALLOWPASTEVENTS = 0
                begin
                    raiserror('ERR_PASTEVENT', 13, 1);
                end

                --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 @EARLIESTVALIDEVENTDATETIMEWITHOFFSET > (select top 1 [STARTDATETIMEWITHOFFSET] from dbo.[EVENT] where [ID] = @EVENTID)
                                raiserror('ERR_HASNODELIVERYMETHOD', 13, 1)
                        end
                    end
                    else
                        raiserror('ERR_HASNODELIVERYMETHOD', 13, 1)
                end

                declare @ORDERITEMS table
                    (ID uniqueidentifier,
                    QUANTITY int,
                    PRICETYPECODEID uniqueidentifier,
                    PRICETYPE nvarchar(100),
                    PRICE money);

                insert into @ORDERITEMS
                select
                    ISNULL(T.items.value('(SALESORDERITEMID)[1]','uniqueidentifier'), newid()), 
                    T.items.value('(QUANTITY)[1]','integer'), 
                    T.items.value('(PRICETYPECODEID)[1]', 'uniqueidentifier'),
                    T.items.value('(PRICETYPE)[1]','nvarchar(100)'),
                    -- 4/16/09, LeeCh, Bug 19897

                    -- Changed decimal(9,2) into decimal (19,2) to

                    --     avoid decimal overflow error

                    -- See work item fix and attachment for details

                    T.items.value('(FACEPRICE)[1]','decimal(19,2)')
                from @PRICETYPES.nodes('/PRICETYPES/ITEM') T(items)
                where T.items.value('(QUANTITY)[1]','integer') > 0;

                declare @QUANTITY integer;

                select @QUANTITY = SUM(QUANTITY)
                from @ORDERITEMS;

                begin try
                    -- Check availability

                    if @QUANTITY > dbo.UFN_EVENT_GETAVAILABILITY(@EVENTID)
                    begin
                        raiserror('ERR_TICKETINSERT_UNAVAILABLE', 13, 1);
                    end

                    -- 4/16/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 = @SALESORDERID and
                        (SALESORDERITEM.TYPECODE <> 3 or 
                         (SALESORDERITEM.TYPECODE = 3 and
                          SALESORDERITEMFEE.APPLIESTOCODE = 0));

                    -- 4/16/09, LeeCh, Bug 19897, Ends


                    update dbo.SALESORDERITEM with (rowlock) set
                        SALESORDERITEM.QUANTITY = SALESORDERITEM.QUANTITY + ITEMS.QUANTITY,
                        CHANGEDBYID = @CHANGEAGENTID,
                        DATECHANGED = @CURRENTDATE
                    from @ORDERITEMS ITEMS
                    where SALESORDERITEM.ID = ITEMS.ID;

                    update dbo.SALESORDERITEM with (rowlock) set
                    SALESORDERITEM.QUANTITY = SALESORDERITEM.QUANTITY + ITEMS.QUANTITY,
                    CHANGEDBYID = @CHANGEAGENTID,
                    DATECHANGED = @CURRENTDATE
                    from @ORDERITEMS ITEMS
                    where
                    not exists(select 1 from @ORDERITEMS where ID = SALESORDERITEM.ID) and
                    SALESORDERID = @SALESORDERID and
                    SALESORDERITEM.ID in
                    ( 
                        select SALESORDERITEMTICKET.ID 
                        from dbo.SALESORDERITEMTICKET 
                        inner join dbo.SALESORDERITEM as B on SALESORDERITEMTICKET.ID = B.ID
                        left join dbo.SALESORDERITEMTICKETCOMBINATION on SALESORDERITEMTICKET.ID = SALESORDERITEMTICKETCOMBINATION.ID
                        where B.SALESORDERID = @SALESORDERID and
                            EVENTID = @EVENTID and 
                            SALESORDERITEMTICKET.PRICETYPECODEID = ITEMS.PRICETYPECODEID and
                            SALESORDERITEMTICKETCOMBINATION.ID is null
                    );

                    insert into dbo.SALESORDERITEM
                        (ID, SALESORDERID, TYPECODE, DESCRIPTION, QUANTITY, PRICE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, DATA, OPTIONS, CALLBACKURL, SYSTEMTYPENAME, ASSEMBLYNAME, ATTRIBUTES, CATEGORYNAME, EXPIREDCALLBACKURL, ACKNOWLEDGEMENT)
                    select
                        ITEMS.ID, 
                        @SALESORDERID
                        0
                        @DESCRIPTION + ' - ' + ITEMS.PRICETYPE, 
                        ITEMS.QUANTITY, 
                        ITEMS.PRICE,
                        @CHANGEAGENTID
                        @CHANGEAGENTID
                        @CURRENTDATE
                        @CURRENTDATE,
                        @DATA,
                        @OPTIONS,
                        @CALLBACKURL,
                        @SYSTEMTYPENAME,
                        @ASSEMBLYNAME,
                        @ATTRIBUTES,
                        @CATEGORYNAME,
                        @EXPIREDCALLBACKURL,
                        @ACKNOWLEDGEMENT
                    from @ORDERITEMS ITEMS
                    where 
                        not exists
                        (
                            select 1 from dbo.SALESORDERITEM
                            inner join dbo.SALESORDERITEMTICKET on SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
                            left join dbo.SALESORDERITEMTICKETCOMBINATION on SALESORDERITEMTICKET.ID = SALESORDERITEMTICKETCOMBINATION.ID
                            where
                                SALESORDERITEM.ID = ITEMS.ID or
                                (
                                    SALESORDERID = @SALESORDERID and
                                    EVENTID = @EVENTID and
                                    SALESORDERITEMTICKET.PRICETYPECODEID = ITEMS.PRICETYPECODEID and
                                    SALESORDERITEMTICKETCOMBINATION.ID is null
                                )
                        );

                    declare @PROGRAMNAME nvarchar(100);
                    declare @PROGRAMCATEGORY nvarchar(100);

                    select
                        @PROGRAMNAME = PROGRAM.NAME,
                        @PROGRAMCATEGORY = isnull(PROGRAMCATEGORYCODE.DESCRIPTION, N'')
                    from
                        dbo.PROGRAM
                    left outer join
                        dbo.PROGRAMCATEGORYCODE on PROGRAMCATEGORYCODE.ID = PROGRAM.PROGRAMCATEGORYCODEID
                    where
                        PROGRAM.ID = @PROGRAMID;

                    insert into dbo.SALESORDERITEMTICKET
                    (
                        ID,
                        EVENTID,
                        PROGRAMID,
                        PROGRAMNAME,
                        PROGRAMCATEGORYNAME,
                        PRICETYPECODEID,
                        PRICE,
                        ADDEDBYID,
                        CHANGEDBYID,
                        DATEADDED, 
                        DATECHANGED
                    )
                    select
                        ITEMS.ID, 
                        @EVENTID
                        @PROGRAMID,
                        @PROGRAMNAME,
                        @PROGRAMCATEGORY,
                        ITEMS.PRICETYPECODEID,
                        ITEMS.PRICE,
                        @CHANGEAGENTID
                        @CHANGEAGENTID
                        @CURRENTDATE
                        @CURRENTDATE
                    from @ORDERITEMS ITEMS
                    where
                        ITEMS.ID in
                        ( select ID from dbo.SALESORDERITEM where SALESORDERID = @SALESORDERID ) and
                        not exists(select 1 from dbo.SALESORDERITEMTICKET where ID = ITEMS.ID);

                    exec dbo.USP_SALESORDER_CALCULATEFEES @SALESORDERID, @CHANGEAGENTID;

                    exec dbo.USP_SALESORDER_APPLYITEMDISCOUNTS @SALESORDERID, @CHANGEAGENTID;
                    exec dbo.USP_SALESORDER_APPLYORDERDISCOUNTS @SALESORDERID, @CHANGEAGENTID;

                    exec dbo.USP_SALESORDER_CALCULATETAXES @SALESORDERID, @CHANGEAGENTID;
                end try

                begin catch
                    -- 4/16/09, LeeCh, Bug 19897, Starts

                    -- catch the datatype money overflow error, 

                    if ERROR_NUMBER() = 8115
                    begin
                        raiserror('ERR_TICKETINSERT_MONEYOVERFLOW', 13, 1);
                    end
                    -- 4/16/09, LeeCh, Bug 19897, Ends


                    exec dbo.USP_RAISE_ERROR;
                    return 1;
                end catch

                return 0;