diff --git a/client/src/org/compiere/apps/form/VPaySelect.java b/client/src/org/compiere/apps/form/VPaySelect.java
index 74951901da..e5b05904cf 100644
--- a/client/src/org/compiere/apps/form/VPaySelect.java
+++ b/client/src/org/compiere/apps/form/VPaySelect.java
@@ -622,6 +622,7 @@ public class VPaySelect extends CPanel
//
ff.pack();
this.setVisible(false);
+ AEnv.addToWindowManager(ff);
AEnv.showCenterScreen(ff);
this.dispose();
} // unlockUI
diff --git a/client/src/org/compiere/grid/VPayment.java b/client/src/org/compiere/grid/VPayment.java
index 610f8f02c4..9f2da87e73 100644
--- a/client/src/org/compiere/grid/VPayment.java
+++ b/client/src/org/compiere/grid/VPayment.java
@@ -1,1329 +1,1359 @@
-/******************************************************************************
- * 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.grid;
-
-import java.awt.*;
-import java.awt.event.*;
-import java.math.*;
-import java.sql.*;
-import java.text.*;
-import java.util.*;
-import java.util.logging.*;
-import javax.swing.*;
-
-import org.adempiere.plaf.AdempierePLAF;
-import org.compiere.apps.*;
-import org.compiere.grid.ed.*;
-import org.compiere.model.*;
-import org.compiere.plaf.*;
-import org.compiere.process.*;
-import org.compiere.swing.*;
-import org.compiere.util.*;
-
-/**
- * Display (and process) Payment Options.
- *
- * Payment Rule
- * -B- Cash (Date) -> Cash Entry
- * -P- Payment Term (Term)
- * -S- Check (Routing, ..) -> Payment Entry
- * -K- CreditCard (No) -> Payment Entry
- * -U- ACH Transfer (Routing) -> Payment Entry
- *
- * When processing:
- * - If an invoice is a S/K/U, but has no Payment Entry, it is changed to P
- * - If an invoive is B and has no Cash Entry, it is created
- * - An invoice is "Open" if it is "P" and no Payment
- *
- * Entry:
- * - If not processed, an invoice has no Cash or Payment entry
- * - The entry is created, during "Online" and when Saving
- *
- * Changes/Reversals:
- * - existing Cash Entries are reversed and newly created
- * - existing Payment Entries are not changed and then "hang there" and need to be allocated
- *
- *
- * @author Jorg Janke
- * @version $Id: VPayment.java,v 1.2 2006/07/30 00:51:28 jjanke Exp $
- */
-public class VPayment extends CDialog
- implements ActionListener
-{
- /**
- * Constructor
- *
- * @param WindowNo owning window
- * @param mTab owning tab
- * @param button button with access information
- */
- public VPayment (int WindowNo, GridTab mTab, VButton button)
- {
- super(Env.getWindow(WindowNo), Msg.getMsg(Env.getCtx(), "Payment"), true);
- m_WindowNo = WindowNo;
- m_isSOTrx = "Y".equals(Env.getContext(Env.getCtx(), WindowNo, "IsSOTrx"));
- m_mTab = mTab;
- try
- {
- bDateField = new VDate("DateAcct", false, false, true, DisplayType.Date, "DateAcct");
- jbInit();
- m_initOK = dynInit(button); // Null Pointer if order/invoice not saved yet
- }
- catch(Exception ex)
- {
- log.log(Level.SEVERE, "VPayment", ex);
- m_initOK = false;
- }
- //
- AEnv.positionCenterWindow(Env.getWindow(WindowNo), this);
- } // VPayment
-
- /** Window */
- private int m_WindowNo = 0;
- /** Tab */
- private GridTab m_mTab;
-
- // Data from Order/Invoice
- private String m_DocStatus = null;
- /** Start Payment Rule */
- private String m_PaymentRule = "";
- /** Start Payment Term */
- private int m_C_PaymentTerm_ID = 0;
- /** Start Acct Date */
- private Timestamp m_DateAcct = null;
- /** Start Payment */
- private int m_C_Payment_ID = 0;
- private MPayment m_mPayment = null;
- private MPayment m_mPaymentOriginal = null;
- /** Start CashBook Line */
- private int m_C_CashLine_ID = 0;
- private MCashLine m_cashLine = null;
- /** Start CreditCard */
- private String m_CCType = "";
- /** Start Bank Account */
- private int m_C_BankAccount_ID = 0;
- /** Start CashBook */
- private int m_C_CashBook_ID = 0;
-
- /** Is SOTrx */
- private boolean m_isSOTrx = true;
-
- /** Invoice Currency */
- private int m_C_Currency_ID = 0;
- private int m_AD_Client_ID = 0;
- private int m_AD_Org_ID = 0;
- private int m_C_BPartner_ID = 0;
- private BigDecimal m_Amount = Env.ZERO; // Payment Amount
- //
- private boolean m_initOK = false;
- /** Only allow changing Rule */
- private boolean m_onlyRule = false;
- private DecimalFormat m_Format = DisplayType.getNumberFormat(DisplayType.Amount);
- private static Hashtable s_Currencies = null; // EMU Currencies
-
- private boolean m_needSave = false;
- /** Logger */
- private static CLogger log = CLogger.getCLogger(VPayment.class);
-
- //
- private CPanel mainPanel = new CPanel();
- private BorderLayout mainLayout = new BorderLayout();
- private CPanel northPanel = new CPanel();
- private CPanel centerPanel = new CPanel();
- private FlowLayout northLayout = new FlowLayout();
- private CComboBox paymentCombo = new CComboBox();
- private CLabel paymentLabel = new CLabel();
- private CardLayout centerLayout = new CardLayout();
- private CPanel bPanel = new CPanel();
- private CPanel kPanel = new CPanel();
- private GridBagLayout kLayout = new GridBagLayout();
- private CLabel kTypeLabel = new CLabel();
- private CComboBox kTypeCombo = new CComboBox();
- private CLabel kNumnerLabel = new CLabel();
- private CTextField kNumberField = new CTextField();
- private CLabel kExpLabel = new CLabel();
- private CTextField kExpField = new CTextField();
- private CLabel kApprovalLabel = new CLabel();
- private CTextField kApprovalField = new CTextField();
- private CPanel tPanel = new CPanel();
- private CLabel tAccountLabel = new CLabel();
- private CComboBox tAccountCombo = new CComboBox();
- private CPanel sPanel = new CPanel();
- private GridBagLayout sPanelLayout = new GridBagLayout();
- private CLabel sNumberLabel = new CLabel();
- private CTextField sNumberField = new CTextField();
- private CLabel sRoutingLabel = new CLabel();
- private CTextField sRoutingField = new CTextField();
- private CLabel sCurrencyLabel = new CLabel();
- private CComboBox sCurrencyCombo = new CComboBox();
- private CLabel bCurrencyLabel = new CLabel();
- private CComboBox bCurrencyCombo = new CComboBox();
- private CPanel pPanel = new CPanel();
- private CLabel pTermLabel = new CLabel();
- private CComboBox pTermCombo = new CComboBox();
- private GridBagLayout bPanelLayout = new GridBagLayout();
- private CLabel bAmountLabel = new CLabel();
- private CLabel bAmountField = new CLabel();
- private CLabel sAmountLabel = new CLabel();
- private CLabel sAmountField = new CLabel();
- private VDate bDateField;
- private CLabel bDateLabel = new CLabel();
- private ConfirmPanel confirmPanel = new ConfirmPanel(true);
- private CTextField sCheckField = new CTextField();
- private CLabel sCheckLabel = new CLabel();
- private CButton kOnline = new CButton();
- private CButton sOnline = new CButton();
- private CComboBox sBankAccountCombo = new CComboBox();
- private CLabel sBankAccountLabel = new CLabel();
- private GridBagLayout pPanelLayout = new GridBagLayout();
- private CLabel bCashBookLabel = new CLabel();
- private CComboBox bCashBookCombo = new CComboBox();
- private GridBagLayout tPanelLayout = new GridBagLayout();
- private CLabel kStatus = new CLabel();
- private CLabel tStatus = new CLabel();
- private CLabel sStatus = new CLabel();
-
- /**
- * Static Init
- * @throws Exception
- */
- private void jbInit() throws Exception
- {
- centerPanel.setBorder(BorderFactory.createRaisedBevelBorder());
- getContentPane().add(mainPanel);
- mainPanel.setLayout(mainLayout);
- mainPanel.add(centerPanel, BorderLayout.CENTER);
- //
- northPanel.setLayout(northLayout);
- paymentLabel.setText(Msg.translate(Env.getCtx(), "PaymentRule"));
- mainPanel.add(northPanel, BorderLayout.NORTH);
- northPanel.add(paymentLabel, null);
- northPanel.add(paymentCombo, null);
- //
- centerPanel.setLayout(centerLayout);
- // CreditCard
- kPanel.setLayout(kLayout);
- kNumberField.setPreferredSize(new Dimension(120, 21));
- kExpField.setPreferredSize(new Dimension(40, 21));
- kApprovalField.setPreferredSize(new Dimension(120, 21));
- kTypeLabel.setText(Msg.translate(Env.getCtx(), "CreditCardType"));
- kNumnerLabel.setText(Msg.translate(Env.getCtx(), "CreditCardNumber"));
- kExpLabel.setText(Msg.getMsg(Env.getCtx(), "Expires"));
- kApprovalLabel.setText(Msg.translate(Env.getCtx(), "VoiceAuthCode"));
- kOnline.setText(Msg.getMsg(Env.getCtx(), "Online"));
- kOnline.addActionListener(this);
- kStatus.setText(" ");
- centerPanel.add(kPanel, "kPanel");
- centerLayout.addLayoutComponent(kPanel, "kPanel");
- kPanel.add(kTypeLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
- ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 0, 2, 0), 0, 0));
- kPanel.add(kTypeCombo, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
- ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 5, 2, 5), 0, 0));
- kPanel.add(kNumnerLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
- ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 0, 2, 0), 0, 0));
- kPanel.add(kNumberField, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0
- ,GridBagConstraints.WEST, GridBagConstraints.VERTICAL, new Insets(2, 5, 2, 5), 0, 0));
- kPanel.add(kExpLabel, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
- ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 0, 2, 0), 0, 0));
- kPanel.add(kExpField, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0
- ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 5, 2, 5), 0, 0));
- kPanel.add(kApprovalLabel, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
- ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 0), 0, 0));
- kPanel.add(kApprovalField, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0
- ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
- kPanel.add(kStatus, new GridBagConstraints(0, 4, 2, 1, 0.0, 0.0
- ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
- kPanel.add(kOnline, new GridBagConstraints(2, 3, 1, 1, 0.0, 0.0
- ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
- // DircetDebit/Credit
- tPanel.setLayout(tPanelLayout);
- tAccountLabel.setText(Msg.translate(Env.getCtx(), "C_BP_BankAccount_ID"));
- tStatus.setText(" ");
- centerPanel.add(tPanel, "tPanel");
- centerLayout.addLayoutComponent(tPanel, "tPanel");
- tPanel.add(tAccountLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
- ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 0), 0, 0));
- tPanel.add(tAccountCombo, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
- ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
- tPanel.add(tStatus, new GridBagConstraints(0, 3, 2, 1, 0.0, 0.0
- ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
- //
- sPanel.setLayout(sPanelLayout);
- sBankAccountLabel.setText(Msg.translate(Env.getCtx(), "C_BankAccount_ID"));
- sAmountLabel.setText(Msg.getMsg(Env.getCtx(), "Amount"));
- sAmountField.setText("");
- sRoutingLabel.setText(Msg.translate(Env.getCtx(), "RoutingNo"));
- sNumberLabel.setText(Msg.translate(Env.getCtx(), "AccountNo"));
- sCheckLabel.setText(Msg.translate(Env.getCtx(), "CheckNo"));
- sCheckField.setColumns(8);
- sCurrencyLabel.setText(Msg.translate(Env.getCtx(), "C_Currency_ID"));
- sNumberField.setPreferredSize(new Dimension(100, 21));
- sRoutingField.setPreferredSize(new Dimension(70, 21));
- sStatus.setText(" ");
- sOnline.setText(Msg.getMsg(Env.getCtx(), "Online"));
- centerPanel.add(sPanel, "sPanel");
- centerLayout.addLayoutComponent(sPanel, "sPanel");
- sPanel.add(sCurrencyLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
- ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 0, 2, 0), 0, 0));
- sPanel.add(sCurrencyCombo, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0
- ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 5, 2, 5), 0, 0));
- sPanel.add(sRoutingField, new GridBagConstraints(1, 4, 2, 1, 0.0, 0.0
- ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 2, 0), 0, 0));
- sPanel.add(sNumberField, new GridBagConstraints(1, 5, 2, 1, 0.0, 0.0
- ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 2, 0), 0, 0));
- sPanel.add(sCheckField, new GridBagConstraints(1, 6, 1, 1, 0.0, 0.0
- ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 5, 2, 0), 0, 0));
- sPanel.add(sRoutingLabel, new GridBagConstraints(0, 3, 1, 2, 0.0, 0.0
- ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 2, 0), 0, 0));
- sPanel.add(sNumberLabel, new GridBagConstraints(0, 5, 1, 1, 0.0, 0.0
- ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 0, 2, 0), 0, 0));
- sPanel.add(sCheckLabel, new GridBagConstraints(0, 6, 1, 1, 0.0, 0.0
- ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 0, 2, 0), 0, 0));
- sPanel.add(sBankAccountCombo, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
- ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 2, 5), 0, 0));
- sPanel.add(sBankAccountLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
- ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 0, 2, 0), 0, 0));
- sPanel.add(sStatus, new GridBagConstraints(0, 7, 3, 1, 0.0, 0.0
- ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
- sPanel.add(sOnline, new GridBagConstraints(3, 6, 1, 1, 0.0, 0.0
- ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
- sPanel.add(sAmountField, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0
- ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 5, 5, 5), 0, 0));
- sPanel.add(sAmountLabel, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
- ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 0, 5, 0), 0, 0));
- //
- pPanel.setLayout(pPanelLayout);
- pTermLabel.setText(Msg.translate(Env.getCtx(), "C_PaymentTerm_ID"));
- centerPanel.add(pPanel, "pPanel");
- centerLayout.addLayoutComponent(pPanel, "pPanel");
- pPanel.add(pTermLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
- ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 5, 2, 0), 0, 0));
- pPanel.add(pTermCombo, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
- ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 5, 2, 5), 0, 0));
- //
- bCashBookLabel.setText(Msg.translate(Env.getCtx(), "C_CashBook_ID"));
- bCurrencyLabel.setText(Msg.translate(Env.getCtx(), "C_Currency_ID"));
- bPanel.setLayout(bPanelLayout);
- bAmountLabel.setText(Msg.getMsg(Env.getCtx(), "Amount"));
- bAmountField.setText("");
- bDateLabel.setText(Msg.translate(Env.getCtx(), "DateAcct"));
- centerLayout.addLayoutComponent(bPanel, "bPanel");
- centerPanel.add(bPanel, "bPanel");
- bPanel.add(bCurrencyLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
- ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 0, 2, 0), 0, 0));
- bPanel.add(bCurrencyCombo, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0
- ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 5, 2, 5), 0, 0));
- bPanel.add(bDateField, new GridBagConstraints(1, 2, 2, 1, 0.0, 0.0
- ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 2, 5), 0, 0));
- bPanel.add(bDateLabel, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
- ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 0, 2, 0), 0, 0));
- bPanel.add(bCashBookLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
- ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 0, 2, 0), 0, 0));
- bPanel.add(bCashBookCombo, new GridBagConstraints(1, 0, 2, 1, 0.0, 0.0
- ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 5, 2, 5), 0, 0));
- bPanel.add(bAmountLabel, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
- ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 0, 2, 0), 0, 0));
- bPanel.add(bAmountField, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0
- ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 2, 5), 0, 0));
- //
- mainPanel.add(confirmPanel, BorderLayout.SOUTH);
- confirmPanel.addActionListener(this);
- } // jbInit
-
-
- /**************************************************************************
- * Dynamic Init.
- * B (Cash) (Currency)
- * K (CreditCard) Type, Number, Exp, Approval
- * L (DirectDebit) BPartner_Bank
- * P (PaymentTerm) PaymentTerm
- * S (Check) (Currency) CheckNo, Routing
- *
- * Currencies are shown, if member of EMU
- * @param button payment type button
- * @return true if init OK
- * @throws Exception
- */
- private boolean dynInit (VButton button) throws Exception
- {
- m_DocStatus = (String)m_mTab.getValue("DocStatus");
- log.config(m_DocStatus);
-
- if (m_mTab.getValue("C_BPartner_ID") == null)
- {
- ADialog.error(0, this, "SaveErrorRowNotFound");
- return false;
- }
-
- // Is the Trx posted?
- // String Posted = (String)m_mTab.getValue("Posted");
- // if (Posted != null && Posted.equals("Y"))
- // return false;
-
- // DocStatus
- m_DocStatus = (String)m_mTab.getValue("DocStatus");
- if (m_DocStatus == null)
- m_DocStatus = "";
- // Is the Trx closed? Reversed / Voided / Cloased
- if (m_DocStatus.equals("RE") || m_DocStatus.equals("VO") || m_DocStatus.equals("CL"))
- return false;
- // Document is not complete - allow to change the Payment Rule only
- if (m_DocStatus.equals("CO") || m_DocStatus.equals("WP") )
- m_onlyRule = false;
- else
- m_onlyRule = true;
- // PO only Rule
- if (!m_onlyRule // Only order has Warehouse
- && !m_isSOTrx && m_mTab.getValue("M_Warehouse_ID") != null)
- m_onlyRule = true;
-
- centerPanel.setVisible(!m_onlyRule);
-
-
- // Amount
- m_Amount = (BigDecimal)m_mTab.getValue("GrandTotal");
- if (!m_onlyRule && m_Amount.compareTo(Env.ZERO) == 0)
- {
- ADialog.error(m_WindowNo, this, "PaymentZero");
- return false;
- }
- bAmountField.setText(m_Format.format(m_Amount));
- sAmountField.setText(m_Format.format(m_Amount));
-
- /**
- * Get Data from Grid
- */
- m_AD_Client_ID = ((Integer)m_mTab.getValue("AD_Client_ID")).intValue();
- m_AD_Org_ID = ((Integer)m_mTab.getValue("AD_Org_ID")).intValue();
- m_C_BPartner_ID = ((Integer)m_mTab.getValue("C_BPartner_ID")).intValue();
- m_PaymentRule = (String)m_mTab.getValue("PaymentRule");
- m_C_Currency_ID = ((Integer)m_mTab.getValue("C_Currency_ID")).intValue();
- m_DateAcct = (Timestamp)m_mTab.getValue("DateAcct");
- if (m_mTab.getValue("C_PaymentTerm_ID") != null)
- m_C_PaymentTerm_ID = ((Integer)m_mTab.getValue("C_PaymentTerm_ID")).intValue();
- // Existing Payment
- if (m_mTab.getValue("C_Payment_ID") != null)
- {
- m_C_Payment_ID = ((Integer)m_mTab.getValue("C_Payment_ID")).intValue();
- if (m_C_Payment_ID != 0)
- {
- m_mPayment = new MPayment(Env.getCtx(), m_C_Payment_ID, null);
- m_mPaymentOriginal = new MPayment(Env.getCtx(), m_C_Payment_ID, null); // full copy
- // CreditCard
- m_CCType = m_mPayment.getCreditCardType();
- kNumberField.setText(m_mPayment.getCreditCardNumber());
- kExpField.setText(m_mPayment.getCreditCardExp(null));
- kApprovalField.setText(m_mPayment.getVoiceAuthCode());
- kStatus.setText(m_mPayment.getR_PnRef());
- // if approved/paid, don't let it change
- kTypeCombo.setReadWrite(!m_mPayment.isApproved());
- kNumberField.setReadWrite(!m_mPayment.isApproved());
- kExpField.setReadWrite(!m_mPayment.isApproved());
- kApprovalField.setReadWrite(!m_mPayment.isApproved());
- kOnline.setReadWrite(!m_mPayment.isApproved());
- // Check
- m_C_BankAccount_ID = m_mPayment.getC_BankAccount_ID();
- sRoutingField.setText(m_mPayment.getRoutingNo());
- sNumberField.setText(m_mPayment.getAccountNo());
- sCheckField.setText(m_mPayment.getCheckNo());
- sStatus.setText(m_mPayment.getR_PnRef());
- // Transfer
- tStatus.setText(m_mPayment.getR_PnRef());
- }
- }
- if (m_mPayment == null)
- {
- m_mPayment = new MPayment (Env.getCtx (), 0, null);
- m_mPayment.setAD_Org_ID(m_AD_Org_ID);
- m_mPayment.setAmount (m_C_Currency_ID, m_Amount);
- }
-
- // Existing Cahbook entry
- m_cashLine = null;
- m_C_CashLine_ID = 0;
- if (m_mTab.getValue("C_CashLine_ID") != null)
- {
- m_C_CashLine_ID = ((Integer)m_mTab.getValue("C_CashLine_ID")).intValue();
- if (m_C_CashLine_ID == 0)
- m_cashLine = null;
- else
- {
- m_cashLine = new MCashLine (Env.getCtx(), m_C_CashLine_ID, null);
- m_DateAcct = m_cashLine.getStatementDate();
- }
- }
-
- // Accounting Date
- bDateField.setValue(m_DateAcct);
-
- if (s_Currencies == null)
- loadCurrencies();
-
- // Is the currency an EMU currency?
- Integer C_Currency_ID = new Integer(m_C_Currency_ID);
- if (s_Currencies.containsKey(C_Currency_ID))
- {
- Enumeration en = s_Currencies.keys();
- while (en.hasMoreElements())
- {
- Object key = en.nextElement();
- bCurrencyCombo.addItem(s_Currencies.get(key));
- sCurrencyCombo.addItem(s_Currencies.get(key));
- }
- sCurrencyCombo.addActionListener(this);
- sCurrencyCombo.setSelectedItem(s_Currencies.get(C_Currency_ID));
- bCurrencyCombo.addActionListener(this);
- bCurrencyCombo.setSelectedItem(s_Currencies.get(C_Currency_ID));
- }
- else // No EMU Currency
- {
- bCurrencyLabel.setVisible(false); // Cash
- bCurrencyCombo.setVisible(false);
- sCurrencyLabel.setVisible(false); // Check
- sCurrencyCombo.setVisible(false);
- }
-
- /**
- * Payment Combo
- */
- if (m_PaymentRule == null)
- m_PaymentRule = "";
- ValueNamePair vp = null;
- HashMap values = button.getValues();
- Object[] a = values.keySet().toArray();
- for (int i = 0; i < a.length; i++)
- {
- String PaymentRule = (String)a[i]; // used for Panel selection
- if (X_C_Order.PAYMENTRULE_DirectDebit.equals(PaymentRule) // SO
- && !m_isSOTrx)
- continue;
- else if (X_C_Order.PAYMENTRULE_DirectDeposit.equals(PaymentRule) // PO
- && m_isSOTrx)
- continue;
- ValueNamePair pp = new ValueNamePair(PaymentRule, (String)values.get(a[i]));
- paymentCombo.addItem(pp);
- if (PaymentRule.toString().equals(m_PaymentRule)) // to select
- vp = pp;
- }
-
- // Set PaymentRule
- paymentCombo.addActionListener(this);
- if (vp != null)
- paymentCombo.setSelectedItem(vp);
-
- /**
- * Load Payment Terms
- */
- String SQL = MRole.getDefault().addAccessSQL(
- "SELECT C_PaymentTerm_ID, Name FROM C_PaymentTerm WHERE IsActive='Y' ORDER BY Name",
- "C_PaymentTerm", MRole.SQL_NOTQUALIFIED, MRole.SQL_RO);
- KeyNamePair kp = null;
- try
- {
- PreparedStatement pstmt = DB.prepareStatement(SQL, null);
- ResultSet rs = pstmt.executeQuery();
- while (rs.next())
- {
- int key = rs.getInt(1);
- String name = rs.getString(2);
- KeyNamePair pp = new KeyNamePair(key, name);
- pTermCombo.addItem(pp);
- if (key == m_C_PaymentTerm_ID)
- kp = pp;
- }
- rs.close();
- pstmt.close();
- }
- catch (SQLException ept)
- {
- log.log(Level.SEVERE, SQL, ept);
- }
- // Set Selection
- if (kp != null)
- pTermCombo.setSelectedItem(kp);
-
- /**
- * Load Accounts
- */
- SQL = "SELECT a.C_BP_BankAccount_ID, NVL(b.Name, ' ')||a.AccountNo AS Acct "
- + "FROM C_BP_BankAccount a,C_Bank b "
- + "WHERE C_BPartner_ID=? AND a.IsActive='Y'";
- kp = null;
- try
- {
- PreparedStatement pstmt = DB.prepareStatement(SQL, null);
- pstmt.setInt(1, m_C_BPartner_ID);
- ResultSet rs = pstmt.executeQuery();
- while (rs.next())
- {
- int key = rs.getInt(1);
- String name = rs.getString(2);
- KeyNamePair pp = new KeyNamePair(key, name);
- tAccountCombo.addItem(pp);
- // kp = pp;
- }
- rs.close();
- pstmt.close();
- }
- catch (SQLException eac)
- {
- log.log(Level.SEVERE, SQL, eac);
- }
- // Set Selection
- if (kp != null)
- tAccountCombo.setSelectedItem(kp);
-
- /**
- * Load Credit Cards
- */
- ValueNamePair[] ccs = m_mPayment.getCreditCards();
- vp = null;
- for (int i = 0; i < ccs.length; i++)
- {
- kTypeCombo.addItem(ccs[i]);
- if (ccs[i].getValue().equals(m_CCType))
- vp = ccs[i];
- }
- // Set Selection
- if (vp != null)
- kTypeCombo.setSelectedItem(vp);
-
- /**
- * Load Bank Accounts
- */
- SQL = MRole.getDefault().addAccessSQL(
- "SELECT C_BankAccount_ID, Name || ' ' || AccountNo, IsDefault "
- + "FROM C_BankAccount ba"
- + " INNER JOIN C_Bank b ON (ba.C_Bank_ID=b.C_Bank_ID) "
- + "WHERE b.IsActive='Y'",
- "ba", MRole.SQL_FULLYQUALIFIED, MRole.SQL_RO);
- kp = null;
- try
- {
- PreparedStatement pstmt = DB.prepareStatement(SQL, null);
- ResultSet rs = pstmt.executeQuery();
- while (rs.next())
- {
- int key = rs.getInt(1);
- String name = rs.getString(2);
- KeyNamePair pp = new KeyNamePair(key, name);
- sBankAccountCombo.addItem(pp);
- if (key == m_C_BankAccount_ID)
- kp = pp;
- if (kp == null && rs.getString(3).equals("Y")) // Default
- kp = pp;
- }
- rs.close();
- pstmt.close();
- }
- catch (SQLException ept)
- {
- log.log(Level.SEVERE, SQL, ept);
- }
- // Set Selection
- if (kp != null)
- sBankAccountCombo.setSelectedItem(kp);
-
-
- /**
- * Load Cash Books
- */
- SQL = MRole.getDefault().addAccessSQL(
- "SELECT C_CashBook_ID, Name, AD_Org_ID FROM C_CashBook WHERE IsActive='Y'",
- "C_CashBook", MRole.SQL_NOTQUALIFIED, MRole.SQL_RO);
- kp = null;
- try
- {
- PreparedStatement pstmt = DB.prepareStatement(SQL, null);
- ResultSet rs = pstmt.executeQuery();
- while (rs.next())
- {
- int key = rs.getInt(1);
- String name = rs.getString(2);
- KeyNamePair pp = new KeyNamePair(key, name);
- bCashBookCombo.addItem(pp);
- if (key == m_C_CashBook_ID)
- kp = pp;
- if (kp == null && key == m_AD_Org_ID) // Default Org
- kp = pp;
- }
- rs.close();
- pstmt.close();
- }
- catch (SQLException epc)
- {
- log.log(Level.SEVERE, SQL, epc);
- }
- // Set Selection
- if (kp != null)
- {
- bCashBookCombo.setSelectedItem(kp);
- if (m_C_CashBook_ID == 0)
- m_C_CashBook_ID = kp.getKey(); // set to default to avoid 'cashbook changed' message
- }
-
- //
- return true;
- } // dynInit
-
- /**
- * Init OK to be able to make changes?
- * @return true if init OK
- */
- public boolean isInitOK()
- {
- return m_initOK;
- } // isInitOK
-
-
- /**
- * Fill s_Currencies with EMU currencies
- */
- private void loadCurrencies()
- {
- s_Currencies = new Hashtable(12); // Currenly only 10+1
- String SQL = "SELECT C_Currency_ID, ISO_Code FROM C_Currency "
- + "WHERE (IsEMUMember='Y' AND EMUEntryDate " + newPaymentRule);
- // We had a CashBook Entry
- if (m_PaymentRule.equals(X_C_Order.PAYMENTRULE_Cash))
- {
- log.fine("Old Cash - " + m_cashLine);
- if (m_cashLine != null)
- {
- MCashLine cl = m_cashLine.createReversal();
- if (cl.save())
- log.config( "CashCancelled");
- else
- ADialog.error(m_WindowNo, this, "PaymentError", "CashNotCancelled");
- }
- newC_CashLine_ID = 0; // reset
- }
- // We had a change in Payment type (e.g. Check to CC)
- else if ("KTSD".indexOf(m_PaymentRule) != -1 && "KTSD".indexOf(newPaymentRule) != -1 && m_mPaymentOriginal != null)
- {
- log.fine("Old Payment(1) - " + m_mPaymentOriginal);
- m_mPaymentOriginal.setDocAction(DocAction.ACTION_Reverse_Correct);
- boolean ok = m_mPaymentOriginal.processIt(DocAction.ACTION_Reverse_Correct);
- m_mPaymentOriginal.save();
- if (ok)
- log.info( "Payment Canecelled - " + m_mPaymentOriginal);
- else
- ADialog.error(m_WindowNo, this, "PaymentError", "PaymentNotCancelled " + m_mPaymentOriginal.getDocumentNo());
- m_mPayment.resetNew();
- }
- // We had a Payment and something else (e.g. Check to Cash)
- else if ("KTSD".indexOf(m_PaymentRule) != -1 && "KTSD".indexOf(newPaymentRule) == -1)
- {
- log.fine("Old Payment(2) - " + m_mPaymentOriginal);
- if (m_mPaymentOriginal != null)
- {
- m_mPaymentOriginal.setDocAction(DocAction.ACTION_Reverse_Correct);
- boolean ok = m_mPaymentOriginal.processIt(DocAction.ACTION_Reverse_Correct);
- m_mPaymentOriginal.save();
- if (ok) // Cancel Payment
- {
- log.fine("PaymentCancelled " + m_mPayment.getDocumentNo ());
- m_mTab.getTableModel().dataSave(true);
- m_mPayment.resetNew();
- m_mPayment.setAmount(m_C_Currency_ID, m_Amount);
- }
- else
- ADialog.error(m_WindowNo, this, "PaymentError", "PaymentNotCancelled " + m_mPayment.getDocumentNo());
- }
- }
- }
-
- // Get Order and optionally Invoice
- int C_Order_ID = Env.getContextAsInt(Env.getCtx(), m_WindowNo, "C_Order_ID");
- int C_Invoice_ID = Env.getContextAsInt(Env.getCtx(), m_WindowNo, "C_Invoice_ID");
- if (C_Invoice_ID == 0 && m_DocStatus.equals("CO"))
- C_Invoice_ID = getInvoiceID (C_Order_ID);
-
- // Amount sign negative, if ARC (Credit Memo) or API (AP Invoice)
- boolean negateAmt = false;
- MInvoice invoice = null;
- if (C_Invoice_ID != 0)
- {
- invoice = new MInvoice (Env.getCtx(), C_Invoice_ID, null);
- negateAmt = invoice.isCreditMemo();
- }
- MOrder order = null;
- if (invoice == null && C_Order_ID != 0)
- order = new MOrder (Env.getCtx(), C_Order_ID, null);
- BigDecimal payAmount = m_Amount;
- if (negateAmt)
- payAmount = m_Amount.negate();
- // Info
- log.config("C_Order_ID=" + C_Order_ID + ", C_Invoice_ID=" + C_Invoice_ID + ", NegateAmt=" + negateAmt);
-
- /***********************
- * CashBook
- */
- if (newPaymentRule.equals(X_C_Order.PAYMENTRULE_Cash))
- {
- log.fine("Cash");
- String description = (String)m_mTab.getValue("DocumentNo");
-
- if (C_Invoice_ID == 0 && order == null)
- {
- log.config("No Invoice!");
- ADialog.error(m_WindowNo, this, "PaymentError", "CashNotCreated");
- }
- else
- {
- // Changed Amount
- if (m_cashLine != null
- && payAmount.compareTo(m_cashLine.getAmount()) != 0)
- {
- log.config("Changed CashBook Amount");
- m_cashLine.setAmount(payAmount);
- if (m_cashLine.save())
- log.config("CashAmt Changed");
- }
- // Different Date/CashBook
- if (m_cashLine != null
- && (newC_CashBook_ID != m_C_CashBook_ID
- || !TimeUtil.isSameDay(m_cashLine.getStatementDate(), newDateAcct)))
- {
- log.config("Changed CashBook/Date: " + m_C_CashBook_ID + "->" + newC_CashBook_ID);
- MCashLine reverse = m_cashLine.createReversal();
- if (!reverse.save())
- ADialog.error(m_WindowNo, this, "PaymentError", "CashNotCancelled");
- m_cashLine = null;
- }
-
- // Create new
- if (m_cashLine == null)
- {
- log.config("New CashBook");
- int C_Currency_ID = 0;
- if (invoice != null)
- C_Currency_ID = invoice.getC_Currency_ID();
- if (C_Currency_ID == 0 && order != null)
- C_Currency_ID = order.getC_Currency_ID();
- MCash cash = null;
- if (newC_CashBook_ID != 0)
- cash = MCash.get (Env.getCtx(), newC_CashBook_ID, newDateAcct, null);
- else // Default
- cash = MCash.get (Env.getCtx(), m_AD_Org_ID, newDateAcct, C_Currency_ID, null);
- if (cash == null || cash.get_ID() == 0)
- ADialog.error(m_WindowNo, this, "PaymentError", "CashNotCreated");
- else
- {
- MCashLine cl = new MCashLine (cash);
- if (invoice != null)
- cl.setInvoice(invoice);
- if (order != null)
- {
- cl.setOrder(order, null);
- m_needSave = true;
- }
- if (cl.save())
- log.config("CashCreated");
- else
- ADialog.error(m_WindowNo, this, "PaymentError", "CashNotCreated");
- }
- }
- } // have invoice
- }
- /***********************
- * Payments
- */
- if ("KS".indexOf(newPaymentRule) != -1)
- {
- log.fine("Payment - " + newPaymentRule);
- // Set Amount
- m_mPayment.setAmount(m_C_Currency_ID, payAmount);
- if (newPaymentRule.equals(MOrder.PAYMENTRULE_CreditCard))
- {
- m_mPayment.setCreditCard(MPayment.TRXTYPE_Sales, newCCType,
- kNumberField.getText(), "", kExpField.getText());
- m_mPayment.setPaymentProcessor();
- }
- else if (newPaymentRule.equals(MOrder.PAYMENTRULE_Check))
- {
- m_mPayment.setBankCheck(newC_BankAccount_ID, m_isSOTrx, sRoutingField.getText(),
- sNumberField.getText(), sCheckField.getText());
- }
- m_mPayment.setC_BPartner_ID(m_C_BPartner_ID);
- m_mPayment.setC_Invoice_ID(C_Invoice_ID);
- if (order != null)
- {
- m_mPayment.setC_Order_ID(C_Order_ID);
- m_needSave = true;
- }
- m_mPayment.setDateTrx(m_DateAcct);
- m_mPayment.setDateAcct(m_DateAcct);
- m_mPayment.save();
-
- // Save/Post
- if (MPayment.DOCSTATUS_Drafted.equals(m_mPayment.getDocStatus()))
- {
- boolean ok = m_mPayment.processIt(DocAction.ACTION_Complete);
- m_mPayment.save();
- if (ok)
- ADialog.info(m_WindowNo, this, "PaymentCreated", m_mPayment.getDocumentNo());
- else
- ADialog.error(m_WindowNo, this, "PaymentError", "PaymentNotCreated");
- }
- else
- log.fine("NotDraft " + m_mPayment);
- }
-
-
- /**********************
- * Save Values to mTab
- */
- log.config("Saving changes");
- //
- if (!newPaymentRule.equals(m_PaymentRule))
- m_mTab.setValue("PaymentRule", newPaymentRule);
- //
- if (!newDateAcct.equals(m_DateAcct))
- m_mTab.setValue("DateAcct", newDateAcct);
- //
- if (newC_PaymentTerm_ID != m_C_PaymentTerm_ID)
- m_mTab.setValue("C_PaymentTerm_ID", new Integer(newC_PaymentTerm_ID));
- // Set Payment
- if (m_mPayment.getC_Payment_ID() != m_C_Payment_ID)
- {
- if (m_mPayment.getC_Payment_ID() == 0)
- m_mTab.setValue("C_Payment_ID", null);
- else
- m_mTab.setValue("C_Payment_ID", new Integer(m_mPayment.getC_Payment_ID()));
- }
- // Set Cash
- if (newC_CashLine_ID != m_C_CashLine_ID)
- {
- if (newC_CashLine_ID == 0)
- m_mTab.setValue("C_CashLine_ID", null);
- else
- m_mTab.setValue("C_CashLine_ID", new Integer(newC_CashLine_ID));
- }
- return true;
- } // saveChanges
-
- /**
- * Check Mandatory
- * @return true if all mandatory items are OK
- */
- private boolean checkMandatory()
- {
- // log.config( "VPayment.checkMandatory");
-
- ValueNamePair vp = (ValueNamePair)paymentCombo.getSelectedItem();
- String PaymentRule = vp.getValue();
- // only Payment Rule
- if (m_onlyRule)
- return true;
-
- Timestamp DateAcct = m_DateAcct;
- int C_PaymentTerm_ID = m_C_PaymentTerm_ID;
- int C_CashBook_ID = m_C_CashBook_ID;
- String CCType = m_CCType;
- //
- int C_BankAccount_ID = 0;
-
- /***********************
- * Mandatory Data Check
- */
- boolean dataOK = true;
- // B (Cash) (Currency)
- if (PaymentRule.equals(MOrder.PAYMENTRULE_Cash))
- {
- KeyNamePair kp = (KeyNamePair)bCashBookCombo.getSelectedItem();
- if (kp != null)
- C_CashBook_ID = kp.getKey();
- DateAcct = (Timestamp)bDateField.getValue();
- }
-
- // K (CreditCard) Type, Number, Exp, Approval
- else if (PaymentRule.equals(MOrder.PAYMENTRULE_CreditCard))
- {
- vp = (ValueNamePair)kTypeCombo.getSelectedItem();
- if (vp != null)
- CCType = vp.getValue();
- //
- String error = MPaymentValidate.validateCreditCardNumber(kNumberField.getText(), CCType);
- if (error.length() != 0)
- {
- kNumberField.setBackground(AdempierePLAF.getFieldBackground_Error());
- if (error.indexOf("?") == -1)
- {
- ADialog.error(m_WindowNo, this, error);
- dataOK = false;
- }
- else // warning
- {
- if (!ADialog.ask(m_WindowNo, this, error))
- dataOK = false;
- }
- }
- error = MPaymentValidate.validateCreditCardExp(kExpField.getText());
- if(error.length() != 0)
- {
- kExpField.setBackground(AdempierePLAF.getFieldBackground_Error());
- ADialog.error(m_WindowNo, this, error);
- dataOK = false;
- }
- }
-
- // T (Transfer) BPartner_Bank
- else if (PaymentRule.equals(X_C_Order.PAYMENTRULE_DirectDeposit)
- || PaymentRule.equals(X_C_Order.PAYMENTRULE_DirectDebit))
- {
- KeyNamePair bpba = (KeyNamePair)tAccountCombo.getSelectedItem();
- if (bpba == null)
- {
- tAccountCombo.setBackground(AdempierePLAF.getFieldBackground_Error());
- ADialog.error(m_WindowNo, this, "PaymentBPBankNotFound");
- dataOK = false;
- }
- } // Direct
-
- // P (PaymentTerm) PaymentTerm
- else if (PaymentRule.equals(X_C_Order.PAYMENTRULE_OnCredit))
- {
- KeyNamePair kp = (KeyNamePair)pTermCombo.getSelectedItem();
- if (kp != null)
- C_PaymentTerm_ID = kp.getKey();
- }
-
- // S (Check) (Currency) CheckNo, Routing
- else if (PaymentRule.equals(MOrder.PAYMENTRULE_Check))
- {
- // sCurrencyCombo.getSelectedItem();
- KeyNamePair kp = (KeyNamePair)sBankAccountCombo.getSelectedItem();
- if (kp != null)
- C_BankAccount_ID = kp.getKey();
- String error = MPaymentValidate.validateRoutingNo(sRoutingField.getText());
- if (error.length() != 0)
- {
- sRoutingField.setBackground(AdempierePLAF.getFieldBackground_Error());
- ADialog.error(m_WindowNo, this, error);
- dataOK = false;
- }
- error = MPaymentValidate.validateAccountNo(sNumberField.getText());
- if (error.length() != 0)
- {
- sNumberField.setBackground(AdempierePLAF.getFieldBackground_Error());
- ADialog.error(m_WindowNo, this, error);
- dataOK = false;
- }
- error = MPaymentValidate.validateCheckNo(sCheckField.getText());
- if (error.length() != 0)
- {
- sCheckField.setBackground(AdempierePLAF.getFieldBackground_Error());
- ADialog.error(m_WindowNo, this, error);
- dataOK = false;
- }
- }
- else
- {
- log.log(Level.SEVERE, "Unknown PaymentRule " + PaymentRule);
- return false;
- }
-
- // find Bank Account if not qualified yet
- if ("KTSD".indexOf(PaymentRule) != -1 && C_BankAccount_ID == 0)
- {
- String tender = MPayment.TENDERTYPE_CreditCard;
- if (PaymentRule.equals(MOrder.PAYMENTRULE_DirectDeposit))
- tender = MPayment.TENDERTYPE_DirectDeposit;
- else if (PaymentRule.equals(MOrder.PAYMENTRULE_DirectDebit))
- tender = MPayment.TENDERTYPE_DirectDebit;
- else if (PaymentRule.equals(MOrder.PAYMENTRULE_Check))
- tender = MPayment.TENDERTYPE_Check;
- // Check must have a bank account
- if (C_BankAccount_ID == 0 && "S".equals(PaymentRule))
- {
- ADialog.error(m_WindowNo, this, "PaymentNoProcessor");
- dataOK = false;
- }
- }
- //
- log.config("OK=" + dataOK);
- return dataOK;
- } // checkMandatory
-
- /**
- * Get Invoice ID for Order
- * @param C_Order_ID order
- * @return C_Invoice_ID or 0 if not found
- */
- private static int getInvoiceID (int C_Order_ID)
- {
- int retValue = 0;
- String sql = "SELECT C_Invoice_ID FROM C_Invoice WHERE C_Order_ID=? "
- + "ORDER BY C_Invoice_ID DESC"; // last invoice
- try
- {
- PreparedStatement pstmt = DB.prepareStatement(sql, null);
- pstmt.setInt(1, C_Order_ID);
- ResultSet rs = pstmt.executeQuery();
- if (rs.next())
- retValue = rs.getInt(1);
- rs.close();
- pstmt.close();
- }
- catch (SQLException e)
- {
- log.log(Level.SEVERE, sql, e);
- }
- return retValue;
- } // getInvoiceID
-
-
- /**************************************************************************
- * Process Online (sales only) - if approved - exit
- */
- private void processOnline()
- {
- log.config("");
- if (!checkMandatory())
- return;
-
- boolean approved = false;
- String info = "";
- //
- ValueNamePair vp = (ValueNamePair)paymentCombo.getSelectedItem();
- String PaymentRule = vp.getValue();
-
- // -- CreditCard
- if (PaymentRule.equals(X_C_Order.PAYMENTRULE_CreditCard))
- {
- vp = (ValueNamePair)kTypeCombo.getSelectedItem();
- String CCType = vp.getValue();
-
- m_mPayment.setCreditCard(MPayment.TRXTYPE_Sales, CCType,
- kNumberField.getText(), "", kExpField.getText());
- m_mPayment.setAmount(m_C_Currency_ID, m_Amount);
- m_mPayment.setPaymentProcessor();
- m_mPayment.setC_BPartner_ID(m_C_BPartner_ID);
- //
- int C_Invoice_ID = Env.getContextAsInt(Env.getCtx(), m_WindowNo, "C_Invoice_ID");
- if (C_Invoice_ID == 0 && m_DocStatus.equals("CO"))
- {
- int C_Order_ID = Env.getContextAsInt(Env.getCtx(), m_WindowNo, "C_Order_ID");
- C_Invoice_ID = getInvoiceID (C_Order_ID);
- }
- m_mPayment.setC_Invoice_ID(C_Invoice_ID);
- m_mPayment.setDateTrx(m_DateAcct);
- // Set Amount
- m_mPayment.setAmount(m_C_Currency_ID, m_Amount);
-
- approved = m_mPayment.processOnline();
- info = m_mPayment.getR_RespMsg() + " (" + m_mPayment.getR_AuthCode()
- + ") ID=" + m_mPayment.getR_PnRef();
- boolean saved = m_mPayment.save();
-
- if (approved)
- {
- boolean ok = m_mPayment.processIt(DocAction.ACTION_Complete);
- m_mPayment.save();
- if (ok)
- ADialog.info(m_WindowNo, this, "PaymentProcessed", info + "\n" + m_mPayment.getDocumentNo());
- else
- ADialog.error(m_WindowNo, this, "PaymentError", "PaymentNotCreated");
- saveChanges();
- dispose();
- }
- else
- {
- ADialog.error(m_WindowNo, this, "PaymentNotProcessed", info);
- }
- }
- else
- ADialog.error(m_WindowNo, this, "PaymentNoProcessor");
- } // online
-
- /**
- * Need Save record (payment with waiting order)
- * @return true if payment with waiting order
- */
- public boolean needSave()
- {
- return m_needSave;
- } // needSave
-
-} // VPayment
+/******************************************************************************
+ * 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.grid;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.math.*;
+import java.sql.*;
+import java.text.*;
+import java.util.*;
+import java.util.logging.*;
+import javax.swing.*;
+
+import org.adempiere.plaf.AdempierePLAF;
+import org.compiere.apps.*;
+import org.compiere.grid.ed.*;
+import org.compiere.model.*;
+import org.compiere.plaf.*;
+import org.compiere.process.*;
+import org.compiere.swing.*;
+import org.compiere.util.*;
+
+/**
+ * Display (and process) Payment Options.
+ *
+ * Payment Rule
+ * -B- Cash (Date) -> Cash Entry
+ * -P- Payment Term (Term)
+ * -S- Check (Routing, ..) -> Payment Entry
+ * -K- CreditCard (No) -> Payment Entry
+ * -U- ACH Transfer (Routing) -> Payment Entry
+ *
+ * When processing:
+ * - If an invoice is a S/K/U, but has no Payment Entry, it is changed to P
+ * - If an invoive is B and has no Cash Entry, it is created
+ * - An invoice is "Open" if it is "P" and no Payment
+ *
+ * Entry:
+ * - If not processed, an invoice has no Cash or Payment entry
+ * - The entry is created, during "Online" and when Saving
+ *
+ * Changes/Reversals:
+ * - existing Cash Entries are reversed and newly created
+ * - existing Payment Entries are not changed and then "hang there" and need to be allocated
+ *
+ *
+ * @author Jorg Janke
+ * @version $Id: VPayment.java,v 1.2 2006/07/30 00:51:28 jjanke Exp $
+ */
+public class VPayment extends CDialog
+ implements ActionListener
+{
+ /**
+ * Constructor
+ *
+ * @param WindowNo owning window
+ * @param mTab owning tab
+ * @param button button with access information
+ */
+ public VPayment (int WindowNo, GridTab mTab, VButton button)
+ {
+ super(Env.getWindow(WindowNo), Msg.getMsg(Env.getCtx(), "Payment"), true);
+ m_WindowNo = WindowNo;
+ m_isSOTrx = "Y".equals(Env.getContext(Env.getCtx(), WindowNo, "IsSOTrx"));
+ m_mTab = mTab;
+ try
+ {
+ bDateField = new VDate("DateAcct", false, false, true, DisplayType.Date, "DateAcct");
+ jbInit();
+ m_initOK = dynInit(button); // Null Pointer if order/invoice not saved yet
+ }
+ catch(Exception ex)
+ {
+ log.log(Level.SEVERE, "VPayment", ex);
+ m_initOK = false;
+ }
+ //
+ AEnv.positionCenterWindow(Env.getWindow(WindowNo), this);
+ } // VPayment
+
+ /** Window */
+ private int m_WindowNo = 0;
+ /** Tab */
+ private GridTab m_mTab;
+
+ // Data from Order/Invoice
+ private String m_DocStatus = null;
+ /** Start Payment Rule */
+ private String m_PaymentRule = "";
+ /** Start Payment Term */
+ private int m_C_PaymentTerm_ID = 0;
+ /** Start Acct Date */
+ private Timestamp m_DateAcct = null;
+ /** Start Payment */
+ private int m_C_Payment_ID = 0;
+ private MPayment m_mPayment = null;
+ private MPayment m_mPaymentOriginal = null;
+ /** Start CashBook Line */
+ private int m_C_CashLine_ID = 0;
+ private MCashLine m_cashLine = null;
+ /** Start CreditCard */
+ private String m_CCType = "";
+ /** Start Bank Account */
+ private int m_C_BankAccount_ID = 0;
+ /** Start CashBook */
+ private int m_C_CashBook_ID = 0;
+
+ /** Is SOTrx */
+ private boolean m_isSOTrx = true;
+
+ /** Invoice Currency */
+ private int m_C_Currency_ID = 0;
+ private int m_AD_Client_ID = 0;
+ private int m_AD_Org_ID = 0;
+ private int m_C_BPartner_ID = 0;
+ private BigDecimal m_Amount = Env.ZERO; // Payment Amount
+ //
+ private boolean m_initOK = false;
+ /** Only allow changing Rule */
+ private boolean m_onlyRule = false;
+ private DecimalFormat m_Format = DisplayType.getNumberFormat(DisplayType.Amount);
+ private static Hashtable s_Currencies = null; // EMU Currencies
+
+ private boolean m_needSave = false;
+ /** Logger */
+ private static CLogger log = CLogger.getCLogger(VPayment.class);
+
+ //
+ private CPanel mainPanel = new CPanel();
+ private BorderLayout mainLayout = new BorderLayout();
+ private CPanel northPanel = new CPanel();
+ private CPanel centerPanel = new CPanel();
+ private FlowLayout northLayout = new FlowLayout();
+ private CComboBox paymentCombo = new CComboBox();
+ private CLabel paymentLabel = new CLabel();
+ private CardLayout centerLayout = new CardLayout();
+ private CPanel bPanel = new CPanel();
+ private CPanel kPanel = new CPanel();
+ private GridBagLayout kLayout = new GridBagLayout();
+ private CLabel kTypeLabel = new CLabel();
+ private CComboBox kTypeCombo = new CComboBox();
+ private CLabel kNumnerLabel = new CLabel();
+ private CTextField kNumberField = new CTextField();
+ private CLabel kExpLabel = new CLabel();
+ private CTextField kExpField = new CTextField();
+ private CLabel kApprovalLabel = new CLabel();
+ private CTextField kApprovalField = new CTextField();
+ private CPanel tPanel = new CPanel();
+ private CLabel tAccountLabel = new CLabel();
+ private CComboBox tAccountCombo = new CComboBox();
+ private CPanel sPanel = new CPanel();
+ private GridBagLayout sPanelLayout = new GridBagLayout();
+ private CLabel sNumberLabel = new CLabel();
+ private CTextField sNumberField = new CTextField();
+ private CLabel sRoutingLabel = new CLabel();
+ private CTextField sRoutingField = new CTextField();
+ private CLabel sCurrencyLabel = new CLabel();
+ private CComboBox sCurrencyCombo = new CComboBox();
+ private CLabel bCurrencyLabel = new CLabel();
+ private CComboBox bCurrencyCombo = new CComboBox();
+ private CPanel pPanel = new CPanel();
+ private CLabel pTermLabel = new CLabel();
+ private CComboBox pTermCombo = new CComboBox();
+ private GridBagLayout bPanelLayout = new GridBagLayout();
+ private CLabel bAmountLabel = new CLabel();
+ private CLabel bAmountField = new CLabel();
+ private CLabel sAmountLabel = new CLabel();
+ private CLabel sAmountField = new CLabel();
+ private VDate bDateField;
+ private CLabel bDateLabel = new CLabel();
+ private ConfirmPanel confirmPanel = new ConfirmPanel(true);
+ private CTextField sCheckField = new CTextField();
+ private CLabel sCheckLabel = new CLabel();
+ private CButton kOnline = new CButton();
+ private CButton sOnline = new CButton();
+ private CComboBox sBankAccountCombo = new CComboBox();
+ private CLabel sBankAccountLabel = new CLabel();
+ private GridBagLayout pPanelLayout = new GridBagLayout();
+ private CLabel bCashBookLabel = new CLabel();
+ private CComboBox bCashBookCombo = new CComboBox();
+ private GridBagLayout tPanelLayout = new GridBagLayout();
+ private CButton tOnline = new CButton();
+ private CLabel kStatus = new CLabel();
+ private CTextField tRoutingField = new CTextField();
+ private CTextField tNumberField = new CTextField();
+ private CLabel tStatus = new CLabel();
+ private CLabel tRoutingText = new CLabel();
+ private CLabel tNumberText = new CLabel();
+ private CLabel sStatus = new CLabel();
+
+ /**
+ * Static Init
+ * @throws Exception
+ */
+ private void jbInit() throws Exception
+ {
+ centerPanel.setBorder(BorderFactory.createRaisedBevelBorder());
+ getContentPane().add(mainPanel);
+ mainPanel.setLayout(mainLayout);
+ mainPanel.add(centerPanel, BorderLayout.CENTER);
+ //
+ northPanel.setLayout(northLayout);
+ paymentLabel.setText(Msg.translate(Env.getCtx(), "PaymentRule"));
+ mainPanel.add(northPanel, BorderLayout.NORTH);
+ northPanel.add(paymentLabel, null);
+ northPanel.add(paymentCombo, null);
+ //
+ centerPanel.setLayout(centerLayout);
+ // CreditCard
+ kPanel.setLayout(kLayout);
+ kNumberField.setPreferredSize(new Dimension(120, 21));
+ kExpField.setPreferredSize(new Dimension(40, 21));
+ kApprovalField.setPreferredSize(new Dimension(120, 21));
+ kTypeLabel.setText(Msg.translate(Env.getCtx(), "CreditCardType"));
+ kNumnerLabel.setText(Msg.translate(Env.getCtx(), "CreditCardNumber"));
+ kExpLabel.setText(Msg.getMsg(Env.getCtx(), "Expires"));
+ kApprovalLabel.setText(Msg.translate(Env.getCtx(), "VoiceAuthCode"));
+ kOnline.setText(Msg.getMsg(Env.getCtx(), "Online"));
+ kOnline.addActionListener(this);
+ kStatus.setText(" ");
+ centerPanel.add(kPanel, "kPanel");
+ centerLayout.addLayoutComponent(kPanel, "kPanel");
+ kPanel.add(kTypeLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 0, 2, 0), 0, 0));
+ kPanel.add(kTypeCombo, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 5, 2, 5), 0, 0));
+ kPanel.add(kNumnerLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 0, 2, 0), 0, 0));
+ kPanel.add(kNumberField, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.WEST, GridBagConstraints.VERTICAL, new Insets(2, 5, 2, 5), 0, 0));
+ kPanel.add(kExpLabel, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 0, 2, 0), 0, 0));
+ kPanel.add(kExpField, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 5, 2, 5), 0, 0));
+ kPanel.add(kApprovalLabel, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 0), 0, 0));
+ kPanel.add(kApprovalField, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+ kPanel.add(kStatus, new GridBagConstraints(0, 4, 2, 1, 0.0, 0.0
+ ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+ kPanel.add(kOnline, new GridBagConstraints(2, 3, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+ // DircetDebit/Credit
+ tPanel.setLayout(tPanelLayout);
+ tAccountLabel.setText(Msg.translate(Env.getCtx(), "C_BP_BankAccount_ID"));
+ tRoutingField.setColumns(8);
+ tNumberField.setColumns(10);
+ tRoutingText.setText(Msg.translate(Env.getCtx(), "RoutingNo"));
+ tNumberText.setText(Msg.translate(Env.getCtx(), "AccountNo"));
+ tOnline.setText(Msg.getMsg(Env.getCtx(), "Online"));
+ tStatus.setText(" ");
+ centerPanel.add(tPanel, "tPanel");
+ centerLayout.addLayoutComponent(tPanel, "tPanel");
+ tPanel.add(tAccountLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 0), 0, 0));
+ tPanel.add(tAccountCombo, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+ tPanel.add(tRoutingField, new GridBagConstraints(1, 1, 2, 1, 0.0, 0.0
+ ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 0, 5), 0, 0));
+ tPanel.add(tNumberField, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 0, 5), 0, 0));
+ tPanel.add(tStatus, new GridBagConstraints(0, 3, 2, 1, 0.0, 0.0
+ ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+ tPanel.add(tRoutingText, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 0, 0), 0, 0));
+ tPanel.add(tNumberText, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 0, 0), 0, 0));
+ tPanel.add(tOnline, new GridBagConstraints(3, 2, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.NORTHEAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+ //
+ sPanel.setLayout(sPanelLayout);
+ sBankAccountLabel.setText(Msg.translate(Env.getCtx(), "C_BankAccount_ID"));
+ sAmountLabel.setText(Msg.getMsg(Env.getCtx(), "Amount"));
+ sAmountField.setText("");
+ sRoutingLabel.setText(Msg.translate(Env.getCtx(), "RoutingNo"));
+ sNumberLabel.setText(Msg.translate(Env.getCtx(), "AccountNo"));
+ sCheckLabel.setText(Msg.translate(Env.getCtx(), "CheckNo"));
+ sCheckField.setColumns(8);
+ sCurrencyLabel.setText(Msg.translate(Env.getCtx(), "C_Currency_ID"));
+ sNumberField.setPreferredSize(new Dimension(100, 21));
+ sRoutingField.setPreferredSize(new Dimension(70, 21));
+ sStatus.setText(" ");
+ sOnline.setText(Msg.getMsg(Env.getCtx(), "Online"));
+ centerPanel.add(sPanel, "sPanel");
+ centerLayout.addLayoutComponent(sPanel, "sPanel");
+ sPanel.add(sCurrencyLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 0, 2, 0), 0, 0));
+ sPanel.add(sCurrencyCombo, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 5, 2, 5), 0, 0));
+ sPanel.add(sRoutingField, new GridBagConstraints(1, 4, 2, 1, 0.0, 0.0
+ ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 2, 0), 0, 0));
+ sPanel.add(sNumberField, new GridBagConstraints(1, 5, 2, 1, 0.0, 0.0
+ ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 2, 0), 0, 0));
+ sPanel.add(sCheckField, new GridBagConstraints(1, 6, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 5, 2, 0), 0, 0));
+ sPanel.add(sRoutingLabel, new GridBagConstraints(0, 3, 1, 2, 0.0, 0.0
+ ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 2, 0), 0, 0));
+ sPanel.add(sNumberLabel, new GridBagConstraints(0, 5, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 0, 2, 0), 0, 0));
+ sPanel.add(sCheckLabel, new GridBagConstraints(0, 6, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 0, 2, 0), 0, 0));
+ sPanel.add(sBankAccountCombo, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 2, 5), 0, 0));
+ sPanel.add(sBankAccountLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 0, 2, 0), 0, 0));
+ sPanel.add(sStatus, new GridBagConstraints(0, 7, 3, 1, 0.0, 0.0
+ ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+ sPanel.add(sOnline, new GridBagConstraints(3, 6, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
+ sPanel.add(sAmountField, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 5, 5, 5), 0, 0));
+ sPanel.add(sAmountLabel, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 0, 5, 0), 0, 0));
+ //
+ pPanel.setLayout(pPanelLayout);
+ pTermLabel.setText(Msg.translate(Env.getCtx(), "C_PaymentTerm_ID"));
+ centerPanel.add(pPanel, "pPanel");
+ centerLayout.addLayoutComponent(pPanel, "pPanel");
+ pPanel.add(pTermLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 5, 2, 0), 0, 0));
+ pPanel.add(pTermCombo, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 5, 2, 5), 0, 0));
+ //
+ bCashBookLabel.setText(Msg.translate(Env.getCtx(), "C_CashBook_ID"));
+ bCurrencyLabel.setText(Msg.translate(Env.getCtx(), "C_Currency_ID"));
+ bPanel.setLayout(bPanelLayout);
+ bAmountLabel.setText(Msg.getMsg(Env.getCtx(), "Amount"));
+ bAmountField.setText("");
+ bDateLabel.setText(Msg.translate(Env.getCtx(), "DateAcct"));
+ centerLayout.addLayoutComponent(bPanel, "bPanel");
+ centerPanel.add(bPanel, "bPanel");
+ bPanel.add(bCurrencyLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 0, 2, 0), 0, 0));
+ bPanel.add(bCurrencyCombo, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 5, 2, 5), 0, 0));
+ bPanel.add(bDateField, new GridBagConstraints(1, 2, 2, 1, 0.0, 0.0
+ ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 2, 5), 0, 0));
+ bPanel.add(bDateLabel, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 0, 2, 0), 0, 0));
+ bPanel.add(bCashBookLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 0, 2, 0), 0, 0));
+ bPanel.add(bCashBookCombo, new GridBagConstraints(1, 0, 2, 1, 0.0, 0.0
+ ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 5, 2, 5), 0, 0));
+ bPanel.add(bAmountLabel, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 0, 2, 0), 0, 0));
+ bPanel.add(bAmountField, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0
+ ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 2, 5), 0, 0));
+ //
+ mainPanel.add(confirmPanel, BorderLayout.SOUTH);
+ confirmPanel.addActionListener(this);
+ } // jbInit
+
+
+ /**************************************************************************
+ * Dynamic Init.
+ * B (Cash) (Currency)
+ * K (CreditCard) Type, Number, Exp, Approval
+ * L (DirectDebit) BPartner_Bank
+ * P (PaymentTerm) PaymentTerm
+ * S (Check) (Currency) CheckNo, Routing
+ *
+ * Currencies are shown, if member of EMU
+ * @param button payment type button
+ * @return true if init OK
+ * @throws Exception
+ */
+ private boolean dynInit (VButton button) throws Exception
+ {
+ m_DocStatus = (String)m_mTab.getValue("DocStatus");
+ log.config(m_DocStatus);
+
+ if (m_mTab.getValue("C_BPartner_ID") == null)
+ {
+ ADialog.error(0, this, "SaveErrorRowNotFound");
+ return false;
+ }
+
+ // Is the Trx posted?
+ // String Posted = (String)m_mTab.getValue("Posted");
+ // if (Posted != null && Posted.equals("Y"))
+ // return false;
+
+ // DocStatus
+ m_DocStatus = (String)m_mTab.getValue("DocStatus");
+ if (m_DocStatus == null)
+ m_DocStatus = "";
+ // Is the Trx closed? Reversed / Voided / Cloased
+ if (m_DocStatus.equals("RE") || m_DocStatus.equals("VO") || m_DocStatus.equals("CL"))
+ return false;
+ // Document is not complete - allow to change the Payment Rule only
+ if (m_DocStatus.equals("CO") || m_DocStatus.equals("WP") )
+ m_onlyRule = false;
+ else
+ m_onlyRule = true;
+ // PO only Rule
+ if (!m_onlyRule // Only order has Warehouse
+ && !m_isSOTrx && m_mTab.getValue("M_Warehouse_ID") != null)
+ m_onlyRule = true;
+
+ centerPanel.setVisible(!m_onlyRule);
+
+
+ // Amount
+ m_Amount = (BigDecimal)m_mTab.getValue("GrandTotal");
+ if (!m_onlyRule && m_Amount.compareTo(Env.ZERO) == 0)
+ {
+ ADialog.error(m_WindowNo, this, "PaymentZero");
+ return false;
+ }
+ bAmountField.setText(m_Format.format(m_Amount));
+ sAmountField.setText(m_Format.format(m_Amount));
+
+ /**
+ * Get Data from Grid
+ */
+ m_AD_Client_ID = ((Integer)m_mTab.getValue("AD_Client_ID")).intValue();
+ m_AD_Org_ID = ((Integer)m_mTab.getValue("AD_Org_ID")).intValue();
+ m_C_BPartner_ID = ((Integer)m_mTab.getValue("C_BPartner_ID")).intValue();
+ m_PaymentRule = (String)m_mTab.getValue("PaymentRule");
+ m_C_Currency_ID = ((Integer)m_mTab.getValue("C_Currency_ID")).intValue();
+ m_DateAcct = (Timestamp)m_mTab.getValue("DateAcct");
+ if (m_mTab.getValue("C_PaymentTerm_ID") != null)
+ m_C_PaymentTerm_ID = ((Integer)m_mTab.getValue("C_PaymentTerm_ID")).intValue();
+ // Existing Payment
+ if (m_mTab.getValue("C_Payment_ID") != null)
+ {
+ m_C_Payment_ID = ((Integer)m_mTab.getValue("C_Payment_ID")).intValue();
+ if (m_C_Payment_ID != 0)
+ {
+ m_mPayment = new MPayment(Env.getCtx(), m_C_Payment_ID, null);
+ m_mPaymentOriginal = new MPayment(Env.getCtx(), m_C_Payment_ID, null); // full copy
+ // CreditCard
+ m_CCType = m_mPayment.getCreditCardType();
+ kNumberField.setText(m_mPayment.getCreditCardNumber());
+ kExpField.setText(m_mPayment.getCreditCardExp(null));
+ kApprovalField.setText(m_mPayment.getVoiceAuthCode());
+ kStatus.setText(m_mPayment.getR_PnRef());
+ // if approved/paid, don't let it change
+ kTypeCombo.setReadWrite(!m_mPayment.isApproved());
+ kNumberField.setReadWrite(!m_mPayment.isApproved());
+ kExpField.setReadWrite(!m_mPayment.isApproved());
+ kApprovalField.setReadWrite(!m_mPayment.isApproved());
+ kOnline.setReadWrite(!m_mPayment.isApproved());
+ // Check
+ m_C_BankAccount_ID = m_mPayment.getC_BankAccount_ID();
+ sRoutingField.setText(m_mPayment.getRoutingNo());
+ sNumberField.setText(m_mPayment.getAccountNo());
+ sCheckField.setText(m_mPayment.getCheckNo());
+ sStatus.setText(m_mPayment.getR_PnRef());
+ // Transfer
+ tRoutingField.setText(m_mPayment.getRoutingNo());
+ tNumberField.setText(m_mPayment.getAccountNo());
+ tStatus.setText(m_mPayment.getR_PnRef());
+ }
+ }
+ if (m_mPayment == null)
+ {
+ m_mPayment = new MPayment (Env.getCtx (), 0, null);
+ m_mPayment.setAD_Org_ID(m_AD_Org_ID);
+ m_mPayment.setAmount (m_C_Currency_ID, m_Amount);
+ }
+
+ // Existing Cahbook entry
+ m_cashLine = null;
+ m_C_CashLine_ID = 0;
+ if (m_mTab.getValue("C_CashLine_ID") != null)
+ {
+ m_C_CashLine_ID = ((Integer)m_mTab.getValue("C_CashLine_ID")).intValue();
+ if (m_C_CashLine_ID == 0)
+ m_cashLine = null;
+ else
+ {
+ m_cashLine = new MCashLine (Env.getCtx(), m_C_CashLine_ID, null);
+ m_DateAcct = m_cashLine.getStatementDate();
+ }
+ }
+
+ // Accounting Date
+ bDateField.setValue(m_DateAcct);
+
+ if (s_Currencies == null)
+ loadCurrencies();
+
+ // Is the currency an EMU currency?
+ Integer C_Currency_ID = new Integer(m_C_Currency_ID);
+ if (s_Currencies.containsKey(C_Currency_ID))
+ {
+ Enumeration en = s_Currencies.keys();
+ while (en.hasMoreElements())
+ {
+ Object key = en.nextElement();
+ bCurrencyCombo.addItem(s_Currencies.get(key));
+ sCurrencyCombo.addItem(s_Currencies.get(key));
+ }
+ sCurrencyCombo.addActionListener(this);
+ sCurrencyCombo.setSelectedItem(s_Currencies.get(C_Currency_ID));
+ bCurrencyCombo.addActionListener(this);
+ bCurrencyCombo.setSelectedItem(s_Currencies.get(C_Currency_ID));
+ }
+ else // No EMU Currency
+ {
+ bCurrencyLabel.setVisible(false); // Cash
+ bCurrencyCombo.setVisible(false);
+ sCurrencyLabel.setVisible(false); // Check
+ sCurrencyCombo.setVisible(false);
+ }
+
+ /**
+ * Payment Combo
+ */
+ if (m_PaymentRule == null)
+ m_PaymentRule = "";
+ ValueNamePair vp = null;
+ HashMap values = button.getValues();
+ Object[] a = values.keySet().toArray();
+ for (int i = 0; i < a.length; i++)
+ {
+ String PaymentRule = (String)a[i]; // used for Panel selection
+ if (X_C_Order.PAYMENTRULE_DirectDebit.equals(PaymentRule) // SO
+ && !m_isSOTrx)
+ continue;
+ else if (X_C_Order.PAYMENTRULE_DirectDeposit.equals(PaymentRule) // PO
+ && m_isSOTrx)
+ continue;
+
+ ValueNamePair pp = new ValueNamePair(PaymentRule, (String)values.get(a[i]));
+ paymentCombo.addItem(pp);
+ if (PaymentRule.toString().equals(m_PaymentRule)) // to select
+ vp = pp;
+ }
+
+ // Set PaymentRule
+ paymentCombo.addActionListener(this);
+ if (vp != null)
+ paymentCombo.setSelectedItem(vp);
+
+ /**
+ * Load Payment Terms
+ */
+ String SQL = MRole.getDefault().addAccessSQL(
+ "SELECT C_PaymentTerm_ID, Name FROM C_PaymentTerm WHERE IsActive='Y' ORDER BY Name",
+ "C_PaymentTerm", MRole.SQL_NOTQUALIFIED, MRole.SQL_RO);
+ KeyNamePair kp = null;
+ try
+ {
+ PreparedStatement pstmt = DB.prepareStatement(SQL, null);
+ ResultSet rs = pstmt.executeQuery();
+ while (rs.next())
+ {
+ int key = rs.getInt(1);
+ String name = rs.getString(2);
+ KeyNamePair pp = new KeyNamePair(key, name);
+ pTermCombo.addItem(pp);
+ if (key == m_C_PaymentTerm_ID)
+ kp = pp;
+ }
+ rs.close();
+ pstmt.close();
+ }
+ catch (SQLException ept)
+ {
+ log.log(Level.SEVERE, SQL, ept);
+ }
+ // Set Selection
+ if (kp != null)
+ pTermCombo.setSelectedItem(kp);
+
+ /**
+ * Load Accounts
+ */
+ SQL = "SELECT a.C_BP_BankAccount_ID, NVL(b.Name, ' ')||a.AccountNo AS Acct "
+ + "FROM C_BP_BankAccount a,C_Bank b "
+ + "WHERE C_BPartner_ID=? AND a.IsActive='Y'";
+ kp = null;
+ try
+ {
+ PreparedStatement pstmt = DB.prepareStatement(SQL, null);
+ pstmt.setInt(1, m_C_BPartner_ID);
+ ResultSet rs = pstmt.executeQuery();
+ while (rs.next())
+ {
+ int key = rs.getInt(1);
+ String name = rs.getString(2);
+ KeyNamePair pp = new KeyNamePair(key, name);
+ tAccountCombo.addItem(pp);
+ // kp = pp;
+ }
+ rs.close();
+ pstmt.close();
+ }
+ catch (SQLException eac)
+ {
+ log.log(Level.SEVERE, SQL, eac);
+ }
+ // Set Selection
+ if (kp != null)
+ tAccountCombo.setSelectedItem(kp);
+
+ /**
+ * Load Credit Cards
+ */
+ ValueNamePair[] ccs = m_mPayment.getCreditCards();
+ vp = null;
+ for (int i = 0; i < ccs.length; i++)
+ {
+ kTypeCombo.addItem(ccs[i]);
+ if (ccs[i].getValue().equals(m_CCType))
+ vp = ccs[i];
+ }
+ // Set Selection
+ if (vp != null)
+ kTypeCombo.setSelectedItem(vp);
+
+ /**
+ * Load Bank Accounts
+ */
+ SQL = MRole.getDefault().addAccessSQL(
+ "SELECT C_BankAccount_ID, Name || ' ' || AccountNo, IsDefault "
+ + "FROM C_BankAccount ba"
+ + " INNER JOIN C_Bank b ON (ba.C_Bank_ID=b.C_Bank_ID) "
+ + "WHERE b.IsActive='Y'",
+ "ba", MRole.SQL_FULLYQUALIFIED, MRole.SQL_RO);
+ kp = null;
+ try
+ {
+ PreparedStatement pstmt = DB.prepareStatement(SQL, null);
+ ResultSet rs = pstmt.executeQuery();
+ while (rs.next())
+ {
+ int key = rs.getInt(1);
+ String name = rs.getString(2);
+ KeyNamePair pp = new KeyNamePair(key, name);
+ sBankAccountCombo.addItem(pp);
+ if (key == m_C_BankAccount_ID)
+ kp = pp;
+ if (kp == null && rs.getString(3).equals("Y")) // Default
+ kp = pp;
+ }
+ rs.close();
+ pstmt.close();
+ }
+ catch (SQLException ept)
+ {
+ log.log(Level.SEVERE, SQL, ept);
+ }
+ // Set Selection
+ if (kp != null)
+ sBankAccountCombo.setSelectedItem(kp);
+
+
+ /**
+ * Load Cash Books
+ */
+ SQL = MRole.getDefault().addAccessSQL(
+ "SELECT C_CashBook_ID, Name, AD_Org_ID FROM C_CashBook WHERE IsActive='Y'",
+ "C_CashBook", MRole.SQL_NOTQUALIFIED, MRole.SQL_RO);
+ kp = null;
+ try
+ {
+ PreparedStatement pstmt = DB.prepareStatement(SQL, null);
+ ResultSet rs = pstmt.executeQuery();
+ while (rs.next())
+ {
+ int key = rs.getInt(1);
+ String name = rs.getString(2);
+ KeyNamePair pp = new KeyNamePair(key, name);
+ bCashBookCombo.addItem(pp);
+ if (key == m_C_CashBook_ID)
+ kp = pp;
+ if (kp == null && key == m_AD_Org_ID) // Default Org
+ kp = pp;
+ }
+ rs.close();
+ pstmt.close();
+ }
+ catch (SQLException epc)
+ {
+ log.log(Level.SEVERE, SQL, epc);
+ }
+ // Set Selection
+ if (kp != null)
+ {
+ bCashBookCombo.setSelectedItem(kp);
+ if (m_C_CashBook_ID == 0)
+ m_C_CashBook_ID = kp.getKey(); // set to default to avoid 'cashbook changed' message
+ }
+
+ //
+ return true;
+ } // dynInit
+
+ /**
+ * Init OK to be able to make changes?
+ * @return true if init OK
+ */
+ public boolean isInitOK()
+ {
+ return m_initOK;
+ } // isInitOK
+
+
+ /**
+ * Fill s_Currencies with EMU currencies
+ */
+ private void loadCurrencies()
+ {
+ s_Currencies = new Hashtable(12); // Currenly only 10+1
+ String SQL = "SELECT C_Currency_ID, ISO_Code FROM C_Currency "
+ + "WHERE (IsEMUMember='Y' AND EMUEntryDate " + newPaymentRule);
+ // We had a CashBook Entry
+ if (m_PaymentRule.equals(X_C_Order.PAYMENTRULE_Cash))
+ {
+ log.fine("Old Cash - " + m_cashLine);
+ if (m_cashLine != null)
+ {
+ MCashLine cl = m_cashLine.createReversal();
+ if (cl.save())
+ log.config( "CashCancelled");
+ else
+ ADialog.error(m_WindowNo, this, "PaymentError", "CashNotCancelled");
+ }
+ newC_CashLine_ID = 0; // reset
+ }
+ // We had a change in Payment type (e.g. Check to CC)
+ else if ("KTSD".indexOf(m_PaymentRule) != -1 && "KTSD".indexOf(newPaymentRule) != -1 && m_mPaymentOriginal != null)
+ {
+ log.fine("Old Payment(1) - " + m_mPaymentOriginal);
+ m_mPaymentOriginal.setDocAction(DocAction.ACTION_Reverse_Correct);
+ boolean ok = m_mPaymentOriginal.processIt(DocAction.ACTION_Reverse_Correct);
+ m_mPaymentOriginal.save();
+ if (ok)
+ log.info( "Payment Canecelled - " + m_mPaymentOriginal);
+ else
+ ADialog.error(m_WindowNo, this, "PaymentError", "PaymentNotCancelled " + m_mPaymentOriginal.getDocumentNo());
+ m_mPayment.resetNew();
+ }
+ // We had a Payment and something else (e.g. Check to Cash)
+ else if ("KTSD".indexOf(m_PaymentRule) != -1 && "KTSD".indexOf(newPaymentRule) == -1)
+ {
+ log.fine("Old Payment(2) - " + m_mPaymentOriginal);
+ if (m_mPaymentOriginal != null)
+ {
+ m_mPaymentOriginal.setDocAction(DocAction.ACTION_Reverse_Correct);
+ boolean ok = m_mPaymentOriginal.processIt(DocAction.ACTION_Reverse_Correct);
+ m_mPaymentOriginal.save();
+ if (ok) // Cancel Payment
+ {
+ log.fine("PaymentCancelled " + m_mPayment.getDocumentNo ());
+ m_mTab.getTableModel().dataSave(true);
+ m_mPayment.resetNew();
+ m_mPayment.setAmount(m_C_Currency_ID, m_Amount);
+ }
+ else
+ ADialog.error(m_WindowNo, this, "PaymentError", "PaymentNotCancelled " + m_mPayment.getDocumentNo());
+ }
+ }
+ }
+
+ // Get Order and optionally Invoice
+ int C_Order_ID = Env.getContextAsInt(Env.getCtx(), m_WindowNo, "C_Order_ID");
+ int C_Invoice_ID = Env.getContextAsInt(Env.getCtx(), m_WindowNo, "C_Invoice_ID");
+ if (C_Invoice_ID == 0 && m_DocStatus.equals("CO"))
+ C_Invoice_ID = getInvoiceID (C_Order_ID);
+
+ // Amount sign negative, if ARC (Credit Memo) or API (AP Invoice)
+ boolean negateAmt = false;
+ MInvoice invoice = null;
+ if (C_Invoice_ID != 0)
+ {
+ invoice = new MInvoice (Env.getCtx(), C_Invoice_ID, null);
+ negateAmt = invoice.isCreditMemo();
+ }
+ MOrder order = null;
+ if (invoice == null && C_Order_ID != 0)
+ order = new MOrder (Env.getCtx(), C_Order_ID, null);
+ BigDecimal payAmount = m_Amount;
+ if (negateAmt)
+ payAmount = m_Amount.negate();
+ // Info
+ log.config("C_Order_ID=" + C_Order_ID + ", C_Invoice_ID=" + C_Invoice_ID + ", NegateAmt=" + negateAmt);
+
+ /***********************
+ * CashBook
+ */
+ if (newPaymentRule.equals(X_C_Order.PAYMENTRULE_Cash))
+ {
+ log.fine("Cash");
+ String description = (String)m_mTab.getValue("DocumentNo");
+
+ if (C_Invoice_ID == 0 && order == null)
+ {
+ log.config("No Invoice!");
+ ADialog.error(m_WindowNo, this, "PaymentError", "CashNotCreated");
+ }
+ else
+ {
+ // Changed Amount
+ if (m_cashLine != null
+ && payAmount.compareTo(m_cashLine.getAmount()) != 0)
+ {
+ log.config("Changed CashBook Amount");
+ m_cashLine.setAmount(payAmount);
+ if (m_cashLine.save())
+ log.config("CashAmt Changed");
+ }
+ // Different Date/CashBook
+ if (m_cashLine != null
+ && (newC_CashBook_ID != m_C_CashBook_ID
+ || !TimeUtil.isSameDay(m_cashLine.getStatementDate(), newDateAcct)))
+ {
+ log.config("Changed CashBook/Date: " + m_C_CashBook_ID + "->" + newC_CashBook_ID);
+ MCashLine reverse = m_cashLine.createReversal();
+ if (!reverse.save())
+ ADialog.error(m_WindowNo, this, "PaymentError", "CashNotCancelled");
+ m_cashLine = null;
+ }
+
+ // Create new
+ if (m_cashLine == null)
+ {
+ log.config("New CashBook");
+ int C_Currency_ID = 0;
+ if (invoice != null)
+ C_Currency_ID = invoice.getC_Currency_ID();
+ if (C_Currency_ID == 0 && order != null)
+ C_Currency_ID = order.getC_Currency_ID();
+ MCash cash = null;
+ if (newC_CashBook_ID != 0)
+ cash = MCash.get (Env.getCtx(), newC_CashBook_ID, newDateAcct, null);
+ else // Default
+ cash = MCash.get (Env.getCtx(), m_AD_Org_ID, newDateAcct, C_Currency_ID, null);
+ if (cash == null || cash.get_ID() == 0)
+ ADialog.error(m_WindowNo, this, "PaymentError", "CashNotCreated");
+ else
+ {
+ MCashLine cl = new MCashLine (cash);
+ if (invoice != null)
+ cl.setInvoice(invoice);
+ if (order != null)
+ {
+ cl.setOrder(order, null);
+ m_needSave = true;
+ }
+ if (cl.save())
+ log.config("CashCreated");
+ else
+ ADialog.error(m_WindowNo, this, "PaymentError", "CashNotCreated");
+ }
+ }
+ } // have invoice
+ }
+ /***********************
+ * Payments
+ */
+ if ("KS".indexOf(newPaymentRule) != -1)
+ {
+ log.fine("Payment - " + newPaymentRule);
+ // Set Amount
+ m_mPayment.setAmount(m_C_Currency_ID, payAmount);
+ if (newPaymentRule.equals(MOrder.PAYMENTRULE_CreditCard))
+ {
+ m_mPayment.setCreditCard(MPayment.TRXTYPE_Sales, newCCType,
+ kNumberField.getText(), "", kExpField.getText());
+ m_mPayment.setPaymentProcessor();
+ }
+ else if (newPaymentRule.equals(MOrder.PAYMENTRULE_DirectDeposit)
+ || newPaymentRule.equals(MOrder.PAYMENTRULE_DirectDebit))
+ {
+ m_mPayment.setBankACH(newC_BankAccount_ID, m_isSOTrx, newPaymentRule,
+ tRoutingField.getText(), tNumberField.getText());
+ }
+ else if (newPaymentRule.equals(MOrder.PAYMENTRULE_Check))
+ {
+ m_mPayment.setBankCheck(newC_BankAccount_ID, m_isSOTrx, sRoutingField.getText(),
+ sNumberField.getText(), sCheckField.getText());
+ }
+ m_mPayment.setC_BPartner_ID(m_C_BPartner_ID);
+ m_mPayment.setC_Invoice_ID(C_Invoice_ID);
+ if (order != null)
+ {
+ m_mPayment.setC_Order_ID(C_Order_ID);
+ m_needSave = true;
+ }
+ m_mPayment.setDateTrx(m_DateAcct);
+ m_mPayment.setDateAcct(m_DateAcct);
+ m_mPayment.save();
+
+ // Save/Post
+ if (MPayment.DOCSTATUS_Drafted.equals(m_mPayment.getDocStatus()))
+ {
+ boolean ok = m_mPayment.processIt(DocAction.ACTION_Complete);
+ m_mPayment.save();
+ if (ok)
+ ADialog.info(m_WindowNo, this, "PaymentCreated", m_mPayment.getDocumentNo());
+ else
+ ADialog.error(m_WindowNo, this, "PaymentError", "PaymentNotCreated");
+ }
+ else
+ log.fine("NotDraft " + m_mPayment);
+ }
+
+
+ /**********************
+ * Save Values to mTab
+ */
+ log.config("Saving changes");
+ //
+ if (!newPaymentRule.equals(m_PaymentRule))
+ m_mTab.setValue("PaymentRule", newPaymentRule);
+ //
+ if (!newDateAcct.equals(m_DateAcct))
+ m_mTab.setValue("DateAcct", newDateAcct);
+ //
+ if (newC_PaymentTerm_ID != m_C_PaymentTerm_ID)
+ m_mTab.setValue("C_PaymentTerm_ID", new Integer(newC_PaymentTerm_ID));
+ // Set Payment
+ if (m_mPayment.getC_Payment_ID() != m_C_Payment_ID)
+ {
+ if (m_mPayment.getC_Payment_ID() == 0)
+ m_mTab.setValue("C_Payment_ID", null);
+ else
+ m_mTab.setValue("C_Payment_ID", new Integer(m_mPayment.getC_Payment_ID()));
+ }
+ // Set Cash
+ if (newC_CashLine_ID != m_C_CashLine_ID)
+ {
+ if (newC_CashLine_ID == 0)
+ m_mTab.setValue("C_CashLine_ID", null);
+ else
+ m_mTab.setValue("C_CashLine_ID", new Integer(newC_CashLine_ID));
+ }
+ return true;
+ } // saveChanges
+
+ /**
+ * Check Mandatory
+ * @return true if all mandatory items are OK
+ */
+ private boolean checkMandatory()
+ {
+ // log.config( "VPayment.checkMandatory");
+
+ ValueNamePair vp = (ValueNamePair)paymentCombo.getSelectedItem();
+ String PaymentRule = vp.getValue();
+ // only Payment Rule
+ if (m_onlyRule)
+ return true;
+
+ Timestamp DateAcct = m_DateAcct;
+ int C_PaymentTerm_ID = m_C_PaymentTerm_ID;
+ int C_CashBook_ID = m_C_CashBook_ID;
+ String CCType = m_CCType;
+ //
+ int C_BankAccount_ID = 0;
+
+ /***********************
+ * Mandatory Data Check
+ */
+ boolean dataOK = true;
+ // B (Cash) (Currency)
+ if (PaymentRule.equals(MOrder.PAYMENTRULE_Cash))
+ {
+ KeyNamePair kp = (KeyNamePair)bCashBookCombo.getSelectedItem();
+ if (kp != null)
+ C_CashBook_ID = kp.getKey();
+ DateAcct = (Timestamp)bDateField.getValue();
+ }
+
+ // K (CreditCard) Type, Number, Exp, Approval
+ else if (PaymentRule.equals(MOrder.PAYMENTRULE_CreditCard))
+ {
+ vp = (ValueNamePair)kTypeCombo.getSelectedItem();
+ if (vp != null)
+ CCType = vp.getValue();
+ //
+ String error = MPaymentValidate.validateCreditCardNumber(kNumberField.getText(), CCType);
+ if (error.length() != 0)
+ {
+ kNumberField.setBackground(AdempierePLAF.getFieldBackground_Error());
+ if (error.indexOf("?") == -1)
+ {
+ ADialog.error(m_WindowNo, this, error);
+ dataOK = false;
+ }
+ else // warning
+ {
+ if (!ADialog.ask(m_WindowNo, this, error))
+ dataOK = false;
+ }
+ }
+ error = MPaymentValidate.validateCreditCardExp(kExpField.getText());
+ if(error.length() != 0)
+ {
+ kExpField.setBackground(AdempierePLAF.getFieldBackground_Error());
+ ADialog.error(m_WindowNo, this, error);
+ dataOK = false;
+ }
+ }
+
+ // T (Transfer) BPartner_Bank
+ else if (PaymentRule.equals(X_C_Order.PAYMENTRULE_DirectDeposit)
+ || PaymentRule.equals(X_C_Order.PAYMENTRULE_DirectDebit))
+ {
+ KeyNamePair bpba = (KeyNamePair)tAccountCombo.getSelectedItem();
+ if (bpba == null)
+
+ {
+ tAccountCombo.setBackground(AdempierePLAF.getFieldBackground_Error());
+ ADialog.error(m_WindowNo, this, "PaymentBPBankNotFound");
+ dataOK = false;
+ }
+ } // Direct
+
+ // P (PaymentTerm) PaymentTerm
+ else if (PaymentRule.equals(X_C_Order.PAYMENTRULE_OnCredit))
+ {
+ KeyNamePair kp = (KeyNamePair)pTermCombo.getSelectedItem();
+ if (kp != null)
+ C_PaymentTerm_ID = kp.getKey();
+ }
+
+ // S (Check) (Currency) CheckNo, Routing
+ else if (PaymentRule.equals(MOrder.PAYMENTRULE_Check))
+ {
+ // sCurrencyCombo.getSelectedItem();
+ KeyNamePair kp = (KeyNamePair)sBankAccountCombo.getSelectedItem();
+ if (kp != null)
+ C_BankAccount_ID = kp.getKey();
+ String error = MPaymentValidate.validateRoutingNo(sRoutingField.getText());
+ if (error.length() != 0)
+ {
+ sRoutingField.setBackground(AdempierePLAF.getFieldBackground_Error());
+ ADialog.error(m_WindowNo, this, error);
+ dataOK = false;
+ }
+ error = MPaymentValidate.validateAccountNo(sNumberField.getText());
+ if (error.length() != 0)
+ {
+ sNumberField.setBackground(AdempierePLAF.getFieldBackground_Error());
+ ADialog.error(m_WindowNo, this, error);
+ dataOK = false;
+ }
+ error = MPaymentValidate.validateCheckNo(sCheckField.getText());
+ if (error.length() != 0)
+ {
+ sCheckField.setBackground(AdempierePLAF.getFieldBackground_Error());
+ ADialog.error(m_WindowNo, this, error);
+ dataOK = false;
+ }
+ }
+ else
+ {
+ log.log(Level.SEVERE, "Unknown PaymentRule " + PaymentRule);
+ return false;
+ }
+
+ // find Bank Account if not qualified yet
+ if ("KTSD".indexOf(PaymentRule) != -1 && C_BankAccount_ID == 0)
+ {
+ String tender = MPayment.TENDERTYPE_CreditCard;
+ if (PaymentRule.equals(MOrder.PAYMENTRULE_DirectDeposit))
+ tender = MPayment.TENDERTYPE_DirectDeposit;
+ else if (PaymentRule.equals(MOrder.PAYMENTRULE_DirectDebit))
+ tender = MPayment.TENDERTYPE_DirectDebit;
+ else if (PaymentRule.equals(MOrder.PAYMENTRULE_Check))
+ tender = MPayment.TENDERTYPE_Check;
+ // Check must have a bank account
+ if (C_BankAccount_ID == 0 && "S".equals(PaymentRule))
+ {
+ ADialog.error(m_WindowNo, this, "PaymentNoProcessor");
+ dataOK = false;
+ }
+ }
+ //
+ log.config("OK=" + dataOK);
+ return dataOK;
+ } // checkMandatory
+
+ /**
+ * Get Invoice ID for Order
+ * @param C_Order_ID order
+ * @return C_Invoice_ID or 0 if not found
+ */
+ private static int getInvoiceID (int C_Order_ID)
+ {
+ int retValue = 0;
+ String sql = "SELECT C_Invoice_ID FROM C_Invoice WHERE C_Order_ID=? "
+ + "ORDER BY C_Invoice_ID DESC"; // last invoice
+ try
+ {
+ PreparedStatement pstmt = DB.prepareStatement(sql, null);
+ pstmt.setInt(1, C_Order_ID);
+ ResultSet rs = pstmt.executeQuery();
+ if (rs.next())
+ retValue = rs.getInt(1);
+ rs.close();
+ pstmt.close();
+ }
+ catch (SQLException e)
+ {
+ log.log(Level.SEVERE, sql, e);
+ }
+ return retValue;
+ } // getInvoiceID
+
+
+ /**************************************************************************
+ * Process Online (sales only) - if approved - exit
+ */
+ private void processOnline()
+ {
+ log.config("");
+ if (!checkMandatory())
+ return;
+
+ boolean approved = false;
+ String info = "";
+ //
+ ValueNamePair vp = (ValueNamePair)paymentCombo.getSelectedItem();
+ String PaymentRule = vp.getValue();
+
+ // -- CreditCard
+ if (PaymentRule.equals(X_C_Order.PAYMENTRULE_CreditCard))
+ {
+ vp = (ValueNamePair)kTypeCombo.getSelectedItem();
+ String CCType = vp.getValue();
+
+ m_mPayment.setCreditCard(MPayment.TRXTYPE_Sales, CCType,
+ kNumberField.getText(), "", kExpField.getText());
+ m_mPayment.setAmount(m_C_Currency_ID, m_Amount);
+ m_mPayment.setPaymentProcessor();
+ m_mPayment.setC_BPartner_ID(m_C_BPartner_ID);
+ //
+ int C_Invoice_ID = Env.getContextAsInt(Env.getCtx(), m_WindowNo, "C_Invoice_ID");
+ if (C_Invoice_ID == 0 && m_DocStatus.equals("CO"))
+ {
+ int C_Order_ID = Env.getContextAsInt(Env.getCtx(), m_WindowNo, "C_Order_ID");
+ C_Invoice_ID = getInvoiceID (C_Order_ID);
+ }
+ m_mPayment.setC_Invoice_ID(C_Invoice_ID);
+ m_mPayment.setDateTrx(m_DateAcct);
+ // Set Amount
+ m_mPayment.setAmount(m_C_Currency_ID, m_Amount);
+
+ approved = m_mPayment.processOnline();
+ info = m_mPayment.getR_RespMsg() + " (" + m_mPayment.getR_AuthCode()
+ + ") ID=" + m_mPayment.getR_PnRef();
+ boolean saved = m_mPayment.save();
+
+ if (approved)
+ {
+ boolean ok = m_mPayment.processIt(DocAction.ACTION_Complete);
+ m_mPayment.save();
+ if (ok)
+ ADialog.info(m_WindowNo, this, "PaymentProcessed", info + "\n" + m_mPayment.getDocumentNo());
+ else
+ ADialog.error(m_WindowNo, this, "PaymentError", "PaymentNotCreated");
+ saveChanges();
+ dispose();
+ }
+ else
+ {
+ ADialog.error(m_WindowNo, this, "PaymentNotProcessed", info);
+ }
+ }
+ else
+ ADialog.error(m_WindowNo, this, "PaymentNoProcessor");
+ } // online
+
+ /**
+ * Need Save record (payment with waiting order)
+ * @return true if payment with waiting order
+ */
+ public boolean needSave()
+ {
+ return m_needSave;
+ } // needSave
+
+} // VPayment
diff --git a/dbPort/src/org/compiere/db/CConnection.java b/dbPort/src/org/compiere/db/CConnection.java
index 732815ec2b..1c584e394c 100644
--- a/dbPort/src/org/compiere/db/CConnection.java
+++ b/dbPort/src/org/compiere/db/CConnection.java
@@ -894,7 +894,7 @@ public class CConnection implements Serializable
} // isPostgreSQL
//end
/**
- * Is PostgreSQL DB
+ * Is Fyracle DB
* @return true if PostgreSQL
*/
public boolean isFyracle ()
@@ -1224,7 +1224,15 @@ public class CConnection implements Serializable
{
try
{
- m_db = Database.getDatabase(m_type);
+ for (int i = 0; i < Database.DB_NAMES.length; i++)
+ {
+ if (Database.DB_NAMES[i].equals (m_type))
+ {
+ m_db = (AdempiereDatabase)Database.DB_CLASSES[i].
+ newInstance ();
+ break;
+ }
+ }
}
catch (Exception e)
{