UFN_REVENUE_GETPREVIOUSTRANSACTIONDATE_BYID_1_1

Returns the previous transaction date for a recurring gift. If @ASOFDATE is null, the current NEXTTRANSACTIONDATE will be used.

Return

Return Type
datetime

Parameters

Parameter Parameter Type Mode Description
@REVENUEID uniqueidentifier IN
@ASOFDATE datetime IN

Definition

Copy


            CREATE function dbo.UFN_REVENUE_GETPREVIOUSTRANSACTIONDATE_BYID_1_1
            (
                @REVENUEID uniqueidentifier,
                @ASOFDATE datetime
            )
            returns datetime
            as
            begin
                declare @STARTDATE datetime;
                declare @FREQUENCYCODE tinyint;
                declare @NEXTTRANSACTIONDATE datetime;
                declare @ISLASTDAYOFMONTH bit;

                select
                    @STARTDATE = dbo.UFN_DATE_GETEARLIESTTIME(coalesce(SCHEDULESEEDDATE, STARTDATE)),
                    @FREQUENCYCODE = FREQUENCYCODE,
                    @NEXTTRANSACTIONDATE = dbo.UFN_DATE_GETEARLIESTTIME(coalesce(@ASOFDATE, NEXTTRANSACTIONDATE))
                from dbo.REVENUESCHEDULE
                where ID = @REVENUEID;

                declare @DAYSINSTARTMONTH tinyint;
                declare @STARTMONTH tinyint;
                declare @STARTYEAR smallint;
                declare @STARTDAY tinyint;

                select
                    @STARTMONTH = datepart(month, @STARTDATE),
                    @STARTYEAR = datepart(year, @STARTDATE),
                    @STARTDAY = datepart(day, @STARTDATE)

                set @DAYSINSTARTMONTH = dbo.UFN_DAYSINMONTH(@STARTMONTH, @STARTYEAR)
                select 
                    @ISLASTDAYOFMONTH = case when @STARTDAY >= @DAYSINSTARTMONTH then 1 else 0 end;

                declare @POTENTIALDATE datetime;
                set @POTENTIALDATE = @NEXTTRANSACTIONDATE;

                while @POTENTIALDATE >= @NEXTTRANSACTIONDATE
                begin
                    if @FREQUENCYCODE = 0 --Annually

                        set @POTENTIALDATE = dateadd(year, -1, @POTENTIALDATE);
                    else if @FREQUENCYCODE = 1 --Semi-annually

                        set @POTENTIALDATE = dateadd(month, -6, @POTENTIALDATE);
                    else if @FREQUENCYCODE = 2 --Quarterly

                        set @POTENTIALDATE = dateadd(quarter, -1, @POTENTIALDATE);
                    else if @FREQUENCYCODE = 3 --Monthly

                    begin
                        set @POTENTIALDATE = dateadd(month, -1, @POTENTIALDATE);
                    end
                    else if @FREQUENCYCODE = 6 --Bimonthly

                        set @POTENTIALDATE = dateadd(month, -2, @POTENTIALDATE);        
                    else if @FREQUENCYCODE = 7 --Semi-monthly

                    begin
                        if datepart(day, @POTENTIALDATE) > 1 and datepart(day, @POTENTIALDATE) <= 15
                            set @POTENTIALDATE = dateadd(day, -1 * (datepart(day, @POTENTIALDATE) - 1), @POTENTIALDATE);
                        else
                        begin
                            if datepart(day, @POTENTIALDATE) = 1
                                set @POTENTIALDATE = dateadd(m, -1, @POTENTIALDATE);

                            set @POTENTIALDATE = dateadd(day, (-1 * (datepart(day, @POTENTIALDATE) - 15)), @POTENTIALDATE);
                        end             
                    end
                    else if @FREQUENCYCODE = 8 --Biweekly

                        set @POTENTIALDATE = dateadd(day, -14, @POTENTIALDATE);
                    else if @FREQUENCYCODE = 9 --Weekly

                        set @POTENTIALDATE = dateadd(week, -1, @POTENTIALDATE);
                    else if @FREQUENCYCODE = 10 --Every4Weeks

                        set @POTENTIALDATE = dateadd(day, 28, @POTENTIALDATE);
                    else
                        set @POTENTIALDATE = dateadd(day, -1, @NEXTTRANSACTIONDATE); --Don't know how to handle the frequency. Just use the day before @NEXTTRANSACTIONDATE so it'll break out of the loop

                end

                --If the start date is the last day of the month and the frequency is monthly,

                --make sure that the next transaction date is the last day of the month

                if @FREQUENCYCODE = 3
                begin
                    declare @DAYSINPOTENTIALMONTH tinyint
                    declare @POTENTIALDAY tinyint;

                    set @DAYSINPOTENTIALMONTH = dbo.UFN_DAYSINMONTH(datepart(month, @POTENTIALDATE), datepart(year, @POTENTIALDATE));
                    set @POTENTIALDAY = datepart(day, @POTENTIALDATE);

                    if @ISLASTDAYOFMONTH = 1 and @POTENTIALDAY <> @DAYSINPOTENTIALMONTH
                        set @POTENTIALDATE = dateadd(day, (@DAYSINPOTENTIALMONTH - @POTENTIALDAY), @POTENTIALDATE)

                    if @ISLASTDAYOFMONTH = 0 and @STARTDAY > @POTENTIALDAY and @STARTDAY <= @DAYSINPOTENTIALMONTH
                        set @POTENTIALDATE = dateadd(day, (@STARTDAY - @POTENTIALDAY), @POTENTIALDATE)

                end

                return @POTENTIALDATE;
            end