USP_MKTSEGMENTATIONREFRESH_MULTICURRENCY

Parameters

Parameter Parameter Type Mode Description
@ORGANIZATIONCURRENCYID uniqueidentifier IN
@BASECURRENCYID uniqueidentifier IN
@DATATABLENAME nvarchar(128) IN

Definition

Copy


create procedure dbo.[USP_MKTSEGMENTATIONREFRESH_MULTICURRENCY]
(
  @ORGANIZATIONCURRENCYID uniqueidentifier,
  @BASECURRENCYID uniqueidentifier,
  @DATATABLENAME nvarchar(128)
)
with execute as owner
as
begin
  set nocount on;
  declare @SQL nvarchar(max) = '';

  if @BASECURRENCYID = @ORGANIZATIONCURRENCYID
  begin
    --1. If the segment's currency is the organization currency, use the organization amount.

    set @SQL = 'set nocount on;
    update dbo.[' + @DATATABLENAME + '] set
      [AMOUNT] = [SUMS].[ORGAMOUNT],
      [ORGANIZATIONAMOUNT] = [SUMS].[ORGAMOUNT]
    from dbo.[' + @DATATABLENAME + '] as [T]
    inner join (
    select
      sum([FINANCIALTRANSACTIONLINEITEM].[ORGAMOUNT]) [ORGAMOUNT],
      [DATATABLE].[ID]
    from dbo.[' + @DATATABLENAME + '] [DATATABLE]
      inner join dbo.[FINANCIALTRANSACTION] on [FINANCIALTRANSACTION].[ID] = [DATATABLE].[ID]
      inner join dbo.[REVENUE_EXT] on [REVENUE_EXT].[ID] = [FINANCIALTRANSACTION].[ID]
      inner join dbo.[FINANCIALTRANSACTIONLINEITEM] on [FINANCIALTRANSACTIONLINEITEM].[FINANCIALTRANSACTIONID] = [FINANCIALTRANSACTION].[ID]
      inner join dbo.[REVENUESPLIT_EXT] on [FINANCIALTRANSACTIONLINEITEM].[ID] = [REVENUESPLIT_EXT].[ID]
    where [FINANCIALTRANSACTION].[DELETEDON] is null
      and [FINANCIALTRANSACTIONLINEITEM].[DELETEDON] is null
      and [FINANCIALTRANSACTION].[CONSTITUENTID] is not null
      and (
      ([FINANCIALTRANSACTION].[TYPECODE] in (0, 5) and [REVENUESPLIT_EXT].[APPLICATIONCODE] in (0, 1, 3, 5))
      or
      ([FINANCIALTRANSACTION].[TYPECODE] in (1, 3) and [REVENUESPLIT_EXT].[APPLICATIONCODE] = 0)
      or
      ([FINANCIALTRANSACTION].[TYPECODE] = 6 and [REVENUESPLIT_EXT].[APPLICATIONCODE] = 8)
      )
    group by
      [DATATABLE].[ID]
    ) [SUMS] on [SUMS].[ID] = [T].[ID];'
    exec sp_executesql @SQL;
  end
  else
  begin
    --2. If the segment's currency is the base currency of the gift, use the base currency.

    --using AMOUNT = 0 to signify that a conversion needs to be done: UFN_CURRENCYEXCHANGERATE_GETLATEST returns null 

    --if no applicable rate is found, UFN_CURRENCY_CONVERT returns 0 if passed a null rate ID, so 0 means that

    --UFN_CURRENCYEXCHANGERATE_GETLATEST returned null -- otherwise, I'd need to put an additional call to

    --UFN_CURRENCYEXCHANGERATE_GETLATEST in the where clause to tell which amounts still needed to be converted


    set @SQL = 'set nocount on;
    update dbo.[' + @DATATABLENAME + '] set
      [AMOUNT] = (case when isnull([REVENUE_EXT].[NONPOSTABLEBASECURRENCYID], [V].[BASECURRENCYID]) = @BASECURRENCYID then [T].[AMOUNT] else 0 end),
      [ORGANIZATIONAMOUNT] = [SUMS].[ORGAMOUNT]
    from dbo.[' + @DATATABLENAME + '] as [T]
    inner join dbo.[FINANCIALTRANSACTION] on [FINANCIALTRANSACTION].[ID] = [T].[ID]
    inner join dbo.[REVENUE_EXT] on [REVENUE_EXT].[ID] = [FINANCIALTRANSACTION].[ID]
    inner join dbo.[V_BASECURRENCYFORFINANCIALTRANSACTION_I] as [V] with (noexpand) on [FINANCIALTRANSACTION].[ID] = [V].[FINANCIALTRANSACTIONID]
    inner join (
    select
      sum([FINANCIALTRANSACTIONLINEITEM].[ORGAMOUNT]) [ORGAMOUNT],
      [DATATABLE].[ID]
    from dbo.[' + @DATATABLENAME + '] [DATATABLE]
      inner join dbo.[FINANCIALTRANSACTION] on [FINANCIALTRANSACTION].[ID] = [DATATABLE].[ID]
      inner join dbo.[REVENUE_EXT] on [REVENUE_EXT].[ID] = [FINANCIALTRANSACTION].[ID]
      inner join dbo.[FINANCIALTRANSACTIONLINEITEM] on [FINANCIALTRANSACTIONLINEITEM].[FINANCIALTRANSACTIONID] = [FINANCIALTRANSACTION].[ID]
      inner join dbo.[REVENUESPLIT_EXT] on [FINANCIALTRANSACTIONLINEITEM].[ID] = [REVENUESPLIT_EXT].[ID]
    where [FINANCIALTRANSACTION].[DELETEDON] is null
      and [FINANCIALTRANSACTIONLINEITEM].[DELETEDON] is null
      and [FINANCIALTRANSACTION].[CONSTITUENTID] is not null
      and (
      ([FINANCIALTRANSACTION].[TYPECODE] in (0, 5) and [REVENUESPLIT_EXT].[APPLICATIONCODE] in (0, 1, 3, 5))
     or
      ([FINANCIALTRANSACTION].[TYPECODE] in (1, 3) and [REVENUESPLIT_EXT].[APPLICATIONCODE] = 0)
      or
      ([FINANCIALTRANSACTION].[TYPECODE] = 6 and [REVENUESPLIT_EXT].[APPLICATIONCODE] = 8)
      )
    group by
      [DATATABLE].[ID]
    ) [SUMS] on [SUMS].[ID] = [V].[FINANCIALTRANSACTIONID];';
    exec sp_executesql @SQL, N'@ORGANIZATIONCURRENCYID uniqueidentifier, @BASECURRENCYID uniqueidentifier', @ORGANIZATIONCURRENCYID = @ORGANIZATIONCURRENCYID, @BASECURRENCYID = @BASECURRENCYID;

  --3. Otherwise, look for a corporate exchange rate from the organization currency to the segment's currency and apply this rate to the organization amount.

    set @SQL = 'set nocount on;
    update dbo.[' + @DATATABLENAME + '] set
      [AMOUNT] = dbo.[UFN_CURRENCY_CONVERT]([SUMS].[ORGAMOUNT], dbo.[UFN_CURRENCYEXCHANGERATE_GETLATEST](@ORGANIZATIONCURRENCYID, @BASECURRENCYID, [FINANCIALTRANSACTION].[DATEADDED], 0, null))
    from dbo.[' + @DATATABLENAME + '] as [T]
    inner join dbo.[FINANCIALTRANSACTION] on [FINANCIALTRANSACTION].[ID] = [T].[ID]
    inner join dbo.[REVENUE_EXT] on [REVENUE_EXT].[ID] = [FINANCIALTRANSACTION].[ID]
    inner join dbo.[V_BASECURRENCYFORFINANCIALTRANSACTION_I] as [V] with (noexpand) on [FINANCIALTRANSACTION].[ID] = [V].[FINANCIALTRANSACTIONID]
    inner join (
    select
      sum([FINANCIALTRANSACTIONLINEITEM].[ORGAMOUNT]) [ORGAMOUNT],
      [DATATABLE].[ID]
    from dbo.[' + @DATATABLENAME + '] [DATATABLE]
      inner join dbo.[FINANCIALTRANSACTION] on [FINANCIALTRANSACTION].[ID] = [DATATABLE].[ID]
      inner join dbo.[REVENUE_EXT] on [REVENUE_EXT].[ID] = [FINANCIALTRANSACTION].[ID]
      inner join dbo.[FINANCIALTRANSACTIONLINEITEM] on [FINANCIALTRANSACTIONLINEITEM].[FINANCIALTRANSACTIONID] = [FINANCIALTRANSACTION].[ID]
      inner join dbo.[REVENUESPLIT_EXT] on [FINANCIALTRANSACTIONLINEITEM].[ID] = [REVENUESPLIT_EXT].[ID]
    where [FINANCIALTRANSACTION].[DELETEDON] is null
      and [FINANCIALTRANSACTIONLINEITEM].[DELETEDON] is null
      and [FINANCIALTRANSACTION].[CONSTITUENTID] is not null
      and (
      ([FINANCIALTRANSACTION].[TYPECODE] in (0, 5) and [REVENUESPLIT_EXT].[APPLICATIONCODE] in (0, 1, 3, 5))
      or
      ([FINANCIALTRANSACTION].[TYPECODE] in (1, 3) and [REVENUESPLIT_EXT].[APPLICATIONCODE] = 0)
      or
      ([FINANCIALTRANSACTION].[TYPECODE] = 6 and [REVENUESPLIT_EXT].[APPLICATIONCODE] = 8)
      )
    group by
      [DATATABLE].[ID]
    ) [SUMS] on [SUMS].[ID] = [V].[FINANCIALTRANSACTIONID]
    where isnull([REVENUE_EXT].[NONPOSTABLEBASECURRENCYID], [V].[BASECURRENCYID]) <> @BASECURRENCYID
    and [T].[AMOUNT] = 0;';
    exec sp_executesql @SQL, N'@ORGANIZATIONCURRENCYID uniqueidentifier, @BASECURRENCYID uniqueidentifier', @ORGANIZATIONCURRENCYID = @ORGANIZATIONCURRENCYID, @BASECURRENCYID = @BASECURRENCYID;

    --4. If this rate does not exist, look for a corporate exchange rate from the segment's currency to the organization currency and apply the _inverse_ of this rate to the organization amount.

    set @SQL = 'set nocount on;
    update dbo.[' + @DATATABLENAME + '] set
      [AMOUNT] = dbo.[UFN_CURRENCY_CONVERTINVERSE]([SUMS].[ORGAMOUNT], dbo.[UFN_CURRENCYEXCHANGERATE_GETLATEST](@BASECURRENCYID, @ORGANIZATIONCURRENCYID, [FINANCIALTRANSACTION].[DATEADDED], 0, null))
    from dbo.[' + @DATATABLENAME + '] as [T]
    inner join dbo.[FINANCIALTRANSACTION] on [FINANCIALTRANSACTION].[ID] = [T].[ID]
    inner join dbo.[REVENUE_EXT] on [REVENUE_EXT].[ID] = [FINANCIALTRANSACTION].[ID]
    inner join dbo.[V_BASECURRENCYFORFINANCIALTRANSACTION_I] as [V] with (noexpand) on [FINANCIALTRANSACTION].[ID] = [V].[FINANCIALTRANSACTIONID]
    inner join (
    select
      sum([FINANCIALTRANSACTIONLINEITEM].[ORGAMOUNT]) [ORGAMOUNT],
      [DATATABLE].[ID]
    from dbo.[' + @DATATABLENAME + '] [DATATABLE]
      inner join dbo.[FINANCIALTRANSACTION] on [FINANCIALTRANSACTION].[ID] = [DATATABLE].[ID]
      inner join dbo.[REVENUE_EXT] on [REVENUE_EXT].[ID] = [FINANCIALTRANSACTION].[ID]
      inner join dbo.[FINANCIALTRANSACTIONLINEITEM] on [FINANCIALTRANSACTIONLINEITEM].[FINANCIALTRANSACTIONID] = [FINANCIALTRANSACTION].[ID]
      inner join dbo.[REVENUESPLIT_EXT] on [FINANCIALTRANSACTIONLINEITEM].[ID] = [REVENUESPLIT_EXT].[ID]
    where [FINANCIALTRANSACTION].[DELETEDON] is null
      and [FINANCIALTRANSACTIONLINEITEM].[DELETEDON] is null
      and [FINANCIALTRANSACTION].[CONSTITUENTID] is not null
      and (
      ([FINANCIALTRANSACTION].[TYPECODE] in (0, 5) and [REVENUESPLIT_EXT].[APPLICATIONCODE] in (0, 1, 3, 5))
      or
      ([FINANCIALTRANSACTION].[TYPECODE] in (1, 3) and [REVENUESPLIT_EXT].[APPLICATIONCODE] = 0)
      or
      ([FINANCIALTRANSACTION].[TYPECODE] = 6 and [REVENUESPLIT_EXT].[APPLICATIONCODE] = 8)
      )
    group by
      [DATATABLE].[ID]
    ) [SUMS] on [SUMS].[ID] = [V].[FINANCIALTRANSACTIONID]
    where isnull([REVENUE_EXT].[NONPOSTABLEBASECURRENCYID], [V].[BASECURRENCYID]) <> @BASECURRENCYID
    and [T].[AMOUNT] = 0;';
    exec sp_executesql @SQL, N'@ORGANIZATIONCURRENCYID uniqueidentifier, @BASECURRENCYID uniqueidentifier', @ORGANIZATIONCURRENCYID = @ORGANIZATIONCURRENCYID, @BASECURRENCYID = @BASECURRENCYID;

  end
end
return 0;