UFN_PLEDGE_GETREVALUEDBALANCEINCURRENCY_BULK3

Return

Return Type
table

Parameters

Parameter Parameter Type Mode Description
@CURRENCYID uniqueidentifier IN
@ORGANIZATIONCURRENCYID uniqueidentifier IN
@DECIMALDIGITS tinyint IN
@ROUNDINGTYPECODE tinyint IN
@STARTDATE datetime IN
@ENDDATE datetime IN
@ORIGINCODE tinyint IN
@CURRENCYCODE tinyint IN
@REVENUEID uniqueidentifier IN

Definition

Copy


create function dbo.[UFN_PLEDGE_GETREVALUEDBALANCEINCURRENCY_BULK3]
(
  -- Include @ENDATE (formerly @ASOFDATE) and @STARTDATE for filtering.

  -- If you want to convert to...

  --    The base currency of each row:

  --        set @CURRENCYCODE = 0

  --        set @ORGANIZATIONCURRENCYID and @ORIGINCODE appropriately

  --    The organization currency:

  --        set @CURRENCYCODE = 1

  --        set @ORGANIZATIONCURRENCYID and @ORIGINCODE appropriately

  --    The transaction currency of each row:

  --        set @CURRENCYCODE = 2

  --        set @ORGANIZATIONCURRENCYID 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 and @ORIGINCODE appropriately


  @CURRENCYID uniqueidentifier,
  @ORGANIZATIONCURRENCYID uniqueidentifier,
  @DECIMALDIGITS tinyint,
  @ROUNDINGTYPECODE tinyint,
  @STARTDATE datetime,
  @ENDDATE datetime,
  @ORIGINCODE tinyint,
  @CURRENCYCODE tinyint,
  @REVENUEID uniqueidentifier
)
returns table
as
return
(
  with REVENUECTE
  as
  (
    select
      REVENUE.ID,
      REVENUE.TRANSACTIONAMOUNT - coalesce(PLEDGEAMOUNT.AMOUNT,0) - coalesce(WRITEOFFAMOUNT.AMOUNT,0)
      as BALANCEINCURRENCY,
      REVENUE.TRANSACTIONCURRENCYID,
      V.BASECURRENCYID,
      cast(REVENUE.DATE as datetime) [DATE],
      REVENUE.TYPECODE TRANSACTIONTYPECODE,
      BASEEXCHANGERATE.RATE as ORIGINALBASERATE,
      ORGEXCHANGERATE.RATE as ORIGINALORGANIZATIONRATE,
      CURRENCY.ID as CURRENCYID,

      -- Fields unused for revaluation, but that we need to include

      -- so this function can replace selects from the revenue table.

      REVENUE.TYPE TRANSACTIONTYPE,
      REVENUE.CONSTITUENTID,
      REVENUE.TRANSACTIONAMOUNT,
      REVENUE.BASEAMOUNT AMOUNT,
      REVENUE.ORGAMOUNT ORGANIZATIONAMOUNT,
      REVENUEINCURRENCY.APPEALID,
      REVENUEINCURRENCY.AMOUNTINCURRENCY

    from dbo.FINANCIALTRANSACTION REVENUE with (nolock)
    inner join  dbo.V_BASECURRENCYFORFINANCIALTRANSACTION_I V with (noexpand) on REVENUE.ID = V.FINANCIALTRANSACTIONID
    cross apply (select V.BASECURRENCYID as ID where @CURRENCYCODE = 0
                 union all
                 select @ORGANIZATIONCURRENCYID where  @CURRENCYCODE = 1
                 union all
                 select REVENUE.TRANSACTIONCURRENCYID where @CURRENCYCODE = 2
                 union all
                 select @CURRENCYID where @CURRENCYCODE is null or @CURRENCYCODE not in (0,1,2)) as CURRENCY
    inner join dbo.UFN_REVENUE_GETAMOUNTSINCURRENCY_BULK(@CURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) REVENUEINCURRENCY on REVENUE.ID = REVENUEINCURRENCY.ID
    left join dbo.CURRENCYEXCHANGERATE BASEEXCHANGERATE on BASEEXCHANGERATE.ID = REVENUE.BASEEXCHANGERATEID
    left join dbo.CURRENCYEXCHANGERATE ORGEXCHANGERATE on ORGEXCHANGERATE.ID = REVENUE.ORGEXCHANGERATEID
    left join (
      select sum(INSTALLMENTSPLITPAYMENT.AMOUNT) as AMOUNT, INSTALLMENTSPLITPAYMENT.PLEDGEID
      from dbo.INSTALLMENTSPLITPAYMENT
      inner join dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT on REVENUESPLIT.ID = INSTALLMENTSPLITPAYMENT.PAYMENTID
      inner join dbo.FINANCIALTRANSACTION PAYMENT on PAYMENT.ID = REVENUESPLIT.FINANCIALTRANSACTIONID
      where PAYMENT.TYPECODE in (0,1,2,3,4,5,6,7,8,9) and REVENUESPLIT.DELETEDON is null and REVENUESPLIT.TYPECODE != 1
      and cast(PAYMENT.DATE as datetime) <= isnull(@ENDDATE, cast(PAYMENT.DATE as datetime))
      group by INSTALLMENTSPLITPAYMENT.PLEDGEID) PLEDGEAMOUNT on PLEDGEAMOUNT.PLEDGEID = REVENUE.ID
    left join (
      select sum(INSTALLMENTSPLITWRITEOFF.TRANSACTIONAMOUNT) AMOUNT, WRITEOFF.PARENTID
      from dbo.INSTALLMENTSPLITWRITEOFF
      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) <= isnull(@ENDDATE, cast(WRITEOFF.DATE as datetime))
      group by WRITEOFF.PARENTID) WRITEOFFAMOUNT on WRITEOFFAMOUNT.PARENTID  = REVENUE.ID
    left join dbo.RECURRINGGIFTACTIVITY on RECURRINGGIFTACTIVITY.SOURCEREVENUEID = REVENUE.ID
    left join dbo.FINANCIALTRANSACTIONLINEITEM as RECURRINGGIFTPAYMENTLINEITEM on RECURRINGGIFTPAYMENTLINEITEM.ID = RECURRINGGIFTACTIVITY.PAYMENTREVENUEID
    left join dbo.FINANCIALTRANSACTION as RECURRINGGIFTPAYMENT on RECURRINGGIFTPAYMENT.ID = RECURRINGGIFTPAYMENTLINEITEM.FINANCIALTRANSACTIONID
    where REVENUE.TYPECODE in (0,1,2,3,4,5,6,7,8,9,15) and REVENUE.DELETEDON is null and REVENUE.ID = @REVENUEID
    and (cast(REVENUE.DATE as datetime) >= isnull(@STARTDATE, cast(REVENUE.DATE as datetime)) and cast(REVENUE.DATE as datetime) <= isnull(@ENDDATE, cast(REVENUE.DATE as datetime))
      or cast(RECURRINGGIFTPAYMENT.DATE as datetime) >= isnull(@STARTDATE, cast(RECURRINGGIFTPAYMENT.DATE as datetime)) and cast(RECURRINGGIFTPAYMENT.DATE as datetime) <= isnull(@ENDDATE, cast(RECURRINGGIFTPAYMENT.DATE as datetime)))
  )

  select    -- Transaction currency

    REVENUECTE.ID, 
    REVENUECTE.BALANCEINCURRENCY,
    REVENUECTE.BALANCEINCURRENCY TRANSACTIONBALANCE,
    REVENUECTE.CURRENCYID,

    REVENUECTE.TRANSACTIONCURRENCYID,
    REVENUECTE.BASECURRENCYID,
    REVENUECTE.DATE,
    REVENUECTE.TRANSACTIONTYPECODE,
    REVENUECTE.TRANSACTIONTYPE,
    REVENUECTE.CONSTITUENTID,
    REVENUECTE.TRANSACTIONAMOUNT,
    REVENUECTE.AMOUNT,
    REVENUECTE.ORGANIZATIONAMOUNT,
    REVENUECTE.APPEALID,
    REVENUECTE.AMOUNTINCURRENCY,
    0 INTERMEDIATEBALANCE
  from REVENUECTE
  where (REVENUECTE.CURRENCYID is null)  
    or @CURRENCYCODE = 2  --We want transaction balance

    or (  --We want base balance and transaction = base currency

      @CURRENCYCODE = 0
      and REVENUECTE.TRANSACTIONCURRENCYID = REVENUECTE.BASECURRENCYID
    )
    or (  --We want organization balance.

      @CURRENCYCODE = 1
      and (
        (  --The origin is T->B->O, and transaction = base = organization currency

          @ORIGINCODE = 0
          and REVENUECTE.TRANSACTIONCURRENCYID = REVENUECTE.BASECURRENCYID
          and REVENUECTE.BASECURRENCYID = @ORGANIZATIONCURRENCYID
        )
        or(  --The origin is T->O, and transaction = organization currency

          @ORIGINCODE = 1
          and REVENUECTE.TRANSACTIONCURRENCYID = @ORGANIZATIONCURRENCYID
        )
      )
    )
    or (  --We want an arbitrary balance and transaction = arbitrary currency

      (@CURRENCYCODE is null or not @CURRENCYCODE in (0,1,2))
      and REVENUECTE.TRANSACTIONCURRENCYID = REVENUECTE.CURRENCYID
    )
    or REVENUECTE.BALANCEINCURRENCY is null
    or REVENUECTE.BALANCEINCURRENCY = 0


  union all    -- Base or org currency


  select 
    REVENUECTE.ID,
    case
      when REVENUECTE.CURRENCYID = REVENUECTE.BASECURRENCYID
        then dbo.UFN_CURRENCY_ROUND(dbo.UFN_CURRENCY_APPLYRATE(REVENUECTE.BALANCEINCURRENCY, coalesce(REVALUATION.BASERATE,REVENUECTE.ORIGINALBASERATE)), BASECURRENCY.DECIMALDIGITS, BASECURRENCY.ROUNDINGTYPECODE)
      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, coalesce(REVALUATION.ORGANIZATIONRATE,REVENUECTE.ORIGINALORGANIZATIONRATE)), @DECIMALDIGITS, @ROUNDINGTYPECODE)
                  else dbo.UFN_CURRENCY_ROUND(dbo.UFN_CURRENCY_APPLYRATE(dbo.UFN_CURRENCY_ROUND(dbo.UFN_CURRENCY_APPLYRATE(REVENUECTE.BALANCEINCURRENCY, coalesce(REVALUATION.BASERATE, REVENUECTE.ORIGINALBASERATE)), BASECURRENCY.DECIMALDIGITS, BASECURRENCY.ROUNDINGTYPECODE), coalesce(REVALUATION.ORGANIZATIONRATE, REVENUECTE.ORIGINALORGANIZATIONRATE)), @DECIMALDIGITS, @ROUNDINGTYPECODE)
                end
            when 1
              then dbo.UFN_CURRENCY_ROUND(dbo.UFN_CURRENCY_APPLYRATE(REVENUECTE.BALANCEINCURRENCY, coalesce(REVALUATION.ORGANIZATIONRATE,REVENUECTE.ORIGINALORGANIZATIONRATE)), @DECIMALDIGITS, @ROUNDINGTYPECODE)
          end
      else 0
    end [BALANCEINCURRENCY],
    REVENUECTE.BALANCEINCURRENCY TRANSACTIONBALANCE,
    REVENUECTE.CURRENCYID,

    REVENUECTE.TRANSACTIONCURRENCYID,
    REVENUECTE.BASECURRENCYID,
    REVENUECTE.DATE,
    REVENUECTE.TRANSACTIONTYPECODE,
    REVENUECTE.TRANSACTIONTYPE,
    REVENUECTE.CONSTITUENTID,
    REVENUECTE.TRANSACTIONAMOUNT,
    REVENUECTE.AMOUNT,
    REVENUECTE.ORGANIZATIONAMOUNT,
    REVENUECTE.APPEALID,
    REVENUECTE.AMOUNTINCURRENCY,
    case
      when REVENUECTE.CURRENCYID = @ORGANIZATIONCURRENCYID
        and @ORIGINCODE = 0
        and REVENUECTE.TRANSACTIONCURRENCYID <> REVENUECTE.BASECURRENCYID
        then dbo.UFN_CURRENCY_ROUND(dbo.UFN_CURRENCY_APPLYRATE(REVENUECTE.BALANCEINCURRENCY, coalesce(REVALUATION.BASERATE, REVENUECTE.ORIGINALBASERATE)), BASECURRENCY.DECIMALDIGITS, BASECURRENCY.ROUNDINGTYPECODE)
      else 0 
    end INTERMEDIATEBALANCE
  from REVENUECTE
  outer apply(
    select top 1
      REVENUECOMMITMENTREVALUATION.ID,
      COMMITMENTREVALUATION.BASEEXCHANGERATEID,
      COMMITMENTREVALUATION.ORGANIZATIONEXCHANGERATEID,
      BASERATE.RATE BASERATE,
      ORGANIZATIONRATE.RATE ORGANIZATIONRATE
    from dbo.REVENUECOMMITMENTREVALUATION
      inner join dbo.COMMITMENTREVALUATION on REVENUECOMMITMENTREVALUATION.COMMITMENTREVALUATIONID = COMMITMENTREVALUATION.ID
      left join dbo.CURRENCYEXCHANGERATE BASERATE on BASERATE.ID = COMMITMENTREVALUATION.BASEEXCHANGERATEID
      left join dbo.CURRENCYEXCHANGERATE ORGANIZATIONRATE on ORGANIZATIONRATE.ID = COMMITMENTREVALUATION.ORGANIZATIONEXCHANGERATEID
    where REVENUECOMMITMENTREVALUATION.REVENUEID = REVENUECTE.ID
      and COMMITMENTREVALUATION.DATE <= isnull(@ENDDATE, COMMITMENTREVALUATION.DATE)
    order by
      COMMITMENTREVALUATION.DATE desc
      COMMITMENTREVALUATION.SEQUENCE desc 
  ) REVALUATION
  left join dbo.CURRENCY BASECURRENCY on BASECURRENCY.ID = REVENUECTE.BASECURRENCYID
  where (REVENUECTE.CURRENCYID is not null)
    and 
    (
      REVENUECTE.TRANSACTIONCURRENCYID <> REVENUECTE.CURRENCYID
      or ( -- We want org balance in a T->B->0 system for gifts where transaction currency = org currency <> base currency.

        @ORIGINCODE = 0
        and @CURRENCYCODE = 1 
        and REVENUECTE.TRANSACTIONCURRENCYID <> REVENUECTE.BASECURRENCYID
      )
    )
    and (
      (  --We want base balance and base <> transaction currency

        (
          @CURRENCYCODE = 0
          or (
            (@CURRENCYCODE is null or @CURRENCYCODE not in (0,1,2))
            and @CURRENCYID = REVENUECTE.BASECURRENCYID
          )
        )
        and REVENUECTE.TRANSACTIONCURRENCYID <> REVENUECTE.BASECURRENCYID
      )
      or (  --We want organization balance.

        (
          @CURRENCYCODE = 1
          or (
            (@CURRENCYCODE is null or @CURRENCYCODE not in (0,1,2))
            and @CURRENCYID = @ORGANIZATIONCURRENCYID
          )
        )
        and (
          (  --The origin is T->B->O, but transaction <> base or base <> organization currency

            @ORIGINCODE = 0
            and (
              REVENUECTE.TRANSACTIONCURRENCYID <> REVENUECTE.BASECURRENCYID
              or REVENUECTE.BASECURRENCYID <> @ORGANIZATIONCURRENCYID
            )
          )
          or(  --The origin is T->O, and transaction <> organization currency

            @ORIGINCODE = 1
            and REVENUECTE.TRANSACTIONCURRENCYID <> @ORGANIZATIONCURRENCYID
          )
        )
      )
    )
    and REVENUECTE.BALANCEINCURRENCY is not null
    and REVENUECTE.BALANCEINCURRENCY <> 0

  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.BALANCEINCURRENCY TRANSACTIONBALANCE,
    REVENUECTE.CURRENCYID,

    REVENUECTE.TRANSACTIONCURRENCYID,
    REVENUECTE.BASECURRENCYID,
    REVENUECTE.DATE,
    REVENUECTE.TRANSACTIONTYPECODE,
    REVENUECTE.TRANSACTIONTYPE,
    REVENUECTE.CONSTITUENTID,
    REVENUECTE.TRANSACTIONAMOUNT,
    REVENUECTE.AMOUNT,
    REVENUECTE.ORGANIZATIONAMOUNT,
    REVENUECTE.APPEALID,
    REVENUECTE.AMOUNTINCURRENCY,
    0 INTERMEDIATEBALANCE
  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 (  --We want an arbitrary balance and arbitrary <> transaction currency

      (@CURRENCYCODE is null or not @CURRENCYCODE in (0,1,2))
      and REVENUECTE.TRANSACTIONCURRENCYID <> REVENUECTE.CURRENCYID
      and REVENUECTE.BASECURRENCYID <> REVENUECTE.CURRENCYID
      and @ORGANIZATIONCURRENCYID <> REVENUECTE.CURRENCYID
    )
    and REVENUECTE.BALANCEINCURRENCY is not null
    and REVENUECTE.BALANCEINCURRENCY <> 0
)