From d3d7e57cf98f3e49cbb08fd195e0d06300517360 Mon Sep 17 00:00:00 2001 From: Nicolas Micoud Date: Wed, 22 Apr 2020 19:57:42 +0200 Subject: [PATCH 1/8] IDEMPIERE-4245 Set GL Category automatically for GL Journal --- org.adempiere.base/src/org/compiere/model/MJournal.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/org.adempiere.base/src/org/compiere/model/MJournal.java b/org.adempiere.base/src/org/compiere/model/MJournal.java index 5290670a88..8a29d901c6 100644 --- a/org.adempiere.base/src/org/compiere/model/MJournal.java +++ b/org.adempiere.base/src/org/compiere/model/MJournal.java @@ -330,6 +330,9 @@ public class MJournal extends X_GL_Journal implements DocAction } } + if (getGL_Category_ID() == 0 && getC_DocType_ID() > 0) + setGL_Category_ID(MDocType.get(getCtx(), getC_DocType_ID()).getGL_Category_ID()); + // IDEMPIERE-63 // for documents that can be reactivated we cannot allow changing // C_DocTypeTarget_ID or C_DocType_ID if they were already processed and isOverwriteSeqOnComplete From 3ede3738deaadc8942e3897122410aa194ccadff Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 22 Apr 2020 20:17:57 +0200 Subject: [PATCH 2/8] IDEMPIERE-4245 Set GL Category automatically for GL Journal / implement the same in callouts --- .../oracle/202004222017_IDEMPIERE-4245.sql | 15 ++++++++++++ .../202004222017_IDEMPIERE-4245.sql | 12 ++++++++++ .../org/compiere/model/CalloutGLJournal.java | 23 +++++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 migration/i7.1/oracle/202004222017_IDEMPIERE-4245.sql create mode 100644 migration/i7.1/postgresql/202004222017_IDEMPIERE-4245.sql diff --git a/migration/i7.1/oracle/202004222017_IDEMPIERE-4245.sql b/migration/i7.1/oracle/202004222017_IDEMPIERE-4245.sql new file mode 100644 index 0000000000..625e831c11 --- /dev/null +++ b/migration/i7.1/oracle/202004222017_IDEMPIERE-4245.sql @@ -0,0 +1,15 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- IDEMPIERE-4245 Set GL Category automatically for GL Journal +-- Apr 22, 2020, 8:05:30 PM CEST +UPDATE AD_Column SET Callout='org.compiere.model.CalloutGLJournal.docType',Updated=TO_DATE('2020-04-22 20:05:30','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=1625 +; + +-- Apr 22, 2020, 8:16:34 PM CEST +UPDATE AD_Column SET Callout='org.compiere.model.CalloutGLJournal.docType',Updated=TO_DATE('2020-04-22 20:16:34','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=10760 +; + +SELECT register_migration_script('202004222017_IDEMPIERE-4245.sql') FROM dual +; + diff --git a/migration/i7.1/postgresql/202004222017_IDEMPIERE-4245.sql b/migration/i7.1/postgresql/202004222017_IDEMPIERE-4245.sql new file mode 100644 index 0000000000..482c69679f --- /dev/null +++ b/migration/i7.1/postgresql/202004222017_IDEMPIERE-4245.sql @@ -0,0 +1,12 @@ +-- IDEMPIERE-4245 Set GL Category automatically for GL Journal +-- Apr 22, 2020, 8:05:30 PM CEST +UPDATE AD_Column SET Callout='org.compiere.model.CalloutGLJournal.docType',Updated=TO_TIMESTAMP('2020-04-22 20:05:30','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=1625 +; + +-- Apr 22, 2020, 8:16:34 PM CEST +UPDATE AD_Column SET Callout='org.compiere.model.CalloutGLJournal.docType',Updated=TO_TIMESTAMP('2020-04-22 20:16:34','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=10760 +; + +SELECT register_migration_script('202004222017_IDEMPIERE-4245.sql') FROM dual +; + diff --git a/org.adempiere.base.callout/src/org/compiere/model/CalloutGLJournal.java b/org.adempiere.base.callout/src/org/compiere/model/CalloutGLJournal.java index 479e53d29d..17197a06f5 100644 --- a/org.adempiere.base.callout/src/org/compiere/model/CalloutGLJournal.java +++ b/org.adempiere.base.callout/src/org/compiere/model/CalloutGLJournal.java @@ -316,4 +316,27 @@ public class CalloutGLJournal extends CalloutEngine return ""; } + + /** + * Journal - Doc Type + * Set GL Category from C_DocType_ID + * @param ctx context + * @param WindowNo window no + * @param mTab tab + * @param mField field + * @param value value + * @return null or error message + */ + public String docType(Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) + { + if (value == null) + return ""; + + int C_DocType_ID = Env.getContextAsInt(ctx, WindowNo, "C_DocType_ID"); + MDocType dt = MDocType.get (ctx, C_DocType_ID); + mTab.setValue("GL_Category_ID", dt.getGL_Category_ID()); + + return ""; + } + } // CalloutGLJournal From 7e91d03ac0d643dd87af45a93962e1e1988da80d Mon Sep 17 00:00:00 2001 From: Diego Ruiz Date: Wed, 22 Apr 2020 23:32:18 +0200 Subject: [PATCH 3/8] IDEMPIERE-2767 Web Services not working with UUID --- .../org/idempiere/adinterface/ModelADServiceImpl.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/org.idempiere.webservices/WEB-INF/src/org/idempiere/adinterface/ModelADServiceImpl.java b/org.idempiere.webservices/WEB-INF/src/org/idempiere/adinterface/ModelADServiceImpl.java index c541dbb392..6d7c5a80b5 100644 --- a/org.idempiere.webservices/WEB-INF/src/org/idempiere/adinterface/ModelADServiceImpl.java +++ b/org.idempiere.webservices/WEB-INF/src/org/idempiere/adinterface/ModelADServiceImpl.java @@ -410,7 +410,15 @@ public class ModelADServiceImpl extends AbstractService implements ModelADServic } // Validate parameters - modelRunProcess.setADMenuID(validateParameter("AD_Menu_ID", modelRunProcess.getADMenuID())); + try { + modelRunProcess.setADMenuID(validateParameter("AD_Menu_ID", modelRunProcess.getADMenuID())); + } catch(XmlValueOutOfRangeException e) { // Catch the exception when the Process ID is not an Integer + String menuUU = getUUIDValue(modelRunProcess.xgetADMenuID()); + if (menuUU == null) { + throw e; + } + modelRunProcess.setADMenuID(validateParameter("AD_Menu_ID", 0, menuUU)); + } try { modelRunProcess.setADProcessID(validateParameter("AD_Process_ID", modelRunProcess.getADProcessID())); } catch(XmlValueOutOfRangeException e) { // Catch the exception when the Process ID is not an Integer From 281912af4536a9eee4355cfc61fe765fafe2eef5 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 22 Apr 2020 23:32:50 +0200 Subject: [PATCH 4/8] IDEMPIERE-2767 Web Services not working with UUID / peer review - implement the same for ModelGetList AD_Reference_ID --- .../src/org/compiere/model/MRole.java | 5 +++++ .../adinterface/ModelADServiceImpl.java | 18 +++++++++++++----- .../src/org/idempiere/adinterface/Process.java | 14 ++++++++++++-- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/MRole.java b/org.adempiere.base/src/org/compiere/model/MRole.java index 7734595927..2b0519649b 100644 --- a/org.adempiere.base/src/org/compiere/model/MRole.java +++ b/org.adempiere.base/src/org/compiere/model/MRole.java @@ -743,6 +743,9 @@ public final class MRole extends X_AD_Role */ private void loadOrgAccessUser(ArrayList list) { + if (getAD_User_ID() == -1) { + log.severe("Trying to load Org Access from User but user has not been set"); + } PreparedStatement pstmt = null; ResultSet rs = null; String sql = "SELECT * FROM AD_User_OrgAccess " @@ -2784,6 +2787,7 @@ public final class MRole extends X_AD_Role final int AD_User_ID = getAD_User_ID(); if (AD_User_ID < 0) { + log.severe("Trying to load Child Roles but user has not been set"); //throw new IllegalStateException("AD_User_ID is not set"); return ; } @@ -2819,6 +2823,7 @@ public final class MRole extends X_AD_Role final int AD_User_ID = getAD_User_ID(); if (AD_User_ID < 0) { + log.severe("Trying to load Substituted Roles but user has not been set"); //throw new IllegalStateException("AD_User_ID is not set"); return; } diff --git a/org.idempiere.webservices/WEB-INF/src/org/idempiere/adinterface/ModelADServiceImpl.java b/org.idempiere.webservices/WEB-INF/src/org/idempiere/adinterface/ModelADServiceImpl.java index 6d7c5a80b5..f85ea2ba22 100644 --- a/org.idempiere.webservices/WEB-INF/src/org/idempiere/adinterface/ModelADServiceImpl.java +++ b/org.idempiere.webservices/WEB-INF/src/org/idempiere/adinterface/ModelADServiceImpl.java @@ -358,8 +358,8 @@ public class ModelADServiceImpl extends AbstractService implements ModelADServic String tableName = parameterName.substring(0, parameterName.length()-3); StringBuilder sql = new StringBuilder("SELECT "); sql.append(parameterName).append(" FROM ").append(tableName) - .append(" WHERE ").append(tableName).append("_UU=").append(DB.TO_STRING(string)); - return DB.getSQLValue(null, sql.toString()); + .append(" WHERE ").append(tableName).append("_UU=?"); + return DB.getSQLValue(null, sql.toString(), string); } Map requestCtx = getRequestCtx(); @@ -412,7 +412,7 @@ public class ModelADServiceImpl extends AbstractService implements ModelADServic // Validate parameters try { modelRunProcess.setADMenuID(validateParameter("AD_Menu_ID", modelRunProcess.getADMenuID())); - } catch(XmlValueOutOfRangeException e) { // Catch the exception when the Process ID is not an Integer + } catch(XmlValueOutOfRangeException e) { // Catch the exception when the Menu ID is not an Integer String menuUU = getUUIDValue(modelRunProcess.xgetADMenuID()); if (menuUU == null) { throw e; @@ -484,7 +484,15 @@ public class ModelADServiceImpl extends AbstractService implements ModelADServic int roleid = reqlogin.getRoleID(); // Validate parameters - modelGetList.setADReferenceID(validateParameter("AD_Reference_ID", modelGetList.getADReferenceID())); + try { + modelGetList.setADReferenceID(validateParameter("AD_Reference_ID", modelGetList.getADReferenceID())); + } catch(XmlValueOutOfRangeException e) { // Catch the exception when the Reference ID is not an Integer + String refUU = getUUIDValue(modelGetList.xgetADReferenceID()); + if (refUU == null) { + throw e; + } + modelGetList.setADReferenceID(validateParameter("AD_Reference_ID", 0, refUU)); + } modelGetList.setFilter(validateParameter("Filter", modelGetList.getFilter())); int ref_id = modelGetList.getADReferenceID(); @@ -543,7 +551,7 @@ public class ModelADServiceImpl extends AbstractService implements ModelADServic } else if (MReference.VALIDATIONTYPE_TableValidation.equals(ref.getValidationType())) { // Fill values from a reference table - MRole role = new MRole(ctx, roleid, null); + MRole role = MRole.get(ctx, roleid); MRefTable rt = MRefTable.get(ctx, ref_id); if (rt == null || rt.get_ID() == 0) throw new IdempiereServiceFault("Web service type " diff --git a/org.idempiere.webservices/WEB-INF/src/org/idempiere/adinterface/Process.java b/org.idempiere.webservices/WEB-INF/src/org/idempiere/adinterface/Process.java index f49b979afa..052a60cdf8 100644 --- a/org.idempiere.webservices/WEB-INF/src/org/idempiere/adinterface/Process.java +++ b/org.idempiere.webservices/WEB-INF/src/org/idempiere/adinterface/Process.java @@ -74,6 +74,12 @@ public class Process { private static final CLogger log = CLogger.getCLogger(Process.class); + /** + * @param cs + * @param req + * @return + * @deprecated - method not used - will be deleted in future versions + */ public static ProcessParamsDocument getProcessParams( CompiereService cs, GetProcessParamsDocument req ) { ProcessParamsDocument res = ProcessParamsDocument.Factory.newInstance(); @@ -193,11 +199,15 @@ public class Process { RunProcessResponse r= res.addNewRunProcessResponse(); RunProcess rp = req.getRunProcess(); + int AD_Menu_ID = rp.getADMenuID(); int AD_Process_ID = rp.getADProcessID(); int m_record_id = rp.getADRecordID(); - MProcess process = MProcess.get (m_cs.getCtx() , AD_Process_ID); - // need to check if Role can access + MProcess process = null; + if (AD_Menu_ID <= 0 && AD_Process_ID > 0) + process = MProcess.get(m_cs.getCtx(), AD_Process_ID); + else if (AD_Menu_ID > 0 && AD_Process_ID <= 0) + process = MProcess.getFromMenu(m_cs.getCtx(), AD_Menu_ID); if (process == null) { r.setError("Process not found"); From 0b663af8abf580dfe9c04a47346020711734b3e4 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Thu, 23 Apr 2020 00:30:12 +0200 Subject: [PATCH 5/8] IDEMPIERE-4220 payment could not be committed due to wrong invoice date --- org.adempiere.base/src/org/compiere/model/MPayment.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/org.adempiere.base/src/org/compiere/model/MPayment.java b/org.adempiere.base/src/org/compiere/model/MPayment.java index a1af3d15d6..6d9b0f0fcd 100644 --- a/org.adempiere.base/src/org/compiere/model/MPayment.java +++ b/org.adempiere.base/src/org/compiere/model/MPayment.java @@ -2339,6 +2339,10 @@ public class MPayment extends X_C_Payment Msg.translate(getCtx(), "C_Payment_ID") + ": " + getDocumentNo() + " [1]", get_TrxName()); alloc.setAD_Org_ID(getAD_Org_ID()); alloc.setDateAcct(getDateAcct()); // in case date acct is different from datetrx in payment + MInvoice invoice = MInvoice.get(getCtx(), getC_Invoice_ID()); + if (invoice.getDateAcct().after(alloc.getDateAcct())) { + alloc.setDateAcct(invoice.getDateAcct()); + } alloc.saveEx(); MAllocationLine aLine = null; if (isReceipt()) From ffb6388d3c4a684b21a8b4e26314c93acdc48e0b Mon Sep 17 00:00:00 2001 From: Diego Ruiz Date: Thu, 23 Apr 2020 19:28:31 +0200 Subject: [PATCH 6/8] IDEMPIERE-2794 Run process via web services does not validate inactive parameters --- org.adempiere.base/src/org/compiere/model/MProcess.java | 1 + 1 file changed, 1 insertion(+) diff --git a/org.adempiere.base/src/org/compiere/model/MProcess.java b/org.adempiere.base/src/org/compiere/model/MProcess.java index 090e42f0f4..0cd4bc6700 100644 --- a/org.adempiere.base/src/org/compiere/model/MProcess.java +++ b/org.adempiere.base/src/org/compiere/model/MProcess.java @@ -157,6 +157,7 @@ public class MProcess extends X_AD_Process final String whereClause = MProcessPara.COLUMNNAME_AD_Process_ID+"=?"; List list = new Query(getCtx(), I_AD_Process_Para.Table_Name, whereClause, get_TrxName()) .setParameters(get_ID()) + .setOnlyActiveRecords(true) .setOrderBy(MProcessPara.COLUMNNAME_SeqNo) .list(); // From 09d2f9a1e33cacb736c5b92179b9abda2f6c1087 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Thu, 23 Apr 2020 21:08:43 +0200 Subject: [PATCH 7/8] IDEMPIERE-4253 Duplicated FillMandatory message on process dialogs --- .../src/org/adempiere/webui/apps/AbstractProcessDialog.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/AbstractProcessDialog.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/AbstractProcessDialog.java index 288813b913..b17068cd8a 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/AbstractProcessDialog.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/AbstractProcessDialog.java @@ -820,15 +820,15 @@ public abstract class AbstractProcessDialog extends Window implements IProcessUI protected void startProcess() { + if (!parameterPanel.validateParameters()) + return; + if (m_pi.isProcessRunning(parameterPanel.getParameters())) { FDialog.error(getWindowNo(), "ProcessAlreadyRunning"); log.log(Level.WARNING, "Abort process " + m_AD_Process_ID + " because it is already running"); return; } - if (!parameterPanel.validateParameters()) - return; - startProcess0(); } From 7fa724f1eee5d88592ae9101d2b41d902952fbce Mon Sep 17 00:00:00 2001 From: Diego Ruiz Date: Fri, 24 Apr 2020 19:45:39 +0200 Subject: [PATCH 8/8] IDEMPIERE-3611 line with missing mandatory content disappears when save in detail tab --- .../org/adempiere/webui/adwindow/CompositeADTabbox.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/CompositeADTabbox.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/CompositeADTabbox.java index aee6b86eaf..d00a705e40 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/CompositeADTabbox.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/CompositeADTabbox.java @@ -149,9 +149,10 @@ public class CompositeADTabbox extends AbstractADTabbox final IADTabpanel tabPanel = getSelectedDetailADTabpanel(); if (!tabPanel.getGridTab().dataSave(true)) { showLastError(); - } - tabPanel.getGridTab().dataRefreshAll(true, true); - tabPanel.getGridTab().refreshParentTabs(); + } else { + tabPanel.getGridTab().dataRefreshAll(true, true); + tabPanel.getGridTab().refreshParentTabs(); + } } else if (DetailPane.ON_DELETE_EVENT.equals(event.getName())) { onDelete();