USP_MEMBERSHIPPROGRAM_GETREVENUETRENDBYLEVEL

Returns revenue trends for top performing levels in a membership program.

Parameters

Parameter Parameter Type Mode Description
@PROGRAMID uniqueidentifier IN
@BREAKDOWNTYPE tinyint IN
@FROMDATE datetime IN
@TODATE datetime IN

Definition

Copy


        CREATE procedure dbo.USP_MEMBERSHIPPROGRAM_GETREVENUETRENDBYLEVEL
        (
            @PROGRAMID uniqueidentifier = null,
            @BREAKDOWNTYPE tinyint = null,
            @FROMDATE datetime = null,
            @TODATE datetime = null
        )
        as
        begin

            set @FROMDATE = dbo.UFN_DATE_GETEARLIESTTIME(@FROMDATE);
            set @TODATE = dbo.UFN_DATE_GETLATESTTIME(@TODATE);

            declare @ORGANIZATIONCURRENCYID uniqueidentifier;
            set @ORGANIZATIONCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();

            declare @SELECTEDCURRENCYID uniqueidentifier;

            set @SELECTEDCURRENCYID = @ORGANIZATIONCURRENCYID;

            declare @DECIMALDIGITS tinyint;
            declare @ROUNDINGTYPECODE tinyint;
            declare @CURRENCYISO nvarchar(6);
            declare @CURRENCYSYMBOL nvarchar(10);
            declare @CURRENCYSYMBOLDISPLAYSETTINGCODE tinyint;

            select
                @CURRENCYISO = CURRENCY.ISO4217,
                @DECIMALDIGITS = CURRENCY.DECIMALDIGITS,
                @CURRENCYSYMBOL = CURRENCY.CURRENCYSYMBOL,
                @ROUNDINGTYPECODE = CURRENCY.ROUNDINGTYPECODE,
                @CURRENCYSYMBOLDISPLAYSETTINGCODE = CURRENCY.SYMBOLDISPLAYSETTINGCODE
            from
                dbo.CURRENCY
            where
                CURRENCY.ID = @SELECTEDCURRENCYID;

            if @BREAKDOWNTYPE = 0
            begin

                declare @LEVELPERFORMANCE table(ID uniqueidentifier, TOTAL int);
                insert into @LEVELPERFORMANCE
                select
                    MEMBERSHIPLEVELID,
                    count(*)
                from dbo.MEMBERSHIP
                where JOINDATE between @FROMDATE and @TODATE
                and MEMBERSHIP.MEMBERSHIPPROGRAMID = @PROGRAMID
                group by MEMBERSHIPLEVELID

                declare @TOPLEVELS table(ID uniqueidentifier)
                insert into @TOPLEVELS
                select top(6)
                    ID
                from @LEVELPERFORMANCE
                order by TOTAL desc

                select
                    TRANSACTIONDATE,
                    sum(TOTAL) as TOTAL,
                    LEVELNAME
                from (
                    select
                        REVENUESPLITS.DATE as TRANSACTIONDATE,
                        REVENUESPLITS.AMOUNTINCURRENCY - coalesce(REFUND.CREDITTOTAL, 0) as TOTAL,
                        MEMBERSHIPLEVEL.NAME as LEVELNAME
                    from dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(
                        @SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE
                    ) as REVENUESPLITS
                    left join dbo.UFN_CREDIT_GETSPLITCREDITAMOUNT_BULK() as REFUND
                        on REFUND.SOURCELINEITEMID = REVENUESPLITS.ID
                    inner join dbo.UFN_MEMBERSHIPTRANSACTIONSPLITS_BYPROGRAM(@PROGRAMID, @FROMDATE, @TODATE) MEMBERSHIPSPLITS
                        on MEMBERSHIPSPLITS.REVENUESPLITID = REVENUESPLITS.ID
                    inner join dbo.MEMBERSHIPLEVEL
                        on MEMBERSHIPLEVEL.ID = MEMBERSHIPSPLITS.LEVELID
                    inner join @TOPLEVELS T
                        on T.ID = MEMBERSHIPLEVEL.ID
                    where 
                        REVENUESPLITS.TYPECODE in (2,18)

                    union all

                    -- Membership promotions

                    select
                        SALESORDER.TRANSACTIONDATE TRANSACTIONDATE,
                        -SALESORDERITEMMEMBERSHIPITEMPROMOTION.ORGANIZATIONAMOUNT TOTAL,
                        MEMBERSHIPLEVEL.NAME LEVELNAME
                    from dbo.SALESORDER
                    inner join dbo.SALESORDERITEM
                        on SALESORDERITEM.SALESORDERID = SALESORDER.ID
                    inner join dbo.SALESORDERITEMMEMBERSHIP
                        on SALESORDERITEMMEMBERSHIP.ID = SALESORDERITEM.ID
                    inner join dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION
                        on SALESORDERITEMMEMBERSHIPITEMPROMOTION.SALESORDERITEMID = SALESORDERITEM.ID
                    inner join dbo.MEMBERSHIPLEVEL
                        on SALESORDERITEMMEMBERSHIP.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID
                    where SALESORDER.TRANSACTIONDATE between @FROMDATE and @TODATE
                    and MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @PROGRAMID
                    and exists(select 1 from @TOPLEVELS where ID = MEMBERSHIPLEVEL.ID)

                ) as RAWMEMBERSHIPREVENUE
                group by TRANSACTIONDATE, LEVELNAME
                order by LEVELNAME asc

            end
            else
            begin

                declare @TIERPERFORMANCE table(ID uniqueidentifier, TOTAL int);
                insert into @TIERPERFORMANCE
                select
                    TIERCODEID,
                    count(*)
                from dbo.MEMBERSHIP
                inner join dbo.MEMBERSHIPLEVEL
                    on MEMBERSHIPLEVEL.ID = MEMBERSHIP.MEMBERSHIPLEVELID
                where JOINDATE between @FROMDATE and @TODATE
                and MEMBERSHIP.MEMBERSHIPPROGRAMID = @PROGRAMID
                group by TIERCODEID

                declare @TOPTIERS table(ID uniqueidentifier)
                insert into @TOPTIERS
                select top(6)
                    ID
                from @TIERPERFORMANCE
                order by TOTAL desc

                select
                    TRANSACTIONDATE,
                    sum(TOTAL) as TOTAL,
                    TIERNAME as LEVELNAME
                from (
                    select
                        REVENUESPLITS.DATE as TRANSACTIONDATE,
                        REVENUESPLITS.AMOUNTINCURRENCY - coalesce(REFUND.CREDITTOTAL, 0) as TOTAL,
                        coalesce(TIERCODE.DESCRIPTION, 'No reporting group') as TIERNAME
                    from dbo.UFN_REVENUESPLIT_GETAMOUNTINCURRENCY_BULK(
                        @SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE
                    ) as REVENUESPLITS
                    left join dbo.UFN_CREDIT_GETSPLITCREDITAMOUNT_BULK() as REFUND 
                        on REFUND.SOURCELINEITEMID = REVENUESPLITS.ID
                    inner join dbo.UFN_MEMBERSHIPTRANSACTIONSPLITS_BYPROGRAM(@PROGRAMID, @FROMDATE, @TODATE) MEMBERSHIPSPLITS
                        on MEMBERSHIPSPLITS.REVENUESPLITID = REVENUESPLITS.ID
                    left join dbo.TIERCODE
                        on TIERCODE.ID = MEMBERSHIPSPLITS.TIERCODEID
                    where 
                        REVENUESPLITS.TYPECODE in (2,18)
                        and (TIERCODE.ID is null or exists(select 1 from @TOPTIERS where ID = TIERCODE.ID))

                    union all

                    -- Membership promotions

                    select
                        SALESORDER.TRANSACTIONDATE TRANSACTIONDATE,
                        -SALESORDERITEMMEMBERSHIPITEMPROMOTION.ORGANIZATIONAMOUNT TOTAL,
                        coalesce(TIERCODE.[DESCRIPTION], 'no reporting group') TIERNAME
                    from dbo.SALESORDER
                    inner join dbo.SALESORDERITEM
                        on SALESORDERITEM.SALESORDERID = SALESORDER.ID
                    inner join dbo.SALESORDERITEMMEMBERSHIP
                        on SALESORDERITEMMEMBERSHIP.ID = SALESORDERITEM.ID
                    inner join dbo.SALESORDERITEMMEMBERSHIPITEMPROMOTION
                        on SALESORDERITEMMEMBERSHIPITEMPROMOTION.SALESORDERITEMID = SALESORDERITEM.ID
                    inner join dbo.MEMBERSHIPLEVEL
                        on SALESORDERITEMMEMBERSHIP.MEMBERSHIPLEVELID = MEMBERSHIPLEVEL.ID
                    left join dbo.TIERCODE
                        on MEMBERSHIPLEVEL.TIERCODEID = TIERCODE.ID
                    where SALESORDER.TRANSACTIONDATE between @FROMDATE and @TODATE
                    and MEMBERSHIPLEVEL.MEMBERSHIPPROGRAMID = @PROGRAMID
                    and (TIERCODE.ID is null or exists(select 1 from @TOPTIERS where ID = TIERCODE.ID))

                ) as RAWMEMBERSHIPREVENUE
                group by TRANSACTIONDATE, TIERNAME
                order by TIERNAME asc

            end

        end