UFN_INSTALLMENT_GETREVALUEDBALANCEINCURRENCY_BULK

Return

Return Type
table

Parameters

Parameter Parameter Type Mode Description
@CURRENCYID uniqueidentifier IN
@ORGANIZATIONCURRENCYID uniqueidentifier IN
@DECIMALDIGITS tinyint IN
@ROUNDINGTYPECODE tinyint IN
@ASOFDATE datetime IN
@ORIGINCODE tinyint IN
@CURRENCYCODE tinyint IN

Definition

Copy


--This calculation method is also used in UFN_SPLIT_GETREVALUEDBALANCEINCURRENCY_BULK.  If there's

--    a bug here, it likely also appears there.  UFN_INSTALLMENTSPLIT_GETREVALUEDBALANCEINCURRENCY_BULK

--    uses a variation of this, so check there as well.


CREATE function dbo.UFN_INSTALLMENT_GETREVALUEDBALANCEINCURRENCY_BULK
(
    -- If you want to convert to...

    --    The base currency of each row:

    --        set @CURRENCYCODE = 0

    --        set @ORGANIZATIONCURRENCYID, @ASOFDATE, and @ORIGINCODE appropriately

    --    The organization currency:

    --        set @CURRENCYCODE = 1

    --        set @ORGANIZATIONCURRENCYID, @ASOFDATE, and @ORIGINCODE appropriately

    --    The transaction currency of each row:

    --        set @CURRENCYCODE = 2

    --        set @ORGANIZATIONCURRENCYID, @ASOFDATE and @ORIGINCODE appropriately

    --    An arbitrary currency:

    --        set @CURRENCYCODE = anything but 0 or 2

    --        set @CURRENCYID = the currency's ID

    --        set @DECIMALDIGITS and @ROUNDINGTYPECODE according to the currency

    --        set @ORGANIZATIONCURRENCYID, @ASOFDATE and @ORIGINCODE appropriately


    @CURRENCYID uniqueidentifier,
    @ORGANIZATIONCURRENCYID uniqueidentifier,
    @DECIMALDIGITS tinyint,
    @ROUNDINGTYPECODE tinyint,
    @ASOFDATE datetime,
    @ORIGINCODE tinyint,
    @CURRENCYCODE tinyint
)
    returns table
    as
    return
    (
    with REVENUEINSTALLMENT_CTE as( --Calculate transaction balance for each installment

        select
            INSTALLMENT.ID,
            INSTALLMENT.REVENUEID,
            INSTALLMENT.TRANSACTIONAMOUNT 
                - coalesce((
                    select sum(INSTALLMENTPAYMENT.AMOUNT)
                    from dbo.INSTALLMENTPAYMENT
                    where INSTALLMENTPAYMENT.INSTALLMENTID = INSTALLMENT.ID)
                , 0)
                - coalesce((
                    select sum(INSTALLMENTWRITEOFF.TRANSACTIONAMOUNT)
                    from dbo.INSTALLMENTWRITEOFF
                    where INSTALLMENTWRITEOFF.INSTALLMENTID = INSTALLMENT.ID)
                , 0)            
            as TRANSACTIONINSTALLMENTBALANCE,
            INSTALLMENT.SEQUENCE,
            INSTALLMENT.TS
        from dbo.INSTALLMENT
    ),
    ROLLUP_CTE as( --Calculate the rollup of the balances for each installment and those the come before it.

        select
            REVENUEINSTALLMENT_CTE.ID,
            REVENUEINSTALLMENT_CTE.REVENUEID,
            REVENUEINSTALLMENT_CTE.TRANSACTIONINSTALLMENTBALANCE,
            REVENUEINSTALLMENT_CTE.SEQUENCE,
            coalesce(SUM(PREV.TRANSACTIONINSTALLMENTBALANCE),0) - REVENUEINSTALLMENT_CTE.TRANSACTIONINSTALLMENTBALANCE PREVIOUSTRANSACTIONRUNNINGTOTAL,
            coalesce(SUM(PREV.TRANSACTIONINSTALLMENTBALANCE),0) TRANSACTIONRUNNINGTOTAL
        from REVENUEINSTALLMENT_CTE
            cross join REVENUEINSTALLMENT_CTE PREV
        where PREV.REVENUEID = REVENUEINSTALLMENT_CTE.REVENUEID
            and(
                PREV.SEQUENCE < REVENUEINSTALLMENT_CTE.SEQUENCE
                or(
                    PREV.SEQUENCE = REVENUEINSTALLMENT_CTE.SEQUENCE
                    and PREV.TS <= REVENUEINSTALLMENT_CTE.TS
                )
            )
        group by
            REVENUEINSTALLMENT_CTE.ID,
            REVENUEINSTALLMENT_CTE.REVENUEID,
            REVENUEINSTALLMENT_CTE.TRANSACTIONINSTALLMENTBALANCE,
            REVENUEINSTALLMENT_CTE.SEQUENCE
    ),
    CTE_WITHREVENUEBALANCES    as( --Retrieve pledge balances in the target currency

        select
            ROLLUP_CTE.ID,
            ROLLUP_CTE.REVENUEID,
            ROLLUP_CTE.TRANSACTIONINSTALLMENTBALANCE,
            ROLLUP_CTE.SEQUENCE,
            ROLLUP_CTE.TRANSACTIONRUNNINGTOTAL,
            ROLLUP_CTE.PREVIOUSTRANSACTIONRUNNINGTOTAL,
            REVENUE.TRANSACTIONBALANCE TRANSACTIONPLEDGEBALANCE,
            REVENUE.BALANCEINCURRENCY PLEDGEBALANCEINCURRENCY,
            REVENUE.INTERMEDIATEBALANCE INTERMEDIATEPLEDGEBALANCE,
            REVENUE.CURRENCYID
        from dbo.UFN_PLEDGE_GETREVALUEDBALANCEINCURRENCY_BULK(
                @CURRENCYID,
                @ORGANIZATIONCURRENCYID,
                @DECIMALDIGITS,
                @ROUNDINGTYPECODE,
                @ASOFDATE,
                @ORIGINCODE,
                @CURRENCYCODE
            ) REVENUE
            inner join ROLLUP_CTE on ROLLUP_CTE.REVENUEID = REVENUE.ID 
    )
    --Using pledge balances and rollup numbers, calculate the installment balances in the target currency.

    select 
        CTE_WITHREVENUEBALANCES.REVENUEID, 
        CTE_WITHREVENUEBALANCES.TRANSACTIONPLEDGEBALANCE,
        CTE_WITHREVENUEBALANCES.PLEDGEBALANCEINCURRENCY,
        CTE_WITHREVENUEBALANCES.ID,
        CTE_WITHREVENUEBALANCES.SEQUENCE,
        CTE_WITHREVENUEBALANCES.TRANSACTIONINSTALLMENTBALANCE TRANSACTIONBALANCE,
        case
            when CTE_WITHREVENUEBALANCES.TRANSACTIONPLEDGEBALANCE = 0 
                or CTE_WITHREVENUEBALANCES.PLEDGEBALANCEINCURRENCY = 0
                then convert(money,0)
            when CTE_WITHREVENUEBALANCES.TRANSACTIONPLEDGEBALANCE = CTE_WITHREVENUEBALANCES.PLEDGEBALANCEINCURRENCY
                then convert(money,0)
            when CTE_WITHREVENUEBALANCES.INTERMEDIATEPLEDGEBALANCE = 0
                then convert(money,0)
            else 
                dbo.UFN_CURRENCY_ROUND(
                    convert(decimal(20,8),CTE_WITHREVENUEBALANCES.TRANSACTIONRUNNINGTOTAL)
                        / CTE_WITHREVENUEBALANCES.TRANSACTIONPLEDGEBALANCE 
                        * CTE_WITHREVENUEBALANCES.INTERMEDIATEPLEDGEBALANCE
                    ,@DECIMALDIGITS,@ROUNDINGTYPECODE)
                - coalesce(dbo.UFN_CURRENCY_ROUND(
                    convert(decimal(20,8),CTE_WITHREVENUEBALANCES.PREVIOUSTRANSACTIONRUNNINGTOTAL)
                        / CTE_WITHREVENUEBALANCES.TRANSACTIONPLEDGEBALANCE 
                        * CTE_WITHREVENUEBALANCES.INTERMEDIATEPLEDGEBALANCE
                    ,@DECIMALDIGITS,@ROUNDINGTYPECODE)
                ,0)
        end INTERMEDIATEBALANCE,
        case
            when CTE_WITHREVENUEBALANCES.TRANSACTIONPLEDGEBALANCE = 0 
                or CTE_WITHREVENUEBALANCES.PLEDGEBALANCEINCURRENCY = 0
                then convert(money,0)
            when CTE_WITHREVENUEBALANCES.TRANSACTIONPLEDGEBALANCE = CTE_WITHREVENUEBALANCES.PLEDGEBALANCEINCURRENCY
                then CTE_WITHREVENUEBALANCES.TRANSACTIONINSTALLMENTBALANCE
            when CTE_WITHREVENUEBALANCES.INTERMEDIATEPLEDGEBALANCE = 0
                then 
                    dbo.UFN_CURRENCY_ROUND(
                        convert(decimal(20,8),CTE_WITHREVENUEBALANCES.TRANSACTIONRUNNINGTOTAL)
                            / CTE_WITHREVENUEBALANCES.TRANSACTIONPLEDGEBALANCE 
                            * CTE_WITHREVENUEBALANCES.PLEDGEBALANCEINCURRENCY
                        ,@DECIMALDIGITS,@ROUNDINGTYPECODE
                    - coalesce(dbo.UFN_CURRENCY_ROUND(
                        convert(decimal(20,8),CTE_WITHREVENUEBALANCES.PREVIOUSTRANSACTIONRUNNINGTOTAL)
                            / CTE_WITHREVENUEBALANCES.TRANSACTIONPLEDGEBALANCE 
                            * CTE_WITHREVENUEBALANCES.PLEDGEBALANCEINCURRENCY
                        ,@DECIMALDIGITS,@ROUNDINGTYPECODE)
                    ,0)
            else 
                dbo.UFN_CURRENCY_ROUND(
                    convert(decimal(20,8),
                            dbo.UFN_CURRENCY_ROUND(
                                convert(decimal(20,8),CTE_WITHREVENUEBALANCES.TRANSACTIONRUNNINGTOTAL)
                                    / CTE_WITHREVENUEBALANCES.TRANSACTIONPLEDGEBALANCE 
                                    * CTE_WITHREVENUEBALANCES.INTERMEDIATEPLEDGEBALANCE
                                ,@DECIMALDIGITS,@ROUNDINGTYPECODE
                        )
                        / CTE_WITHREVENUEBALANCES.INTERMEDIATEPLEDGEBALANCE 
                        * CTE_WITHREVENUEBALANCES.PLEDGEBALANCEINCURRENCY
                    ,@DECIMALDIGITS,@ROUNDINGTYPECODE
                - coalesce(dbo.UFN_CURRENCY_ROUND(
                    convert(decimal(20,8),
                            dbo.UFN_CURRENCY_ROUND(
                                convert(decimal(20,8),CTE_WITHREVENUEBALANCES.PREVIOUSTRANSACTIONRUNNINGTOTAL)
                                    / CTE_WITHREVENUEBALANCES.TRANSACTIONPLEDGEBALANCE 
                                    * CTE_WITHREVENUEBALANCES.INTERMEDIATEPLEDGEBALANCE
                                ,@DECIMALDIGITS,@ROUNDINGTYPECODE
                        )
                        / CTE_WITHREVENUEBALANCES.INTERMEDIATEPLEDGEBALANCE 
                        * CTE_WITHREVENUEBALANCES.PLEDGEBALANCEINCURRENCY
                    ,@DECIMALDIGITS,@ROUNDINGTYPECODE
                ,0)
        end BALANCEINCURRENCY,
        CTE_WITHREVENUEBALANCES.CURRENCYID
    from CTE_WITHREVENUEBALANCES
)