From 9ca8c4b2d304c014682d98977517380cc750079b Mon Sep 17 00:00:00 2001 From: mark_o Date: Thu, 21 Feb 2008 12:00:54 +0000 Subject: [PATCH] =?UTF-8?q?BF=20[=201894716=20]=20CalloutPayment.amounts?= =?UTF-8?q?=20calculates=20wrong=20amts.=20Patch=20provided=20by=20Mario?= =?UTF-8?q?=20Calderon=20and=20Tobias=20Sch=C3=B6neberg.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Please review. --- .../org/compiere/model/CalloutPayment.java | 665 +++++++++--------- 1 file changed, 343 insertions(+), 322 deletions(-) diff --git a/base/src/org/compiere/model/CalloutPayment.java b/base/src/org/compiere/model/CalloutPayment.java index fd59c0d284..af7d3bdb91 100644 --- a/base/src/org/compiere/model/CalloutPayment.java +++ b/base/src/org/compiere/model/CalloutPayment.java @@ -1,19 +1,18 @@ -/****************************************************************************** - * Product: Adempiere ERP & CRM Smart Business Solution * - * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * - * This program is free software; you can redistribute it and/or modify it * - * under the terms version 2 of the GNU General Public License as published * - * by the Free Software Foundation. This program is distributed in the hope * - * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * - * See the GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * - * For the text or an alternative of this public license, you may reach us * - * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * - * or via info@compiere.org or http://www.compiere.org/license.html * - *****************************************************************************/ +/******************************************************************************* + * Product: Adempiere ERP & CRM Smart Business Solution * Copyright (C) + * 1999-2006 ComPiere, Inc. All Rights Reserved. * This program is free + * software; you can redistribute it and/or modify it * under the terms version + * 2 of the GNU General Public License as published * by the Free Software + * Foundation. This program is distributed in the hope * that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied * warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General + * Public License for more details. * You should have received a copy of the GNU + * General Public License along * with this program; if not, write to the Free + * Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA. * For the text or an alternative of this public license, you + * may reach us * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA + * 95054, USA * or via info@compiere.org or http://www.compiere.org/license.html * + ******************************************************************************/ package org.compiere.model; import java.math.*; @@ -23,456 +22,478 @@ import java.util.logging.*; import org.compiere.util.*; /** - * Payment Callouts. - * org.compiere.model.CalloutPayment.* - * - * @author Jorg Janke - * @version $Id: CalloutPayment.java,v 1.3 2006/07/30 00:51:03 jjanke Exp $ - * + * Payment Callouts. org.compiere.model.CalloutPayment.* + * @author Jorg Janke + * @version $Id: CalloutPayment.java,v 1.3 2006/07/30 00:51:03 jjanke Exp $ * @author Teo Sarca, SC ARHIPAC SERVICE SRL - *
  • BF [ 1803316 ] CalloutPayment: use C_Order.Bill_BPartner_ID + *
  • BF [ 1803316 ] CalloutPayment: use C_Order.Bill_BPartner_ID */ public class CalloutPayment extends CalloutEngine { + /** - * Payment_Invoice. - * when Invoice selected - * - set C_Currency_ID - * - C_BPartner_ID - * - DiscountAmt = C_Invoice_Discount (ID, DateTrx) - * - PayAmt = invoiceOpen (ID) - Discount - * - WriteOffAmt = 0 - * @param ctx context - * @param WindowNo current Window No - * @param mTab Grid Tab - * @param mField Grid Field - * @param value New Value - * @return null or error message + * Payment_Invoice. when Invoice selected - set C_Currency_ID - + * C_BPartner_ID - DiscountAmt = C_Invoice_Discount (ID, DateTrx) - PayAmt = + * invoiceOpen (ID) - Discount - WriteOffAmt = 0 + * @param ctx context + * @param WindowNo current Window No + * @param mTab Grid Tab + * @param mField Grid Field + * @param value New Value + * @return null or error message */ - public String invoice (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) + public String invoice(Properties ctx, int WindowNo, GridTab mTab, + GridField mField, Object value) { Integer C_Invoice_ID = (Integer)value; - if (isCalloutActive() // assuming it is resetting value - || C_Invoice_ID == null || C_Invoice_ID.intValue() == 0) + if (isCalloutActive () // assuming it is resetting value + || C_Invoice_ID == null || C_Invoice_ID.intValue () == 0) return ""; - mTab.setValue("C_Order_ID", null); - mTab.setValue("C_Charge_ID", null); - mTab.setValue("IsPrepayment", Boolean.FALSE); + mTab.setValue ("C_Order_ID", null); + mTab.setValue ("C_Charge_ID", null); + mTab.setValue ("IsPrepayment", Boolean.FALSE); // - mTab.setValue("DiscountAmt", Env.ZERO); - mTab.setValue("WriteOffAmt", Env.ZERO); - mTab.setValue("IsOverUnderPayment", Boolean.FALSE); - mTab.setValue("OverUnderAmt", Env.ZERO); - + mTab.setValue ("DiscountAmt", Env.ZERO); + mTab.setValue ("WriteOffAmt", Env.ZERO); + mTab.setValue ("IsOverUnderPayment", Boolean.FALSE); + mTab.setValue ("OverUnderAmt", Env.ZERO); int C_InvoicePaySchedule_ID = 0; - if (Env.getContextAsInt(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_Invoice_ID") == C_Invoice_ID.intValue() - && Env.getContextAsInt(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_InvoicePaySchedule_ID") != 0) - C_InvoicePaySchedule_ID = Env.getContextAsInt(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_InvoicePaySchedule_ID"); - - // Payment Date - Timestamp ts = (Timestamp)mTab.getValue("DateTrx"); + if (Env.getContextAsInt (ctx, Env.WINDOW_INFO, Env.TAB_INFO, + "C_Invoice_ID") == C_Invoice_ID.intValue () + && Env.getContextAsInt (ctx, Env.WINDOW_INFO, Env.TAB_INFO, + "C_InvoicePaySchedule_ID") != 0) + C_InvoicePaySchedule_ID = Env.getContextAsInt (ctx, + Env.WINDOW_INFO, Env.TAB_INFO, "C_InvoicePaySchedule_ID"); + // Payment Date + Timestamp ts = (Timestamp)mTab.getValue ("DateTrx"); if (ts == null) - ts = new Timestamp(System.currentTimeMillis()); + ts = new Timestamp (System.currentTimeMillis ()); // - String sql = "SELECT C_BPartner_ID,C_Currency_ID," // 1..2 - + " invoiceOpen(C_Invoice_ID, ?)," // 3 #1 - + " invoiceDiscount(C_Invoice_ID,?,?), IsSOTrx " // 4..5 #2/3 - + "FROM C_Invoice WHERE C_Invoice_ID=?"; // #4 + String sql = "SELECT C_BPartner_ID,C_Currency_ID," // 1..2 + + " invoiceOpen(C_Invoice_ID, ?)," // 3 #1 + + " invoiceDiscount(C_Invoice_ID,?,?), IsSOTrx " // 4..5 #2/3 + + "FROM C_Invoice WHERE C_Invoice_ID=?"; // #4 PreparedStatement pstmt = null; ResultSet rs = null; try { - pstmt = DB.prepareStatement(sql, null); - pstmt.setInt(1, C_InvoicePaySchedule_ID); - pstmt.setTimestamp(2, ts); - pstmt.setInt(3, C_InvoicePaySchedule_ID); - pstmt.setInt(4, C_Invoice_ID.intValue()); - rs = pstmt.executeQuery(); - if (rs.next()) + pstmt = DB.prepareStatement (sql, null); + pstmt.setInt (1, C_InvoicePaySchedule_ID); + pstmt.setTimestamp (2, ts); + pstmt.setInt (3, C_InvoicePaySchedule_ID); + pstmt.setInt (4, C_Invoice_ID.intValue ()); + rs = pstmt.executeQuery (); + if (rs.next ()) { - mTab.setValue("C_BPartner_ID", new Integer(rs.getInt(1))); - int C_Currency_ID = rs.getInt(2); // Set Invoice Currency - mTab.setValue("C_Currency_ID", new Integer(C_Currency_ID)); + mTab.setValue ("C_BPartner_ID", new Integer (rs.getInt (1))); + int C_Currency_ID = rs.getInt (2); // Set Invoice Currency + mTab.setValue ("C_Currency_ID", new Integer (C_Currency_ID)); // - BigDecimal InvoiceOpen = rs.getBigDecimal(3); // Set Invoice OPen Amount + BigDecimal InvoiceOpen = rs.getBigDecimal (3); // Set Invoice + // OPen Amount if (InvoiceOpen == null) InvoiceOpen = Env.ZERO; - BigDecimal DiscountAmt = rs.getBigDecimal(4); // Set Discount Amt + BigDecimal DiscountAmt = rs.getBigDecimal (4); // Set Discount + // Amt if (DiscountAmt == null) DiscountAmt = Env.ZERO; - mTab.setValue("PayAmt", InvoiceOpen.subtract(DiscountAmt)); - mTab.setValue("DiscountAmt", DiscountAmt); - // reset as dependent fields get reset - Env.setContext(ctx, WindowNo, "C_Invoice_ID", C_Invoice_ID.toString()); - mTab.setValue("C_Invoice_ID", C_Invoice_ID); + mTab.setValue ("PayAmt", InvoiceOpen.subtract (DiscountAmt)); + mTab.setValue ("DiscountAmt", DiscountAmt); + // reset as dependent fields get reset + Env.setContext (ctx, WindowNo, "C_Invoice_ID", C_Invoice_ID + .toString ()); + mTab.setValue ("C_Invoice_ID", C_Invoice_ID); } } catch (SQLException e) { - log.log(Level.SEVERE, sql, e); - return e.getLocalizedMessage(); + log.log (Level.SEVERE, sql, e); + return e.getLocalizedMessage (); } finally { - DB.close(rs, pstmt); + DB.close (rs, pstmt); } - - return docType(ctx, WindowNo, mTab, mField, value); - } // invoice + return docType (ctx, WindowNo, mTab, mField, value); + } // invoice /** - * Payment_Order. - * when Waiting Payment Order selected - * - set C_Currency_ID - * - C_BPartner_ID - * - DiscountAmt = C_Invoice_Discount (ID, DateTrx) - * - PayAmt = invoiceOpen (ID) - Discount - * - WriteOffAmt = 0 - * @param ctx context - * @param WindowNo current Window No - * @param mTab Grid Tab - * @param mField Grid Field - * @param value New Value - * @return null or error message + * Payment_Order. when Waiting Payment Order selected - set C_Currency_ID - + * C_BPartner_ID - DiscountAmt = C_Invoice_Discount (ID, DateTrx) - PayAmt = + * invoiceOpen (ID) - Discount - WriteOffAmt = 0 + * @param ctx context + * @param WindowNo current Window No + * @param mTab Grid Tab + * @param mField Grid Field + * @param value New Value + * @return null or error message */ - public String order (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) + public String order(Properties ctx, int WindowNo, GridTab mTab, + GridField mField, Object value) { Integer C_Order_ID = (Integer)value; - if (isCalloutActive() // assuming it is resetting value - || C_Order_ID == null || C_Order_ID.intValue() == 0) + if (isCalloutActive () // assuming it is resetting value + || C_Order_ID == null || C_Order_ID.intValue () == 0) return ""; - mTab.setValue("C_Invoice_ID", null); - mTab.setValue("C_Charge_ID", null); - mTab.setValue("IsPrepayment", Boolean.TRUE); + mTab.setValue ("C_Invoice_ID", null); + mTab.setValue ("C_Charge_ID", null); + mTab.setValue ("IsPrepayment", Boolean.TRUE); // - mTab.setValue("DiscountAmt", Env.ZERO); - mTab.setValue("WriteOffAmt", Env.ZERO); - mTab.setValue("IsOverUnderPayment", Boolean.FALSE); - mTab.setValue("OverUnderAmt", Env.ZERO); - - // Payment Date - Timestamp ts = (Timestamp)mTab.getValue("DateTrx"); + mTab.setValue ("DiscountAmt", Env.ZERO); + mTab.setValue ("WriteOffAmt", Env.ZERO); + mTab.setValue ("IsOverUnderPayment", Boolean.FALSE); + mTab.setValue ("OverUnderAmt", Env.ZERO); + // Payment Date + Timestamp ts = (Timestamp)mTab.getValue ("DateTrx"); if (ts == null) - ts = new Timestamp(System.currentTimeMillis()); + ts = new Timestamp (System.currentTimeMillis ()); // String sql = "SELECT COALESCE(Bill_BPartner_ID, C_BPartner_ID) as C_BPartner_ID " - +", C_Currency_ID " - +", GrandTotal " - + "FROM C_Order WHERE C_Order_ID=?"; // #1 + + ", C_Currency_ID " + + ", GrandTotal " + + "FROM C_Order WHERE C_Order_ID=?"; // #1 PreparedStatement pstmt = null; ResultSet rs = null; try { - pstmt = DB.prepareStatement(sql, null); - pstmt.setInt(1, C_Order_ID.intValue()); - rs = pstmt.executeQuery(); - if (rs.next()) + pstmt = DB.prepareStatement (sql, null); + pstmt.setInt (1, C_Order_ID.intValue ()); + rs = pstmt.executeQuery (); + if (rs.next ()) { - mTab.setValue("C_BPartner_ID", new Integer(rs.getInt(1))); - int C_Currency_ID = rs.getInt(2); // Set Order Currency - mTab.setValue("C_Currency_ID", new Integer(C_Currency_ID)); + mTab.setValue ("C_BPartner_ID", new Integer (rs.getInt (1))); + int C_Currency_ID = rs.getInt (2); // Set Order Currency + mTab.setValue ("C_Currency_ID", new Integer (C_Currency_ID)); // - BigDecimal GrandTotal = rs.getBigDecimal(3); // Set Pay Amount + BigDecimal GrandTotal = rs.getBigDecimal (3); // Set Pay + // Amount if (GrandTotal == null) GrandTotal = Env.ZERO; - mTab.setValue("PayAmt", GrandTotal); + mTab.setValue ("PayAmt", GrandTotal); } } catch (SQLException e) { - log.log(Level.SEVERE, sql, e); - return e.getLocalizedMessage(); + log.log (Level.SEVERE, sql, e); + return e.getLocalizedMessage (); } finally { - DB.close(rs, pstmt); + DB.close (rs, pstmt); } - - return docType(ctx, WindowNo, mTab, mField, value); - } // order + return docType (ctx, WindowNo, mTab, mField, value); + } // order /** - * Payment_Project. - * - reset - C_BPartner_ID, Invoice, Order, Project, - * Discount, WriteOff - * @param ctx context - * @param WindowNo current Window No - * @param mTab Grid Tab - * @param mField Grid Field - * @param value New Value - * @return null or error message + * Payment_Project. - reset - C_BPartner_ID, Invoice, Order, Project, + * Discount, WriteOff + * @param ctx context + * @param WindowNo current Window No + * @param mTab Grid Tab + * @param mField Grid Field + * @param value New Value + * @return null or error message */ - public String project (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) + public String project(Properties ctx, int WindowNo, GridTab mTab, + GridField mField, Object value) { Integer C_Project_ID = (Integer)value; - if (isCalloutActive() // assuming it is resetting value - || C_Project_ID == null || C_Project_ID.intValue() == 0) + if (isCalloutActive () // assuming it is resetting value + || C_Project_ID == null || C_Project_ID.intValue () == 0) return ""; - mTab.setValue("C_Charge_ID", null); + mTab.setValue ("C_Charge_ID", null); return ""; - } // project + } // project /** - * Payment_Charge. - * - reset - C_BPartner_ID, Invoice, Order, Project, - * Discount, WriteOff - * @param ctx context - * @param WindowNo current Window No - * @param mTab Grid Tab - * @param mField Grid Field - * @param value New Value - * @return null or error message + * Payment_Charge. - reset - C_BPartner_ID, Invoice, Order, Project, + * Discount, WriteOff + * @param ctx context + * @param WindowNo current Window No + * @param mTab Grid Tab + * @param mField Grid Field + * @param value New Value + * @return null or error message */ - public String charge (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) + public String charge(Properties ctx, int WindowNo, GridTab mTab, + GridField mField, Object value) { Integer C_Charge_ID = (Integer)value; - if (isCalloutActive() // assuming it is resetting value - || C_Charge_ID == null || C_Charge_ID.intValue() == 0) + if (isCalloutActive () // assuming it is resetting value + || C_Charge_ID == null || C_Charge_ID.intValue () == 0) return ""; - mTab.setValue("C_Invoice_ID", null); - mTab.setValue("C_Order_ID", null); - mTab.setValue("C_Project_ID", null); - mTab.setValue("IsPrepayment", Boolean.FALSE); + mTab.setValue ("C_Invoice_ID", null); + mTab.setValue ("C_Order_ID", null); + mTab.setValue ("C_Project_ID", null); + mTab.setValue ("IsPrepayment", Boolean.FALSE); // - mTab.setValue("DiscountAmt", Env.ZERO); - mTab.setValue("WriteOffAmt", Env.ZERO); - mTab.setValue("IsOverUnderPayment", Boolean.FALSE); - mTab.setValue("OverUnderAmt", Env.ZERO); + mTab.setValue ("DiscountAmt", Env.ZERO); + mTab.setValue ("WriteOffAmt", Env.ZERO); + mTab.setValue ("IsOverUnderPayment", Boolean.FALSE); + mTab.setValue ("OverUnderAmt", Env.ZERO); return ""; - } // charge + } // charge /** - * Payment_Document Type. - * Verify that Document Type (AP/AR) and Invoice (SO/PO) are in sync - * @param ctx context - * @param WindowNo current Window No - * @param mTab Grid Tab - * @param mField Grid Field - * @param value New Value - * @return null or error message + * Payment_Document Type. Verify that Document Type (AP/AR) and Invoice + * (SO/PO) are in sync + * @param ctx context + * @param WindowNo current Window No + * @param mTab Grid Tab + * @param mField Grid Field + * @param value New Value + * @return null or error message */ - public String docType (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) + public String docType(Properties ctx, int WindowNo, GridTab mTab, + GridField mField, Object value) { - int C_Invoice_ID = Env.getContextAsInt(ctx, WindowNo, "C_Invoice_ID"); - int C_Order_ID = Env.getContextAsInt(ctx, WindowNo, "C_Order_ID"); - int C_DocType_ID = Env.getContextAsInt(ctx, WindowNo, "C_DocType_ID"); - log.fine("Payment_DocType - C_Invoice_ID=" + C_Invoice_ID + ", C_DocType_ID=" + C_DocType_ID); + int C_Invoice_ID = Env.getContextAsInt (ctx, WindowNo, "C_Invoice_ID"); + int C_Order_ID = Env.getContextAsInt (ctx, WindowNo, "C_Order_ID"); + int C_DocType_ID = Env.getContextAsInt (ctx, WindowNo, "C_DocType_ID"); + log.fine ("Payment_DocType - C_Invoice_ID=" + C_Invoice_ID + + ", C_DocType_ID=" + C_DocType_ID); MDocType dt = null; if (C_DocType_ID != 0) { - dt = MDocType.get(ctx, C_DocType_ID); - Env.setContext(ctx, WindowNo, "IsSOTrx", dt.isSOTrx() ? "Y" : "N"); + dt = MDocType.get (ctx, C_DocType_ID); + Env + .setContext (ctx, WindowNo, "IsSOTrx", dt.isSOTrx () ? "Y" + : "N"); } - // Invoice + // Invoice if (C_Invoice_ID != 0) { MInvoice inv = new MInvoice (ctx, C_Invoice_ID, null); if (dt != null) { - if (inv.isSOTrx() != dt.isSOTrx()) + if (inv.isSOTrx () != dt.isSOTrx ()) return "PaymentDocTypeInvoiceInconsistent"; } } - // globalqss - Allow prepayment to Purchase Orders - // Order Waiting Payment (can only be SO) + // Order Waiting Payment (can only be SO) // if (C_Order_ID != 0 && dt != null && !dt.isSOTrx()) - // return "PaymentDocTypeInvoiceInconsistent"; - // Order + // return "PaymentDocTypeInvoiceInconsistent"; + // Order if (C_Order_ID != 0) { MOrder ord = new MOrder (ctx, C_Order_ID, null); if (dt != null) { - if (ord.isSOTrx() != dt.isSOTrx()) - return "PaymentDocTypeInvoiceInconsistent"; + if (ord.isSOTrx () != dt.isSOTrx ()) + return "PaymentDocTypeInvoiceInconsistent"; } } - return ""; - } // docType - + } // docType /** - * Payment_Amounts. - * Change of: - * - IsOverUnderPayment -> set OverUnderAmt to 0 - * - C_Currency_ID, C_ConvesionRate_ID -> convert all - * - PayAmt, DiscountAmt, WriteOffAmt, OverUnderAmt -> PayAmt - * make sure that add up to InvoiceOpenAmt - * @param ctx context - * @param WindowNo current Window No - * @param mTab Grid Tab - * @param mField Grid Field - * @param value New Value - * @param oldValue Old Value - * @return null or error message + * Payment_Amounts. Change of: - IsOverUnderPayment -> set OverUnderAmt to 0 - + * C_Currency_ID, C_ConvesionRate_ID -> convert all - PayAmt, DiscountAmt, + * WriteOffAmt, OverUnderAmt -> PayAmt make sure that add up to + * InvoiceOpenAmt + * @param ctx context + * @param WindowNo current Window No + * @param mTab Grid Tab + * @param mField Grid Field + * @param value New Value + * @param oldValue Old Value + * @return null or error message */ - public String amounts (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value, Object oldValue) + public String amounts(Properties ctx, int WindowNo, GridTab mTab, + GridField mField, Object value, Object oldValue) { - if (isCalloutActive()) // assuming it is resetting value + if (isCalloutActive ()) // assuming it is resetting value return ""; - int C_Invoice_ID = Env.getContextAsInt(ctx, WindowNo, "C_Invoice_ID"); - // New Payment - if (Env.getContextAsInt(ctx, WindowNo, "C_Payment_ID") == 0 - && Env.getContextAsInt(ctx, WindowNo, "C_BPartner_ID") == 0 + int C_Invoice_ID = Env.getContextAsInt (ctx, WindowNo, "C_Invoice_ID"); + // New Payment + if (Env.getContextAsInt (ctx, WindowNo, "C_Payment_ID") == 0 + && Env.getContextAsInt (ctx, WindowNo, "C_BPartner_ID") == 0 && C_Invoice_ID == 0) return ""; - - // Changed Column - String colName = mField.getColumnName(); - if (colName.equals("IsOverUnderPayment") // Set Over/Under Amt to Zero - || !"Y".equals(Env.getContext(ctx, WindowNo, "IsOverUnderPayment"))) - mTab.setValue("OverUnderAmt", Env.ZERO); - + // Changed Column + String colName = mField.getColumnName (); + if (colName.equals ("IsOverUnderPayment") // Set Over/Under Amt to + // Zero + || !"Y".equals (Env + .getContext (ctx, WindowNo, "IsOverUnderPayment"))) + mTab.setValue ("OverUnderAmt", Env.ZERO); int C_InvoicePaySchedule_ID = 0; - if (Env.getContextAsInt(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_Invoice_ID") == C_Invoice_ID - && Env.getContextAsInt(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_InvoicePaySchedule_ID") != 0) - C_InvoicePaySchedule_ID = Env.getContextAsInt(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_InvoicePaySchedule_ID"); - - // Get Open Amount & Invoice Currency + if (Env.getContextAsInt (ctx, Env.WINDOW_INFO, Env.TAB_INFO, + "C_Invoice_ID") == C_Invoice_ID + && Env.getContextAsInt (ctx, Env.WINDOW_INFO, Env.TAB_INFO, + "C_InvoicePaySchedule_ID") != 0) + C_InvoicePaySchedule_ID = Env.getContextAsInt (ctx, + Env.WINDOW_INFO, Env.TAB_INFO, "C_InvoicePaySchedule_ID"); + // Get Open Amount & Invoice Currency BigDecimal InvoiceOpenAmt = Env.ZERO; int C_Currency_Invoice_ID = 0; if (C_Invoice_ID != 0) { - Timestamp ts = (Timestamp)mTab.getValue("DateTrx"); + Timestamp ts = (Timestamp)mTab.getValue ("DateTrx"); if (ts == null) - ts = new Timestamp(System.currentTimeMillis()); - String sql = "SELECT C_BPartner_ID,C_Currency_ID," // 1..2 - + " invoiceOpen(C_Invoice_ID,?)," // 3 #1 - + " invoiceDiscount(C_Invoice_ID,?,?), IsSOTrx " // 4..5 #2/3 - + "FROM C_Invoice WHERE C_Invoice_ID=?"; // #4 + ts = new Timestamp (System.currentTimeMillis ()); + String sql = "SELECT C_BPartner_ID,C_Currency_ID," // 1..2 + + " invoiceOpen(C_Invoice_ID,?)," // 3 #1 + + " invoiceDiscount(C_Invoice_ID,?,?), IsSOTrx " // 4..5 #2/3 + + "FROM C_Invoice WHERE C_Invoice_ID=?"; // #4 PreparedStatement pstmt = null; ResultSet rs = null; try { - pstmt = DB.prepareStatement(sql, null); - pstmt.setInt(1, C_InvoicePaySchedule_ID); - pstmt.setTimestamp(2, ts); - pstmt.setInt(3, C_InvoicePaySchedule_ID); - pstmt.setInt(4, C_Invoice_ID); - rs = pstmt.executeQuery(); - if (rs.next()) + pstmt = DB.prepareStatement (sql, null); + pstmt.setInt (1, C_InvoicePaySchedule_ID); + pstmt.setTimestamp (2, ts); + pstmt.setInt (3, C_InvoicePaySchedule_ID); + pstmt.setInt (4, C_Invoice_ID); + rs = pstmt.executeQuery (); + if (rs.next ()) { - C_Currency_Invoice_ID= rs.getInt(2); - InvoiceOpenAmt = rs.getBigDecimal(3); // Set Invoice Open Amount + C_Currency_Invoice_ID = rs.getInt (2); + InvoiceOpenAmt = rs.getBigDecimal (3); // Set Invoice Open + // Amount if (InvoiceOpenAmt == null) InvoiceOpenAmt = Env.ZERO; } } catch (SQLException e) { - log.log(Level.SEVERE, sql, e); - return e.getLocalizedMessage(); + log.log (Level.SEVERE, sql, e); + return e.getLocalizedMessage (); } finally { - DB.close(rs, pstmt); - rs = null; pstmt = null; + DB.close (rs, pstmt); + rs = null; + pstmt = null; } - } // get Invoice Info - log.fine("Open=" + InvoiceOpenAmt + ", C_Invoice_ID=" + C_Invoice_ID + } // get Invoice Info + log.fine ("Open=" + InvoiceOpenAmt + ", C_Invoice_ID=" + C_Invoice_ID + ", C_Currency_ID=" + C_Currency_Invoice_ID); - - // Get Info from Tab - BigDecimal PayAmt = (BigDecimal)mTab.getValue("PayAmt"); - BigDecimal DiscountAmt = (BigDecimal)mTab.getValue("DiscountAmt"); - BigDecimal WriteOffAmt = (BigDecimal)mTab.getValue("WriteOffAmt"); - BigDecimal OverUnderAmt = (BigDecimal)mTab.getValue("OverUnderAmt"); - log.fine("Pay=" + PayAmt + ", Discount=" + DiscountAmt - + ", WriteOff=" + WriteOffAmt + ", OverUnderAmt=" + OverUnderAmt); - // Get Currency Info - int C_Currency_ID = ((Integer)mTab.getValue("C_Currency_ID")).intValue(); - MCurrency currency = MCurrency.get(ctx, C_Currency_ID); - Timestamp ConvDate = (Timestamp)mTab.getValue("DateTrx"); + // Get Info from Tab + BigDecimal PayAmt = (BigDecimal)mTab.getValue ("PayAmt"); + BigDecimal DiscountAmt = (BigDecimal)mTab.getValue ("DiscountAmt"); + BigDecimal WriteOffAmt = (BigDecimal)mTab.getValue ("WriteOffAmt"); + BigDecimal OverUnderAmt = (BigDecimal)mTab.getValue ("OverUnderAmt"); + log.fine ("Pay=" + PayAmt + ", Discount=" + DiscountAmt + ", WriteOff=" + + WriteOffAmt + ", OverUnderAmt=" + OverUnderAmt); + // Get Currency Info + int C_Currency_ID = ((Integer)mTab.getValue ("C_Currency_ID")) + .intValue (); + MCurrency currency = MCurrency.get (ctx, C_Currency_ID); + Timestamp ConvDate = (Timestamp)mTab.getValue ("DateTrx"); int C_ConversionType_ID = 0; - Integer ii = (Integer)mTab.getValue("C_ConversionType_ID"); + Integer ii = (Integer)mTab.getValue ("C_ConversionType_ID"); if (ii != null) - C_ConversionType_ID = ii.intValue(); - int AD_Client_ID = Env.getContextAsInt(ctx, WindowNo, "AD_Client_ID"); - int AD_Org_ID = Env.getContextAsInt(ctx, WindowNo, "AD_Org_ID"); - // Get Currency Rate + C_ConversionType_ID = ii.intValue (); + int AD_Client_ID = Env.getContextAsInt (ctx, WindowNo, "AD_Client_ID"); + int AD_Org_ID = Env.getContextAsInt (ctx, WindowNo, "AD_Org_ID"); + // Get Currency Rate BigDecimal CurrencyRate = Env.ONE; - if ((C_Currency_ID > 0 && C_Currency_Invoice_ID > 0 && - C_Currency_ID != C_Currency_Invoice_ID) - || colName.equals("C_Currency_ID") || colName.equals("C_ConversionType_ID")) + if ((C_Currency_ID > 0 && C_Currency_Invoice_ID > 0 && C_Currency_ID != C_Currency_Invoice_ID) + || colName.equals ("C_Currency_ID") + || colName.equals ("C_ConversionType_ID")) { - log.fine("InvCurrency=" + C_Currency_Invoice_ID - + ", PayCurrency=" + C_Currency_ID - + ", Date=" + ConvDate + ", Type=" + C_ConversionType_ID); - CurrencyRate = MConversionRate.getRate (C_Currency_Invoice_ID, C_Currency_ID, - ConvDate, C_ConversionType_ID, AD_Client_ID, AD_Org_ID); - if (CurrencyRate == null || CurrencyRate.compareTo(Env.ZERO) == 0) + log.fine ("InvCurrency=" + C_Currency_Invoice_ID + ", PayCurrency=" + + C_Currency_ID + ", Date=" + ConvDate + ", Type=" + + C_ConversionType_ID); + CurrencyRate = MConversionRate.getRate (C_Currency_Invoice_ID, + C_Currency_ID, ConvDate, C_ConversionType_ID, AD_Client_ID, + AD_Org_ID); + if (CurrencyRate == null || CurrencyRate.compareTo (Env.ZERO) == 0) { - // mTab.setValue("C_Currency_ID", new Integer(C_Currency_Invoice_ID)); // does not work + // mTab.setValue("C_Currency_ID", new + // Integer(C_Currency_Invoice_ID)); // does not work if (C_Currency_Invoice_ID == 0) - return ""; // no error message when no invoice is selected + return ""; // no error message when no invoice is selected return "NoCurrencyConversion"; } // - InvoiceOpenAmt = InvoiceOpenAmt.multiply(CurrencyRate) - .setScale(currency.getStdPrecision(), BigDecimal.ROUND_HALF_UP); - log.fine("Rate=" + CurrencyRate + ", InvoiceOpenAmt=" + InvoiceOpenAmt); + InvoiceOpenAmt = InvoiceOpenAmt.multiply (CurrencyRate).setScale ( + currency.getStdPrecision (), BigDecimal.ROUND_HALF_UP); + log.fine ("Rate=" + CurrencyRate + ", InvoiceOpenAmt=" + + InvoiceOpenAmt); } - - // Currency Changed - convert all - if (colName.equals("C_Currency_ID") || colName.equals("C_ConversionType_ID")) + // Currency Changed - convert all + if (colName.equals ("C_Currency_ID") + || colName.equals ("C_ConversionType_ID")) { - PayAmt = PayAmt.multiply(CurrencyRate) - .setScale(currency.getStdPrecision(), BigDecimal.ROUND_HALF_UP); - mTab.setValue("PayAmt", PayAmt); - DiscountAmt = DiscountAmt.multiply(CurrencyRate) - .setScale(currency.getStdPrecision(), BigDecimal.ROUND_HALF_UP); - mTab.setValue("DiscountAmt", DiscountAmt); - WriteOffAmt = WriteOffAmt.multiply(CurrencyRate) - .setScale(currency.getStdPrecision(), BigDecimal.ROUND_HALF_UP); - mTab.setValue("WriteOffAmt", WriteOffAmt); - OverUnderAmt = OverUnderAmt.multiply(CurrencyRate) - .setScale(currency.getStdPrecision(), BigDecimal.ROUND_HALF_UP); - mTab.setValue("OverUnderAmt", OverUnderAmt); + PayAmt = PayAmt.multiply (CurrencyRate).setScale ( + currency.getStdPrecision (), BigDecimal.ROUND_HALF_UP); + mTab.setValue ("PayAmt", PayAmt); + DiscountAmt = DiscountAmt.multiply (CurrencyRate).setScale ( + currency.getStdPrecision (), BigDecimal.ROUND_HALF_UP); + mTab.setValue ("DiscountAmt", DiscountAmt); + WriteOffAmt = WriteOffAmt.multiply (CurrencyRate).setScale ( + currency.getStdPrecision (), BigDecimal.ROUND_HALF_UP); + mTab.setValue ("WriteOffAmt", WriteOffAmt); + OverUnderAmt = OverUnderAmt.multiply (CurrencyRate).setScale ( + currency.getStdPrecision (), BigDecimal.ROUND_HALF_UP); + mTab.setValue ("OverUnderAmt", OverUnderAmt); } - - // No Invoice - Set Discount, Witeoff, Under/Over to 0 + // No Invoice - Set Discount, Witeoff, Under/Over to 0 else if (C_Invoice_ID == 0) { - if (Env.ZERO.compareTo(DiscountAmt) != 0) - mTab.setValue("DiscountAmt", Env.ZERO); - if (Env.ZERO.compareTo(WriteOffAmt) != 0) - mTab.setValue("WriteOffAmt", Env.ZERO); - if (Env.ZERO.compareTo(OverUnderAmt) != 0) - mTab.setValue("OverUnderAmt", Env.ZERO); + if (Env.ZERO.compareTo (DiscountAmt) != 0) + mTab.setValue ("DiscountAmt", Env.ZERO); + if (Env.ZERO.compareTo (WriteOffAmt) != 0) + mTab.setValue ("WriteOffAmt", Env.ZERO); + if (Env.ZERO.compareTo (OverUnderAmt) != 0) + mTab.setValue ("OverUnderAmt", Env.ZERO); } - // PayAmt - calculate write off - //Added Lines By Goodwill (02-03-2006) - //Reason: we must make the callout is called just when docstatus is draft - //Old Code : else if (colName.equals("PayAmt")) - //New Code : - else if (colName.equals("PayAmt") && mTab.get_ValueAsString("DocStatus").equals("DR")) - //End By Goodwill + // PayAmt - calculate write off + // Added Lines By Goodwill (02-03-2006) + // Reason: we must make the callout is called just when docstatus is + // draft + // Old Code : else if (colName.equals("PayAmt")) + // New Code : + else if (colName.equals ("PayAmt") + && mTab.get_ValueAsString ("DocStatus").equals ("DR") + && "Y" + .equals (Env.getContext (ctx, WindowNo, "IsOverUnderPayment"))) { - WriteOffAmt = InvoiceOpenAmt.subtract(PayAmt).subtract(DiscountAmt).subtract(OverUnderAmt); - //Added Lines By Goodwill - //Reason: if overunderpayment is checked then the amount set to overunderamt automaticly - //Old Code: - //mTab.setValue("WriteOffAmt", WriteOffAmt); - //New Code: - if(!"Y".equals(Env.getContext(ctx, WindowNo, "IsOverUnderPayment"))) - mTab.setValue("WriteOffAmt", WriteOffAmt); - else - mTab.setValue("OverUnderAmt", WriteOffAmt); - //End Of Added Lines + OverUnderAmt = InvoiceOpenAmt.subtract (PayAmt).subtract ( + DiscountAmt).subtract (WriteOffAmt); + mTab.setValue ("OverUnderAmt", OverUnderAmt); } - //Added Lines By Goodwill (02-03-2006) - //Reason: we must make the callout is called just when docstatus is draft - //Old Code : else // calculate PayAmt - //New Code : - else if(mTab.get_ValueAsString("DocStatus").equals("DR")) // calculate PayAmt - //End By Goodwill + else if (colName.equals ("PayAmt") + && mTab.get_ValueAsString ("DocStatus").equals ("DR")) { - PayAmt = InvoiceOpenAmt.subtract(DiscountAmt).subtract(WriteOffAmt).subtract(OverUnderAmt); - mTab.setValue("PayAmt", PayAmt); + WriteOffAmt = InvoiceOpenAmt.subtract (PayAmt).subtract ( + DiscountAmt).subtract (OverUnderAmt); + mTab.setValue ("WriteOffAmt", WriteOffAmt); + } + else if (colName.equals ("IsOverUnderPayment") + && mTab.get_ValueAsString ("DocStatus").equals ("DR")) + { + boolean overUnderPaymentActive = "Y".equals (Env.getContext (ctx, + WindowNo, "IsOverUnderPayment")); + if (overUnderPaymentActive) + { + OverUnderAmt = InvoiceOpenAmt.subtract (PayAmt).subtract ( + DiscountAmt); + mTab.setValue ("WriteOffAmt", Env.ZERO); + mTab.setValue ("OverUnderAmt", OverUnderAmt); + }else{ + WriteOffAmt = InvoiceOpenAmt.subtract (PayAmt).subtract ( + DiscountAmt); + mTab.setValue ("WriteOffAmt", WriteOffAmt); + mTab.setValue ("OverUnderAmt", Env.ZERO); + } + } + // Added Lines By Goodwill (02-03-2006) + // Reason: we must make the callout is called just when docstatus is + // draft + // Old Code : else // calculate PayAmt + // New Code : + else if (mTab.get_ValueAsString ("DocStatus").equals ("DR")) // calculate + // PayAmt + // End By Goodwill + { + PayAmt = InvoiceOpenAmt.subtract (DiscountAmt).subtract ( + WriteOffAmt).subtract (OverUnderAmt); + mTab.setValue ("PayAmt", PayAmt); } return ""; - } // amounts - -} // CalloutPayment + } // amounts +} // CalloutPayment