USP_DATAFORMTEMPLATE_EDIT_SALESORDERPAYMENT

The save procedure used by the edit dataform template "Sales Order Payment Edit Form".

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN The input ID parameter indicating the ID of the record being edited.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.
@DATE datetime IN Date
@AMOUNT money IN Amount
@POSTSTATUSCODE tinyint IN Post status
@POSTDATE datetime IN Post date
@PAYMENTMETHODCODE tinyint IN Payment method
@OTHERPAYMENTMETHODCODEID uniqueidentifier IN Other method
@CHECKDATE UDT_FUZZYDATE IN Check date
@CHECKNUMBER nvarchar(20) IN Check number
@CARDHOLDERNAME nvarchar(255) IN Name on card
@CREDITCARDNUMBER nvarchar(4) IN Card number
@CREDITTYPECODEID uniqueidentifier IN Card type
@AUTHORIZATIONCODE nvarchar(20) IN Authorization code
@EXPIRESON UDT_FUZZYDATE IN Expires on

Definition

Copy


                CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_SALESORDERPAYMENT
                (
                    @ID uniqueidentifier,
                    @CHANGEAGENTID uniqueidentifier,
                    @DATE datetime,
                    @AMOUNT money,
                    @POSTSTATUSCODE tinyint,
                    @POSTDATE datetime,
                    @PAYMENTMETHODCODE tinyint,
                    @OTHERPAYMENTMETHODCODEID uniqueidentifier,
                    @CHECKDATE dbo.UDT_FUZZYDATE,
                    @CHECKNUMBER nvarchar(20),
                    @CARDHOLDERNAME nvarchar(255),
                    @CREDITCARDNUMBER nvarchar(4),
                    @CREDITTYPECODEID uniqueidentifier,
                    @AUTHORIZATIONCODE nvarchar(20),
                    @EXPIRESON dbo.UDT_FUZZYDATE
                )

                as

                set nocount on;

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

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

                declare @CLEARGLDISTRIBUTIONS bit;
                set @CLEARGLDISTRIBUTIONS = 0;

                declare @contextCache varbinary(128);

                --cache current context information

                set @contextCache = CONTEXT_INFO();

                --set CONTEXT_INFO to @CHANGEAGENTID

                set CONTEXT_INFO @CHANGEAGENTID;

                declare @PAYMENTID uniqueidentifier;
                select @PAYMENTID = PAYMENTID from dbo.SALESORDERPAYMENT where ID = @ID;

                begin try
                    if @POSTSTATUSCODE = 0
                        raiserror('You cannot edit a posted payment.', 13, 1)

                    if @AMOUNT <= 0 
                        raiserror('BBERR_AMOUNTREQUIRED.', 13, 1)

                    declare @DONOTPOST bit;
                    select @DONOTPOST = case when @POSTSTATUSCODE = 2 then 1 else 0 end;

                    declare @ORIGINALPAYMETHODID uniqueidentifier, @ORIGINALPAYMENTMETHODCODE tinyint
                    select
                        @ORIGINALPAYMETHODID = ID,
                        @ORIGINALPAYMENTMETHODCODE = PAYMENTMETHODCODE
                    from dbo.REVENUEPAYMENTMETHOD
                    where REVENUEID = @PAYMENTID;

                    -- check to see if amount, post status or payment method has changed

                    if (
                        select count(REVENUE.ID) from dbo.REVENUE 
                        where REVENUE.ID = @PAYMENTID 
                        and AMOUNT = @AMOUNT
                        and POSTDATE = @POSTDATE
                        and ((@POSTSTATUSCODE = 2 and DONOTPOST = 1) or (@POSTSTATUSCODE = 1 and DONOTPOST = 0))
                    ) = 0 or @ORIGINALPAYMENTMETHODCODE <> @PAYMENTMETHODCODE
                    begin
                        set @CLEARGLDISTRIBUTIONS = 1;
                    end

                    if @AMOUNT < 0 
                        raiserror('BBERR_NEGATIVEAMOUNT.', 13, 1);

                    -- check to see if amount or receipt amount have changed

                    declare @FIELDCHANGED bit;    
                    set @FIELDCHANGED = 0;        

                    declare @ORIGINALAMOUNT money;
                    select @ORIGINALAMOUNT = AMOUNT from dbo.REVENUE where REVENUE.ID = @PAYMENTID;
                    if @ORIGINALAMOUNT <> @AMOUNT
                        set @FIELDCHANGED = 1;

                    -- if a field has changed, determine if the revenue needs to be re-receipted or re-acknowledged

                    if @FIELDCHANGED = 1
                    begin
                        declare @CHANGEDUE money;
                        declare @AMOUNTTENDERED money;
                        declare @ORDERAMOUNT money;

                        --get balance before original payment amount

                        declare @SALESORDERID uniqueidentifier;
                        select @SALESORDERID = SALESORDERID
                        from dbo.SALESORDERPAYMENT 
                        where ID = @ID;

                        set @ORDERAMOUNT = dbo.UFN_SALESORDER_GETAMOUNTDUE(@SALESORDERID) + @ORIGINALAMOUNT;

                        set @AMOUNTTENDERED = @AMOUNT;
                        set @CHANGEDUE = 0;

                        if @PAYMENTMETHODCODE = 0 --cash

                            begin
                            if @AMOUNT > @ORDERAMOUNT
                                begin
                                set @CHANGEDUE = @AMOUNT - @ORDERAMOUNT;
                                set @AMOUNT = @ORDERAMOUNT;
                                end
                            end
                        else
                            begin
                            if @AMOUNT > @ORDERAMOUNT
                                raiserror('BBERR_OVERPAY.', 13, 1);
                            end

                        exec dbo.USP_REVENUE_UPDATERERECEIPTS @PAYMENTID, @CHANGEAGENTID, @CURRENTDATE;     

                        exec dbo.USP_REVENUELETTER_SETREACKNOWLEDGEMENTS @PAYMENTID, @CHANGEAGENTID, @CURRENTDATE;     

                        update dbo.SALESORDERPAYMENT
                            set AMOUNT = @AMOUNT,
                                AMOUNTTENDERED = @AMOUNTTENDERED,
                                CHANGEDUE = @CHANGEDUE,
                                CHANGEDBYID = @CHANGEAGENTID,
                                DATECHANGED = @CURRENTDATE
                            where ID = @ID;
                    end

                    if @ORIGINALAMOUNT <> @AMOUNT 
                        -- make sure we aren't trying to modify revenue in a locked/closed deposit/bank

                        exec dbo.USP_EDIT_REVENUE_VALIDATE_DEPOSIT_STATUS @PAYMENTID;

                    --Update Transaction

                    update dbo.REVENUE 
                        set DATE = @DATE,
                            AMOUNT = @AMOUNT
                            CHANGEDBYID = @CHANGEAGENTID
                            DATECHANGED = @CURRENTDATE
                         where ID = @PAYMENTID;

                    update dbo.REVENUEPAYMENTMETHOD set 
                        PAYMENTMETHODCODE = @PAYMENTMETHODCODE,
                        AMOUNT = @AMOUNT,
                        CHANGEDBYID = @CHANGEAGENTID,
                        DATECHANGED = @CURRENTDATE
                    where ID = @ORIGINALPAYMETHODID;

                    exec dbo.USP_REVENUE_UPDATEPAYMENTDETAILS 
                        @PAYMENTMETHODID = @ORIGINALPAYMETHODID,
                        @PAYMENTMETHODCODE = @PAYMENTMETHODCODE
                        @CHECKDATE = @CHECKDATE
                        @CHECKNUMBER = @CHECKNUMBER
                        @CARDHOLDERNAME = @CARDHOLDERNAME
                        @CREDITCARDNUMBER = @CREDITCARDNUMBER
                        @CREDITTYPECODEID = @CREDITTYPECODEID
                        @AUTHORIZATIONCODE = @AUTHORIZATIONCODE
                        @EXPIRESON = @EXPIRESON
                        @CHANGEAGENTID = @CHANGEAGENTID,
                        @CHANGEDATE = @CURRENTDATE
                        @KEYALREADYOPEN = 0,
                        @OTHERPAYMENTMETHODCODEID = @OTHERPAYMENTMETHODCODEID,
                        @REVENUEAMOUNT = @AMOUNT,
                        @ORIGINALPAYMENTMETHODCODE=@ORIGINALPAYMENTMETHODCODE;

                    if @FIELDCHANGED = 1
                        begin
                        --need to update the applications.  

                        declare @MAPPING table
                            (PAYMENTSPLITID uniqueidentifier,
                             AMOUNT money);

                        insert into @MAPPING(PAYMENTSPLITID, AMOUNT)
                        select 
                            a.ID,
                            a.AMOUNT
                        from dbo.UFN_PLEDGE_GETSPLITSFORPAYMENT(@PAYMENTID, @AMOUNT) as a;

                        merge dbo.REVENUESPLIT as target
                        using @MAPPING as source
                        on (target.ID = source.PAYMENTSPLITID)
                        when matched then update set
                            AMOUNT = source.AMOUNT,
                            CHANGEDBYID = @CHANGEAGENTID,
                            DATECHANGED = @CURRENTDATE;
                    end

                    declare @OLDPOSTDATE datetime;
                    declare @OLDDONOTPOST bit;

                    select @OLDPOSTDATE = POSTDATE, @OLDDONOTPOST = DONOTPOST from dbo.REVENUE where ID = @PAYMENTID;

                    if @OLDPOSTDATE <> @POSTDATE or @OLDDONOTPOST <> @DONOTPOST 
                    begin
                        update dbo.REVENUE
                        set    POSTDATE = @POSTDATE,
                            DONOTPOST = case when @POSTSTATUSCODE = 2 then 1 else 0 end,
                            CHANGEDBYID = @CHANGEAGENTID,
                            DATECHANGED = @CURRENTDATE
                        where ID = @PAYMENTID;
                    end

                    declare @SALESMETHODTYPECODE tinyint;
                    declare @STATUSCODE tinyint;
                    declare @CONSTITUENTID uniqueidentifier;
                    select
                        @SALESMETHODTYPECODE = SALESORDER.SALESMETHODTYPECODE,
                        @STATUSCODE = STATUSCODE,
                        @CONSTITUENTID = CONSTITUENTID
                    from dbo.SALESORDER
                    inner join dbo.SALESORDERPAYMENT on SALESORDER.ID = SALESORDERPAYMENT.SALESORDERID
                    where SALESORDERPAYMENT.ID = @ID;

                    if @STATUSCODE = 1 or @SALESMETHODTYPECODE = 3
                        begin
                            -- clear the user-defined gl distributions

                            if @CLEARGLDISTRIBUTIONS = 1
                            begin                                
                                -- Clear GL

                                delete from dbo.REVENUEGLDISTRIBUTION where REVENUEID = @PAYMENTID and OUTDATED = 0;    

                                -- Add new GL distributions

                                if @POSTSTATUSCODE <> 2
                                begin

                                    -- Add new GL distributions

                                    exec dbo.USP_SAVE_REVENUEGLDISTRIBUTION @PAYMENTID, @CHANGEAGENTID, @CURRENTDATE;

                                end
                            end
                        end
                    -- Order is no longer completed automatically

                    --else

                    --    begin

                    --        if @SALESMETHODTYPECODE <> 3 and @AMOUNT >= @ORDERAMOUNT

                    --            begin

                    --                --mark the order as complete

                    --                exec dbo.USP_SALESORDER_COMPLETEORDER @SALESORDERID, @DATE, @CONSTITUENTID, @CHANGEAGENTID, @CURRENTDATE; 

                    --            end

                    --    end


                    if @FIELDCHANGED = 1 and @SALESMETHODTYPECODE = 3
                        --group sales reservation, progress status

                        exec dbo.USP_RESERVATION_UPDATESTATUSANDHISTORY @SALESORDERID, @CHANGEAGENTID

                end try

                begin catch
                    --reset CONTEXT_INFO to previous value

                    if not @contextCache is null
                        set CONTEXT_INFO @contextCache;

                    exec dbo.USP_RAISE_ERROR;

                    return 1;
                end catch

                --reset CONTEXT_INFO to previous value

                if not @contextCache is null
                    set CONTEXT_INFO @contextCache;

                return 0;