From 80acb075a8291edd8102115d79674ee23aacc424 Mon Sep 17 00:00:00 2001 From: Murilo Habermann Torquato Date: Fri, 5 Jan 2018 15:38:49 +0100 Subject: [PATCH 01/21] IDEMPIERE-3518 Improvement For Mobile Compatibility --- .../adempiere/webui/adwindow/ADTabpanel.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java index 71c8e80c0e..5afcb431c5 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java @@ -484,9 +484,13 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer decimalFormat.setRoundingMode(RoundingMode.DOWN); String columnWidth = decimalFormat.format(equalWidth); - for (int h=0;h numCols && diff > 0) + if (xpos + columnSpan > numCols && diff > 0) { xpos = xpos - diff; if (xpos <= 0) @@ -613,10 +619,16 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer if (xpos-1 - actualxpos > 0) row.appendCellChild(createSpacer(), xpos-1 - actualxpos); boolean paintLabel = ! (field.getDisplayType() == DisplayType.Button || field.getDisplayType() == DisplayType.YesNo || field.isFieldOnly()); + + // Adjust column spam to the remain columns size + int remainCols = numCols - actualxpos; + if (columnSpan > remainCols) + columnSpan = remainCols-1 > 0 ? remainCols-1 : 1; + if (field.isHeading()) actualxpos = xpos; else - actualxpos = xpos + field.getColumnSpan()-1 + (paintLabel ? 1 : 0); + actualxpos = xpos + columnSpan-1 + (paintLabel ? 1 : 0); if (! field.isHeading()) { @@ -645,7 +657,8 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer div.appendChild(label.getDecorator()); row.appendCellChild(div,1); } - row.appendCellChild(editor.getComponent(), field.getColumnSpan()); + + row.appendCellChild(editor.getComponent(), columnSpan ); //to support float/absolute editor row.getLastCell().setStyle("position: relative; overflow: visible;"); From 3c10b2c455a071a3d98bf36b3c1b6206ea708459 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Mon, 8 Jan 2018 15:24:23 +0100 Subject: [PATCH 02/21] IDEMPIERE-3604 improve error messages when process access rights are not set / IDEMPIERE-1920 --- .../src/org/compiere/process/CopyRole.java | 3 +-- .../src/org/compiere/model/MPInstance.java | 12 ++++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/org.adempiere.base.process/src/org/compiere/process/CopyRole.java b/org.adempiere.base.process/src/org/compiere/process/CopyRole.java index 4b5ba2d7aa..12846a9f44 100755 --- a/org.adempiere.base.process/src/org/compiere/process/CopyRole.java +++ b/org.adempiere.base.process/src/org/compiere/process/CopyRole.java @@ -26,7 +26,6 @@ import org.compiere.model.I_AD_Role_Included; import org.compiere.model.MRole; import org.compiere.util.DB; import org.compiere.util.Env; -import org.compiere.util.Msg; /** @@ -76,7 +75,7 @@ public class CopyRole extends SvrProcess protected String doIt() throws Exception { if (! MRole.getDefault().isAccessAdvanced()) { - throw new AdempiereException(Msg.getMsg(getCtx(), "CannotAccessProcess", new Object[] {getProcessInfo().getAD_Process_ID(), MRole.getDefault().getName()})); + return "@Error@ @Advanced@ @Process@"; } if (m_AD_Role_ID_From == m_AD_Role_ID_To) diff --git a/org.adempiere.base/src/org/compiere/model/MPInstance.java b/org.adempiere.base/src/org/compiere/model/MPInstance.java index 45c81d03ad..29f10cb426 100644 --- a/org.adempiere.base/src/org/compiere/model/MPInstance.java +++ b/org.adempiere.base/src/org/compiere/model/MPInstance.java @@ -32,6 +32,7 @@ import org.adempiere.base.event.EventManager; import org.compiere.util.CLogger; import org.compiere.util.DB; import org.compiere.util.Env; +import org.compiere.util.Language; import org.compiere.util.Msg; import org.idempiere.distributed.IMessageService; import org.idempiere.distributed.ITopic; @@ -219,8 +220,15 @@ public class MPInstance extends X_AD_PInstance { MRole role = MRole.get(getCtx(), AD_Role_ID); Boolean access = role.getProcessAccess(AD_Process_ID); - if (access == null || !access.booleanValue()) - throw new IllegalStateException(Msg.getMsg(getCtx(), "CannotAccessProcess", new Object[] {AD_Process_ID, role.getName()})); + if (access == null || !access.booleanValue()) { + MProcess proc = MProcess.get(getCtx(), AD_Process_ID); + StringBuilder procMsg = new StringBuilder("["); + if (! Language.isBaseLanguage (Env.getAD_Language(getCtx()))) { + procMsg.append(proc.get_Translation("Name")).append(" / "); + } + procMsg.append(proc.getName()).append("]"); + throw new IllegalStateException(Msg.getMsg(getCtx(), "CannotAccessProcess", new Object[] {procMsg.toString(), role.getName()})); + } } super.setAD_Process_ID (AD_Process_ID); } // setAD_Process_ID From a96a27c12aeed5855a63b8994033698d08e424b1 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Mon, 8 Jan 2018 17:11:42 +0100 Subject: [PATCH 03/21] IDEMPIERE-3603 checking permission on doctype instead of doctypetarge --- .../src/org/adempiere/webui/panel/WDocActionPanel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/WDocActionPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/WDocActionPanel.java index 04311db92c..862490f798 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/WDocActionPanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/WDocActionPanel.java @@ -178,9 +178,9 @@ public class WDocActionPanel extends Window implements EventListener, Dia index = ((DocOptions) po).customizeValidActions(DocStatus, Processing, OrderType, IsSOTrx, m_AD_Table_ID, docActionHolder, options, index); - Integer doctypeId = (Integer)gridTab.getValue("C_DocType_ID"); + Integer doctypeId = (Integer)gridTab.getValue("C_DocTypeTarget_ID"); if(doctypeId==null || doctypeId.intValue()==0){ - doctypeId = (Integer)gridTab.getValue("C_DocTypeTarget_ID"); + doctypeId = (Integer)gridTab.getValue("C_DocType_ID"); } if (doctypeId == null && MAllocationHdr.Table_ID == m_AD_Table_ID) { doctypeId = MDocType.getDocType(MDocType.DOCBASETYPE_PaymentAllocation); From 0e6ff739b3e24d6029c3325020825becddb91783 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Mon, 8 Jan 2018 18:56:47 +0100 Subject: [PATCH 04/21] IDEMPIERE-3136 copyjars is not working from Run as ... ant task in eclipse --- org.adempiere.sdk-feature/materialize.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/org.adempiere.sdk-feature/materialize.properties b/org.adempiere.sdk-feature/materialize.properties index 04230296ea..448bdfa156 100644 --- a/org.adempiere.sdk-feature/materialize.properties +++ b/org.adempiere.sdk-feature/materialize.properties @@ -14,21 +14,21 @@ url.maven2.lib=http://central.maven.org url.maven.zkoss=http://mavensync.zkoss.org url.maven.zkoss.lib=http://mavensync.zkoss.org -url.zkoss.osgi=${local.repository.root}/jarfile/zk-p2/zk-8.0.2.2/ +url.zkoss.osgi=http://downloads.sourceforge.net/project/idempiere/binary.file/jarfile/zk-p2/zk-8.0.2.2/ url.equinox=http://download.eclipse.org/eclipse/updates/4.7 url.jetty=http://download.eclipse.org/jetty/updates/jetty-bundles-9.x url.orbit=http://download.eclipse.org/tools/orbit/downloads/drops/R20170919201930/repository/ -url.file.srv=${local.repository.root} +url.file.srv=http://downloads.sourceforge.net/project/idempiere/binary.file url.restlet.p2=http://p2.restlet.com/2.3 -url.modify.bundle=${local.repository.root}/jarfile/modifyBundle-1.0.0 +url.modify.bundle=http://downloads.sourceforge.net/project/idempiere/binary.file/jarfile/modifyBundle-1.0.0 -url.file.jp.lib=${local.repository.root}/jarfile/jp-6.3.1 +url.file.jp.lib=http://downloads.sourceforge.net/project/idempiere/binary.file/jarfile/jp-6.3.1 -url.jp.p2=${local.repository.root}/jarfile/jp-p2/jp-6.3.1 +url.jp.p2=http://downloads.sourceforge.net/project/idempiere/binary.file/jarfile/jp-p2/jp-6.3.1 url.alpn.boot=http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.11.v20170118/alpn-boot-8.1.11.v20170118.jar From 0ec3576fe28f314616e1905dab1602c86d8e2ce6 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Mon, 8 Jan 2018 21:58:22 +0100 Subject: [PATCH 05/21] IDEMPIERE-3599 allow DocActions to be selected in a more flexible way --- .../adempiere/base/event/IEventTopics.java | 3 ++ .../compiere/process/DocActionEventData.java | 33 +++++++++++++++++++ .../org/compiere/process/DocumentEngine.java | 27 ++++++++++++++- .../src/org/compiere/grid/ed/VDocAction.java | 7 +--- .../webui/panel/WDocActionPanel.java | 7 +--- 5 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 org.adempiere.base/src/org/compiere/process/DocActionEventData.java diff --git a/org.adempiere.base/src/org/adempiere/base/event/IEventTopics.java b/org.adempiere.base/src/org/adempiere/base/event/IEventTopics.java index 990590cead..7a2287c8f2 100644 --- a/org.adempiere.base/src/org/adempiere/base/event/IEventTopics.java +++ b/org.adempiere.base/src/org/adempiere/base/event/IEventTopics.java @@ -91,6 +91,9 @@ public interface IEventTopics { public static final String PREF_AFTER_LOAD = "adempiere/pref/afterLoad"; + /** Called after next document actions are set */ + public static final String DOCACTION = "adempiere/docAction"; + public static final String BROADCAST_MESSAGE = "idempiere/broadcastMsg"; public static final String REQUEST_SEND_EMAIL = "idempiere/requestSendEMail"; diff --git a/org.adempiere.base/src/org/compiere/process/DocActionEventData.java b/org.adempiere.base/src/org/compiere/process/DocActionEventData.java new file mode 100644 index 0000000000..5d54f8f4d4 --- /dev/null +++ b/org.adempiere.base/src/org/compiere/process/DocActionEventData.java @@ -0,0 +1,33 @@ +package org.compiere.process; + +import java.util.ArrayList; +import java.util.concurrent.atomic.AtomicInteger; + +import org.compiere.model.PO; + +public class DocActionEventData { + + public String docStatus; + public Object processing; + public String orderType; + public String isSOTrx; + public int AD_Table_ID; + public ArrayList docAction; + public ArrayList options; + public AtomicInteger indexObj; + public PO po; + + public DocActionEventData(String docStatus, Object processing, String orderType, String isSOTrx, + int AD_Table_ID, ArrayList docAction, ArrayList options, AtomicInteger indexObj, PO po) { + this.docStatus = docStatus; + this.processing = processing; + this.orderType = orderType; + this.isSOTrx = isSOTrx; + this.AD_Table_ID = AD_Table_ID; + this.docAction = docAction; + this.options = options; + this.indexObj = indexObj; + this.po = po; + } + +} diff --git a/org.adempiere.base/src/org/compiere/process/DocumentEngine.java b/org.adempiere.base/src/org/compiere/process/DocumentEngine.java index 79269bb6fe..e86b21c651 100644 --- a/org.adempiere.base/src/org/compiere/process/DocumentEngine.java +++ b/org.adempiere.base/src/org/compiere/process/DocumentEngine.java @@ -22,9 +22,14 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Properties; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; +import org.adempiere.base.event.EventManager; +import org.adempiere.base.event.EventProperty; +import org.adempiere.base.event.IEventTopics; import org.adempiere.exceptions.AdempiereException; import org.compiere.acct.Doc; import org.compiere.model.MAcctSchema; @@ -55,6 +60,7 @@ import org.eevolution.model.I_DD_Order; import org.eevolution.model.I_HR_Process; import org.eevolution.model.I_PP_Cost_Collector; import org.eevolution.model.I_PP_Order; +import org.osgi.service.event.Event; /** * Document Action Engine @@ -907,7 +913,7 @@ public class DocumentEngine implements DocAction * @return Number of valid options */ public static int getValidActions(String docStatus, Object processing, - String orderType, String isSOTrx, int AD_Table_ID, String[] docAction, String[] options, boolean periodOpen) + String orderType, String isSOTrx, int AD_Table_ID, String[] docAction, String[] options, boolean periodOpen, PO po) { if (options == null) throw new IllegalArgumentException("Option array parameter is null"); @@ -1214,6 +1220,25 @@ public class DocumentEngine implements DocAction options[index++] = DocumentEngine.ACTION_Void; } } + + if (po instanceof DocOptions) + index = ((DocOptions) po).customizeValidActions(docStatus, processing, orderType, isSOTrx, + AD_Table_ID, docAction, options, index); + + AtomicInteger indexObj = new AtomicInteger(index); + ArrayList docActionsArray = new ArrayList(Arrays.asList(docAction)); + ArrayList optionsArray = new ArrayList(Arrays.asList(options)); + DocActionEventData eventData = new DocActionEventData(docStatus, processing, orderType, isSOTrx, AD_Table_ID, docActionsArray, optionsArray, indexObj, po); + Event event = EventManager.newEvent(IEventTopics.DOCACTION, + new EventProperty(EventManager.EVENT_DATA, eventData), + new EventProperty("tableName", po.get_TableName())); + EventManager.getInstance().sendEvent(event); + index = indexObj.get(); + for (int i = 0; i < optionsArray.size(); i++) + options[i] = optionsArray.get(i); + for (int i = 0; i < docActionsArray.size(); i++) + docAction[i] = docActionsArray.get(i); + return index; } diff --git a/org.adempiere.ui.swing/src/org/compiere/grid/ed/VDocAction.java b/org.adempiere.ui.swing/src/org/compiere/grid/ed/VDocAction.java index 0ae4145f39..5b0e30b97e 100644 --- a/org.adempiere.ui.swing/src/org/compiere/grid/ed/VDocAction.java +++ b/org.adempiere.ui.swing/src/org/compiere/grid/ed/VDocAction.java @@ -42,7 +42,6 @@ import org.compiere.model.MProduction; import org.compiere.model.MTable; import org.compiere.model.PO; import org.compiere.process.DocAction; -import org.compiere.process.DocOptions; import org.compiere.process.DocumentEngine; import org.compiere.swing.CComboBox; import org.compiere.swing.CDialog; @@ -245,11 +244,7 @@ public class VDocAction extends CDialog String[] docActionHolder = new String[] {DocAction}; index = DocumentEngine.getValidActions(DocStatus, Processing, OrderType, IsSOTrx, m_AD_Table_ID, - docActionHolder, options, periodOpen); - - if (po instanceof DocOptions) - index = ((DocOptions) po).customizeValidActions(DocStatus, Processing, OrderType, IsSOTrx, - m_AD_Table_ID, docActionHolder, options, index); + docActionHolder, options, periodOpen, po); Integer doctypeId = (Integer)m_mTab.getValue("C_DocType_ID"); if(doctypeId==null || doctypeId.intValue()==0){ diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/WDocActionPanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/WDocActionPanel.java index 862490f798..051df322c4 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/WDocActionPanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/WDocActionPanel.java @@ -46,7 +46,6 @@ import org.compiere.model.MProduction; import org.compiere.model.MTable; import org.compiere.model.PO; import org.compiere.process.DocAction; -import org.compiere.process.DocOptions; import org.compiere.process.DocumentEngine; import org.compiere.util.CLogger; import org.compiere.util.DB; @@ -172,11 +171,7 @@ public class WDocActionPanel extends Window implements EventListener, Dia String[] docActionHolder = new String[]{DocAction}; index = DocumentEngine.getValidActions(DocStatus, Processing, OrderType, IsSOTrx, - m_AD_Table_ID, docActionHolder, options, periodOpen); - - if (po instanceof DocOptions) - index = ((DocOptions) po).customizeValidActions(DocStatus, Processing, OrderType, IsSOTrx, - m_AD_Table_ID, docActionHolder, options, index); + m_AD_Table_ID, docActionHolder, options, periodOpen, po); Integer doctypeId = (Integer)gridTab.getValue("C_DocTypeTarget_ID"); if(doctypeId==null || doctypeId.intValue()==0){ From a384c3f0edda05ce32465e8fa5d6ad21fa832ddb Mon Sep 17 00:00:00 2001 From: hieplq Date: Tue, 9 Jan 2018 21:41:50 +0700 Subject: [PATCH 06/21] IDEMPIERE-2825 - Pluggable product pricing --- org.adempiere.base/build.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.adempiere.base/build.properties b/org.adempiere.base/build.properties index 1c58047ed2..495b62c82b 100644 --- a/org.adempiere.base/build.properties +++ b/org.adempiere.base/build.properties @@ -22,7 +22,7 @@ bin.includes = META-INF/,\ OSGI-INF/defaultaddressvalidationfactory.xml,\ OSGI-INF/defaulttaxproviderfactory.xml,\ OSGI-INF/addressvalidationeventhandler.xml,\ - OSGI-INF/defaultproductpricingfactory.xml\ + OSGI-INF/defaultproductpricingfactory.xml,\ schema/,\ bsh-2.0b6.jar,\ commons-validator-1.6.jar From cf4bec058f1a2d915bbca0bc1bb4af37b2637eab Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 10 Jan 2018 14:42:32 +0100 Subject: [PATCH 07/21] IDEMPIERE-3600 The ProductInfo Toolbar button can not be accessed through master roles --- .../src/org/compiere/model/MRole.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/MRole.java b/org.adempiere.base/src/org/compiere/model/MRole.java index fc18c48743..2e5fc3d285 100644 --- a/org.adempiere.base/src/org/compiere/model/MRole.java +++ b/org.adempiere.base/src/org/compiere/model/MRole.java @@ -3174,9 +3174,26 @@ public final class MRole extends X_AD_Role + "WHERE AD_Table_ID = ? " + " AND iw.IsActive = 'Y' " + " AND iwa.IsActive = 'Y' " - + " AND iwa.AD_Role_ID = ?"; - int cnt = DB.getSQLValueEx(null, sql, I_M_Product.Table_ID, getAD_Role_ID()); + + " AND (iwa.AD_Role_ID = ? OR iwa.AD_Role_ID IN" + + " (SELECT ri.Included_Role_ID FROM AD_Role_Included ri WHERE ri.IsActive='Y' AND ri.AD_Role_ID=?))"; + int cnt = DB.getSQLValueEx(get_TrxName(), sql, I_M_Product.Table_ID, getAD_Role_ID(), getAD_Role_ID()); m_canAccess_Info_Product = new Boolean(cnt > 0); + + // Verify if is excluded in the specific role (it can be allowed in included role and inactive in specific role) + if (m_canAccess_Info_Product) { + String sqlInactive = "" + + "SELECT COUNT(*) " + + "FROM AD_InfoWindow iw " + + " JOIN AD_InfoWindow_Access iwa " + + " ON ( iwa.AD_InfoWindow_ID = iw.AD_InfoWindow_ID ) " + + "WHERE AD_Table_ID = ? " + + " AND iw.IsActive = 'Y' " + + " AND iwa.IsActive = 'N' " + + " AND iwa.AD_Role_ID = ?"; + int cntInactive = DB.getSQLValueEx(get_TrxName(), sqlInactive, I_M_Product.Table_ID, getAD_Role_ID()); + if (cntInactive > 0) + m_canAccess_Info_Product = new Boolean(false); + } } return m_canAccess_Info_Product.booleanValue(); } From 6085b864e3e4fe850af473ce8c5152c82877e067 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 10 Jan 2018 20:51:00 +0100 Subject: [PATCH 08/21] IDEMPIERE-3610 NPE setting default NULL for Sales Order Line > Quantity --- .../src/org/compiere/model/CalloutOrder.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/org.adempiere.base.callout/src/org/compiere/model/CalloutOrder.java b/org.adempiere.base.callout/src/org/compiere/model/CalloutOrder.java index 36ef208b32..969e4d0a60 100644 --- a/org.adempiere.base.callout/src/org/compiere/model/CalloutOrder.java +++ b/org.adempiere.base.callout/src/org/compiere/model/CalloutOrder.java @@ -833,6 +833,8 @@ public class CalloutOrder extends CalloutEngine if (product.isStocked() && Env.getContext(ctx, WindowNo, "IsDropShip").equals("N")) { BigDecimal QtyOrdered = (BigDecimal)mTab.getValue("QtyOrdered"); + if (QtyOrdered == null) + QtyOrdered = Env.ZERO; int M_Warehouse_ID = Env.getContextAsInt(ctx, WindowNo, "M_Warehouse_ID"); int M_AttributeSetInstance_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "M_AttributeSetInstance_ID"); BigDecimal available = MStorageReservation.getQtyAvailable @@ -1036,7 +1038,11 @@ public class CalloutOrder extends CalloutEngine BigDecimal QtyEntered, QtyOrdered, PriceEntered, PriceActual, PriceLimit, Discount, PriceList; // get values QtyEntered = (BigDecimal)mTab.getValue("QtyEntered"); + if (QtyEntered == null) + QtyEntered = Env.ZERO; QtyOrdered = (BigDecimal)mTab.getValue("QtyOrdered"); + if (QtyOrdered == null) + QtyOrdered = Env.ZERO; if (log.isLoggable(Level.FINE)) log.fine("QtyEntered=" + QtyEntered + ", Ordered=" + QtyOrdered + ", UOM=" + C_UOM_To_ID); // PriceEntered = (BigDecimal)mTab.getValue("PriceEntered"); From 8bf585c343c7d40a8a5550adb68312936855dd26 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Thu, 11 Jan 2018 06:44:00 +0100 Subject: [PATCH 09/21] IDEMPIERE-3608 Unable to run sign.database.build configuration / thanks to David Podhola --- org.adempiere.base-feature/sign.database.build.launch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/org.adempiere.base-feature/sign.database.build.launch b/org.adempiere.base-feature/sign.database.build.launch index 864c5de172..87719eb972 100644 --- a/org.adempiere.base-feature/sign.database.build.launch +++ b/org.adempiere.base-feature/sign.database.build.launch @@ -20,8 +20,8 @@ - - + + From 80d831f4868790b7a79597a17d3575a7d2d603ca Mon Sep 17 00:00:00 2001 From: Nicolas Micoud Date: Thu, 11 Jan 2018 06:59:02 +0100 Subject: [PATCH 10/21] IDEMPIERE-3589 Add a 'Warning' Message --- migration/i5.1/oracle/201712290930_IDEMPIERE-3589.sql | 10 ++++++++++ .../i5.1/postgresql/201712290930_IDEMPIERE-3589.sql | 7 +++++++ 2 files changed, 17 insertions(+) create mode 100644 migration/i5.1/oracle/201712290930_IDEMPIERE-3589.sql create mode 100644 migration/i5.1/postgresql/201712290930_IDEMPIERE-3589.sql diff --git a/migration/i5.1/oracle/201712290930_IDEMPIERE-3589.sql b/migration/i5.1/oracle/201712290930_IDEMPIERE-3589.sql new file mode 100644 index 0000000000..50addd5031 --- /dev/null +++ b/migration/i5.1/oracle/201712290930_IDEMPIERE-3589.sql @@ -0,0 +1,10 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- IDEMPIERE-3589 Add a 'Warning' Message +-- Dec 29, 2017 9:22:30 AM CET +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('I','Warning',0,0,'Y',TO_DATE('2017-12-29 09:22:30','YYYY-MM-DD HH24:MI:SS'),0,TO_DATE('2017-12-29 09:22:30','YYYY-MM-DD HH24:MI:SS'),0,200442,'Warning','D','ef025d76-6391-4a0c-88c0-64d12196b53e') +; + +SELECT register_migration_script('201712290930_IDEMPIERE-3589.sql') FROM dual +; \ No newline at end of file diff --git a/migration/i5.1/postgresql/201712290930_IDEMPIERE-3589.sql b/migration/i5.1/postgresql/201712290930_IDEMPIERE-3589.sql new file mode 100644 index 0000000000..3919d3f0c5 --- /dev/null +++ b/migration/i5.1/postgresql/201712290930_IDEMPIERE-3589.sql @@ -0,0 +1,7 @@ +-- IDEMPIERE-3589 Add a 'Warning' Message +-- Dec 29, 2017 9:22:30 AM CET +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('I','Warning',0,0,'Y',TO_TIMESTAMP('2017-12-29 09:22:30','YYYY-MM-DD HH24:MI:SS'),0,TO_TIMESTAMP('2017-12-29 09:22:30','YYYY-MM-DD HH24:MI:SS'),0,200442,'Warning','D','ef025d76-6391-4a0c-88c0-64d12196b53e') +; + +SELECT register_migration_script('201712290930_IDEMPIERE-3589.sql') FROM dual +; \ No newline at end of file From 3136d8cda37d8d848a05b541cd5c44cdfdd7ba15 Mon Sep 17 00:00:00 2001 From: z5k1 Date: Sun, 17 Dec 2017 20:57:43 +0800 Subject: [PATCH 11/21] IDEMPIERE-3581 XB0001 Address Line Reverse display improvement in Location field --- org.adempiere.base/src/org/compiere/model/MLocation.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/MLocation.java b/org.adempiere.base/src/org/compiere/model/MLocation.java index dc1c07da68..0bc10af293 100644 --- a/org.adempiere.base/src/org/compiere/model/MLocation.java +++ b/org.adempiere.base/src/org/compiere/model/MLocation.java @@ -537,7 +537,7 @@ public class MLocation extends X_C_Location implements Comparator if (isAddressLinesReverse()) { // City, Region, Postal - retStr.append(", ").append(parseCRP (getCountry())); + retStr.append(parseCRP (getCountry())); if (getAddress5() != null && getAddress5().length() > 0) retStr.append(", ").append(getAddress5()); if (getAddress4() != null && getAddress4().length() > 0) @@ -547,7 +547,7 @@ public class MLocation extends X_C_Location implements Comparator if (getAddress2() != null && getAddress2().length() > 0) retStr.append(", ").append(getAddress2()); if (getAddress1() != null) - retStr.append(getAddress1()); + retStr.append(", ").append(getAddress1()); } else { @@ -564,6 +564,7 @@ public class MLocation extends X_C_Location implements Comparator // City, Region, Postal retStr.append(", ").append(parseCRP (getCountry())); // Add Country would come here + // retStr.append(", ").append(getCountry()); } return retStr.toString(); } // toString From 016549fb6c66c4cdeff652aaa09661a1c39e8cb7 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Thu, 11 Jan 2018 07:31:22 +0100 Subject: [PATCH 12/21] IDEMPIERE-3572 "New Record" button in Info Windows does not work properly --- .../WEB-INF/src/org/adempiere/webui/info/InfoWindow.java | 2 +- 1 file changed, 1 insertion(+), 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 5efb339240..c86497b048 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 @@ -2164,7 +2164,7 @@ public class InfoWindow extends InfoPanel implements ValueChangeListener, EventL vqe.loadRecord (0); - final ISupportMask parent = LayoutUtils.showWindowWithMask(vqe, this, LayoutUtils.OVERLAP_TAB_PANEL); + final ISupportMask parent = LayoutUtils.showWindowWithMask(vqe, this, LayoutUtils.OVERLAP_SELF); vqe.addEventListener(DialogEvents.ON_WINDOW_CLOSE, new EventListener() { @Override From baa44f138f58438cc52009971153ff019b6e7342 Mon Sep 17 00:00:00 2001 From: Diego Ruiz Date: Thu, 11 Jan 2018 19:15:30 +0100 Subject: [PATCH 13/21] IDEMPIERE-3529 - Add parameters to InvoicePrint process --- .../oracle/201801111909_IDEMPIERE-3529.sql | 22 ++++++++++ .../201801111909_IDEMPIERE-3529.sql | 19 +++++++++ .../adempiere/webui/process/InvoicePrint.java | 41 ++++++++++++++++++- 3 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 migration/i5.1/oracle/201801111909_IDEMPIERE-3529.sql create mode 100644 migration/i5.1/postgresql/201801111909_IDEMPIERE-3529.sql diff --git a/migration/i5.1/oracle/201801111909_IDEMPIERE-3529.sql b/migration/i5.1/oracle/201801111909_IDEMPIERE-3529.sql new file mode 100644 index 0000000000..623bdedebf --- /dev/null +++ b/migration/i5.1/oracle/201801111909_IDEMPIERE-3529.sql @@ -0,0 +1,22 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- IDEMPIERE-3529 Add parameters to InvoicePrint process +-- Jan 11, 2018 7:02:29 PM CET +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,AD_Reference_Value_ID,IsRange,FieldLength,IsMandatory,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,AD_Process_Para_UU,IsEncrypted) VALUES (200222,0,0,'Y',TO_DATE('2018-01-11 19:02:28','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2018-01-11 19:02:28','YYYY-MM-DD HH24:MI:SS'),100,'Printed','Indicates if this document / line is printed','The Printed checkbox indicates if this document or line will included when printing.',200,80,17,319,'N',0,'N','IsPrinted','Y','D',399,'24d72545-9015-4b87-921d-7de97eaa5079','N') +; + +-- Jan 11, 2018 7:03:51 PM CET +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,AD_Process_Para_UU,IsEncrypted) VALUES (200223,0,0,'Y',TO_DATE('2018-01-11 19:03:50','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2018-01-11 19:03:50','YYYY-MM-DD HH24:MI:SS'),100,'Payment Rule','How you pay the invoice','The Payment Rule indicates the method of invoice payment.',200,90,200012,'N',1,'N','PaymentRule','Y','D',1143,'d7b2cef8-86cc-4a2d-91c2-ea452a71ffa3','N') +; + +-- Jan 11, 2018 7:05:08 PM CET +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,AD_Val_Rule_ID,FieldLength,IsMandatory,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,AD_Process_Para_UU,IsEncrypted) VALUES (200224,0,0,'Y',TO_DATE('2018-01-11 19:05:07','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2018-01-11 19:05:07','YYYY-MM-DD HH24:MI:SS'),100,'Payment Term','The terms of Payment (timing, discount)','Payment Terms identify the method and timing of payment.',200,100,19,'N',52098,22,'N','C_PaymentTerm_ID','Y','D',204,'77ec6576-ac60-48b8-a072-63af04afd7b5','N') +; + +-- Jan 11, 2018 7:06:08 PM CET +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,AD_Reference_Value_ID,IsRange,FieldLength,IsMandatory,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,AD_Process_Para_UU,IsEncrypted) VALUES (200225,0,0,'Y',TO_DATE('2018-01-11 19:06:07','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2018-01-11 19:06:07','YYYY-MM-DD HH24:MI:SS'),100,'Document Status','The current status of the document','The Document Status indicates the status of a document at this time. If you want to change the document status, use the Document Action field',200,110,17,131,'N',0,'N','DocStatus','Y','D',289,'409de69f-31b2-4742-8339-7a0a30272480','N') +; + +SELECT register_migration_script('201801111909_IDEMPIERE-3529.sql') FROM dual +; diff --git a/migration/i5.1/postgresql/201801111909_IDEMPIERE-3529.sql b/migration/i5.1/postgresql/201801111909_IDEMPIERE-3529.sql new file mode 100644 index 0000000000..bf8a4b3077 --- /dev/null +++ b/migration/i5.1/postgresql/201801111909_IDEMPIERE-3529.sql @@ -0,0 +1,19 @@ +-- IDEMPIERE-3529 Add parameters to InvoicePrint process +-- Jan 11, 2018 7:02:29 PM CET +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,AD_Reference_Value_ID,IsRange,FieldLength,IsMandatory,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,AD_Process_Para_UU,IsEncrypted) VALUES (200222,0,0,'Y',TO_TIMESTAMP('2018-01-11 19:02:28','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2018-01-11 19:02:28','YYYY-MM-DD HH24:MI:SS'),100,'Printed','Indicates if this document / line is printed','The Printed checkbox indicates if this document or line will included when printing.',200,80,17,319,'N',0,'N','IsPrinted','Y','D',399,'24d72545-9015-4b87-921d-7de97eaa5079','N') +; + +-- Jan 11, 2018 7:03:51 PM CET +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,AD_Process_Para_UU,IsEncrypted) VALUES (200223,0,0,'Y',TO_TIMESTAMP('2018-01-11 19:03:50','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2018-01-11 19:03:50','YYYY-MM-DD HH24:MI:SS'),100,'Payment Rule','How you pay the invoice','The Payment Rule indicates the method of invoice payment.',200,90,200012,'N',1,'N','PaymentRule','Y','D',1143,'d7b2cef8-86cc-4a2d-91c2-ea452a71ffa3','N') +; + +-- Jan 11, 2018 7:05:08 PM CET +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,AD_Val_Rule_ID,FieldLength,IsMandatory,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,AD_Process_Para_UU,IsEncrypted) VALUES (200224,0,0,'Y',TO_TIMESTAMP('2018-01-11 19:05:07','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2018-01-11 19:05:07','YYYY-MM-DD HH24:MI:SS'),100,'Payment Term','The terms of Payment (timing, discount)','Payment Terms identify the method and timing of payment.',200,100,19,'N',52098,22,'N','C_PaymentTerm_ID','Y','D',204,'77ec6576-ac60-48b8-a072-63af04afd7b5','N') +; + +-- Jan 11, 2018 7:06:08 PM CET +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,AD_Reference_Value_ID,IsRange,FieldLength,IsMandatory,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,AD_Process_Para_UU,IsEncrypted) VALUES (200225,0,0,'Y',TO_TIMESTAMP('2018-01-11 19:06:07','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2018-01-11 19:06:07','YYYY-MM-DD HH24:MI:SS'),100,'Document Status','The current status of the document','The Document Status indicates the status of a document at this time. If you want to change the document status, use the Document Action field',200,110,17,131,'N',0,'N','DocStatus','Y','D',289,'409de69f-31b2-4742-8339-7a0a30272480','N') +; + +SELECT register_migration_script('201801111909_IDEMPIERE-3529.sql') FROM dual +; diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/process/InvoicePrint.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/process/InvoicePrint.java index b87a0adbe4..60116946a2 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/process/InvoicePrint.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/process/InvoicePrint.java @@ -70,6 +70,10 @@ public class InvoicePrint extends SvrProcess protected String m_DocumentNo_To = null; private String p_IsPaid = null; private int m_C_DocType_ID = 0; + private String p_IsPrinted = null; + private String m_PaymentRule = null; + private int m_C_PaymentTerm_ID = 0; + private String m_DocStatus = null; protected volatile StringBuffer sql = new StringBuffer(); protected volatile List params = new ArrayList(); @@ -107,6 +111,14 @@ public class InvoicePrint extends SvrProcess p_IsPaid = (String)para[i].getParameter(); else if (name.equals("C_DocType_ID")) m_C_DocType_ID = para[i].getParameterAsInt(); + else if (name.equals("IsPrinted")) + p_IsPrinted = (String)para[i].getParameter(); + else if (name.equals("PaymentRule")) + m_PaymentRule = (String)para[i].getParameter(); + else if (name.equals("C_PaymentTerm_ID")) + m_C_PaymentTerm_ID = para[i].getParameterAsInt(); + else if (name.equals("DocStatus")) + m_DocStatus = (String)para[i].getParameter(); else log.log(Level.SEVERE, "prepare - Unknown Parameter: " + name); } @@ -132,7 +144,11 @@ public class InvoicePrint extends SvrProcess + ", DateInvoiced=" + m_dateInvoiced_From + "-" + m_dateInvoiced_To + ", DocumentNo=" + m_DocumentNo_From + "-" + m_DocumentNo_To + ", IsPaid=" + p_IsPaid - + ", C_DocType_ID=" + m_C_DocType_ID); + + ", C_DocType_ID=" + m_C_DocType_ID + + ", IsPrinted=" + p_IsPrinted + + ", PaymentRule=" + m_PaymentRule + + ", C_PaymentTerm_ID=" + m_C_PaymentTerm_ID + + ", DocStatus=" + m_DocStatus); MMailText mText = null; if (p_R_MailText_ID != 0) @@ -144,7 +160,8 @@ public class InvoicePrint extends SvrProcess // Too broad selection if (m_C_BPartner_ID == 0 && m_C_Invoice_ID == 0 && m_dateInvoiced_From == null && m_dateInvoiced_To == null - && m_DocumentNo_From == null && m_DocumentNo_To == null) + && m_DocumentNo_From == null && m_DocumentNo_To == null && m_PaymentRule == null && m_C_PaymentTerm_ID == 0 + && m_DocStatus == null) throw new AdempiereUserError ("@RestrictSelection@"); MClient client = MClient.get(getCtx()); @@ -395,6 +412,26 @@ public class InvoicePrint extends SvrProcess sql.append (" AND i.C_DocTypeTarget_ID=?"); params.add(m_C_DocType_ID); } + if (p_IsPrinted != null && p_IsPrinted.length() == 1) + { + sql.append (" AND i.IsPrinted=?"); + params.add(p_IsPrinted); + } + if (m_PaymentRule != null) + { + sql.append (" AND i.PaymentRule=?"); + params.add(m_PaymentRule); + } + if (m_C_PaymentTerm_ID != 0) + { + sql.append (" AND i.C_PaymentTerm_ID=?"); + params.add(m_C_PaymentTerm_ID); + } + if (m_DocStatus != null) + { + sql.append (" AND i.DocStatus=?"); + params.add(m_DocStatus); + } } String orgWhere = MRole.getDefault(getCtx(), false).getOrgWhere(MRole.SQL_RO); if (!Util.isEmpty(orgWhere, true)) { From 50c53e04f73107e85ac6dcdbbe1094ab4179c1ad Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Mon, 15 Jan 2018 11:29:07 +0100 Subject: [PATCH 14/21] IDEMPIERE-3615 Import CSV Process not processing detail callouts -> data corruption --- .../idempiere/process/ImportCSVProcess.java | 40 +++++++++++++------ .../src/org/compiere/model/GridTable.java | 14 +++++-- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/org.adempiere.base.process/src/org/idempiere/process/ImportCSVProcess.java b/org.adempiere.base.process/src/org/idempiere/process/ImportCSVProcess.java index 5e90f6a456..45fca381c8 100644 --- a/org.adempiere.base.process/src/org/idempiere/process/ImportCSVProcess.java +++ b/org.adempiere.base.process/src/org/idempiere/process/ImportCSVProcess.java @@ -43,6 +43,7 @@ import org.compiere.model.DataStatusEvent; import org.compiere.model.DataStatusListener; import org.compiere.model.GridField; import org.compiere.model.GridTab; +import org.compiere.model.GridTable; import org.compiere.model.GridWindow; import org.compiere.model.MImportTemplate; import org.compiere.model.MLookup; @@ -75,6 +76,7 @@ public class ImportCSVProcess extends SvrProcess implements DataStatusListener { } } + GridWindow m_gridWindow = null; GridTab m_gridTab = null; List m_Childs = null; @@ -101,15 +103,15 @@ public class ImportCSVProcess extends SvrProcess implements DataStatusListener { if (!m_importTemplate.isAllowed(p_ImportMode, Env.getAD_Role_ID(Env.getCtx()))) throw new AdempiereException("Template/Mode not allowed for this role"); - GridWindow gWin = GridWindow.get(getCtx(), -1, l_AD_Window_ID); - Env.setContext(getCtx(), -1, "IsSOTrx", gWin.isSOTrx()); + m_gridWindow = GridWindow.get(getCtx(), -1, l_AD_Window_ID); + Env.setContext(getCtx(), -1, "IsSOTrx", m_gridWindow.isSOTrx()); m_Childs = new ArrayList(); - for (int i = 0; i < gWin.getTabCount(); i++) { - GridTab gridtab = gWin.getTab(i); + for (int i = 0; i < m_gridWindow.getTabCount(); i++) { + GridTab gridtab = m_gridWindow.getTab(i); if (!gridtab.isLoadComplete()) - gWin.initTab(i); - if (gWin.getTab(i).getAD_Tab_ID() == l_AD_Tab_ID) { - m_gridTab = gWin.getTab(i); + m_gridWindow.initTab(i); + if (m_gridWindow.getTab(i).getAD_Tab_ID() == l_AD_Tab_ID) { + m_gridTab = m_gridWindow.getTab(i); } else { if (m_gridTab != null && gridtab.getTabLevel() > m_gridTab.getTabLevel()) m_Childs.add(gridtab); @@ -119,6 +121,8 @@ public class ImportCSVProcess extends SvrProcess implements DataStatusListener { if (m_gridTab == null) throw new Exception("No Active Tab"); m_gridTab.addDataStatusListener(this); + for (GridTab childTab : m_Childs) + childTab.addDataStatusListener(this); } protected IGridTabImporter initImporter() throws Exception { @@ -161,23 +165,33 @@ public class ImportCSVProcess extends SvrProcess implements DataStatusListener { public void dataStatusChanged(DataStatusEvent e) { int col = e.getChangedColumn(); - if (log.isLoggable(Level.CONFIG)) log.config("(" + m_gridTab + ") Col=" + col + ": " + e.toString()); + if (col < 0) + return; + + GridTab l_gridTab = null; + if (e.getSource() != null && e.getSource() instanceof GridTable) { + GridTable gt = (GridTable) e.getSource(); + l_gridTab = m_gridWindow.getTab(gt.getTabNo()); + if (l_gridTab.getAD_Table_ID() != e.AD_Table_ID) + throw new RuntimeException("Table doesn't match with updated tab"); + } + if (log.isLoggable(Level.CONFIG)) log.config("(" + l_gridTab + ") Col=" + col + ": " + e.toString()); // Process Callout - GridField mField = m_gridTab.getField(col); + GridField mField = l_gridTab.getField(col); if (mField != null && (mField.getCallout().length() > 0 - || (Core.findCallout(m_gridTab.getTableName(), mField.getColumnName())).size()>0 - || m_gridTab.hasDependants(mField.getColumnName()))) + || (Core.findCallout(l_gridTab.getTableName(), mField.getColumnName())).size()>0 + || l_gridTab.hasDependants(mField.getColumnName()))) { - String msg = m_gridTab.processFieldChange(mField); // Dependencies & Callout + String msg = l_gridTab.processFieldChange(mField); // Dependencies & Callout if (msg.length() > 0) { log.warning(msg); } // Refresh the list on dependant fields - for (GridField dependentField : m_gridTab.getDependantFields(mField.getColumnName())) + for (GridField dependentField : l_gridTab.getDependantFields(mField.getColumnName())) { // if the field has a lookup if (dependentField != null && dependentField.getLookup() instanceof MLookup) diff --git a/org.adempiere.base/src/org/compiere/model/GridTable.java b/org.adempiere.base/src/org/compiere/model/GridTable.java index 97ce82f7d0..240bcdeea9 100644 --- a/org.adempiere.base/src/org/compiere/model/GridTable.java +++ b/org.adempiere.base/src/org/compiere/model/GridTable.java @@ -99,12 +99,11 @@ import org.compiere.util.ValueNamePair; public class GridTable extends AbstractTableModel implements Serializable { - /** * */ - private static final long serialVersionUID = -4982992333796276205L; - + private static final long serialVersionUID = -4651516342985623070L; + public static final String DATA_REFRESH_MESSAGE = "Refreshed"; public static final String DATA_UPDATE_COPIED_MESSAGE = "UpdateCopied"; public static final String DATA_INSERTED_MESSAGE = "Inserted"; @@ -3878,6 +3877,15 @@ public class GridTable extends AbstractTableModel } return tabNo; } + + /** + * get Tab No + * @return Tab No + */ + public int getTabNo() + { + return m_TabNo; + } private boolean isNotNullAndIsEmpty (Object value) { if (value != null From ee233577c636ed0acc8fd5d9e07e6669ec9c4ba5 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Tue, 16 Jan 2018 09:50:24 +0100 Subject: [PATCH 15/21] IDEMPIERE-3612 improve the look of posting window by avoiding multiline output --- .../WEB-INF/src/org/adempiere/webui/acct/WAcctViewer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/acct/WAcctViewer.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/acct/WAcctViewer.java index fee0f344d7..04e42b624f 100755 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/acct/WAcctViewer.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/acct/WAcctViewer.java @@ -1118,6 +1118,7 @@ public class WAcctViewer extends Window implements EventListener table.setItemRenderer(new WListItemRenderer()); table.setModel(listmodeltable); + table.setSizedByContent(true); resultPanel.invalidate(); From dc373fbb4e7c503fe9362ed42323ea203b9c5ece Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Tue, 16 Jan 2018 11:30:55 +0100 Subject: [PATCH 16/21] IDEMPIERE-3614 styles on fields also apply in the find window --- .../org/adempiere/webui/editor/WEditor.java | 24 ++++++++++++------- .../adempiere/webui/window/FindWindow.java | 4 ++++ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WEditor.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WEditor.java index a40c4fb50d..dd049b10ea 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WEditor.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WEditor.java @@ -559,12 +559,17 @@ public abstract class WEditor implements EventListener, PropertyChangeLis } } - public void updateStyle() { - applyLabelStyles(); - applyFieldStyles(); + public void updateStyle(boolean applyDictionaryStyle) { + applyLabelStyles(applyDictionaryStyle); + applyFieldStyles(applyDictionaryStyle); } - protected void applyLabelStyles() { + public void updateStyle() { + applyLabelStyles(true); + applyFieldStyles(true); + } + + protected void applyLabelStyles(boolean applyDictionaryStyle) { if (label != null) { boolean zoomable = isZoomable(); String style = (zoomable ? STYLE_ZOOMABLE_LABEL : "") + (isMandatoryStyle() ? STYLE_EMPTY_MANDATORY_LABEL : STYLE_NORMAL_LABEL); @@ -573,7 +578,7 @@ public abstract class WEditor implements EventListener, PropertyChangeLis style = style + STYLE_MOBILE_ZOOMABLE; } } - if (gridField.getAD_LabelStyle_ID() > 0) + if (applyDictionaryStyle && gridField.getAD_LabelStyle_ID() > 0) { String s = buildStyle(gridField.getAD_LabelStyle_ID()); if (!Util.isEmpty(s)) { @@ -593,12 +598,13 @@ public abstract class WEditor implements EventListener, PropertyChangeLis label.setStyle(style); } - protected void applyFieldStyles() { - if (gridField.getAD_FieldStyle_ID() > 0) + protected void applyFieldStyles(boolean applyDictionaryStyle) { + String style = null; + if (applyDictionaryStyle && gridField.getAD_FieldStyle_ID() > 0) { - String style = buildStyle(gridField.getAD_FieldStyle_ID()); - setFieldStyle(style); + style = buildStyle(gridField.getAD_FieldStyle_ID()); } + setFieldStyle(style); } protected void setFieldStyle(String style) { diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FindWindow.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FindWindow.java index efdabf830b..ed466c4efd 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FindWindow.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/FindWindow.java @@ -1093,6 +1093,7 @@ public class FindWindow extends Window implements EventListener, ValueCha editor.setMandatory(false); editor.setReadWrite(true); editor.dynamicDisplay(); + editor.updateStyle(false); editor.addValueChangeListener(this); Label label = editor.getLabel(); Component fieldEditor = editor.getComponent(); @@ -1111,6 +1112,7 @@ public class FindWindow extends Window implements EventListener, ValueCha editorTo.setMandatory(false); editorTo.setReadWrite(true); editorTo.dynamicDisplay(); + editorTo.updateStyle(false); editorTo.addValueChangeListener(this); // if (displayLength > 0) // set it back @@ -1146,6 +1148,7 @@ public class FindWindow extends Window implements EventListener, ValueCha m_sEditorsFlag.add(null); m_sEditorsTo.add(null); editor.fillHorizontal(); + editor.updateStyle(false); } panel.appendChild(new Space()); if (group != null) @@ -2010,6 +2013,7 @@ public class FindWindow extends Window implements EventListener, ValueCha editor.setReadWrite(enabled); editor.setVisible(enabled); editor.dynamicDisplay(); + editor.updateStyle(false); if (editor instanceof WPaymentEditor) { ((WPaymentEditor)editor).getComponent().setEnabled(true, false); } From af173643145e8b265a54e980da3318fd2711265f Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Fri, 19 Jan 2018 13:59:24 +0800 Subject: [PATCH 17/21] IDEMPIERE-3622 MRecentItem is not thread safe --- .../src/org/compiere/model/MRecentItem.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/MRecentItem.java b/org.adempiere.base/src/org/compiere/model/MRecentItem.java index 13b1a9cc20..74ed76f9f0 100644 --- a/org.adempiere.base/src/org/compiere/model/MRecentItem.java +++ b/org.adempiere.base/src/org/compiere/model/MRecentItem.java @@ -64,9 +64,11 @@ public class MRecentItem extends X_AD_RecentItem { super (ctx, AD_RecentItem_ID, trxName); if (AD_RecentItem_ID > 0) { - Integer key = new Integer (AD_RecentItem_ID); - if (!s_cache.containsKey(key)) - s_cache.put (key, this); + synchronized (MRecentItem.class) { + Integer key = new Integer (AD_RecentItem_ID); + if (!s_cache.containsKey(key)) + s_cache.put (key, this); + } } } // MRecentItem @@ -85,8 +87,10 @@ public class MRecentItem extends X_AD_RecentItem } catch (SQLException e) { throw new AdempiereException(e); } - if (key != null && !s_cache.containsKey(key)) - s_cache.put (key, this); + synchronized (MRecentItem.class) { + if (key != null && !s_cache.containsKey(key)) + s_cache.put (key, this); + } } // MRecentItem /** @@ -95,7 +99,7 @@ public class MRecentItem extends X_AD_RecentItem * @param AD_RecentItem_ID id * @return recent item */ - public static MRecentItem get (Properties ctx, int AD_RecentItem_ID) + public static synchronized MRecentItem get (Properties ctx, int AD_RecentItem_ID) { Integer ii = new Integer (AD_RecentItem_ID); MRecentItem ri = (MRecentItem)s_cache.get(ii); @@ -111,7 +115,7 @@ public class MRecentItem extends X_AD_RecentItem * @param Record_ID recordID * @return recent item */ - public static MRecentItem get (Properties ctx, int AD_Table_ID, int Record_ID, int AD_User_ID) + public static synchronized MRecentItem get (Properties ctx, int AD_Table_ID, int Record_ID, int AD_User_ID) { Iterator it = s_cache.values().iterator(); while (it.hasNext()) @@ -262,7 +266,9 @@ public class MRecentItem extends X_AD_RecentItem @Override public boolean delete(boolean force) { Integer ii = new Integer (getAD_RecentItem_ID()); - s_cache.remove(ii); + synchronized (MRecentItem.class) { + s_cache.remove(ii); + } return super.delete(force); } From b91b362f10d8d500e989a709b050f8294ec231d6 Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Fri, 19 Jan 2018 17:25:18 +0800 Subject: [PATCH 18/21] IDEMPIERE-3624 Physical Inventory - getDateMaterialPolicy for Line should include locator --- org.adempiere.base/src/org/compiere/model/MInventory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.adempiere.base/src/org/compiere/model/MInventory.java b/org.adempiere.base/src/org/compiere/model/MInventory.java index 4cd75b68e0..86d192bd33 100644 --- a/org.adempiere.base/src/org/compiere/model/MInventory.java +++ b/org.adempiere.base/src/org/compiere/model/MInventory.java @@ -574,7 +574,7 @@ public class MInventory extends X_M_Inventory implements DocAction Timestamp dateMPolicy= qtyDiff.signum() > 0 ? getMovementDate() : null; if (line.getM_AttributeSetInstance_ID() > 0) { - Timestamp t = MStorageOnHand.getDateMaterialPolicy(line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(), line.get_TrxName()); + Timestamp t = MStorageOnHand.getDateMaterialPolicy(line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(), line.getM_Locator_ID(), line.get_TrxName()); if (t != null) dateMPolicy = t; } From 4aa248e82bd32742985bfe6e8ef1d51fb921463e Mon Sep 17 00:00:00 2001 From: Eduardo Jaremicki Moreira Date: Thu, 21 Dec 2017 15:37:39 -0200 Subject: [PATCH 19/21] IDEMPIERE-3586 Add pagination to Query --- .../src/org/compiere/model/Query.java | 93 ++++++++++++++++++- 1 file changed, 90 insertions(+), 3 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/Query.java b/org.adempiere.base/src/org/compiere/model/Query.java index 0fcd883cfb..1d81022d81 100644 --- a/org.adempiere.base/src/org/compiere/model/Query.java +++ b/org.adempiere.base/src/org/compiere/model/Query.java @@ -83,6 +83,16 @@ public class Query private int queryTimeout = 0; private List joinClauseList = new ArrayList(); + /** + * Limit current query rows return. + */ + private int pageSize; + + /** + * Number of pages will be skiped on query run. + */ + private int skip; + /** * * @param table @@ -753,9 +763,86 @@ public class Query if (DB.isPostgreSQL()) sql = sql + " OF " + table.getTableName(); } - if (log.isLoggable(Level.FINEST)) log.finest("TableName = "+table.getTableName()+"... SQL = " +sql); //red1 - to assist in debugging SQL - return sql; - } + + // If have pagination + if (pageSize > 0) { + sql = appendPagination(sql); + } + + if (log.isLoggable(Level.FINEST)) + log.finest("TableName = " + table.getTableName() + "... SQL = " + sql); // red1 - to assist in debugging SQL + + return sql; + } + + /** + * Set the pagination of the query. + * + * @param pPageSize + * Limit current query rows return. + * + * @return current Query + */ + public Query setPageSize(int pPageSize) { + this.pageSize = pPageSize; + return this; + } + + /** + * Set the pagination of the query. + * + * @param pPageSize + * Limit current query rows return. + * + * @param pSkip + * Number of pages will be skiped on query run. ZERO to first page + * + * @return current Query + */ + public Query setPage(int pPageSize, int pSkip) { + this.pageSize = pPageSize; + this.skip = pSkip; + return this; + } + + /** + * If top is bigger than 0 set the pagination on query + * + * @param query + * SQL String + * @param pageSize + * number + * @param skip + * number + */ + private String appendPagination(String pQuery) { + + String query = pQuery; + + if (pageSize > 0) { + + StringBuilder sql = new StringBuilder(); + + if (DB.isOracle()) { + + sql.append("select * from ("); + sql.append(" select ROWNUM pRow, tb.* from ("); + sql.append(query); + sql.append(") tb) where pRow > "); + sql.append(pageSize * skip); + sql.append(" AND pRow <= "); + sql.append(((pageSize * skip) + pageSize)); + + return sql.toString(); + + } + else { + query = query.concat(" FETCH FIRST " + pageSize + " ROWS ONLY OFFSET " + (pageSize * skip)); + } + } + + return query; + } private final ResultSet createResultSet (PreparedStatement pstmt) throws SQLException { From e4c872275bb1e79ab58c5564a5372e0ffdde285d Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Fri, 19 Jan 2018 12:06:46 +0100 Subject: [PATCH 20/21] IDEMPIERE-3586 Add pagination to Query / implement in generic way - info window now can paginate also in oracle --- .../src/org/compiere/model/Query.java | 36 ++++++------------- .../src/org/compiere/db/DB_Oracle.java | 14 ++++++-- 2 files changed, 22 insertions(+), 28 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/Query.java b/org.adempiere.base/src/org/compiere/model/Query.java index 1d81022d81..3a3ec73677 100644 --- a/org.adempiere.base/src/org/compiere/model/Query.java +++ b/org.adempiere.base/src/org/compiere/model/Query.java @@ -89,9 +89,9 @@ public class Query private int pageSize; /** - * Number of pages will be skiped on query run. + * Number of pages will be skipped on query run. */ - private int skip; + private int pagesToSkip; /** * @@ -794,14 +794,14 @@ public class Query * @param pPageSize * Limit current query rows return. * - * @param pSkip - * Number of pages will be skiped on query run. ZERO to first page + * @param pPagesToSkip + * Number of pages will be skipped on query run. ZERO for first page * * @return current Query */ - public Query setPage(int pPageSize, int pSkip) { + public Query setPage(int pPageSize, int pPagesToSkip) { this.pageSize = pPageSize; - this.skip = pSkip; + this.pagesToSkip = pPagesToSkip; return this; } @@ -820,25 +820,11 @@ public class Query String query = pQuery; if (pageSize > 0) { - - StringBuilder sql = new StringBuilder(); - - if (DB.isOracle()) { - - sql.append("select * from ("); - sql.append(" select ROWNUM pRow, tb.* from ("); - sql.append(query); - sql.append(") tb) where pRow > "); - sql.append(pageSize * skip); - sql.append(" AND pRow <= "); - sql.append(((pageSize * skip) + pageSize)); - - return sql.toString(); - - } - else { - query = query.concat(" FETCH FIRST " + pageSize + " ROWS ONLY OFFSET " + (pageSize * skip)); - } + if (DB.getDatabase().isPagingSupported()) { + query = DB.getDatabase().addPagingSQL(query, (pageSize*pagesToSkip) + 1, pageSize * (pagesToSkip+1)); + } else { + throw new IllegalArgumentException("Pagination not supported by database"); + } } return query; diff --git a/org.compiere.db.oracle.provider/src/org/compiere/db/DB_Oracle.java b/org.compiere.db.oracle.provider/src/org/compiere/db/DB_Oracle.java index f6d8c22c18..3f796308b0 100644 --- a/org.compiere.db.oracle.provider/src/org/compiere/db/DB_Oracle.java +++ b/org.compiere.db.oracle.provider/src/org/compiere/db/DB_Oracle.java @@ -1287,12 +1287,20 @@ public class DB_Oracle implements AdempiereDatabase } public String addPagingSQL(String sql, int start, int end) { - //not supported, too many corner case that doesn't work using rownum. to investigate later - return sql; + StringBuilder newSql = new StringBuilder("select * from (") + .append(" select tb.*, ROWNUM oracle_native_rownum_ from (") + .append(sql) + .append(") tb) where oracle_native_rownum_ >= ") + .append(start) + .append(" AND oracle_native_rownum_ <= ") + .append(end) + .append(" order by oracle_native_rownum_"); + + return newSql.toString(); } public boolean isPagingSupported() { - return false; + return true; } private int getIntProperty(Properties properties, String key, int defaultValue) From e85497d6974cbffb7ce81d71237e9d7e31e5661c Mon Sep 17 00:00:00 2001 From: Eduardo Jaremicki Moreira Date: Fri, 19 Jan 2018 13:15:57 +0100 Subject: [PATCH 21/21] =?UTF-8?q?IDEMPIERE-3585=20Oracle=20APPARENT=20DEAD?= =?UTF-8?q?LOCK=20warnings=20-=20Corre=C3=A7=C3=A3o=20Oracle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/org/compiere/db/DB_Oracle.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/org.compiere.db.oracle.provider/src/org/compiere/db/DB_Oracle.java b/org.compiere.db.oracle.provider/src/org/compiere/db/DB_Oracle.java index 3f796308b0..8da0b11fc1 100644 --- a/org.compiere.db.oracle.provider/src/org/compiere/db/DB_Oracle.java +++ b/org.compiere.db.oracle.provider/src/org/compiere/db/DB_Oracle.java @@ -663,6 +663,7 @@ public class DB_Oracle implements AdempiereDatabase boolean testConnectionOnCheckout = getBooleanProperty(poolProperties, "TestConnectionOnCheckout", false); String mlogClass = getStringProperty(poolProperties, "com.mchange.v2.log.MLog", "com.mchange.v2.log.FallbackMLog"); int checkoutTimeout = getIntProperty(poolProperties, "CheckoutTimeout", 0); + int statementCacheNumDeferredCloseThreads = getIntProperty(poolProperties, "StatementCacheNumDeferredCloseThreads", 1); try { System.setProperty("com.mchange.v2.log.MLog", mlogClass); @@ -681,7 +682,7 @@ public class DB_Oracle implements AdempiereDatabase cpds.setTestConnectionOnCheckout(testConnectionOnCheckout); if (checkoutTimeout > 0) cpds.setCheckoutTimeout(checkoutTimeout); - + cpds.setStatementCacheNumDeferredCloseThreads(statementCacheNumDeferredCloseThreads); cpds.setMaxIdleTimeExcessConnections(maxIdleTimeExcessConnections); cpds.setMaxIdleTime(maxIdleTime); if (Ini.isClient())