KickJava   Java API By Example, From Geeks To Geeks.

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


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 Smart 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-2003 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 Shipment Selection
63  *
64  * @author Jorg Janke
65  * @version $Id: VInOutGen.java,v 1.13 2003/11/06 07:08:28 jjanke Exp $
66  */

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

73     public VInOutGen()
74     {
75     } // VInOutGen
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, "VInOutGen.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("VInOutGen,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(), "InOutGenerateSel"));//@@
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, "VInOutGen.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 M_InOut_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, "VInOutGen.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("VInOutGen.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, "VInOutGen.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             generateShipments ();
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, "VInOutGen.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, "VInOutGen.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, "VInOutGen.saveSelection", sb.toString());
412         return sb.toString();
413     } // saveSelection
414

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

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

473     /**
474      * Complete generating shipments.
475      * Called from Unlock UI
476      * @param pi process info
477      */

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

520         //
521
confirmPanelGen.getOKButton().setEnabled(true);
522     } // generateShipments_complete
523

524     /*************************************************************************/
525
526     /**
527      * Lock User Interface.
528      * Called from the Worker before processing
529      * @param pi process info
530      */

531     public void lockUI (ProcessInfo pi)
532     {
533         this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
534         this.setEnabled(false);
535     } // lockUI
536

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

542     public void unlockUI (ProcessInfo pi)
543     {
544         this.setEnabled(true);
545         this.setCursor(Cursor.getDefaultCursor());
546         //
547
generateShipments_complete(pi);
548     } // unlockUI
549

550     /**
551      * Is the UI locked (Internal method)
552      * @return true, if UI is locked
553      */

554     public boolean isUILocked()
555     {
556         return this.isEnabled();
557     } // isUILocked
558

559     /**
560      * Method to be executed async.
561      * Called from the Worker
562      * @param pi ProcessInfo
563      */

564     public void executeASync (ProcessInfo pi)
565     {
566     } // executeASync
567

568 } // VInOutGen
569
Popular Tags