USP_DATAFORMTEMPLATE_VIEW_CONSTITUENT_CUMULATIVEGIVINGSUMMARY

The load procedure used by the view dataform template "Constituent Cumulative Giving Summary View Form"

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN The input ID parameter used to load the fields defined on the form.
@DATALOADED bit INOUT Output parameter indicating whether or not data was actually loaded.
@TOTALNUMBER int INOUT Total number
@TOTALAMOUNT money INOUT Total giving
@AVERAGEAMOUNT money INOUT Average amount
@MOSTFREQUENTAMOUNT money INOUT Most frequent amount
@TOTALPLEDGEBALANCE money INOUT Total pledge balance
@TOTALYEARS int INOUT Total years given
@CONSECUTIVEYEARS int INOUT Consecutive years
@GIVENSINCEFISCALYEAR datetime INOUT Given secutively since
@LARGESTID uniqueidentifier INOUT ID
@LARGESTRECORDID uniqueidentifier INOUT Record ID
@LARGESTDATE datetime INOUT Date
@LARGESTTYPECODE tinyint INOUT Type code
@LARGESTTYPE nvarchar(22) INOUT Type
@LARGESTAMOUNT money INOUT Amount
@LARGESTPLEDGEBALANCE money INOUT Balance
@LARGESTSPLITS xml INOUT Splits
@FIRSTID uniqueidentifier INOUT ID
@FIRSTRECORDID uniqueidentifier INOUT Record ID
@FIRSTDATE datetime INOUT Date
@FIRSTTYPECODE tinyint INOUT Type code
@FIRSTTYPE nvarchar(22) INOUT Type
@FIRSTAMOUNT money INOUT Amount
@FIRSTPLEDGEBALANCE money INOUT Pledge balance
@FIRSTSPLITS xml INOUT Splits
@LATESTID uniqueidentifier INOUT ID
@LATESTRECORDID uniqueidentifier INOUT Record ID
@LATESTDATE datetime INOUT Date
@LATESTTYPECODE tinyint INOUT Type code
@LATESTTYPE nvarchar(22) INOUT Type
@LATESTAMOUNT money INOUT Amount
@LATESTPLEDGEBALANCE money INOUT Pledge balance
@LATESTSPLITS xml INOUT Splits
@RECOGNITIONTOTALNUMBER int INOUT Total number
@RECOGNITIONTOTALAMOUNT money INOUT Total recognition
@RECOGNITIONAVERAGEAMOUNT money INOUT Average amount
@RECOGNITIONMOSTFREQUENTAMOUNT money INOUT Most frequent amount
@RECOGNITIONTOTALYEARS int INOUT Total years with recognition credit
@RECOGNITIONCONSECUTIVEYEARS int INOUT Consecutive years with recognition credit
@RECOGNITIONGIVENSINCEFISCALYEAR datetime INOUT Recognition credit given consecutively since
@RECOGNITIONLARGESTID uniqueidentifier INOUT ID
@RECOGNITIONLARGESTRECORDID uniqueidentifier INOUT Record ID
@RECOGNITIONLARGESTDATE datetime INOUT Date
@RECOGNITIONLARGESTTYPECODE tinyint INOUT Type code
@RECOGNITIONLARGESTTYPE nvarchar(22) INOUT Type
@RECOGNITIONLARGESTAMOUNT money INOUT Amount
@RECOGNITIONFIRSTID uniqueidentifier INOUT ID
@RECOGNITIONFIRSTRECORDID uniqueidentifier INOUT Record ID
@RECOGNITIONFIRSTDATE datetime INOUT Date
@RECOGNITIONFIRSTTYPECODE tinyint INOUT Type code
@RECOGNITIONFIRSTTYPE nvarchar(22) INOUT Type
@RECOGNITIONFIRSTAMOUNT money INOUT Amount
@RECOGNITIONLATESTID uniqueidentifier INOUT ID
@RECOGNITIONLATESTRECORDID uniqueidentifier INOUT Record ID
@RECOGNITIONLATESTDATE datetime INOUT Date
@RECOGNITIONLATESTTYPECODE tinyint INOUT Type code
@RECOGNITIONLATESTTYPE nvarchar(22) INOUT Type
@RECOGNITIONLATESTAMOUNT money INOUT Amount
@HOUSEHOLDID uniqueidentifier INOUT Household ID
@TOTALHOUSEHOLDGIVING money INOUT Total household giving
@CURRENTAPPUSERID uniqueidentifier IN Input parameter indicating the ID of the current user.

Definition

Copy


    CREATE procedure dbo.USP_DATAFORMTEMPLATE_VIEW_CONSTITUENT_CUMULATIVEGIVINGSUMMARY (
        @ID uniqueidentifier,
        @DATALOADED bit = 0 output,
        @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,
        @LARGESTID uniqueidentifier = null output,
        @LARGESTRECORDID uniqueidentifier = null output,
        @LARGESTDATE datetime = null output,
        @LARGESTTYPECODE tinyint = null output,
        @LARGESTTYPE nvarchar(22) = null output,
        @LARGESTAMOUNT money = null output,
        @LARGESTPLEDGEBALANCE money = null output,
        @LARGESTSPLITS xml = null output,
        @FIRSTID uniqueidentifier = null output,
        @FIRSTRECORDID uniqueidentifier = null output,
        @FIRSTDATE datetime = null output,
        @FIRSTTYPECODE tinyint = null output,
        @FIRSTTYPE nvarchar(22) = null output,
        @FIRSTAMOUNT money = null output,
        @FIRSTPLEDGEBALANCE money = null output,
        @FIRSTSPLITS xml = null output,
        @LATESTID uniqueidentifier = null output,
        @LATESTRECORDID uniqueidentifier = null output,
        @LATESTDATE datetime = null output,
        @LATESTTYPECODE tinyint = null output,
        @LATESTTYPE nvarchar(22) = null output,
        @LATESTAMOUNT money = null output,
        @LATESTPLEDGEBALANCE money = null output,
        @LATESTSPLITS xml = null output,
        @RECOGNITIONTOTALNUMBER int = null output,
        @RECOGNITIONTOTALAMOUNT money = null output,
        @RECOGNITIONAVERAGEAMOUNT money = null output,
        @RECOGNITIONMOSTFREQUENTAMOUNT money = null output,
        @RECOGNITIONTOTALYEARS int = null output,
        @RECOGNITIONCONSECUTIVEYEARS int = null output,
        @RECOGNITIONGIVENSINCEFISCALYEAR datetime = null output,
        @RECOGNITIONLARGESTID uniqueidentifier = null output,
        @RECOGNITIONLARGESTRECORDID uniqueidentifier = null output,
        @RECOGNITIONLARGESTDATE datetime = null output,
        @RECOGNITIONLARGESTTYPECODE tinyint = null output,
        @RECOGNITIONLARGESTTYPE nvarchar(22) = null output,
        @RECOGNITIONLARGESTAMOUNT money = null output,
        @RECOGNITIONFIRSTID uniqueidentifier = null output,
        @RECOGNITIONFIRSTRECORDID uniqueidentifier = null output,
        @RECOGNITIONFIRSTDATE datetime = null output,
        @RECOGNITIONFIRSTTYPECODE tinyint = null output,
        @RECOGNITIONFIRSTTYPE nvarchar(22) = null output,
        @RECOGNITIONFIRSTAMOUNT money = null output,
        @RECOGNITIONLATESTID uniqueidentifier = null output,
        @RECOGNITIONLATESTRECORDID uniqueidentifier = null output,
        @RECOGNITIONLATESTDATE datetime = null output,
        @RECOGNITIONLATESTTYPECODE tinyint = null output,
        @RECOGNITIONLATESTTYPE nvarchar(22) = null output,
        @RECOGNITIONLATESTAMOUNT money = null output,
        @HOUSEHOLDID uniqueidentifier = null output,
        @TOTALHOUSEHOLDGIVING money = null output,
        @CURRENTAPPUSERID uniqueidentifier
      ) as
        set nocount on;

        set @DATALOADED = 0;

        select @DATALOADED = 1
        from dbo.CONSTITUENT
        where CONSTITUENT.ID = @ID;

        declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
        declare @CURRENCYID uniqueidentifier = @ORGANIZATIONCURRENCYID; --default to org currency

        declare @DECIMALDIGITS tinyint;
        declare @ROUNDINGTYPECODE tinyint;

        select 
            @ROUNDINGTYPECODE = ROUNDINGTYPECODE,
            @DECIMALDIGITS = DECIMALDIGITS
        from
            dbo.CURRENCY
        where
            CURRENCY.ID = @CURRENCYID

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

        IF OBJECT_ID('tempdb..#ALLREVENUE') IS NOT NULL
            DROP TABLE #ALLREVENUE

        create table #ALLREVENUE 
        (
            REVENUEID uniqueidentifier,
            TRANSACTIONTYPECODE tinyint,
            TRANSACTIONTYPE nvarchar(21) collate DATABASE_DEFAULT,
            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_GIVINGHISTORYINORGCURRENCY_BULK(
            @ID,
            @CURRENTAPPUSERID)
        where dbo.UFN_REVENUE_USERHASSITEACCESS(REVENUEID,@CURRENTAPPUSERID) = 1

        select
            @TOTALNUMBER = count(distinct REVENUEID),
            @TOTALAMOUNT = cast(sum(cast(SPLITNETAMOUNT 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);

        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;

        --TOTALYEARS

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

        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;

        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 = @ID
        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,
                0,
                null,
                null,
                null,
                @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,
                0,
                null,
                null,
                null,
                @CURRENCYID,
                @ORGANIZATIONCURRENCYID,
                @DECIMALDIGITS,
                @ROUNDINGTYPECODE) REV;

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

        --LARGEST GIFT

        select top 1
          @LARGESTID = R.REVENUEID,
          @LARGESTRECORDID = R.REVENUEID,
          @LARGESTDATE = R.DATE,
          @LARGESTTYPECODE = R.TRANSACTIONTYPECODE,
          @LARGESTTYPE = R.TRANSACTIONTYPE,
          @LARGESTAMOUNT = sum(R.SPLITNETAMOUNT),
          @LARGESTPLEDGEBALANCE = case R.TRANSACTIONTYPECODE when 1 then dbo.UFN_PLEDGE_GETBALANCE(R.REVENUEID) else null end,
          --using this instead of TOXML function, because a different root element is needed

          @LARGESTSPLITS = (select
                    [AMOUNT],
                    [ID],
                    [PURPOSE]
                  from
                    dbo.[UFN_REVENUE_GETSPLITS_LIST](R.REVENUEID)
                  order by
                    ID
                  for xml raw('ITEM'),type,elements,root('LARGESTSPLITS'),BINARY BASE64)
        from #ALLREVENUE R
        group by
          R.REVENUEID, R.TRANSACTIONTYPE, R.TRANSACTIONTYPECODE, R.DATE, R.DATEADDED
        order by
          sum(R.SPLITNETAMOUNT) desc, R.DATE desc, R.DATEADDED desc;

        --FIRST GIFT

        select top 1
          @FIRSTID = R.REVENUEID,
          @FIRSTRECORDID = R.REVENUEID,
          @FIRSTDATE = R.DATE,
          @FIRSTTYPECODE = R.TRANSACTIONTYPECODE,
          @FIRSTTYPE = R.TRANSACTIONTYPE,
          @FIRSTAMOUNT = sum(R.SPLITNETAMOUNT),
          @FIRSTPLEDGEBALANCE = case R.TRANSACTIONTYPECODE when 1 then dbo.UFN_PLEDGE_GETBALANCE(R.REVENUEID) else null end,
          --using this instead of TOXML function, because a different root element is needed

          @FIRSTSPLITS = (select
                    [AMOUNT],
                    [ID],
                    [PURPOSE]
                  from
                    dbo.[UFN_REVENUE_GETSPLITS_LIST](R.REVENUEID)
                  order by
                    ID
                  for xml raw('ITEM'),type,elements,root('FIRSTSPLITS'),BINARY BASE64)
        from #ALLREVENUE R
        group by
          R.REVENUEID, R.TRANSACTIONTYPE, R.TRANSACTIONTYPECODE, R.DATE, R.DATEADDED
        order by
          R.DATE asc, R.DATEADDED asc;

        --LATEST GIFT

        select top 1
          @LATESTID = R.REVENUEID,
          @LATESTRECORDID = R.REVENUEID,
          @LATESTDATE = R.DATE,
          @LATESTTYPECODE = R.TRANSACTIONTYPECODE,
          @LATESTTYPE = R.TRANSACTIONTYPE,
          @LATESTAMOUNT = sum(R.SPLITNETAMOUNT),
          @LATESTPLEDGEBALANCE = case R.TRANSACTIONTYPECODE when 1 then dbo.UFN_PLEDGE_GETBALANCE(R.REVENUEID) else null end,
          --using this instead of TOXML function, because a different root element is needed

          @LATESTSPLITS = (select
                    [AMOUNT],
                    [ID],
                    [PURPOSE]
                  from
                    dbo.[UFN_REVENUE_GETSPLITS_LIST](R.REVENUEID)
                  order by
                    ID
                  for xml raw('ITEM'),type,elements,root('LATESTSPLITS'),BINARY BASE64)
        from #ALLREVENUE R
        group by
          R.REVENUEID, R.TRANSACTIONTYPE, R.TRANSACTIONTYPECODE, R.DATE, R.DATEADDED
        order by
          R.DATE desc, R.DATEADDED desc;

        declare @FIRSTDAYTHISFISCALYEAR datetime;
        declare @FIRSTDAYPREVIOUSFISCALYEAR datetime;
        set @FIRSTDAYTHISFISCALYEAR = dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(@CURRENTDATE,0);
        set @FIRSTDAYPREVIOUSFISCALYEAR = dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(dateadd(year,-1,@CURRENTDATE),0);


        create table #RECOGNITIONS (
            ID uniqueidentifier primary key,
            REVENUESPLITID uniqueidentifier,
            REVENUEID uniqueidentifier,
            EFFECTIVEDATE datetime,
            TRANSACTIONTYPECODE tinyint,
            TRANSACTIONTYPE nvarchar(21) collate DATABASE_DEFAULT,
            FIRSTDAYOFEFFECTIVEDATEYEAR datetime,
            APPLICATIONCODE tinyint,
            AMOUNT money,
            DATEADDED datetime
        );

        insert into #RECOGNITIONS (ID, REVENUESPLITID, REVENUEID, TRANSACTIONTYPECODE, TRANSACTIONTYPE, FIRSTDAYOFEFFECTIVEDATEYEAR, APPLICATIONCODE, EFFECTIVEDATE, AMOUNT, DATEADDED)
        select
            RR.ID,
            RR.REVENUESPLITID,
            RR.REVENUEID,
            RR.TRANSACTIONTYPECODE,
            RR.TRANSACTIONTYPE,
            dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(RR.EFFECTIVEDATE,0) as FIRSTDAYOFEFFECTIVEDATEYEAR,
            RR.APPLICATIONCODE,
            RR.EFFECTIVEDATE,
            RR.AMOUNTINCURRENCY,
            RR.DATEADDED
        from dbo.UFN_RECOGNITIONCREDIT_GETRECOGNITIONS_NOCONSTITNAME(@CURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE, @ORGANIZATIONCURRENCYID) RR
        left join dbo.V_PLANNEDGIFTREVENUE_WITHADDITIONS PGR on PGR.REVENUEID = RR.REVENUEID
        left join dbo.PLANNEDGIFT PG on PG.ID = PGR.PLANNEDGIFTID
        where RR.CONSTITUENTID = @ID
            and (RR.TRANSACTIONTYPECODE in (1, 3, 7, 8) or --Pledge, Matching Gift Claim, Auction donation, Donor challenge claim

                (RR.TRANSACTIONTYPECODE = 4 and PG.VEHICLECODE in (0,1,2,5,6,7,8,9,10,11,12,13)) or --Planned gift

                (RR.TRANSACTIONTYPECODE = 0 and (RR.APPLICATIONCODE in (0, 3, 7) or (RR.APPLICATIONCODE = 1 and RR.REVENUESPLITTYPECODE = 0)))) --Payment;

            and dbo.UFN_REVENUE_USERHASSITEACCESS(RR.REVENUEID,@CURRENTAPPUSERID) = 1

        select
          @RECOGNITIONTOTALNUMBER = count(RR.ID),
          @RECOGNITIONTOTALAMOUNT = sum(RR.AMOUNT),
          @RECOGNITIONAVERAGEAMOUNT = cast(avg(cast(RR.AMOUNT as decimal(20,5))) as money)
        from #RECOGNITIONS RR

        set @RECOGNITIONTOTALNUMBER = coalesce(@RECOGNITIONTOTALNUMBER, 0);
        set @RECOGNITIONTOTALAMOUNT = coalesce(@RECOGNITIONTOTALAMOUNT, 0);

        --MODE

        select top 1
          @RECOGNITIONMOSTFREQUENTAMOUNT = X.AMOUNT
        from
          (select
            dbo.UFN_REVENUERECOGNITION_GETAMOUNTINCURRENCY(RR.ID, @CURRENCYID) as AMOUNT,
            count(RR.ID) TOTAL,
            max(count(RR.ID)) over () MAXCOUNT
          from #RECOGNITIONS RR
          group by
            dbo.UFN_REVENUERECOGNITION_GETAMOUNTINCURRENCY(RR.ID, @CURRENCYID)) X
        where
          X.TOTAL = X.MAXCOUNT and X.TOTAL > 1
        order by
          X.AMOUNT desc;

        --TOTALYEARS

        select
          @RECOGNITIONTOTALYEARS = count(distinct(RR.FIRSTDAYOFEFFECTIVEDATEYEAR))
        from #RECOGNITIONS RR

        --CONSECUTIVE YEARS

        declare @RECOGNITIONFISCALYEAR_FIRSTDAY datetime;
        declare @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY datetime;
        set @CONTINUE = 0;

        declare RECOGNITIONFISCALYEARCURSOR cursor local fast_forward for
        select
          RR.FIRSTDAYOFEFFECTIVEDATEYEAR FISCALYEAR_FIRSTDAY
        from #RECOGNITIONS RR
        group by RR.FIRSTDAYOFEFFECTIVEDATEYEAR
        order by RR.FIRSTDAYOFEFFECTIVEDATEYEAR desc;

        set @RECOGNITIONCONSECUTIVEYEARS = 0;
        set @RECOGNITIONGIVENSINCEFISCALYEAR = null;

        open RECOGNITIONFISCALYEARCURSOR;
          fetch next from RECOGNITIONFISCALYEARCURSOR into @RECOGNITIONFISCALYEAR_FIRSTDAY;
          if @@FETCH_STATUS = 0 begin
            if @RECOGNITIONFISCALYEAR_FIRSTDAY > @FIRSTDAYTHISFISCALYEAR begin
              set @CONTINUE = 1;
              fetch next from RECOGNITIONFISCALYEARCURSOR into @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY;
            end
            else if @RECOGNITIONFISCALYEAR_FIRSTDAY = @FIRSTDAYTHISFISCALYEAR or
              @RECOGNITIONFISCALYEAR_FIRSTDAY = @FIRSTDAYPREVIOUSFISCALYEAR begin
              set @RECOGNITIONCONSECUTIVEYEARS = @RECOGNITIONCONSECUTIVEYEARS + 1;
              set @CONTINUE = 1;
              fetch next from RECOGNITIONFISCALYEARCURSOR into @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY;
            end
            else
              set @CONTINUE = 0;
          end

          while @@FETCH_STATUS = 0 and @CONTINUE = 1 begin
            if @RECOGNITIONCONSECUTIVEYEARS = 0 begin
              if @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY > @FIRSTDAYTHISFISCALYEAR begin
                set @RECOGNITIONFISCALYEAR_FIRSTDAY = @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY;
                fetch next from RECOGNITIONFISCALYEARCURSOR into @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY;
              end
              else if @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY = @FIRSTDAYTHISFISCALYEAR or
                @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY = @FIRSTDAYPREVIOUSFISCALYEAR begin
                set @RECOGNITIONCONSECUTIVEYEARS = @RECOGNITIONCONSECUTIVEYEARS + 1;
                set @RECOGNITIONFISCALYEAR_FIRSTDAY = @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY;
                fetch next from RECOGNITIONFISCALYEARCURSOR into @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY;
              end
              else
                set @CONTINUE = 0
            end
            else if @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY = dateadd(year, -1, @RECOGNITIONFISCALYEAR_FIRSTDAY) begin
              set @RECOGNITIONCONSECUTIVEYEARS = @RECOGNITIONCONSECUTIVEYEARS + 1;
              set @RECOGNITIONFISCALYEAR_FIRSTDAY = @RECOGNITIONPREVIOUSFISCALYEAR_FIRSTDAY;
              fetch next from RECOGNITIONFISCALYEARCURSOR into @RECOGNITIONPREVIOUSFISCALYEAR_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 RECOGNITIONFISCALYEARCURSOR;
        deallocate RECOGNITIONFISCALYEARCURSOR;

        if @RECOGNITIONCONSECUTIVEYEARS > 0
          set @RECOGNITIONGIVENSINCEFISCALYEAR = @RECOGNITIONFISCALYEAR_FIRSTDAY;

        --LARGEST GIFT

        select top 1
          @RECOGNITIONLARGESTID = RR.ID,
          @RECOGNITIONLARGESTRECORDID = RR.REVENUEID,
          @RECOGNITIONLARGESTDATE = RR.EFFECTIVEDATE,
          @RECOGNITIONLARGESTTYPECODE = RR.TRANSACTIONTYPECODE,
          @RECOGNITIONLARGESTTYPE = RR.TRANSACTIONTYPE,
          @RECOGNITIONLARGESTAMOUNT = RR.AMOUNT
        from #RECOGNITIONS RR
        order by
          RR.AMOUNT desc, RR.EFFECTIVEDATE desc, RR.DATEADDED desc;

        --FIRST GIFT

        select top 1
          @RECOGNITIONFIRSTID = RR.ID,
          @RECOGNITIONFIRSTRECORDID = RR.REVENUEID,
          @RECOGNITIONFIRSTDATE = RR.EFFECTIVEDATE,
          @RECOGNITIONFIRSTTYPECODE = RR.TRANSACTIONTYPECODE,
          @RECOGNITIONFIRSTTYPE = RR.TRANSACTIONTYPE,
          @RECOGNITIONFIRSTAMOUNT = RR.AMOUNT
        from #RECOGNITIONS RR
        order by
          RR.EFFECTIVEDATE asc, RR.DATEADDED asc;

        --LATEST GIFT

        select top 1
          @RECOGNITIONLATESTID = RR.ID,
          @RECOGNITIONLATESTRECORDID = RR.REVENUEID,
          @RECOGNITIONLATESTDATE = RR.EFFECTIVEDATE,
          @RECOGNITIONLATESTTYPECODE = RR.TRANSACTIONTYPECODE,
          @RECOGNITIONLATESTTYPE = RR.TRANSACTIONTYPE,
          @RECOGNITIONLATESTAMOUNT = RR.AMOUNT
        from #RECOGNITIONS RR
        order by
          RR.EFFECTIVEDATE desc, RR.DATEADDED desc;


        drop table #RECOGNITIONS;

        return 0;