UFN_PLEDGE_GETBALANCEASOFINCURRENCY_BULK

Returns the unpaid balance for all pledges as of a given date in the given currency.

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_PLEDGE_GETBALANCEASOFINCURRENCY_BULK
(
    @CURRENCYID uniqueidentifier,    -- if null and @CURRENCYCODE is not in (0,2), transaction currency will be used

    @ORGANIZATIONCURRENCYID uniqueidentifier,
    @DECIMALDIGITS tinyint,
    @ROUNDINGTYPECODE tinyint,
    @ASOFDATE datetime,
    @ORIGINCODE tinyint,
    @CURRENCYCODE tinyint    -- 0 = base, 2 = transaction, else = use passed-in-values

)
returns table
as
return
(
    with REVENUECTE
    as
    (
        select
            REVENUE.ID,
            SUM(
                INSTALLMENT.TRANSACTIONAMOUNT
                - coalesce(PLEDGEINSTALLMENTPAYMENT.AMOUNT,0)
                - coalesce(PLEDGEINSTALLMENTWRITEOFF.AMOUNT,0)
            ) as BALANCEINCURRENCY,
            REVENUE.TRANSACTIONCURRENCYID,
            V.BASECURRENCYID,
            cast(REVENUE.DATE as datetime) [DATE],
            REVENUE.TYPECODE TRANSACTIONTYPECODE,
            coalesce(BASEEXCHANGERATE.RATE,1) as ORIGINALBASERATE,
            coalesce(ORGEXCHANGERATE.RATE,1) as ORIGINALORGANIZATIONRATE,
            case @CURRENCYCODE
                when 0 then V.BASECURRENCYID
                when 2 then REVENUE.TRANSACTIONCURRENCYID
                else @CURRENCYID
            end as CURRENCYID,
            REVENUE.TYPE TRANSACTIONTYPE,
            REVENUE.CONSTITUENTID,
            REVENUE.TRANSACTIONAMOUNT,
            REVENUE.BASEAMOUNT AMOUNT,
            REVENUE.ORGAMOUNT ORGANIZATIONAMOUNT            
        from
            dbo.FINANCIALTRANSACTION REVENUE with (nolock)
        left outer join  dbo.V_BASECURRENCYFORFINANCIALTRANSACTION_I V with (noexpand) on REVENUE.ID = V.FINANCIALTRANSACTIONID
        left join dbo.INSTALLMENT on INSTALLMENT.REVENUEID = REVENUE.ID
        left join(
            select INSTALLMENTSPLIT.INSTALLMENTID, sum(INSTALLMENTSPLITPAYMENT.AMOUNT) AMOUNT
            from dbo.INSTALLMENTSPLITPAYMENT
            inner join dbo.INSTALLMENTSPLIT on INSTALLMENTSPLIT.ID = INSTALLMENTSPLITPAYMENT.INSTALLMENTSPLITID
            inner join dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT on REVENUESPLIT.ID = INSTALLMENTSPLITPAYMENT.PAYMENTID
            inner join dbo.FINANCIALTRANSACTION REVENUE on REVENUE.ID = REVENUESPLIT.FINANCIALTRANSACTIONID
            where REVENUE.TYPECODE in (0,1,2,3,4,5,6,7,8,9) and REVENUESPLIT.DELETEDON is null and REVENUESPLIT.TYPECODE != 1
                and cast(REVENUE.DATE as datetime) <= @ASOFDATE
            group by INSTALLMENTSPLIT.INSTALLMENTID
        ) PLEDGEINSTALLMENTPAYMENT on PLEDGEINSTALLMENTPAYMENT.INSTALLMENTID = INSTALLMENT.ID
        left join (
            select INSTALLMENTSPLIT.INSTALLMENTID, sum(INSTALLMENTSPLITWRITEOFF.TRANSACTIONAMOUNT) AMOUNT
            from dbo.INSTALLMENTSPLITWRITEOFF
            inner join dbo.INSTALLMENTSPLIT on INSTALLMENTSPLIT.ID = INSTALLMENTSPLITWRITEOFF.INSTALLMENTSPLITID
            inner join dbo.FINANCIALTRANSACTION WRITEOFF on INSTALLMENTSPLITWRITEOFF.WRITEOFFID = WRITEOFF.ID
            where WRITEOFF.TYPECODE = 20 and WRITEOFF.DELETEDON is null
                and cast(WRITEOFF.DATE as datetime) <= @ASOFDATE
            group by INSTALLMENTSPLIT.INSTALLMENTID
        ) PLEDGEINSTALLMENTWRITEOFF on PLEDGEINSTALLMENTWRITEOFF.INSTALLMENTID = INSTALLMENT.ID
        left join dbo.CURRENCYEXCHANGERATE BASEEXCHANGERATE on BASEEXCHANGERATE.ID = REVENUE.BASEEXCHANGERATEID
        left join dbo.CURRENCYEXCHANGERATE ORGEXCHANGERATE on ORGEXCHANGERATE.ID = REVENUE.ORGEXCHANGERATEID
        where REVENUE.TYPECODE in (0,1,2,3,4,5,6,7,8,9) and REVENUE.DELETEDON is null
        group by 
            REVENUE.ID, 
            REVENUE.TRANSACTIONCURRENCYID,
            V.BASECURRENCYID,
            REVENUE.TYPECODE,
            REVENUE.DATE,
            BASEEXCHANGERATE.RATE,
            ORGEXCHANGERATE.RATE,
            REVENUE.TYPE,
            REVENUE.CONSTITUENTID,
            REVENUE.TRANSACTIONAMOUNT,
            REVENUE.BASEAMOUNT,
            REVENUE.ORGAMOUNT
    )
    select            -- Transaction currency

        REVENUECTE.ID, 
        REVENUECTE.BALANCEINCURRENCY,
        REVENUECTE.TRANSACTIONCURRENCYID,
        REVENUECTE.BASECURRENCYID,
        REVENUECTE.DATE,
        REVENUECTE.TRANSACTIONTYPECODE,
          REVENUECTE.TRANSACTIONTYPE,
        REVENUECTE.CONSTITUENTID,
        REVENUECTE.TRANSACTIONAMOUNT,
        REVENUECTE.AMOUNT,
        REVENUECTE.ORGANIZATIONAMOUNT
    from REVENUECTE
    where (REVENUECTE.CURRENCYID is null
        or REVENUECTE.CURRENCYID = REVENUECTE.TRANSACTIONCURRENCYID

    union all        -- Base or org currency


    select 
        REVENUECTE.ID,
        case
            when REVENUECTE.CURRENCYID = @ORGANIZATIONCURRENCYID
                then                                                        
                    case @ORIGINCODE
                        when 0
                            then 
                                case
                                    when REVENUECTE.TRANSACTIONCURRENCYID = REVENUECTE.BASECURRENCYID
                                        then dbo.UFN_CURRENCY_ROUND(dbo.UFN_CURRENCY_APPLYRATE(REVENUECTE.BALANCEINCURRENCY, REVENUECTE.ORIGINALORGANIZATIONRATE), @DECIMALDIGITS, @ROUNDINGTYPECODE)
                                    when REVENUECTE.CURRENCYID = REVENUECTE.BASECURRENCYID and @CURRENCYCODE = 0
                                        then dbo.UFN_CURRENCY_ROUND(dbo.UFN_CURRENCY_APPLYRATE(REVENUECTE.BALANCEINCURRENCY, REVENUECTE.ORIGINALBASERATE), BASECURRENCY.DECIMALDIGITS, BASECURRENCY.ROUNDINGTYPECODE)
                                    else dbo.UFN_CURRENCY_ROUND(dbo.UFN_CURRENCY_APPLYRATE(dbo.UFN_CURRENCY_ROUND(dbo.UFN_CURRENCY_APPLYRATE(REVENUECTE.BALANCEINCURRENCY, REVENUECTE.ORIGINALBASERATE), BASECURRENCY.DECIMALDIGITS, BASECURRENCY.ROUNDINGTYPECODE), REVENUECTE.ORIGINALORGANIZATIONRATE), @DECIMALDIGITS, @ROUNDINGTYPECODE)
                                end
                        when 1
                            then dbo.UFN_CURRENCY_ROUND(dbo.UFN_CURRENCY_APPLYRATE(REVENUECTE.BALANCEINCURRENCY, REVENUECTE.ORIGINALORGANIZATIONRATE), @DECIMALDIGITS, @ROUNDINGTYPECODE)
                    end
            when REVENUECTE.CURRENCYID = REVENUECTE.BASECURRENCYID
                then dbo.UFN_CURRENCY_ROUND(dbo.UFN_CURRENCY_APPLYRATE(REVENUECTE.BALANCEINCURRENCY, REVENUECTE.ORIGINALBASERATE), BASECURRENCY.DECIMALDIGITS, BASECURRENCY.ROUNDINGTYPECODE)
            else 0
        end [BALANCEINCURRENCY],

        REVENUECTE.TRANSACTIONCURRENCYID,
        REVENUECTE.BASECURRENCYID,
        REVENUECTE.DATE,
        REVENUECTE.TRANSACTIONTYPECODE,
          REVENUECTE.TRANSACTIONTYPE,
        REVENUECTE.CONSTITUENTID,
        REVENUECTE.TRANSACTIONAMOUNT,
        REVENUECTE.AMOUNT,
        REVENUECTE.ORGANIZATIONAMOUNT
    from REVENUECTE
    left join dbo.CURRENCY BASECURRENCY on BASECURRENCY.ID = REVENUECTE.BASECURRENCYID
    where (REVENUECTE.CURRENCYID is not null)
        and (REVENUECTE.CURRENCYID <> REVENUECTE.TRANSACTIONCURRENCYID)
        and (REVENUECTE.CURRENCYID = @ORGANIZATIONCURRENCYID
            or REVENUECTE.CURRENCYID = REVENUECTE.BASECURRENCYID)

    union all        -- Arbitrary currency


    select 
        REVENUECTE.ID,
        case
            when LATESTEXCHANGERATE.RATE is not null
                then dbo.UFN_CURRENCY_ROUND(dbo.UFN_CURRENCY_APPLYRATE(REVENUECTE.BALANCEINCURRENCY, LATESTEXCHANGERATE.RATE), @DECIMALDIGITS, @ROUNDINGTYPECODE)
            when LATESTINVERSEEXCHANGERATE.RATE is not null
                then dbo.UFN_CURRENCY_ROUND(dbo.UFN_CURRENCY_APPLYRATE(REVENUECTE.BALANCEINCURRENCY, cast((1 / LATESTINVERSEEXCHANGERATE.RATE) as decimal(20,8))), @DECIMALDIGITS, @ROUNDINGTYPECODE)
            else 0
        end [BALANCEINCURRENCY],

        REVENUECTE.TRANSACTIONCURRENCYID,
        REVENUECTE.BASECURRENCYID,
        REVENUECTE.DATE,
        REVENUECTE.TRANSACTIONTYPECODE,
          REVENUECTE.TRANSACTIONTYPE,
        REVENUECTE.CONSTITUENTID,
        REVENUECTE.TRANSACTIONAMOUNT,
        REVENUECTE.AMOUNT,
        REVENUECTE.ORGANIZATIONAMOUNT
    from REVENUECTE
        outer apply
        (
            select
                RATE
            from
                dbo.CURRENCYEXCHANGERATE
            where
                CURRENCYEXCHANGERATE.FROMCURRENCYID = REVENUECTE.TRANSACTIONCURRENCYID 
                and CURRENCYEXCHANGERATE.TOCURRENCYID = REVENUECTE.CURRENCYID
                and CURRENCYEXCHANGERATE.TYPECODE in (0,1)
                and CURRENCYEXCHANGERATE.ISLATESTRATEFORASOFDATE = 1
                and CURRENCYEXCHANGERATE.ASOFDATESDTZ <= dateadd(ms, 86399996, REVENUECTE.DATE)
                and CURRENCYEXCHANGERATE.NEXTRATEASOFDATEORMAXSDTZ >= dateadd(ms, 86399996, REVENUECTE.DATE)
        ) LATESTEXCHANGERATE
        outer apply
        (
            select
                RATE
            from
                dbo.CURRENCYEXCHANGERATE
            where
                CURRENCYEXCHANGERATE.FROMCURRENCYID = REVENUECTE.CURRENCYID
                and CURRENCYEXCHANGERATE.TOCURRENCYID = REVENUECTE.TRANSACTIONCURRENCYID
                and CURRENCYEXCHANGERATE.TYPECODE in (0,1)
                and CURRENCYEXCHANGERATE.ISLATESTRATEFORASOFDATE = 1
                and CURRENCYEXCHANGERATE.ASOFDATESDTZ <= dateadd(ms, 86399996, REVENUECTE.DATE)
                and CURRENCYEXCHANGERATE.NEXTRATEASOFDATEORMAXSDTZ >= dateadd(ms, 86399996, REVENUECTE.DATE)
        ) LATESTINVERSEEXCHANGERATE
    where (REVENUECTE.CURRENCYID is not null)
        and REVENUECTE.CURRENCYID <> REVENUECTE.TRANSACTIONCURRENCYID
        and REVENUECTE.CURRENCYID <> REVENUECTE.BASECURRENCYID
        and REVENUECTE.CURRENCYID <> @ORGANIZATIONCURRENCYID
)