USP_MEMBERSHIPREVENUEREPORT_POPULATEREVENUEDATA

Parameters

Parameter Parameter Type Mode Description
@PROGRAMID uniqueidentifier IN
@SELECTEDCURRENCYID uniqueidentifier IN
@ORGANIZATIONCURRENCYID uniqueidentifier IN
@DECIMALDIGITS int IN
@ROUNDINGTYPECODE tinyint IN
@STARTDATE datetime IN
@ENDDATE datetime IN

Definition

Copy


CREATE procedure dbo.USP_MEMBERSHIPREVENUEREPORT_POPULATEREVENUEDATA (
    @PROGRAMID uniqueidentifier,
    @SELECTEDCURRENCYID uniqueidentifier,
    @ORGANIZATIONCURRENCYID uniqueidentifier,
    @DECIMALDIGITS integer,
    @ROUNDINGTYPECODE tinyint,
    @STARTDATE datetime,
    @ENDDATE datetime
)
as
begin

if object_id('tempdb..#temp_membershiprevenuereportdata') is null
    return;

--REVENUE_CTE contains all transactions where REVENUE.DATE between @STARTDATE and @ENDDATE

--or for gifted transactions where MEMBERSHIPTRANSACTION.TRANSACTIONDATE between @STARTDATE and @ENDDATE

with REVENUE_CTE as (
    select
        case when (isnull([REVENUESPLITS].AMOUNTINCURRENCY,0) - isnull([REFUNDS].[AMOUNT],0)) < 0 then 0
        else (isnull([REVENUESPLITS].AMOUNTINCURRENCY,0) - isnull([REFUNDS].[AMOUNT],0))
        end as AMOUNTINCURRENCY,
        [REVENUESPLITS].TRANSACTIONTYPE,
        [REVENUESPLITS].TRANSACTIONTYPECODE,
        [REVENUESPLITS].REXT_TYPE,
        [REVENUESPLITS].REXT_TYPECODE,
        [REVENUESPLITS].APPLICATION,
        [REVENUESPLITS].APPLICATIONCODE,
        [REVENUESPLITS].REPORTBUCKETCODE,
        [REVENUESPLITS].REPORTBUCKET,
        [REVENUESPLITS].CHANNELCODEID,
        [REVENUESPLITS].ID,
        [REVENUESPLITS].CONSTITUENTID,
        [REVENUESPLITS].APPEALID,
        [REVENUESPLITS].DATE,
        [REVENUESPLITS].MEMBERSHIPTRANSACTIONID,
        [REVENUESPLITS].MEMBERSHIPLEVELID,
        [REVENUESPLITS].ACTIONCODE,
        [REVENUESPLITS].ACTION,
        [REVENUESPLITS].TRANSACTIONDATE,
    case when isnull([REFUNDS].[AMOUNT],0) - isnull([REVENUESPLITS].AMOUNTINCURRENCY,0) < 0 then 0
    else isnull([REFUNDS].[AMOUNT],0) - isnull([REVENUESPLITS].AMOUNTINCURRENCY,0)
        end  as LEFTOVERDISCOUNTANDREFUNDS
    from (
        select 
            REVENUEAMOUNT.AMOUNTINCURRENCY as AMOUNTINCURRENCY,
            REVENUEAMOUNT.TRANSACTIONTYPE,
            REVENUEAMOUNT.TRANSACTIONTYPECODE,
            REXT_TYPE = REVENUESPLIT_EXT.TYPE,
            REXT_TYPECODE = REVENUESPLIT_EXT.TYPECODE,
            REVENUEAMOUNT.APPLICATION,
            REVENUEAMOUNT.APPLICATIONCODE,
            REPORTBUCKETCODE = 
                case 
                    when REVENUEAMOUNT.APPLICATIONCODE in (5,19) and REVENUEAMOUNT.TRANSACTIONTYPECODE IN (0,5) and REVENUESPLIT_EXT.TYPECODE = 2 then 0
                    when (REVENUEAMOUNT.TRANSACTIONTYPECODE in (0,5) AND REVENUEAMOUNT.APPLICATIONCODE = 18) then 1
                    else 2
                end,
            REPORTBUCKET = 
                case 
                    when REVENUEAMOUNT.APPLICATIONCODE in (5,19) and REVENUEAMOUNT.TRANSACTIONTYPECODE IN (0,5) and REVENUESPLIT_EXT.TYPECODE = 2 then 'revenue'
                    when (REVENUEAMOUNT.TRANSACTIONTYPECODE in (0,5) AND REVENUEAMOUNT.APPLICATIONCODE = 18) then 'addon'
                    else 'gift'
                end,
            REVENUEAMOUNT.CHANNELCODEID,
            REVENUEAMOUNT.ID,
            REVENUEAMOUNT.CONSTITUENTID,
            REVENUEAMOUNT.APPEALID,
            REVENUEAMOUNT.DATE,
            --use the MEMBERSHIPTRANSACTION columns normally, but use the ADDON->MEMBERSHIPTRANSACTION columns for addons.

            coalesce(MEMBERSHIPTRANSACTION.ID, ADDON.MEMBERSHIPTRANSACTIONID) as MEMBERSHIPTRANSACTIONID,
            coalesce(MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID,ADDON.MEMBERSHIPLEVELID) AS MEMBERSHIPLEVELID,
            coalesce(MEMBERSHIPTRANSACTION.ACTIONCODE,ADDON.ACTIONCODE) AS ACTIONCODE,
            coalesce(MEMBERSHIPTRANSACTION.ACTION,ADDON.ACTION) AS ACTION,
            coalesce(MEMBERSHIPTRANSACTION.TRANSACTIONDATE, ADDON.TRANSACTIONDATE) AS TRANSACTIONDATE
        from dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as REVENUEAMOUNT
            inner join dbo.REVENUESPLIT_EXT on REVENUEAMOUNT.ID = REVENUESPLIT_EXT.ID
            left join dbo.MEMBERSHIPTRANSACTION on REVENUEAMOUNT.ID = MEMBERSHIPTRANSACTION.REVENUESPLITID
            left join (
                select
                    MEMBERSHIPADDON.REVENUESPLITID, 
                    MEMBERSHIP.MEMBERSHIPLEVELID, 
                    MEMBERSHIPTRANSACTION.ID, 
                    MEMBERSHIPTRANSACTION.ACTIONCODE, 
                    MEMBERSHIPTRANSACTION.ACTION,
                    MEMBERSHIPTRANSACTION.TRANSACTIONDATE,
                    MEMBERSHIPADDON.MEMBERSHIPTRANSACTIONID
                from dbo.MEMBERSHIPADDON
                    inner join dbo.MEMBERSHIP on MEMBERSHIPADDON.MEMBERSHIPID = MEMBERSHIP.ID
                    inner join dbo.MEMBERSHIPTRANSACTION on MEMBERSHIPADDON.MEMBERSHIPTRANSACTIONID = MEMBERSHIPTRANSACTION.ID
            ) as ADDON on ADDON.REVENUESPLITID = REVENUEAMOUNT.ID
        where
            (    
                isnull(MEMBERSHIPTRANSACTION.ID, ADDON.MEMBERSHIPTRANSACTIONID) is not null
                and REVENUEAMOUNT.APPLICATIONCODE in (5,18
                and TRANSACTIONTYPECODE not in (2,15)  --not the installment plans

                and isnull(MEMBERSHIPTRANSACTION.TRANSACTIONDATE, ADDON.TRANSACTIONDATE) between @STARTDATE and @ENDDATE
            )
    union all
        select 
            REVENUEAMOUNT.AMOUNTINCURRENCY as AMOUNTINCURRENCY,
            REVENUEAMOUNT.TRANSACTIONTYPE,
            REVENUEAMOUNT.TRANSACTIONTYPECODE,
            REXT_TYPE = REVENUESPLIT_EXT.TYPE,
            REXT_TYPECODE = REVENUESPLIT_EXT.TYPECODE,
            REVENUEAMOUNT.APPLICATION,
            REVENUEAMOUNT.APPLICATIONCODE,
            REPORTBUCKETCODE = 
                case 
                    when REVENUEAMOUNT.APPLICATIONCODE in (5,19) and REVENUEAMOUNT.TRANSACTIONTYPECODE IN (0,5) and REVENUESPLIT_EXT.TYPECODE = 2 then 0
                    when (REVENUEAMOUNT.TRANSACTIONTYPECODE in (0,5) AND REVENUEAMOUNT.APPLICATIONCODE = 18) then 1
                    else 2
                end,
            REPORTBUCKET = 
                case 
                    when REVENUEAMOUNT.APPLICATIONCODE in (5,19) and REVENUEAMOUNT.TRANSACTIONTYPECODE IN (0,5) and REVENUESPLIT_EXT.TYPECODE = 2 then 'revenue'
                    when (REVENUEAMOUNT.TRANSACTIONTYPECODE in (0,5) AND REVENUEAMOUNT.APPLICATIONCODE = 18) then 'addon'
                    else 'gift'
                end,
            REVENUEAMOUNT.CHANNELCODEID,
            REVENUEAMOUNT.ID,
            REVENUEAMOUNT.CONSTITUENTID,
            REVENUEAMOUNT.APPEALID,
            REVENUEAMOUNT.DATE,
            MEMBERSHIPTRANSACTION.ID,
            MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID,
            MEMBERSHIPTRANSACTION.ACTIONCODE,
            MEMBERSHIPTRANSACTION.ACTION,
            MEMBERSHIPTRANSACTION.TRANSACTIONDATE
        from dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as REVENUEAMOUNT
            inner join dbo.REVENUESPLIT_EXT on REVENUEAMOUNT.ID = REVENUESPLIT_EXT.ID
            left join dbo.MEMBERSHIPTRANSACTION on REVENUEAMOUNT.ID = MEMBERSHIPTRANSACTION.REVENUESPLITID
        where
            (
                (
                    MEMBERSHIPTRANSACTION.ID is null
                    and REVENUEAMOUNT.DATE between @STARTDATE and @ENDDATE
                )
                -- only get gifts

                and 
                (
                    REVENUEAMOUNT.TRANSACTIONTYPECODE = 7
                    or (REVENUEAMOUNT.TRANSACTIONTYPECODE = 5 and REVENUEAMOUNT.APPLICATIONCODE = 0)
                    or (
                        REVENUEAMOUNT.TRANSACTIONTYPECODE = 0
                        and REVENUEAMOUNT.APPLICATIONCODE in (0,2,3,4,6,7,8,12,13
                        and REVENUEAMOUNT.TYPECODE != 2 --don't include recurring gifts, recurring payments are included later

                    ) 
                    or (REVENUEAMOUNT.TRANSACTIONTYPECODE = 0 and REVENUEAMOUNT.APPLICATIONCODE = 1 and REVENUEAMOUNT.TYPECODE = 0)
                )
            )
        union all
        select distinct 
            PAYMENT_REVENUEAMOUNT.AMOUNTINCURRENCY as AMOUNTINCURRENCY,
            PAYMENT_REVENUEAMOUNT.TRANSACTIONTYPE,
            PAYMENT_REVENUEAMOUNT.TRANSACTIONTYPECODE,
            REXT_TYPE = REVENUESPLIT_EXT.TYPE,
            REXT_TYPECODE = REVENUESPLIT_EXT.TYPECODE,
            PAYMENT_REVENUEAMOUNT.APPLICATION,
            PAYMENT_REVENUEAMOUNT.APPLICATIONCODE,
            REPORTBUCKETCODE =
                case 
                    when PAYMENT_REVENUEAMOUNT.APPLICATIONCODE in (5,19) and PAYMENT_REVENUEAMOUNT.TRANSACTIONTYPECODE = 0 and REVENUESPLIT_EXT.TYPECODE = 2 then 0
                    when (PAYMENT_REVENUEAMOUNT.TRANSACTIONTYPECODE = 0 AND PAYMENT_REVENUEAMOUNT.TYPECODE = 18) then 1
                    else 2
                end,
            REPORTBUCKET = 
                case 
                    when PAYMENT_REVENUEAMOUNT.APPLICATIONCODE in (5,19) and PAYMENT_REVENUEAMOUNT.TRANSACTIONTYPECODE = 0 and REVENUESPLIT_EXT.TYPECODE = 2 then 'revenue'
                    when (PAYMENT_REVENUEAMOUNT.TRANSACTIONTYPECODE = 0 AND PAYMENT_REVENUEAMOUNT.TYPECODE = 18) then 'addon'
                    else 'gift'
                end,
            PAYMENT_REVENUEAMOUNT.CHANNELCODEID,
            PAYMENT_REVENUEAMOUNT.ID,
            PAYMENT_REVENUEAMOUNT.CONSTITUENTID,
            PAYMENT_REVENUEAMOUNT.APPEALID,
            PAYMENT_REVENUEAMOUNT.DATE,
            MEMBERSHIPTRANSACTION.ID as MEMBERSHIPTRANSACTIONID,
            MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID,
            MEMBERSHIPTRANSACTION.ACTIONCODE,
            MEMBERSHIPTRANSACTION.ACTION,
            MEMBERSHIPTRANSACTION.TRANSACTIONDATE
        from dbo.INSTALLMENTPAYMENT
            inner join dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as PAYMENT_REVENUEAMOUNT
                on PAYMENT_REVENUEAMOUNT.ID = INSTALLMENTPAYMENT.PAYMENTID
            inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = PAYMENT_REVENUEAMOUNT.ID
            inner join dbo.REVENUE_EXT as PLEDGE_REVENUE on PLEDGE_REVENUE.ID = INSTALLMENTPAYMENT.PLEDGEID
            inner join dbo.FINANCIALTRANSACTIONLINEITEM on PLEDGE_REVENUE.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
            inner join dbo.MEMBERSHIPTRANSACTION on MEMBERSHIPTRANSACTION.REVENUESPLITID = FINANCIALTRANSACTIONLINEITEM.ID
        where 
            PAYMENT_REVENUEAMOUNT.DATE between @STARTDATE and @ENDDATE
            and PAYMENT_REVENUEAMOUNT.TRANSACTIONTYPECODE = 0 
            and REVENUESPLIT_EXT.TYPECODE IN (2, 18
            and PAYMENT_REVENUEAMOUNT.APPLICATIONCODE in (18,19)
        union all
        select distinct 
            PAYMENT_REVENUEAMOUNT.AMOUNTINCURRENCY as AMOUNTINCURRENCY,
            PAYMENT_REVENUEAMOUNT.TRANSACTIONTYPE,
            PAYMENT_REVENUEAMOUNT.TRANSACTIONTYPECODE,
            REXT_TYPE = REVENUESPLIT_EXT.TYPE,
            REXT_TYPECODE = REVENUESPLIT_EXT.TYPECODE,
            PAYMENT_REVENUEAMOUNT.APPLICATION,
            PAYMENT_REVENUEAMOUNT.APPLICATIONCODE,
            REPORTBUCKETCODE = 0,    --All records here are payment revenue.

            REPORTBUCKET = 'revenue',
            PAYMENT_REVENUEAMOUNT.CHANNELCODEID,
            PAYMENT_REVENUEAMOUNT.ID,
            PAYMENT_REVENUEAMOUNT.CONSTITUENTID,
            PAYMENT_REVENUEAMOUNT.APPEALID,
            PAYMENT_REVENUEAMOUNT.DATE,
            MEMBERSHIPTRANSACTION.ID as MEMBERSHIPTRANSACTIONID,
            MEMBERSHIPTRANSACTION.MEMBERSHIPLEVELID,
            MEMBERSHIPTRANSACTION.ACTIONCODE,
            MEMBERSHIPTRANSACTION.ACTION,
            MEMBERSHIPTRANSACTION.TRANSACTIONDATE
        from dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE) as PAYMENT_REVENUEAMOUNT
            inner join dbo.RECURRINGGIFTINSTALLMENTPAYMENT
                on PAYMENT_REVENUEAMOUNT.REVENUEID = RECURRINGGIFTINSTALLMENTPAYMENT.PAYMENTID
            inner join dbo.RECURRINGGIFTINSTALLMENT on RECURRINGGIFTINSTALLMENT.ID = RECURRINGGIFTINSTALLMENTPAYMENT.RECURRINGGIFTINSTALLMENTID
            inner join dbo.FINANCIALTRANSACTION PLEDGE_XACTION on PLEDGE_XACTION.ID = RECURRINGGIFTINSTALLMENT.REVENUEID
            inner join dbo.FINANCIALTRANSACTIONLINEITEM PLEDGE_FTLI on PLEDGE_FTLI.FINANCIALTRANSACTIONID = PLEDGE_XACTION.ID
            inner join dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = PAYMENT_REVENUEAMOUNT.ID
            inner join dbo.MEMBERSHIPTRANSACTION on MEMBERSHIPTRANSACTION.REVENUESPLITID = PLEDGE_FTLI.ID
        where 
            PAYMENT_REVENUEAMOUNT.DATE between @STARTDATE and @ENDDATE
            and PAYMENT_REVENUEAMOUNT.TRANSACTIONTYPECODE = 0 
            and REVENUESPLIT_EXT.TYPECODE = 2 
            and PAYMENT_REVENUEAMOUNT.APPLICATIONCODE = 3

    ) as [REVENUESPLITS]
    left join (
        select 
            sum(TOTAL) as AMOUNT,
            REVENUESPLITID
        from dbo.CREDITITEM
        group by REVENUESPLITID
    ) as [REFUNDS] on REVENUESPLITS.ID = REFUNDS.REVENUESPLITID
)

insert into tempdb.#temp_membershiprevenuereportdata (
    TIERCODEID,
    TIERSEQUENCE,
    TIERCODENAME,
    MEMBERSHIPLEVEL,
    MEMBERSHIPLEVELSEQUENCE,
    MEMBERSHIPLEVELNAME,
    REVENUEAMOUNT,
    TRANSACTIONTYPECODE,
    REVENUEAPPLICATIONCODE,
    REVENUECHANNEL,
    MEMBERSHIPTRANSACTIONTYPE,
    REPORTBUCKETCODE,
    REPORTBUCKET,
  LEFTOVERDISCOUNTANDREFUNDS
)
-- Get membership-related revenue

select
    TIERCODE.ID,
    TIERCODE.SEQUENCE,
    TIERCODE.DESCRIPTION,
    MEMBERSHIPLEVEL.ID,
    MEMBERSHIPLEVEL.SEQUENCE,
    MEMBERSHIPLEVEL.NAME,
    REVENUE_CTE.AMOUNTINCURRENCY as AMOUNT,
    REVENUE_CTE.TRANSACTIONTYPECODE,
    REVENUE_CTE.APPLICATIONCODE,
    REVENUE_CTE.CHANNELCODEID,
    REVENUE_CTE.ACTIONCODE,
    REVENUE_CTE.REPORTBUCKETCODE,
    REVENUE_CTE.REPORTBUCKET,
  REVENUE_CTE.LEFTOVERDISCOUNTANDREFUNDS
from REVENUE_CTE 
    inner join dbo.MEMBERSHIPLEVEL on REVENUE_CTE.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID
    --left outer join REVENUE_CTE on REVENUE_CTE.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID

    left outer join dbo.TIERCODE on MEMBERSHIPLEVEL.TIERCODEID = TIERCODE.ID
where
    MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @PROGRAMID and
    MEMBERSHIPLEVEL.OBTAINLEVELCODE = 0 and
    REVENUE_CTE.REPORTBUCKETCODE in (0,1)

union all
-- Get non-membership gifts from same time period and same constituents

select
    TIERCODE.ID,
    TIERCODE.SEQUENCE,
    TIERCODE.DESCRIPTION,
    MEMBERSHIPLEVEL.ID,
    MEMBERSHIPLEVEL.SEQUENCE,
    MEMBERSHIPLEVEL.NAME,
    REVENUE_CTE.AMOUNTINCURRENCY as AMOUNT,
    REVENUE_CTE.TRANSACTIONTYPECODE,
    REVENUE_CTE.APPLICATIONCODE,
    null,
    null,
    REVENUE_CTE.REPORTBUCKETCODE,
    REVENUE_CTE.REPORTBUCKET,
    REVENUE_CTE.LEFTOVERDISCOUNTANDREFUNDS
from dbo.MEMBERSHIPLEVEL
    inner join dbo.MEMBERSHIP on MEMBERSHIP.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID
    inner join dbo.MEMBER on MEMBER.MEMBERSHIPID = MEMBERSHIP.ID
    inner join REVENUE_CTE on REVENUE_CTE.CONSTITUENTID = MEMBER.CONSTITUENTID
    left outer join dbo.TIERCODE on MEMBERSHIPLEVEL.TIERCODEID = TIERCODE.ID
where 
    MEMBERSHIP.STATUSCODE = 0 and
    MEMBER.ISDROPPED = 0 and
    MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @PROGRAMID and
    MEMBERSHIPLEVEL.OBTAINLEVELCODE = 0 and
    REVENUE_CTE.REPORTBUCKETCODE = 2;
end