USP_ADHOCQUERY_FISCALYEARROLLINGDATEHELPER

Parameters

Parameter Parameter Type Mode Description
@ASOFDATE date IN
@DELTA int IN

Definition

Copy


create procedure dbo.[USP_ADHOCQUERY_FISCALYEARROLLINGDATEHELPER] (
  @ASOFDATE date,
  @DELTA integer
)
with execute as owner
as begin
  set nocount on;

  declare @DATES table ([STARTDATE] date, [ENDDATE] date, [ERRORCODE] integer);
  declare @SQL nvarchar(max);
  declare @SEQUENCE integer;
  declare @GLFISCALYEARID uniqueidentifier;
  declare @STARTDATE date;
  declare @ENDDATE date;

  -- if anything goes wrong at any point while calculating fiscal year start and end dates - if the interval takes you outside of the range of configured

  -- fiscal years, for example -- return null for both dates and let the caller decide what to do


  insert into @DATES values (null, null, 0);

  if object_id(N'dbo.GLFISCALPERIOD', N'U') is not null and object_id(N'dbo.GLFISCALYEAR', N'U') is not null
    begin
      -- 1. get the fiscal year within which the as-of date falls


      set @SQL = N'select @SEQUENCE = [YEARSEQUENCE] ' +
                  'from dbo.[GLFISCALYEAR] ' + 
                  'inner join dbo.[GLFISCALPERIOD] on [GLFISCALPERIOD].[GLFISCALYEARID] = [GLFISCALYEAR].[ID] ' +
                  'where @ASOFDATE between [GLFISCALPERIOD].[STARTDATE] and [GLFISCALPERIOD].[ENDDATE];';

      exec sp_executesql @SQL, N'@SEQUENCE integer output, @ASOFDATE date', @SEQUENCE = @SEQUENCE output, @ASOFDATE = @ASOFDATE;

      if @SEQUENCE is not null
        begin
          -- 2. use the YEARSEQUENCE field to move forward or back N fiscal years

          set @SEQUENCE = @SEQUENCE + @DELTA;

          set @SQL = N'select @GLFISCALYEARID = [ID] from dbo.[GLFISCALYEAR] where [YEARSEQUENCE] = @SEQUENCE;';

          exec sp_executesql @SQL, N'@GLFISCALYEARID uniqueidentifier output, @SEQUENCE integer', @GLFISCALYEARID = @GLFISCALYEARID output, @SEQUENCE = @SEQUENCE;

          if @GLFISCALYEARID is not null
            begin
              -- 3. get the start and end dates of that fiscal year

              set @SQL = N'select @STARTDATE = [STARTDATE] from dbo.[GLFISCALPERIOD] where [GLFISCALYEARID] = @GLFISCALYEARID and [SEQUENCE] = 1;';

              exec sp_executesql @SQL, N'@STARTDATE date output, @GLFISCALYEARID uniqueidentifier', @STARTDATE = @STARTDATE output, @GLFISCALYEARID = @GLFISCALYEARID;

              set @SQL = N'select @ENDDATE = [ENDDATE] from dbo.[GLFISCALPERIOD] where [GLFISCALYEARID] = @GLFISCALYEARID and [SEQUENCE] = (select max([SEQUENCE]) from dbo.[GLFISCALPERIOD] where [GLFISCALYEARID] = @GLFISCALYEARID);';

              exec sp_executesql @SQL, N'@ENDDATE date output, @GLFISCALYEARID uniqueidentifier', @ENDDATE = @ENDDATE output, @GLFISCALYEARID = @GLFISCALYEARID;

              update @DATES set [STARTDATE] = @STARTDATE, [ENDDATE] = @ENDDATE, [ERRORCODE] = case when @STARTDATE is null or @ENDDATE is null then 4 else 0 end;
            end
          else
            update @DATES set [ERRORCODE] = 3;
        end
      else
        update @DATES set [ERRORCODE] = 2;
    end
  else
    update @DATES set [ERRORCODE] = 1;

  select [STARTDATE], [ENDDATE], [ERRORCODE] from @DATES;

  return 0;
end