UFN_SPLIT_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_INSTALLMENT_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_SPLIT_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 REVENUESPLIT_CTE as( --Calculate transaction balance for each split

        select
            FINANCIALTRANSACTIONLINEITEM.ID,
            REVENUESPLIT_EXT.DESIGNATIONID,
            FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID REVENUEID,
            FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT
                - coalesce((
                    select sum(INSTALLMENTSPLITPAYMENT.AMOUNT) as AMOUNT
                    from dbo.INSTALLMENTSPLITPAYMENT
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM PAYMENTSPLIT on PAYMENTSPLIT.ID = INSTALLMENTSPLITPAYMENT.PAYMENTID
                        inner join dbo.FINANCIALTRANSACTION PAYMENT on PAYMENT.ID = PAYMENTSPLIT.FINANCIALTRANSACTIONID
                        inner join dbo.INSTALLMENTSPLIT on INSTALLMENTSPLIT.ID = INSTALLMENTSPLITPAYMENT.INSTALLMENTSPLITID
                    where PAYMENT.DATE <= @ASOFDATE 
                        and INSTALLMENTSPLIT.PLEDGEID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
                        and INSTALLMENTSPLIT.DESIGNATIONID = REVENUESPLIT_EXT.DESIGNATIONID
                        and PAYMENTSPLIT.DELETEDON is null
                        and PAYMENT.DELETEDON is null)
                ,0)
                - coalesce((
                    select sum(INSTALLMENTSPLITWRITEOFF.TRANSACTIONAMOUNT) AMOUNT
                    from dbo.INSTALLMENTSPLITWRITEOFF
                        inner join dbo.WRITEOFF on INSTALLMENTSPLITWRITEOFF.WRITEOFFID = WRITEOFF.ID
                        inner join dbo.INSTALLMENTSPLIT on INSTALLMENTSPLIT.ID = INSTALLMENTSPLITWRITEOFF.INSTALLMENTSPLITID
                    where WRITEOFF.DATE <= @ASOFDATE 
                        and INSTALLMENTSPLIT.PLEDGEID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
                        and INSTALLMENTSPLIT.DESIGNATIONID = REVENUESPLIT_EXT.DESIGNATIONID)
                ,0)
            as TRANSACTIONSPLITBALANCE,
            FINANCIALTRANSACTIONLINEITEM.SEQUENCE,
            FINANCIALTRANSACTIONLINEITEM.TS
        from dbo.FINANCIALTRANSACTIONLINEITEM
            inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
        where FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
            and FINANCIALTRANSACTIONLINEITEM.TYPECODE != 1
    ),
    ROLLUP_CTE as( --Calculate the rollup of the balances for each split and those the come before it.

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

        select
            ROLLUP_CTE.ID,
            ROLLUP_CTE.DESIGNATIONID,
            ROLLUP_CTE.REVENUEID,
            ROLLUP_CTE.TRANSACTIONSPLITBALANCE,
            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 split balances in the target currency.

    select 
        CTE_WITHREVENUEBALANCES.REVENUEID, 
        CTE_WITHREVENUEBALANCES.TRANSACTIONPLEDGEBALANCE,
        CTE_WITHREVENUEBALANCES.PLEDGEBALANCEINCURRENCY,
        CTE_WITHREVENUEBALANCES.ID,
        CTE_WITHREVENUEBALANCES.SEQUENCE,
        CTE_WITHREVENUEBALANCES.TRANSACTIONSPLITBALANCE 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.TRANSACTIONSPLITBALANCE
            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
)