UFN_RECURRINGGIFTINSTALLMENTACTIVITY
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | IN |
Definition
Copy
CREATE function dbo.UFN_RECURRINGGIFTINSTALLMENTACTIVITY(@ID uniqueidentifier)
returns @ACTIVITY table
(DATE date,
ACTIVITY nvarchar(100),
AMOUNT money,
BALANCE money,
DETAILS nvarchar(500),
CURRENCYID uniqueidentifier,
SEQUENCE smallint,
ID uniqueidentifier,
TYPECODE tinyint)
as
begin
declare @ORIGINALAMOUNT money;
select @ORIGINALAMOUNT = OLDAMOUNT
from dbo.RECURRINGGIFTINSTALLMENTEVENT
where RECURRINGGIFTINSTALLMENTID = @ID
and EVENTCODE = 4;
with CTE as (
-- Expected
select DATE,
'Expected' ACTIVITY,
0 AMOUNT,
isnull(@ORIGINALAMOUNT,TRANSACTIONAMOUNT) BALANCE,
null DETAILS,
TRANSACTIONCURRENCYID CURRENCYID,
null DATEADDED,
ID,
0 TYPECODE
from dbo.RECURRINGGIFTINSTALLMENT
where ID = @ID
union all
-- Past due
select cast(PASTDUEDATE as date),
'Past due',
0 AMOUNT,
isnull(@ORIGINALAMOUNT,TRANSACTIONAMOUNT) BALANCE, -- the correct balance will be determined below
null,
TRANSACTIONCURRENCYID CURRENCYID,
PASTDUEDATE DATEADDED,
ID,
1
from dbo.RECURRINGGIFTINSTALLMENT
where ID = @ID
and PASTDUEDATE is not null -- PASTDUEDATE will be filled in if the installment is or ever was Past due
union all
-- payments
select FINANCIALTRANSACTION.DATE,
'Payment',
RECURRINGGIFTINSTALLMENTPAYMENT.AMOUNT,
isnull(@ORIGINALAMOUNT,RECURRINGGIFTINSTALLMENT.TRANSACTIONAMOUNT), -- the correct balance will be determined below
isnull(case REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE
when 1 then case when nullif(CHECKPAYMENTMETHODDETAIL.CHECKNUMBER,'') is null then null else 'Check no. ' + CHECKPAYMENTMETHODDETAIL.CHECKNUMBER end --check
when 2 then case when nullif(CREDITCARDPAYMENTMETHODDETAIL.AUTHORIZATIONCODE,'') is null then null else CREDITCARDPAYMENTMETHODDETAIL.AUTHORIZATIONCODE + ' - Authorized' end --CC
end,REVENUEPAYMENTMETHOD.PAYMENTMETHOD),
RECURRINGGIFTINSTALLMENTPAYMENT.APPLICATIONCURRENCYID,
RECURRINGGIFTINSTALLMENTPAYMENT.DATEADDED,
RECURRINGGIFTINSTALLMENTPAYMENT.PAYMENTID,
2
from dbo.RECURRINGGIFTINSTALLMENTPAYMENT
inner join dbo.RECURRINGGIFTINSTALLMENT on RECURRINGGIFTINSTALLMENT.ID = RECURRINGGIFTINSTALLMENTPAYMENT.RECURRINGGIFTINSTALLMENTID
left join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = RECURRINGGIFTINSTALLMENTPAYMENT.PAYMENTID
left join dbo.REVENUEPAYMENTMETHOD on REVENUEPAYMENTMETHOD.REVENUEID = RECURRINGGIFTINSTALLMENTPAYMENT.PAYMENTID
left join dbo.CHECKPAYMENTMETHODDETAIL on CHECKPAYMENTMETHODDETAIL.ID = REVENUEPAYMENTMETHOD.ID
left join dbo.CREDITCARDPAYMENTMETHODDETAIL on CREDITCARDPAYMENTMETHODDETAIL.ID = REVENUEPAYMENTMETHOD.ID
where RECURRINGGIFTINSTALLMENT.ID = @ID
union all
-- skips/writeoffs
select RECURRINGGIFTWRITEOFF.DATE,
RECURRINGGIFTWRITEOFF.TYPE,
RECURRINGGIFTINSTALLMENTWRITEOFF.TRANSACTIONAMOUNT,
isnull(@ORIGINALAMOUNT,RECURRINGGIFTINSTALLMENT.TRANSACTIONAMOUNT), -- the correct balance will be determined below
case when RECURRINGGIFTWRITEOFF.REASONTYPECODE = 0 then
case when RECURRINGGIFTWRITEOFF.TYPECODE = 0 then WRITEOFFREASONCODE.DESCRIPTION
when RECURRINGGIFTWRITEOFF.TYPECODE = 1 then RECURRINGGIFTSTATUSREASONCODE.DESCRIPTION end
else RECURRINGGIFTWRITEOFF.REASONTYPE end,
RECURRINGGIFTINSTALLMENTWRITEOFF.TRANSACTIONCURRENCYID,
RECURRINGGIFTINSTALLMENTWRITEOFF.DATEADDED,
RECURRINGGIFTINSTALLMENTWRITEOFF.ID,
case RECURRINGGIFTWRITEOFF.TYPECODE when 0 then 3 else 4 end
from dbo.RECURRINGGIFTINSTALLMENTWRITEOFF
inner join dbo.RECURRINGGIFTINSTALLMENT on RECURRINGGIFTINSTALLMENT.ID = RECURRINGGIFTINSTALLMENTWRITEOFF.RECURRINGGIFTINSTALLMENTID
inner join dbo.RECURRINGGIFTWRITEOFF on RECURRINGGIFTWRITEOFF.ID = RECURRINGGIFTINSTALLMENTWRITEOFF.WRITEOFFID
left join dbo.WRITEOFFREASONCODE on WRITEOFFREASONCODE.ID = RECURRINGGIFTWRITEOFF.REASONCODEID
left join dbo.RECURRINGGIFTSTATUSREASONCODE on RECURRINGGIFTSTATUSREASONCODE.ID = RECURRINGGIFTWRITEOFF.SKIPREASONCODEID
where RECURRINGGIFTINSTALLMENT.ID = @ID
union all
-- installment events
select E.DATE,
case E.EVENTCODE when 4 then replace(E.EVENT,'changed',case when AMOUNTCHANGE > 0 then 'increased' else 'decreased' end) else E.EVENT end,
case E.EVENTCODE when 4 then -1*E.AMOUNTCHANGE else 0 end AMOUNT,
isnull(@ORIGINALAMOUNT,I.TRANSACTIONAMOUNT) BALANCE,
case E.EVENTCODE when 0 then E.PROCESSNAME when 1 then E.RESULTCODE + ' - Authorized' when 2 then E.REJECTIONMESSAGE when 3 then E.RESULTCODE when 4 then 'Recurring gift payment handling' end,
isnull(E.CURRENCYID,I.TRANSACTIONCURRENCYID) CURRENCYID,
E.DATEADDED,
E.ID,
case E.EVENTCODE when 0 then 5 when 1 then 6 when 2 then 7 when 3 then 8 else 9 end
from dbo.RECURRINGGIFTINSTALLMENT I
inner join dbo.RECURRINGGIFTINSTALLMENTEVENT E on E.RECURRINGGIFTINSTALLMENTID = I.ID
where I.ID = @ID
)
insert into @ACTIVITY
(DATE,
ACTIVITY,
AMOUNT,
BALANCE,
DETAILS,
CURRENCYID,
SEQUENCE,
ID,
TYPECODE)
select DATE,
ACTIVITY,
AMOUNT,
BALANCE,
DETAILS,
CURRENCYID,
row_number() over(order by DATE, case TYPECODE when 9 then 2 else 1 end, DATEADDED, case TYPECODE when 3 then 2 else 1 end),
ID,
TYPECODE
from CTE;
-- Determine the running balance for each line.
-- Subtract the appropriate amount if it's a payment or write-off.
-- Set the balance to 0 for skips.
update a
set BALANCE = BALANCE -
(SELECT top 1 AMOUNT from
(select isnull(sum(b.AMOUNT),0) AMOUNT, 3 TYPE from @ACTIVITY b where b.SEQUENCE <= a.SEQUENCE and b.TYPECODE in(2,3,9)
union all
select a.BALANCE, 2 from @ACTIVITY b where b.SEQUENCE <= a.SEQUENCE and b.TYPECODE = 4) X
order by X.TYPE)
from @ACTIVITY a;
-- Remove Expected and Past due lines if the balance was already $0 at the time of those events.
delete from @ACTIVITY
where TYPECODE in(0,1)
and BALANCE = 0;
-- Set Details for Past due to the most recent CC/DD rejection code/message.
update @ACTIVITY
set DETAILS = (select top 1 DETAILS from @ACTIVITY where TYPECODE in(7,8) order by DATE desc)
where TYPECODE = 1;
-- Show amount adjustments as a positive number. We needed it signed for determining the balance above.
update @ACTIVITY
set AMOUNT = abs(AMOUNT)
where TYPECODE = 9
and AMOUNT < 0;
return;
end;