/** * 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
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; }
/** * 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
/** * 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
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; }
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; } } }
/** * 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
/** * 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
/** * 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); } } }
/** * 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
/** * 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
@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()); }
/** * ************************************************************************ 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
/** * 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); } } }