Example #1
0
 /**
  * Parse Variable
  *
  * @param variable variable
  * @param po po
  * @return translated variable or if not found the original tag
  */
 private String parseVariable(String variable, PO po) {
   int index = po.get_ColumnIndex(variable);
   if (index == -1) {
     StringBuilder msgreturn = new StringBuilder("@").append(variable).append("@");
     return msgreturn.toString(); // 	keep for next
   }
   //
   MColumn col = MColumn.get(Env.getCtx(), po.get_TableName(), variable);
   Object value = null;
   if (col != null && col.isSecure()) {
     value = "********";
   } else if (col.getAD_Reference_ID() == DisplayType.Date
       || col.getAD_Reference_ID() == DisplayType.DateTime
       || col.getAD_Reference_ID() == DisplayType.Time) {
     SimpleDateFormat sdf = DisplayType.getDateFormat(col.getAD_Reference_ID());
     value = sdf.format(po.get_Value(index));
   } else if (col.getAD_Reference_ID() == DisplayType.YesNo) {
     if (po.get_ValueAsBoolean(variable)) value = Msg.getMsg(Env.getCtx(), "Yes");
     else value = Msg.getMsg(Env.getCtx(), "No");
   } else {
     value = po.get_Value(index);
   }
   if (value == null) return "";
   return value.toString();
 } //	translate
Example #2
0
  private PO createNode(int nodeId, int parentId) {
    final String nodeTableName = getNodeTableName();
    PO node = null;
    if (nodeTableName.equals(MTree_Node.Table_Name)) {
      MTree_Node n = new MTree_Node(this, nodeId);
      if (nodeId != ROOT_Node_ID) n.setParent_ID(parentId);
      node = n;
    } else if (nodeTableName.equals(MTree_NodeBP.Table_Name)) {
      MTree_NodeBP n = new MTree_NodeBP(this, nodeId);
      if (nodeId != ROOT_Node_ID) n.setParent_ID(parentId);
      node = n;
    } else if (nodeTableName.equals(MTree_NodePR.Table_Name)) {
      MTree_NodePR n = new MTree_NodePR(this, nodeId);
      if (nodeId != ROOT_Node_ID) n.setParent_ID(parentId);
      node = n;
    } else if (nodeTableName.equals(MTree_NodeMM.Table_Name)) {
      MTree_NodeMM n = new MTree_NodeMM(this, nodeId);
      if (nodeId != ROOT_Node_ID) n.setParent_ID(parentId);
      node = n;
    } else {
      throw new AdempiereException("No Table Model for " + nodeTableName);
    }

    node.saveEx();
    return node;
  }
Example #3
0
 /**
  * Compare
  *
  * @param o1 object 1
  * @param o2 object 2
  * @return -1,0, 1
  */
 @Override
 public int compare(PO o1, PO o2) {
   String s1 = o1.toString();
   if (s1 == null) s1 = "";
   String s2 = o2.toString();
   if (s2 == null) s2 = "";
   return s1.compareTo(s2);
 } //	compare
Example #4
0
  /**
   * Is standard Period Open for Document Base Type
   *
   * @param header header document record
   * @param lines document lines optional
   * @param DateAcct accounting date
   * @param DocBaseType document base type
   * @return error message or null
   */
  @Deprecated
  public static String isOpen(PO header, PO[] lines, Timestamp DateAcct, String DocBaseType) {

    // Get All Orgs
    ArrayList<Integer> orgs = new ArrayList<Integer>();
    orgs.add(header.getAD_Org_ID());
    if (lines != null) {
      for (PO line : lines) {
        int AD_Org_ID = line.getAD_Org_ID();
        if (!orgs.contains(AD_Org_ID)) orgs.add(AD_Org_ID);
      }
    }

    return isOpen(header.getCtx(), header.getAD_Client_ID(), orgs, DateAcct, DocBaseType);
  } // isOpen
  /**
   * Create new Project by copying
   *
   * @param ctx context
   * @param C_Project_ID project
   * @param dateDoc date of the document date
   * @param trxName transaction
   * @return Project
   */
  public static MProject copyFrom(
      Properties ctx, int C_Project_ID, Timestamp dateDoc, String trxName) {
    MProject from = new MProject(ctx, C_Project_ID, trxName);
    if (from.getC_Project_ID() == 0)
      throw new IllegalArgumentException("From Project not found C_Project_ID=" + C_Project_ID);
    //
    MProject to = new MProject(ctx, 0, trxName);
    PO.copyValues(from, to, from.getAD_Client_ID(), from.getAD_Org_ID());
    to.set_ValueNoCheck("C_Project_ID", I_ZERO);
    //	Set Value with Time
    String Value = to.getValue() + " ";
    String Time = dateDoc.toString();
    int length = Value.length() + Time.length();
    if (length <= 40) Value += Time;
    else Value += Time.substring(length - 40);
    to.setValue(Value);
    to.setInvoicedAmt(Env.ZERO);
    to.setProjectBalanceAmt(Env.ZERO);
    to.setProcessed(false);
    //
    if (!to.save()) throw new IllegalStateException("Could not create Project");

    if (to.copyDetailsFrom(from) == 0)
      throw new IllegalStateException("Could not create Project Details");

    return to;
  } //	copyFrom
Example #6
0
  public boolean a(cWG paramcWG) {
    if (PO.g(paramcWG)) {
      return false;
    }
    switch (paramcWG.getId()) {
      case 16147:
        bzu localbzu = (bzu) paramcWG;
        int i = localbzu.getIntValue();

        if (i == -1) {
          byv.bFN().b(this);
          return false;
        }

        if (i == -2) {
          this.cUX.drs();
          apV().apX();
          return false;
        }
        dUm localdUm = new dUm();
        localdUm.aS(this.cUX.bel());
        localdUm.Eb(i);
        byv.bFN().aJK().d(localdUm);

        this.cUX.reset();

        bOU.gUc.b(new cAc(this.cUX.bel(), i));
        return false;
    }

    return true;
  }
Example #7
0
  public static void updateTreeNode(PO po) {
    int nodeId = po.get_ID();
    if (nodeId < 0) {
      return; // nothing to do, because our PO has no ID to match against a tree node
    }
    final int AD_Table_ID = po.get_Table_ID();
    if (!MTree.hasTree(AD_Table_ID)) {
      return;
    }
    final String nodeTableName = MTree.getNodeTableName(AD_Table_ID);
    if (nodeTableName == null) {
      return;
    }

    //
    // services
    final IPOTreeSupportFactory treeSupportFactory = Services.get(IPOTreeSupportFactory.class);

    final String trxName = po.get_TrxName();
    final IPOTreeSupport treeSupport = treeSupportFactory.get(po.get_TableName());

    if (po.is_ValueChanged("IsSummary") && !po.get_ValueAsBoolean("IsSummary")) {
      // Move all its children to parent
      final List<MTreeNode> children =
          fetchNodes(AD_Table_ID, "Parent_ID=?", new Object[] {nodeId}, trxName);
      if (children.size() > 0) {
        throw new AdempiereException("TreeNodeHasChildren"); // TODO: translate
      }
    }

    if (treeSupport.isParentChanged(po)) {
      int parentId = treeSupport.getParent_ID(po);
      int oldParentId = treeSupport.getOldParent_ID(po);
      int seqNo = -1; // compute

      final String sql =
          "SELECT AD_Tree_ID, TreeType FROM AD_Tree WHERE AD_Table_ID=? AND AD_Client_ID=?";
      PreparedStatement pstmt = null;
      ResultSet rs = null;
      try {
        pstmt = DB.prepareStatement(sql, trxName);
        DB.setParameters(pstmt, new Object[] {AD_Table_ID, po.getAD_Client_ID()});
        rs = pstmt.executeQuery();
        while (rs.next()) {
          int AD_Tree_ID = rs.getInt(COLUMNNAME_AD_Tree_ID);
          String treeType = rs.getString(COLUMNNAME_TreeType);
          updateNode(
              po, AD_Tree_ID, treeType, AD_Table_ID, nodeId, parentId, oldParentId, seqNo, trxName);
        }
      } catch (SQLException e) {
        throw new DBException(e);
      } finally {
        DB.close(rs, pstmt);
        rs = null;
        pstmt = null;
      }
    }
  }
Example #8
0
  /**
   * Delete ID Tree Nodes
   *
   * @return true if actually deleted (could be non existing)
   */
  protected static boolean deleteTreeNode(PO po) {
    // TODO: check self contained tree
    int id = po.get_ID();
    if (id <= 0) id = po.get_IDOld();
    final int AD_Table_ID = po.get_Table_ID();
    if (!MTree.hasTree(AD_Table_ID)) return false;
    final String treeTableName = MTree.getNodeTableName(AD_Table_ID);
    if (treeTableName == null) return false;
    final String trxName = po.get_TrxName();
    final Logger log = po.get_Logger();
    //
    // Check childrens:
    List<MTreeNode> children = fetchNodes(AD_Table_ID, "Parent_ID=?", new Object[] {id}, trxName);
    if (children.size() > 0) {
      throw new AdempiereException("TreeNodeHasChildren"); // TODO: translate
    }

    //
    final StringBuffer sb =
        new StringBuffer("DELETE FROM ")
            .append(treeTableName)
            .append(" n WHERE Node_ID=")
            .append(id)
            .append(" AND EXISTS (SELECT * FROM AD_Tree t ")
            .append("WHERE t.AD_Tree_ID=n.AD_Tree_ID AND t.AD_Table_ID=")
            .append(AD_Table_ID)
            .append(")");
    //
    final int no = DB.executeUpdateEx(sb.toString(), trxName);
    if (no <= 0) {
      log.warn("#" + no + " - AD_Table_ID=" + AD_Table_ID);
      return false;
    }
    log.debug("#" + no + " - AD_Table_ID=" + AD_Table_ID);
    // MigrationLogger.instance.logMigrationSQL(po, sb.toString()); // metas: not needed because
    // it's called directly from PO
    listeners.onNodeDeleted(po);

    //
    // TODO Update children

    return true;
  } // delete_Tree
Example #9
0
 /**
  * Set PO for parse
  *
  * @param po po
  * @param analyse if set to true, search for BPartner/User
  */
 public void setPO(PO po, boolean analyse) {
   m_po = po;
   if (analyse) {
     int index = po.get_ColumnIndex("C_BPartner_ID");
     if (index > 0) {
       Object oo = po.get_Value(index);
       if (oo instanceof Integer) {
         int C_BPartner_ID = ((Integer) oo).intValue();
         setBPartner(C_BPartner_ID);
       }
     }
     index = po.get_ColumnIndex("AD_User_ID");
     if (index > 0) {
       Object oo = po.get_Value(index);
       if (oo instanceof Integer) {
         int AD_User_ID = ((Integer) oo).intValue();
         setUser(AD_User_ID);
       }
     }
   }
 } //	setPO
Example #10
0
  /**
   * Crea un cheque de entrada a la cuenta de la boleta por cada cheque a depositar.
   *
   * @throws Exception cuando se produce un error en la creación o procesado de alguno de los nuevos
   *     cheques.
   */
  private void createDocumentForEachCheck() throws Exception {
    // Se recorren la líneas de la boleta y se crea un nuevo cheque por cada
    // cheque a depositar, en donde la cuenta bancaria y la EC del nuevo cheque
    // son la EC y la Cta Bcria de la Boleta.
    for (MBoletaDepositoLine line : getLines()) {
      MPayment check = line.getPayment();
      MPayment newCheck = new MPayment(getCtx(), 0, get_TrxName());
      String error = null;
      PO.copyValues(check, newCheck);
      // Se asigna la fecha del nuevo cheque
      newCheck.setDateTrx(
          check.getDateTrx()); // incidencia 4324 - Si se usa el tilde de "crear un payment por
      // cheque", la fecha de emisión y Vto se deberían mantener.
      newCheck.setDateAcct(getDocumentDate());
      newCheck.setDueDate(
          check.getDueDate()); // incidencia 4324 - Si se usa el tilde de "crear un payment por
      // cheque", la fecha de emisión y Vto se deberían mantener.
      newCheck.setIsReconciled(
          false); // incidencia 4324 - el nuevo cheque no se encuentra inicialmente conciliado
      // Se asigna los datos de la boleta
      newCheck.setC_BPartner_ID(getC_BPartner_ID());
      newCheck.setC_BankAccount_ID(getC_BankAccount_ID());
      newCheck.setAD_Org_ID(getAD_Org_ID());
      // Se agrega una descripcion
      newCheck.setDescription(
          Msg.getMsg(getCtx(), "IncomeBoletaCheck", new Object[] {getDocumentNo()}));
      // Se quita la referencia a la Boleta
      newCheck.setM_BoletaDeposito_ID(0);
      // Se Completa y se cierra el cheque
      if (!newCheck.processIt(ACTION_Complete)) {
        error = newCheck.getProcessMsg();
      } else if (!newCheck.save()) {
        error = CLogger.retrieveErrorAsString();
      }
      // Si ocurrió un error al procesar se termina la operación de completado.
      if (error != null) {
        throw new Exception(
            "@IncomeBoletaCheckProcessError@ (" + newCheck.getDocumentNo() + "): " + error);
      }

      // Se asigna a la línea de la boleta la referencia al cheque creado
      // por el depósito del cheque original.
      line.setC_Depo_Payment_ID(newCheck.getC_Payment_ID());
      if (!line.save()) {
        error = CLogger.retrieveErrorAsString();
        throw new Exception(
            "@BoletaLineSaveError@ (@Check@ " + check.getDocumentNo() + "): " + error);
      }
    }
  }
Example #11
0
  /**
   * Copy Lines From other Project
   *
   * @param project project
   * @return number of lines copied
   */
  public int copyLinesFrom(MProject project) {
    if (isProcessed() || project == null) return 0;
    int count = 0;
    MProjectLine[] fromLines = project.getLines();
    for (int i = 0; i < fromLines.length; i++) {
      MProjectLine line = new MProjectLine(getCtx(), 0, project.get_TrxName());
      PO.copyValues(fromLines[i], line, getAD_Client_ID(), getAD_Org_ID());
      line.setC_Project_ID(getC_Project_ID());
      line.setInvoicedAmt(Env.ZERO);
      line.setInvoicedQty(Env.ZERO);
      line.setC_OrderPO_ID(0);
      line.setC_Order_ID(0);
      line.setProcessed(false);
      if (line.save()) count++;
    }
    if (fromLines.length != count)
      log.log(
          Level.SEVERE, "Lines difference - Project=" + fromLines.length + " <> Saved=" + count);

    return count;
  } //	copyLinesFrom
Example #12
0
  /**
   * Copy Phases/Tasks from other Project
   *
   * @param fromProject project
   * @return number of items copied
   */
  public int copyPhasesFrom(MProject fromProject) {
    if (isProcessed() || fromProject == null) return 0;
    int count = 0;
    int taskCount = 0;
    //	Get Phases
    MProjectPhase[] myPhases = getPhases();
    MProjectPhase[] fromPhases = fromProject.getPhases();
    //	Copy Phases
    for (int i = 0; i < fromPhases.length; i++) {
      //	Check if Phase already exists
      int C_Phase_ID = fromPhases[i].getC_Phase_ID();
      boolean exists = false;
      if (C_Phase_ID == 0) exists = false;
      else {
        for (int ii = 0; ii < myPhases.length; ii++) {
          if (myPhases[ii].getC_Phase_ID() == C_Phase_ID) {
            exists = true;
            break;
          }
        }
      }
      //	Phase exist
      if (exists) log.info("Phase already exists here, ignored - " + fromPhases[i]);
      else {
        MProjectPhase toPhase = new MProjectPhase(getCtx(), 0, get_TrxName());
        PO.copyValues(fromPhases[i], toPhase, getAD_Client_ID(), getAD_Org_ID());
        toPhase.setC_Project_ID(getC_Project_ID());
        toPhase.setC_Order_ID(0);
        toPhase.setIsComplete(false);
        if (toPhase.save()) {
          count++;
          taskCount += toPhase.copyTasksFrom(fromPhases[i]);
        }
      }
    }
    if (fromPhases.length != count)
      log.warning("Count difference - Project=" + fromPhases.length + " <> Saved=" + count);

    return count + taskCount;
  } //	copyPhasesFrom
Example #13
0
  @Override
  protected boolean beforeSave(boolean newRecord) {
    // Validación de campo Value duplicado: no se permiten organizaciones con el mismo código.
    if (sameColumnValueValidation(
        get_TableName(), "Value", "AD_Org_ID", getValue(), newRecord, true)) {
      return false;
    }

    // dREHER, agrego validaciones de control de padre/hijo

    // Pasar a org padre la org de login
    if (this.getAD_Org_ID() == Env.getAD_Org_ID(getCtx())) {
      if (this.isSummary()) {
        // log.warning("No se puede convertir a organizacion 'Padre' la organizacion de login!");
        log.saveError(
            "SaveError",
            Msg.translate(
                Env.getCtx(),
                "No se puede convertir a organizacion 'Padre' la organizacion de login!"));
        return false;
      }
    }

    if (!newRecord && is_ValueChanged("IsSummary")) {
      // Pasar a org Padre una org con documentos asociados
      if (isSummary()) {
        List<String> documentTableNames = new ArrayList<String>();
        documentTableNames.add(X_C_Order.Table_Name);
        documentTableNames.add(X_C_Invoice.Table_Name);
        documentTableNames.add(X_C_Payment.Table_Name);
        documentTableNames.add(X_M_InOut.Table_Name);
        documentTableNames.add(X_M_Warehouse.Table_Name);
        boolean poseeDocumentos = false;
        for (int i = 0; i < documentTableNames.size() && !poseeDocumentos; i++) {
          poseeDocumentos =
              PO.existRecordFor(
                  getCtx(),
                  documentTableNames.get(i),
                  "ad_org_id = ?",
                  new Object[] {getAD_Org_ID()},
                  get_TrxName());
        }
        if (poseeDocumentos) {
          log.saveError(
              "SaveError",
              Msg.translate(
                  Env.getCtx(),
                  "No se puede convertir a organizacion 'Padre' una organizacion que contiene documentos asociados!"));
          return false;
        }
      } else {
        // Pasar a org hija una org padre que ya contiene hijas
        ArrayList<MOrg> hijas = this.getOrgsChilds();
        if (hijas.size() > 0) {
          log.saveError(
              "SaveError",
              Msg.translate(
                  Env.getCtx(),
                  "No se puede convertir a organizacion 'Hija' una organizacion que ya contiene organizaciones 'hijas!'"));
          return false;
        }
      }
    }

    return true;
  }
 /**
  * Creates a new configuration.
  *
  * @generated
  */
 public POConfiguration() {
   super(PO.getInstance());
 }
Example #15
0
  /**
   * ************************************************************************ Insert id data into
   * Tree
   *
   * @return true if inserted
   */
  protected static boolean insertTreeNode(PO po) {
    //
    // services
    final IPOTreeSupportFactory treeSupportFactory = Services.get(IPOTreeSupportFactory.class);

    // TODO: check self contained tree
    final int AD_Table_ID = po.get_Table_ID();
    if (!MTree.hasTree(AD_Table_ID)) {
      return false;
    }
    final int id = po.get_ID();
    final int AD_Client_ID = po.getAD_Client_ID();
    final String treeTableName = MTree.getNodeTableName(AD_Table_ID);
    final String trxName = po.get_TrxName();
    final Logger log = po.get_Logger();

    final IPOTreeSupport treeSupport = treeSupportFactory.get(po.get_TableName());
    final int AD_Tree_ID = treeSupport.getAD_Tree_ID(po);
    int parentId = treeSupport.getParent_ID(po);
    if (parentId < 0 || parentId == IPOTreeSupport.UNKNOWN_ParentID) {
      parentId = ROOT_Node_ID;
    }
    //
    // Insert
    final StringBuilder sb =
        new StringBuilder("INSERT  INTO ")
            .append(treeTableName)
            .append(" (AD_Client_ID,AD_Org_ID, IsActive,Created,CreatedBy,Updated,UpdatedBy, ")
            .append("AD_Tree_ID, Node_ID, Parent_ID, SeqNo) ")
            //
            .append(
                "SELECT t.AD_Client_ID,0, 'Y', now(), "
                    + po.getUpdatedBy()
                    + ", now(), "
                    + po.getUpdatedBy()
                    + ",")
            .append("t.AD_Tree_ID, ")
            .append(id)
            .append(", ")
            .append(parentId)
            .append(", 999 ")
            .append("FROM AD_Tree t ")
            .append("WHERE t.AD_Client_ID=")
            .append(AD_Client_ID)
            .append(" AND t.IsActive='Y'");
    if (AD_Tree_ID > 0) {
      sb.append(" AND t.AD_Tree_ID=").append(AD_Tree_ID);
    } else
    // std trees
    {
      sb.append(" AND t.IsAllNodes='Y' AND t.AD_Table_ID=").append(AD_Table_ID);
    }
    // Duplicate Check
    sb.append(" AND NOT EXISTS (SELECT * FROM ")
        .append(treeTableName)
        .append(" e ")
        .append("WHERE e.AD_Tree_ID=t.AD_Tree_ID AND Node_ID=")
        .append(id)
        .append(")");
    //
    int no = DB.executeUpdateEx(sb.toString(), trxName);
    if (no < 0) {
      log.warn("#" + no + " - AD_Table_ID=" + AD_Table_ID);
      return false;
    }
    log.debug("#" + no + " - AD_Table_ID=" + AD_Table_ID);
    // MigrationLogger.instance.logMigrationSQL(po, sb.toString()); // metas: not needed because
    // it's called directly from PO

    listeners.onNodeInserted(po);

    return true;
  } // insert_Tree
Example #16
0
  /**
   * Crea un contra-movimiento por cada cheque a depositar para efectuar la salida del cheque de la
   * cuenta de cheques en cartera.
   *
   * @throws Exception cuando se produce algún error al crear o procesar el cheque original o el
   *     contra-movimiento.
   */
  private void createReversalChecks() throws Exception {
    MBoletaDepositoLine[] lines = getLines(true);
    // Por cada Cheque asociado a la boleta, se crea un contramovimiento
    // con el importe invertido para realizar la salida del cheque de la cuenta
    // de cheques en cartera.
    for (MBoletaDepositoLine line : lines) {
      MPayment check = line.getPayment();
      MPayment reversalCheck = new MPayment(getCtx(), 0, get_TrxName());
      String error = null;
      PO.copyValues(check, reversalCheck);
      // Se asigna la fecha del contra-movimiento
      reversalCheck.setDateTrx(getDocumentDate());
      reversalCheck.setDateAcct(getDocumentDate());
      reversalCheck.setDueDate(getDocumentDate());
      reversalCheck.setIsReconciled(true); // incidencia 4324 - conciliado con check
      // Se asigna la EC de la boleta
      reversalCheck.setC_BPartner_ID(getC_BPartner_ID());
      // Se invierte el signo del monto del cheque original
      reversalCheck.setPayAmt(check.getPayAmt().negate());
      // Se asigna la organizacion del cheque origen
      reversalCheck.setAD_Org_ID(check.getAD_Org_ID());
      // Se agrega una descripcion
      reversalCheck.addDescription(
          Msg.getMsg(
              getCtx(), "ReversalCheck", new Object[] {check.getDocumentNo(), getDocumentNo()}));

      // FB - Corrección a partir de problema detectado en Intersys
      // Setea el estado a Borrador ya que el copyValues copia el estado
      // del cheque original (Completado) y entonces al completar el
      // reversal el engine ignora esa acción (no se puede completar un
      // documento ya completado) y entonces ejecuta el DocAction guardado
      // en el registro. Normalmente esa acción es CL y por eso no se
      // rompía, pero en Intersys el pago tenía acción RC y quería
      // revertir el reverso, lógica errónea que además tiraba un
      // NullPointerException.
      reversalCheck.setDocStatus(DOCSTATUS_Drafted);
      reversalCheck.setDocAction(DOCACTION_Complete);

      // Se Completa y se cierra el cheque
      if (!reversalCheck.save()) {
        error = CLogger.retrieveErrorAsString();
      } else if (!reversalCheck.processIt(ACTION_Complete)) {
        error = reversalCheck.getProcessMsg();
      } else if (!reversalCheck.processIt(ACTION_Close)) {
        error = reversalCheck.getProcessMsg();
      } else if (!reversalCheck.save()) {
        error = CLogger.retrieveErrorAsString();
      }
      // Si ocurrió un error al procesar se termina la operación de completado.
      if (error != null) {
        throw new Exception(
            "@ReversalCheckProcessError@ (" + reversalCheck.getDocumentNo() + "): " + error);
      }

      // Al cheque original se le asigna la referencia a esta boleta de depósito
      // y se agrega una descripción.
      check.setM_BoletaDeposito_ID(getM_BoletaDeposito_ID());
      check.addDescription(getDepositedDescription());
      check.setIsReconciled(true); // incidencia 4324 - conciliado con reversalCheck
      // Se cierra también el cheque original para que no pueda ser depositado nuevamente.
      if (!check.processIt(ACTION_Close)) {
        error = check.getProcessMsg();
      } else if (!check.save()) {
        error = CLogger.retrieveErrorAsString();
      }
      // Si ocurrió un error al procesar se termina la operación de completado.
      if (error != null) {
        throw new Exception(
            "@OriginalCheckProcessError@ (" + check.getDocumentNo() + "): " + error);
      }

      // Se asigna a la línea de la boleta la referencia al cheque Contra-Movimiento
      line.setC_Reverse_Payment_ID(reversalCheck.getC_Payment_ID());
      if (!line.save()) {
        error = CLogger.retrieveErrorAsString();
        throw new Exception(
            "@BoletaLineSaveError@ (@Check@ " + check.getDocumentNo() + "): " + error);
      }
    }
  }