From 61241bb021d28603425728649259a343194295a1 Mon Sep 17 00:00:00 2001 From: hengsin Date: Sun, 8 Mar 2020 15:07:25 +0800 Subject: [PATCH 1/4] IDEMPIERE-4127 GL Inventory Clearing - Minor rounding variances --- .../org/compiere/acct/Doc_AllocationHdr.java | 49 +++++++++++++++++-- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/acct/Doc_AllocationHdr.java b/org.adempiere.base/src/org/compiere/acct/Doc_AllocationHdr.java index 999d6be5c9..077146c359 100644 --- a/org.adempiere.base/src/org/compiere/acct/Doc_AllocationHdr.java +++ b/org.adempiere.base/src/org/compiere/acct/Doc_AllocationHdr.java @@ -973,12 +973,11 @@ public class Doc_AllocationHdr extends Doc List valuesPay = DB.getSQLValueObjectsEx(getTrxName(), sql.toString(), MPayment.Table_ID, payment.getC_Payment_ID(), as.getC_AcctSchema_ID(), acct.getAccount_ID()); if (valuesPay != null) { - if (payment.isReceipt()) { + paymentSource = (BigDecimal) valuesPay.get(0); // AmtSourceDr + paymentAccounted = (BigDecimal) valuesPay.get(1); // AmtAcctDr + if (paymentSource.signum() == 0 && paymentAccounted.signum() == 0) { paymentSource = (BigDecimal) valuesPay.get(2); // AmtSourceCr paymentAccounted = (BigDecimal) valuesPay.get(3); // AmtAcctCr - } else { - paymentSource = (BigDecimal) valuesPay.get(0); // AmtSourceDr - paymentAccounted = (BigDecimal) valuesPay.get(1); // AmtAcctDr } } @@ -995,7 +994,7 @@ public class Doc_AllocationHdr extends Doc // Full Payment in currency if (allocationSource.abs().compareTo(paymentSource.abs()) == 0) { - acctDifference = totalAllocationAccounted.subtract(paymentAccounted.abs()); // gain is negative + acctDifference = totalAllocationAccounted.abs().subtract(paymentAccounted.abs()); // gain is negative StringBuilder d2 = new StringBuilder("(full) = ").append(acctDifference); if (log.isLoggable(Level.FINE)) log.fine(d2.toString()); description.append(" - ").append(d2); @@ -1016,6 +1015,46 @@ public class Doc_AllocationHdr extends Doc paymentAccounted0.abs().compareTo(totalAllocationAccounted.abs()) == 0; } } + else + { + // percent of total payment + double multiplier = allocationSource.doubleValue() / paymentSource.doubleValue(); + // Reduce Orig Payment Accounted + paymentAccounted = paymentAccounted.multiply(BigDecimal.valueOf(multiplier)); + // Difference based on percentage of Orig Payment + acctDifference = totalAllocationAccounted.abs().subtract(paymentAccounted.abs()); // gain is negative + // ignore Tolerance + if (acctDifference.abs().compareTo(TOLERANCE) < 0) + acctDifference = Env.ZERO; + // Round + int precision = as.getStdPrecision(); + if (acctDifference.scale() > precision) + acctDifference = acctDifference.setScale(precision, RoundingMode.HALF_UP); + StringBuilder d2 = new StringBuilder("(partial) = ").append(acctDifference).append(" - Multiplier=").append(multiplier); + if (log.isLoggable(Level.FINE)) log.fine(d2.toString()); + description.append(" - ").append(d2); + + // Different period + if (MPeriod.getC_Period_ID(getCtx(), payment.getDateAcct(), payment.getAD_Org_ID()) != + MPeriod.getC_Period_ID(getCtx(), getDateAcct(), getAD_Org_ID())) + { + if (paymentAccounted.scale() > precision) + paymentAccounted = paymentAccounted.setScale(precision, RoundingMode.HALF_UP); + paymentSource = paymentSource.multiply(BigDecimal.valueOf(multiplier)); + if (paymentSource.scale() > precision) + paymentSource = paymentSource.setScale(precision, RoundingMode.HALF_UP); + BigDecimal allocationAccounted0 = MConversionRate.convert(getCtx(), + allocationSource, getC_Currency_ID(), + as.getC_Currency_ID(), payment.getDateAcct(), + payment.getC_ConversionType_ID(), payment.getAD_Client_ID(), payment.getAD_Org_ID()); + BigDecimal paymentAccounted0 = MConversionRate.convert(getCtx(), + paymentSource, getC_Currency_ID(), + as.getC_Currency_ID(), getDateAcct(), + getC_ConversionType_ID(), getAD_Client_ID(), getAD_Org_ID()); + isSameSourceDiffPeriod = allocationAccounted0.abs().compareTo(paymentAccounted.abs()) == 0 && + paymentAccounted0.abs().compareTo(totalAllocationAccounted.abs()) == 0; + } + } if (acctDifference == null || acctDifference.signum() == 0) { From 2d06047049a1e32be02f2f69d37ece285665fa26 Mon Sep 17 00:00:00 2001 From: hengsin Date: Sun, 8 Mar 2020 17:18:31 +0800 Subject: [PATCH 2/4] IDEMPIERE-4195 Add NPE check to SchedulerStateEditor --- .../webui/scheduler/SchedulerStateEditor.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/scheduler/SchedulerStateEditor.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/scheduler/SchedulerStateEditor.java index 26f94d2f3b..a6f92158d2 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/scheduler/SchedulerStateEditor.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/scheduler/SchedulerStateEditor.java @@ -140,7 +140,7 @@ public class SchedulerStateEditor extends WEditor { } private int getAD_Scheduler_ID() { - return gridTab.getRecord_ID(); + return gridTab != null ? gridTab.getRecord_ID() : 0; } /** @@ -152,7 +152,7 @@ public class SchedulerStateEditor extends WEditor { if (schedulerState == AdempiereServerMgr.SERVER_STATE_NOT_SCHEDULE) { ADWindow adwindow = ADWindow.findADWindow(getComponent()); if (adwindow != null) { - if (gridTab.isNew() || gridTab.needSave(false, false)) { + if (gridTab != null && (gridTab.isNew() || gridTab.needSave(false, false))) { adwindow.getADWindowContent().onSave(true, false, new Callback() { @Override public void onCallback(Boolean result) { @@ -171,7 +171,7 @@ public class SchedulerStateEditor extends WEditor { } else if (schedulerState == AdempiereServerMgr.SERVER_STATE_STARTED) { ADWindow adwindow = ADWindow.findADWindow(getComponent()); if (adwindow != null) { - if (gridTab.isNew() || gridTab.needSave(false, false)) { + if (gridTab != null && (gridTab.isNew() || gridTab.needSave(false, false))) { adwindow.getADWindowContent().onSave(true, false, new Callback() { @Override public void onCallback(Boolean result) { @@ -186,7 +186,7 @@ public class SchedulerStateEditor extends WEditor { } else if (schedulerState == AdempiereServerMgr.SERVER_STATE_STOPPED) { ADWindow adwindow = ADWindow.findADWindow(getComponent()); if (adwindow != null) { - if (gridTab.isNew() || gridTab.needSave(false, false)) { + if (gridTab != null && (gridTab.isNew() || gridTab.needSave(false, false))) { adwindow.getADWindowContent().onSave(true, false, new Callback() { @Override public void onCallback(Boolean result) { @@ -261,7 +261,7 @@ public class SchedulerStateEditor extends WEditor { */ @Override public void setReadWrite(boolean readWrite) { - GridField descriptionField = gridTab.getField("Description"); + GridField descriptionField = gridTab != null ? gridTab.getField("Description") : null; if (descriptionField != null) getComponent().setEnabled(descriptionField.isEditable(true)); else From dfcb22fa5c409e9b1d32c1167b7c8b31d3c39e81 Mon Sep 17 00:00:00 2001 From: hengsin Date: Sun, 8 Mar 2020 19:19:06 +0800 Subject: [PATCH 3/4] IDEMPIERE-4196 Image Field: Not fully clickable on user window and doesn't maintain aspect ratio --- .../adempiere/webui/editor/WImageEditor.java | 21 +++++++++++++++++-- .../adempiere/webui/window/WImageDialog.java | 1 + .../default/css/fragment/field-editor.css.dsp | 6 ++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WImageEditor.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WImageEditor.java index 534e194440..9541f30f44 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WImageEditor.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/editor/WImageEditor.java @@ -25,9 +25,12 @@ import org.compiere.model.MImage; import org.compiere.util.CLogger; import org.compiere.util.Env; import org.zkoss.image.AImage; +import org.zkoss.zk.ui.Component; +import org.zkoss.zk.ui.Page; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; +import org.zkoss.zul.Cell; import org.zkoss.zul.Image; /** @@ -53,7 +56,21 @@ public class WImageEditor extends WEditor public WImageEditor(GridField gridField) { - super(new Image(), gridField); + super(new Image() { + private static final long serialVersionUID = 8492629361709791256L; + + @Override + public void onPageAttached(Page newpage, Page oldpage) { + super.onPageAttached(newpage, oldpage); + if (newpage != null && getParent() != null) { + Component p = getParent(); + if (p instanceof Cell) { + Cell cell = (Cell) p; + LayoutUtils.addSclass("image-field-cell", cell); + } + } + } + }, gridField); init(); } @@ -66,7 +83,7 @@ public class WImageEditor extends WEditor { AImage img = null; getComponent().setContent(img); - getComponent().setSclass("image-field"); + getComponent().setSclass("image-field image-fit-contain"); } @Override diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WImageDialog.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WImageDialog.java index cca5967ba3..93d7d5ff8c 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WImageDialog.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WImageDialog.java @@ -205,6 +205,7 @@ public class WImageDialog extends Window implements EventListener ZKUpdateUtil.setHflex(image, "true"); ZKUpdateUtil.setVflex(image, "true"); center.setParent(mainLayout); + image.setSclass("image-fit-contain"); center.appendChild(image); South south = new South(); diff --git a/org.adempiere.ui.zk/theme/default/css/fragment/field-editor.css.dsp b/org.adempiere.ui.zk/theme/default/css/fragment/field-editor.css.dsp index dd73029fce..cf5d21c7ea 100644 --- a/org.adempiere.ui.zk/theme/default/css/fragment/field-editor.css.dsp +++ b/org.adempiere.ui.zk/theme/default/css/fragment/field-editor.css.dsp @@ -190,6 +190,12 @@ span.grid-combobox-editor { cursor: default; border: none; } +.image-fit-contain { + object-fit: contain; +} +.z-cell.image-field-cell { + z-index: 1; +} .html-field { cursor: pointer; From 501ef7479c59c4a4ff99ec5da41dbfb118932eef Mon Sep 17 00:00:00 2001 From: hengsin Date: Sun, 8 Mar 2020 20:20:19 +0800 Subject: [PATCH 4/4] IDEMPIERE-4197 Minor improvements to quick entry and location dialog layout --- .../webui/window/WLocationDialog.java | 47 +++++++++---------- .../default/css/fragment/window-size.css.dsp | 14 +++++- 2 files changed, 36 insertions(+), 25 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WLocationDialog.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WLocationDialog.java index 3ca8d84167..f0ec36c86b 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WLocationDialog.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/window/WLocationDialog.java @@ -93,7 +93,6 @@ public class WLocationDialog extends Window implements EventListener * */ private static final long serialVersionUID = -9116270523919373406L; - private static final String LABEL_STYLE = "white-space: nowrap;"; /** Logger */ private static final CLogger log = CLogger.getCLogger(WLocationDialog.class); private Label lblAddress1; @@ -228,29 +227,29 @@ public class WLocationDialog extends Window implements EventListener private void initComponents() { lblAddress1 = new Label(Msg.getElement(Env.getCtx(), "Address1")); - lblAddress1.setStyle(LABEL_STYLE); + lblAddress1.setSclass("field-label"); lblAddress2 = new Label(Msg.getElement(Env.getCtx(), "Address2")); - lblAddress2.setStyle(LABEL_STYLE); + lblAddress2.setSclass("field-label"); lblAddress3 = new Label(Msg.getElement(Env.getCtx(), "Address3")); - lblAddress3.setStyle(LABEL_STYLE); + lblAddress3.setSclass("field-label"); lblAddress4 = new Label(Msg.getElement(Env.getCtx(), "Address4")); - lblAddress4.setStyle(LABEL_STYLE); + lblAddress4.setSclass("field-label"); lblAddress5 = new Label(Msg.getElement(Env.getCtx(), "Address5")); - lblAddress5.setStyle(LABEL_STYLE); + lblAddress5.setSclass("field-label"); lblComments = new Label(Msg.getElement(Env.getCtx(), "Comments")); - lblComments.setStyle(LABEL_STYLE); + lblComments.setSclass("field-label"); lblCity = new Label(Msg.getMsg(Env.getCtx(), "City")); - lblCity.setStyle(LABEL_STYLE); + lblCity.setSclass("field-label"); lblZip = new Label(Msg.getMsg(Env.getCtx(), "Postal")); - lblZip.setStyle(LABEL_STYLE); + lblZip.setSclass("field-label"); lblRegion = new Label(Msg.getMsg(Env.getCtx(), "Region")); - lblRegion.setStyle(LABEL_STYLE); + lblRegion.setSclass("field-label"); lblPostal = new Label(Msg.getMsg(Env.getCtx(), "Postal")); - lblPostal.setStyle(LABEL_STYLE); + lblPostal.setSclass("field-label"); lblPostalAdd = new Label(Msg.getMsg(Env.getCtx(), "PostalAdd")); - lblPostalAdd.setStyle(LABEL_STYLE); + lblPostalAdd.setSclass("field-label"); lblCountry = new Label(Msg.getMsg(Env.getCtx(), "Country")); - lblCountry.setStyle(LABEL_STYLE); + lblCountry.setSclass("field-label"); txtAddress1 = new Textbox(); txtAddress1.setCols(20); @@ -351,57 +350,57 @@ public class WLocationDialog extends Window implements EventListener ZKUpdateUtil.setWidth(column, "70%"); Row pnlAddress1 = new Row(); - pnlAddress1.appendChild(lblAddress1.rightAlign()); + pnlAddress1.appendChild(lblAddress1); pnlAddress1.appendChild(txtAddress1); ZKUpdateUtil.setHflex(txtAddress1, "1"); Row pnlAddress2 = new Row(); - pnlAddress2.appendChild(lblAddress2.rightAlign()); + pnlAddress2.appendChild(lblAddress2); pnlAddress2.appendChild(txtAddress2); ZKUpdateUtil.setHflex(txtAddress2, "1"); Row pnlAddress3 = new Row(); - pnlAddress3.appendChild(lblAddress3.rightAlign()); + pnlAddress3.appendChild(lblAddress3); pnlAddress3.appendChild(txtAddress3); ZKUpdateUtil.setHflex(txtAddress3, "1"); Row pnlAddress4 = new Row(); - pnlAddress4.appendChild(lblAddress4.rightAlign()); + pnlAddress4.appendChild(lblAddress4); pnlAddress4.appendChild(txtAddress4); ZKUpdateUtil.setHflex(txtAddress4, "1"); Row pnlAddress5 = new Row(); - pnlAddress5.appendChild(lblAddress5.rightAlign()); + pnlAddress5.appendChild(lblAddress5); pnlAddress5.appendChild(txtAddress5); ZKUpdateUtil.setHflex(txtAddress5, "1"); Row pnlComments = new Row(); - pnlComments.appendChild(lblComments.rightAlign()); + pnlComments.appendChild(lblComments); pnlComments.appendChild(txtComments); ZKUpdateUtil.setHflex(txtComments, "1"); Row pnlCity = new Row(); - pnlCity.appendChild(lblCity.rightAlign()); + pnlCity.appendChild(lblCity); pnlCity.appendChild(txtCity); ZKUpdateUtil.setHflex(txtCity, "1"); Row pnlPostal = new Row(); - pnlPostal.appendChild(lblPostal.rightAlign()); + pnlPostal.appendChild(lblPostal); pnlPostal.appendChild(txtPostal); ZKUpdateUtil.setHflex(pnlPostal, "1"); Row pnlPostalAdd = new Row(); - pnlPostalAdd.appendChild(lblPostalAdd.rightAlign()); + pnlPostalAdd.appendChild(lblPostalAdd); pnlPostalAdd.appendChild(txtPostalAdd); ZKUpdateUtil.setHflex(txtPostalAdd, "1"); Row pnlRegion = new Row(); - pnlRegion.appendChild(lblRegion.rightAlign()); + pnlRegion.appendChild(lblRegion); pnlRegion.appendChild(lstRegion); ZKUpdateUtil.setHflex(lstRegion, "1"); Row pnlCountry = new Row(); - pnlCountry.appendChild(lblCountry.rightAlign()); + pnlCountry.appendChild(lblCountry); pnlCountry.appendChild(lstCountry); ZKUpdateUtil.setHflex(lstCountry, "1"); diff --git a/org.adempiere.ui.zk/theme/default/css/fragment/window-size.css.dsp b/org.adempiere.ui.zk/theme/default/css/fragment/window-size.css.dsp index 041f190ae1..7cefdc4d1c 100644 --- a/org.adempiere.ui.zk/theme/default/css/fragment/window-size.css.dsp +++ b/org.adempiere.ui.zk/theme/default/css/fragment/window-size.css.dsp @@ -224,6 +224,10 @@ } .quick-entry-dialog > .z-window-content { overflow: auto; + padding: 4px; +} +.quick-entry-dialog > .z-window-content > .confirm-panel { + padding-top: 4px; } @media screen and (max-width: 350px) { .quick-entry-dialog { @@ -300,9 +304,17 @@ } .location-dialog { - width: 380px; height: 420px; } +.location-dialog > .z-window-content > .z-borderlayout { + min-width: 380px; +} +.location-dialog .field-label { + white-space: nowrap; +} +.location-dialog .confirm-panel { + padding: 4px 8px; +} @media screen and (max-width: 380px) { .location-dialog { width: 100%;