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     // Sql prepared statement constants
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       // TODO:	Add custom implementation.
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          // 8/21/02 - per Linda, remove all traces of a clear
506          dataQuery = "DELETE FROM work_items WHERE wrki_id = " + wrkiId;
507          da.makeDelete(dataQuery);
508  
509          // 8/16/2002 tjm
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    /**
984     * Method returns the previous queue & Date posted of an account and a queue
985     * The queue name and date are pipe delimited
986     *
987     * @param objectType Description of the Parameter
988     * @param objectId Description of the Parameter
989     * @param qid Description of the Parameter
990     * @return The previousQueueInfo value
991     * @throws InstantbankException Description of the Exception
992     */
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   /**
1041    * This method returns a map of queue/previous queue name for a given account
1042    *
1043    * @param objectType Description of the Parameter
1044    * @param objectId Description of the Parameter
1045    * @return The currentQueuesPrevious value
1046    * @throws InstantbankException Description of the Exception
1047    */
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) {  // This was a xfer
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       /*
1120                10102002 tjm CR 200210800.0 - Below taken out, replaced by "getCurrentQueuesPrevious"
1121 			sql+=	 "(SELECT ";
1122 			sql+=		 "user_userid ";
1123 			sql+=	 "FROM ";
1124 			sql+=		 "(SELECT ";
1125 			sql+=			 "user_userid ";
1126 			sql+=		 "FROM ";
1127 			sql+=			 "transfer_history, ";
1128 			sql+=			 "users ";
1129 			sql+=		 "Where ";
1130 			sql+=			 "user_id = TRH_from_USER_ID and ";
1131 			sql+=			 "TRH_OBJECT_TYPE= '"+objectType+"' and ";
1132 			sql+=			 "TRH_OBJECT_ID = "+new Long(objectId)+" ";
1133 			sql+=		 "ORDER BY ";
1134 			sql+=			 "trh_datestamp desc ";
1135 			sql+=		 ") ";
1136 			sql+=	 "WHERE ";
1137 			sql+=		 "ROWNUM=1 ";
1138 			sql+=	 ") original, ";
1139 			sql+=	 "(SELECT ";
1140 			sql+=		 "to_char(trh_datestamp,'mm-dd-yyyy') ";
1141 			sql+=	 "FROM ";
1142 			sql+=		 "(SELECT ";
1143 			sql+=			 "trh_datestamp ";
1144 			sql+=		 "FROM ";
1145 			sql+=			 "transfer_history, ";
1146 			sql+=			 "users ";
1147 			sql+=		 "Where ";
1148 			sql+=			 "user_id = TRH_from_USER_ID and ";
1149 			sql+=			 "TRH_OBJECT_TYPE= '"+objectType+"' and ";
1150 			sql+=			 "TRH_OBJECT_ID = "+new Long(objectId)+" ";
1151 			sql+=		 "ORDER BY ";
1152 			sql+=			 "trh_datestamp desc ";
1153 			sql+=		 ") ";
1154 			sql+=	 "WHERE ";
1155 			sql+=		 "ROWNUM=1 ";
1156 			sql+=	 ") originaldate ";
1157                */
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       // 08142002 tjm - Commented below; need to show all queues including those
1170       //                where the account has been xfered in
1171       //		sql+=	 "(wrki_from_transfers is null) and ";
1172 
1173       // 08192002 tjm - Don't include queues that were cleared
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 + ")";  // and ";
1177       /*    sql +=" (wrki_object_id not in ";
1178       sql +=" (SELECT trh_object_id";
1179       sql +="	from transfer_history";
1180       sql +="	where TRH_FROM_USER_ID= users.user_id )) "; */
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,";  //*CR2002062600.0 - add ach drafting to collections*//
1220       sql += "down_ftp_type_indicator ftptype,";  //*CR2002062600.0 - add ach drafting to collections*//
1221       sql += "down_achc_id achaccount,";  //*CR2002062600.0 - add ach drafting to collections*//
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       /**
1366        *This line should be used instead of the next one, in order to enable
1367        *the get by row counting property of this method.
1368        *sql+=	 "theRow between "+rownum +" and " + (rownum + numRecords -1);
1369        */
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       // 09202002 tjm - per Willy, the type should be 'S' for status categories
1412       // 10232002 tjm CR200283002.0 - alias is always AGREEMENTS_STATUS
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           // values of the tables
1563           xmlResult += xmlSelectTable(xda, idSelect);
1564         }
1565         if(idType.equals("F")) {
1566           //values Fixed
1567           xmlResult += xmlSelectFixed(xda, idParent);
1568         }
1569         xmlResult += "</Menu>";
1570       }
1571       if(objectType.equals("A")) {
1572         //values for category
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         // If supervisor queue not found in the users profile, is searched in the group
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       // First, look for the first timed item
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;  //+" AND ";
2713       //	sql+=	 "rownum=1 ";
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           // Then, Look for the first item with followup date due in the queues of the user
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'))";  // AND ";
2739           //	sql+=	 "rownum=1 ";
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           // If not found, gets first item without followup
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;  //+" AND ";
2847         //	sql+=	 "rownum=1 ";
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         //if (rs!=null)rs.close();
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,";  //*CR2002062600.0 - add ach drafting to collections*//
3535             sql += "DOWN_FTP_TYPE_INDICATOR,";  //*CR2002062600.0 - add ach drafting to collections*//
3536             sql += "DOWN_ACHC_ID";  //*CR2002062600.0 - add ach drafting to collections*//
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");  //*CR2002062600.0 - add ach drafting to collections*//
3549             sql += "','" + node.valueOf("./ftptype");  //*CR2002062600.0 - add ach drafting to collections*//
3550             sql += "'," + new Long(node.valueOf("./achaccount"));  //*CR2002062600.0 - add ach drafting to collections*//
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")) + ",";  //*CR2002062600.0 - add ach drafting to collections*//
3564             sql += "DOWN_FTP_TYPE_INDICATOR='" + node.valueOf("./ftptype") + "',";  //*CR2002062600.0 - add ach drafting to collections*//
3565             sql += "DOWN_ACHC_ID=" + new Long(node.valueOf("./achaccount")) + ",";  //*CR2002062600.0 - add ach drafting to
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         // 10232002 tjm CR200283002.0 - uppercase the value
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         //insert
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         //modify
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         //delete
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   /**
4171    * Makes sure an account only exists in one queue at a time
4172    *
4173    * @param wrkiObjectId Description of the Parameter
4174    * @throws InstantbankException Description of the Exception
4175    */
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;  // Skip the most recent queue
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       // 8/16/2002 tjm - Remove all Collections queue this account
4411       //                 except for the most recent one
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       // if(fromQplanId.equals(qplanId))
4428       //dataQuery+=			 "wsum_user_id <>"+fromUserId.toString()+"  AND ";
4429       dataQuery += "wsum_date <= SYSDATE";
4430       dataQuery += ") AND ";
4431       dataQuery += "wsum_qplan_id = " + qplanId.toString() + " AND ";
4432       //  if(fromQplanId.equals(qplanId))
4433       //	dataQuery+=			 "wsum_user_id <>"+fromUserId.toString()+"  AND ";
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       /*   dataQuery = "SELECT COUNT(*) FROM ";
4515  			dataQuery+=	 "TRANSFER_HISTORY WHERE ";
4516  			dataQuery+=	 "TRH_FROM_QPLAN_ID = "+fromQplanId.toString()+" AND ";
4517  			dataQuery+=	 "TRH_FROM_USER_ID = "+fromUserId.toString()+" AND ";
4518       dataQuery+=	 "TRH_OBJECT_ID = "+objectId;
4519       System.out.println(dataQuery);
4520       rs= st.executeQuery(dataQuery);
4521       if(rs.next()) transfered = rs.getInt(1);*/
4522       dataQuery = "UPDATE work_summaries SET ";
4523 //      if(transfered<=1){
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