/******************************************************************************
* 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.adempiere.webui.apps.form;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import org.adempiere.webui.apps.AEnv;
import org.adempiere.webui.component.Button;
import org.adempiere.webui.component.ConfirmPanel;
import org.adempiere.webui.component.Grid;
import org.adempiere.webui.component.GridFactory;
import org.adempiere.webui.component.Label;
import org.adempiere.webui.component.Listbox;
import org.adempiere.webui.component.ListboxFactory;
import org.adempiere.webui.component.Panel;
import org.adempiere.webui.component.Row;
import org.adempiere.webui.component.Rows;
import org.adempiere.webui.component.Window;
import org.adempiere.webui.editor.WNumberEditor;
import org.adempiere.webui.panel.ADForm;
import org.adempiere.webui.panel.CustomForm;
import org.adempiere.webui.panel.IFormController;
import org.adempiere.webui.session.SessionManager;
import org.adempiere.webui.window.FDialog;
import org.adempiere.webui.window.SimplePDFViewer;
import org.compiere.apps.form.PayPrint;
import org.compiere.model.MPaySelectionCheck;
import org.compiere.model.MPaymentBatch;
import org.compiere.print.ReportEngine;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.compiere.util.KeyNamePair;
import org.compiere.util.Msg;
import org.compiere.util.ValueNamePair;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zkex.zul.Borderlayout;
import org.zkoss.zkex.zul.Center;
import org.zkoss.zkex.zul.South;
import org.zkoss.zul.Filedownload;
/**
* Payment Print & Export
*
* @author Jorg Janke
* @version $Id: VPayPrint.java,v 1.2 2006/07/30 00:51:28 jjanke Exp $
*/
public class WPayPrint extends PayPrint implements IFormController, EventListener
{
/**
*
*/
private static final long serialVersionUID = -3005095685182033400L;
private CustomForm form = new CustomForm();
/**
* Initialize Panel
*/
public WPayPrint()
{
try
{
zkInit();
dynInit();
Borderlayout contentLayout = new Borderlayout();
contentLayout.setWidth("100%");
contentLayout.setHeight("100%");
form.appendChild(contentLayout);
Center center = new Center();
contentLayout.appendChild(center);
center.appendChild(centerPanel);
South south = new South();
south.setStyle("border: none");
contentLayout.appendChild(south);
south.appendChild(southPanel);
}
catch(Exception e)
{
log.log(Level.SEVERE, "", e);
}
} // init
// Static Variables
private Panel centerPanel = new Panel();
private ConfirmPanel southPanel = new ConfirmPanel(true, false, false, false, false, false, false);
private Grid centerLayout = GridFactory.newGridLayout();
private Button bPrint = southPanel.createButton(ConfirmPanel.A_PRINT);
private Button bExport = southPanel.createButton(ConfirmPanel.A_EXPORT);
private Button bCancel = southPanel.getButton(ConfirmPanel.A_CANCEL);
private Button bProcess = southPanel.createButton(ConfirmPanel.A_PROCESS);
private Label lPaySelect = new Label();
private Listbox fPaySelect = ListboxFactory.newDropdownListbox();
private Label lBank = new Label();
private Label fBank = new Label();
private Label lPaymentRule = new Label();
private Listbox fPaymentRule = ListboxFactory.newDropdownListbox();
private Label lDocumentNo = new Label();
private WNumberEditor fDocumentNo = new WNumberEditor();
private Label lNoPayments = new Label();
private Label fNoPayments = new Label();
private Label lBalance = new Label();
private WNumberEditor fBalance = new WNumberEditor();
private Label lCurrency = new Label();
private Label fCurrency = new Label();
/**
* Static Init
* @throws Exception
*/
private void zkInit() throws Exception
{
//
centerPanel.appendChild(centerLayout);
//
bPrint.addActionListener(this);
bExport.addActionListener(this);
bCancel.addActionListener(this);
//
bProcess.setEnabled(false);
bProcess.addActionListener(this);
//
lPaySelect.setText(Msg.translate(Env.getCtx(), "C_PaySelection_ID"));
fPaySelect.addActionListener(this);
//
lBank.setText(Msg.translate(Env.getCtx(), "C_BankAccount_ID"));
//
lPaymentRule.setText(Msg.translate(Env.getCtx(), "PaymentRule"));
fPaymentRule.addActionListener(this);
//
lDocumentNo.setText(Msg.translate(Env.getCtx(), "DocumentNo"));
fDocumentNo.getComponent().setIntegral(true);
lNoPayments.setText(Msg.getMsg(Env.getCtx(), "NoOfPayments"));
fNoPayments.setText("0");
lBalance.setText(Msg.translate(Env.getCtx(), "CurrentBalance"));
fBalance.setReadWrite(false);
fBalance.getComponent().setIntegral(false);
lCurrency.setText(Msg.translate(Env.getCtx(), "C_Currency_ID"));
//
southPanel.addButton(bExport);
southPanel.addButton(bPrint);
southPanel.addButton(bProcess);
//
Rows rows = centerLayout.newRows();
Row row = rows.newRow();
row.appendChild(lPaySelect.rightAlign());
row.appendChild(fPaySelect);
row = rows.newRow();
row.appendChild(lBank.rightAlign());
row.appendChild(fBank);
row.appendChild(lBalance.rightAlign());
row.appendChild(fBalance.getComponent());
row = rows.newRow();
row.appendChild(lPaymentRule.rightAlign());
row.appendChild(fPaymentRule);
row.appendChild(lCurrency.rightAlign());
row.appendChild(fCurrency);
row = rows.newRow();
row.appendChild(lDocumentNo.rightAlign());
row.appendChild(fDocumentNo.getComponent());
row.appendChild(lNoPayments.rightAlign());
row.appendChild(fNoPayments);
southPanel.getButton(ConfirmPanel.A_OK).setVisible(false);
} // VPayPrint
/**
* Dynamic Init
*/
private void dynInit()
{
ArrayList<KeyNamePair> data = getPaySelectionData();
for(KeyNamePair pp : data)
fPaySelect.addItem(pp);
if (fPaySelect.getItemCount() == 0)
FDialog.info(m_WindowNo, form, "VPayPrintNoRecords");
else
{
fPaySelect.setSelectedIndex(0);
loadPaySelectInfo();
}
} // dynInit
/**
* Dispose
*/
public void dispose()
{
SessionManager.getAppDesktop().closeActiveWindow();
} // dispose
/**
* Set Payment Selection
* @param C_PaySelection_ID id
*/
public void setPaySelection (int C_PaySelection_ID)
{
if (C_PaySelection_ID == 0)
return;
//
for (int i = 0; i < fPaySelect.getItemCount(); i++)
{
KeyNamePair pp = fPaySelect.getItemAtIndex(i).toKeyNamePair();
if (pp.getKey() == C_PaySelection_ID)
{
fPaySelect.setSelectedIndex(i);
loadPaySelectInfo();
return;
}
}
} // setsetPaySelection
/**************************************************************************
* Action Listener
* @param e event
*/
public void onEvent(Event e)
{
// log.config( "VPayPrint.actionPerformed" + e.toString());
if (e.getTarget() == fPaySelect)
loadPaySelectInfo();
else if (e.getTarget() == fPaymentRule)
loadPaymentRuleInfo();
//
else if (e.getTarget() == bCancel)
dispose();
else if (e.getTarget() == bExport)
cmd_export();
else if (e.getTarget() == bProcess)
cmd_EFT();
else if (e.getTarget() == bPrint)
cmd_print();
} // actionPerformed
/**
* PaySelect changed - load Bank
*/
private void loadPaySelectInfo()
{
log.info( "VPayPrint.loadPaySelectInfo");
if (fPaySelect.getSelectedIndex() == -1)
return;
// load Banks from PaySelectLine
int C_PaySelection_ID = fPaySelect.getSelectedItem().toKeyNamePair().getKey();
loadPaySelectInfo(C_PaySelection_ID);
fBank.setText(bank);
fCurrency.setText(currency);
fBalance.setValue(balance);
loadPaymentRule();
} // loadPaySelectInfo
/**
* Bank changed - load PaymentRule
*/
private void loadPaymentRule()
{
log.info("");
if (m_C_BankAccount_ID == -1)
return;
fPaymentRule.removeAllItems();
// load PaymentRule for Bank
int C_PaySelection_ID = fPaySelect.getSelectedItem().toKeyNamePair().getKey();
ArrayList<ValueNamePair> data = loadPaymentRule(C_PaySelection_ID);
for(ValueNamePair pp : data)
fPaymentRule.addItem(pp);
if (fPaymentRule.getItemCount() > 0)
fPaymentRule.setSelectedIndex(0);
loadPaymentRuleInfo();
} // loadPaymentRule
/**
* PaymentRule changed - load DocumentNo, NoPayments,
* enable/disable EFT, Print
*/
private void loadPaymentRuleInfo()
{
ValueNamePair pp = fPaymentRule.getSelectedItem().toValueNamePair();
if (pp == null)
return;
String PaymentRule = pp.getValue();
log.info("PaymentRule=" + PaymentRule);
fNoPayments.setText(" ");
int C_PaySelection_ID = fPaySelect.getSelectedItem().toKeyNamePair().getKey();
String msg = loadPaymentRuleInfo(C_PaySelection_ID, PaymentRule);
if(noPayments != null)
fNoPayments.setText(noPayments);
bProcess.setEnabled(PaymentRule.equals("T"));
if(documentNo != null)
fDocumentNo.setValue(documentNo);
if(msg != null && msg.length() > 0)
FDialog.error(m_WindowNo, form, msg);
} // loadPaymentRuleInfo
/**************************************************************************
* Export payments to file
*/
private void cmd_export()
{
String PaymentRule = fPaymentRule.getSelectedItem().toValueNamePair().getValue();
log.info(PaymentRule);
if (!getChecks(PaymentRule))
return;
try
{
// Get File Info
File tempFile = File.createTempFile("paymentExport", ".txt");
// Create File
MPaySelectionCheck.exportToFile(m_checks, tempFile);
Filedownload.save(new FileInputStream(tempFile), "plain/text", "paymentExport.txt");
if (FDialog.ask(m_WindowNo, form, "VPayPrintSuccess?"))
{
// int lastDocumentNo =
MPaySelectionCheck.confirmPrint (m_checks, m_batch);
// document No not updated
}
dispose();
}
catch (Exception e)
{
log.log(Level.SEVERE, e.getLocalizedMessage(), e);
}
} // cmd_export
/**
* Create EFT payment
*/
private void cmd_EFT()
{
String PaymentRule = fPaymentRule.getSelectedItem().toValueNamePair().getValue();
log.info(PaymentRule);
if (!getChecks(PaymentRule))
return;
dispose();
} // cmd_EFT
/**
* Print Checks and/or Remittance
*/
private void cmd_print()
{
String PaymentRule = fPaymentRule.getSelectedItem().toValueNamePair().getValue();
log.info(PaymentRule);
if (!getChecks(PaymentRule))
return;
// for all checks
List<File> pdfList = new ArrayList<File>();
for (int i = 0; i < m_checks.length; i++)
{
MPaySelectionCheck check = m_checks[i];
// ReportCtrl will check BankAccountDoc for PrintFormat
ReportEngine re = ReportEngine.get(Env.getCtx(), ReportEngine.CHECK, check.get_ID());
try
{
File file = File.createTempFile("WPayPrint", null);
re.getPDF(file);
pdfList.add(file);
}
catch (Exception e)
{
log.log(Level.SEVERE, e.getLocalizedMessage(), e);
return;
}
}
SimplePDFViewer chequeViewer = null;
try
{
File outFile = File.createTempFile("WPayPrint", null);
AEnv.mergePdf(pdfList, outFile);
chequeViewer = new SimplePDFViewer(form.getFormName(), new FileInputStream(outFile));
chequeViewer.setAttribute(Window.MODE_KEY, Window.MODE_EMBEDDED);
chequeViewer.setWidth("100%");
}
catch (Exception e)
{
log.log(Level.SEVERE, e.getLocalizedMessage(), e);
return;
}
// Update BankAccountDoc
int lastDocumentNo = MPaySelectionCheck.confirmPrint (m_checks, m_batch);
if (lastDocumentNo != 0)
{
StringBuffer sb = new StringBuffer();
sb.append("UPDATE C_BankAccountDoc SET CurrentNext=").append(++lastDocumentNo)
.append(" WHERE C_BankAccount_ID=").append(m_C_BankAccount_ID)
.append(" AND PaymentRule='").append(PaymentRule).append("'");
DB.executeUpdate(sb.toString(), null);
}
SimplePDFViewer remitViewer = null;
if (FDialog.ask(m_WindowNo, form, "VPayPrintPrintRemittance"))
{
pdfList = new ArrayList<File>();
for (int i = 0; i < m_checks.length; i++)
{
MPaySelectionCheck check = m_checks[i];
ReportEngine re = ReportEngine.get(Env.getCtx(), ReportEngine.REMITTANCE, check.get_ID());
try
{
File file = File.createTempFile("WPayPrint", null);
re.getPDF(file);
pdfList.add(file);
}
catch (Exception e)
{
log.log(Level.SEVERE, e.getLocalizedMessage(), e);
}
}
try
{
File outFile = File.createTempFile("WPayPrint", null);
AEnv.mergePdf(pdfList, outFile);
String name = Msg.translate(Env.getCtx(), "Remittance");
remitViewer = new SimplePDFViewer(form.getFormName() + " - " + name, new FileInputStream(outFile));
remitViewer.setAttribute(Window.MODE_KEY, Window.MODE_EMBEDDED);
remitViewer.setWidth("100%");
}
catch (Exception e)
{
log.log(Level.SEVERE, e.getLocalizedMessage(), e);
}
} // remittance
dispose();
if (chequeViewer != null)
SessionManager.getAppDesktop().showWindow(chequeViewer);
if (remitViewer != null)
SessionManager.getAppDesktop().showWindow(remitViewer);
} // cmd_print
/**************************************************************************
* Get Checks
* @param PaymentRule Payment Rule
* @return true if payments were created
*/
private boolean getChecks(String PaymentRule)
{
// do we have values
if (fPaySelect.getSelectedIndex() == -1 || m_C_BankAccount_ID == -1
|| fPaymentRule.getSelectedIndex() == -1 || fDocumentNo.getValue() == null)
{
FDialog.error(m_WindowNo, form, "VPayPrintNoRecords",
"(" + Msg.translate(Env.getCtx(), "C_PaySelectionLine_ID") + "=0)");
return false;
}
// get data
int C_PaySelection_ID = fPaySelect.getSelectedItem().toKeyNamePair().getKey();
int startDocumentNo = ((Number)fDocumentNo.getValue()).intValue();
log.config("C_PaySelection_ID=" + C_PaySelection_ID + ", PaymentRule=" + PaymentRule + ", DocumentNo=" + startDocumentNo);
//
// get Slecetions
m_checks = MPaySelectionCheck.get(C_PaySelection_ID, PaymentRule, startDocumentNo, null);
//
if (m_checks == null || m_checks.length == 0)
{
FDialog.error(m_WindowNo, form, "VPayPrintNoRecords",
"(" + Msg.translate(Env.getCtx(), "C_PaySelectionLine_ID") + " #0");
return false;
}
m_batch = MPaymentBatch.getForPaySelection (Env.getCtx(), C_PaySelection_ID, null);
return true;
} // getChecks
public ADForm getForm() {
return form;
}
} // PayPrint