UFN_PLEDGE_GETREVALUEDINSTALLMENTSPLITBALANCES_INDATERANGE
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@PLEDGEID | uniqueidentifier | IN | |
@ASOFDATE | datetime | IN | |
@USEORIGINALRATE | bit | IN | |
@STARTDATE | datetime | IN | |
@ENDDATE | datetime | IN |
Definition
Copy
CREATE function dbo.UFN_PLEDGE_GETREVALUEDINSTALLMENTSPLITBALANCES_INDATERANGE(
@PLEDGEID uniqueidentifier,
@ASOFDATE datetime,
@USEORIGINALRATE bit = 0,
@STARTDATE datetime = null,
@ENDDATE datetime = null
)
returns @BALANCE table (
ID uniqueidentifier,
TRANSACTIONBALANCE money,
BASEBALANCE money,
ORGANIZATIONBALANCE money,
DATE datetime,
DESIGNATIONID uniqueidentifier
)
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,
INSTALLMENTSPLIT.DESIGNATIONID
from dbo.INSTALLMENTSPLIT
where INSTALLMENTSPLIT.PLEDGEID = @PLEDGEID
)
insert into @BALANCE (
ID,
TRANSACTIONBALANCE,
BASEBALANCE,
ORGANIZATIONBALANCE,
DATE,
DESIGNATIONID
)
select
CTE_BALANCE.ID,
CTE_BALANCE.TRANSACTIONBALANCE,
CTE_BALANCE.TRANSACTIONBALANCE,
CTE_BALANCE.TRANSACTIONBALANCE,
INSTALLMENT.DATE,
CTE_BALANCE.DESIGNATIONID
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,
DATE datetime,
TSLONG bigint
);
declare @INSTALLMENTMAX integer;
select @INSTALLMENTMAX = max(SEQUENCE)
from dbo.INSTALLMENT where INSTALLMENT.REVENUEID = @PLEDGEID;
--Finding the date of the max installment will let us be smart about how much math to do.
declare @INSTALLMENTMAXDATE datetime
select @INSTALLMENTMAXDATE = DATE
from dbo.INSTALLMENT
where INSTALLMENT.REVENUEID = @PLEDGEID
and INSTALLMENT.SEQUENCE = @INSTALLMENTMAX;
--If we have a start date and it is after the revenue's last installment, don't do anything.
if @STARTDATE is not null and @INSTALLMENTMAXDATE < @STARTDATE
begin
return
end
else
begin
--If the last installment falls inside out date range, our math is more complicated,
-- so we need different values to work with
if @ENDDATE is not null and @INSTALLMENTMAXDATE <= @ENDDATE
begin
--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, DATE, TSLONG)
select
INSTALLMENT.ID,
INSTALLMENT.SEQUENCE,
REVALUED.TRANSACTIONBALANCE,
REVALUED.BASEBALANCE,
REVALUED.ORGANIZATIONBALANCE,
INSTALLMENT.DATE,
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;
end
else
begin
--If the date range doesn't include the last installment on the pledge...
--Get split info, sans balances.
insert into @DESIGNATIONAMOUNTLIST(DESIGNATIONID, SEQUENCE, TRANSACTIONBALANCE, BASEBALANCE, ORGANIZATIONBALANCE, TSLONG)
select
REVENUESPLIT_EXT.DESIGNATIONID,
FINANCIALTRANSACTIONLINEITEM.SEQUENCE,
0,
0,
0,
FINANCIALTRANSACTIONLINEITEM.TSLONG
from dbo.FINANCIALTRANSACTIONLINEITEM
inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = FINANCIALTRANSACTIONLINEITEM.ID
where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @PLEDGEID
and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
and FINANCIALTRANSACTIONLINEITEM.TYPECODE = 0;
--Get installment info for up to the end of our date range.
insert into @INSTALLMENTAMOUNTLIST(INSTALLMENTID, SEQUENCE, TRANSACTIONBALANCE, BASEBALANCE, ORGANIZATIONBALANCE, DATE, TSLONG)
select
INSTALLMENT.ID,
INSTALLMENT.SEQUENCE,
REVALUED.TRANSACTIONBALANCE,
REVALUED.BASEBALANCE,
REVALUED.ORGANIZATIONBALANCE,
INSTALLMENT.DATE,
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
and(INSTALLMENT.DATE <= @ENDDATE
or @ENDDATE is null
)
end
end
--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,
DATE datetime,
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,
INSTALLMENTLIST.DATE,
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,
DATE datetime,
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.DATE,
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
)
)
and(@INSTALLMENTMAXDATE <= @ENDDATE
or @ENDDATE is null
or @STARTDATE is null
or CURRENTINSTALLMENTSPLIT.DATE >=@STARTDATE
)
group by
CURRENTINSTALLMENTSPLIT.INSTALLMENTID,
CURRENTINSTALLMENTSPLIT.INSTALLMENTSEQUENCE,
CURRENTINSTALLMENTSPLIT.TRANSACTIONINSTALLMENTBALANCE,
CURRENTINSTALLMENTSPLIT.BASEINSTALLMENTBALANCE,
CURRENTINSTALLMENTSPLIT.ORGANIZATIONINSTALLMENTBALANCE,
CURRENTINSTALLMENTSPLIT.DESIGNATIONID,
CURRENTINSTALLMENTSPLIT.INSTALLMENTSPLITID,
CURRENTINSTALLMENTSPLIT.DATE,
CURRENTINSTALLMENTSPLIT.TRANSACTIONBALANCE
--Calculate the balances on the installment splits
declare @INTERMEDIATEBALANCE table(
INSTALLMENTSPLITID uniqueidentifier,
INSTALLMENTSEQUENCE bigint,
DATE datetime,
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.DATE,
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.DATE,
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, DATE, TRANSACTIONBALANCE, BASEBALANCE, ORGANIZATIONBALANCE, DESIGNATIONID)
select
INTERMEDIATEBALANCE.INSTALLMENTSPLITID,
INTERMEDIATEBALANCE.DATE,
INTERMEDIATEBALANCE.TRANSACTIONBALANCE,
INTERMEDIATEBALANCE.BASEBALANCE,
INTERMEDIATEBALANCE.ORGANIZATIONBALANCE,
INTERMEDIATEBALANCE.DESIGNATIONID
from @INTERMEDIATEBALANCE INTERMEDIATEBALANCE
where INTERMEDIATEBALANCE.INSTALLMENTSEQUENCE < @INSTALLMENTMAX
--If our date range includes the last installment...
if @ENDDATE is not null and @INSTALLMENTMAXDATE <= @ENDDATE
begin
--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, DATE, TRANSACTIONBALANCE, BASEBALANCE, ORGANIZATIONBALANCE, DESIGNATIONID)
select
INSTALLMENTSPLIT.INSTALLMENTSPLITID,
INSTALLMENTSPLIT.DATE,
INSTALLMENTSPLIT.TRANSACTIONBALANCE,
INSTALLMENTSPLIT.BASEDESIGNATIONBALANCE - CTE_SPLITROLLUP.BASEROLLUP,
INSTALLMENTSPLIT.ORGANIZATIONDESIGNATIONBALANCE - CTE_SPLITROLLUP.ORGANIZATIONROLLUP,
INSTALLMENTSPLIT.DESIGNATIONID
from @INSTALLMENTSPLIT INSTALLMENTSPLIT
inner join CTE_SPLITROLLUP on CTE_SPLITROLLUP.DESIGNATIONID = INSTALLMENTSPLIT.DESIGNATIONID
where INSTALLMENTSPLIT.INSTALLMENTSEQUENCE = @INSTALLMENTMAX
end
end
return
end