USP_SALESORDERITEM_DELETE

Executes the "Sales Order Item Delete" record operation.

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN Input parameter indicating the ID of the record being deleted.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the delete.

Definition

Copy


                CREATE procedure dbo.USP_SALESORDERITEM_DELETE
                (
                    @ID uniqueidentifier,
                    @CHANGEAGENTID uniqueidentifier
                )
                as begin
                    set nocount on;

                    declare @CURRENTDATE datetime;
                    set @CURRENTDATE = getdate();

                    declare @ORDERID uniqueidentifier
                    declare @TYPECODE int
                    declare @SALESORDERSTATUSCODE tinyint
                    select @ORDERID = SALESORDERID, @TYPECODE = TYPECODE from dbo.SALESORDERITEM where ID = @ID
                    select @SALESORDERSTATUSCODE = [STATUSCODE] from dbo.[SALESORDER] where ID = @ORDERID

                    begin try
                        exec dbo.USP_SALESORDER_ISCOMPLETE_RAISERROR @ORDERID, @EXCLUDEGROUPSALES = 1;

                        declare @e int;
                        declare @contextCache varbinary(128);

                        declare @REGISTRANTS table
                        (
                            ID uniqueidentifier,
                            GUESTOFREGISTRANTID uniqueidentifier
                        );

                        if @SALESORDERSTATUSCODE = 7
                        begin
                            set @contextCache = CONTEXT_INFO();

                            if not @CHANGEAGENTID is null
                                set CONTEXT_INFO @CHANGEAGENTID;

                            delete from dbo.[SALESORDERNOTE] where [SALESORDERITEMID] = @ID
                        end

                        if @TYPECODE in (0, 14)
                        begin
                            set @contextCache = CONTEXT_INFO();

                            if not @CHANGEAGENTID is null
                                set CONTEXT_INFO @CHANGEAGENTID;

                            delete from dbo.SALESORDERITEMORDERDISCOUNTDETAIL where SALESORDERITEMID = @ID

                            if not @contextCache is null
                                set CONTEXT_INFO @contextCache;

                        end

                        if @TYPECODE = 0
                        begin
                            exec dbo.USP_SALESORDERITEM_REMOVEFEES @ID, @CHANGEAGENTID;

                            insert into @REGISTRANTS
                            (
                                ID,
                                GUESTOFREGISTRANTID
                            )
                            select
                                REGISTRANT.ID,
                                REGISTRANT.GUESTOFREGISTRANTID
                            from
                                dbo.SALESORDERITEMTICKETREGISTRANT
                            inner join
                                dbo.REGISTRANT on REGISTRANT.ID = SALESORDERITEMTICKETREGISTRANT.REGISTRANTID
                            where
                                SALESORDERITEMTICKETREGISTRANT.SALESORDERITEMTICKETID = @ID;

                            insert into @REGISTRANTS
                            (
                                ID,
                                GUESTOFREGISTRANTID
                            )
                            select
                                GUESTOFREGISTRANTID,
                                null
                            from
                                @REGISTRANTS
                            where
                                GUESTOFREGISTRANTID not in (select ID from @REGISTRANTS);

                            --Combinations, delete tickets for this combination with the same price type


                            set @contextCache = CONTEXT_INFO();

                            if not @CHANGEAGENTID is null
                                set CONTEXT_INFO @CHANGEAGENTID;

                            declare @TICKETCOMBINATIONID uniqueidentifier = (select [TICKETCOMBINATIONID] from dbo.[SALESORDERITEMTICKETCOMBINATION] where [ID] = @ID
                            declare @PRICETYPECODEID uniqueidentifier = (select [PRICETYPECODEID] from dbo.[SALESORDERITEMTICKET] where [ID] = @ID)

                            declare @COMBOITEMS table (SALESORDERITEMID uniqueidentifier);

                            insert into @COMBOITEMS
                            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 
                                [SALESORDERITEM].[SALESORDERID] = @ORDERID and
                                [SALESORDERITEMTICKET].[PRICETYPECODEID] = @PRICETYPECODEID and
                                [SALESORDERITEMTICKETCOMBINATION].[TICKETCOMBINATIONID] = @TICKETCOMBINATIONID                        

                            delete from dbo.[SALESORDERITEM]
                            from dbo.[SALESORDERITEM]
                            inner join dbo.[SALESORDERITEMFEE] 
                                on SALESORDERITEM.ID = SALESORDERITEMFEE.ID
                            where 
                                [SALESORDERITEMFEE].[SALESORDERITEMID] in 
                                (
                                    select SALESORDERITEMID
                                    from @COMBOITEMS
                                )

                            delete from dbo.[SALESORDERITEMORDERDISCOUNTDETAIL]
                            where [SALESORDERITEMID] in
                            (
                                select SALESORDERITEMID
                                from @COMBOITEMS                
                            )

                            delete dbo.[SALESORDERITEM]
                            where ID in
                            (
                                select SALESORDERITEMID
                                from @COMBOITEMS                            
                            )

                            if not @contextCache is null
                                set CONTEXT_INFO @contextCache;
                        end

                        if @TYPECODE = 12
                        begin
                            declare @SPONSORSHIPOPPORTUNITYID uniqueidentifier

                            select @SPONSORSHIPOPPORTUNITYID = SPONSORSHIPOPPORTUNITYID 
                            from dbo.SALESORDERITEMSPONSORSHIP 
                            where ID = @ID

                            if @SPONSORSHIPOPPORTUNITYID is not null
                              exec dbo.USP_SPONSORSHIPOPPORTUNITY_UNLOCK @SPONSORSHIPOPPORTUNITYID, 0
                          end

                        if @TYPECODE = 7
                        begin
                            declare @ITINERARYITEMLOCATIONID uniqueidentifier
                            select 
                                @ITINERARYITEMLOCATIONID = ITINERARYITEMLOCATION.ID
                            from dbo.ITINERARYITEMLOCATION
                            where SALESORDERITEMID = @ID

                            if @ITINERARYITEMLOCATIONID is not null
                                exec dbo.USP_ITINERARYITEMLOCATION_DELETEBYID_WITHCHANGEAGENTID @ITINERARYITEMLOCATIONID, @CHANGEAGENTID;
                        end

                        if @TYPECODE = 1 -- delete membership addon first

                        begin
                            if not @CHANGEAGENTID is null
                                set CONTEXT_INFO @CHANGEAGENTID;

                            delete from dbo.[SALESORDERITEM]
                            from dbo.[SALESORDERITEM]
                            inner join dbo.[SALESORDERITEMMEMBERSHIPADDON] 
                                on [SALESORDERITEM].ID = [SALESORDERITEMMEMBERSHIPADDON].ID
                            where 
                                [SALESORDERITEMMEMBERSHIPADDON].SALESORDERITEMMEMBERSHIPID = @ID

                            if not @contextCache is null
                                set CONTEXT_INFO @contextCache;
                        end

                        -- use the system generated delete routine to allow proper recording of the deleting agent

                        exec dbo.USP_SALESORDERITEM_DELETEBYID_WITHCHANGEAGENTID @ID, @CHANGEAGENTID;

                        if @TYPECODE = 0
                        begin
                            exec dbo.USP_SALESORDER_CALCULATEFEES @ORDERID, @CHANGEAGENTID;

                            set @contextCache = CONTEXT_INFO();

                            if not @CHANGEAGENTID is null
                                set CONTEXT_INFO @CHANGEAGENTID;

                            -- Delete guests

                            delete from dbo.REGISTRANT
                            where ID in (select ID from @REGISTRANTS where GUESTOFREGISTRANTID is not null);

                            -- Delete hosts if they don't have anymore guests and don't have their own ticket

                            delete from dbo.REGISTRANT
                            where ID in (
                                select REGISTRANTSTODELETE.ID from @REGISTRANTS as REGISTRANTSTODELETE
                                left outer join dbo.REGISTRANT on REGISTRANT.GUESTOFREGISTRANTID = REGISTRANTSTODELETE.ID
                                left outer join dbo.SALESORDERITEMTICKETREGISTRANT on SALESORDERITEMTICKETREGISTRANT.REGISTRANTID = REGISTRANTSTODELETE.ID
                                where REGISTRANT.ID is null and SALESORDERITEMTICKETREGISTRANT.ID is null
                            );

                            -- Update hosts who still have guests and don't have a ticket and delete their preferences

                            -- TODO: Make this more efficient

                            delete from dbo.REGISTRANTPREFERENCE
                            where REGISTRANTID in (
                                select REGISTRANTSTODELETE.ID from @REGISTRANTS as REGISTRANTSTODELETE
                                left outer join dbo.SALESORDERITEMTICKETREGISTRANT on SALESORDERITEMTICKETREGISTRANT.REGISTRANTID = REGISTRANTSTODELETE.ID
                                where SALESORDERITEMTICKETREGISTRANT.ID is null
                            );

                            if not @contextCache is null
                                set CONTEXT_INFO @contextCache;

                            select @e=@@error;

                            if @e<>0 return -456; --always return non-zero sp result if an error occurs


                            update dbo.REGISTRANT set
                                WILLNOTATTEND = 1,
                                ATTENDED = 0,
                                CHANGEDBYID = @CHANGEAGENTID,
                                DATECHANGED = @CURRENTDATE
                            where ID in (
                                select REGISTRANTSTODELETE.ID from @REGISTRANTS as REGISTRANTSTODELETE
                                left outer join dbo.SALESORDERITEMTICKETREGISTRANT on SALESORDERITEMTICKETREGISTRANT.REGISTRANTID = REGISTRANTSTODELETE.ID
                                where SALESORDERITEMTICKETREGISTRANT.ID is null
                            )
                            and WILLNOTATTEND <> 1;
                        end

                        if @TYPECODE <> 2
                            begin
                                exec dbo.USP_COMBINATION_REMOVEINELIGIBLECOMBINATIONS @ORDERID, @CHANGEAGENTID;

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

                        if @TYPECODE in (1,13) -- Membership or Membership Promotion

                            exec dbo.USP_SALESORDER_UPDATEMEMBERSHIPPROMOS @ORDERID, @CHANGEAGENTID;

                        exec dbo.USP_SALESORDER_CALCULATETAXES @ORDERID, @CHANGEAGENTID;
                    end try
                    begin catch
                        exec dbo.USP_RAISE_ERROR
                        return 1
                    end catch

                    return 0;

                end