UFN_PLEDGE_GETREVALUEDINSTALLMENTBALANCES

Returns the unpaid balances for the installments 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_GETREVALUEDINSTALLMENTBALANCES
(
    @PLEDGEID uniqueidentifier,
    @ASOFDATE datetime,
    @USEORIGINALRATE bit = 0

returns @BALANCE table (
    ID uniqueidentifier,
    TRANSACTIONBALANCE money,
    BASEBALANCE money,
    ORGANIZATIONBALANCE money
)
with execute as caller
as begin

    -- Get currency data in preparation for conversion.


    declare @TRANSACTIONCURRENCYID uniqueidentifier;
    declare @BASECURRENCYID uniqueidentifier;
    declare @ORGANIZATIONCURRENCYID uniqueidentifier;

    set @ORGANIZATIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();

    select
        @TRANSACTIONCURRENCYID = TRANSACTIONCURRENCYID,
        @BASECURRENCYID = isnull(REVENUE_EXT.NONPOSTABLEBASECURRENCYID, V.BASECURRENCYID)
    from dbo.FINANCIALTRANSACTION REVENUE
    inner join dbo.REVENUE_EXT on REVENUE.ID = REVENUE_EXT.ID
    left outer join dbo.V_BASECURRENCYFORFINANCIALTRANSACTION_I V with (noexpand) on REVENUE.ID = V.FINANCIALTRANSACTIONID
    where REVENUE.ID = @PLEDGEID
        and REVENUE.DELETEDON is null;

    -- Short-circuit single-currency evaluation.


    if (@TRANSACTIONCURRENCYID = @ORGANIZATIONCURRENCYID) and (@BASECURRENCYID = @ORGANIZATIONCURRENCYID)
    begin
        with CTE_BALANCE
        as(
            select
                INSTALLMENT.ID,
                INSTALLMENT.TRANSACTIONAMOUNT - (
                    coalesce((
                        select sum(INSTALLMENTPAYMENT.AMOUNT)
                        from dbo.INSTALLMENTPAYMENT
                            inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.ID = INSTALLMENTPAYMENT.PAYMENTID
                            inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
                        where INSTALLMENTPAYMENT.INSTALLMENTID = INSTALLMENT.ID
                            and FINANCIALTRANSACTION.DATE <= @ASOFDATE), 0
                    )
                    + coalesce((
                        select sum(INSTALLMENTWRITEOFF.TRANSACTIONAMOUNT)
                        from dbo.INSTALLMENTWRITEOFF
                            inner join dbo.WRITEOFF on INSTALLMENTWRITEOFF.WRITEOFFID = WRITEOFF.ID
                        where INSTALLMENTWRITEOFF.INSTALLMENTID = INSTALLMENT.ID
                            and WRITEOFF.DATE <= @ASOFDATE), 0
                    )
                ) as AMOUNT
            from dbo.INSTALLMENT 
            where INSTALLMENT.REVENUEID = @PLEDGEID
        )
        insert into @BALANCE(
            ID,
            TRANSACTIONBALANCE,
            BASEBALANCE,
            ORGANIZATIONBALANCE
        )
        select
            CTE_BALANCE.ID,
            CTE_BALANCE.AMOUNT,
            CTE_BALANCE.AMOUNT,
            CTE_BALANCE.AMOUNT
        from CTE_BALANCE            
    end
    else
    begin

        declare @TRANSACTIONFULLAMOUNT money = dbo.UFN_PLEDGE_GETBALANCEASOF(@PLEDGEID, @ASOFDATE);
        declare @BASEFULLAMOUNT money  = dbo.UFN_PLEDGE_GETREVALUEDBASEBALANCEASOF(@PLEDGEID, @ASOFDATE, @USEORIGINALRATE);
        declare @ORGANIZATIONFULLAMOUNT money  = dbo.UFN_PLEDGE_GETREVALUEDORGANIZATIONBALANCEASOF(@PLEDGEID, @ASOFDATE, @USEORIGINALRATE);

        declare @BASECURRENCYDECIMALDIGITS int
        select @BASECURRENCYDECIMALDIGITS = CURRENCY.DECIMALDIGITS
        from dbo.CURRENCY
        where CURRENCY.ID = @BASECURRENCYID 

        declare @ORGANIZATIONCURRENCYDECIMALDIGITS int
        select @ORGANIZATIONCURRENCYDECIMALDIGITS = CURRENCY.DECIMALDIGITS
        from dbo.CURRENCY
        where CURRENCY.ID = @ORGANIZATIONCURRENCYID

        -- Convert the split balances proportionally, so they will add up to the total pledge

        -- balance in each currency.


        --Calculate the transaction balance on each installment.

        declare @INSTALLMENT table(
            ID uniqueidentifier,
            SEQUENCE int,
            TSLONG bigint,
            TRANSACTIONBALANCE money
        )        
        insert into @INSTALLMENT(
            ID,
            SEQUENCE,
            TSLONG,
            TRANSACTIONBALANCE
        )        
        select
            INSTALLMENT.ID,
            INSTALLMENT.SEQUENCE,
            INSTALLMENT.TSLONG,
            INSTALLMENT.TRANSACTIONAMOUNT - (
                coalesce((
                    select sum(INSTALLMENTPAYMENT.AMOUNT)
                    from dbo.INSTALLMENTPAYMENT
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.ID = INSTALLMENTPAYMENT.PAYMENTID
                        inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
                    where INSTALLMENTPAYMENT.INSTALLMENTID = INSTALLMENT.ID
                        and FINANCIALTRANSACTION.DATE <= @ASOFDATE), 0
                )
                + coalesce((
                    select sum(INSTALLMENTWRITEOFF.TRANSACTIONAMOUNT)
                    from dbo.INSTALLMENTWRITEOFF
                        inner join dbo.WRITEOFF on INSTALLMENTWRITEOFF.WRITEOFFID = WRITEOFF.ID
                    where INSTALLMENTWRITEOFF.INSTALLMENTID = INSTALLMENT.ID
                        and WRITEOFF.DATE <= @ASOFDATE), 0
                )
            ) as AMOUNT
        from dbo.INSTALLMENT 
        where INSTALLMENT.REVENUEID = @PLEDGEID

        --For any given installment, calculate the summation of the amounts on all the installments previous to it.

        --    We'll need that value both including and excluding the current installment

        declare @INSTALLMENTROLLUP table(
            ID uniqueidentifier,
            TRANSACTIONBALANCE money,
            PREVIOUSTRANSACTIONRUNNINGTOTAL money,
            TRANSACTIONRUNNINGTOTAL money    
        )
        insert into @INSTALLMENTROLLUP(
            ID,
            TRANSACTIONBALANCE,
            PREVIOUSTRANSACTIONRUNNINGTOTAL,
            TRANSACTIONRUNNINGTOTAL    
        )
        select
            INSTALLMENT.ID,
            INSTALLMENT.TRANSACTIONBALANCE,
            coalesce(SUM(PREVIOUS.TRANSACTIONBALANCE),0
                - INSTALLMENT.TRANSACTIONBALANCE 
            as PREVIOUSTRANSACTIONRUNNINGTOTAL,
            coalesce(SUM(PREVIOUS.TRANSACTIONBALANCE),0) as TRANSACTIONRUNNINGTOTAL        
        from @INSTALLMENT INSTALLMENT
            cross join @INSTALLMENT PREVIOUS
        where PREVIOUS.SEQUENCE < INSTALLMENT.SEQUENCE
            or(PREVIOUS.SEQUENCE = INSTALLMENT.SEQUENCE
                and PREVIOUS.TSLONG <= INSTALLMENT.TSLONG
            )
        group by 
            INSTALLMENT.ID,
            INSTALLMENT.TRANSACTIONBALANCE

        --Convert the summations calculated previously and take their difference to

        --     to get the converted balance.

        insert into @BALANCE(
            ID,
            TRANSACTIONBALANCE,
            BASEBALANCE,
            ORGANIZATIONBALANCE
        )
        select
            INSTALLMENTROLLUP.ID,
            INSTALLMENTROLLUP.TRANSACTIONBALANCE,
            CURRENTRUNNINGTOTAL.BASEAMOUNT - PREVIOUSRUNNINGTOTAL.BASEAMOUNT BASEBALANCE,
            CURRENTRUNNINGTOTAL.ORGANIZATIONAMOUNT - PREVIOUSRUNNINGTOTAL.ORGANIZATIONAMOUNT ORGANIZATIONBALANCE
        from @INSTALLMENTROLLUP INSTALLMENTROLLUP
            cross apply dbo.UFN_CURRENCY_GETCURRENCYVALUESBYPROPORTION(
                INSTALLMENTROLLUP.TRANSACTIONRUNNINGTOTAL,
                @TRANSACTIONFULLAMOUNT,
                @BASECURRENCYID,
                @BASEFULLAMOUNT,
                @BASECURRENCYDECIMALDIGITS,
                @TRANSACTIONCURRENCYID,
                default,
                @ORGANIZATIONCURRENCYID,
                @ORGANIZATIONFULLAMOUNT,
                @ORGANIZATIONCURRENCYDECIMALDIGITS,
                default
            ) CURRENTRUNNINGTOTAL
            cross apply dbo.UFN_CURRENCY_GETCURRENCYVALUESBYPROPORTION(
                INSTALLMENTROLLUP.PREVIOUSTRANSACTIONRUNNINGTOTAL,
                @TRANSACTIONFULLAMOUNT,
                @BASECURRENCYID,
                @BASEFULLAMOUNT,
                @BASECURRENCYDECIMALDIGITS,
                @TRANSACTIONCURRENCYID,
                default,
                @ORGANIZATIONCURRENCYID,
                @ORGANIZATIONFULLAMOUNT,
                @ORGANIZATIONCURRENCYDECIMALDIGITS,
                default
            ) PREVIOUSRUNNINGTOTAL
    end

    return
end