org.adempiere.webui.apps.form.WPayPrint.java Source code

Java tutorial

Introduction

Here is the source code for org.adempiere.webui.apps.form.WPayPrint.java

Source

/******************************************************************************
 * 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 static org.compiere.model.SystemIDs.COLUMN_C_PAYSELECTIONCHECK_C_PAYSELECTION_ID;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;

import org.adempiere.util.Callback;
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.editor.WSearchEditor;
import org.adempiere.webui.event.ValueChangeEvent;
import org.adempiere.webui.event.ValueChangeListener;
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.MLookup;
import org.compiere.model.MLookupFactory;
import org.compiere.model.MPaySelectionCheck;
import org.compiere.model.MPaymentBatch;
import org.compiere.print.MPrintFormat;
import org.compiere.print.ReportEngine;
import org.compiere.process.ProcessInfo;
import org.compiere.process.ServerProcessCtl;
import org.compiere.util.DB;
import org.compiere.util.DisplayType;
import org.compiere.util.Env;
import org.compiere.util.Msg;
import org.compiere.util.PaymentExport;
import org.compiere.util.ValueNamePair;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zul.Borderlayout;
import org.zkoss.zul.Center;
import org.zkoss.zul.Filedownload;
import org.zkoss.zul.South;

import com.lowagie.text.pdf.PdfReader;

/**
 *  Payment Print & Export
 *
 *    @author    Jorg Janke
 *    @version    $Id: VPayPrint.java,v 1.2 2006/07/30 00:51:28 jjanke Exp $
 * 
 *  Contributors:
 *    Carlos Ruiz - GlobalQSS - FR 3132033 - Make payment export class configurable per bank 
*/
public class WPayPrint extends PayPrint implements IFormController, EventListener<Event>, ValueChangeListener {
    private CustomForm form = new CustomForm();

    /**
     *   Initialize Panel
     */
    public WPayPrint() {
        try {
            m_WindowNo = form.getWindowNo();

            dynInit();
            zkInit();
            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
    protected Panel centerPanel = new Panel();
    protected ConfirmPanel southPanel = new ConfirmPanel(true, false, false, false, false, false, false);
    protected Grid centerLayout = GridFactory.newGridLayout();
    protected Button bPrint = southPanel.createButton(ConfirmPanel.A_PRINT);
    protected Button bExport = southPanel.createButton(ConfirmPanel.A_EXPORT);
    protected Button bCancel = southPanel.getButton(ConfirmPanel.A_CANCEL);
    protected Button bProcess = southPanel.createButton(ConfirmPanel.A_PROCESS);
    protected Label lPaySelect = new Label();
    protected WSearchEditor paySelectSearch = null;
    protected Label lBank = new Label();
    protected Label fBank = new Label();
    protected Label lPaymentRule = new Label();
    protected Listbox fPaymentRule = ListboxFactory.newDropdownListbox();
    protected Label lDocumentNo = new Label();
    protected WNumberEditor fDocumentNo = new WNumberEditor();
    protected Label lNoPayments = new Label();
    protected Label fNoPayments = new Label();
    protected Label lBalance = new Label();
    protected WNumberEditor fBalance = new WNumberEditor();
    protected Label lCurrency = new Label();
    protected Label fCurrency = new Label();

    /**
     *  Static Init
     *  @throws Exception
     */
    protected 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"));
        //
        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(paySelectSearch.getComponent());

        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
     */
    protected void dynInit() {
        //  C_PaySelection_ID
        int AD_Column_ID = COLUMN_C_PAYSELECTIONCHECK_C_PAYSELECTION_ID; //  C_PaySelectionCheck.C_PaySelection_ID
        MLookup lookupPS = MLookupFactory.get(Env.getCtx(), m_WindowNo, 0, AD_Column_ID, DisplayType.Search);
        paySelectSearch = new WSearchEditor("C_PaySelection_ID", true, false, true, lookupPS);
        paySelectSearch.addValueChangeListener(this);

    } //  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;
        //
        m_C_PaySelection_ID = C_PaySelection_ID;
        paySelectSearch.setValue(new Integer(m_C_PaySelection_ID));
        loadPaySelectInfo();
    } //   setsetPaySelection

    /**************************************************************************
     *  Action Listener
     *  @param e event
     */
    public void onEvent(Event e) {
        //   log.config( "VPayPrint.actionPerformed" + e.toString());
        if (e.getTarget() == bCancel)
            dispose();
        else if (m_C_PaySelection_ID <= 0)
            return;
        else if (e.getTarget() == fPaymentRule)
            loadPaymentRuleInfo();
        //
        else if (e.getTarget() == bExport)
            cmd_export();
        else if (e.getTarget() == bProcess)
            cmd_EFT();
        else if (e.getTarget() == bPrint)
            confirm_cmd_print();
    } //  actionPerformed

    /**
     *  PaySelect changed - load Bank
     */
    protected void loadPaySelectInfo() {
        log.info("VPayPrint.loadPaySelectInfo");
        if (m_C_PaySelection_ID <= 0)
            return;

        //  load Banks from PaySelectLine
        loadPaySelectInfo(m_C_PaySelection_ID);

        fBank.setText(bank);
        fCurrency.setText(currency);
        fBalance.setValue(balance);

        loadPaymentRule();
    } //  loadPaySelectInfo

    /**
     *  Bank changed - load PaymentRule
     */
    protected void loadPaymentRule() {
        log.info("");
        if (m_C_BankAccount_ID == -1)
            return;

        fPaymentRule.removeAllItems();

        // load PaymentRule for Bank
        ArrayList<ValueNamePair> data = loadPaymentRule(m_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
     */
    protected void loadPaymentRuleInfo() {
        if (fPaymentRule.getSelectedItem() == null)
            return;
        ValueNamePair pp = fPaymentRule.getSelectedItem().toValueNamePair();
        if (pp == null)
            return;
        String PaymentRule = pp.getValue();

        log.info("PaymentRule=" + PaymentRule);
        fNoPayments.setText(" ");

        String msg = loadPaymentRuleInfo(m_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
     */
    protected 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
            int no = 0;
            StringBuffer err = new StringBuffer("");
            if (m_PaymentExportClass == null || m_PaymentExportClass.trim().length() == 0) {
                m_PaymentExportClass = "org.compiere.util.GenericPaymentExport";
            }
            //   Get Payment Export Class
            PaymentExport custom = null;
            try {
                Class<?> clazz = Class.forName(m_PaymentExportClass);
                custom = (PaymentExport) clazz.newInstance();
                no = custom.exportToFile(m_checks, tempFile, err);
            } catch (ClassNotFoundException e) {
                no = -1;
                err.append("No custom PaymentExport class " + m_PaymentExportClass + " - " + e.toString());
                log.log(Level.SEVERE, err.toString(), e);
            } catch (Exception e) {
                no = -1;
                err.append("Error in " + m_PaymentExportClass + " check log, " + e.toString());
                log.log(Level.SEVERE, err.toString(), e);
            }
            if (no >= 0) {
                Filedownload.save(new FileInputStream(tempFile), "plain/text", "paymentExport.txt");
                FDialog.info(m_WindowNo, form, "Saved", Msg.getMsg(Env.getCtx(), "NoOfLines") + "=" + no);

                FDialog.ask(m_WindowNo, form, "VPayPrintSuccess?", new Callback<Boolean>() {

                    @Override
                    public void onCallback(Boolean result) {
                        if (result) {
                            MPaySelectionCheck.confirmPrint(m_checks, m_batch);
                            //   document No not updated
                        }

                    }
                });
            } else {
                FDialog.error(m_WindowNo, form, "Error", err.toString());
            }
            dispose();
        } catch (Exception e) {
            log.log(Level.SEVERE, e.getLocalizedMessage(), e);
        }
    } //  cmd_export

    /**
     *  Create EFT payment
     */
    protected void cmd_EFT() {
        String PaymentRule = fPaymentRule.getSelectedItem().toValueNamePair().getValue();
        log.info(PaymentRule);
        if (!getChecks(PaymentRule))
            return;
        dispose();
    } //  cmd_EFT

    /**
     *  Confirm before printing
     */
    protected void confirm_cmd_print() {
        FDialog.ask(m_WindowNo, form, "CreatePayments?", new Callback<Boolean>() {

            @Override
            public void onCallback(Boolean result) {
                if (result) {
                    cmd_print();
                }

            }
        });
    }

    /**
     *  Print Checks and/or Remittance
     */
    protected void cmd_print() {
        String PaymentRule = fPaymentRule.getSelectedItem().toValueNamePair().getValue();
        log.info(PaymentRule);
        if (!getChecks(PaymentRule))
            return;

        //  get document no
        int startDocumentNo = ((Number) fDocumentNo.getValue()).intValue();
        if (log.isLoggable(Level.CONFIG))
            log.config("DocumentNo=" + startDocumentNo);

        //   for all checks
        List<File> pdfList = new ArrayList<File>();
        int lastDocumentNo = startDocumentNo;
        for (int i = 0; i < m_checks.length; i++) {
            MPaySelectionCheck check = m_checks[i];

            //   Set new Check Document No
            check.setDocumentNo(String.valueOf(lastDocumentNo));
            check.saveEx();

            //   Update BankAccountDoc
            MPaySelectionCheck.confirmPrint(m_checks[i], m_batch);

            //   ReportCtrl will check BankAccountDoc for PrintFormat
            ReportEngine re = ReportEngine.get(Env.getCtx(), ReportEngine.CHECK, check.get_ID());
            try {
                MPrintFormat format = re.getPrintFormat();
                File pdfFile = null;
                if (format.getJasperProcess_ID() > 0) {
                    ProcessInfo pi = new ProcessInfo("", format.getJasperProcess_ID());
                    pi.setRecord_ID(check.get_ID());
                    pi.setIsBatch(true);

                    ServerProcessCtl.process(pi, null);
                    pdfFile = pi.getPDFReport();
                } else {
                    pdfFile = File.createTempFile("WPayPrint", null);
                    re.getPDF(pdfFile);
                }

                if (pdfFile != null) {
                    // increase the check document no by the number of pages of the generated pdf file
                    PdfReader document = new PdfReader(pdfFile.getAbsolutePath());
                    lastDocumentNo += document.getNumberOfPages();
                    pdfList.add(pdfFile);
                }
            } 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;
        }
        final SimplePDFViewer chequeViewerRef = chequeViewer;

        //   Update Check Next Document No      
        if (startDocumentNo != lastDocumentNo) {
            StringBuilder sb = new StringBuilder();
            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);
        }

        FDialog.ask(m_WindowNo, form, "VPayPrintPrintRemittance", new Callback<Boolean>() {

            @Override
            public void onCallback(Boolean result) {
                SimplePDFViewer remitViewer = null;
                if (result) {
                    List<File> 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 {
                            MPrintFormat format = re.getPrintFormat();
                            if (format.getJasperProcess_ID() > 0) {
                                ProcessInfo pi = new ProcessInfo("", format.getJasperProcess_ID());
                                pi.setRecord_ID(check.get_ID());
                                pi.setIsBatch(true);

                                ServerProcessCtl.process(pi, null);
                                pdfList.add(pi.getPDFReport());
                            } else {
                                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);
                    }
                }

                dispose();

                if (chequeViewerRef != null)
                    SessionManager.getAppDesktop().showWindow(chequeViewerRef);

                if (remitViewer != null)
                    SessionManager.getAppDesktop().showWindow(remitViewer);
            }
        });
    } //  cmd_print

    /**************************************************************************
     *  Get Checks
     *  @param PaymentRule Payment Rule
     *  @return true if payments were created
     */
    protected boolean getChecks(String PaymentRule) {
        //  do we have values
        if (m_C_PaySelection_ID <= 0 || 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;
        }

        if (log.isLoggable(Level.CONFIG))
            log.config("C_PaySelection_ID=" + m_C_PaySelection_ID + ", PaymentRule=" + PaymentRule);

        //   get payment selection checks without check no assignment
        m_checks = MPaySelectionCheck.get(m_C_PaySelection_ID, PaymentRule, 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(), m_C_PaySelection_ID, null);
        return true;
    } //  getChecks

    public ADForm getForm() {
        return form;
    }

    /**
     *  Vetoable Change Listener.
     *  - Payment Selection
     *  @param e event
     */
    @Override
    public void valueChange(ValueChangeEvent e) {
        String name = e.getPropertyName();
        Object value = e.getNewValue();
        if (log.isLoggable(Level.CONFIG))
            log.config(name + "=" + value);
        if (value == null)
            return;

        // Payment Selection
        if (name.equals("C_PaySelection_ID")) {
            paySelectSearch.setValue(value);
            m_C_PaySelection_ID = ((Integer) value).intValue();
            loadPaySelectInfo();
        }
    }

} //  PayPrint