USP_ORDERPAYMENT_UPDATECASHPAYMENTS
Edits a payment on a sale order.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@AMOUNTTENDERED | money | IN | |
@CURRENTDATE | datetime | IN | |
@CURRENTDATETIMEOFFSET | datetimeoffset | IN |
Definition
Copy
CREATE procedure dbo.USP_ORDERPAYMENT_UPDATECASHPAYMENTS
(
@ID uniqueidentifier = null, --Sales Order ID
@CHANGEAGENTID uniqueidentifier = null,
@AMOUNTTENDERED money = 0, --this is the amount you're adding in cash payments.
@CURRENTDATE datetime = null,
@CURRENTDATETIMEOFFSET datetimeoffset = null
)
as
set nocount on;
declare @AMOUNT money = 0
declare @CHANGEDUE money = 0
declare @ORDERBALANCE money = 0
declare @CASHPAYMENTS money = 0
declare @OTHERPAYMENTS money = 0
declare @SALESORDERPAYMENTID uniqueidentifier = null
declare @TRANSACTIONDATE date = null
declare @CASHFINANCIALTRANSACTIONID uniqueidentifier = null;
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output
if @CURRENTDATE is null begin
set @CURRENTDATE = getdate();
end
if @CURRENTDATETIMEOFFSET is null begin
set @CURRENTDATETIMEOFFSET = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULTDATEWITHTIMEOFFSET(getutcdate(), 1);
end
select @TRANSACTIONDATE = [TRANSACTIONDATE]
from dbo.[SALESORDER]
where [ID] = @ID
if @TRANSACTIONDATE is not null
set @TRANSACTIONDATE = @CURRENTDATETIMEOFFSET;
select
@CASHPAYMENTS = coalesce([SALESORDERPAYMENT].[AMOUNTTENDERED], 0),
@SALESORDERPAYMENTID = [SALESORDERPAYMENT].[ID],
@CASHFINANCIALTRANSACTIONID = SALESORDERPAYMENT.PAYMENTID
from
dbo.[SALESORDERPAYMENT]
inner join dbo.[REVENUEPAYMENTMETHOD]
on [REVENUEPAYMENTMETHOD].[REVENUEID] = [SALESORDERPAYMENT].[PAYMENTID]
where [SALESORDERPAYMENT].[SALESORDERID] = @ID and
[REVENUEPAYMENTMETHOD].[PAYMENTMETHODCODE] = 0
if @SALESORDERPAYMENTID is not null begin
select
@OTHERPAYMENTS = coalesce(sum([SALESORDERPAYMENT].[AMOUNTTENDERED]), 0)
from
dbo.[SALESORDERPAYMENT]
inner join dbo.[REVENUEPAYMENTMETHOD]
on [REVENUEPAYMENTMETHOD].[REVENUEID] = [SALESORDERPAYMENT].[PAYMENTID]
where [SALESORDERPAYMENT].[SALESORDERID] = @ID and
[REVENUEPAYMENTMETHOD].[PAYMENTMETHODCODE] <> 0
select @ORDERBALANCE = dbo.UFN_SALESORDER_TOTAL(@ID) - @OTHERPAYMENTS;
set @AMOUNTTENDERED += @CASHPAYMENTS;
set @AMOUNT = @AMOUNTTENDERED;
if @AMOUNT > @ORDERBALANCE
set @AMOUNT = @ORDERBALANCE
set @CHANGEDUE = @AMOUNTTENDERED - @AMOUNT;
if @CHANGEDUE < 0
set @CHANGEDUE = 0
-- update the credit payment record
update dbo.[SALESORDERPAYMENT] with (rowlock) set
[AMOUNTTENDERED] = @AMOUNTTENDERED,
[AMOUNT] = @AMOUNT,
[CHANGEDUE] = @CHANGEDUE,
[PAYMENTDATEWITHTIMEOFFSET] = @CURRENTDATETIMEOFFSET,
[CHANGEDBYID] = @CHANGEAGENTID,
[DATECHANGED] = @CURRENTDATE
where
[ID] = @SALESORDERPAYMENTID
and (
AMOUNTTENDERED <> @AMOUNTTENDERED
or AMOUNT <> @AMOUNT
or CHANGEDUE <> @CHANGEDUE
);
if @@rowcount > 0 begin
if exists(select * from dbo.[SALESORDERPAYMENT] where [AMOUNT] = 0 and [AMOUNTTENDERED] = [CHANGEDUE] and [ID] = @SALESORDERPAYMENTID) begin
-- This cascade deletes the SALESORDERPAYMENT record linked to it
delete from dbo.FINANCIALTRANSACTION where ID = @CASHFINANCIALTRANSACTIONID;
end
else begin
declare @REVENUEID uniqueidentifier
select @REVENUEID = [PAYMENTID] from dbo.[SALESORDERPAYMENT] where [ID] = @SALESORDERPAYMENTID
declare @PDACCOUNTSYSTEMID uniqueidentifier;
declare @ALLOWGLDISTRIBUTIONS bit;
select
@PDACCOUNTSYSTEMID = ID,
@ALLOWGLDISTRIBUTIONS = ALLOWGLDISTRIBUTIONS
from
dbo.UFN_PDACCOUNTSYSTEM_DEFAULTORSYSTEM();
-- update the revenue record
update dbo.[FINANCIALTRANSACTION] set
[DATE] = @TRANSACTIONDATE,
[POSTDATE] = case when @ALLOWGLDISTRIBUTIONS=1 then @TRANSACTIONDATE else null end,
[TRANSACTIONAMOUNT] = @AMOUNT,
[BASEAMOUNT] = @AMOUNT,
[ORGAMOUNT] = @AMOUNT,
[CHANGEDBYID] = @CHANGEAGENTID,
[DATECHANGED] = @CURRENTDATE
where
[ID] = @REVENUEID
--update the origin amount
exec dbo.USP_DATAFORMTEMPLATE_EDIT_PAYMENTORIGINALAMOUNT @REVENUEID, @CHANGEAGENTID, @AMOUNT
end
end
end
return 0;