UFN_INSTALLMENTSPLIT_GETREVALUEDBALANCEINCURRENCY_BULK

Returns the unpaid balance, as a revalued amount in the given currency, for revenue in the system.

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


CREATE function dbo.UFN_INSTALLMENTSPLIT_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 CTE_REVENUELASTINSTALLMENT
        as(
            select 
                REVENUEID, 
                max(SEQUENCE) LASTINSTALLMENTSEQUNCE
            from dbo.INSTALLMENT
            group by REVENUEID
        ),
        CTE_INSTALLMENTSPLIT
        as(
            select 
                INSTALLMENTSPLIT.PLEDGEID,
                INSTALLMENT.ID INSTALLMENTID,
                INSTALLMENT.SEQUENCE INSTALLMENTSEQUENCE,
                FINANCIALTRANSACTIONLINEITEM.ID SPLITID,                
                FINANCIALTRANSACTIONLINEITEM.SEQUENCE,
                FINANCIALTRANSACTIONLINEITEM.TS,                
                INSTALLMENTSPLIT.ID,
                INSTALLMENTSPLIT.TRANSACTIONAMOUNT
                    - coalesce((
                        select sum(INSTALLMENTSPLITPAYMENT.AMOUNT)
                        from INSTALLMENTSPLITPAYMENT
                        where INSTALLMENTSPLITPAYMENT.INSTALLMENTSPLITID = INSTALLMENTSPLIT.ID)
                    ,0)
                    - coalesce((
                        select sum(INSTALLMENTSPLITWRITEOFF.TRANSACTIONAMOUNT)
                        from INSTALLMENTSPLITWRITEOFF
                        where INSTALLMENTSPLITWRITEOFF.INSTALLMENTSPLITID = INSTALLMENTSPLIT.ID)
                    ,0)
                as TRANSACTIONBALANCE,                
                INSTALLMENT.DATE,
                INSTALLMENTSPLIT.DESIGNATIONID,
                INSTALLMENTSPLIT.AMOUNT,
                INSTALLMENTSPLIT.BASECURRENCYID,
                INSTALLMENTSPLIT.ORGANIZATIONAMOUNT,
                INSTALLMENTSPLIT.ORGANIZATIONEXCHANGERATEID,
                INSTALLMENTSPLIT.TRANSACTIONAMOUNT,
                INSTALLMENTSPLIT.TRANSACTIONCURRENCYID,
                INSTALLMENTSPLIT.BASEEXCHANGERATEID
            from dbo.INSTALLMENTSPLIT 
                inner join dbo.INSTALLMENT on INSTALLMENT.ID = INSTALLMENTSPLIT.INSTALLMENTID
                inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = INSTALLMENTSPLIT.PLEDGEID
                inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
            where INSTALLMENTSPLIT.DESIGNATIONID = REVENUESPLIT_EXT.DESIGNATIONID 
                and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
                and FINANCIALTRANSACTIONLINEITEM.TYPECODE != 1
        )
        --select *

        --from CTE_INSTALLMENTSPLIT

        ,
        CTE_INSTALLMENTROLLUP
        as(

            select
                CTE_INSTALLMENTSPLIT.PLEDGEID,
                CTE_INSTALLMENTSPLIT.INSTALLMENTID,
                CTE_INSTALLMENTSPLIT.INSTALLMENTSEQUENCE,
                CTE_INSTALLMENTSPLIT.SPLITID,
                CTE_INSTALLMENTSPLIT.ID,
                CTE_INSTALLMENTSPLIT.TRANSACTIONBALANCE,
                coalesce(SUM(PREV.TRANSACTIONBALANCE),0) - CTE_INSTALLMENTSPLIT.TRANSACTIONBALANCE PREVIOUSTRANSACTIONRUNNINGTOTAL,
                coalesce(SUM(PREV.TRANSACTIONBALANCE),0) TRANSACTIONRUNNINGTOTAL,
                CTE_INSTALLMENTSPLIT.DATE,
                CTE_INSTALLMENTSPLIT.DESIGNATIONID,
                CTE_INSTALLMENTSPLIT.AMOUNT,
                CTE_INSTALLMENTSPLIT.BASECURRENCYID,
                CTE_INSTALLMENTSPLIT.ORGANIZATIONAMOUNT,
                CTE_INSTALLMENTSPLIT.ORGANIZATIONEXCHANGERATEID,
                CTE_INSTALLMENTSPLIT.TRANSACTIONAMOUNT,
                CTE_INSTALLMENTSPLIT.TRANSACTIONCURRENCYID,
                CTE_INSTALLMENTSPLIT.BASEEXCHANGERATEID
            from CTE_INSTALLMENTSPLIT
                cross join CTE_INSTALLMENTSPLIT PREV
            where PREV.INSTALLMENTID = CTE_INSTALLMENTSPLIT.INSTALLMENTID
                and(
                    PREV.SEQUENCE < CTE_INSTALLMENTSPLIT.SEQUENCE
                    or(
                        PREV.SEQUENCE = CTE_INSTALLMENTSPLIT.SEQUENCE
                        and PREV.TS <= CTE_INSTALLMENTSPLIT.TS
                    )
                )
            group by
                CTE_INSTALLMENTSPLIT.PLEDGEID,
                CTE_INSTALLMENTSPLIT.INSTALLMENTID,
                CTE_INSTALLMENTSPLIT.INSTALLMENTSEQUENCE,
                CTE_INSTALLMENTSPLIT.SPLITID,
                CTE_INSTALLMENTSPLIT.ID,
                CTE_INSTALLMENTSPLIT.TRANSACTIONBALANCE,
                CTE_INSTALLMENTSPLIT.DATE,
                CTE_INSTALLMENTSPLIT.DESIGNATIONID,
                CTE_INSTALLMENTSPLIT.AMOUNT,
                CTE_INSTALLMENTSPLIT.BASECURRENCYID,
                CTE_INSTALLMENTSPLIT.ORGANIZATIONAMOUNT,
                CTE_INSTALLMENTSPLIT.ORGANIZATIONEXCHANGERATEID,
                CTE_INSTALLMENTSPLIT.TRANSACTIONAMOUNT,
                CTE_INSTALLMENTSPLIT.TRANSACTIONCURRENCYID,
                CTE_INSTALLMENTSPLIT.BASEEXCHANGERATEID
                --cross apply(

                --    select SUM(PREV.TRANSACTIONBALANCE) TRANSACTIONBALANCE

                --    from CTE_INSTALLMENTSPLIT PREV

                --    where PREV.INSTALLMENTID = CTE_INSTALLMENTSPLIT.INSTALLMENTID

                --        and(

                --            PREV.SEQUENCE < CTE_INSTALLMENTSPLIT.SEQUENCE

                --            or(

                --                PREV.SEQUENCE = CTE_INSTALLMENTSPLIT.SEQUENCE

                --                and PREV.TS < CTE_INSTALLMENTSPLIT.TS

                --            )

                --        )

                --) PREVS


        )
        --select * from CTE_INSTALLMENTROLLUP

        ,
        CTE_WITHINSTALLMENTBALANCE
        as(
            select 
                CTE_INSTALLMENTROLLUP.PLEDGEID,
                CTE_INSTALLMENTROLLUP.INSTALLMENTID,
                CTE_INSTALLMENTROLLUP.INSTALLMENTSEQUENCE,
                INSTALLMENT.TRANSACTIONBALANCE TRANSACTIONINSTALLMENTBALANCE,
                INSTALLMENT.INTERMEDIATEBALANCE INTERMEDIATEINSTALLMENTBALANCE,
                INSTALLMENT.BALANCEINCURRENCY INSTALLMENTBALANCEINCURRENCY,
                INSTALLMENT.CURRENCYID,
                CTE_INSTALLMENTROLLUP.SPLITID,
                CTE_INSTALLMENTROLLUP.ID,
                CTE_INSTALLMENTROLLUP.TRANSACTIONBALANCE,
                CTE_INSTALLMENTROLLUP.PREVIOUSTRANSACTIONRUNNINGTOTAL,
                CTE_INSTALLMENTROLLUP.TRANSACTIONRUNNINGTOTAL,
                CTE_INSTALLMENTROLLUP.DATE,
                CTE_INSTALLMENTROLLUP.DESIGNATIONID,
                CTE_INSTALLMENTROLLUP.AMOUNT,
                CTE_INSTALLMENTROLLUP.BASECURRENCYID,
                CTE_INSTALLMENTROLLUP.ORGANIZATIONAMOUNT,
                CTE_INSTALLMENTROLLUP.ORGANIZATIONEXCHANGERATEID,
                CTE_INSTALLMENTROLLUP.TRANSACTIONAMOUNT,
                CTE_INSTALLMENTROLLUP.TRANSACTIONCURRENCYID,
                CTE_INSTALLMENTROLLUP.BASEEXCHANGERATEID
            from CTE_INSTALLMENTROLLUP
                inner join dbo.UFN_INSTALLMENT_GETREVALUEDBALANCEINCURRENCY_BULK(
                    @CURRENCYID,
                    @ORGANIZATIONCURRENCYID,
                    @DECIMALDIGITS,
                    @ROUNDINGTYPECODE,
                    @ASOFDATE,
                    @ORIGINCODE,
                    @CURRENCYCODE
                ) INSTALLMENT on INSTALLMENT.ID = CTE_INSTALLMENTROLLUP.INSTALLMENTID
        )
        --select * From CTE_WITHINSTALLMENTBALANCE

        ,
        CTE_BALANCEBYINSTALLMENT
        as(
            select 
                CTE_WITHINSTALLMENTBALANCE.PLEDGEID, 
                CTE_WITHINSTALLMENTBALANCE.INSTALLMENTID,
                CTE_WITHINSTALLMENTBALANCE.INSTALLMENTSEQUENCE, 
                CTE_WITHINSTALLMENTBALANCE.TRANSACTIONINSTALLMENTBALANCE,
                CTE_WITHINSTALLMENTBALANCE.INSTALLMENTBALANCEINCURRENCY,
                CTE_WITHINSTALLMENTBALANCE.CURRENCYID,
                CTE_WITHINSTALLMENTBALANCE.SPLITID,
                CTE_WITHINSTALLMENTBALANCE.ID,
                CTE_WITHINSTALLMENTBALANCE.TRANSACTIONBALANCE,
                case
                    when CTE_WITHINSTALLMENTBALANCE.TRANSACTIONINSTALLMENTBALANCE = 0 
                        or CTE_WITHINSTALLMENTBALANCE.INSTALLMENTBALANCEINCURRENCY = 0 
                        or CTE_WITHINSTALLMENTBALANCE.INSTALLMENTSEQUENCE = CTE_REVENUELASTINSTALLMENT.LASTINSTALLMENTSEQUNCE
                        then convert(money,0)
                    when CTE_WITHINSTALLMENTBALANCE.TRANSACTIONINSTALLMENTBALANCE = CTE_WITHINSTALLMENTBALANCE.INSTALLMENTBALANCEINCURRENCY
                        then CTE_WITHINSTALLMENTBALANCE.TRANSACTIONBALANCE
                    when CTE_WITHINSTALLMENTBALANCE.INTERMEDIATEINSTALLMENTBALANCE = 0
                        then 
                            dbo.UFN_CURRENCY_ROUND(
                                convert(decimal(20,8),CTE_WITHINSTALLMENTBALANCE.TRANSACTIONRUNNINGTOTAL)
                                    / CTE_WITHINSTALLMENTBALANCE.TRANSACTIONINSTALLMENTBALANCE 
                                    * CTE_WITHINSTALLMENTBALANCE.INSTALLMENTBALANCEINCURRENCY
                                ,@DECIMALDIGITS,@ROUNDINGTYPECODE
                            - coalesce(dbo.UFN_CURRENCY_ROUND(
                                convert(decimal(20,8),CTE_WITHINSTALLMENTBALANCE.PREVIOUSTRANSACTIONRUNNINGTOTAL)
                                    / CTE_WITHINSTALLMENTBALANCE.TRANSACTIONINSTALLMENTBALANCE 
                                    * CTE_WITHINSTALLMENTBALANCE.INSTALLMENTBALANCEINCURRENCY
                                ,@DECIMALDIGITS,@ROUNDINGTYPECODE)
                            ,0)
                    else 
                        dbo.UFN_CURRENCY_ROUND(
                            convert(decimal(20,8),
                                    dbo.UFN_CURRENCY_ROUND(
                                        convert(decimal(20,8),CTE_WITHINSTALLMENTBALANCE.TRANSACTIONRUNNINGTOTAL)
                                            / CTE_WITHINSTALLMENTBALANCE.TRANSACTIONINSTALLMENTBALANCE 
                                            * CTE_WITHINSTALLMENTBALANCE.INTERMEDIATEINSTALLMENTBALANCE
                                        ,@DECIMALDIGITS,@ROUNDINGTYPECODE
                                )
                                / CTE_WITHINSTALLMENTBALANCE.INTERMEDIATEINSTALLMENTBALANCE 
                                * CTE_WITHINSTALLMENTBALANCE.INSTALLMENTBALANCEINCURRENCY
                            ,@DECIMALDIGITS,@ROUNDINGTYPECODE)
                        - coalesce(dbo.UFN_CURRENCY_ROUND(
                            convert(decimal(20,8),
                                    dbo.UFN_CURRENCY_ROUND(
                                        convert(decimal(20,8),CTE_WITHINSTALLMENTBALANCE.PREVIOUSTRANSACTIONRUNNINGTOTAL)
                                            / CTE_WITHINSTALLMENTBALANCE.TRANSACTIONINSTALLMENTBALANCE 
                                            * CTE_WITHINSTALLMENTBALANCE.INTERMEDIATEINSTALLMENTBALANCE
                                        ,@DECIMALDIGITS,@ROUNDINGTYPECODE
                                )
                                / CTE_WITHINSTALLMENTBALANCE.INTERMEDIATEINSTALLMENTBALANCE 
                                * CTE_WITHINSTALLMENTBALANCE.INSTALLMENTBALANCEINCURRENCY
                            ,@DECIMALDIGITS,@ROUNDINGTYPECODE
                        ,0)
                end BALANCEINCURRENCY,
                CTE_REVENUELASTINSTALLMENT.LASTINSTALLMENTSEQUNCE,
                CTE_WITHINSTALLMENTBALANCE.DATE,
                CTE_WITHINSTALLMENTBALANCE.DESIGNATIONID,
                CTE_WITHINSTALLMENTBALANCE.AMOUNT,
                CTE_WITHINSTALLMENTBALANCE.BASECURRENCYID,
                CTE_WITHINSTALLMENTBALANCE.ORGANIZATIONAMOUNT,
                CTE_WITHINSTALLMENTBALANCE.ORGANIZATIONEXCHANGERATEID,
                CTE_WITHINSTALLMENTBALANCE.TRANSACTIONAMOUNT,
                CTE_WITHINSTALLMENTBALANCE.TRANSACTIONCURRENCYID,
                CTE_WITHINSTALLMENTBALANCE.BASEEXCHANGERATEID
            from CTE_WITHINSTALLMENTBALANCE
                inner join CTE_REVENUELASTINSTALLMENT on CTE_REVENUELASTINSTALLMENT.REVENUEID = CTE_WITHINSTALLMENTBALANCE.PLEDGEID
        )
        --select * From CTE_BALANCEBYINSTALLMENT

        ,
        CTE_SPLITROLLUP
        as(
            select
                CTE_BALANCEBYINSTALLMENT.SPLITID,
                sum(CTE_BALANCEBYINSTALLMENT.BALANCEINCURRENCY) BALANCEINCURRENCYROLLUP,
                CTE_BALANCEBYINSTALLMENT.CURRENCYID,
                CTE_BALANCEBYINSTALLMENT.LASTINSTALLMENTSEQUNCE
            from CTE_BALANCEBYINSTALLMENT
            group by 
                CTE_BALANCEBYINSTALLMENT.SPLITID,
                CTE_BALANCEBYINSTALLMENT.CURRENCYID,
                CTE_BALANCEBYINSTALLMENT.LASTINSTALLMENTSEQUNCE
        )
        select
            CTE_BALANCEBYINSTALLMENT.ID,
            CTE_BALANCEBYINSTALLMENT.BALANCEINCURRENCY,
            CTE_BALANCEBYINSTALLMENT.TRANSACTIONBALANCE,
            CTE_BALANCEBYINSTALLMENT.CURRENCYID,
            CTE_BALANCEBYINSTALLMENT.DATE,
            CTE_BALANCEBYINSTALLMENT.INSTALLMENTID,
            CTE_BALANCEBYINSTALLMENT.PLEDGEID,
            CTE_BALANCEBYINSTALLMENT.DESIGNATIONID,
            CTE_BALANCEBYINSTALLMENT.AMOUNT,
            CTE_BALANCEBYINSTALLMENT.BASECURRENCYID,
            CTE_BALANCEBYINSTALLMENT.ORGANIZATIONAMOUNT,
            CTE_BALANCEBYINSTALLMENT.ORGANIZATIONEXCHANGERATEID,
            CTE_BALANCEBYINSTALLMENT.TRANSACTIONAMOUNT,
            CTE_BALANCEBYINSTALLMENT.TRANSACTIONCURRENCYID,
            CTE_BALANCEBYINSTALLMENT.BASEEXCHANGERATEID,
            CTE_BALANCEBYINSTALLMENT.SPLITID
        from CTE_BALANCEBYINSTALLMENT
        where CTE_BALANCEBYINSTALLMENT.INSTALLMENTSEQUENCE < CTE_BALANCEBYINSTALLMENT.LASTINSTALLMENTSEQUNCE 

        union all

        select
            CTE_INSTALLMENTSPLIT.ID,
            SPLIT.BALANCEINCURRENCY - CTE_SPLITROLLUP.BALANCEINCURRENCYROLLUP BALANCEINCURRENCY,
            CTE_INSTALLMENTSPLIT.TRANSACTIONBALANCE,
            CTE_SPLITROLLUP.CURRENCYID,
            CTE_INSTALLMENTSPLIT.DATE,
            CTE_INSTALLMENTSPLIT.INSTALLMENTID,
            CTE_INSTALLMENTSPLIT.PLEDGEID,
            CTE_INSTALLMENTSPLIT.DESIGNATIONID,
            CTE_INSTALLMENTSPLIT.AMOUNT,
            CTE_INSTALLMENTSPLIT.BASECURRENCYID,
            CTE_INSTALLMENTSPLIT.ORGANIZATIONAMOUNT,
            CTE_INSTALLMENTSPLIT.ORGANIZATIONEXCHANGERATEID,
            CTE_INSTALLMENTSPLIT.TRANSACTIONAMOUNT,
            CTE_INSTALLMENTSPLIT.TRANSACTIONCURRENCYID,
            CTE_INSTALLMENTSPLIT.BASEEXCHANGERATEID,
            CTE_INSTALLMENTSPLIT.SPLITID
        from CTE_SPLITROLLUP 
            inner join CTE_INSTALLMENTSPLIT on CTE_INSTALLMENTSPLIT.SPLITID = CTE_SPLITROLLUP.SPLITID
            inner join dbo.UFN_SPLIT_GETREVALUEDBALANCEINCURRENCY_BULK(
                @CURRENCYID,
                @ORGANIZATIONCURRENCYID,
                @DECIMALDIGITS,
                @ROUNDINGTYPECODE,
                @ASOFDATE,
                @ORIGINCODE,
                @CURRENCYCODE
            ) SPLIT on CTE_INSTALLMENTSPLIT.SPLITID = SPLIT.ID
        where CTE_INSTALLMENTSPLIT.INSTALLMENTSEQUENCE = CTE_SPLITROLLUP.LASTINSTALLMENTSEQUNCE
)