1 14 package org.compiere.print; 15 16 import java.sql.*; 17 18 import org.compiere.apps.*; 19 import org.compiere.model.*; 20 import org.compiere.util.*; 21 import org.compiere.process.*; 22 23 29 public class ReportCtl 30 { 31 34 private ReportCtl() 35 { 36 } 38 47 static public boolean start (ProcessInfo pi, boolean IsDirectPrint) 48 { 49 Log.trace(Log.l2_Sub, "ReportCtl.start", pi); 50 51 54 if (pi.getAD_Process_ID() == 110) return startDocumentPrint(ORDER, pi.getRecord_ID(), IsDirectPrint); 56 else if (pi.getAD_Process_ID() == 116) return startDocumentPrint(INVOICE, pi.getRecord_ID(), IsDirectPrint); 58 else if (pi.getAD_Process_ID() == 117) return startDocumentPrint(SHIPMENT, pi.getRecord_ID(), IsDirectPrint); 60 else if (pi.getAD_Process_ID() == 217) return startDocumentPrint(PROJECT, pi.getRecord_ID(), IsDirectPrint); 62 70 else if (pi.getAD_Process_ID() == 202 || pi.getAD_Process_ID() == 204) return startFinReport (pi); 73 76 return startStandardReport (pi, IsDirectPrint); 77 } 79 80 81 88 static public boolean startStandardReport (ProcessInfo pi, boolean IsDirectPrint) 89 { 90 int AD_Client_ID = Env.getContextAsInt(Env.getCtx(), "#AD_Client_ID"); 91 int AD_Table_ID = 0; 93 int AD_ReportView_ID = 0; 94 String TableName = null; 95 String whereClause = ""; 96 int AD_PrintFormat_ID = 0; 97 int Client_ID = -1; 98 99 String sql = "SELECT rv.AD_ReportView_ID,rv.WhereClause," 101 + " t.AD_Table_ID,t.TableName, pf.AD_PrintFormat_ID, pf.AD_Client_ID " 102 + "FROM AD_PInstance pi" 103 + " INNER JOIN AD_Process p ON (pi.AD_Process_ID=p.AD_Process_ID)" 104 + " INNER JOIN AD_ReportView rv ON (p.AD_ReportView_ID=rv.AD_ReportView_ID)" 105 + " INNER JOIN AD_Table t ON (rv.AD_Table_ID=t.AD_Table_ID)" 106 + " LEFT OUTER JOIN AD_PrintFormat pf ON (p.AD_ReportView_ID=pf.AD_ReportView_ID AND pf.AD_Client_ID IN (0,?)) " 107 + "WHERE pi.AD_PInstance_ID=?" + "ORDER BY pf.AD_Client_ID DESC"; try 110 { 111 PreparedStatement pstmt = DB.prepareStatement(sql); 112 pstmt.setInt(1, AD_Client_ID); 113 pstmt.setInt(2, pi.getAD_PInstance_ID()); 114 ResultSet rs = pstmt.executeQuery(); 115 if (rs.next()) 117 { 118 AD_ReportView_ID = rs.getInt(1); 119 whereClause = rs.getString(2); 120 if (rs.wasNull()) 121 whereClause = ""; 122 AD_Table_ID = rs.getInt(3); 124 TableName = rs.getString(4); 125 AD_PrintFormat_ID = rs.getInt(5); 126 Client_ID = rs.getInt(6); 127 } 128 rs.close(); 129 pstmt.close(); 130 } 131 catch (SQLException e1) 132 { 133 Log.error("ReportCtrl.startStandardReport", e1); 134 } 135 136 MQuery query = getQuery (pi.getAD_PInstance_ID(), TableName); 138 if (whereClause.length() != 0) 140 query.addRestriction(whereClause); 141 142 MPrintFormat format = null; 144 if (AD_PrintFormat_ID != 0) 145 { 146 if (Client_ID == AD_Client_ID) 148 format = MPrintFormat.get (AD_PrintFormat_ID, false); 149 else 150 format = MPrintFormat.copyToClient (Env.getCtx(), AD_PrintFormat_ID, AD_Client_ID); 151 } 152 if (format == null) 153 format = MPrintFormat.createFromReportView(Env.getCtx(), AD_ReportView_ID, pi.getTitle()); 154 155 ReportEngine re = new ReportEngine(Env.getCtx(), format, query); 156 if (IsDirectPrint) 157 re.print(false, 1, false, format.getPrinterName()); 158 else 159 new Viewer(re); 160 return true; 161 } 163 168 static public boolean startFinReport (ProcessInfo pi) 169 { 170 int AD_Client_ID = Env.getContextAsInt(Env.getCtx(), "#AD_Client_ID"); 171 172 String TableName = pi.getAD_Process_ID() == 202 ? "T_Report" : "T_ReportStatement"; 174 MQuery query = getQuery (pi.getAD_PInstance_ID(), TableName); 175 176 if (pi.getTransientObject() == null) 178 { 179 Log.error("ReportCtl.startFinReport - No PrintFormat"); 180 return false; 181 } 182 MPrintFormat format = (MPrintFormat)pi.getTransientObject(); 183 184 ReportEngine re = new ReportEngine(Env.getCtx(), format, query); 185 new Viewer(re); 186 return true; 187 } 189 195 static private MQuery getQuery (int AD_PInstance_ID, String TableName) 196 { 197 MQuery query = new MQuery(TableName); 198 if (TableName.startsWith("T_")) 200 query.addRestriction(TableName + ".AD_PInstance_ID=" + AD_PInstance_ID); 201 202 int rows = 0; 204 String SQL = "SELECT COUNT(*) FROM AD_PInstance_Para WHERE AD_PInstance_ID=?"; 205 try 206 { 207 PreparedStatement pstmt = DB.prepareStatement(SQL); 208 pstmt.setInt(1, AD_PInstance_ID); 209 ResultSet rs = pstmt.executeQuery(); 210 if (rs.next()) 211 rows = rs.getInt(1); 212 rs.close(); 213 pstmt.close(); 214 } 215 catch (SQLException e1) 216 { 217 Log.error("ReportCtrl.getQuery (ParameterCount)", e1); 218 } 219 220 if (rows < 1) 221 return query; 222 223 boolean trl = !Env.isBaseLanguage(Env.getCtx(), "AD_Process_Para"); 225 if (!trl) 226 SQL = "SELECT ip.ParameterName,ip.P_String,ip.P_String_To," + "ip.P_Number,ip.P_Number_To," + "ip.P_Date,ip.P_Date_To, ip.Info,ip.Info_To, pp.Name " + "FROM AD_PInstance_Para ip, AD_PInstance i, AD_Process_Para pp " 230 + "WHERE i.AD_PInstance_ID=ip.AD_PInstance_ID" 231 + " AND pp.AD_Process_ID=i.AD_Process_ID" 232 + " AND pp.ColumnName=ip.ParameterName" 233 + " AND ip.AD_PInstance_ID=?"; 234 else 235 SQL = "SELECT ip.ParameterName,ip.P_String,ip.P_String_To, ip.P_Number,ip.P_Number_To," 236 + "ip.P_Date,ip.P_Date_To, ip.Info,ip.Info_To, ppt.Name " 237 + "FROM AD_PInstance_Para ip, AD_PInstance i, AD_Process_Para pp, AD_Process_Para_Trl ppt " 238 + "WHERE i.AD_PInstance_ID=ip.AD_PInstance_ID" 239 + " AND pp.AD_Process_ID=i.AD_Process_ID" 240 + " AND pp.ColumnName=ip.ParameterName" 241 + " AND pp.AD_Process_Para_ID=ppt.AD_Process_Para_ID" 242 + " AND ip.AD_PInstance_ID=?" 243 + " AND ppt.AD_Language=?"; 244 try 245 { 246 PreparedStatement pstmt = DB.prepareStatement(SQL); 247 pstmt.setInt(1, AD_PInstance_ID); 248 if (trl) 249 pstmt.setString(2, Env.getAD_Language(Env.getCtx())); 250 ResultSet rs = pstmt.executeQuery(); 251 for (int row = 0; rs.next(); row++) 253 { 254 if (row == rows) 255 { 256 Log.error("ReportCtrl.getQuery (Parameter) - more rows than expected"); 257 break; 258 } 259 String ParameterName = rs.getString(1); 260 String P_String = rs.getString(2); 261 String P_String_To = rs.getString(3); 262 Double P_Number = null; 264 double d = rs.getDouble(4); 265 if (!rs.wasNull()) 266 P_Number = new Double (d); 267 Double P_Number_To = null; 268 d = rs.getDouble(5); 269 if (!rs.wasNull()) 270 P_Number_To = new Double (d); 271 Timestamp P_Date = rs.getTimestamp(6); 273 Timestamp P_Date_To = rs.getTimestamp(7); 274 String Info = rs.getString(8); 276 String Info_To = rs.getString(9); 277 String Name = rs.getString(10); 279 Log.trace(9, "ReportCtrl.getQuery", ParameterName + " S=" + P_String + "-" + P_String_To 280 + ", N=" + P_Number + "-" + P_Number_To + ", D=" + P_Date + "-" + P_Date_To 281 + " - " + Name + " - " + Info + "-" + Info_To); 282 283 if (P_String != null) 285 { 286 if (P_String_To == null) 287 { 288 if (P_String.indexOf("%") == -1) 289 query.addRestriction(ParameterName, MQuery.EQUAL, P_String, Name, Info); 290 else 291 query.addRestriction(ParameterName, MQuery.LIKE, P_String, Name, Info); 292 } 293 else 294 query.addRangeRestriction(ParameterName, P_String, P_String_To, 295 Name, Info, Info_To); 296 } 297 else if (P_Number != null) 298 { 299 if (P_Number_To == null) 300 query.addRestriction(ParameterName, MQuery.EQUAL, P_Number, Name, Info); 301 else 302 query.addRangeRestriction(ParameterName, P_Number, P_Number_To, 303 Name, Info, Info_To); 304 } 305 else if (P_Date != null) 306 { 307 if (P_Date_To == null) 308 query.addRestriction("TRUNC("+ParameterName+")", MQuery.EQUAL, P_Date, Name, Info); 309 else 310 query.addRangeRestriction("TRUNC("+ParameterName+")", P_Date, P_Date_To, 311 Name, Info, Info_To); 312 } 313 } 314 rs.close(); 315 pstmt.close(); 316 } 317 catch (SQLException e2) 318 { 319 Log.error("ReportDispatcher.getQuery (Parameter)", e2); 320 } 321 Log.trace(9, query.getWhereClause(true)); 322 return query; 323 } 325 326 327 public static final int ORDER = 0; 328 public static final int SHIPMENT = 1; 329 public static final int INVOICE = 2; 330 public static final int PROJECT = 3; 331 public static final int REMITTANCE = 4; 333 public static final int CHECK = 5; 334 public static final int DUNNING = 6; 335 336 private static final String [] DOC_TABLES = new String [] { 337 "C_Order_Header_v", "M_InOut_Header_v", "C_Invoice_Header_v", "C_Project_Header_v", 338 "C_PaySelection_Check_v", "C_PaySelection_Check_v", "C_DunningRunEntry_v" }; 339 private static final String [] DOC_BASETABLES = new String [] { 340 "C_Order", "M_InOut", "C_Invoice", "C_Project", 341 "C_PaySelectionCheck", "C_PaySelectionCheck", "C_DunningRunEntry" }; 342 private static final String [] DOC_IDS = new String [] { 343 "C_Order_ID", "M_InOut_ID", "C_Invoice_ID", "C_Project_ID", 344 "C_PaySelectionCheck_ID", "C_PaySelectionCheck_ID", "C_DunningRunEntry_ID", }; 345 346 354 public static boolean startDocumentPrint (int type, int Record_ID, boolean IsDirectPrint) 355 { 356 if (type == ORDER) 358 { 359 int[] what = getDocumentWhat (Record_ID); 360 if (what != null) 361 { 362 type = what[0]; 363 Record_ID = what[1]; 364 } 365 } 367 String JobName = DOC_BASETABLES[type] + "_Print"; 368 int AD_PrintFormat_ID = 0; 369 int copies = 1; 370 371 Language language = Language.getLanguage(); String sql = null; 374 if (type == CHECK) 375 sql = "SELECT bad.Check_PrintFormat_ID," + " c.IsMultiLingualDocument,bp.AD_Language " + "FROM C_PaySelectionCheck d" 378 + " INNER JOIN C_PaySelection ps ON (d.C_PaySelection_ID=ps.C_PaySelection_ID)" 379 + " INNER JOIN C_BankAccountDoc bad ON (ps.C_BankAccount_ID=bad.C_BankAccount_ID AND d.PaymentRule=bad.PaymentRule)" 380 + " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)" 381 + " INNER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID) " 382 + "WHERE d.C_PaySelectionCheck_ID=?"; else if (type == DUNNING) 384 sql = "SELECT dl.Dunning_PrintFormat_ID," 385 + " c.IsMultiLingualDocument,bp.AD_Language " 386 + "FROM C_DunningRunEntry d" 387 + " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)" 388 + " INNER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID)" 389 + " INNER JOIN C_DunningRun dr ON (d.C_DunningRun_ID=dr.C_DunningRun_ID)" 390 + " INNER JOIN C_DunningLevel dl ON (dr.C_DunningLevel_ID=dr.C_DunningLevel_ID) " 391 + "WHERE d.C_DunningRunEntry_ID=?"; else if (type == REMITTANCE) 393 sql = "SELECT pf.Remittance_PrintFormat_ID," 394 + " c.IsMultiLingualDocument,bp.AD_Language " 395 + "FROM C_PaySelectionCheck d" 396 + " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)" 397 + " INNER JOIN AD_PrintForm pf ON (c.AD_Client_ID=pf.AD_Client_ID)" 398 + " INNER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID) " 399 + "WHERE d.C_PaySelectionCheck_ID=?" + " AND pf.AD_Org_ID IN (0,d.AD_Org_ID) ORDER BY pf.AD_Org_ID DESC"; 401 else if (type == PROJECT) 402 sql = "SELECT pf.Project_PrintFormat_ID," 403 + " c.IsMultiLingualDocument,bp.AD_Language " 404 + "FROM C_Project d" 405 + " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)" 406 + " INNER JOIN AD_PrintForm pf ON (c.AD_Client_ID=pf.AD_Client_ID)" 407 + " LEFT OUTER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID) " 408 + "WHERE d.C_Project_ID=?" + " AND pf.AD_Org_ID IN (0,d.AD_Org_ID) ORDER BY pf.AD_Org_ID DESC"; 410 else sql = "SELECT pf.Order_PrintFormat_ID,pf.Shipment_PrintFormat_ID," + " pf.Invoice_PrintFormat_ID, pf.Project_PrintFormat_ID, pf.Remittance_PrintFormat_ID," + " c.IsMultiLingualDocument,bp.AD_Language," + " COALESCE(dt.DocumentCopies,0)+COALESCE(bp.DocumentCopies,1), " + " dt.AD_PrintFormat_ID " + "FROM " + DOC_BASETABLES[type] + " d" 417 + " INNER JOIN AD_Client c ON (d.AD_Client_ID=c.AD_Client_ID)" 418 + " INNER JOIN AD_PrintForm pf ON (c.AD_Client_ID=pf.AD_Client_ID)" 419 + " INNER JOIN C_BPartner bp ON (d.C_BPartner_ID=bp.C_BPartner_ID)" 420 + " LEFT OUTER JOIN C_DocType dt ON (d.C_DocType_ID=dt.C_DocType_ID) " 421 + "WHERE d." + DOC_IDS[type] + "=?" + " AND pf.AD_Org_ID IN (0,d.AD_Org_ID) " 423 + "ORDER BY pf.AD_Org_ID DESC"; 424 try 426 { 427 PreparedStatement pstmt = DB.prepareStatement(sql); 428 pstmt.setInt(1, Record_ID); 429 ResultSet rs = pstmt.executeQuery(); 430 if (rs.next()) { 432 if (type == CHECK || type == DUNNING || type == REMITTANCE || type == PROJECT) 433 { 434 AD_PrintFormat_ID = rs.getInt(1); 435 copies = 1; 436 String AD_Language = rs.getString(3); 438 if (AD_Language != null && "Y".equals(rs.getString(2))) language = Language.getLanguage(AD_Language); 440 } 441 else 442 { 443 AD_PrintFormat_ID = rs.getInt(type+1); 445 if (rs.getInt(9) != 0) AD_PrintFormat_ID = rs.getInt(9); 447 copies = rs.getInt(8); 448 String AD_Language = rs.getString(7); 450 if (AD_Language != null && "Y".equals(rs.getString(6))) language = Language.getLanguage(AD_Language); 452 } 453 } 454 rs.close(); 455 pstmt.close(); 456 } 457 catch (SQLException e) 458 { 459 Log.error("ReportCtl.startDocumentPrint - Record_ID=" + Record_ID + ", SQL=" + sql, e); 460 } 461 if (AD_PrintFormat_ID == 0) 462 { 463 ADialog.error(0, null, "NoDocPrintFormat"); 464 return false; 465 } 466 MPrintFormat format = MPrintFormat.get (AD_PrintFormat_ID, false); 468 format.setLanguage(language); 469 format.setTranslationLanguage(language); 471 MQuery query = new MQuery(DOC_TABLES[type]); 473 query.addRestriction(DOC_IDS[type], MQuery.EQUAL, new Integer (Record_ID)); 474 476 ReportEngine re = new ReportEngine(Env.getCtx(), format, query); 478 if (IsDirectPrint) 479 { 480 re.print (false, copies, false, format.getPrinterName()); printConfirm (type, Record_ID); 483 } 484 else 485 new Viewer(re); 486 return true; 487 } 489 494 private static int[] getDocumentWhat (int C_Order_ID) 495 { 496 int[] what = new int[2]; 497 what[0] = ORDER; 498 what[1] = C_Order_ID; 499 String SQL = "SELECT dt.DocSubTypeSO " 501 + "FROM C_DocType dt, C_Order o " 502 + "WHERE o.C_DocType_ID=dt.C_DocType_ID" 503 + " AND o.C_Order_ID=?"; 504 String DocSubTypeSO = null; 505 try 506 { 507 PreparedStatement pstmt = DB.prepareStatement(SQL); 508 pstmt.setInt(1, C_Order_ID); 509 ResultSet rs = pstmt.executeQuery(); 510 if (rs.next()) 511 DocSubTypeSO = rs.getString(1); 512 rs.close(); 513 pstmt.close(); 514 } 515 catch (SQLException e1) 516 { 517 Log.error ("ReportCtrl.getDocumentWhat DocSubType", e1); 518 return null; } 520 if (DocSubTypeSO == null) 521 DocSubTypeSO = ""; 522 if (DocSubTypeSO.equals("WR") || DocSubTypeSO.equals("WI")) 524 what[0] = INVOICE; 525 else if (DocSubTypeSO.equals("WP")) 527 what[0] = SHIPMENT; 528 else 530 return what; 531 532 if (what[0] == INVOICE) 534 SQL = "SELECT C_Invoice_ID REC FROM C_Invoice WHERE C_Order_ID=?" + " ORDER BY C_Invoice_ID DESC"; 536 else 537 SQL = "SELECT M_InOut_ID REC FROM M_InOut WHERE C_Order_ID=?" + " ORDER BY M_InOut_ID DESC"; 539 try 540 { 541 PreparedStatement pstmt = DB.prepareStatement(SQL); 542 pstmt.setInt(1, C_Order_ID); 543 ResultSet rs = pstmt.executeQuery(); 544 if (rs.next()) 545 { 546 what[1] = rs.getInt(1); 548 } 549 else what[0] = ORDER; 551 552 rs.close(); 553 pstmt.close(); 554 } 555 catch (SQLException e2) 556 { 557 Log.error("ReportCtrl.getDocumentWhat Record_ID", e2); 558 return null; 559 } 560 Log.trace(Log.l4_Data, "ReportCtrl.getDocumentWhat", "Order => " + what[0] + " ID=" + what[1]); 561 return what; 562 } 564 570 public static void printConfirm (int type, int Record_ID) 571 { 572 StringBuffer sql = new StringBuffer (); 573 if (type == ORDER || type == SHIPMENT || type == INVOICE) 574 sql.append("UPDATE ").append(DOC_BASETABLES[type]) 575 .append(" SET DatePrinted=SysDate, IsPrinted='Y' WHERE ") 576 .append(DOC_IDS[type]).append("=").append(Record_ID); 577 if (sql.length() > 0) 579 { 580 int no = DB.executeUpdate(sql.toString()); 581 if (no != 1) 582 Log.error("ReportCtl.printConfirm - Updated records=" + no + " - should be just one"); 583 } 584 } 586 } | Popular Tags |