USP_FENXT_SYNCHRONIZE_FISCALYEARS

Parameters

Parameter Parameter Type Mode Description
@PDACCOUNTSYSTEMID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@ROWSAFFECTED int INOUT
@BUSINESSPROCESSSTATUSID uniqueidentifier IN

Definition

Copy


      CREATE procedure dbo.USP_FENXT_SYNCHRONIZE_FISCALYEARS
        (
        @PDACCOUNTSYSTEMID uniqueidentifier,
        @CHANGEAGENTID uniqueidentifier = null,
        @ROWSAFFECTED int OUTPUT,
        @BUSINESSPROCESSSTATUSID uniqueidentifier = null
        )
        as

        set @ROWSAFFECTED = 0;

        if @CHANGEAGENTID is null
          exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;

        declare @CURRENTDATE datetime;
        set @CURRENTDATE = getdate();


          begin try
            begin transaction FYSYNC

            declare @VALIDFISCALYEARS bit;
            set @VALIDFISCALYEARS=1;

            --Verify that all linked fiscal years are still present in Financial Edge NXT

            declare @MISSMATCHEDEXISTINGFISCALYEARS bit;
            set @MISSMATCHEDEXISTINGFISCALYEARS=0;

            if exists 
            (
               select 1
               from dbo.GLFISCALYEAR
                 left join dbo.FENXTFISCALYEAR on GLFISCALYEAR.ID = FENXTFISCALYEAR.GLFISCALYEARID
                 left join dbo.FENXTFISCALYEARSTAGING on FENXTFISCALYEAR.FENXTFISCALYEARID = FENXTFISCALYEARSTAGING.FENXTFISCALYEARID
               where FENXTFISCALYEAR.FENXTFISCALYEARID is null
                 or FENXTFISCALYEARSTAGING.ID is null
             )
               set @MISSMATCHEDEXISTINGFISCALYEARS=1;

             if @MISSMATCHEDEXISTINGFISCALYEARS=1
               raiserror ('FENXTMISMATCHEDEXISTINGFISCALYEARS', 16, 2) with seterror;

             update dbo.FENXTFISCALYEARSTAGING
              set 
                GLFISCALYEARID = isnull(FENXTFISCALYEAR.GLFISCALYEARID, newid()),
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
             from dbo.FENXTFISCALYEARSTAGING
                 left join dbo.FENXTFISCALYEAR on FENXTFISCALYEARSTAGING.FENXTFISCALYEARID = FENXTFISCALYEAR.FENXTFISCALYEARID;

             update dbo.FENXTFISCALYEARSTAGING
              set 
                FENXTFISCALYEARSTAGING.PREVIOUSGLFISCALYEARID = FY2.GLFISCALYEARID,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE
             from dbo.FENXTFISCALYEARSTAGING
               inner join dbo.FENXTFISCALYEARSTAGING as FY2 on dateadd(d, -1, dbo.FENXTFISCALYEARSTAGING.STARTDATE) = FY2.ENDDATE;

             --Validate that the staged fiscal years are contiguous.  

             --Check for duplicated sequence in the FENXT Fiscal years

             if (select count(YEARSEQUENCE) from dbo.FENXTFISCALYEARSTAGING) <> (select count(distinct YEARSEQUENCE) from dbo.FENXTFISCALYEARSTAGING)
               set @VALIDFISCALYEARS=0;

             --Only the first fiscal year should not have a previous fiscal year

             if exists 
             (
               select 1 
               from dbo.FENXTFISCALYEARSTAGING 
               where (FENXTFISCALYEARSTAGING.YEARSEQUENCE>1)
                 and FENXTFISCALYEARSTAGING.PREVIOUSGLFISCALYEARID is null
             )
               set @VALIDFISCALYEARS=0 ;

            --Get the Financial Edge NXT fiscal year id for the GL fiscal year id with sequence 1

            declare @NEWPRECEDINGFISCALYEARS integer;
            set @NEWPRECEDINGFISCALYEARS=0;

            select @NEWPRECEDINGFISCALYEARS=(FENXTFISCALYEARSTAGING.YEARSEQUENCE-1)
            from dbo.FENXTFISCALYEARSTAGING
              inner join dbo.FENXTFISCALYEAR on FENXTFISCALYEARSTAGING.FENXTFISCALYEARID=FENXTFISCALYEAR.FENXTFISCALYEARID
              inner join dbo.GLFISCALYEAR on FENXTFISCALYEAR.GLFISCALYEARID=GLFISCALYEAR.ID
            where dbo.GLFISCALYEAR.YEARSEQUENCE=1;

            --check that the there are no extra fiscal years that overlap with the existing ones     

            if exists
            (
         select FENXTFISCALYEAR.FENXTFISCALYEARID
              from dbo.FENXTFISCALYEAR
                inner join dbo.FENXTFISCALYEARSTAGING on FENXTFISCALYEAR.FENXTFISCALYEARID=FENXTFISCALYEARSTAGING.FENXTFISCALYEARID
                inner join dbo.GLFISCALYEAR on GLFISCALYEAR.ID=FENXTFISCALYEAR.GLFISCALYEARID
              where GLFISCALYEAR.YEARSEQUENCE<>(FENXTFISCALYEARSTAGING.YEARSEQUENCE-@NEWPRECEDINGFISCALYEARS)
            )
              set @VALIDFISCALYEARS=0 ;

            if @VALIDFISCALYEARS=0
              raiserror ('FENXTVALIDFISCALYEARS', 16, 2) with seterror;

            merge into dbo.GLFISCALYEAR
            using 
            (
              select
                FENXTFISCALYEARSTAGING.GLFISCALYEARID,
                FENXTFISCALYEARSTAGING.YEARID,
                FENXTFISCALYEARSTAGING.DESCRIPTION,
                FENXTFISCALYEARSTAGING.NUMBEROFFISCALPERIODS,
                FENXTFISCALYEARSTAGING.STATUS,
                FENXTFISCALYEARSTAGING.YEARSEQUENCE
              from dbo.FENXTFISCALYEARSTAGING
            ) as source
            on GLFISCALYEAR.ID = Source.GLFISCALYEARID
            when not matched then
              insert
              (
                ID,
                YEARID,
                DESCRIPTION,
                STATUSCODE,
                FISCALPERIODSINYEAR,
                YEARSEQUENCE,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
              )
            values
            (
              source.GLFISCALYEARID,
              source.YEARID,
              source.DESCRIPTION,
              case source.STATUS when 'Purged' then 4 when 'Closed' then 3 else 1 end,
              source.NUMBEROFFISCALPERIODS,
              source.YEARSEQUENCE,
              @CHANGEAGENTID,
              @CHANGEAGENTID,
              @CURRENTDATE,
              @CURRENTDATE
            )
            when matched and GLFISCALYEAR.YEARSEQUENCE != source.YEARSEQUENCE then
              update
              set 
                YEARSEQUENCE=source.YEARSEQUENCE,
                CHANGEDBYID = @CHANGEAGENTID,
                DATECHANGED = @CURRENTDATE;

            select @ROWSAFFECTED += @@ROWCOUNT;

            --Now update the previousGlFiscalYear

            --As we cannot determine the order the rows are added in the merge statement

            --this can't be done in the merge statement as can get a foreign key error

            --if the row for the previous year does not exist yet.

            update dbo.GLFISCALYEAR
            set GLFISCALYEAR.PREVIOUSYEARID = FENXTFISCALYEARSTAGING.PREVIOUSGLFISCALYEARID
              from dbo.GLFISCALYEAR
              inner join dbo.FENXTFISCALYEARSTAGING on FENXTFISCALYEARSTAGING.GLFISCALYEARID=GLFISCALYEAR.ID;

            insert into dbo.FENXTFISCALYEAR
            (
              ID,
              GLFISCALYEARID,
              FENXTFISCALYEARID,
              ADDEDBYID,
              CHANGEDBYID,
              DATEADDED,
              DATECHANGED
            )
            select
              newid(),
              FENXTFISCALYEARSTAGING.GLFISCALYEARID,
              FENXTFISCALYEARSTAGING.FENXTFISCALYEARID,
              @CHANGEAGENTID,
              @CHANGEAGENTID,
              @CURRENTDATE,
              @CURRENTDATE
            from dbo.FENXTFISCALYEARSTAGING
            where not exists 
              (select 1 from dbo.FENXTFISCALYEAR where FENXTFISCALYEAR.GLFISCALYEARID = FENXTFISCALYEARSTAGING.GLFISCALYEARID);

            exec dbo.USP_FENXT_ADDFENXTFISCALPERIODS @CHANGEAGENTID, @ROWSAFFECTED output;
            commit transaction FYSYNC;
            end try

          begin catch
            -- if there is an error in the fiscal years none of them should be added to CRM.

            If (@@TRANCOUNT > 0)
            begin
            rollback transaction FYSYNC;
            end

           -- catch known errors.

            declare @ERRMESSAGE varchar(MAX) = ERROR_MESSAGE();
            if @ERRMESSAGE like '%UC_GLFISCALYEAR_DESCRIPTION%'
            begin 
            set @ERRMESSAGE = 'UC_GLFISCALYEAR_DESCRIPTION'
            end
            else
            begin
            set @ERRMESSAGE = ERROR_MESSAGE();
            end
            -- insert into the sync process exceptions table

            insert into dbo.FENXTSYNCPROCESSEXCEPTIONS(
            PDACCOUNTSYSTEMID,
            BUSINESSPROCESSSTATUSID,
            SYNCOPERATIONTYPECODE,
            RAISERRORID,
            ADDEDBYID,
            CHANGEDBYID,
            DATEADDED,
            DATECHANGED)
          values(
            @PDACCOUNTSYSTEMID,
            @BUSINESSPROCESSSTATUSID,
            3,
            @ERRMESSAGE,
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CURRENTDATE,
            @CURRENTDATE);

            set @ROWSAFFECTED=0;
          end catch

        --Make sure that the fiscal year status is updated for linked fiscal years.

        update dbo.GLFISCALYEAR 
        set 
          CHANGEDBYID = @CHANGEAGENTID,
          DATECHANGED = @CURRENTDATE,
          STATUSCODE =
            (case FENXTFISCALYEARSTAGING.STATUS when 'Purged' then 4 when 'Closed' then 3 else 1 end
        from dbo.FENXTFISCALYEARSTAGING 
          inner join dbo.FENXTFISCALYEAR on FENXTFISCALYEAR.FENXTFISCALYEARID=FENXTFISCALYEARSTAGING.FENXTFISCALYEARID
          inner join dbo.GLFISCALYEAR on GLFISCALYEAR.ID=FENXTFISCALYEAR.GLFISCALYEARID
        where GLFISCALYEAR.STATUSCODE!=(case FENXTFISCALYEARSTAGING.STATUS when 'Purged' then 4 when 'Closed' then 3 else 1 end);

        select @ROWSAFFECTED += @@ROWCOUNT;

        create table #FINANCIALEDGENXTFISCALPERIOD
        (
          GLFISCALPERIODID uniqueidentifier,
          CLOSED bit
        );

        insert into #FINANCIALEDGENXTFISCALPERIOD
        (
          GLFISCALPERIODID,
          CLOSED
        )
        select
          FENXTFISCALPERIOD.GLFISCALPERIODID,
          T.c.value('(CLOSED)[1]','bit') as 'CLOSED'
        from FENXTFISCALYEARSTAGING
          cross apply FiscalPeriods.nodes('/FISCALYEARPERIODS/ITEM') T(c)
          inner join dbo.FENXTFISCALYEAR on FENXTFISCALYEARSTAGING.FENXTFISCALYEARID = FENXTFISCALYEAR.FENXTFISCALYEARID
          inner join dbo.FENXTFISCALPERIOD on T.c.value('(FENXTID)[1]','int') = FENXTFISCALPERIOD.FENXTFISCALPERIODID;

        --If the gl fiscal year is closed make sure that all associated fiscal periods are closed.

        update dbo.#FINANCIALEDGENXTFISCALPERIOD set CLOSED=1 
          where #FINANCIALEDGENXTFISCALPERIOD.GLFISCALPERIODID in
          (
            select GLFISCALPERIOD.ID 
            from dbo.GLFISCALPERIOD
              inner join GLFISCALYEAR on GLFISCALYEAR.ID=GLFISCALPERIOD.GLFISCALYEARID
            where GLFISCALYEAR.STATUSCODE=3
          );

        update dbo.GLFISCALPERIOD 
        set  
          CHANGEDBYID = @CHANGEAGENTID,
          DATECHANGED = @CURRENTDATE,
          CLOSED=#FINANCIALEDGENXTFISCALPERIOD.CLOSED from #FINANCIALEDGENXTFISCALPERIOD
        where GLFISCALPERIOD.ID=#FINANCIALEDGENXTFISCALPERIOD.GLFISCALPERIODID
          and GLFISCALPERIOD.CLOSED!=#FINANCIALEDGENXTFISCALPERIOD.CLOSED;

        select @ROWSAFFECTED += @@ROWCOUNT;