USP_CONSTITUENT_GIVINGSUMMARYGET

Returns giving summary values for a constituent.

Parameters

Parameter Parameter Type Mode Description
@CONSTITUENTID uniqueidentifier IN
@TOTALNUMBER int INOUT
@TOTALAMOUNT money INOUT
@AVERAGEAMOUNT money INOUT
@MOSTFREQUENTAMOUNT money INOUT
@TOTALPLEDGEBALANCE money INOUT
@TOTALYEARS int INOUT
@CONSECUTIVEYEARS int INOUT
@GIVENSINCEFISCALYEAR datetime INOUT
@HOUSEHOLDID uniqueidentifier INOUT
@TOTALHOUSEHOLDGIVING money INOUT
@CURRENTAPPUSERID uniqueidentifier IN
@SITEFILTERMODE tinyint IN
@SITESSELECTED xml IN
@SECURITYFEATUREID uniqueidentifier IN
@SECURITYFEATURETYPE tinyint IN
@TOTALGIVINGWITHGIFTAID money INOUT
@MATCHEDGIFTSAMOUNT money INOUT
@CURRENCYID uniqueidentifier IN
@CALCULATEGIVINGHISTORY bit IN

Definition

Copy


            CREATE procedure [dbo].[USP_CONSTITUENT_GIVINGSUMMARYGET]
            (
                @CONSTITUENTID uniqueidentifier,
                @TOTALNUMBER int = null output,
                @TOTALAMOUNT money = null output,
                @AVERAGEAMOUNT money = null output,
                @MOSTFREQUENTAMOUNT money = null output,
                @TOTALPLEDGEBALANCE money = null output,
                @TOTALYEARS int = null output,
                @CONSECUTIVEYEARS int = null output,
                @GIVENSINCEFISCALYEAR datetime = null output,
                @HOUSEHOLDID uniqueidentifier = null output,
                @TOTALHOUSEHOLDGIVING money = null output,
                @CURRENTAPPUSERID uniqueidentifier = null,
                @SITEFILTERMODE tinyint = 0,
                @SITESSELECTED xml = null,
                @SECURITYFEATUREID uniqueidentifier = null,
                @SECURITYFEATURETYPE tinyint = null,
                @TOTALGIVINGWITHGIFTAID money = null output,
                @MATCHEDGIFTSAMOUNT money = null output,
                @CURRENCYID uniqueidentifier = null,
                @CALCULATEGIVINGHISTORY bit = 1
            )
            as
                set nocount on

                declare @CURRENTDATEEARLIESTTIME datetime
                set @CURRENTDATEEARLIESTTIME = dbo.UFN_DATE_GETEARLIESTTIME(getdate());        

                declare @ORGANIZATIONCURRENCYID uniqueidentifier;
                declare @DECIMALDIGITS tinyint;
                declare @ROUNDINGTYPECODE tinyint;
                declare @ORIGINCODE tinyint;

                select @ORIGINCODE = coalesce(ORGANIZATIONAMOUNTORIGINCODE, 0) from dbo.MULTICURRENCYCONFIGURATION;

                select @ORGANIZATIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY(),
                        @DECIMALDIGITS = DECIMALDIGITS,
                        @ROUNDINGTYPECODE = ROUNDINGTYPECODE
                from 
                    dbo.CURRENCY
                where
                    CURRENCY.ID = @CURRENCYID;

                declare @ALLREVENUE table
                (
                    REVENUEID uniqueidentifier,
                    TRANSACTIONTYPECODE tinyint,
                    TRANSACTIONTYPE nvarchar(21),
                    REVENUEAMOUNT money,
                    [DATE] datetime,
                    DATEADDED datetime,
                    SPLITID uniqueidentifier,
                    APPLICATIONCODE tinyint,
                    DESIGNATIONID uniqueidentifier,
                    SPLITAMOUNT money,
                    WRITEOFFAMOUNT money,
                    SPLITNETAMOUNT money
                )    

                insert @ALLREVENUE
                select * 
                from dbo.UFN_CONSTITUENT_GIVINGHISTORYINCURRENCY_BULK(
                    @CONSTITUENTID,
                    @CURRENTAPPUSERID,
                    @SITEFILTERMODE,
                    @SITESSELECTED,
                    @SECURITYFEATUREID,
                    @SECURITYFEATURETYPE,
                    @CURRENCYID,
                    @ORGANIZATIONCURRENCYID,
                    @DECIMALDIGITS,
                    @ROUNDINGTYPECODE)    

                select
                    @TOTALNUMBER = count(distinct REVENUEID),
                    @TOTALAMOUNT = cast(sum(cast(SPLITNETAMOUNT as decimal(20,5))) as money),
                    @TOTALGIVINGWITHGIFTAID = cast(sum(cast(SPLITAMOUNT as decimal(20,5)) + cast(dbo.UFN_GIFTAID_GETTAXCLAIMAMOUNTINCURRENCY(SPLITID, TRANSACTIONTYPECODE, APPLICATIONCODE, @CURRENCYID) as decimal(20, 5)) - cast(WRITEOFFAMOUNT as decimal(20,5))) as money),
                    @TOTALPLEDGEBALANCE = cast(sum(case TRANSACTIONTYPECODE when 1 then cast(dbo.UFN_PLEDGESPLIT_GETBALANCEINCURRENCY(SPLITID, @CURRENCYID) as decimal(20,5)) else 0 end) as money)
                from
                    @ALLREVENUE REV;

                set @TOTALNUMBER = coalesce(@TOTALNUMBER, 0);
                set @TOTALAMOUNT = coalesce(@TOTALAMOUNT, 0);
                set @TOTALPLEDGEBALANCE = coalesce(@TOTALPLEDGEBALANCE, 0);
                set @TOTALGIVINGWITHGIFTAID = coalesce(@TOTALGIVINGWITHGIFTAID, 0);

                if @TOTALNUMBER > 0
                    set @AVERAGEAMOUNT = cast(@TOTALAMOUNT as decimal(20,5)) / cast(@TOTALNUMBER as decimal(20,5));

                --MODE

                with PLEDGEANDPAYMENTCTE as
                (
                    select
                        REVENUEID ID,
                        sum(SPLITNETAMOUNT) as NETAMOUNT
                    from @ALLREVENUE 
                    group by REVENUEID
                )
                select top 1
                    @MOSTFREQUENTAMOUNT = X.NETAMOUNT
                from
                    (select
                        NETAMOUNT,
                        count(R.ID) TOTAL,
                        max(count(R.ID)) over () MAXCOUNT
                    from
                        PLEDGEANDPAYMENTCTE R
                    group by
                        NETAMOUNT) X
                where
                    X.TOTAL = X.MAXCOUNT and X.TOTAL > 1
                order by
                    NETAMOUNT desc;

                --Matched by organization amount


                select
                    @MATCHEDGIFTSAMOUNT = sum(AMOUNT)
                from
                (    
                    --donation matched gift amount

                    select 
                        REVENUE.AMOUNTINCURRENCY as AMOUNT,
                        REVENUE.ID
                    from 
                        @ALLREVENUE
                    inner join
                        dbo.REVENUEMATCHINGGIFT on REVENUEMATCHINGGIFT.MGSOURCEREVENUEID = REVENUEID
                    inner join
                        dbo.UFN_REVENUE_GETAMOUNTSINCURRENCY_BULK(@CURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) REVENUE on REVENUE.ID = REVENUEMATCHINGGIFT.ID
                    group by REVENUEID, REVENUE.ID, REVENUE.AMOUNTINCURRENCY

                    union

                    --pledge/planned gift payment matched gift amount

                    select 
                        PLEDGEREVENUE.AMOUNTINCURRENCY as AMOUNT,
                        PLEDGEREVENUE.ID
                    from 
                        @ALLREVENUE ALLREVENUE
                    inner join
                        dbo.INSTALLMENTSPLITPAYMENT on INSTALLMENTSPLITPAYMENT.PLEDGEID = ALLREVENUE.REVENUEID
                    inner join
                        dbo.FINANCIALTRANSACTIONLINEITEM REVENUESPLIT on INSTALLMENTSPLITPAYMENT.PAYMENTID = REVENUESPLIT.ID
                    inner join
                        dbo.REVENUEMATCHINGGIFT on REVENUEMATCHINGGIFT.MGSOURCEREVENUEID = REVENUESPLIT.FINANCIALTRANSACTIONID
                    inner join
                        dbo.UFN_REVENUE_GETAMOUNTSINCURRENCY_BULK(@CURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) PLEDGEREVENUE on PLEDGEREVENUE.ID = REVENUEMATCHINGGIFT.ID
                    group by ALLREVENUE.REVENUEID, PLEDGEREVENUE.ID, PLEDGEREVENUE.AMOUNTINCURRENCY
                ) SUBQ


                set @MATCHEDGIFTSAMOUNT = coalesce(@MATCHEDGIFTSAMOUNT, 0);

                --TOTALYEARS

                select
                    @TOTALYEARS = count(distinct(dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(DATE,0)))
                from
                    @ALLREVENUE 

                if @CALCULATEGIVINGHISTORY = 1
                begin
                    --CONSECUTIVE YEARS

                    declare @CURRENTDATE datetime;
                    declare @FISCALYEAR_FIRSTDAY datetime;
                    declare @PREVIOUSFISCALYEAR_FIRSTDAY datetime;
                    declare @CONTINUE bit;

                    set @CURRENTDATE = getdate();

                    declare FISCALYEARCURSOR cursor local fast_forward for
                    select
                        dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(DATE,0) FISCALYEAR_FIRSTDAY
                    from
                        @ALLREVENUE
                    group by
                        dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(DATE,0)
                    order by
                        dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(DATE,0) desc;

                    set @CONSECUTIVEYEARS = 0;
                    set @GIVENSINCEFISCALYEAR = null;

                    open FISCALYEARCURSOR;
                        fetch next from FISCALYEARCURSOR into @FISCALYEAR_FIRSTDAY;
                        if @@FETCH_STATUS = 0 begin
                            if @FISCALYEAR_FIRSTDAY > dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(@CURRENTDATE,0) begin
                                set @CONTINUE = 1;
                                fetch next from FISCALYEARCURSOR into @PREVIOUSFISCALYEAR_FIRSTDAY;
                            end
                            else if @FISCALYEAR_FIRSTDAY = dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(@CURRENTDATE,0) or
                               @FISCALYEAR_FIRSTDAY = dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(dateadd(year,-1,@CURRENTDATE),0) begin
                                set @CONSECUTIVEYEARS = @CONSECUTIVEYEARS + 1;
                                set @CONTINUE = 1;
                                fetch next from FISCALYEARCURSOR into @PREVIOUSFISCALYEAR_FIRSTDAY;
                            end
                            else
                                set @CONTINUE = 0;
                        end

                        while @@FETCH_STATUS = 0 and @CONTINUE = 1 begin
                            if @CONSECUTIVEYEARS = 0 begin
                                if @PREVIOUSFISCALYEAR_FIRSTDAY > dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(@CURRENTDATE,0) begin
                                    set @FISCALYEAR_FIRSTDAY = @PREVIOUSFISCALYEAR_FIRSTDAY;
                                    fetch next from FISCALYEARCURSOR into @PREVIOUSFISCALYEAR_FIRSTDAY;
                                end
                                else if @PREVIOUSFISCALYEAR_FIRSTDAY = dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(@CURRENTDATE,0) or
                                   @PREVIOUSFISCALYEAR_FIRSTDAY = dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(dateadd(year,-1,@CURRENTDATE),0) begin
                                    set @CONSECUTIVEYEARS = @CONSECUTIVEYEARS + 1;
                                    set @FISCALYEAR_FIRSTDAY = @PREVIOUSFISCALYEAR_FIRSTDAY;
                                    fetch next from FISCALYEARCURSOR into @PREVIOUSFISCALYEAR_FIRSTDAY;
                                end
                                else
                                    set @CONTINUE = 0
                            end
                            else if @PREVIOUSFISCALYEAR_FIRSTDAY = dateadd(year, -1, @FISCALYEAR_FIRSTDAY) begin
                                set @CONSECUTIVEYEARS = @CONSECUTIVEYEARS + 1;
                                set @FISCALYEAR_FIRSTDAY = @PREVIOUSFISCALYEAR_FIRSTDAY;
                                fetch next from FISCALYEARCURSOR into @PREVIOUSFISCALYEAR_FIRSTDAY;
                            end
                            else
                                set @CONTINUE = 0;
                        end
                    --When a cursor is used, it should be explicitly closed/deallocated in case of blocking or USP running long

                    close FISCALYEARCURSOR;
                    deallocate FISCALYEARCURSOR;

                    if @CONSECUTIVEYEARS > 0
                        set @GIVENSINCEFISCALYEAR = @FISCALYEAR_FIRSTDAY;
                end

                -- household amount

                select
                    @HOUSEHOLDID = GM.GROUPID
                from
                    dbo.GROUPMEMBER GM
                left outer join
                    dbo.GROUPDATA GD on GD.ID = GM.GROUPID
                left outer join
                    dbo.GROUPMEMBERDATERANGE GMDR on GMDR.GROUPMEMBERID = GM.ID
                where
                    GM.MEMBERID = @CONSTITUENTID
                and
                    GD.GROUPTYPECODE = 0
                and ((GMDR.DATEFROM is null and (GMDR.DATETO is null or GMDR.DATETO > @CURRENTDATEEARLIESTTIME))
                    or (GMDR.DATETO is null and (GMDR.DATEFROM is null or GMDR.DATEFROM <= @CURRENTDATEEARLIESTTIME)) 
                    or (GMDR.DATEFROM <= @CURRENTDATEEARLIESTTIME and GMDR.DATETO > @CURRENTDATEEARLIESTTIME));

                if @HOUSEHOLDID is not null
                begin
                    declare @GIVINGBYGROUPMEMBERS money;
                    declare @GIVINGBYGROUP money;
                    with MEMBERIDS_CTE as (
                    select MEMBERID from dbo.GROUPMEMBER where GROUPID = @HOUSEHOLDID)
                    select
                        @GIVINGBYGROUPMEMBERS = cast(sum(cast(SPLITNETAMOUNT as decimal(20,5))) as money)
                    from
                        MEMBERIDS_CTE
                    cross apply dbo.UFN_CONSTITUENT_GIVINGHISTORYINCURRENCY_BULK(
                        MEMBERIDS_CTE.MEMBERID,
                        @CURRENTAPPUSERID,
                        @SITEFILTERMODE,
                        @SITESSELECTED,
                        @SECURITYFEATUREID,
                        @SECURITYFEATURETYPE,
                        @CURRENCYID,
                        @ORGANIZATIONCURRENCYID,
                        @DECIMALDIGITS,
                        @ROUNDINGTYPECODE) REV
                    inner join dbo.GROUPMEMBER GM on MEMBERIDS_CTE.MEMBERID = GM.MEMBERID
                    left join dbo.GROUPMEMBERDATERANGE GMDR on GMDR.GROUPMEMBERID = GM.ID
                    where 
                        GM.GROUPID = @HOUSEHOLDID and
                        ((GMDR.DATEFROM is null and (GMDR.DATETO is null or GMDR.DATETO >= REV.DATE))
                        or (GMDR.DATETO is null and (GMDR.DATEFROM is null or GMDR.DATEFROM <= REV.DATE)) 
                        or (GMDR.DATEFROM <= REV.DATE and GMDR.DATETO >= REV.DATE));

                     select
                        @GIVINGBYGROUP = cast(sum(cast(SPLITNETAMOUNT as decimal(20,5))) as money)
                    from dbo.UFN_CONSTITUENT_GIVINGHISTORYINCURRENCY_BULK(
                        @HOUSEHOLDID,
                        @CURRENTAPPUSERID,
                        @SITEFILTERMODE,
                        @SITESSELECTED,
                        @SECURITYFEATUREID,
                        @SECURITYFEATURETYPE,
                        @CURRENCYID,
                        @ORGANIZATIONCURRENCYID,
                        @DECIMALDIGITS,
                        @ROUNDINGTYPECODE) REV;

                    select @GIVINGBYGROUPMEMBERS = coalesce(@GIVINGBYGROUPMEMBERS, 0);
                    select @GIVINGBYGROUP = coalesce(@GIVINGBYGROUP, 0);
                    select @TOTALHOUSEHOLDGIVING = @GIVINGBYGROUPMEMBERS + @GIVINGBYGROUP;
                end