UFN_PLEDGE_GETREVALUEDSPLITBALANCES
Returns the unpaid balances for the 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_GETREVALUEDSPLITBALANCES
(
@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;
declare @DECIMALDIGITSBASECURRENCY int;
declare @DECIMALDIGITSORGANIZATIONCURRENCY int;
set @ORGANIZATIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
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 @DECIMALDIGITSBASECURRENCY = DECIMALDIGITS from dbo.CURRENCY where ID = @BASECURRENCYID;
select @DECIMALDIGITSORGANIZATIONCURRENCY = DECIMALDIGITS from dbo.CURRENCY where ID = @ORGANIZATIONCURRENCYID;
-- Get the total balance of the revenue in each currency.
declare @TRANSACTIONFULLAMOUNT money;
declare @BASEFULLAMOUNT money;
declare @ORGANIZATIONFULLAMOUNT money;
set @TRANSACTIONFULLAMOUNT = dbo.UFN_PLEDGE_GETBALANCEASOF(@PLEDGEID, @ASOFDATE);
set @BASEFULLAMOUNT = dbo.UFN_PLEDGE_GETREVALUEDBASEBALANCEASOF(@PLEDGEID, @ASOFDATE, @USEORIGINALRATE);
set @ORGANIZATIONFULLAMOUNT = dbo.UFN_PLEDGE_GETREVALUEDORGANIZATIONBALANCEASOF(@PLEDGEID, @ASOFDATE, @USEORIGINALRATE);
if (@TRANSACTIONCURRENCYID = @ORGANIZATIONCURRENCYID) and (@BASECURRENCYID = @ORGANIZATIONCURRENCYID)
begin
with CTE_BALANCE
as(
select
FINANCIALTRANSACTIONLINEITEM.ID,
case
when FINANCIALTRANSACTION.TYPECODE = 7
then --Auction donations do not have installments
FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT
- coalesce(
(select
sum(INSTALLMENTSPLITWRITEOFF.TRANSACTIONAMOUNT) as AMOUNT
from dbo.INSTALLMENTSPLIT
inner join dbo.INSTALLMENTSPLITWRITEOFF on INSTALLMENTSPLITWRITEOFF.INSTALLMENTSPLITID = INSTALLMENTSPLIT.ID
inner join dbo.WRITEOFF on INSTALLMENTSPLITWRITEOFF.WRITEOFFID = WRITEOFF.ID
where
INSTALLMENTSPLIT.PLEDGEID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
and INSTALLMENTSPLIT.DESIGNATIONID = REVENUESPLIT_EXT.DESIGNATIONID
and WRITEOFF.DATE <= @ASOFDATE)
, 0)
else
FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT - (
coalesce(
(select
sum(INSTALLMENTSPLITPAYMENT.AMOUNT)
from dbo.INSTALLMENTSPLITPAYMENT
inner join dbo.INSTALLMENTSPLIT on INSTALLMENTSPLITPAYMENT.INSTALLMENTSPLITID = INSTALLMENTSPLIT.ID
inner join dbo.FINANCIALTRANSACTIONLINEITEM as PAYMENTSPLIT on PAYMENTSPLIT.ID = INSTALLMENTSPLITPAYMENT.PAYMENTID
inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = PAYMENTSPLIT.FINANCIALTRANSACTIONID
where
INSTALLMENTSPLIT.PLEDGEID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
and INSTALLMENTSPLIT.DESIGNATIONID = REVENUESPLIT_EXT.DESIGNATIONID
and FINANCIALTRANSACTION.DATE <= @ASOFDATE)
, 0)
+ coalesce(
(select
sum(INSTALLMENTSPLITWRITEOFF.TRANSACTIONAMOUNT) as AMOUNT
from dbo.INSTALLMENTSPLIT
inner join dbo.INSTALLMENTSPLITWRITEOFF on INSTALLMENTSPLITWRITEOFF.INSTALLMENTSPLITID = INSTALLMENTSPLIT.ID
inner join dbo.WRITEOFF on INSTALLMENTSPLITWRITEOFF.WRITEOFFID = WRITEOFF.ID
where
INSTALLMENTSPLIT.PLEDGEID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
and INSTALLMENTSPLIT.DESIGNATIONID = REVENUESPLIT_EXT.DESIGNATIONID
and WRITEOFF.DATE <= @ASOFDATE)
, 0)
)
end as TRANSACTIONBALANCE
from dbo.FINANCIALTRANSACTIONLINEITEM
inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = FINANCIALTRANSACTIONLINEITEM.ID
inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @PLEDGEID
and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
and FINANCIALTRANSACTIONLINEITEM.TYPECODE = 0
)
insert into @BALANCE(
ID,
TRANSACTIONBALANCE,
BASEBALANCE,
ORGANIZATIONBALANCE
)
select
CTE_BALANCE.ID,
CTE_BALANCE.TRANSACTIONBALANCE,
CTE_BALANCE.TRANSACTIONBALANCE,
CTE_BALANCE.TRANSACTIONBALANCE
from CTE_BALANCE
end
else
begin
-- Convert the split balances proportionally, so they will add up to the total pledge
-- balance in each currency.
--Calculate the transaction balance on each split.
declare @SPLIT table(
ID uniqueidentifier,
SEQUENCE int,
TSLONG bigint,
TRANSACTIONBALANCE money
)
insert into @SPLIT(
ID,
SEQUENCE,
TSLONG,
TRANSACTIONBALANCE
)
select
FINANCIALTRANSACTIONLINEITEM.ID,
FINANCIALTRANSACTIONLINEITEM.SEQUENCE,
FINANCIALTRANSACTIONLINEITEM.TS,
case
when FINANCIALTRANSACTION.TYPECODE = 7
then --Auction donations do not have installments
FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT
- coalesce(
(select
sum(INSTALLMENTSPLITWRITEOFF.TRANSACTIONAMOUNT) as AMOUNT
from dbo.INSTALLMENTSPLIT
inner join dbo.INSTALLMENTSPLITWRITEOFF on INSTALLMENTSPLITWRITEOFF.INSTALLMENTSPLITID = INSTALLMENTSPLIT.ID
inner join dbo.WRITEOFF on INSTALLMENTSPLITWRITEOFF.WRITEOFFID = WRITEOFF.ID
where
INSTALLMENTSPLIT.PLEDGEID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
and INSTALLMENTSPLIT.DESIGNATIONID = REVENUESPLIT_EXT.DESIGNATIONID
and WRITEOFF.DATE <= @ASOFDATE)
, 0)
else
FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT - (
coalesce(
(select
sum(INSTALLMENTSPLITPAYMENT.AMOUNT)
from dbo.INSTALLMENTSPLITPAYMENT
inner join dbo.INSTALLMENTSPLIT on INSTALLMENTSPLITPAYMENT.INSTALLMENTSPLITID = INSTALLMENTSPLIT.ID
inner join dbo.FINANCIALTRANSACTIONLINEITEM as PAYMENTSPLIT on PAYMENTSPLIT.ID = INSTALLMENTSPLITPAYMENT.PAYMENTID
inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = PAYMENTSPLIT.FINANCIALTRANSACTIONID
where
INSTALLMENTSPLIT.PLEDGEID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
and INSTALLMENTSPLIT.DESIGNATIONID = REVENUESPLIT_EXT.DESIGNATIONID
and FINANCIALTRANSACTION.DATE <= @ASOFDATE)
, 0)
+ coalesce(
(select
sum(INSTALLMENTSPLITWRITEOFF.TRANSACTIONAMOUNT) as AMOUNT
from dbo.INSTALLMENTSPLIT
inner join dbo.INSTALLMENTSPLITWRITEOFF on INSTALLMENTSPLITWRITEOFF.INSTALLMENTSPLITID = INSTALLMENTSPLIT.ID
inner join dbo.WRITEOFF on INSTALLMENTSPLITWRITEOFF.WRITEOFFID = WRITEOFF.ID
where
INSTALLMENTSPLIT.PLEDGEID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
and INSTALLMENTSPLIT.DESIGNATIONID = REVENUESPLIT_EXT.DESIGNATIONID
and WRITEOFF.DATE <= @ASOFDATE)
, 0)
)
end as TRANSACTIONBALANCE
from dbo.FINANCIALTRANSACTIONLINEITEM
inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = FINANCIALTRANSACTIONLINEITEM.ID
inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @PLEDGEID
and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
and FINANCIALTRANSACTIONLINEITEM.TYPECODE = 0
--For any given split, calculate the summation of the amounts on all the splits previous to it.
-- We'll need that value both including and excluding the current split
declare @SPLITROLLUP table(
ID uniqueidentifier,
TRANSACTIONBALANCE money,
PREVIOUSTRANSACTIONRUNNINGTOTAL money,
TRANSACTIONRUNNINGTOTAL money
)
insert into @SPLITROLLUP(
ID,
TRANSACTIONBALANCE,
PREVIOUSTRANSACTIONRUNNINGTOTAL,
TRANSACTIONRUNNINGTOTAL
)
select
SPLIT.ID,
SPLIT.TRANSACTIONBALANCE,
coalesce(SUM(PREVIOUS.TRANSACTIONBALANCE),0)
- SPLIT.TRANSACTIONBALANCE
as PREVIOUSTRANSACTIONRUNNINGTOTAL,
coalesce(SUM(PREVIOUS.TRANSACTIONBALANCE),0) as TRANSACTIONRUNNINGTOTAL
from @SPLIT SPLIT
cross join @SPLIT PREVIOUS
where PREVIOUS.SEQUENCE <SPLIT.SEQUENCE
or(
PREVIOUS.SEQUENCE = SPLIT.SEQUENCE
and PREVIOUS.TSLONG <= SPLIT.TSLONG
)
group by
SPLIT.ID,
SPLIT.TRANSACTIONBALANCE
--Convert the summations calculated previously and take their difference to
-- to get the converted balance.
insert into @BALANCE(
ID,
TRANSACTIONBALANCE,
BASEBALANCE,
ORGANIZATIONBALANCE
)
select
SPLITROLLUP.ID,
SPLITROLLUP.TRANSACTIONBALANCE,
CURRENTRUNNINGTOTAL.BASEAMOUNT - PREVIOUSRUNNINGTOTAL.BASEAMOUNT BASEBALANCE,
CURRENTRUNNINGTOTAL.ORGANIZATIONAMOUNT - PREVIOUSRUNNINGTOTAL.ORGANIZATIONAMOUNT ORGANIZATIONBALANCE
from @SPLITROLLUP SPLITROLLUP
cross apply dbo.UFN_CURRENCY_GETCURRENCYVALUESBYPROPORTION(
SPLITROLLUP.TRANSACTIONRUNNINGTOTAL,
@TRANSACTIONFULLAMOUNT,
@BASECURRENCYID,
@BASEFULLAMOUNT,
@DECIMALDIGITSBASECURRENCY,
@TRANSACTIONCURRENCYID,
default,
@ORGANIZATIONCURRENCYID,
@ORGANIZATIONFULLAMOUNT,
@DECIMALDIGITSORGANIZATIONCURRENCY,
default
) CURRENTRUNNINGTOTAL
cross apply dbo.UFN_CURRENCY_GETCURRENCYVALUESBYPROPORTION(
SPLITROLLUP.PREVIOUSTRANSACTIONRUNNINGTOTAL,
@TRANSACTIONFULLAMOUNT,
@BASECURRENCYID,
@BASEFULLAMOUNT,
@DECIMALDIGITSBASECURRENCY,
@TRANSACTIONCURRENCYID,
default,
@ORGANIZATIONCURRENCYID,
@ORGANIZATIONFULLAMOUNT,
@DECIMALDIGITSORGANIZATIONCURRENCY,
default
) PREVIOUSRUNNINGTOTAL
end
return
end