USP_CONSTITUENTSMARTFIELD_APPEALVALUES

Returns aggregate appeal values to be used in various constituent appeal smart fields.

Parameters

Parameter Parameter Type Mode Description
@STARTDATE datetime IN
@ENDDATE datetime IN
@BUSINESSUNITS xml IN
@CATEGORIES xml IN
@REPORTCODES xml IN
@SITES xml IN
@CALCULATIONTYPE tinyint IN
@ASOF datetime IN
@SMARTFIELDID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_CONSTITUENTSMARTFIELD_APPEALVALUES
(
  @STARTDATE datetime = null,
  @ENDDATE datetime = null,
  @BUSINESSUNITS xml,
  @CATEGORIES xml,
  @REPORTCODES xml,
  @SITES xml,
  @CALCULATIONTYPE tinyint = 0,
  @ASOF datetime,
  @SMARTFIELDID uniqueidentifier = null
)
with execute as owner
as
  /*
  This smart field will return an aggregation of appeal values for ALL constituents in the database
  */

  set nocount on;

  /*
  Find all valid constituents based on the date that the smart field was last updated.
  */
  declare @CONSTITUENTFILTERVIEW as nvarchar(60) = '#TMP_CONSTITUENTS_CONSTITUENTSMARTFIELD_APPEALVALUES'

  if @ASOF is null
    set @CONSTITUENTFILTERVIEW = 'dbo.CONSTITUENT'
  else
    begin
      if object_id('tempdb..#TMP_CONSTITUENTS_CONSTITUENTSMARTFIELD_APPEALVALUES') is not null
        drop table #TMP_CONSTITUENTS_CONSTITUENTSMARTFIELD_APPEALVALUES;

      create table #TMP_CONSTITUENTS_CONSTITUENTSMARTFIELD_APPEALVALUES (ID uniqueidentifier primary key);

      insert into #TMP_CONSTITUENTS_CONSTITUENTSMARTFIELD_APPEALVALUES (ID)
      select CONSTITUENTID from dbo.CONSTITUENTAPPEAL where CONSTITUENTAPPEAL.DATECHANGED > @ASOF
      union
      select CONSTITUENTID from dbo.CONSTITUENTAPPEALAUDIT inner join dbo.CONSTITUENT on CONSTITUENT.ID = CONSTITUENTAPPEALAUDIT.CONSTITUENTID where CONSTITUENTAPPEALAUDIT.AUDITDATE > @ASOF
      union
      select ID from dbo.CONSTITUENT where DATEADDED > @ASOF;
    end

  declare @SQL nvarchar(max);

  set @SQL = '
    declare @BUSINESSUNITSFILTER table(ID uniqueidentifier primary key);
    declare @CATEGORIESFILTER table(ID uniqueidentifier primary key);
    declare @REPORTCODESFILTER table(ID uniqueidentifier primary key);
    declare @SITESFILTER table(ID uniqueidentifier primary key);

    if @BUSINESSUNITS is not null
      insert into @BUSINESSUNITSFILTER (ID) select distinct
        T.c.value(''(BUSINESSUNITID)[1]'', ''uniqueidentifier'')
        FROM   @BUSINESSUNITS.nodes(''/BUSINESSUNITS/ITEM'') T(c)

    if @CATEGORIES is not null
      insert into @CATEGORIESFILTER (ID) select distinct
        T.c.value(''(CATEGORYID)[1]'', ''uniqueidentifier'')
        FROM   @CATEGORIES.nodes(''/CATEGORIES/ITEM'') T(c)

    if @SITES is not null
      insert into @SITESFILTER (ID) select distinct
        T.c.value(''(SITEID)[1]'', ''uniqueidentifier'')
        FROM   @SITES.nodes(''/SITES/ITEM'') T(c)

    if @REPORTCODES is not null
      insert into @REPORTCODESFILTER (ID) select distinct
        T.c.value(''(REPORTCODEID)[1]'', ''uniqueidentifier'')
        FROM @REPORTCODES.nodes(''/REPORTCODES/ITEM'') T(c);'

  set @SQL = @SQL + '
  with APPEAL_CTE (ID, CONSTITUENTID, DATESENT, NAME, ROW) as
    (select
      CONSTITUENTAPPEAL.ID,
      CONSTITUENTAPPEAL.CONSTITUENTID,
      CONSTITUENTAPPEAL.DATESENT,
      APPEAL.NAME,'

  -- Include a row number if needed for calculating an extreme.

  if @CALCULATIONTYPE = 2
    set @SQL = @SQL + char(10) + 'row_number() over (partition by CONSTITUENTAPPEAL.CONSTITUENTID order by CONSTITUENTAPPEAL.DATESENT desc, CONSTITUENTAPPEAL.DATEADDED desc) as ROW'
  else
    set @SQL = @SQL + char(10) + '0 as ROW'

  set @SQL = @SQL + char(10) + '
    from 
      dbo.CONSTITUENTAPPEAL
      inner join dbo.APPEAL on APPEAL.ID = CONSTITUENTAPPEAL.APPEALID'

  -- If the constituent filter is all constituents, then simply filtering out null is faster than joining

  if @ASOF is not null
      set @SQL = @SQL + char(10) + 'inner join ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER on CONSTITUENTFILTER.ID = CONSTITUENTAPPEAL.CONSTITUENTID'

  set @SQL = @SQL + char(10) + 'where'

  if @ASOF is null
      set @SQL = @SQL + char(10) + 'CONSTITUENTAPPEAL.CONSTITUENTID is not null and'

  set @SQL = @SQL + char(10) + '
      ((@STARTDATE is null) or (coalesce(CONSTITUENTAPPEAL.DATESENT, CONSTITUENTAPPEAL.DATEADDED) >= @STARTDATE))
      and ((@ENDDATE is null) or (coalesce(CONSTITUENTAPPEAL.DATESENT, CONSTITUENTAPPEAL.DATEADDED) <= @ENDDATE))
      and ((@BUSINESSUNITS is null) or exists (
        select top 1 1
        from dbo.APPEALBUSINESSUNIT
        inner join @BUSINESSUNITSFILTER as FILTER on FILTER.ID = APPEALBUSINESSUNIT.BUSINESSUNITCODEID
        where APPEALBUSINESSUNIT.APPEALID = CONSTITUENTAPPEAL.APPEALID
      ))
      and ((@CATEGORIES is null) or (APPEAL.APPEALCATEGORYCODEID in (select ID from @CATEGORIESFILTER)))
      and ((@SITES is null) or (APPEAL.SITEID in (select ID from @SITESFILTER)))
      and ((@REPORTCODES is null) or (APPEAL.APPEALREPORT1CODEID in (select ID from @REPORTCODESFILTER))))';

  -- backward compatibility

  if @SMARTFIELDID is not null
      set @SQL = @SQL + char(10) + ', SF_CTE (ID, VALUE) as ('

  /*
  Calculate totals based on calculation type.
  */
  if @CALCULATIONTYPE = 0 -- count(ID)

    set @SQL = @SQL + char(10) + '
      select
        CONSTITUENTFILTER.ID,
        isnull(count(CONSTITUENTAPPEALRECORDS.ID), 0) as VALUE
      from
        ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
        left outer join APPEAL_CTE as CONSTITUENTAPPEALRECORDS on CONSTITUENTFILTER.ID = CONSTITUENTAPPEALRECORDS.CONSTITUENTID
      group by
        CONSTITUENTFILTER.ID';

  else if @CALCULATIONTYPE = 1 -- datediff(year, x)

    set @SQL = @SQL + char(10) + '
      select
        CONSTITUENTFILTER.ID,
        isnull(datediff(year, min(CONSTITUENTAPPEALRECORDS.DATESENT), max(CONSTITUENTAPPEALRECORDS.DATESENT)), 0) as VALUE
      from
        ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
        left outer join APPEAL_CTE as CONSTITUENTAPPEALRECORDS on CONSTITUENTFILTER.ID = CONSTITUENTAPPEALRECORDS.CONSTITUENTID
      group by
        CONSTITUENTFILTER.ID';

  else if @CALCULATIONTYPE = 2 -- name

    set @SQL = @SQL + char(10) + '
      select
        CONSTITUENTFILTER.ID,
        isnull(CONSTITUENTAPPEALRECORDS.NAME, '''') as VALUE
      from
        ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
        left outer join APPEAL_CTE as CONSTITUENTAPPEALRECORDS on CONSTITUENTFILTER.ID = CONSTITUENTAPPEALRECORDS.CONSTITUENTID
      where
        CONSTITUENTAPPEALRECORDS.ID is null or CONSTITUENTAPPEALRECORDS.ROW = 1';

  -- Backwards compatibility

  if @SMARTFIELDID is null
    exec sp_executesql @SQL, N'@ASOF datetime,
          @STARTDATE datetime,
          @ENDDATE datetime,
          @BUSINESSUNITS xml,
          @CATEGORIES xml,
          @REPORTCODES xml,
          @SITES xml
          ',
          @ASOF,
          @STARTDATE,
          @ENDDATE,
          @BUSINESSUNITS,
          @CATEGORIES,
          @REPORTCODES,
          @SITES
  else
    begin
      declare @TARGET nvarchar(100);
      declare @TARGET_FIELD nvarchar(128);

      select
          @TARGET = TABLECATALOG.TABLENAME,
          @TARGET_FIELD = SMARTFIELD.VALUECOLUMNNAME
      from dbo.SMARTFIELD
      left join dbo.TABLECATALOG on SMARTFIELD.TABLECATALOGID = TABLECATALOG.ID
      where SMARTFIELD.ID = @SMARTFIELDID

      set @SQL = @SQL + ')
          merge dbo.' + @TARGET + ' as TARGET
          using SF_CTE as SOURCE
          on TARGET.ID = SOURCE.ID
          when matched then
              update set ' + @TARGET_FIELD + ' = SOURCE.VALUE
          when not matched by TARGET then
              insert (ID, ' + @TARGET_FIELD + ')
              values (SOURCE.ID, SOURCE.VALUE);';

      exec sp_executesql @SQL, N'@ASOF datetime,
            @STARTDATE datetime,
            @ENDDATE datetime,
            @BUSINESSUNITS xml,
            @CATEGORIES xml,
            @REPORTCODES xml,
            @SITES xml
            ',
            @ASOF,
            @STARTDATE,
            @ENDDATE,
            @BUSINESSUNITS,
            @CATEGORIES,
            @REPORTCODES,
            @SITES

   select @@ROWCOUNT;
    end