USP_GROUP_REVENUESPLITS

Returns all revenue records for a constituent group.

Parameters

Parameter Parameter Type Mode Description
@GROUPID uniqueidentifier IN
@TYPECODES xml IN
@DESIGNATIONS xml IN
@CAMPAIGNS xml IN
@FILTERUNCERTAINGIFTSFORHISTORICALMEMBERS bit IN
@ASOF datetime IN
@INCLUDEGROUPSWITHNOREVENUE bit IN
@GROUPTYPECODE tinyint IN
@APPLICATIONTYPECODES xml IN
@REVENUESELECTIONID uniqueidentifier IN
@CURRENCYID uniqueidentifier IN
@SITES xml IN

Definition

Copy


CREATE procedure dbo.USP_GROUP_REVENUESPLITS
(
    @GROUPID uniqueidentifier,
    @TYPECODES xml,
    @DESIGNATIONS xml,
    @CAMPAIGNS xml,
    @FILTERUNCERTAINGIFTSFORHISTORICALMEMBERS bit,
    @ASOF datetime,
    @INCLUDEGROUPSWITHNOREVENUE bit,
    @GROUPTYPECODE tinyint,
    @APPLICATIONTYPECODES xml,
    @REVENUESELECTIONID uniqueidentifier,
    @CURRENCYID uniqueidentifier = null,
    @SITES xml = null
)
with execute as owner
as
begin
    declare @TODAY datetime;
    set @TODAY = getdate(); 

    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 @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

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

    create table #TMP_CONSTITUENTFILTER_GROUP_REVENUESPLITS (ID uniqueidentifier primary key, INCLUDESMEMBERGIVING bit not null);

    --JamesWill WI60704. There are too many complexities to use the @ASOF filter, so this will simply return all gifts

    --(Complexities include: want to return the same gifts for all household members; want to return households without revenue;

    --want to return individuals without households; etc. I was running into issues where some gifts were not getting counted

    --because of the @ASOF and things were inconsistent. This will be a little slower, but it will also be correct.

    insert into #TMP_CONSTITUENTFILTER_GROUP_REVENUESPLITS(ID, INCLUDESMEMBERGIVING) 
    select CONSTITUENT.ID,
        case when GROUPDATA.GROUPTYPECODE = 0 then 1 else coalesce(GROUPTYPE.INCLUDEMEMBERGIVING, 0) end
    from dbo.CONSTITUENT 
        inner join dbo.GROUPDATA on GROUPDATA.ID = CONSTITUENT.ID and (@GROUPTYPECODE is null or GROUPDATA.GROUPTYPECODE = @GROUPTYPECODE)
        left join dbo.GROUPTYPE on GROUPTYPE.ID = GROUPDATA.GROUPTYPEID
    where CONSTITUENT.ISGROUP = 1
        and @GROUPID is null or CONSTITUENT.ID = @GROUPID;

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

    create table #TMP_MEMBERS_GROUP_REVENUESPLITS
    (
        GROUPID uniqueidentifier,
        CONSTITUENTID uniqueidentifier,
        ISGROUP bit,
        DATEFROM datetime,
        DATETO datetime,
        ISHISTORICAL bit,
        GROUPTYPECODE tinyint
    );

    if @SITES is null
    begin
        -- No site filtering.

        insert into #TMP_MEMBERS_GROUP_REVENUESPLITS(GROUPID, CONSTITUENTID, ISGROUP, DATEFROM, DATETO, ISHISTORICAL, GROUPTYPECODE)
        select 
            FILTER.ID as [GROUPID],
            GROUPMEMBER.MEMBERID as [CONSTITUENTID],
            0 as [ISGROUP],
            GROUPMEMBERDATERANGE.DATEFROM,
            GROUPMEMBERDATERANGE.DATETO,
            case when GROUPMEMBERDATERANGE.DATETO is not null and GROUPMEMBERDATERANGE.DATETO < @TODAY then 1 else 0 end as [ISHISTORICAL],
            GROUPDATA.GROUPTYPECODE
        from #TMP_CONSTITUENTFILTER_GROUP_REVENUESPLITS as [FILTER]
            inner join dbo.GROUPMEMBER on GROUPMEMBER.GROUPID = FILTER.ID
            inner join dbo.GROUPDATA on GROUPDATA.ID = GROUPMEMBER.GROUPID
            left join dbo.GROUPMEMBERDATERANGE on GROUPMEMBERDATERANGE.GROUPMEMBERID = GROUPMEMBER.ID 
        where @GROUPID is null or FILTER.ID = @GROUPID
        union /*Also include giving by the household itself*/
        select
            FILTER.ID as [GROUPID],
            FILTER.ID as [CONSTITUENTID],
            1 as [ISGROUP],
            null as [DATEFROM],
            null as [DATETO],
            0 as [ISHISTORICAL],
            GROUPDATA.GROUPTYPECODE
        from #TMP_CONSTITUENTFILTER_GROUP_REVENUESPLITS as [FILTER]
            inner join dbo.GROUPDATA on GROUPDATA.ID = FILTER.ID
        where @GROUPID is null or FILTER.ID = @GROUPID;                        
    end
    else
    begin
        -- Filter out constituent records not available by sites.

        insert into #TMP_MEMBERS_GROUP_REVENUESPLITS(GROUPID, CONSTITUENTID, ISGROUP, DATEFROM, DATETO, ISHISTORICAL, GROUPTYPECODE)
        select 
            FILTER.ID as [GROUPID],
            GROUPMEMBER.MEMBERID as [CONSTITUENTID],
            0 as [ISGROUP],
            GROUPMEMBERDATERANGE.DATEFROM,
            GROUPMEMBERDATERANGE.DATETO,
            case when GROUPMEMBERDATERANGE.DATETO is not null and GROUPMEMBERDATERANGE.DATETO < @TODAY then 1 else 0 end as [ISHISTORICAL],
            GROUPDATA.GROUPTYPECODE
        from #TMP_CONSTITUENTFILTER_GROUP_REVENUESPLITS as [FILTER]
            inner join dbo.GROUPMEMBER on GROUPMEMBER.GROUPID = FILTER.ID
            inner join dbo.GROUPDATA on GROUPDATA.ID = GROUPMEMBER.GROUPID
            left join dbo.GROUPMEMBERDATERANGE on GROUPMEMBERDATERANGE.GROUPMEMBERID = GROUPMEMBER.ID 
            inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = GROUPMEMBER.MEMBERID
        where @GROUPID is null or FILTER.ID = @GROUPID
        union /*Also include giving by the household itself*/
        select
            FILTER.ID as [GROUPID],
            FILTER.ID as [CONSTITUENTID],
            1 as [ISGROUP],
            null as [DATEFROM],
            null as [DATETO],
            0 as [ISHISTORICAL],
            GROUPDATA.GROUPTYPECODE
        from #TMP_CONSTITUENTFILTER_GROUP_REVENUESPLITS as [FILTER]
            inner join dbo.GROUPDATA on GROUPDATA.ID = FILTER.ID
            inner join #CONSTITUENTSITEFILTER as CONSTITUENTSITEFILTER on CONSTITUENTSITEFILTER.ID = FILTER.ID
        where @GROUPID is null or FILTER.ID = @GROUPID;  

    end

    drop table #CONSTITUENTSITEFILTER;

    create index IX_TMP_MEMBERS_GROUP_REVENUESPLITS_GROUPID on #TMP_MEMBERS_GROUP_REVENUESPLITS (GROUPID, ISGROUP, ISHISTORICAL)
    create index IX_TMP_MEMBERS_GROUP_REVENUESPLITS_CONSTITUENTID on #TMP_MEMBERS_GROUP_REVENUESPLITS (CONSTITUENTID, ISGROUP, ISHISTORICAL)

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

    create table #TMP_REVENUE_GROUP_REVENUESPLITS
    (
        REVENUEID uniqueidentifier,
        REVENUEDATE datetime,
        REVENUECONSTITUENTID uniqueidentifier,
        REVENUESPLITID uniqueidentifier primary key,
        REVENUESPLITAMOUNT money,
        REVENUEDATEADDED datetime,
        TSLONG bigint
    );    

    declare @SPLITTYPECODESFILTER table (TYPECODE tinyint primary key);
    declare @DESIGNATIONSFILTER table (DESIGNATIONID uniqueidentifier primary key);
    declare @CAMPAIGNSFILTER table (CAMPAIGNID uniqueidentifier primary key);
    declare @APPLICATIONTYPECODESFILTER table (APPLICATIONCODE tinyint, TRANSACTIONTYPECODE tinyint);

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

        if not exists (select 1 from @SPLITTYPECODESFILTER)
            set @TYPECODES = null;
    end

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

        if not exists (select 1 from @APPLICATIONTYPECODESFILTER)
            set @APPLICATIONTYPECODES = null;
    end

    if @DESIGNATIONS is not null
    begin
        insert into @DESIGNATIONSFILTER(DESIGNATIONID)
        select T.c.value('(ID)[1]','uniqueidentifier')
        from @DESIGNATIONS.nodes('/DESIGNATIONS/ITEM') T(c);

        if not exists (select 1 from @DESIGNATIONSFILTER)
            set @DESIGNATIONS = null;
    end

    if @CAMPAIGNS is not null
    begin
        insert into @CAMPAIGNSFILTER(CAMPAIGNID)
        select T.c.value('(ID)[1]','uniqueidentifier')
        from @CAMPAIGNS.nodes('/CAMPAIGNS/ITEM') T(c);

        if not exists (select 1 from @CAMPAIGNSFILTER)
            set @CAMPAIGNS = null;
    end

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

    create table #TMP_REVENUESPLITSITEFILTER(ID uniqueidentifier);

    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

/*================================================================================================================================================================================*/
/***Replacing TBF with a CTE*/
/*================================================================================================================================================================================*/
    ;WITH REVENUESPLITAMOUNTINCURRENCY AS (
    select
        FTLI.ID,
        RES.APPLICATIONCODE,
        RES.[APPLICATION],
        FTLI.FINANCIALTRANSACTIONID REVENUEID,
        FT.CONSTITUENTID,
        RE.APPEALID,
        FT.TYPECODE as TRANSACTIONTYPECODE,
        FT.[TYPE] as TRANSACTIONTYPE,
        case when (@CURRENCYID is not null
                    and (@CURRENCYID <> @ORGANIZATIONCURRENCYID)
                    and @CURRENCYID <> FTB.BASECURRENCYID                        
        then
            case
                when [LATESTORGANIZATIONEXCHANGERATE].RATE is not null
                    then dbo.UFN_CURRENCY_ROUND(dbo.UFN_CURRENCY_APPLYRATE(FTLI.ORGAMOUNT, [LATESTORGANIZATIONEXCHANGERATE].RATE), @DECIMALDIGITS, @ROUNDINGTYPECODE)

                when [LATESTINVERSEORGANIZATIONEXCHANGERATE].RATE is not null
                    then dbo.UFN_CURRENCY_ROUND(dbo.UFN_CURRENCY_APPLYRATE(FTLI.ORGAMOUNT, cast((1 / [LATESTINVERSEORGANIZATIONEXCHANGERATE].RATE) as decimal(20,8))), @DECIMALDIGITS, @ROUNDINGTYPECODE)
                else
                    0
            end 
        else                    
            case
                when (@CURRENCYID is null) or (@CURRENCYID = @ORGANIZATIONCURRENCYID)
                    then FTLI.ORGAMOUNT
                else
                    FTLI.BASEAMOUNT    
            end 

        end [AMOUNTINCURRENCY],
        cast(FT.[DATE] as datetime) [DATE],
        RES.DESIGNATIONID,
        RES.TYPECODE,
        FTLI.[TYPE],
        FT.DATEADDED [REVENUEDATEADDED],
        FTLI.TSLONG,
        RE.CHANNELCODEID,
        FT.TRANSACTIONCURRENCYID,
        FTLI.DESCRIPTION, 
        FTLI.POSTDATE
    from
        dbo.FINANCIALTRANSACTIONLINEITEM as FTLI with (nolock)
        inner join dbo.FINANCIALTRANSACTION as FT with (nolock) on FTLI.FINANCIALTRANSACTIONID = FT.ID
        inner join dbo.V_BASECURRENCYFORFINANCIALTRANSACTION_I as FTB with (nolock) on FT.ID = FTB.FINANCIALTRANSACTIONID
        inner join dbo.REVENUE_EXT as RE on FT.ID = RE.ID
        inner join dbo.REVENUESPLIT_EXT as RES on FTLI.ID = RES.ID
        left outer join dbo.CURRENCYEXCHANGERATE LATESTORGANIZATIONEXCHANGERATE  with (nolock)
            on 
                @ORGANIZATIONCURRENCYID = LATESTORGANIZATIONEXCHANGERATE.FROMCURRENCYID
                and @CURRENCYID = LATESTORGANIZATIONEXCHANGERATE.TOCURRENCYID
                and LATESTORGANIZATIONEXCHANGERATE.TYPECODE in (0,1)
                and LATESTORGANIZATIONEXCHANGERATE.ISLATESTRATEFORASOFDATE = 1
                and dateadd(ms, 86399996, FT.[DATE]) >= LATESTORGANIZATIONEXCHANGERATE.ASOFDATESDTZ
    and dateadd(ms, 86399996, FT.[DATE]) <= LATESTORGANIZATIONEXCHANGERATE.NEXTRATEASOFDATEORMAXSDTZ
        left outer join dbo.CURRENCYEXCHANGERATE LATESTINVERSEORGANIZATIONEXCHANGERATE with (nolock)
            on
            @CURRENCYID = LATESTINVERSEORGANIZATIONEXCHANGERATE.FROMCURRENCYID
                and @ORGANIZATIONCURRENCYID= LATESTINVERSEORGANIZATIONEXCHANGERATE.TOCURRENCYID
                and LATESTINVERSEORGANIZATIONEXCHANGERATE.TYPECODE in (0,1)
                and LATESTINVERSEORGANIZATIONEXCHANGERATE.ISLATESTRATEFORASOFDATE = 1
                and dateadd(ms, 86399996, FT.[DATE]) >= LATESTINVERSEORGANIZATIONEXCHANGERATE.ASOFDATESDTZ
    and dateadd(ms, 86399996, FT.[DATE]) <= LATESTINVERSEORGANIZATIONEXCHANGERATE.NEXTRATEASOFDATEORMAXSDTZ where FTLI.DELETEDON is null)
,WRITEOFFSPLITAMOUNTINCURRENCY AS (
  select
    [WRITEOFFSPLIT].[ID],
    [WRITEOFFSPLIT].FINANCIALTRANSACTIONID [WRITEOFFID],
    [REVENUESPLIT_EXT].[DESIGNATIONID],
    case
      when (@CURRENCYID is null) or (@CURRENCYID = @ORGANIZATIONCURRENCYID) then [WRITEOFFSPLIT].[ORGAMOUNT]
      else [WRITEOFFSPLIT].[BASEAMOUNT]
    end as [AMOUNTINCURRENCY],
    [WRITEOFF].[PARENTID] as [REVENUEID]
  from dbo.FINANCIALTRANSACTION [WRITEOFF] with (nolock)
  inner join dbo.FINANCIALTRANSACTIONLINEITEM [WRITEOFFSPLIT] with (nolock) on [WRITEOFF].[ID] = [WRITEOFFSPLIT].[FINANCIALTRANSACTIONID]
  inner join dbo.REVENUESPLIT_EXT on WRITEOFFSPLIT.ID = REVENUESPLIT_EXT.ID
  inner join dbo.FINANCIALTRANSACTION [REVENUE] with (nolock) on [REVENUE].[ID] = [WRITEOFF].[PARENTID]
  inner join dbo.V_BASECURRENCYFORFINANCIALTRANSACTION_I V with (noexpand) on WRITEOFF.ID = V.FINANCIALTRANSACTIONID
  where 
    WRITEOFF.TYPECODE = 20 and WRITEOFF.DELETEDON is null and (
    (@CURRENCYID is null) or
    (@CURRENCYID = @ORGANIZATIONCURRENCYID) or
    (@CURRENCYID = V.BASECURRENCYID))

  union all

  select
    [WRITEOFFSPLIT].[ID],
    [WRITEOFFSPLIT].FINANCIALTRANSACTIONID [WRITEOFFID],
    [REVENUESPLIT_EXT].[DESIGNATIONID],
    case
      when [LATESTORGANIZATIONEXCHANGERATE].[RATE] is not null
        then dbo.[UFN_CURRENCY_ROUND](dbo.[UFN_CURRENCY_APPLYRATE]([WRITEOFFSPLIT].[ORGAMOUNT], [LATESTORGANIZATIONEXCHANGERATE].[RATE]), @DECIMALDIGITS, @ROUNDINGTYPECODE)

      when [LATESTINVERSEORGANIZATIONEXCHANGERATE].[RATE] is not null
        then dbo.[UFN_CURRENCY_ROUND](dbo.[UFN_CURRENCY_APPLYRATE]([WRITEOFFSPLIT].[ORGAMOUNT], cast((1 / [LATESTINVERSEORGANIZATIONEXCHANGERATE].[RATE]) as decimal(20,8))), @DECIMALDIGITS, @ROUNDINGTYPECODE)
      else
        0
    end [AMOUNTINCURRENCY],
    [WRITEOFF].[PARENTID] as [REVENUEID]
  from dbo.FINANCIALTRANSACTION [WRITEOFF] with (nolock)
  inner join dbo.FINANCIALTRANSACTIONLINEITEM [WRITEOFFSPLIT] with (nolock) on [WRITEOFF].[ID] = [WRITEOFFSPLIT].[FINANCIALTRANSACTIONID]
  inner join dbo.REVENUESPLIT_EXT on WRITEOFFSPLIT.ID = REVENUESPLIT_EXT.ID
  inner join dbo.FINANCIALTRANSACTION [REVENUE] with (nolock) on [REVENUE].[ID] = [WRITEOFF].[PARENTID]
  inner join dbo.V_BASECURRENCYFORFINANCIALTRANSACTION_I V with (noexpand) on WRITEOFF.ID = V.FINANCIALTRANSACTIONID
    outer apply
    (
      select
        [RATE]
      from dbo.[CURRENCYEXCHANGERATE]
      where
        @ORGANIZATIONCURRENCYID = [CURRENCYEXCHANGERATE].[FROMCURRENCYID] and
        @CURRENCYID = [CURRENCYEXCHANGERATE].[TOCURRENCYID] and
        [CURRENCYEXCHANGERATE].[TYPECODE] in (0,1) and
        [CURRENCYEXCHANGERATE].[ISLATESTRATEFORASOFDATE] = 1 and
        dateadd(ms, 86399996, cast(REVENUE.DATE as datetime)) >= CURRENCYEXCHANGERATE.ASOFDATESDTZ and
        dateadd(ms, 86399996, cast(REVENUE.DATE as datetime)) <= CURRENCYEXCHANGERATE.NEXTRATEASOFDATEORMAXSDTZ
    ) [LATESTORGANIZATIONEXCHANGERATE]
    outer apply
    (
      select
        [RATE]
      from dbo.[CURRENCYEXCHANGERATE]
      where
        @CURRENCYID = [CURRENCYEXCHANGERATE].[FROMCURRENCYID] and
        @ORGANIZATIONCURRENCYID= [CURRENCYEXCHANGERATE].[TOCURRENCYID] and
        [CURRENCYEXCHANGERATE].[TYPECODE] in (0,1) and
        [CURRENCYEXCHANGERATE].[ISLATESTRATEFORASOFDATE] = 1 and
        dateadd(ms, 86399996, cast(REVENUE.DATE as datetime)) >= CURRENCYEXCHANGERATE.ASOFDATESDTZ and
        dateadd(ms, 86399996, cast(REVENUE.DATE as datetime)) <= CURRENCYEXCHANGERATE.NEXTRATEASOFDATEORMAXSDTZ
    ) [LATESTINVERSEORGANIZATIONEXCHANGERATE]
    where 
      WRITEOFF.TYPECODE = 20 and WRITEOFF.DELETEDON is null and (
      (@CURRENCYID is not null) and
      (@CURRENCYID <> @ORGANIZATIONCURRENCYID) and
      (@CURRENCYID <> V.BASECURRENCYID))
      )

/*================================================================================================================================================================================*/    
/*================================================================================================================================================================================*/


    insert into #TMP_REVENUE_GROUP_REVENUESPLITS(REVENUEID, REVENUEDATE, REVENUECONSTITUENTID, REVENUESPLITID, REVENUESPLITAMOUNT, REVENUEDATEADDED, TSLONG)
    select 
        [REVENUESPLITAMOUNTINCURRENCY].[REVENUEID] as [REVENUEID], 
        [REVENUESPLITAMOUNTINCURRENCY].[DATE] as [REVENUEDATE], 
        [REVENUESPLITAMOUNTINCURRENCY].[CONSTITUENTID] as [REVENUECONSTITUENTID], 
        [REVENUESPLITAMOUNTINCURRENCY].[ID] as [REVENUESPLITID], 
        [REVENUESPLITAMOUNTINCURRENCY].[AMOUNTINCURRENCY] - coalesce(sum([WRITEOFFSPLITAMOUNTINCURRENCY].[AMOUNTINCURRENCY]),0) [REVENUESPLITAMOUNT],
        [REVENUESPLITAMOUNTINCURRENCY].[REVENUEDATEADDED] as [REVENUEDATEADDED],
        [REVENUESPLITAMOUNTINCURRENCY].[TSLONG]
    from REVENUESPLITAMOUNTINCURRENCY
        left join WRITEOFFSPLITAMOUNTINCURRENCY on [WRITEOFFSPLITAMOUNTINCURRENCY].[REVENUEID] = [REVENUESPLITAMOUNTINCURRENCY].[REVENUEID]
                                                and [WRITEOFFSPLITAMOUNTINCURRENCY].[DESIGNATIONID] = [REVENUESPLITAMOUNTINCURRENCY].[DESIGNATIONID]
        left join #TMP_REVENUESPLITSITEFILTER REVENUESPLITSITEFILTER on REVENUESPLITSITEFILTER.ID = REVENUESPLITAMOUNTINCURRENCY.ID
    where
        [REVENUESPLITAMOUNTINCURRENCY].[CONSTITUENTID] is not null and
        (@TYPECODES is null 
            or(
                [REVENUESPLITAMOUNTINCURRENCY].[TYPECODE] in (
                    select TYPECODE
                    from @SPLITTYPECODESFILTER
                )
            )
        )
        and (@APPLICATIONTYPECODES is null 
            or exists (
                select 1 
                from @APPLICATIONTYPECODESFILTER
                where TRANSACTIONTYPECODE is not null
                    and TRANSACTIONTYPECODE = [REVENUESPLITAMOUNTINCURRENCY].[TRANSACTIONTYPECODE]
                    and APPLICATIONCODE = [REVENUESPLITAMOUNTINCURRENCY].[APPLICATIONCODE]
            )
        )
        and (@DESIGNATIONS is null 
            or (
                [REVENUESPLITAMOUNTINCURRENCY].[DESIGNATIONID] in (
                    select DESIGNATIONID
                    from @DESIGNATIONSFILTER
                )
            )
        )
        and (@CAMPAIGNS is null 
            or (
                [REVENUESPLITAMOUNTINCURRENCY].[ID] in (
                    select [REVENUESPLITCAMPAIGN].[REVENUESPLITID] 
                    from dbo.[REVENUESPLITCAMPAIGN] 
                        inner join @CAMPAIGNSFILTER as [CAMPAIGNSFILTER] on [CAMPAIGNSFILTER].[CAMPAIGNID] = [REVENUESPLITCAMPAIGN].[CAMPAIGNID]
                )
            )
        )
        and (@SITES is null
            or ( [REVENUESPLITSITEFILTER].[ID] is not null )
        )
    group by
        [REVENUESPLITAMOUNTINCURRENCY].[REVENUEID], 
        [REVENUESPLITAMOUNTINCURRENCY].[DATE], 
        [REVENUESPLITAMOUNTINCURRENCY].[CONSTITUENTID], 
        [REVENUESPLITAMOUNTINCURRENCY].[ID], 
        [REVENUESPLITAMOUNTINCURRENCY].[AMOUNTINCURRENCY],
        [REVENUESPLITAMOUNTINCURRENCY].[REVENUEDATEADDED],
        [REVENUESPLITAMOUNTINCURRENCY].[TSLONG]

    if @REVENUESELECTIONID is not null or @REVENUESELECTIONID <> '00000000-0000-0000-0000-000000000000'
    begin
        declare @DBOBJECTNAME nvarchar(max);  
        declare @DBOBJECTTYPE smallint;

        select
            @DBOBJECTNAME = [DBOBJECTNAME],  
            @DBOBJECTTYPE = [OBJECTTYPE]  
        from dbo.[IDSETREGISTER]  
        where [ID] = @REVENUESELECTIONID;

        if left(@DBOBJECTNAME, 1) <> '['  
            set @DBOBJECTNAME = '[' + @DBOBJECTNAME + ']';  

        if @DBOBJECTTYPE = 1  
        begin  
            set @DBOBJECTNAME = @DBOBJECTNAME + '(';  
            set @DBOBJECTNAME = @DBOBJECTNAME + ')';  
        end  
        else  
        begin  
            if @DBOBJECTTYPE = 2  
                set @DBOBJECTNAME = @DBOBJECTNAME + '(''' + convert(nvarchar(36), @REVENUESELECTIONID) + ''')';
        end

        declare @SELECTIONSQL nvarchar(max) = '
            delete #TMP_REVENUE_GROUP_REVENUESPLITS
            where REVENUESPLITID not in (select [ID] from dbo.' + @DBOBJECTNAME + ')';

        exec sp_executesql @SELECTIONSQL;
    end

    insert into #TMP_GROUP_REVENUESPLITS
    select 
        [CTE_MEMBERS].GROUPID,
        [CTE_MEMBERS].GROUPTYPECODE,
        [CTE_MEMBERS].CONSTITUENTID as [GROUPMEMBERID],
        [CTE_MEMBERS].ISGROUP,
        [CTE_MEMBERS].DATEFROM as [GROUPMEMBERSHIPSTARTDATE],
        [CTE_MEMBERS].DATETO as [GROUPMEMBERSHIPENDDATE],
        [CTE_MEMBERS].ISHISTORICAL as [GROUPMEMBERSHIPISHISTORICAL],
        [CTE_REVENUE].REVENUEID, 
        [CTE_REVENUE].REVENUESPLITID,
        [CTE_REVENUE].REVENUEDATE,
        [CTE_REVENUE].REVENUESPLITAMOUNT as [REVENUESPLITAMOUNT],
        [CTE_REVENUE].REVENUEDATEADDED,
        [CTE_REVENUE].TSLONG
    from #TMP_MEMBERS_GROUP_REVENUESPLITS [CTE_MEMBERS]
        inner join #TMP_REVENUE_GROUP_REVENUESPLITS [CTE_REVENUE] on [CTE_MEMBERS].CONSTITUENTID = [CTE_REVENUE].REVENUECONSTITUENTID
    where [CTE_MEMBERS].ISGROUP = 1 
        or [CTE_MEMBERS].ISHISTORICAL = 0
        or ([CTE_MEMBERS].ISHISTORICAL = 1 and (@FILTERUNCERTAINGIFTSFORHISTORICALMEMBERS = 0 or ([CTE_REVENUE].REVENUEDATE < [CTE_MEMBERS].DATETO)))

    union all --Include individuals who are not in the selected groups


    select
        null,
        null,
        CONSTITUENT.ID,
        0,
        null,
        null,
        0,
        [CTE_REVENUE].REVENUEID, 
        [CTE_REVENUE].REVENUESPLITID,
        [CTE_REVENUE].REVENUEDATE,
        [CTE_REVENUE].REVENUESPLITAMOUNT as [REVENUESPLITAMOUNT],
        [CTE_REVENUE].REVENUEDATEADDED,
        [CTE_REVENUE].TSLONG
    from #TMP_REVENUE_GROUP_REVENUESPLITS [CTE_REVENUE]
        inner join dbo.CONSTITUENT on CONSTITUENT.ID = [CTE_REVENUE].REVENUECONSTITUENTID
    where CONSTITUENT.ID not in (select ID from dbo.GROUPDATA)
        and CONSTITUENT.ID not in (select CONSTITUENTID from #TMP_MEMBERS_GROUP_REVENUESPLITS where #TMP_MEMBERS_GROUP_REVENUESPLITS.ISHISTORICAL = 0)
        and @GROUPID is null

    if @INCLUDEGROUPSWITHNOREVENUE = 1
        insert into #TMP_GROUP_REVENUESPLITS
        select 
            CONSTITUENT.ID as [GROUPID],
            GROUPDATA.GROUPTYPECODE,
            CONSTITUENT.ID as [GROUPMEMBERID],
            1 as [ISGROUP],
            null as [GROUPMEMBERSHIPSTARTDATE],
            null as [GROUPMEMBERSHIPENDDATE],
            0 as [GROUPMEMBERSHIPISHISTORICAL],
            null as [REVENUEID],
            null as [REVENUESPLITID],
            null as [REVENUEDATE],
            null as [REVENUESPLITAMOUNT],
            null as [REVENUEDATEADDED],
            0 as [TSLONG]
        from dbo.CONSTITUENT
            inner join dbo.GROUPDATA on GROUPDATA.ID = CONSTITUENT.ID
            left join #TMP_GROUP_REVENUESPLITS as [RESULT] on [RESULT].GROUPID = CONSTITUENT.ID
        where [RESULT].GROUPID is null and (CONSTITUENT.ID = @GROUPID or @GROUPID is null)

    create index IX_TMP_GROUP_REVENUESPLITS_GROUPID on #TMP_GROUP_REVENUESPLITS (GROUPID)
    create index IX_TMP_GROUP_REVENUESPLITS_GROUPMEMBERID on #TMP_GROUP_REVENUESPLITS (GROUPMEMBERID)
    create index IX_TMP_GROUP_REVENUESPLITS_REVENUEDATE on #TMP_GROUP_REVENUESPLITS (REVENUEDATE)

end