USP_MERCHANDISEPRODUCTINSTANCE_UPDATEINVENTORY

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT
@VALIDATEONLY bit IN
@CHANGEAGENTID uniqueidentifier IN
@MERCHANDISEPRODUCTINSTANCEID uniqueidentifier IN
@SOURCETYPECODE tinyint IN
@ACTIONTYPECODE tinyint IN
@QUANTITY int IN
@COST money IN
@PRICE money IN
@VENDORID uniqueidentifier IN
@LOOKUPCODE nvarchar(25) IN
@MERCHANDISEADJUSTMENTREASONCODEID uniqueidentifier IN
@BATCHID uniqueidentifier IN
@COMMENTS nvarchar(255) IN

Definition

Copy


CREATE procedure dbo.USP_MERCHANDISEPRODUCTINSTANCE_UPDATEINVENTORY
(
    @ID uniqueidentifier = null output,
    @VALIDATEONLY bit = 0,
    @CHANGEAGENTID uniqueidentifier = null,
    @MERCHANDISEPRODUCTINSTANCEID uniqueidentifier,
    @SOURCETYPECODE tinyint,
    @ACTIONTYPECODE tinyint,
    @QUANTITY int,
    @COST money,
    @PRICE money,
    @VENDORID uniqueidentifier,
    @LOOKUPCODE nvarchar(25),
    @MERCHANDISEADJUSTMENTREASONCODEID uniqueidentifier,    
    @BATCHID uniqueidentifier,
    @COMMENTS nvarchar(255)
)
as

    /*
        SOURCETYPECODE
            0 - Manual
            1 - Batch

        ACTIONTYPECODE
            0 - Shipment
            1 - Adjustment
            2 - Physical count
    */

    set nocount on;

    if @ID is null
        set @ID = newID();

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

    declare @CURRENTDATE datetime = getdate();
    declare @CURRENTDATETIMEOFFSET datetimeoffset = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULTDATEWITHTIMEOFFSET(sysutcdatetime(), 1)

    begin try
        --Clean parameters that shouldn't be set depending on actioncode.

        if @ACTIONTYPECODE <> 1
            set @MERCHANDISEADJUSTMENTREASONCODEID = null

        if @ACTIONTYPECODE <> 0
            begin
                set @PRICE = null
                set @COST = null
                set @VENDORID = null
            end

        if @ACTIONTYPECODE > 2
            raiserror('BBERR_INVALIDACTIONCODE', 13, 1);

        declare @MERCHANDISEPRODUCTID uniqueidentifier;
        declare @CURRENTQUANTITY int = 0;
        declare @CURRENTAVGCOST money = 0;
        declare @AVGCOST money = null;

        select 
            @MERCHANDISEPRODUCTID = MERCHANDISEPRODUCTID,
            @CURRENTQUANTITY = ONHANDQUANTITY,
            @CURRENTAVGCOST = COST
        from dbo.MERCHANDISEPRODUCTINSTANCE
        where ID = @MERCHANDISEPRODUCTINSTANCEID;


        if @ACTIONTYPECODE = 0 
            begin                            
                if @QUANTITY <= 0
                    raiserror('BBERR_QUANTITYMUSTBEGREATERTHANZERO', 13, 1);

                if @COST < 0 
                    raiserror('BBERR_COSTMUSTBEGREATERTHANOREQUALTOZERO', 13, 1);

                if @PRICE < 0
                    raiserror('BBERR_PRICEMUSTBEGREATERTHANOREQUALTOZERO', 13, 1);

                if @VENDORID is null
                    raiserror('BBERR_SHIPMENTVENDORREQUIRED', 13, 1);
            end

        if @ACTIONTYPECODE = 1 
            begin
                if @QUANTITY = 0
                    raiserror('BBERR_QUANTITYMUSTNOTBEZERO', 13, 1);

                if @MERCHANDISEADJUSTMENTREASONCODEID is null
                    raiserror('BBERR_REASONREQUIREDFORADJUSTMENT', 13, 1);
            end

        if @ACTIONTYPECODE = 2 and @QUANTITY < 0
            raiserror('BBERR_PHYSICALCOUNT_QUANTITYINVALID', 13, 1);

        if @VALIDATEONLY = 0
            begin    
                if @ACTIONTYPECODE = 0
                    -- Shipment

                    begin
                        -- Calculate new weighted average cost

                        -- Avg cost = (([Quantity on hand] * [Cost]) + ([Shipment Quantity] * [Shipment per item cost])) / ([Quantity on hand] + [Shipment Quantity])

                        --    Unless [Quantity on hand] is negative

                        --        In this case, ignore this portion of the equation: ([Quantity on hand] * [Cost])

                        if @CURRENTQUANTITY > 0
                            set @AVGCOST = ((@CURRENTQUANTITY * @CURRENTAVGCOST) + (@QUANTITY * @COST)) / (@CURRENTQUANTITY + @QUANTITY);

                        else
                            set @AVGCOST = @COST;                            

                        update dbo.MERCHANDISEPRODUCTINSTANCE set
                            ONHANDQUANTITY = @CURRENTQUANTITY + @QUANTITY,
                            COST = @AVGCOST,
                            SALEPRICE = isnull(@PRICE, SALEPRICE),
                            LOOKUPCODE = coalesce(@LOOKUPCODE, ''),
                            VENDORID = @VENDORID,
                            CHANGEDBYID = @CHANGEAGENTID,
                            DATECHANGED = @CURRENTDATE
                        where ID = @MERCHANDISEPRODUCTINSTANCEID;

                        -- Update vendor on merchandise item

                        update dbo.PRODUCTVENDOR set
                            VENDORID = @VENDORID,
                            CHANGEDBYID = @CHANGEAGENTID,
                            DATECHANGED = @CURRENTDATE
                        where PRODUCTID = @MERCHANDISEPRODUCTID;
                    end

                if @ACTIONTYPECODE = 1
                    -- Adjustment

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

                if @ACTIONTYPECODE = 2
                    -- Physical count

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

                insert into dbo.MERCHANDISEPRODUCTINSTANCEHISTORY
                    (ID, SOURCETYPECODE, ACTIONTYPECODE, ACTIONDATE, MERCHANDISEPRODUCTINSTANCEID, QUANTITY, ONHANDQUANTITY, COST, AVERAGECOST, SALEPRICE, BATCHID, VENDORID, MERCHANDISEADJUSTMENTREASONCODEID, COMMENTS, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                values
                    (@ID, @SOURCETYPECODE, @ACTIONTYPECODE, @CURRENTDATETIMEOFFSET, @MERCHANDISEPRODUCTINSTANCEID, @QUANTITY, @CURRENTQUANTITY, @COST, @AVGCOST, @PRICE, @BATCHID, @VENDORID, @MERCHANDISEADJUSTMENTREASONCODEID, coalesce(@COMMENTS, ''), @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);

            end    

    end try

    begin catch
        exec dbo.USP_RAISE_ERROR
        return 1
    end catch

    return 0