UFN_PLEDGE_GETREVALUEDINSTALLMENTSPLITBALANCES
Returns the unpaid balances for the installment splits of a given pledge as of a given date.
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@PLEDGEID | uniqueidentifier | IN | |
@ASOFDATE | datetime | IN | |
@USEORIGINALRATE | bit | IN |
Definition
Copy
CREATE function dbo.UFN_PLEDGE_GETREVALUEDINSTALLMENTSPLITBALANCES
(
@PLEDGEID uniqueidentifier,
@ASOFDATE datetime,
@USEORIGINALRATE bit = 0
)
returns @BALANCE table (
ID uniqueidentifier,
TRANSACTIONBALANCE money,
BASEBALANCE money,
ORGANIZATIONBALANCE money
)
with execute as caller
as begin
declare @TRANSACTIONCURRENCYID uniqueidentifier;
declare @BASECURRENCYID uniqueidentifier;
declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
declare @BASEDECIMALDIGITS int;
declare @ORGANIZATIONDECIMALDIGITS int;
select
@TRANSACTIONCURRENCYID = FINANCIALTRANSACTION.TRANSACTIONCURRENCYID,
@BASECURRENCYID = CURRENCYSET.BASECURRENCYID
from dbo.FINANCIALTRANSACTION
inner join dbo.PDACCOUNTSYSTEM on FINANCIALTRANSACTION.PDACCOUNTSYSTEMID = PDACCOUNTSYSTEM.ID
inner join dbo.CURRENCYSET on PDACCOUNTSYSTEM.CURRENCYSETID = CURRENCYSET.ID
where FINANCIALTRANSACTION.ID = @PLEDGEID;
select @BASEDECIMALDIGITS = DECIMALDIGITS from dbo.CURRENCY where ID = @BASECURRENCYID;
select @ORGANIZATIONDECIMALDIGITS = DECIMALDIGITS from dbo.CURRENCY where ID = @ORGANIZATIONCURRENCYID;
--If all the currencies are the same, we can skip the conversions and just return transaction currency for all values.
if @TRANSACTIONCURRENCYID = @ORGANIZATIONCURRENCYID and @BASECURRENCYID = @ORGANIZATIONCURRENCYID
begin
with CTE_BALANCE
as(
select
INSTALLMENTSPLIT.ID,
INSTALLMENTSPLIT.TRANSACTIONAMOUNT - (
coalesce(
(select
sum(INSTALLMENTSPLITPAYMENT.AMOUNT)
from dbo.INSTALLMENTSPLITPAYMENT
inner join dbo.FINANCIALTRANSACTIONLINEITEM as PAYMENTSPLIT on PAYMENTSPLIT.ID = INSTALLMENTSPLITPAYMENT.PAYMENTID
inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = PAYMENTSPLIT.FINANCIALTRANSACTIONID
where INSTALLMENTSPLITPAYMENT.INSTALLMENTSPLITID = INSTALLMENTSPLIT.ID
and FINANCIALTRANSACTION.DATE <= @ASOFDATE)
, 0)
+ coalesce(
(select
sum(INSTALLMENTSPLITWRITEOFF.TRANSACTIONAMOUNT)
from dbo.INSTALLMENTSPLITWRITEOFF
inner join dbo.WRITEOFF on INSTALLMENTSPLITWRITEOFF.WRITEOFFID = WRITEOFF.ID
where INSTALLMENTSPLITWRITEOFF.INSTALLMENTSPLITID = INSTALLMENTSPLIT.ID
and WRITEOFF.DATE <= @ASOFDATE)
, 0)
) as TRANSACTIONBALANCE,
INSTALLMENTSPLIT.INSTALLMENTID
from dbo.INSTALLMENTSPLIT
where INSTALLMENTSPLIT.PLEDGEID = @PLEDGEID
)
insert into @BALANCE (
ID,
TRANSACTIONBALANCE,
BASEBALANCE,
ORGANIZATIONBALANCE
)
select
CTE_BALANCE.ID,
CTE_BALANCE.TRANSACTIONBALANCE,
CTE_BALANCE.TRANSACTIONBALANCE,
CTE_BALANCE.TRANSACTIONBALANCE
from CTE_BALANCE
inner join dbo.INSTALLMENT on INSTALLMENT.ID = CTE_BALANCE.INSTALLMENTID
end
else
begin
declare @DESIGNATIONAMOUNTLIST table
(
DESIGNATIONID uniqueidentifier,
SEQUENCE int,
TRANSACTIONBALANCE money,
BASEBALANCE money,
ORGANIZATIONBALANCE money,
TSLONG bigint
);
declare @INSTALLMENTAMOUNTLIST table
(
INSTALLMENTID uniqueidentifier,
SEQUENCE int,
TRANSACTIONBALANCE money,
BASEBALANCE money,
ORGANIZATIONBALANCE money,
TSLONG bigint
);
declare @INSTALLMENTMAX integer;
select
@INSTALLMENTMAX = max(SEQUENCE)
from
dbo.INSTALLMENT
where
INSTALLMENT.REVENUEID = @PLEDGEID;
--Get split information, including their total balances.
insert into @DESIGNATIONAMOUNTLIST(DESIGNATIONID, SEQUENCE, TRANSACTIONBALANCE, BASEBALANCE, ORGANIZATIONBALANCE, TSLONG)
select
REVENUESPLIT_EXT.DESIGNATIONID,
FINANCIALTRANSACTIONLINEITEM.SEQUENCE,
REVALUED.TRANSACTIONBALANCE,
REVALUED.BASEBALANCE,
REVALUED.ORGANIZATIONBALANCE,
FINANCIALTRANSACTIONLINEITEM.TSLONG
from
dbo.FINANCIALTRANSACTIONLINEITEM
inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = FINANCIALTRANSACTIONLINEITEM.ID
inner join dbo.UFN_PLEDGE_GETREVALUEDSPLITBALANCES(
@PLEDGEID,
@ASOFDATE,
@USEORIGINALRATE
) as REVALUED on REVALUED.ID = FINANCIALTRANSACTIONLINEITEM.ID
where
FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @PLEDGEID
and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
and FINANCIALTRANSACTIONLINEITEM.TYPECODE = 0;
--Get info for all the installments on the given pledge.
insert into @INSTALLMENTAMOUNTLIST(INSTALLMENTID, SEQUENCE, TRANSACTIONBALANCE, BASEBALANCE, ORGANIZATIONBALANCE, TSLONG)
select
INSTALLMENT.ID,
INSTALLMENT.SEQUENCE,
REVALUED.TRANSACTIONBALANCE,
REVALUED.BASEBALANCE,
REVALUED.ORGANIZATIONBALANCE,
INSTALLMENT.TSLONG
from
dbo.INSTALLMENT
inner join dbo.UFN_PLEDGE_GETREVALUEDINSTALLMENTBALANCES(
@PLEDGEID,
@ASOFDATE,
@USEORIGINALRATE
) as REVALUED on REVALUED.ID = INSTALLMENT.ID
where
INSTALLMENT.REVENUEID = @PLEDGEID;
--Join the installment and split lists to build out info on installment splits.
declare @INSTALLMENTSPLIT table(
INSTALLMENTID uniqueidentifier,
INSTALLMENTSEQUENCE int,
TRANSACTIONINSTALLMENTBALANCE money,
BASEINSTALLMENTBALANCE money,
ORGANIZATIONINSTALLMENTBALANCE money,
INSTALLMENTSPLITID uniqueidentifier,
TRANSACTIONBALANCE money,
DESIGNATIONID uniqueidentifier,
DESIGNATIONSEQUENCE int,
DESIGNATIONTSLONG bigint,
BASEDESIGNATIONBALANCE money,
ORGANIZATIONDESIGNATIONBALANCE money
)
insert into @INSTALLMENTSPLIT
select
INSTALLMENTLIST.INSTALLMENTID,
INSTALLMENTLIST.SEQUENCE INSTALLMENTSEQUENCE,
INSTALLMENTLIST.TRANSACTIONBALANCE as TRANSACTIONINSTALLMENTBALANCE,
INSTALLMENTLIST.BASEBALANCE as BASEINSTALLMENTBALANCE,
INSTALLMENTLIST.ORGANIZATIONBALANCE as ORGANIZATIONINSTALLMENTBALANCE,
INSTALLMENTSPLIT.ID as INSTALLMENTSPLITID,
INSTALLMENTSPLIT.TRANSACTIONAMOUNT - (
coalesce(
(select
sum(INSTALLMENTSPLITPAYMENT.AMOUNT)
from dbo.INSTALLMENTSPLITPAYMENT
inner join dbo.FINANCIALTRANSACTIONLINEITEM as PAYMENTSPLIT on PAYMENTSPLIT.ID = INSTALLMENTSPLITPAYMENT.PAYMENTID
inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = PAYMENTSPLIT.FINANCIALTRANSACTIONID
where INSTALLMENTSPLITPAYMENT.INSTALLMENTSPLITID = INSTALLMENTSPLIT.ID
and FINANCIALTRANSACTION.DATE <= @ASOFDATE)
, 0)
+ coalesce(
(select
sum(INSTALLMENTSPLITWRITEOFF.TRANSACTIONAMOUNT)
from dbo.INSTALLMENTSPLITWRITEOFF
inner join dbo.WRITEOFF on INSTALLMENTSPLITWRITEOFF.WRITEOFFID = WRITEOFF.ID
where INSTALLMENTSPLITWRITEOFF.INSTALLMENTSPLITID = INSTALLMENTSPLIT.ID
and WRITEOFF.DATE <= @ASOFDATE)
, 0)
) as TRANSACTIONBALANCE,
DESIGNATIONLIST.DESIGNATIONID,
DESIGNATIONLIST.SEQUENCE as DESIGNATIONSEQUENCE,
DESIGNATIONLIST.TSLONG as DESIGNATIONTSLONG,
DESIGNATIONLIST.BASEBALANCE as BASEDESIGNATIONBALANCE,
DESIGNATIONLIST.ORGANIZATIONBALANCE as ORGANIZATIONDESIGNATIONBALANCE
from @INSTALLMENTAMOUNTLIST INSTALLMENTLIST
inner join dbo.INSTALLMENTSPLIT on INSTALLMENTLIST.INSTALLMENTID = INSTALLMENTSPLIT.INSTALLMENTID
inner join @DESIGNATIONAMOUNTLIST DESIGNATIONLIST on DESIGNATIONLIST.DESIGNATIONID = INSTALLMENTSPLIT.DESIGNATIONID
--For each included installment split, calculate rollups of all previous installments splits
-- that share the installment, when ordered by split. We'll need rollups both including and excluding
-- the current installment splits.
declare @INSTALLMENTROLLUP table(
INSTALLMENTID uniqueidentifier,
INSTALLMENTSEQUENCE bigint,
TRANSACTIONINSTALLMENTBALANCE money,
BASEINSTALLMENTBALANCE money,
ORGANIZATIONINSTALLMENTBALANCE money,
DESIGNATIONID uniqueidentifier,
INSTALLMENTSPLITID uniqueidentifier,
TRANSACTIONBALANCE money,
PREVIOUSTRANSACTIONRUNNINGTOTAL money,
TRANSACTIONRUNNINGTOTAL money
)
insert into @INSTALLMENTROLLUP
select
CURRENTINSTALLMENTSPLIT.INSTALLMENTID,
CURRENTINSTALLMENTSPLIT.INSTALLMENTSEQUENCE,
CURRENTINSTALLMENTSPLIT.TRANSACTIONINSTALLMENTBALANCE,
CURRENTINSTALLMENTSPLIT.BASEINSTALLMENTBALANCE,
CURRENTINSTALLMENTSPLIT.ORGANIZATIONINSTALLMENTBALANCE,
CURRENTINSTALLMENTSPLIT.DESIGNATIONID,
CURRENTINSTALLMENTSPLIT.INSTALLMENTSPLITID,
CURRENTINSTALLMENTSPLIT.TRANSACTIONBALANCE,
coalesce(SUM(PREVIOUSINSTALLMENTSPLIT.TRANSACTIONBALANCE),0)
- CURRENTINSTALLMENTSPLIT.TRANSACTIONBALANCE PREVIOUSTRANSACTIONRUNNINGTOTAL,
coalesce(SUM(PREVIOUSINSTALLMENTSPLIT.TRANSACTIONBALANCE),0) TRANSACTIONRUNNINGTOTAL
from @INSTALLMENTSPLIT CURRENTINSTALLMENTSPLIT
cross join @INSTALLMENTSPLIT PREVIOUSINSTALLMENTSPLIT
where PREVIOUSINSTALLMENTSPLIT.INSTALLMENTID = CURRENTINSTALLMENTSPLIT.INSTALLMENTID
and(
PREVIOUSINSTALLMENTSPLIT.DESIGNATIONSEQUENCE < CURRENTINSTALLMENTSPLIT.DESIGNATIONSEQUENCE
or(
PREVIOUSINSTALLMENTSPLIT.DESIGNATIONSEQUENCE = CURRENTINSTALLMENTSPLIT.DESIGNATIONSEQUENCE
and PREVIOUSINSTALLMENTSPLIT.DESIGNATIONTSLONG <= CURRENTINSTALLMENTSPLIT.DESIGNATIONTSLONG
)
)
group by
CURRENTINSTALLMENTSPLIT.INSTALLMENTID,
CURRENTINSTALLMENTSPLIT.INSTALLMENTSEQUENCE,
CURRENTINSTALLMENTSPLIT.TRANSACTIONINSTALLMENTBALANCE,
CURRENTINSTALLMENTSPLIT.BASEINSTALLMENTBALANCE,
CURRENTINSTALLMENTSPLIT.ORGANIZATIONINSTALLMENTBALANCE,
CURRENTINSTALLMENTSPLIT.DESIGNATIONID,
CURRENTINSTALLMENTSPLIT.INSTALLMENTSPLITID,
CURRENTINSTALLMENTSPLIT.TRANSACTIONBALANCE
--Calculate the balances on the installment splits
declare @INTERMEDIATEBALANCE table(
INSTALLMENTSPLITID uniqueidentifier,
INSTALLMENTSEQUENCE bigint,
DESIGNATIONID uniqueidentifier,
TRANSACTIONBALANCE money,
BASEBALANCE money,
ORGANIZATIONBALANCE money
)
insert into @INTERMEDIATEBALANCE
--For all installments but the last, we convert by proportion the calculated rollups
-- and take their difference to get the balance for each installment split.
select
INSTALLMENTSPLITID,
INSTALLMENTROLLUP.INSTALLMENTSEQUENCE,
INSTALLMENTROLLUP.DESIGNATIONID,
INSTALLMENTROLLUP.TRANSACTIONBALANCE,
CURRENTRUNNINGTOTAL.BASEAMOUNT - PREVIOUSRUNNINGTOTAL.BASEAMOUNT BASEBALANCE,
CURRENTRUNNINGTOTAL.ORGANIZATIONAMOUNT - PREVIOUSRUNNINGTOTAL.ORGANIZATIONAMOUNT ORGANIZATIONBALANCE
from @INSTALLMENTROLLUP INSTALLMENTROLLUP
cross apply dbo.UFN_CURRENCY_GETCURRENCYVALUESBYPROPORTION(
INSTALLMENTROLLUP.TRANSACTIONRUNNINGTOTAL,
INSTALLMENTROLLUP.TRANSACTIONINSTALLMENTBALANCE,
@BASECURRENCYID,
INSTALLMENTROLLUP.BASEINSTALLMENTBALANCE,
@BASEDECIMALDIGITS,
@TRANSACTIONCURRENCYID,
default,
@ORGANIZATIONCURRENCYID,
INSTALLMENTROLLUP.ORGANIZATIONINSTALLMENTBALANCE,
@ORGANIZATIONDECIMALDIGITS,
default
) CURRENTRUNNINGTOTAL
cross apply dbo.UFN_CURRENCY_GETCURRENCYVALUESBYPROPORTION(
INSTALLMENTROLLUP.PREVIOUSTRANSACTIONRUNNINGTOTAL,
INSTALLMENTROLLUP.TRANSACTIONINSTALLMENTBALANCE,
@BASECURRENCYID,
INSTALLMENTROLLUP.BASEINSTALLMENTBALANCE,
@BASEDECIMALDIGITS,
@TRANSACTIONCURRENCYID,
default,
@ORGANIZATIONCURRENCYID,
INSTALLMENTROLLUP.ORGANIZATIONINSTALLMENTBALANCE,
@ORGANIZATIONDECIMALDIGITS,
default
) PREVIOUSRUNNINGTOTAL
where INSTALLMENTROLLUP.INSTALLMENTSEQUENCE < @INSTALLMENTMAX
--For the installment that is the last on the pledge, include a row in the table, but don't calculate anything yet.
union
select
INSTALLMENTSPLITID,
INSTALLMENTROLLUP.INSTALLMENTSEQUENCE,
INSTALLMENTROLLUP.DESIGNATIONID,
INSTALLMENTROLLUP.TRANSACTIONBALANCE,
0 BASEBALANCE,
0 ORGANIZATIONBALANCE
from @INSTALLMENTROLLUP INSTALLMENTROLLUP
where INSTALLMENTROLLUP.INSTALLMENTSEQUENCE = @INSTALLMENTMAX
--Pump balances for all but the last installment into the output table.
insert into @BALANCE(ID, TRANSACTIONBALANCE, BASEBALANCE, ORGANIZATIONBALANCE)
select
INTERMEDIATEBALANCE.INSTALLMENTSPLITID,
INTERMEDIATEBALANCE.TRANSACTIONBALANCE,
INTERMEDIATEBALANCE.BASEBALANCE,
INTERMEDIATEBALANCE.ORGANIZATIONBALANCE
from @INTERMEDIATEBALANCE INTERMEDIATEBALANCE
where INTERMEDIATEBALANCE.INSTALLMENTSEQUENCE < @INSTALLMENTMAX;
--For each split, calculate the total converted balances of the installment splits within it. Then,
-- subtract that from the split total balance to get the balances for the installment splits of
-- the last installment
with CTE_SPLITROLLUP
as(
select
INTERMEDIATEBALANCE.DESIGNATIONID,
sum(INTERMEDIATEBALANCE.BASEBALANCE) BASEROLLUP,
sum(INTERMEDIATEBALANCE.ORGANIZATIONBALANCE) ORGANIZATIONROLLUP
from @INTERMEDIATEBALANCE INTERMEDIATEBALANCE
group by INTERMEDIATEBALANCE.DESIGNATIONID
)
insert into @BALANCE(ID, TRANSACTIONBALANCE, BASEBALANCE, ORGANIZATIONBALANCE)
select
INSTALLMENTSPLIT.INSTALLMENTSPLITID,
INSTALLMENTSPLIT.TRANSACTIONBALANCE,
INSTALLMENTSPLIT.BASEDESIGNATIONBALANCE - CTE_SPLITROLLUP.BASEROLLUP,
INSTALLMENTSPLIT.ORGANIZATIONDESIGNATIONBALANCE - CTE_SPLITROLLUP.ORGANIZATIONROLLUP
from @INSTALLMENTSPLIT INSTALLMENTSPLIT
inner join CTE_SPLITROLLUP on CTE_SPLITROLLUP.DESIGNATIONID = INSTALLMENTSPLIT.DESIGNATIONID
where INSTALLMENTSPLIT.INSTALLMENTSEQUENCE = @INSTALLMENTMAX
end
return
end