diff --git a/base/src/org/compiere/print/ReportEngine.java b/base/src/org/compiere/print/ReportEngine.java
index 4809292e62..092ec5e754 100644
--- a/base/src/org/compiere/print/ReportEngine.java
+++ b/base/src/org/compiere/print/ReportEngine.java
@@ -1,1451 +1,1468 @@
-/******************************************************************************
- * 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.print;
-
-import java.awt.print.PrinterJob;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.io.Writer;
-import java.net.URI;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Timestamp;
-import java.util.Locale;
-import java.util.Properties;
-import java.util.logging.Level;
-
-import javax.print.DocFlavor;
-import javax.print.StreamPrintService;
-import javax.print.StreamPrintServiceFactory;
-import javax.print.attribute.HashPrintRequestAttributeSet;
-import javax.print.attribute.PrintRequestAttributeSet;
-import javax.print.attribute.standard.Copies;
-import javax.print.attribute.standard.JobName;
-import javax.print.event.PrintServiceAttributeEvent;
-import javax.print.event.PrintServiceAttributeListener;
-import javax.xml.transform.stream.StreamResult;
-
-import org.adempiere.pdf.Document;
-import org.adempiere.print.export.PrintDataExcelExporter;
-import org.apache.ecs.XhtmlDocument;
-import org.apache.ecs.xhtml.table;
-import org.apache.ecs.xhtml.td;
-import org.apache.ecs.xhtml.th;
-import org.apache.ecs.xhtml.tr;
-import org.compiere.model.MClient;
-import org.compiere.model.MQuery;
-import org.compiere.model.PrintInfo;
-import org.compiere.model.X_C_DunningRunEntry;
-import org.compiere.model.X_C_Invoice;
-import org.compiere.model.X_C_Order;
-import org.compiere.model.X_C_PaySelectionCheck;
-import org.compiere.model.X_C_Project;
-import org.compiere.model.X_C_RfQResponse;
-import org.compiere.model.X_M_InOut;
-import org.compiere.print.layout.LayoutEngine;
-import org.compiere.process.ProcessInfo;
-import org.compiere.util.CLogger;
-import org.compiere.util.DB;
-import org.compiere.util.Env;
-import org.compiere.util.Ini;
-import org.compiere.util.Language;
-import org.compiere.util.Util;
-import org.eevolution.model.X_DD_Order;
-import org.eevolution.model.X_PP_Order;
-
-/**
- * Report Engine.
- * For a given PrintFormat,
- * create a Report
- *
- * Change log:
- *
- * - 2007-02-12 - teo_sarca - [ 1658127 ] Select charset encoding on import
- *
- 2007-02-10 - teo_sarca - [ 1652660 ] Save XML,HTML,CSV should have utf8 charset
- *
- *
- * @author Jorg Janke
- * @version $Id: ReportEngine.java,v 1.4 2006/10/08 06:52:51 comdivision Exp $
- */
-public class ReportEngine implements PrintServiceAttributeListener
-{
- /**
- * Constructor
- * @param ctx context
- * @param pf Print Format
- * @param query Optional Query
- * @param info print info
- */
- public ReportEngine (Properties ctx, MPrintFormat pf, MQuery query, PrintInfo info)
- {
- this(ctx, pf, query, info, null);
- } // ReportEngine
-
- /**
- * Constructor
- * @param ctx context
- * @param pf Print Format
- * @param query Optional Query
- * @param info print info
- * @param trxName
- */
- public ReportEngine (Properties ctx, MPrintFormat pf, MQuery query, PrintInfo info, String trxName)
- {
- if (pf == null)
- throw new IllegalArgumentException("ReportEngine - no PrintFormat");
- log.info(pf + " -- " + query);
- m_ctx = ctx;
- //
- m_printFormat = pf;
- m_info = info;
- m_trxName = trxName;
- setQuery(query); // loads Data
-
- } // ReportEngine
-
- /** Static Logger */
- private static CLogger log = CLogger.getCLogger (ReportEngine.class);
-
- /** Context */
- private Properties m_ctx;
-
- /** Print Format */
- private MPrintFormat m_printFormat;
- /** Print Info */
- private PrintInfo m_info;
- /** Query */
- private MQuery m_query;
- /** Query Data */
- private PrintData m_printData;
- /** Layout */
- private LayoutEngine m_layout = null;
- /** Printer */
- private String m_printerName = Ini.getProperty(Ini.P_PRINTER);
- /** View */
- private View m_view = null;
- /** Transaction Name */
- private String m_trxName = null;
-
- /**
- * Set PrintFormat.
- * If Layout was created, re-create layout
- * @param pf print format
- */
- public void setPrintFormat (MPrintFormat pf)
- {
- m_printFormat = pf;
- if (m_layout != null)
- {
- setPrintData();
- m_layout.setPrintFormat(pf, false);
- m_layout.setPrintData(m_printData, m_query, true); // format changes data
- }
- if (m_view != null)
- m_view.revalidate();
- } // setPrintFormat
-
- /**
- * Set Query and generate PrintData.
- * If Layout was created, re-create layout
- * @param query query
- */
- public void setQuery (MQuery query)
- {
- m_query = query;
- if (query == null)
- return;
- //
- setPrintData();
- if (m_layout != null)
- m_layout.setPrintData(m_printData, m_query, true);
- if (m_view != null)
- m_view.revalidate();
- } // setQuery
-
- /**
- * Get Query
- * @return query
- */
- public MQuery getQuery()
- {
- return m_query;
- } // getQuery
-
- /**
- * Set PrintData for Format restricted by Query.
- * Nothing set if there is no query
- * Sets m_printData
- */
- private void setPrintData()
- {
- if (m_query == null)
- return;
-
- DataEngine de = new DataEngine(m_printFormat.getLanguage(),m_trxName);
- setPrintData(de.getPrintData (m_ctx, m_printFormat, m_query));
- // m_printData.dump();
- } // setPrintData
-
-
- /**
- * Get PrintData
- * @return print data
- */
- public PrintData getPrintData()
- {
- return m_printData;
- } // getPrintData
-
- /**
- * Set PrintData
- * @param printData printData
- */
- public void setPrintData (PrintData printData)
- {
- if (printData == null)
- return;
- m_printData = printData;
- } // setPrintData
-
-
- /**************************************************************************
- * Layout
- */
- private void layout()
- {
- if (m_printFormat == null)
- throw new IllegalStateException ("No print format");
- if (m_printData == null)
- throw new IllegalStateException ("No print data (Delete Print Format and restart)");
- m_layout = new LayoutEngine (m_printFormat, m_printData, m_query, m_info, m_trxName);
- } // layout
-
- /**
- * Get Layout
- * @return Layout
- */
- public LayoutEngine getLayout()
- {
- if (m_layout == null)
- layout();
- return m_layout;
- } // getLayout
-
- /**
- * Get PrintFormat (Report) Name
- * @return name
- */
- public String getName()
- {
- return m_printFormat.getName();
- } // getName
-
- /**
- * Get PrintFormat
- * @return print format
- */
- public MPrintFormat getPrintFormat()
- {
- return m_printFormat;
- } // getPrintFormat
-
- /**
- * Get Print Info
- * @return info
- */
- public PrintInfo getPrintInfo()
- {
- return m_info;
- } // getPrintInfo
-
- /**
- * Get PrintLayout (Report) Context
- * @return context
- */
- public Properties getCtx()
- {
- return m_layout.getCtx();
- } // getCtx
-
- /**
- * Get Row Count
- * @return row count
- */
- public int getRowCount()
- {
- return m_printData.getRowCount();
- } // getRowCount
-
- /**
- * Get Column Count
- * @return column count
- */
- public int getColumnCount()
- {
- if (m_layout != null)
- return m_layout.getColumnCount();
- return 0;
- } // getColumnCount
-
-
- /**************************************************************************
- * Get View Panel
- * @return view panel
- */
- public View getView()
- {
- if (m_layout == null)
- layout();
- if (m_view == null)
- m_view = new View (m_layout);
- return m_view;
- } // getView
-
-
- /**************************************************************************
- * Print Report
- */
- public void print ()
- {
- log.info(m_info.toString());
- if (m_layout == null)
- layout();
-
- // Paper Attributes: media-printable-area, orientation-requested, media
- PrintRequestAttributeSet prats = m_layout.getPaper().getPrintRequestAttributeSet();
- // add: copies, job-name, priority
- if (m_info.isDocumentCopy() || m_info.getCopies() < 1)
- prats.add (new Copies(1));
- else
- prats.add (new Copies(m_info.getCopies()));
- Locale locale = Language.getLoginLanguage().getLocale();
- prats.add(new JobName(m_printFormat.getName(), locale));
- prats.add(PrintUtil.getJobPriority(m_layout.getNumberOfPages(), m_info.getCopies(), true));
-
- try
- {
- // PrinterJob
- PrinterJob job = getPrinterJob(m_info.getPrinterName());
- // job.getPrintService().addPrintServiceAttributeListener(this);
- job.setPageable(m_layout.getPageable(false)); // no copy
- // Dialog
- try
- {
- if (m_info.isWithDialog() && !job.printDialog(prats))
- return;
- }
- catch (Exception e)
- {
- log.log(Level.WARNING, "Operating System Print Issue, check & try again", e);
- return;
- }
-
- // submit
- boolean printCopy = m_info.isDocumentCopy() && m_info.getCopies() > 1;
- ArchiveEngine.get().archive(m_layout, m_info);
- PrintUtil.print(job, prats, false, printCopy);
-
- // Document: Print Copies
- if (printCopy)
- {
- log.info("Copy " + (m_info.getCopies()-1));
- prats.add(new Copies(m_info.getCopies()-1));
- job = getPrinterJob(m_info.getPrinterName());
- // job.getPrintService().addPrintServiceAttributeListener(this);
- job.setPageable (m_layout.getPageable(true)); // Copy
- PrintUtil.print(job, prats, false, false);
- }
- }
- catch (Exception e)
- {
- log.log(Level.SEVERE, "", e);
- }
- } // print
-
- /**
- * Print Service Attribute Listener.
- * @param psae event
- */
- public void attributeUpdate(PrintServiceAttributeEvent psae)
- {
- /**
-PrintEvent on Win32 Printer : \\MAIN\HP LaserJet 5L
-PrintServiceAttributeSet - length=2
-queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount)
-printer-is-accepting-jobs = accepting-jobs (class javax.print.attribute.standard.PrinterIsAcceptingJobs)
-PrintEvent on Win32 Printer : \\MAIN\HP LaserJet 5L
-PrintServiceAttributeSet - length=1
-queued-job-count = 1 (class javax.print.attribute.standard.QueuedJobCount)
-PrintEvent on Win32 Printer : \\MAIN\HP LaserJet 5L
-PrintServiceAttributeSet - length=1
-queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount)
- **/
- log.fine("attributeUpdate - " + psae);
- // PrintUtil.dump (psae.getAttributes());
- } // attributeUpdate
-
-
- /**
- * Get PrinterJob based on PrinterName
- * @param printerName optional Printer Name
- * @return PrinterJob
- */
- private PrinterJob getPrinterJob (String printerName)
- {
- if (printerName != null && printerName.length() > 0)
- return CPrinter.getPrinterJob(printerName);
- return CPrinter.getPrinterJob(m_printerName);
- } // getPrinterJob
-
- /**
- * Show Dialog and Set Paper
- * Optionally re-calculate layout
- */
- public void pageSetupDialog ()
- {
- if (m_layout == null)
- layout();
- m_layout.pageSetupDialog(getPrinterJob(m_printerName));
- if (m_view != null)
- m_view.revalidate();
- } // pageSetupDialog
-
- /**
- * Set Printer (name)
- * @param printerName valid printer name
- */
- public void setPrinterName(String printerName)
- {
- if (printerName == null)
- m_printerName = Ini.getProperty(Ini.P_PRINTER);
- else
- m_printerName = printerName;
- } // setPrinterName
-
- /**
- * Get Printer (name)
- * @return printer name
- */
- public String getPrinterName()
- {
- return m_printerName;
- } // getPrinterName
-
-
- /**************************************************************************
- * Create HTML File
- * @param file file
- * @param onlyTable if false create complete HTML document
- * @param language optional language - if null the default language is used to format nubers/dates
- * @return true if success
- */
- public boolean createHTML (File file, boolean onlyTable, Language language)
- {
- try
- {
- Language lang = language;
- if (lang == null)
- lang = Language.getLoginLanguage();
- Writer fw = new OutputStreamWriter(new FileOutputStream(file, false), Ini.getCharset()); // teo_sarca: save using adempiere charset [ 1658127 ]
- return createHTML (new BufferedWriter(fw), onlyTable, lang);
- }
- catch (FileNotFoundException fnfe)
- {
- log.log(Level.SEVERE, "(f) - " + fnfe.toString());
- }
- catch (Exception e)
- {
- log.log(Level.SEVERE, "(f)", e);
- }
- return false;
- } // createHTML
-
- /**
- * Write HTML to writer
- * @param writer writer
- * @param onlyTable if false create complete HTML document
- * @param language optional language - if null nubers/dates are not formatted
- * @return true if success
- */
- public boolean createHTML (Writer writer, boolean onlyTable, Language language)
- {
- try
- {
- table table = new table();
- //
- // for all rows (-1 = header row)
- for (int row = -1; row < m_printData.getRowCount(); row++)
- {
- tr tr = new tr();
- table.addElement(tr);
- if (row != -1)
- m_printData.setRowIndex(row);
- // for all columns
- for (int col = 0; col < m_printFormat.getItemCount(); col++)
- {
- MPrintFormatItem item = m_printFormat.getItem(col);
- if (item.isPrinted())
- {
- // header row
- if (row == -1)
- {
- th th = new th();
- tr.addElement(th);
- th.addElement(Util.maskHTML(item.getPrintName(language)));
- }
- else
- {
- td td = new td();
- tr.addElement(td);
- Object obj = m_printData.getNode(new Integer(item.getAD_Column_ID()));
- if (obj == null)
- td.addElement(" ");
- else if (obj instanceof PrintDataElement)
- {
- String value = ((PrintDataElement)obj).getValueDisplay(language); // formatted
- td.addElement(Util.maskHTML(value));
- }
- else if (obj instanceof PrintData)
- {
- // ignore contained Data
- }
- else
- log.log(Level.SEVERE, "Element not PrintData(Element) " + obj.getClass());
- }
- } // printed
- } // for all columns
- } // for all rows
-
- //
- PrintWriter w = new PrintWriter(writer);
- if (onlyTable)
- table.output(w);
- else
- {
- XhtmlDocument doc = new XhtmlDocument();
- doc.appendBody(table);
- doc.output(w);
- }
- w.flush();
- w.close();
- }
- catch (Exception e)
- {
- log.log(Level.SEVERE, "(w)", e);
- }
- return false;
- } // createHTML
-
-
- /**************************************************************************
- * Create CSV File
- * @param file file
- * @param delimiter delimiter, e.g. comma, tab
- * @param language translation language
- * @return true if success
- */
- public boolean createCSV (File file, char delimiter, Language language)
- {
- try
- {
- Writer fw = new OutputStreamWriter(new FileOutputStream(file, false), Ini.getCharset()); // teo_sarca: save using adempiere charset [ 1658127 ]
- return createCSV (new BufferedWriter(fw), delimiter, language);
- }
- catch (FileNotFoundException fnfe)
- {
- log.log(Level.SEVERE, "(f) - " + fnfe.toString());
- }
- catch (Exception e)
- {
- log.log(Level.SEVERE, "(f)", e);
- }
- return false;
- } // createCSV
-
- /**
- * Write CSV to writer
- * @param writer writer
- * @param delimiter delimiter, e.g. comma, tab
- * @param language translation language
- * @return true if success
- */
- public boolean createCSV (Writer writer, char delimiter, Language language)
- {
- if (delimiter == 0)
- delimiter = '\t';
- try
- {
- // for all rows (-1 = header row)
- for (int row = -1; row < m_printData.getRowCount(); row++)
- {
- StringBuffer sb = new StringBuffer();
- if (row != -1)
- m_printData.setRowIndex(row);
-
- // for all columns
- boolean first = true; // first column to print
- for (int col = 0; col < m_printFormat.getItemCount(); col++)
- {
- MPrintFormatItem item = m_printFormat.getItem(col);
- if (item.isPrinted())
- {
- // column delimiter (comma or tab)
- if (first)
- first = false;
- else
- sb.append(delimiter);
- // header row
- if (row == -1)
- createCSVvalue (sb, delimiter,
- m_printFormat.getItem(col).getPrintName(language));
- else
- {
- Object obj = m_printData.getNode(new Integer(item.getAD_Column_ID()));
- String data = "";
- if (obj == null)
- ;
- else if (obj instanceof PrintDataElement)
- {
- PrintDataElement pde = (PrintDataElement)obj;
- if (pde.isPKey())
- data = pde.getValueAsString();
- else
- data = pde.getValueDisplay(language); // formatted
- }
- else if (obj instanceof PrintData)
- {
- }
- else
- log.log(Level.SEVERE, "Element not PrintData(Element) " + obj.getClass());
- createCSVvalue (sb, delimiter, data);
- }
- } // printed
- } // for all columns
- writer.write(sb.toString());
- writer.write(Env.NL);
- } // for all rows
- //
- writer.flush();
- writer.close();
- }
- catch (Exception e)
- {
- log.log(Level.SEVERE, "(w)", e);
- }
- return false;
- } // createCSV
-
- /**
- * Add Content to CSV string.
- * Encapsulate/mask content in " if required
- * @param sb StringBuffer to add to
- * @param delimiter delimiter
- * @param content column value
- */
- private void createCSVvalue (StringBuffer sb, char delimiter, String content)
- {
- // nothing to add
- if (content == null || content.length() == 0)
- return;
- //
- boolean needMask = false;
- StringBuffer buff = new StringBuffer();
- char chars[] = content.toCharArray();
- for (int i = 0; i < chars.length; i++)
- {
- char c = chars[i];
- if (c == '"')
- {
- needMask = true;
- buff.append(c); // repeat twice
- } // mask if any control character
- else if (!needMask && (c == delimiter || !Character.isLetterOrDigit(c)))
- needMask = true;
- buff.append(c);
- }
-
- // Optionally mask value
- if (needMask)
- sb.append('"').append(buff).append('"');
- else
- sb.append(buff);
- } // addCSVColumnValue
-
-
- /**************************************************************************
- * Create XML File
- * @param file file
- * @return true if success
- */
- public boolean createXML (File file)
- {
- try
- {
- Writer fw = new OutputStreamWriter(new FileOutputStream(file, false), Ini.getCharset()); // teo_sarca: save using adempiere charset [ 1658127 ]
- return createXML (new BufferedWriter(fw));
- }
- catch (FileNotFoundException fnfe)
- {
- log.log(Level.SEVERE, "(f) - " + fnfe.toString());
- }
- catch (Exception e)
- {
- log.log(Level.SEVERE, "(f)", e);
- }
- return false;
- } // createXML
-
- /**
- * Write XML to writer
- * @param writer writer
- * @return true if success
- */
- public boolean createXML (Writer writer)
- {
- try
- {
- m_printData.createXML(new StreamResult(writer));
- writer.flush();
- writer.close();
- }
- catch (Exception e)
- {
- log.log(Level.SEVERE, "(w)", e);
- }
- return false;
- } // createXML
-
-
- /**************************************************************************
- * Create PDF file.
- * (created in temporary storage)
- * @return PDF file
- */
- public File getPDF()
- {
- return getPDF (null);
- } // getPDF
-
- /**
- * Create PDF file.
- * @param file file
- * @return PDF file
- */
- public File getPDF (File file)
- {
- try
- {
- if (file == null)
- file = File.createTempFile ("ReportEngine", ".pdf");
- }
- catch (IOException e)
- {
- log.log(Level.SEVERE, "", e);
- }
- if (createPDF (file))
- return file;
- return null;
- } // getPDF
-
- /**
- * Create PDF File
- * @param file file
- * @return true if success
- */
- public boolean createPDF (File file)
- {
- String fileName = null;
- URI uri = null;
-
- try
- {
- if (file == null)
- file = File.createTempFile ("ReportEngine", ".pdf");
- fileName = file.getAbsolutePath();
- uri = file.toURI();
- if (file.exists())
- file.delete();
-
- }
- catch (Exception e)
- {
- log.log(Level.SEVERE, "file", e);
- return false;
- }
-
- log.fine(uri.toString());
-
- try
- {
- if (m_layout == null)
- layout ();
- ArchiveEngine.get().archive(m_layout, m_info);
- Document.getPDFAsFile(fileName, m_layout.getPageable(false));
- }
- catch (Exception e)
- {
- log.log(Level.SEVERE, "PDF", e);
- return false;
- }
-
- File file2 = new File(fileName);
- log.info(file2.getAbsolutePath() + " - " + file2.length());
- return file2.exists();
- } // createPDF
-
- /**
- * Create PDF as Data array
- * @return pdf data
- */
- public byte[] createPDFData ()
- {
- try
- {
- if (m_layout == null)
- layout ();
- return Document.getPDFAsArray(m_layout.getPageable(false));
- }
- catch (Exception e)
- {
- log.log(Level.SEVERE, "PDF", e);
- }
- return null;
- } // createPDFData
-
- /**************************************************************************
- * Create PostScript File
- * @param file file
- * @return true if success
- */
- public boolean createPS (File file)
- {
- try
- {
- return createPS (new FileOutputStream(file));
- }
- catch (FileNotFoundException fnfe)
- {
- log.log(Level.SEVERE, "(f) - " + fnfe.toString());
- }
- catch (Exception e)
- {
- log.log(Level.SEVERE, "(f)", e);
- }
- return false;
- } // createPS
-
- /**
- * Write PostScript to writer
- * @param os output stream
- * @return true if success
- */
- public boolean createPS (OutputStream os)
- {
- try
- {
- String outputMimeType = DocFlavor.BYTE_ARRAY.POSTSCRIPT.getMimeType();
- DocFlavor docFlavor = DocFlavor.SERVICE_FORMATTED.PAGEABLE;
- StreamPrintServiceFactory[] spsfactories =
- StreamPrintServiceFactory.lookupStreamPrintServiceFactories(docFlavor, outputMimeType);
- if (spsfactories.length == 0)
- {
- log.log(Level.SEVERE, "(fos) - No StreamPrintService");
- return false;
- }
- // just use first one - sun.print.PSStreamPrinterFactory
- // System.out.println("- " + spsfactories[0]);
- StreamPrintService sps = spsfactories[0].getPrintService(os);
- // get format
- if (m_layout == null)
- layout();
- // print it
- sps.createPrintJob().print(m_layout.getPageable(false),
- new HashPrintRequestAttributeSet());
- //
- os.flush();
- //following 2 line for backward compatibility
- if (os instanceof FileOutputStream)
- ((FileOutputStream)os).close();
- }
- catch (Exception e)
- {
- log.log(Level.SEVERE, "(fos)", e);
- }
- return false;
- } // createPS
-
- /**
- * Create Excel file
- * @param outFile output file
- * @param language
- * @throws Exception if error
- */
- public void createXLS(File outFile, Language language)
- throws Exception
- {
- PrintDataExcelExporter exp = new PrintDataExcelExporter(getPrintData(), getPrintFormat());
- exp.export(outFile, language);
- }
-
- /**************************************************************************
- * Get Report Engine for process info
- * @param ctx context
- * @param pi process info with AD_PInstance_ID
- * @return report engine or null
- */
- static public ReportEngine get (Properties ctx, ProcessInfo pi)
- {
- int AD_Client_ID = pi.getAD_Client_ID();
- //
- int AD_Table_ID = 0;
- int AD_ReportView_ID = 0;
- String TableName = null;
- String whereClause = "";
- int AD_PrintFormat_ID = 0;
- boolean IsForm = false;
- int Client_ID = -1;
-
- // Get AD_Table_ID and TableName
- String sql = "SELECT rv.AD_ReportView_ID,rv.WhereClause,"
- + " t.AD_Table_ID,t.TableName, pf.AD_PrintFormat_ID, pf.IsForm, pf.AD_Client_ID "
- + "FROM AD_PInstance pi"
- + " INNER JOIN AD_Process p ON (pi.AD_Process_ID=p.AD_Process_ID)"
- + " INNER JOIN AD_ReportView rv ON (p.AD_ReportView_ID=rv.AD_ReportView_ID)"
- + " INNER JOIN AD_Table t ON (rv.AD_Table_ID=t.AD_Table_ID)"
- + " LEFT OUTER JOIN AD_PrintFormat pf ON (p.AD_ReportView_ID=pf.AD_ReportView_ID AND pf.AD_Client_ID IN (0,?)) "
- + "WHERE pi.AD_PInstance_ID=? " // #2
- + "ORDER BY pf.AD_Client_ID DESC, pf.IsDefault DESC"; // own first
- PreparedStatement pstmt = null;
- ResultSet rs = null;
- try
- {
- pstmt = DB.prepareStatement(sql, null);
- pstmt.setInt(1, AD_Client_ID);
- pstmt.setInt(2, pi.getAD_PInstance_ID());
- rs = pstmt.executeQuery();
- // Just get first
- if (rs.next())
- {
- AD_ReportView_ID = rs.getInt(1); // required
- whereClause = rs.getString(2);
- if (rs.wasNull())
- whereClause = "";
- //
- AD_Table_ID = rs.getInt(3);
- TableName = rs.getString(4); // required for query
- AD_PrintFormat_ID = rs.getInt(5); // required
- IsForm = "Y".equals(rs.getString(6)); // required
- Client_ID = rs.getInt(7);
- }
- }
- catch (SQLException e1)
- {
- log.log(Level.SEVERE, "(1) - " + sql, e1);
- }
- finally {
- DB.close(rs, pstmt);
- rs = null; pstmt = null;
- }
- // Nothing found
- if (AD_ReportView_ID == 0)
- {
- // Check Print format in Report Directly
- sql = "SELECT t.AD_Table_ID,t.TableName, pf.AD_PrintFormat_ID, pf.IsForm "
- + "FROM AD_PInstance pi"
- + " INNER JOIN AD_Process p ON (pi.AD_Process_ID=p.AD_Process_ID)"
- + " INNER JOIN AD_PrintFormat pf ON (p.AD_PrintFormat_ID=pf.AD_PrintFormat_ID)"
- + " INNER JOIN AD_Table t ON (pf.AD_Table_ID=t.AD_Table_ID) "
- + "WHERE pi.AD_PInstance_ID=?";
- try
- {
- pstmt = DB.prepareStatement(sql, null);
- pstmt.setInt(1, pi.getAD_PInstance_ID());
- rs = pstmt.executeQuery();
- if (rs.next())
- {
- whereClause = "";
- AD_Table_ID = rs.getInt(1);
- TableName = rs.getString(2); // required for query
- AD_PrintFormat_ID = rs.getInt(3); // required
- IsForm = "Y".equals(rs.getString(4)); // required
- Client_ID = AD_Client_ID;
- }
- }
- catch (SQLException e1)
- {
- log.log(Level.SEVERE, "(2) - " + sql, e1);
- }
- finally {
- DB.close(rs, pstmt);
- rs = null; pstmt = null;
- }
- if (AD_PrintFormat_ID == 0)
- {
- log.log(Level.SEVERE, "Report Info NOT found AD_PInstance_ID=" + pi.getAD_PInstance_ID()
- + ",AD_Client_ID=" + AD_Client_ID);
- return null;
- }
- }
-
- // Create Query from Parameters
- MQuery query = null;
- if (IsForm && pi.getRecord_ID() != 0) // Form = one record
- query = MQuery.getEqualQuery(TableName + "_ID", pi.getRecord_ID());
- else
- query = MQuery.get (ctx, pi.getAD_PInstance_ID(), TableName);
-
- // Add to static where clause from ReportView
- if (whereClause.length() != 0)
- query.addRestriction(whereClause);
-
- // Get Print Format
- MPrintFormat format = null;
- Object so = pi.getSerializableObject();
- if (so instanceof MPrintFormat)
- format = (MPrintFormat)so;
- if (format == null && AD_PrintFormat_ID != 0)
- {
- // We have a PrintFormat with the correct Client
- if (Client_ID == AD_Client_ID)
- format = MPrintFormat.get (ctx, AD_PrintFormat_ID, false);
- else
- format = MPrintFormat.copyToClient (ctx, AD_PrintFormat_ID, AD_Client_ID);
- }
- if (format != null && format.getItemCount() == 0)
- {
- log.info("No Items - recreating: " + format);
- format.delete(true);
- format = null;
- }
- // Create Format
- if (format == null && AD_ReportView_ID != 0)
- format = MPrintFormat.createFromReportView(ctx, AD_ReportView_ID, pi.getTitle());
- if (format == null)
- return null;
- //
- PrintInfo info = new PrintInfo (pi);
- info.setAD_Table_ID(AD_Table_ID);
-
- return new ReportEngine(ctx, format, query, info);
- } // get
-
- /*************************************************************************/
-
- /** Order = 0 */
- public static final int ORDER = 0;
- /** Shipment = 1 */
- public static final int SHIPMENT = 1;
- /** Invoice = 2 */
- public static final int INVOICE = 2;
- /** Project = 3 */
- public static final int PROJECT = 3;
- /** RfQ = 4 */
- public static final int RFQ = 4;
- /** Remittance = 5 */
- public static final int REMITTANCE = 5;
- /** Check = 6 */
- public static final int CHECK = 6;
- /** Dunning = 7 */
- public static final int DUNNING = 7;
- /** Manufacturing Order = 8 */
- public static final int MANUFACTURING_ORDER = 8;
- /** Distribution Order = 9 */
- public static final int DISTRIBUTION_ORDER = 9;
-
-
- private static final String[] DOC_TABLES = new String[] {
- "C_Order_Header_v", "M_InOut_Header_v", "C_Invoice_Header_v", "C_Project_Header_v",
- "C_RfQResponse_v",
- "C_PaySelection_Check_v", "C_PaySelection_Check_v",
- "C_DunningRunEntry_v","PP_Order_Header_v","DD_Order_Header_v" };
- private static final String[] DOC_BASETABLES = new String[] {
- "C_Order", "M_InOut", "C_Invoice", "C_Project",
- "C_RfQResponse",
- "C_PaySelectionCheck", "C_PaySelectionCheck",
- "C_DunningRunEntry","PP_Order", "DD_Order"};
- private static final String[] DOC_IDS = new String[] {
- "C_Order_ID", "M_InOut_ID", "C_Invoice_ID", "C_Project_ID",
- "C_RfQResponse_ID",
- "C_PaySelectionCheck_ID", "C_PaySelectionCheck_ID",
- "C_DunningRunEntry_ID" , "PP_Order_ID" , "DD_Order_ID" };
- private static final int[] DOC_TABLE_ID = new int[] {
- X_C_Order.Table_ID, X_M_InOut.Table_ID, X_C_Invoice.Table_ID, X_C_Project.Table_ID,
- X_C_RfQResponse.Table_ID,
- X_C_PaySelectionCheck.Table_ID, X_C_PaySelectionCheck.Table_ID,
- X_C_DunningRunEntry.Table_ID , X_PP_Order.Table_ID ,X_DD_Order.Table_ID };
-
- /**************************************************************************
- * Get Document Print Engine for Document Type.
- * @param ctx context
- * @param type document type
- * @param Record_ID id
- * @return Report Engine or null
- */
- public static ReportEngine get (Properties ctx, int type, int Record_ID)
- {
- return get(ctx, type, Record_ID, null);
- }
-
- /**************************************************************************
- * Get Document Print Engine for Document Type.
- * @param ctx context
- * @param type document type
- * @param Record_ID id
- * @param trxName
- * @return Report Engine or null
- */
- public static ReportEngine get (Properties ctx, int type, int Record_ID, String trxName)
- {
- if (Record_ID < 1)
- {
- log.log(Level.WARNING, "No PrintFormat for Record_ID=" + Record_ID
- + ", Type=" + type);
- return null;
- }
- // Order - Print Shipment or Invoice
- if (type == ORDER)
- {
- int[] what = getDocumentWhat (Record_ID);
- if (what != null)
- {
- type = what[0];
- Record_ID = what[1];
- }
- } // Order
-
- String JobName = DOC_BASETABLES[type] + "_Print";
- int AD_PrintFormat_ID = 0;
- int C_BPartner_ID = 0;
- String DocumentNo = null;
- int copies = 1;
-
- // Language
- MClient client = MClient.get(ctx);
- Language language = client.getLanguage();
- // Get Document Info
- String sql = null;
- if (type == CHECK)
- sql = "SELECT bad.Check_PrintFormat_ID," // 1
- + " c.IsMultiLingualDocument,bp.AD_Language,bp.C_BPartner_ID,d.DocumentNo " // 2..5
- + "FROM C_PaySelectionCheck d"
- + " INNER JOIN C_PaySelection ps ON (d.C_PaySelection_ID=ps.C_PaySelection_ID)"
- + " INNER JOIN C_BankAccountDoc bad ON (ps.C_BankAccount_ID=bad.C_BankAccount_ID AND d.PaymentRule=bad.PaymentRule)"
- + " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)"
- + " INNER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID) "
- + "WHERE d.C_PaySelectionCheck_ID=?"; // info from BankAccount
- else if (type == DUNNING)
- sql = "SELECT dl.Dunning_PrintFormat_ID,"
- + " c.IsMultiLingualDocument,bp.AD_Language,bp.C_BPartner_ID,dr.DunningDate "
- + "FROM C_DunningRunEntry d"
- + " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)"
- + " INNER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID)"
- + " INNER JOIN C_DunningRun dr ON (d.C_DunningRun_ID=dr.C_DunningRun_ID)"
- + " INNER JOIN C_DunningLevel dl ON (dl.C_DunningLevel_ID=dr.C_DunningLevel_ID) "
- + "WHERE d.C_DunningRunEntry_ID=?"; // info from Dunning
- else if (type == REMITTANCE)
- sql = "SELECT pf.Remittance_PrintFormat_ID,"
- + " c.IsMultiLingualDocument,bp.AD_Language,bp.C_BPartner_ID,d.DocumentNo "
- + "FROM C_PaySelectionCheck d"
- + " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)"
- + " INNER JOIN AD_PrintForm pf ON (c.AD_Client_ID=pf.AD_Client_ID)"
- + " INNER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID) "
- + "WHERE d.C_PaySelectionCheck_ID=?" // info from PrintForm
- + " AND pf.AD_Org_ID IN (0,d.AD_Org_ID) ORDER BY pf.AD_Org_ID DESC";
- else if (type == PROJECT)
- sql = "SELECT pf.Project_PrintFormat_ID,"
- + " c.IsMultiLingualDocument,bp.AD_Language,bp.C_BPartner_ID,d.Value "
- + "FROM C_Project d"
- + " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)"
- + " INNER JOIN AD_PrintForm pf ON (c.AD_Client_ID=pf.AD_Client_ID)"
- + " LEFT OUTER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID) "
- + "WHERE d.C_Project_ID=?" // info from PrintForm
- + " AND pf.AD_Org_ID IN (0,d.AD_Org_ID) ORDER BY pf.AD_Org_ID DESC";
- else if (type == MANUFACTURING_ORDER)
- sql = "SELECT pf.Manuf_Order_PrintFormat_ID,"
- + " c.IsMultiLingualDocument,bp.AD_Language, 0 , d.DocumentNo "
- + "FROM PP_Order d"
- + " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)"
- + " LEFT OUTER JOIN AD_User u ON (u.AD_User_ID=d.Planner_ID)"
- + " LEFT OUTER JOIN C_BPartner bp ON (u.C_BPartner_ID=bp.C_BPartner_ID) "
- + " INNER JOIN AD_PrintForm pf ON (c.AD_Client_ID=pf.AD_Client_ID)"
- + "WHERE d.PP_Order_ID=?" // info from PrintForm
- + " AND pf.AD_Org_ID IN (0,d.AD_Org_ID) ORDER BY pf.AD_Org_ID DESC";
- else if (type == DISTRIBUTION_ORDER)
- sql = "SELECT pf.Distrib_Order_PrintFormat_ID,"
- + " c.IsMultiLingualDocument,bp.AD_Language, bp.C_BPartner_ID , d.DocumentNo "
- + "FROM DD_Order d"
- + " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)"
- + " INNER JOIN AD_PrintForm pf ON (c.AD_Client_ID=pf.AD_Client_ID)"
- + " LEFT OUTER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID) "
- + "WHERE d.DD_Order_ID=?" // info from PrintForm
- + " AND pf.AD_Org_ID IN (0,d.AD_Org_ID) ORDER BY pf.AD_Org_ID DESC";
- else if (type == RFQ)
- sql = "SELECT COALESCE(t.AD_PrintFormat_ID, pf.AD_PrintFormat_ID),"
- + " c.IsMultiLingualDocument,bp.AD_Language,bp.C_BPartner_ID,rr.Name "
- + "FROM C_RfQResponse rr"
- + " INNER JOIN C_RfQ r ON (rr.C_RfQ_ID=r.C_RfQ_ID)"
- + " INNER JOIN C_RfQ_Topic t ON (r.C_RfQ_Topic_ID=t.C_RfQ_Topic_ID)"
- + " INNER JOIN AD_Client c ON (rr.AD_Client_ID=c.AD_Client_ID)"
- + " INNER JOIN C_BPartner bp ON (rr.C_BPartner_ID=bp.C_BPartner_ID),"
- + " AD_PrintFormat pf "
- + "WHERE pf.AD_Client_ID IN (0,rr.AD_Client_ID)"
- + " AND pf.AD_Table_ID=725 AND pf.IsTableBased='N'" // from RfQ PrintFormat
- + " AND rr.C_RfQResponse_ID=? " // Info from RfQTopic
- + "ORDER BY t.AD_PrintFormat_ID, pf.AD_Client_ID DESC, pf.AD_Org_ID DESC";
- else // Get PrintFormat from Org or 0 of document client
- sql = "SELECT pf.Order_PrintFormat_ID,pf.Shipment_PrintFormat_ID," // 1..2
- // Prio: 1. BPartner 2. DocType, 3. PrintFormat (Org) // see InvoicePrint
- + " COALESCE (bp.Invoice_PrintFormat_ID,dt.AD_PrintFormat_ID,pf.Invoice_PrintFormat_ID)," // 3
- + " pf.Project_PrintFormat_ID, pf.Remittance_PrintFormat_ID," // 4..5
- + " c.IsMultiLingualDocument, bp.AD_Language," // 6..7
- + " COALESCE(dt.DocumentCopies,0)+COALESCE(bp.DocumentCopies,1), " // 8
- + " dt.AD_PrintFormat_ID,bp.C_BPartner_ID,d.DocumentNo, " // 9..11
- + " pf.Manuf_Order_PrintFormat_ID, pf.Distrib_Order_PrintFormat_ID " // 12..13
- + "FROM " + DOC_BASETABLES[type] + " d"
- + " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)"
- + " INNER JOIN AD_PrintForm pf ON (c.AD_Client_ID=pf.AD_Client_ID)"
- + " INNER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID)"
- + " LEFT OUTER JOIN C_DocType dt ON (d.C_DocType_ID=dt.C_DocType_ID) "
- + "WHERE d." + DOC_IDS[type] + "=?" // info from PrintForm
- + " AND pf.AD_Org_ID IN (0,d.AD_Org_ID) "
- + "ORDER BY pf.AD_Org_ID DESC";
- //
- PreparedStatement pstmt = null;
- ResultSet rs = null;
- try
- {
- pstmt = DB.prepareStatement(sql, trxName);
- pstmt.setInt(1, Record_ID);
- rs = pstmt.executeQuery();
- if (rs.next()) // first record only
- {
- if (type == CHECK || type == DUNNING || type == REMITTANCE
- || type == PROJECT || type == RFQ || type == MANUFACTURING_ORDER || type == DISTRIBUTION_ORDER)
- {
- AD_PrintFormat_ID = rs.getInt(1);
- copies = 1;
- // Set Language when enabled
- String AD_Language = rs.getString(3);
- if (AD_Language != null)// && "Y".equals(rs.getString(2))) // IsMultiLingualDocument
- language = Language.getLanguage(AD_Language);
- C_BPartner_ID = rs.getInt(4);
- if (type == DUNNING)
- {
- Timestamp ts = rs.getTimestamp(5);
- DocumentNo = ts.toString();
- }
- else
- DocumentNo = rs.getString(5);
- }
- else
- {
- // Set PrintFormat
- AD_PrintFormat_ID = rs.getInt(type+1);
- if (rs.getInt(9) != 0) // C_DocType.AD_PrintFormat_ID
- AD_PrintFormat_ID = rs.getInt(9);
- copies = rs.getInt(8);
- // Set Language when enabled
- String AD_Language = rs.getString(7);
- if (AD_Language != null) // && "Y".equals(rs.getString(6))) // IsMultiLingualDocument
- language = Language.getLanguage(AD_Language);
- C_BPartner_ID = rs.getInt(10);
- DocumentNo = rs.getString(11);
- }
- }
- }
- catch (Exception e)
- {
- log.log(Level.SEVERE, "Record_ID=" + Record_ID + ", SQL=" + sql, e);
- }
- finally {
- DB.close(rs, pstmt);
- rs = null; pstmt = null;
- }
- if (AD_PrintFormat_ID == 0)
- {
- log.log(Level.SEVERE, "No PrintFormat found for Type=" + type + ", Record_ID=" + Record_ID);
- return null;
- }
-
- // Get Format & Data
- MPrintFormat format = MPrintFormat.get (ctx, AD_PrintFormat_ID, false);
- format.setLanguage(language); // BP Language if Multi-Lingual
- // if (!Env.isBaseLanguage(language, DOC_TABLES[type]))
- format.setTranslationLanguage(language);
- // query
- MQuery query = new MQuery(DOC_TABLES[type]);
- query.addRestriction(DOC_IDS[type], MQuery.EQUAL, new Integer(Record_ID));
- // log.config( "ReportCtrl.startDocumentPrint - " + format, query + " - " + language.getAD_Language());
- //
- if (DocumentNo == null || DocumentNo.length() == 0)
- DocumentNo = "DocPrint";
- PrintInfo info = new PrintInfo(
- DocumentNo,
- DOC_TABLE_ID[type],
- Record_ID,
- C_BPartner_ID);
- info.setCopies(copies);
- info.setDocumentCopy(false); // true prints "Copy" on second
- info.setPrinterName(format.getPrinterName());
-
- // Engine
- ReportEngine re = new ReportEngine(ctx, format, query, info, trxName);
- return re;
- } // get
-
- /**
- * Determine what Order document to print.
- * @param C_Order_ID id
- * @return int Array with [printWhat, ID]
- */
- private static int[] getDocumentWhat (int C_Order_ID)
- {
- int[] what = new int[2];
- what[0] = ORDER;
- what[1] = C_Order_ID;
- //
- String sql = "SELECT dt.DocSubTypeSO "
- + "FROM C_DocType dt, C_Order o "
- + "WHERE o.C_DocType_ID=dt.C_DocType_ID"
- + " AND o.C_Order_ID=?";
- String DocSubTypeSO = null;
- PreparedStatement pstmt = null;
- ResultSet rs = null;
- try
- {
- pstmt = DB.prepareStatement(sql, null);
- pstmt.setInt(1, C_Order_ID);
- rs = pstmt.executeQuery();
- if (rs.next())
- DocSubTypeSO = rs.getString(1);
- }
- catch (SQLException e1)
- {
- log.log(Level.SEVERE, "(1) - " + sql, e1);
- return null; // error
- }
- finally {
- DB.close(rs, pstmt);
- rs = null; pstmt = null;
- }
- if (DocSubTypeSO == null)
- DocSubTypeSO = "";
- // WalkIn Receipt, WalkIn Invoice,
- if (DocSubTypeSO.equals("WR") || DocSubTypeSO.equals("WI"))
- what[0] = INVOICE;
- // WalkIn Pickup,
- else if (DocSubTypeSO.equals("WP"))
- what[0] = SHIPMENT;
- // Offer Binding, Offer Nonbinding, Standard Order
- else
- return what;
-
- // Get Record_ID of Invoice/Receipt
- if (what[0] == INVOICE)
- sql = "SELECT C_Invoice_ID REC FROM C_Invoice WHERE C_Order_ID=?" // 1
- + " ORDER BY C_Invoice_ID DESC";
- else
- sql = "SELECT M_InOut_ID REC FROM M_InOut WHERE C_Order_ID=?" // 1
- + " ORDER BY M_InOut_ID DESC";
- try
- {
- pstmt = DB.prepareStatement(sql, null);
- pstmt.setInt(1, C_Order_ID);
- rs = pstmt.executeQuery();
- if (rs.next())
- {
- // if (i == 1 && ADialog.ask(0, null, what[0] == INVOICE ? "PrintOnlyRecentInvoice?" : "PrintOnlyRecentShipment?")) break;
- what[1] = rs.getInt(1);
- }
- else // No Document Found
- what[0] = ORDER;
- }
- catch (SQLException e2)
- {
- log.log(Level.SEVERE, "(2) - " + sql, e2);
- return null;
- }
- finally {
- DB.close(rs, pstmt);
- rs = null; pstmt = null;
- }
- log.fine("Order => " + what[0] + " ID=" + what[1]);
- return what;
- } // getDocumentWhat
-
- /**
- * Print Confirm.
- * Update Date Printed
- * @param type document type
- * @param Record_ID record id
- */
- public static void printConfirm (int type, int Record_ID)
- {
- StringBuffer sql = new StringBuffer();
- if (type == ORDER || type == SHIPMENT || type == INVOICE)
- sql.append("UPDATE ").append(DOC_BASETABLES[type])
- .append(" SET DatePrinted=SysDate, IsPrinted='Y' WHERE ")
- .append(DOC_IDS[type]).append("=").append(Record_ID);
- //
- if (sql.length() > 0)
- {
- int no = DB.executeUpdate(sql.toString(), null);
- if (no != 1)
- log.log(Level.SEVERE, "Updated records=" + no + " - should be just one");
- }
- } // printConfirm
-
-
- /*************************************************************************
- * Test
- * @param args args
- */
- public static void main(String[] args)
- {
- org.compiere.Adempiere.startupEnvironment(true);
- //
- int AD_Table_ID = 100;
- MQuery q = new MQuery("AD_Table");
- q.addRestriction("AD_Table_ID", "<", 108);
- //
- MPrintFormat f = MPrintFormat.createFromTable(Env.getCtx(), AD_Table_ID);
- PrintInfo i = new PrintInfo("test", AD_Table_ID, 108, 0);
- i.setAD_Table_ID(AD_Table_ID);
- ReportEngine re = new ReportEngine(Env.getCtx(), f, q, i);
- re.layout();
- /**
- re.createCSV(new File("C:\\Temp\\test.csv"), ',', Language.getLanguage());
- re.createHTML(new File("C:\\Temp\\test.html"), false, Language.getLanguage());
- re.createXML(new File("C:\\Temp\\test.xml"));
- re.createPS(new File ("C:\\Temp\\test.ps"));
- re.createPDF(new File("C:\\Temp\\test.pdf"));
- /****/
- re.print();
- // re.print(true, 1, false, "Epson Stylus COLOR 900 ESC/P 2"); // Dialog
- // re.print(true, 1, false, "HP LaserJet 3300 Series PCL 6"); // Dialog
- // re.print(false, 1, false, "Epson Stylus COLOR 900 ESC/P 2"); // Dialog
- System.exit(0);
- } // main
-
-} // ReportEngine
+/******************************************************************************
+ * 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.print;
+
+import java.awt.print.PrinterJob;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.Writer;
+import java.net.URI;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.util.Locale;
+import java.util.Properties;
+import java.util.logging.Level;
+
+import javax.print.DocFlavor;
+import javax.print.StreamPrintService;
+import javax.print.StreamPrintServiceFactory;
+import javax.print.attribute.HashPrintRequestAttributeSet;
+import javax.print.attribute.PrintRequestAttributeSet;
+import javax.print.attribute.standard.Copies;
+import javax.print.attribute.standard.JobName;
+import javax.print.event.PrintServiceAttributeEvent;
+import javax.print.event.PrintServiceAttributeListener;
+import javax.xml.transform.stream.StreamResult;
+
+import org.adempiere.pdf.Document;
+import org.adempiere.print.export.PrintDataExcelExporter;
+import org.apache.ecs.XhtmlDocument;
+import org.apache.ecs.xhtml.table;
+import org.apache.ecs.xhtml.td;
+import org.apache.ecs.xhtml.th;
+import org.apache.ecs.xhtml.tr;
+import org.compiere.model.MClient;
+import org.compiere.model.MQuery;
+import org.compiere.model.PrintInfo;
+import org.compiere.model.X_C_DunningRunEntry;
+import org.compiere.model.X_C_Invoice;
+import org.compiere.model.X_C_Order;
+import org.compiere.model.X_C_PaySelectionCheck;
+import org.compiere.model.X_C_Project;
+import org.compiere.model.X_C_RfQResponse;
+import org.compiere.model.X_M_InOut;
+import org.compiere.print.layout.LayoutEngine;
+import org.compiere.process.ProcessInfo;
+import org.compiere.util.CLogger;
+import org.compiere.util.DB;
+import org.compiere.util.Env;
+import org.compiere.util.Ini;
+import org.compiere.util.Language;
+import org.compiere.util.Util;
+import org.eevolution.model.X_DD_Order;
+import org.eevolution.model.X_PP_Order;
+
+/**
+ * Report Engine.
+ * For a given PrintFormat,
+ * create a Report
+ *
+ * Change log:
+ *
+ * - 2007-02-12 - teo_sarca - [ 1658127 ] Select charset encoding on import
+ *
- 2007-02-10 - teo_sarca - [ 1652660 ] Save XML,HTML,CSV should have utf8 charset
+ *
- 2009-02-06 - globalqss - [ 2574162 ] Priority to choose invoice print format not working
+ *
+ *
+ * @author Jorg Janke
+ * @version $Id: ReportEngine.java,v 1.4 2006/10/08 06:52:51 comdivision Exp $
+ */
+public class ReportEngine implements PrintServiceAttributeListener
+{
+ /**
+ * Constructor
+ * @param ctx context
+ * @param pf Print Format
+ * @param query Optional Query
+ * @param info print info
+ */
+ public ReportEngine (Properties ctx, MPrintFormat pf, MQuery query, PrintInfo info)
+ {
+ this(ctx, pf, query, info, null);
+ } // ReportEngine
+
+ /**
+ * Constructor
+ * @param ctx context
+ * @param pf Print Format
+ * @param query Optional Query
+ * @param info print info
+ * @param trxName
+ */
+ public ReportEngine (Properties ctx, MPrintFormat pf, MQuery query, PrintInfo info, String trxName)
+ {
+ if (pf == null)
+ throw new IllegalArgumentException("ReportEngine - no PrintFormat");
+ log.info(pf + " -- " + query);
+ m_ctx = ctx;
+ //
+ m_printFormat = pf;
+ m_info = info;
+ m_trxName = trxName;
+ setQuery(query); // loads Data
+
+ } // ReportEngine
+
+ /** Static Logger */
+ private static CLogger log = CLogger.getCLogger (ReportEngine.class);
+
+ /** Context */
+ private Properties m_ctx;
+
+ /** Print Format */
+ private MPrintFormat m_printFormat;
+ /** Print Info */
+ private PrintInfo m_info;
+ /** Query */
+ private MQuery m_query;
+ /** Query Data */
+ private PrintData m_printData;
+ /** Layout */
+ private LayoutEngine m_layout = null;
+ /** Printer */
+ private String m_printerName = Ini.getProperty(Ini.P_PRINTER);
+ /** View */
+ private View m_view = null;
+ /** Transaction Name */
+ private String m_trxName = null;
+
+ /**
+ * Set PrintFormat.
+ * If Layout was created, re-create layout
+ * @param pf print format
+ */
+ public void setPrintFormat (MPrintFormat pf)
+ {
+ m_printFormat = pf;
+ if (m_layout != null)
+ {
+ setPrintData();
+ m_layout.setPrintFormat(pf, false);
+ m_layout.setPrintData(m_printData, m_query, true); // format changes data
+ }
+ if (m_view != null)
+ m_view.revalidate();
+ } // setPrintFormat
+
+ /**
+ * Set Query and generate PrintData.
+ * If Layout was created, re-create layout
+ * @param query query
+ */
+ public void setQuery (MQuery query)
+ {
+ m_query = query;
+ if (query == null)
+ return;
+ //
+ setPrintData();
+ if (m_layout != null)
+ m_layout.setPrintData(m_printData, m_query, true);
+ if (m_view != null)
+ m_view.revalidate();
+ } // setQuery
+
+ /**
+ * Get Query
+ * @return query
+ */
+ public MQuery getQuery()
+ {
+ return m_query;
+ } // getQuery
+
+ /**
+ * Set PrintData for Format restricted by Query.
+ * Nothing set if there is no query
+ * Sets m_printData
+ */
+ private void setPrintData()
+ {
+ if (m_query == null)
+ return;
+
+ DataEngine de = new DataEngine(m_printFormat.getLanguage(),m_trxName);
+ setPrintData(de.getPrintData (m_ctx, m_printFormat, m_query));
+ // m_printData.dump();
+ } // setPrintData
+
+
+ /**
+ * Get PrintData
+ * @return print data
+ */
+ public PrintData getPrintData()
+ {
+ return m_printData;
+ } // getPrintData
+
+ /**
+ * Set PrintData
+ * @param printData printData
+ */
+ public void setPrintData (PrintData printData)
+ {
+ if (printData == null)
+ return;
+ m_printData = printData;
+ } // setPrintData
+
+
+ /**************************************************************************
+ * Layout
+ */
+ private void layout()
+ {
+ if (m_printFormat == null)
+ throw new IllegalStateException ("No print format");
+ if (m_printData == null)
+ throw new IllegalStateException ("No print data (Delete Print Format and restart)");
+ m_layout = new LayoutEngine (m_printFormat, m_printData, m_query, m_info, m_trxName);
+ } // layout
+
+ /**
+ * Get Layout
+ * @return Layout
+ */
+ public LayoutEngine getLayout()
+ {
+ if (m_layout == null)
+ layout();
+ return m_layout;
+ } // getLayout
+
+ /**
+ * Get PrintFormat (Report) Name
+ * @return name
+ */
+ public String getName()
+ {
+ return m_printFormat.getName();
+ } // getName
+
+ /**
+ * Get PrintFormat
+ * @return print format
+ */
+ public MPrintFormat getPrintFormat()
+ {
+ return m_printFormat;
+ } // getPrintFormat
+
+ /**
+ * Get Print Info
+ * @return info
+ */
+ public PrintInfo getPrintInfo()
+ {
+ return m_info;
+ } // getPrintInfo
+
+ /**
+ * Get PrintLayout (Report) Context
+ * @return context
+ */
+ public Properties getCtx()
+ {
+ return m_layout.getCtx();
+ } // getCtx
+
+ /**
+ * Get Row Count
+ * @return row count
+ */
+ public int getRowCount()
+ {
+ return m_printData.getRowCount();
+ } // getRowCount
+
+ /**
+ * Get Column Count
+ * @return column count
+ */
+ public int getColumnCount()
+ {
+ if (m_layout != null)
+ return m_layout.getColumnCount();
+ return 0;
+ } // getColumnCount
+
+
+ /**************************************************************************
+ * Get View Panel
+ * @return view panel
+ */
+ public View getView()
+ {
+ if (m_layout == null)
+ layout();
+ if (m_view == null)
+ m_view = new View (m_layout);
+ return m_view;
+ } // getView
+
+
+ /**************************************************************************
+ * Print Report
+ */
+ public void print ()
+ {
+ log.info(m_info.toString());
+ if (m_layout == null)
+ layout();
+
+ // Paper Attributes: media-printable-area, orientation-requested, media
+ PrintRequestAttributeSet prats = m_layout.getPaper().getPrintRequestAttributeSet();
+ // add: copies, job-name, priority
+ if (m_info.isDocumentCopy() || m_info.getCopies() < 1)
+ prats.add (new Copies(1));
+ else
+ prats.add (new Copies(m_info.getCopies()));
+ Locale locale = Language.getLoginLanguage().getLocale();
+ prats.add(new JobName(m_printFormat.getName(), locale));
+ prats.add(PrintUtil.getJobPriority(m_layout.getNumberOfPages(), m_info.getCopies(), true));
+
+ try
+ {
+ // PrinterJob
+ PrinterJob job = getPrinterJob(m_info.getPrinterName());
+ // job.getPrintService().addPrintServiceAttributeListener(this);
+ job.setPageable(m_layout.getPageable(false)); // no copy
+ // Dialog
+ try
+ {
+ if (m_info.isWithDialog() && !job.printDialog(prats))
+ return;
+ }
+ catch (Exception e)
+ {
+ log.log(Level.WARNING, "Operating System Print Issue, check & try again", e);
+ return;
+ }
+
+ // submit
+ boolean printCopy = m_info.isDocumentCopy() && m_info.getCopies() > 1;
+ ArchiveEngine.get().archive(m_layout, m_info);
+ PrintUtil.print(job, prats, false, printCopy);
+
+ // Document: Print Copies
+ if (printCopy)
+ {
+ log.info("Copy " + (m_info.getCopies()-1));
+ prats.add(new Copies(m_info.getCopies()-1));
+ job = getPrinterJob(m_info.getPrinterName());
+ // job.getPrintService().addPrintServiceAttributeListener(this);
+ job.setPageable (m_layout.getPageable(true)); // Copy
+ PrintUtil.print(job, prats, false, false);
+ }
+ }
+ catch (Exception e)
+ {
+ log.log(Level.SEVERE, "", e);
+ }
+ } // print
+
+ /**
+ * Print Service Attribute Listener.
+ * @param psae event
+ */
+ public void attributeUpdate(PrintServiceAttributeEvent psae)
+ {
+ /**
+PrintEvent on Win32 Printer : \\MAIN\HP LaserJet 5L
+PrintServiceAttributeSet - length=2
+queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount)
+printer-is-accepting-jobs = accepting-jobs (class javax.print.attribute.standard.PrinterIsAcceptingJobs)
+PrintEvent on Win32 Printer : \\MAIN\HP LaserJet 5L
+PrintServiceAttributeSet - length=1
+queued-job-count = 1 (class javax.print.attribute.standard.QueuedJobCount)
+PrintEvent on Win32 Printer : \\MAIN\HP LaserJet 5L
+PrintServiceAttributeSet - length=1
+queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount)
+ **/
+ log.fine("attributeUpdate - " + psae);
+ // PrintUtil.dump (psae.getAttributes());
+ } // attributeUpdate
+
+
+ /**
+ * Get PrinterJob based on PrinterName
+ * @param printerName optional Printer Name
+ * @return PrinterJob
+ */
+ private PrinterJob getPrinterJob (String printerName)
+ {
+ if (printerName != null && printerName.length() > 0)
+ return CPrinter.getPrinterJob(printerName);
+ return CPrinter.getPrinterJob(m_printerName);
+ } // getPrinterJob
+
+ /**
+ * Show Dialog and Set Paper
+ * Optionally re-calculate layout
+ */
+ public void pageSetupDialog ()
+ {
+ if (m_layout == null)
+ layout();
+ m_layout.pageSetupDialog(getPrinterJob(m_printerName));
+ if (m_view != null)
+ m_view.revalidate();
+ } // pageSetupDialog
+
+ /**
+ * Set Printer (name)
+ * @param printerName valid printer name
+ */
+ public void setPrinterName(String printerName)
+ {
+ if (printerName == null)
+ m_printerName = Ini.getProperty(Ini.P_PRINTER);
+ else
+ m_printerName = printerName;
+ } // setPrinterName
+
+ /**
+ * Get Printer (name)
+ * @return printer name
+ */
+ public String getPrinterName()
+ {
+ return m_printerName;
+ } // getPrinterName
+
+
+ /**************************************************************************
+ * Create HTML File
+ * @param file file
+ * @param onlyTable if false create complete HTML document
+ * @param language optional language - if null the default language is used to format nubers/dates
+ * @return true if success
+ */
+ public boolean createHTML (File file, boolean onlyTable, Language language)
+ {
+ try
+ {
+ Language lang = language;
+ if (lang == null)
+ lang = Language.getLoginLanguage();
+ Writer fw = new OutputStreamWriter(new FileOutputStream(file, false), Ini.getCharset()); // teo_sarca: save using adempiere charset [ 1658127 ]
+ return createHTML (new BufferedWriter(fw), onlyTable, lang);
+ }
+ catch (FileNotFoundException fnfe)
+ {
+ log.log(Level.SEVERE, "(f) - " + fnfe.toString());
+ }
+ catch (Exception e)
+ {
+ log.log(Level.SEVERE, "(f)", e);
+ }
+ return false;
+ } // createHTML
+
+ /**
+ * Write HTML to writer
+ * @param writer writer
+ * @param onlyTable if false create complete HTML document
+ * @param language optional language - if null nubers/dates are not formatted
+ * @return true if success
+ */
+ public boolean createHTML (Writer writer, boolean onlyTable, Language language)
+ {
+ try
+ {
+ table table = new table();
+ //
+ // for all rows (-1 = header row)
+ for (int row = -1; row < m_printData.getRowCount(); row++)
+ {
+ tr tr = new tr();
+ table.addElement(tr);
+ if (row != -1)
+ m_printData.setRowIndex(row);
+ // for all columns
+ for (int col = 0; col < m_printFormat.getItemCount(); col++)
+ {
+ MPrintFormatItem item = m_printFormat.getItem(col);
+ if (item.isPrinted())
+ {
+ // header row
+ if (row == -1)
+ {
+ th th = new th();
+ tr.addElement(th);
+ th.addElement(Util.maskHTML(item.getPrintName(language)));
+ }
+ else
+ {
+ td td = new td();
+ tr.addElement(td);
+ Object obj = m_printData.getNode(new Integer(item.getAD_Column_ID()));
+ if (obj == null)
+ td.addElement(" ");
+ else if (obj instanceof PrintDataElement)
+ {
+ String value = ((PrintDataElement)obj).getValueDisplay(language); // formatted
+ td.addElement(Util.maskHTML(value));
+ }
+ else if (obj instanceof PrintData)
+ {
+ // ignore contained Data
+ }
+ else
+ log.log(Level.SEVERE, "Element not PrintData(Element) " + obj.getClass());
+ }
+ } // printed
+ } // for all columns
+ } // for all rows
+
+ //
+ PrintWriter w = new PrintWriter(writer);
+ if (onlyTable)
+ table.output(w);
+ else
+ {
+ XhtmlDocument doc = new XhtmlDocument();
+ doc.appendBody(table);
+ doc.output(w);
+ }
+ w.flush();
+ w.close();
+ }
+ catch (Exception e)
+ {
+ log.log(Level.SEVERE, "(w)", e);
+ }
+ return false;
+ } // createHTML
+
+
+ /**************************************************************************
+ * Create CSV File
+ * @param file file
+ * @param delimiter delimiter, e.g. comma, tab
+ * @param language translation language
+ * @return true if success
+ */
+ public boolean createCSV (File file, char delimiter, Language language)
+ {
+ try
+ {
+ Writer fw = new OutputStreamWriter(new FileOutputStream(file, false), Ini.getCharset()); // teo_sarca: save using adempiere charset [ 1658127 ]
+ return createCSV (new BufferedWriter(fw), delimiter, language);
+ }
+ catch (FileNotFoundException fnfe)
+ {
+ log.log(Level.SEVERE, "(f) - " + fnfe.toString());
+ }
+ catch (Exception e)
+ {
+ log.log(Level.SEVERE, "(f)", e);
+ }
+ return false;
+ } // createCSV
+
+ /**
+ * Write CSV to writer
+ * @param writer writer
+ * @param delimiter delimiter, e.g. comma, tab
+ * @param language translation language
+ * @return true if success
+ */
+ public boolean createCSV (Writer writer, char delimiter, Language language)
+ {
+ if (delimiter == 0)
+ delimiter = '\t';
+ try
+ {
+ // for all rows (-1 = header row)
+ for (int row = -1; row < m_printData.getRowCount(); row++)
+ {
+ StringBuffer sb = new StringBuffer();
+ if (row != -1)
+ m_printData.setRowIndex(row);
+
+ // for all columns
+ boolean first = true; // first column to print
+ for (int col = 0; col < m_printFormat.getItemCount(); col++)
+ {
+ MPrintFormatItem item = m_printFormat.getItem(col);
+ if (item.isPrinted())
+ {
+ // column delimiter (comma or tab)
+ if (first)
+ first = false;
+ else
+ sb.append(delimiter);
+ // header row
+ if (row == -1)
+ createCSVvalue (sb, delimiter,
+ m_printFormat.getItem(col).getPrintName(language));
+ else
+ {
+ Object obj = m_printData.getNode(new Integer(item.getAD_Column_ID()));
+ String data = "";
+ if (obj == null)
+ ;
+ else if (obj instanceof PrintDataElement)
+ {
+ PrintDataElement pde = (PrintDataElement)obj;
+ if (pde.isPKey())
+ data = pde.getValueAsString();
+ else
+ data = pde.getValueDisplay(language); // formatted
+ }
+ else if (obj instanceof PrintData)
+ {
+ }
+ else
+ log.log(Level.SEVERE, "Element not PrintData(Element) " + obj.getClass());
+ createCSVvalue (sb, delimiter, data);
+ }
+ } // printed
+ } // for all columns
+ writer.write(sb.toString());
+ writer.write(Env.NL);
+ } // for all rows
+ //
+ writer.flush();
+ writer.close();
+ }
+ catch (Exception e)
+ {
+ log.log(Level.SEVERE, "(w)", e);
+ }
+ return false;
+ } // createCSV
+
+ /**
+ * Add Content to CSV string.
+ * Encapsulate/mask content in " if required
+ * @param sb StringBuffer to add to
+ * @param delimiter delimiter
+ * @param content column value
+ */
+ private void createCSVvalue (StringBuffer sb, char delimiter, String content)
+ {
+ // nothing to add
+ if (content == null || content.length() == 0)
+ return;
+ //
+ boolean needMask = false;
+ StringBuffer buff = new StringBuffer();
+ char chars[] = content.toCharArray();
+ for (int i = 0; i < chars.length; i++)
+ {
+ char c = chars[i];
+ if (c == '"')
+ {
+ needMask = true;
+ buff.append(c); // repeat twice
+ } // mask if any control character
+ else if (!needMask && (c == delimiter || !Character.isLetterOrDigit(c)))
+ needMask = true;
+ buff.append(c);
+ }
+
+ // Optionally mask value
+ if (needMask)
+ sb.append('"').append(buff).append('"');
+ else
+ sb.append(buff);
+ } // addCSVColumnValue
+
+
+ /**************************************************************************
+ * Create XML File
+ * @param file file
+ * @return true if success
+ */
+ public boolean createXML (File file)
+ {
+ try
+ {
+ Writer fw = new OutputStreamWriter(new FileOutputStream(file, false), Ini.getCharset()); // teo_sarca: save using adempiere charset [ 1658127 ]
+ return createXML (new BufferedWriter(fw));
+ }
+ catch (FileNotFoundException fnfe)
+ {
+ log.log(Level.SEVERE, "(f) - " + fnfe.toString());
+ }
+ catch (Exception e)
+ {
+ log.log(Level.SEVERE, "(f)", e);
+ }
+ return false;
+ } // createXML
+
+ /**
+ * Write XML to writer
+ * @param writer writer
+ * @return true if success
+ */
+ public boolean createXML (Writer writer)
+ {
+ try
+ {
+ m_printData.createXML(new StreamResult(writer));
+ writer.flush();
+ writer.close();
+ }
+ catch (Exception e)
+ {
+ log.log(Level.SEVERE, "(w)", e);
+ }
+ return false;
+ } // createXML
+
+
+ /**************************************************************************
+ * Create PDF file.
+ * (created in temporary storage)
+ * @return PDF file
+ */
+ public File getPDF()
+ {
+ return getPDF (null);
+ } // getPDF
+
+ /**
+ * Create PDF file.
+ * @param file file
+ * @return PDF file
+ */
+ public File getPDF (File file)
+ {
+ try
+ {
+ if (file == null)
+ file = File.createTempFile ("ReportEngine", ".pdf");
+ }
+ catch (IOException e)
+ {
+ log.log(Level.SEVERE, "", e);
+ }
+ if (createPDF (file))
+ return file;
+ return null;
+ } // getPDF
+
+ /**
+ * Create PDF File
+ * @param file file
+ * @return true if success
+ */
+ public boolean createPDF (File file)
+ {
+ String fileName = null;
+ URI uri = null;
+
+ try
+ {
+ if (file == null)
+ file = File.createTempFile ("ReportEngine", ".pdf");
+ fileName = file.getAbsolutePath();
+ uri = file.toURI();
+ if (file.exists())
+ file.delete();
+
+ }
+ catch (Exception e)
+ {
+ log.log(Level.SEVERE, "file", e);
+ return false;
+ }
+
+ log.fine(uri.toString());
+
+ try
+ {
+ if (m_layout == null)
+ layout ();
+ ArchiveEngine.get().archive(m_layout, m_info);
+ Document.getPDFAsFile(fileName, m_layout.getPageable(false));
+ }
+ catch (Exception e)
+ {
+ log.log(Level.SEVERE, "PDF", e);
+ return false;
+ }
+
+ File file2 = new File(fileName);
+ log.info(file2.getAbsolutePath() + " - " + file2.length());
+ return file2.exists();
+ } // createPDF
+
+ /**
+ * Create PDF as Data array
+ * @return pdf data
+ */
+ public byte[] createPDFData ()
+ {
+ try
+ {
+ if (m_layout == null)
+ layout ();
+ return Document.getPDFAsArray(m_layout.getPageable(false));
+ }
+ catch (Exception e)
+ {
+ log.log(Level.SEVERE, "PDF", e);
+ }
+ return null;
+ } // createPDFData
+
+ /**************************************************************************
+ * Create PostScript File
+ * @param file file
+ * @return true if success
+ */
+ public boolean createPS (File file)
+ {
+ try
+ {
+ return createPS (new FileOutputStream(file));
+ }
+ catch (FileNotFoundException fnfe)
+ {
+ log.log(Level.SEVERE, "(f) - " + fnfe.toString());
+ }
+ catch (Exception e)
+ {
+ log.log(Level.SEVERE, "(f)", e);
+ }
+ return false;
+ } // createPS
+
+ /**
+ * Write PostScript to writer
+ * @param os output stream
+ * @return true if success
+ */
+ public boolean createPS (OutputStream os)
+ {
+ try
+ {
+ String outputMimeType = DocFlavor.BYTE_ARRAY.POSTSCRIPT.getMimeType();
+ DocFlavor docFlavor = DocFlavor.SERVICE_FORMATTED.PAGEABLE;
+ StreamPrintServiceFactory[] spsfactories =
+ StreamPrintServiceFactory.lookupStreamPrintServiceFactories(docFlavor, outputMimeType);
+ if (spsfactories.length == 0)
+ {
+ log.log(Level.SEVERE, "(fos) - No StreamPrintService");
+ return false;
+ }
+ // just use first one - sun.print.PSStreamPrinterFactory
+ // System.out.println("- " + spsfactories[0]);
+ StreamPrintService sps = spsfactories[0].getPrintService(os);
+ // get format
+ if (m_layout == null)
+ layout();
+ // print it
+ sps.createPrintJob().print(m_layout.getPageable(false),
+ new HashPrintRequestAttributeSet());
+ //
+ os.flush();
+ //following 2 line for backward compatibility
+ if (os instanceof FileOutputStream)
+ ((FileOutputStream)os).close();
+ }
+ catch (Exception e)
+ {
+ log.log(Level.SEVERE, "(fos)", e);
+ }
+ return false;
+ } // createPS
+
+ /**
+ * Create Excel file
+ * @param outFile output file
+ * @param language
+ * @throws Exception if error
+ */
+ public void createXLS(File outFile, Language language)
+ throws Exception
+ {
+ PrintDataExcelExporter exp = new PrintDataExcelExporter(getPrintData(), getPrintFormat());
+ exp.export(outFile, language);
+ }
+
+ /**************************************************************************
+ * Get Report Engine for process info
+ * @param ctx context
+ * @param pi process info with AD_PInstance_ID
+ * @return report engine or null
+ */
+ static public ReportEngine get (Properties ctx, ProcessInfo pi)
+ {
+ int AD_Client_ID = pi.getAD_Client_ID();
+ //
+ int AD_Table_ID = 0;
+ int AD_ReportView_ID = 0;
+ String TableName = null;
+ String whereClause = "";
+ int AD_PrintFormat_ID = 0;
+ boolean IsForm = false;
+ int Client_ID = -1;
+
+ // Get AD_Table_ID and TableName
+ String sql = "SELECT rv.AD_ReportView_ID,rv.WhereClause,"
+ + " t.AD_Table_ID,t.TableName, pf.AD_PrintFormat_ID, pf.IsForm, pf.AD_Client_ID "
+ + "FROM AD_PInstance pi"
+ + " INNER JOIN AD_Process p ON (pi.AD_Process_ID=p.AD_Process_ID)"
+ + " INNER JOIN AD_ReportView rv ON (p.AD_ReportView_ID=rv.AD_ReportView_ID)"
+ + " INNER JOIN AD_Table t ON (rv.AD_Table_ID=t.AD_Table_ID)"
+ + " LEFT OUTER JOIN AD_PrintFormat pf ON (p.AD_ReportView_ID=pf.AD_ReportView_ID AND pf.AD_Client_ID IN (0,?)) "
+ + "WHERE pi.AD_PInstance_ID=? " // #2
+ + "ORDER BY pf.AD_Client_ID DESC, pf.IsDefault DESC"; // own first
+ PreparedStatement pstmt = null;
+ ResultSet rs = null;
+ try
+ {
+ pstmt = DB.prepareStatement(sql, null);
+ pstmt.setInt(1, AD_Client_ID);
+ pstmt.setInt(2, pi.getAD_PInstance_ID());
+ rs = pstmt.executeQuery();
+ // Just get first
+ if (rs.next())
+ {
+ AD_ReportView_ID = rs.getInt(1); // required
+ whereClause = rs.getString(2);
+ if (rs.wasNull())
+ whereClause = "";
+ //
+ AD_Table_ID = rs.getInt(3);
+ TableName = rs.getString(4); // required for query
+ AD_PrintFormat_ID = rs.getInt(5); // required
+ IsForm = "Y".equals(rs.getString(6)); // required
+ Client_ID = rs.getInt(7);
+ }
+ }
+ catch (SQLException e1)
+ {
+ log.log(Level.SEVERE, "(1) - " + sql, e1);
+ }
+ finally {
+ DB.close(rs, pstmt);
+ rs = null; pstmt = null;
+ }
+ // Nothing found
+ if (AD_ReportView_ID == 0)
+ {
+ // Check Print format in Report Directly
+ sql = "SELECT t.AD_Table_ID,t.TableName, pf.AD_PrintFormat_ID, pf.IsForm "
+ + "FROM AD_PInstance pi"
+ + " INNER JOIN AD_Process p ON (pi.AD_Process_ID=p.AD_Process_ID)"
+ + " INNER JOIN AD_PrintFormat pf ON (p.AD_PrintFormat_ID=pf.AD_PrintFormat_ID)"
+ + " INNER JOIN AD_Table t ON (pf.AD_Table_ID=t.AD_Table_ID) "
+ + "WHERE pi.AD_PInstance_ID=?";
+ try
+ {
+ pstmt = DB.prepareStatement(sql, null);
+ pstmt.setInt(1, pi.getAD_PInstance_ID());
+ rs = pstmt.executeQuery();
+ if (rs.next())
+ {
+ whereClause = "";
+ AD_Table_ID = rs.getInt(1);
+ TableName = rs.getString(2); // required for query
+ AD_PrintFormat_ID = rs.getInt(3); // required
+ IsForm = "Y".equals(rs.getString(4)); // required
+ Client_ID = AD_Client_ID;
+ }
+ }
+ catch (SQLException e1)
+ {
+ log.log(Level.SEVERE, "(2) - " + sql, e1);
+ }
+ finally {
+ DB.close(rs, pstmt);
+ rs = null; pstmt = null;
+ }
+ if (AD_PrintFormat_ID == 0)
+ {
+ log.log(Level.SEVERE, "Report Info NOT found AD_PInstance_ID=" + pi.getAD_PInstance_ID()
+ + ",AD_Client_ID=" + AD_Client_ID);
+ return null;
+ }
+ }
+
+ // Create Query from Parameters
+ MQuery query = null;
+ if (IsForm && pi.getRecord_ID() != 0) // Form = one record
+ query = MQuery.getEqualQuery(TableName + "_ID", pi.getRecord_ID());
+ else
+ query = MQuery.get (ctx, pi.getAD_PInstance_ID(), TableName);
+
+ // Add to static where clause from ReportView
+ if (whereClause.length() != 0)
+ query.addRestriction(whereClause);
+
+ // Get Print Format
+ MPrintFormat format = null;
+ Object so = pi.getSerializableObject();
+ if (so instanceof MPrintFormat)
+ format = (MPrintFormat)so;
+ if (format == null && AD_PrintFormat_ID != 0)
+ {
+ // We have a PrintFormat with the correct Client
+ if (Client_ID == AD_Client_ID)
+ format = MPrintFormat.get (ctx, AD_PrintFormat_ID, false);
+ else
+ format = MPrintFormat.copyToClient (ctx, AD_PrintFormat_ID, AD_Client_ID);
+ }
+ if (format != null && format.getItemCount() == 0)
+ {
+ log.info("No Items - recreating: " + format);
+ format.delete(true);
+ format = null;
+ }
+ // Create Format
+ if (format == null && AD_ReportView_ID != 0)
+ format = MPrintFormat.createFromReportView(ctx, AD_ReportView_ID, pi.getTitle());
+ if (format == null)
+ return null;
+ //
+ PrintInfo info = new PrintInfo (pi);
+ info.setAD_Table_ID(AD_Table_ID);
+
+ return new ReportEngine(ctx, format, query, info);
+ } // get
+
+ /*************************************************************************/
+
+ /** Order = 0 */
+ public static final int ORDER = 0;
+ /** Shipment = 1 */
+ public static final int SHIPMENT = 1;
+ /** Invoice = 2 */
+ public static final int INVOICE = 2;
+ /** Project = 3 */
+ public static final int PROJECT = 3;
+ /** RfQ = 4 */
+ public static final int RFQ = 4;
+ /** Remittance = 5 */
+ public static final int REMITTANCE = 5;
+ /** Check = 6 */
+ public static final int CHECK = 6;
+ /** Dunning = 7 */
+ public static final int DUNNING = 7;
+ /** Manufacturing Order = 8 */
+ public static final int MANUFACTURING_ORDER = 8;
+ /** Distribution Order = 9 */
+ public static final int DISTRIBUTION_ORDER = 9;
+
+
+ private static final String[] DOC_TABLES = new String[] {
+ "C_Order_Header_v", "M_InOut_Header_v", "C_Invoice_Header_v", "C_Project_Header_v",
+ "C_RfQResponse_v",
+ "C_PaySelection_Check_v", "C_PaySelection_Check_v",
+ "C_DunningRunEntry_v","PP_Order_Header_v","DD_Order_Header_v" };
+ private static final String[] DOC_BASETABLES = new String[] {
+ "C_Order", "M_InOut", "C_Invoice", "C_Project",
+ "C_RfQResponse",
+ "C_PaySelectionCheck", "C_PaySelectionCheck",
+ "C_DunningRunEntry","PP_Order", "DD_Order"};
+ private static final String[] DOC_IDS = new String[] {
+ "C_Order_ID", "M_InOut_ID", "C_Invoice_ID", "C_Project_ID",
+ "C_RfQResponse_ID",
+ "C_PaySelectionCheck_ID", "C_PaySelectionCheck_ID",
+ "C_DunningRunEntry_ID" , "PP_Order_ID" , "DD_Order_ID" };
+ private static final int[] DOC_TABLE_ID = new int[] {
+ X_C_Order.Table_ID, X_M_InOut.Table_ID, X_C_Invoice.Table_ID, X_C_Project.Table_ID,
+ X_C_RfQResponse.Table_ID,
+ X_C_PaySelectionCheck.Table_ID, X_C_PaySelectionCheck.Table_ID,
+ X_C_DunningRunEntry.Table_ID , X_PP_Order.Table_ID ,X_DD_Order.Table_ID };
+
+ /**************************************************************************
+ * Get Document Print Engine for Document Type.
+ * @param ctx context
+ * @param type document type
+ * @param Record_ID id
+ * @return Report Engine or null
+ */
+ public static ReportEngine get (Properties ctx, int type, int Record_ID)
+ {
+ return get(ctx, type, Record_ID, null);
+ }
+
+ /**************************************************************************
+ * Get Document Print Engine for Document Type.
+ * @param ctx context
+ * @param type document type
+ * @param Record_ID id
+ * @param trxName
+ * @return Report Engine or null
+ */
+ public static ReportEngine get (Properties ctx, int type, int Record_ID, String trxName)
+ {
+ if (Record_ID < 1)
+ {
+ log.log(Level.WARNING, "No PrintFormat for Record_ID=" + Record_ID
+ + ", Type=" + type);
+ return null;
+ }
+ // Order - Print Shipment or Invoice
+ if (type == ORDER)
+ {
+ int[] what = getDocumentWhat (Record_ID);
+ if (what != null)
+ {
+ type = what[0];
+ Record_ID = what[1];
+ }
+ } // Order
+
+ int AD_PrintFormat_ID = 0;
+ int C_BPartner_ID = 0;
+ String DocumentNo = null;
+ int copies = 1;
+
+ // Language
+ MClient client = MClient.get(ctx);
+ Language language = client.getLanguage();
+ // Get Document Info
+ String sql = null;
+ if (type == CHECK)
+ sql = "SELECT bad.Check_PrintFormat_ID," // 1
+ + " c.IsMultiLingualDocument,bp.AD_Language,bp.C_BPartner_ID,d.DocumentNo " // 2..5
+ + "FROM C_PaySelectionCheck d"
+ + " INNER JOIN C_PaySelection ps ON (d.C_PaySelection_ID=ps.C_PaySelection_ID)"
+ + " INNER JOIN C_BankAccountDoc bad ON (ps.C_BankAccount_ID=bad.C_BankAccount_ID AND d.PaymentRule=bad.PaymentRule)"
+ + " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)"
+ + " INNER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID) "
+ + "WHERE d.C_PaySelectionCheck_ID=?"; // info from BankAccount
+ else if (type == DUNNING)
+ sql = "SELECT dl.Dunning_PrintFormat_ID,"
+ + " c.IsMultiLingualDocument,bp.AD_Language,bp.C_BPartner_ID,dr.DunningDate "
+ + "FROM C_DunningRunEntry d"
+ + " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)"
+ + " INNER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID)"
+ + " INNER JOIN C_DunningRun dr ON (d.C_DunningRun_ID=dr.C_DunningRun_ID)"
+ + " INNER JOIN C_DunningLevel dl ON (dl.C_DunningLevel_ID=dr.C_DunningLevel_ID) "
+ + "WHERE d.C_DunningRunEntry_ID=?"; // info from Dunning
+ else if (type == REMITTANCE)
+ sql = "SELECT pf.Remittance_PrintFormat_ID,"
+ + " c.IsMultiLingualDocument,bp.AD_Language,bp.C_BPartner_ID,d.DocumentNo "
+ + "FROM C_PaySelectionCheck d"
+ + " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)"
+ + " INNER JOIN AD_PrintForm pf ON (c.AD_Client_ID=pf.AD_Client_ID)"
+ + " INNER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID) "
+ + "WHERE d.C_PaySelectionCheck_ID=?" // info from PrintForm
+ + " AND pf.AD_Org_ID IN (0,d.AD_Org_ID) ORDER BY pf.AD_Org_ID DESC";
+ else if (type == PROJECT)
+ sql = "SELECT pf.Project_PrintFormat_ID,"
+ + " c.IsMultiLingualDocument,bp.AD_Language,bp.C_BPartner_ID,d.Value "
+ + "FROM C_Project d"
+ + " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)"
+ + " INNER JOIN AD_PrintForm pf ON (c.AD_Client_ID=pf.AD_Client_ID)"
+ + " LEFT OUTER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID) "
+ + "WHERE d.C_Project_ID=?" // info from PrintForm
+ + " AND pf.AD_Org_ID IN (0,d.AD_Org_ID) ORDER BY pf.AD_Org_ID DESC";
+ else if (type == MANUFACTURING_ORDER)
+ sql = "SELECT pf.Manuf_Order_PrintFormat_ID,"
+ + " c.IsMultiLingualDocument,bp.AD_Language, 0 , d.DocumentNo "
+ + "FROM PP_Order d"
+ + " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)"
+ + " LEFT OUTER JOIN AD_User u ON (u.AD_User_ID=d.Planner_ID)"
+ + " LEFT OUTER JOIN C_BPartner bp ON (u.C_BPartner_ID=bp.C_BPartner_ID) "
+ + " INNER JOIN AD_PrintForm pf ON (c.AD_Client_ID=pf.AD_Client_ID)"
+ + "WHERE d.PP_Order_ID=?" // info from PrintForm
+ + " AND pf.AD_Org_ID IN (0,d.AD_Org_ID) ORDER BY pf.AD_Org_ID DESC";
+ else if (type == DISTRIBUTION_ORDER)
+ sql = "SELECT pf.Distrib_Order_PrintFormat_ID,"
+ + " c.IsMultiLingualDocument,bp.AD_Language, bp.C_BPartner_ID , d.DocumentNo "
+ + "FROM DD_Order d"
+ + " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)"
+ + " INNER JOIN AD_PrintForm pf ON (c.AD_Client_ID=pf.AD_Client_ID)"
+ + " LEFT OUTER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID) "
+ + "WHERE d.DD_Order_ID=?" // info from PrintForm
+ + " AND pf.AD_Org_ID IN (0,d.AD_Org_ID) ORDER BY pf.AD_Org_ID DESC";
+ else if (type == RFQ)
+ sql = "SELECT COALESCE(t.AD_PrintFormat_ID, pf.AD_PrintFormat_ID),"
+ + " c.IsMultiLingualDocument,bp.AD_Language,bp.C_BPartner_ID,rr.Name "
+ + "FROM C_RfQResponse rr"
+ + " INNER JOIN C_RfQ r ON (rr.C_RfQ_ID=r.C_RfQ_ID)"
+ + " INNER JOIN C_RfQ_Topic t ON (r.C_RfQ_Topic_ID=t.C_RfQ_Topic_ID)"
+ + " INNER JOIN AD_Client c ON (rr.AD_Client_ID=c.AD_Client_ID)"
+ + " INNER JOIN C_BPartner bp ON (rr.C_BPartner_ID=bp.C_BPartner_ID),"
+ + " AD_PrintFormat pf "
+ + "WHERE pf.AD_Client_ID IN (0,rr.AD_Client_ID)"
+ + " AND pf.AD_Table_ID=725 AND pf.IsTableBased='N'" // from RfQ PrintFormat
+ + " AND rr.C_RfQResponse_ID=? " // Info from RfQTopic
+ + "ORDER BY t.AD_PrintFormat_ID, pf.AD_Client_ID DESC, pf.AD_Org_ID DESC";
+ // Fix [2574162] Priority to choose invoice print format not working
+ else if (type == ORDER || type == INVOICE)
+ sql = "SELECT pf.Order_PrintFormat_ID,pf.Shipment_PrintFormat_ID," // 1..2
+ // Prio: 1. BPartner 2. DocType, 3. PrintFormat (Org) // see InvoicePrint
+ + " COALESCE (bp.Invoice_PrintFormat_ID,dt.AD_PrintFormat_ID,pf.Invoice_PrintFormat_ID)," // 3
+ + " pf.Project_PrintFormat_ID, pf.Remittance_PrintFormat_ID," // 4..5
+ + " c.IsMultiLingualDocument, bp.AD_Language," // 6..7
+ + " COALESCE(dt.DocumentCopies,0)+COALESCE(bp.DocumentCopies,1), " // 8
+ + " dt.AD_PrintFormat_ID,bp.C_BPartner_ID,d.DocumentNo " // 9..11
+ + "FROM " + DOC_BASETABLES[type] + " d"
+ + " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)"
+ + " INNER JOIN AD_PrintForm pf ON (c.AD_Client_ID=pf.AD_Client_ID)"
+ + " INNER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID)"
+ + " LEFT OUTER JOIN C_DocType dt ON ((d.C_DocType_ID>0 AND d.C_DocType_ID=dt.C_DocType_ID) OR (d.C_DocType_ID=0 AND d.C_DocTypeTarget_ID=dt.C_DocType_ID)) "
+ + "WHERE d." + DOC_IDS[type] + "=?" // info from PrintForm
+ + " AND pf.AD_Org_ID IN (0,d.AD_Org_ID) "
+ + "ORDER BY pf.AD_Org_ID DESC";
+ else // Get PrintFormat from Org or 0 of document client
+ sql = "SELECT pf.Order_PrintFormat_ID,pf.Shipment_PrintFormat_ID," // 1..2
+ // Prio: 1. BPartner 2. DocType, 3. PrintFormat (Org) // see InvoicePrint
+ + " COALESCE (bp.Invoice_PrintFormat_ID,dt.AD_PrintFormat_ID,pf.Invoice_PrintFormat_ID)," // 3
+ + " pf.Project_PrintFormat_ID, pf.Remittance_PrintFormat_ID," // 4..5
+ + " c.IsMultiLingualDocument, bp.AD_Language," // 6..7
+ + " COALESCE(dt.DocumentCopies,0)+COALESCE(bp.DocumentCopies,1), " // 8
+ + " dt.AD_PrintFormat_ID,bp.C_BPartner_ID,d.DocumentNo, " // 9..11
+ + " pf.Manuf_Order_PrintFormat_ID, pf.Distrib_Order_PrintFormat_ID " // 12..13
+ + "FROM " + DOC_BASETABLES[type] + " d"
+ + " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)"
+ + " INNER JOIN AD_PrintForm pf ON (c.AD_Client_ID=pf.AD_Client_ID)"
+ + " INNER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID)"
+ + " LEFT OUTER JOIN C_DocType dt ON (d.C_DocType_ID=dt.C_DocType_ID) "
+ + "WHERE d." + DOC_IDS[type] + "=?" // info from PrintForm
+ + " AND pf.AD_Org_ID IN (0,d.AD_Org_ID) "
+ + "ORDER BY pf.AD_Org_ID DESC";
+ //
+ PreparedStatement pstmt = null;
+ ResultSet rs = null;
+ try
+ {
+ pstmt = DB.prepareStatement(sql, trxName);
+ pstmt.setInt(1, Record_ID);
+ rs = pstmt.executeQuery();
+ if (rs.next()) // first record only
+ {
+ if (type == CHECK || type == DUNNING || type == REMITTANCE
+ || type == PROJECT || type == RFQ || type == MANUFACTURING_ORDER || type == DISTRIBUTION_ORDER)
+ {
+ AD_PrintFormat_ID = rs.getInt(1);
+ copies = 1;
+ // Set Language when enabled
+ String AD_Language = rs.getString(3);
+ if (AD_Language != null)// && "Y".equals(rs.getString(2))) // IsMultiLingualDocument
+ language = Language.getLanguage(AD_Language);
+ C_BPartner_ID = rs.getInt(4);
+ if (type == DUNNING)
+ {
+ Timestamp ts = rs.getTimestamp(5);
+ DocumentNo = ts.toString();
+ }
+ else
+ DocumentNo = rs.getString(5);
+ }
+ else
+ {
+ // Set PrintFormat
+ AD_PrintFormat_ID = rs.getInt(type+1);
+ if (type != INVOICE && rs.getInt(9) != 0) // C_DocType.AD_PrintFormat_ID
+ AD_PrintFormat_ID = rs.getInt(9);
+ copies = rs.getInt(8);
+ // Set Language when enabled
+ String AD_Language = rs.getString(7);
+ if (AD_Language != null) // && "Y".equals(rs.getString(6))) // IsMultiLingualDocument
+ language = Language.getLanguage(AD_Language);
+ C_BPartner_ID = rs.getInt(10);
+ DocumentNo = rs.getString(11);
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ log.log(Level.SEVERE, "Record_ID=" + Record_ID + ", SQL=" + sql, e);
+ }
+ finally {
+ DB.close(rs, pstmt);
+ rs = null; pstmt = null;
+ }
+ if (AD_PrintFormat_ID == 0)
+ {
+ log.log(Level.SEVERE, "No PrintFormat found for Type=" + type + ", Record_ID=" + Record_ID);
+ return null;
+ }
+
+ // Get Format & Data
+ MPrintFormat format = MPrintFormat.get (ctx, AD_PrintFormat_ID, false);
+ format.setLanguage(language); // BP Language if Multi-Lingual
+ // if (!Env.isBaseLanguage(language, DOC_TABLES[type]))
+ format.setTranslationLanguage(language);
+ // query
+ MQuery query = new MQuery(DOC_TABLES[type]);
+ query.addRestriction(DOC_IDS[type], MQuery.EQUAL, new Integer(Record_ID));
+ // log.config( "ReportCtrl.startDocumentPrint - " + format, query + " - " + language.getAD_Language());
+ //
+ if (DocumentNo == null || DocumentNo.length() == 0)
+ DocumentNo = "DocPrint";
+ PrintInfo info = new PrintInfo(
+ DocumentNo,
+ DOC_TABLE_ID[type],
+ Record_ID,
+ C_BPartner_ID);
+ info.setCopies(copies);
+ info.setDocumentCopy(false); // true prints "Copy" on second
+ info.setPrinterName(format.getPrinterName());
+
+ // Engine
+ ReportEngine re = new ReportEngine(ctx, format, query, info, trxName);
+ return re;
+ } // get
+
+ /**
+ * Determine what Order document to print.
+ * @param C_Order_ID id
+ * @return int Array with [printWhat, ID]
+ */
+ private static int[] getDocumentWhat (int C_Order_ID)
+ {
+ int[] what = new int[2];
+ what[0] = ORDER;
+ what[1] = C_Order_ID;
+ //
+ String sql = "SELECT dt.DocSubTypeSO "
+ + "FROM C_DocType dt, C_Order o "
+ + "WHERE o.C_DocType_ID=dt.C_DocType_ID"
+ + " AND o.C_Order_ID=?";
+ String DocSubTypeSO = null;
+ PreparedStatement pstmt = null;
+ ResultSet rs = null;
+ try
+ {
+ pstmt = DB.prepareStatement(sql, null);
+ pstmt.setInt(1, C_Order_ID);
+ rs = pstmt.executeQuery();
+ if (rs.next())
+ DocSubTypeSO = rs.getString(1);
+ }
+ catch (SQLException e1)
+ {
+ log.log(Level.SEVERE, "(1) - " + sql, e1);
+ return null; // error
+ }
+ finally {
+ DB.close(rs, pstmt);
+ rs = null; pstmt = null;
+ }
+ if (DocSubTypeSO == null)
+ DocSubTypeSO = "";
+ // WalkIn Receipt, WalkIn Invoice,
+ if (DocSubTypeSO.equals("WR") || DocSubTypeSO.equals("WI"))
+ what[0] = INVOICE;
+ // WalkIn Pickup,
+ else if (DocSubTypeSO.equals("WP"))
+ what[0] = SHIPMENT;
+ // Offer Binding, Offer Nonbinding, Standard Order
+ else
+ return what;
+
+ // Get Record_ID of Invoice/Receipt
+ if (what[0] == INVOICE)
+ sql = "SELECT C_Invoice_ID REC FROM C_Invoice WHERE C_Order_ID=?" // 1
+ + " ORDER BY C_Invoice_ID DESC";
+ else
+ sql = "SELECT M_InOut_ID REC FROM M_InOut WHERE C_Order_ID=?" // 1
+ + " ORDER BY M_InOut_ID DESC";
+ try
+ {
+ pstmt = DB.prepareStatement(sql, null);
+ pstmt.setInt(1, C_Order_ID);
+ rs = pstmt.executeQuery();
+ if (rs.next())
+ {
+ // if (i == 1 && ADialog.ask(0, null, what[0] == INVOICE ? "PrintOnlyRecentInvoice?" : "PrintOnlyRecentShipment?")) break;
+ what[1] = rs.getInt(1);
+ }
+ else // No Document Found
+ what[0] = ORDER;
+ }
+ catch (SQLException e2)
+ {
+ log.log(Level.SEVERE, "(2) - " + sql, e2);
+ return null;
+ }
+ finally {
+ DB.close(rs, pstmt);
+ rs = null; pstmt = null;
+ }
+ log.fine("Order => " + what[0] + " ID=" + what[1]);
+ return what;
+ } // getDocumentWhat
+
+ /**
+ * Print Confirm.
+ * Update Date Printed
+ * @param type document type
+ * @param Record_ID record id
+ */
+ public static void printConfirm (int type, int Record_ID)
+ {
+ StringBuffer sql = new StringBuffer();
+ if (type == ORDER || type == SHIPMENT || type == INVOICE)
+ sql.append("UPDATE ").append(DOC_BASETABLES[type])
+ .append(" SET DatePrinted=SysDate, IsPrinted='Y' WHERE ")
+ .append(DOC_IDS[type]).append("=").append(Record_ID);
+ //
+ if (sql.length() > 0)
+ {
+ int no = DB.executeUpdate(sql.toString(), null);
+ if (no != 1)
+ log.log(Level.SEVERE, "Updated records=" + no + " - should be just one");
+ }
+ } // printConfirm
+
+
+ /*************************************************************************
+ * Test
+ * @param args args
+ */
+ public static void main(String[] args)
+ {
+ org.compiere.Adempiere.startupEnvironment(true);
+ //
+ int AD_Table_ID = 100;
+ MQuery q = new MQuery("AD_Table");
+ q.addRestriction("AD_Table_ID", "<", 108);
+ //
+ MPrintFormat f = MPrintFormat.createFromTable(Env.getCtx(), AD_Table_ID);
+ PrintInfo i = new PrintInfo("test", AD_Table_ID, 108, 0);
+ i.setAD_Table_ID(AD_Table_ID);
+ ReportEngine re = new ReportEngine(Env.getCtx(), f, q, i);
+ re.layout();
+ /**
+ re.createCSV(new File("C:\\Temp\\test.csv"), ',', Language.getLanguage());
+ re.createHTML(new File("C:\\Temp\\test.html"), false, Language.getLanguage());
+ re.createXML(new File("C:\\Temp\\test.xml"));
+ re.createPS(new File ("C:\\Temp\\test.ps"));
+ re.createPDF(new File("C:\\Temp\\test.pdf"));
+ /****/
+ re.print();
+ // re.print(true, 1, false, "Epson Stylus COLOR 900 ESC/P 2"); // Dialog
+ // re.print(true, 1, false, "HP LaserJet 3300 Series PCL 6"); // Dialog
+ // re.print(false, 1, false, "Epson Stylus COLOR 900 ESC/P 2"); // Dialog
+ System.exit(0);
+ } // main
+
+} // ReportEngine