USP_SALESORDERITEMTICKETS_EDIT

Edit sales order item tickets to a sales order.

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@EVENTID uniqueidentifier IN
@ORDERID uniqueidentifier IN
@PRICETYPES xml IN
@ISDAILYADMISSION bit IN
@CHANGEAGENTID uniqueidentifier IN
@PROGRAMID uniqueidentifier IN
@CURRENTDATE datetime 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

Definition

Copy


CREATE procedure dbo.USP_SALESORDERITEMTICKETS_EDIT 
(
    @ID uniqueidentifier,
    @EVENTID uniqueidentifier,
    @ORDERID uniqueidentifier,
    @PRICETYPES xml,
    @ISDAILYADMISSION bit,
    @CHANGEAGENTID uniqueidentifier = null,
    @PROGRAMID uniqueidentifier = null,
    @CURRENTDATE datetime = null,
    @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) = ''
)
as
    set nocount on;

    /* OLD WAY
    declare @NUMBERS table(numbers integer)

    declare @INCREMENT integer
    */

    declare @TOTAL money;
    declare @QUANTITY integer

    select @QUANTITY = SUM(T.items.value('(QUANTITY)[1]', 'integer'))
    from @PRICETYPES.nodes('/PRICETYPES/ITEM') T(items)

    declare @SALESMETHODTYPECODE tinyint = 0
    declare @SALESORDERSTATUSCODE tinyint = 0
    select 
        @SALESMETHODTYPECODE = [SALESMETHODTYPECODE],
        @SALESORDERSTATUSCODE = [STATUSCODE]
    from dbo.[SALESORDER]
    where [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 @SALESMETHODID uniqueidentifier = dbo.UFN_SALESMETHOD_GETIDFROMTYPECODE(2)
        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 @ISDAILYADMISSION = 1
        begin
            if @DELIVERYMETHODEXISTS = 0
                raiserror('ERR_HASNODELIVERYMETHOD', 13, 1)
        end
        else
        begin
            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
    end

    /*
    set @increment = 1;
    while @increment <= @QUANTITY
    begin
        insert into @NUMBERS
        values (@increment);

        select @increment = @increment + 1;
    end;

    from @ORDERITEMS ITEMS
    inner join @NUMBERS N on ITEMS.QUANTITY >= N.NUMBERS;
    */

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

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

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

    insert into @ORDERITEMS
    select 
        T.items.value('(ID)[1]','uniqueidentifier'), 
        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 @contextCache varbinary(128);
    declare @e int;
    declare @DESCRIPTION nvarchar(100);

    begin try
        if @ISDAILYADMISSION <> 1
        begin
            select @PROGRAMID = PROGRAMID from dbo.EVENT where ID = @EVENTID;

            -- Check availability

            if dbo.UFN_SALESORDERTICKET_VALIDQUANTITY(@EVENTID, @ORDERID, @QUANTITY) = 0
            begin
                raiserror('ERR_TICKETINSERT_UNAVAILABLE', 13, 1)
            end

            -- 4/20/09, LeeCh, Bug 19897, Rework

            -- Need to check order items in table SALESORDERITEM

            --     since the @ORDERITEMS has only updated order items for

            --     either scheduled program or daily admission program with

            --     specific event id or program id


            -- 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


            -- total in new order items

            select @TOTAL = SUM(QUANTITY * PRICE)
            from @ORDERITEMS;

            -- total in existing order items - daily admission programs and scheduled programs but different event

            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
            where 
                SALESORDERITEM.SALESORDERID = @ORDERID and
                ((not SALESORDERITEMTICKET.PROGRAMID is null) or
                ((not SALESORDERITEMTICKET.EVENTID is null) and 
                SALESORDERITEMTICKET.EVENTID <> @EVENTID)) and
                (SALESORDERITEM.TYPECODE <> 3 or 
                (SALESORDERITEM.TYPECODE = 3 and
                SALESORDERITEMFEE.APPLIESTOCODE = 0))

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

            -- 4/20/09, LeeCh, Bug 19894, Ends


            --build description


            select @DESCRIPTION = EVENT.NAME from dbo.EVENT where EVENT.ID = @EVENTID;

            -- cache current context information 

            set @contextCache = CONTEXT_INFO();

            -- set CONTEXT_INFO to @CHANGEAGENTID 

            if not @CHANGEAGENTID is null
                set CONTEXT_INFO @CHANGEAGENTID;

            -- delete discount details                

            delete from dbo.SALESORDERITEMORDERDISCOUNTDETAIL
            where SALESORDERITEMORDERDISCOUNTDETAIL.SALESORDERITEMID in
            (
                select ID
                from dbo.SALESORDERITEM
                where SALESORDERITEM.SALESORDERID = @ORDERID
            )                

            -- 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
                        left join dbo.SALESORDERITEMTICKETCOMBINATION on SALESORDERITEMTICKET.ID = SALESORDERITEMTICKETCOMBINATION.ID
                        where SALESORDERID = @ORDERID
                            and SALESORDERITEMTICKET.EVENTID = @EVENTID
                            and SALESORDERITEMTICKETCOMBINATION.ID is null
                        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
                    left join dbo.SALESORDERITEMTICKETCOMBINATION on 
                        SALESORDERITEMTICKET.ID = SALESORDERITEMTICKETCOMBINATION.ID
                    where SALESORDERID = @ORDERID
                        and SALESORDERITEMTICKET.EVENTID = @EVENTID
                        and SALESORDERITEMTICKETCOMBINATION.ID is null
                    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].CHANGEDBYID = @CHANGEAGENTID,
                    [SALESORDERITEM].DATECHANGED = @CURRENTDATE,
                    [SALESORDERITEM].PRICE = ITEMS.[PRICE]
            from dbo.[SALESORDERITEM] inner join @ORDERITEMS as [ITEMS] on [SALESORDERITEM].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, ACKNOWLEDGEMENT)
            select
                ITEMS.ID, 
                @ORDERID
                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 ID from dbo.[SALESORDERITEM] as data where data.ID = [ITEMS].ID)

            if @@Error <> 0
                return 4;

            insert into dbo.SALESORDERITEMTICKET
            (
                ID,
                EVENTID,
                PROGRAMID,
                PROGRAMNAME,
                PROGRAMCATEGORYNAME,
                PRICETYPECODEID,
                PRICE,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED, 
                DATECHANGED
            )
            select
                ITEMS.ID, 
                @EVENTID
                (select PROGRAMID from dbo.EVENT where ID = @EVENTID),
                coalesce((
                    select [PROGRAM].[NAME] 
                    from dbo.[EVENT]
                    inner join dbo.[PROGRAM]
                        on [EVENT].[PROGRAMID] = [PROGRAM].[ID]
                    where [EVENT].[ID] = @EVENTID
                ),''),
                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] = @EVENTID
                ),''),
                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)


            exec dbo.USP_SALESORDER_CALCULATEFEES @ORDERID, @CHANGEAGENTID;


            if @@Error <> 0
                return 4;
        end
        else
        begin
            if @PROGRAMID is null

            select top 1
                @PROGRAMID = PROGRAMID
            from dbo.SALESORDERITEM
            inner join dbo.SALESORDERITEMTICKET on SALESORDERITEM.ID = SALESORDERITEMTICKET.ID
            where SALESORDERITEM.ID = @ID

            -- 4/20/09, LeeCh, Bug 19897, Rework

            -- Need to check order items in table SALESORDERITEM

            --     since the @ORDERITEMS has only updated order items for

            --     either scheduled program or daily admission program with

            --     specific event id or program id


            -- 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


            -- total in new order items

            select @TOTAL = SUM(QUANTITY * PRICE)
            from @ORDERITEMS;

            -- total in existing order items - scheduled programs and daily admission programs but different program

            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
            where 
                SALESORDERITEM.SALESORDERID = @ORDERID and
                ((not SALESORDERITEMTICKET.EVENTID is null) or
                ((not SALESORDERITEMTICKET.PROGRAMID is null) and 
                SALESORDERITEMTICKET.PROGRAMID <> @PROGRAMID)) and
                (SALESORDERITEM.TYPECODE <> 3 or 
                (SALESORDERITEM.TYPECODE = 3 and
                SALESORDERITEMFEE.APPLIESTOCODE = 0))

            -- 4/20/09, LeeCh, Bug 19894, Ends


            --build description

            select @DESCRIPTION = PROGRAM.NAME from dbo.PROGRAM where PROGRAM.ID = @PROGRAMID;

            -- cache current context information 

            set @contextCache = CONTEXT_INFO();

            -- set CONTEXT_INFO to @CHANGEAGENTID 

            if not @CHANGEAGENTID is null
                set CONTEXT_INFO @CHANGEAGENTID;

            -- delete discount details                

            delete from dbo.SALESORDERITEMORDERDISCOUNTDETAIL
            where SALESORDERITEMORDERDISCOUNTDETAIL.SALESORDERITEMID in
            (
                select ID
                from dbo.SALESORDERITEM
                where SALESORDERITEM.SALESORDERID = @ORDERID
            )                    

            -- 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
                        left join dbo.SALESORDERITEMTICKETCOMBINATION on SALESORDERITEMTICKET.ID = SALESORDERITEMTICKETCOMBINATION.ID
                        where SALESORDERID = @ORDERID
                            and SALESORDERITEMTICKET.PROGRAMID = @PROGRAMID
                            and SALESORDERITEMTICKETCOMBINATION.ID is null
                        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
                    left join dbo.SALESORDERITEMTICKETCOMBINATION on SALESORDERITEMTICKET.ID = SALESORDERITEMTICKETCOMBINATION.ID
                    where SALESORDERID = @ORDERID
                        and SALESORDERITEMTICKET.PROGRAMID = @PROGRAMID
                        and SALESORDERITEMTICKETCOMBINATION.ID is null
                    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].CHANGEDBYID = @CHANGEAGENTID,
                    [SALESORDERITEM].DATECHANGED = @CURRENTDATE,
                    [SALESORDERITEM].PRICE = [ITEMS].PRICE
            from dbo.[SALESORDERITEM] inner join @ORDERITEMS as [ITEMS] on [SALESORDERITEM].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, ACKNOWLEDGEMENT)
            select
                ITEMS.ID, 
                @ORDERID
                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 ID from dbo.[SALESORDERITEM] as data where data.ID = [ITEMS].ID)

            if @@Error <> 0
                return 4;

            insert into dbo.SALESORDERITEMTICKET
            (
                ID,
                PROGRAMID,
                PROGRAMNAME,
                PROGRAMCATEGORYNAME,
                PRICETYPECODEID,
                PRICE,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED, 
                DATECHANGED
            )
            select
                ITEMS.ID, 
                @PROGRAMID
                coalesce((select [PROGRAM].[NAME] from dbo.[PROGRAM] where [PROGRAM].[ID] = @PROGRAMID),''),
                coalesce((
                    select [PROGRAMCATEGORYCODE].[DESCRIPTION]
                    from dbo.[PROGRAM]
                    inner join dbo.[PROGRAMCATEGORYCODE]
                        on [PROGRAM].[PROGRAMCATEGORYCODEID] = [PROGRAMCATEGORYCODE].[ID]
                    where [PROGRAM].[ID] = @PROGRAMID
                ),''),
                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)

            exec dbo.USP_SALESORDER_CALCULATEFEES @ORDERID, @CHANGEAGENTID;

            if @@Error <> 0
                return 4;                    
        end

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

        exec dbo.USP_SALESORDER_CALCULATETAXES @ORDERID, @CHANGEAGENTID;

        return 0;

    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;