project QadFinancials > class BDeductionCat > method ValidateComponent

Description

Write here all tests on database update (new / modify / delete) that cannot be coded with a validation mask.
The type of update can be found in tc_status (N/C/D).
If you find incorrect data, you must write an entry in tFcMessages (using SetMessage) and set the return status of this method to either +1 or -1.
Return status +1 = data will still be accepted.
Return status -1 = data will not be accepted.
This method is run from SetPublicTables, before transferring the received data into the class temp-tables.


Parameters


oiReturnStatusoutputinteger


Internal usage


unused


program code (program/bdeductioncat.p)

    /* ====================================================================== */
    /* Backwards compatibility : fill new mandatory field when not filled yet */
    /* ====================================================================== */
    for each t_sDeductionCatLine : 
        if t_sDeductionCatLine.DeductionCatLineWOffLimit= ? 
        then assign t_sDeductionCatLine.DeductionCatLineWOffLimit = 0.
    end. /* t_sDeductionCatLine */
    


<ANCESTOR-CODE>


for each t_sDeductionCatLine:

   define variable tCompanyID as integer.
   if vcActivityCode = "ExcelIntegration" then
   do:
      <Q-950 run CompanyByDomain (first) (Read) (NoCache)
         (input ?, (CompanyId)
          input t_sDeductionCatLine.Domain_ID, (DomainId)
          input yes, (Active)
          output dataset tqCompanyByDomain) in BCompany>
                       
      for first tqCompanyByDomain:
         tCompanyID  = tqCompanyByDomain.tiCompany_ID.
      end.
    end.
    else
       tCompanyID = viCompanyId.

   if t_sDeductionCatLine.tcGLCode <> "" and  t_sDeductionCatLine.tcGLCode <> ? then
   do:
      <Q-681 run GLPrim (first) (Read) (NoCache)
         (input tCompanyID, (CompanyId)
          input t_sDeductionCatLine.tcGLCode, (GLCode)
          input ?, (GLId)
          output dataset tqGLPrim) in BGL>
          
      for first tqGLPrim:
         t_sDeductionCatLine.gl_id = tiGL_ID.
      end.
   end.
   else
   do:
      t_sDeductionCatLine.gl_id = 0.
   end.
   
   
   if t_sDeductionCatLine.tcCostCentreCode <> "" and  t_sDeductionCatLine.tcCostCentreCode <> ? then
   do:
      <Q-89 run CostCentreByCode (first) (Read) (NoCache)
         (input tCompanyID, (CompanyId)
          input t_sDeductionCatLine.tcCostCentreCode, (Code)
          output dataset tqCostCentreByCode) in BCostCentre>
          
      for first tqCostCentreByCode:
         t_sDeductionCatLine.costcentre_id = tiCostCentre_ID.
      end.
   end. 
   else
   do:
      t_sDeductionCatLine.costcentre_id = 0.
   end.
   
   
   if t_sDeductionCatLine.tcDivisionCode <> "":U and  t_sDeductionCatLine.tcDivisionCode <> ? then
   do:

      <Q-56 run DivisionPrim (all) (Read) (NoCache)
         (input tCompanyID, (CompanyId)
          input ?, (DivisionID)
          input t_sDeductionCatLine.tcDivisionCode, (DivisionCode)
          output dataset tqDivisionPrim) in BDivision>
          
      for first tqDivisionPrim:
         t_sDeductionCatLine.division_id = tiDivision_ID.
      end.
   end.
   else
   do:
      t_sDeductionCatLine.division_id = 0.
   end.

/*
   if t_sDeductionCatLine.tcRechargeJournalCode <> "":U and  t_sDeductionCatLine.tcRechargeJournalCode <> ? then
   do:
      <Q-136 run JournalPrim (first) (Read) (NoCache)
         (input tCompanyID, (CompanyId)
          input t_sDeductionCatLine.tcRechargeJournalCode, (JournalCode)
          input ?, (JournalID)
          output dataset tqJournalPrim) in BJournal>
      for first tqJournalPrim:
         t_sDeductionCatLine.RechargeJournal_ID = tiJournal_ID.
      end.
   end. */
   
   if t_sDeductionCatLine.tcExpenseJournalCode <> "":U and  t_sDeductionCatLine.tcExpenseJournalCode <> ? then
   do:
      <Q-98 run JournalPrim (first) (Read) (NoCache)
         (input tCompanyID, (CompanyId)
          input t_sDeductionCatLine.tcExpenseJournalCode, (JournalCode)
          input ?, (JournalID)
          output dataset tqJournalPrim) in BJournal>
          
      for first tqJournalPrim:
         t_sDeductionCatLine.ExpenseJournal_ID = tiJournal_ID.
      end.
   end.

end.

for each t_sDeductionCat:

    /* make srue the user can't change the type of the deductioncat type when this deduction has been used in the deduction transaction */
    if t_sDeductionCat.tc_Status = "C":U
    then do:
        /* get if deduction cat has been used info */
        <M-54 run DeductionCatIsUsed
           (input  t_sDeductionCat.DeductionCatCode (icDeductionCatCode), 
            output vlDeductionCodeIsUsed (olIsUsed), 
            output viFcReturnSuper (oiReturnStatus)) in BDeductionCat>
        find first t_iDeductionCat where t_iDeductionCat.DeductionCat_ID = t_sDeductionCat.DeductionCat_ID no-error.
        if vlDeductionCodeIsUsed and t_sDeductionCat.DeductionCatType <> t_iDeductionCat.DeductionCatType
        then do:
            assign vcMessage =  #T-177'You can't change the deduction category type if it has been used in the deduction transaction.':255(289033862)T-177#.
            <M-19 run SetMessage
               (input  vcMessage (icMessage), 
                input  '':U (icArguments), 
                input  'tDeductionCat.DeductionCatCode':U (icFieldName), 
                input  t_sDeductionCat.DeductionCatCode (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  '':U (icRowid), 
                input  'qadfin-125470':U (icFcMsgNumber), 
                input  ? (icFcExplanation), 
                input  ? (icFcIdentification), 
                input  ? (icFcContext), 
                output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
            oiReturnStatus = -1.
            return.
        end.
    end.
    
    /* start checking DeductionCat data */
    if t_sDeductionCat.tc_status = "N":U 
    then do:
        if t_sDeductionCat.DeductionCatCode = '':U or
           t_sDeductionCat.DeductionCatCode = ?
        then do:
            assign vcMessage =  #T-25'Deduction Category Code is mandatory.':100(582738362)T-25#.
            <M-24 run SetMessage
               (input  vcMessage (icMessage), 
                input  '':U (icArguments), 
                input  'tDeductionCat.DeductionCatCode':U (icFieldName), 
                input  t_sDeductionCat.DeductionCatCode (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  '':U (icRowid), 
                input  'qadfin-323368':U (icFcMsgNumber), 
                input  ? (icFcExplanation), 
                input  ? (icFcIdentification), 
                input  ? (icFcContext), 
                output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
            oiReturnStatus = -1.
            return.
        end.     
        
        if t_sDeductionCat.DeductionCatCode <> '':U and
           t_sDeductionCat.DeductionCatCode <> ?
        then do:
            /* checking deduction category already exists in the database */
            <Q-70 run DeductionCatPrim (all) (Read) (NoCache)
               (input t_sDeductionCat.DeductionCatCode, (DeductionCatCode)
                input ?, (DeductionCatId)
                output dataset tqDeductionCatPrim) in BDeductionCat>
            find first tqDeductionCatPrim no-lock no-error.
            if available tqDeductionCatPrim
            then do:
                assign vcMessage =  #T-94'Deduction Category Code already exists in the database.':100(665329770)T-94#.
                <M-97 run SetMessage
                   (input  vcMessage (icMessage), 
                    input  '':U (icArguments), 
                    input  'tDeductionCat.DeductionCatCode':U (icFieldName), 
                    input  t_sDeductionCat.DeductionCatCode (icFieldValue), 
                    input  'E':U (icType), 
                    input  3 (iiSeverity), 
                    input  '':U (icRowid), 
                    input  'qadfin-185190':U (icFcMsgNumber), 
                    input  ? (icFcExplanation), 
                    input  ? (icFcIdentification), 
                    input  ? (icFcContext), 
                    output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                oiReturnStatus = -1.
                return.
            end.
        end.
    end. /* if t_sDeductionCat.tc_status = "N":U  */ 




    for each t_sDeductionCatLine where t_sDeductionCatLine.DeductionCat_ID = t_sDeductionCat.DeductionCat_ID
        and t_sDeductionCatLine.tc_status <> "D":U:
        
        /******************************************************************************************************/
        /* Since deduction cateogry code is in system level now, t_sDeductionCatLine will contain all domains data after DataLoad method
           In order to validate the domain data of current domain when it's Create or Modify activity,
           we should skip the the records by checking Domain_ID field. 
           When it's ExcelIntegration activity, we should also make sure it can validate all the records against of any doamin. */
        /******************************************************************************************************/
        if vcActivityCode <> 'ExcelIntegration':U and t_sDeductionCatLine.Domain_ID <> viDomainID
        then next.
    
        if t_sDeductionCat.tc_status <> "D":U 
        then do:

           define variable tempCompanyID as integer.
                if vcActivityCode = "ExcelIntegration" then
                do:
                   <Q-626 run CompanyByDomain (first) (Read) (NoCache)
                      (input ?, (CompanyId)
                       input t_sDeductionCatLine.Domain_ID, (DomainId)
                       input yes, (Active)
                       output dataset tqCompanyByDomain) in BCompany>
                       
                   for first tqCompanyByDomain:
                      tempCompanyID  = tqCompanyByDomain.tiCompany_ID.
                   end.
                end.
                else
                   tempCompanyID = viCompanyId.
                
            /*Check required fields*/
            if t_sDeductionCat.DeductionCatType = {&DEDUCTIONCATTYPE-STANDARD}
            then do:
                /* check write off limit values */
                if t_sDeductionCatLine.DeductionCatLineWOffLimit = ? or 
                   t_sDeductionCatLine.DeductionCatLineWOffLimit < 0
                then do:
                    assign vcMessage =  #T-1'Please input valid Write-Off Limit.':100(908371224)T-1#.
                    <M-30 run SetMessage
                       (input  vcMessage (icMessage), 
                        input  '':U (icArguments), 
                        input  'tDeductionCatLine.DeductionCatLineWOffLimit':U (icFieldName), 
                        input  t_sDeductionCatLine.DeductionCatLineWOffLimit (icFieldValue), 
                        input  'E':U (icType), 
                        input  3 (iiSeverity), 
                        input  '':U (icRowid), 
                        input  'qadfin-682704':U (icFcMsgNumber), 
                        input  ? (icFcExplanation), 
                        input  ? (icFcIdentification), 
                        input  ? (icFcContext), 
                        output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                    oiReturnStatus = -1.
                    return.
                end.
    
                if not available t_sDeductionCatLine then return.
                /* check gl account is empty */
                if t_sDeductionCatLine.tcGLCode = ? or
                   t_sDeductionCatLine.tcGLCode = '':U
                then do:
                    assign vcMessage =  #T-9'Please input an Expense Account.':100(798708910)T-9#.
                    <M-73 run SetMessage
                       (input  vcMessage (icMessage), 
                        input  '':U (icArguments), 
                        input  'tDeductionCatLine.tcGLCode':U (icFieldName), 
                        input  t_sDeductionCatLine.tcGLCode (icFieldValue), 
                        input  'E':U (icType), 
                        input  3 (iiSeverity), 
                        input  '':U (icRowid), 
                        input  'qadfin-333131':U (icFcMsgNumber), 
                        input  ? (icFcExplanation), 
                        input  ? (icFcIdentification), 
                        input  ? (icFcContext), 
                        output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                    oiReturnStatus = -1.
                    return.
                end.    
            end. /* if t_sDeductionCat.DeductionCatType = {&DEDUCTIONCATTYPE-STANDARD} */
            else do: /* DeductionCattype = Promotion */
    
                /* if gl code is empty, then the division code and cost center code should also be empty */
                if ( t_sDeductionCatLine.tcGLCode = '':U or 
                     t_sDeductionCatLine.tcGLCode = ?)             and
                   (
                    ( t_sDeductionCatLine.tcDivisionCode <> '':U   and
                      t_sDeductionCatLine.tcDivisionCode <> ?   )  or
                    ( t_sDeductionCatLine.tcCostCentreCode <> '':U and
                      t_sDeductionCatLine.tcCostCentreCode <> ? )
                    )
                then do:
                    assign vcMessage =  #T-45'When Expense Account is empty you can't input Sub-Account or Cost Center account.':255(208919732)T-45#.
                    <M-42 run SetMessage
                       (input  vcMessage (icMessage), 
                        input  '':U (icArguments), 
                        input  'tDeductionCatLine.tcGLCode':U (icFieldName), 
                        input  t_sDeductionCatLine.tcGLCode (icFieldValue), 
                        input  'E':U (icType), 
                        input  3 (iiSeverity), 
                        input  '':U (icRowid), 
                        input  'qadfin-215159':U (icFcMsgNumber), 
                        input  ? (icFcExplanation), 
                        input  ? (icFcIdentification), 
                        input  ? (icFcContext), 
                        output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                    oiReturnStatus = -1.
                    return.
                end.
            end. /* else do DeductionCattype = Promotion  */
            /************************************************************************************/
            /* Check each codes exists in the database */
            /************************************************************************************/
            if not available t_sDeductionCatLine then return.
            /* checking gl code */
            if t_sDeductionCatLine.tcGLCode <> '':U and t_sDeductionCatLine.tcGLCode <> ?
            then do:
                <Q-18 run GLByCode (all) (Read) (NoCache)
                   (input tempCompanyID, (CompanyId)
                    input t_sDeductionCatLine.tcGLCode, (GLCode)
                    output dataset tqGLByCode) in BGL>
                find first tqGLByCode no-lock no-error.
                if not available tqGLByCode
                then do:
                    assign vcMessage =  #T-29'Invalid Expense Account':255(349777340)T-29#.
                    <M-48 run SetMessage
                       (input  vcMessage (icMessage), 
                        input  '':U (icArguments), 
                        input  'tDeductionCatLine.tcGLCode':U (icFieldName), 
                        input  t_sDeductionCatLine.tcGLCode (icFieldValue), 
                        input  'E':U (icType), 
                        input  3 (iiSeverity), 
                        input  '':U (icRowid), 
                        input  'qadfin-238201':U (icFcMsgNumber), 
                        input  ? (icFcExplanation), 
                        input  ? (icFcIdentification), 
                        input  ? (icFcContext), 
                        output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                    oiReturnStatus = -1.
                    return.
                end.
                else do: /* validate gl */
                    if tqGLByCode.tcGLCategory <> {&GLCATEGORY-EXPENSE} 
                    then do:
                        assign vcMessage =  #T-52'Please select a GL Account with category Expense':255(364979164)T-52#.
                        <M-76 run SetMessage
                           (input  vcMessage (icMessage), 
                            input  '':U (icArguments), 
                            input  'tDeductionCatLine.tcGLCode':U (icFieldName), 
                            input  t_sDeductionCatLine.tcGLCode (icFieldValue), 
                            input  'E':U (icType), 
                            input  3 (iiSeverity), 
                            input  '':U (icRowid), 
                            input  'qadfin-523282':U (icFcMsgNumber), 
                            input  ? (icFcExplanation), 
                            input  ? (icFcIdentification), 
                            input  ? (icFcContext), 
                            output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                        oiReturnStatus = -1.
                        return.
                    end.
    
                    if tqGLByCode.tcGLType <> {&GLTYPECODE-STAN}
                    then do:
                        assign vcMessage =  #T-61'Please select a Standard GL Account':255(957007047)T-61#.
                        <M-50 run SetMessage
                           (input  vcMessage (icMessage), 
                            input  '':U (icArguments), 
                            input  'tDeductionCatLine.tcGLCode':U (icFieldName), 
                            input  t_sDeductionCatLine.tcGLCode (icFieldValue), 
                            input  'E':U (icType), 
                            input  3 (iiSeverity), 
                            input  '':U (icRowid), 
                            input  'qadfin-488605':U (icFcMsgNumber), 
                            input  ? (icFcExplanation), 
                            input  ? (icFcIdentification), 
                            input  ? (icFcContext), 
                            output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                        oiReturnStatus = -1.
                        return.  
                    end.
    
                    /* checking if gl is active */
                    <Q-3 run GLByIdCodeTypeActive (all) (Read) (NoCache)
                       (input tempCompanyID, (CompanyId)
                        input ?, (GLID)
                        input tqGLByCode.tcGLCode, (GLCode)
                        input ?, (GLTypeCode)
                        input yes, (GLIsActive)
                        output dataset tqGLByIdCodeTypeActive) in BGL>
                    find first tqGLByIdCodeTypeActive no-lock no-error.
                    if not available tqGLByIdCodeTypeActive
                    then do:
                        assign vcMessage =  #T-84'Expense Account is not active.':100(614257748)T-84#.
                        <M-13 run SetMessage
                           (input  vcMessage (icMessage), 
                            input  '':U (icArguments), 
                            input  'tDeductionCatLine.tcGLCode':U (icFieldName), 
                            input  t_sDeductionCatLine.tcGLCode (icFieldValue), 
                            input  'E':U (icType), 
                            input  3 (iiSeverity), 
                            input  '':U (icRowid), 
                            input  'qadfin-791352':U (icFcMsgNumber), 
                            input  ? (icFcExplanation), 
                            input  ? (icFcIdentification), 
                            input  ? (icFcContext), 
                            output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                        oiReturnStatus = -1.
                        return. 
                    end.
    
                    /*************************************************************************************/
                    /* Validate GL Analysis */
                    /*************************************************************************************/
                    if tqGLByCode.tlGLIsCostCentreAccount
                    then do: /* gl is cost center analysis */
                        if t_sDeductionCatLine.tcCostCentreCode = ? or
                           t_sDeductionCatLine.tcCostCentreCode = '':U
                        then do:
                            assign vcMessage =  #T-80'Please input a Cost Center Account, because GL is with Cost Center analysis':150(423804312)T-80#.
                            <M-35 run SetMessage
                               (input  vcMessage (icMessage), 
                                input  '':U (icArguments), 
                                input  'tDeductionCatLine.tcCostCentreCode':U (icFieldName), 
                                input  t_sDeductionCatLine.tcCostCentreCode (icFieldValue), 
                                input  'E':U (icType), 
                                input  3 (iiSeverity), 
                                input  '':U (icRowid), 
                                input  'qadfin-407923':U (icFcMsgNumber), 
                                input  ? (icFcExplanation), 
                                input  ? (icFcIdentification), 
                                input  ? (icFcContext), 
                                output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                            oiReturnStatus = -1.
                            return.
                        end.
                    end.
                    else do: /* gl is not cost center analysis */
                        if t_sDeductionCatLine.tcCostCentreCode <> ? and
                           t_sDeductionCatLine.tcCostCentreCode <> '':U
                        then do:
                            assign vcMessage =  #T-41'You can't input a Cost Center Code, because current Expense Account is not with Cost Center analysis.':255(223036153)T-41#.
                            <M-88 run SetMessage
                               (input  vcMessage (icMessage), 
                                input  '':U (icArguments), 
                                input  'tDeductionCatLine.tcCostCentreCode':U (icFieldName), 
                                input  t_sDeductionCatLine.tcCostCentreCode (icFieldValue), 
                                input  'E':U (icType), 
                                input  3 (iiSeverity), 
                                input  '':U (icRowid), 
                                input  'qadfin-215017':U (icFcMsgNumber), 
                                input  ? (icFcExplanation), 
                                input  ? (icFcIdentification), 
                                input  ? (icFcContext), 
                                output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                            oiReturnStatus = -1.
                            return.
                        end.
                    end.
    
                    if tqGLByCode.tlGLIsDivisionAccount
                    then do:
                        if t_sDeductionCatLine.tcDivisionCode = ? or
                           t_sDeductionCatLine.tcDivisionCode = '':U
                        then do:
                            assign vcMessage =  #T-51'Please input a Sub-Account, because GL is with Sub-Account analysis.':255(496597702)T-51#.
                            <M-47 run SetMessage
                               (input  vcMessage (icMessage), 
                                input  '':U (icArguments), 
                                input  'tDeductionCatLine.tcDivisionCode':U (icFieldName), 
                                input  t_sDeductionCatLine.tcDivisionCode (icFieldValue), 
                                input  'E':U (icType), 
                                input  3 (iiSeverity), 
                                input  '':U (icRowid), 
                                input  'qadfin-147045':U (icFcMsgNumber), 
                                input  ? (icFcExplanation), 
                                input  ? (icFcIdentification), 
                                input  ? (icFcContext), 
                                output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                            oiReturnStatus = -1.
                            return.
                        end.
                    end.
                    else do:
                        if t_sDeductionCatLine.tcDivisionCode <> ? and
                           t_sDeductionCatLine.tcDivisionCode <> '':U
                        then do:
                            assign vcMessage =  #T-46'You can't input a Sub-Account, because current Expense Account is not with Sub-Account analysis.':255(482727405)T-46#.
                            <M-55 run SetMessage
                               (input  vcMessage (icMessage), 
                                input  '':U (icArguments), 
                                input  'tDeductionCatLine.tcDivisionCode':U (icFieldName), 
                                input  t_sDeductionCatLine.tcDivisionCode (icFieldValue), 
                                input  'E':U (icType), 
                                input  3 (iiSeverity), 
                                input  '':U (icRowid), 
                                input  'qadfin-784062':U (icFcMsgNumber), 
                                input  ? (icFcExplanation), 
                                input  ? (icFcIdentification), 
                                input  ? (icFcContext), 
                                output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                            oiReturnStatus = -1.
                            return.
                        end.
                    end.
    
                    /*************************************************************************************/
                    /* Validate COA Mask */
                    /*************************************************************************************/                     
                    <I-5 {bFcStartAndOpenInstance
                         &ADD-TO-TRANSACTION   = "false"
                         &CLASS                = "BCOAMask"}>
                    <M-6 run ValidateCOAMask
                       (input  t_sDeductionCatLine.tcGLCode (icGLCode), 
                        input  t_sDeductionCatLine.tcDivisionCode (icDivisionCode), 
                        input  t_sDeductionCatLine.tcCostCentreCode (icCostCentreCode), 
                        input  ? (icProjectCode), 
                        input  t_sDeductionCatLine.tc_Rowid (icRowId), 
                        input  tempCompanyID (iiCompanyId), 
                        input  ? (ilIsCOAMaskDiv), 
                        input  ? (ilIsCOAMaskDivAll), 
                        input  ? (ilIsCOAMaskCC), 
                        input  ? (ilIsCOAMaskCCAll), 
                        input  ? (ilIsCOAMaskProj), 
                        input  ? (ilIsCOAMaskProjAll), 
                        output viFcReturnSuper (oiReturnStatus)) in BCOAMask>
                    if viFcReturnSuper < 0
                    then do:
                        assign oiReturnStatus = viFcReturnSuper.
                        return.
                    end. 
                    <I-86 {bFcCloseAndStopInstance
                         &CLASS           = "BCOAMask"}>
                end. /* else do: /* validate gl */ */
            end. /* if t_sDeductionCatLine.tcGLCode <> '':U and t_sDeductionCatLine.tcGLCode <> ? */
    
            /* checking division code */
            if t_sDeductionCatLine.tcDivisionCode <> '':U and t_sDeductionCatLine.tcDivisionCode <> ? 
            then do:
                <Q-833 run DivisionPrim (all) (Read) (NoCache)
                   (input tempCompanyID, (CompanyId)
                    input ?, (DivisionID)
                    input t_sDeductionCatLine.tcDivisionCode, (DivisionCode)
                    output dataset tqDivisionPrim) in BDivision>
                find first tqDivisionPrim no-lock no-error.
                if not available tqDivisionPrim
                then do:
                    assign vcMessage =  #T-93'Invalid Sub-Account':100(872964974)T-93#.
                    <M-96 run SetMessage
                       (input  vcMessage (icMessage), 
                        input  '':U (icArguments), 
                        input  'tDeductionCatLine.tcDivisionCode':U (icFieldName), 
                        input  t_sDeductionCatLine.tcDivisionCode (icFieldValue), 
                        input  'E':U (icType), 
                        input  3 (iiSeverity), 
                        input  '':U (icRowid), 
                        input  'qadfin-614867':U (icFcMsgNumber), 
                        input  ? (icFcExplanation), 
                        input  ? (icFcIdentification), 
                        input  ? (icFcContext), 
                        output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                    oiReturnStatus = -1.
                    return.
                end.
                else do:
                    /* checking if division is active */
                    <Q-7 run DivisionByCodeIsActive (all) (Read) (NoCache)
                       (input tempCompanyID, (CompanyId)
                        input tqDivisionPrim.tcDivisionCode, (DivisionCode)
                        input yes, (IsActive)
                        output dataset tqDivisionByCodeIsActive) in BDivision>
                    find first tqDivisionByCodeIsActive no-lock no-error.
                    if not available tqDivisionByCodeIsActive
                    then do:
                        assign vcMessage =  #T-67'Sub-Account is not acctive':100(729178708)T-67#.
                        <M-53 run SetMessage
                           (input  vcMessage (icMessage), 
                            input  '':U (icArguments), 
                            input  'tDeductionCatLine.tcDivisionCode':U (icFieldName), 
                            input  t_sDeductionCatLine.tcDivisionCode (icFieldValue), 
                            input  'E':U (icType), 
                            input  3 (iiSeverity), 
                            input  '':U (icRowid), 
                            input  'qadfin-258668':U (icFcMsgNumber), 
                            input  ? (icFcExplanation), 
                            input  ? (icFcIdentification), 
                            input  ? (icFcContext), 
                            output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                        oiReturnStatus = -1.
                        return.
                    end.
                end. /* else do */
            end. /* checking division code */
            
            /* checking cost center code */
            if t_sDeductionCatLine.tcCostCentreCode <> '':U and t_sDeductionCatLine.tcCostCentreCode <> ?
            then do:
                <Q-58 run CostCentrePrim (all) (Read) (NoCache)
                   (input tempCompanyID, (CompanyId)
                    input ?, (CostCentreID)
                    input t_sDeductionCatLine.tcCostCentreCode, (CostCentreCode)
                    output dataset tqCostCentrePrim) in BCostCentre>
                find first tqCostCentrePrim no-lock no-error.
                if not available tqCostCentrePrim
                then do:
                    assign vcMessage =  #T-829'Invalid Cost Center Account':100(19287660)T-829#.
                    <M-78 run SetMessage
                       (input  vcMessage (icMessage), 
                        input  '':U (icArguments), 
                        input  'tDeductionCatLine.tcCostCentreCode':U (icFieldName), 
                        input  t_sDeductionCatLine.tcCostCentreCode (icFieldValue), 
                        input  'E':U (icType), 
                        input  3 (iiSeverity), 
                        input  '':U (icRowid), 
                        input  'qadfin-673652':U (icFcMsgNumber), 
                        input  ? (icFcExplanation), 
                        input  ? (icFcIdentification), 
                        input  ? (icFcContext), 
                        output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                    oiReturnStatus = -1.
                    return.                
                end.
                else do:
                    /* checking if cost center is active */
                    <Q-60 run CostCentreByCode (all) (Read) (NoCache)
                       (input tempCompanyID, (CompanyId)
                        input tqCostCentrePrim.tcCostCentreCode, (Code)
                        output dataset tqCostCentreByCode) in BCostCentre>   
                    find first tqCostCentreByCode no-lock no-error.
                    if available tqCostCentreByCode and tqCostCentreByCode.tlCostCentreIsActive = no
                    then do:
                        assign vcMessage =  #T-17'Cost Center is not active.':100(232836886)T-17#.
                        <M-15 run SetMessage
                           (input  vcMessage (icMessage), 
                            input  '':U (icArguments), 
                            input  'tDeductionCatLine.tcCostCentreCode':U (icFieldName), 
                            input  t_sDeductionCatLine.tcCostCentreCode (icFieldValue), 
                            input  'E':U (icType), 
                            input  3 (iiSeverity), 
                            input  '':U (icRowid), 
                            input  'qadfin-474941':U (icFcMsgNumber), 
                            input  ? (icFcExplanation), 
                            input  ? (icFcIdentification), 
                            input  ? (icFcContext), 
                            output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                        oiReturnStatus = -1.
                        return.
                    end.                           
                end.
            end. /* checking cost center code */

            /* check expense daybook */
            if t_sDeductionCatLine.tcExpenseJournalCode = '':U or t_sDeductionCatLine.tcExpenseJournalCode = ?
            then do:
                assign vcMessage =  #T-16'Expense daybook is mandatory':100(679506088)T-16#.
                <M-59 run SetMessage
                   (input  vcMessage (icMessage), 
                    input  '':U (icArguments), 
                    input  'tDeductionCatLine.tcExpenseJournalCode':U (icFieldName), 
                    input  t_sDeductionCatLine.tcExpenseJournalCode (icFieldValue), 
                    input  'E':U (icType), 
                    input  3 (iiSeverity), 
                    input  '':U (icRowid), 
                    input  'qadfin-117020':U (icFcMsgNumber), 
                    input  ? (icFcExplanation), 
                    input  ? (icFcIdentification), 
                    input  ? (icFcContext), 
                    output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                oiReturnStatus = -1.
                return.
            end. 
            if t_sDeductionCatLine.tcExpenseJournalCode <> '':U and t_sDeductionCatLine.tcExpenseJournalCode <> ?
            then do:
                <Q-8 run JournalPrim (all) (Read) (NoCache)
                   (input tempCompanyID, (CompanyId)
                    input t_sDeductionCatLine.tcExpenseJournalCode, (JournalCode)
                    input ?, (JournalID)
                    output dataset tqJournalPrim) in BJournal>
                find first tqJournalPrim no-lock no-error.
                if not available tqJournalPrim
                then do:
                    assign vcMessage =  #T-714'Invalid Expense Daybook Code':100(752958372)T-714#.
                    <M-21 run SetMessage
                       (input  vcMessage (icMessage), 
                        input  '':U (icArguments), 
                        input  'tDeductionCatLine.tcExpenseJournalCode':U (icFieldName), 
                        input  t_sDeductionCatLine.tcExpenseJournalCode (icFieldValue), 
                        input  'E':U (icType), 
                        input  3 (iiSeverity), 
                        input  '':U (icRowid), 
                        input  'qadfin-818283':U (icFcMsgNumber), 
                        input  ? (icFcExplanation), 
                        input  ? (icFcIdentification), 
                        input  ? (icFcContext), 
                        output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                    oiReturnStatus = -1.
                    return.
                end.
                else do:
                    /* checking if expense journal code is active */

                    <Q-851 run JournalByJournalCode (all) (Read) (NoCache)
                       (input tempCompanyID, (CompanyId)
                        input t_sDeductionCatLine.tcExpenseJournalCode, (JournalCode)
                        output dataset tqJournalByJournalCode) in BJournal>
                        
                    find first tqJournalByJournalCode no-lock no-error.
                    if available tqJournalByJournalCode and tqJournalByJournalCode.tlJournalIsActive = no
                    then do:
                        assign vcMessage =  #T-81'Expense daybook is not active.':100(929773949)T-81#.
                        <M-69 run SetMessage
                           (input  vcMessage (icMessage), 
                            input  '':U (icArguments), 
                            input  'tDeductionCatLine.tcExpenseJournalCode':U (icFieldName), 
                            input  t_sDeductionCatLine.tcExpenseJournalCode (icFieldValue), 
                            input  'E':U (icType), 
                            input  3 (iiSeverity), 
                            input  '':U (icRowid), 
                            input  'qadfin-504677':U (icFcMsgNumber), 
                            input  ? (icFcExplanation), 
                            input  ? (icFcIdentification), 
                            input  ? (icFcContext), 
                            output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                        oiReturnStatus = -1.
                        return.
                    end.
                    if available tqJournalByJournalCode and tqJournalByJournalCode.tcJournalTypeCode <> {&JOURNALTYPE-DEDUCTION}
                    then do:
                        assign vcMessage =  #T-188'Expense daybook type is not customer deduction':100(384728606)T-188#.
                        <M-64 run SetMessage
                           (input  vcMessage (icMessage), 
                            input  '':U (icArguments), 
                            input  'tDeductionCatLine.tcExpenseJournalCode':U (icFieldName), 
                            input  t_sDeductionCatLine.tcExpenseJournalCode (icFieldValue), 
                            input  'E':U (icType), 
                            input  3 (iiSeverity), 
                            input  '':U (icRowid), 
                            input  'qadfin-112066':U (icFcMsgNumber), 
                            input  ? (icFcExplanation), 
                            input  ? (icFcIdentification), 
                            input  ? (icFcContext), 
                            output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                        oiReturnStatus = -1.
                        return.
                    end.
                end.
            end.
            /* end check expense daybook */
    
            /* check recharge daybook */
            /*
            if t_sDeductionCatLine.tcRechargeJournalCode = '':U or t_sDeductionCatLine.tcRechargeJournalCode = ?
            then do:
                assign vcMessage =  #T-44'Recharge daybook is mandatory.':100(464471769)T-44#.
                <M-11 run SetMessage
                   (input  vcMessage (icMessage), 
                    input  '':U (icArguments), 
                    input  'tDeductionCatLine.tcRechargeJournalCode':U (icFieldName), 
                    input  t_sDeductionCatLine.tcRechargeJournalCode (icFieldValue), 
                    input  'E':U (icType), 
                    input  3 (iiSeverity), 
                    input  '':U (icRowid), 
                    input  'qadfin-315692':U (icFcMsgNumber), 
                    input  ? (icFcExplanation), 
                    input  ? (icFcIdentification), 
                    input  ? (icFcContext), 
                    output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                oiReturnStatus = -1.
                return.
            end. */
            /*
            if t_sDeductionCatLine.tcRechargeJournalCode <> '':U and t_sDeductionCatLine.tcRechargeJournalCode <> ?
            then do:
                <Q-83 run JournalPrim (all) (Read) (NoCache)
                   (input tempCompanyID, (CompanyId)
                    input t_sDeductionCatLine.tcRechargeJournalCode, (JournalCode)
                    input ?, (JournalID)
                    output dataset tqJournalPrim) in BJournal>
                find first tqJournalPrim no-lock no-error.
                if not available tqJournalPrim
                then do:
                    assign vcMessage =  #T-75'Invalid Recharge Daybook Account':100(431120175)T-75#.
                    <M-26 run SetMessage
                       (input  vcMessage (icMessage), 
                        input  '':U (icArguments), 
                        input  'tDeductionCatLine.tcRechargeJournalCode':U (icFieldName), 
                        input  t_sDeductionCatLine.tcRechargeJournalCode (icFieldValue), 
                        input  'E':U (icType), 
                        input  3 (iiSeverity), 
                        input  '':U (icRowid), 
                        input  'qadfin-423541':U (icFcMsgNumber), 
                        input  ? (icFcExplanation), 
                        input  ? (icFcIdentification), 
                        input  ? (icFcContext), 
                        output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                    oiReturnStatus = -1.
                    return.
                end.
                else do:
                    /* checking if recharge journal code is active */
                    <Q-12 run JournalByJournalCode (all) (Read) (NoCache)
                       (input tempCompanyID, (CompanyId)
                        input tqJournalPrim.tcJournalCode, (JournalCode)
                        output dataset tqJournalByJournalCode) in BJournal>
                    find first tqJournalByJournalCode no-lock no-error.
                    if available tqJournalByJournalCode and tqJournalByJournalCode.tlJournalIsActive = no
                    then do:
                        assign vcMessage =  #T-39'Recharge daybook is not active.':100(850393855)T-39#.
                        <M-649 run SetMessage
                           (input  vcMessage (icMessage), 
                            input  '':U (icArguments), 
                            input  'tDeductionCatLine.tcRechargeJournalCode':U (icFieldName), 
                            input  t_sDeductionCatLine.tcRechargeJournalCode (icFieldValue), 
                            input  'E':U (icType), 
                            input  3 (iiSeverity), 
                            input  '':U (icRowid), 
                            input  'qadfin-852821':U (icFcMsgNumber), 
                            input  ? (icFcExplanation), 
                            input  ? (icFcIdentification), 
                            input  ? (icFcContext), 
                            output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                        oiReturnStatus = -1.
                        return.
                    end.
                    if available tqJournalByJournalCode and tqJournalByJournalCode.tcJournalTypeCode <> {&JOURNALTYPE-DEBTORINVOICE}
                    then do:
                        assign vcMessage =  #T-91'Recharge daybook type is not customer invoice.':100(505247988)T-91#.
                        <M-68 run SetMessage
                           (input  vcMessage (icMessage), 
                            input  '':U (icArguments), 
                            input  'tDeductionCatLine.tcRechargeJournalCode':U (icFieldName), 
                            input  t_sDeductionCatLine.tcRechargeJournalCode (icFieldValue), 
                            input  'E':U (icType), 
                            input  3 (iiSeverity), 
                            input  '':U (icRowid), 
                            input  'qadfin-362031':U (icFcMsgNumber), 
                            input  ? (icFcExplanation), 
                            input  ? (icFcIdentification), 
                            input  ? (icFcContext), 
                            output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
                        oiReturnStatus = -1.
                        return.
                    end.
                end.
            end.  */ /* end check recharge daybook */ 
       end. /* for each t_sDeductionCatLine*/    
        
    end. /* if t_sDeductionCat.tc_status <> "D":U then */
    
    
    
    for each t_sDeductionCatLine 
        where t_sDeductionCatLine.DeductionCat_ID = t_sDeductionCat.DeductionCat_ID and 
              t_sDeductionCatLine.tc_status <> 'D':U:
       
       empty  temp-table tApiDeductionCatLineSaf.
 
       <M-65 run ApiGetSafsByGLCodeCostCenter
          (input  t_sDeductionCatLine.tcGLCode (icGLCode), 
           input  t_sDeductionCatLine.tcCostCentreCode (icCostCenterCode), 
           input-output tApiDeductionCatLineSaf (tApiDeductionCatLineSaf), 
           output viSafStructureID (oiSafStructureId), 
           input  t_sDeductionCatLine.Domain_ID (iiDomainID), 
           output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
     
       assign
          viSafCountInDB = 0
          viSafCountByAPI = 0.
       
       for each tApiDeductionCatLineSaf :
          viSafCountByAPI = viSafCountByAPI + 1.
       end.

     
       for each t_sDeductionCatLineSaf 
          where t_sDeductionCatLineSaf.DeductionCatLine_ID = t_sDeductionCatLine.DeductionCatLine_ID 
          and t_sDeductionCatLineSaf.tc_Status <> 'D':U  and t_sDeductionCatLineSaf.tc_status <> '':U:
          
          find first tApiDeductionCatLineSaf where tApiDeductionCatLineSaf.tcSafConceptCode = t_sDeductionCatLineSaf.tcSafConceptCode no-error.
          
          if not available (tApiDeductionCatLineSaf) then
          do:
             vcMessage = #T-862'Invalid Saf Concept Code':100(555411072)T-862#.
             
             <M-22 run SetMessage
                (input  vcMessage (icMessage), 
                 input  '':U (icArguments), 
                 input  'tDeductionCatLineSaf.tcSafConceptCode':U (icFieldName), 
                 input  t_sDeductionCatLineSaf.tcSafConceptCode (icFieldValue), 
                 input  'E':U (icType), 
                 input  3 (iiSeverity), 
                 input  '':U (icRowid), 
                 input  'qadfin-443631':U (icFcMsgNumber), 
                 input  ? (icFcExplanation), 
                 input  ? (icFcIdentification), 
                 input  ? (icFcContext), 
                 output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
             
             oiReturnStatus = -1.
             return.
             
          end.
          viSafCountInDB = viSafCountInDB + 1.
       end.    
    
       if viSafCountInDB <> viSafCountByAPI and vcActivityCode = "EXCELINTEGRATION" then
       do:
           vcMessage = #T-31'You must select &1 Saf Concept Codes for Deduction Category Code &2 in Domain &3':100(799105770)T-31#.   
           vcMessage = substitute(vcMessage,string(viSafCountByAPI), t_sDeductionCat.DeductionCatCode,t_sDeductionCatLine.tcCalcDomainCode).
           <M-804 run SetMessage
              (input  vcMessage (icMessage), 
               input  ? (icArguments), 
               input  ? (icFieldName), 
               input  ? (icFieldValue), 
               input  'E':U (icType), 
               input  3 (iiSeverity), 
               input  ? (icRowid), 
               input  'qadfin-670166':U (icFcMsgNumber), 
               input  ? (icFcExplanation), 
               input  ? (icFcIdentification), 
               input  ? (icFcContext), 
               output oiReturnStatus (oiReturnStatus)) in BDeductionCat>             
                            
          oiReturnStatus = -1.
          return. 
        end.   
    end.        
    
end. /* for each t_sDeductionCat: */


/*********************************************************************/
/* checking Saf Code */
/*********************************************************************/
for each t_sDeductionCatLineSaf 
    where t_sDeductionCatLineSaf.tc_Status <> 'D':U :
                  
    
    if t_sDeductionCatLineSaf.tcSafCode = '':U or t_sDeductionCatLineSaf.tcSafCode = ?
    then do:
        assign vcMessage =  #T-62'Saf code is mandatory of concept &1.':100(255558987)T-62#
               vcMessage = substitute(vcMessage,t_sDeductionCatLineSaf.tcSafConceptCode).
        <M-71 run SetMessage
           (input  vcMessage (icMessage), 
            input  '':U (icArguments), 
            input  'tDeductionCatLineSaf.tcSafCode':U (icFieldName), 
            input  t_sDeductionCatLineSaf.tcSafCode (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  '':U (icRowid), 
            input  'qadfin-362246':U (icFcMsgNumber), 
            input  ? (icFcExplanation), 
            input  ? (icFcIdentification), 
            input  ? (icFcContext), 
            output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
        oiReturnStatus = -1.
        return.
    end.  

    /* checking saf code exists in the database */
    if t_sDeductionCatLineSaf.tcSafCode <> '':U and t_sDeductionCatLineSaf.tcSafCode <> ?
    then do:
        <Q-43 run SafPrim (all) (Read) (NoCache)
           (input ?, (SafID)
            input t_sDeductionCatLineSaf.tcSafCode, (SafCode)
            input t_sDeductionCatLineSaf.tcSafConceptCode, (SafConceptCode)
            output dataset tqSafPrim) in BSaf>
        find first tqSafPrim no-lock no-error.
        if not available tqSafPrim
        then do:
            assign vcMessage =  #T-85'Invalid Saf code of concept &1.':100(425967487)T-85#
                   vcMessage = substitute(vcMessage,t_sDeductionCatLineSaf.tcSafConceptCode).
            <M-72 run SetMessage
               (input  vcMessage (icMessage), 
                input  '':U (icArguments), 
                input  'tDeductionCatLineSaf.tcSafCode':U (icFieldName), 
                input  t_sDeductionCatLineSaf.tcSafCode (icFieldValue), 
                input  'E':U (icType), 
                input  3 (iiSeverity), 
                input  '':U (icRowid), 
                input  'qadfin-396558':U (icFcMsgNumber), 
                input  ? (icFcExplanation), 
                input  ? (icFcIdentification), 
                input  ? (icFcContext), 
                output oiReturnStatus (oiReturnStatus)) in BDeductionCat>
            oiReturnStatus = -1.
            return.
        end.
    end.
end. /* end checking Saf Concept*/