USP_DATALIST_MEMBERSHIPPROJECTEDREVENUEREPORT

Returns membership revenue information for the membership projected revenue report

Parameters

Parameter Parameter Type Mode Description
@CURRENTAPPUSERID uniqueidentifier IN Input parameter indicating the ID of the current user.
@YEARENDING datetime IN Year ending
@YEAROPTION tinyint IN Use data from
@MEMBERSHIPPROGRAMID uniqueidentifier IN Program
@CURRENCYCODE tinyint IN Currency

Definition

Copy


                CREATE procedure dbo.USP_DATALIST_MEMBERSHIPPROJECTEDREVENUEREPORT
                    (
                    @CURRENTAPPUSERID uniqueidentifier = null,
                    @YEARENDING datetime = null,
                    @YEAROPTION tinyint = 0,
                    @MEMBERSHIPPROGRAMID uniqueidentifier = null,
                    @CURRENCYCODE tinyint
                    )
                as
                set nocount on;

                declare @STARTDATE datetime;
                declare @ENDDATE datetime;

                declare @SELECTEDCURRENCYID uniqueidentifier;
                if coalesce(@CURRENCYCODE, 1) = 1
                    set @SELECTEDCURRENCYID = dbo.UFN_CURRENCY_GETORGANIZATIONCURRENCY();
                else if @CURRENCYCODE = 3
                    set @SELECTEDCURRENCYID = dbo.UFN_APPUSER_GETBASECURRENCY(@CURRENTAPPUSERID);

                declare @DECIMALDIGITS tinyint;
                declare @ROUNDINGTYPECODE tinyint;

                select
                    @DECIMALDIGITS = CURRENCYPROPERTIES.DECIMALDIGITS,
                    @ROUNDINGTYPECODE = CURRENCYPROPERTIES.ROUNDINGTYPECODE
                from
                    dbo.UFN_CURRENCY_GETPROPERTIES(@SELECTEDCURRENCYID) CURRENCYPROPERTIES

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

                if @YEAROPTION = 0
                    begin
                        select @ENDDATE = dbo.UFN_DATE_LASTCALENDARYEAR_LASTDAY(getdate(), 1),
                            @STARTDATE = dbo.UFN_DATE_LASTCALENDARYEAR_FIRSTDAY(getdate(), 0);
                    end

                if @YEAROPTION = 1
                    begin 
                        select @ENDDATE = dateadd(yyyy,-1,dbo.UFN_DATE_THISFISCALYEAR_LASTDAY(getdate(), 1)),
                            @STARTDATE = dateadd(yyyy,-1,dbo.UFN_DATE_THISFISCALYEAR_FIRSTDAY(getdate(), 0));
                    end

                if @YEAROPTION = 2
                    begin 
                        select @STARTDATE = dateadd(dd,1,DATEADD(YYYY,-1, @YEARENDING)),
                            @ENDDATE = dbo.UFN_DATE_GETLATESTTIME(@YEARENDING);

                        if MONTH(@STARTDATE) = MONTH(@ENDDATE
                            begin
                            select @STARTDATE = dbo.UFN_DATE_NEXTMONTH_FIRSTDAY(@STARTDATE,0);
                            end
                    end

                declare @CALCYEAR int;
                set @CALCYEAR = YEAR(@ENDDATE);

                --GET DATA YEAR

                declare @AMOUNTS table
                    (TERMID uniqueidentifier,
                     TERMMONTH tinyint,
                     YEARMONTH int,
                     AMOUNT money,
                     RATE decimal(20,4),
                     MONTHORDER tinyint)

                insert into @AMOUNTS
                select MT.MEMBERSHIPLEVELTERMID, 
                    month(MT.TRANSACTIONDATE),
                    @CALCYEAR,
                    sum(REVENUESPLIT.REVENUESPLITAMOUNTINCURRENCY) as AMOUNT,
                    cast(COUNT(mt.ID) as decimal(20,4))/cast((case when (select COUNT(mt2.ID) from dbo.MEMBERSHIPTRANSACTION MT2
                                    inner join dbo.MEMBERSHIPLEVEL ML2 on MT2.MEMBERSHIPLEVELID = ML2.ID
                                    where EXPIRATIONDATE >= @STARTDATE and EXPIRATIONDATE <= @ENDDATE and
                                        ML2.MEMBERSHIPPROGRAMID = ML.MEMBERSHIPPROGRAMID) = 0 then 1 
                                    else
                                        (select COUNT(mt2.ID) from dbo.MEMBERSHIPTRANSACTION MT2
                                    inner join dbo.MEMBERSHIPLEVEL ML2 on MT2.MEMBERSHIPLEVELID = ML2.ID
                                    where EXPIRATIONDATE >= @STARTDATE and EXPIRATIONDATE <= @ENDDATE and
                                        ML2.MEMBERSHIPPROGRAMID = ML.MEMBERSHIPPROGRAMID)
                                    end) as decimal(20,4)) as RATE,
                    --Get the relative month order in respect to start/end dates

                    case when month(MT.TRANSACTIONDATE) <= MONTH(@ENDDATE) then
                        12 - (MONTH(@ENDDATE) - MONTH(mt.transactiondate))
                    else
                        1 + (MONTH(mt.transactiondate) - MONTH(@STARTDATE))
                    end as MONTHORDER
                from dbo.MEMBERSHIPTRANSACTION MT
                inner join dbo.MEMBERSHIPLEVEL ML on MT.MEMBERSHIPLEVELID = ML.ID
                inner join dbo.MEMBERSHIPPROGRAM MP on ML.MEMBERSHIPPROGRAMID = MP.ID
                inner join dbo.UFN_MEMBERSHIPLEVELREVENUESPLIT_GETAMOUNTSINCURRENCY_BULK(@SELECTEDCURRENCYID, @ORGANIZATIONCURRENCYID, @DECIMALDIGITS, @ROUNDINGTYPECODE, @CURRENCYCODE) REVENUESPLIT on REVENUESPLIT.MEMBERSHIPTRANSACTIONID = MT.ID
                outer apply dbo.UFN_CURRENCY_GETPROPERTIES(coalesce(@SELECTEDCURRENCYID, ML.BASECURRENCYID)) as CURRENCYPROPERTIES
                where mt.TRANSACTIONDATE >= @STARTDATE and mt.TRANSACTIONDATE <= @ENDDATE
                    and MT.ACTIONCODE <> 4
                    and (MP.ID = @MEMBERSHIPPROGRAMID or @MEMBERSHIPPROGRAMID is null)
                    and dbo.UFN_SITEALLOWEDFORUSER(@CURRENTAPPUSERID, MP.SITEID) = 1
                group by ML.MEMBERSHIPPROGRAMID, MT.MEMBERSHIPLEVELTERMID, MONTH(mt.TRANSACTIONDATE), YEAR(mt.TRANSACTIONDATE)

                declare @EXPIRATIONS table
                    (PROGRAMID uniqueidentifier,
                     NUMEXPIRING bigint,
                     EXPYEAR int)

                insert into @EXPIRATIONS
                select MP.ID,
                    (select COUNT(mt2.ID) from dbo.MEMBERSHIPTRANSACTION MT2
                                    inner join dbo.MEMBERSHIPLEVEL ML2 on MT2.MEMBERSHIPLEVELID = ML2.ID
                                    where EXPIRATIONDATE >= @STARTDATE and EXPIRATIONDATE <= @ENDDATE and
                                        ML2.MEMBERSHIPPROGRAMID = MP.ID),
                    @CALCYEAR
                from dbo.MEMBERSHIPPROGRAM mp
                where (mp.ID = @MEMBERSHIPPROGRAMID or @MEMBERSHIPPROGRAMID is null)
                    and dbo.UFN_SITEALLOWEDFORUSER(@CURRENTAPPUSERID, MP.SITEID) = 1
                union all
                select MP.ID,
                    (select COUNT(mt2.ID) from dbo.MEMBERSHIPTRANSACTION MT2
                                    inner join dbo.MEMBERSHIPLEVEL ML2 on MT2.MEMBERSHIPLEVELID = ML2.ID
                                    where YEAR(EXPIRATIONDATE) = (@CALCYEAR + 1) and
                                        ML2.MEMBERSHIPPROGRAMID = MP.ID),
                    @CALCYEAR + 1
                from dbo.MEMBERSHIPPROGRAM mp
                where (mp.ID = @MEMBERSHIPPROGRAMID or @MEMBERSHIPPROGRAMID is null)
                    and dbo.UFN_SITEALLOWEDFORUSER(@CURRENTAPPUSERID, MP.SITEID) = 1
                union all
                select MP.ID,
                    (select COUNT(mt2.ID) from dbo.MEMBERSHIPTRANSACTION MT2
                                    inner join dbo.MEMBERSHIPLEVEL ML2 on MT2.MEMBERSHIPLEVELID = ML2.ID
                                    where YEAR(EXPIRATIONDATE) = @CALCYEAR + 2 and
                                        ML2.MEMBERSHIPPROGRAMID = MP.ID),
                    @CALCYEAR + 2
                from dbo.MEMBERSHIPPROGRAM mp
                where (mp.ID = @MEMBERSHIPPROGRAMID or @MEMBERSHIPPROGRAMID is null)
                    and dbo.UFN_SITEALLOWEDFORUSER(@CURRENTAPPUSERID, MP.SITEID) = 1
                union all  
                select MP.ID,
                    (select COUNT(mt2.ID) from dbo.MEMBERSHIPTRANSACTION MT2
                                    inner join dbo.MEMBERSHIPLEVEL ML2 on MT2.MEMBERSHIPLEVELID = ML2.ID
                                    where YEAR(EXPIRATIONDATE) = (@CALCYEAR + 3) and
                                        ML2.MEMBERSHIPPROGRAMID = MP.ID),
                    @CALCYEAR + 3
                from dbo.MEMBERSHIPPROGRAM mp
                where (mp.ID = @MEMBERSHIPPROGRAMID or @MEMBERSHIPPROGRAMID is null)
                    and dbo.UFN_SITEALLOWEDFORUSER(@CURRENTAPPUSERID, MP.SITEID) = 1;

                --get year 2 totals

                --number of expected 1 year renewals from year 1

                declare @YEAR2EXP table
                    (PROGID uniqueidentifier,
                     NUMEXP bigint)

                insert into @YEAR2EXP
                select mp.ID,
                sum(A.RATE) * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 1))
                from @AMOUNTS A
                inner join dbo.MEMBERSHIPLEVELTERM MLT on A.TERMID = MLT.ID
                inner join dbo.MEMBERSHIPLEVEL ML on MLT.LEVELID = ML.ID
                inner join dbo.MEMBERSHIPPROGRAM MP on ML.MEMBERSHIPPROGRAMID = MP.ID
                where mlt.TERMCODE = 0 --1 year term

                group by MP.ID

                update @EXPIRATIONS
                set NUMEXPIRING = NUMEXPIRING + y2.numexp
                from @YEAR2EXP y2
                where PROGRAMID = y2.PROGID
                and EXPYEAR = (@CALCYEAR + 2)

                --get year 3 totals

                --number of expected 1 year renewals from year 2

                declare @YEAR3EXPRENEWAL1 table
                    (PROGID uniqueidentifier,
                     NUMEXP bigint)

                insert into @YEAR3EXPRENEWAL1
                select MP.ID,
                sum(A.RATE) * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 2))
                from @AMOUNTS A
                inner join dbo.MEMBERSHIPLEVELTERM MLT on A.TERMID = MLT.ID
                inner join dbo.MEMBERSHIPLEVEL ML on MLT.LEVELID = ML.ID
                inner join dbo.MEMBERSHIPPROGRAM MP on ML.MEMBERSHIPPROGRAMID = MP.ID
                where mlt.TERMCODE = 0 --1 year term

                group by MP.ID

                --number of expected 2 year renewals from year 1

                declare @YEAR3EXPRENEWAL2 table
                    (PROGID uniqueidentifier,
                     NUMEXP bigint)

                insert into @YEAR3EXPRENEWAL2
                select MP.ID, sum(A.RATE) * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 1))
                from @AMOUNTS A
                inner join dbo.MEMBERSHIPLEVELTERM MLT on A.TERMID = MLT.ID
                inner join dbo.MEMBERSHIPLEVEL ML on MLT.LEVELID = ML.ID
                inner join dbo.MEMBERSHIPPROGRAM MP on ML.MEMBERSHIPPROGRAMID = MP.ID
                where mlt.TERMCODE = 1 --2 year term

                group by MP.Id

                -- updating expirations with 1 year renewals from year 2

                update @EXPIRATIONS
                set NUMEXPIRING = NUMEXPIRING + Y3ONEYEAR.NUMEXP
                from @YEAR3EXPRENEWAL1 Y3ONEYEAR
                where (PROGRAMID = Y3ONEYEAR.PROGID)
                    and EXPYEAR = (@CALCYEAR + 3)

                -- updating expirations with 2 year renewals from year 1

                update @EXPIRATIONS
                set NUMEXPIRING = NUMEXPIRING + Y3TWOYEAR.NUMEXP
                from @YEAR3EXPRENEWAL2 Y3TWOYEAR
                where (PROGRAMID = Y3TWOYEAR.PROGID)
                    and EXPYEAR = (@CALCYEAR + 3)

                declare @YEAR nvarchar(11);
                declare @YEAR1 nvarchar(11);
                declare @YEAR2 nvarchar(11);
                declare @YEAR3 nvarchar(11);
                if YEAR(@STARTDATE) <> YEAR(@ENDDATE)
                    begin
                    set @YEAR = cast(YEAR(@STARTDATE) as nvarchar(4)) + ' - ' + cast(YEAR(@ENDDATE) as nvarchar(4))
                    set @YEAR1 = cast(YEAR(DATEADD(YYYY,1,@STARTDATE)) as nvarchar(4)) + ' - ' + cast(YEAR(DATEADD(YYYY,1,@ENDDATE)) as nvarchar(4))
                    set @YEAR2 = cast(YEAR(DATEADD(YYYY,2,@STARTDATE)) as nvarchar(4)) + ' - ' + cast(YEAR(DATEADD(YYYY,2,@ENDDATE)) as nvarchar(4))
                    set @YEAR3 = cast(YEAR(DATEADD(YYYY,3,@STARTDATE)) as nvarchar(4)) + ' - ' + cast(YEAR(DATEADD(YYYY,3,@ENDDATE)) as nvarchar(4))
                    end
                else
                    begin
                    set @YEAR = cast(YEAR(@ENDDATE) as nvarchar(4)); 
                    set @YEAR1 = cast(YEAR(DATEADD(YYYY,1,@ENDDATE)) as nvarchar(4));
                    set @YEAR2 = cast(YEAR(DATEADD(YYYY,2,@ENDDATE)) as nvarchar(4)); 
                    set @YEAR3 = cast(YEAR(DATEADD(YYYY,3,@ENDDATE)) as nvarchar(4));
                    end

                --DISPLAY DATA YEAR

                select @YEAR as YR,
                    MP.ID as PROGRAMID,
                    dbo.UFN_MEMBERSHIPPROGRAM_GETNAME(MP.ID) as PROGRAM,
                    ML.ID as LEVELID,
                    ML.NAME as LEVELNAME,
                    dbo.UFN_MEMBERSHIPLEVELTERMS_PAYMENTOPTIONDESCRIPTION(MLT.ID) as TERM,
                    coalesce((SELECT AMOUNT FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 1), 0) AS [JAN],
                    coalesce((SELECT AMOUNT FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 2), 0) AS [FEB],
                    coalesce((SELECT AMOUNT FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 3), 0) AS [MAR],
                    coalesce((SELECT AMOUNT FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 4), 0) AS [APR],
                    coalesce((SELECT AMOUNT FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 5), 0) AS [MAY],
                    coalesce((SELECT AMOUNT FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 6), 0) AS [JUN],
                    coalesce((SELECT AMOUNT FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 7), 0) AS [JUL],
                    coalesce((SELECT AMOUNT FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 8), 0) AS [AUG],
                    coalesce((SELECT AMOUNT FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 9), 0) AS [SEP],
                    coalesce((SELECT AMOUNT FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 10), 0) AS [OCT],
                    coalesce((SELECT AMOUNT FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 11), 0) AS [NOV],
                    coalesce((SELECT AMOUNT FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 12), 0) AS [DECEM],
                    MONTH(@STARTDATE) as STARTMONTH,
                    CURRENCYPROPERTIES.CURRENCYSYMBOL,
                    CURRENCYPROPERTIES.ISO4217 as ISOCURRENCYCODE,
                    CURRENCYPROPERTIES.DECIMALDIGITS,
                    CURRENCYPROPERTIES.SYMBOLDISPLAYSETTINGCODE as CURRENCYSYMBOLDISPLAYSETTINGCODE,
                    coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)
                FROM dbo.MEMBERSHIPLEVELTERM MLT 
                INNER JOIN dbo.MEMBERSHIPLEVEL ML ON MLT.LEVELID = ML.ID
                INNER JOIN dbo.MEMBERSHIPPROGRAM MP ON ML.MEMBERSHIPPROGRAMID = MP.ID
                outer apply dbo.UFN_CURRENCY_GETPROPERTIES(coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)) as CURRENCYPROPERTIES
                where (mp.ID = @MEMBERSHIPPROGRAMID or @MEMBERSHIPPROGRAMID is null)
                    and dbo.UFN_SITEALLOWEDFORUSER(@CURRENTAPPUSERID, MP.SITEID) = 1

                union all 

                --DISPLAY FIRST CALC YEAR

                select @YEAR1 as YR,
                    MP.ID as PROGRAMID,
                    dbo.UFN_MEMBERSHIPPROGRAM_GETNAME(MP.ID) as PROGRAM,
                    ML.ID as LEVELID,
                    ML.NAME as LEVELNAME,
                    dbo.UFN_MEMBERSHIPLEVELTERMS_PAYMENTOPTIONDESCRIPTION(MLT.ID) as TERM,
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 1))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 1) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0) AS [JAN],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 1))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 2) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0) AS [FEB],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 1))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 3) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0) AS [MAR],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 1))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 4) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0) AS [APR],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 1))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 5) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0) AS [MAY],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 1))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 6) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0) AS [JUN],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 1))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 7) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0) AS [JUL],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 1))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 8) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0) AS [AUG],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 1))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 9) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0) AS [SEP],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 1))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 10) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0) AS [OCT],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 1))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 11) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0) AS [NOV],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 1))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 12) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0) AS [DECEM],
                    MONTH(@STARTDATE) as STARTMONTH,
                    CURRENCYPROPERTIES.CURRENCYSYMBOL,
                    CURRENCYPROPERTIES.ISO4217 as ISOCURRENCYCODE,
                    CURRENCYPROPERTIES.DECIMALDIGITS,
                    CURRENCYPROPERTIES.SYMBOLDISPLAYSETTINGCODE as CURRENCYSYMBOLDISPLAYSETTINGCODE,
                    coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)
                FROM dbo.MEMBERSHIPLEVELTERM MLT 
                INNER JOIN dbo.MEMBERSHIPLEVEL ML ON MLT.LEVELID = ML.ID
                INNER JOIN dbo.MEMBERSHIPPROGRAM MP ON ML.MEMBERSHIPPROGRAMID = MP.ID
                outer apply dbo.UFN_CURRENCY_GETPROPERTIES(coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)) as CURRENCYPROPERTIES
                where (mp.ID = @MEMBERSHIPPROGRAMID or @MEMBERSHIPPROGRAMID is null)
                    and dbo.UFN_SITEALLOWEDFORUSER(@CURRENTAPPUSERID, MP.SITEID) = 1

                union all 

                --display second calc year

                select @YEAR2 as YR,
                    MP.ID as PROGRAMID,
                    dbo.UFN_MEMBERSHIPPROGRAM_GETNAME(MP.ID) as PROGRAM,
                    ML.ID as LEVELID,
                    ML.NAME as LEVELNAME,
                    dbo.UFN_MEMBERSHIPLEVELTERMS_PAYMENTOPTIONDESCRIPTION(MLT.ID) as TERM,
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 2))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 1) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0) AS [JAN],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 2))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 2) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [FEB],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 2))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 3) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [MAR],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 2))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 4) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [APR],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 2))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 5) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [MAY],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 2))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 6) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [JUN],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 2))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 7) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [JUL],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 2))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 8) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [AUG],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 2))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 9) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0) AS [SEP],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 2))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 10) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [OCT],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 2))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 11) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [NOV],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 2))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 12) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [DECEM],
                    MONTH(@STARTDATE) as STARTMONTH,
                    CURRENCYPROPERTIES.CURRENCYSYMBOL,
                    CURRENCYPROPERTIES.ISO4217 as ISOCURRENCYCODE,
                    CURRENCYPROPERTIES.DECIMALDIGITS,
                    CURRENCYPROPERTIES.SYMBOLDISPLAYSETTINGCODE as CURRENCYSYMBOLDISPLAYSETTINGCODE,
                    coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)
                FROM dbo.MEMBERSHIPLEVELTERM MLT 
                INNER JOIN dbo.MEMBERSHIPLEVEL ML ON MLT.LEVELID = ML.ID
                INNER JOIN dbo.MEMBERSHIPPROGRAM MP ON ML.MEMBERSHIPPROGRAMID = MP.ID
                outer apply dbo.UFN_CURRENCY_GETPROPERTIES(coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)) as CURRENCYPROPERTIES
                where (mp.ID = @MEMBERSHIPPROGRAMID or @MEMBERSHIPPROGRAMID is null)
                    and dbo.UFN_SITEALLOWEDFORUSER(@CURRENTAPPUSERID, MP.SITEID) = 1

                union all

                -- display third calc year

                select @YEAR3 as YR,
                    MP.ID as PROGRAMID,
                    dbo.UFN_MEMBERSHIPPROGRAM_GETNAME(MP.ID) as PROGRAM,
                    ML.ID as LEVELID,
                    ML.NAME as LEVELNAME,
                    dbo.UFN_MEMBERSHIPLEVELTERMS_PAYMENTOPTIONDESCRIPTION(MLT.ID) as TERM,
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 3))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 1) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0) AS [JAN],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 3))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 2) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [FEB],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 3))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 3) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [MAR],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 3))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 4) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [APR],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 3))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 5) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [MAY],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 3))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 6) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [JUN],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 3))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 7) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [JUL],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 3))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 8) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [AUG],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 3))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 9) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [SEP],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 3))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 10) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [OCT],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 3))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 11) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [NOV],
                    coalesce((SELECT (RATE * (select NUMEXPIRING from @EXPIRATIONS where PROGRAMID = MP.ID and EXPYEAR = (@CALCYEAR + 3))) FROM @AMOUNTS WHERE TERMID = MLT.ID AND MONTHORDER = 12) * dbo.UFN_MEMBERSHIPLEVELTERM_GETAMOUNTINCURRENCY(mlt.ID, coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)), 0)  AS [DECEM],
                    MONTH(@STARTDATE) as STARTMONTH,
                    CURRENCYPROPERTIES.CURRENCYSYMBOL,
                    CURRENCYPROPERTIES.ISO4217 as ISOCURRENCYCODE,
                    CURRENCYPROPERTIES.DECIMALDIGITS,
                    CURRENCYPROPERTIES.SYMBOLDISPLAYSETTINGCODE as CURRENCYSYMBOLDISPLAYSETTINGCODE,
                    coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)
                FROM dbo.MEMBERSHIPLEVELTERM MLT 
                INNER JOIN dbo.MEMBERSHIPLEVEL ML ON MLT.LEVELID = ML.ID
                INNER JOIN dbo.MEMBERSHIPPROGRAM MP ON ML.MEMBERSHIPPROGRAMID = MP.ID
                outer apply dbo.UFN_CURRENCY_GETPROPERTIES(coalesce(@SELECTEDCURRENCYID, MLT.BASECURRENCYID)) as CURRENCYPROPERTIES
                where (mp.ID = @MEMBERSHIPPROGRAMID or @MEMBERSHIPPROGRAMID is null)
                    and dbo.UFN_SITEALLOWEDFORUSER(@CURRENTAPPUSERID, MP.SITEID) = 1;

                return 0;