USP_CONSTITUENT_REVENUEHISTORY_SUMMARY

Returns a summary of a constituent's revenue history

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@CURRENTAPPUSERID uniqueidentifier IN
@SECURITYFEATUREID uniqueidentifier IN
@INCLUDEGROUPMEMBERREVENUE bit IN
@DATALOADED bit INOUT
@TOTALREVENUE money INOUT
@TOTALNUMBERTRANSACTIONS int INOUT
@TOTALREVENUEWITHGIFTAID money INOUT
@TOTALPAID money INOUT
@TOTALPAYMENTS int INOUT
@TOTALEXPECTED money INOUT
@TOTALOPENCOMMITMENTS int INOUT
@ISORGANIZATION bit INOUT
@APPBASECURRENCY uniqueidentifier INOUT

Definition

Copy


            CREATE procedure dbo.USP_CONSTITUENT_REVENUEHISTORY_SUMMARY
            (
                @ID uniqueidentifier,
                @CURRENTAPPUSERID uniqueidentifier = null,
                @SECURITYFEATUREID uniqueidentifier = null,
                @INCLUDEGROUPMEMBERREVENUE bit = 0,
                @DATALOADED bit = 0 output,
                @TOTALREVENUE money = null output,
                @TOTALNUMBERTRANSACTIONS int = null output,
                @TOTALREVENUEWITHGIFTAID money = null output,
                @TOTALPAID money = null output,
                @TOTALPAYMENTS int = null output,
                @TOTALEXPECTED money = null output,
                @TOTALOPENCOMMITMENTS int = null output,
                @ISORGANIZATION bit = null output,
        @APPBASECURRENCY uniqueidentifier = null output
            ) 
            as
                set nocount on;

                set @DATALOADED = 0;

                declare @SECURITYFEATURETYPE tinyint;
                set @SECURITYFEATURETYPE = 1;
              declare @CURRENTDATE datetime = getdate(); -- Use today's date to get the exchange rate.


        declare @APPUSERBASEID uniqueidentifier;
        set @APPUSERBASEID = dbo.UFN_APPUSER_GETBASECURRENCY(@CURRENTAPPUSERID)
        set @APPBASECURRENCY = @APPUSERBASEID

                declare @CONSTITUENTSTOINCLUDE table
                (
                    ID uniqueidentifier not null,
                    DATEFROM datetime,
                    DATETO datetime
                );

                insert into @CONSTITUENTSTOINCLUDE (ID)
                select @ID;

                if @INCLUDEGROUPMEMBERREVENUE = 1
                begin
                    insert into @CONSTITUENTSTOINCLUDE (ID, DATEFROM, DATETO)
                    select GROUPMEMBER.MEMBERID, GROUPMEMBERDATERANGE.DATEFROM, GROUPMEMBERDATERANGE.DATETO
                    from dbo.GROUPMEMBER
                    left join dbo.GROUPMEMBERDATERANGE on GROUPMEMBERDATERANGE.GROUPMEMBERID = GROUPMEMBER.ID
                    where GROUPMEMBER.GROUPID = @ID
                end

                declare @REVENUETOINCLUDE table
                (
                    ID uniqueidentifier not null,
                    AMOUNT money not null,
                    TRANSACTIONTYPECODE tinyint not null
                );

                insert into @REVENUETOINCLUDE (ID, AMOUNT, TRANSACTIONTYPECODE)
                select
                    REVENUE.ID,
                    BASEAMOUNT,
                    TYPECODE
                from dbo.FINANCIALTRANSACTION REVENUE
                inner join dbo.REVENUE_EXT on REVENUE.ID = REVENUE_EXT.ID
                -- Even though the below semi-join on @CONSTITUENTSTOINCLUDE means this join filter isn't needed to get the correct results,

                -- it's still used since if just the semi-join is used, it results in a merge join with a scan on dbo.REVENUE

                inner join 
                (select distinct ID from @CONSTITUENTSTOINCLUDE) as POSSIBLECONSTITUENTS on REVENUE.CONSTITUENTID = POSSIBLECONSTITUENTS.ID
                where 
                    REVENUE.DELETEDON is null and
                    REVENUE.CONSTITUENTID in (    select ID from @CONSTITUENTSTOINCLUDE 
                                                where
                                                    (DATEFROM is null or REVENUE.DATE >= DATEFROM) and
                                                    (DATETO is null or REVENUE.DATE <= DATETO))
                    and    exists 
                    (
                        select top 1 RSSUB.ID from dbo.FINANCIALTRANSACTIONLINEITEM RSSUB
                        cross apply dbo.UFN_SITEID_MAPFROM_REVENUESPLITID(RSSUB.ID) REVSITES
                        where RSSUB.FINANCIALTRANSACTIONID = REVENUE.ID and RSSUB.DELETEDON is null
                        -- Using a case statement since the standard site extension filters

                        -- resulted in a poor plan

                        and (case 
                                when dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID) = 1 then 1
                                when exists (select 1 from dbo.UFN_SITESFORUSERONFEATURE(@CURRENTAPPUSERID,@SECURITYFEATUREID,@SECURITYFEATURETYPE) where SITEID=[REVSITES].[SITEID] or (SITEID is null and [REVSITES].[SITEID] is null)) then 1
                                else 0 
                            end) = 1
                    )

                select @DATALOADED = 1,
                       -- Total Revenue = Unapplied payments + Commitment amounts - Pledge writeoffs

                       @TOTALREVENUE =  sum(case TRANSACTIONTYPECODE
                                             when 0 then AMOUNT-APPLIEDAMOUNT
                                             when -1 then -APPLIEDAMOUNT
                                             when 1 then AMOUNT
                                             when 4 then AMOUNT
                                             when 6 then AMOUNT
                                             when 7 then AMOUNT
                                             else 0
                                           end),
                       @TOTALREVENUEWITHGIFTAID = sum(GROSSAMOUNT),

                     @TOTALNUMBERTRANSACTIONS = count(*),
                       -- Total Paid = Payment amounts

                       @TOTALPAID = sum(case TRANSACTIONTYPECODE when 0 then AMOUNT else 0 end),

                       @TOTALPAYMENTS = count(case TRANSACTIONTYPECODE when 0 then 1 else null end),
                       -- Total Expected = Commitment amounts - Applied payments - Pledge writeoffs

                       @TOTALEXPECTED = sum(EXPECTEDAMOUNT),

                       -- Open Commitments = Commitments w/ a non-zero balance

                       @TOTALOPENCOMMITMENTS = count(case when EXPECTEDAMOUNT > 0 or RGSTATUS = 0 then 1 end)
                from (
                    -- all revenue transactions

                    select MYSITESREV_CTE.ID,
                           min(MYSITESREV_CTE.TRANSACTIONTYPECODE) TRANSACTIONTYPECODE,
                           min(dbo.UFN_REVENUE_GETAMOUNTINCURRENCY(MYSITESREV_CTE.ID,@APPUSERBASEID)) AMOUNT,
                           sum(case MYSITESREV_CTE.TRANSACTIONTYPECODE 
                                 when 1 then dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATEPLEDGESPLITGROSSAMOUNT_2(REVENUESPLIT.ID,@APPUSERBASEID)
                     when 2 then 0
                                 else dbo.UFN_GIFTAIDREVENUESPLIT_CALCULATESPLITGROSSAMOUNTINCURRENCY(REVENUESPLIT.ID, 1,@APPUSERBASEID)
                               end) GROSSAMOUNT,
                           sum(case when REVENUESPLIT_EXT.APPLICATIONCODE in(2,6,8) then dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY(REVENUESPLIT.ID,@APPUSERBASEID) else 0 end) APPLIEDAMOUNT,
                           min(case when TRANSACTIONTYPECODE in(1,4,6) then dbo.UFN_PLEDGE_GETBALANCEINCURRENCY(MYSITESREV_CTE.ID,@APPUSERBASEID) else 0 end) EXPECTEDAMOUNT,
                           min(case MYSITESREV_CTE.TRANSACTIONTYPECODE when 2 then REVENUESCHEDULE.STATUSCODE else -1 end) RGSTATUS
                    from @REVENUETOINCLUDE as MYSITESREV_CTE
                    inner join dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT on REVENUESPLIT.FINANCIALTRANSACTIONID = MYSITESREV_CTE.ID
                    inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT.ID = REVENUESPLIT_EXT.ID and REVENUESPLIT.DELETEDON is null
                    left join dbo.REVENUESCHEDULE on REVENUESCHEDULE.ID = MYSITESREV_CTE.ID
                    group by MYSITESREV_CTE.ID
                    union all
                    -- pledge writeoffs

                    select null, -1, 0, 0, sum(dbo.UFN_WRITEOFFSPLIT_GETAMOUNTINCURRENCY(WRITEOFFSPLIT.ID,@APPUSERBASEID)), 0, -1
                    from @REVENUETOINCLUDE as MYSITESREV_CTE
                    inner join dbo.FINANCIALTRANSACTION WRITEOFF on WRITEOFF.PARENTID = MYSITESREV_CTE.ID
                    inner join dbo.FINANCIALTRANSACTIONLINEITEM WRITEOFFSPLIT on WRITEOFFSPLIT.FINANCIALTRANSACTIONID = WRITEOFF.ID
                    inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = WRITEOFFSPLIT.ID and WRITEOFFSPLIT.DELETEDON is null
                    where WRITEOFF.TYPECODE = 20 and WRITEOFF.DELETEDON is null
                    group by WRITEOFF.ID
                    union all
                    -- recurring gift writeoffs (for including in transaction count)

                    select null, -2, 0, 0, 0, 0, -1
                    from @REVENUETOINCLUDE as MYSITESREV_CTE
                    inner join dbo.RECURRINGGIFTWRITEOFF on RECURRINGGIFTWRITEOFF.REVENUEID = MYSITESREV_CTE.ID
                ) REV

                select @ISORGANIZATION = ISORGANIZATION 
                from dbo.CONSTITUENT 
                where ID = @ID;

                return 0;