From 577859f63e518789805b38fb34fc0c060b909e3c Mon Sep 17 00:00:00 2001 From: hieplq Date: Wed, 1 Jun 2016 13:00:43 +0700 Subject: [PATCH 01/12] IDEMPIERE-3094:Infowindow:Previsius recordSelectedData don't clear before process run --- .../WEB-INF/src/org/adempiere/webui/info/InfoWindow.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java index a07f8948a2..2458d0e090 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/info/InfoWindow.java @@ -1548,7 +1548,8 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL @Override protected void executeQuery() { - prepareTable(); + if (!isRequeryByRunSuccessProcess) + prepareTable(); super.executeQuery(); if (ClientInfo.maxHeight(ClientInfo.SMALL_HEIGHT-1) || ClientInfo.maxWidth(ClientInfo.SMALL_WIDTH-1)) { From 814016b2fc2ba551d5d3901c0be5de90f28c2a61 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Tue, 20 Mar 2018 17:35:43 -0300 Subject: [PATCH 02/12] IDEMPIERE-3660 Improve Packin - allow application on all tenants / manage properly non-readable zip files --- .../pipo/srv/PipoDictionaryService.java | 4 ++++ .../utils/PackInApplicationActivator.java | 19 ++++++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/org.adempiere.pipo/src/org/adempiere/pipo/srv/PipoDictionaryService.java b/org.adempiere.pipo/src/org/adempiere/pipo/srv/PipoDictionaryService.java index 31ad2fcf85..18f79c12d3 100644 --- a/org.adempiere.pipo/src/org/adempiere/pipo/srv/PipoDictionaryService.java +++ b/org.adempiere.pipo/src/org/adempiere/pipo/srv/PipoDictionaryService.java @@ -42,6 +42,10 @@ public class PipoDictionaryService implements IDictionaryService { logger.info("No PackIn Model found"); return; } + if (! packageFile.canRead()) { + logger.severe("Cannot read file " + packageFile.getName()); + return; + } String symbolicName = "org.adempiere.pipo"; if (context != null) symbolicName = context.getBundle().getSymbolicName(); diff --git a/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/PackInApplicationActivator.java b/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/PackInApplicationActivator.java index 5158cd9814..1619cf7b6d 100644 --- a/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/PackInApplicationActivator.java +++ b/org.adempiere.plugin.utils/src/org/adempiere/plugin/utils/PackInApplicationActivator.java @@ -299,7 +299,7 @@ public class PackInApplicationActivator extends AbstractActivator { for (String filePath : filePaths) { File toProcess = new File(filePath.trim()); if (!toProcess.exists()) { - logger.log(Level.SEVERE, filePath + " does not exist"); + addLog(Level.SEVERE, filePath + " does not exist"); continue; } @@ -322,14 +322,14 @@ public class PackInApplicationActivator extends AbstractActivator { } private void processFilePath(File toProcess) { - if (toProcess.isFile()) { + if (toProcess.isFile() && toProcess.canRead()) { if (toProcess.getName().toLowerCase().endsWith(".zip")) filesToProcess.add(toProcess); else { logger.log(Level.SEVERE, toProcess.getName() + " is not a valid .zip file"); return; } - } else if (toProcess.isDirectory()) { + } else if (toProcess.isDirectory() && toProcess.canRead()) { FileFilter filter = new FileFilter() { public boolean accept(File file) { if (file.getName().toUpperCase().endsWith(".ZIP") || file.isDirectory()) @@ -344,17 +344,22 @@ public class PackInApplicationActivator extends AbstractActivator { logger.info("*** Creating list from folder " + toProcess.toString()); found = true; } - if (fileToProcess.isDirectory()) + if (fileToProcess.isDirectory()) { processFilePath(fileToProcess); - else - filesToProcess.add(fileToProcess); + } else { + if (fileToProcess.canRead()) { + filesToProcess.add(fileToProcess); + } else { + addLog(Level.SEVERE, fileToProcess.getName() + " not readable"); + } + } } if (!found) { logger.log(Level.FINE, toProcess.getName() + " does not have .zip files or subfolders"); return; } } else { - logger.log(Level.SEVERE, toProcess.getName() + " not a file or folder"); + addLog(Level.SEVERE, toProcess.getName() + " not a file or folder or not readable"); } } From 75d8fd5ea6e482721704a79ca25044785b07578a Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Tue, 20 Mar 2018 17:38:46 -0300 Subject: [PATCH 03/12] IDEMPIERE-3663 iDempiereLBR requires access to org.compiere.acct.Doc_Order.getCommitmentSalesRelease --- org.adempiere.base/src/org/compiere/acct/Doc_Order.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.adempiere.base/src/org/compiere/acct/Doc_Order.java b/org.adempiere.base/src/org/compiere/acct/Doc_Order.java index 63ad382edb..e62ecb3521 100644 --- a/org.adempiere.base/src/org/compiere/acct/Doc_Order.java +++ b/org.adempiere.base/src/org/compiere/acct/Doc_Order.java @@ -734,7 +734,7 @@ public class Doc_Order extends Doc * @param multiplier 1 for accrual * @return Fact */ - protected static Fact getCommitmentSalesRelease(MAcctSchema as, Doc doc, + public static Fact getCommitmentSalesRelease(MAcctSchema as, Doc doc, BigDecimal Qty, int M_InOutLine_ID, BigDecimal multiplier) { Fact fact = new Fact(doc, as, Fact.POST_Commitment); From 193b7cae1931084d2f98151d1290f3b06b60483c Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Tue, 20 Mar 2018 18:18:07 -0300 Subject: [PATCH 04/12] IDEMPIERE-3662 Error when inserting PO with a LOB mandatory field --- .../src/org/compiere/model/PO.java | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/PO.java b/org.adempiere.base/src/org/compiere/model/PO.java index 3dffa469ab..cee29fd67e 100644 --- a/org.adempiere.base/src/org/compiere/model/PO.java +++ b/org.adempiere.base/src/org/compiere/model/PO.java @@ -2846,7 +2846,8 @@ public abstract class PO if (DisplayType.isLOB(dt)) { lobAdd (value, i, dt); - continue; + if (!p_info.isColumnMandatory(i)) + continue; } // ** add column ** @@ -2885,7 +2886,16 @@ public abstract class PO else if (c == String.class) sqlValues.append (encrypt(i,DB.TO_STRING ((String)value))); else if (DisplayType.isLOB(dt)) - sqlValues.append("null"); // no db dependent stuff here + { + if (p_info.isColumnMandatory(i)) + { + sqlValues.append("''"); // no db dependent stuff here -- at this point value is known to be not null + } + else + { + sqlValues.append("null"); + } + } else sqlValues.append (saveNewSpecial (value, i)); } @@ -2910,7 +2920,17 @@ public abstract class PO if (DisplayType.isLOB(dt)) { - params.add(null); + if (p_info.isColumnMandatory(i)) + { + if (dt == DisplayType.Binary) + params.add(new byte[] {0}); // -- at this point value is known to be not null + else + params.add(""); // -- at this point value is known to be not null + } + else + { + params.add(null); + } } else if (value == null || value.equals (Null.NULL)) { From dcd5e0421ff036a251323a4665afa547abd25e94 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Thu, 22 Mar 2018 10:22:06 -0300 Subject: [PATCH 05/12] IDEMPIERE-3664 New Role - User Assignment --- .../i5.1/oracle/201803221017_IDEMPIERE-3664.sql | 15 +++++++++++++++ .../postgresql/201803221017_IDEMPIERE-3664.sql | 12 ++++++++++++ .../src/org/compiere/model/MRole.java | 2 +- .../src/org/compiere/model/MSysConfig.java | 3 ++- 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 migration/i5.1/oracle/201803221017_IDEMPIERE-3664.sql create mode 100644 migration/i5.1/postgresql/201803221017_IDEMPIERE-3664.sql diff --git a/migration/i5.1/oracle/201803221017_IDEMPIERE-3664.sql b/migration/i5.1/oracle/201803221017_IDEMPIERE-3664.sql new file mode 100644 index 0000000000..74d8baf049 --- /dev/null +++ b/migration/i5.1/oracle/201803221017_IDEMPIERE-3664.sql @@ -0,0 +1,15 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- IDEMPIERE-3664 +-- Mar 22, 2018 10:16:54 AM BRT +INSERT INTO AD_SysConfig (AD_SysConfig_ID,AD_Client_ID,AD_Org_ID,Created,Updated,CreatedBy,UpdatedBy,IsActive,Name,Value,Description,EntityType,ConfigurationLevel,AD_SysConfig_UU) VALUES (200116,0,0,TO_DATE('2018-03-22 10:16:53','YYYY-MM-DD HH24:MI:SS'),TO_DATE('2018-03-22 10:16:53','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','AUTO_ASSIGN_ROLE_TO_CREATOR_USER','N','Defines if a role is assigned to the creator user when creating a new role ','D','S','dc4be8d1-a164-4e6d-8e02-be6c498d1669') +; + +-- Mar 22, 2018 10:17:03 AM BRT +UPDATE AD_SysConfig SET ConfigurationLevel='C',Updated=TO_DATE('2018-03-22 10:17:03','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_SysConfig_ID=200116 +; + +SELECT register_migration_script('201803221017_IDEMPIERE-3664.sql') FROM dual +; + diff --git a/migration/i5.1/postgresql/201803221017_IDEMPIERE-3664.sql b/migration/i5.1/postgresql/201803221017_IDEMPIERE-3664.sql new file mode 100644 index 0000000000..064cb34c56 --- /dev/null +++ b/migration/i5.1/postgresql/201803221017_IDEMPIERE-3664.sql @@ -0,0 +1,12 @@ +-- IDEMPIERE-3664 +-- Mar 22, 2018 10:16:54 AM BRT +INSERT INTO AD_SysConfig (AD_SysConfig_ID,AD_Client_ID,AD_Org_ID,Created,Updated,CreatedBy,UpdatedBy,IsActive,Name,Value,Description,EntityType,ConfigurationLevel,AD_SysConfig_UU) VALUES (200116,0,0,TO_TIMESTAMP('2018-03-22 10:16:53','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2018-03-22 10:16:53','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','AUTO_ASSIGN_ROLE_TO_CREATOR_USER','N','Defines if a role is assigned to the creator user when creating a new role ','D','S','dc4be8d1-a164-4e6d-8e02-be6c498d1669') +; + +-- Mar 22, 2018 10:17:03 AM BRT +UPDATE AD_SysConfig SET ConfigurationLevel='C',Updated=TO_TIMESTAMP('2018-03-22 10:17:03','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_SysConfig_ID=200116 +; + +SELECT register_migration_script('201803221017_IDEMPIERE-3664.sql') FROM dual +; + diff --git a/org.adempiere.base/src/org/compiere/model/MRole.java b/org.adempiere.base/src/org/compiere/model/MRole.java index 2e5fc3d285..7b07d0ba6b 100644 --- a/org.adempiere.base/src/org/compiere/model/MRole.java +++ b/org.adempiere.base/src/org/compiere/model/MRole.java @@ -371,7 +371,7 @@ public final class MRole extends X_AD_Role MUserRoles su = new MUserRoles(getCtx(), SUPERUSER_USER_ID, getAD_Role_ID(), get_TrxName()); su.saveEx(); // Add Role to User - if (getCreatedBy() != SUPERUSER_USER_ID) + if (getCreatedBy() != SUPERUSER_USER_ID && MSysConfig.getBooleanValue(MSysConfig.AUTO_ASSIGN_ROLE_TO_CREATOR_USER, false, getAD_Client_ID())) { MUserRoles ur = new MUserRoles(getCtx(), getCreatedBy(), getAD_Role_ID(), get_TrxName()); ur.saveEx(); diff --git a/org.adempiere.base/src/org/compiere/model/MSysConfig.java b/org.adempiere.base/src/org/compiere/model/MSysConfig.java index e64b48096e..ad9fbaec99 100644 --- a/org.adempiere.base/src/org/compiere/model/MSysConfig.java +++ b/org.adempiere.base/src/org/compiere/model/MSysConfig.java @@ -42,7 +42,7 @@ public class MSysConfig extends X_AD_SysConfig /** * */ - private static final long serialVersionUID = 2617379167881737860L; + private static final long serialVersionUID = -2698648078997788547L; public static final String ADDRESS_VALIDATION = "ADDRESS_VALIDATION"; public static final String ALERT_SEND_ATTACHMENT_AS_XLS = "ALERT_SEND_ATTACHMENT_AS_XLS"; @@ -61,6 +61,7 @@ public class MSysConfig extends X_AD_SysConfig public static final String APPLICATION_OS_INFO_SHOWN = "APPLICATION_OS_INFO_SHOWN"; public static final String APPLICATION_URL = "APPLICATION_URL"; public static final String ATTACH_EMBEDDED_2PACK = "ATTACH_EMBEDDED_2PACK"; + public static final String AUTO_ASSIGN_ROLE_TO_CREATOR_USER = "AUTO_ASSIGN_ROLE_TO_CREATOR_USER"; public static final String AUTOMATIC_PACKIN_FOLDERS = "AUTOMATIC_PACKIN_FOLDERS"; public static final String AUTOMATIC_PACKIN_INITIAL_DELAY = "AUTOMATIC_PACKIN_INITIAL_DELAY"; public static final String AUTOMATIC_PACKIN_PROCESSING = "AUTOMATIC_PACKIN_PROCESSING"; From 47f3ce46b992a3d42c43e52cbfc680df2412891d Mon Sep 17 00:00:00 2001 From: Diego Ruiz Date: Sun, 25 Mar 2018 22:10:26 +0200 Subject: [PATCH 06/12] IDEMPIERE-3666 Set Quick entry called parent --- .../WEB-INF/src/org/adempiere/webui/grid/WQuickEntry.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/grid/WQuickEntry.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/grid/WQuickEntry.java index 1401808269..c5b08e296d 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/grid/WQuickEntry.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/grid/WQuickEntry.java @@ -69,6 +69,7 @@ public class WQuickEntry extends Window implements EventListener, ValueCh private static final long serialVersionUID = -8530102231615195037L; public static final String QUICK_ENTRY_MODE = "_QUICK_ENTRY_MODE_"; + public static final String QUICK_ENTRY_CALLER_WINDOW = "_QUICK_ENTRY_CALLER_WINDOW_"; private static CLogger log = CLogger.getCLogger(WQuickEntry.class); @@ -119,6 +120,7 @@ public class WQuickEntry extends Window implements EventListener, ValueCh } Env.setContext(Env.getCtx(), m_WindowNo, QUICK_ENTRY_MODE, "Y"); + Env.setContext(Env.getCtx(), m_WindowNo, QUICK_ENTRY_CALLER_WINDOW, parent_WindowNo); initPOs(); } // WQuickEntry From e3769972ee07a0674fea48566b7d2a8b1e7ce2dc Mon Sep 17 00:00:00 2001 From: Diego Ruiz Date: Sun, 25 Mar 2018 22:11:09 +0200 Subject: [PATCH 07/12] IDEMPIERE-3667 Callouts not working properly in Quick Entry Windows --- .../org/adempiere/webui/grid/WQuickEntry.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/grid/WQuickEntry.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/grid/WQuickEntry.java index c5b08e296d..3789cc9171 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/grid/WQuickEntry.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/grid/WQuickEntry.java @@ -18,7 +18,6 @@ import java.util.ArrayList; import java.util.List; import java.util.logging.Level; -import org.adempiere.base.Core; import org.adempiere.webui.ClientInfo; import org.adempiere.webui.component.ConfirmPanel; import org.adempiere.webui.component.Label; @@ -34,6 +33,7 @@ import org.adempiere.webui.util.ZKUpdateUtil; import org.adempiere.webui.window.FDialog; import org.compiere.model.GridField; import org.compiere.model.GridTab; +import org.compiere.model.GridTable; import org.compiere.model.GridWindow; import org.compiere.model.MField; import org.compiere.model.MLookup; @@ -66,7 +66,7 @@ public class WQuickEntry extends Window implements EventListener, ValueCh /** * */ - private static final long serialVersionUID = -8530102231615195037L; + private static final long serialVersionUID = -1397302187339942732L; public static final String QUICK_ENTRY_MODE = "_QUICK_ENTRY_MODE_"; public static final String QUICK_ENTRY_CALLER_WINDOW = "_QUICK_ENTRY_CALLER_WINDOW_"; @@ -532,12 +532,16 @@ public class WQuickEntry extends Window implements EventListener, ValueCh WEditor editor = quickEditors.get(idx); GridTab gridTab = field.getGridTab(); String columnName = field.getColumnName(); + GridTable mTable = gridTab.getTableModel(); + int row = gridTab.getCurrentRow(); + int col = mTable.findColumn(columnName); // process dependencies and callouts for the changed field if (evt.getSource() instanceof WLocationEditor && evt.getNewValue() == null && editor.getValue() != null) { // ignore first call of WLocationEditor valuechange set to null // it will be called later with correct value // see WLocationEditor firing twice ValueChangeEvent (first with null and then with value) } else { + mTable.setValueAt(evt.getNewValue(), row, col); field.setValue(evt.getNewValue(), field.getGridTab().getTableModel().isInserting()); gridTab.processFieldChange(field); } @@ -555,12 +559,8 @@ public class WQuickEntry extends Window implements EventListener, ValueCh mLookup.refresh(); } } - } // for all dependent fields - if ( dependants.size() > 0 - || field.getCallout().length() > 0 - || Core.findCallout(gridTab.getTableName(), columnName).size() > 0) { - dynamicDisplay(); - } + } + dynamicDisplay(); } } } @@ -572,8 +572,13 @@ public class WQuickEntry extends Window implements EventListener, ValueCh { for (int idxf = 0; idxf < quickFields.size(); idxf++) { GridField field = quickFields.get(idxf); + GridTab gridTab = field.getGridTab(); + String columnName = field.getColumnName(); + GridTable mTable = gridTab.getTableModel(); + int row = gridTab.getCurrentRow(); + int col = mTable.findColumn(columnName); WEditor editor = quickEditors.get(idxf); - editor.setValue(field.getValue()); + editor.setValue(mTable.getValueAt(row, col)); //In case a callout changed the value and it is not reflected in field yet editor.setReadWrite(field.isEditable(true)); editor.setVisible(field.isDisplayed(true)); } From 3fc53dfb66b87f96264a671ffc3d84b7e1271f58 Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Sun, 1 Apr 2018 11:06:17 +0800 Subject: [PATCH 08/12] IDEMPIERE-3672 Setup fail due to OSGi framework version changed --- org.adempiere.server-feature/setup/configuration/config.ini | 2 +- .../director/configuration/config.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/org.adempiere.server-feature/setup/configuration/config.ini b/org.adempiere.server-feature/setup/configuration/config.ini index 6ed81c32b0..64fe21cce6 100644 --- a/org.adempiere.server-feature/setup/configuration/config.ini +++ b/org.adempiere.server-feature/setup/configuration/config.ini @@ -1,4 +1,4 @@ -osgi.framework=file\:../plugins/org.eclipse.osgi_3.12.50.v20170928-1321.jar +osgi.framework=file\:../plugins/org.eclipse.osgi_3.12.100.v20180210-1608.jar osgi.install.area=setup osgi.bundles=org.eclipse.equinox.ds@1:start,\ org.eclipse.equinox.util,\ diff --git a/org.idempiere.equinox.p2.director-feature/director/configuration/config.ini b/org.idempiere.equinox.p2.director-feature/director/configuration/config.ini index 7af8d700b0..74ef193739 100644 --- a/org.idempiere.equinox.p2.director-feature/director/configuration/config.ini +++ b/org.idempiere.equinox.p2.director-feature/director/configuration/config.ini @@ -1,4 +1,4 @@ -osgi.framework=file\:../plugins/org.eclipse.osgi_3.12.50.v20170928-1321.jar +osgi.framework=file\:../plugins/org.eclipse.osgi_3.12.100.v20180210-1608.jar osgi.install.area=director equinox.use.ds=true osgi.bundles=org.eclipse.core.net@start,\ From deecf48074d78cc5be7f5d1d5db2a5e56037ccf8 Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Thu, 5 Apr 2018 12:19:02 +0800 Subject: [PATCH 09/12] IDEMPIERE-3598 Wrong Product Cost Quantity if receipt quantity <> invoiced quantity --- .../src/org/compiere/acct/Doc_MatchPO.java | 9 +- .../src/org/compiere/model/MMatchPO.java | 118 +++++++++++++++++- 2 files changed, 122 insertions(+), 5 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/acct/Doc_MatchPO.java b/org.adempiere.base/src/org/compiere/acct/Doc_MatchPO.java index 87a48da28b..0d5475dc11 100644 --- a/org.adempiere.base/src/org/compiere/acct/Doc_MatchPO.java +++ b/org.adempiere.base/src/org/compiere/acct/Doc_MatchPO.java @@ -444,9 +444,12 @@ public class Doc_MatchPO extends Doc if (mPO[i].getM_AttributeSetInstance_ID() == mMatchPO.getM_AttributeSetInstance_ID() && mPO[i].getM_MatchPO_ID() != mMatchPO.getM_MatchPO_ID()) { - BigDecimal qty = (isReturnTrx ? mPO[i].getQty().negate() : mPO[i].getQty()); - tQty = tQty.add(qty); - tAmt = tAmt.add(poCost.multiply(qty)); + BigDecimal qty = (isReturnTrx ? mPO[i].getQty().negate() : mPO[i].getQty()); + if (mPO[i].getM_InOutLine_ID() > 0) + { + tQty = tQty.add(qty); + tAmt = tAmt.add(poCost.multiply(qty)); + } } } diff --git a/org.adempiere.base/src/org/compiere/model/MMatchPO.java b/org.adempiere.base/src/org/compiere/model/MMatchPO.java index 44a4e8977c..167c843f76 100644 --- a/org.adempiere.base/src/org/compiere/model/MMatchPO.java +++ b/org.adempiere.base/src/org/compiere/model/MMatchPO.java @@ -515,8 +515,87 @@ public class MMatchPO extends X_M_MatchPO { retValue = new MMatchPO (sLine, dateTrx, qty); retValue.setC_OrderLine_ID(C_OrderLine_ID); - if (iLine != null) - retValue.setC_InvoiceLine_ID(iLine); + MMatchPO otherMatchPO = null; + if (iLine == null) { + MMatchPO[] matchPOs = MMatchPO.getOrderLine(retValue.getCtx(), sLine.getC_OrderLine_ID(), retValue.get_TrxName()); + for (MMatchPO matchPO : matchPOs) + { + if (matchPO.getC_InvoiceLine_ID() > 0 && matchPO.getM_InOutLine_ID() == 0) + { + //m_matchinv not created yet + int cnt = DB.getSQLValueEx(sLine.get_TrxName(), "SELECT Count(*) FROM M_MatchInv WHERE M_InOutLine_ID="+sLine.getM_InOutLine_ID() + +" AND C_InvoiceLine_ID="+ matchPO.getC_InvoiceLine_ID()); + if (cnt <= 0) { + if (!matchPO.isPosted() && matchPO.getQty().compareTo(retValue.getQty()) >=0 ) // greater than or equal quantity + { + otherMatchPO = matchPO; + iLine = new MInvoiceLine(retValue.getCtx(), matchPO.getC_InvoiceLine_ID(), retValue.get_TrxName()); + matchPO.setQty(matchPO.getQty().subtract(retValue.getQty())); + if (matchPO.getQty().signum() == 0 ) + matchPO.deleteEx(true); + else + matchPO.saveEx(); + break; + } + + } + } + } + } + if (iLine != null) { + if (otherMatchPO == null) + retValue.setC_InvoiceLine_ID(iLine); + //auto create matchinv + if (otherMatchPO != null) + { + Savepoint savepoint = null; + Trx trx = null; + try + { + trx = trxName != null ? Trx.get(trxName, false) : null; + savepoint = trx != null ? trx.getConnection().setSavepoint() : null; + MMatchInv matchInv = new MMatchInv(retValue.getCtx(), 0, retValue.get_TrxName()); + matchInv.setC_InvoiceLine_ID(otherMatchPO.getC_InvoiceLine_ID()); + matchInv.setM_Product_ID(retValue.getM_Product_ID()); + matchInv.setM_InOutLine_ID(retValue.getM_InOutLine_ID()); + matchInv.setAD_Client_ID(retValue.getAD_Client_ID()); + matchInv.setAD_Org_ID(retValue.getAD_Org_ID()); + matchInv.setM_AttributeSetInstance_ID(retValue.getM_AttributeSetInstance_ID()); + matchInv.setQty(retValue.getQty()); + matchInv.setDateTrx(dateTrx); + matchInv.setProcessed(true); + if (!matchInv.save()) + { + if (savepoint != null) + { + trx.getConnection().rollback(savepoint); + savepoint = null; + } + else + { + matchInv.delete(true); + } + String msg = "Failed to auto match invoice."; + ValueNamePair error = CLogger.retrieveError(); + if (error != null) + { + msg = msg + " " + error.getName(); + } + s_log.severe(msg); + } + retValue.setMatchInvCreated(matchInv); + } catch (Exception e) { + s_log.log(Level.SEVERE, "Failed to auto match Invoice.", e); + } finally { + if (savepoint != null) + { + try { + trx.getConnection().releaseSavepoint(savepoint); + } catch (Exception e) {} + } + } + } + } if (!retValue.save()) { String msg = "Failed to update match po."; @@ -972,6 +1051,11 @@ public class MMatchPO extends X_M_MatchPO orderLine.setQtyInvoiced(orderLine.getQtyInvoiced().subtract(getQty())); orderLine.setDateInvoiced(getDateTrx()); // overwrite=last } + else if (!newRecord && getC_InvoiceLine_ID() > 0 && is_ValueChanged(COLUMNNAME_Qty)) + { + BigDecimal oldQty = (BigDecimal)(get_ValueOld(COLUMNNAME_Qty)); + orderLine.setQtyInvoiced(orderLine.getQtyInvoiced().subtract(oldQty.subtract(getQty()))); + } // Update Order ASI if full match if (orderLine.getM_AttributeSetInstance_ID() == 0 @@ -1183,6 +1267,36 @@ public class MMatchPO extends X_M_MatchPO this.setDescription("(" + reversal.getDocumentNo() + "<-)"); this.setReversal_ID(reversal.getM_MatchPO_ID()); this.saveEx(); + + // reversal of mr if have both shipment and invoice line + if ( reversal.getM_InOutLine_ID() > 0 && reversal.getC_InvoiceLine_ID() > 0) + { + MMatchPO[] matchPOs = MMatchPO.getOrderLine(reversal.getCtx(), reversal.getC_OrderLine_ID(), reversal.get_TrxName()); + BigDecimal matchQty = getQty(); + for (MMatchPO matchPO : matchPOs) + { + if (matchPO.getReversal_ID() == 0 && !matchPO.isPosted() + && matchPO.getC_InvoiceLine_ID() == reversal.getC_InvoiceLine_ID() + && matchPO.getM_InOutLine_ID() == 0 ) + { + matchPO.setQty(matchPO.getQty().add(matchQty)); + matchPO.saveEx(); + matchQty = BigDecimal.ZERO; + break; + } + } + + if (matchQty.signum() != 0) + { + MMatchPO matchPO = new MMatchPO (getCtx(), 0, get_TrxName()); + PO.copyValues(this, matchPO); + matchPO.setC_InvoiceLine_ID(getC_InvoiceLine_ID()); + matchPO.setM_InOutLine_ID(0); + matchPO.setDescription(null); + matchPO.setPosted (false); + matchPO.saveEx(); + } + } return true; } return false; From 3d675e132cb609cec5d9052635db103a11b16dbd Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Thu, 5 Apr 2018 16:59:14 +0800 Subject: [PATCH 10/12] IDEMPIERE-3670 Schedule process: always recalculate sleep time before start and startAll --- .../org/compiere/server/AdempiereServer.java | 20 +++++++++++++------ .../compiere/server/AdempiereServerMgr.java | 2 ++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServer.java b/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServer.java index 48d442b880..9a94a79bfd 100644 --- a/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServer.java +++ b/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServer.java @@ -117,13 +117,21 @@ public abstract class AdempiereServer implements Runnable } m_sleepMS = 0; m_nextWork = 0; - - Timestamp lastRun = new Timestamp(System.currentTimeMillis()); - m_nextWork = MSchedule.getNextRunMS(lastRun.getTime(), - p_model.getScheduleType(), p_model.getFrequencyType(), - p_model.getFrequency(), p_model.getCronPattern()); + Timestamp dateNextRun = getDateNextRun(true); + Timestamp now = new Timestamp(System.currentTimeMillis()); + if (dateNextRun != null) + { + m_nextWork = dateNextRun.getTime(); + } + else + { + m_nextWork = MSchedule.getNextRunMS(now.getTime(), + p_model.getScheduleType(), p_model.getFrequencyType(), + p_model.getFrequency(), p_model.getCronPattern()); + } - m_sleepMS = m_nextWork - lastRun.getTime(); + if (m_nextWork > now.getTime()) + m_sleepMS = m_nextWork - now.getTime(); if (log.isLoggable(Level.INFO)) log.info(" Next run: " + new Timestamp(m_nextWork) + " sleep " + m_sleepMS); // p_model.setDateNextRun(new Timestamp(m_nextWork)); diff --git a/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServerMgr.java b/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServerMgr.java index f4c27ff1c2..e6d4ae084a 100644 --- a/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServerMgr.java +++ b/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServerMgr.java @@ -176,6 +176,7 @@ public class AdempiereServerMgr implements ServiceTrackerCustomizer Date: Fri, 6 Apr 2018 13:41:13 +0800 Subject: [PATCH 11/12] IDEMPIERE-3670 Schedule process: always recalculate sleep time before start and startAll. Fix context is lost error. --- .../server/org/compiere/server/AdempiereServerMgr.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServerMgr.java b/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServerMgr.java index e6d4ae084a..2065ae7f6e 100644 --- a/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServerMgr.java +++ b/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServerMgr.java @@ -227,6 +227,7 @@ public class AdempiereServerMgr implements ServiceTrackerCustomizer