USP_CONSTITUENTIDSMARTFIELD_REVENUESPLIT

Returns revenue ID to be used in various constituent revenue application smart records.

Parameters

Parameter Parameter Type Mode Description
@STARTDATE datetime IN
@ENDDATE datetime IN
@CALCULATIONTYPE tinyint IN
@CALCULATEDREVENUE tinyint IN
@ASOF datetime IN
@DATETYPECODE tinyint IN
@STARTDATERECENTDATEUNITCODE tinyint IN
@STARTDATERECENTDATEINTERVAL int IN
@REVENUETYPECODES xml IN
@APPLICATIONTRANSACTIONTYPECODES xml IN
@REVENUEAPPLICATIONSELECTION uniqueidentifier IN
@RECOGNITIONTYPES xml IN
@CURRENCYID uniqueidentifier IN
@SMARTFIELDID uniqueidentifier IN
@SITES xml IN

Definition

Copy


            CREATE procedure dbo.USP_CONSTITUENTIDSMARTFIELD_REVENUESPLIT
            (
                @STARTDATE datetime = null,
                @ENDDATE datetime = null,
                @CALCULATIONTYPE tinyint,
                @CALCULATEDREVENUE tinyint,
                @ASOF datetime,                
                @DATETYPECODE tinyint = null,
                @STARTDATERECENTDATEUNITCODE tinyint = null,
                @STARTDATERECENTDATEINTERVAL int = null,        
                @REVENUETYPECODES xml = null,
                @APPLICATIONTRANSACTIONTYPECODES xml = null,                
                @REVENUEAPPLICATIONSELECTION uniqueidentifier = null,
                @RECOGNITIONTYPES xml = null,
                @CURRENCYID uniqueidentifier = null,
                @SMARTFIELDID uniqueidentifier = null,
                @SITES xml = null
            )
            with execute as owner
            as
                /*
                This smart field will return an aggregation of revenue application values for ALL constituents in the database
                */

                declare @DECIMALDIGITS tinyint;
                declare @ROUNDINGTYPECODE tinyint;
                declare @ORGANIZATIONCURRENCYID uniqueidentifier = 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;

                declare @REVENUETYPESFILTER table
                (
                    REVENUECODE tinyint primary key
                );

                declare @APPLICATIONTRANSACTIONTYPECODESFILTER table
                (
                    APPLICATIONCODE tinyint
                    TRANSACTIONTYPECODE tinyint
                );

                declare @RECOGNITIONTYPECODESFILTER table (
                    RECOGNITIONTYPECODEID uniqueidentifier primary key
                );

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

                create table #TMP_CONSTITUENTFILTER_REVENUESPLITAMOUNTS
                (
                    ID uniqueidentifier primary key
                );

                /*
                Calculate start and end dates
                */
                declare @CURRENTDATEEARLIESTTIME datetime;
                set @CURRENTDATEEARLIESTTIME = dbo.UFN_DATE_GETEARLIESTTIME(getdate());

                declare @COMPUTEDSTARTDATE datetime;
                declare @COMPUTEDENDDATE datetime;

                if @DATETYPECODE = 0
                begin        
                    set @COMPUTEDSTARTDATE = @STARTDATE;
                    set @COMPUTEDENDDATE = @ENDDATE;
                end
                else 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

                /* Load filter tables based on user selected conditions. */
                if @REVENUETYPECODES is not null
                begin
                    insert into @REVENUETYPESFILTER(REVENUECODE)
                        select distinct T.c.value('(REVENUETYPES)[1]','tinyint')
                        from @REVENUETYPECODES.nodes('/REVENUETYPECODES/ITEM') T(c);

                    if not exists (select 1 from @REVENUETYPESFILTER)
                        set @REVENUETYPECODES = null;
                end

                if @APPLICATIONTRANSACTIONTYPECODES is not null
                begin
                    insert into @APPLICATIONTRANSACTIONTYPECODESFILTER(APPLICATIONCODE, TRANSACTIONTYPECODE)
                        select 
                            T.c.value('(APPLICATION)[1]','tinyint') [APPLICATIONCODE],
                            T.c.value('(TRANSACTIONTYPE)[1]','tinyint') [TRANSACTIONTYPECODE]
                        from @APPLICATIONTRANSACTIONTYPECODES.nodes('/SELECTIONS/ITEM') T(c)
                        where T.c.value('(TRANSACTIONTYPE)[1]','tinyint') is not null;

                    if not exists (select 1 from @APPLICATIONTRANSACTIONTYPECODESFILTER)
                        set @APPLICATIONTRANSACTIONTYPECODES = null;
                end

                if @RECOGNITIONTYPES is not null
                begin
                    insert into @RECOGNITIONTYPECODESFILTER(RECOGNITIONTYPECODEID)
                        select T.c.value('(ID)[1]','uniqueidentifier')
                        from @RECOGNITIONTYPES.nodes('/RECOGNITIONTYPECODES/ITEM') T(c);

                    --JamesWill 2010-01-20 Some smart fields seem to be using the above XML and others the XML here.

                    --The correct fix would be to update all the smart fields to use the same XML. But we ship next week

                    --and I am not at all confident that I wouldn't miss one. I'd rather do this and ship without the bug.

                    if not exists (select 1 from @RECOGNITIONTYPECODESFILTER)
                        insert into @RECOGNITIONTYPECODESFILTER(RECOGNITIONTYPECODEID)
                            select T.c.value('(RECOGNITIONTYPECODEID)[1]','uniqueidentifier')
                            from @RECOGNITIONTYPES.nodes('/RECOGNITIONTYPES/ITEM') T(c);

                    if not exists (select 1 from @RECOGNITIONTYPECODESFILTER)
                        set @RECOGNITIONTYPES = null;
                end

                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)

                create table #CONSTITUENTSITEFILTER(ID uniqueidentifier primary key);
                insert into
                    #CONSTITUENTSITEFILTER(ID)
                select distinct
                    CONSTITUENTSITE.CONSTITUENTID
                from
                    CONSTITUENTSITE
                inner join
                    @SITESFILTER as SITES on SITES.ID = CONSTITUENTSITE.SITEID

                /*
                Find all valid constituents based on the date that the smart field was last updated.
                If there is no @ASOF value then all constituents need to be processed.
                If the date type is 'Recent dates' then all constituents need to be processed.
                If the calculation type is 'Consecutive giving year' then all constituents need to be processed.
                */

                declare @CONSTITUENTFILTERVIEW as nvarchar(50) = '#TMP_CONSTITUENTFILTER_REVENUESPLITAMOUNTS'
                if @ASOF is null or @CALCULATIONTYPE = 11 or (@DATETYPECODE = 1 and @STARTDATERECENTDATEINTERVAL is not null)
                begin
                    if @SITES is null
                    begin
                        set @CONSTITUENTFILTERVIEW = 'dbo.CONSTITUENT'
                    end
                    else
                    begin
                        insert into
                            #TMP_CONSTITUENTFILTER_REVENUESPLITAMOUNTS
                        select
                            ID
                        from
                            #CONSTITUENTSITEFILTER
                    end
                end
                else if @CALCULATEDREVENUE = 0 --REVENUE

                begin

                    if @SITES is null
                    begin
                        insert into #TMP_CONSTITUENTFILTER_REVENUESPLITAMOUNTS(ID)  
                        select CONSTITUENTID from dbo.FINANCIALTRANSACTION as REVENUE

                        where REVENUE.DATECHANGED > @ASOF and CONSTITUENTID is not null

                        union   
                        select REVENUEAUDIT.CONSTITUENTID   
                        from dbo.FINANCIALTRANSACTIONAUDIT as REVENUEAUDIT   
                        inner join dbo.CONSTITUENT on CONSTITUENT.ID = REVENUEAUDIT.CONSTITUENTID   
                        where REVENUEAUDIT.AUDITDATE > @ASOF and REVENUEAUDIT.TYPECODE in (0,1,2,3,4,5,6,7,8,9,15)

                        union   
                        select REVENUE.CONSTITUENTID   
                        from dbo.FINANCIALTRANSACTION as REVENUE   
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM as REVENUESPLIT on REVENUE.ID = REVENUESPLIT.FINANCIALTRANSACTIONID  
                        where REVENUESPLIT.DATECHANGED > @ASOF and REVENUE.CONSTITUENTID is not null

                        union   
                        select ID from dbo.CONSTITUENT where DATEADDED > @ASOF
                    end
                    else
                    begin
                        insert into #TMP_CONSTITUENTFILTER_REVENUESPLITAMOUNTS(ID)  
                        select CONSTITUENTID from dbo.FINANCIALTRANSACTION as REVENUE
                        inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = REVENUE.CONSTITUENTID 
                        where REVENUE.DATECHANGED > @ASOF and CONSTITUENTID is not null

                        union   
                        select REVENUEAUDIT.CONSTITUENTID   
                        from dbo.FINANCIALTRANSACTIONAUDIT as REVENUEAUDIT   
                        inner join dbo.CONSTITUENT on CONSTITUENT.ID = REVENUEAUDIT.CONSTITUENTID
                        inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = REVENUEAUDIT.CONSTITUENTID 
                        where REVENUEAUDIT.AUDITDATE > @ASOF and REVENUEAUDIT.TYPECODE in (0,1,2,3,4,5,6,7,8,9,15)

                        union   
                        select REVENUE.CONSTITUENTID   
                        from dbo.FINANCIALTRANSACTION as REVENUE   
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM as REVENUESPLIT on REVENUE.ID = REVENUESPLIT.FINANCIALTRANSACTIONID
                        inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = REVENUE.CONSTITUENTID  
                        where REVENUESPLIT.DATECHANGED > @ASOF and REVENUE.CONSTITUENTID is not null

                        union   
                        select CONSTITUENT.ID from dbo.CONSTITUENT 
                        inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = CONSTITUENT.ID 
                        where DATEADDED > @ASOF
                    end
                end
                else if @CALCULATEDREVENUE = 1 --Revenue Recognition

                begin
                    if @SITES is null
                    begin
                        insert into #TMP_CONSTITUENTFILTER_REVENUESPLITAMOUNTS(ID)   
                        select CONSTITUENTID from dbo.REVENUERECOGNITION where REVENUERECOGNITION.DATECHANGED > @ASOF and CONSTITUENTID is not null

                        union   
                        select CONSTITUENTID from dbo.REVENUERECOGNITIONAUDIT where REVENUERECOGNITIONAUDIT.AUDITDATE > @ASOF and CONSTITUENTID is not null

                        union   
                        select CONSTITUENTID from dbo.FINANCIALTRANSACTION as REVENUE where REVENUE.DATECHANGED > @ASOF and CONSTITUENTID is not null

                        union   
                        select REVENUEAUDIT.CONSTITUENTID   
                        from dbo.FINANCIALTRANSACTIONAUDIT as REVENUEAUDIT   
                        inner join dbo.CONSTITUENT on CONSTITUENT.ID = REVENUEAUDIT.CONSTITUENTID   
                        where REVENUEAUDIT.AUDITDATE > @ASOF and REVENUEAUDIT.TYPECODE in (0,1,2,3,4,5,6,7,8,9,15)

                        union   
                        select REVENUE.CONSTITUENTID   
                        from dbo.FINANCIALTRANSACTION as REVENUE   
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM as REVENUESPLIT on REVENUE.ID = REVENUESPLIT.FINANCIALTRANSACTIONID   
                        where REVENUESPLIT.DATECHANGED > @ASOF and REVENUE.CONSTITUENTID is not null

                        union  
                        select REVENUERECOGNITION.CONSTITUENTID  
                        from dbo.FINANCIALTRANSACTION as REVENUE  
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM as REVENUESPLIT on REVENUE.ID = REVENUESPLIT.FINANCIALTRANSACTIONID  
                        inner join dbo.REVENUERECOGNITION on REVENUESPLIT.ID = REVENUERECOGNITION.REVENUESPLITID  
                        where REVENUE.DATECHANGED > @ASOF and REVENUERECOGNITION.CONSTITUENTID is not null

                        union  
                        select REVENUERECOGNITION.CONSTITUENTID
                        from dbo.FINANCIALTRANSACTION as REVENUE
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM as REVENUESPLIT on REVENUE.ID = REVENUESPLIT.FINANCIALTRANSACTIONID
                        inner join dbo.REVENUERECOGNITION on REVENUESPLIT.ID = REVENUERECOGNITION.REVENUESPLITID  
                        where REVENUESPLIT.DATECHANGED > @ASOF and REVENUERECOGNITION.CONSTITUENTID is not null

                        union   
                        select ID from dbo.CONSTITUENT where DATEADDED > @ASOF;  
                    end
                    else
                    begin
                        insert into #TMP_CONSTITUENTFILTER_REVENUESPLITAMOUNTS(ID)   
                        select CONSTITUENTID from dbo.REVENUERECOGNITION 
                        inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = REVENUERECOGNITION.CONSTITUENTID
                        where REVENUERECOGNITION.DATECHANGED > @ASOF and CONSTITUENTID is not null

                        union   
                        select CONSTITUENTID from dbo.REVENUERECOGNITIONAUDIT 
                        inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = REVENUERECOGNITIONAUDIT.CONSTITUENTID
                        where REVENUERECOGNITIONAUDIT.AUDITDATE > @ASOF and CONSTITUENTID is not null

                        union   
                        select CONSTITUENTID from dbo.FINANCIALTRANSACTION as REVENUE 
                        inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = REVENUE.CONSTITUENTID
                        where REVENUE.DATECHANGED > @ASOF and CONSTITUENTID is not null

                        union   
                        select REVENUEAUDIT.CONSTITUENTID   
                        from dbo.FINANCIALTRANSACTIONAUDIT as REVENUEAUDIT
                        inner join dbo.CONSTITUENT on CONSTITUENT.ID = REVENUEAUDIT.CONSTITUENTID   
                        inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = REVENUEAUDIT.CONSTITUENTID
                        where REVENUEAUDIT.AUDITDATE > @ASOF and REVENUEAUDIT.TYPECODE in (0,1,2,3,4,5,6,7,8,9,15)

                        union   
                        select REVENUE.CONSTITUENTID   
                        from dbo.FINANCIALTRANSACTION as REVENUE   
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM as REVENUESPLIT on REVENUE.ID = REVENUESPLIT.FINANCIALTRANSACTIONID   
                        inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = REVENUE.CONSTITUENTID
                        where REVENUESPLIT.DATECHANGED > @ASOF and REVENUE.CONSTITUENTID is not null

                        union  
                        select REVENUERECOGNITION.CONSTITUENTID  
                        from dbo.FINANCIALTRANSACTION as REVENUE  
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM as REVENUESPLIT on REVENUE.ID = REVENUESPLIT.FINANCIALTRANSACTIONID  
                        inner join dbo.REVENUERECOGNITION on REVENUESPLIT.ID = REVENUERECOGNITION.REVENUESPLITID  
                        inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = REVENUE.CONSTITUENTID
                        where REVENUE.DATECHANGED > @ASOF and REVENUERECOGNITION.CONSTITUENTID is not null

                        union
                        select REVENUERECOGNITION.CONSTITUENTID  
                        from dbo.FINANCIALTRANSACTION as REVENUE  
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM as REVENUESPLIT on REVENUE.ID = REVENUESPLIT.FINANCIALTRANSACTIONID
                        inner join dbo.REVENUERECOGNITION on REVENUESPLIT.ID = REVENUERECOGNITION.REVENUESPLITID  
                        inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = REVENUE.CONSTITUENTID
                        where REVENUESPLIT.DATECHANGED > @ASOF and REVENUERECOGNITION.CONSTITUENTID is not null

                        union   
                        select CONSTITUENT.ID from dbo.CONSTITUENT 
                        inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = CONSTITUENT.ID 
                        where DATEADDED > @ASOF
                    end
                end

                drop table #CONSTITUENTSITEFILTER;

 /*
                Retrieve revenue application data based on filter criteria.  Only revenue data for constituents modified since the @ASOF value will be returned by this SP.
                */

                declare @revenuesql nvarchar(max) = ''
                declare @wheresql nvarchar(max) = ''

                set @revenuesql = 'declare @REVENUETYPESFILTER table
                (
                    REVENUECODE tinyint primary key
                );

                declare @APPLICATIONTRANSACTIONTYPECODESFILTER table
                (
                    APPLICATIONCODE tinyint, 
                    TRANSACTIONTYPECODE tinyint
                );

                declare @RECOGNITIONTYPECODESFILTER table (
                    RECOGNITIONTYPECODEID uniqueidentifier primary key
                );

                  if @REVENUETYPECODES is not null
                  begin
                        insert into @REVENUETYPESFILTER(REVENUECODE)
                              select distinct T.c.value(''(REVENUETYPES)[1]'',''tinyint'')
                              from @REVENUETYPECODES.nodes(''/REVENUETYPECODES/ITEM'') T(c);

                        if not exists (select 1 from @REVENUETYPESFILTER)
                              set @REVENUETYPECODES = null;
                  end

                  if @APPLICATIONTRANSACTIONTYPECODES is not null
                  begin
                        insert into @APPLICATIONTRANSACTIONTYPECODESFILTER(APPLICATIONCODE, TRANSACTIONTYPECODE)
                              select
                                    T.c.value(''(APPLICATION)[1]'',''tinyint''),
                                    T.c.value(''(TRANSACTIONTYPE)[1]'',''tinyint'')
                        from @APPLICATIONTRANSACTIONTYPECODES.nodes(''/SELECTIONS/ITEM'') T(c)
                        where T.c.value(''(TRANSACTIONTYPE)[1]'',''tinyint'') is not null;

                        if not exists (select 1 from @APPLICATIONTRANSACTIONTYPECODESFILTER)
                              set @APPLICATIONTRANSACTIONTYPECODES = null;
                  end

                if @RECOGNITIONTYPES is not null  
                begin  
                    insert into @RECOGNITIONTYPECODESFILTER(RECOGNITIONTYPECODEID)  
                      select T.c.value(''(RECOGNITIONTYPECODEID)[1]'',''uniqueidentifier'')  
                      from @RECOGNITIONTYPES.nodes(''/RECOGNITIONTYPES/ITEM'') T(c);  

                    if not exists (select 1 from @RECOGNITIONTYPECODESFILTER)  
                      set @RECOGNITIONTYPES = null;
                end;'

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

                create table #TMP_REVENUESPLITSITEFILTER(ID uniqueidentifier);

                declare @REVENUETABLEFUNCTIONALIAS nvarchar(100);
                declare @REVENUETABLETYPECODENAME nvarchar(100);
                declare @REVENUETABLESPLITID nvarchar(100);

                if @CALCULATEDREVENUE = 0 --REVENUE  

                begin

                    if @SITES is not null
                    begin
                        insert into #TMP_REVENUESPLITSITEFILTER
                        select distinct
                            REVENUESPLIT.ID
                        from
                            REVENUESPLIT
                        cross apply 
                            dbo.UFN_SITEID_MAPFROM_REVENUESPLITID(REVENUESPLIT.ID) as SITES
                        inner join
                            @SITESFILTER as SITESFILTER on SITESFILTER.ID = SITES.SITEID
                    end

                    set @revenuesql = @revenuesql + 
                        'with REVENUE_CTE as
                        (select
                            [REVENUESPLITAMOUNTINCURRENCY].[ID],
                            [REVENUESPLITAMOUNTINCURRENCY].[CONSTITUENTID],
                            case when [REVENUESPLITAMOUNTINCURRENCY].[TRANSACTIONTYPECODE] in(1,3) then 
                     [REVENUESPLITAMOUNTINCURRENCY].[AMOUNTINCURRENCY] - coalesce((
                                        select 
                                            sum([WRITEOFFSPLITAMOUNTINCURRENCY].[AMOUNTINCURRENCY]) as AMOUNT
                                        from dbo.[UFN_WRITEOFFSPLIT_GETAMOUNTINCURRENCY_BULK](@CURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as [WRITEOFFSPLITAMOUNTINCURRENCY]
                                        where [WRITEOFFSPLITAMOUNTINCURRENCY].[REVENUEID] = [REVENUESPLITAMOUNTINCURRENCY].[REVENUEID]
                                        ) ,0)
                                else
                                    [REVENUESPLITAMOUNTINCURRENCY].[AMOUNTINCURRENCY] end as AMOUNT,
                            [REVENUESPLITAMOUNTINCURRENCY].[DATE],
                            [REVENUESPLITAMOUNTINCURRENCY].[REVENUEDATEADDED] as DATEADDED,
                            [REVENUESPLITAMOUNTINCURRENCY].[TSLONG] '

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

                    if @CALCULATIONTYPE = 4
                        set @revenuesql = @revenuesql + char(10) +  ', ROW_NUMBER() over (partition by [REVENUESPLITAMOUNTINCURRENCY].[CONSTITUENTID] order by [REVENUESPLITAMOUNTINCURRENCY].[DATE] asc, [REVENUESPLITAMOUNTINCURRENCY].[REVENUEDATEADDED] asc, [REVENUESPLITAMOUNTINCURRENCY].[TSLONG] asc) as ROW '
                    else if @CALCULATIONTYPE = 5
                        set @revenuesql = @revenuesql + char(10) +  ', ROW_NUMBER() over (partition by [REVENUESPLITAMOUNTINCURRENCY].[CONSTITUENTID] order by [REVENUESPLITAMOUNTINCURRENCY].[DATE] desc, [REVENUESPLITAMOUNTINCURRENCY].[REVENUEDATEADDED] desc, [REVENUESPLITAMOUNTINCURRENCY].[TSLONG] desc) as ROW '

                    set @revenuesql = @revenuesql + '    
                        from dbo.[UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK](@CURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as [REVENUESPLITAMOUNTINCURRENCY] '

                    if @SITES is not null
                    begin
                        set @revenuesql = @revenuesql + ' inner join #TMP_REVENUESPLITSITEFILTER as [REVENUESPLITSITEFILTER] on [REVENUESPLITSITEFILTER].[ID] = [REVENUESPLITAMOUNTINCURRENCY].[ID]'
                    end

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

                    if @CONSTITUENTFILTERVIEW != 'dbo.CONSTITUENT'
                    begin
                        set @revenuesql = @revenuesql + ' inner join ' + @CONSTITUENTFILTERVIEW + ' as [CONSTITUENTFILTER] on [CONSTITUENTFILTER].[ID] = [REVENUESPLITAMOUNTINCURRENCY].[CONSTITUENTID]'
                    end
                    else
                    begin
                        if LEN(@wheresql) > 0
                            set @wheresql = @wheresql + ' and '
                        set @wheresql = @wheresql + ' ([REVENUESPLITAMOUNTINCURRENCY].[CONSTITUENTID] is not null)' 
                    end

                    if @COMPUTEDSTARTDATE is not null
                    begin  
                        if LEN(@wheresql) > 0
                            set @wheresql = @wheresql + ' and '
                        set @wheresql = @wheresql + ' ([REVENUESPLITAMOUNTINCURRENCY].[DATE] >= @COMPUTEDSTARTDATE)'
                    end

                    if @COMPUTEDENDDATE is not null
                    begin  
                        if LEN(@wheresql) > 0
                            set @wheresql = @wheresql + ' and '
                        set @wheresql = @wheresql + ' ([REVENUESPLITAMOUNTINCURRENCY].[DATE] <= @COMPUTEDENDDATE)'
                    end

                    set @REVENUETABLEFUNCTIONALIAS = 'REVENUESPLITAMOUNTINCURRENCY';
                    set @REVENUETABLETYPECODENAME = 'TYPECODE';
                    set @REVENUETABLESPLITID = 'ID';
                end
                else if @CALCULATEDREVENUE = 1 --Revenue Recognition

                begin        

                    insert into #TMP_REVENUESPLITSITEFILTER
                    select distinct
                        REVENUERECOGNITION.ID
                    from
                        REVENUERECOGNITION
                    inner join    
                        REVENUESPLIT on REVENUESPLIT.ID = REVENUERECOGNITION.REVENUESPLITID
                    cross apply 
                        dbo.UFN_SITEID_MAPFROM_REVENUESPLITID(REVENUESPLIT.ID) as SITES
                    inner join
                        @SITESFILTER as SITESFILTER on SITESFILTER.ID = SITES.SITEID

                    set @revenuesql = @revenuesql + '
                        with REVENUE_CTE as
                        (select    
                            [REVENUERECOGNITIONAMOUNTINCURRENCY].[REVENUESPLITID] as ID,
                            [REVENUERECOGNITIONAMOUNTINCURRENCY].[CONSTITUENTID],
                            [REVENUERECOGNITIONAMOUNTINCURRENCY].[AMOUNTINCURRENCY] as AMOUNT,
                            [REVENUERECOGNITIONAMOUNTINCURRENCY].[EFFECTIVEDATE] as DATE,
                            [REVENUERECOGNITIONAMOUNTINCURRENCY].[DATEADDED],
                            [REVENUERECOGNITIONAMOUNTINCURRENCY].TSLONG '

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

                    if @CALCULATIONTYPE = 4
                        set @revenuesql = @revenuesql + char(10) +  ', ROW_NUMBER() over (partition by [REVENUERECOGNITIONAMOUNTINCURRENCY].[CONSTITUENTID] order by [REVENUERECOGNITIONAMOUNTINCURRENCY].[EFFECTIVEDATE] asc, [REVENUERECOGNITIONAMOUNTINCURRENCY].[DATEADDED] asc, [REVENUERECOGNITIONAMOUNTINCURRENCY].[TSLONG] asc) as ROW '
                    else if @CALCULATIONTYPE = 5
                        set @revenuesql = @revenuesql + char(10) +  ', ROW_NUMBER() over (partition by [REVENUERECOGNITIONAMOUNTINCURRENCY].[CONSTITUENTID] order by [REVENUERECOGNITIONAMOUNTINCURRENCY].[EFFECTIVEDATE] desc, [REVENUERECOGNITIONAMOUNTINCURRENCY].[DATEADDED] desc, [REVENUERECOGNITIONAMOUNTINCURRENCY].[TSLONG] desc) as ROW '

                    set @revenuesql = @revenuesql + '
                        from dbo.[UFN_REVENUERECOGNITION_GETAMOUNTINCURRENCY_BULK](@CURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as [REVENUERECOGNITIONAMOUNTINCURRENCY] '

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

                    if @CONSTITUENTFILTERVIEW != 'dbo.CONSTITUENT'
                    begin
                        set @revenuesql = @revenuesql + ' inner join ' + @CONSTITUENTFILTERVIEW + ' as [CONSTITUENTFILTER] on [CONSTITUENTFILTER].[ID] = [REVENUERECOGNITIONAMOUNTINCURRENCY].[CONSTITUENTID]'
                    end
                    else
                    begin
                        if LEN(@wheresql) > 0
                            set @wheresql = @wheresql + ' and '
                        set @wheresql = @wheresql + ' ([REVENUERECOGNITIONAMOUNTINCURRENCY].[CONSTITUENTID] is not null)' 
                    end

                    if @STARTDATE is not null
                    begin  
                        if LEN(@wheresql) > 0
                            set @wheresql = @wheresql + ' and '
                        set @wheresql = @wheresql + ' ([REVENUERECOGNITIONAMOUNTINCURRENCY].[DATE] >= @STARTDATE)'
                    end

                    if @ENDDATE is not null
                    begin  
                        if LEN(@wheresql) > 0
                            set @wheresql = @wheresql + ' and '
                        set @wheresql = @wheresql + ' ([REVENUERECOGNITIONAMOUNTINCURRENCY].[DATE] <= @ENDDATE)'
                    end

                    if @RECOGNITIONTYPES is not null
                    begin
                        if LEN(@wheresql) > 0
                            set @wheresql = @wheresql + ' and '
                        set @wheresql = @wheresql + ' [REVENUERECOGNITIONAMOUNTINCURRENCY].[REVENUERECOGNITIONTYPECODEID] in (select [FILTER].RECOGNITIONTYPECODEID from @RECOGNITIONTYPECODESFILTER as [FILTER]) '
                    end 

                    set @REVENUETABLEFUNCTIONALIAS = 'REVENUERECOGNITIONAMOUNTINCURRENCY';
                    set @REVENUETABLETYPECODENAME = 'REVENUESPLITTYPECODE';
                    set @REVENUETABLESPLITID = 'REVENUESPLITID';
                end

                if @REVENUETYPECODES is not null
                begin
                    if LEN(@wheresql) > 0
                        set @wheresql = @wheresql + ' and '
                    set @wheresql = @wheresql + ' ([' + @REVENUETABLEFUNCTIONALIAS + '].[' + @REVENUETABLETYPECODENAME + '] in (select [SPLITTYPECODESFILTER].REVENUECODE from @REVENUETYPESFILTER as [SPLITTYPECODESFILTER])) '
                end

                if @APPLICATIONTRANSACTIONTYPECODES is not null
                begin
                    set @revenuesql = @revenuesql + char(10) + '
                        left join @APPLICATIONTRANSACTIONTYPECODESFILTER [FILTER]
                            on [FILTER].TRANSACTIONTYPECODE = [' + @REVENUETABLEFUNCTIONALIAS + '].[TRANSACTIONTYPECODE]
                            and [FILTER].APPLICATIONCODE = [' + @REVENUETABLEFUNCTIONALIAS + '].[APPLICATIONCODE] '

                    if LEN(@wheresql) > 0
                        set @wheresql = @wheresql + ' and '
                    set @wheresql = @wheresql + ' [FILTER].APPLICATIONCODE is not null '
                end

                if @REVENUEAPPLICATIONSELECTION is not null or @REVENUEAPPLICATIONSELECTION <> '00000000-0000-0000-0000-000000000000'  
                begin                      
                    declare @ISSTATIC bit = 0
                    declare @DBOBJECTTYPE tinyint = 0
                    declare @DBOBJECTNAME nvarchar(128)
                    declare @ADHOCQUERYID uniqueidentifier

                    select @DBOBJECTNAME = IDSETREGISTER.DBOBJECTNAME, @DBOBJECTTYPE = IDSETREGISTER.OBJECTTYPE, @ISSTATIC = IDSETREGISTER.STATIC, @ADHOCQUERYID=IDSETREGISTERADHOCQUERY.ADHOCQUERYID from dbo.IDSETREGISTER 
                        left join dbo.IDSETREGISTERADHOCQUERY on IDSETREGISTER.ID = IDSETREGISTERADHOCQUERY.IDSETREGISTERID
                        where IDSETREGISTER.ID = @REVENUEAPPLICATIONSELECTION

                    if  @DBOBJECTTYPE > 0
                        begin
                            if @DBOBJECTTYPE = 1 and @ISSTATIC = 1 and @ADHOCQUERYID is not null 
                                select @DBOBJECTNAME = dbo.UFN_ADHOCQUERY_MAKEIDSETSTATICTABLENAME(@ADHOCQUERYID)
                            else
                                set @DBOBJECTNAME = 'UFN_IDSETREADER_GETRESULTS_GUID(@REVENUEAPPLICATIONSELECTION)'
                        end

                    if LEN(@wheresql) > 0
                        set @wheresql = @wheresql + ' and '  

                    set @wheresql = @wheresql + '([' + @REVENUETABLEFUNCTIONALIAS + '].[' + @REVENUETABLESPLITID + '] in (select ID from dbo.' + @DBOBJECTNAME + '))'
                end  

                if LEN(@wheresql) > 0
                    set @wheresql = ' where ' + @wheresql  
                set @revenuesql = @revenuesql + @wheresql

                -- Backwards compatibility

                if @SMARTFIELDID is null
                    set @revenuesql = @revenuesql + ')'
                else
                    set @revenuesql = @revenuesql + '), SF_CTE (ID, VALUE) as ('

                /*
  Calculate totals based on calculation type.  
                */
                if @CALCULATIONTYPE = 0 --Largest

                    set @revenuesql = @revenuesql + '
                        select 
                            CONSTITUENTFILTER.ID,
                            REVENUERECORDS.ID as VALUE
                        from
                            ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
                            left outer join (
                                select
                                    ID,
                                    CONSTITUENTID,
                                    row_number() over(partition by CONSTITUENTID order by [AMOUNT] desc, [DATE] desc, [DATEADDED] desc, [TSLONG] desc) [ROW]
                                from REVENUE_CTE
                            ) as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
                        where 
                            REVENUERECORDS.CONSTITUENTID is null or REVENUERECORDS.ROW = 1';

                else if @CALCULATIONTYPE = 1 --Smallest

                    set @revenuesql = @revenuesql + '
                        select 
                            CONSTITUENTFILTER.ID,
                            REVENUERECORDS.ID as VALUE
                        from
                            ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
                            left outer join (
                                select
                                    ID,
                                    CONSTITUENTID,
                                    row_number() over(partition by CONSTITUENTID order by [AMOUNT] asc, [DATE] desc, [DATEADDED] desc, [TSLONG] desc) [ROW]
                                from REVENUE_CTE
                            ) as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
                        where 
                            REVENUERECORDS.CONSTITUENTID is null or REVENUERECORDS.ROW = 1';
                else --First revenue application, Latest revenue application

                    set @revenuesql = @revenuesql + '
                        select 
                            CONSTITUENTFILTER.ID,
                            REVENUERECORDS.ID as VALUE
                        from 
                            ' + @CONSTITUENTFILTERVIEW + ' as CONSTITUENTFILTER
                            left outer join REVENUE_CTE as REVENUERECORDS on CONSTITUENTFILTER.ID = REVENUERECORDS.CONSTITUENTID
                        where 
                            REVENUERECORDS.CONSTITUENTID is null or REVENUERECORDS.ROW = 1';

                -- Backwards compatibility

                if @SMARTFIELDID is null
                    insert into #TMP_CONSTITUENTSMARTFIELD_HH_REVENUESPLITANDRECOGNITIONS
                    exec sp_executesql @revenuesql,
                        N'@STARTDATE datetime,
                        @ENDDATE datetime,
                        @COMPUTEDSTARTDATE datetime,
                        @COMPUTEDENDDATE datetime,
                        @CURRENCYID uniqueidentifier,
                        @ORGANIZATIONCURRENCYID uniqueidentifier,
                        @DECIMALDIGITS tinyint,
                        @ROUNDINGTYPECODE tinyint,
                        @REVENUEAPPLICATIONSELECTION uniqueidentifier,
                        @RECOGNITIONTYPES xml,
                        @REVENUETYPECODES xml,
                        @APPLICATIONTRANSACTIONTYPECODES xml'
                        @STARTDATE = @STARTDATE
                        @ENDDATE = @ENDDATE,
                        @COMPUTEDSTARTDATE = @COMPUTEDSTARTDATE
                        @COMPUTEDENDDATE = @COMPUTEDENDDATE,
                        @CURRENCYID = @CURRENCYID
                        @ORGANIZATIONCURRENCYID = @ORGANIZATIONCURRENCYID
                        @DECIMALDIGITS = @DECIMALDIGITS
                    @ROUNDINGTYPECODE = @ROUNDINGTYPECODE,
                        @REVENUEAPPLICATIONSELECTION = @REVENUEAPPLICATIONSELECTION,
                        @RECOGNITIONTYPES = @RECOGNITIONTYPES,
                        @REVENUETYPECODES = @REVENUETYPECODES,
                        @APPLICATIONTRANSACTIONTYPECODES = @APPLICATIONTRANSACTIONTYPECODES;
                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 @revenuesql = @revenuesql + char(10) + ')
                        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 @revenuesql,
                        N'@STARTDATE datetime,
                        @ENDDATE datetime,
                        @COMPUTEDSTARTDATE datetime,
                        @COMPUTEDENDDATE datetime,
                        @CURRENCYID uniqueidentifier,
                        @ORGANIZATIONCURRENCYID uniqueidentifier,
                        @DECIMALDIGITS tinyint,
                        @ROUNDINGTYPECODE tinyint,
                        @REVENUEAPPLICATIONSELECTION uniqueidentifier,
                        @RECOGNITIONTYPES xml,
                        @REVENUETYPECODES xml,
                        @APPLICATIONTRANSACTIONTYPECODES xml'
                        @STARTDATE = @STARTDATE
                        @ENDDATE = @ENDDATE,
                        @COMPUTEDSTARTDATE = @COMPUTEDSTARTDATE
                        @COMPUTEDENDDATE = @COMPUTEDENDDATE,
                        @CURRENCYID = @CURRENCYID
                        @ORGANIZATIONCURRENCYID = @ORGANIZATIONCURRENCYID
                        @DECIMALDIGITS = @DECIMALDIGITS
                        @ROUNDINGTYPECODE = @ROUNDINGTYPECODE,
                        @REVENUEAPPLICATIONSELECTION = @REVENUEAPPLICATIONSELECTION,
                        @RECOGNITIONTYPES = @RECOGNITIONTYPES,
                        @REVENUETYPECODES = @REVENUETYPECODES,
                        @APPLICATIONTRANSACTIONTYPECODES = @APPLICATIONTRANSACTIONTYPECODES;

                    select @@ROWCOUNT;
                end