USP_DATAFORMTEMPLATE_EDIT_RECURRINGGIFTWRITEOFF
The save procedure used by the edit dataform template "Recurring Gift Write-off Edit Data 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 | date | IN | Date |
@REASONID | uniqueidentifier | IN | Reason code |
@AMOUNT | money | IN | Amount |
@INSTALLMENTS | xml | IN |
Definition
Copy
CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_RECURRINGGIFTWRITEOFF (
@ID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier,
@DATE date,
@REASONID uniqueidentifier,
@AMOUNT money,
@INSTALLMENTS xml
)
as
set nocount on;
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output
declare @CURRENTDATE datetime
set @CURRENTDATE = getdate()
declare @REVENUEID uniqueidentifier;
declare @RGAMOUNT money;
declare @BASECURRENCYID uniqueidentifier;
declare @RGORGANIZATIONAMOUNT money;
declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;
declare @RGTRANSACTIONAMOUNT money;
declare @TRANSACTIONCURRENCYID uniqueidentifier;
declare @BASEEXCHANGERATEID uniqueidentifier;
declare @INSTALLMENTSWRITEOFFAMOUNTSUM money;
declare @INSTALLMENTSWRITEOFFAMOUNTMAX money;
declare @MINBALANCE money;
select
@REVENUEID = REVENUE.ID,
@RGAMOUNT = REVENUE.AMOUNT,
@BASECURRENCYID = REVENUE.BASECURRENCYID,
@RGORGANIZATIONAMOUNT = REVENUE.ORGANIZATIONAMOUNT,
@ORGANIZATIONEXCHANGERATEID = REVENUE.ORGANIZATIONEXCHANGERATEID,
@RGTRANSACTIONAMOUNT = REVENUE.TRANSACTIONAMOUNT,
@TRANSACTIONCURRENCYID = REVENUE.TRANSACTIONCURRENCYID,
@BASEEXCHANGERATEID = REVENUE.BASEEXCHANGERATEID
from dbo.RECURRINGGIFTWRITEOFF
inner join dbo.REVENUE on REVENUE.ID = RECURRINGGIFTWRITEOFF.REVENUEID
where RECURRINGGIFTWRITEOFF.ID = @ID;
select
@INSTALLMENTSWRITEOFFAMOUNTSUM = sum(WRITEOFFINSTALLMENTS.WRITEOFFAMOUNT),
@INSTALLMENTSWRITEOFFAMOUNTMAX = max(WRITEOFFINSTALLMENTS.WRITEOFFAMOUNT),
@MINBALANCE = min(dbo.UFN_RECURRINGGIFTINSTALLMENT_GETINSTALLMENTBALANCE(WRITEOFFINSTALLMENTS.INSTALLMENTID) - (WRITEOFFINSTALLMENTS.WRITEOFFAMOUNT - coalesce(RECURRINGGIFTINSTALLMENTWRITEOFF.TRANSACTIONAMOUNT, 0)))
from
dbo.UFN_RECURRINGGIFTINSTALLMENT_GETWRITEOFFINSTALLMENTSFOREDIT_FROMITEMLISTXML(@INSTALLMENTS) as WRITEOFFINSTALLMENTS
left join dbo.RECURRINGGIFTINSTALLMENTWRITEOFF on RECURRINGGIFTINSTALLMENTWRITEOFF.ID = WRITEOFFINSTALLMENTS.INSTALLMENTWRITEOFFID;
begin try
if @BASECURRENCYID <> @TRANSACTIONCURRENCYID and @BASEEXCHANGERATEID is null
raiserror('BBERR_BASEEXCHANGERATE_MISSING', 13, 1);
if @INSTALLMENTSWRITEOFFAMOUNTSUM <> @AMOUNT
raiserror('BBERR_AMOUNTAPPLIED_NOTEQUALTO_WRITEOFFAMOUNT', 13, 1);
if @INSTALLMENTSWRITEOFFAMOUNTMAX > @RGAMOUNT
raiserror('BBERR_WRITEOFFAMOUNT_GREATERTHAN_RECURRINGGIFTAMOUNT', 13, 2);
if @MINBALANCE < 0
raiserror('BBERR_WRITEOFFAMOUNT_GREATERTHAN_RECURRINGGIFTAMOUNT', 13, 2);
-- add missing installments
exec dbo.USP_RECURRINGGIFT_ADDMISSINGINSTALLMENTS
@REVENUEID,
@CHANGEAGENTID,
@CURRENTDATE,
@RGAMOUNT,
null,
@BASECURRENCYID,
@RGORGANIZATIONAMOUNT,
@ORGANIZATIONEXCHANGERATEID,
@RGTRANSACTIONAMOUNT,
@TRANSACTIONCURRENCYID,
@BASEEXCHANGERATEID;
-- update writeoff
update dbo.RECURRINGGIFTWRITEOFF
set DATE = @DATE,
REASONCODEID = @REASONID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where ID = @ID;
-- update installment applications
declare @INSTALLMENTSTAB table (INSTALLMENTID uniqueidentifier,
DATE date,
WRITEOFFAMOUNT money,
INSTALLMENTWRITEOFFID uniqueidentifier);
insert into @INSTALLMENTSTAB
select INSTALLMENTID, DATE, WRITEOFFAMOUNT, INSTALLMENTWRITEOFFID
from dbo.UFN_RECURRINGGIFTINSTALLMENT_GETWRITEOFFINSTALLMENTSFOREDIT_FROMITEMLISTXML(@INSTALLMENTS) I;
-- new installment writeoffs
insert into dbo.RECURRINGGIFTINSTALLMENTWRITEOFF (
ID,
RECURRINGGIFTINSTALLMENTID,
WRITEOFFID,
AMOUNT,
BASECURRENCYID,
ORGANIZATIONAMOUNT,
ORGANIZATIONEXCHANGERATEID,
TRANSACTIONAMOUNT,
TRANSACTIONCURRENCYID,
BASEEXCHANGERATEID,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
select
newid(),
coalesce(I.INSTALLMENTID,(select ID from dbo.RECURRINGGIFTINSTALLMENT where REVENUEID = @REVENUEID and DATE = I.DATE)),
@ID,
WRITEOFFAMOUNTCURRENCYVALUES.BASEAMOUNT,
@BASECURRENCYID,
WRITEOFFAMOUNTCURRENCYVALUES.ORGANIZATIONAMOUNT,
@ORGANIZATIONEXCHANGERATEID,
I.WRITEOFFAMOUNT,
@TRANSACTIONCURRENCYID,
@BASEEXCHANGERATEID,
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
from @INSTALLMENTSTAB I
outer apply dbo.UFN_CURRENCY_GETCURRENCYVALUES_2
(
I.WRITEOFFAMOUNT,
null,
@BASECURRENCYID,
@BASEEXCHANGERATEID,
@TRANSACTIONCURRENCYID,
null,
null,
null,
@ORGANIZATIONEXCHANGERATEID,
0
) as WRITEOFFAMOUNTCURRENCYVALUES
where I.WRITEOFFAMOUNT > 0
and I.INSTALLMENTWRITEOFFID is null;
-- updated installment writeoffs
update dbo.RECURRINGGIFTINSTALLMENTWRITEOFF
set AMOUNT = WRITEOFFAMOUNTCURRENCYVALUES.BASEAMOUNT,
ORGANIZATIONAMOUNT = WRITEOFFAMOUNTCURRENCYVALUES.ORGANIZATIONAMOUNT,
TRANSACTIONAMOUNT = I.WRITEOFFAMOUNT,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from @INSTALLMENTSTAB I
outer apply dbo.UFN_CURRENCY_GETCURRENCYVALUES_2
(
I.WRITEOFFAMOUNT,
null,
@BASECURRENCYID,
@BASEEXCHANGERATEID,
@TRANSACTIONCURRENCYID,
null,
null,
null,
@ORGANIZATIONEXCHANGERATEID,
0
) as WRITEOFFAMOUNTCURRENCYVALUES
where RECURRINGGIFTINSTALLMENTWRITEOFF.ID = I.INSTALLMENTWRITEOFFID
and RECURRINGGIFTINSTALLMENTWRITEOFF.TRANSACTIONAMOUNT <> I.WRITEOFFAMOUNT
and I.WRITEOFFAMOUNT > 0;
--Cache CONTEXT INFO
declare @contextCache varbinary(128);
set @contextCache = CONTEXT_INFO();
set CONTEXT_INFO @CHANGEAGENTID;
-- removed installment writeoffs
delete from dbo.RECURRINGGIFTINSTALLMENTWRITEOFF
where ID in(select INSTALLMENTWRITEOFFID from @INSTALLMENTSTAB where INSTALLMENTWRITEOFFID is not null and WRITEOFFAMOUNT = 0);
--Restore CONTEXT INFO
if not @contextCache is null
set CONTEXT_INFO @contextCache;
-- Clean up future installments and next transaction date.
declare @FUTUREINSTALLMENTEXISTS bit;
set @FUTUREINSTALLMENTEXISTS = 0;
select @FUTUREINSTALLMENTEXISTS = 1
from dbo.RECURRINGGIFTINSTALLMENT
where REVENUEID = @REVENUEID
and DATE >= dbo.UFN_DATE_GETEARLIESTTIME(@CURRENTDATE)
and dbo.UFN_RECURRINGGIFTINSTALLMENT_GETINSTALLMENTBALANCE(ID) > 0;
if @FUTUREINSTALLMENTEXISTS = 0
begin
declare @LASTINSTALLMENTDATE date;
select @LASTINSTALLMENTDATE = max(DATE)
from dbo.RECURRINGGIFTINSTALLMENT
where REVENUEID = @REVENUEID;
set @LASTINSTALLMENTDATE = dbo.UFN_REVENUE_GETNEXTTRANSACTIONDATE_BYID_1_1(@REVENUEID,@LASTINSTALLMENTDATE)
declare @ENDDATE date;
declare @STATUSCODE tinyint;
select @ENDDATE = ENDDATE,
@STATUSCODE = STATUSCODE
from dbo.REVENUESCHEDULE
where ID = @REVENUEID;
if @STATUSCODE = 0 and
(@ENDDATE is null or
@LASTINSTALLMENTDATE <= @ENDDATE)
begin
insert into dbo.RECURRINGGIFTINSTALLMENT (
ID,
REVENUEID,
AMOUNT,
DATE,
BASECURRENCYID,
ORGANIZATIONAMOUNT,
ORGANIZATIONEXCHANGERATEID,
TRANSACTIONAMOUNT,
TRANSACTIONCURRENCYID,
BASEEXCHANGERATEID,
ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
values (
newid(),
@REVENUEID,
@RGAMOUNT,
@LASTINSTALLMENTDATE,
@BASECURRENCYID,
@RGORGANIZATIONAMOUNT,
@ORGANIZATIONEXCHANGERATEID,
@RGTRANSACTIONAMOUNT,
@TRANSACTIONCURRENCYID,
@BASEEXCHANGERATEID,
@CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE);
end
else
update dbo.REVENUESCHEDULE
set NEXTTRANSACTIONDATE = @LASTINSTALLMENTDATE,
STATUSCODE = case when @STATUSCODE = 0 then 3 else @STATUSCODE end,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
from dbo.REVENUESCHEDULE
where ID = @REVENUEID;
end
else
begin
-- future installment exists, clean up
exec dbo.USP_RECURRINGGIFT_DELETEFUTUREINSTALLMENTS @REVENUEID, @CHANGEAGENTID
end
--always call this code
exec dbo.USP_RECURRINGGIFT_SETNEXTTRANSACTIONDATE @REVENUEID, @CHANGEAGENTID
end try
begin catch
exec dbo.USP_RAISE_ERROR
return 1
end catch
return 0;