USP_HOUSEHOLDSMARTFIELD_AGGREGATEREVENUEAMOUNTS

Returns aggregate revenue values to be used in various group revenue smart fields.

Parameters

Parameter Parameter Type Mode Description
@STARTDATE datetime IN
@ENDDATE datetime IN
@TYPECODES xml IN
@DESIGNATIONS xml IN
@AMOUNTCODES xml IN
@CALCULATIONTYPE tinyint IN
@ASOF datetime IN
@CAMPAIGNS xml IN
@DATETYPECODE tinyint IN
@STARTDATERECENTDATEUNITCODE tinyint IN
@STARTDATERECENTDATEINTERVAL int IN
@INCLUDEDATATYPECODE tinyint IN
@CURRENCYID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_HOUSEHOLDSMARTFIELD_AGGREGATEREVENUEAMOUNTS
(
    @STARTDATE datetime = null,
    @ENDDATE datetime = null,
    @TYPECODES xml = null,
    @DESIGNATIONS xml = null,
    @AMOUNTCODES xml = null,
    @CALCULATIONTYPE tinyint = 0,
    @ASOF datetime = null,
    @CAMPAIGNS xml = null,
    @DATETYPECODE tinyint = null,
    @STARTDATERECENTDATEUNITCODE tinyint = null,
    @STARTDATERECENTDATEINTERVAL int = null,
    @INCLUDEDATATYPECODE tinyint = 0, /*0: "Include data only from current household", 1: "Include historical data from current household members*/
    @CURRENCYID uniqueidentifier = null
)
with execute as owner
as

    /* This smart field will return an aggregation of revenue values for all households in the database. */

    set nocount on;    


    --Calculate start and end dates

  declare @COMPUTEDSTARTDATE datetime;
  declare @COMPUTEDENDDATE datetime;
  declare @CURRENTDATEEARLIESTTIME datetime;
  set @CURRENTDATEEARLIESTTIME = dbo.UFN_DATE_GETEARLIESTTIME(getdate());

  declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
  declare @DECIMALDIGITS tinyint;
  declare @ROUNDINGTYPECODE tinyint;
  declare @ORIGINCODE tinyint;
  declare @ASOFDATE datetime = getdate();

  set @CURRENCYID = isnull(@CURRENCYID, @ORGANIZATIONCURRENCYID);

  select @ORIGINCODE = coalesce([ORGANIZATIONAMOUNTORIGINCODE], 0) from dbo.[MULTICURRENCYCONFIGURATION];

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

  if @DATETYPECODE = 1
  begin
    set @COMPUTEDSTARTDATE = 
      case @STARTDATERECENTDATEUNITCODE
        when 0 then dateadd(year, -(@STARTDATERECENTDATEINTERVAL), @CURRENTDATEEARLIESTTIME)
        when 1 then dateadd(quarter, -(@STARTDATERECENTDATEINTERVAL), @CURRENTDATEEARLIESTTIME)
        when 2 then dateadd(month, -(@STARTDATERECENTDATEINTERVAL), @CURRENTDATEEARLIESTTIME)
        when 3 then dateadd(week, -(@STARTDATERECENTDATEINTERVAL), @CURRENTDATEEARLIESTTIME)
        when 4 then dateadd(day, -(@STARTDATERECENTDATEINTERVAL), @CURRENTDATEEARLIESTTIME)
      end;
    set @COMPUTEDENDDATE = null;
  end
  else
  begin
    -- Use "Specific dates" behavior for @DATETYPECODE = 1 and @DATETYPECODE is null for backwards compatibility

    set @COMPUTEDSTARTDATE = @STARTDATE;
    set @COMPUTEDENDDATE = @ENDDATE;
  end

    set @COMPUTEDSTARTDATE = dbo.UFN_DATE_GETEARLIESTTIME(@COMPUTEDSTARTDATE);
    set @COMPUTEDENDDATE = dbo.UFN_DATE_GETLATESTTIME(@COMPUTEDENDDATE);

    create table #REVENUEINFORMATION(
        REVENUEID uniqueidentifier,
        REVENUESPLITID uniqueidentifier,
        HOUSEHOLDID uniqueidentifier,
        AMOUNT money,
        DATE datetime
        primary key (REVENUEID, REVENUESPLITID, HOUSEHOLDID)
    );

    declare @AMOUNTCODESFILTER table(AMOUNTCODEID tinyint primary key);

    declare @INCLUDERECEIVED bit;
    declare @INCLUDEUNRECOGNIZED bit;
    declare @INCLUDEDEFERRED bit;

    if @AMOUNTCODES is null
        insert into @AMOUNTCODESFILTER(AMOUNTCODEID) values(0)
    else
        insert into @AMOUNTCODESFILTER(AMOUNTCODEID)
            select distinct T.c.value('(AMOUNTCODEID)[1]','tinyint')
            from @AMOUNTCODES.nodes('/AMOUNTCODES/ITEM') T(c)
    ;

    if exists (select AMOUNTCODEID from @AMOUNTCODESFILTER where AMOUNTCODEID = 0)
        set @INCLUDERECEIVED = 1;
    else
        set @INCLUDERECEIVED = 0;

    if exists (select AMOUNTCODEID from @AMOUNTCODESFILTER where AMOUNTCODEID = 1)
        set @INCLUDEUNRECOGNIZED = 1;
    else
        set @INCLUDEUNRECOGNIZED = 0;

    if exists (select AMOUNTCODEID from @AMOUNTCODESFILTER where AMOUNTCODEID = 2)
        set @INCLUDEDEFERRED = 1;
    else
        set @INCLUDEDEFERRED = 0;

    insert into #REVENUEINFORMATION(REVENUEID, REVENUESPLITID, HOUSEHOLDID, AMOUNT, DATE)
        select
            [DATA].REVENUEID,
            [DATA].REVENUESPLITID,
            [DATA].GROUPID,
            case when ([DATA].REVENUEDATE >= @COMPUTEDSTARTDATE OR @COMPUTEDSTARTDATE IS NULL) and ([DATA].REVENUEDATE <= @COMPUTEDENDDATE OR @COMPUTEDENDDATE IS NULL) THEN
            case when @INCLUDERECEIVED = 1 then
                case when @INCLUDEUNRECOGNIZED = 1 then
                    --Planned gift handling

                    case when REVENUE.TRANSACTIONTYPECODE = 4 then
                        case when dbo.UFN_PLEDGE_PAYMENTSEXIST(REVENUE.ID) = 0 then  --Deferred

                            case when @INCLUDEDEFERRED = 1 then
                                [REVENUE].[AMOUNTINCURRENCY]
                            else
                                -1
                            end
                        else
                         (select
                            [PLEDGEBALANCEINCURRENCY].[BALANCEINCURRENCY]
                          from 
                            dbo.[UFN_PLEDGE_GETBALANCEASOFINCURRENCY_BULK](@CURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE, @ASOFDATE, @ORIGINCODE, null) [PLEDGEBALANCEINCURRENCY]
                          where  
                            [PLEDGEBALANCEINCURRENCY].[ID] = [REVENUE].[ID]) --The unrecognized portion.

                        end
          when REVENUE.TRANSACTIONTYPECODE = 2 then
            -1
                    else
                        --If we're including pledge balances, we'll end up using the full pledge amount to avoid double calculations.

                        case when REVENUESPLIT.APPLICATIONCODE = 2 then
                            -1
                        else
                            [REVENUESPLIT].[AMOUNTINCURRENCY]
                        end
                    end
                else
                    case when REVENUE.TRANSACTIONTYPECODE = 4 then
                        case when @INCLUDEDEFERRED = 1 then
                            case when dbo.UFN_PLEDGE_PAYMENTSEXIST(REVENUE.ID) = 0 then  --Deferred

                                [REVENUE].[AMOUNTINCURRENCY]
                            else
                                -1
                            end
                        else
                            -1
                        end
                    when REVENUE.TRANSACTIONTYPECODE in (1,2) then
                        -1
                    else
                        [REVENUESPLIT].[AMOUNTINCURRENCY]
                    end
                end
            when @INCLUDEUNRECOGNIZED = 1 then
                --Planned gift handling.

                case when REVENUE.TRANSACTIONTYPECODE = 4 then
                    case when dbo.UFN_PLEDGE_PAYMENTSEXIST(REVENUE.ID) = 0 then  --Deferred

                        case when @INCLUDEDEFERRED = 1 then
                            [REVENUE].[AMOUNTINCURRENCY]
                        else
                            -1
                        end
                    else
                       (select
                          [PLEDGEBALANCEINCURRENCY].[BALANCEINCURRENCY]
                        from 
                          dbo.[UFN_PLEDGE_GETBALANCEASOFINCURRENCY_BULK](@CURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE, @ASOFDATE, @ORIGINCODE, null) [PLEDGEBALANCEINCURRENCY]
                        where  
                          [PLEDGEBALANCEINCURRENCY].[ID] = [REVENUE].[ID]) --The unrecognized portion.

                    end
                when REVENUE.TRANSACTIONTYPECODE = 1 then
                  (select
                    [PLEDGEBALANCEINCURRENCY].[BALANCEINCURRENCY]
                  from 
                    dbo.[UFN_PLEDGE_GETBALANCEASOFINCURRENCY_BULK](@CURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE, @ASOFDATE, @ORIGINCODE, null) [PLEDGEBALANCEINCURRENCY]
                  where  
              [PLEDGEBALANCEINCURRENCY].[ID] = [REVENUE].[ID])
                else
                    -1
                end
            when @INCLUDEDEFERRED = 1 then
                case when REVENUE.TRANSACTIONTYPECODE = 4 then
                    case when dbo.UFN_PLEDGE_PAYMENTSEXIST(REVENUE.ID) = 0 then  --Deferred

                        [REVENUE].[AMOUNTINCURRENCY]
                    else
                        -1
                    end
                else
                    -1
                end
            else
                -1
            end
            else 0 end as AMOUNT,
      [DATA].REVENUEDATE
    from dbo.UFN_GROUP_REVENUESPLITS_FORHOUSEHOLDSMARTFIELD(null, @TYPECODES, @DESIGNATIONS, @CAMPAIGNS, 0, @ASOF, 1, null, null, null) as [DATA]
    inner join dbo.[UFN_REVENUE_GETAMOUNTSINCURRENCY_BULK](@CURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) [REVENUE] on [DATA].[REVENUEID] = [REVENUE].[ID]
    inner join dbo.[UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK](@CURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) [REVENUESPLIT] on [DATA].[REVENUESPLITID] = [REVENUESPLIT].[ID]
    where  ((@INCLUDEDATATYPECODE = 0 and [DATA].GROUPMEMBERSHIPISHISTORICAL = 0) or (@INCLUDEDATATYPECODE = 1))
      and not [DATA].GROUPID is null

    /*
       Calculate totals based on calculation type. 
       The outer joins onto the CONSTITUENTFILTER.CONSTITUENTID column will have the effect of bringing back a single row per household.
    */
    if @CALCULATIONTYPE = 0 --Max(amount)

        select
            REVENUEINFORMATION.HOUSEHOLDID,
            coalesce(max(REVENUEINFORMATION.AMOUNT),0)
        from #REVENUEINFORMATION as REVENUEINFORMATION
        where
            (REVENUEINFORMATION.AMOUNT > 0)
        group by
            REVENUEINFORMATION.HOUSEHOLDID

    else if @CALCULATIONTYPE = 1 --Min(amount)

       select
            REVENUEINFORMATION.HOUSEHOLDID,
            coalesce(min(REVENUEINFORMATION.AMOUNT),0)
        from #REVENUEINFORMATION as REVENUEINFORMATION
        where
            (REVENUEINFORMATION.AMOUNT > 0)
        group by
            REVENUEINFORMATION.HOUSEHOLDID

    else if @CALCULATIONTYPE = 2 --Sum(amount)

       select
            REVENUEINFORMATION.HOUSEHOLDID,
            coalesce(sum(REVENUEINFORMATION.AMOUNT),0)
        from #REVENUEINFORMATION as REVENUEINFORMATION
        group by
            REVENUEINFORMATION.HOUSEHOLDID

    else if @CALCULATIONTYPE = 3 --Avg(amount) 

       select
            REVENUEINFORMATION.HOUSEHOLDID,
            coalesce(avg(REVENUEINFORMATION.AMOUNT),0)
        from #REVENUEINFORMATION as REVENUEINFORMATION
        where
            (REVENUEINFORMATION.AMOUNT > 0)
        group by
            REVENUEINFORMATION.HOUSEHOLDID

   else if @CALCULATIONTYPE = 4 --Min(date)

        select
          REVENUEINFORMATION.HOUSEHOLDID,
           coalesce(min(REVENUEINFORMATION.DATE),0)
        from #REVENUEINFORMATION as REVENUEINFORMATION
        where
               (REVENUEINFORMATION.AMOUNT > 0)
        group by
            REVENUEINFORMATION.HOUSEHOLDID

    else if @CALCULATIONTYPE = 5 --Max(date)

        select
          REVENUEINFORMATION.HOUSEHOLDID,
           coalesce(max(REVENUEINFORMATION.DATE),0)
        from #REVENUEINFORMATION as REVENUEINFORMATION
        where
               (REVENUEINFORMATION.AMOUNT > 0)
        group by
            REVENUEINFORMATION.HOUSEHOLDID

    else if @CALCULATIONTYPE = 6 --Largest revenue date

        select distinct
            REVENUEINFORMATION.HOUSEHOLDID,
            REVENUEINFORMATION.DATE
        from #REVENUEINFORMATION as REVENUEINFORMATION
        where
            (REVENUEINFORMATION.REVENUEID = (
                select
                    top 1 SUBREVENUEINFORMATION.REVENUEID
                from
                    #REVENUEINFORMATION as SUBREVENUEINFORMATION
                where
                    (SUBREVENUEINFORMATION.HOUSEHOLDID = REVENUEINFORMATION.HOUSEHOLDID)
                order by
                    SUBREVENUEINFORMATION.AMOUNT desc,
                    SUBREVENUEINFORMATION.DATE
                )
            );

    else if @CALCULATIONTYPE = 7 --Giving years

        select
            REVENUEINFORMATION.HOUSEHOLDID,
            coalesce(datediff(year,min(REVENUEINFORMATION.DATE), max(REVENUEINFORMATION.DATE)),0)
        from #REVENUEINFORMATION as REVENUEINFORMATION
        where
            REVENUEINFORMATION.AMOUNT > 0
        group by
            REVENUEINFORMATION.HOUSEHOLDID

    else if @CALCULATIONTYPE = 8 --Distinct giving years

        select
            REVENUEDATES.HOUSEHOLDID,
            count(REVENUEDATES.YEAR)
        from
            (
                select distinct
                    REVENUEINFORMATION.HOUSEHOLDID,
                    datepart(year, REVENUEINFORMATION.DATE) as YEAR
                from #REVENUEINFORMATION as REVENUEINFORMATION
            ) as REVENUEDATES
        group by
            REVENUEDATES.HOUSEHOLDID

    else if @CALCULATIONTYPE = 9 --Is annual giver

        select
            REVENUEDATES.HOUSEHOLDID,
            case REVENUEDATES.YEARS - 1
                when coalesce(datediff(year, min(REVENUEINFORMATION.DATE), max(REVENUEINFORMATION.DATE)), 0) then
                    cast(1 as bit)
                else
                    cast(0 as bit)
                end
        from #REVENUEINFORMATION as REVENUEINFORMATION
        left join 
            (
                select
                    REVENUEINFORMATION.HOUSEHOLDID,                    
                    count(datepart(year, REVENUEINFORMATION.DATE)) as YEARS
                from
                    #REVENUEINFORMATION as REVENUEINFORMATION
                group by
                    REVENUEINFORMATION.HOUSEHOLDID
            ) as REVENUEDATES on REVENUEDATES.HOUSEHOLDID = REVENUEINFORMATION.HOUSEHOLDID
        group by
            REVENUEDATES.HOUSEHOLDID,
            REVENUEDATES.YEARS
        order by REVENUEDATES.HOUSEHOLDID;
    else if @CALCULATIONTYPE = 10 --Count(REVENUE)

        select
            REVENUEINFORMATION.HOUSEHOLDID,
            count(REVENUEINFORMATION.REVENUEID)
        from #REVENUEINFORMATION as REVENUEINFORMATION 
        where
            (REVENUEINFORMATION.AMOUNT > 0)
        group by
            REVENUEINFORMATION.HOUSEHOLDID;   
   else if @CALCULATIONTYPE = 11 --First gift amount

        select
            REVENUEINFORMATION.HOUSEHOLDID,
            sum(REVENUEINFORMATION.AMOUNT)
        from #REVENUEINFORMATION as REVENUEINFORMATION
        where
            REVENUEINFORMATION.REVENUEID = 
                (select top 1 REVENUEID 
                 from #REVENUEINFORMATION as SUBREVENUEINFORMATION 
                 where SUBREVENUEINFORMATION.HOUSEHOLDID = REVENUEINFORMATION.HOUSEHOLDID
                 and SUBREVENUEINFORMATION.AMOUNT > 0 
                 order by SUBREVENUEINFORMATION.DATE asc)
        group by REVENUEINFORMATION.HOUSEHOLDID
  else if @CALCULATIONTYPE = 12 --Last gift amount

         select
            REVENUEINFORMATION.HOUSEHOLDID,
            sum(REVENUEINFORMATION.AMOUNT)
        from #REVENUEINFORMATION as REVENUEINFORMATION
        where
            REVENUEINFORMATION.REVENUEID = 
                (select top 1 REVENUEID 
                 from #REVENUEINFORMATION as SUBREVENUEINFORMATION 
                 where SUBREVENUEINFORMATION.HOUSEHOLDID = REVENUEINFORMATION.HOUSEHOLDID
                 and SUBREVENUEINFORMATION.AMOUNT > 0 
                 order by SUBREVENUEINFORMATION.DATE desc)
        group by REVENUEINFORMATION.HOUSEHOLDID

    drop table #REVENUEINFORMATION;