USP_SALESORDERITEMMERCHANDISE_ADD

Adds a merchandise item to a sales order.

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@SALESORDERID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@CURRENTDATE datetime IN
@MERCHANDISEPRODUCTINSTANCEID uniqueidentifier IN
@QUANTITY int 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_SALESORDERITEMMERCHANDISE_ADD
            (
                @ID uniqueidentifier,
                @SALESORDERID uniqueidentifier,
                @CHANGEAGENTID uniqueidentifier = null,
                @CURRENTDATE datetime = null,
                @MERCHANDISEPRODUCTINSTANCEID uniqueidentifier,
                @QUANTITY integer = 1,
                @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
            begin
                set nocount on;

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

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

                declare @CURRENTDATETIMEWITHOFFSET datetimeoffset = sysdatetimeoffset()

                declare @PRICE money 
                declare @DESCRIPTION nvarchar(150)

                select 
                    @PRICE = SALEPRICE,
                    @DESCRIPTION = ITEMDETAILS
                from dbo.MERCHANDISEPRODUCTINSTANCE 
                where ID = @MERCHANDISEPRODUCTINSTANCEID

                declare @SALESORDERITEMID uniqueidentifier = (
                    select SOI.ID 
                    from dbo.SALESORDERITEMMERCHANDISE SOIM with (nolock)
                    inner join dbo.SALESORDERITEM SOI with (nolock) on SOI.ID = SOIM.ID
                    inner join dbo.SALESORDER SO with (nolock) on SOI.SALESORDERID = SO.ID
                    where SO.ID = @SALESORDERID
                    and SOIM.MERCHANDISEPRODUCTINSTANCEID = @MERCHANDISEPRODUCTINSTANCEID
                )

                -- Selling a new item

                if @SALESORDERITEMID is null
                begin
                    set @SALESORDERITEMID = @ID;
                    insert into dbo.SALESORDERITEM
                    (
                        ID, 
                        SALESORDERID, 
                        TYPECODE, 
                        DESCRIPTION, 
                        QUANTITY, 
                        PRICE, 
                        ADDEDBYID, 
                        CHANGEDBYID, 
                        DATEADDED, 
                        DATECHANGED, 
                        DATA
                        OPTIONS, 
                        CALLBACKURL, 
                        SYSTEMTYPENAME, 
                        ASSEMBLYNAME, 
                        ATTRIBUTES, 
                        CATEGORYNAME, 
                        EXPIREDCALLBACKURL, 
                        ACKNOWLEDGEMENT
                    )
                    values
                    (
                        @SALESORDERITEMID
                        @SALESORDERID
                        14
                        @DESCRIPTION
                        @QUANTITY
                        @PRICE
                        @CHANGEAGENTID
                        @CHANGEAGENTID
                        @CURRENTDATE
                        @CURRENTDATE
                        @DATA
                        @OPTIONS
                        @CALLBACKURL
                        @SYSTEMTYPENAME
                        @ASSEMBLYNAME
                        @ATTRIBUTES
                        @CATEGORYNAME
                        @EXPIREDCALLBACKURL,
                        @ACKNOWLEDGEMENT
                    )

                    declare @MERCHANDISEDEPARTMENTID uniqueidentifier
                    declare @MERCHANDISEDEPARTMENTCATEGORYID uniqueidentifier
                    declare @MERCHANDISEPRODUCTINSTANCEOPTIONVALUE1ID uniqueidentifier
                    declare @MERCHANDISEPRODUCTINSTANCEOPTIONVALUE2ID uniqueidentifier
                    declare @MERCHANDISEPRODUCTINSTANCEOPTIONVALUE3ID uniqueidentifier

                    select
                        @MERCHANDISEDEPARTMENTID = MERCHANDISEDEPARTMENTID,
                        @MERCHANDISEDEPARTMENTCATEGORYID = MERCHANDISEDEPARTMENTCATEGORYID
                    from dbo.MERCHANDISEPRODUCT MP
                    inner join dbo.MERCHANDISEPRODUCTINSTANCE MPI on MP.ID = MPI.MERCHANDISEPRODUCTID
                    where MPI.ID = @MERCHANDISEPRODUCTINSTANCEID

                    declare OPTION_VALUES cursor local fast_forward for
                    select MPOV.ID
                    from dbo.MERCHANDISEPRODUCTOPTIONVALUE MPOV
                    inner join dbo.MERCHANDISEPRODUCTINSTANCEOPTIONVALUE MPIOV on MPIOV.MERCHANDISEPRODUCTOPTIONVALUEID = MPOV.ID
                    where MPIOV.MERCHANDISEPRODUCTINSTANCEID = @MERCHANDISEPRODUCTINSTANCEID

                    declare @OPTIONVALUEID uniqueidentifier

                    open OPTION_VALUES
                    fetch next from OPTION_VALUES into @OPTIONVALUEID

                    while @@fetch_status = 0
                    begin
                        if @MERCHANDISEPRODUCTINSTANCEOPTIONVALUE1ID is null
                            set @MERCHANDISEPRODUCTINSTANCEOPTIONVALUE1ID = @OPTIONVALUEID

                        else if @MERCHANDISEPRODUCTINSTANCEOPTIONVALUE2ID is null
                            set @MERCHANDISEPRODUCTINSTANCEOPTIONVALUE2ID = @OPTIONVALUEID

                        else
                            set @MERCHANDISEPRODUCTINSTANCEOPTIONVALUE3ID = @OPTIONVALUEID

                        fetch next from OPTION_VALUES into @OPTIONVALUEID
                    end

                    close OPTION_VALUES
                    deallocate OPTION_VALUES

                    insert into dbo.SALESORDERITEMMERCHANDISE
                    (
                        ID, 
                        MERCHANDISEPRODUCTINSTANCEID, 
                        MERCHANDISEDEPARTMENTID, 
                        MERCHANDISEDEPARTMENTCATEGORYID, 
                        MERCHANDISEPRODUCTINSTANCEOPTIONVALUE1ID, 
                        MERCHANDISEPRODUCTINSTANCEOPTIONVALUE2ID, 
                        MERCHANDISEPRODUCTINSTANCEOPTIONVALUE3ID,
                        ADDEDBYID, 
                        CHANGEDBYID, 
                        DATEADDED, 
                        DATECHANGED
                    )
                    values
                    (
                        @SALESORDERITEMID
                        @MERCHANDISEPRODUCTINSTANCEID
                        @MERCHANDISEDEPARTMENTID
                        @MERCHANDISEDEPARTMENTCATEGORYID
                        @MERCHANDISEPRODUCTINSTANCEOPTIONVALUE1ID
                        @MERCHANDISEPRODUCTINSTANCEOPTIONVALUE2ID
                        @MERCHANDISEPRODUCTINSTANCEOPTIONVALUE3ID,
                        @CHANGEAGENTID
                        @CHANGEAGENTID
                        @CURRENTDATE
                        @CURRENTDATE
                    )
                end

                -- Updating an existing item

                else
                begin
                    update dbo.SALESORDERITEM set
                        QUANTITY += @QUANTITY,
                        CHANGEDBYID = @CHANGEAGENTID,
                        DATECHANGED = @CURRENTDATE
                    where ID = @SALESORDERITEMID
                end

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

                -- Update the inventory

                update dbo.MERCHANDISEPRODUCTINSTANCE set
                    ONHANDQUANTITY -= @QUANTITY,
                    DATECHANGED = @CURRENTDATE,
                    CHANGEDBYID = @CHANGEAGENTID
                where ID = @MERCHANDISEPRODUCTINSTANCEID
            end