KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > compiere > apps > form > VInvoiceGen


1 /******************************************************************************
2  * The contents of this file are subject to the Compiere License Version 1.1
3  * ("License"); You may not use this file except in compliance with the License
4  * You may obtain a copy of the License at http://www.compiere.org/license.html
5  * Software distributed under the License is distributed on an "AS IS" basis,
6  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
7  * the specific language governing rights and limitations under the License.
8  * The Original Code is Compiere ERP & CRM Business Solution
9  * The Initial Developer of the Original Code is Jorg Janke and ComPiere, Inc.
10  * Portions created by Jorg Janke are Copyright (C) 1999-2001 Jorg Janke, parts
11  * created by ComPiere are Copyright (C) ComPiere, Inc.; All Rights Reserved.
12  * Contributor(s): ______________________________________.
13  *****************************************************************************/

14 package org.compiere.apps.form;
15
16 import java.awt.BorderLayout JavaDoc;
17 import java.awt.Cursor JavaDoc;
18 import java.awt.FlowLayout JavaDoc;
19 import java.awt.event.ActionEvent JavaDoc;
20 import java.awt.event.ActionListener JavaDoc;
21 import java.beans.PropertyChangeEvent JavaDoc;
22 import java.beans.VetoableChangeListener JavaDoc;
23 import java.math.BigDecimal JavaDoc;
24 import java.sql.PreparedStatement JavaDoc;
25 import java.sql.ResultSet JavaDoc;
26 import java.sql.SQLException JavaDoc;
27 import java.sql.Timestamp JavaDoc;
28 import java.util.ArrayList JavaDoc;
29
30 import javax.swing.JScrollPane JavaDoc;
31 import javax.swing.event.ChangeEvent JavaDoc;
32 import javax.swing.event.ChangeListener JavaDoc;
33 import javax.swing.event.TableModelEvent JavaDoc;
34 import javax.swing.event.TableModelListener JavaDoc;
35
36 import org.compiere.apps.ADialog;
37 import org.compiere.apps.ConfirmPanel;
38 import org.compiere.apps.ProcessCtl;
39 import org.compiere.apps.StatusBar;
40 import org.compiere.grid.ed.VLookup;
41 import org.compiere.minigrid.IDColumn;
42 import org.compiere.minigrid.MiniTable;
43 import org.compiere.model.*;
44 import org.compiere.plaf.CompiereColor;
45 import org.compiere.plaf.CompierePLAF;
46 import org.compiere.print.ReportCtl;
47 import org.compiere.process.ProcessInfo;
48 import org.compiere.process.ProcessInfoUtil;
49 import org.compiere.swing.CLabel;
50 import org.compiere.swing.CPanel;
51 import org.compiere.swing.CTabbedPane;
52 import org.compiere.swing.CText;
53 import org.compiere.util.ASyncProcess;
54 import org.compiere.util.Access;
55 import org.compiere.util.DB;
56 import org.compiere.util.DisplayType;
57 import org.compiere.util.Env;
58 import org.compiere.util.Log;
59 import org.compiere.util.Msg;
60
61 /**
62  * Manual Invoice Selection
63  *
64  * @author Jorg Janke
65  * @version $Id: VInvoiceGen.java,v 1.30 2003/11/07 06:36:56 jjanke Exp $
66  */

67 public class VInvoiceGen extends CPanel
68     implements FormPanel, ActionListener JavaDoc, VetoableChangeListener JavaDoc, ChangeListener JavaDoc, TableModelListener JavaDoc, ASyncProcess
69 {
70     /**
71      * Standard Constructor
72      */

73     public VInvoiceGen()
74     {
75     } // VInvoiceGen
76

77     /**
78      * Initialize Panel
79      * @param WindowNo window
80      * @param frame frame
81      */

82     public void init (int WindowNo, FormFrame frame)
83     {
84         Log.trace(Log.l1_User, "VInvoiceGen.init");
85         m_WindowNo = WindowNo;
86         m_frame = frame;
87         Env.setContext(Env.getCtx(), m_WindowNo, "IsSOTrx", "Y");
88         try
89         {
90             fillPicks();
91             jbInit();
92             dynInit();
93             frame.getContentPane().add(tabbedPane, BorderLayout.CENTER);
94             frame.getContentPane().add(statusBar, BorderLayout.SOUTH);
95         }
96         catch(Exception JavaDoc ex)
97         {
98             Log.error("VInvoiceGen,init", ex);
99         }
100     } // init
101

102     /** Window No */
103     private int m_WindowNo = 0;
104     /** FormFrame */
105     private FormFrame m_frame;
106
107     private boolean m_selectionActive = true;
108     private String JavaDoc m_whereClause;
109     private Object JavaDoc m_AD_Org_ID = null;
110     private Object JavaDoc m_C_BPartner_ID = null;
111     //
112
private CTabbedPane tabbedPane = new CTabbedPane();
113     private CPanel selPanel = new CPanel();
114     private CPanel selNorthPanel = new CPanel();
115     private BorderLayout JavaDoc selPanelLayout = new BorderLayout JavaDoc();
116     private CLabel lOrg = new CLabel();
117     private VLookup fOrg;
118     private CLabel lBPartner = new CLabel();
119     private VLookup fBPartner;
120     private FlowLayout JavaDoc northPanelLayout = new FlowLayout JavaDoc();
121     private ConfirmPanel confirmPanelSel = new ConfirmPanel(true);
122     private ConfirmPanel confirmPanelGen = new ConfirmPanel(false, true, false, false, false, false, true);
123     private StatusBar statusBar = new StatusBar();
124     private CPanel genPanel = new CPanel();
125     private BorderLayout JavaDoc genLayout = new BorderLayout JavaDoc();
126     private CText info = new CText();
127     private JScrollPane JavaDoc scrollPane = new JScrollPane JavaDoc();
128     private MiniTable miniTable = new MiniTable();
129
130     /**
131      * Static Init.
132      * <pre>
133      * selPanel (tabbed)
134      * fOrg, fBPartner
135      * scrollPane & miniTable
136      * genPanel
137      * info
138      * </pre>
139      * @throws Exception
140      */

141     void jbInit() throws Exception JavaDoc
142     {
143         CompiereColor.setBackground(this);
144         //
145
selPanel.setLayout(selPanelLayout);
146         lOrg.setLabelFor(fOrg);
147         lOrg.setText("Org");
148         lBPartner.setLabelFor(fBPartner);
149         lBPartner.setText("BPartner");
150         selNorthPanel.setLayout(northPanelLayout);
151         northPanelLayout.setAlignment(FlowLayout.LEFT);
152         tabbedPane.add(selPanel, Msg.getMsg(Env.getCtx(), "Select"));
153         selPanel.add(selNorthPanel, BorderLayout.NORTH);
154         selNorthPanel.add(lOrg, null);
155         selNorthPanel.add(fOrg, null);
156         selNorthPanel.add(lBPartner, null);
157         selNorthPanel.add(fBPartner, null);
158         selPanel.setName("selPanel");
159         selPanel.add(confirmPanelSel, BorderLayout.SOUTH);
160         selPanel.add(scrollPane, BorderLayout.CENTER);
161         scrollPane.getViewport().add(miniTable, null);
162         confirmPanelSel.addActionListener(this);
163         //
164
tabbedPane.add(genPanel, Msg.getMsg(Env.getCtx(), "Generate"));
165         genPanel.setLayout(genLayout);
166         genPanel.add(info, BorderLayout.CENTER);
167         genPanel.setEnabled(false);
168         info.setWrapStyleWord(true);
169         info.setLineWrap(true);
170         info.setBackground(CompierePLAF.getFieldBackground_Inactive());
171         info.setEditable(false);
172         genPanel.add(confirmPanelGen, BorderLayout.SOUTH);
173         confirmPanelGen.addActionListener(this);
174     } // jbInit
175

176     /**
177      * Fill Picks
178      * Column_ID from C_Order
179      * @throws Exception if Lookups cannot be initialized
180      */

181     private void fillPicks() throws Exception JavaDoc
182     {
183         MLookup orgL = MLookupFactory.get (Env.getCtx(), m_WindowNo, 0, 2163, DisplayType.TableDir);
184         fOrg = new VLookup ("AD_Org_ID", false, false, true, orgL, DisplayType.TableDir, m_WindowNo);
185         lOrg.setText(Msg.translate(Env.getCtx(), "AD_Org_ID"));
186         fOrg.addVetoableChangeListener(this);
187         //
188
MLookup bpL = MLookupFactory.get (Env.getCtx(), m_WindowNo, 0, 2762, DisplayType.Search);
189         fBPartner = new VLookup ("C_BPartner_ID", false, false, true, bpL, DisplayType.Search, m_WindowNo);
190         lBPartner.setText(Msg.translate(Env.getCtx(), "C_BPartner_ID"));
191         fBPartner.addVetoableChangeListener(this);
192     } // fillPicks
193

194     /**
195      * Dynamic Init.
196      * - Create GridController & Panel
197      * - AD_Column_ID from C_Order
198      */

199     private void dynInit()
200     {
201         // create Columns
202
miniTable.addColumn("C_Order_ID");
203         miniTable.addColumn("AD_Org_ID");
204         miniTable.addColumn("C_DocType_ID");
205         miniTable.addColumn("DocumentNo");
206         miniTable.addColumn("C_BPartner_ID");
207         miniTable.addColumn("DateOrdered");
208         miniTable.addColumn("TotalLines");
209         //
210
miniTable.setMultiSelection(true);
211         miniTable.setRowSelectionAllowed(true);
212         // set details
213
miniTable.setColumnClass(0, IDColumn.class, false, " ");
214         miniTable.setColumnClass(1, String JavaDoc.class, true, Msg.translate(Env.getCtx(), "AD_Org_ID"));
215         miniTable.setColumnClass(2, String JavaDoc.class, true, Msg.translate(Env.getCtx(), "C_DocType_ID"));
216         miniTable.setColumnClass(3, String JavaDoc.class, true, Msg.translate(Env.getCtx(), "DocumentNo"));
217         miniTable.setColumnClass(4, String JavaDoc.class, true, Msg.translate(Env.getCtx(), "C_BPartner_ID"));
218         miniTable.setColumnClass(5, Timestamp JavaDoc.class, true, Msg.translate(Env.getCtx(), "DateOrdered"));
219         miniTable.setColumnClass(6, BigDecimal JavaDoc.class, true, Msg.translate(Env.getCtx(), "TotalLines"));
220         //
221
miniTable.autoSize();
222         miniTable.getModel().addTableModelListener(this);
223         // Info
224
statusBar.setStatusLine(Msg.getMsg(Env.getCtx(), "InvGenerateSel"));
225         statusBar.setStatusDB(" ");
226         // Tabbed Pane Listener
227
tabbedPane.addChangeListener(this);
228     } // dynInit
229

230     /**
231      * Query Info
232      */

233     private void executeQuery()
234     {
235         Log.trace(Log.l1_User, "VInvoiceGen.executeQuery");
236         int AD_Client_ID = Integer.parseInt(Env.getContext(Env.getCtx(), "#AD_Client_ID"));
237         // Create SQL
238
StringBuffer JavaDoc sql = new StringBuffer JavaDoc(
239             "SELECT C_Order_ID, o.Name, dt.Name, DocumentNo, bp.Name, DateOrdered, TotalLines "
240             + "FROM C_Invoice_Candidate_v ic, AD_Org o, C_BPartner bp, C_DocType dt "
241             + "WHERE ic.AD_Org_ID=o.AD_Org_ID"
242             + " AND ic.C_BPartner_ID=bp.C_BPartner_ID"
243             + " AND ic.C_DocType_ID=dt.C_DocType_ID"
244             + " AND ic.AD_Client_ID=?");
245
246         if (m_AD_Org_ID != null)
247             sql.append(" AND ic.AD_Org_ID=").append(m_AD_Org_ID);
248         if (m_C_BPartner_ID != null)
249             sql.append(" AND ic.C_BPartner_ID=").append(m_C_BPartner_ID);
250         //
251
sql.append(" ORDER BY o.Name,bp.Name,DateOrdered");
252     // Log.trace(Log.l5_DData, "VInvoiceGen.executeQuery - AD_Client_ID=" + AD_Client_ID, sql.toString());
253

254         // reset table
255
int row = 0;
256         miniTable.setRowCount(row);
257         // Execute
258
try
259         {
260             PreparedStatement JavaDoc pstmt = DB.prepareStatement(sql.toString());
261             pstmt.setInt(1, AD_Client_ID);
262             ResultSet JavaDoc rs = pstmt.executeQuery();
263             //
264
while (rs.next())
265             {
266                 // extend table
267
miniTable.setRowCount(row+1);
268                 // set values
269
miniTable.setValueAt(new IDColumn(rs.getInt(1)), row, 0); // C_Order_ID
270
miniTable.setValueAt(rs.getString(2), row, 1); // Org
271
miniTable.setValueAt(rs.getString(3), row, 2); // DocType
272
miniTable.setValueAt(rs.getString(4), row, 3); // Doc No
273
miniTable.setValueAt(rs.getString(5), row, 4); // BPartner
274
miniTable.setValueAt(rs.getTimestamp(6), row, 5); // DateOrdered
275
miniTable.setValueAt(rs.getBigDecimal(7), row, 6); // TotalLines
276
// prepare next
277
row++;
278             }
279             rs.close();
280             pstmt.close();
281         }
282         catch (SQLException JavaDoc e)
283         {
284             Log.error("VInvoiceGen.executeQuery", e);
285         }
286         //
287
miniTable.autoSize();
288     // statusBar.setStatusDB(String.valueOf(miniTable.getRowCount()));
289
} // executeQuery
290

291     /**
292      * Dispose
293      */

294     public void dispose()
295     {
296         m_frame.dispose();
297     } // dispose
298

299     /**
300      * Action Listener
301      * @param e event
302      */

303     public void actionPerformed (ActionEvent JavaDoc e)
304     {
305         Log.trace(Log.l1_User, "VInvoiceGen.actionPerformed - " + e.getActionCommand());
306         //
307
if (e.getActionCommand().equals(ConfirmPanel.A_CANCEL))
308         {
309             dispose();
310             return;
311         }
312         //
313
m_whereClause = saveSelection();
314         if (m_whereClause.length() > 0 && m_selectionActive)
315             generateInvoices ();
316         else
317             dispose();
318     } // actionPerformed
319

320     /**
321      * Vetoable Change Listener - requery
322      * @param e event
323      */

324     public void vetoableChange(PropertyChangeEvent JavaDoc e)
325     {
326         Log.trace(Log.l1_User, "VInvoiceGen.vetoableChange - "
327             + e.getPropertyName() + "=" + e.getNewValue());
328         if (e.getPropertyName().equals("AD_Org_ID"))
329             m_AD_Org_ID = e.getNewValue();
330         if (e.getPropertyName().equals("C_BPartner_ID"))
331         {
332             m_C_BPartner_ID = e.getNewValue();
333             fBPartner.setValue(m_C_BPartner_ID); // display value
334
}
335         executeQuery();
336     } // vetoableChange
337

338     /**
339      * Change Listener (Tab changed)
340      * @param e event
341      */

342     public void stateChanged (ChangeEvent JavaDoc e)
343     {
344         int index = tabbedPane.getSelectedIndex();
345         m_selectionActive = (index == 0);
346     } // stateChanged
347

348     /**
349      * Table Model Listener
350      * @param e event
351      */

352     public void tableChanged(TableModelEvent JavaDoc e)
353     {
354         int rowsSelected = 0;
355         int rows = miniTable.getRowCount();
356         for (int i = 0; i < rows; i++)
357         {
358             IDColumn id = (IDColumn)miniTable.getValueAt(i, 0); // ID in column 0
359
if (id != null && id.isSelected())
360                 rowsSelected++;
361         }
362         statusBar.setStatusDB(" " + rowsSelected + " ");
363     } // tableChanged
364

365     /**
366      * Save Selection & return selecion Query or ""
367      * @return where clause like C_Order_ID IN (...)
368      */

369     private String JavaDoc saveSelection()
370     {
371         Log.trace(Log.l1_User, "VInvoiceGen.saveSelection");
372         // ID selection may be pending
373
miniTable.editingStopped(new ChangeEvent JavaDoc(this));
374         // Array of Integers
375
ArrayList JavaDoc results = new ArrayList JavaDoc();
376
377         // Get selected entries
378
int rows = miniTable.getRowCount();
379         for (int i = 0; i < rows; i++)
380         {
381             IDColumn id = (IDColumn)miniTable.getValueAt(i, 0); // ID in column 0
382
// Log.trace(Log.l6_Database, "Row=" + i + " - " + id);
383
if (id != null && id.isSelected())
384                 results.add(id.getRecord_ID());
385         }
386
387         if (results.size() == 0)
388             return "";
389
390         // Query String
391
String JavaDoc keyColumn = "C_Order_ID";
392         StringBuffer JavaDoc sb = new StringBuffer JavaDoc(keyColumn);
393         if (results.size() > 1)
394             sb.append(" IN (");
395         else
396             sb.append("=");
397         // Add elements
398
for (int i = 0; i < results.size(); i++)
399         {
400             if (i > 0)
401                 sb.append(",");
402             if (keyColumn.endsWith("_ID"))
403                 sb.append(results.get(i).toString());
404             else
405                 sb.append("'").append(results.get(i).toString());
406         }
407
408         if (results.size() > 1)
409             sb.append(")");
410         //
411
Log.trace(Log.l4_Data, "VInvoiceGen.saveSelection", sb.toString());
412         return sb.toString();
413     } // saveSelection
414

415     /*************************************************************************/
416
417     /**
418      * Generate Invoices
419      */

420     private void generateInvoices ()
421     {
422         // Reset Selection
423
String JavaDoc sql = "UPDATE C_Order SET IsSelected = 'N' WHERE IsSelected='Y'"
424             + " AND AD_Client_ID=" + Env.getAD_Client_ID(Env.getCtx())
425             + " AND AD_Org_ID=" + Env.getAD_Org_ID(Env.getCtx());
426         int no = DB.executeUpdate(sql);
427         Log.trace(Log.l3_Util, "VInvoiceGen.generateInvoices - Reset=" + no);
428
429         // Set Selection
430
sql = "UPDATE C_Order SET IsSelected = 'Y' WHERE " + m_whereClause;
431         no = DB.executeUpdate(sql);
432         if (no == 0)
433         {
434             String JavaDoc msg = "No Invoices"; // not translated!
435
Log.trace(Log.l2_Sub, "VInvoiceGen.generateInvoice", msg);
436             info.setText(msg);
437             return;
438         }
439         Log.trace(Log.l3_Util, "VInvoiceGen.generateInvoices - Set=" + no);
440
441         m_selectionActive = false; // prevents from being called twice
442
statusBar.setStatusLine(Msg.getMsg(Env.getCtx(), "InvGenerateGen"));
443         statusBar.setStatusDB(String.valueOf(no));
444
445         // Prepare Process
446
ProcessInfo pi = new ProcessInfo ("", 134, 0); // HARDCODED C_Invoice_Create0
447
pi.setAD_PInstance_ID (ProcessCtl.getInstanceID (m_WindowNo, pi.getAD_Process_ID(), pi.getRecord_ID()));
448         if (pi.getAD_PInstance_ID() == 0)
449         {
450             info.setText(Msg.getMsg(Env.getCtx(), "ProcessNoInstance"));
451             return;
452         }
453
454         // Add Parameter
455
sql = "INSERT INTO AD_PInstance_Para (AD_PInstance_ID,SeqNo,ParameterName, P_STRING) "
456             + "VALUES (" + pi.getAD_PInstance_ID() + ",1,'Selection', 'Y')";
457         no = DB.executeUpdate(sql);
458         if (no == 0)
459         {
460             String JavaDoc msg = "No Parameter added"; // not translated
461
info.setText(msg);
462             Log.error("VInvoiceGen.generateInvoice - " + msg);
463             return;
464         }
465
466         // Execute Process
467
ProcessCtl worker = new ProcessCtl(this, pi);
468         worker.start(); // complete tasks in unlockUI / generateInvoice_complete
469
} // generateInvoices
470

471     /**
472      * Complete generating invoices.
473      * Called from Unlock UI
474      * @param pi process info
475      */

476     private void generateInvoice_complete (ProcessInfo pi)
477     {
478         // Switch Tabs
479
tabbedPane.setSelectedIndex(1);
480         //
481
ProcessInfoUtil.setLogFromDB(pi);
482         info.setText(pi.getSummary());
483         info.append("\n(");
484         info.append(Msg.getMsg(Env.getCtx(), "InvGenerateInfo"));
485         // Invoices are generated depending on the Invoicing Rule selection in the Order
486
info.append(")");
487
488         // Reset Selection
489
String JavaDoc sql = "UPDATE C_Order SET IsSelected = 'N' WHERE " + m_whereClause;
490         int no = DB.executeUpdate(sql);
491         Log.trace(Log.l3_Util, "VInvoiceGen.generateInvoices_complete - Reset=" + no);
492
493         // Get results
494
int[] ids = pi.getIDs();
495         if (ids == null || ids.length == 0)
496             return;
497
498         confirmPanelGen.getOKButton().setEnabled(false);
499         // OK to print invoices
500
if (ADialog.ask(m_WindowNo, this, "PrintInvoices"))
501         {
502             info.append("\n\n" + Msg.getMsg(Env.getCtx(), "PrintInvoices"));
503             setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
504             do
505             {
506                 // Loop through all items
507
for (int i = 0; i < ids.length; i++)
508                 {
509                     int AD_Invoice_ID = ids[i];
510                     ReportCtl.startDocumentPrint(ReportCtl.INVOICE, AD_Invoice_ID, true);
511                 }
512             }
513             while (!ADialog.ask(m_WindowNo, this, "PrintoutOK?"));
514             setCursor(Cursor.getDefaultCursor());
515         } // OK to print invoices
516

517         //
518
confirmPanelGen.getOKButton().setEnabled(true);
519     } // generateInvoices_complete
520

521     /*************************************************************************/
522
523     /**
524      * Lock User Interface.
525      * Called from the Worker before processing
526      * @param pi process info
527      */

528     public void lockUI (ProcessInfo pi)
529     {
530         this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
531         this.setEnabled(false);
532     } // lockUI
533

534     /**
535      * Unlock User Interface.
536      * Called from the Worker when processing is done
537      * @param pi result of execute ASync call
538      */

539     public void unlockUI (ProcessInfo pi)
540     {
541         this.setEnabled(true);
542         this.setCursor(Cursor.getDefaultCursor());
543         //
544
generateInvoice_complete(pi);
545     } // unlockUI
546

547     /**
548      * Is the UI locked (Internal method)
549      * @return true, if UI is locked
550      */

551     public boolean isUILocked()
552     {
553         return this.isEnabled();
554     } // isUILocked
555

556     /**
557      * Method to be executed async.
558      * Called from the Worker
559      * @param pi ProcessInfo
560      */

561     public void executeASync (ProcessInfo pi)
562     {
563     } // executeASync
564

565 } // VInvoiceGen
566
Popular Tags