UFN_GROUP_RECOGNITIONCREDITS

Returns the recognition credits for a constituent group and all its members.

Return

Return Type
table

Parameters

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

Definition

Copy


            CREATE function dbo.UFN_GROUP_RECOGNITIONCREDITS
            (
                @GROUPID uniqueidentifier,
                @TYPECODES xml,
                @DESIGNATIONS xml,
                @CAMPAIGNS xml,
                @RECOGNITIONTYPECODES xml,
                @FILTERUNCERTAINGIFTSFORHISTORICALMEMBERS bit,
                @ASOF datetime = null,
                @INCLUDEGROUPSWITHNORECOGNITIONS bit,
                @GROUPTYPECODE tinyint,
                @APPLICATIONTYPECODES xml,
                @REVENUESELECTIONID uniqueidentifier
            )
            returns @R table
            (
                GROUPID uniqueidentifier,
                GROUPTYPECODE tinyint,
                GROUPMEMBERID uniqueidentifier,
                ISGROUP bit,
                GROUPMEMBERSHIPSTARTDATE datetime,
                GROUPMEMBERSHIPENDDATE datetime,
                GROUPMEMBERSHIPISHISTORICAL bit,
                RECOGNITIONID uniqueidentifier,
                REVENUEID uniqueidentifier,
                REVENUESPLITID uniqueidentifier,
                REVENUEDATE datetime,
                REVENUEDATEADDED datetime,
                REVENUECONSTITUENTID uniqueidentifier,
                RECOGNITIONDATE datetime,
                REVENUERECOGNITIONTYPECODEID uniqueidentifier,
                RECOGNITIONAMOUNT money,
                RECOGNITIONDATEADDED datetime,
                BASECURRENCYID uniqueidentifier,
                ORGANIZATIONAMOUNT money
            )
            as
            begin
                declare @TODAY datetime;
                set @TODAY = getdate();

                declare @CONSTITUENTFILTER table(ID uniqueidentifier primary key, INCLUDESMEMBERGIVING bit not null);
                declare @SPLITTYPECODESFILTER table (TYPECODE tinyint primary key);
                declare @DESIGNATIONSFILTER table (DESIGNATIONID uniqueidentifier primary key);
                declare @CAMPAIGNSFILTER table (CAMPAIGNID uniqueidentifier primary key);
                declare @RECOGNITIONTYPECODESFILTER table (RECOGNITIONTYPECODEID 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('(REVENUETYPECODES)[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 @RECOGNITIONTYPECODES is not null
                begin
                    insert into @RECOGNITIONTYPECODESFILTER(RECOGNITIONTYPECODEID)
                        select T.c.value('(RECOGNITIONTYPECODEID)[1]','uniqueidentifier')
                        from @RECOGNITIONTYPECODES.nodes('/RECOGNITIONTYPES/ITEM') T(c);

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

                --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 @CONSTITUENTFILTER(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;

                with [CTE_MEMBERS] as
                (
                    select 
                        CONSTITUENT.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 @CONSTITUENTFILTER as [FILTER]
                    inner join dbo.CONSTITUENT on CONSTITUENT.ID = [FILTER].ID
                    inner join dbo.GROUPMEMBER on GROUPMEMBER.GROUPID = CONSTITUENT.ID and [FILTER].INCLUDESMEMBERGIVING = 1
                    inner join dbo.GROUPDATA on GROUPDATA.ID = GROUPMEMBER.GROUPID
                    left join dbo.GROUPMEMBERDATERANGE on GROUPMEMBERDATERANGE.GROUPMEMBERID = GROUPMEMBER.ID 

                    union    /*Also include giving by the group itself*/
                    select
                        CONSTITUENT.ID as [GROUPID],
                        CONSTITUENT.ID as [CONSTITUENTID],
                        1 as [ISGROUP],
                        null as [DATEFROM],
                        null as [DATETO],
                        0 as [ISHISTORICAL],
                        GROUPDATA.GROUPTYPECODE
                    from @CONSTITUENTFILTER as [FILTER]
                    inner join dbo.CONSTITUENT on CONSTITUENT.ID = [FILTER].ID
                    inner join dbo.GROUPDATA on GROUPDATA.ID = CONSTITUENT.ID

                ),
                [CTE_RECOGNITION] as
                (
                    select REVENUE.ID as [REVENUEID], cast(REVENUE.DATE as datetime) as [REVENUEDATE], REVENUE.CONSTITUENTID as [REVENUECONSTITUENTID], REVENUESPLIT.ID as [REVENUESPLITID],
                            REVENUERECOGNITION.ID as [RECOGNITIONID], REVENUERECOGNITION.DATEADDED, REVENUERECOGNITION.EFFECTIVEDATE, 
                            REVENUERECOGNITION.CONSTITUENTID as [RECOGNITIONCONSTITUENTID], REVENUERECOGNITIONTYPECODEID, REVENUERECOGNITION.AMOUNT, 
                            REVENUE.DATEADDED as [REVENUEDATEADDED], REVENUERECOGNITION.BASECURRENCYID, REVENUERECOGNITION.ORGANIZATIONAMOUNT
                    from dbo.FINANCIALTRANSACTION REVENUE 
                    inner join dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT on REVENUESPLIT.FINANCIALTRANSACTIONID = REVENUE.ID
                    inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = REVENUESPLIT.ID
                    inner join dbo.UFN_RECOGNITIONCREDIT_GETRECOGNITIONS(1, null, null) REVENUERECOGNITION on REVENUERECOGNITION.REVENUESPLITID = REVENUESPLIT.ID
                    where 
                            (@TYPECODES is null or REVENUESPLIT_EXT.TYPECODE in (select [SPLITTYPECODESFILTER].TYPECODE from @SPLITTYPECODESFILTER as [SPLITTYPECODESFILTER]))
                        and (
                                @APPLICATIONTYPECODES is null or REVENUESPLIT.ID in        (
                                                                                        select [FILTERSPLIT].ID 
                                                                                        from dbo.FINANCIALTRANSACTIONLINEITEM as [FILTERSPLIT]
                                                                                        inner join dbo.REVENUESPLIT_EXT as [FILTERSPLIT2] on [FILTERSPLIT2].ID = [FILTERSPLIT].ID
                                                                                        inner join dbo.FINANCIALTRANSACTION as [FILTERREVENUE] on [FILTERREVENUE].ID = [FILTERSPLIT].FINANCIALTRANSACTIONID
                                                                                        inner join @APPLICATIONTYPECODESFILTER as [FILTER] on [FILTER].APPLICATIONCODE = [FILTERSPLIT2].APPLICATIONCODE
                                                                                                                                            and [FILTER].TRANSACTIONTYPECODE = [FILTERREVENUE].TYPECODE
                                                                                        )
                            )
                        and    (@DESIGNATIONS is null or REVENUERECOGNITION.DESIGNATIONID in (select [DESIGNATIONSFILTER].DESIGNATIONID from @DESIGNATIONSFILTER as [DESIGNATIONSFILTER]))
                        and (@CAMPAIGNS is null or REVENUESPLIT.ID in (select REVENUESPLITCAMPAIGN.REVENUESPLITID from dbo.REVENUESPLITCAMPAIGN inner join @CAMPAIGNSFILTER as [CAMPAIGNSFILTER] on [CAMPAIGNSFILTER].CAMPAIGNID = REVENUESPLITCAMPAIGN.CAMPAIGNID))
                        and (@RECOGNITIONTYPECODES is null or REVENUERECOGNITION.REVENUERECOGNITIONTYPECODEID in (select [FILTER].RECOGNITIONTYPECODEID from @RECOGNITIONTYPECODESFILTER as [FILTER]))
                        and (@REVENUESELECTIONID is null or REVENUESPLIT.ID in (select ID from dbo.UFN_IDSETREADER_GETRESULTS_GUID(@REVENUESELECTIONID)))
                )
                insert into @R
                    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_RECOGNITION].RECOGNITIONID,
                        [CTE_RECOGNITION].REVENUEID, 
                        [CTE_RECOGNITION].REVENUESPLITID,
                        [CTE_RECOGNITION].REVENUEDATE,
                        [CTE_RECOGNITION].REVENUEDATEADDED,
                        [CTE_RECOGNITION].REVENUECONSTITUENTID,
                        [CTE_RECOGNITION].EFFECTIVEDATE as [RECOGNITIONDATE],
                        [CTE_RECOGNITION].REVENUERECOGNITIONTYPECODEID,
                        [CTE_RECOGNITION].AMOUNT as [RECOGNITIONAMOUNT],
                        [CTE_RECOGNITION].DATEADDED as [RECOGNITIONDATEADDED],
                        [CTE_RECOGNITION].BASECURRENCYID,
                        [CTE_RECOGNITION].ORGANIZATIONAMOUNT
                    from [CTE_RECOGNITION]
                    inner join [CTE_MEMBERS] on [CTE_MEMBERS].CONSTITUENTID = [CTE_RECOGNITION].RECOGNITIONCONSTITUENTID
                    where 
                        [CTE_MEMBERS].ISGROUP = 1
                        or
                        [CTE_MEMBERS].ISHISTORICAL = 0
                        or 
                        ([CTE_MEMBERS].ISHISTORICAL = 1 and (@FILTERUNCERTAINGIFTSFORHISTORICALMEMBERS = 0 or ([CTE_RECOGNITION].EFFECTIVEDATE <= [CTE_MEMBERS].DATETO)))

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

                    select
                        null,
                        null,
                        CONSTITUENT.ID,
                        0,
                        null,
                        null,
                        0,
                        [CTE_RECOGNITION].RECOGNITIONID,
                        [CTE_RECOGNITION].REVENUEID, 
                        [CTE_RECOGNITION].REVENUESPLITID,
                        [CTE_RECOGNITION].REVENUEDATE,
                        [CTE_RECOGNITION].REVENUEDATEADDED,
                        [CTE_RECOGNITION].REVENUECONSTITUENTID,
                        [CTE_RECOGNITION].EFFECTIVEDATE as [RECOGNITIONDATE],
                        [CTE_RECOGNITION].REVENUERECOGNITIONTYPECODEID,
                        [CTE_RECOGNITION].AMOUNT as [RECOGNITIONAMOUNT],
                        [CTE_RECOGNITION].DATEADDED as [RECOGNITIONDATEADDED],
                        [CTE_RECOGNITION].BASECURRENCYID,
                        [CTE_RECOGNITION].ORGANIZATIONAMOUNT            
                    from [CTE_RECOGNITION]
                    inner join dbo.CONSTITUENT on CONSTITUENT.ID = [CTE_RECOGNITION].RECOGNITIONCONSTITUENTID
                    where CONSTITUENT.ID not in (select ID from dbo.GROUPDATA)
                        and CONSTITUENT.ID not in (select CONSTITUENTID from [CTE_MEMBERS])
                        and @GROUPID is null;

                if @INCLUDEGROUPSWITHNORECOGNITIONS = 1
                begin
                    insert into @R
                    select
                        CONSTITUENT.ID as [GROUPID],
                        GROUPDATA.GROUPTYPECODE,
                        CONSTITUENT.ID as [GROUPMEMBERID],
                        1 as [ISGROUP],
                        null as [GROUPMEMBERSHIPSTARTDATE],
                        null as [GROUPMEMBERSHIPENDDATE],
                        0 as [ISHISTORICAL],
                        null as [RECOGNITIONID],
                        null as [REVENUEID],
                        null as [REVENUESPLITID],
                        null as [REVENUEDATE],
                        null as [REVENUEDATEADDED],
                        null as [REVENUECONSTITUENTID],
                        null as [RECOGNITIONDATE],
                        null as [REVENUERECOGNITIONTYPECODEID],
                        null as [RECOGNITIONAMOUNT],
                        null as [RECOGNITIONDATEADDED],
                        null as [BASECURRENCYID],
                        null as [ORGANIZATIONAMOUNT]
                    from dbo.CONSTITUENT
                    inner join dbo.GROUPDATA on GROUPDATA.ID = CONSTITUENT.ID
                    left join @R as [RESULTS] on [RESULTS].GROUPID = CONSTITUENT.ID
                    where [RESULTS].GROUPID is null and (CONSTITUENT.ID = @GROUPID or @GROUPID is null);
                end

                return;
            end