USP_RECURRINGGIFT_FIXMISSINGINSTALLMENTSCHEDULE
Adds the installment schedule to a recurring gift that is missing a schedule.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@CURRENTDATE | datetime | IN |
Definition
Copy
CREATE procedure dbo.USP_RECURRINGGIFT_FIXMISSINGINSTALLMENTSCHEDULE (
@ID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier = null,
@CURRENTDATE datetime = null
)
as
begin
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
if @CURRENTDATE is null
set @CURRENTDATE = getdate();
begin try
--------------------------------------------------------------------------------
-- create paid installments for all payments
insert into dbo.RECURRINGGIFTINSTALLMENT
(ID, REVENUEID, AMOUNT, DATE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, BASECURRENCYID,ORGANIZATIONAMOUNT,ORGANIZATIONEXCHANGERATEID,TRANSACTIONAMOUNT,TRANSACTIONCURRENCYID,BASEEXCHANGERATEID)
select
RECURRINGGIFTACTIVITY.ID,
RECURRINGGIFTACTIVITY.SOURCEREVENUEID,
case when REVENUE.BASEEXCHANGERATEID is not null
then dbo.UFN_CURRENCY_CONVERT(RECURRINGGIFTACTIVITY.AMOUNT, REVENUE.BASEEXCHANGERATEID)
else RECURRINGGIFTACTIVITY.AMOUNT
end,
RECURRINGGIFTACTIVITY.SCHEDULEDATE,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE,
REVENUE.BASECURRENCYID,
case when REVENUE.BASEEXCHANGERATEID is not null and REVENUE.ORGANIZATIONEXCHANGERATEID is not null
then dbo.UFN_CURRENCY_CONVERT(dbo.UFN_CURRENCY_CONVERT(RECURRINGGIFTACTIVITY.AMOUNT, REVENUE.BASEEXCHANGERATEID), REVENUE.ORGANIZATIONEXCHANGERATEID) -- convert from transaction to base to organization currency
when REVENUE.BASEEXCHANGERATEID is not null
then dbo.UFN_CURRENCY_CONVERT(RECURRINGGIFTACTIVITY.AMOUNT, REVENUE.BASEEXCHANGERATEID) -- org and base currencies are the same
when REVENUE.ORGANIZATIONEXCHANGERATEID is not null
then dbo.UFN_CURRENCY_CONVERT(RECURRINGGIFTACTIVITY.AMOUNT, REVENUE.ORGANIZATIONEXCHANGERATEID) -- transaction and base currencies are the same
else RECURRINGGIFTACTIVITY.AMOUNT
end,
REVENUE.ORGANIZATIONEXCHANGERATEID,
RECURRINGGIFTACTIVITY.AMOUNT,
REVENUE.TRANSACTIONCURRENCYID,
REVENUE.BASEEXCHANGERATEID
from
dbo.RECURRINGGIFTACTIVITY
inner join dbo.REVENUE on RECURRINGGIFTACTIVITY.SOURCEREVENUEID = REVENUE.ID
where
RECURRINGGIFTACTIVITY.SOURCEREVENUEID = @ID
and RECURRINGGIFTACTIVITY.TYPECODE = 0;
insert into dbo.RECURRINGGIFTINSTALLMENTPAYMENT
(ID, RECURRINGGIFTINSTALLMENTID, PAYMENTID, AMOUNT, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, APPLICATIONCURRENCYID, APPLICATIONEXCHANGERATEID)
select
newid(),
RECURRINGGIFTACTIVITY.ID, -- this is the ID of the installment created above
REVENUESPLIT.REVENUEID,
RECURRINGGIFTACTIVITY.AMOUNT,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE,
RECURRINGGIFTACTIVITY.APPLICATIONCURRENCYID,
RECURRINGGIFTACTIVITY.APPLICATIONEXCHANGERATEID --TODO: DON'T KNOW IF WE NEED THIS
from
dbo.RECURRINGGIFTACTIVITY
inner join dbo.REVENUESPLIT on REVENUESPLIT.ID = RECURRINGGIFTACTIVITY.PAYMENTREVENUEID
where
RECURRINGGIFTACTIVITY.SOURCEREVENUEID = @ID
and RECURRINGGIFTACTIVITY.TYPECODE = 0;
--------------------------------------------------------------------------------
-- create written-off installments for all skips
insert into dbo.RECURRINGGIFTINSTALLMENT
(ID, REVENUEID, AMOUNT, DATE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, BASECURRENCYID,ORGANIZATIONAMOUNT,ORGANIZATIONEXCHANGERATEID,TRANSACTIONAMOUNT,TRANSACTIONCURRENCYID,BASEEXCHANGERATEID)
select
newid(),
[SKIP].SOURCEREVENUEID,
case when REVENUE.BASEEXCHANGERATEID is not null
then dbo.UFN_CURRENCY_CONVERT([SKIP].AMOUNT, REVENUE.BASEEXCHANGERATEID)
else [SKIP].AMOUNT
end,
[SKIP].SCHEDULEDATE,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE,
REVENUE.BASECURRENCYID,
case when REVENUE.BASEEXCHANGERATEID is not null and REVENUE.ORGANIZATIONEXCHANGERATEID is not null
then dbo.UFN_CURRENCY_CONVERT(dbo.UFN_CURRENCY_CONVERT([SKIP].AMOUNT, REVENUE.BASEEXCHANGERATEID), REVENUE.ORGANIZATIONEXCHANGERATEID) -- convert from transaction to base to organization currency
when REVENUE.BASEEXCHANGERATEID is not null
then dbo.UFN_CURRENCY_CONVERT([SKIP].AMOUNT, REVENUE.BASEEXCHANGERATEID) -- org and base currencies are the same
when REVENUE.ORGANIZATIONEXCHANGERATEID is not null
then dbo.UFN_CURRENCY_CONVERT([SKIP].AMOUNT, REVENUE.ORGANIZATIONEXCHANGERATEID) -- transaction and base currencies are the same
else [SKIP].AMOUNT
end,
REVENUE.ORGANIZATIONEXCHANGERATEID,
[SKIP].AMOUNT,
REVENUE.TRANSACTIONCURRENCYID,
REVENUE.BASEEXCHANGERATEID
from
dbo.RECURRINGGIFTACTIVITY as [SKIP]
inner join dbo.REVENUESCHEDULE on REVENUESCHEDULE.ID = [SKIP].SOURCEREVENUEID
inner join dbo.REVENUE on [SKIP].SOURCEREVENUEID = REVENUE.ID
where
[SKIP].SOURCEREVENUEID = @ID
and [SKIP].TYPECODE = 1
-- ignore skips that are not earlier than the next transaction date, since they must have been rolled back
and [SKIP].SCHEDULEDATE < REVENUESCHEDULE.NEXTTRANSACTIONDATE
-- ignore skips that are later paid, since they must have been rolled back
-- only use the latest skip for a given scheduledate
and not exists
(
select 'x'
from
dbo.RECURRINGGIFTACTIVITY as [SUPERCEDE]
where
[SUPERCEDE].SOURCEREVENUEID = [SKIP].SOURCEREVENUEID
and [SUPERCEDE].SCHEDULEDATE = [SKIP].SCHEDULEDATE
and ([SUPERCEDE].TYPECODE = 0 or ([SUPERCEDE].TYPECODE = 1 and [SUPERCEDE].DATEADDED > [SKIP].DATEADDED))
);
--TODO: Add multicurrency fields when we address write-offs
insert into dbo.RECURRINGGIFTWRITEOFF
(ID, REVENUEID, DATE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
select
newid(),
[SKIP].SOURCEREVENUEID,
[SKIP].SCHEDULEDATE,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE
from
dbo.RECURRINGGIFTACTIVITY as [SKIP]
inner join dbo.REVENUESCHEDULE on REVENUESCHEDULE.ID = [SKIP].SOURCEREVENUEID
where
[SKIP].SOURCEREVENUEID = @ID
and [SKIP].TYPECODE = 1
and [SKIP].SCHEDULEDATE < REVENUESCHEDULE.NEXTTRANSACTIONDATE
and not exists
(
select 'x'
from
dbo.RECURRINGGIFTACTIVITY as [SUPERCEDE]
where
[SUPERCEDE].SOURCEREVENUEID = [SKIP].SOURCEREVENUEID
and [SUPERCEDE].SCHEDULEDATE = [SKIP].SCHEDULEDATE
and ([SUPERCEDE].TYPECODE = 0 or ([SUPERCEDE].TYPECODE = 1 and [SUPERCEDE].DATEADDED > [SKIP].DATEADDED))
);
insert into dbo.RECURRINGGIFTINSTALLMENTWRITEOFF
(ID, RECURRINGGIFTINSTALLMENTID, WRITEOFFID, AMOUNT, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
select
newid(),
RECURRINGGIFTINSTALLMENT.ID,
RECURRINGGIFTWRITEOFF.ID,
RECURRINGGIFTINSTALLMENT.AMOUNT,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE
from
dbo.RECURRINGGIFTINSTALLMENT
inner join dbo.RECURRINGGIFTWRITEOFF on RECURRINGGIFTWRITEOFF.REVENUEID = RECURRINGGIFTINSTALLMENT.REVENUEID and RECURRINGGIFTWRITEOFF.DATE = RECURRINGGIFTINSTALLMENT.DATE
where
RECURRINGGIFTINSTALLMENT.REVENUEID = @ID;
--------------------------------------------------------------------------------
-- create next installment
insert into dbo.RECURRINGGIFTINSTALLMENT
(ID, REVENUEID, AMOUNT, DATE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED, BASECURRENCYID,ORGANIZATIONAMOUNT,ORGANIZATIONEXCHANGERATEID,TRANSACTIONAMOUNT,TRANSACTIONCURRENCYID,BASEEXCHANGERATEID)
select
newid(),
REVENUE.ID,
REVENUE.AMOUNT,
REVENUESCHEDULE.NEXTTRANSACTIONDATE,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE,
REVENUE.BASECURRENCYID,
REVENUE.ORGANIZATIONAMOUNT,
REVENUE.ORGANIZATIONEXCHANGERATEID,
REVENUE.TRANSACTIONAMOUNT,
REVENUE.TRANSACTIONCURRENCYID,
REVENUE.BASEEXCHANGERATEID
from
dbo.REVENUE
inner join dbo.REVENUESCHEDULE on REVENUESCHEDULE.ID = REVENUE.ID
where
REVENUE.ID = @ID
and REVENUE.TRANSACTIONTYPECODE = 2
and REVENUESCHEDULE.STATUSCODE in (0,5)
and REVENUESCHEDULE.NEXTTRANSACTIONDATE is not null
and (REVENUESCHEDULE.ENDDATE is null or REVENUESCHEDULE.ENDDATE > REVENUESCHEDULE.NEXTTRANSACTIONDATE);
end try
begin catch
exec dbo.USP_RAISE_ERROR;
return 1;
end catch
return 0;
end