From 6da7b54dd9a1a8c53bd1bc7d8f429ef171a81707 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Fri, 11 Jul 2008 08:26:34 +0000 Subject: [PATCH] Fix [ 2015349 ] Changes to Payment Selection and Print --- .../org/compiere/apps/form/VPaySelect.java | 1472 +++++++++-------- .../227_MessageVPayPrintPrintCheck.sql | 5 + .../227_MessageVPayPrintPrintCheck.sql | 4 + 3 files changed, 788 insertions(+), 693 deletions(-) create mode 100644 migration/351a-trunk/227_MessageVPayPrintPrintCheck.sql create mode 100644 migration/351a-trunk/postgresql/227_MessageVPayPrintPrintCheck.sql diff --git a/client/src/org/compiere/apps/form/VPaySelect.java b/client/src/org/compiere/apps/form/VPaySelect.java index d9bad09517..af0c2f0071 100644 --- a/client/src/org/compiere/apps/form/VPaySelect.java +++ b/client/src/org/compiere/apps/form/VPaySelect.java @@ -1,693 +1,779 @@ -/****************************************************************************** - * 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 * - * Contributors: * - * Colin Rooney (croo) Patch 1605368 Fixed Payment Terms & Only due * - *****************************************************************************/ -package org.compiere.apps.form; - -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 javax.swing.event.*; -import org.compiere.apps.*; -import org.compiere.grid.ed.*; -import org.compiere.minigrid.*; -import org.compiere.model.*; -import org.compiere.plaf.*; -import org.compiere.process.*; -import org.compiere.swing.*; -import org.compiere.util.*; - -/** - * Create Manual Payments From (AP) Invoices or (AR) Credit Memos. - * Allows user to select Invoices for payment. - * When Processed, PaySelection is created - * and optionally posted/generated and printed - * - * @author Jorg Janke - * @version $Id: VPaySelect.java,v 1.3 2006/07/30 00:51:28 jjanke Exp $ - */ -public class VPaySelect extends CPanel - implements FormPanel, ActionListener, TableModelListener, ASyncProcess -{ - /** @todo withholding */ - - /** - * Initialize Panel - * @param WindowNo window - * @param frame frame - */ - public void init (int WindowNo, FormFrame frame) - { - log.info(""); - m_WindowNo = WindowNo; - m_frame = frame; - try - { - jbInit(); - dynInit(); - frame.getContentPane().add(commandPanel, BorderLayout.SOUTH); - frame.getContentPane().add(mainPanel, BorderLayout.CENTER); - } - catch(Exception e) - { - log.log(Level.SEVERE, "", e); - } - } // init - - /** Window No */ - private int m_WindowNo = 0; - /** FormFrame */ - private FormFrame m_frame; - - /** Format */ - private DecimalFormat m_format = DisplayType.getNumberFormat(DisplayType.Amount); - /** Bank Balance */ - private BigDecimal m_bankBalance = new BigDecimal(0.0); - /** SQL for Query */ - private String m_sql; - /** Number of selected rows */ - private int m_noSelected = 0; - /** Client ID */ - private int m_AD_Client_ID = 0; - /**/ - private boolean m_isLocked = false; - /** Payment Selection */ - private MPaySelection m_ps = null; - /** Logger */ - private static CLogger log = CLogger.getCLogger(VPaySelect.class); - - // - private CPanel mainPanel = new CPanel(); - private BorderLayout mainLayout = new BorderLayout(); - private CPanel parameterPanel = new CPanel(); - private CLabel labelBankAccount = new CLabel(); - private VComboBox fieldBankAccount = new VComboBox(); - private GridBagLayout parameterLayout = new GridBagLayout(); - private CLabel labelBankBalance = new CLabel(); - private CLabel labelCurrency = new CLabel(); - private CLabel labelBalance = new CLabel(); - private VCheckBox onlyDue = new VCheckBox(); - private CLabel labelBPartner = new CLabel(); - private VComboBox fieldBPartner = new VComboBox(); - private JLabel dataStatus = new JLabel(); - private JScrollPane dataPane = new JScrollPane(); - private MiniTable miniTable = new MiniTable(); - private CPanel commandPanel = new CPanel(); - private JButton bCancel = ConfirmPanel.createCancelButton(true); - private JButton bGenerate = ConfirmPanel.createProcessButton(true); - private FlowLayout commandLayout = new FlowLayout(); - private JButton bRefresh = ConfirmPanel.createRefreshButton(true); - private CLabel labelPayDate = new CLabel(); - private VDate fieldPayDate = new VDate(); - private CLabel labelPaymentRule = new CLabel(); - private VComboBox fieldPaymentRule = new VComboBox(); - - /** - * Static Init - * @throws Exception - */ - private void jbInit() throws Exception - { - CompiereColor.setBackground(this); - // - mainPanel.setLayout(mainLayout); - parameterPanel.setLayout(parameterLayout); - // - labelBankAccount.setText(Msg.translate(Env.getCtx(), "C_BankAccount_ID")); - fieldBankAccount.addActionListener(this); - labelBPartner.setText(Msg.translate(Env.getCtx(), "C_BPartner_ID")); - fieldBPartner.addActionListener(this); - bRefresh.addActionListener(this); - labelPayDate.setText(Msg.translate(Env.getCtx(), "PayDate")); - labelPaymentRule.setText(Msg.translate(Env.getCtx(), "PaymentRule")); - fieldPaymentRule.addActionListener(this); - // - labelBankBalance.setText(Msg.translate(Env.getCtx(), "CurrentBalance")); - labelBalance.setText("0"); - onlyDue.setText(Msg.getMsg(Env.getCtx(), "OnlyDue")); - dataStatus.setText(" "); - // - bGenerate.addActionListener(this); - bCancel.addActionListener(this); - // - mainPanel.add(parameterPanel, BorderLayout.NORTH); - parameterPanel.add(labelBankAccount, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 - ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); - parameterPanel.add(fieldBankAccount, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0 - ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0)); - parameterPanel.add(labelBankBalance, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0 - ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); - parameterPanel.add(labelCurrency, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0 - ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 0, 5, 5), 0, 0)); - parameterPanel.add(labelBalance, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0 - ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); - parameterPanel.add(labelBPartner, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 - ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); - parameterPanel.add(fieldBPartner, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0 - ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0)); - parameterPanel.add(bRefresh, new GridBagConstraints(4, 2, 1, 1, 0.0, 0.0 - ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); - parameterPanel.add(labelPayDate, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0 - ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); - parameterPanel.add(fieldPayDate, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0 - ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0)); - parameterPanel.add(labelPaymentRule, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0 - ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); - parameterPanel.add(fieldPaymentRule, new GridBagConstraints(3, 2, 1, 1, 0.0, 0.0 - ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); - parameterPanel.add(onlyDue, new GridBagConstraints(3, 1, 1, 1, 0.0, 0.0 - ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); - mainPanel.add(dataStatus, BorderLayout.SOUTH); - mainPanel.add(dataPane, BorderLayout.CENTER); - dataPane.getViewport().add(miniTable, null); - // - commandPanel.setLayout(commandLayout); - commandLayout.setAlignment(FlowLayout.RIGHT); - commandLayout.setHgap(10); - commandPanel.add(bCancel, null); - commandPanel.add(bGenerate, null); - } // jbInit - - /** - * Dynamic Init. - * - Load Bank Info - * - Load BPartner - * - Init Table - */ - private void dynInit() - { - Properties ctx = Env.getCtx(); - - // Bank Account Info - String sql = MRole.getDefault().addAccessSQL( - "SELECT ba.C_BankAccount_ID," // 1 - + "b.Name || ' ' || ba.AccountNo AS Name," // 2 - + "ba.C_Currency_ID, c.ISO_Code," // 3..4 - + "ba.CurrentBalance " // 5 - + "FROM C_Bank b, C_BankAccount ba, C_Currency c " - + "WHERE b.C_Bank_ID=ba.C_Bank_ID" - + " AND ba.C_Currency_ID=c.C_Currency_ID " - + " AND EXISTS (SELECT * FROM C_BankAccountDoc d WHERE d.C_BankAccount_ID=ba.C_BankAccount_ID) " - + "ORDER BY 2", - "b", MRole.SQL_FULLYQUALIFIED, MRole.SQL_RW); - try - { - PreparedStatement pstmt = DB.prepareStatement(sql, null); - ResultSet rs = pstmt.executeQuery(); - while (rs.next()) - { - boolean transfers = false; - BankInfo bi = new BankInfo (rs.getInt(1), rs.getInt(3), - rs.getString(2), rs.getString(4), - rs.getBigDecimal(5), transfers); - fieldBankAccount.addItem(bi); - } - rs.close(); - pstmt.close(); - } - catch (SQLException e) - { - log.log(Level.SEVERE, sql, e); - } - if (fieldBankAccount.getItemCount() == 0) - ADialog.error(m_WindowNo, this, "VPaySelectNoBank"); - else - fieldBankAccount.setSelectedIndex(0); - - // Optional BusinessPartner with unpaid AP Invoices - KeyNamePair pp = new KeyNamePair(0, ""); - fieldBPartner.addItem(pp); - sql = MRole.getDefault().addAccessSQL( - "SELECT bp.C_BPartner_ID, bp.Name FROM C_BPartner bp", "bp", - MRole.SQL_FULLYQUALIFIED, MRole.SQL_RO) - + " AND EXISTS (SELECT * FROM C_Invoice i WHERE bp.C_BPartner_ID=i.C_BPartner_ID" - // X_C_Order.PAYMENTRULE_DirectDebit - + " AND (i.IsSOTrx='N' OR (i.IsSOTrx='Y' AND i.PaymentRule='D'))" - + " AND i.IsPaid<>'Y') " - + "ORDER BY 2"; - - try - { - PreparedStatement pstmt = DB.prepareStatement(sql, null); - ResultSet rs = pstmt.executeQuery(); - while (rs.next()) - { - pp = new KeyNamePair(rs.getInt(1), rs.getString(2)); - fieldBPartner.addItem(pp); - } - rs.close(); - pstmt.close(); - } - catch (SQLException e) - { - log.log(Level.SEVERE, sql, e); - } - fieldBPartner.setSelectedIndex(0); - - /** prepare MiniTable - * - SELECT i.C_Invoice_ID, i.DateInvoiced+p.NetDays AS DateDue, - bp.Name, i.DocumentNo, c.ISO_Code, i.GrandTotal, - paymentTermDiscount(i.GrandTotal, i.C_PaymentTerm_ID, i.DateInvoiced, SysDate) AS Discount, - SysDate-paymentTermDueDays(i.C_PaymentTerm_ID,i.DateInvoiced) AS DiscountDate, - i.GrandTotal-paymentTermDiscount(i.GrandTotal,i.C_PaymentTerm_ID,i.DateInvoiced,SysDate) AS DueAmount, - currencyConvert(i.GrandTotal-paymentTermDiscount(i.GrandTotal,i.C_PaymentTerm_ID,i.DateInvoiced,SysDate,null), - i.C_Currency_ID,xx100,SysDate) AS PayAmt - FROM C_Invoice i, C_BPartner bp, C_Currency c, C_PaymentTerm p - WHERE i.IsSOTrx='N' - AND i.C_BPartner_ID=bp.C_BPartner_ID - AND i.C_Currency_ID=c.C_Currency_ID - AND i.C_PaymentTerm_ID=p.C_PaymentTerm_ID - AND i.DocStatus IN ('CO','CL') - ORDER BY 2,3 - */ - - m_sql = miniTable.prepareTable(new ColumnInfo[] { - // 0..4 - new ColumnInfo(" ", "i.C_Invoice_ID", IDColumn.class, false, false, null), - new ColumnInfo(Msg.translate(ctx, "DueDate"), "paymentTermDueDate(i.C_PaymentTerm_ID, i.DateInvoiced) AS DateDue", Timestamp.class, true, true, null), - new ColumnInfo(Msg.translate(ctx, "C_BPartner_ID"), "bp.Name", KeyNamePair.class, true, false, "i.C_BPartner_ID"), - new ColumnInfo(Msg.translate(ctx, "DocumentNo"), "i.DocumentNo", String.class), - new ColumnInfo(Msg.translate(ctx, "C_Currency_ID"), "c.ISO_Code", KeyNamePair.class, true, false, "i.C_Currency_ID"), - // 5..9 - new ColumnInfo(Msg.translate(ctx, "GrandTotal"), "i.GrandTotal", BigDecimal.class), - new ColumnInfo(Msg.translate(ctx, "DiscountAmt"), "paymentTermDiscount(i.GrandTotal,i.C_Currency_ID,i.C_PaymentTerm_ID,i.DateInvoiced, ?)", BigDecimal.class), - new ColumnInfo(Msg.getMsg(ctx, "DiscountDate"), "SysDate-paymentTermDueDays(i.C_PaymentTerm_ID,i.DateInvoiced,SysDate)", Timestamp.class), - new ColumnInfo(Msg.getMsg(ctx, "AmountDue"), "currencyConvert(invoiceOpen(i.C_Invoice_ID,i.C_InvoicePaySchedule_ID),i.C_Currency_ID, ?,?,i.C_ConversionType_ID, i.AD_Client_ID,i.AD_Org_ID)", BigDecimal.class), - new ColumnInfo(Msg.getMsg(ctx, "AmountPay"), "currencyConvert(invoiceOpen(i.C_Invoice_ID,i.C_InvoicePaySchedule_ID)-paymentTermDiscount(i.GrandTotal,i.C_Currency_ID,i.C_PaymentTerm_ID,i.DateInvoiced, ?),i.C_Currency_ID, ?,?,i.C_ConversionType_ID, i.AD_Client_ID,i.AD_Org_ID)", BigDecimal.class) - }, - // FROM - "C_Invoice_v i" - + " INNER JOIN C_BPartner bp ON (i.C_BPartner_ID=bp.C_BPartner_ID)" - + " INNER JOIN C_Currency c ON (i.C_Currency_ID=c.C_Currency_ID)" - + " INNER JOIN C_PaymentTerm p ON (i.C_PaymentTerm_ID=p.C_PaymentTerm_ID)", - // WHERE - "i.IsSOTrx=? AND IsPaid='N'" - // Different Payment Selection - + " AND NOT EXISTS (SELECT * FROM C_PaySelectionLine psl" - + " WHERE i.C_Invoice_ID=psl.C_Invoice_ID AND psl.C_PaySelectionCheck_ID IS NOT NULL)" - + " AND i.DocStatus IN ('CO','CL')" - + " AND i.AD_Client_ID=?", // additional where & order in loadTableInfo() - true, "i"); - // - miniTable.getModel().addTableModelListener(this); - // - fieldPayDate.setMandatory(true); - fieldPayDate.setValue(new Timestamp(System.currentTimeMillis())); - // - m_AD_Client_ID = Env.getAD_Client_ID(Env.getCtx()); - } // dynInit - - /** - * Load Bank Info - Load Info from Bank Account and valid Documents (PaymentRule) - */ - private void loadBankInfo() - { - BankInfo bi = (BankInfo)fieldBankAccount.getSelectedItem(); - if (bi == null) - return; - labelCurrency.setText(bi.Currency); - labelBalance.setText(m_format.format(bi.Balance)); - m_bankBalance = bi.Balance; - - // PaymentRule - fieldPaymentRule.removeAllItems(); - int AD_Reference_ID = 195; // MLookupInfo.getAD_Reference_ID("All_Payment Rule"); - Language language = Env.getLanguage(Env.getCtx()); - MLookupInfo info = MLookupFactory.getLookup_List(language, AD_Reference_ID); - String sql = info.Query.substring(0, info.Query.indexOf(" ORDER BY")) - + " AND " + info.KeyColumn - + " IN (SELECT PaymentRule FROM C_BankAccountDoc WHERE C_BankAccount_ID=?) " - + info.Query.substring(info.Query.indexOf(" ORDER BY")); - try - { - PreparedStatement pstmt = DB.prepareStatement(sql, null); - pstmt.setInt(1, bi.C_BankAccount_ID); - ResultSet rs = pstmt.executeQuery(); - ValueNamePair vp = null; - while (rs.next()) - { - vp = new ValueNamePair(rs.getString(2), rs.getString(3)); // returns also not active - fieldPaymentRule.addItem(vp); - } - rs.close(); - pstmt.close(); - } - catch (SQLException e) - { - log.log(Level.SEVERE, sql, e); - } - fieldPaymentRule.setSelectedIndex(0); - - } // loadBankInfo - - /** - * Query and create TableInfo - */ - private void loadTableInfo() - { - log.config(""); - // not yet initialized - if (m_sql == null) - return; - - String sql = m_sql; - // Parameters - Timestamp payDate = (Timestamp)fieldPayDate.getValue(); - miniTable.setColorCompare(payDate); - log.config("PayDate=" + payDate); - BankInfo bi = (BankInfo)fieldBankAccount.getSelectedItem(); - // - String isSOTrx = "N"; - ValueNamePair vp = (ValueNamePair)fieldPaymentRule.getSelectedItem(); - if (vp != null && X_C_Order.PAYMENTRULE_DirectDebit.equals(vp.getValue())) - { - isSOTrx = "Y"; - sql += " AND i.PaymentRule='" + X_C_Order.PAYMENTRULE_DirectDebit + "'"; - } - // - if (onlyDue.isSelected()) - sql += " AND paymentTermDueDate(i.C_PaymentTerm_ID, i.DateInvoiced) <= ?"; - // - KeyNamePair pp = (KeyNamePair)fieldBPartner.getSelectedItem(); - int C_BPartner_ID = pp.getKey(); - if (C_BPartner_ID != 0) - sql += " AND i.C_BPartner_ID=?"; - sql += " ORDER BY 2,3"; - // - log.finest(sql + " - C_Currecny_ID=" + bi.C_Currency_ID + ", C_BPartner_ID=" + C_BPartner_ID); - - // Get Open Invoices - try - { - int index = 1; - PreparedStatement pstmt = DB.prepareStatement(sql, null); - pstmt.setTimestamp(index++, payDate); // DiscountAmt - pstmt.setInt(index++, bi.C_Currency_ID); // DueAmt - pstmt.setTimestamp(index++, payDate); - pstmt.setTimestamp(index++, payDate); // PayAmt - pstmt.setInt(index++, bi.C_Currency_ID); - pstmt.setTimestamp(index++, payDate); - pstmt.setString(index++, isSOTrx); // IsSOTrx - pstmt.setInt(index++, m_AD_Client_ID); // Client - if (onlyDue.isSelected()) - pstmt.setTimestamp(index++, payDate); - if (C_BPartner_ID != 0) - pstmt.setInt(index++, C_BPartner_ID); - // - ResultSet rs = pstmt.executeQuery(); - miniTable.loadTable(rs); - rs.close(); - pstmt.close(); - } - catch (SQLException e) - { - log.log(Level.SEVERE, sql, e); - } - calculateSelection(); - } // loadTableInfo - - /** - * Dispose - */ - public void dispose() - { - if (m_frame != null) - m_frame.dispose(); - m_frame = null; - } // dispose - - - /************************************************************************** - * ActionListener - * @param e event - */ - public void actionPerformed (ActionEvent e) - { - // Update Bank Info - if (e.getSource() == fieldBankAccount) - loadBankInfo(); - - // Generate PaySelection - else if (e.getSource() == bGenerate) - { - generatePaySelect(); - dispose(); - } - - else if (e.getSource() == bCancel) - dispose(); - - // Update Open Invoices - else if (e.getSource() == fieldBPartner || e.getSource() == bRefresh) - loadTableInfo(); - - } // actionPerformed - - /** - * Table Model Listener - * @param e event - */ - public void tableChanged(TableModelEvent e) - { - if (e.getColumn() == 0) - calculateSelection(); - } // valueChanged - - /** - * Calculate selected rows. - * - add up selected rows - */ - public void calculateSelection() - { - m_noSelected = 0; - BigDecimal invoiceAmt = new BigDecimal(0.0); - - int rows = miniTable.getRowCount(); - for (int i = 0; i < rows; i++) - { - IDColumn id = (IDColumn)miniTable.getModel().getValueAt(i, 0); - if (id.isSelected()) - { - BigDecimal amt = (BigDecimal)miniTable.getModel().getValueAt(i, 9); - if (amt != null) - invoiceAmt = invoiceAmt.add(amt); - m_noSelected++; - } - } - - // Information - BigDecimal remaining = m_bankBalance.subtract(invoiceAmt); - StringBuffer info = new StringBuffer(); - info.append(m_noSelected).append(" ").append(Msg.getMsg(Env.getCtx(), "Selected")).append(" - "); - info.append(m_format.format(invoiceAmt)).append(", "); - info.append(Msg.getMsg(Env.getCtx(), "Remaining")).append(" ").append(m_format.format(remaining)); - dataStatus.setText(info.toString()); - // - bGenerate.setEnabled(m_noSelected != 0); - } // calculateSelection - - /** - * Generate PaySelection - */ - private void generatePaySelect() - { - log.info(""); - // String trxName Trx.createTrxName("PaySelect"); - // Trx trx = Trx.get(trxName, true); trx needs to be committed too - String trxName = null; - Trx trx = null; - // - miniTable.stopEditor(true); - if (miniTable.getRowCount() == 0) - return; - miniTable.setRowSelectionInterval(0,0); - calculateSelection(); - if (m_noSelected == 0) - return; - - String PaymentRule = ((ValueNamePair)fieldPaymentRule.getSelectedItem()).getValue(); - - // Create Header - m_ps = new MPaySelection(Env.getCtx(), 0, trxName); - m_ps.setName (Msg.getMsg(Env.getCtx(), "VPaySelect") - + " - " + ((ValueNamePair)fieldPaymentRule.getSelectedItem()).getName() - + " - " + fieldPayDate.getTimestamp()); - m_ps.setPayDate (fieldPayDate.getTimestamp()); - BankInfo bi = (BankInfo)fieldBankAccount.getSelectedItem(); - m_ps.setC_BankAccount_ID(bi.C_BankAccount_ID); - m_ps.setIsApproved(true); - if (!m_ps.save()) - { - ADialog.error(m_WindowNo, this, "SaveError", Msg.translate(Env.getCtx(), "C_PaySelection_ID")); - m_ps = null; - return; - } - log.config(m_ps.toString()); - - // Create Lines - int rows = miniTable.getRowCount(); - int line = 0; - for (int i = 0; i < rows; i++) - { - IDColumn id = (IDColumn)miniTable.getModel().getValueAt(i, 0); - if (id.isSelected()) - { - line += 10; - MPaySelectionLine psl = new MPaySelectionLine (m_ps, line, PaymentRule); - int C_Invoice_ID = id.getRecord_ID().intValue(); - BigDecimal OpenAmt = (BigDecimal)miniTable.getModel().getValueAt(i, 8); - BigDecimal PayAmt = (BigDecimal)miniTable.getModel().getValueAt(i, 9); - boolean isSOTrx = false; - // - psl.setInvoice(C_Invoice_ID, isSOTrx, - OpenAmt, PayAmt, OpenAmt.subtract(PayAmt)); - if (!psl.save(trxName)) - { - ADialog.error(m_WindowNo, this, "SaveError", Msg.translate(Env.getCtx(), "C_PaySelectionLine_ID")); - return; - } - log.fine("C_Invoice_ID=" + C_Invoice_ID + ", PayAmt=" + PayAmt); - } - } // for all rows in table - - - // Ask to Post it - if (!ADialog.ask(m_WindowNo, this, "VPaySelectGenerate?", "(" + m_ps.getName() + ")")) - return; - - // Prepare Process - int AD_Proces_ID = 155; // C_PaySelection_CreatePayment - ProcessInfo pi = new ProcessInfo (m_frame.getTitle(), AD_Proces_ID, - X_C_PaySelection.Table_ID, m_ps.getC_PaySelection_ID()); - pi.setAD_User_ID (Env.getAD_User_ID(Env.getCtx())); - pi.setAD_Client_ID(Env.getAD_Client_ID(Env.getCtx())); - - // Execute Process - ProcessCtl.process(this, m_WindowNo, pi, trx); - // ProcessCtl worker = new ProcessCtl(this, pi, trx); - // worker.start(); // complete tasks in unlockUI - } // generatePaySelect - - /** - * Lock User Interface - * Called from the Worker before processing - * @param pi process info - */ - public void lockUI (ProcessInfo pi) - { - this.setEnabled(false); - m_isLocked = true; - } // lockUI - - /** - * Unlock User Interface. - * Called from the Worker when processing is done - * @param pi process info - */ - public void unlockUI (ProcessInfo pi) - { - // this.setEnabled(true); - // m_isLocked = false; - // Ask to Print it // Window is disposed - if (!ADialog.ask(0, this, "VPaySelectPrint?", "(" + pi.getSummary() + ")")) - return; - - // Start PayPrint - int AD_Form_ID = 106; // Payment Print/Export - FormFrame ff = new FormFrame(); - ff.openForm (AD_Form_ID); - // Set Parameter - if (m_ps != null) - { - VPayPrint pp = (VPayPrint)ff.getFormPanel(); - pp.setPaySelection(m_ps.getC_PaySelection_ID()); - } - // - ff.pack(); - this.setVisible(false); - AEnv.addToWindowManager(ff); - AEnv.showCenterScreen(ff); - this.dispose(); - } // unlockUI - - /** - * Is the UI locked (Internal method) - * @return true, if UI is locked - */ - public boolean isUILocked() - { - return m_isLocked; - } // isLoacked - - /** - * Method to be executed async. - * Called from the ASyncProcess worker - * @param pi process info - */ - public void executeASync (ProcessInfo pi) - { - log.config("-"); - } // executeASync - - - /************************************************************************** - * Bank Account Info - */ - public class BankInfo - { - /** - * BankInfo - * @param newC_BankAccount_ID - * @param newC_Currency_ID - * @param newName - * @param newCurrency - * @param newBalance - * @param newTransfers - */ - public BankInfo (int newC_BankAccount_ID, int newC_Currency_ID, - String newName, String newCurrency, BigDecimal newBalance, boolean newTransfers) - { - C_BankAccount_ID = newC_BankAccount_ID; - C_Currency_ID = newC_Currency_ID; - Name = newName; - Currency = newCurrency; - Balance = newBalance; - } - int C_BankAccount_ID; - int C_Currency_ID; - String Name; - String Currency; - BigDecimal Balance; - boolean Transfers; - - /** - * to String - * @return info - */ - public String toString() - { - return Name; - } - } // BankInfo - -} // VPaySelect +/****************************************************************************** + * 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 * + * Contributors: * + * Colin Rooney (croo) Patch 1605368 Fixed Payment Terms & Only due * + *****************************************************************************/ +package org.compiere.apps.form; + +import java.awt.BorderLayout; +import java.awt.FlowLayout; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.math.BigDecimal; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.text.DecimalFormat; +import java.util.Properties; +import java.util.logging.Level; + +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JScrollPane; +import javax.swing.event.TableModelEvent; +import javax.swing.event.TableModelListener; + +import org.compiere.apps.ADialog; +import org.compiere.apps.AEnv; +import org.compiere.apps.ConfirmPanel; +import org.compiere.apps.ProcessCtl; +import org.compiere.grid.ed.VCheckBox; +import org.compiere.grid.ed.VComboBox; +import org.compiere.grid.ed.VDate; +import org.compiere.minigrid.ColumnInfo; +import org.compiere.minigrid.IDColumn; +import org.compiere.minigrid.MiniTable; +import org.compiere.model.MLookupFactory; +import org.compiere.model.MLookupInfo; +import org.compiere.model.MPaySelection; +import org.compiere.model.MPaySelectionLine; +import org.compiere.model.MRole; +import org.compiere.model.X_C_Order; +import org.compiere.model.X_C_PaySelection; +import org.compiere.plaf.CompiereColor; +import org.compiere.process.ProcessInfo; +import org.compiere.swing.CLabel; +import org.compiere.swing.CPanel; +import org.compiere.util.ASyncProcess; +import org.compiere.util.CLogger; +import org.compiere.util.DB; +import org.compiere.util.DisplayType; +import org.compiere.util.Env; +import org.compiere.util.KeyNamePair; +import org.compiere.util.Language; +import org.compiere.util.Msg; +import org.compiere.util.Trx; +import org.compiere.util.ValueNamePair; + +/** + * Create Manual Payments From (AP) Invoices or (AR) Credit Memos. + * Allows user to select Invoices for payment. + * When Processed, PaySelection is created + * and optionally posted/generated and printed + * + * @author Jorg Janke + * @version $Id: VPaySelect.java,v 1.2 2008/07/11 08:20:12 cruiz Exp $ + */ +public class VPaySelect extends CPanel + implements FormPanel, ActionListener, TableModelListener, ASyncProcess +{ + /** @todo withholding */ + + /** + * Initialize Panel + * @param WindowNo window + * @param frame frame + */ + public void init (int WindowNo, FormFrame frame) + { + log.info(""); + m_WindowNo = WindowNo; + m_frame = frame; + try + { + jbInit(); + dynInit(); + frame.getContentPane().add(commandPanel, BorderLayout.SOUTH); + frame.getContentPane().add(mainPanel, BorderLayout.CENTER); + } + catch(Exception e) + { + log.log(Level.SEVERE, "", e); + } + } // init + + /** Window No */ + private int m_WindowNo = 0; + /** FormFrame */ + private FormFrame m_frame; + + /** Format */ + private DecimalFormat m_format = DisplayType.getNumberFormat(DisplayType.Amount); + /** Bank Balance */ + private BigDecimal m_bankBalance = new BigDecimal(0.0); + /** SQL for Query */ + private String m_sql; + /** Number of selected rows */ + private int m_noSelected = 0; + /** Client ID */ + private int m_AD_Client_ID = 0; + /**/ + private boolean m_isLocked = false; + /** Payment Selection */ + private MPaySelection m_ps = null; + /** Logger */ + private static CLogger log = CLogger.getCLogger(VPaySelect.class); + + // + private CPanel mainPanel = new CPanel(); + private BorderLayout mainLayout = new BorderLayout(); + private CPanel parameterPanel = new CPanel(); + private CLabel labelBankAccount = new CLabel(); + private VComboBox fieldBankAccount = new VComboBox(); + private GridBagLayout parameterLayout = new GridBagLayout(); + private CLabel labelBankBalance = new CLabel(); + private CLabel labelCurrency = new CLabel(); + private CLabel labelBalance = new CLabel(); + private VCheckBox onlyDue = new VCheckBox(); + private CLabel labelBPartner = new CLabel(); + private VComboBox fieldBPartner = new VComboBox(); + private CLabel labelDtype = new CLabel(); + private VComboBox fieldDtype = new VComboBox(); + + private JLabel dataStatus = new JLabel(); + private JScrollPane dataPane = new JScrollPane(); + private MiniTable miniTable = new MiniTable(); + private CPanel commandPanel = new CPanel(); + private JButton bCancel = ConfirmPanel.createCancelButton(true); + private JButton bGenerate = ConfirmPanel.createProcessButton(true); + private FlowLayout commandLayout = new FlowLayout(); + private JButton bRefresh = ConfirmPanel.createRefreshButton(true); + private CLabel labelPayDate = new CLabel(); + private VDate fieldPayDate = new VDate(); + private CLabel labelPaymentRule = new CLabel(); + private VComboBox fieldPaymentRule = new VComboBox(); + + /** + * Static Init + * @throws Exception + */ + private void jbInit() throws Exception + { + CompiereColor.setBackground(this); + // + mainPanel.setLayout(mainLayout); + parameterPanel.setLayout(parameterLayout); + // + labelBankAccount.setText(Msg.translate(Env.getCtx(), "C_BankAccount_ID")); + fieldBankAccount.addActionListener(this); + labelBPartner.setText(Msg.translate(Env.getCtx(), "C_BPartner_ID")); + fieldBPartner.addActionListener(this); + bRefresh.addActionListener(this); + labelDtype.setText(Msg.translate(Env.getCtx(), "C_DocType_ID")); + fieldDtype.addActionListener(this); + labelPayDate.setText(Msg.translate(Env.getCtx(), "PayDate")); + labelPaymentRule.setText(Msg.translate(Env.getCtx(), "PaymentRule")); + fieldPaymentRule.addActionListener(this); + // + labelBankBalance.setText(Msg.translate(Env.getCtx(), "CurrentBalance")); + labelBalance.setText("0"); + onlyDue.setText(Msg.getMsg(Env.getCtx(), "OnlyDue")); + dataStatus.setText(" "); + // + bGenerate.addActionListener(this); + bCancel.addActionListener(this); + // + mainPanel.add(parameterPanel, BorderLayout.NORTH); + parameterPanel.add(labelBankAccount, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 + ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + parameterPanel.add(fieldBankAccount, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0 + ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0)); + + parameterPanel.add(labelBankBalance, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0 + ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + parameterPanel.add(labelCurrency, new GridBagConstraints(4, 0, 1, 1, 0.0, 0.0 + ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 0, 5, 5), 0, 0)); + + parameterPanel.add(labelBalance, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0 + ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + + parameterPanel.add(labelBPartner, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 + ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + parameterPanel.add(fieldBPartner, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0 + ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0)); + + parameterPanel.add(labelDtype, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0 + ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + parameterPanel.add(fieldDtype, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0 + ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0)); + + parameterPanel.add(bRefresh, new GridBagConstraints(4, 3, 1, 1, 0.0, 0.0 + ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + + parameterPanel.add(labelPayDate, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0 + ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + parameterPanel.add(fieldPayDate, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0 + ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0)); + + parameterPanel.add(labelPaymentRule, new GridBagConstraints(2, 3, 1, 1, 0.0, 0.0 + ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + parameterPanel.add(fieldPaymentRule, new GridBagConstraints(3, 3, 1, 1, 0.0, 0.0 + ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + + parameterPanel.add(onlyDue, new GridBagConstraints(3, 1, 1, 1, 0.0, 0.0 + ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + mainPanel.add(dataStatus, BorderLayout.SOUTH); + mainPanel.add(dataPane, BorderLayout.CENTER); + dataPane.getViewport().add(miniTable, null); + // + commandPanel.setLayout(commandLayout); + commandLayout.setAlignment(FlowLayout.RIGHT); + commandLayout.setHgap(10); + commandPanel.add(bCancel, null); + commandPanel.add(bGenerate, null); + } // jbInit + + /** + * Dynamic Init. + * - Load Bank Info + * - Load BPartner + * - Load Document Type + * - Init Table + */ + private void dynInit() + { + Properties ctx = Env.getCtx(); + // + m_AD_Client_ID = Env.getAD_Client_ID(Env.getCtx()); + // Bank Account Info + String sql = MRole.getDefault().addAccessSQL( + "SELECT ba.C_BankAccount_ID," // 1 + + "b.Name || ' ' || ba.AccountNo AS Name," // 2 + + "ba.C_Currency_ID, c.ISO_Code," // 3..4 + + "ba.CurrentBalance " // 5 + + "FROM C_Bank b, C_BankAccount ba, C_Currency c " + + "WHERE b.C_Bank_ID=ba.C_Bank_ID" + + " AND ba.C_Currency_ID=c.C_Currency_ID " + + " AND EXISTS (SELECT * FROM C_BankAccountDoc d WHERE d.C_BankAccount_ID=ba.C_BankAccount_ID) " + + "ORDER BY 2", + "b", MRole.SQL_FULLYQUALIFIED, MRole.SQL_RW); + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) + { + boolean transfers = false; + BankInfo bi = new BankInfo (rs.getInt(1), rs.getInt(3), + rs.getString(2), rs.getString(4), + rs.getBigDecimal(5), transfers); + fieldBankAccount.addItem(bi); + } + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + } + if (fieldBankAccount.getItemCount() == 0) + ADialog.error(m_WindowNo, this, "VPaySelectNoBank"); + else + fieldBankAccount.setSelectedIndex(0); + + // Optional BusinessPartner with unpaid AP Invoices + KeyNamePair pp = new KeyNamePair(0, ""); + fieldBPartner.addItem(pp); + sql = MRole.getDefault().addAccessSQL( + "SELECT bp.C_BPartner_ID, bp.Name FROM C_BPartner bp", "bp", + MRole.SQL_FULLYQUALIFIED, MRole.SQL_RO) + + " AND EXISTS (SELECT * FROM C_Invoice i WHERE bp.C_BPartner_ID=i.C_BPartner_ID" + // X_C_Order.PAYMENTRULE_DirectDebit + + " AND (i.IsSOTrx='N' OR (i.IsSOTrx='Y' AND i.PaymentRule='D'))" + + " AND i.IsPaid<>'Y') " + + "ORDER BY 2"; + + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) + { + pp = new KeyNamePair(rs.getInt(1), rs.getString(2)); + fieldBPartner.addItem(pp); + } + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + } + fieldBPartner.setSelectedIndex(0); + + /**Document type**/ + try + { + sql = MRole.getDefault().addAccessSQL( + "SELECT doc.c_doctype_id,doc.name FROM c_doctype doc WHERE doc.ad_client_id = ? AND doc.docbasetype in ('API','APC') ORDER BY 2", "doc", + MRole.SQL_FULLYQUALIFIED, MRole.SQL_RO); + + KeyNamePair dt = new KeyNamePair(0, ""); + fieldDtype.addItem(dt); + PreparedStatement pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, m_AD_Client_ID); // Client + ResultSet rs = pstmt.executeQuery(); + + while (rs.next()) + { + dt = new KeyNamePair(rs.getInt(1), rs.getString(2)); + fieldDtype.addItem(dt); + } + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + } + + /** prepare MiniTable + * + SELECT i.C_Invoice_ID, i.DateInvoiced+p.NetDays AS DateDue, + bp.Name, i.DocumentNo, c.ISO_Code, i.GrandTotal, + paymentTermDiscount(i.GrandTotal, i.C_PaymentTerm_ID, i.DateInvoiced, SysDate) AS Discount, + SysDate-paymentTermDueDays(i.C_PaymentTerm_ID,i.DateInvoiced) AS DiscountDate, + i.GrandTotal-paymentTermDiscount(i.GrandTotal,i.C_PaymentTerm_ID,i.DateInvoiced,SysDate) AS DueAmount, + currencyConvert(i.GrandTotal-paymentTermDiscount(i.GrandTotal,i.C_PaymentTerm_ID,i.DateInvoiced,SysDate,null), + i.C_Currency_ID,xx100,SysDate) AS PayAmt + FROM C_Invoice i, C_BPartner bp, C_Currency c, C_PaymentTerm p + WHERE i.IsSOTrx='N' + AND i.C_BPartner_ID=bp.C_BPartner_ID + AND i.C_Currency_ID=c.C_Currency_ID + AND i.C_PaymentTerm_ID=p.C_PaymentTerm_ID + AND i.DocStatus IN ('CO','CL') + ORDER BY 2,3 + */ + + m_sql = miniTable.prepareTable(new ColumnInfo[] { + // 0..4 + new ColumnInfo(" ", "i.C_Invoice_ID", IDColumn.class, false, false, null), + new ColumnInfo(Msg.translate(ctx, "DueDate"), "paymentTermDueDate(i.C_PaymentTerm_ID, i.DateInvoiced) AS DateDue", Timestamp.class, true, true, null), + new ColumnInfo(Msg.translate(ctx, "C_BPartner_ID"), "bp.Name", KeyNamePair.class, true, false, "i.C_BPartner_ID"), + new ColumnInfo(Msg.translate(ctx, "DocumentNo"), "i.DocumentNo", String.class), + new ColumnInfo(Msg.translate(ctx, "C_Currency_ID"), "c.ISO_Code", KeyNamePair.class, true, false, "i.C_Currency_ID"), + // 5..9 + new ColumnInfo(Msg.translate(ctx, "GrandTotal"), "i.GrandTotal", BigDecimal.class), + new ColumnInfo(Msg.translate(ctx, "DiscountAmt"), "paymentTermDiscount(i.GrandTotal,i.C_Currency_ID,i.C_PaymentTerm_ID,i.DateInvoiced, ?)", BigDecimal.class), + new ColumnInfo(Msg.getMsg(ctx, "DiscountDate"), "SysDate-paymentTermDueDays(i.C_PaymentTerm_ID,i.DateInvoiced,SysDate)", Timestamp.class), + new ColumnInfo(Msg.getMsg(ctx, "AmountDue"), "currencyConvert(invoiceOpen(i.C_Invoice_ID,i.C_InvoicePaySchedule_ID),i.C_Currency_ID, ?,?,i.C_ConversionType_ID, i.AD_Client_ID,i.AD_Org_ID)", BigDecimal.class), + new ColumnInfo(Msg.getMsg(ctx, "AmountPay"), "currencyConvert(invoiceOpen(i.C_Invoice_ID,i.C_InvoicePaySchedule_ID)-paymentTermDiscount(i.GrandTotal,i.C_Currency_ID,i.C_PaymentTerm_ID,i.DateInvoiced, ?),i.C_Currency_ID, ?,?,i.C_ConversionType_ID, i.AD_Client_ID,i.AD_Org_ID)", BigDecimal.class) + }, + // FROM + "C_Invoice_v i" + + " INNER JOIN C_BPartner bp ON (i.C_BPartner_ID=bp.C_BPartner_ID)" + + " INNER JOIN C_Currency c ON (i.C_Currency_ID=c.C_Currency_ID)" + + " INNER JOIN C_PaymentTerm p ON (i.C_PaymentTerm_ID=p.C_PaymentTerm_ID)", + // WHERE + "i.IsSOTrx=? AND IsPaid='N'" + // Different Payment Selection + + " AND NOT EXISTS (SELECT * FROM C_PaySelectionLine psl" + + " WHERE i.C_Invoice_ID=psl.C_Invoice_ID AND psl.C_PaySelectionCheck_ID IS NOT NULL)" + + " AND i.DocStatus IN ('CO','CL')" + + " AND i.AD_Client_ID=?", // additional where & order in loadTableInfo() + true, "i"); + // + miniTable.getModel().addTableModelListener(this); + // + fieldPayDate.setMandatory(true); + fieldPayDate.setValue(new Timestamp(System.currentTimeMillis())); + + } // dynInit + + /** + * Load Bank Info - Load Info from Bank Account and valid Documents (PaymentRule) + */ + private void loadBankInfo() + { + BankInfo bi = (BankInfo)fieldBankAccount.getSelectedItem(); + if (bi == null) + return; + labelCurrency.setText(bi.Currency); + labelBalance.setText(m_format.format(bi.Balance)); + m_bankBalance = bi.Balance; + + // PaymentRule + fieldPaymentRule.removeAllItems(); + int AD_Reference_ID = 195; // MLookupInfo.getAD_Reference_ID("All_Payment Rule"); + Language language = Env.getLanguage(Env.getCtx()); + MLookupInfo info = MLookupFactory.getLookup_List(language, AD_Reference_ID); + String sql = info.Query.substring(0, info.Query.indexOf(" ORDER BY")) + + " AND " + info.KeyColumn + + " IN (SELECT PaymentRule FROM C_BankAccountDoc WHERE C_BankAccount_ID=?) " + + info.Query.substring(info.Query.indexOf(" ORDER BY")); + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, bi.C_BankAccount_ID); + ResultSet rs = pstmt.executeQuery(); + ValueNamePair vp = null; + while (rs.next()) + { + vp = new ValueNamePair(rs.getString(2), rs.getString(3)); // returns also not active + fieldPaymentRule.addItem(vp); + } + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + } + fieldPaymentRule.setSelectedIndex(0); + + } // loadBankInfo + + /** + * Query and create TableInfo + */ + private void loadTableInfo() + { + log.config(""); + // not yet initialized + if (m_sql == null) + return; + + String sql = m_sql; + // Parameters + Timestamp payDate = (Timestamp)fieldPayDate.getValue(); + miniTable.setColorCompare(payDate); + log.config("PayDate=" + payDate); + BankInfo bi = (BankInfo)fieldBankAccount.getSelectedItem(); + // + String isSOTrx = "N"; + ValueNamePair vp = (ValueNamePair)fieldPaymentRule.getSelectedItem(); + if (vp != null && X_C_Order.PAYMENTRULE_DirectDebit.equals(vp.getValue())) + { + isSOTrx = "Y"; + sql += " AND i.PaymentRule='" + X_C_Order.PAYMENTRULE_DirectDebit + "'"; + } + // + if (onlyDue.isSelected()) + sql += " AND paymentTermDueDate(i.C_PaymentTerm_ID, i.DateInvoiced) <= ?"; + // + KeyNamePair pp = (KeyNamePair)fieldBPartner.getSelectedItem(); + int C_BPartner_ID = pp.getKey(); + if (C_BPartner_ID != 0) + sql += " AND i.C_BPartner_ID=?"; + //Document Type + KeyNamePair dt = (KeyNamePair)fieldDtype.getSelectedItem(); + int c_doctype_id = dt.getKey(); + if (c_doctype_id != 0) + sql += " AND i.c_doctype_id =?"; + sql += " ORDER BY 2,3"; + + log.finest(sql + " - C_Currency_ID=" + bi.C_Currency_ID + ", C_BPartner_ID=" + C_BPartner_ID + ", C_doctype_id=" + c_doctype_id ); + // Get Open Invoices + try + { + int index = 1; + PreparedStatement pstmt = DB.prepareStatement(sql, null); + pstmt.setTimestamp(index++, payDate); // DiscountAmt + pstmt.setInt(index++, bi.C_Currency_ID); // DueAmt + pstmt.setTimestamp(index++, payDate); + pstmt.setTimestamp(index++, payDate); // PayAmt + pstmt.setInt(index++, bi.C_Currency_ID); + pstmt.setTimestamp(index++, payDate); + pstmt.setString(index++, isSOTrx); // IsSOTrx + pstmt.setInt(index++, m_AD_Client_ID); // Client + if (onlyDue.isSelected()) + pstmt.setTimestamp(index++, payDate); + if (C_BPartner_ID != 0) + pstmt.setInt(index++, C_BPartner_ID); + if (c_doctype_id != 0) //Document type + pstmt.setInt(index++, c_doctype_id ); + // + ResultSet rs = pstmt.executeQuery(); + miniTable.loadTable(rs); + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + } + calculateSelection(); + } // loadTableInfo + + /** + * Dispose + */ + public void dispose() + { + if (m_frame != null) + m_frame.dispose(); + m_frame = null; + } // dispose + + + /************************************************************************** + * ActionListener + * @param e event + */ + public void actionPerformed (ActionEvent e) + { + // Update Bank Info + if (e.getSource() == fieldBankAccount) + loadBankInfo(); + + // Generate PaySelection + else if (e.getSource() == bGenerate) + { + generatePaySelect(); + dispose(); + } + + else if (e.getSource() == bCancel) + dispose(); + + // Update Open Invoices + else if (e.getSource() == fieldBPartner || e.getSource() == bRefresh || e.getSource() == fieldDtype) + loadTableInfo(); + + } // actionPerformed + + /** + * Table Model Listener + * @param e event + */ + public void tableChanged(TableModelEvent e) + { + if (e.getColumn() == 0) + calculateSelection(); + } // valueChanged + + /** + * Calculate selected rows. + * - add up selected rows + */ + public void calculateSelection() + { + m_noSelected = 0; + BigDecimal invoiceAmt = new BigDecimal(0.0); + + int rows = miniTable.getRowCount(); + for (int i = 0; i < rows; i++) + { + IDColumn id = (IDColumn)miniTable.getModel().getValueAt(i, 0); + if (id.isSelected()) + { + BigDecimal amt = (BigDecimal)miniTable.getModel().getValueAt(i, 9); + if (amt != null) + invoiceAmt = invoiceAmt.add(amt); + m_noSelected++; + } + } + + // Information + BigDecimal remaining = m_bankBalance.subtract(invoiceAmt); + StringBuffer info = new StringBuffer(); + info.append(m_noSelected).append(" ").append(Msg.getMsg(Env.getCtx(), "Selected")).append(" - "); + info.append(m_format.format(invoiceAmt)).append(", "); + info.append(Msg.getMsg(Env.getCtx(), "Remaining")).append(" ").append(m_format.format(remaining)); + dataStatus.setText(info.toString()); + // + bGenerate.setEnabled(m_noSelected != 0); + } // calculateSelection + + /** + * Generate PaySelection + */ + private void generatePaySelect() + { + log.info(""); + // String trxName Trx.createTrxName("PaySelect"); + // Trx trx = Trx.get(trxName, true); trx needs to be committed too + String trxName = null; + Trx trx = null; + // + miniTable.stopEditor(true); + if (miniTable.getRowCount() == 0) + return; + miniTable.setRowSelectionInterval(0,0); + calculateSelection(); + if (m_noSelected == 0) + return; + + String PaymentRule = ((ValueNamePair)fieldPaymentRule.getSelectedItem()).getValue(); + + // Create Header + m_ps = new MPaySelection(Env.getCtx(), 0, trxName); + m_ps.setName (Msg.getMsg(Env.getCtx(), "VPaySelect") + + " - " + ((ValueNamePair)fieldPaymentRule.getSelectedItem()).getName() + + " - " + fieldPayDate.getTimestamp()); + m_ps.setPayDate (fieldPayDate.getTimestamp()); + BankInfo bi = (BankInfo)fieldBankAccount.getSelectedItem(); + m_ps.setC_BankAccount_ID(bi.C_BankAccount_ID); + m_ps.setIsApproved(true); + if (!m_ps.save()) + { + ADialog.error(m_WindowNo, this, "SaveError", Msg.translate(Env.getCtx(), "C_PaySelection_ID")); + m_ps = null; + return; + } + log.config(m_ps.toString()); + + // Create Lines + int rows = miniTable.getRowCount(); + int line = 0; + for (int i = 0; i < rows; i++) + { + IDColumn id = (IDColumn)miniTable.getModel().getValueAt(i, 0); + if (id.isSelected()) + { + line += 10; + MPaySelectionLine psl = new MPaySelectionLine (m_ps, line, PaymentRule); + int C_Invoice_ID = id.getRecord_ID().intValue(); + BigDecimal OpenAmt = (BigDecimal)miniTable.getModel().getValueAt(i, 8); + BigDecimal PayAmt = (BigDecimal)miniTable.getModel().getValueAt(i, 9); + boolean isSOTrx = false; + // + psl.setInvoice(C_Invoice_ID, isSOTrx, + OpenAmt, PayAmt, OpenAmt.subtract(PayAmt)); + if (!psl.save(trxName)) + { + ADialog.error(m_WindowNo, this, "SaveError", Msg.translate(Env.getCtx(), "C_PaySelectionLine_ID")); + return; + } + log.fine("C_Invoice_ID=" + C_Invoice_ID + ", PayAmt=" + PayAmt); + } + } // for all rows in table + + + // Ask to Post it + if (!ADialog.ask(m_WindowNo, this, "VPaySelectGenerate?", "(" + m_ps.getName() + ")")) + return; + + // Prepare Process + int AD_Proces_ID = 155; // C_PaySelection_CreatePayment + ProcessInfo pi = new ProcessInfo (m_frame.getTitle(), AD_Proces_ID, + X_C_PaySelection.Table_ID, m_ps.getC_PaySelection_ID()); + pi.setAD_User_ID (Env.getAD_User_ID(Env.getCtx())); + pi.setAD_Client_ID(Env.getAD_Client_ID(Env.getCtx())); + + // Execute Process + ProcessCtl.process(this, m_WindowNo, pi, trx); + // ProcessCtl worker = new ProcessCtl(this, pi, trx); + // worker.start(); // complete tasks in unlockUI + } // generatePaySelect + + /** + * Lock User Interface + * Called from the Worker before processing + * @param pi process info + */ + public void lockUI (ProcessInfo pi) + { + this.setEnabled(false); + m_isLocked = true; + } // lockUI + + /** + * Unlock User Interface. + * Called from the Worker when processing is done + * @param pi process info + */ + public void unlockUI (ProcessInfo pi) + { + // this.setEnabled(true); + // m_isLocked = false; + // Ask to Print it // Window is disposed + if (!ADialog.ask(0, this, "VPaySelectPrint?", "(" + pi.getSummary() + ")")) + return; + + // Start PayPrint + int AD_Form_ID = 106; // Payment Print/Export + FormFrame ff = new FormFrame(); + ff.openForm (AD_Form_ID); + // Set Parameter + if (m_ps != null) + { + VPayPrint pp = (VPayPrint)ff.getFormPanel(); + pp.setPaySelection(m_ps.getC_PaySelection_ID()); + } + // + ff.pack(); + this.setVisible(false); + AEnv.addToWindowManager(ff); + AEnv.showCenterScreen(ff); + this.dispose(); + } // unlockUI + + /** + * Is the UI locked (Internal method) + * @return true, if UI is locked + */ + public boolean isUILocked() + { + return m_isLocked; + } // isLoacked + + /** + * Method to be executed async. + * Called from the ASyncProcess worker + * @param pi process info + */ + public void executeASync (ProcessInfo pi) + { + log.config("-"); + } // executeASync + + + /************************************************************************** + * Bank Account Info + */ + public class BankInfo + { + /** + * BankInfo + * @param newC_BankAccount_ID + * @param newC_Currency_ID + * @param newName + * @param newCurrency + * @param newBalance + * @param newTransfers + */ + public BankInfo (int newC_BankAccount_ID, int newC_Currency_ID, + String newName, String newCurrency, BigDecimal newBalance, boolean newTransfers) + { + C_BankAccount_ID = newC_BankAccount_ID; + C_Currency_ID = newC_Currency_ID; + Name = newName; + Currency = newCurrency; + Balance = newBalance; + } + int C_BankAccount_ID; + int C_Currency_ID; + String Name; + String Currency; + BigDecimal Balance; + boolean Transfers; + + /** + * to String + * @return info + */ + public String toString() + { + return Name; + } + } // BankInfo + +} // VPaySelect diff --git a/migration/351a-trunk/227_MessageVPayPrintPrintCheck.sql b/migration/351a-trunk/227_MessageVPayPrintPrintCheck.sql new file mode 100644 index 0000000000..d0fd19ce6b --- /dev/null +++ b/migration/351a-trunk/227_MessageVPayPrintPrintCheck.sql @@ -0,0 +1,5 @@ +-- Jul 11, 2008 3:04:33 AM COT +-- Changes to Payment Selection and Print +UPDATE AD_Column SET AD_Reference_Value_ID=343,Updated=TO_DATE('2008-07-11 03:04:33','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=7719 +; + diff --git a/migration/351a-trunk/postgresql/227_MessageVPayPrintPrintCheck.sql b/migration/351a-trunk/postgresql/227_MessageVPayPrintPrintCheck.sql new file mode 100644 index 0000000000..0cc0121493 --- /dev/null +++ b/migration/351a-trunk/postgresql/227_MessageVPayPrintPrintCheck.sql @@ -0,0 +1,4 @@ +-- Jul 11, 2008 3:04:33 AM COT +-- Changes to Payment Selection and Print +UPDATE AD_Column SET AD_Reference_Value_ID=343,Updated=TO_TIMESTAMP('2008-07-11 03:04:33','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=7719 +;