USP_MKTSMARTFIELD_LIFETIMEGIVINGVALUES

A sum total of all gifts on file

Parameters

Parameter Parameter Type Mode Description
@RECORDSOURCEID uniqueidentifier IN
@ASOF datetime IN
@CURRENCYID uniqueidentifier IN
@SITES xml IN

Definition

Copy


CREATE procedure dbo.[USP_MKTSMARTFIELD_LIFETIMEGIVINGVALUES]
(
  @RECORDSOURCEID uniqueidentifier,
  @ASOF datetime,
  @CURRENCYID uniqueidentifier = null,
  @SITES xml = null
)
with execute as owner
as
  set nocount on;

  declare @SQL nvarchar(max);

  begin try
    declare @ORGANIZATIONCURRENCYID uniqueidentifier;
    declare @DECIMALDIGITS tinyint;
    declare @ROUNDINGTYPECODE tinyint;

    if not exists (select T.c.value('(SITEID)[1]','uniqueidentifier') from @SITES.nodes('/SITES/ITEM') T(c))
      set @SITES = null;

    -- get the donor view info based on the record source

    declare @DONORSYSNAME sysname;
    declare @DONORIDFIELD sysname;

    select 
      @DONORSYSNAME = [OBJECTNAME],
      @DONORIDFIELD = [PRIMARYKEYFIELD]
    from dbo.[MKTRECORDSOURCE] 
    left join dbo.[QUERYVIEWCATALOG] on [MKTRECORDSOURCE].[ID] = [QUERYVIEWCATALOG].[ID]
    inner join dbo.[MKTRECORDSOURCEFIELDMAPPINGS] on [MKTRECORDSOURCE].[ID] = [MKTRECORDSOURCEFIELDMAPPINGS].[ID]
    where [MKTRECORDSOURCE].[ID] = @RECORDSOURCEID
    and dbo.[UFN_MKTRECORDSOURCE_VALIDFORPRODUCT]([MKTRECORDSOURCE].[ID]) = 1;

    -- get the gift view info based on the record source

    declare @GIFTSYSNAME sysname;
    declare @GIFTDONORIDFIELD sysname;
    declare @GIFTAMOUNT sysname;
    declare @GIFTDATEFIELD sysname;
    declare @GIFTDATECHANGEDFIELD sysname;
    declare @GIFTDATEADDEDFIELD sysname;
    declare @DATECHANGEDFIELD sysname;

    select 
      @GIFTSYSNAME = [OBJECTNAME],
      @GIFTDONORIDFIELD = [DONORIDFIELD],
      @GIFTAMOUNT = [AMOUNTFIELD],
      @GIFTDATEFIELD = [DATEFIELD],
      @GIFTDATECHANGEDFIELD = isnull([DATECHANGEDFIELD], ''),
      @GIFTDATEADDEDFIELD = isnull([DATEADDEDFIELD], '')
    from dbo.[MKTGIFTRECORDSOURCE] 
    left join dbo.[QUERYVIEWCATALOG] on [MKTGIFTRECORDSOURCE].[QUERYVIEWCATALOGID] = [QUERYVIEWCATALOG].[ID]
    where [MKTGIFTRECORDSOURCE].[ID] = @RECORDSOURCEID;

    --if GIFTDATECHANGEDFIELD and GIFTDATEADDEDFIELD is empty the smart field cannot work

    if @GIFTDATECHANGEDFIELD = '' and @GIFTDATEADDEDFIELD = ''
      raiserror(N'The gift''s ''Date changed'' field must be mapped for this smart field to process.', 15, 4);

    --set the date changed field to what is set

    if @GIFTDATECHANGEDFIELD != ''
      set @DATECHANGEDFIELD = @GIFTDATECHANGEDFIELD;
    else
      set @DATECHANGEDFIELD = @GIFTDATEADDEDFIELD;

    declare @RECORDSOURCE_VALIDFORBBEC as bit = dbo.[UFN_MKTRECORDSOURCE_VALIDFORBBEC](@RECORDSOURCEID);
    declare @SITESFILTER table ([ID] uniqueidentifier primary key);

    insert into @SITESFILTER ([ID]) 
      select distinct
        T.c.value('(SITEID)[1]','uniqueidentifier')
      from @SITES.nodes('/SITES/ITEM') T(c);

    if object_id('tempdb..#TMP_REVENUESITEFILTER') is not null
      drop table #TMP_REVENUESITEFILTER;

    create table #TMP_REVENUESITEFILTER ([ID] uniqueidentifier);

    if @SITES is not null
      begin
        insert into #TMP_REVENUESITEFILTER ([ID])
          select distinct
            [FINANCIALTRANSACTION].[ID]
          from dbo.[FINANCIALTRANSACTION]
          inner join dbo.[REVENUE_EXT] on [REVENUE_EXT].[ID] = [FINANCIALTRANSACTION].[ID]
          cross apply dbo.[UFN_SITEID_MAPFROM_REVENUEID]([FINANCIALTRANSACTION].[ID]) as [SITES]
          inner join @SITESFILTER as [SITESFILTER] on [SITESFILTER].[ID] = [SITES].[SITEID]
          where [FINANCIALTRANSACTION].[DELETEDON] is null;
      end

    if @RECORDSOURCE_VALIDFORBBEC = 1
      begin
        set @ORGANIZATIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();

        if @CURRENCYID is null
          set @CURRENCYID = @ORGANIZATIONCURRENCYID;

        select
          @DECIMALDIGITS = [CURRENCY].[DECIMALDIGITS],
          @ROUNDINGTYPECODE = [CURRENCY].[ROUNDINGTYPECODE]
        from dbo.[CURRENCY]
        where [CURRENCY].[ID] = @CURRENCYID;
      end

    if @ASOF is null
begin
        if @RECORDSOURCE_VALIDFORBBEC = 1
          begin
            set @SQL = 'with [CALC] ([ID], [VALUE]) as' + char(13) + 
                        '(' + char(13) + 
                        '  select [GIFT].[CONSTITUENTID], sum([GIFT].[AMOUNTINCURRENCY])' + char(13) + 
                        '  from dbo.[UFN_REVENUE_GETAMOUNTSINCURRENCY_BULK](''' + cast(@CURRENCYID as nvarchar(36)) + ''', ''' + cast(@ORGANIZATIONCURRENCYID as nvarchar(36)) + ''', ' + cast(@DECIMALDIGITS as nvarchar) + ', ' + cast(@ROUNDINGTYPECODE as nvarchar) + ') [GIFT]' + char(13);

              if @SITES is not null
                set @SQL += ' inner join #TMP_REVENUESITEFILTER as REVENUESITEFILTER on REVENUESITEFILTER.ID = [GIFT].[ID] ' + char(13);

              set @SQL += '  where (([GIFT].[TRANSACTIONTYPECODE] in (0, 5) and exists(select * from dbo.[REVENUESPLIT_EXT] inner join dbo.[FINANCIALTRANSACTIONLINEITEM] on [FINANCIALTRANSACTIONLINEITEM].[ID] = [REVENUESPLIT_EXT].[ID] where [FINANCIALTRANSACTIONLINEITEM].[FINANCIALTRANSACTIONID] = [GIFT].[ID] and [REVENUESPLIT_EXT].[APPLICATIONCODE] in (0, 1, 3, 5, 6, 7)))' + char(13) +
                          '    or ([GIFT].[TRANSACTIONTYPECODE] = 1 and exists(select * from dbo.[REVENUESPLIT_EXT] inner join dbo.[FINANCIALTRANSACTIONLINEITEM] on [FINANCIALTRANSACTIONLINEITEM].[ID] = [REVENUESPLIT_EXT].[ID] where [FINANCIALTRANSACTIONLINEITEM].[FINANCIALTRANSACTIONID] = [GIFT].[ID] and [REVENUESPLIT_EXT].[APPLICATIONCODE] = 0))' + char(13) + 
                          '    or ([GIFT].[TRANSACTIONTYPECODE] = 6 and exists(select * from dbo.[REVENUESPLIT_EXT] inner join dbo.[FINANCIALTRANSACTIONLINEITEM] on [FINANCIALTRANSACTIONLINEITEM].[ID] = [REVENUESPLIT_EXT].[ID] where [FINANCIALTRANSACTIONLINEITEM].[FINANCIALTRANSACTIONID] = [GIFT].[ID] and [REVENUESPLIT_EXT].[APPLICATIONCODE] = 8)))' + char(13);

            if @SITES is not null
              set @SQL += 'and ((@SITES is null) or exists(select 1 from dbo.[CONSTITUENTSITE] inner join dbo.[UFN_CONSTITUENT_GETSITES_FROMITEMLISTXML](@SITES) [SITES] on [SITES].[SITEID] = [CONSTITUENTSITE].[SITEID] where [CONSTITUENTSITE].[CONSTITUENTID] = [GIFT].[CONSTITUENTID]))' + char(13);

            set @SQL += '  group by [GIFT].[CONSTITUENTID]' + char(13) + 
                        ')' + char(13) + 
                        'select [CONSTITUENT].['+@DONORIDFIELD+'], isnull([CALC].[VALUE],0)' + char(13) + 
                        'from dbo.['+@DONORSYSNAME+'] [CONSTITUENT]' + char(13) +
                        'left join [CALC] on [CALC].[ID] = [CONSTITUENT].['+@DONORIDFIELD+']' + char(13);

            if @SITES is not null
              set @SQL += 'where ((@SITES is null) or exists(select 1 from dbo.[CONSTITUENTSITE] inner join dbo.[UFN_CONSTITUENT_GETSITES_FROMITEMLISTXML](@SITES) [SITES] on [SITES].[SITEID] = [CONSTITUENTSITE].[SITEID] where [CONSTITUENTSITE].[CONSTITUENTID] = [CONSTITUENT].[' + @DONORIDFIELD + ']))' + char(13);
          end
        else
          begin
            set @SQL = 'with [CALC] ([ID], [VALUE]) as' + char(13) + 
                        '(' + char(13) + 
                        '  select [GIFT].['+@GIFTDONORIDFIELD+'], sum([GIFT].['+@GIFTAMOUNT+'])' + char(13) + 
                        '  from dbo.['+@GIFTSYSNAME+'] [GIFT]' + char(13);

            if @SITES is not null
              set @SQL += 'where (@SITES is null) or exists(select 1 from dbo.[CONSTITUENTSITE] inner join dbo.[UFN_CONSTITUENT_GETSITES_FROMITEMLISTXML](@SITES) [SITES] on [SITES].[SITEID] = [CONSTITUENTSITE].[SITEID] where [CONSTITUENTSITE].[CONSTITUENTID] = [GIFT].[' + @GIFTDONORIDFIELD + '])' + char(13);

            set @SQL += '  group by [GIFT].['+@GIFTDONORIDFIELD+']' + char(13) + 
                        ')' + char(13) + 
                        'select [CONSTITUENT].['+@DONORIDFIELD+'], isnull([CALC].[VALUE],0)' + char(13) + 
                        'from dbo.['+@DONORSYSNAME+'] [CONSTITUENT]' + char(13) + 
                        'left join [CALC] on [CALC].[ID] = [CONSTITUENT].['+@DONORIDFIELD+']' + char(13);

            if @SITES is not null
              set @SQL += 'where ((@SITES is null) or exists(select 1 from dbo.[CONSTITUENTSITE] inner join dbo.[UFN_CONSTITUENT_GETSITES_FROMITEMLISTXML](@SITES) [SITES] on [SITES].[SITEID] = [CONSTITUENTSITE].[SITEID] where [CONSTITUENTSITE].[CONSTITUENTID] = [GIFT].[' + @GIFTDONORIDFIELD + ']))' + char(13);
          end

        if @SITES is null
          exec sp_executesql @SQL;
        else
          exec sp_executesql @SQL, N'@SITES xml', @SITES;
      end
    else
      begin
        --Find all affected constituents

        set @SQL = 'with CONSTITS ([ID]) as' + char(13) + 
                   '(' + char(13) + 
                   '  select [VIEW].['+@GIFTDONORIDFIELD+']' + char(13) + 
                   '  from dbo.['+@GIFTSYSNAME+'] [VIEW]' + char(13) +
             '  where [VIEW].['+@GIFTDONORIDFIELD+'] is not null' + char(13);

        if @SITES is not null
          set @SQL += 'and (@SITES is null) or exists(select 1 from dbo.[CONSTITUENTSITE] inner join dbo.[UFN_CONSTITUENT_GETSITES_FROMITEMLISTXML](@SITES) [SITES] on [SITES].[SITEID] = [CONSTITUENTSITE].[SITEID] where [CONSTITUENTSITE].[CONSTITUENTID] = [VIEW].[' + @GIFTDONORIDFIELD + '])' + char(13);

        set @SQL += '  group by [VIEW].['+@GIFTDONORIDFIELD+'] ' + char(13) + 
                    '  having max([VIEW].['+@DATECHANGEDFIELD+']) > @ASOF' + char(13);

        if @RECORDSOURCE_VALIDFORBBEC = 1
          set @SQL += dbo.[UFN_MKTSMARTFIELD_GETEXTRACONSTITS_DYNAMICSQL_2](@SITES);

        set @SQL += ')' + char(13) + 
                    --Calculate new values with available data

                    ', [CALC] ([ID], [VALUE]) as' + char(13) + 
                    '(' + char(13);

        if @RECORDSOURCE_VALIDFORBBEC = 1
          begin
            set @SQL += '  select [GIFT].[CONSTITUENTID], sum([GIFT].[AMOUNTINCURRENCY])' + char(13) + 
                        '  from dbo.[UFN_REVENUE_GETAMOUNTSINCURRENCY_BULK](''' + cast(@CURRENCYID as nvarchar(36)) + ''', ''' + cast(@ORGANIZATIONCURRENCYID as nvarchar(36)) + ''', ' + cast(@DECIMALDIGITS as nvarchar) + ', ' + cast(@ROUNDINGTYPECODE as nvarchar) + ') [GIFT]' + char(13);

            if @SITES is not null
              set @SQL += ' inner join #TMP_REVENUESITEFILTER as REVENUESITEFILTER on REVENUESITEFILTER.ID = [GIFT].[ID] ' + char(13);

            set @SQL += '  where (([GIFT].[TRANSACTIONTYPECODE] in (0, 5) and exists(select * from dbo.[REVENUESPLIT_EXT] inner join dbo.[FINANCIALTRANSACTIONLINEITEM] on [FINANCIALTRANSACTIONLINEITEM].[ID] = [REVENUESPLIT_EXT].[ID] where [FINANCIALTRANSACTIONLINEITEM].[FINANCIALTRANSACTIONID] = [GIFT].[ID] and [REVENUESPLIT_EXT].[APPLICATIONCODE] in (0, 1, 3, 5, 6, 7)))' + char(13) +
                        '    or ([GIFT].[TRANSACTIONTYPECODE] = 1 and exists(select * from dbo.[REVENUESPLIT_EXT] inner join dbo.[FINANCIALTRANSACTIONLINEITEM] on [FINANCIALTRANSACTIONLINEITEM].[ID] = [REVENUESPLIT_EXT].[ID] where [FINANCIALTRANSACTIONLINEITEM].[FINANCIALTRANSACTIONID] = [GIFT].[ID] and [REVENUESPLIT_EXT].[APPLICATIONCODE] = 0))' + char(13) + 
                        '    or ([GIFT].[TRANSACTIONTYPECODE] = 6 and exists(select * from dbo.[REVENUESPLIT_EXT] inner join dbo.[FINANCIALTRANSACTIONLINEITEM] on [FINANCIALTRANSACTIONLINEITEM].[ID] = [REVENUESPLIT_EXT].[ID] where [FINANCIALTRANSACTIONLINEITEM].[FINANCIALTRANSACTIONID] = [GIFT].[ID] and [REVENUESPLIT_EXT].[APPLICATIONCODE] = 8)))' + char(13);

            if @SITES is not null
              set @SQL += 'and ((@SITES is null) or exists(select 1 from dbo.[CONSTITUENTSITE] inner join dbo.[UFN_CONSTITUENT_GETSITES_FROMITEMLISTXML](@SITES) [SITES] on [SITES].[SITEID] = [CONSTITUENTSITE].[SITEID] where [CONSTITUENTSITE].[CONSTITUENTID] = [GIFT].[CONSTITUENTID]))' + char(13);

            set @SQL += '  group by [GIFT].[CONSTITUENTID]' + char(13) + 
                        ')' + char(13);
          end
        else
          begin
            set @SQL += ' select [GIFT].[' + @GIFTDONORIDFIELD + '], sum([GIFT].[' + @GIFTAMOUNT + '])' + char(13) + 
                        '  from [CONSTITS]' + char(13) + 
                        '  inner join dbo.[' + @GIFTSYSNAME + '] [GIFT] on [CONSTITS].[ID] = [GIFT].[' + @GIFTDONORIDFIELD + ']' + char(13);

            if @SITES is not null
              set @SQL += 'where ((@SITES is null) or exists(select 1 from dbo.[CONSTITUENTSITE] inner join dbo.[UFN_CONSTITUENT_GETSITES_FROMITEMLISTXML](@SITES) [SITES] on [SITES].[SITEID] = [CONSTITUENTSITE].[SITEID] where [CONSTITUENTSITE].[CONSTITUENTID] = [GIFT].[' + @GIFTDONORIDFIELD + ']))' + char(13);

            set @SQL += '  group by [GIFT].[' + @GIFTDONORIDFIELD + ']' + char(13) + 
                        ')' + char(13);
          end

        --Return affected constituents with new values

        set @SQL += 'select [CONSTITS].[ID], isnull([CALC].[VALUE],0)' + char(13) + 
                    'from [CONSTITS]' + char(13) + 
                    'left join [CALC] on [CALC].[ID] = [CONSTITS].[ID];' + char(13);

        if @SITES is null
          exec sp_executesql @SQL, N'@ASOF datetime', @ASOF = @ASOF;
        else
          exec sp_executesql @SQL, N'@ASOF datetime, @SITES xml', @ASOF = @ASOF, @SITES = @SITES;
      end
  end try

  begin catch
    exec dbo.[USP_RAISE_ERROR];
    return 1;
  end catch

  return 0;