1 14 package org.compiere.apps.form; 15 16 import java.awt.BorderLayout ; 17 import java.awt.Cursor ; 18 import java.awt.FlowLayout ; 19 import java.awt.event.ActionEvent ; 20 import java.awt.event.ActionListener ; 21 import java.beans.PropertyChangeEvent ; 22 import java.beans.VetoableChangeListener ; 23 import java.math.BigDecimal ; 24 import java.sql.PreparedStatement ; 25 import java.sql.ResultSet ; 26 import java.sql.SQLException ; 27 import java.sql.Timestamp ; 28 import java.util.ArrayList ; 29 30 import javax.swing.JScrollPane ; 31 import javax.swing.event.ChangeEvent ; 32 import javax.swing.event.ChangeListener ; 33 import javax.swing.event.TableModelEvent ; 34 import javax.swing.event.TableModelListener ; 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 67 public class VInvoiceGen extends CPanel 68 implements FormPanel, ActionListener , VetoableChangeListener , ChangeListener , TableModelListener , ASyncProcess 69 { 70 73 public VInvoiceGen() 74 { 75 } 77 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 ex) 97 { 98 Log.error("VInvoiceGen,init", ex); 99 } 100 } 102 103 private int m_WindowNo = 0; 104 105 private FormFrame m_frame; 106 107 private boolean m_selectionActive = true; 108 private String m_whereClause; 109 private Object m_AD_Org_ID = null; 110 private Object m_C_BPartner_ID = null; 111 private CTabbedPane tabbedPane = new CTabbedPane(); 113 private CPanel selPanel = new CPanel(); 114 private CPanel selNorthPanel = new CPanel(); 115 private BorderLayout selPanelLayout = new BorderLayout (); 116 private CLabel lOrg = new CLabel(); 117 private VLookup fOrg; 118 private CLabel lBPartner = new CLabel(); 119 private VLookup fBPartner; 120 private FlowLayout northPanelLayout = new FlowLayout (); 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 genLayout = new BorderLayout (); 126 private CText info = new CText(); 127 private JScrollPane scrollPane = new JScrollPane (); 128 private MiniTable miniTable = new MiniTable(); 129 130 141 void jbInit() throws Exception 142 { 143 CompiereColor.setBackground(this); 144 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 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 } 176 181 private void fillPicks() throws Exception 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 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 } 194 199 private void dynInit() 200 { 201 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 miniTable.setMultiSelection(true); 211 miniTable.setRowSelectionAllowed(true); 212 miniTable.setColumnClass(0, IDColumn.class, false, " "); 214 miniTable.setColumnClass(1, String .class, true, Msg.translate(Env.getCtx(), "AD_Org_ID")); 215 miniTable.setColumnClass(2, String .class, true, Msg.translate(Env.getCtx(), "C_DocType_ID")); 216 miniTable.setColumnClass(3, String .class, true, Msg.translate(Env.getCtx(), "DocumentNo")); 217 miniTable.setColumnClass(4, String .class, true, Msg.translate(Env.getCtx(), "C_BPartner_ID")); 218 miniTable.setColumnClass(5, Timestamp .class, true, Msg.translate(Env.getCtx(), "DateOrdered")); 219 miniTable.setColumnClass(6, BigDecimal .class, true, Msg.translate(Env.getCtx(), "TotalLines")); 220 miniTable.autoSize(); 222 miniTable.getModel().addTableModelListener(this); 223 statusBar.setStatusLine(Msg.getMsg(Env.getCtx(), "InvGenerateSel")); 225 statusBar.setStatusDB(" "); 226 tabbedPane.addChangeListener(this); 228 } 230 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 StringBuffer sql = new StringBuffer ( 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 sql.append(" ORDER BY o.Name,bp.Name,DateOrdered"); 252 254 int row = 0; 256 miniTable.setRowCount(row); 257 try 259 { 260 PreparedStatement pstmt = DB.prepareStatement(sql.toString()); 261 pstmt.setInt(1, AD_Client_ID); 262 ResultSet rs = pstmt.executeQuery(); 263 while (rs.next()) 265 { 266 miniTable.setRowCount(row+1); 268 miniTable.setValueAt(new IDColumn(rs.getInt(1)), row, 0); miniTable.setValueAt(rs.getString(2), row, 1); miniTable.setValueAt(rs.getString(3), row, 2); miniTable.setValueAt(rs.getString(4), row, 3); miniTable.setValueAt(rs.getString(5), row, 4); miniTable.setValueAt(rs.getTimestamp(6), row, 5); miniTable.setValueAt(rs.getBigDecimal(7), row, 6); row++; 278 } 279 rs.close(); 280 pstmt.close(); 281 } 282 catch (SQLException e) 283 { 284 Log.error("VInvoiceGen.executeQuery", e); 285 } 286 miniTable.autoSize(); 288 } 291 294 public void dispose() 295 { 296 m_frame.dispose(); 297 } 299 303 public void actionPerformed (ActionEvent e) 304 { 305 Log.trace(Log.l1_User, "VInvoiceGen.actionPerformed - " + e.getActionCommand()); 306 if (e.getActionCommand().equals(ConfirmPanel.A_CANCEL)) 308 { 309 dispose(); 310 return; 311 } 312 m_whereClause = saveSelection(); 314 if (m_whereClause.length() > 0 && m_selectionActive) 315 generateInvoices (); 316 else 317 dispose(); 318 } 320 324 public void vetoableChange(PropertyChangeEvent 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); } 335 executeQuery(); 336 } 338 342 public void stateChanged (ChangeEvent e) 343 { 344 int index = tabbedPane.getSelectedIndex(); 345 m_selectionActive = (index == 0); 346 } 348 352 public void tableChanged(TableModelEvent 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); if (id != null && id.isSelected()) 360 rowsSelected++; 361 } 362 statusBar.setStatusDB(" " + rowsSelected + " "); 363 } 365 369 private String saveSelection() 370 { 371 Log.trace(Log.l1_User, "VInvoiceGen.saveSelection"); 372 miniTable.editingStopped(new ChangeEvent (this)); 374 ArrayList results = new ArrayList (); 376 377 int rows = miniTable.getRowCount(); 379 for (int i = 0; i < rows; i++) 380 { 381 IDColumn id = (IDColumn)miniTable.getValueAt(i, 0); if (id != null && id.isSelected()) 384 results.add(id.getRecord_ID()); 385 } 386 387 if (results.size() == 0) 388 return ""; 389 390 String keyColumn = "C_Order_ID"; 392 StringBuffer sb = new StringBuffer (keyColumn); 393 if (results.size() > 1) 394 sb.append(" IN ("); 395 else 396 sb.append("="); 397 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 Log.trace(Log.l4_Data, "VInvoiceGen.saveSelection", sb.toString()); 412 return sb.toString(); 413 } 415 416 417 420 private void generateInvoices () 421 { 422 String 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 sql = "UPDATE C_Order SET IsSelected = 'Y' WHERE " + m_whereClause; 431 no = DB.executeUpdate(sql); 432 if (no == 0) 433 { 434 String msg = "No Invoices"; 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; statusBar.setStatusLine(Msg.getMsg(Env.getCtx(), "InvGenerateGen")); 443 statusBar.setStatusDB(String.valueOf(no)); 444 445 ProcessInfo pi = new ProcessInfo ("", 134, 0); 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 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 msg = "No Parameter added"; info.setText(msg); 462 Log.error("VInvoiceGen.generateInvoice - " + msg); 463 return; 464 } 465 466 ProcessCtl worker = new ProcessCtl(this, pi); 468 worker.start(); } 471 476 private void generateInvoice_complete (ProcessInfo pi) 477 { 478 tabbedPane.setSelectedIndex(1); 480 ProcessInfoUtil.setLogFromDB(pi); 482 info.setText(pi.getSummary()); 483 info.append("\n("); 484 info.append(Msg.getMsg(Env.getCtx(), "InvGenerateInfo")); 485 info.append(")"); 487 488 String 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 int[] ids = pi.getIDs(); 495 if (ids == null || ids.length == 0) 496 return; 497 498 confirmPanelGen.getOKButton().setEnabled(false); 499 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 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 } 517 confirmPanelGen.getOKButton().setEnabled(true); 519 } 521 522 523 528 public void lockUI (ProcessInfo pi) 529 { 530 this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 531 this.setEnabled(false); 532 } 534 539 public void unlockUI (ProcessInfo pi) 540 { 541 this.setEnabled(true); 542 this.setCursor(Cursor.getDefaultCursor()); 543 generateInvoice_complete(pi); 545 } 547 551 public boolean isUILocked() 552 { 553 return this.isEnabled(); 554 } 556 561 public void executeASync (ProcessInfo pi) 562 { 563 } 565 } | Popular Tags |