USP_DATALIST_RECOGNITIONREVENUEREPORT

Fetches recognition program revenue information for the recognition revenue report

Parameters

Parameter Parameter Type Mode Description
@PROGRAMID uniqueidentifier IN Membership program
@STARTDATE datetime IN Start date
@ENDDATE datetime IN End date
@CURRENCYCODE tinyint IN Currency

Definition

Copy


CREATE procedure dbo.USP_DATALIST_RECOGNITIONREVENUEREPORT(
    @PROGRAMID uniqueidentifier,
    @STARTDATE datetime,
    @ENDDATE datetime,
    @CURRENCYCODE tinyint = null --0 = Record base, (null, 1) = Organization


with execute as owner
as
    set nocount on;

    set @STARTDATE = dbo.UFN_DATE_GETEARLIESTTIME(@STARTDATE);
    set @ENDDATE = dbo.UFN_DATE_GETLATESTTIME(@ENDDATE);

    declare @SELECTIONID uniqueidentifier;
    declare @PLANNEDGIFTCODE tinyint;
    declare @USEGROSSAMOUNT bit;

    declare @ORGANIZATIONCURRENCYID uniqueidentifier = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
    declare @SELECTEDCURRENCYID uniqueidentifier;
    if coalesce(@CURRENCYCODE, 1) = 1
    begin
        set @SELECTEDCURRENCYID = @ORGANIZATIONCURRENCYID;
    end

    select
        @SELECTIONID = SELECTIONID,
        @PLANNEDGIFTCODE = PLANNEDGIFTCODE,
        @USEGROSSAMOUNT = USEGROSSAMOUNT,
        @SELECTEDCURRENCYID = coalesce(@SELECTEDCURRENCYID, BASECURRENCYID)
    from dbo.RECOGNITIONPROGRAM
    where ID = @PROGRAMID;

    declare @ISOCURRENCYCODE nvarchar(3);
    declare @DECIMALDIGITS tinyint;
    declare @CURRENCYSYMBOL nvarchar(5);
    declare @CURRENCYSYMBOLDISPLAYSETTINGCODE tinyint;
    declare @ROUNDINGTYPECODE tinyint;

    select
        @ISOCURRENCYCODE = CURRENCYPROPERTIES.ISO4217,
        @DECIMALDIGITS = CURRENCYPROPERTIES.DECIMALDIGITS,
        @CURRENCYSYMBOL = CURRENCYPROPERTIES.CURRENCYSYMBOL,
        @CURRENCYSYMBOLDISPLAYSETTINGCODE = CURRENCYPROPERTIES.SYMBOLDISPLAYSETTINGCODE,
        @ROUNDINGTYPECODE = CURRENCYPROPERTIES.ROUNDINGTYPECODE
    from
        dbo.UFN_CURRENCY_GETPROPERTIES(@SELECTEDCURRENCYID) CURRENCYPROPERTIES

    if object_id('tempdb..#MASTERJOIN') is not null
        drop table #MASTERJOIN;

    create table #MASTERJOIN (
        TIERCODE uniqueidentifier,
        RECOGNITIONLEVEL uniqueidentifier,
        REVENUESPLITAMOUNT money,
        REVENUETYPE tinyint,
        REVENUEID uniqueidentifier,
        FTLIID uniqueidentifier
    );

    if object_id('tempdb..#RECOGNITIONPROGRAMTYPECODE') is not null
        drop table #RECOGNITIONPROGRAMTYPECODE;

    create table #RECOGNITIONPROGRAMTYPECODE (
        TYPECODE int primary key
    );

    insert into #RECOGNITIONPROGRAMTYPECODE (TYPECODE)
        select distinct
            T.c.value('(TYPECODEID)[1]','tinyint') as TYPECODE
        from
            dbo.RECOGNITIONPROGRAM with (nolock)
            cross apply GIFTTYPESFILTER.nodes('/GIFTTYPESFILTER/ITEM') T(c)
        where
            RECOGNITIONPROGRAM.ID = @PROGRAMID;

    declare @SQL nvarchar(max);

    -- Get program-related constituents

    set @SQL = 
    'with CONSTITRECS_SEQUENCE_CTE as (
        select
            REVENUERECOGNITION.CONSTITUENTID,
            CONSTITUENTRECOGNITION.RECOGNITIONLEVELID,
            ROW_NUMBER() over(PARTITION BY CONSTITUENTRECOGNITION.CONSTITUENTID order by CONSTITUENTRECOGNITION.JOINDATE desc,CONSTITUENTRECOGNITION.DATEADDED desc) as SEQUENCE
        from dbo.REVENUERECOGNITION
        inner join dbo.CONSTITUENTRECOGNITION on REVENUERECOGNITION.CONSTITUENTID = CONSTITUENTRECOGNITION.CONSTITUENTID
        inner join dbo.UFN_RECOGNITIONPROGRAM_GET_VALIDCONSTITUENTS(@PROGRAMID) as ISVALID on CONSTITUENTRECOGNITION.CONSTITUENTID = ISVALID.ID
        where
            RECOGNITIONPROGRAMID = @PROGRAMID
            and JOINDATE <= @ENDDATE
    )
    insert into #MASTERJOIN (
        TIERCODE,
        RECOGNITIONLEVEL,
        REVENUESPLITAMOUNT,
        REVENUETYPE,
        REVENUEID,
        FTLIID
    )
    select
        RL.TIERCODEID as TIERCODE,
        CR.RECOGNITIONLEVELID as RECOGNITIONLEVEL,
        max(RS.AMOUNTINCURRENCY) as REVENUESPLITAMOUNT,
        R.TRANSACTIONTYPECODE as REVENUETYPE,
        R.ID as REVENUEID,
        RS.ID as FTLIID
    from dbo.REVENUERECOGNITION with (nolock)
        inner join dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) RS on REVENUERECOGNITION.REVENUESPLITID = RS.ID
        inner join dbo.REVENUE as R with (nolock) on RS.REVENUEID = R.ID
        inner join CONSTITRECS_SEQUENCE_CTE as CR on CR.SEQUENCE = 1 and CR.CONSTITUENTID = REVENUERECOGNITION.CONSTITUENTID 
        inner join dbo.RECOGNITIONLEVEL as RL with (nolock) on CR.RECOGNITIONLEVELID = RL.ID
    where
        REVENUERECOGNITION.EFFECTIVEDATE between @STARTDATE and @ENDDATE
        and(
            exists (             
                select 1
                from #RECOGNITIONPROGRAMTYPECODE as RECOGNITIONPROGRAMTYPECODE
                where

                    (R.TRANSACTIONTYPECODE = 0 and RECOGNITIONPROGRAMTYPECODE.TYPECODE = RS.APPLICATIONCODE) or -- Payment

                    (RECOGNITIONPROGRAMTYPECODE.TYPECODE = 21 and R.TRANSACTIONTYPECODE = 1) or --Pledge

                    (RECOGNITIONPROGRAMTYPECODE.TYPECODE = 22 and R.TRANSACTIONTYPECODE = 2) or --Recurring Gift

                    (RECOGNITIONPROGRAMTYPECODE.TYPECODE = 23 and R.TRANSACTIONTYPECODE = 3) or -- Matching Gift Claim

                    (RECOGNITIONPROGRAMTYPECODE.TYPECODE = 24 and R.TRANSACTIONTYPECODE = 7) --Auction donations

            ) 
            or
            (R.TRANSACTIONTYPECODE = 4 and @PLANNEDGIFTCODE <> 0) -- Planned Gift, not separate

        )
        and(
            (
                select count(DESIGNATIONID) from dbo.RECOGNITIONPROGRAMDESIGNATION RPD with (nolock)
                where RPD.RECOGNITIONPROGRAMID = @PROGRAMID
            ) = 0 
            or exists(
                select ID from dbo.UFN_RECOGNITIONPROGRAM_GETDESIGNATIONS_ALL(@PROGRAMID) DS
                where RS.DESIGNATIONID = DS.ID
            )
        )'

        if @SELECTIONID is not null
        begin
            declare @DBOBJECTNAME nvarchar(128);
            declare @DBOBJECTTYPE smallint;

            if not exists(select ID from dbo.IDSETREGISTER where ID = @SELECTIONID
                raiserror('ID set does not exist in the database.', 15, 1);

            select
                @DBOBJECTNAME = DBOBJECTNAME, 
                @DBOBJECTTYPE = OBJECTTYPE 
            from dbo.IDSETREGISTER where ID = @SELECTIONID;

            if @DBOBJECTTYPE = 1 
                set @DBOBJECTNAME = @DBOBJECTNAME + '()';
            else if @DBOBJECTTYPE = 2 
                set @DBOBJECTNAME = @DBOBJECTNAME + '(''' + convert(nvarchar(36), @SELECTIONID) + ''')';

            set @SQL = @SQL + ' and exists (select 1 from dbo.' + @DBOBJECTNAME + ' as SELECTION where SELECTION.ID = R.ID) '
        end

    set @SQL = @SQL + ' 
    group by
        RL.TIERCODEID,
        CR.RECOGNITIONLEVELID,
        R.TRANSACTIONTYPECODE,
        R.ID,
        RS.ID'

    exec sp_executesql 
        @SQL
        N'    @PROGRAMID uniqueidentifier,@PLANNEDGIFTCODE tinyint,@SELECTIONID uniqueidentifier,@STARTDATE datetime,@ENDDATE datetime,
            @SELECTEDCURRENCYID uniqueidentifier, @ORGANIZATIONCURRENCYID uniqueidentifier, @DECIMALDIGITS tinyint, @ROUNDINGTYPECODE tinyint',
        @PROGRAMID,@PLANNEDGIFTCODE,@SELECTIONID,@STARTDATE,@ENDDATE,@SELECTEDCURRENCYID,@ORGANIZATIONCURRENCYID,@DECIMALDIGITS,@ROUNDINGTYPECODE

--The if statement below contains the additional logic to calculate totals based on gross amounts.

    if (@USEGROSSAMOUNT = 1)
        begin
            update
                #MASTERJOIN
            set 
                REVENUESPLITAMOUNT =
                    case #MASTERJOIN.REVENUETYPE
                    when 0 then
                        REVENUESPLITAMOUNT + UFN_RSGA.TAXCLAIMAMOUNTINCURRENCY
                    when 1 then
                        REVENUESPLITAMOUNT + PLEDGEINSTALLMENTSPLITTAXCLAIMAMOUNT.TAXCLAIMAMOUNTINCURRENCY
                    else
                        REVENUESPLITAMOUNT
            end
            from #MASTERJOIN
            inner join dbo.UFN_REVENUESPLITGIFTAID_GETAMOUNTSINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as UFN_RSGA on UFN_RSGA.ID = #MASTERJOIN.FTLIID
            inner join dbo.UFN_REVENUESPLITGIFTAID_GETELIGIBLE(1) ELIGIBLEGIFTAID on ELIGIBLEGIFTAID.ID = UFN_RSGA.ID
            left join dbo.UFN_PLEDGEINSTALLMENTSPLIT_CALCULATETAXCLAIMAMOUNTSINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) PLEDGEINSTALLMENTSPLITTAXCLAIMAMOUNT on PLEDGEINSTALLMENTSPLITTAXCLAIMAMOUNT.REVENUESPLITID = UFN_RSGA.ID
            where
                #MASTERJOIN.REVENUESPLITAMOUNT > 0 and
                #MASTERJOIN.REVENUETYPE in (0,1);
    end 

    if object_id('tempdb..#ADDITIONALGIFTS') is not null
        drop table #ADDITIONALGIFTS;

    create table #ADDITIONALGIFTS (
        FTLIID uniqueidentifier,
        CONSTITUENTID uniqueidentifier,
        RECOGNITIONLEVELID uniqueidentifier,
        REVENUESPLITAMOUNTINCURRENCY money,
        TRANSACTIONTYPECODE tinyint,
        DATE date
    );


    with CONSTITUENTS_RECLEVEL_CTE as (
        select distinct
            CONSTITUENTRECOGNITION.CONSTITUENTID as CONSTITUENTID,
            CONSTITUENTRECOGNITION.RECOGNITIONLEVELID as RECOGNITIONLEVELID
        from
            #MASTERJOIN MJ
            inner join dbo.CONSTITUENTRECOGNITION with (nolock) on CONSTITUENTRECOGNITION.RECOGNITIONLEVELID = MJ.RECOGNITIONLEVEL
    )
    insert into #ADDITIONALGIFTS
    (
        FTLIID,
        CONSTITUENTID,
        RECOGNITIONLEVELID,
        REVENUESPLITAMOUNTINCURRENCY,
        TRANSACTIONTYPECODE,
        DATE
    )
    select
        UFN_RS.ID as FTLIID,
        UFN_RS.CONSTITUENTID as CONSTITUENTID,
        CONSTITUENTS_RECLEVEL_CTE.RECOGNITIONLEVELID,
        UFN_RS.AMOUNTINCURRENCY as REVENUESPLITAMOUNTINCURRENCY,
        UFN_RS.TRANSACTIONTYPECODE as TRANSACTIONTYPECODE,
        UFN_RS.DATE as DATE
    from
    CONSTITUENTS_RECLEVEL_CTE
    inner join dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as UFN_RS on UFN_RS.CONSTITUENTID = CONSTITUENTS_RECLEVEL_CTE.CONSTITUENTID
    where
        UFN_RS.[DATE] between @STARTDATE and @ENDDATE and
        UFN_RS.ID not in (select FTLIID from #MASTERJOIN);

    if @USEGROSSAMOUNT = 1
    begin
        update
            #ADDITIONALGIFTS
        set
            REVENUESPLITAMOUNTINCURRENCY = 
            case #ADDITIONALGIFTS.TRANSACTIONTYPECODE
            when 0 then
                REVENUESPLITAMOUNTINCURRENCY + UFN_RSGA.TAXCLAIMAMOUNTINCURRENCY
            when 1 then
                REVENUESPLITAMOUNTINCURRENCY + PLEDGEINSTALLMENTSPLITTAXCLAIMAMOUNT.TAXCLAIMAMOUNTINCURRENCY
            else
                REVENUESPLITAMOUNTINCURRENCY
            end
        from
        #ADDITIONALGIFTS
        inner join dbo.UFN_REVENUESPLITGIFTAID_GETAMOUNTSINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as UFN_RSGA on UFN_RSGA.ID = #ADDITIONALGIFTS.FTLIID
        inner join dbo.UFN_REVENUESPLITGIFTAID_GETELIGIBLE(1) ELIGIBLEGIFTAID on ELIGIBLEGIFTAID.ID = UFN_RSGA.ID
        left join dbo.UFN_PLEDGEINSTALLMENTSPLIT_CALCULATETAXCLAIMAMOUNTSINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) PLEDGEINSTALLMENTSPLITTAXCLAIMAMOUNT on PLEDGEINSTALLMENTSPLITTAXCLAIMAMOUNT.REVENUESPLITID = UFN_RSGA.ID
        where
            #ADDITIONALGIFTS.REVENUESPLITAMOUNTINCURRENCY > 0 and
            #ADDITIONALGIFTS.TRANSACTIONTYPECODE in (0,1);
    end

    select
        dbo.UFN_TIERCODE_GETDESCRIPTION(MJ1.TIERCODE) as TIER,
        dbo.UFN_RECOGNITIONLEVEL_GETNAME(MJ1.RECOGNITIONLEVEL) as RECOGNITIONLEVEL,
        (
            select sum(REVENUESPLITAMOUNT)
            from #MASTERJOIN as MJ2
            where MJ2.REVENUETYPE is not null 
                and    MJ2.RECOGNITIONLEVEL = MJ1.RECOGNITIONLEVEL
        ) as TOTALREVENUE,
        (
            select sum(REVENUESPLITAMOUNT)
            from #MASTERJOIN as MJ2
            where MJ2.REVENUETYPE = 0 
                and MJ2.RECOGNITIONLEVEL = MJ1.RECOGNITIONLEVEL
        ) as RECEIVEDREVENUE,
        (
            select sum(REVENUESPLITAMOUNT)
            from #MASTERJOIN as MJ2
            where MJ2.REVENUETYPE = 1 
                and MJ2.RECOGNITIONLEVEL = MJ1.RECOGNITIONLEVEL
        ) as EXPECTEDREVENUE,
        dbo.UFN_CONSTITUENTRECOGNITION_COUNTBYLEVEL(@ENDDATE, MJ1.RECOGNITIONLEVEL) as NUMMEMBERS,
        (
            select
                sum(AD.REVENUESPLITAMOUNTINCURRENCY)
            from #ADDITIONALGIFTS AD
            where
                AD.RECOGNITIONLEVELID = MJ1.RECOGNITIONLEVEL
        ) as ADDITIONALGIFTS,
        @SELECTEDCURRENCYID SELECTEDCURRENCYID,
        @ISOCURRENCYCODE ISOCURRENCYCODE,
        @CURRENCYSYMBOL CURRENCYSYMBOL,
        @DECIMALDIGITS DECIMALDIGITS,
        @CURRENCYSYMBOLDISPLAYSETTINGCODE CURRENCYSYMBOLDISPLAYSETTINGCODE
    from #MASTERJOIN as MJ1
    group by
        MJ1.TIERCODE,
        MJ1.RECOGNITIONLEVEL;

    return 0;