project QadFinancials > class BBudgetRebuild > method ApiRebuildBudgetDIRECT


Parameters


iiBudgetIDinputinteger
oiQBudgetLinkActualCREATED#outputinteger
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


QadFinancials
method BBudgetRebuild.ApiRebuildBudget


program code (program6/bbudgetrebuild.p)

assign oiReturnStatus = -98
       oiQBudgetLinkActualCREATED# = 0.

/* ===================================================================================================== */
/* This method will clear the budget data of the budget and make new queue records for the budget daemon */
/* ===================================================================================================== */
<I-65 {WRITEDIRECTDBACCESS
     &WRITETABLENAMES = "'Budget Budgetlink BudgetlinkAcc BudgetlinkAccDet BudgetLinkActual BudgetLinkCommit qBudgetLinkActual qBudgetLinkCommit'"}>
     
<I-68 {READDIRECTDBACCESS
     &READTABLENAMES = "'BudgetPeriod BudgetCompany BudgetFDS BudgetWBS Company Posting PostingLine PostingSAF Journal Layer SharedSet CompanySharedSet GL Division CostCentre SafConcept SafStructure SAF'"}>


/* -------------------------------------------------------------------------------------------------------------------------------------- */
/* delete the records in Budgetlink BudgetLinkAcc BudgetLinkAccDet Budgetlinkactuals Budgetlinkcommit qBudgetLinkActual qBudgetLinkCommit */
/* -------------------------------------------------------------------------------------------------------------------------------------- */
for each Budget where
         Budget.Budget_ID = iiBudgetID
         no-lock :

    /* ============================= */
    /* STEP 1 : CLEAR ALL THE DATA   */
    /* ============================= */
    for each Budgetlink        of Budget exclusive-lock transaction:   delete budgetlink.                  end.
    for each BudgetLinkAcc     of Budget exclusive-lock transaction:   delete budgetLinkAcc.               end.
    for each BudgetLinkAccDet  of Budget exclusive-lock transaction:   delete budgetLinkAccDet.            end.
    for each BudgetLinkActual  of Budget exclusive-lock transaction:   delete BudgetLinkActual.            end.
    for each BudgetLinkCommit  of Budget exclusive-lock transaction:   delete BudgetLinkCommit.            end.
    for each qBudgetLinkActual of Budget exclusive-lock transaction:   delete qBudgetLinkActual.           end.
    for each qBudgetLinkCommit of Budget exclusive-lock transaction:   delete qBudgetLinkCommit.           end.

    /* ====================================== */
    /* STEP 2 : BUILD UP BUDGET QUEUE RECORD  */
    /* ====================================== */
    assign vlBudgetCompanyFound = can-find (first BudgetCompany of Budget)
           vtBudgetFromDate = ?
           vtBudgetTillDate = ?.

    for each BudgetPeriod of Budget no-lock :
        if vtBudgetFromDate = ? or BudgetPeriod.BudgetPeriodFromDate < vtBudgetFromDate
        then assign vtBudgetFromDate = BudgetPeriod.BudgetPeriodFromDate.
        if vtBudgetTillDate = ? or BudgetPeriod.BudgetPeriodTillDate > vtBudgetTillDate
        then assign vtBudgetTillDate = BudgetPeriod.BudgetPeriodTillDate.
    end.

    if vtBudgetFromDate = ? then assign vtBudgetFromDate = date (01,01,0001).
    if vtBudgetTillDate = ? then assign vtBudgetTillDate = date (12,31,9999).
    
    for each Company no-lock :   

       /* If BudgetCompany was found, we need to use this table */
       if vlBudgetCompanyFound and 
          not can-find (first BudgetCompany of Budget where
                              BudgetCompany.Company_ID = Company.Company_ID)
       then next.
           
       GL_Block:
       for each SharedSet where SharedSet.SharedSetTypeCode = {&SHAREDSETTYPE-GL} no-lock,
           each CompanySharedSet of Company where
                CompanySharedSet.SharedSet_ID = SharedSet.SharedSet_ID no-lock,
           each GL where
                GL.SharedSet_ID = CompanySharedSet.SharedSet_ID and
                GL.GLIsWithBudget
                no-lock :
        
            /* In case the GL is one of the FDS elements, we do an extra filtering on the account */
            if can-find (first BudgetFDS of Budget no-lock where
                               BudgetFDS.BudgetFDSType = {&BUDGETFDSTYPE-GL})
            then do :
                for each BudgetFDS of Budget no-lock where
                         BudgetFDS.budgetFDSType = {&BUDGETFDSTYPE-GL},
                    each BudgetWBS where
                         BudgetWBS.budgetFDS_ID = BudgetFDS.BudgetFDS_ID and
 	 	 	  ((BudgetWBS.BudgetWBSFDSFromCode <= GL.GLCode      and
 	 	 	    BudgetWBS.BudgetWBSFDSToCode   >= GL.GLCode      and
 	 	 	    BudgetWBS.BudgetWBSFDSFromCode <> ?             and
 	 	 	    BudgetWBS.BudgetWBSFDSToCode <> ?)              or
 	 	 	    BudgetWBS.BudgetWBSFDSCode     = GL.GLCode      or
 	 	        can-do (BudgetWBS.BudgetWBSFDSList,GL.GlCode)   or
                (BudgetWBS.BudgetGroup_ID <> 0 and 
                 BudgetWBS.BudgetGroup_ID <> ? and
                 BudgetWBS.BudgetGroup_ID  = GL.BudgetGroup_ID
                 )
                 )
 	 	  no-lock: 
                   
  
                   /* Go through all the Transaction Lines */
                    for each PostingLine where 
                             PostingLine.Company_ID = Company.Company_ID and
                             PostingLine.GL_ID      = GL.GL_ID and
                             PostingLine.PostingDate >= vtBudgetFromDate and
                             PostingLine.PostingDate <= vtBudgetTillDate
                             no-lock,
                        first Posting of PostingLine no-lock,
                        first Journal of Posting no-lock,
                        first Layer of Journal no-lock
                        TRANSACTION :
                        
                        <M-71 run StartPersistence
                           (output vhFcComponent (ohPersistence), 
                            output viFcReturnSuper (oiReturnStatus)) in BBudgetRebuild>
      
                        if viFcReturnSuper <> 0
                        then oiReturnStatus = viFcReturnSuper.
                        if viFcReturnSuper < 0
                        then return.
                        viObjectNumber = <M-6 GetNextValue  (input  'ObjectNumber' (icSequence)) in persistence>.
                        find first QBudgetLinkActual where 
                                   QBudgetLinkActual.PostingLine_ID               = PostingLine.PostingLine_ID and 
                                   QBudgetLinkActual.Budget_ID                    = Budget.Budget_ID
                                   no-lock no-error .
                        if not available QBudgetLinkActual
                            then do :
                           
                            create QBudgetLinkActual.
                            assign oiQBudgetLinkActualCREATED#                    = oiQBudgetLinkActualCREATED# + 1
                                   QBudgetLinkActual.QBudgetLinkActual_ID         = viObjectNumber
                                   QBudgetLinkActual.Layer_ID                     = Layer.Layer_ID        
                                   QBudgetLinkActual.LayerTypeCode                = Layer.LayerTypeCode
                                   QBudgetLinkActual.JournalTypeCode              = Journal.JournalTypeCode
                                   QBudgetLinkActual.BudgetLinkActualGLCode       = GL.GLCode
                                   QBudgetLinkActual.BudgetLinkActualTC           = PostingLine.PostingLineDebitTC - PostingLine.PostingLineCreditTC
                                   QBudgetLinkActual.BudgetLinkActualQTY          = PostingLine.PostingLineQTY
                                   QBudgetLinkActual.BudgetLinkActualDate         = Posting.PostingDate               
                                   QBudgetLinkActual.BudgetLinkActualInfo         = string(Posting.PostingYear,'9999':U) + '/':U
                                                                                  + string(Posting.PostingPeriod,'99':U) + '/':U
                                                                                  + Journal.JournalCode                  + '/':U
                                                                                  + string(Posting.PostingVoucher,'999999999':U)               
                                   QBudgetLinkActual.PostingLine_ID               = PostingLine.PostingLine_ID
                                   QBudgetLinkActual.Company_ID                   = PostingLine.Company_ID
                                   QBudgetLinkActual.Currency_ID                  = PostingLine.Currency_ID
                                   QBudgetLinkActual.Journal_ID                   = Posting.Journal_ID
                                   QBudgetLinkActual.Unit_ID                      = GL.Unit_ID
                                   QBudgetLinkActual.Budget_ID                    = Budget.Budget_ID
                                   QBudgetLinkActual.BudgetWBS_ID                 = 0.               
                           
                           /* Division */                                                              
                           if PostingLine.Division_ID <> 0 and PostingLine.Division_ID <> ?
                           then do :
                               find Division of PostingLine no-lock no-error.
                               if available Division
                               then assign QBudgetLinkActual.BudgetLinkActualDivCode = Division.DivisionCode.
                           end.
                           else assign QBudgetLinkActual.BudgetLinkActualDivCode = ''.
                           
                           /* CostCentre */                                                              
                           if PostingLine.CostCentre_ID <> 0 and PostingLine.CostCentre_ID <> ?
                           then do :
                               find CostCentre of PostingLine no-lock no-error.
                               if available CostCentre
                               then assign QBudgetLinkActual.BudgetLinkActualCCCode = CostCentre.Costcentrecode.
                           end.
                           else assign QBudgetLinkActual.BudgetLinkActualCCCode = ''.
                                  
                           /* Project */                                                              
                           if PostingLine.Project_ID <> 0 and PostingLine.Project_ID <> ?
                           then do :
                                <Q-79 run ProjectPrim (all) (Read) (NoCache)
                                   (input ?, (CompanyId)
                                    input PostingLine.Project_ID, (ProjectID)
                                    input ?, (ProjectCode)
                                    output dataset tqProjectPrim) in BProject>
                               find first tqProjectPrim where
                                          tqProjectPrim.tiProject_ID = PostingLine.Project_ID 
                                          no-error.
                               if available tqProjectPrim
                               then assign QBudgetLinkActual.BudgetLinkActualPrjCode = tqProjectPrim.tcProjectCode.
                           end.
                           else assign QBudgetLinkActual.BudgetLinkActualPrjCode = ''.
                    
                           /* Get the SAF info */       
                           for each PostingSAF of PostingLine no-lock,
                               first SAF of PostingSAF no-lock,                   
                               first SafConcept of SAF no-lock,
                               first SafStructure of PostingSAF no-lock
                               by PostingSafParentType
                               by PostingSafInputSequence:
                                                                   
                                assign QBudgetLinkActual.BudgetLinkActualSafStruct = SafStructure.SafStructureCode.
                                
                                if PostingSAF.PostingSafInputSequence = 1
                                then assign QBudgetLinkActual.BudgetLinkActualSaf1Concpt = SafConcept.SafConceptCode
                                            QBudgetLinkActual.BudgetLinkActualSaf1Code   = SAF.SafCode.
                                else 
                                if PostingSAF.PostingSafInputSequence = 2
                                then assign QBudgetLinkActual.BudgetLinkActualSaf2Concpt = SafConcept.SafConceptCode
                                            QBudgetLinkActual.BudgetLinkActualSaf2Code   = SAF.SafCode.
                                else 
                                if PostingSAF.PostingSafInputSequence = 3
                                then assign QBudgetLinkActual.BudgetLinkActualSaf3Concpt = SafConcept.SafConceptCode
                                            QBudgetLinkActual.BudgetLinkActualSaf3Code   = SAF.SafCode.
                                else 
                                if PostingSAF.PostingSafInputSequence = 4
                                then assign QBudgetLinkActual.BudgetLinkActualSaf4Concpt = SafConcept.SafConceptCode
                                            QBudgetLinkActual.BudgetLinkActualSaf4Code   = SAF.SafCode.
                                else 
                                if PostingSAF.PostingSafInputSequence = 5
                                then assign QBudgetLinkActual.BudgetLinkActualSaf5Concpt = SafConcept.SafConceptCode
                                            QBudgetLinkActual.BudgetLinkActualSaf5Code   = SAF.SafCode.
                           
                           end. /* For each PostingSAF */
            
                           release QBudgetLinkActual.
                       end. /* if not available QBudgetLinkActual */
                    end. /* for each PostingLine*/    
                end. /* for each budgetFDS */
            end. /* can-find */             
              
       end. /* for each SharedSet */
    
    end. /* for each Company */

end. /* for each Budget */

if oiReturnStatus = -98
then assign oiReturnStatus = 0.