UFN_SMARTQUERY_DONORLIST

Return

Return Type
table

Parameters

Parameter Parameter Type Mode Description
@DESIGNATIONID uniqueidentifier IN
@APPEALID uniqueidentifier IN
@SELECTIONID uniqueidentifier IN
@STARTDATE datetime IN
@ENDDATE datetime IN
@AMOUNTTYPE tinyint IN
@AMOUNTONE money IN
@AMOUNTTWO money IN
@ONLYRETURNTOPDONORS bit IN
@RETURNVALUE int IN
@RETURNVALUEISPERCENT bit IN
@CAMPAIGNID uniqueidentifier IN
@CURRENCYID uniqueidentifier IN
@CURRENCYCODE tinyint IN
@CURRENTAPPUSERID uniqueidentifier IN
@MAXROWS int IN

Definition

Copy


                create function dbo.UFN_SMARTQUERY_DONORLIST
                (
                    @DESIGNATIONID uniqueidentifier = null,
                    @APPEALID uniqueidentifier = null,
                    @SELECTIONID uniqueidentifier = null,
                    @STARTDATE datetime = null,
                    @ENDDATE datetime = null,
                    @AMOUNTTYPE tinyint = null,
                    @AMOUNTONE money = null,
                    @AMOUNTTWO money = null,
                    @ONLYRETURNTOPDONORS bit = null,
                    @RETURNVALUE int = null,
                    @RETURNVALUEISPERCENT bit = null,
                    @CAMPAIGNID uniqueidentifier = null,
                    @CURRENCYID uniqueidentifier = null,
                    @CURRENCYCODE tinyint = null,
                    @CURRENTAPPUSERID uniqueidentifier = null,
                    @MAXROWS int = null
                )
                returns @RETURNTABLE table
                    (
                        ID uniqueidentifier,
                        NAME nvarchar(154),
                        ADDRESSBLOCK nvarchar(150),
                        CITY nvarchar(50),
                        STATE nvarchar(50),
                        POSTCODE nvarchar(12),
                        TOTALGIVEN money,
                        TOTALRECEIVED money,
                        NUMBEROFGIFTS int,
                        LOOKUPID nvarchar(100),
                        CURRENCYID uniqueidentifier
                    )
                as
                begin

                    declare @ISADMIN bit;
                    set @ISADMIN = dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID);

                    declare @ORGANIZATIONCURRENCYID as uniqueidentifier
                    set @ORGANIZATIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY()

                    set @CURRENCYID = case @CURRENCYCODE 
                        when 0 then dbo.UFN_APPUSER_GETBASECURRENCY(@CURRENTAPPUSERID)
                        else @ORGANIZATIONCURRENCYID
                    end

                    declare @CAMPAIGNHIERARCHYPATH hierarchyid;
                    select @CAMPAIGNHIERARCHYPATH = HIERARCHYPATH from CAMPAIGN where ID=@CAMPAIGNID;

                    -- Build list table of all revenue records that need to be included

                    declare @DATASET table
                    (
                        CONSTITUENTID uniqueidentifier,
                        TOTALGIVEN money,
                        WRITEOFF money,
                        TOTALRECEIVED money,
                        NUMBEROFGIFTS int
                    );

                    -- Roll up designations

                    declare @DL1ID uniqueidentifier;
                    declare @DL2ID uniqueidentifier;
                    declare @DL3ID uniqueidentifier;
                    declare @DL4ID uniqueidentifier;
                    declare @DL5ID uniqueidentifier;

                    select @DL1ID = DESIGNATIONLEVEL1ID,
                        @DL2ID = DESIGNATIONLEVEL2ID,
                        @DL3ID = DESIGNATIONLEVEL3ID,
                        @DL4ID = DESIGNATIONLEVEL4ID,
                        @DL5ID = DESIGNATIONLEVEL5ID
                    from dbo.DESIGNATION
                    where ID = @DESIGNATIONID or @DESIGNATIONID is null;

                    if @SELECTIONID is null
                    begin
                        with DESIGNATIONS_CTE as 
                        (
                            select 
                                ID 
                            from 
                                dbo.DESIGNATION D
                            where 
                                D.DESIGNATIONLEVEL1ID = @DL1ID and
                                (D.DESIGNATIONLEVEL2ID = @DL2ID or (@DL2ID is null and D.DESIGNATIONLEVEL2ID is null)) and 
                                (D.DESIGNATIONLEVEL3ID = @DL3ID or (@DL3ID is null and D.DESIGNATIONLEVEL3ID is null)) and 
                                (D.DESIGNATIONLEVEL4ID = @DL4ID or (@DL4ID is null and D.DESIGNATIONLEVEL4ID is null)) and 
                                (D.DESIGNATIONLEVEL5ID = @DL5ID or (@DL5ID is null and D.DESIGNATIONLEVEL5ID is null))
                        ),
                        REVENUE_CTE as
                        (
                            select
                                FINANCIALTRANSACTION.ID,
                                FINANCIALTRANSACTION.CONSTITUENTID,
                                REVENUE_EXT.APPEALID,
                                FINANCIALTRANSACTION.DATE,
                                FINANCIALTRANSACTION.TYPECODE
                            from dbo.FINANCIALTRANSACTION 
                            inner join dbo.REVENUE_EXT
                                on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
                            where
                                FINANCIALTRANSACTION.DELETEDON is null and
                                (@ISADMIN = 1 or
                                    (
                                        (dbo.UFN_SECURITY_APPUSER_GRANTED_SMARTQUERY_FORCONSTIT(@CURRENTAPPUSERID, '8bf052d7-7b2b-41b9-9f0f-52d04c02b62b', FINANCIALTRANSACTION.CONSTITUENTID) = 1)
                                        and
                                        (dbo.UFN_SECURITY_APPUSER_GRANTED_SMARTQUERY_FORCONSTIT_BYSITE(@CURRENTAPPUSERID, '8bf052d7-7b2b-41b9-9f0f-52d04c02b62b', FINANCIALTRANSACTION.CONSTITUENTID) = 1)
                                        and
                                        (dbo.UFN_SECURITY_APPUSER_GRANTED_SMARTQUERY_FORREVENUE(@CURRENTAPPUSERID, '8bf052d7-7b2b-41b9-9f0f-52d04c02b62b', FINANCIALTRANSACTION.ID) = 1)
                                    ))
                        )
                        insert into @DATASET
                        (CONSTITUENTID,TOTALGIVEN,WRITEOFF,TOTALRECEIVED,NUMBEROFGIFTS)
                        (
                            select
                                R.CONSTITUENTID,
                                sum(case 
                                        when dbo.UFN_REVENUE_HASDESIGNATION(R.TYPECODE, RS.APPLICATIONCODE) = 1 and not (RS.APPLICATIONCODE = 1 and RS.TYPECODE = 1
                                            then RSE_INCURRENCY.AMOUNTINCURRENCY
                                        else null 
                                    end
                                ) as TOTALGIVEN,
                                sum(WS.WRITEOFFAMOUNT) as WRITEOFF,
                                sum(case 
                                        when R.TYPECODE = 0 and (RS.APPLICATIONCODE in (0,2,3,4,6,7) or (RS.APPLICATIONCODE = 1 and RS.TYPECODE = 0)) then RSE_INCURRENCY.AMOUNTINCURRENCY
                                        when R.TYPECODE = 5 and RS.APPLICATIONCODE = 0 then RSE_INCURRENCY.AMOUNTINCURRENCY
                                        else null 
                                    end
                                ) as TOTALRECEIVED,
                                count(distinct case when dbo.UFN_REVENUE_HASDESIGNATION(R.TYPECODE, RS.APPLICATIONCODE) = 1 and not (RS.APPLICATIONCODE = 1 and RS.TYPECODE = 1) then R.ID else null end) as NUMBEROFGIFTS
                            from
                                REVENUE_CTE as R
                                inner join dbo.FINANCIALTRANSACTIONLINEITEM FTLI on FTLI.FINANCIALTRANSACTIONID = R.ID
                                inner join dbo.REVENUESPLIT_EXT RS on FTLI.ID = RS.ID
                                inner join DESIGNATIONS_CTE D on D.ID = RS.DESIGNATIONID or @DESIGNATIONID is null
                                left join dbo.REVENUESPLITCAMPAIGN on FTLI.ID = REVENUESPLITCAMPAIGN.REVENUESPLITID and (@CAMPAIGNID is not null)
                                left join (select W.REVENUEID, sum(WRITEOFFSPLIT_INCURRENCY.AMOUNTINCURRENCY) as WRITEOFFAMOUNT 
                                    from dbo.WRITEOFFSPLIT 
                                    inner join dbo.WRITEOFF W on W.ID = WRITEOFFSPLIT.WRITEOFFID
                                    inner join UFN_WRITEOFFSPLIT_GETAMOUNTINCURRENCY_BULK(@CURRENCYID, @ORGANIZATIONCURRENCYID, 2, 0) WRITEOFFSPLIT_INCURRENCY on WRITEOFFSPLIT_INCURRENCY.ID = WRITEOFFSPLIT.ID
                                    group by W.REVENUEID) WS on WS.REVENUEID = R.ID
                                left join (select ID RSEID, AMOUNTINCURRENCY from UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@CURRENCYID, @ORGANIZATIONCURRENCYID, 2, 0)) RSE_INCURRENCY on RS.ID = RSE_INCURRENCY.RSEID
                                left join dbo.APPEAL AP on AP.ID = R.APPEALID
                                left join CAMPAIGN on CAMPAIGN.ID = REVENUESPLITCAMPAIGN.CAMPAIGNID
                            where
                                FTLI.DELETEDON is null and FTLI.TYPECODE != 1 and
                                (R.TYPECODE <> 3) and -- exclude matching gift claims

                                (R.DATE >= dbo.UFN_DATE_GETEARLIESTTIME(@STARTDATE) or @STARTDATE is null) and
                                (R.DATE <= dbo.UFN_DATE_GETLATESTTIME(@ENDDATE) or @ENDDATE is null) and
                                (AP.ID = @APPEALID or @APPEALID is null) and
                                (@CAMPAIGNID is null or CAMPAIGN.HIERARCHYPATH.IsDescendantOf(@CAMPAIGNHIERARCHYPATH) = 1)
                            group by R.CONSTITUENTID
                        );
                    end
                    else
                    begin
                        with DESIGNATIONS_CTE as 
                        (
                            select 
                                ID 
                            from 
                                dbo.DESIGNATION D
                            where 
                                D.DESIGNATIONLEVEL1ID = @DL1ID and
                                (D.DESIGNATIONLEVEL2ID = @DL2ID or (@DL2ID is null and D.DESIGNATIONLEVEL2ID is null)) and 
                                (D.DESIGNATIONLEVEL3ID = @DL3ID or (@DL3ID is null and D.DESIGNATIONLEVEL3ID is null)) and 
                                (D.DESIGNATIONLEVEL4ID = @DL4ID or (@DL4ID is null and D.DESIGNATIONLEVEL4ID is null)) and 
                                (D.DESIGNATIONLEVEL5ID = @DL5ID or (@DL5ID is null and D.DESIGNATIONLEVEL5ID is null))
                        ),
                        REVENUE_CTE as
                        (
                            select
                                FINANCIALTRANSACTION.ID,
                                FINANCIALTRANSACTION.CONSTITUENTID,
                                REVENUE_EXT.APPEALID,
                                FINANCIALTRANSACTION.DATE,
                                FINANCIALTRANSACTION.TYPECODE
                            from dbo.FINANCIALTRANSACTION 
                            inner join dbo.REVENUE_EXT
                                on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
                            where
                                FINANCIALTRANSACTION.DELETEDON is null and
                                (@ISADMIN = 1 or
                                    (
                                        (dbo.UFN_SECURITY_APPUSER_GRANTED_SMARTQUERY_FORCONSTIT(@CURRENTAPPUSERID, '8bf052d7-7b2b-41b9-9f0f-52d04c02b62b', FINANCIALTRANSACTION.CONSTITUENTID) = 1)
                                        and
                                        (dbo.UFN_SECURITY_APPUSER_GRANTED_SMARTQUERY_FORCONSTIT_BYSITE(@CURRENTAPPUSERID, '8bf052d7-7b2b-41b9-9f0f-52d04c02b62b', FINANCIALTRANSACTION.CONSTITUENTID) = 1)
                                        and
                                        (dbo.UFN_SECURITY_APPUSER_GRANTED_SMARTQUERY_FORREVENUE(@CURRENTAPPUSERID, '8bf052d7-7b2b-41b9-9f0f-52d04c02b62b', FINANCIALTRANSACTION.ID) = 1)
                                    ))
                        )
                        insert into @DATASET
                        (CONSTITUENTID,TOTALGIVEN,WRITEOFF,TOTALRECEIVED,NUMBEROFGIFTS)
                        (
                            select
                                R.CONSTITUENTID,
                                sum(case 
                                        when dbo.UFN_REVENUE_HASDESIGNATION(R.TYPECODE, RS.APPLICATIONCODE) = 1 and not (RS.APPLICATIONCODE = 1 and RS.TYPECODE = 1
                                            then RSE_INCURRENCY.AMOUNTINCURRENCY
                                        else null 
                                    end
                                ) as TOTALGIVEN,
                                sum(WS.WRITEOFFAMOUNT) as WRITEOFF,
                                sum(case 
                                        when R.TYPECODE = 0 and (RS.APPLICATIONCODE in (0,2,3,4,6,7) or (RS.APPLICATIONCODE = 1 and RS.TYPECODE = 0)) then RSE_INCURRENCY.AMOUNTINCURRENCY
                                        when R.TYPECODE = 5 and RS.APPLICATIONCODE = 0 then RSE_INCURRENCY.AMOUNTINCURRENCY
                                        else null 
                                    end
                                ) as TOTALRECEIVED,
                                count(distinct case when dbo.UFN_REVENUE_HASDESIGNATION(R.TYPECODE, RS.APPLICATIONCODE) = 1 and not (RS.APPLICATIONCODE = 1 and RS.TYPECODE = 1) then R.ID else null end) as NUMBEROFGIFTS
                            from
                                REVENUE_CTE as R
                                inner join dbo.UFN_IDSETREADER_GETRESULTS_GUID(@SELECTIONID) SELECTION on R.CONSTITUENTID = SELECTION.ID and @SELECTIONID is not null
                                inner join dbo.FINANCIALTRANSACTIONLINEITEM FTLI on FTLI.FINANCIALTRANSACTIONID = R.ID
                                inner join dbo.REVENUESPLIT_EXT RS on FTLI.ID = RS.ID
                                inner join DESIGNATIONS_CTE D on D.ID = RS.DESIGNATIONID or @DESIGNATIONID is null
                                left join dbo.REVENUESPLITCAMPAIGN on FTLI.ID = REVENUESPLITCAMPAIGN.REVENUESPLITID and (@CAMPAIGNID is not null)
                                left join (select W.REVENUEID, sum(WRITEOFFSPLIT_INCURRENCY.AMOUNTINCURRENCY) as WRITEOFFAMOUNT 
                                    from dbo.WRITEOFFSPLIT 
                                    inner join dbo.WRITEOFF W on W.ID = WRITEOFFSPLIT.WRITEOFFID
                                    inner join UFN_WRITEOFFSPLIT_GETAMOUNTINCURRENCY_BULK(@CURRENCYID, @ORGANIZATIONCURRENCYID, 2, 0) WRITEOFFSPLIT_INCURRENCY on WRITEOFFSPLIT_INCURRENCY.ID = WRITEOFFSPLIT.ID
                                    group by W.REVENUEID) WS on WS.REVENUEID = R.ID     
                                left join (select ID RSEID, AMOUNTINCURRENCY from UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@CURRENCYID, @ORGANIZATIONCURRENCYID, 2, 0)) RSE_INCURRENCY on RS.ID = RSE_INCURRENCY.RSEID
                                left join dbo.APPEAL AP on AP.ID = R.APPEALID
                                left join CAMPAIGN on CAMPAIGN.ID = REVENUESPLITCAMPAIGN.CAMPAIGNID
                            where
                                FTLI.DELETEDON is null and FTLI.TYPECODE != 1 and
                                (R.TYPECODE <> 3) and -- exclude matching gift claims

                                (R.DATE >= dbo.UFN_DATE_GETEARLIESTTIME(@STARTDATE) or @STARTDATE is null) and
                                (R.DATE <= dbo.UFN_DATE_GETLATESTTIME(@ENDDATE) or @ENDDATE is null) and
                                (AP.ID = @APPEALID or @APPEALID is null) and
                                (@CAMPAIGNID is null or CAMPAIGN.HIERARCHYPATH.IsDescendantOf(@CAMPAIGNHIERARCHYPATH) = 1)
                            group by 
                                R.CONSTITUENTID
                        );
                    end

                    -- Calculate number of rows returned

                    if @ONLYRETURNTOPDONORS = 1
                    begin
                        if @RETURNVALUEISPERCENT = 1
                        begin
                            select
                                @MAXROWS = ceiling(count(distinct CONSTITUENTID) * (convert(decimal,@RETURNVALUE) / 100.00))
                            from
                                @DATASET;
                        end
                        else
                            set @MAXROWS = @RETURNVALUE;
                    end;

                    -- Insert filtered records into the return table

                    insert into @RETURNTABLE
                    select top(@MAXROWS) with ties C.ID,
                        C.NAME,
                        A.ADDRESSBLOCK,
                        A.CITY,
                        dbo.UFN_STATE_GETABBREVIATION(A.STATEID),
                        A.POSTCODE,
                        DS.TOTALGIVEN - coalesce(DS.WRITEOFF, 0),
                        DS.TOTALRECEIVED,
                        DS.NUMBEROFGIFTS,
                        C.LOOKUPID,
                        @CURRENCYID
                    from
                        @DATASET DS
                        inner join dbo.CONSTITUENT C on C.ID = DS.CONSTITUENTID
                        left join dbo.ADDRESS A on A.CONSTITUENTID = C.ID and A.ISPRIMARY = 1
                    where 
                        (DS.TOTALGIVEN - coalesce(DS.WRITEOFF, 0) > @AMOUNTONE and @AMOUNTTYPE = 0) or
                        (DS.TOTALGIVEN - coalesce(DS.WRITEOFF, 0) < @AMOUNTONE and @AMOUNTTYPE = 1) or
                        (DS.TOTALGIVEN - coalesce(DS.WRITEOFF, 0) between @AMOUNTONE and @AMOUNTTWO and @AMOUNTTYPE = 2)
                    order by (DS.TOTALGIVEN - coalesce(DS.WRITEOFF, 0)) desc;

                    return;
                end;