UFN_CONSTITUENTRECOGNITION_CALCULATEFISCALEXPIRATIONDATE

Return

Return Type
datetime

Parameters

Parameter Parameter Type Mode Description
@RECOGNITIONPROGRAMID uniqueidentifier IN
@STARTDATE datetime IN

Definition

Copy


        CREATE function dbo.UFN_CONSTITUENTRECOGNITION_CALCULATEFISCALEXPIRATIONDATE 
        (
            @RECOGNITIONPROGRAMID uniqueidentifier,
            @STARTDATE datetime
        )
        returns datetime
        as begin

            declare @CUTOFFDATEFORYEAR char(4);
            declare @EXPIRATIONDATE datetime;
            declare @MONTH nvarchar(2);
            declare @DAY nvarchar(2);
            declare @BACKDATEMEMBERSHIPS bit;
            declare @YEAROFSTARTDATE nvarchar(4);
            declare @YEAR nvarchar(4);
            declare @FULLCUTOFFDATE date;

            select 
              @CUTOFFDATEFORYEAR = CUTOFFDATEFORYEAR,
              @BACKDATEMEMBERSHIPS = BACKDATEMEMBERSHIPS
            from dbo.RECOGNITIONPROGRAM 
            where ID = @RECOGNITIONPROGRAMID;

            set @EXPIRATIONDATE = dbo.UFN_DATE_THISFISCALYEAR_LASTDAY(@STARTDATE,1);

            --If set expiration enabled

            if @BACKDATEMEMBERSHIPS =1 
            begin
              set @MONTH = SUBSTRING(@CUTOFFDATEFORYEAR,1,2);
              set @DAY  = SUBSTRING(@CUTOFFDATEFORYEAR,3,2);

              --Determine the year of the startdate

              set @YEAROFSTARTDATE = YEAR(@STARTDATE);

              --Because we only get the month and day from the @CUTOFFDATEFORYEAR, add the year we get from startdate for now;

              --This may or may not be the right year for the cutoffdate depending on where it falls in the fiscal year.

              set @FULLCUTOFFDATE  = @YEAROFSTARTDATE + @MONTH + @DAY;

              --Now, get the actual year by looking at the fiscal periods of the fiscal year of the @STARTDATE and then

              --use the @FULLCUTOFFDATE from above to narrow it down to one fiscal period in which the cutoffdate will fall in to.

              select 
                @YEAR = YEAR(FP1.STARTDATE) 
              from dbo.GLFISCALPERIOD fp1
              inner join dbo.GLFISCALPERIOD FP2 on FP1.GLFISCALYEARID = FP2.GLFISCALYEARID
              where 
              @STARTDATE between FP2.STARTDATE and FP2.ENDDATE 
                 and (@FULLCUTOFFDATE between FP1.STARTDATE and FP1.ENDDATE 
                      OR dateadd(year, 1, @FULLCUTOFFDATE) between FP1.STARTDATE and FP1.ENDDATE 
                      OR dateadd(year, -1, @FULLCUTOFFDATE) between FP1.STARTDATE and FP1.ENDDATE)

              if @YEAR < @YEAROFSTARTDATE 
                set @EXPIRATIONDATE = dateadd(year, 1, @EXPIRATIONDATE);
              else if @YEAR = @YEAROFSTARTDATE and @MONTH < MONTH(@STARTDATE)
                set @EXPIRATIONDATE = dateadd(year, 1, @EXPIRATIONDATE);
              else if @YEAR = @YEAROFSTARTDATE and @MONTH = MONTH(@STARTDATE) and @DAY <= DAY(@STARTDATE)
                set @EXPIRATIONDATE = dateadd(year, 1, @EXPIRATIONDATE);
            end

            return @EXPIRATIONDATE;
        end