1 package com.instantbank.collections.commonQueuing.ejb;
2
3 import java.io.ByteArrayInputStream;
4 import java.io.PrintWriter;
5 import java.io.StringWriter;
6 import java.sql.Connection;
7 import java.sql.PreparedStatement;
8 import java.sql.ResultSet;
9 import java.sql.SQLException;
10 import java.sql.Statement;
11 import java.text.SimpleDateFormat;
12 import java.util.HashMap;
13 import java.util.Hashtable;
14 import java.util.Map;
15 import java.util.Vector;
16 import javax.ejb.CreateException;
17 import javax.ejb.EJBContext;
18 import javax.ejb.SessionBean;
19 import javax.ejb.SessionContext;
20 import oracle.xml.parser.v2.DOMParser;
21 import oracle.xml.parser.v2.XMLDocument;
22 import oracle.xml.parser.v2.XMLNode;
23 import oracle.xml.parser.v2.XSLException;
24 import org.w3c.dom.Document;
25 import org.w3c.dom.Element;
26 import org.w3c.dom.Node;
27 import org.w3c.dom.NodeList;
28 import com.instantbank.collections.security.ejb.SecurityServices;
29 import com.instantbank.collections.security.ejb.SecurityServicesHome;
30 import com.instantbank.collections.util.DataAccess;
31 import com.instantbank.collections.util.DateUtils;
32 import com.instantbank.collections.util.InstantbankException;
33 import com.instantbank.collections.util.LongWrapper;
34 import com.instantbank.collections.util.ServiceLocator;
35 import com.instantbank.collections.util.StringFormat;
36 import com.instantbank.collections.util.UniqueIDGenerator;
37 import com.instantbank.collections.util.XMLDataAccess;
38 import com.instantbank.collections.util.XMLUtils;
39
40 public class QueueServicesBean
41 implements SessionBean {
42 class Summary {
43 long groupId = 0;
44 String groupName = "";
45 long userId = 0;
46 String userName = "";
47 int level = 0;
48 int totalAccounts = 0;
49 int worked = 0;
50 int transferredIn = 0;
51 int transferredOut = 0;
52 int remaining = 0;
53 int contacts = 0;
54 int attemptedContacts = 0;
55 int indirectContacts = 0;
56 int promises = 0;
57 long amountPromises = 0;
58
59
60 public void add(Summary child) {
61 this.totalAccounts += child.totalAccounts;
62 this.worked += child.worked;
63 this.transferredIn += child.transferredIn;
64 this.transferredOut += child.transferredOut;
65 this.remaining += child.remaining;
66 this.contacts += child.contacts;
67 this.attemptedContacts += child.attemptedContacts;
68 this.indirectContacts += child.indirectContacts;
69 this.promises += child.promises;
70 this.amountPromises += child.amountPromises;
71 }
72 }
73
74
75 private static final String DETERMINE_PREVIOUS_QUEUE_NAME =
76 "select qplan_name, trh_datestamp "
77 + "from transfer_history, queue_plans "
78 + "where trh_object_type= ? and trh_object_id= ? and trh_to_qplan_id= ? "
79 + "and qplan_id=trh_from_qplan_id "
80 + "order by trh_datestamp desc";
81
82 private static final String RETRIEVE_WORK_ITEM_QPLANS =
83 "select WRKI_QPLAN_ID "
84 + "from work_items "
85 + "where wrki_object_type= ? and wrki_object_id= ? ";
86
87 private EJBContext context;
88
89
90 public QueueServicesBean() { }
91
92
93 public void ejbCreate() throws CreateException {
94
95 }
96
97
98 public void ejbActivate() { }
99
100
101 public void ejbPassivate() { }
102
103
104 public void ejbRemove() { }
105
106
107 private void addChildSummaries(XMLNode node, int level, Summary summary, DataAccess da) throws InstantbankException, SQLException, XSLException {
108 XMLNode childNode;
109 Summary childSummary;
110 Long groupId;
111 String groupName;
112 NodeList nodeList;
113 Long userId;
114 String userName;
115
116 nodeList = node.selectNodes("./ChildUsers/User");
117 for(int i = 0; i < nodeList.getLength(); i++) {
118 childNode = (XMLNode)nodeList.item(i);
119 userId = new Long(childNode.valueOf("./id"));
120 userName = childNode.valueOf("./name");
121 childSummary = this.getUserSummary(userId, level + 1, da);
122 childSummary.userName = userName;
123 childSummary.userId = userId.longValue();
124 addSummaryNode(childNode, childSummary);
125 summary.add(childSummary);
126 }
127 nodeList = node.selectNodes("./ChildGroups/Group");
128 for(int i = 0; i < nodeList.getLength(); i++) {
129 childNode = (XMLNode)nodeList.item(i);
130 groupId = new Long(childNode.valueOf("./id"));
131 groupName = childNode.valueOf("./name");
132 childSummary = new Summary();
133 childSummary.groupId = groupId.longValue();
134 childSummary.groupName = groupName;
135 childSummary.level = level + 1;
136 addChildSummaries(childNode, level + 1, childSummary, da);
137 summary.add(childSummary);
138 }
139 addSummaryNode(node, summary);
140 }
141
142
143 private void addSummaryNode(XMLNode node, Summary summary) {
144 Document doc;
145 Node newNode;
146
147 doc = node.getOwnerDocument();
148 newNode = doc.createElement("Summary");
149 appendChild(doc, newNode, "accounts", "" + summary.totalAccounts);
150 appendChild(doc, newNode, "worked", "" + summary.worked);
151 appendChild(doc, newNode, "transferredin", "" + summary.transferredIn);
152 appendChild(doc, newNode, "transferredout", "" + summary.transferredOut);
153 appendChild(doc, newNode, "remaining", "" + summary.remaining);
154 appendChild(doc, newNode, "contacts", "" + summary.contacts);
155 appendChild(doc, newNode, "promises", "" + summary.promises);
156 appendChild(doc, newNode, "amountpromises", "" + summary.amountPromises);
157 appendChild(doc, newNode, "indirectcontacts", "" + summary.indirectContacts);
158 appendChild(doc, newNode, "attemptedcontacts", "" + summary.attemptedContacts);
159 node.appendChild(newNode);
160 }
161
162
163 private void appendChild(Document doc, Node node, String name, String value) {
164 XMLNode newNode;
165
166 newNode = (XMLNode)doc.createElement(name);
167 newNode.addText(value);
168 node.appendChild(newNode);
169 }
170
171
172 public void assignToQueue(Long qplanId, String objectType, Long objectId, Long changedBy, java.sql.Date followupDate, String followupTime) throws InstantbankException {
173 DataAccess da = null;
174 String dataQuery;
175 Long order = null;
176 ResultSet rs = null;
177 SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy");
178 Statement st = null;
179 Long userId = null;
180
181 try {
182 da = new DataAccess();
183 da.connect();
184 st = da.getConnection().createStatement();
185
186 dataQuery = "SELECT ";
187 dataQuery += "wsum_user_id,";
188 dataQuery += "wsum_total_accounts ";
189 dataQuery += "FROM ";
190 dataQuery += "work_summaries ";
191 dataQuery += "WHERE ";
192 dataQuery += "wsum_total_remaining IN (";
193 dataQuery += "SELECT ";
194 dataQuery += "MIN(wsum_total_remaining) ";
195 dataQuery += "FROM ";
196 dataQuery += "work_summaries ";
197 dataQuery += "WHERE ";
198 dataQuery += "wsum_qplan_id = " + qplanId.toString() + " AND ";
199 dataQuery += "wsum_date <= SYSDATE";
200 dataQuery += ") AND ";
201 dataQuery += "wsum_qplan_id = " + qplanId.toString() + " AND ";
202 dataQuery += "wsum_date <= SYSDATE AND ";
203 dataQuery += "ROWNUM = 1";
204
205 rs = st.executeQuery(dataQuery);
206 if(rs.next()) {
207 userId = new Long(rs.getLong(1));
208 order = new Long(rs.getLong(2));
209 }
210 else {
211 throw new InstantbankException("211001", "No user found to receive the transfer");
212 }
213
214 dataQuery = "INSERT INTO work_items (";
215 dataQuery += "wrki_id,";
216 dataQuery += "wrki_order,";
217 dataQuery += "wrki_last_changed_date,";
218 dataQuery += "wrki_last_changed_by,";
219 dataQuery += "wrki_qplan_id,";
220 dataQuery += "wrki_user_id,";
221 dataQuery += "wrki_object_type,";
222 dataQuery += "wrki_object_id,";
223 dataQuery += "wrki_followup_date,";
224 dataQuery += "wrki_followup_time,";
225 dataQuery += "wrki_status,";
226 dataQuery += "wrki_date";
227 dataQuery += ") VALUES (";
228 dataQuery += "" + UniqueIDGenerator.instance().getNextId() + ",";
229 dataQuery += (new Long((order.longValue()) + 1)).toString() + ",";
230 dataQuery += "TO_CHAR(SYSDATE),";
231 dataQuery += changedBy.toString() + ",";
232 dataQuery += qplanId.toString() + ",";
233 dataQuery += userId.toString() + ",";
234 dataQuery += "'" + objectType + "',";
235 dataQuery += objectId.toString() + ",";
236 dataQuery += ((followupDate == null) ? ("TO_CHAR(SYSDATE), ") : ("TO_DATE('" + sdf.format(followupDate) + "','mm-dd-yyyy'), "));
237 dataQuery += "'" + followupTime + "',";
238 dataQuery += "'N',";
239 dataQuery += "sysdate ";
240 dataQuery += ")";
241
242 da.makeInsert(dataQuery);
243
244 dataQuery = "INSERT INTO transfer_history (";
245 dataQuery += "trh_id,";
246 dataQuery += "trh_from_user_id,";
247 dataQuery += "trh_from_qplan_id,";
248 dataQuery += "trh_to_user_id,";
249 dataQuery += "trh_to_qplan_id,";
250 dataQuery += "trh_datestamp,";
251 dataQuery += "trh_object_type,";
252 dataQuery += "trh_object_id";
253 dataQuery += ") VALUES (";
254 dataQuery += "" + UniqueIDGenerator.instance().getNextId() + ",";
255 dataQuery += "NULL, ";
256 dataQuery += "NULL, ";
257 dataQuery += userId.toString() + ",";
258 dataQuery += qplanId.toString() + ",";
259 dataQuery += "SYSDATE,";
260 dataQuery += "'" + objectType + "',";
261 dataQuery += objectId.toString();
262 dataQuery += ")";
263
264 da.makeInsert(dataQuery);
265
266 dataQuery = "UPDATE work_summaries SET ";
267 dataQuery += "wsum_total_accounts = (wsum_total_accounts + 1),";
268 dataQuery += "wsum_total_transferred_in = (wsum_total_transferred_in + 1),";
269 dataQuery += "wsum_total_remaining = (wsum_total_remaining + 1) ";
270 dataQuery += "WHERE ";
271 dataQuery += "wsum_user_id = " + userId.toString() + " AND ";
272 dataQuery += "wsum_qplan_id = " + qplanId.toString() + " AND ";
273 dataQuery += "wsum_date <= SYSDATE";
274
275 da.makeInsert(dataQuery);
276 }
277 catch(Exception e) {
278 setRollbackOnly();
279 throw new InstantbankException(e, "211002", "Failed to assign to queue");
280 }
281 finally {
282 try {
283 if(rs != null) {
284 rs.close();
285 }
286 if(st != null) {
287 st.close();
288 }
289 if(da != null) {
290 da.disconnect();
291 }
292 }
293 catch(Exception e) {
294 }
295 }
296 }
297
298
299 public void clearTransfer(Long wrkiId) throws InstantbankException {
300 Long activityId = null;
301 Long classId = null;
302 Long clearPlanId = null;
303 Long clearUserId = null;
304 DataAccess da = null;
305 String dataQuery;
306 java.sql.Date followupDate = null;
307 String followupTime = null;
308 int fromTransfers;
309 Long qplanId = null;
310 Long userId = null;
311 Long lastChangedBy = null;
312 java.sql.Date lastChangedDate = null;
313 Long objectId = null;
314 String objectType = null;
315 Long order = null;
316 ResultSet rs = null;
317 int transfers;
318 String transfersSql;
319 Long trhId = null;
320 SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy");
321 Statement st = null;
322
323 try {
324 da = new DataAccess();
325 da.connect();
326 st = da.getConnection().createStatement();
327
328 dataQuery = "SELECT ";
329 dataQuery += "wrki_last_changed_date,";
330 dataQuery += "wrki_last_changed_by,";
331 dataQuery += "wrki_object_type,";
332 dataQuery += "wrki_object_id,";
333 dataQuery += "wrki_qplan_id,";
334 dataQuery += "wrki_user_id,";
335 dataQuery += "wrki_followup_date,";
336 dataQuery += "wrki_followup_time,";
337 dataQuery += "wrki_class_id,";
338 dataQuery += "wrki_activity_id,";
339 dataQuery += "wrki_transfers, ";
340 dataQuery += "wrki_from_transfers ";
341 dataQuery += "FROM ";
342 dataQuery += "work_items ";
343 dataQuery += "WHERE ";
344 dataQuery += "wrki_id = " + wrkiId.toString();
345
346 rs = st.executeQuery(dataQuery);
347 if(rs.next()) {
348 lastChangedDate = rs.getDate(1);
349 lastChangedBy = new Long(rs.getLong(2));
350 objectType = rs.getString(3);
351 objectId = new Long(rs.getLong(4));
352 qplanId = new Long(rs.getLong(5));
353 userId = new Long(rs.getLong(6));
354 followupDate = rs.getDate(7);
355 followupTime = rs.getString(8);
356 classId = new Long(rs.getLong(9));
357 if(classId.longValue() == 0) {
358 classId = null;
359 }
360 activityId = new Long(rs.getLong(10));
361 if(activityId.longValue() == 0) {
362 activityId = null;
363 }
364 transfers = rs.getInt(11);
365 if(rs.wasNull()) {
366 transfers = 0;
367 }
368 fromTransfers = rs.getInt(12);
369 if(rs.wasNull()) {
370 fromTransfers = 0;
371 }
372 }
373 else {
374 throw new InstantbankException("211003", "Failed to clear transfer. Work item " + wrkiId.toString() + " not found.");
375 }
376
377 dataQuery = "SELECT ";
378 dataQuery += "trh_id,";
379 dataQuery += "trh_from_user_id,";
380 dataQuery += "trh_from_qplan_id ";
381 dataQuery += "FROM ";
382 dataQuery += "transfer_history ";
383 dataQuery += "WHERE ";
384 dataQuery += "trh_datestamp IN (";
385 dataQuery += "SELECT ";
386 dataQuery += "MAX(trh_datestamp) ";
387 dataQuery += "FROM ";
388 dataQuery += "transfer_history ";
389 dataQuery += "WHERE ";
390 dataQuery += "trh_object_type = '" + objectType + "' AND ";
391 dataQuery += "trh_object_id = " + objectId.toString() + " AND ";
392 dataQuery += "trh_to_user_id = " + userId.toString() + " AND ";
393 dataQuery += "trh_to_qplan_id = " + qplanId.toString();
394 dataQuery += ") AND ";
395 dataQuery += "trh_object_type = '" + objectType + "' AND ";
396 dataQuery += "trh_object_id = " + objectId.toString() + " AND ";
397 dataQuery += "trh_to_user_id = " + userId.toString() + " AND ";
398 dataQuery += "trh_to_qplan_id = " + qplanId.toString() + " AND ";
399 dataQuery += "ROWNUM = 1";
400
401 rs = st.executeQuery(dataQuery);
402
403 if(rs.next()) {
404 trhId = new Long(rs.getLong(1));
405 clearUserId = new Long(rs.getLong(2));
406 if(clearUserId.longValue() == 0) {
407 clearUserId = null;
408 }
409 clearPlanId = new Long(rs.getLong(3));
410 if(clearPlanId.longValue() == 0) {
411 clearPlanId = null;
412 }
413 }
414 else {
415 throw new InstantbankException("211004", "Failed to clear transfer. Not found in transfer history table");
416 }
417
418 dataQuery = "DELETE FROM transfer_history WHERE trh_id = " + trhId.toString();
419 da.makeDelete(dataQuery);
420
421 dataQuery = "UPDATE work_summaries SET ";
422 dataQuery += "wsum_total_transferred_out = (wsum_total_transferred_out + 1), ";
423 dataQuery += "wsum_total_worked = (wsum_total_worked - 1) ";
424 dataQuery += "WHERE ";
425 dataQuery += "wsum_user_id = " + userId.toString() + " AND ";
426 dataQuery += "wsum_qplan_id = " + qplanId.toString() + " AND ";
427 dataQuery += "wsum_date <= SYSDATE";
428 da.makeUpdate(dataQuery);
429
430 if((clearPlanId != null) && (clearUserId != null)) {
431 dataQuery = "SELECT ";
432 dataQuery += "wsum_total_accounts ";
433 dataQuery += "FROM ";
434 dataQuery += "work_summaries ";
435 dataQuery += "WHERE ";
436 dataQuery += "wsum_qplan_id = " + clearPlanId.toString() + " AND ";
437 dataQuery += "wsum_user_id = " + clearUserId.toString() + " AND ";
438 dataQuery += "wsum_date <= SYSDATE";
439
440 rs = st.executeQuery(dataQuery);
441 if(rs.next()) {
442 order = new Long(rs.getLong(1));
443 }
444 else {
445 throw new InstantbankException("211005", "Work summary not found for the user " + clearUserId.toString() + " in the queue " + clearPlanId.toString());
446 }
447
448 transfers--;
449 if(transfers <= 0) {
450 transfersSql = "null";
451 }
452 else {
453 transfersSql = "" + transfers;
454 }
455 dataQuery = "INSERT INTO work_items (";
456 dataQuery += "wrki_id,";
457 dataQuery += "wrki_order,";
458 dataQuery += "wrki_last_changed_date,";
459 dataQuery += "wrki_last_changed_by,";
460 dataQuery += "wrki_qplan_id,";
461 dataQuery += "wrki_user_id,";
462 dataQuery += "wrki_object_type,";
463 dataQuery += "wrki_object_id,";
464 dataQuery += "wrki_followup_date,";
465 dataQuery += "wrki_followup_time,";
466 dataQuery += "wrki_class_id,";
467 dataQuery += "wrki_activity_id,";
468 dataQuery += "wrki_status,";
469 dataQuery += "wrki_date,";
470 dataQuery += "wrki_transfers ";
471 dataQuery += ") VALUES (";
472 dataQuery += "" + UniqueIDGenerator.instance().getNextId() + ",";
473 dataQuery += (new Long((order.longValue()) + 1)).toString() + ",";
474 dataQuery += "TO_CHAR(SYSDATE),";
475 dataQuery += userId.toString() + ",";
476 dataQuery += clearPlanId.toString() + ",";
477 dataQuery += clearUserId.toString() + ",";
478 dataQuery += "'" + objectType + "',";
479 dataQuery += objectId.toString() + ",";
480 dataQuery += ((followupDate == null) ? ("TO_CHAR(SYSDATE), ") : ("TO_DATE('" + sdf.format(followupDate) + "','mm-dd-yyyy'),"));
481 dataQuery += "'" + followupTime + "',";
482 dataQuery += ((classId == null) ? ("NULL") : (classId.toString())) + ",";
483 dataQuery += ((activityId == null) ? ("NULL") : (activityId.toString())) + ",";
484 dataQuery += "'R',";
485 dataQuery += "TO_CHAR(SYSDATE),";
486 dataQuery += transfersSql;
487 dataQuery += ")";
488 da.makeInsert(dataQuery);
489
490 dataQuery = "UPDATE work_summaries SET ";
491 dataQuery += "wsum_total_transferred_in = (wsum_total_transferred_in + 1),";
492 dataQuery += "wsum_total_worked = (wsum_total_worked + 1) ";
493 dataQuery += "WHERE ";
494 dataQuery += "wsum_user_id = " + clearUserId.toString() + " AND ";
495 dataQuery += "wsum_qplan_id = " + clearPlanId.toString() + " AND ";
496 dataQuery += "wsum_date <= SYSDATE";
497 da.makeUpdate(dataQuery);
498
499 ++fromTransfers;
500 dataQuery = "UPDATE work_items SET ";
501 dataQuery += "wrki_from_transfers = " + fromTransfers;
502 dataQuery += "WHERE wrki_id = " + wrkiId.toString();
503 da.makeUpdate(dataQuery);
504
505
506 dataQuery = "DELETE FROM work_items WHERE wrki_id = " + wrkiId;
507 da.makeDelete(dataQuery);
508
509
510 removeDups(objectId);
511 }
512 }
513 catch(Exception e) {
514 setRollbackOnly();
515 throw new InstantbankException(e, "211006", "Failed to clear transfer");
516 }
517 finally {
518 try {
519 if(rs != null) {
520 rs.close();
521 }
522 if(st != null) {
523 st.close();
524 }
525 if(da != null) {
526 da.disconnect();
527 }
528 }
529 catch(Exception e) {
530 }
531 }
532 }
533
534
535 public void dateTimeLoop(Long workItemId, java.sql.Date date, String time) throws InstantbankException {
536 java.sql.Date currentDate = null;
537 DataAccess da = null;
538 String dataQuery;
539 java.sql.Date lastFollowupDate = null;
540 ResultSet rs = null;
541 SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy");
542 Statement st = null;
543
544 try {
545 da = new DataAccess();
546 da.connect();
547 st = da.getConnection().createStatement();
548 if((time == null) && (date == null)) {
549 rs = st.executeQuery("SELECT to_char(wrki_followup_date, 'mm-dd-yyyy') FROM work_items WHERE wrki_id = " + workItemId.toString());
550
551 while(rs.next()) {
552 lastFollowupDate = rs.getDate(1);
553 }
554 rs = st.executeQuery("SELECT to_char(sysdate, 'mm-dd-yyyy') FROM dual");
555 while(rs.next()) {
556 currentDate = rs.getDate(1);
557 }
558 if(!lastFollowupDate.after(currentDate)) {
559 dataQuery = "UPDATE work_items SET ";
560 dataQuery += "wrki_followup_time = '00:00' ";
561 dataQuery += "WHERE wrki_id = " + workItemId.toString();
562 da.makeUpdate(dataQuery);
563 }
564 }
565 else {
566 dataQuery = "UPDATE work_items SET ";
567 dataQuery += "wrki_followup_date = " + ((date == null) ? ("TO_CHAR(SYSDATE), ") : ("TO_DATE('" + sdf.format(date) + "','mm-dd-yyyy'), "));
568
569 dataQuery += "wrki_followup_time = '" + ((time == null) ? ("00:00") : (time)) + "' ";
570 dataQuery += "WHERE wrki_id = " + workItemId.toString();
571 da.makeUpdate(dataQuery);
572 }
573 }
574 catch(Exception e) {
575 setRollbackOnly();
576 throw new InstantbankException(e, "211007", "Failed to set date/time loop");
577 }
578 finally {
579 try {
580 if(rs != null) {
581 rs.close();
582 }
583 if(st != null) {
584 st.close();
585 }
586 if(da != null) {
587 da.disconnect();
588 }
589 }
590 catch(Exception e) {
591 }
592 }
593 }
594
595
596 public String getAccounts(Long companyId, Long userId, String objectType, Long queueId, String status, Long rowNum, int rows) throws InstantbankException {
597 XMLDataAccess da = null;
598 String inSentence = "";
599 String dataQuery;
600 SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy");
601 String sql = "";
602 String vWorkItems;
603 Long workId;
604 java.util.Date workDate = null;
605 ;
606 String xml = "";
607
608 try {
609 da = new XMLDataAccess("");
610 da.connect();
611
612 vWorkItems = "";
613 if(status.equals("N")) {
614 inSentence = getWrkiId(userId, queueId, status, rowNum, rows);
615 sql += "SELECT ";
616 sql += " id, ";
617 sql += " objectId, ";
618 sql += " accountNumber, ";
619 sql += " accountName, ";
620 sql += " days, ";
621 sql += " amount, ";
622 sql += " to_char(acrh_date,'mm-dd-yyyy') dateLastWorked, ";
623 sql += " to_char(last_changed_date,'mm-dd-yyyy') lastChangedDate, ";
624 sql += " to_char(followup_date,'mm-dd-yyyy') followupDate, ";
625 sql += " followupTime, ";
626 sql += " res_code action, ";
627 sql += " act_code result ";
628 sql += "FROM ";
629 sql += " (SELECT ";
630 sql += "wrki_id id, ";
631 sql += "wrki_qplan_id qplan_id, ";
632 sql += "wrki_user_id user_id, ";
633 sql += "wrki_class_id class_id, ";
634 sql += "wrki_order item_order, ";
635 sql += "wrki_status status, ";
636 sql += "wrki_last_changed_by last_changed_by, ";
637 sql += "wrki_followup_time followupTime, ";
638 sql += "wrki_last_changed_date last_changed_date, ";
639 sql += "wrki_followup_date followup_date, ";
640 sql += "agrm_id objectId, ";
641 sql += "agrm_cmp_id cmp_id, ";
642 sql += "agrm_code accountNumber, ";
643 sql += "cust_first_name || ' ' || cust_last_name accountName, ";
644 sql += "agrm_curr_del_days days, ";
645 sql += "agrm_amount_past_due amount, ";
646 sql += "wrki_activity_id work_activity_id, ";
647 sql += "lastAgreementActivity(agrm_id) account_activity_id ";
648 sql += "FROM ";
649 sql += "work_items, ";
650 sql += "agreements, ";
651 sql += "agreements_cust_links, ";
652 sql += "customers ";
653 sql += "WHERE ";
654 sql += "(wrki_id in(" + inSentence + ")) and ";
655 sql += "(agrm_id = wrki_object_id) and ";
656 sql += "(acl_agrm_id = agrm_id) and ";
657 sql += "(cust_id = acl_cust_id) and ";
658 sql += "(wrki_followup_date < = SYSDATE) and ";
659 sql += "(acl_csr_code = 'PR') ";
660 sql += "ORDER BY ";
661 sql += "wrki_followup_date, ";
662 sql += "wrki_followup_time, ";
663 sql += "wrki_order ";
664 sql += ") vwrki, ";
665 sql += "action_results_history, ";
666 sql += "results, ";
667 sql += "actions ";
668 sql += "WHERE ";
669 sql += "(acrh_id (+) = vwrki.account_activity_id) and ";
670 sql += "(res_id (+) = acrh_res_id) and ";
671 sql += "(act_id (+) = acrh_act_id) ";
672 xml = da.getXml(sql, "AccountsList", "Account");
673 }
674 else if(status.equals("W")) {
675 xml = getWork(companyId, userId, objectType, queueId, status, rowNum, rows);
676 }
677 else if(status.equals("T")) {
678 inSentence = getWrkiId(userId, queueId, status, rowNum, rows);
679 sql += "SELECT ";
680 sql += "id, ";
681 sql += "object_id objectId, ";
682 sql += "account_number accountNumber, ";
683 sql += "account_name accountName, ";
684 sql += "days, ";
685 sql += "amount, ";
686 sql += "to_char(acrh_date,'mm-dd-yyyy') dateLastWorked, ";
687 sql += "to_char(last_changed_date,'mm-dd-yyyy') lastChangedDate, ";
688 sql += "to_char(followup_date,'mm-dd-yyyy') followupDate, ";
689 sql += "followup_time followupTime, ";
690 sql += "act_code action, ";
691 sql += "res_code result ";
692 sql += "FROM (SELECT ";
693 sql += "wrki_id id, ";
694 sql += "wrki_followup_date followup_date, ";
695 sql += "wrki_followup_time followup_time, ";
696 sql += "wrki_last_changed_by last_changed_by, ";
697 sql += "wrki_last_changed_date last_changed_date, ";
698 sql += "agrm_id object_id, ";
699 sql += "agrm_code account_number, ";
700 sql += "cust_first_name || ' ' || cust_last_name account_name, ";
701 sql += "agrm_curr_del_days days, ";
702 sql += "agrm_amount_past_due amount, ";
703 sql += "lastAgreementActivity(agrm_id) account_activity_id ";
704 sql += "FROM ";
705 sql += "work_items, ";
706 sql += "agreements, ";
707 sql += "agreements_cust_links, ";
708 sql += "customers ";
709 sql += "WHERE ";
710 sql += "(wrki_id in(" + inSentence + ")) and ";
711 sql += "(agrm_id = wrki_object_id) and ";
712 sql += "(acl_agrm_id = agrm_id) and ";
713 sql += "(cust_id = acl_cust_id) and ";
714 sql += "(acl_csr_code = 'PR') ";
715 sql += "ORDER BY ";
716 sql += "wrki_followup_date, ";
717 sql += "wrki_followup_time, ";
718 sql += "wrki_order ";
719 sql += ") v_wrki, ";
720 sql += "action_results_history, ";
721 sql += "actions, ";
722 sql += "results ";
723 sql += "WHERE ";
724 sql += "(acrh_id (+) = account_activity_id) AND ";
725 sql += "(act_id(+) = acrh_act_id) and ";
726 sql += "(res_id(+) = acrh_res_id) ";
727 xml = da.getXml(sql, "AccountsList", "Account");
728 }
729 else if(status.equals("R")) {
730 inSentence = getWrkiId(userId, queueId, status, rowNum, rows);
731 sql += "SELECT ";
732 sql += " id, ";
733 sql += " object_id objectId, ";
734 sql += " account_number accountNumber, ";
735 sql += " account_name accountName, ";
736 sql += " days, ";
737 sql += " amount, ";
738 sql += " to_char(acrh_date,'mm-dd-yyyy') dateLastWorked, ";
739 sql += " to_char(last_changed_date,'mm-dd-yyyy') lastChangedDate, ";
740 sql += " to_char(followup_date,'mm-dd-yyyy') followupDate, ";
741 sql += " followup_time followupTime, ";
742 sql += " act_code action, ";
743 sql += " res_code result ";
744 sql += " FROM ( SELECT ";
745 sql += " wrki_id id, ";
746 sql += " wrki_qplan_id qplan_id, ";
747 sql += " wrki_user_id user_id, ";
748 sql += " wrki_class_id class_id, ";
749 sql += " wrki_order item_order, ";
750 sql += " wrki_status status, ";
751 sql += " wrki_followup_date followup_date, ";
752 sql += " wrki_followup_time followup_time, ";
753 sql += " wrki_last_changed_by last_changed_by, ";
754 sql += " wrki_last_changed_date last_changed_date, ";
755 sql += " agrm_id object_id, ";
756 sql += " agrm_cmp_id cmp_id, ";
757 sql += " agrm_code account_number, ";
758 sql += " cust_first_name || ' ' || cust_last_name account_name, ";
759 sql += " agrm_curr_del_days days, ";
760 sql += " agrm_amount_past_due amount, ";
761 sql += " wrki_activity_id work_activity_id, ";
762 sql += " lastAgreementActivity(agrm_id) account_activity_id ";
763 sql += " FROM ";
764 sql += " work_items, ";
765 sql += " agreements, ";
766 sql += " agreements_cust_links, ";
767 sql += " customers ";
768 sql += " WHERE ";
769 sql += " (wrki_id in(" + inSentence + ")) and ";
770 sql += " (wrki_object_type = 'A') and ";
771 sql += " (agrm_id = wrki_object_id) and ";
772 sql += " (acl_agrm_id = agrm_id) and ";
773 sql += " (cust_id = acl_cust_id) and ";
774 sql += " (acl_csr_code = 'PR') ";
775 sql += "ORDER BY ";
776 sql += "wrki_followup_date, ";
777 sql += "wrki_followup_time, ";
778 sql += "wrki_order ";
779 sql += " ) v_wrki, ";
780 sql += " action_results_history, ";
781 sql += " actions, ";
782 sql += " results ";
783 sql += "WHERE ";
784 sql += " (acrh_id (+) = account_activity_id) AND ";
785 sql += " (act_id(+) = acrh_act_id) and ";
786 sql += " (res_id(+) = acrh_res_id) ";
787 xml = da.getXml(sql, "AccountsList", "Account");
788 }
789 else {
790 throw new InstantbankException("211054", "Invalid Work Item Status: " + status);
791 }
792 return xml;
793 }
794 catch(Exception e) {
795 setRollbackOnly();
796 throw new InstantbankException(e, "211008", "Failed to retrieve accounts for the queue");
797 }
798 finally {
799 try {
800 if(da != null) {
801 da.disconnect();
802 }
803 }
804 catch(Exception e) {
805 }
806 }
807 }
808
809
810 public String getCategories(String objectType) throws InstantbankException {
811 XMLDataAccess da = null;
812 String sql;
813
814 try {
815 da = new XMLDataAccess("");
816 da.connect();
817 sql = "SELECT distinct ";
818 sql += "QUT_CATEGORY categories, ";
819 sql += "decode(QUT_CATEGORY,";
820 sql += "'C','Collections',";
821 sql += "'S','Customer Service',";
822 sql += "'D','Download',";
823 sql += "'T','Others',";
824 sql += "'R','Recovery'";
825 sql += ") name ";
826 sql += "FROM ";
827 sql += "Queue_Types ";
828 sql += "WHERE ";
829 sql += "qut_object_type='" + objectType + "'";
830 return da.getXml(sql, "CategoriesList", "Categories");
831 }
832 catch(Exception e) {
833 setRollbackOnly();
834 throw new InstantbankException(e, "211009", "Failed to retrieve categories");
835 }
836 finally {
837 try {
838 if(da != null) {
839 da.disconnect();
840 }
841 }
842 catch(Exception e) {
843 }
844 }
845 }
846
847
848 public String getClass(Long classId, Long companyId) throws InstantbankException {
849 XMLDataAccess da = null;
850 Node domNode;
851 XMLDocument doc;
852 XMLNode node;
853 Element root;
854 Element newElement;
855 PrintWriter pw;
856 StringWriter sw;
857 String sql;
858 String xml = "";
859
860 try {
861 xml = XMLUtils.xmlHeader();
862 da = new XMLDataAccess("");
863 da.connect();
864
865 sql = "SELECT ";
866 sql += "CLASS_ID id, ";
867 sql += "CLASS_NAME name,";
868 sql += "to_char(CLASS_START_DATE,'mm-dd-yyyy') startDate, ";
869 sql += "CLASS_STATUS status,";
870 sql += "CLASS_PARENT_ID parent, ";
871 sql += "CLASS_DESCRIPTION description,";
872 sql += "CLASS_PRIORITY priority,";
873 sql += "user_userid lastchangedby,";
874 sql += "to_char(CLASS_LAST_CHANGED_DATE,'mm-dd-yyyy') lastchangeddate ";
875 sql += "FROM ";
876 sql += "CLASSES, ";
877 sql += "users ";
878 sql += "WHERE ";
879 sql += "CLASS_ID = " + classId + " AND ";
880 sql += "CLASS_CMP_ID = " + companyId + " AND ";
881 sql += "CLASS_LAST_CHANGED_BY = user_id";
882
883 doc = da.makeXMLSelect(sql, "ClassList", "Class");
884 root = doc.getDocumentElement();
885
886 sql = "SELECT CLASSWR_SEQUENCE sequence,";
887 sql += "CLASSWR_TEST test,";
888 sql += "CLASSWR_TABLE_NAME tablename,";
889 sql += "CLASSWR_TABLE_ALIAS tablealias,";
890 sql += "CLASSWR_FIELD_NAME fieldname,";
891 sql += "CLASSWR_FIELD_TYPE fieldtype,";
892 sql += "CLASSWR_OPERATOR operator, ";
893 sql += "CLASSWR_VALUE value,";
894 sql += "CLASSWR_VALUE_TYPE valuetype,";
895 sql += "CLASSWR_CONNECTOR connector ";
896 sql += "FROM ";
897 sql += "CLASS_WHERE_RULES ";
898 sql += "WHERE ";
899 sql += "CLASSWR_CLASS_ID=" + classId;
900
901 domNode = root.getFirstChild();
902 doc = da.makeXMLSelect(sql, "RulesList", "Rule", domNode);
903 root = doc.getDocumentElement();
904 node = (XMLNode)root.getFirstChild();
905 sw = new StringWriter();
906 pw = new PrintWriter(sw);
907 node.print(pw);
908 xml += sw.toString();
909 return xml;
910 }
911 catch(Exception e) {
912 setRollbackOnly();
913 throw new InstantbankException(e, "211010", "Failed to retrieve the class " + classId);
914 }
915 finally {
916 try {
917 if(da != null) {
918 da.disconnect();
919 }
920 }
921 catch(Exception e) {
922 }
923 }
924 }
925
926
927 public String getClasses(Long companyId, String objectType, String className, long rownum, long numRecords) throws InstantbankException {
928 XMLDataAccess da = null;
929 String xml;
930 String sql;
931
932 try {
933 if(rownum <= 0) {
934 rownum = 1;
935 }
936 da = new XMLDataAccess("");
937 da.connect();
938 sql = "SELECT * FROM (";
939 sql += "SELECT ";
940 sql += "id,";
941 sql += "name,";
942 sql += "startdate,";
943 sql += "decode(CLASS_STATUS,'A','Active','I','Inactive','P','Purge') status, ";
944 sql += "ROWNUM theRow ";
945 sql += "FROM (";
946 sql += "SELECT ";
947 sql += "CLASS_ID id,";
948 sql += "CLASS_NAME name,";
949 sql += "to_char(CLASS_START_DATE,'mm-dd-yyyy') startdate,";
950 sql += "CLASS_STATUS ";
951 sql += "FROM ";
952 sql += "CLASSES ";
953 sql += "WHERE ";
954 sql += "CLASS_CMP_ID=" + companyId + " AND ";
955 sql += "CLASS_OBJECT_TYPE='" + objectType + "' ";
956 if(!className.equals("")) {
957 sql += "AND CLASS_NAME like '" + className + "%' ";
958 }
959 sql += "ORDER BY ";
960 sql += "CLASS_NAME ";
961 sql += ")";
962 sql += ") where ";
963 sql += "theRow between " + rownum + " and " + (rownum + numRecords - 1);
964 xml = da.getXml(sql, "ClassList", "Class");
965 }
966 catch(Exception e) {
967 setRollbackOnly();
968 throw new InstantbankException(e, "211011", "Failed to retrieve classes");
969 }
970 finally {
971 try {
972 if(da != null) {
973 da.disconnect();
974 }
975 }
976 catch(Exception e) {
977 }
978 }
979 return xml;
980 }
981
982
983
993 public String getPreviousQueueInfo(String objectType, long objectId, long qid)
994 throws InstantbankException {
995
996 Connection con = null;
997 PreparedStatement ps = null;
998 ResultSet rs = null;
999 DataAccess da = new DataAccess();
1000 String queueName = null;
1001
1002 try {
1003 da.connect();
1004 con = da.getConnection();
1005 ps = con.prepareStatement(DETERMINE_PREVIOUS_QUEUE_NAME);
1006 ps.setString(1, objectType);
1007 ps.setLong(2, objectId);
1008 ps.setLong(3, qid);
1009 rs = ps.executeQuery();
1010 if(rs.next()) {
1011 queueName = rs.getString(1) + '|' + rs.getString(2);
1012 }
1013 ;
1014 }
1015 catch(Exception e) {
1016 e.printStackTrace();
1017 throw new InstantbankException(e, "411012", "Error searching for previous queue");
1018 }
1019 finally {
1020 try {
1021 if(rs != null) {
1022 rs.close();
1023 }
1024 if(ps != null) {
1025 ps.close();
1026 }
1027 if(da != null) {
1028 da.disconnect();
1029 }
1030 }
1031 catch(Exception e) {
1032 e.printStackTrace();
1033 }
1034 }
1035
1036 return queueName;
1037 }
1038
1039
1040
1048 public Map getCurrentQueuesPrevious(String objectType, long objectId)
1049 throws InstantbankException {
1050
1051 Connection con = null;
1052 PreparedStatement ps = null;
1053 ResultSet rs = null;
1054 DataAccess da = new DataAccess();
1055
1056 Map ret = new HashMap(10);
1057
1058 try {
1059 da.connect();
1060 con = da.getConnection();
1061 ps = con.prepareStatement(RETRIEVE_WORK_ITEM_QPLANS);
1062 ps.setString(1, objectType);
1063 ps.setLong(2, objectId);
1064 rs = ps.executeQuery();
1065 while(rs.next()) {
1066 long qid = rs.getLong(1);
1067 String previousQueueName = this.getPreviousQueueInfo(objectType, objectId, qid);
1068 if(previousQueueName != null) {
1069 ret.put(new LongWrapper(qid), previousQueueName);
1070 }
1071 }
1072 }
1073 catch(Exception e) {
1074 e.printStackTrace();
1075 throw new InstantbankException(e, "411012", "Error searching for previous queue");
1076 }
1077 finally {
1078 try {
1079 if(rs != null) {
1080 rs.close();
1081 }
1082 if(ps != null) {
1083 ps.close();
1084 }
1085 if(da != null) {
1086 da.disconnect();
1087 }
1088 }
1089 catch(Exception e) {
1090 e.printStackTrace();
1091 }
1092 }
1093
1094 return ret;
1095 }
1096
1097
1098 public String getCurrentQueues(String objectType, String objectId, Long companyId) throws InstantbankException {
1099 String sql;
1100 XMLDataAccess da = null;
1101
1102 try {
1103 da = new XMLDataAccess("");
1104 da.connect();
1105 sql = "SELECT ";
1106 sql += "decode(qut_category,";
1107 sql += "'C','Collections',";
1108 sql += "'S','Customer Service',";
1109 sql += "'D','Download',";
1110 sql += "'T','Others'";
1111 sql += ") category,";
1112 sql += "WRKI_QPLAN_ID qid,";
1113 sql += "qplan_name name,";
1114 sql += "decode(wrki_status,'W','Worked','N','Not worked','R','Reworked') status, ";
1115 sql += "user_userid assignedto,";
1116 sql += "user_phone assignedphone, ";
1117 sql += "to_char(wrki_followup_date,'mm-dd-yyyy') followupdate,";
1118 sql += "wrki_followup_time followuptime ";
1119
1158 sql += "FROM ";
1159 sql += "work_items, ";
1160 sql += "queue_plans, ";
1161 sql += "queue_types, ";
1162 sql += "users ";
1163 sql += "WHERE ";
1164 sql += "(qplan_id = wrki_qplan_id) and ";
1165 sql += "(qut_id = qplan_qut_id) and ";
1166 sql += "(users.user_id = wrki_user_id) and ";
1167 sql += "(wrki_object_type = '" + objectType + "') and ";
1168 sql += "(wrki_object_id = " + new Long(objectId) + ") and ";
1169
1170
1171
1172
1173
1174 sql += "(wrki_from_transfers is null or wrki_transfers is null or wrki_transfers!=wrki_from_transfers) and ";
1175
1176 sql += "(qplan_cmp_id = " + companyId + ")";
1177
1181 return da.getXml(sql, "CurrentList", "Current");
1182 }
1183 catch(Exception e) {
1184 setRollbackOnly();
1185 throw new InstantbankException(e, "211012", "Failed to retrieve current queues");
1186 }
1187 finally {
1188 try {
1189 if(da != null) {
1190 da.disconnect();
1191 }
1192 }
1193 catch(Exception e) {
1194 }
1195 }
1196 }
1197
1198
1199 public String getDownload(Long downloadId, Long companyId) throws InstantbankException {
1200 XMLDataAccess da = null;
1201 Node domNode;
1202 XMLDocument doc;
1203 Element root;
1204 String sql = "";
1205 String xml = "";
1206
1207 try {
1208 da = new XMLDataAccess("");
1209 da.connect();
1210
1211 sql = "SELECT ";
1212 sql += "down_id id, ";
1213 sql += "down_name name,";
1214 sql += "to_char(down_start_date,'mm-dd-yyyy') startdate, ";
1215 sql += "down_status status,";
1216 sql += "down_qut_id queuetype, ";
1217 sql += "down_description description,";
1218 sql += "down_frequency frequency,";
1219 sql += "down_downt_down_id filetype,";
1220 sql += "down_ftp_type_indicator ftptype,";
1221 sql += "down_achc_id achaccount,";
1222 sql += "users.user_userid lastchangedby,";
1223 sql += "to_char(down_LAST_CHANGED_DATE,'mm-dd-yyyy') lastchangeddate ";
1224 sql += "FROM ";
1225 sql += "downloads, ";
1226 sql += "users ";
1227 sql += "WHERE ";
1228 sql += "down_id = " + downloadId + " AND ";
1229 sql += "down_cmp_id = " + companyId + " AND ";
1230 sql += "down_last_changed_by = user_id";
1231
1232 doc = da.makeXMLSelect(sql, "Download", "DownloadFields");
1233 root = doc.getDocumentElement();
1234
1235 sql = "SELECT ";
1236 sql += "downwr_sequence sequence,";
1237 sql += "downwr_test test,";
1238 sql += "downwr_table_name tablename,";
1239 sql += "downwr_table_alias tablealias,";
1240 sql += "downwr_field_name fieldname,";
1241 sql += "downwr_field_type fieldtype,";
1242 sql += "downwr_operator operator, ";
1243 sql += "downwr_value value,";
1244 sql += "downwr_value_type valuetype,";
1245 sql += "downwr_connector connector ";
1246 sql += "FROM ";
1247 sql += "download_where_rules ";
1248 sql += "WHERE ";
1249 sql += "downwr_down_id=" + downloadId;
1250
1251 domNode = root;
1252 doc = da.makeXMLSelect(sql, "RulesList", "Rule", domNode);
1253 root = doc.getDocumentElement();
1254
1255 sql = "SELECT ";
1256 sql += "downsr_sequence sequence, ";
1257 sql += "downsr_table_name tablename,";
1258 sql += "downsr_table_alias tablealias,";
1259 sql += "downsr_field_name fieldname, ";
1260 sql += "downsr_direction direction ";
1261 sql += "FROM ";
1262 sql += "download_sort_rules ";
1263 sql += "WHERE ";
1264 sql += "downsr_down_id = " + downloadId;
1265
1266 domNode = root;
1267 doc = da.makeXMLSelect(sql, "SortList", "Sort", domNode);
1268 root = doc.getDocumentElement();
1269
1270 sql = "SELECT ";
1271 sql += "downf_sequence sequence, ";
1272 sql += "downf_table_name tablename,";
1273 sql += "downf_table_alias tablealias,";
1274 sql += "downf_field_name fieldname ";
1275 sql += "FROM ";
1276 sql += "download_fields ";
1277 sql += "WHERE ";
1278 sql += "downf_down_id = " + downloadId;
1279
1280 domNode = root;
1281 doc = da.makeXMLSelect(sql, "FieldsList", "Field", domNode);
1282 root = doc.getDocumentElement();
1283
1284 sql = "SELECT ";
1285 sql += "DOWNFTP_PRIMARY_ID primaryid,";
1286 sql += "DOWNFTP_SECONDARY_ID secondaryid ";
1287 sql += "FROM ";
1288 sql += "DOWNLOAD_FTP_DISTRIBUTION ";
1289 sql += "WHERE ";
1290 sql += "DOWNFTP_DOWN_ID = " + downloadId;
1291
1292 domNode = root;
1293 xml = da.getXml(sql, "Distribution", "Locations", domNode);
1294 return xml;
1295 }
1296 catch(Exception e) {
1297 setRollbackOnly();
1298 InstantbankException ie = new InstantbankException(e, "211013", "Failed to retrieve the download " + downloadId);
1299 ie.setTechnicalMessage("sql=" + sql);
1300 throw ie;
1301 }
1302 finally {
1303 try {
1304 if(da != null) {
1305 da.disconnect();
1306 }
1307 }
1308 catch(Exception e) {
1309 }
1310 }
1311 }
1312
1313
1314 public String getDownloads(Long companyId, String objectType, String category, Long qType, String downloadName, long rownum, long numRecords) throws InstantbankException {
1315 XMLDataAccess da = null;
1316 String sql;
1317 String xml;
1318
1319 try {
1320 da = new XMLDataAccess("");
1321 da.connect();
1322 sql = "SELECT * FROM (";
1323 sql += "SELECT ";
1324 sql += "decode(QUT_CATEGORY,";
1325 sql += "'C','Collections',";
1326 sql += "'S','Customer Service',";
1327 sql += "'D','Download',";
1328 sql += "'T','Others'";
1329 sql += "'R','Recovery'";
1330 sql += ") category,";
1331 sql += "qut_name type,";
1332 sql += "DOWN_NAME name,";
1333 sql += "to_char(DOWN_START_DATE,'mm-dd-yyyy') startdate,";
1334 sql += "decode(DOWN_STATUS,'A','Active','I','Inactive','P','Purge') status,";
1335 sql += "down_id id,";
1336 sql += "ROWNUM theRow ";
1337 sql += "FROM (";
1338 sql += "SELECT ";
1339 sql += "QUT_CATEGORY,";
1340 sql += "qut_name,";
1341 sql += "DOWN_NAME,";
1342 sql += "down_start_date,";
1343 sql += "down_status,";
1344 sql += "down_id ";
1345 sql += "FROM ";
1346 sql += "queue_types,";
1347 sql += "downloads ";
1348 sql += "WHERE ";
1349 sql += "qut_id = down_qut_id AND ";
1350 sql += "qut_object_type = '" + objectType + "' AND ";
1351 sql += "down_cmp_id = " + companyId + " ";
1352 if(!category.equals("")) {
1353 sql += "and qut_category = '" + category + "' ";
1354 }
1355 if(qType.longValue() != 0) {
1356 sql += "and qut_id = " + qType + " ";
1357 }
1358 if(!downloadName.equals("")) {
1359 sql += "and down_name like '" + downloadName + "%' ";
1360 }
1361 sql += "ORDER BY ";
1362 sql += "qut_category,qut_name,down_name ";
1363 sql += ")";
1364 sql += ") WHERE ";
1365
1370 sql += "theRow >= 0";
1371 xml = da.getXml(sql, "DownloadList", "Download");
1372 return xml;
1373 }
1374 catch(Exception e) {
1375 setRollbackOnly();
1376 throw new InstantbankException(e, "211014", "Failed to retrieve the download list");
1377 }
1378 finally {
1379 try {
1380 if(da != null) {
1381 da.disconnect();
1382 }
1383 }
1384 catch(Exception e) {
1385 }
1386 }
1387 }
1388
1389
1390 public String getFields(Long companyId, String objectType) throws InstantbankException {
1391 XMLDataAccess da = null;
1392 String sql;
1393 try {
1394 da = new XMLDataAccess("");
1395 da.connect();
1396 sql = "SELECT ";
1397 sql += "fld_table tablename, ";
1398 sql += "fld_table_alias alias,";
1399 sql += "fld_display_name display,";
1400 sql += "fld_column name, ";
1401 sql += "fld_type type, ";
1402 sql += "fvm_name menu ";
1403 sql += "FROM ";
1404 sql += "FIELDS, ";
1405 sql += "FIELD_VALUE_MENUS, ";
1406 sql += "COMPANY_FIELDS ";
1407 sql += "WHERE ";
1408 sql += "(fld_fvm_id = fvm_id(+)) AND ";
1409 sql += "(fld_object_type ='" + objectType + "') AND ";
1410 sql += "(cfld_cmp_id =" + companyId + ")";
1411
1412
1413 if(objectType.equals("A")) {
1414 sql += "UNION SELECT ";
1415 sql += "'AGREEMENTS_STATUS' tableName, ";
1416 sql += "'AGREEMENTS_STATUS' alias, ";
1417 sql += "'Status.' || stc_name display,";
1418 sql += "'AGRMS_STV_ID' name,";
1419 sql += "'S' type,";
1420 sql += "'MNU_ST_' || stc_name menu ";
1421 sql += "FROM ";
1422 sql += "STATUS_CATEGORIES ";
1423 sql += "WHERE ";
1424 sql += "stc_cmp_id =" + companyId;
1425 }
1426 return da.getXml(sql, "FieldList", "Field");
1427 }
1428 catch(Exception e) {
1429 setRollbackOnly();
1430 throw new InstantbankException(e, "211015", "Failed to retrieve fields");
1431 }
1432 finally {
1433 try {
1434 if(da != null) {
1435 da.disconnect();
1436 }
1437 }
1438 catch(Exception e) {
1439 }
1440 }
1441 }
1442
1443
1444 public String getGroupsUsersSummaries(Long companyId, Long supervisorId, String objectType) throws InstantbankException {
1445 DataAccess da = null;
1446 XMLDocument doc;
1447 DOMParser docParser = new DOMParser();
1448 XMLNode node;
1449 NodeList nodeList;
1450 XMLNode root;
1451 SecurityServices services;
1452 String sql = "";
1453 ByteArrayInputStream stream;
1454 Summary summary;
1455 Long userId;
1456 String xml;
1457 String xmlGroups;
1458
1459 try {
1460 SecurityServicesHome home = (SecurityServicesHome)ServiceLocator.instance().createEJB("SecurityServicesHome", SecurityServicesHome.class, false);
1461 services = home.create();
1462
1463 xmlGroups = services.getGroupsUsers(companyId, supervisorId, objectType);
1464 stream = new ByteArrayInputStream(xmlGroups.getBytes());
1465 docParser.setValidationMode(false);
1466 docParser.parse(stream);
1467 doc = docParser.getDocument();
1468 root = (XMLNode)doc.getDocumentElement();
1469
1470 da = new DataAccess();
1471 da.connect();
1472
1473 node = (XMLNode)root.selectSingleNode("./Supervisor");
1474 userId = new Long(node.valueOf("./id"));
1475 summary = getUserSummary(userId, 0, da);
1476 addSummaryNode(node, summary);
1477
1478 nodeList = root.selectNodes("./Group");
1479 for(int i = 0; i < nodeList.getLength(); i++) {
1480 node = (XMLNode)nodeList.item(i);
1481 summary = new Summary();
1482 summary.groupId = new Long(node.valueOf("./id")).longValue();
1483 summary.groupName = node.valueOf("./name");
1484 summary.level = 0;
1485 addChildSummaries(node, 0, summary, da);
1486 }
1487 StringWriter sw = new StringWriter();
1488 PrintWriter pw = new PrintWriter(sw);
1489 doc.print(pw);
1490 return sw.toString();
1491 }
1492 catch(Exception e) {
1493 setRollbackOnly();
1494 throw new InstantbankException(e, "211046", "Failed to retrieve queues");
1495 }
1496 finally {
1497 try {
1498 if(da != null) {
1499 da.disconnect();
1500 }
1501 }
1502 catch(Exception e) {
1503 }
1504 }
1505 }
1506
1507
1508 public String getMenus(Long companyId, String objectType) throws InstantbankException {
1509 String idName;
1510 Long idParent;
1511 String idSelect;
1512 String idType;
1513 NodeList nlIdChild;
1514 int nlLength;
1515 NodeList nlNameChild;
1516 NodeList nlSelectChild;
1517 NodeList nlTypeChild;
1518 String query;
1519 XMLDataAccess xda = null;
1520 XMLDocument xmlDoc;
1521 String xmlResult = "";
1522
1523 try {
1524 xda = new XMLDataAccess("");
1525 xda.connect();
1526 query = "SELECT ";
1527 query += "fvm_id, ";
1528 query += "fvm_name, ";
1529 query += "fvm_type, ";
1530 query += "fvm_select ";
1531 query += "FROM ";
1532 query += "field_value_menus ";
1533 query += "WHERE ";
1534 query += "fvm_id in (";
1535 query += "SELECT ";
1536 query += "DISTINCT fld_fvm_id ";
1537 query += "FROM ";
1538 query += "fields ";
1539 query += "WHERE ";
1540 query += "fld_object_type='" + objectType + "'";
1541 query += ")";
1542
1543 xmlDoc = xda.makeXMLSelect(query, "fieldsList", "fields");
1544 nlIdChild = xmlDoc.selectNodes("/fieldsList/fields/fvm_id/text()");
1545 nlTypeChild = xmlDoc.selectNodes("/fieldsList/fields/fvm_type/text()");
1546 nlSelectChild = xmlDoc.selectNodes("/fieldsList/fields/fvm_select/text()");
1547 nlNameChild = xmlDoc.selectNodes("/fieldsList/fields/fvm_name/text()");
1548 nlLength = nlIdChild.getLength();
1549
1550 xmlResult = XMLUtils.xmlHeader();
1551 xmlResult += "<MenuList>";
1552 for(int i = 0; i < nlLength; i++) {
1553 idParent = new Long(nlIdChild.item(i).getNodeValue());
1554 idType = nlTypeChild.item(i).getNodeValue();
1555 idSelect = nlSelectChild.item(i).getNodeValue();
1556 idName = nlNameChild.item(i).getNodeValue();
1557 xmlResult += "<Menu>";
1558 xmlResult += "<Name>" + idName + "</Name>";
1559 xmlResult += "<ListType>" + idType + "</ListType>";
1560 xmlResult += "<Select>" + idSelect + "</Select>";
1561 if(idType.equals("T")) {
1562
1563 xmlResult += xmlSelectTable(xda, idSelect);
1564 }
1565 if(idType.equals("F")) {
1566
1567 xmlResult += xmlSelectFixed(xda, idParent);
1568 }
1569 xmlResult += "</Menu>";
1570 }
1571 if(objectType.equals("A")) {
1572
1573 query = "SELECT ";
1574 query += "stc_id,";
1575 query += "stc_name ";
1576 query += "FROM ";
1577 query += "status_categories ";
1578 query += "WHERE ";
1579 query += "STC_CMP_ID=" + companyId;
1580
1581 xmlDoc = xda.makeXMLSelect(query, "fieldsList", "fields");
1582 nlIdChild = xmlDoc.selectNodes("/fieldsList/fields/stc_id/text()");
1583 nlNameChild = xmlDoc.selectNodes("/fieldsList/fields/stc_name/text()");
1584 nlLength = nlIdChild.getLength();
1585 for(int i = 0; i < nlLength; i++) {
1586 idParent = new Long(nlIdChild.item(i).getNodeValue());
1587 idName = nlNameChild.item(i).getNodeValue();
1588 xmlResult += "<Menu>";
1589 xmlResult += "<Name>MNU_ST_" + idName + "</Name>";
1590 xmlResult += "<ListType></ListType>";
1591 xmlResult += "<Select></Select>";
1592 xmlResult += xmlSelectCategories(xda, idParent);
1593 xmlResult += "</Menu>";
1594 }
1595 }
1596 xmlResult += "</MenuList>";
1597 return xmlResult;
1598 }
1599 catch(Exception e) {
1600 setRollbackOnly();
1601 throw new InstantbankException(e, "211016", "Failed to retrieve menus of values");
1602 }
1603 finally {
1604 try {
1605 if(xda != null) {
1606 xda.disconnect();
1607 }
1608 }
1609 catch(Exception e) {
1610 }
1611 }
1612 }
1613
1614
1615 public Long getObjectIdOfWorkItem(Long workItemId) throws InstantbankException {
1616 DataAccess da = null;
1617 Long objectId = null;
1618 ResultSet rs = null;
1619 Statement st = null;
1620
1621 try {
1622 da = new DataAccess();
1623 da.connect();
1624 st = da.getConnection().createStatement();
1625 rs = st.executeQuery("SELECT wrki_object_id FROM work_items WHERE wrki_id = " + workItemId.toString());
1626 while(rs.next()) {
1627 objectId = new Long(rs.getLong(1));
1628 }
1629 return objectId;
1630 }
1631 catch(Exception e) {
1632 setRollbackOnly();
1633 throw new InstantbankException(e, "211030", "Failed to rereive the Object Id of the Work Item");
1634 }
1635 finally {
1636 try {
1637 if(rs != null) {
1638 rs.close();
1639 }
1640 if(st != null) {
1641 st.close();
1642 }
1643 if(da != null) {
1644 da.disconnect();
1645 }
1646 }
1647 catch(Exception e) {
1648 }
1649 }
1650 }
1651
1652
1653 public String getQueue(Long queueId, Long companyId) throws InstantbankException {
1654 XMLDataAccess da = null;
1655 XMLDocument doc;
1656 Node domNode;
1657 Element root;
1658 String sql;
1659 String xml = "";
1660
1661 try {
1662 xml = XMLUtils.xmlHeader();
1663 da = new XMLDataAccess("");
1664 da.connect();
1665 sql = "SELECT ";
1666 sql += "qplan_id id, ";
1667 sql += "qplan_name name,";
1668 sql += "to_char(qplan_start_date,'mm-dd-yyyy') startDate, ";
1669 sql += "qplan_status status,";
1670 sql += "qplan_qut_id type,";
1671 sql += "qplan_description description,";
1672 sql += "QPLAN_PRIORITY priority,";
1673 sql += "users.user_userid lastChangedBy,";
1674 sql += "to_char(QPLAN_LAST_CHANGED_DATE,'mm-dd-yyyy') lastchangeddate ";
1675 sql += "FROM ";
1676 sql += "queue_plans, ";
1677 sql += "users ";
1678 sql += "WHERE ";
1679 sql += "qplan_id = " + queueId + " AND ";
1680 sql += "qplan_cmp_id = " + companyId + " AND ";
1681 sql += "qplan_last_changed_by = user_id";
1682
1683 doc = da.makeXMLSelect(sql, "Queue", "QueueFields", "mm-dd-yyyy", true);
1684 root = doc.getDocumentElement();
1685
1686 sql = "SELECT ";
1687 sql += "qpwr_sequence sequence,";
1688 sql += "qpwr_test test,";
1689 sql += "qpwr_table_name tablename,";
1690 sql += "qpwr_table_alias tablealias,";
1691 sql += "qpwr_field_name fieldname,";
1692 sql += "qpwr_field_type fieldtype,";
1693 sql += "qpwr_operator operator,";
1694 sql += "qpwr_value value,";
1695 sql += "qpwr_value_type valuetype,";
1696 sql += "qpwr_connector connector ";
1697 sql += "FROM ";
1698 sql += "queue_plans_where_rules ";
1699 sql += "WHERE ";
1700 sql += "qpwr_qplan_id =" + queueId;
1701 sql += " ORDER BY ";
1702 sql += "qpwr_sequence";
1703
1704 domNode = root;
1705 doc = da.makeXMLSelect(sql, "RulesList", "Rule", domNode);
1706 root = doc.getDocumentElement();
1707
1708 sql = "SELECT ";
1709 sql += "qpsr_sequence sequence, ";
1710 sql += "qpsr_table_name tablename,";
1711 sql += "qpsr_table_alias tablealias,";
1712 sql += "qpsr_field_name fieldname, ";
1713 sql += "qpsr_direction direction ";
1714 sql += "FROM ";
1715 sql += "queue_plan_sort_rules ";
1716 sql += "WHERE ";
1717 sql += "qpsr_qplan_id = " + queueId;
1718 sql += " ORDER BY ";
1719 sql += "qpsr_sequence ";
1720
1721 domNode = root;
1722 doc = da.makeXMLSelect(sql, "SortList", "Sort", domNode);
1723 root = doc.getDocumentElement();
1724
1725 sql = "SELECT ";
1726 sql += "qpu_user_id userid,";
1727 sql += "user_first_name || ' ' || user_last_name name ";
1728 sql += "FROM ";
1729 sql += "queue_plan_users, ";
1730 sql += "users ";
1731 sql += "WHERE ";
1732 sql += "qpu_qplan_id = " + queueId + " AND ";
1733 sql += "qpu_user_id = user_id";
1734
1735 domNode = root;
1736 xml = da.getXml(sql, "DistributionList", "User", domNode);
1737 return xml;
1738 }
1739 catch(Exception e) {
1740 setRollbackOnly();
1741 throw new InstantbankException(e, "211017", "Failed to retrieve the queue " + queueId);
1742 }
1743 finally {
1744 try {
1745 if(da != null) {
1746 da.disconnect();
1747 }
1748 }
1749 catch(Exception e) {
1750 }
1751 }
1752 }
1753
1754
1755 public String getQueues(Long companyId) throws InstantbankException {
1756 XMLDataAccess da = null;
1757 String sql;
1758 String strQueues;
1759
1760 try {
1761 da = new XMLDataAccess("");
1762 da.connect();
1763 sql = "SELECT qplan_id Id, qplan_name Name, qut_category category " +
1764 " FROM queue_plans, queue_types " +
1765 " WHERE qut_id = qplan_qut_id" +
1766 " AND qplan_cmp_id = " + companyId.toString();
1767 strQueues = da.getXml(sql, "Queues", "Queue");
1768 return strQueues;
1769 }
1770 catch(Exception e) {
1771 setRollbackOnly();
1772 throw new InstantbankException(e, "211018", "Failed to retrieve the queues");
1773 }
1774 finally {
1775 try {
1776 if(da != null) {
1777 da.disconnect();
1778 }
1779 }
1780 catch(Exception e) {
1781 }
1782 }
1783 }
1784
1785
1786 public String getQueues(Long companyId, String objectType, String category, Long qType, String queueName, long rownum, long numRecords) throws InstantbankException {
1787 String sql;
1788 XMLDataAccess da = null;
1789
1790 try {
1791 da = new XMLDataAccess("");
1792 da.connect();
1793 sql = "SELECT * FROM (";
1794 sql += "SELECT ";
1795 sql += "decode(QUT_CATEGORY,";
1796 sql += "'C','Collections',";
1797 sql += "'S','Customer Service',";
1798 sql += "'D','Download',";
1799 sql += "'T','Others'";
1800 sql += ") category,";
1801 sql += "qut_name type,";
1802 sql += "qplan_name name,";
1803 sql += "to_char(qplan_start_date,'mm-dd-yyyy') startdate,";
1804 sql += "decode(qplan_status,'A','Active','I','Inactive','P','Purge') status,";
1805 sql += "qplan_id id,";
1806 sql += "ROWNUM theRow ";
1807 sql += "FROM (";
1808 sql += "SELECT ";
1809 sql += "QUT_CATEGORY,";
1810 sql += "qut_name,";
1811 sql += "qplan_name,";
1812 sql += "qplan_start_date,";
1813 sql += "qplan_status,";
1814 sql += "qplan_id ";
1815 sql += "FROM ";
1816 sql += "queue_types,";
1817 sql += "queue_plans ";
1818 sql += "WHERE ";
1819 sql += "qut_id = qplan_qut_id AND ";
1820 sql += "qut_object_type = '" + objectType + "' AND ";
1821 sql += "qplan_stopper = 'N' AND ";
1822 sql += "qplan_cmp_id = " + companyId + " ";
1823 if(!category.equals("")) {
1824 sql += "AND qut_category = '" + category + "'";
1825 }
1826 if(qType.longValue() != 0) {
1827 sql += "AND qut_id = " + qType;
1828 }
1829 if(!queueName.equals("")) {
1830 sql += "AND UPPER(qplan_name) like UPPER('" + queueName + "%')";
1831 }
1832 sql += "ORDER BY ";
1833 sql += "qut_category,";
1834 sql += "qut_name,";
1835 sql += "qplan_name";
1836 sql += ") ";
1837 sql += ") WHERE ";
1838 sql += "theRow between " + rownum + " and " + (rownum + numRecords - 1);
1839
1840 return da.getXml(sql, "QueueList", "Queue");
1841 }
1842 catch(Exception e) {
1843 setRollbackOnly();
1844 throw new InstantbankException(e, "211019", "Failed to retrieve queues");
1845 }
1846 finally {
1847 try {
1848 if(da != null) {
1849 da.disconnect();
1850 }
1851 }
1852 catch(Exception e) {
1853 }
1854 }
1855 }
1856
1857
1858 public String getQueuesByCategory(Vector categories, Long companyId) throws InstantbankException {
1859 int i;
1860 XMLDataAccess xda = null;
1861 String xml;
1862 String xmlQuery = "";
1863
1864 try {
1865 xda = new XMLDataAccess("");
1866 xda.connect();
1867 xmlQuery += "SELECT ";
1868 xmlQuery += "qplan_id, ";
1869 xmlQuery += "qplan_name ";
1870 xmlQuery += "FROM ";
1871 xmlQuery += "queue_plans, ";
1872 xmlQuery += "queue_types ";
1873 xmlQuery += "WHERE ";
1874 xmlQuery += "qplan_cmp_id = " + companyId.toString() + " AND ";
1875 xmlQuery += "qplan_status = 'A' AND ";
1876 xmlQuery += "qplan_qut_id = qut_id AND (";
1877 for(i = 0; i < categories.size(); i++) {
1878 if(i != 0) {
1879 xmlQuery += " OR ";
1880 }
1881 xmlQuery += " qut_category = '" + (String)categories.elementAt(i) + "'";
1882 }
1883 xmlQuery += ")";
1884 xmlQuery += " ORDER BY ";
1885 xmlQuery += "qplan_name";
1886 if(categories.size() > 0) {
1887 xml = xda.getXml(xmlQuery, "queuesList", "queue");
1888 }
1889 else {
1890 xml = "";
1891 }
1892 return xml;
1893 }
1894 catch(Exception e) {
1895 setRollbackOnly();
1896 throw new InstantbankException(e, "211020", "Failed to retrieve queues by categories");
1897 }
1898 finally {
1899 try {
1900 if(xda != null) {
1901 xda.disconnect();
1902 }
1903 }
1904 catch(Exception e) {
1905 }
1906 }
1907 }
1908
1909
1910 public String getQueuesSummary(Long companyId, Long userId, long rownum, int rows) throws InstantbankException {
1911 String currentQueues;
1912 XMLDataAccess da = null;
1913 SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy");
1914 String sql;
1915
1916 try {
1917 da = new XMLDataAccess("");
1918 da.connect();
1919
1920 currentQueues = "select ";
1921 currentQueues += "max(wsum_id) id ";
1922 currentQueues += "from ";
1923 currentQueues += "work_summaries,";
1924 currentQueues += "(select distinct wrki_qplan_id from work_items where wrki_user_id=" + userId + ") ";
1925 currentQueues += "where ";
1926 currentQueues += "(wsum_user_id=" + userId + ") and ";
1927 currentQueues += "(wrki_qplan_id=wsum_qplan_id) ";
1928 currentQueues += "group by wsum_qplan_id ";
1929
1930 sql = "SELECT * FROM (";
1931 sql += "SELECT ";
1932 sql += "queueid,";
1933 sql += "queuename,";
1934 sql += "type,";
1935 sql += "category,";
1936 sql += "accounts,";
1937 sql += "worked,";
1938 sql += "transferredout,";
1939 sql += "transferredin,";
1940 sql += "remaining, ";
1941 sql += "contacts,";
1942 sql += "indirectcontacts,";
1943 sql += "attemptcontacts, ";
1944 sql += "promises,";
1945 sql += "amountpromises,";
1946 sql += "ROWNUM theRow ";
1947 sql += "FROM (";
1948 sql += "SELECT ";
1949 sql += "qplan_id queueid,";
1950 sql += "qplan_name queuename,";
1951 sql += "qut_object_type type,";
1952 sql += "decode(qut_category,'C','Collections','S','Customer Service','D','Download','T','Other') category,";
1953 sql += "wsum_total_accounts accounts,";
1954 sql += "wsum_total_worked worked,";
1955 sql += "wsum_total_transferred_out transferredout,";
1956 sql += "wsum_total_transferred_in transferredin,";
1957 sql += "wsum_total_remaining remaining,";
1958 sql += "wsum_total_contacts contacts,";
1959 sql += "wsum_total_indirect_contacts indirectcontacts,";
1960 sql += "wsum_total_attempt_contacts attemptcontacts,";
1961 sql += "wsum_total_promises promises,";
1962 sql += "wsum_total_amount_promises amountpromises ";
1963 sql += "FROM ";
1964 sql += "(" + currentQueues + ") currQueues,";
1965 sql += "work_summaries,";
1966 sql += "queue_plans,";
1967 sql += "queue_types ";
1968 sql += "WHERE ";
1969 sql += "wsum_id = currQueues.id AND ";
1970 sql += "qplan_id = wsum_qplan_id AND ";
1971 sql += "qplan_cmp_id = " + companyId + " AND qplan_status = 'A' AND ";
1972 sql += "qut_id = qplan_qut_id ";
1973 sql += "ORDER BY ";
1974 sql += "qplan_name";
1975 sql += ") ";
1976 sql += ") WHERE ";
1977 sql += "theRow >= " + rownum;
1978 if(rows != 0) {
1979 sql += " AND theRow < " + (rownum + (new Long(rows)).longValue());
1980 }
1981
1982 return da.getXml(sql, "QueuesList", "Queue");
1983 }
1984 catch(Exception e) {
1985 setRollbackOnly();
1986 throw new InstantbankException(e, "211021", "Failed to retrieve work summary for the user " + userId);
1987 }
1988 finally {
1989 try {
1990 if(da != null) {
1991 da.disconnect();
1992 }
1993 }
1994 catch(Exception e) {
1995 }
1996 }
1997 }
1998
1999
2000 public String getQueuesSupervisor(Long companyId, Long supervisorId, String objectType) throws InstantbankException {
2001 XMLDataAccess da = null;
2002 XMLDocument doc;
2003 DOMParser docParser = new DOMParser();
2004 String id;
2005 XMLDocument newDoc;
2006 XMLNode node;
2007 NodeList nodeList;
2008 Element root;
2009 SecurityServices services;
2010 String sql;
2011 ByteArrayInputStream stream;
2012 String userList;
2013 String xml;
2014 String xmlGroups;
2015
2016 try {
2017 SecurityServicesHome home = (SecurityServicesHome)ServiceLocator.instance().createEJB("SecurityServicesHome", SecurityServicesHome.class, false);
2018 services = home.create();
2019
2020 xmlGroups = services.getGroupsUsers(companyId, supervisorId, objectType);
2021 stream = new ByteArrayInputStream(xmlGroups.getBytes());
2022 docParser.setValidationMode(false);
2023 docParser.parse(stream);
2024 doc = docParser.getDocument();
2025 root = doc.getDocumentElement();
2026
2027 userList = getUserList((XMLNode)root);
2028
2029 if(!userList.equals("")) {
2030 da = new XMLDataAccess("");
2031 da.connect();
2032
2033 sql = "SELECT distinct ";
2034 sql += "qplan_id id, ";
2035 sql += "qplan_name name ";
2036 sql += "FROM ";
2037 sql += "queue_plans,";
2038 sql += "queue_plan_users ";
2039 sql += "WHERE ";
2040 sql += "qplan_id=qpu_qplan_id AND ";
2041 sql += "qplan_cmp_id=" + companyId + " AND ";
2042 sql += "qpu_user_id IN (" + userList + ")";
2043 doc = da.makeXMLSelect(sql, "QueueList", "Queue");
2044 root = doc.getDocumentElement();
2045 nodeList = root.getChildNodes();
2046 for(int i = 0; i < nodeList.getLength(); i++) {
2047 node = (XMLNode)nodeList.item(i);
2048 id = node.valueOf("./id");
2049 sql = "select distinct userid, totalaccounts, totalworked, transferin,transferout, totalremaining,custcontacts, attempcontact, indirectcontact,custpromises";
2050 sql += " from(select wsum_user_id userid , WSUM_TOTAL_ACCOUNTS totalaccounts ,WSUM_TOTAL_WORKED totalworked, WSUM_TOTAL_TRANSFERRED_IN transferin,WSUM_TOTAL_TRANSFERRED_OUT transferout, WSUM_TOTAL_REMAINING totalremaining, WSUM_TOTAL_CONTACTS custcontacts,WSUM_TOTAL_ATTEMPT_CONTACTS attempcontact,WSUM_TOTAL_INDIRECT_CONTACTS indirectcontact, WSUM_TOTAL_PROMISES custpromises";
2051 sql += " from work_summaries, queue_plan_users where wsum_qplan_id=" + id + " AND qpu_qplan_id=" + id + " AND wsum_date=(select max(wsum_date) from work_summaries where wsum_qplan_id=" + id + ")";
2052 sql += ")";
2053 newDoc = da.makeXMLSelect(sql, "UserList", "User", node);
2054 root = newDoc.getDocumentElement();
2055 }
2056 StringWriter sw = new StringWriter();
2057 PrintWriter pw = new PrintWriter(sw);
2058 doc.print(pw);
2059 return sw.toString();
2060 }
2061 else {
2062 return XMLUtils.xmlHeader() + "<QueueList />";
2063 }
2064 }
2065 catch(Exception e) {
2066 setRollbackOnly();
2067 throw new InstantbankException(e, "211022", "Failed to retrieve queues supervised by " + supervisorId);
2068 }
2069 finally {
2070 try {
2071 if(da != null) {
2072 da.disconnect();
2073 }
2074 }
2075 catch(Exception e) {
2076 }
2077 }
2078 }
2079
2080
2081 public String getQueueType(Long workItemId) throws InstantbankException {
2082 String sql;
2083 String xmlnode;
2084 DataAccess da = null;
2085 ResultSet rs = null;
2086 Statement st = null;
2087 String queueType = " ";
2088 try {
2089 da = new DataAccess();
2090 da.connect();
2091 st = da.getConnection().createStatement();
2092
2093 sql = "SELECT ";
2094 sql += "qut_category type ";
2095 sql += "FROM ";
2096 sql += "queue_types ";
2097 sql += "WHERE ";
2098 sql += "qut_id = ";
2099 sql += "(SELECT ";
2100 sql += "QPLAN_QUT_ID ";
2101 sql += "FROM ";
2102 sql += "queue_plans, ";
2103 sql += "WORK_ITEMS ";
2104 sql += "WHERE ";
2105 sql += "qplan_id = ";
2106 sql += "WRKI_QPLAN_ID ";
2107 sql += "AND ";
2108 sql += "WRKI_ID = " + workItemId + ") ";
2109 sql += "AND ROWNUM = 1";
2110 if(workItemId != null) {
2111 rs = st.executeQuery(sql);
2112 if(rs.next()) {
2113 queueType = rs.getString("type");
2114 }
2115 }
2116 return queueType;
2117 }
2118 catch(Exception e) {
2119 setRollbackOnly();
2120 throw new InstantbankException(e, "211024", "Failed to find the source queue type");
2121 }
2122 finally {
2123 try {
2124 if(rs != null) {
2125 rs.close();
2126 }
2127 if(st != null) {
2128 st.close();
2129 }
2130 if(da != null) {
2131 da.disconnect();
2132 }
2133 }
2134 catch(Exception e) {
2135 }
2136 }
2137 }
2138
2139
2140 public String getQueueTypes(Long companyId, String objectType) throws InstantbankException {
2141 String sql;
2142 XMLDataAccess da = null;
2143
2144 try {
2145 da = new XMLDataAccess("");
2146 da.connect();
2147 sql = "SELECT ";
2148 sql += "qut_id id,qut_category category,qut_name name,";
2149 sql += "qut_description description,";
2150 sql += "qut_last_changed_date lastChangedDate,";
2151 sql += "qut_last_changed_by latChangedById,";
2152 sql += "user_userid lastChangedByName ";
2153 sql += "from ";
2154 sql += "queue_types,users ";
2155 sql += "where qut_last_changed_by=user_id and ";
2156 sql += "qut_cmp_id=" + companyId + " and ";
2157 sql += "qut_object_type='" + objectType + "' ";
2158 sql += "order by qut_category,qut_name";
2159 return da.getXml(sql, "QueueTypes", "Types");
2160 }
2161 catch(Exception e) {
2162 setRollbackOnly();
2163 throw new InstantbankException(e, "211023", "Failed to retrieve queue types");
2164 }
2165 finally {
2166 try {
2167 if(da != null) {
2168 da.disconnect();
2169 }
2170 }
2171 catch(Exception e) {
2172 }
2173 }
2174 }
2175
2176
2177 public String getDownloadQueueTypes(Long companyId, String objectType) throws InstantbankException {
2178 String sql;
2179 XMLDataAccess da = null;
2180
2181 try {
2182 da = new XMLDataAccess("");
2183 da.connect();
2184 sql = "SELECT ";
2185 sql += "qut_id id,qut_category category,qut_name name,";
2186 sql += "qut_description description,";
2187 sql += "qut_last_changed_date lastChangedDate,";
2188 sql += "qut_last_changed_by latChangedById,";
2189 sql += "user_userid lastChangedByName ";
2190 sql += "from ";
2191 sql += "queue_types,users ";
2192 sql += "where qut_last_changed_by=user_id and ";
2193 sql += "qut_cmp_id=" + companyId + " and ";
2194 sql += "qut_object_type='" + objectType + "' and ";
2195 sql += "QUT_CATEGORY = 'D' and rownum = 1 ";
2196 sql += "order by qut_category,qut_name";
2197 return da.getXml(sql, "QueueTypes", "Types");
2198 }
2199 catch(Exception e) {
2200 setRollbackOnly();
2201 throw new InstantbankException(e, "211056", "Failed to retrieve queue types");
2202 }
2203 finally {
2204 try {
2205 if(da != null) {
2206 da.disconnect();
2207 }
2208 }
2209 catch(Exception e) {
2210 }
2211 }
2212 }
2213
2214
2215 public Long getStopper(Long companyId, String objectType) throws InstantbankException {
2216 DataAccess da = null;
2217 ResultSet rs = null;
2218 String sql;
2219 long stopper;
2220 Statement st = null;
2221
2222 try {
2223 da = new DataAccess();
2224 da.connect();
2225 st = da.getConnection().createStatement();
2226 sql = "SELECT ";
2227 sql += "QPLAN_ID id ";
2228 sql += "FROM ";
2229 sql += "queue_plans,";
2230 sql += "queue_types ";
2231 sql += "WHERE ";
2232 sql += "QPLAN_STOPPER='Y' AND ";
2233 sql += "QPLAN_CMP_ID=" + companyId + " AND ";
2234 sql += "QPLAN_QUT_ID=QUT_ID AND ";
2235 sql += "QUT_OBJECT_TYPE='" + objectType + "' AND ";
2236 sql += "rownum=1";
2237 rs = st.executeQuery(sql);
2238 if(rs.next()) {
2239 stopper = rs.getLong(1);
2240 }
2241 else {
2242 stopper = 0;
2243 }
2244 return new Long(stopper);
2245 }
2246 catch(Exception e) {
2247 setRollbackOnly();
2248 throw new InstantbankException(e, "211057", "Failed to find stopper queue");
2249 }
2250 finally {
2251 try {
2252 if(rs != null) {
2253 rs.close();
2254 }
2255 if(st != null) {
2256 st.close();
2257 }
2258 if(da != null) {
2259 da.disconnect();
2260 }
2261 }
2262 catch(Exception e) {
2263 }
2264 }
2265 }
2266
2267
2268 public String getToQueueType(String xml) throws InstantbankException {
2269 String sql;
2270 DataAccess da = null;
2271 ResultSet rs = null;
2272 Statement st = null;
2273 XMLDocument doc;
2274 DOMParser docParser = new DOMParser();
2275 XMLNode node;
2276 XMLNode root;
2277 ByteArrayInputStream stream;
2278 Long qplanId = new Long("0");
2279 String toQueueType = " ";
2280 try {
2281 stream = new ByteArrayInputStream(xml.getBytes());
2282 docParser.setValidationMode(false);
2283 docParser.parse(stream);
2284 doc = docParser.getDocument();
2285 root = (XMLNode)doc.getDocumentElement();
2286 node = (XMLNode)root.selectSingleNode("./activity");
2287 if(node.valueOf("./acrh_qplan_id").length() > 0) {
2288 qplanId = new Long(node.valueOf("./acrh_qplan_id"));
2289 da = new DataAccess();
2290 da.connect();
2291 st = da.getConnection().createStatement();
2292 sql = "SELECT ";
2293 sql += "qut_category type ";
2294 sql += "FROM ";
2295 sql += "queue_types ";
2296 sql += "WHERE ";
2297 sql += "qut_id = ";
2298 sql += "(SELECT ";
2299 sql += "QPLAN_QUT_ID ";
2300 sql += "FROM ";
2301 sql += "queue_plans ";
2302 sql += "WHERE ";
2303 sql += "qplan_id = " + qplanId + ") ";
2304 sql += "AND ROWNUM = 1";
2305 rs = st.executeQuery(sql);
2306 if(rs.next()) {
2307 toQueueType = rs.getString("type");
2308 }
2309 }
2310 return toQueueType;
2311 }
2312 catch(Exception e) {
2313 setRollbackOnly();
2314 throw new InstantbankException(e, "211058", "Failed to find destination queue type");
2315 }
2316 finally {
2317 try {
2318 if(rs != null) {
2319 rs.close();
2320 }
2321 if(st != null) {
2322 st.close();
2323 }
2324 if(da != null) {
2325 da.disconnect();
2326 }
2327 }
2328 catch(Exception e) {
2329 }
2330 }
2331 }
2332
2333
2334 private String getUserList(XMLNode node) throws XSLException {
2335 NodeList nodeList;
2336 String subList;
2337 String userList;
2338
2339 userList = "";
2340 nodeList = node.getChildNodes();
2341 for(int i = 0; i < nodeList.getLength(); i++) {
2342 node = (XMLNode)nodeList.item(i);
2343 if(node.getNodeName().equals("User") || node.getNodeName().equals("Supervisor")) {
2344 subList = node.valueOf("./id");
2345 }
2346 else {
2347 subList = getUserList(node);
2348 }
2349 if(!subList.equals("")) {
2350 if(!userList.equals("")) {
2351 userList += ",";
2352 }
2353 userList += subList;
2354 }
2355 }
2356 return userList;
2357 }
2358
2359
2360 public String getUserName(Long userId) throws InstantbankException {
2361 DataAccess da = null;
2362 ResultSet rs = null;
2363 String sql;
2364 String name = new String("");
2365 Statement st = null;
2366 try {
2367 da = new DataAccess();
2368 da.connect();
2369 st = da.getConnection().createStatement();
2370 sql = "SELECT USER_FIRST_NAME||' '||USER_LAST_NAME alias";
2371 sql += " FROM ";
2372 sql += "users";
2373 sql += " WHERE ";
2374 sql += " USER_ID =" + userId;
2375 rs = st.executeQuery(sql);
2376 if(rs.next()) {
2377 name = rs.getString("alias");
2378 }
2379
2380 }
2381 catch(Exception e) {
2382 }
2383 finally {
2384 try {
2385 if(rs != null) {
2386 rs.close();
2387 }
2388 if(st != null) {
2389 st.close();
2390 }
2391 }
2392 catch(Exception e) {
2393 }
2394 }
2395 return name;
2396 }
2397
2398
2399 public String getUserQueues(Long companyId, Long userId, Long supervisorId, Long rowInit, int numRecords) throws InstantbankException {
2400 XMLDataAccess da = null;
2401 String sql;
2402
2403 try {
2404 da = new XMLDataAccess("");
2405 da.connect();
2406 sql = "SELECT * FROM (";
2407 sql += "SELECT ";
2408 sql += "decode(QUT_CATEGORY,";
2409 sql += "'C','Collections',";
2410 sql += "'S','Customer Service',";
2411 sql += "'D','Download',";
2412 sql += "'T','Others'";
2413 sql += ") category,";
2414 sql += "qplan_name,";
2415 sql += "wsum_total_accounts,";
2416 sql += "wsum_qplan_id,";
2417 sql += "ROWNUM theRow ";
2418 sql += "FROM (";
2419 sql += "SELECT ";
2420 sql += "QUT_CATEGORY,";
2421 sql += "qplan_name,";
2422 sql += "wsum_total_accounts,";
2423 sql += "wsum_qplan_id ";
2424 sql += "FROM ";
2425 sql += "queue_types,";
2426 sql += "queue_plans,";
2427 sql += "work_summaries ";
2428 sql += "WHERE ";
2429 sql += "qut_id = qplan_qut_id AND ";
2430 sql += "wsum_qplan_id = qplan_id AND ";
2431 sql += "wsum_user_id=" + userId + " AND ";
2432 sql += "WSUM_supervisor_id=" + supervisorId + " AND ";
2433 sql += "qplan_cmp_id = " + companyId;
2434 sql += "ORDER BY ";
2435 sql += "qplan_name";
2436 sql += ")";
2437 sql += ") WHERE ";
2438 sql += "theRow between " + rowInit + " AND " + (rowInit.longValue() + (new Long(numRecords)).longValue() + (-1));
2439 return da.getXml(sql, "QueueList", "Queue");
2440 }
2441 catch(Exception e) {
2442 setRollbackOnly();
2443 throw new InstantbankException(e, "211025", "Failed to retrieve queues for the user " + userId);
2444 }
2445 finally {
2446 try {
2447 if(da != null) {
2448 da.disconnect();
2449 }
2450 }
2451 catch(Exception e) {
2452 }
2453 }
2454 }
2455
2456
2457 private Summary getUserSummary(Long userId, int level, DataAccess da) throws SQLException, InstantbankException {
2458 ResultSet rs = null;
2459 String sql;
2460 Summary summary = new Summary();
2461 Statement st = null;
2462 try {
2463 st = da.getConnection().createStatement();
2464 sql = "SELECT ";
2465 sql += "decode(sum(WS.wsum_total_accounts),null,0,sum(wsum_total_accounts)) accounts,";
2466 sql += "decode(sum(wsum_total_worked),null,0,sum(wsum_total_worked)) worked,";
2467 sql += "decode(sum(wsum_total_transferred_in),null,0,sum(wsum_total_transferred_in)) transferredin,";
2468 sql += "decode(sum(wsum_total_transferred_out),null,0,sum(wsum_total_transferred_out)) transferredout,";
2469 sql += "decode(sum(wsum_total_remaining),null,0,sum(wsum_total_remaining)) remaining,";
2470 sql += "decode(sum(wsum_total_contacts),null,0,sum(wsum_total_contacts)) contacts,";
2471 sql += "decode(sum(wsum_total_promises),null,0,sum(wsum_total_promises)) promises,";
2472 sql += "decode(sum(wsum_total_amount_promises),null,0,sum(wsum_total_amount_promises)) amountpromises,";
2473 sql += "decode(sum(wsum_total_indirect_contacts),null,0,sum(wsum_total_indirect_contacts)) indirectcontacts,";
2474 sql += "decode(sum(wsum_total_attempt_contacts),null,0,sum(wsum_total_attempt_contacts)) attemptcontacts ";
2475 sql += " FROM ";
2476 sql += " work_summaries WS, queue_plans QP ";
2477 sql += " WHERE ";
2478 sql += "WS.WSUM_DATE = (";
2479 sql += " select ";
2480 sql += " MAX(WSUM_DATE ) ";
2481 sql += " from ";
2482 sql += " work_summaries ";
2483 sql += " where ";
2484 sql += " wsum_user_id = " + userId + " ) ";
2485 sql += " AND qp.QPLAN_STATUS = 'A' AND ws.WSUM_QPLAN_ID = QP.QPLAN_ID ";
2486 sql += " AND wsum_user_id = " + userId;
2487
2488 rs = st.executeQuery(sql);
2489 rs.next();
2490 summary.totalAccounts = rs.getInt("accounts");
2491 summary.worked = rs.getInt("worked");
2492 summary.transferredIn = rs.getInt("transferredin");
2493 summary.transferredOut = rs.getInt("transferredout");
2494 summary.remaining = rs.getInt("remaining");
2495 summary.contacts = rs.getInt("contacts");
2496 summary.promises = rs.getInt("promises");
2497 summary.amountPromises = rs.getLong("amountpromises");
2498 summary.indirectContacts = rs.getInt("indirectcontacts");
2499 summary.attemptedContacts = rs.getInt("attemptcontacts");
2500
2501 }
2502 catch(Exception e) {
2503 }
2504 finally {
2505 try {
2506 if(rs != null) {
2507 rs.close();
2508 }
2509 if(st != null) {
2510 st.close();
2511 }
2512 }
2513 catch(Exception e) {
2514 }
2515 }
2516 return summary;
2517 }
2518
2519
2520 public String getUsersSupervisorQueue(Long userId) throws InstantbankException {
2521 DataAccess da = null;
2522 String dataQuery = "";
2523 Long groupId = null;
2524 Long queueId = null;
2525 ResultSet rs = null;
2526 Statement st = null;
2527 XMLDataAccess xda = new XMLDataAccess("database.properties");
2528
2529 try {
2530 da = new DataAccess();
2531 da.connect();
2532 st = da.getConnection().createStatement();
2533
2534 dataQuery = "SELECT ";
2535 dataQuery += "csp_supervisor_queue_id ";
2536 dataQuery += "FROM ";
2537 dataQuery += "users, ";
2538 dataQuery += "security_profiles, ";
2539 dataQuery += "collections_security_profiles ";
2540 dataQuery += "WHERE ";
2541 dataQuery += "user_id = " + userId.toString() + " AND ";
2542 dataQuery += "user_sprf_id = sprf_id AND ";
2543 dataQuery += "sprf_csp_id = csp_id";
2544
2545 rs = st.executeQuery(dataQuery);
2546 if(rs.next()) {
2547 if(rs.getLong(1) != 0) {
2548 queueId = new Long(rs.getLong(1));
2549 }
2550 }
2551 if(queueId == null) {
2552
2553 dataQuery = "SELECT ";
2554 dataQuery += "user_usg_id ";
2555 dataQuery += "FROM ";
2556 dataQuery += "users ";
2557 dataQuery += "WHERE ";
2558 dataQuery += "user_id = " + userId.toString();
2559
2560 rs = st.executeQuery(dataQuery);
2561 if(rs.next()) {
2562 groupId = new Long(rs.getLong(1));
2563 }
2564 else {
2565 throw new InstantbankException("211026", "Group not found for user " + userId);
2566 }
2567
2568 while((queueId == null) && (!groupId.equals(new Long(0)))) {
2569 dataQuery = "SELECT ";
2570 dataQuery += "usg_parent_id, ";
2571 dataQuery += "csp_supervisor_queue_id ";
2572 dataQuery += "FROM ";
2573 dataQuery += "user_groups, ";
2574 dataQuery += "security_profiles,";
2575 dataQuery += "collections_security_profiles ";
2576 dataQuery += "WHERE ";
2577 dataQuery += "usg_id = " + groupId.toString() + " AND ";
2578 dataQuery += "usg_sprf_id = sprf_id AND ";
2579 dataQuery += "sprf_csp_id = csp_id";
2580
2581 rs = st.executeQuery(dataQuery);
2582 if(rs.next()) {
2583 groupId = new Long(rs.getLong(1));
2584 if(rs.getLong(2) != 0) {
2585 queueId = new Long(rs.getLong(2));
2586 }
2587 }
2588 else {
2589 throw new InstantbankException("211027", "Profile not found for the user group " + groupId);
2590 }
2591
2592 }
2593 }
2594
2595 if(queueId != null) {
2596 xda.connect();
2597 dataQuery = "SELECT ";
2598 dataQuery += "qplan_id, ";
2599 dataQuery += "qplan_name ";
2600 dataQuery += "FROM ";
2601 dataQuery += "queue_plans ";
2602 dataQuery += "WHERE ";
2603 dataQuery += "qplan_id = " + queueId.toString();
2604 return xda.getXml(dataQuery, "supervisorQueuesList", "supervisorQueue");
2605 }
2606 else {
2607 return "";
2608 }
2609 }
2610 catch(Exception e) {
2611 setRollbackOnly();
2612 throw new InstantbankException(e, "211028", "Failed to retrieve queues for supervisor " + userId);
2613 }
2614 finally {
2615 try {
2616 if(rs != null) {
2617 rs.close();
2618 }
2619 if(st != null) {
2620 st.close();
2621 }
2622 if(xda != null) {
2623 xda.disconnect();
2624 }
2625 if(da != null) {
2626 da.disconnect();
2627 }
2628 }
2629 catch(Exception e) {
2630 }
2631 }
2632 }
2633
2634
2635 private String getViewWorkItems(String objectType, Long queueId, Long userId, Long companyId) {
2636 String sql = "";
2637
2638 if(objectType.equals("A")) {
2639 sql = "SELECT ";
2640 sql += "wrki_id id,";
2641 sql += "wrki_qplan_id qplan_id,";
2642 sql += "wrki_user_id user_id,";
2643 sql += "wrki_class_id class_id,";
2644 sql += "wrki_order item_order,";
2645 sql += "wrki_status status,";
2646 sql += "wrki_followup_date followup_date,";
2647 sql += "wrki_followup_time followup_time,";
2648 sql += "wrki_last_changed_by last_changed_by,";
2649 sql += "wrki_last_changed_date last_changed_date,";
2650 sql += "agrm_id object_id,";
2651 sql += "agrm_cmp_id cmp_id,";
2652 sql += "agrm_code account_number,";
2653 sql += "cust_first_name || ' ' || cust_last_name account_name,";
2654 sql += "agrm_curr_del_days days,";
2655 sql += "agrm_amount_past_due amount,";
2656 sql += "wrki_activity_id work_activity_id,";
2657 sql += "lastAgreementActivity(agrm_id) account_activity_id ";
2658 sql += "FROM ";
2659 sql += "work_items,";
2660 sql += "agreements,";
2661 sql += "agreements_cust_links,";
2662 sql += "customers ";
2663 sql += "WHERE ";
2664 sql += "(wrki_object_type = 'A') and ";
2665 sql += "(agrm_id = wrki_object_id) and ";
2666 sql += "(acl_agrm_id = agrm_id) and ";
2667 sql += "(cust_id = acl_cust_id) and ";
2668 sql += "(acl_csr_code = 'PR') and ";
2669 sql += "(wrki_qplan_id=" + queueId + ") and ";
2670 sql += "(wrki_user_id=" + userId + ")";
2671 }
2672 return sql;
2673 }
2674
2675
2676 public Long getWork(Long companyId, Long userId, Long wrkiId, String status, Long firstWrkiId) throws InstantbankException {
2677 DataAccess da = null;
2678 ResultSet rs = null;
2679 ResultSet rs2 = null;
2680 String sql;
2681 Statement st = null;
2682 long wrki_id = 0;
2683 int timeOffset = 0;
2684
2685 try {
2686 da = new DataAccess();
2687 da.connect();
2688 st = da.getConnection().createStatement();
2689 rs2 = st.executeQuery("SELECT USER_TIME_OFFSET FROM USERS WHERE USER_ID=" + userId);
2690 if(rs2.next()) {
2691 timeOffset = rs2.getInt(1);
2692 }
2693
2694
2695 sql = "SELECT WRKI_ID FROM ";
2696 sql += "(SELECT ";
2697 sql += "WRKI_ID ";
2698 sql += "FROM ";
2699 sql += "WORK_ITEMS,";
2700 sql += "queue_plans ";
2701 sql += "WHERE ";
2702 if(wrkiId.longValue() != 0L) {
2703 sql += "wrki_qplan_id = (select wrki_qplan_id from work_items where wrki_id=" + wrkiId + ") AND ";
2704 }
2705 sql += "WRKI_QPLAN_ID=QPLAN_ID AND ";
2706 sql += "to_char(WRKI_FOLLOWUP_DATE,'mm-dd-yyyy') = to_char((SYSDATE+(" + timeOffset + "/24)),'mm-dd-yyyy') AND ";
2707 sql += "WRKI_STATUS<>'W' AND ";
2708 sql += "WRKI_USER_ID=" + userId + " AND ";
2709 sql += "QPLAN_CMP_ID=" + companyId + " AND ";
2710 sql += "WRKI_FOLLOWUP_TIME<>'00:00' AND ";
2711 sql += "WRKI_FOLLOWUP_TIME <= SUBSTR(TO_CHAR((SYSDATE+(" + timeOffset + "/24)),'HH24:MI'),1,2)||SUBSTR(TO_CHAR((SYSDATE+(" + timeOffset + "/24)),'HH24:MI'),3,3) AND ";
2712 sql += "WRKI_ID <>" + wrkiId;
2713
2714 sql += " ORDER BY ";
2715 sql += "WRKI_ORDER)";
2716 sql += " WHERE ROWNUM=1";
2717 rs = st.executeQuery(sql);
2718 if(rs.next()) {
2719 wrki_id = rs.getLong(1);
2720 }
2721 if(status.equalsIgnoreCase("N")) {
2722 if(wrki_id == 0) {
2723
2724 sql = "SELECT WRKI_ID FROM ";
2725 sql += "(SELECT ";
2726 sql += "WRKI_ID ";
2727 sql += "FROM ";
2728 sql += "WORK_ITEMS ";
2729 sql += "WHERE ";
2730 sql += "WRKI_STATUS <>'W' AND ";
2731 sql += "to_char(WRKI_FOLLOWUP_DATE,'mm-dd-yyyy') < to_char((SYSDATE+(" + timeOffset + "/24)),'mm-dd-yyyy') AND ";
2732 sql += "WRKI_USER_ID=" + userId + " AND ";
2733 if(wrkiId.longValue() != 0L) {
2734 sql += "wrki_qplan_id = (select wrki_qplan_id from work_items where wrki_id=" + wrkiId + ") AND ";
2735 }
2736 sql += "WRKI_ID <>" + wrkiId + " AND ";
2737 sql += "(WRKI_FOLLOWUP_TIME ='00:00' OR ";
2738 sql += "WRKI_FOLLOWUP_TIME <= TO_CHAR((SYSDATE+(" + timeOffset + "/24)),'HH24:MI'))";
2739
2740 sql += " ORDER BY ";
2741 sql += "WRKI_FOLLOWUP_DATE,";
2742 sql += "WRKI_ORDER)";
2743 sql += " WHERE ROWNUM=1 ";
2744 rs = st.executeQuery(sql);
2745 if(rs.next()) {
2746 wrki_id = rs.getLong(1);
2747 }
2748 }
2749
2750 if(wrki_id == 0) {
2751
2752 sql = "SELECT WRKI_ID FROM ";
2753 sql += "(SELECT WRKI_ID FROM ";
2754 sql += "WORK_ITEMS,";
2755 sql += "queue_plans ";
2756 sql += "WHERE ";
2757 if(wrkiId.longValue() != 0L) {
2758 sql += "wrki_qplan_id = (select wrki_qplan_id from work_items where wrki_id=" + wrkiId + ") AND ";
2759 }
2760 sql += "WRKI_QPLAN_ID=QPLAN_ID AND ";
2761 sql += "to_char(WRKI_FOLLOWUP_DATE,'mm-dd-yyyy') = to_char((SYSDATE+(" + timeOffset + "/24)),'mm-dd-yyyy') AND ";
2762 sql += "WRKI_STATUS='N' AND ";
2763 sql += "WRKI_USER_ID=" + userId + " AND ";
2764 sql += "QPLAN_CMP_ID=" + companyId + " AND ";
2765 sql += "WRKI_FOLLOWUP_TIME='00:00' AND ";
2766 sql += "WRKI_ID <>" + wrkiId + " ";
2767 sql += "ORDER BY ";
2768 sql += "WRKI_ORDER)";
2769 sql += " WHERE ROWNUM=1 ";
2770 rs = st.executeQuery(sql);
2771 if(rs.next()) {
2772 wrki_id = rs.getLong(1);
2773 }
2774 }
2775 }
2776 else if(status.equalsIgnoreCase("T") && wrki_id == 0) {
2777
2778 sql = "SELECT WRKI_ID FROM ";
2779 sql += "(SELECT WRKI_ID ";
2780 sql += "FROM WORK_ITEMS,QUEUE_PLANS,AGREEMENTS ";
2781 sql += "WHERE ";
2782 if(wrkiId.longValue() != 0L) {
2783 sql += "wrki_qplan_id = (select wrki_qplan_id from work_items where wrki_id=" + wrkiId + ") AND ";
2784 }
2785 sql += "WRKI_QPLAN_ID=QPLAN_ID AND ";
2786 sql += "TO_CHAR(WRKI_FOLLOWUP_DATE,'mm-dd-yyyy') <= TO_CHAR((SYSDATE+(" + timeOffset + "/24)),'mm-dd-yyyy') AND ";
2787 sql += "WRKI_STATUS<>'W' AND ";
2788 sql += "WRKI_USER_ID=" + userId + " AND ";
2789 sql += "QPLAN_CMP_ID=" + companyId + " AND ";
2790 sql += "WRKI_FOLLOWUP_TIME<>'00:00' AND ";
2791 sql += "WRKI_FOLLOWUP_TIME>TO_CHAR((SYSDATE+(" + timeOffset + "/24)),'HH24:MI') AND ";
2792 sql += "WRKI_ID <>" + wrkiId + " AND ";
2793 sql += "AGRM_ID=WRKI_OBJECT_ID AND ";
2794 sql += "AGRM_PERMANENT_REVIEW_TIME IS NOT NULL ";
2795 sql += "ORDER BY WRKI_ORDER)";
2796 sql += "WHERE ROWNUM=1 ";
2797 rs = st.executeQuery(sql);
2798 if(rs.next()) {
2799 wrki_id = rs.getLong(1);
2800 }
2801
2802 }
2803 else if(status.equalsIgnoreCase("R") && wrki_id == 0) {
2804 sql = "SELECT WRKI_ID FROM ";
2805 sql += "(SELECT ";
2806 sql += "WRKI_ID ";
2807 sql += "FROM ";
2808 sql += "WORK_ITEMS,";
2809 sql += "queue_plans ";
2810 sql += "WHERE ";
2811 if(wrkiId.longValue() != 0L) {
2812 sql += "wrki_qplan_id = (select wrki_qplan_id from work_items where wrki_id=" + wrkiId + ") AND ";
2813 }
2814 sql += "WRKI_QPLAN_ID=QPLAN_ID AND ";
2815 sql += "to_char(WRKI_FOLLOWUP_DATE,'mm-dd-yyyy') <= to_char((SYSDATE+(" + timeOffset + "/24)),'mm-dd-yyyy') AND ";
2816 sql += "WRKI_STATUS='R' AND ";
2817 sql += "WRKI_USER_ID=" + userId + " AND ";
2818 sql += "QPLAN_CMP_ID=" + companyId + " AND ";
2819 if(wrkiId.longValue() != firstWrkiId.longValue()) {
2820 sql += "WRKI_ORDER > (select wrki_order from work_items where wrki_id = " + wrkiId + ") AND ";
2821 }
2822 sql += "WRKI_ID <>" + wrkiId + " AND ";
2823 sql += "WRKI_ID <>" + firstWrkiId + " ";
2824 sql += "ORDER BY ";
2825 sql += "WRKI_ORDER) ";
2826 sql += "WHERE rownum=1 ";
2827 rs = st.executeQuery(sql);
2828 if(rs.next()) {
2829 wrki_id = rs.getLong(1);
2830 }
2831 }
2832 else if(status.equalsIgnoreCase("W") && wrki_id == 0) {
2833 sql = "SELECT WRKI_ID FROM ";
2834 sql += "(SELECT WRKI_ID FROM ";
2835 sql += "WORK_ITEMS,";
2836 sql += "queue_plans ";
2837 sql += "WHERE ";
2838 if(wrkiId.longValue() != 0L) {
2839 sql += "wrki_qplan_id = (select wrki_qplan_id from work_items where wrki_id=" + wrkiId + ") AND ";
2840 }
2841 sql += "WRKI_QPLAN_ID=QPLAN_ID AND ";
2842 sql += "to_char(WRKI_FOLLOWUP_DATE,'mm-dd-yyyy') <= to_char((SYSDATE+(" + timeOffset + "/24)),'mm-dd-yyyy') AND ";
2843 sql += "WRKI_STATUS='W' AND ";
2844 sql += "WRKI_USER_ID=" + userId + " AND ";
2845 sql += "QPLAN_CMP_ID=" + companyId + " AND ";
2846 sql += "WRKI_ID <>" + wrkiId;
2847
2848 sql += " ORDER BY ";
2849 sql += "WRKI_ORDER)";
2850 sql += " WHERE ROWNUM=1 ";
2851 rs = st.executeQuery(sql);
2852 if(rs.next()) {
2853 wrki_id = rs.getLong(1);
2854 }
2855 }
2856
2857 return new Long(wrki_id);
2858 }
2859 catch(Exception e) {
2860 setRollbackOnly();
2861 throw new InstantbankException(e, "211029", "Failed to get work item");
2862 }
2863 finally {
2864 try {
2865 if(rs != null) {
2866 rs.close();
2867 }
2868 if(st != null) {
2869 st.close();
2870 }
2871 if(da != null) {
2872 da.disconnect();
2873 }
2874 }
2875 catch(Exception e) {
2876 }
2877 }
2878 }
2879
2880
2881 public String getWork(Long companyId, Long userId, String objectType, Long queueId, String status, Long rowNum, int rows) throws InstantbankException {
2882 long activityId;
2883 DataAccess da = null;
2884 int i;
2885 String inSentence = "";
2886 ResultSet rs = null;
2887 ResultSet rsPromises = null;
2888 String sql;
2889 String vWorkItems;
2890 Statement st = null;
2891 Statement stPromises = null;
2892 String xml = "";
2893
2894 try {
2895 xml = XMLUtils.xmlHeader();
2896 da = new DataAccess();
2897 da.connect();
2898 st = da.getConnection().createStatement();
2899 inSentence = getWrkiId(userId, queueId, status, rowNum, rows);
2900 sql = "SELECT ";
2901 sql += " id, ";
2902 sql += " object_id objectId, ";
2903 sql += " account_number accountNumber, ";
2904 sql += " account_name accountName, ";
2905 sql += " days, ";
2906 sql += " amount, ";
2907 sql += " work_activity_id activity_id, ";
2908 sql += " act_code action, ";
2909 sql += " res_code result ";
2910 sql += " FROM ( SELECT ";
2911 sql += " wrki_id id, ";
2912 sql += " wrki_qplan_id qplan_id, ";
2913 sql += " wrki_user_id user_id, ";
2914 sql += " wrki_class_id class_id, ";
2915 sql += " wrki_order item_order, ";
2916 sql += " wrki_status status, ";
2917 sql += " wrki_followup_date followup_date, ";
2918 sql += " wrki_followup_time followup_time, ";
2919 sql += " wrki_last_changed_by last_changed_by, ";
2920 sql += " wrki_last_changed_date last_changed_date, ";
2921 sql += " agrm_id object_id, ";
2922 sql += " agrm_cmp_id cmp_id, ";
2923 sql += " agrm_code account_number, ";
2924 sql += " cust_first_name || ' ' || cust_last_name account_name, ";
2925 sql += " agrm_curr_del_days days,agrm_amount_past_due amount, ";
2926 sql += " wrki_activity_id work_activity_id, ";
2927 sql += " lastAgreementActivity(agrm_id) account_activity_id ";
2928 sql += " FROM ";
2929 sql += " work_items, ";
2930 sql += " agreements, ";
2931 sql += " agreements_cust_links, ";
2932 sql += " customers ";
2933 sql += " WHERE ";
2934 sql += " (wrki_id in(" + inSentence + ")) and ";
2935 sql += " (agrm_id = wrki_object_id) and ";
2936 sql += " (acl_agrm_id = agrm_id) and ";
2937 sql += " (cust_id = acl_cust_id) and ";
2938 sql += " (acl_csr_code = 'PR') ";
2939 sql += "ORDER BY ";
2940 sql += "wrki_followup_date, ";
2941 sql += "wrki_followup_time, ";
2942 sql += "wrki_order ";
2943 sql += " ) v_wrki, ";
2944 sql += " action_results_history, ";
2945 sql += " actions, ";
2946 sql += " results ";
2947 sql += "WHERE ";
2948 sql += " (acrh_id(+) = work_activity_id) AND ";
2949 sql += " (act_id(+) = acrh_act_id) AND ";
2950 sql += " (res_id(+) = acrh_res_id) ";
2951 rs = st.executeQuery(sql);
2952 xml += "<AccountsList> ";
2953 i = 0;
2954 while(rs.next()) {
2955 i++;
2956 xml += "<Account num='" + (i + 1) + "'>";
2957 xml += "<id>" + rs.getLong(1) + "</id>";
2958 xml += "<objectid>" + rs.getLong(2) + "</objectid>";
2959 xml += "<accountnumber>" + rs.getString(3) + "</accountnumber>";
2960 xml += "<accountname>" + rs.getString(4) + "</accountname>";
2961 xml += "<days>" + rs.getInt(5) + "</days>";
2962 xml += "<amount>" + rs.getDouble(6) + "</amount>";
2963 activityId = rs.getLong("activity_id");
2964 if(activityId != 0) {
2965 xml += "<activityid>" + activityId + "</activityid>";
2966 xml += "<action>" + rs.getString(8) + "</action>";
2967 xml += "<result>" + rs.getString(9) + "</result>";
2968 if(objectType.equals("A")) {
2969 sql = "SELECT ";
2970 sql += "nvl(sum(prm_amount),0) promiseamount,";
2971 sql += "max(to_char(prm_date,'mm-dd-yyyy')) promiseduedate,";
2972 sql += "min(to_char(ACRH_NEXT_REVIEW_DATE,'mm-dd-yyyy')) nextreviewdate ";
2973 sql += "FROM ";
2974 sql += "promises, ";
2975 sql += "action_results_history ";
2976 sql += "WHERE ";
2977 sql += "prm_acrh_id(+) = ACRH_ID and ";
2978 sql += "ACRH_ID = " + activityId;
2979 stPromises = da.getConnection().createStatement();
2980 rsPromises = stPromises.executeQuery(sql);
2981 if(rsPromises.next()) {
2982 xml += "<promiseamount>" + rsPromises.getDouble(1) + "</promiseamount>";
2983 xml += "<promiseduedate>" + rsPromises.getString(2) + "</promiseduedate>";
2984 xml += "<nextreviewdate>" + rsPromises.getString(3) + "</nextreviewdate>";
2985 }
2986 rsPromises.close();
2987 rsPromises = null;
2988 stPromises.close();
2989 stPromises = null;
2990 }
2991 }
2992 xml += "</Account> ";
2993 }
2994 xml += "</AccountsList> ";
2995 return xml;
2996 }
2997 catch(Exception e) {
2998 setRollbackOnly();
2999 throw new InstantbankException(e, "211059", "Failed to read items from queue");
3000 }
3001 finally {
3002 try {
3003 if(rsPromises != null) {
3004 rsPromises.close();
3005 }
3006 if(stPromises != null) {
3007 stPromises.close();
3008 }
3009 if(rs != null) {
3010 rs.close();
3011 }
3012 if(st != null) {
3013 st.close();
3014 }
3015 if(da != null) {
3016 da.disconnect();
3017 }
3018
3019 }
3020 catch(Exception e) {
3021 }
3022 }
3023 }
3024
3025
3026 private String getWrkiId(Long userId, Long qplanId, String wrkiStatus, Long rowNum, int rows) throws SQLException, InstantbankException {
3027 String arrWrkId = "";
3028 DataAccess da = null;
3029 ResultSet rs = null;
3030 ResultSet rs2 = null;
3031 String sql = "";
3032 Statement st = null;
3033 int timeOffset = 0;
3034
3035 try {
3036 da = new DataAccess();
3037 da.connect();
3038 st = da.getConnection().createStatement();
3039 rs2 = st.executeQuery("SELECT USER_TIME_OFFSET FROM USERS WHERE USER_ID=" + userId);
3040 if(rs2.next()) {
3041 timeOffset = rs2.getInt(1);
3042 }
3043 if(wrkiStatus.equals("N")) {
3044 sql = "SELECT id FROM (";
3045 sql += "SELECT id,ROWNUM theRow FROM (SELECT ";
3046 sql += " wrki_id id ";
3047 sql += " FROM ";
3048 sql += " work_items ";
3049 sql += " WHERE ";
3050 sql += " (wrki_object_type = 'A') and ";
3051 sql += " (wrki_qplan_id= " + qplanId + ") and ";
3052 sql += " (wrki_user_id= " + userId + ") AND ";
3053 sql += " (wrki_status='" + wrkiStatus + "') AND ";
3054 sql += " (wrki_followup_time <= to_char((sysdate+(" + timeOffset + "/24)),'HH24:MI')) ";
3055 sql += " ORDER BY ";
3056 sql += " wrki_followup_date, ";
3057 sql += " wrki_followup_time, ";
3058 sql += " wrki_order ";
3059 sql += " ) ";
3060 sql += ")WHERE theRow between " + rowNum + " and " + (rowNum.longValue() + (new Long(rows)).longValue() + (-1));
3061 }
3062 else if(wrkiStatus.equals("T")) {
3063 sql = "SELECT id FROM (";
3064 sql += "SELECT WRKI_ID id,ROWNUM theRow ";
3065 sql += "FROM AGREEMENTS,WORK_ITEMS ";
3066 sql += "WHERE WRKI_OBJECT_ID = AGRM_ID AND ";
3067 sql += "(wrki_object_type = 'A') AND ";
3068 sql += "(wrki_qplan_id=" + qplanId + ") AND ";
3069 sql += "(wrki_user_id=" + userId + ") AND ";
3070 sql += "(wrki_status<>'W') AND ";
3071 sql += "(wrki_followup_date<=to_date(SYSDATE+(0/24)) AND ";
3072 sql += "wrki_followup_time>to_char(SYSDATE+(0/24),'HH24:MI') AND ";
3073 sql += "wrki_followup_time <>'00:00') AND ";
3074 sql += "AGRM_PERMANENT_REVIEW_TIME IS NOT NULL ";
3075 sql += "ORDER BY wrki_followup_date,";
3076 sql += "wrki_followup_time,";
3077 sql += "wrki_order ) ";
3078 sql += "WHERE theRow between " + rowNum + " and " + (rowNum.longValue() + (new Long(rows)).longValue() + (-1));
3079 }
3080 else if(wrkiStatus.equals("R")) {
3081 sql = "SELECT id ";
3082 sql += "FROM ( ";
3083 sql += "SELECT ";
3084 sql += "id, ";
3085 sql += "ROWNUM theRow ";
3086 sql += "FROM( ";
3087 sql += "SELECT ";
3088 sql += "wrki_id id ";
3089 sql += "FROM ";
3090 sql += "work_items ";
3091 sql += "WHERE ";
3092 sql += "(wrki_object_type = 'A') and ";
3093 sql += "(wrki_qplan_id=" + qplanId + ") and ";
3094 sql += "(wrki_user_id=" + userId + ") and ";
3095 sql += "(wrki_status='" + wrkiStatus + "') ";
3096 sql += "ORDER BY ";
3097 sql += "wrki_followup_date, ";
3098 sql += "wrki_followup_time, ";
3099 sql += "wrki_order ";
3100 sql += ")) ";
3101 sql += "where theRow between " + rowNum + " and " + (rowNum.longValue() + (new Long(rows)).longValue() + (-1));
3102 }
3103 else if(wrkiStatus.equals("W")) {
3104 sql = "SELECT id,agrm FROM ( ";
3105 sql += "SELECT ";
3106 sql += " wrki_id id, wrki_object_id agrm, ";
3107 sql += " ROWNUM theRow ";
3108 sql += "FROM ";
3109 sql += " work_items ";
3110 sql += "WHERE ";
3111 sql += " (wrki_object_type = 'A') and ";
3112 sql += " (wrki_qplan_id=" + qplanId + ") and ";
3113 sql += " (wrki_user_id=" + userId + ") and ";
3114 sql += " (wrki_status = '" + wrkiStatus + "') and ";
3115 sql += " (wrki_from_transfers is null)";
3116 sql += ") where ";
3117 sql += "theRow between " + rowNum + " and " + (rowNum.longValue() + (new Long(rows)).longValue() + (-1));
3118 }
3119 rs = st.executeQuery(sql);
3120 while(rs.next()) {
3121 arrWrkId += rs.getString(1);
3122 arrWrkId += ",";
3123 }
3124 arrWrkId += "0";
3125 return arrWrkId;
3126 }
3127 catch(Exception e) {
3128 setRollbackOnly();
3129 throw new InstantbankException(e, "211055", "Failed retreive the wrkId");
3130 }
3131 finally {
3132 try {
3133
3134 if(st != null) {
3135 st.close();
3136 }
3137 if(da != null) {
3138 da.disconnect();
3139 }
3140 }
3141 catch(Exception e) {
3142 }
3143 }
3144 }
3145
3146
3147 public String newClass() throws InstantbankException {
3148 String xml;
3149 java.util.Date today = new java.util.Date();
3150 SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy");
3151
3152 try {
3153 xml = XMLUtils.xmlHeader();
3154 xml += "<Class>";
3155 xml += "<id>0</id>";
3156 xml += "<startdate>" + sdf.format(today) + "</startdate>";
3157 xml += "<lastchangeddate>" + sdf.format(today) + "</lastchangeddate>";
3158 xml += "<priority>0</priority>";
3159 xml += "<status>A</status>";
3160 xml += "<ClassList/>";
3161 xml += "<RulesList/>";
3162 xml += "</Class>";
3163 }
3164 catch(Exception e) {
3165 setRollbackOnly();
3166 throw new InstantbankException(e, "211031", "Failed to create a new class");
3167 }
3168 return xml;
3169 }
3170
3171
3172 public String newDownload() throws InstantbankException {
3173 SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy");
3174 java.util.Date today = new java.util.Date();
3175 String xml;
3176
3177 try {
3178 xml = XMLUtils.xmlHeader();
3179 xml += "<Download>";
3180 xml += "<DownloadFields>";
3181 xml += "<id>0</id>";
3182 xml += "<startdate>" + sdf.format(today) + "</startdate>";
3183 xml += "<lastchangeddate>" + sdf.format(today) + "</lastchangeddate>";
3184 xml += "<status>A</status>";
3185 xml += "</DownloadFields>";
3186 xml += "<RulesList/>";
3187 xml += "<SortList/>";
3188 xml += "<FieldsList/>";
3189 xml += "<DistributionList/>";
3190 xml += "</Download>";
3191 }
3192 catch(Exception e) {
3193 setRollbackOnly();
3194 throw new InstantbankException(e, "211032", "Failed to create new download");
3195 }
3196 return xml;
3197 }
3198
3199
3200 public String newQueue() throws InstantbankException {
3201 SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy");
3202 java.util.Date today = new java.util.Date();
3203 String xml;
3204
3205 try {
3206 xml = XMLUtils.xmlHeader();
3207 xml += "<Queue>";
3208 xml += "<QueueFields>";
3209 xml += "<id>0</id>";
3210 xml += "<startdate>" + sdf.format(today) + "</startdate>";
3211 xml += "<lastchangeddate>" + sdf.format(today) + "</lastchangeddate>";
3212 xml += "<status>A</status>";
3213 xml += "</QueueFields>";
3214 xml += "<RulesList/>";
3215 xml += "<SortList/>";
3216 xml += "<DistributionList/>";
3217 xml += "</Queue>";
3218 }
3219 catch(Exception e) {
3220 setRollbackOnly();
3221 throw new InstantbankException(e, "211033", "Failed to create a new queue");
3222 }
3223 return xml;
3224 }
3225
3226
3227 public void recordWork(Long workItemId, int promiseIndicator, String promiseAmount, int contactIndicator, int indirectIndicator, int attemptIndicator) throws InstantbankException {
3228 DataAccess da = null;
3229 String newStatus = "W";
3230 Long qplanId = null;
3231 ResultSet rs = null;
3232 SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy");
3233 String sql;
3234 String status = null;
3235 Statement st = null;
3236 Long userId = null;
3237 int worked = 1;
3238 java.util.Date workDate;
3239
3240 try {
3241 da = new DataAccess();
3242 da.connect();
3243 st = da.getConnection().createStatement();
3244 sql = "SELECT ";
3245 sql += "wrki_status, ";
3246 sql += "wrki_user_id, ";
3247 sql += "wrki_qplan_id, ";
3248 sql += "wrki_followup_date ";
3249 sql += "FROM ";
3250 sql += "work_items ";
3251 sql += "WHERE ";
3252 sql += "wrki_id = " + workItemId.toString();
3253
3254 rs = st.executeQuery(sql);
3255 if(rs.next()) {
3256 status = rs.getString(1);
3257 userId = new Long(rs.getLong(2));
3258 qplanId = new Long(rs.getLong(3));
3259 workDate = rs.getDate(4);
3260 }
3261 else {
3262 throw new InstantbankException("211034", "Work item not found");
3263 }
3264
3265 if(contactIndicator == 0) {
3266 newStatus = "R";
3267 }
3268 if(!status.equals("N")) {
3269 worked = 0;
3270 }
3271
3272 sql = "UPDATE work_items SET ";
3273 sql += "wrki_status = '" + newStatus + "', ";
3274 sql += "wrki_last_changed_date = TO_CHAR(SYSDATE), ";
3275 sql += "wrki_last_changed_by = " + userId + " ";
3276 sql += "WHERE ";
3277 sql += "wrki_id = " + workItemId.toString();
3278
3279 da.makeUpdate(sql);
3280
3281 sql = "UPDATE work_summaries SET ";
3282 sql += "wsum_total_worked = (wsum_total_worked + " + worked + "), ";
3283 sql += "wsum_total_remaining = (wsum_total_remaining - " + worked + "), ";
3284 sql += "wsum_total_promises = (wsum_total_promises + " + promiseIndicator + "), ";
3285 sql += "wsum_total_amount_promises = (wsum_total_amount_promises + " + promiseAmount + "), ";
3286 sql += "wsum_total_contacts = (wsum_total_contacts + " + contactIndicator + "), ";
3287 sql += "wsum_total_indirect_contacts = (wsum_total_indirect_contacts + " + indirectIndicator + "), ";
3288 sql += "wsum_total_attempt_contacts = (wsum_total_attempt_contacts + " + attemptIndicator + ") ";
3289 sql += "WHERE ";
3290 sql += "wsum_user_id = " + userId + " AND ";
3291 sql += "wsum_qplan_id = " + qplanId + " AND ";
3292 sql += "wsum_date = (select max (wsum_date) from work_summaries ";
3293 sql += "where ";
3294 sql += "wsum_user_id = " + userId + " AND ";
3295 sql += "wsum_qplan_id = " + qplanId + ")";
3296 da.makeUpdate(sql);
3297 }
3298 catch(Exception e) {
3299 setRollbackOnly();
3300 throw new InstantbankException(e, "211035", "Failed to record work");
3301 }
3302 finally {
3303 try {
3304 if(rs != null) {
3305 rs.close();
3306 }
3307 if(st != null) {
3308 st.close();
3309 }
3310 if(da != null) {
3311 da.disconnect();
3312 }
3313 }
3314 catch(Exception e) {
3315 }
3316 }
3317 }
3318
3319
3320 public Long saveClass(Long companyId, Long userId, String xmlData) throws InstantbankException {
3321 Long classId = new Long(0);
3322 DataAccess dataAccess = new DataAccess();
3323 XMLDocument doc;
3324 DOMParser docParser = new DOMParser();
3325 String id;
3326 XMLNode node;
3327 NodeList nodeList;
3328 NodeList nodeListValues;
3329 Element parent;
3330 PrintWriter pw;
3331 Element root;
3332 String sql = "";
3333 ;
3334 StringWriter sw;
3335 java.util.Date startDate;
3336 String startDateStr;
3337 ByteArrayInputStream stream = null;
3338 java.util.Date today;
3339 String xmlRules = "";
3340
3341 try {
3342 stream = new ByteArrayInputStream(xmlData.getBytes());
3343 docParser.setValidationMode(false);
3344 docParser.parse(stream);
3345 doc = docParser.getDocument();
3346 root = doc.getDocumentElement();
3347 dataAccess.connect();
3348 id = doc.valueOf("Class/id");
3349 if(id.equals("0")) {
3350 today = DateUtils.today();
3351 startDateStr = doc.valueOf("Class/startdate");
3352 SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy");
3353 startDate = sdf.parse(startDateStr);
3354 if(startDate.compareTo(today) < 0) {
3355 throw new InstantbankException("211036", "Start date must be current or later date");
3356 }
3357 classId = new Long(UniqueIDGenerator.instance().getNextId());
3358 sql = "INSERT INTO CLASSES( ";
3359 sql += "CLASS_ID,";
3360 sql += "CLASS_CMP_ID,";
3361 sql += "CLASS_STATUS,";
3362 sql += "CLASS_NAME,";
3363 sql += "CLASS_START_DATE,";
3364 sql += "CLASS_DESCRIPTION,";
3365 sql += "CLASS_LAST_CHANGED_BY,";
3366 sql += "CLASS_LAST_CHANGED_DATE,";
3367 sql += "CLASS_PRIORITY,";
3368 sql += "CLASS_OBJECT_TYPE";
3369 sql += ") VALUES (";
3370 sql += classId + ",";
3371 sql += companyId + ",";
3372 sql += "'" + doc.valueOf("Class/status") + "',";
3373 sql += "'" + StringFormat.toSafeOracleString(doc.valueOf("Class/name")) + "',";
3374 sql += "TO_DATE('" + startDateStr + "','mm-dd-yyyy'),";
3375 sql += "'" + StringFormat.toSafeOracleString(doc.valueOf("Class/description")) + "',";
3376 sql += userId + ",";
3377 sql += "sysdate,";
3378 sql += new Long(doc.valueOf("Class/priority")) + ",";
3379 sql += "'A')";
3380 dataAccess.makeInsert(sql);
3381 }
3382 else {
3383 classId = new Long(id);
3384 sql = "UPDATE CLASSES SET ";
3385 sql += "CLASS_STATUS='" + doc.valueOf("Class/status") + "',";
3386 sql += "CLASS_NAME='" + StringFormat.toSafeOracleString(doc.valueOf("Class/name")) + "',";
3387 sql += "CLASS_DESCRIPTION='" + StringFormat.toSafeOracleString(doc.valueOf("Class/description")) + "',";
3388 sql += "CLASS_START_DATE=to_date('" + doc.valueOf("Class/startdate") + "','mm-dd-yyyy'),";
3389 sql += "CLASS_PRIORITY=" + new Long(doc.valueOf("Class/priority")) + ",";
3390 sql += "CLASS_LAST_CHANGED_DATE=sysdate,";
3391 sql += "CLASS_LAST_CHANGED_BY=" + userId + " ";
3392 sql += "WHERE ";
3393 sql += "CLASS_ID=" + classId + " AND ";
3394 sql += "CLASS_CMP_ID=" + companyId;
3395 dataAccess.makeUpdate(sql);
3396 }
3397 nodeList = root.getChildNodes();
3398 for(int i = 0; i < nodeList.getLength(); i++) {
3399 node = (XMLNode)nodeList.item(i);
3400 if(node.getNodeName().equals("RulesList")) {
3401 sw = new StringWriter();
3402 pw = new PrintWriter(sw);
3403 node.print(pw);
3404 xmlRules = XMLUtils.xmlHeader();
3405 xmlRules += sw.toString();
3406 saveClassRules(dataAccess, classId, xmlRules);
3407 }
3408 }
3409 return classId;
3410 }
3411 catch(Exception e) {
3412 InstantbankException ie;
3413
3414 ie = new InstantbankException(e, "211061", "Failed to save the class");
3415 ie.setTechnicalMessage("xml=" + StringFormat.toSafeHTMLString(xmlData));
3416 ie.setTechnicalMessage("sql=" + sql);
3417 setRollbackOnly();
3418 throw ie;
3419 }
3420 }
3421
3422
3423 private void saveClassRules(DataAccess dataAccess, Long classId, String xmlRules) throws InstantbankException {
3424 XMLDocument doc;
3425 DOMParser docParser = new DOMParser();
3426 XMLNode node;
3427 NodeList nodeList;
3428 Element root;
3429 String sql;
3430 ByteArrayInputStream stream = null;
3431
3432 try {
3433 stream = new ByteArrayInputStream(xmlRules.getBytes());
3434 docParser.setValidationMode(false);
3435 docParser.parse(stream);
3436 doc = docParser.getDocument();
3437 root = doc.getDocumentElement();
3438 nodeList = root.getChildNodes();
3439 dataAccess.connect();
3440 dataAccess.makeDelete("Delete CLASS_WHERE_RULES where CLASSWR_CLASS_ID=" + classId);
3441 for(int i = 0; i < nodeList.getLength(); i++) {
3442 node = (XMLNode)nodeList.item(i);
3443 sql = "INSERT INTO CLASS_WHERE_RULES(";
3444 sql += "CLASSWR_CLASS_ID,";
3445 sql += "CLASSWR_SEQUENCE,";
3446 sql += "CLASSWR_TEST,";
3447 sql += "CLASSWR_TABLE_NAME,";
3448 sql += "CLASSWR_TABLE_ALIAS,";
3449 sql += "CLASSWR_FIELD_NAME,";
3450 sql += "CLASSWR_FIELD_TYPE,";
3451 sql += "CLASSWR_OPERATOR,";
3452 sql += "CLASSWR_VALUE,";
3453 sql += "CLASSWR_VALUE_TYPE,";
3454 sql += "CLASSWR_CONNECTOR";
3455 sql += ") values(";
3456 sql += classId + ",";
3457 sql += (i + 1) + ",";
3458 sql += new Long(node.valueOf("./test")) + ",";
3459 sql += "'" + node.valueOf("./tablename") + "',";
3460 sql += "'" + node.valueOf("./tablealias") + "',";
3461 sql += "'" + node.valueOf("./fieldname") + "',";
3462 sql += "'" + node.valueOf("./fieldtype") + "',";
3463 sql += "'" + node.valueOf("./operator") + "',";
3464 sql += "'" + StringFormat.toSafeOracleString(node.valueOf("./value")) + "',";
3465 sql += "'" + node.valueOf("./valuetype") + "',";
3466 sql += "'" + node.valueOf("./connector") + "'";
3467 sql += ")";
3468 dataAccess.makeInsert(sql);
3469 }
3470 }
3471 catch(Exception e) {
3472 setRollbackOnly();
3473 throw new InstantbankException(e, "211037", "Failed to save class rules");
3474 }
3475 }
3476
3477
3478 public Long saveDownload(Long companyId, Long userId, String xmlData) throws InstantbankException {
3479 DataAccess dataAccess = null;
3480 DOMParser docParser = new DOMParser();
3481 Long downloadId = new Long(0);
3482 String id;
3483 XMLDocument inxml;
3484 XMLNode node;
3485 NodeList nodeList;
3486 NodeList nodeListValues;
3487 PrintWriter pw;
3488 Element root;
3489 String sql;
3490 java.util.Date startDate;
3491 String startDateStr;
3492 ByteArrayInputStream stream = null;
3493 StringWriter sw;
3494 java.util.Date today;
3495 String xmlDistribution = "";
3496 String xmlField = "";
3497 String xmlRules = "";
3498 String xmlSort = "";
3499
3500 try {
3501 dataAccess = new DataAccess();
3502 dataAccess.connect();
3503 stream = new ByteArrayInputStream(xmlData.getBytes());
3504 docParser.setValidationMode(false);
3505 docParser.parse(stream);
3506 inxml = docParser.getDocument();
3507 root = inxml.getDocumentElement();
3508 nodeList = root.getChildNodes();
3509 for(int i = 0; i < nodeList.getLength(); i++) {
3510 node = (XMLNode)nodeList.item(i);
3511 if(node.getNodeName().equals("DownloadFields")) {
3512 id = node.valueOf("./id");
3513 if(id.equals("0")) {
3514 today = DateUtils.today();
3515 startDateStr = node.valueOf("./startdate");
3516 SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy");
3517 startDate = sdf.parse(startDateStr);
3518 if(startDate.compareTo(today) < 0) {
3519 throw new InstantbankException("211062", "Start date must be current or later date");
3520 }
3521
3522 downloadId = new Long(UniqueIDGenerator.instance().getNextId());
3523 sql = "INSERT INTO downloads( ";
3524 sql += "DOWN_ID,";
3525 sql += "DOWN_CMP_ID,";
3526 sql += "DOWN_QUT_ID,";
3527 sql += "DOWN_STATUS,";
3528 sql += "DOWN_NAME,";
3529 sql += "DOWN_START_DATE,";
3530 sql += "DOWN_DESCRIPTION,";
3531 sql += "DOWN_LAST_CHANGED_BY,";
3532 sql += "DOWN_LAST_CHANGED_DATE,";
3533 sql += "DOWN_FREQUENCY,";
3534 sql += "DOWN_DOWNT_DOWN_ID,";
3535 sql += "DOWN_FTP_TYPE_INDICATOR,";
3536 sql += "DOWN_ACHC_ID";
3537 sql += ") VALUES (";
3538 sql += downloadId + ",";
3539 sql += companyId + ",";
3540 sql += new Long(node.valueOf("./type")) + ",";
3541 sql += "'" + node.valueOf("./status") + "',";
3542 sql += "'" + StringFormat.toSafeOracleString(node.valueOf("./name")) + "',";
3543 sql += "sysdate,";
3544 sql += "'" + StringFormat.toSafeOracleString(node.valueOf("./description")) + "',";
3545 sql += userId + ",";
3546 sql += "sysdate,";
3547 sql += "'" + node.valueOf("./frequency");
3548 sql += "','" + node.valueOf("./filetype");
3549 sql += "','" + node.valueOf("./ftptype");
3550 sql += "'," + new Long(node.valueOf("./achaccount"));
3551 sql += ")";
3552 dataAccess.makeInsert(sql);
3553 }
3554 else {
3555 downloadId = new Long(node.valueOf("./id"));
3556 sql = "UPDATE downloads SET ";
3557 sql += "DOWN_QUT_ID=" + new Long(node.valueOf("./type")) + ",";
3558 sql += "DOWN_STATUS='" + node.valueOf("./status") + "',";
3559 sql += "DOWN_NAME='" + StringFormat.toSafeOracleString(node.valueOf("./name")) + "',";
3560 sql += "DOWN_DESCRIPTION='" + StringFormat.toSafeOracleString(node.valueOf("./description")) + "',";
3561 sql += "DOWN_START_DATE=to_date('" + node.valueOf("./startdate") + "','mm-dd-yyyy'),";
3562 sql += "DOWN_FREQUENCY='" + node.valueOf("./frequency") + "',";
3563 sql += "DOWN_DOWNT_DOWN_ID=" + new Long(node.valueOf("./filetype")) + ",";
3564 sql += "DOWN_FTP_TYPE_INDICATOR='" + node.valueOf("./ftptype") + "',";
3565 sql += "DOWN_ACHC_ID=" + new Long(node.valueOf("./achaccount")) + ",";
3566 sql += "DOWN_LAST_CHANGED_DATE=sysdate,";
3567 sql += "DOWN_LAST_CHANGED_BY=" + userId;
3568 sql += " WHERE ";
3569 sql += "DOWN_ID=" + downloadId + " AND ";
3570 sql += "DOWN_CMP_ID=" + companyId;
3571 dataAccess.makeUpdate(sql);
3572 }
3573 }
3574 else if(node.getNodeName().equals("RulesList")) {
3575 sw = new StringWriter();
3576 pw = new PrintWriter(sw);
3577 node.print(pw);
3578 xmlRules = XMLUtils.xmlHeader();
3579 xmlRules += sw.toString();
3580 saveDownloadRules(dataAccess, downloadId, xmlRules);
3581 }
3582 else if(node.getNodeName().equals("SortList")) {
3583 sw = new StringWriter();
3584 pw = new PrintWriter(sw);
3585 node.print(pw);
3586 xmlSort = XMLUtils.xmlHeader();
3587 xmlSort += sw.toString();
3588 saveDownloadSort(dataAccess, downloadId, xmlSort);
3589 }
3590 else if(node.getNodeName().equals("FieldsList")) {
3591 sw = new StringWriter();
3592 pw = new PrintWriter(sw);
3593 node.print(pw);
3594 xmlField = XMLUtils.xmlHeader();
3595 xmlField += sw.toString();
3596 saveDownloadFields(dataAccess, downloadId, xmlField);
3597 }
3598 else if(node.getNodeName().equals("Distribution")) {
3599 sw = new StringWriter();
3600 pw = new PrintWriter(sw);
3601 node.print(pw);
3602 xmlDistribution = XMLUtils.xmlHeader();
3603 xmlDistribution += sw.toString();
3604 saveDownloadDistribution(dataAccess, downloadId, xmlDistribution);
3605 }
3606 }
3607 return downloadId;
3608 }
3609 catch(Exception e) {
3610 InstantbankException ie;
3611 ie = new InstantbankException(e, "211060", "Failed to save download");
3612 ie.setTechnicalMessage("xml=" + StringFormat.toSafeHTMLString(xmlData));
3613 setRollbackOnly();
3614 throw ie;
3615 }
3616 finally {
3617 try {
3618 if(dataAccess != null) {
3619 dataAccess.disconnect();
3620 }
3621 }
3622 catch(Exception e) {
3623 }
3624 }
3625 }
3626
3627
3628 private void saveDownloadDistribution(DataAccess dataAccess, Long downloadId, String xmlDistribution) throws InstantbankException {
3629 DOMParser docParser = null;
3630 Hashtable ht = new Hashtable();
3631 String htObject;
3632 XMLDocument inxml;
3633 XMLNode node;
3634 NodeList nodeList;
3635 Element root;
3636 String sql;
3637 ByteArrayInputStream stream = null;
3638
3639 try {
3640 docParser = new DOMParser();
3641 stream = new ByteArrayInputStream(xmlDistribution.getBytes());
3642 docParser.setValidationMode(false);
3643 docParser.parse(stream);
3644 inxml = docParser.getDocument();
3645 root = inxml.getDocumentElement();
3646 nodeList = root.getChildNodes();
3647 dataAccess.makeDelete("Delete DOWNLOAD_FTP_DISTRIBUTION where DOWNFTP_DOWN_ID=" + downloadId);
3648 for(int i = 0; i < nodeList.getLength(); i++) {
3649 node = (XMLNode)nodeList.item(i);
3650 htObject = (String)ht.get(node.valueOf("./primaryid"));
3651 if(htObject == null) {
3652 sql = "Insert into DOWNLOAD_FTP_DISTRIBUTION(";
3653 sql += "DOWNFTP_DOWN_ID,";
3654 sql += "DOWNFTP_PRIMARY_ID,";
3655 sql += "DOWNFTP_SECONDARY_ID";
3656 sql += ") values(";
3657 sql += downloadId + ",";
3658 sql += new Long(node.valueOf("./primaryid")) + ",";
3659 sql += new Long(node.valueOf("./secondaryid")) + " ";
3660 sql += ")";
3661 dataAccess.makeInsert(sql);
3662 }
3663 }
3664 }
3665 catch(Exception e) {
3666 setRollbackOnly();
3667 throw new InstantbankException(e, "211038", "Failed to save download distribution");
3668 }
3669 }
3670
3671
3672 private void saveDownloadFields(DataAccess dataAccess, Long downloadId, String xmlFields) throws InstantbankException {
3673 DOMParser docParser = new DOMParser();
3674 XMLDocument inxml;
3675 XMLNode node;
3676 NodeList nodeList;
3677 Element root;
3678 String sql = "";
3679 ByteArrayInputStream stream = null;
3680
3681 try {
3682 stream = new ByteArrayInputStream(xmlFields.getBytes());
3683 docParser.setValidationMode(false);
3684 docParser.parse(stream);
3685 inxml = docParser.getDocument();
3686 root = inxml.getDocumentElement();
3687 nodeList = root.getChildNodes();
3688 dataAccess.makeDelete("Delete DOWNLOAD_FIELDS where DOWNF_DOWN_ID=" + downloadId);
3689 for(int i = 0; i < nodeList.getLength(); i++) {
3690 node = (XMLNode)nodeList.item(i);
3691 sql = "Insert into DOWNLOAD_FIELDS(";
3692 sql += "DOWNF_DOWN_ID,";
3693 sql += "DOWNF_SEQUENCE,";
3694 sql += "DOWNF_TABLE_NAME,";
3695 sql += "DOWNF_TABLE_ALIAS,";
3696 sql += "DOWNF_FIELD_NAME,";
3697 sql += "DOWNF_FIELD_TYPE";
3698 sql += ") values(";
3699 sql += downloadId + ",";
3700 sql += (i + 1) + ",";
3701 sql += "'" + node.valueOf("./tablename") + "',";
3702 sql += "'" + node.valueOf("./tablealias") + "',";
3703 sql += "'" + node.valueOf("./fieldname") + "',";
3704 sql += "'" + node.valueOf("./fieldtype") + "'";
3705 sql += ")";
3706 dataAccess.makeInsert(sql);
3707 }
3708 }
3709 catch(Exception e) {
3710 setRollbackOnly();
3711 InstantbankException ie = new InstantbankException(e, "211039", "Failed to save download fields");
3712 ie.setTechnicalMessage("sql=" + sql);
3713 throw ie;
3714 }
3715 }
3716
3717
3718 private void saveDownloadRules(DataAccess dataAccess, Long downloadId, String xmlRules) throws InstantbankException {
3719 DOMParser docParser = new DOMParser();
3720 XMLDocument inxml;
3721 XMLNode node;
3722 NodeList nodeList;
3723 Element root;
3724 String sql;
3725 ByteArrayInputStream stream = null;
3726
3727 try {
3728 stream = new ByteArrayInputStream(xmlRules.getBytes());
3729 docParser.setValidationMode(false);
3730 docParser.parse(stream);
3731 inxml = docParser.getDocument();
3732 root = inxml.getDocumentElement();
3733 nodeList = root.getChildNodes();
3734 dataAccess.makeDelete("Delete DOWNLOAD_WHERE_RULES where DOWNWR_DOWN_ID=" + downloadId);
3735 for(int i = 0; i < nodeList.getLength(); i++) {
3736 node = (XMLNode)nodeList.item(i);
3737 sql = "INSERT INTO DOWNLOAD_WHERE_RULES(";
3738 sql += "DOWNWR_DOWN_ID,";
3739 sql += "DOWNWR_SEQUENCE,";
3740 sql += "DOWNWR_TEST,";
3741 sql += "DOWNWR_TABLE_NAME,";
3742 sql += "DOWNWR_TABLE_ALIAS,";
3743 sql += "DOWNWR_FIELD_NAME,";
3744 sql += "DOWNWR_FIELD_TYPE,";
3745 sql += "DOWNWR_OPERATOR,";
3746 sql += "DOWNWR_VALUE,";
3747 sql += "DOWNWR_VALUE_TYPE,";
3748 sql += "DOWNWR_CONNECTOR";
3749 sql += ") values(";
3750 sql += downloadId + ",";
3751 sql += (i + 1) + ",";
3752 sql += new Long(node.valueOf("./test")) + ",";
3753 sql += "'" + node.valueOf("./tablename") + "',";
3754 sql += "'" + node.valueOf("./tablealias") + "',";
3755 sql += "'" + node.valueOf("./fieldname") + "',";
3756 sql += "'" + node.valueOf("./fieldtype") + "',";
3757 sql += "'" + node.valueOf("./operator") + "',";
3758 sql += "'" + StringFormat.toSafeOracleString(node.valueOf("./value")) + "',";
3759 sql += "'" + node.valueOf("./valuetype") + "',";
3760 sql += "'" + node.valueOf("./connector") + "'";
3761 sql += ")";
3762 dataAccess.makeInsert(sql);
3763 }
3764 }
3765 catch(Exception e) {
3766 setRollbackOnly();
3767 throw new InstantbankException(e, "211040", "Failed to save download rules");
3768 }
3769 }
3770
3771
3772 private void saveDownloadSort(DataAccess dataAccess, Long downloadId, String xmlSort) throws InstantbankException {
3773 DOMParser docParser = new DOMParser();
3774 XMLDocument inxml;
3775 NodeList nodeList;
3776 XMLNode node;
3777 Element root;
3778 String sql = "";
3779 ByteArrayInputStream stream = null;
3780
3781 try {
3782 stream = new ByteArrayInputStream(xmlSort.getBytes());
3783 docParser.setValidationMode(false);
3784 docParser.parse(stream);
3785 inxml = docParser.getDocument();
3786 root = inxml.getDocumentElement();
3787 nodeList = root.getChildNodes();
3788 dataAccess.makeDelete("Delete DOWNLOAD_SORT_RULES where DOWNSR_DOWN_ID=" + downloadId);
3789 for(int i = 0; i < nodeList.getLength(); i++) {
3790 node = (XMLNode)nodeList.item(i);
3791 sql = "INSERT INTO DOWNLOAD_SORT_RULES(";
3792 sql += "DOWNSR_DOWN_ID,";
3793 sql += "DOWNSR_SEQUENCE,";
3794 sql += "DOWNSR_TABLE_NAME,";
3795 sql += "DOWNSR_FIELD_NAME,";
3796 sql += "DOWNSR_DIRECTION,";
3797 sql += "DOWNSR_TABLE_ALIAS";
3798 sql += ") VALUES (";
3799 sql += downloadId + ",";
3800 sql += (i + 1) + ",";
3801 sql += "'" + node.valueOf("./tablename") + "',";
3802 sql += "'" + node.valueOf("./fieldname") + "',";
3803 sql += "'" + node.valueOf("./direction") + "',";
3804 sql += "'" + node.valueOf("./tablealias") + "'";
3805 sql += ")";
3806 dataAccess.makeInsert(sql);
3807 }
3808 }
3809 catch(Exception e) {
3810 setRollbackOnly();
3811 throw new InstantbankException(e, "211041", "Failed to save download sort rules");
3812 }
3813 }
3814
3815
3816 public Long saveQueue(Long companyId, Long userId, String xmlData) throws InstantbankException {
3817 DataAccess dataAccess = new DataAccess();
3818 DOMParser docParser = new DOMParser();
3819 String id;
3820 XMLDocument inxml;
3821 XMLNode node;
3822 NodeList nodeList;
3823 Long queueId = new Long(0);
3824 Element root;
3825 PrintWriter pw;
3826 String sql;
3827 java.util.Date startDate;
3828 String startDateStr;
3829 ByteArrayInputStream stream = null;
3830 StringWriter sw;
3831 java.util.Date today;
3832 String xmlRules = "";
3833 String xmlSort = "";
3834 String xmlField = "";
3835 String xmlUser = "";
3836
3837 try {
3838 dataAccess.connect();
3839 stream = new ByteArrayInputStream(xmlData.getBytes());
3840 docParser.setValidationMode(false);
3841 docParser.parse(stream);
3842 inxml = docParser.getDocument();
3843 root = inxml.getDocumentElement();
3844 nodeList = root.getChildNodes();
3845 for(int i = 0; i < nodeList.getLength(); i++) {
3846 node = (XMLNode)nodeList.item(i);
3847 if(node.getNodeName().equals("QueueFields")) {
3848 id = node.valueOf("./id");
3849 if(id.equals("0")) {
3850 today = DateUtils.today();
3851 startDateStr = node.valueOf("./startdate");
3852 SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy");
3853 startDate = sdf.parse(startDateStr);
3854 if(startDate.compareTo(today) < 0) {
3855 throw new InstantbankException("211063", "Start date must be current or later date");
3856 }
3857
3858 queueId = new Long(UniqueIDGenerator.instance().getNextId());
3859 sql = "INSERT INTO queue_plans( ";
3860 sql += "QPLAN_ID,";
3861 sql += "QPLAN_CMP_ID,";
3862 sql += "QPLAN_QUT_ID,";
3863 sql += "QPLAN_STATUS,";
3864 sql += "QPLAN_NAME,";
3865 sql += "QPLAN_START_DATE,";
3866 sql += "QPLAN_DESCRIPTION,";
3867 sql += "QPLAN_LAST_CHANGED_BY,";
3868 sql += "QPLAN_LAST_CHANGED_DATE,";
3869 sql += "QPLAN_PRIORITY,";
3870 sql += "QPLAN_STOPPER";
3871 sql += ") VALUES (";
3872 sql += queueId + ",";
3873 sql += companyId + ",";
3874 sql += new Long(node.valueOf("./type")) + ",";
3875 sql += "'" + node.valueOf("./status") + "',";
3876 sql += "'" + StringFormat.toSafeOracleString(node.valueOf("./name")) + "',";
3877 sql += "sysdate,";
3878 sql += "'" + StringFormat.toSafeOracleString(node.valueOf("./description")) + "',";
3879 sql += userId + ",";
3880 sql += "sysdate,";
3881 sql += new Long(node.valueOf("./priority")) + ",";
3882 sql += "'" + node.valueOf("./stopper") + "'";
3883 sql += ")";
3884 dataAccess.makeInsert(sql);
3885 }
3886 else {
3887 queueId = new Long(node.valueOf("./id"));
3888 sql = "UPDATE queue_plans SET ";
3889 sql += "QPLAN_QUT_ID=" + new Long(node.valueOf("./type")) + ",";
3890 sql += "QPLAN_STATUS='" + node.valueOf("./status") + "',";
3891 sql += "QPLAN_NAME='" + StringFormat.toSafeOracleString(node.valueOf("./name")) + "',";
3892 sql += "QPLAN_DESCRIPTION='" + StringFormat.toSafeOracleString(node.valueOf("./description")) + "',";
3893 sql += "QPLAN_START_DATE=to_date('" + node.valueOf("./startdate") + "','mm-dd-yyyy'),";
3894 sql += "QPLAN_PRIORITY=" + new Long(node.valueOf("./priority")) + ",";
3895 sql += "QPLAN_LAST_CHANGED_DATE=sysdate,";
3896 sql += "QPLAN_LAST_CHANGED_BY=" + userId + " ";
3897 sql += "WHERE ";
3898 sql += "QPLAN_ID=" + queueId + " AND ";
3899 sql += "QPLAN_CMP_ID=" + companyId;
3900 dataAccess.makeUpdate(sql);
3901 }
3902 }
3903 else if(node.getNodeName().equals("RulesList")) {
3904 sw = new StringWriter();
3905 pw = new PrintWriter(sw);
3906 node.print(pw);
3907 xmlRules = XMLUtils.xmlHeader();
3908 xmlRules += sw.toString();
3909 saveQueueRules(dataAccess, queueId, xmlRules);
3910 }
3911 else if(node.getNodeName().equals("SortList")) {
3912 sw = new StringWriter();
3913 pw = new PrintWriter(sw);
3914 node.print(pw);
3915 xmlSort = XMLUtils.xmlHeader();
3916 xmlSort += sw.toString();
3917 saveQueueSortRules(dataAccess, queueId, xmlSort);
3918 }
3919 else if(node.getNodeName().equals("DistributionList")) {
3920 sw = new StringWriter();
3921 pw = new PrintWriter(sw);
3922 node.print(pw);
3923 xmlUser = XMLUtils.xmlHeader();
3924 xmlUser += sw.toString();
3925 saveQueueUsers(dataAccess, queueId, userId, xmlUser);
3926 }
3927 }
3928 return queueId;
3929 }
3930 catch(Exception e) {
3931 InstantbankException ie;
3932
3933 ie = new InstantbankException(e, "211064", "Failed to save the queue");
3934 ie.setTechnicalMessage("xml=" + StringFormat.toSafeHTMLString(xmlData));
3935 setRollbackOnly();
3936 throw ie;
3937 }
3938 finally {
3939 try {
3940 if(dataAccess != null) {
3941 dataAccess.disconnect();
3942 }
3943 }
3944 catch(Exception e) {
3945 }
3946 }
3947 }
3948
3949
3950 private void saveQueueRules(DataAccess dataAccess, Long queueId, String xmlRules) throws InstantbankException {
3951 DOMParser docParser = new DOMParser();
3952 XMLDocument inxml;
3953 XMLNode node;
3954 NodeList nodeList;
3955 Element root;
3956 String sql = "";
3957 ByteArrayInputStream stream = null;
3958
3959 try {
3960 stream = new ByteArrayInputStream(xmlRules.getBytes());
3961 docParser.setValidationMode(false);
3962 docParser.parse(stream);
3963 inxml = docParser.getDocument();
3964 root = inxml.getDocumentElement();
3965 nodeList = root.getChildNodes();
3966 dataAccess.makeDelete("Delete QUEUE_PLANS_WHERE_RULES where QPWR_QPLAN_ID=" + queueId);
3967 for(int i = 0; i < nodeList.getLength(); i++) {
3968 node = (XMLNode)nodeList.item(i);
3969 sql = "INSERT into QUEUE_PLANS_WHERE_RULES(";
3970 sql += "QPWR_QPLAN_ID,";
3971 sql += "QPWR_SEQUENCE,";
3972 sql += "QPWR_TEST,";
3973 sql += "QPWR_TABLE_NAME,";
3974 sql += "QPWR_TABLE_ALIAS,";
3975 sql += "QPWR_FIELD_NAME,";
3976 sql += "QPWR_FIELD_TYPE,";
3977 sql += "QPWR_OPERATOR,";
3978 sql += "QPWR_VALUE,";
3979 sql += "QPWR_VALUE_TYPE,";
3980 sql += "QPWR_CONNECTOR";
3981 sql += ") VALUES (";
3982 sql += queueId + ",";
3983 sql += (i + 1) + ",";
3984 sql += new Long(node.valueOf("./test")) + ",";
3985 sql += "'" + node.valueOf("./tablename") + "',";
3986 sql += "'" + node.valueOf("./tablealias") + "',";
3987 sql += "'" + node.valueOf("./fieldname") + "',";
3988 sql += "'" + node.valueOf("./fieldtype") + "',";
3989 sql += "'" + node.valueOf("./operator") + "',";
3990
3991 sql += "'" + StringFormat.toSafeOracleString(node.valueOf("./value").toUpperCase()) + "',";
3992 sql += "'" + node.valueOf("./valuetype") + "',";
3993 sql += "'" + node.valueOf("./connector") + "'";
3994 sql += ")";
3995 dataAccess.makeInsert(sql);
3996 }
3997 }
3998 catch(Exception e) {
3999 setRollbackOnly();
4000 throw new InstantbankException(e, "211042", "Failed to save queue rules");
4001 }
4002 }
4003
4004
4005 private void saveQueueSortRules(DataAccess dataAccess, Long queueId, String xmlSort) throws InstantbankException {
4006 DOMParser docParser = new DOMParser();
4007 XMLDocument inxml;
4008 XMLNode node;
4009 NodeList nodeList;
4010 Element root;
4011 String sql = "";
4012 ByteArrayInputStream stream = null;
4013
4014 try {
4015 stream = new ByteArrayInputStream(xmlSort.getBytes());
4016 docParser.setValidationMode(false);
4017 docParser.parse(stream);
4018 inxml = docParser.getDocument();
4019 root = inxml.getDocumentElement();
4020 nodeList = root.getChildNodes();
4021 dataAccess.makeDelete("Delete QUEUE_PLAN_SORT_RULES where QPSR_QPLAN_ID=" + queueId);
4022 for(int i = 0; i < nodeList.getLength(); i++) {
4023 node = (XMLNode)nodeList.item(i);
4024 sql = "INSERT into QUEUE_PLAN_SORT_RULES(";
4025 sql += "QPSR_QPLAN_ID,";
4026 sql += "QPSR_SEQUENCE,";
4027 sql += "QPSR_TABLE_NAME,";
4028 sql += "QPSR_FIELD_NAME,";
4029 sql += "QPSR_DIRECTION,";
4030 sql += "QPSR_TABLE_ALIAS";
4031 sql += ") VALUES (";
4032 sql += queueId + "," + (i + 1) + ",";
4033 sql += "'" + node.valueOf("./tablename") + "',";
4034 sql += "'" + node.valueOf("./fieldname") + "',";
4035 sql += "'" + node.valueOf("./direction") + "',";
4036 sql += "'" + node.valueOf("./tablealias") + "'";
4037 sql += ")";
4038 dataAccess.makeInsert(sql);
4039 }
4040 }
4041 catch(Exception e) {
4042 setRollbackOnly();
4043 throw new InstantbankException(e, "211043", "Failed to save queue sort rules");
4044 }
4045 }
4046
4047
4048 private void saveQueueUsers(DataAccess dataAccess, Long queueId, Long userChanged, String xmlUser) throws InstantbankException {
4049 DOMParser docParser = new DOMParser();
4050 XMLDocument inxml;
4051 XMLNode node;
4052 NodeList nodeList;
4053 Element root;
4054 String sql = "";
4055 ByteArrayInputStream stream = null;
4056
4057 try {
4058 stream = new ByteArrayInputStream(xmlUser.getBytes());
4059 docParser.setValidationMode(false);
4060 docParser.parse(stream);
4061 inxml = docParser.getDocument();
4062 root = inxml.getDocumentElement();
4063 nodeList = root.getChildNodes();
4064 dataAccess.makeDelete("Delete QUEUE_PLAN_USERS where QPU_QPLAN_ID=" + queueId);
4065 for(int i = 0; i < nodeList.getLength(); i++) {
4066 node = (XMLNode)nodeList.item(i);
4067 sql = "INSERT into QUEUE_PLAN_USERS(";
4068 sql += "QPU_QPLAN_ID,";
4069 sql += "QPU_USER_ID,";
4070 sql += "QPU_LAST_CHANGED_BY,";
4071 sql += "QPU_LAST_CHANGED_DATE";
4072 sql += ") VALUES (";
4073 sql += queueId + ",";
4074 sql += new Long(node.valueOf("./userid")) + ",";
4075 sql += userChanged + ",";
4076 sql += "sysdate";
4077 sql += ")";
4078 dataAccess.makeInsert(sql);
4079 }
4080 }
4081 catch(Exception e) {
4082 setRollbackOnly();
4083 throw new InstantbankException(e, "211044", "Failed to save queue users");
4084 }
4085 }
4086
4087
4088 public void saveQueueTypes(Long companyId, Long userId, String xmlData) throws InstantbankException {
4089 DataAccess dataAccess = null;
4090 DOMParser docParser = new DOMParser();
4091 long id;
4092 String sql = null;
4093 ByteArrayInputStream stream;
4094 XMLDocument xmlDoc;
4095
4096 try {
4097 dataAccess = new DataAccess();
4098 dataAccess.connect();
4099 xmlDoc = null;
4100 stream = new ByteArrayInputStream(xmlData.getBytes());
4101 docParser.setValidationMode(false);
4102 docParser.parse(stream);
4103 xmlDoc = docParser.getDocument();
4104 String idm = xmlDoc.valueOf("/Types/id");
4105 String category = xmlDoc.valueOf("/Types/category");
4106 String name = xmlDoc.valueOf("/Types/name");
4107 ;
4108 String description = xmlDoc.valueOf("/Types/description");
4109 String status = xmlDoc.valueOf("/Types/status");
4110 String objectType = xmlDoc.valueOf("/Types/objecttype");
4111 if(status.equals("A")) {
4112
4113 id = UniqueIDGenerator.instance().getNextId();
4114 sql = "INSERT INTO queue_types(";
4115 sql += "qut_id,";
4116 sql += "qut_category,";
4117 sql += "qut_name,";
4118 sql += "qut_description,";
4119 sql += "qut_last_changed_date,";
4120 sql += "qut_cmp_id,";
4121 sql += "qut_last_changed_by,";
4122 sql += "QUT_OBJECT_TYPE";
4123 sql += ") VALUES (";
4124 sql += id + ",";
4125 sql += "'" + category + "',";
4126 sql += "'" + StringFormat.toSafeOracleString(name) + "',";
4127 sql += "'" + StringFormat.toSafeOracleString(description) + "',";
4128 sql += "SYSDATE,";
4129 sql += companyId + ",";
4130 sql += userId + ",";
4131 sql += "'" + objectType + "'";
4132 sql += ")";
4133 dataAccess.makeInsert(sql);
4134 }
4135 if(status.equals("M")) {
4136
4137 sql = "UPDATE queue_types SET ";
4138 sql += "qut_name='" + StringFormat.toSafeOracleString(name) + "',";
4139 sql += "qut_description='" + StringFormat.toSafeOracleString(description) + "',";
4140 sql += "qut_last_changed_date=sysdate,";
4141 sql += "qut_last_changed_by=" + userId + " ";
4142 sql += "WHERE ";
4143 sql += "qut_id=" + idm + " and ";
4144 sql += "qut_category='" + category + "'";
4145 dataAccess.makeUpdate(sql);
4146 }
4147 if(status.equals("D")) {
4148
4149 sql = "delete queue_types ";
4150 sql += "where qut_id=" + idm + " and qut_category='" + category + "'";
4151 dataAccess.makeDelete(sql);
4152 }
4153 }
4154 catch(Exception e) {
4155 setRollbackOnly();
4156 throw new InstantbankException(e, "211045", "Failed to update queue types list");
4157 }
4158 finally {
4159 try {
4160 if(dataAccess != null) {
4161 dataAccess.disconnect();
4162 }
4163 }
4164 catch(Exception e) {
4165 }
4166 }
4167 }
4168
4169
4170
4176 private void removeDups(Long wrkiObjectId) throws InstantbankException {
4177
4178 ResultSet rs = null;
4179 Statement st = null;
4180 DataAccess da = null;
4181
4182 try {
4183 da = new DataAccess();
4184 da.connect();
4185 st = da.getConnection().createStatement();
4186 String dataQuery = "select wrki_id " +
4187 "from queue_plans q,work_items w, queue_types " +
4188 "where wrki_object_id=" + wrkiObjectId +
4189 " and q.qplan_id=w.wrki_qplan_id and qut_id=qplan_qut_id " +
4190 " and wrki_qplan_id in " +
4191 "(select unique wrki_qplan_id from work_items where wrki_object_id=" +
4192 wrkiObjectId + " group by wrki_qplan_id having count(*)>1) order by wrki_id desc";
4193
4194 rs = st.executeQuery(dataQuery);
4195 if(rs != null) {
4196 boolean first = true;
4197 while(rs.next()) {
4198 if(first) {
4199 first = false;
4200 continue;
4201 }
4202 long wrkiId = rs.getLong(1);
4203 System.out.println("Removing wrki_id " + wrkiId);
4204 dataQuery = "DELETE FROM work_items ";
4205 dataQuery += "WHERE wrki_id=" + wrkiId;
4206 int nRet = da.makeDelete(dataQuery);
4207 if(nRet == 0) {
4208 throw new InstantbankException("211069", "Failed to delete work item");
4209 }
4210 }
4211 }
4212 }
4213 catch(Exception e) {
4214 setRollbackOnly();
4215 e.printStackTrace();
4216 throw new InstantbankException(e, "211049", "Error removing dups");
4217 }
4218 finally {
4219 try {
4220 if(rs != null) {
4221 rs.close();
4222 }
4223 if(st != null) {
4224 st.close();
4225 }
4226 if(da != null) {
4227 da.disconnect();
4228 }
4229 }
4230 catch(Exception e) {
4231 e.printStackTrace();
4232 }
4233 }
4234 }
4235
4236
4237 public void transferToQueue(Long wrkiId, Long qplanId, int promiseIndicator, int contactIndicator, int indirectIndicator, int attemptIndicator) throws InstantbankException {
4238 Long activityId = null;
4239 Long classId = null;
4240 DataAccess da = null;
4241 String dataQuery;
4242 java.sql.Date followupDate = null;
4243 String followupTime = null;
4244 Long fromQplanId = null;
4245 Long fromUserId = null;
4246 Long lastChangedBy = null;
4247 java.sql.Date lastChangedDate = null;
4248 Long objectId = null;
4249 String objectType = null;
4250 Long order = null;
4251 ResultSet rs = null;
4252 int transfered = 0;
4253 SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy");
4254 Statement st = null;
4255 int transfers = 0;
4256 int fromTransfers = 0;
4257 Long trhId = null;
4258 java.sql.Date workiDate = null;
4259 Long userId = null;
4260 Long lFromQueCatId = null;
4261 Long lToQueCatId = null;
4262 String sFromQueCat = "";
4263 String sToQueCat = "";
4264 try {
4265 da = new DataAccess();
4266 da.connect();
4267 st = da.getConnection().createStatement();
4268 dataQuery = "SELECT ";
4269 dataQuery += "wrki_last_changed_date,";
4270 dataQuery += "wrki_last_changed_by,";
4271 dataQuery += "wrki_object_type,";
4272 dataQuery += "wrki_object_id,";
4273 dataQuery += "wrki_qplan_id,";
4274 dataQuery += "wrki_user_id,";
4275 dataQuery += "wrki_followup_date,";
4276 dataQuery += "wrki_followup_time,";
4277 dataQuery += "wrki_class_id,";
4278 dataQuery += "wrki_date,";
4279 dataQuery += "wrki_activity_id,";
4280 dataQuery += "wrki_transfers, ";
4281 dataQuery += "wrki_from_transfers ";
4282 dataQuery += "FROM ";
4283 dataQuery += "work_items ";
4284 dataQuery += "WHERE ";
4285 dataQuery += "wrki_id = " + wrkiId.toString();
4286
4287 rs = st.executeQuery(dataQuery);
4288
4289 if(rs.next()) {
4290 lastChangedDate = rs.getDate(1);
4291 lastChangedBy = new Long(rs.getLong(2));
4292 objectType = rs.getString(3);
4293 objectId = new Long(rs.getLong(4));
4294 fromQplanId = new Long(rs.getLong(5));
4295 fromUserId = new Long(rs.getLong(6));
4296 followupDate = rs.getDate(7);
4297 followupTime = rs.getString(8);
4298 classId = new Long(rs.getLong(9));
4299 workiDate = rs.getDate(10);
4300 if(classId.longValue() == 0) {
4301 classId = null;
4302 }
4303 activityId = new Long(rs.getLong(11));
4304 if(activityId.longValue() == 0) {
4305 activityId = null;
4306 }
4307 transfers = rs.getInt(12);
4308 if(rs.wasNull()) {
4309 transfers = 0;
4310 }
4311 fromTransfers = rs.getInt(13);
4312 if(rs.wasNull()) {
4313 fromTransfers = 0;
4314 }
4315 }
4316 else {
4317 throw new InstantbankException("211047", "Work item not found (" + wrkiId + ")");
4318 }
4319
4320 if(fromQplanId.longValue() > 0) {
4321
4322 dataQuery = "SELECT ";
4323 dataQuery += "qplan_qut_id ";
4324 dataQuery += "FROM ";
4325 dataQuery += "queue_plans ";
4326 dataQuery += "WHERE ";
4327 dataQuery += "qplan_id=" + fromQplanId.toString();
4328 dataQuery += " AND ROWNUM = 1";
4329
4330 rs = st.executeQuery(dataQuery);
4331
4332 if(rs.next()) {
4333 lFromQueCatId = new Long(rs.getLong(1));
4334
4335 dataQuery = "SELECT ";
4336 dataQuery += "qut_category ";
4337 dataQuery += "FROM ";
4338 dataQuery += "queue_types ";
4339 dataQuery += "WHERE ";
4340 dataQuery += "qut_id=" + lFromQueCatId.toString();
4341 dataQuery += " AND ROWNUM = 1";
4342
4343 rs = st.executeQuery(dataQuery);
4344
4345 if(rs.next()) {
4346 sFromQueCat = rs.getString(1);
4347
4348 }
4349 else {
4350 throw new InstantbankException("211065", "No queue plan category id found for transfer");
4351 }
4352 }
4353 else {
4354 throw new InstantbankException("211066", "No queue plan category id found for transfer");
4355 }
4356 }
4357
4358 if(qplanId.longValue() > 0) {
4359
4360 dataQuery = "SELECT ";
4361 dataQuery += "qplan_qut_id ";
4362 dataQuery += "FROM ";
4363 dataQuery += "queue_plans ";
4364 dataQuery += "WHERE ";
4365 dataQuery += "qplan_id=" + qplanId.toString();
4366 dataQuery += " AND ROWNUM = 1";
4367
4368 rs = st.executeQuery(dataQuery);
4369
4370 if(rs.next()) {
4371 lToQueCatId = new Long(rs.getLong(1));
4372
4373 dataQuery = "SELECT ";
4374 dataQuery += "qut_category ";
4375 dataQuery += "FROM ";
4376 dataQuery += "queue_types ";
4377 dataQuery += "WHERE ";
4378 dataQuery += "qut_id=" + lToQueCatId.toString();
4379 dataQuery += " AND ROWNUM = 1";
4380
4381 rs = st.executeQuery(dataQuery);
4382
4383 if(rs.next()) {
4384 sToQueCat = rs.getString(1);
4385
4386 }
4387 else {
4388 throw new InstantbankException("211067", "No queue plan category id found for transfer");
4389 }
4390
4391 }
4392 else {
4393 throw new InstantbankException("211068", "No queue plan category id found for transfer");
4394 }
4395 }
4396
4397 if(sFromQueCat.equalsIgnoreCase("C") && sToQueCat.equalsIgnoreCase("C")) {
4398 System.out.println("debug line 3945 - delete From=" + sFromQueCat + " | To=" + sToQueCat);
4399
4400 dataQuery = "DELETE FROM work_items ";
4401 dataQuery += "WHERE wrki_id=" + wrkiId;
4402
4403 int nRet = da.makeDelete(dataQuery);
4404
4405 if(nRet == 0) {
4406 throw new InstantbankException("211069", "Failed to delete work item");
4407 }
4408 }
4409
4410
4411
4412 removeDups(objectId);
4413 System.out.println("debug line 3961 - select userid, totals " + qplanId.toString());
4414 dataQuery = "SELECT ";
4415 dataQuery += "wsum_user_id,";
4416 dataQuery += "wsum_total_accounts ";
4417 dataQuery += "FROM ";
4418 dataQuery += "work_summaries ";
4419 dataQuery += "WHERE ";
4420 dataQuery += "wsum_total_remaining IN (";
4421 dataQuery += "SELECT ";
4422 dataQuery += "MIN(wsum_total_remaining) ";
4423 dataQuery += "FROM ";
4424 dataQuery += "work_summaries ";
4425 dataQuery += "WHERE ";
4426 dataQuery += "wsum_qplan_id = " + qplanId.toString() + " AND ";
4427
4428
4429 dataQuery += "wsum_date <= SYSDATE";
4430 dataQuery += ") AND ";
4431 dataQuery += "wsum_qplan_id = " + qplanId.toString() + " AND ";
4432
4433
4434 dataQuery += "wsum_date <= SYSDATE" + " AND ";
4435 dataQuery += "ROWNUM = 1";
4436 rs = st.executeQuery(dataQuery);
4437 if(rs.next()) {
4438 userId = new Long(rs.getLong(1));
4439 order = new Long(rs.getLong(2));
4440
4441 }
4442 else {
4443 throw new InstantbankException("211048", "No user found for transfer");
4444 }
4445
4446 trhId = new Long(UniqueIDGenerator.instance().getNextId());
4447 dataQuery = "INSERT INTO transfer_history (";
4448 dataQuery += "trh_id,";
4449 dataQuery += "trh_from_user_id,";
4450 dataQuery += "trh_from_qplan_id,";
4451 dataQuery += "trh_to_user_id,";
4452 dataQuery += "trh_to_qplan_id,";
4453 dataQuery += "trh_datestamp,";
4454 dataQuery += "trh_object_type,";
4455 dataQuery += "trh_object_id";
4456 dataQuery += ") VALUES (";
4457 dataQuery += trhId.toString() + ",";
4458 dataQuery += fromUserId.toString() + ", ";
4459 dataQuery += fromQplanId.toString() + ", ";
4460 dataQuery += userId.toString() + ", ";
4461 dataQuery += qplanId.toString() + ", ";
4462 dataQuery += "SYSDATE, ";
4463 dataQuery += "'" + objectType + "', ";
4464 dataQuery += objectId.toString();
4465 dataQuery += ")";
4466
4467 da.makeInsert(dataQuery);
4468
4469 transfers++;
4470 dataQuery = "INSERT INTO work_items (";
4471 dataQuery += "wrki_id,";
4472 dataQuery += "wrki_order,";
4473 dataQuery += "wrki_last_changed_date,";
4474 dataQuery += "wrki_last_changed_by,";
4475 dataQuery += "wrki_qplan_id,";
4476 dataQuery += "wrki_user_id,";
4477 dataQuery += "wrki_object_type,";
4478 dataQuery += "wrki_object_id,";
4479 dataQuery += "wrki_followup_date,";
4480 dataQuery += "wrki_followup_time,";
4481 dataQuery += "wrki_class_id,";
4482 dataQuery += "wrki_activity_id,";
4483 dataQuery += "wrki_status,";
4484 dataQuery += "wrki_date,";
4485 dataQuery += "wrki_transfers ";
4486 dataQuery += ") VALUES (";
4487 dataQuery += UniqueIDGenerator.instance().getNextId() + ",";
4488 dataQuery += (order.longValue() + 1) + ",";
4489 dataQuery += "TO_DATE('" + sdf.format(lastChangedDate) + "','mm-dd-yyyy'),";
4490 dataQuery += lastChangedBy + ",";
4491 dataQuery += qplanId + ",";
4492 dataQuery += userId + ",";
4493 dataQuery += "'" + objectType + "',";
4494 dataQuery += objectId + ",";
4495 dataQuery += ((followupDate == null) ? ("TO_CHAR(SYSDATE), ") : ("TO_DATE('" + sdf.format(followupDate) + "','mm-dd-yyyy'), "));
4496 dataQuery += "'" + followupTime + "',";
4497 dataQuery += ((classId == null) ? ("NULL") : (classId.toString())) + ",";
4498 dataQuery += ((activityId == null) ? ("NULL") : (activityId.toString())) + ",";
4499 dataQuery += "'N',";
4500 dataQuery += "TO_DATE('" + sdf.format(workiDate) + "','mm-dd-yyyy'),";
4501 dataQuery += "" + transfers;
4502 dataQuery += ")";
4503
4504 da.makeInsert(dataQuery);
4505
4506 ++fromTransfers;
4507 dataQuery = "UPDATE work_items SET ";
4508 dataQuery += "wrki_from_transfers = " + fromTransfers;
4509 dataQuery += "WHERE ";
4510 dataQuery += "wrki_id = " + wrkiId.toString();
4511
4512 da.makeInsert(dataQuery);
4513
4514
4522 dataQuery = "UPDATE work_summaries SET ";
4523
4524 dataQuery += "wsum_total_transferred_out = (wsum_total_transferred_out + 1), ";
4525
4526 dataQuery += "wsum_total_worked = (wsum_total_worked - 1), ";
4527 dataQuery += "wsum_total_promises = (wsum_total_promises - " + promiseIndicator + "), ";
4528 dataQuery += "wsum_total_contacts = (wsum_total_contacts - " + contactIndicator + "), ";
4529 dataQuery += "wsum_total_indirect_contacts = (wsum_total_indirect_contacts - " + indirectIndicator + "), ";
4530 dataQuery += "wsum_total_attempt_contacts = (wsum_total_attempt_contacts - " + attemptIndicator + ") ";
4531 dataQuery += "WHERE ";
4532 dataQuery += "wsum_user_id = " + fromUserId.toString() + " AND ";
4533 dataQuery += "wsum_qplan_id = " + fromQplanId.toString() + " AND ";
4534 dataQuery += "wsum_date <= SYSDATE AND ";
4535 dataQuery += "WSUM_TOTAL_WORKED <>" + 0;
4536
4537 da.makeInsert(dataQuery);
4538
4539 dataQuery = "UPDATE work_summaries SET ";
4540 dataQuery += "wsum_total_transferred_in = (wsum_total_transferred_in + 1),";
4541 dataQuery += "wsum_total_remaining = (wsum_total_remaining + 1) ";
4542 dataQuery += "WHERE ";
4543 dataQuery += "wsum_user_id = " + userId.toString() + " AND ";
4544 dataQuery += "wsum_qplan_id = " + qplanId.toString() + " AND ";
4545 dataQuery += "wsum_date <= SYSDATE";
4546
4547 da.makeInsert(dataQuery);
4548 }
4549 catch(Exception e) {
4550 setRollbackOnly();
4551 throw new InstantbankException(e, "211049", "Failed to transfer to queue");
4552 }
4553 finally {
4554 try {
4555 if(rs != null) {
4556 rs.close();
4557 }
4558 if(st != null) {
4559 st.close();
4560 }
4561 if(da != null) {
4562 da.disconnect();
4563 }
4564 }
4565 catch(Exception e) {
4566 }
4567 }
4568 }
4569
4570
4571 public int transferUserToUser(Long userFrom, Long userTo, Long queueId, Long companyId, Long supervisorId) throws InstantbankException {
4572 DataAccess da = null;
4573 String sql;
4574 int total = 0;
4575
4576 try {
4577 da = new DataAccess();
4578 da.connect();
4579
4580 sql = "UPDATE work_items SET ";
4581 sql += "wrki_user_id=" + userTo + " ";
4582 sql += "WHERE ";
4583 sql += "wrki_user_id=" + userFrom + " AND ";
4584 sql += "wrki_qplan_id=" + queueId + " AND ";
4585 sql += "wrki_status='N' ";
4586
4587 total = da.makeUpdate(sql);
4588
4589 updateSummary(queueId, userFrom, -total, 0, 0, total, -total, 0, 0, 0, 0, 0, da);
4590 updateSummary(queueId, userTo, total, 0, total, 0, total, 0, 0, 0, 0, 0, da);
4591
4592 return total;
4593 }
4594 catch(Exception e) {
4595 setRollbackOnly();
4596 throw new InstantbankException(e, "211050", "Failed to transfer work from user to another");
4597 }
4598 finally {
4599 try {
4600 if(da != null) {
4601 da.disconnect();
4602 }
4603 }
4604 catch(Exception e) {
4605 }
4606 }
4607 }
4608
4609
4610 private String xmlSelectCategories(XMLDataAccess xda, Long id) throws InstantbankException {
4611 NodeList nlDisplay;
4612 String nlDisplayName;
4613 int nlLengthTable;
4614 NodeList nlValue;
4615 String nlValueName;
4616 String query = "";
4617 XMLDocument xmlDocFixed;
4618 String xmlResult = "";
4619
4620 try {
4621 query = "SELECT ";
4622 query += "stv_id,stv_name ";
4623 query += "FROM ";
4624 query += "status_values ";
4625 query += "WHERE ";
4626 query += "stv_stc_id= " + id;
4627 xmlDocFixed = xda.makeXMLSelect(query, "ValuesList", "Values");
4628 nlDisplay = xmlDocFixed.selectNodes("/ValuesList/Values/stv_name/text()");
4629 nlValue = xmlDocFixed.selectNodes("/ValuesList/Values/stv_id/text()");
4630 nlLengthTable = nlDisplay.getLength();
4631 for(int i = 0; i < nlLengthTable; i++) {
4632 nlDisplayName = nlDisplay.item(i).getNodeValue();
4633 nlValueName = nlValue.item(i).getNodeValue();
4634 xmlResult += "<Value>";
4635 xmlResult += "<Display>" + nlDisplayName + "</Display>";
4636 xmlResult += "<InternalValue>" + nlValueName + "</InternalValue>";
4637 xmlResult += "</Value>";
4638 }
4639 return xmlResult;
4640 }
4641 catch(Exception e) {
4642 setRollbackOnly();
4643 throw new InstantbankException(e, "211051", "Failed to retrieve status categories");
4644 }
4645 }
4646
4647
4648 private String xmlSelectFixed(XMLDataAccess xda, Long id) throws InstantbankException {
4649 NodeList nlDisplay;
4650 String nlDisplayName;
4651 int nlLengthTable;
4652 NodeList nlValue;
4653 String nlValueName;
4654 String query = "";
4655 XMLDocument xmlDocFixed;
4656 String xmlResult = "";
4657
4658 try {
4659 query = "SELECT ";
4660 query += "fval_value,";
4661 query += "fval_description ";
4662 query += "FROM ";
4663 query += "field_values ";
4664 query += "WHERE ";
4665 query += "fval_fvm_id= " + id;
4666 xmlDocFixed = xda.makeXMLSelect(query, "ValuesList", "Values");
4667 nlDisplay = xmlDocFixed.selectNodes("/ValuesList/Values/fval_description/text()");
4668 nlValue = xmlDocFixed.selectNodes("/ValuesList/Values/fval_value/text()");
4669 nlLengthTable = nlDisplay.getLength();
4670 for(int i = 0; i < nlLengthTable; i++) {
4671 nlDisplayName = nlDisplay.item(i).getNodeValue();
4672 nlValueName = nlValue.item(i).getNodeValue();
4673 xmlResult += "<Value>";
4674 xmlResult += "<Display>" + nlDisplayName + "</Display>";
4675 xmlResult += "<InternalValue>" + nlValueName + "</InternalValue>";
4676 xmlResult += "</Value>";
4677 }
4678 return xmlResult;
4679 }
4680 catch(Exception e) {
4681 setRollbackOnly();
4682 throw new InstantbankException(e, "211052", "Failed to retrieve menu values");
4683 }
4684 finally {
4685 if(xda != null) {
4686 xda.disconnect();
4687 }
4688 }
4689 }
4690
4691
4692 private String xmlSelectTable(XMLDataAccess xda, String query) throws InstantbankException {
4693 Node firstNode;
4694 String nameNodeDisplay;
4695 String nameNodeValue;
4696 NodeList nlDisplay;
4697 String nlDisplayName;
4698 int nlLengthTable;
4699 NodeList nlValue;
4700 String nlValueName;
4701 NodeList nlValueprb;
4702 XMLDocument xmlDocTable;
4703 String xmlResult = "";
4704
4705 try {
4706 xmlDocTable = xda.makeXMLSelect(query, "ValuesList", "Values");
4707 firstNode = xmlDocTable.selectSingleNode("/ValuesList/Values");
4708 nameNodeDisplay = firstNode.getChildNodes().item(1).getNodeName();
4709 nameNodeValue = firstNode.getChildNodes().item(2).getNodeName();
4710 nlDisplay = xmlDocTable.selectNodes("/ValuesList/Values/" + nameNodeDisplay + "/text()");
4711 nlValue = xmlDocTable.selectNodes("/ValuesList/Values/" + nameNodeValue + "/text()");
4712 nlLengthTable = nlDisplay.getLength();
4713 for(int i = 0; i < nlLengthTable; i++) {
4714 nlDisplayName = nlDisplay.item(i).getNodeValue();
4715 nameNodeValue = nlValue.item(i).getNodeValue();
4716 xmlResult += "<Value>";
4717 xmlResult += "<Display>" + nlDisplayName + "</Display>";
4718 xmlResult += "<InternalValue>" + nameNodeValue + "</InternalValue>";
4719 xmlResult += "</Value>";
4720 }
4721 return xmlResult;
4722 }
4723 catch(Exception e) {
4724 setRollbackOnly();
4725 throw new InstantbankException(e, "211053", "Failed to retrieve values from table");
4726 }
4727 }
4728
4729
4730 public void setLastActivityIdToWorkItem(Long workItemId, Long activityId) throws InstantbankException {
4731 DataAccess da = null;
4732
4733 try {
4734 da = new DataAccess();
4735 da.connect();
4736
4737 da.makeUpdate("UPDATE work_items SET wrki_activity_id = " + activityId.toString() + " WHERE wrki_id = " + workItemId.toString());
4738
4739 return;
4740 }
4741 catch(Exception e) {
4742 setRollbackOnly();
4743 throw new InstantbankException(e, "211070", "Failed to set the last Activity Id to the Work Item");
4744 }
4745 finally {
4746 try {
4747 if(da != null) {
4748 da.disconnect();
4749 }
4750 }
4751 catch(Exception e) {
4752 }
4753 }
4754 }
4755
4756
4757 private void setRollbackOnly() {
4758 try {
4759 this.context.setRollbackOnly();
4760 }
4761 catch(Exception ne) {
4762 }
4763 }
4764
4765
4766 public void setSessionContext(SessionContext ctx) {
4767 this.context = ctx;
4768 }
4769
4770
4771 private void updateSummary(
4772 Long queueId, Long userId,
4773 long accounts, long worked, long transferredIn, long transferredOut,
4774 long remaining, long contacts, long promises, long amountPromises,
4775 long indirectContacts, long attemptedContacts, DataAccess da
4776 ) throws SQLException, Exception {
4777 Long groupId;
4778 ResultSet rs = null;
4779 String sql;
4780 Long supervisorQueueId;
4781 Statement st = null;
4782 int updated;
4783
4784 try {
4785 st = da.getConnection().createStatement();
4786 sql = "UPDATE work_summaries SET ";
4787 sql += "wsum_total_accounts=wsum_total_accounts+(" + accounts + "),";
4788 sql += "wsum_total_worked=wsum_total_worked+(" + worked + "),";
4789 sql += "wsum_total_transferred_in=wsum_total_transferred_in+(" + transferredIn + "),";
4790 sql += "wsum_total_transferred_out=wsum_total_transferred_out+(" + transferredOut + "),";
4791 sql += "wsum_total_remaining=wsum_total_remaining+(" + remaining + "),";
4792 sql += "wsum_total_contacts=wsum_total_contacts+(" + contacts + "),";
4793 sql += "wsum_total_promises=wsum_total_promises+(" + promises + "),";
4794 sql += "wsum_total_amount_promises=wsum_total_amount_promises+(" + amountPromises + "),";
4795 sql += "wsum_total_indirect_contacts=wsum_total_indirect_contacts+(" + indirectContacts + "),";
4796 sql += "wsum_total_attempt_contacts=wsum_total_attempt_contacts+(" + attemptedContacts + ") ";
4797 sql += "WHERE ";
4798 sql += "wsum_qplan_id = " + queueId + " AND ";
4799 sql += "wsum_user_id = " + userId + " AND ";
4800 sql += "wsum_date <= TO_DATE(SYSDATE)";
4801 updated = da.makeUpdate(sql);
4802 if(updated <= 0) {
4803 sql = "SELECT DISTINCT ";
4804 sql += "user_usg_id,";
4805 sql += "csp_supervisor_queue_id ";
4806 sql += "FROM ";
4807 sql += "users,";
4808 sql += "security_profiles,";
4809 sql += "collections_security_profiles ";
4810 sql += "WHERE ";
4811 sql += "(user_id = " + userId + ") AND ";
4812 sql += "(sprf_id = user_sprf_id) AND ";
4813 sql += "(csp_id = sprf_csp_id)";
4814
4815 rs = st.executeQuery(sql);
4816 rs.next();
4817 groupId = new Long(rs.getLong(1));
4818 supervisorQueueId = new Long(rs.getLong(2));
4819
4820 sql = "INSERT INTO work_summaries(";
4821 sql += "wsum_id,";
4822 sql += "wsum_qplan_id,";
4823 sql += "wsum_usg_id,";
4824 sql += "wsum_user_id,";
4825 sql += "wsum_date,";
4826 sql += "wsum_category,";
4827 sql += "wsum_total_accounts,";
4828 sql += "wsum_total_worked,";
4829 sql += "wsum_total_transferred_in,";
4830 sql += "wsum_total_transferred_out,";
4831 sql += "wsum_total_remaining,";
4832 sql += "wsum_total_contacts,";
4833 sql += "wsum_total_promises,";
4834 sql += "wsum_total_amount_promises,";
4835 sql += "wsum_total_indirect_contacts,";
4836 sql += "wsum_total_attempt_contacts,";
4837 sql += "wsum_supervisor_id ";
4838 sql += ") VALUES (";
4839 sql += UniqueIDGenerator.instance().getNextId() + ",";
4840 sql += queueId + ",";
4841 sql += groupId + ",";
4842 sql += userId + ",";
4843 sql += "TO_DATE(SYSDATE),";
4844 sql += "(select qut_category from queue_plans,queue_types where qplan_id=" + queueId + " AND qplan_qut_id=qut_id),";
4845 sql += accounts + ",";
4846 sql += worked + ",";
4847 sql += transferredIn + ",";
4848 sql += transferredOut + ",";
4849 sql += remaining + ",";
4850 sql += contacts + ",";
4851 sql += promises + ",";
4852 sql += amountPromises + ",";
4853 sql += indirectContacts + ",";
4854 sql += attemptedContacts + ",";
4855 sql += supervisorQueueId;
4856 sql += ")";
4857 updated = da.makeInsert(sql);
4858 }
4859 }
4860 catch(Exception e) {
4861 }
4862 finally {
4863 try {
4864 if(rs != null) {
4865 rs.close();
4866 }
4867 if(st != null) {
4868 st.close();
4869 }
4870 }
4871 catch(Exception e) {
4872 }
4873 }
4874 }
4875 }
4876
4877