DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGI_EXP_APPROVAL_PKG

Source


1 PACKAGE BODY igi_exp_approval_pkg AS
2    -- $Header: igiexab.pls 120.15 2009/02/09 09:55:14 sharoy ship $
3 
4 
5 
6 
7  /* ============== WORKFLOW VARAIBLES =================
8  ## Variables for framing and coloring the Table.
9  ## copied FROM WF_NOTIFICATION package
10  ## /fnddev/fnd/11.5/patch/115/sql/wfntfb.pls
11  ##
12  */
13 
14     table_width        VARCHAR2(6)  := '"100%"';
15     table_border       VARCHAR2(3)  := '"0"';
16     table_cellpadding  VARCHAR2(3)  := '"3"';
17     table_cellspacing  VARCHAR2(3)  := '"1"';
18     total_cellspacing  VARCHAR2(3)  := '"0"';
19     table_bgcolor      VARCHAR2(7)  := '"white"';
20     th_bgcolor         VARCHAR2(9)  := '"#cccc99"';
21     th_fontcolor       VARCHAR2(9)  := '"#336699"';
22     th_fontface        VARCHAR2(80) := '"Arial, Helvetica, Geneva, sans-serif"';
23     th_fontsize        VARCHAR2(2)  := '2';
24     td_bgcolor         VARCHAR2(9)  := '"#f7f7e7"';
25     td_fontcolor       VARCHAR2(7)  := '"black"';
26     td_fontface        VARCHAR2(80) := '"Arial, Helvetica, Geneva, sans-serif"';
27     td_fontsize        varchar2(2)  := '2';
28 
29  /* ============== FND LOG VARIABLES ================== */
30     l_debug_level   number := FND_LOG.G_CURRENT_RUNTIME_LEVEL ;
31     l_state_level   number := FND_LOG.LEVEL_STATEMENT ;
32     l_proc_level    number := FND_LOG.LEVEL_PROCEDURE ;
33     l_event_level   number := FND_LOG.LEVEL_EVENT ;
34     l_excep_level   number := FND_LOG.LEVEL_EXCEPTION ;
35     l_error_level   number := FND_LOG.LEVEL_ERROR ;
36     l_unexp_level   number := FND_LOG.LEVEL_UNEXPECTED ;
37 
38     -- global variables for framing the table header.
39     l_table_head           VARCHAR2(100);
40     l_line_head            VARCHAR2(100);
41     l_desc_head            VARCHAR2(100);
42 
43    --
44    --
45    -- PRIVATE ROUTINES
46    --
47    --
48 
49    /* =================== DEBUG_LOG_UNEXP_ERROR =================== */
50 
51    Procedure Debug_log_unexp_error (P_module     IN VARCHAR2,
52                                     P_error_type IN VARCHAR2)
53    IS
54 
55    BEGIN
56 
57     IF (l_unexp_level >= l_debug_level) THEN
58 
59        IF   (P_error_type = 'DEFAULT') THEN
60              FND_MESSAGE.SET_NAME('IGI','IGI_LOGGING_UNEXP_ERROR');
61              FND_MESSAGE.SET_TOKEN('CODE',sqlcode);
62              FND_MESSAGE.SET_TOKEN('MSG',sqlerrm);
63              FND_LOG.MESSAGE(l_unexp_level, 'igi.plsql.igiexab.igi_exp_approval_pkg.' || P_module ,TRUE);
64        ELSIF (P_error_type = 'USER') THEN
65              FND_LOG.MESSAGE(l_unexp_level, 'igi.plsql.igiexab.igi_exp_approval_pkg.' || P_module ,TRUE);
66        END IF;
67 
68     END IF;
69 
70     wf_core.context ('IGI_EXP_APPROVAL_PKG','igi.plsql.igiexab.igi_exp_approval_pkg.'|| P_module,
71                                             'Unexpected error occured. Please refer FND LOG for detailed ERROR message');
72 
73    EXCEPTION
74    WHEN OTHERS THEN
75         wf_core.context ('IGI_EXP_APPROVAL_PKG','Debug_log_unexp_error', 'ERROR IN FND LOGGING');
76         RAISE;
77 
78    END Debug_log_unexp_error;
79 
80    /* =================== DEBUG_LOG_STRING =================== */
81 
82    Procedure Debug_log_string (P_level   IN NUMBER,
83                                P_module  IN VARCHAR2,
84                                P_Message IN VARCHAR2)
85    IS
86 
87    BEGIN
88 
89      IF (P_level >= l_debug_level) THEN
90          FND_LOG.STRING(P_level, 'igi.plsql.igiexab.igi_exp_approval_pkg.' || P_module, P_message) ;
91      END IF;
92 
93    EXCEPTION
94    WHEN OTHERS THEN
95         wf_core.context ('IGI_EXP_APPROVAL_PKG','Debug_log_string', 'ERROR IN FND LOGGING');
96         RAISE;
97 
98    END Debug_log_string;
99 
100    /* =================== FRAME_TABLE_HEADER =================== */
101 
102    PROCEDURE Frame_table_header (p_html_tag  OUT NOCOPY VARCHAR2)
103    IS
104 
105     l_table_details VARCHAR2(4000);
106 
107    BEGIN
108 
109       -- =============== START DEBUG LOG ================
110          DEBUG_LOG_STRING (l_proc_level, 'Frame_table_header.Msg1',
111                            ' ** START FRAME_TABLE_HEADER ** ');
112       -- =============== END DEBUG LOG ==================
113 
114       -- Getting the table heads from messages
115       fnd_message.set_name ('IGI', 'IGI_EXP_TABLE_HEAD');
116       l_table_head := fnd_message.get;
117       fnd_message.set_name ('IGI', 'IGI_EXP_LINE');
118       l_line_head := fnd_message.get;
119       fnd_message.set_name ('IGI', 'IGI_EXP_DIA_LIST');
120       l_desc_head := fnd_message.get;
121 
122       -- =============== START DEBUG LOG ================
123          DEBUG_LOG_STRING (l_proc_level, 'Frame_table_header.Msg2',
124                            ' Getting table heading ' ||
125                            ' l_table_head --> ' || l_table_head ||
126                            ' l_line_head  --> ' || l_line_head  ||
127                            ' l_desc_head  --> ' || l_desc_head  );
128       -- =============== END DEBUG LOG ==================
129 
130       -- Framing the table headings..
131       l_table_details := '<br><font color='||th_fontcolor||'face='||
132                          th_fontface||'><b>'|| l_table_head || '</b>';
133 
134       l_table_details := l_table_details ||'<table bgcolor=' ||table_bgcolor
135                                          ||' width='         ||table_width
136                                          ||' border='        ||table_border
137                                          ||' cellpadding='   ||table_cellpadding
138                                          ||' cellspacing='   ||table_cellspacing||'>';
139 
140       l_table_details := l_table_details || '<tr bgcolor='||th_bgcolor||'>';
141       l_table_details := l_table_details || '<td align="left"><font color='||th_fontcolor||' face='||
142                          th_fontface||' size='||th_fontsize||'><b>' || l_line_head || '</b></td>';
143       l_table_details := l_table_details || '<td align="left"><font color='||th_fontcolor||' face='||
144                          th_fontface||' size='||th_fontsize||'><b>' || l_desc_head || '</b></td>';
145       l_table_details := l_table_details || '</tr>';
146 
147       -- =============== START DEBUG LOG ================
148          DEBUG_LOG_STRING (l_proc_level, 'Frame_table_header.Msg3',
149                           ' Table heading -- l_table_details --> ' || l_table_details);
150      -- =============== END DEBUG LOG ==================
151 
152      p_html_tag := l_table_details;
153 
154       -- =============== START DEBUG LOG ================
155          DEBUG_LOG_STRING (l_proc_level, 'Frame_table_header.Msg4',
156                            ' ** END FRAME_TABLE_HEADER ** ');
157       -- =============== END DEBUG LOG ==================
158 
159   EXCEPTION
160       WHEN OTHERS THEN
161          p_html_tag := NULL;
162          -- =============== START DEBUG LOG ================
163             DEBUG_LOG_UNEXP_ERROR ('Frame_table_header.Unexp1','DEFAULT');
164          -- =============== END DEBUG LOG ==================
165          raise;
166 
167    END Frame_table_header;
168 
169    -- *************************************************************************
170    --    CREATE_DU_LIST
171    -- *************************************************************************
172 
173   PROCEDURE Create_du_list (document_id   IN            VARCHAR2,
174             display_type  IN            VARCHAR2,
175             document      IN OUT NOCOPY CLOB,
176             document_type IN OUT NOCOPY VARCHAR2)
177   IS
178 
179       itemtype               VARCHAR2(30);
180       itemkey                VARCHAR2(60);
181       l_tu_id                igi_exp_dus.tu_id%TYPE;
182       l_du_prep_id           igi_exp_dus.du_by_user_id%TYPE;
183 
184       l_du_list              VARCHAR2(28000);
185       l_du                   VARCHAR2(4000);
186 
187       l_table_details        VARCHAR2(4000);
188       l_substr               NUMBER := 1;
189       l_instr                NUMBER := 0;
190       l_line_num             NUMBER := 0;
191 
192    BEGIN
193 
194 
195       -- =============== START DEBUG LOG ================
196          DEBUG_LOG_STRING (l_proc_level, 'Create_du_list.Msg1',
197                            ' ** START  CREATE_DU_LIST ** ');
198       -- =============== END DEBUG LOG ==================
199 
200       itemtype := substr(document_id,1,instr(document_id,':')-1);
201       itemkey  := substr(document_id,instr(document_id,':')+1);
202 
203       -- =============== START DEBUG LOG ================
204          DEBUG_LOG_STRING (l_proc_level, 'Create_du_list.Msg2',
205                            ' itemtype --> ' || itemtype ||
206                            ' itemkey  --> ' || itemkey);
207          DEBUG_LOG_STRING (l_proc_level, 'Create_du_list.Msg3',
208                            ' Getting values from ADD_ATTRS' );
209       -- =============== END DEBUG LOG ==================
210 
211       FOR J IN 1..7 LOOP
212         -- Get all the du attribute
213         l_du := wf_engine.GetItemAttrText  ( itemtype => itemtype,
214                                              itemkey  => itemkey,
215                                              aname    => 'ADD_ATTR'||J);
216 
217         -- =============== START DEBUG LOG ================
218            DEBUG_LOG_STRING (l_proc_level, 'Create_du_list.Msg4',
219                              ' Getting from ADD_ATTR'||J);
220         -- =============== END DEBUG LOG ==================
221 
222         IF (l_du IS NULL) THEN
223             exit;
224         END IF;
225 
226         l_du_list := l_du_list || l_du;
227 
228       END LOOP;
229 
230       -- =============== START DEBUG LOG ================
231          DEBUG_LOG_STRING (l_proc_level, 'Create_du_list.Msg5',
232                            ' Calling frame table header ');
233       -- =============== END DEBUG LOG ==================
234 
235       Frame_table_header (l_table_details);
236 
237       -- =============== START DEBUG LOG ================
238          DEBUG_LOG_STRING (l_proc_level, 'Create_du_list.Msg6',
239                            ' l_table_details --> ' || l_table_details);
240       -- =============== END DEBUG LOG ==================
241 
242       -- adding to the clob
243       WF_NOTIFICATION.WriteToClob(Document,l_table_details);
244 
245       -- Framing the DU list and adding it to the table.
246       LOOP
247 
248          l_instr                := instr(l_du_list, fnd_global.local_chr(10));
249 
250         -- =============== START DEBUG LOG ================
251            DEBUG_LOG_STRING (l_proc_level, 'Create_du_list.Msg7',
252                              ' l_instr --> ' || l_instr);
253         -- =============== END DEBUG LOG ==================
254 
255          l_du := substr ( l_du_list, l_substr, l_instr );
256 
257         -- =============== START DEBUG LOG ================
258            DEBUG_LOG_STRING (l_proc_level, 'Create_du_list.Msg8',
259                              ' l_du --> ' || l_du);
260         -- =============== END DEBUG LOG ==================
261 
262         -- putting details to HTML table.
263         l_line_num      := l_line_num + 1;
264         l_table_details := '<tr>';
265         l_table_details := l_table_details || '<td bgcolor='||td_bgcolor||' align="left"><font color='||
266                            td_fontcolor||' face='||td_fontface||' size='||td_fontsize||'>' || to_char(l_line_num) || '</td>';
267         l_table_details := l_table_details || '<td bgcolor='||td_bgcolor||' align="left"><font color='||
268                            td_fontcolor||' face='||td_fontface||' size='||td_fontsize||'>' || l_du || '</td>';
269         l_table_details := l_table_details || '</tr>';
270 
271         -- =============== START DEBUG LOG ================
272            DEBUG_LOG_STRING (l_proc_level, 'Create_du_list.Msg9',
273                              ' Table details -- l_table_details --> ' || l_table_details);
274         -- =============== END DEBUG LOG ==================
275 
276         WF_NOTIFICATION.WriteToClob(Document, l_table_details);
277 
278         l_du_list          := substr (l_du_list, l_instr+1);
279 
280         -- =============== START DEBUG LOG ================
281            DEBUG_LOG_STRING (l_proc_level, 'Create_du_list.Msg10',
282                              ' l_du_list --> '|| substr(l_du_list,1,3900));
283         -- =============== END DEBUG LOG ==================
284 
285         IF (l_du_list IS NULL) THEN
286            -- =============== START DEBUG LOG ================
287               DEBUG_LOG_STRING (l_proc_level, 'Create_du_list.Msg11',
288                                 ' l_du_list IS NULL -- exiting' );
289            -- =============== END DEBUG LOG ==================
290            exit;
291         END IF;
292 
293      END LOOP;
294 
295 
296      -- closing the HTML table.
297      l_table_details := '</table><br>';
298      -- =============== START DEBUG LOG ================
299         DEBUG_LOG_STRING (l_proc_level, 'Create_du_list.Msg12',
300                           ' End of table -- l_table_details --> ' || l_table_details);
301      -- =============== END DEBUG LOG ==================
302 
303      WF_NOTIFICATION.WriteToClob(Document,l_table_details);
304 
305     -- =============== START DEBUG LOG ================
306        DEBUG_LOG_STRING (l_proc_level, 'Create_du_list.Msg13',
307                          ' ** END  CREATE_DU_LIST ** ');
308     -- =============== END DEBUG LOG ==================
309 
310    EXCEPTION
311       WHEN OTHERS THEN
312          -- =============== START DEBUG LOG ================
313             DEBUG_LOG_UNEXP_ERROR ('Create_du_list.Unexp1','DEFAULT');
314          -- =============== END DEBUG LOG ==================
315          raise;
316 
317    END Create_du_list;
318 
319   /* =================== SET_TU_FORM_TO_QUERY =================== */
320 
321    PROCEDURE set_tu_form_to_query (p_nid NUMBER) IS
322 
323       l_value      VARCHAR2(4000);
324       l_new_value  VARCHAR2(4000);
325 
326    BEGIN
327 
328       -- This procedure is called from procedure set_curr_auth_to_responder
329       -- (a post notification function).   This procedure will reset the value
330       -- of the TU_FORM attribute after a notification has been responded to or
331       -- timed out NOCOPY so that the TU form is called in query_only mode.
332 
333      -- =============== START DEBUG LOG ================
334          DEBUG_LOG_STRING (l_proc_level, 'set_tu_form_to_query.Msg1',
335                            ' ** BEGIN SET_TU_FORM_TO_QUERY ** ');
336      -- =============== END DEBUG LOG ==================
337 
338       SELECT text_value
339       INTO   l_value
340       FROM   wf_notification_attributes
341       WHERE  notification_id = p_nid
342       AND    name = 'TU_FORM';
343 
344      -- =============== START DEBUG LOG ================
345          DEBUG_LOG_STRING (l_proc_level, 'set_tu_form_to_query.Msg2',
346                            ' l_value --> ' || l_value);
347      -- =============== END DEBUG LOG ==================
348 
349       -- The value of parameter QUERY_ONLY should be set to 'YES'
350       -- instead of 'NO'
351       l_new_value := REPLACE(l_value,'NO','YES');
352 
353      -- =============== START DEBUG LOG ================
354          DEBUG_LOG_STRING (l_proc_level, 'set_tu_form_to_query.Msg3',
355                            ' l_new_value --> ' || l_new_value);
356      -- =============== END DEBUG LOG ==================
357 
358 
359       UPDATE wf_notification_attributes
360       SET    text_value = l_new_value
361       WHERE  notification_id = p_nid
362       AND    name = 'TU_FORM';
363 
364      -- =============== START DEBUG LOG ================
365          DEBUG_LOG_STRING (l_proc_level, 'set_tu_form_to_query.Msg4',
366                            ' Updating wf_notification_attributes ');
367          DEBUG_LOG_STRING (l_proc_level, 'set_tu_form_to_query.Msg5',
368                            ' ** END SET_TU_FORM_TO_QUERY ** ');
369      -- =============== END DEBUG LOG ==================
370 
371    EXCEPTION
372       WHEN OTHERS THEN
373         -- =============== START DEBUG LOG ================
374            DEBUG_LOG_UNEXP_ERROR ('set_tu_form_to_query.Unexp1','DEFAULT');
375         -- =============== END DEBUG LOG ==================
376          RAISE;
377 
378    END set_tu_form_to_query;
379 
380    --
381    --
382    -- PUBLIC ROUTINES
383    --
384    --
385 
386    -- *************************************************************************
387    --     SELECTOR
388    -- *************************************************************************
389 
390 
391    PROCEDURE Selector(itemtype   IN VARCHAR2,
392                       itemkey    IN VARCHAR2,
393                       actid      IN NUMBER,
394                       funcmode   IN VARCHAR2,
395                       resultout OUT NOCOPY VARCHAR2) IS
396 
397    l_session_org_id   NUMBER;
398    l_work_item_org_id NUMBER;
399    l_user_id          NUMBER;
400    l_resp_id          NUMBER;
401    l_appl_id          NUMBER;
402 
403    BEGIN
404 
405      -- =============== START DEBUG LOG ================
406          DEBUG_LOG_STRING (l_proc_level, 'Selector.Msg1',
407                            ' ** BEGIN SELECTOR ** ');
408      -- =============== END DEBUG LOG ==================
409      -- Bug 4063076 Start
410 
411       IF funcmode = 'RUN'
412       THEN
413           -- Return process to run when workflow is invoked
414           resultout := 'EXP_APPROVAL_TOP';
415       ELSIF funcmode = 'TEST_CTX'
416       THEN
417           -- Code that compares current session context
418           -- with the work item context required to execute
419           -- the workflow
420           --fnd_profile.get (name=>'ORG_ID', val=> l_session_org_id);
421           l_session_org_id := mo_global.get_current_org_id(); -- Bug# 5905190 MOAC changes
422           l_work_item_org_id := wf_engine.GetItemAttrNumber
423                                     (itemtype,
424                                      itemkey,
425                                      'ORG_ID');
426           IF nvl(l_session_org_id,-99) = l_work_item_org_id
427           THEN
428                resultout := 'TRUE';
429           ELSE
430                -- This will cause workflow to call this funciton
431                -- in SET_CTX mode
432                resultout := 'FALSE';
433           END IF;
434 
435       ELSIF funcmode = 'SET_CTX'
436       THEN
437           l_user_id := wf_engine.GetItemAttrNumber
438                                     (itemtype,
439                                      itemkey,
440                                      'USER_ID');
441           l_resp_id := wf_engine.GetItemAttrNumber
442                                     (itemtype,
443                                      itemkey,
444                                      'RESPONSIBILITY_ID');
445           l_appl_id := wf_engine.GetItemAttrNumber
446                                     (itemtype,
447                                      itemkey,
448                                      'RESP_APPL_ID');
449 
450          /*  Bug# 5905190 MOAC changes starts.
451          Get org_id from Item Attribute and set policy context with same value
452          */
453          l_work_item_org_id := wf_engine.GetItemAttrNumber
454                                              (itemtype,
455                                               itemkey,
456                                      'ORG_ID');
457 
458          mo_global.set_policy_context('S',l_work_item_org_id);
459          /*  Bug# 5905190 MOAC changes ends */
460 
461          DEBUG_LOG_STRING (l_proc_level, 'Selector.Msg',
462                            ' Setting apps context with userid, respid, applid as '
463                            ||l_user_id ||' '|| l_resp_id ||' '|| l_appl_id );
464 
465 
466           FND_GLOBAL.apps_initialize(l_user_id,l_resp_id,l_appl_id);
467 
468           resultout := 'COMPLETE';
469       ELSE
470           resultout := 'COMPLETE';
471       END IF;
472 
473      -- Bug 4063076 End
474      -- =============== START DEBUG LOG ================
475          DEBUG_LOG_STRING (l_proc_level, 'Selector.Msg3',
476                            ' result --> ' || resultout);
477          DEBUG_LOG_STRING (l_proc_level, 'Selector.Msg4',
478                            ' ** END SELECTOR ** ');
479      -- =============== END DEBUG LOG ==================
480 
481 
482    EXCEPTION
483       WHEN OTHERS THEN
484         -- =============== START DEBUG LOG ================
485            DEBUG_LOG_UNEXP_ERROR ('Selector.Unexp1','DEFAULT');
486         -- =============== END DEBUG LOG ==================
487 
488          Wf_Core.Context ('IGI_EXP_APPROVAL_PKG','Selector', itemtype, itemkey,
489                          TO_CHAR(actid),funcmode);
490          RAISE;
491 
492    END Selector;
493 
494 
495    -- *************************************************************************
496    --     START_APPROVAL_WORKFLOW
497    -- *************************************************************************
498 
499 
500    PROCEDURE start_approval_workflow (p_tu_id               IN NUMBER
501                                      ,p_tu_order_number     IN VARCHAR2
502                                      ,p_tu_transmitter_name IN VARCHAR2
503                                      ,p_tu_transmitter_id   IN NUMBER) IS
504 
505       l_itemtype          VARCHAR2(10) := 'EXPAPPRV';
506       l_itemkey           VARCHAR2(50) ;
507       l_approval_run_id   NUMBER;
508       l_msg               VARCHAR2(2000);
509       l_tu_legal_number   VARCHAR2(250);                              ---- Changes for  Bug 6640095  -    FP Bug  6847238
510 
511 
512    BEGIN
513 
514      -- =============== START DEBUG LOG ================
515          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg1.3',
516                                          ' **       BEGIN START_APPROVAL_WORKFLOW     ** ');
517      -- =============== END DEBUG LOG ==================
518 
519       -- Update the status of the TU to 'Transmitted'
520       UPDATE igi_exp_tus tus
521       SET    tus.tu_status = 'TRA'
522       WHERE  tus.tu_id = p_tu_id;
523 
524      -- =============== START DEBUG LOG ================
525          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg2',
526                            ' updating igi_exp_tus setting tu_status = TRA for tu_id ' || p_tu_id);
527      -- =============== END DEBUG LOG ==================
528 
529       -- Update the status of all DUs in the TU to 'Transmitted'
530       UPDATE igi_exp_dus dus
531       SET    dus.du_status = 'TRA'
532       WHERE  dus.tu_id = p_tu_id;
533 
534      -- =============== START DEBUG LOG ================
535          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg3',
536                            ' updating igi_exp_dus setting du_status = TRA for tu_id ' || p_tu_id);
537      -- =============== END DEBUG LOG ==================
538 
539       -- Get approval run id
540       SELECT igi_exp_tu_run_s1.nextval
541       INTO   l_approval_run_id
542       FROM   sys.dual;
543 
544      -- =============== START DEBUG LOG ================
545          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg4',
546                            ' l_apporval_run_id --> ' || l_approval_run_id);
547      -- =============== END DEBUG LOG ==================
548 
549       -- Generate the item key
550       l_itemkey := to_char(p_tu_id)||'/'||to_char(l_approval_run_id);
551 
552      -- =============== START DEBUG LOG ================
553          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg5',
554                            ' l_itemkey --> ' || l_itemkey);
555      -- =============== END DEBUG LOG ==================
556 
557       -- Kick Off Workflow Process
558       wf_engine.CreateProcess (itemtype => l_itemtype,
559                                itemkey  => l_itemkey,
560                                process  => 'EXP_APPROVAL_TOP');
561 
562      -- =============== START DEBUG LOG ================
563          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg6',
564                            ' Create process ');
565      -- =============== END DEBUG LOG ==================
566 
567       -- Set Item User Key
568       wf_engine.SetItemUserKey( itemtype => l_itemtype,
569                                 itemkey  => l_itemkey,
570                                 userkey  => p_tu_order_number);
571 
572      -- =============== START DEBUG LOG ================
573          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg7',
574                            ' SetItemUserKey  p_tu_order_number');
575      -- =============== END DEBUG LOG ==================
576 
577       -- Set Process Owner
578       wf_engine.SetItemOwner( itemtype => l_itemtype,
579                               itemkey  => l_itemkey,
580                               owner    => p_tu_transmitter_name);
581 
582       -- =============== START DEBUG LOG ================
583          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg8',
584                            ' SetItemOwner  p_tu_transmitter_name');
585       -- =============== END DEBUG LOG ==================
586 
587      -- Set TU id
588       wf_engine.SetItemAttrNumber( itemtype => l_itemtype,
589                                    itemkey  => l_itemkey,
590                                    aname    => 'TU_ID',
591                                    avalue   => p_tu_id);
592 
593       -- =============== START DEBUG LOG ================
594          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg9',
595                            ' SetItemAttrNumber TU_ID --> ' || p_tu_id);
596       -- =============== END DEBUG LOG ==================
597 
598       -- Set TU Order Number
599       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
600                                    itemkey  => l_itemkey,
601                                    aname    => 'TU_ORDER_NUM',
602                                    avalue   => p_tu_order_number);
603 
604       -- =============== START DEBUG LOG ================
605          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg10',
606                            ' SetItemAttrText TU_ORDER_NUM --> ' || p_tu_order_number);
607       -- =============== END DEBUG LOG ==================
608 
609 
610  /*   wf_engine.SetItemAttrText  ( itemtype => l_itemtype,            ---- Changes for  Bug 6640095  -    FP Bug  6847238
611                                    itemkey  => l_itemkey,
612                                    aname    => 'TU_FULL_NUMBER',
613                                    avalue   => p_tu_order_number);
614    */
615       -- Set TU Full Number
616 
617       -- Bug 6640095 modifications starts here.
618       -- Introduced the following calculation for TU Full Number for bug 6640095.
619       -- If the tu_legal_number is not got generated, then it will take tu_order_number.
620 
621      select tu_legal_number into l_tu_legal_number
622      from igi_exp_tus WHERE tu_id = p_tu_id;
623 
624       IF (l_tu_legal_number is NULL) then
625 
626       -- Set TU Full Number
627       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
628                                    itemkey  => l_itemkey,
629                                    aname    => 'TU_FULL_NUMBER',
630                                    avalue   => p_tu_order_number);
631 
632       ELSE
633 
634       -- Set TU Full Number
635       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
636                                    itemkey  => l_itemkey,
637                                    aname    => 'TU_FULL_NUMBER',
638                                    avalue   => l_tu_legal_number);
639 
640       END IF;
641 
642    -- Bug 6640095 modifications ends here.                               ---- Changes for  Bug 6640095  -    FP Bug  6847238
643 
644 
645       -- =============== START DEBUG LOG ================
646          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg11',
647                            ' SetItemAttrText TU_FULL_NUMBER --> ' || p_tu_order_number);
648       -- =============== END DEBUG LOG ==================
649 
650       -- Set TU Transmitter User Name
651       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
652                                    itemkey  => l_itemkey,
653                                    aname    => 'TRANSMITTER_FND_NAME',
654                                    avalue   => p_tu_transmitter_name);
655 
656       -- =============== START DEBUG LOG ================
657          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg12',
658                            ' SetItemAttrText TRANSMITTER_FND_NAME --> ' || p_tu_transmitter_name);
659       -- =============== END DEBUG LOG ==================
660 
661       -- Set TU Transmitter User Id
662       wf_engine.SetItemAttrNumber( itemtype => l_itemtype,
663                                    itemkey  => l_itemkey,
664                                    aname    => 'TRANSMITTER_FND_ID',
665                                    avalue   => p_tu_transmitter_id);
666 
667       -- =============== START DEBUG LOG ================
668          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg13',
669                            ' SetItemAttrText TRANSMITTER_FND_ID --> ' || p_tu_transmitter_id);
670       -- =============== END DEBUG LOG ==================
671 
672       -- Set current authorizer role
673       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
674                                    itemkey  => l_itemkey,
675                                    aname    => 'CURRENT_AUTHORIZER_ROLE',
676                                    avalue   => p_tu_transmitter_name);
677 
678       -- =============== START DEBUG LOG ================
679          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg14',
680                            ' SetItemAttrText CURRENT_AUTHORIZER_ROLE --> ' || p_tu_transmitter_name);
681       -- =============== END DEBUG LOG ==================
682 
683 
684       -- Add Transmitter to Authorizer History List
685       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
686                                    itemkey  => l_itemkey,
687                                    aname    => 'AUTHORIZER_HISTORY_LIST',
688                                    avalue   => p_tu_transmitter_name);
689 
690       -- =============== START DEBUG LOG ================
691          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg15',
692                            ' SetItemAttrText AUTHORIZER_HISTORY_LIST --> ' || p_tu_transmitter_name);
693       -- =============== END DEBUG LOG ==================
694 
695       -- Set user id, responsibility id , org id and application id context values
696       -- Bug 4063076 , Start
697       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
698                                    itemkey  => l_itemkey,
699                                    aname    => 'ORG_ID',
700                                    avalue   => mo_global.get_current_org_id());
701 
702       -- =============== START DEBUG LOG ================
703 
704          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg16',
705 
706                            ' SetItemAttrText ORG_ID --> ' || FND_PROFILE.VALUE('ORG_ID'));
707 
708       -- =============== END DEBUG LOG ==================
709 
710 
711 
712       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
713                                    itemkey  => l_itemkey,
714                                    aname    => 'USER_ID',
715                                    avalue   => FND_PROFILE.VALUE('USER_ID'));
716 
717       -- =============== START DEBUG LOG ================
718 
719          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg17',
720 
721                            ' SetItemAttrText USER_ID --> ' || FND_PROFILE.VALUE('USER_ID'));
722 
723       -- =============== END DEBUG LOG ==================
724 
725 
726       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
727                                    itemkey  => l_itemkey,
728                                    aname    => 'RESPONSIBILITY_ID',
729                                    avalue   => FND_PROFILE.VALUE('RESP_ID'));
730 
731 
732       -- =============== START DEBUG LOG ================
733 
734          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg18',
735 
736                            ' SetItemAttrText RESPONSIBILITY_ID --> ' || FND_PROFILE.VALUE('RESPONSIBILITY_ID'));
737 
738       -- =============== END DEBUG LOG ==================
739 
740       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
741                                    itemkey  => l_itemkey,
742                                    aname    => 'RESP_APPL_ID',
743                                    avalue   => FND_PROFILE.VALUE('RESP_APPL_ID'));
744 
745        -- =============== START DEBUG LOG ================
746 
747          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg19',
748 
749                            ' SetItemAttrText RESP_APPL_ID --> ' || FND_PROFILE.VALUE('RESP_APPL_ID'));
750 
751       -- =============== END DEBUG LOG ==================
752 
753       -- Bug 4063076 , End
754 
755       --Bug 5872277 Start
756       fnd_message.set_name ('IGI', 'IGI_EXP_APP_PROC_ERROR');
757 
758       l_msg := fnd_message.get;
759 
760       -- =============== START DEBUG LOG ================
761 
762          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg20',
763 
764                            ' SetItemAttrText IGI_EXP_APP_PROC_ERROR --> ' || nvl(l_msg,' NULL '));
765 
766       -- =============== END DEBUG LOG ==================
767 
768       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
769                                    itemkey  => l_itemkey,
770                                    aname    => 'APP_PROC_ERROR',
771                                    avalue   => l_msg);
772 
773       -- =============== START DEBUG LOG ================
774 
775          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg21',
776 
777                            ' SetItemAttrText APP_PROC_ERROR');
778 
779       -- =============== END DEBUG LOG ==================
780 
781       fnd_message.set_name ('IGI', 'IGI_EXP_DU_AUTH_REQ');
782       l_msg := fnd_message.get;
783       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
784                                    itemkey  => l_itemkey,
785                                    aname    => 'DU_AUTH_REQ',
786                                    avalue   => l_msg);
787 
788       fnd_message.set_name ('IGI', 'IGI_EXP_DU_HOLD');
789       l_msg := fnd_message.get;
790       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
791                                    itemkey  => l_itemkey,
792                                    aname    => 'DU_HOLD',
793                                    avalue   => l_msg);
794 
795       fnd_message.set_name ('IGI', 'IGI_EXP_DU_NO_APP_ACTION');
796       l_msg := fnd_message.get;
797       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
798                                    itemkey  => l_itemkey,
799                                    aname    => 'DU_NO_APP_ACTION',
800                                    avalue   => l_msg);
801 
802       fnd_message.set_name ('IGI', 'IGI_EXP_DU_PER_AUTH_ACTION');
803       l_msg := fnd_message.get;
804       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
805                                    itemkey  => l_itemkey,
806                                    aname    => 'DU_PER_AUTH_ACTION',
807                                    avalue   => l_msg);
808 
809       fnd_message.set_name ('IGI', 'IGI_EXP_LEGAL_NUM_ERROR');
810       l_msg := fnd_message.get;
811       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
812                                    itemkey  => l_itemkey,
813                                    aname    => 'LEGAL_NUM_ERROR',
814                                    avalue   => l_msg);
815 
816       fnd_message.set_name ('IGI', 'IGI_EXP_NTFY_DU_FAILED');
817       l_msg := fnd_message.get;
818       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
819                                    itemkey  => l_itemkey,
820                                    aname    => 'NTFY_DU_FAILED',
821                                    avalue   => l_msg);
822 
823       fnd_message.set_name ('IGI', 'IGI_EXP_NTFY_DU_REJECT');
824       l_msg := fnd_message.get;
825       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
826                                    itemkey  => l_itemkey,
827                                    aname    => 'NTFY_DU_REJECT',
828                                    avalue   => l_msg);
829 
830       fnd_message.set_name ('IGI', 'IGI_EXP_NTFY_LEGAL_DU_REJECT');
831       l_msg := fnd_message.get;
832       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
833                                    itemkey  => l_itemkey,
834                                    aname    => 'NTFY_LEGAL_DU_REJECT',
835                                    avalue   => l_msg);
836 
837       fnd_message.set_name ('IGI', 'IGI_EXP_NTFY_TU_SUCCESS');
838       l_msg := fnd_message.get;
839       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
840                                    itemkey  => l_itemkey,
841                                    aname    => 'NTFY_TU_SUCCESS',
842                                    avalue   => l_msg);
843 
844       fnd_message.set_name ('IGI', 'IGI_EXP_TU_ACTION_ASSIGNMENTS');
845       l_msg := fnd_message.get;
846       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
847                                    itemkey  => l_itemkey,
848                                    aname    => 'TU_ACTION_ASSIGNMENTS',
849                                    avalue   => l_msg);
850 
851       fnd_message.set_name ('IGI', 'IGI_EXP_TU_ACTION_ERROR');
852       l_msg := fnd_message.get;
853       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
854                                    itemkey  => l_itemkey,
855                                    aname    => 'TU_ACTION_ERROR',
856                                    avalue   => l_msg);
857 
858       fnd_message.set_name ('IGI', 'IGI_EXP_TU_AUTH_ACTION');
859       l_msg := fnd_message.get;
860       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
861                                    itemkey  => l_itemkey,
862                                    aname    => 'TU_AUTH_ACTION',
863                                    avalue   => l_msg);
864 
865       fnd_message.set_name ('IGI', 'IGI_EXP_TU_DU_AUTH_ACTION');
866       l_msg := fnd_message.get;
867       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
868                                    itemkey  => l_itemkey,
869                                    aname    => 'TU_DU_AUTH_ACTION',
870                                    avalue   => l_msg);
871 
872       fnd_message.set_name ('IGI', 'IGI_EXP_TU_DU_COMPLETE');
873       l_msg := fnd_message.get;
874       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
875                                    itemkey  => l_itemkey,
876                                    aname    => 'TU_DU_COMPLETE',
877                                    avalue   => l_msg);
878 
879       fnd_message.set_name ('IGI', 'IGI_EXP_TU_DU_HOLD');
880       l_msg := fnd_message.get;
881       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
882                                    itemkey  => l_itemkey,
883                                    aname    => 'TU_DU_HOLD',
884                                    avalue   => l_msg);
885 
886       fnd_message.set_name ('IGI', 'IGI_EXP_TU_DU_HOLD_REMOVE');
887       l_msg := fnd_message.get;
888       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
889                                    itemkey  => l_itemkey,
890                                    aname    => 'TU_DU_HOLD_REMOVE',
891                                    avalue   => l_msg);
892 
893       fnd_message.set_name ('IGI', 'IGI_EXP_TU_DU_NO_APP_ACTION');
894       l_msg := fnd_message.get;
895       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
896                                    itemkey  => l_itemkey,
897                                    aname    => 'TU_DU_NO_APP_ACTION',
898                                    avalue   => l_msg);
899 
900       fnd_message.set_name ('IGI', 'IGI_EXP_TU_DU_PER_AUTH_ACTION');
901       l_msg := fnd_message.get;
902       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
903                                    itemkey  => l_itemkey,
904                                    aname    => 'TU_DU_PER_AUTH_ACTION',
905                                    avalue   => l_msg);
906 
907       fnd_message.set_name ('IGI', 'IGI_EXP_TU_DU_REMAIN');
908       l_msg := fnd_message.get;
909       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
910                                    itemkey  => l_itemkey,
911                                    aname    => 'TU_DU_REMAIN',
912                                    avalue   => l_msg);
913 
914       fnd_message.set_name ('IGI', 'IGI_EXP_TU_DU_REMOVE');
915       l_msg := fnd_message.get;
916       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
917                                    itemkey  => l_itemkey,
918                                    aname    => 'TU_DU_REMOVE',
919                                    avalue   => l_msg);
920 
921       fnd_message.set_name ('IGI', 'IGI_EXP_TU_EMP_SETUP_ERROR');
922       l_msg := fnd_message.get;
923       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
924                                    itemkey  => l_itemkey,
925                                    aname    => 'TU_EMP_SETUP_ERROR',
926                                    avalue   => l_msg);
927 
928       fnd_message.set_name ('IGI', 'IGI_EXP_TU_LEGAL_NUM_ERROR');
929       l_msg := fnd_message.get;
930       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
931                                    itemkey  => l_itemkey,
932                                    aname    => 'TU_LEGAL_NUM_ERROR',
933                                    avalue   => l_msg);
934 
935       fnd_message.set_name ('IGI', 'IGI_EXP_TU_NO_PARENT');
936       l_msg := fnd_message.get;
937       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
938                                    itemkey  => l_itemkey,
939                                    aname    => 'TU_NO_PARENT',
940                                    avalue   => l_msg);
941 
942       fnd_message.set_name ('IGI', 'IGI_EXP_TU_NO_USER_ERROR');
943       l_msg := fnd_message.get;
944       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
945                                    itemkey  => l_itemkey,
946                                    aname    => 'TU_NO_USER_ERROR',
947                                    avalue   => l_msg);
948 
949       fnd_message.set_name ('IGI', 'IGI_EXP_TU_NOT_ASSG_POS_ERROR');
950       l_msg := fnd_message.get;
951       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
952                                    itemkey  => l_itemkey,
953                                    aname    => 'TU_NOT_ASSG_POS_ERROR',
954                                    avalue   => l_msg);
955 
956       fnd_message.set_name ('IGI', 'IGI_EXP_TU_NOT_SETUP_EMP_ERR');
957       l_msg := fnd_message.get;
958       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
959                                    itemkey  => l_itemkey,
960                                    aname    => 'TU_NOT_SETUP_EMP_ERROR',
961                                    avalue   => l_msg);
962 
963       fnd_message.set_name ('IGI', 'IGI_EXP_TU_PICK_AUTH');
964       l_msg := fnd_message.get;
965       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
966                                    itemkey  => l_itemkey,
967                                    aname    => 'TU_PICK_AUTH',
968                                    avalue   => l_msg);
969 
970       fnd_message.set_name ('IGI', 'IGI_EXP_TU_PICK_NEW_AUTH');
971       l_msg := fnd_message.get;
972       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
973                                    itemkey  => l_itemkey,
974                                    aname    => 'TU_PICK_NEW_AUTH',
975                                    avalue   => l_msg);
976 
977       fnd_message.set_name ('IGI', 'IGI_EXP_TU_PICK_NEW_AUTH_LIST');
978       l_msg := fnd_message.get;
979       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
980                                    itemkey  => l_itemkey,
981                                    aname    => 'TU_PICK_NEW_AUTH_LIST',
982                                    avalue   => l_msg);
983 
984       fnd_message.set_name ('IGI', 'IGI_EXP_TU_POS_ASSG_ERROR');
985       l_msg := fnd_message.get;
986       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
987                                    itemkey  => l_itemkey,
988                                    aname    => 'TU_POS_ASSG_ERROR',
989                                    avalue   => l_msg);
990 
991       fnd_message.set_name ('IGI', 'IGI_EXP_TU_REQ_AUTHORIZATION');
992       l_msg := fnd_message.get;
993       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
994                                    itemkey  => l_itemkey,
995                                    aname    => 'TU_REQ_AUTHORIZATION',
996                                    avalue   => l_msg);
997 
998       fnd_message.set_name ('IGI', 'IGI_EXP_TU_RET_ATTN');
999       l_msg := fnd_message.get;
1000       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
1001                                    itemkey  => l_itemkey,
1002                                    aname    => 'TU_RET_ATTN',
1003                                    avalue   => l_msg);
1004 
1005       fnd_message.set_name ('IGI', 'IGI_EXP_TU_VAL_HIER_POS_ERROR');
1006       l_msg := fnd_message.get;
1007       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
1008                                    itemkey  => l_itemkey,
1009                                    aname    => 'TU_VAL_HIER_POS_ERROR',
1010                                    avalue   => l_msg);
1011 
1012       fnd_message.set_name ('IGI', 'IGI_EXP_TU_VAL_HR_POS_PRF_ERR');
1013       l_msg := fnd_message.get;
1014       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
1015                                    itemkey  => l_itemkey,
1016                                    aname    => 'TU_VAL_HIER_POS_PROF_ERROR',
1017                                    avalue   => l_msg);
1018 
1019       fnd_message.set_name ('IGI', 'IGI_EXP_TU_VALIDATION_ERROR');
1020       l_msg := fnd_message.get;
1021       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
1022                                    itemkey  => l_itemkey,
1023                                    aname    => 'TU_VALIDATION_ERROR',
1024                                    avalue   => l_msg);
1025 
1026       fnd_message.set_name ('IGI', 'IGI_EXP_TU_VALIDATION_HR_ERR');
1027       l_msg := fnd_message.get;
1028       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
1029                                    itemkey  => l_itemkey,
1030                                    aname    => 'TU_VALIDATION_HIER_ERROR',
1031                                    avalue   => l_msg);
1032 
1033       --Bug 5872277 End
1034 
1035       -- Start the workflow process
1036       wf_engine.StartProcess( itemtype => l_itemtype,
1037                               itemkey  => l_itemkey);
1038 
1039       -- =============== START DEBUG LOG ================
1040          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg16',
1041                            ' Start process ');
1042          DEBUG_LOG_STRING (l_proc_level, 'Start_approval_workflow.Msg17',
1043                            ' **        END  START_APPROVAL_WORKFLOW     ** ');
1044       -- =============== END DEBUG LOG ==================
1045 
1046       COMMIT;
1047 
1048    EXCEPTION
1049       WHEN OTHERS THEN
1050            -- =============== START DEBUG LOG ================
1051               DEBUG_LOG_UNEXP_ERROR ('Start_approval_workflow.Unexp1','DEFAULT');
1052            -- =============== END DEBUG LOG ==================
1053 
1054            wf_core.context('IGI_EXP_APPROVAL_PKG','start_approval_workflow'
1055                            ,l_itemtype, l_itemkey);
1056            RAISE;
1057 
1058    END start_approval_workflow;
1059 
1060 
1061 
1062    -- *************************************************************************
1063    --    IS_TU_TRANS_EMPLOYEE
1064    -- *************************************************************************
1065 
1066    PROCEDURE is_tu_trans_employee ( itemtype IN  VARCHAR2,
1067                                     itemkey  IN  VARCHAR2,
1068                                     actid    IN  NUMBER,
1069                                     funcmode IN  VARCHAR2,
1070                                     result   OUT NOCOPY VARCHAR2) IS
1071 
1072       l_transmitter_fnd_id       NUMBER(15);
1073       l_transmitter_emp_id       NUMBER(15);
1074       l_trans_fnd_name           VARCHAR2(240);
1075       l_transmitter_emp_name     VARCHAR2(240);
1076       l_display_name             VARCHAR2(240);
1077       l_validation_error         VARCHAR2(240);
1078 
1079    BEGIN
1080 
1081      -- =============== START DEBUG LOG ================
1082          DEBUG_LOG_STRING (l_proc_level, 'Is_tu_trans_employee.Msg1',
1083                            ' ** BEGIN IS_TU_TRANS_EMPLOYEE ** ');
1084      -- =============== END DEBUG LOG ==================
1085 
1086       IF (funcmode = 'RUN') THEN
1087 
1088          -- Get the fnd user id of the TU transmitter
1089          l_transmitter_fnd_id
1090             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
1091                                             itemkey  => itemkey,
1092                                             aname    => 'TRANSMITTER_FND_ID');
1093 
1094          -- =============== START DEBUG LOG ================
1095             DEBUG_LOG_STRING (l_proc_level, 'Is_tu_trans_employee.Msg2',
1096                               ' GetItemAttrNumber TRANSMITTER_FND_ID --> ' || l_transmitter_fnd_id);
1097          -- =============== END DEBUG LOG ==================
1098 
1099          -- Get the employee id of the transmitter
1100          SELECT employee_id
1101          INTO   l_transmitter_emp_id
1102          FROM   fnd_user
1103          WHERE  user_id = l_transmitter_fnd_id;
1104 
1105          -- =============== START DEBUG LOG ================
1106             DEBUG_LOG_STRING (l_proc_level, 'Is_tu_trans_employee.Msg3',
1107                               ' Get the employee id of the transmitter - '
1108                               || ' l_transmitter_emp_id --> ' || l_transmitter_emp_id);
1109          -- =============== END DEBUG LOG ==================
1110 
1111          IF (l_transmitter_emp_id is null) THEN
1112 
1113             -- TU Transmitter is not an employee, so set result to 'No'
1114             result := 'COMPLETE:N';
1115 
1116             -- =============== START DEBUG LOG ================
1117                DEBUG_LOG_STRING (l_proc_level, 'Is_tu_trans_employee.Msg4',
1118                                  ' l_transmitter_emp_id is null - result --> ' || result);
1119             -- =============== END DEBUG LOG ==================
1120 
1121 
1122          ELSE  -- TU Transmitter is an employee
1123 
1124             -- Set the transmitter_emp_id attribute
1125             wf_engine.SetItemAttrNumber( itemtype => itemtype,
1126                                          itemkey  => itemkey,
1127                                          aname    => 'TRANSMITTER_EMP_ID',
1128                                          avalue   => l_transmitter_emp_id);
1129 
1130             -- =============== START DEBUG LOG ================
1131                DEBUG_LOG_STRING (l_proc_level, 'Is_tu_trans_employee.Msg5',
1132                                  ' SetItemAttrNumber TRANSMITTER_EMP_ID --> '|| l_transmitter_emp_id);
1133             -- =============== END DEBUG LOG ==================
1134 
1135             -- Get the employee name of the transmitter
1136             wf_directory.GetUserName(p_orig_system    => 'PER',
1137                                      p_orig_system_id => l_transmitter_emp_id,
1138                                      p_name           => l_transmitter_emp_name,
1139                                      p_display_name   => l_display_name );
1140 
1141             -- =============== START DEBUG LOG ================
1142                DEBUG_LOG_STRING (l_proc_level, 'Is_tu_trans_employee.Msg6',
1143                                  ' GetUserName --> l_transmitter_emp_name -> ' || l_transmitter_emp_name
1144                                  ||' l_display_name -> ' || l_display_name );
1145             -- =============== END DEBUG LOG ==================
1146 
1147             -- Set the transmitter_emp_name attribute
1148             wf_engine.SetItemAttrText  ( itemtype => itemtype,
1149                                          itemkey  => itemkey,
1150                                          aname    => 'TRANSMITTER_EMP_NAME',
1151                                          avalue   => l_transmitter_emp_name);
1152 
1153             -- Note: No need to set a display name attribute since workflow 2.6 automatically
1154             -- retrieves the display name for messages
1155 
1156             -- =============== START DEBUG LOG ================
1157                DEBUG_LOG_STRING (l_proc_level, 'Is_tu_trans_employee.Msg7',
1158                                  ' SetItemAttrText TRANSMITTER_EMP_NAME --> ' || l_transmitter_emp_name);
1159             -- =============== END DEBUG LOG ==================
1160 
1161             -- TU Transmitter is an employee, so set result to 'Yes'
1162             result := 'COMPLETE:Y';
1163 
1164             -- =============== START DEBUG LOG ================
1165                DEBUG_LOG_STRING (l_proc_level, 'Is_tu_trans_employee.Msg8',
1166                                  ' result --> ' || result);
1167             -- =============== END DEBUG LOG ==================
1168 
1169          END IF;
1170 
1171       END IF;
1172 
1173       IF (funcmode <> 'RUN') THEN
1174          result := 'COMPLETE';
1175          -- =============== START DEBUG LOG ================
1176             DEBUG_LOG_STRING (l_proc_level, 'Is_tu_trans_employee.Msg9',
1177                               ' funcmode <> RUN - result --> ' || result);
1178          -- =============== END DEBUG LOG ==================
1179 
1180          RETURN;
1181       END IF;
1182 
1183       -- =============== START DEBUG LOG ================
1184          DEBUG_LOG_STRING (l_proc_level, 'Is_tu_trans_employee.Msg10',
1185                            ' ** END IS_TU_TRANS_EMPLOYEE ** ');
1186       -- =============== END DEBUG LOG ==================
1187 
1188    EXCEPTION
1189       WHEN OTHERS THEN
1190            -- =============== START DEBUG LOG ================
1191               DEBUG_LOG_UNEXP_ERROR ('Start_approval_workflow.Unexp1','DEFAULT');
1192            -- =============== END DEBUG LOG ==================
1193 
1194            wf_core.context('IGI_EXP_APPROVAL_PKG','is_tu_trans_employee',itemtype,itemkey,
1195                            to_char(actid),funcmode);
1196            RAISE;
1197    END is_tu_trans_employee;
1198 
1199 
1200 
1201    -- *************************************************************************
1202    --    EMP_HAS_POSITION
1203    -- *************************************************************************
1204 
1205    PROCEDURE emp_has_position     ( itemtype IN  VARCHAR2,
1206                                     itemkey  IN  VARCHAR2,
1207                                     actid    IN  NUMBER,
1208                                     funcmode IN  VARCHAR2,
1209                                     result   OUT NOCOPY VARCHAR2) IS
1210 
1211       CURSOR c_get_position(p_emp_id per_employees_current_x.employee_id%TYPE)
1212       IS
1213          SELECT hap.position_id,
1214                 hap.name,
1215                 hap.business_group_id,
1216                 hap.organization_id
1217          FROM   hr_all_positions_f      hap,
1218                 per_all_assignments_f   paa,
1219                 per_employees_current_x pec
1220          WHERE  pec.employee_id = p_emp_id
1221          AND    NVL(pec.inactive_date,SYSDATE) >= SYSDATE
1222          AND    pec.business_group_id = paa.business_group_id
1223          AND    pec.assignment_id = paa.assignment_id
1224          AND    pec.organization_id = paa.organization_id
1225          AND    paa.assignment_type = 'E'
1226          AND    paa.effective_start_date <= SYSDATE
1227          AND    paa.effective_end_date >= SYSDATE
1228          AND    paa.business_group_id = hap.business_group_id
1229          AND    paa.position_id IS NOT NULL
1230          AND    paa.position_id = hap.position_id
1231          AND    paa.organization_id = hap.organization_id
1232          AND    hap.date_effective <= SYSDATE
1233          AND    NVL(hap.date_end, SYSDATE) >= SYSDATE
1234          AND    NVL(UPPER(hap.status), 'VALID') NOT IN ('INVALID');
1235 
1236       l_position_id        hr_all_positions_f.position_id%TYPE;
1237       l_position_name      hr_all_positions_f.name%TYPE;
1238       l_business_group_id  hr_all_positions_f.business_group_id%TYPE;
1239       l_organization_id    hr_all_positions_f.organization_id%TYPE;
1240       l_transmitter_emp_id per_employees_current_x.employee_id%TYPE;
1241 
1242    BEGIN
1243 
1244       -- =============== START DEBUG LOG ================
1245          DEBUG_LOG_STRING (l_proc_level, 'Emp_has_position.Msg1',
1246                            ' ** BEGIN EMP_HAS_POSITION ** ');
1247       -- =============== END DEBUG LOG ==================
1248 
1249       IF (funcmode = 'RUN') THEN
1250 
1251          -- Get the employee id for the TU Transmitter
1252          l_transmitter_emp_id
1253             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
1254                                             itemkey  => itemkey,
1255                                             aname    => 'TRANSMITTER_EMP_ID');
1256 
1257          -- =============== START DEBUG LOG ================
1258             DEBUG_LOG_STRING (l_proc_level, 'Emp_has_position.Msg2',
1259                               ' GetItemAttrNumber TRANSMITTER_EMP_ID --> '|| l_transmitter_emp_id);
1260          -- =============== END DEBUG LOG ==================
1261 
1262          OPEN c_get_position(l_transmitter_emp_id);
1263          FETCH c_get_position INTO l_position_id
1264                                   ,l_position_name
1265                                   ,l_business_group_id
1266                                   ,l_organization_id;
1267 
1268          -- =============== START DEBUG LOG ================
1269             DEBUG_LOG_STRING (l_proc_level, 'Emp_has_position.Msg3',
1270                               ' Getting position : l_position_id --> ' || l_position_id ||
1271                               ' l_position_name --> ' || l_position_name ||
1272                               ' l_business_group_id --> ' || l_business_group_id ||
1273                               ' l_organization_id --> ' || l_organization_id);
1274          -- =============== END DEBUG LOG ==================
1275 
1276          IF (c_get_position%NOTFOUND) THEN
1277             -- No rows returned so the employee is not assigned to a position
1278             -- TU Transmitter is an employee, but is not assigned to a position
1279             -- so set result to 'No'
1280             result := 'COMPLETE:N';
1281 
1282             -- =============== START DEBUG LOG ================
1283                DEBUG_LOG_STRING (l_proc_level, 'Emp_has_position.Msg4',
1284                                  ' result --> ' || result);
1285             -- =============== END DEBUG LOG ==================
1286 
1287          ELSE  -- TU Transmitter is an employee, and has been assigned a position
1288 
1289             -- Set the transmitter_position_id attribute
1290             wf_engine.SetItemAttrNumber( itemtype => itemtype,
1291                                          itemkey  => itemkey,
1292                                          aname    => 'TRANSMITTER_POSITION_ID',
1293                                          avalue   => l_position_id);
1294 
1295             -- =============== START DEBUG LOG ================
1296                DEBUG_LOG_STRING (l_proc_level, 'Emp_has_position.Msg5',
1297                                  ' SetItemAttrNumber TRANSMITTER_POSITION_ID --> '|| l_position_id);
1298             -- =============== END DEBUG LOG ==================
1299 
1300             -- Set the business_group_id attribute
1301             wf_engine.SetItemAttrNumber( itemtype => itemtype,
1302                                          itemkey  => itemkey,
1303                                          aname    => 'BUSINESS_GROUP_ID',
1304                                          avalue   => l_business_group_id);
1305 
1306             -- =============== START DEBUG LOG ================
1307                DEBUG_LOG_STRING (l_proc_level, 'Emp_has_position.Msg6',
1308                                  ' SetItemAttrNumber BUSINESS_GROUP_ID --> ' ||l_business_group_id );
1309             -- =============== END DEBUG LOG ==================
1310 
1311             -- Set the organization_id attribute
1312             wf_engine.SetItemAttrNumber( itemtype => itemtype,
1313                                          itemkey  => itemkey,
1314                                          aname    => 'ORGANIZATION_ID',
1315                                          avalue   => l_organization_id);
1316 
1317             -- =============== START DEBUG LOG ================
1318                DEBUG_LOG_STRING (l_proc_level, 'Emp_has_position.Msg7',
1319                                  ' SetItemAttrNumber ORGANIZATION_ID --> ' || l_organization_id);
1320             -- =============== END DEBUG LOG ==================
1321 
1322             -- Set the current_position_id attribute to the position id of the transmitter
1323             wf_engine.SetItemAttrNumber( itemtype => itemtype,
1324                                          itemkey  => itemkey,
1325                                          aname    => 'CURRENT_POSITION_ID',
1326                                          avalue   => l_position_id);
1327 
1328             -- =============== START DEBUG LOG ================
1329                DEBUG_LOG_STRING (l_proc_level, 'Emp_has_position.Msg8',
1330                                  ' SetItemAttrNumber CURRENT_POSITION_ID --> '|| l_position_id);
1331             -- =============== END DEBUG LOG ==================
1332 
1333             -- Set the current_position_name attribute to the position name of the transmitter
1334             wf_engine.SetItemAttrText  ( itemtype => itemtype,
1335                                          itemkey  => itemkey,
1336                                          aname    => 'CURRENT_POSITION_NAME',
1337                                          avalue   => l_position_name);
1338 
1339             -- =============== START DEBUG LOG ================
1340                DEBUG_LOG_STRING (l_proc_level, 'Emp_has_position.Msg9',
1341                                  ' SetItemAttrText CURRENT_POSITION_NAME --> '||l_position_name );
1342             -- =============== END DEBUG LOG ==================
1343 
1344             -- TU Transmitter is an employee, and is assigned to a position
1345             -- so set result to 'Yes'
1346             result := 'COMPLETE:Y';
1347 
1348             -- =============== START DEBUG LOG ================
1349                DEBUG_LOG_STRING (l_proc_level, 'Emp_has_position.Msg10',
1350                                  ' result --> ' || result);
1351             -- =============== END DEBUG LOG ==================
1352 
1353          END IF;
1354 
1355          IF (c_get_position%ISOPEN) THEN
1356             close c_get_position;
1357          END IF;
1358 
1359       END IF;
1360 
1361       IF (funcmode <> 'RUN') THEN
1362          result := 'COMPLETE';
1363          -- =============== START DEBUG LOG ================
1364             DEBUG_LOG_STRING (l_proc_level, 'Emp_has_position.Msg11',
1365                               ' funcmode <> RUN - result --> ' || result);
1366          -- =============== END DEBUG LOG ==================
1367 
1368          return;
1369       END IF;
1370 
1371       -- =============== START DEBUG LOG ================
1372          DEBUG_LOG_STRING (l_proc_level, 'Emp_has_position.Msg12',
1373                            ' ** END EMP_HAS_POSITION ** ');
1374       -- =============== END DEBUG LOG ==================
1375 
1376    EXCEPTION
1377       WHEN OTHERS THEN
1378            -- =============== START DEBUG LOG ================
1379               DEBUG_LOG_UNEXP_ERROR ('Emp_has_position.Unexp1','DEFAULT');
1380            -- =============== END DEBUG LOG ==================
1381 
1382            wf_core.context('IGI_EXP_APPROVAL_PKG','emp_has_position',itemtype,itemkey,
1383                            to_char(actid),funcmode);
1384            RAISE;
1385 
1386    END emp_has_position;
1387 
1388 
1389 
1390    -- *************************************************************************
1391    --    POSITION_IN_HIERARCHY
1392    -- *************************************************************************
1393 
1394    PROCEDURE position_in_hierarchy( itemtype IN  VARCHAR2,
1395                                     itemkey  IN  VARCHAR2,
1396                                     actid    IN  NUMBER,
1397                                     funcmode IN  VARCHAR2,
1398                                     result   OUT NOCOPY VARCHAR2) IS
1399 
1400       l_tu_id                    igi_exp_tus.tu_id%TYPE;
1401       l_position_id              per_all_positions.position_id%TYPE;
1402       l_apprv_profile_id         igi_exp_tus.apprv_profile_id%TYPE;
1403       l_pos_hierarchy_id         igi_exp_apprv_profiles.pos_hierarchy_id%TYPE;
1404       l_legal_num_pos_id         igi_exp_apprv_profiles.legal_num_pos_id%TYPE;
1405       l_final_apprv_pos_id       igi_exp_apprv_profiles.final_apprv_pos_id%TYPE;
1406       l_business_group_id        hr_all_positions_f.business_group_id%TYPE;
1407       l_pos_structure_version_id per_pos_structure_versions.pos_structure_version_id%TYPE;
1408       l_pos_structure_element_id per_pos_structure_elements.pos_structure_element_id%TYPE;
1409 
1410       --
1411       -- Find the current version of the position hierarchy
1412       --
1413       CURSOR c_get_pos_hier_ver(p_hierarchy_id per_pos_structure_versions.position_structure_id%TYPE,
1414                                 p_business_group_id hr_all_positions_f.business_group_id%TYPE)
1415       IS
1416          SELECT pos_structure_version_id
1417          FROM   per_pos_structure_versions
1418          WHERE  position_structure_id = p_hierarchy_id
1419          AND    sysdate BETWEEN date_from AND NVL(date_to, sysdate)
1420          AND    business_group_id = p_business_group_id
1421          AND    version_number =
1422            (SELECT MAX(version_number)
1423             FROM   per_pos_structure_versions
1424             WHERE  position_structure_id = p_hierarchy_id
1425             AND    sysdate BETWEEN date_from AND NVL(date_to,sysdate)
1426             AND    business_group_id = p_business_group_id);
1427 
1428       --
1429       -- Find out NOCOPY if the position exists as a subordinate position in the current
1430       -- version of the position hierarchy
1431       --
1432       CURSOR c_is_pos_subord(p_pos_structure_ver_id per_pos_structure_elements.pos_structure_version_id%TYPE
1433                             ,p_business_group_id hr_all_positions_f.business_group_id%TYPE
1434                             ,p_position_id per_all_positions.position_id%TYPE)
1435       IS
1436          SELECT pos_structure_element_id
1437          FROM   per_pos_structure_elements
1438          WHERE  pos_structure_version_id = p_pos_structure_ver_id
1439          AND    business_group_id = p_business_group_id
1440          AND    subordinate_position_id = p_position_id;
1441 
1442       --
1443       -- Find out NOCOPY if the position exists as a parent position in the current
1444       -- version of the position hierarchy
1445       --
1446       CURSOR c_is_pos_parent(p_pos_structure_ver_id per_pos_structure_elements.pos_structure_version_id%TYPE
1447                             ,p_business_group_id hr_all_positions_f.business_group_id%TYPE
1448                             ,p_position_id per_all_positions.position_id%TYPE)
1449       IS
1450          SELECT pos_structure_element_id
1451          FROM   per_pos_structure_elements
1452          WHERE  pos_structure_version_id = p_pos_structure_ver_id
1453          AND    business_group_id = p_business_group_id
1454          AND    parent_position_id = p_position_id;
1455 
1456       e_pos_hier_ver_not_found EXCEPTION;
1457 
1458    BEGIN
1459 
1460       -- =============== START DEBUG LOG ================
1461          DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg1',
1462                            ' ** BEGIN POSITION_IN_HIERARCHY ** ');
1463       -- =============== END DEBUG LOG ==================
1464 
1465       IF (funcmode = 'RUN') THEN
1466 
1467          -- =============== START DEBUG LOG ================
1468             DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg2',
1469                               ' funcmode = RUN ');
1470          -- =============== END DEBUG LOG ==================
1471 
1472          -- Need to check that the transmitter's position exists in the position
1473          -- hierarchy attached to the approval profile chosen for the TU.
1474 
1475          -- First get the TU id
1476          l_tu_id
1477             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
1478                                             itemkey  => itemkey,
1479                                             aname    => 'TU_ID');
1480 
1481          -- =============== START DEBUG LOG ================
1482             DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg3',
1483                               ' GetItemAttrNumber TU_ID --> '|| l_tu_id);
1484          -- =============== END DEBUG LOG ==================
1485 
1486          -- Fetch the position id of the transmitter
1487          l_position_id
1488             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
1489                                             itemkey  => itemkey,
1490                                             aname    => 'TRANSMITTER_POSITION_ID');
1491 
1492          -- =============== START DEBUG LOG ================
1493             DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg4',
1494                               ' GetItemAttrNumber TRANSMITTER_POSITION_ID --> '|| l_position_id);
1495          -- =============== END DEBUG LOG ==================
1496 
1497          -- Now get the approval profile id chosen for the TU.
1498          SELECT apprv_profile_id
1499          INTO   l_apprv_profile_id
1500          FROM   igi_exp_tus
1501          WHERE  tu_id = l_tu_id;
1502 
1503          -- =============== START DEBUG LOG ================
1504             DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg5',
1505                               ' l_apprv_profile_id --> ' || l_apprv_profile_id);
1506          -- =============== END DEBUG LOG ==================
1507 
1508          -- Fetch the approval profile information
1509          -- i.e. the HR position hierarchy, the legal numbering position
1510          -- and the final approver position
1511          SELECT pos_hierarchy_id
1512                ,legal_num_pos_id
1513                ,final_apprv_pos_id
1514          INTO   l_pos_hierarchy_id
1515                ,l_legal_num_pos_id
1516                ,l_final_apprv_pos_id
1517          FROM   igi_exp_apprv_profiles
1518          WHERE  apprv_profile_id = l_apprv_profile_id;
1519 
1520          -- =============== START DEBUG LOG ================
1521             DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg6',
1522                               ' l_pos_hierarchy_id --> ' || l_pos_hierarchy_id
1523                             ||' l_legal_num_pos_id --> ' || l_legal_num_pos_id
1524                             ||' l_final_apprv_pos_id --> ' || l_final_apprv_pos_id);
1525          -- =============== END DEBUG LOG ==================
1526 
1527          -- Set the corresponding workflow attributes with this information
1528 
1529          -- Set the pos_structure_id attribute
1530          wf_engine.SetItemAttrNumber( itemtype => itemtype,
1531                                       itemkey  => itemkey,
1532                                       aname    => 'POS_STRUCTURE_ID',
1533                                       avalue   => l_pos_hierarchy_id);
1534 
1535          -- =============== START DEBUG LOG ================
1536             DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg7',
1537                               ' SetItemAttrNumber POS_STRUCTURE_ID --> '|| l_pos_hierarchy_id);
1538          -- =============== END DEBUG LOG ==================
1539 
1540          -- Set the legal_num_pos_id attribute
1541          wf_engine.SetItemAttrNumber( itemtype => itemtype,
1542                                       itemkey  => itemkey,
1543                                       aname    => 'LEGAL_NUM_POS_ID',
1544                                       avalue   => l_legal_num_pos_id);
1545 
1546          -- =============== START DEBUG LOG ================
1547             DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg8',
1548                               ' SetItemAttrNumber LEGAL_NUM_POS_ID --> '|| l_legal_num_pos_id);
1549          -- =============== END DEBUG LOG ==================
1550 
1551          -- Set the final_apprv_pos_id attribute
1552          wf_engine.SetItemAttrNumber( itemtype => itemtype,
1553                                       itemkey  => itemkey,
1554                                       aname    => 'FINAL_APPRV_POS_ID',
1555                                       avalue   => l_final_apprv_pos_id);
1556 
1557          -- =============== START DEBUG LOG ================
1558             DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg9',
1559                               'SetItemAttrNumber FINAL_APPRV_POS_ID --> ' || l_final_apprv_pos_id );
1560          -- =============== END DEBUG LOG ==================
1561 
1562          -- Now need to find the current version of the position hierarchy.
1563 
1564          -- Get the business group id
1565          l_business_group_id
1566             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
1567                                             itemkey  => itemkey,
1568                                             aname    => 'BUSINESS_GROUP_ID');
1569 
1570          -- =============== START DEBUG LOG ================
1571             DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg10',
1572                               ' GetItemAttrNumber BUSINESS_GROUP_ID --> ' ||l_business_group_id );
1573             DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg11',
1574                               ' calling c_get_pos_hier_ver with '
1575                               ||' l_pos_hierarchy_id --> ' || l_pos_hierarchy_id
1576                               ||' l_business_group_id --> ' || l_business_group_id);
1577          -- =============== END DEBUG LOG ==================
1578 
1579          OPEN c_get_pos_hier_ver(l_pos_hierarchy_id
1580                                 ,l_business_group_id);
1581          FETCH c_get_pos_hier_ver INTO l_pos_structure_version_id;
1582 
1583          -- =============== START DEBUG LOG ================
1584             DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg12',
1585                               ' l_pos_structure_version_id --> '|| l_pos_structure_version_id);
1586          -- =============== END DEBUG LOG ==================
1587 
1588          IF (c_get_pos_hier_ver%NOTFOUND) THEN
1589 
1590             -- =============== START DEBUG LOG ================
1591                DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg13',
1592                                  ' c_get_pos_hier_ver%NOTFOUND raise e_pos_hier_ver_not_found ');
1593             -- =============== END DEBUG LOG ==================
1594             RAISE e_pos_hier_ver_not_found;
1595 
1596          END IF;
1597 
1598          CLOSE c_get_pos_hier_ver;
1599 
1600          -- Set the pos_structure_version_id attribute
1601          wf_engine.SetItemAttrNumber( itemtype => itemtype,
1602                                       itemkey  => itemkey,
1603                                       aname    => 'POS_STRUCTURE_VERSION_ID',
1604                                       avalue   => l_pos_structure_version_id);
1605 
1606 
1607          -- =============== START DEBUG LOG ================
1608             DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg14',
1609                               ' SetItemAttrNumber POS_STRUCTURE_VERSION_ID --> ' ||l_pos_structure_version_id);
1610          -- =============== END DEBUG LOG ==================
1611 
1612          -- Now need to find if the transmitter's position exists in the
1613          -- current version of the hierarchy
1614 
1615           -- =============== START DEBUG LOG ================
1616             DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg15',
1617                               ' calling c_is_pos_subord cursor with '
1618                             ||' l_pos_structure_version_id --> ' || l_pos_structure_version_id
1619                             ||' l_business_group_id --> ' || l_business_group_id
1620                             ||' l_position_id --> ' || l_position_id);
1621          -- =============== END DEBUG LOG ==================
1622 
1623         -- Find out NOCOPY if the position is a subordinate position in the current version
1624          OPEN c_is_pos_subord(l_pos_structure_version_id
1625                              ,l_business_group_id
1626                              ,l_position_id);
1627          FETCH c_is_pos_subord INTO l_pos_structure_element_id;
1628 
1629          -- =============== START DEBUG LOG ================
1630             DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg16',
1631                               ' l_pos_structure_element_id --> ' || l_pos_structure_element_id);
1632          -- =============== END DEBUG LOG ==================
1633 
1634          IF (c_is_pos_subord%NOTFOUND) THEN
1635 
1636             CLOSE c_is_pos_subord;
1637 
1638             -- =============== START DEBUG LOG ================
1639                DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg17',
1640                                  ' c_is_pos_subord%NOTFOUND - TRUE ');
1641             -- =============== END DEBUG LOG ==================
1642 
1643             -- It is possible that the transmitter's position is the top position
1644             -- in the HR hierarchy, in which case it would not appear in the
1645             -- subordinate_position_id column.
1646             -- So check if the position appears in the parent_position_id column
1647             -- for the hierarchy
1648 
1649             -- =============== START DEBUG LOG ================
1650               DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg18',
1651                                 ' calling c_is_pos_parent cursor with ' ||
1652                                 ' l_pos_structure_version_id --> ' || l_pos_structure_version_id ||
1653                                 ' l_business_group_id --> ' || l_business_group_id ||
1654                                 ' l_position_id --> ' || l_position_id);
1655             -- =============== END DEBUG LOG ==================
1656 
1657             OPEN c_is_pos_parent(l_pos_structure_version_id
1658                                 ,l_business_group_id
1659                                 ,l_position_id);
1660             FETCH c_is_pos_parent INTO l_pos_structure_element_id;
1661 
1662             -- =============== START DEBUG LOG ================
1663                DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg19',
1664                                  ' l_pos_structure_element_id --> ' || l_pos_structure_element_id);
1665             -- =============== END DEBUG LOG ==================
1666 
1667             IF (c_is_pos_parent%NOTFOUND) THEN
1668                CLOSE c_is_pos_parent;
1669 
1670                -- The position does not exist in the hierarchy.
1671                -- So set result to 'No' and exit
1672                --
1673                result := 'COMPLETE:N';
1674 
1675                -- =============== START DEBUG LOG ================
1676                   DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg20',
1677                                     ' c_is_pos_parent%NOTFOUND - result --> ' || result);
1678                -- =============== END DEBUG LOG ==================
1679 
1680                return;
1681             END IF;
1682             CLOSE c_is_pos_parent;
1683 
1684             -- The position is the top position in the hierarchy
1685             -- so continue
1686 
1687          ELSE
1688 
1689             -- =============== START DEBUG LOG ================
1690                DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg21',
1691                                  ' In the else part, CLOSE c_is_pos_subord ');
1692             -- =============== END DEBUG LOG ==================
1693 
1694             CLOSE c_is_pos_subord;
1695 
1696       END IF;
1697 
1698          -- The position exists in the hierarchy.
1699          -- Set the pos_structure_element_id for reference purposes.
1700 
1701          -- Set the pos_structure_element_id attribute
1702          wf_engine.SetItemAttrNumber( itemtype => itemtype,
1703                                       itemkey  => itemkey,
1704                                       aname    => 'POS_STRUCTURE_ELEMENT_ID',
1705                                       avalue   => l_pos_structure_element_id);
1706 
1707          -- =============== START DEBUG LOG ================
1708             DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg22',
1709                               ' SetItemAttrNumber  POS_STRUCTURE_ELEMENT_ID --> ' || l_pos_structure_element_id);
1710          -- =============== END DEBUG LOG ==================
1711 
1712          -- Set result to 'Yes'
1713          result := 'COMPLETE:Y';
1714 
1715          -- =============== START DEBUG LOG ================
1716             DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg23',
1717                               ' result --> '|| result);
1718          -- =============== END DEBUG LOG ==================
1719 
1720       END IF;
1721 
1722       IF (funcmode <> 'RUN') THEN
1723          result := 'COMPLETE';
1724          -- =============== START DEBUG LOG ================
1725             DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg24',
1726                               ' funcmode <> RUN - result --> '|| result);
1727          -- =============== END DEBUG LOG ==================
1728          return;
1729       END IF;
1730 
1731       -- =============== START DEBUG LOG ================
1732          DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg25',
1733                            ' ** END POSITION_IN_HIERARCHY ** ');
1734       -- =============== END DEBUG LOG ==================
1735 
1736    EXCEPTION
1737       WHEN e_pos_hier_ver_not_found THEN
1738            -- =============== START DEBUG LOG ================
1739               DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg26',
1740                                 ' Inside Exception e_pos_hier_ver_not_found ');
1741            -- =============== END DEBUG LOG ==================
1742            wf_core.context('IGI_EXP_APPROVAL_PKG','position_in_hierarchy',itemtype,itemkey,
1743                            to_char(actid),funcmode,'Position hierarchy version not found');
1744            IF (c_get_pos_hier_ver%ISOPEN) THEN
1745               CLOSE c_get_pos_hier_ver;
1746            END IF;
1747            raise;
1748 
1749       WHEN OTHERS THEN
1750            -- =============== START DEBUG LOG ================
1751               DEBUG_LOG_UNEXP_ERROR ('Position_in_hierarchy.Unexp1','DEFAULT');
1752            -- =============== END DEBUG LOG ==================
1753            wf_core.context('IGI_EXP_APPROVAL_PKG','position_in_hierarchy',itemtype,itemkey,
1754                            to_char(actid),funcmode);
1755            raise;
1756 
1757    END position_in_hierarchy;
1758 
1759 
1760    -- *************************************************************************
1761    --    IS_POSITION_GT_FINAL_POS
1762    -- *************************************************************************
1763 
1764    PROCEDURE is_position_gt_final_pos ( itemtype IN  VARCHAR2,
1765                                         itemkey  IN  VARCHAR2,
1766                                         actid    IN  NUMBER,
1767                                         funcmode IN  VARCHAR2,
1768                                         result   OUT NOCOPY VARCHAR2) IS
1769 
1770      CURSOR c_get_parent_position(p_position_id per_all_positions.position_id%TYPE
1771                                  ,p_pos_structure_version_id per_pos_structure_versions.pos_structure_version_id%TYPE
1772                                  ,p_business_group_id hr_all_positions_f.business_group_id%TYPE)
1773      IS
1774         SELECT parent_position_id
1775         FROM   per_pos_structure_elements
1776         WHERE  pos_structure_version_id = p_pos_structure_version_id
1777         AND    business_group_id = p_business_group_id
1778         AND    subordinate_position_id = p_position_id;
1779 
1780       l_position_id              per_all_positions.position_id%TYPE;
1781       l_transmitter_position_id  per_all_positions.position_id%TYPE;
1782       l_parent_pos_id            per_all_positions.position_id%TYPE;
1783       l_final_apprv_pos_id       igi_exp_apprv_profiles.final_apprv_pos_id%TYPE;
1784       l_business_group_id        hr_all_positions_f.business_group_id%TYPE;
1785       l_pos_structure_version_id per_pos_structure_versions.pos_structure_version_id%TYPE;
1786       l_final_apprv_found        VARCHAR2(1) := 'N';
1787 
1788    BEGIN
1789 
1790       -- =============== START DEBUG LOG ================
1791          DEBUG_LOG_STRING (l_proc_level, 'Is_position_gt_final_pos.Msg1',
1792                            ' ** BEGIN IS_POSITION_GT_FINAL_POS ** ');
1793       -- =============== END DEBUG LOG ==================
1794 
1795       IF (funcmode = 'RUN') THEN
1796 
1797 
1798          -- =============== START DEBUG LOG ================
1799             DEBUG_LOG_STRING (l_proc_level, 'Is_position_gt_final_pos.Msg2',
1800                               ' funcmode = RUN ');
1801          -- =============== END DEBUG LOG ==================
1802 
1803          -- Want to find out NOCOPY if the TU transmitter's position is higher in the
1804          -- hierarchy than the final approver position set up for the approval
1805          -- profile. If this is the case, we should exit out NOCOPY of the approval workflow
1806          -- If the TU transmitter's position IS the final position
1807          -- it is ok to continue with the workflow approval.
1808 
1809          -- Get the values of the attributes needed:
1810          -- Position structure version, transmitter's position, final approver position
1811          -- and business group.
1812 
1813          l_pos_structure_version_id
1814             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
1815                                             itemkey  => itemkey,
1816                                             aname    => 'POS_STRUCTURE_VERSION_ID');
1817 
1818          -- =============== START DEBUG LOG ================
1819             DEBUG_LOG_STRING (l_proc_level, 'Is_position_gt_final_pos.Msg3',
1820                               ' ** BEGIN IS_POSITION_GT_FINAL_POS ** ');
1821          -- =============== END DEBUG LOG ==================
1822 
1823          l_business_group_id
1824             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
1825                                             itemkey  => itemkey,
1826                                             aname    => 'BUSINESS_GROUP_ID');
1827 
1828          -- =============== START DEBUG LOG ================
1829             DEBUG_LOG_STRING (l_proc_level, 'Is_position_gt_final_pos.Msg4',
1830                               ' GetItemAttrNumber BUSINESS_GROUP_ID --> '|| l_business_group_id);
1831          -- =============== END DEBUG LOG ==================
1832 
1833          l_transmitter_position_id
1834             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
1835                                             itemkey  => itemkey,
1836                                             aname    => 'TRANSMITTER_POSITION_ID');
1837 
1838          -- =============== START DEBUG LOG ================
1839             DEBUG_LOG_STRING (l_proc_level, 'Is_position_gt_final_pos.Msg5',
1840                               ' GetItemAttrNumber TRANSMITTER_POSITION_ID --> ' || l_transmitter_position_id);
1841          -- =============== END DEBUG LOG ==================
1842 
1843          l_final_apprv_pos_id
1844             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
1845                                             itemkey  => itemkey,
1846                                             aname    => 'FINAL_APPRV_POS_ID');
1847 
1848          -- =============== START DEBUG LOG ================
1849             DEBUG_LOG_STRING (l_proc_level, 'Is_position_gt_final_pos.Msg6',
1850                               ' GetItemAttrNumber FINAL_APPRV_POS_ID --> ' || l_final_apprv_pos_id);
1851          -- =============== END DEBUG LOG ==================
1852 
1853          -- Starting from the transmitter's position, loop through the hierarchy
1854          -- until either the final approver position (as defined in the EXP approval
1855          -- profile) is found or the top position in the hierarchy is reached.
1856 
1857          -- Check if the transmitter's position IS the final approver position first
1858          IF (l_transmitter_position_id = l_final_apprv_pos_id) THEN
1859 
1860             l_final_apprv_found := 'Y';
1861 
1862             -- =============== START DEBUG LOG ================
1863                DEBUG_LOG_STRING (l_proc_level, 'Is_position_gt_final_pos.Msg7',
1864                                  ' l_transmitter_position_id = l_final_apprv_pos_id ');
1865                DEBUG_LOG_STRING (l_proc_level, 'Is_position_gt_final_pos.Msg8',
1866                                  ' l_final_apprv_found --> ' || l_final_apprv_found);
1867             -- =============== END DEBUG LOG ==================
1868 
1869          ELSE
1870 
1871             -- Set the initial value of position_id to the transmitter's position
1872             l_position_id := l_transmitter_position_id;
1873 
1874             -- =============== START DEBUG LOG ================
1875                DEBUG_LOG_STRING (l_proc_level, 'Is_position_gt_final_pos.Msg9',
1876                                  ' l_position_id --> ' || l_position_id);
1877             -- =============== END DEBUG LOG ==================
1878 
1879             LOOP
1880 
1881                -- =============== START DEBUG LOG ================
1882                   DEBUG_LOG_STRING (l_proc_level, 'Is_position_gt_final_pos.Msg10',
1883                                     ' Cursor c_get_parent_position with ' ||
1884                                     ' l_position_id --> ' || l_position_id ||
1885                                     ' l_pos_structure_version_id -> ' || l_pos_structure_version_id ||
1886                                     ' l_business_group_id --> ' || l_business_group_id);
1887                -- =============== END DEBUG LOG ==================
1888 
1889                OPEN c_get_parent_position(l_position_id
1890                                          ,l_pos_structure_version_id
1891                                          ,l_business_group_id);
1892 
1893                FETCH c_get_parent_position INTO l_parent_pos_id;
1894 
1895                -- =============== START DEBUG LOG ================
1896                   DEBUG_LOG_STRING (l_proc_level, 'Is_position_gt_final_pos.Msg11',
1897                                     ' l_parent_pos_id --> ' || l_parent_pos_id);
1898                -- =============== END DEBUG LOG ==================
1899 
1900                EXIT WHEN c_get_parent_position%NOTFOUND;
1901                CLOSE c_get_parent_position;
1902 
1903                IF (l_parent_pos_id = l_final_apprv_pos_id) THEN
1904 
1905                   -- =============== START DEBUG LOG ================
1906                      DEBUG_LOG_STRING (l_proc_level, 'Is_position_gt_final_pos.Msg12',
1907                                        ' l_parent_pos_id = l_final_apprv_pos_id ');
1908                   -- =============== END DEBUG LOG ==================
1909 
1910                   l_final_apprv_found := 'Y';
1911                   -- =============== START DEBUG LOG ================
1912                      DEBUG_LOG_STRING (l_proc_level, 'Is_position_gt_final_pos.Msg13',
1913                                        ' l_final_apprv_found --> ' || l_final_apprv_found);
1914                   -- =============== END DEBUG LOG ==================
1915 
1916                   EXIT;
1917 
1918                ELSE -- parent position is not final approver position
1919 
1920                   -- set the new position to the parent position for next iteration in loop
1921                   l_position_id := l_parent_pos_id;
1922 
1923                   -- =============== START DEBUG LOG ================
1924                      DEBUG_LOG_STRING (l_proc_level, 'Is_position_gt_final_pos.Msg14',
1925                                        ' l_position_id --> ' || l_position_id);
1926                   -- =============== END DEBUG LOG ==================
1927 
1928                END IF;
1929 
1930             END LOOP;
1931 
1932             IF (c_get_parent_position%ISOPEN) THEN
1933                CLOSE c_get_parent_position;
1934             END IF;
1935 
1936          END IF;  -- End check for transmitter's position = final approver position
1937 
1938          IF (l_final_apprv_found = 'Y') THEN
1939 
1940             -- The transmitter's position is NOT higher than the final approver position
1941             -- So set result to 'No'
1942             result := 'COMPLETE:N';
1943 
1944              -- =============== START DEBUG LOG ================
1945                 DEBUG_LOG_STRING (l_proc_level, 'Is_position_gt_final_pos.Msg15',
1946                                   ' l_final_apprv_found = Y -- result --> ' || result);
1947              -- =============== END DEBUG LOG ==================
1948 
1949          ELSE  -- (l_final_apprv_found = ='N')
1950 
1951             -- The transmitter's position IS higher than the final approver position
1952             -- So set result to 'Yes'
1953             result := 'COMPLETE:Y';
1954 
1955              -- =============== START DEBUG LOG ================
1956                 DEBUG_LOG_STRING (l_proc_level, 'Is_position_gt_final_pos.Msg16',
1957                                   ' l_final_apprv_found != Y -- result --> ' || result);
1958              -- =============== END DEBUG LOG ==================
1959 
1960          END IF;
1961 
1962       END IF;
1963 
1964       IF (funcmode <> 'RUN') THEN
1965          result := 'COMPLETE';
1966          -- =============== START DEBUG LOG ================
1967             DEBUG_LOG_STRING (l_proc_level, 'Is_position_gt_final_pos.Msg17',
1968                               ' funcmode <> RUN -- result --> ' || result);
1969          -- =============== END DEBUG LOG ==================
1970          return;
1971       END IF;
1972 
1973       -- =============== START DEBUG LOG ================
1974          DEBUG_LOG_STRING (l_proc_level, 'Is_position_gt_final_pos.Msg18',
1975                            ' ** END IS_POSITION_GT_FINAL_POS ** ');
1976       -- =============== END DEBUG LOG ==================
1977 
1978    EXCEPTION
1979       WHEN OTHERS THEN
1980            -- =============== START DEBUG LOG ================
1981               DEBUG_LOG_UNEXP_ERROR ('Is_position_gt_final_pos.Unexp1','DEFAULT');
1982            -- =============== END DEBUG LOG ==================
1983            wf_core.context('IGI_EXP_APPROVAL_PKG','is_position_gt_final_pos',itemtype,itemkey,
1984                            to_char(actid),funcmode);
1985            raise;
1986    END is_position_gt_final_pos;
1987 
1988    -- *************************************************************************
1989    --    UPDATE_TU_STATUS_TO_AVL
1990    -- *************************************************************************
1991 
1992    PROCEDURE update_tu_status_to_avl ( itemtype IN  VARCHAR2,
1993                                        itemkey  IN  VARCHAR2,
1994                                        actid    IN  NUMBER,
1995                                        funcmode IN  VARCHAR2,
1996                                        result   OUT NOCOPY VARCHAR2) IS
1997 
1998       l_tu_id  NUMBER;
1999 
2000    BEGIN
2001 
2002       -- =============== START DEBUG LOG ================
2003          DEBUG_LOG_STRING (l_proc_level, 'Update_tu_status_to_avl.Msg1',
2004                            ' ** BEGIN UPDATE_TU_STATUS_TO_AVL ** ');
2005       -- =============== END DEBUG LOG ==================
2006 
2007       IF (funcmode = 'RUN') THEN
2008 
2009          -- =============== START DEBUG LOG ================
2010             DEBUG_LOG_STRING (l_proc_level, 'Update_tu_status_to_avl.Msg2',
2011                               ' funcmode = RUN ');
2012          -- =============== END DEBUG LOG ==================
2013 
2014          -- The initial validation failed for the TU transmitter
2015          -- so set the status of the TU back to 'Available' before
2016          -- exiting from workflow so the TU can be modified
2017          -- (e.g. by changing the TU approval profile used) and
2018          -- transmitted again.
2019 
2020          -- Get the tu id
2021          l_tu_id
2022             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
2023                                             itemkey  => itemkey,
2024                                             aname    => 'TU_ID');
2025 
2026          -- =============== START DEBUG LOG ================
2027             DEBUG_LOG_STRING (l_proc_level, 'Update_tu_status_to_avl.Msg3',
2028                               ' GetItemAttrNumber TU_ID --> '|| l_tu_id);
2029          -- =============== END DEBUG LOG ==================
2030 
2031          -- Update the status of the TU to 'AVL' for 'Available'
2032          UPDATE igi_exp_tus tus
2033          SET    tus.tu_status = 'AVL'
2034          WHERE  tus.tu_id = l_tu_id;
2035 
2036          -- =============== START DEBUG LOG ================
2037             DEBUG_LOG_STRING (l_proc_level, 'Update_tu_status_to_avl.Msg4',
2038                               ' UPDATE igi_exp_tus tu_status = AVL ');
2039          -- =============== END DEBUG LOG ==================
2040 
2041       END IF;
2042 
2043       IF (funcmode <> 'RUN') THEN
2044          result := 'COMPLETE';
2045          -- =============== START DEBUG LOG ================
2046             DEBUG_LOG_STRING (l_proc_level, 'Update_tu_status_to_avl.Msg5',
2047                               ' funcmode = RUN -- result --> ' || result);
2048          -- =============== END DEBUG LOG ==================
2049          return;
2050       END IF;
2051 
2052       -- =============== START DEBUG LOG ================
2053          DEBUG_LOG_STRING (l_proc_level, 'Update_tu_status_to_avl.Msg6',
2054                            ' ** END UPDATE_TU_STATUS_TO_AVL ** ');
2055       -- =============== END DEBUG LOG ==================
2056 
2057    EXCEPTION
2058       WHEN OTHERS THEN
2059            -- =============== START DEBUG LOG ================
2060               DEBUG_LOG_UNEXP_ERROR ('Update_tu_status_to_avl.Unexp1','DEFAULT');
2061            -- =============== END DEBUG LOG ==================
2062            wf_core.context('IGI_EXP_APPROVAL_PKG','update_tu_status_to_avl',itemtype,itemkey,
2063                            to_char(actid),funcmode);
2064            raise;
2065    END update_tu_status_to_avl;
2066 
2067 
2068 
2069    -- *************************************************************************
2070    --    UPDATE_DUS_TO_IN_A_TU
2071    -- *************************************************************************
2072 
2073    PROCEDURE update_dus_to_in_a_tu   ( itemtype IN  VARCHAR2,
2074                                        itemkey  IN  VARCHAR2,
2075                                        actid    IN  NUMBER,
2076                                        funcmode IN  VARCHAR2,
2077                                        result   OUT NOCOPY VARCHAR2) IS
2078 
2079       l_tu_id  igi_exp_dus.tu_id%TYPE;
2080 
2081    BEGIN
2082 
2083       -- =============== START DEBUG LOG ================
2084          DEBUG_LOG_STRING (l_proc_level, 'Update_dus_to_in_a_tu.Msg1',
2085                            ' ** BEGIN UPDATE_DUS_TO_IN_A_TU ** ');
2086       -- =============== END DEBUG LOG ==================
2087 
2088       IF (funcmode = 'RUN') THEN
2089 
2090          -- =============== START DEBUG LOG ================
2091             DEBUG_LOG_STRING (l_proc_level, 'Update_dus_to_in_a_tu.Msg2',
2092                               ' funcmode = RUN ');
2093          -- =============== END DEBUG LOG ==================
2094 
2095          -- The initial validation failed for the TU transmitter
2096          -- So the status of the TU was set back to 'Available'
2097          -- and the status of the DUs must be set back
2098          -- to 'In a Transmission Unit' before
2099          -- exiting from workflow so the TU can be modified
2100          -- (e.g. by changing the TU approval profile used) and
2101          -- transmitted again.
2102 
2103          -- Get the tu id
2104          l_tu_id
2105             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
2106                                             itemkey  => itemkey,
2107                                             aname    => 'TU_ID');
2108 
2109          -- =============== START DEBUG LOG ================
2110             DEBUG_LOG_STRING (l_proc_level, 'Update_dus_to_in_a_tu.Msg3',
2111                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
2112          -- =============== END DEBUG LOG ==================
2113 
2114          -- Update the status of the DUs in the TU
2115          -- to 'ITU' for 'In a Transmission Unit'
2116 
2117          UPDATE igi_exp_dus dus
2118          SET    dus.du_status = 'ITU'
2119          WHERE  dus.tu_id = l_tu_id;
2120 
2121          -- =============== START DEBUG LOG ================
2122             DEBUG_LOG_STRING (l_proc_level, 'Update_dus_to_in_a_tu.Msg4',
2123                               ' UPDATE igi_exp_dus du_status = ITU ');
2124          -- =============== END DEBUG LOG ==================
2125 
2126       END IF;
2127 
2128       IF (funcmode <> 'RUN') THEN
2129          result := 'COMPLETE';
2130          -- =============== START DEBUG LOG ================
2131             DEBUG_LOG_STRING (l_proc_level, 'Update_dus_to_in_a_tu.Msg5',
2132                               ' funcmode = RUN -- result -->  ' || result);
2133          -- =============== END DEBUG LOG ==================
2134          return;
2135       END IF;
2136 
2137       -- =============== START DEBUG LOG ================
2138          DEBUG_LOG_STRING (l_proc_level, 'Update_dus_to_in_a_tu.Msg6',
2139                            ' ** END UPDATE_DUS_TO_IN_A_TU ** ');
2140       -- =============== END DEBUG LOG ==================
2141 
2142    EXCEPTION
2143       WHEN OTHERS THEN
2144            -- =============== START DEBUG LOG ================
2145               DEBUG_LOG_UNEXP_ERROR ('Update_tu_status_to_avl.Unexp1','DEFAULT');
2146            -- =============== END DEBUG LOG ==================
2147            wf_core.context('IGI_EXP_APPROVAL_PKG','update_dus_to_in_a_tu',itemtype,itemkey,
2148                            to_char(actid),funcmode);
2149            raise;
2150    END update_dus_to_in_a_tu;
2151 
2152 
2153    -- *************************************************************************
2154    --    BUILD_USER_LIST
2155    -- *************************************************************************
2156 
2157    PROCEDURE build_user_list         ( itemtype IN  VARCHAR2,
2158                                        itemkey  IN  VARCHAR2,
2159                                        actid    IN  NUMBER,
2160                                        funcmode IN  VARCHAR2,
2161                                        result   OUT NOCOPY VARCHAR2) IS
2162 
2163       l_user_count             NUMBER:= 0;
2164       l_user_list              VARCHAR2(1000);
2165       l_user_name              fnd_user.user_name%TYPE;
2166       l_user_id                fnd_user.user_id%TYPE;
2167       l_tu_id                  igi_exp_tus.tu_id%TYPE;
2168       l_current_position_id    per_all_positions.position_id%TYPE;
2169       l_business_group_id      hr_all_positions_f.business_group_id%TYPE;
2170       l_organization_id        hr_all_positions_f.organization_id%TYPE;
2171 
2172       CURSOR c_user_list(p_position_id hr_all_positions_f.position_id%TYPE
2173                         ,p_business_group_id hr_all_positions_f.business_group_id%TYPE
2174                         ,p_organization_id hr_all_positions_f.organization_id%TYPE)
2175       IS
2176          SELECT fu.user_name
2177          FROM   hr_all_positions_f      hap,
2178                 per_all_assignments_f   paa,
2179                 per_employees_current_x pec,
2180                 fnd_user                fu
2181          WHERE  fu.start_date <= SYSDATE
2182          AND    NVL(fu.end_date,SYSDATE) >= SYSDATE
2183          AND    fu.employee_id IS NOT NULL
2184          AND    fu.employee_id = pec.employee_id
2185          AND    NVL(pec.inactive_date,SYSDATE) >= SYSDATE
2186          AND    pec.business_group_id = paa.business_group_id
2187          AND    pec.assignment_id = paa.assignment_id
2188          AND    pec.organization_id = paa.organization_id
2189          AND    pec.business_group_id =  p_business_group_id
2190          AND    pec.organization_id = p_organization_id
2191          AND    paa.assignment_type = 'E'
2192          AND    paa.effective_start_date <= SYSDATE
2193          AND    paa.effective_end_date >= SYSDATE
2194          AND    paa.business_group_id = hap.business_group_id
2195          AND    paa.position_id IS NOT NULL
2196          AND    paa.position_id = hap.position_id
2197          AND    paa.organization_id = hap.organization_id
2198          AND    hap.date_effective <= SYSDATE
2199          AND    NVL(hap.date_end, SYSDATE) >= SYSDATE
2200          AND    NVL(UPPER(hap.status), 'VALID') NOT IN ('INVALID')
2201          AND    hap.position_id = p_position_id;
2202 
2203 
2204 
2205    BEGIN
2206 
2207      -- =============== START DEBUG LOG ================
2208          DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg1',
2209                            ' ** BEGIN BUILD_USER_LIST ** ');
2210      -- =============== END DEBUG LOG ==================
2211 
2212       IF (funcmode = 'RUN') THEN
2213 
2214          -- =============== START DEBUG LOG ================
2215             DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg2',
2216                               ' funcmode = RUN ');
2217          -- =============== END DEBUG LOG ==================
2218 
2219          -- Get the current position id
2220          l_current_position_id
2221             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
2222                                             itemkey  => itemkey,
2223                                             aname    => 'CURRENT_POSITION_ID');
2224 
2225          -- =============== START DEBUG LOG ================
2226             DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg3',
2227                               ' GetItemAttrNumber CURRENT_POSITION_ID --> ' || l_current_position_id);
2228          -- =============== END DEBUG LOG ==================
2229 
2230          -- Get the business group id
2231          l_business_group_id
2232             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
2233                                             itemkey  => itemkey,
2234                                             aname    => 'BUSINESS_GROUP_ID');
2235 
2236          -- =============== START DEBUG LOG ================
2237             DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg4',
2238                               ' GetItemAttrNumber BUSINESS_GROUP_ID --> ' || l_business_group_id);
2239          -- =============== END DEBUG LOG ==================
2240 
2241          -- Get the organization id
2242          l_organization_id
2243             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
2244                                             itemkey  => itemkey,
2245                                             aname    => 'ORGANIZATION_ID');
2246 
2247          -- =============== START DEBUG LOG ================
2248             DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg5',
2249                               ' GetItemAttrNumber ORGANIZATION_ID --> ' || l_organization_id );
2250          -- =============== END DEBUG LOG ==================
2251 
2252          OPEN c_user_list(l_current_position_id
2253                          ,l_business_group_id
2254                          ,l_organization_id);
2255 
2256          -- =============== START DEBUG LOG ================
2257             DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg6',
2258                               ' opening cursor c_user_list with '
2259                            || ' l_current_position_id --> ' || l_current_position_id
2260                            || ' l_business_group_id --> ' || l_business_group_id
2261                            || ' l_organization_id --> ' || l_organization_id);
2262          -- =============== END DEBUG LOG ==================
2263 
2264          -- For each user assigned to the current position, fetch the user name
2265          -- and add to user list
2266          LOOP
2267             FETCH c_user_list INTO l_user_name;
2268 
2269             -- =============== START DEBUG LOG ================
2270                DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg7',
2271                                  ' l_user_name --> ' || l_user_name);
2272             -- =============== END DEBUG LOG ==================
2273 
2274             EXIT WHEN c_user_list%NOTFOUND;
2275             l_user_count := l_user_count + 1;
2276             l_user_list  := l_user_list||fnd_global.local_chr(10)||l_user_name;
2277 
2278             -- =============== START DEBUG LOG ================
2279                DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg8',
2280                                  ' l_user_count --> ' || l_user_count);
2281                DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg9',
2282                                  ' l_user_list --> ' || l_user_list);
2283             -- =============== END DEBUG LOG ==================
2284 
2285          END LOOP;
2286          CLOSE c_user_list;
2287 
2288          IF (l_user_count = 0) THEN
2289             result := 'COMPLETE:NO_USERS';
2290             -- =============== START DEBUG LOG ================
2291                DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg10',
2292                                  ' l_user_count = 0 -- result --> ' || result);
2293             -- =============== END DEBUG LOG ==================
2294             return;
2295          ELSIF (l_user_count = 1) THEN
2296 
2297             -- =============== START DEBUG LOG ================
2298                DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg11',
2299                                  ' l_user_count = 1 ');
2300             -- =============== END DEBUG LOG ==================
2301 
2302             -- Set the current_authoriser_role attribute to the user
2303             -- at the current position
2304             wf_engine.SetItemAttrText  ( itemtype => itemtype,
2305                                          itemkey  => itemkey,
2306                                          aname    => 'CURRENT_AUTHORIZER_ROLE',
2307                                          avalue   => l_user_name);
2308 
2309 
2310             -- =============== START DEBUG LOG ================
2311                DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg12',
2312                                  ' SetItemAttrText CURRENT_AUTHORIZER_ROLE --> ' || l_user_name);
2313             -- =============== END DEBUG LOG ==================
2314 
2315             -- Need to update the TU table with the next authorizer of the TU
2316             -- So firstly get the user_id of the current authorizer
2317             SELECT user_id
2318             INTO   l_user_id
2319             FROM   fnd_user
2320             WHERE  user_name = l_user_name;
2321 
2322 
2323             -- =============== START DEBUG LOG ================
2324                DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg13',
2325                                  ' l_user_id --> ' || l_user_id);
2326             -- =============== END DEBUG LOG ==================
2327 
2328             -- Now get the TU id
2329             l_tu_id
2330                := wf_engine.GetItemAttrNumber( itemtype => itemtype,
2331                                                itemkey  => itemkey,
2332                                                aname    => 'TU_ID');
2333 
2334 
2335             -- =============== START DEBUG LOG ================
2336                DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg14',
2337                                  ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
2338             -- =============== END DEBUG LOG ==================
2339 
2340             -- Update the TU table with the next authorizer
2341             UPDATE igi_exp_tus
2342             SET    next_approver_user_id = l_user_id
2343             WHERE  tu_id = l_tu_id;
2344 
2345 
2346             -- =============== START DEBUG LOG ================
2347                DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg15',
2348                                  ' UPDATE igi_exp_tus set next_approver_user_id --> '|| l_user_id);
2349             -- =============== END DEBUG LOG ==================
2350 
2351             result := 'COMPLETE:ONE_USER';
2352 
2353 
2354             -- =============== START DEBUG LOG ================
2355                DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg16',
2356                                  ' result --> ' || result);
2357             -- =============== END DEBUG LOG ==================
2358 
2359             return;
2360 
2361          ELSE  -- multiple users were found for the current position
2362 
2363             -- Set the user_list attribute to the list of users found
2364             wf_engine.SetItemAttrText  ( itemtype => itemtype,
2365                                          itemkey  => itemkey,
2366                                          aname    => 'USER_LIST',
2367                                          avalue   => l_user_list);
2368 
2369 
2370             -- =============== START DEBUG LOG ================
2371                DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg17',
2372                                  ' SetItemAttrText USER_LIST --> ' || l_user_list);
2373             -- =============== END DEBUG LOG ==================
2374 
2375             -- Clear the picked authorizer attribute for the notification
2376             wf_engine.SetItemAttrText  ( itemtype => itemtype,
2377                                          itemkey  => itemkey,
2378                                          aname    => 'PICKED_AUTHORIZER',
2379                                          avalue   => null);
2380 
2381 
2382             -- =============== START DEBUG LOG ================
2383                DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg18',
2384                                  ' SetItemAttrText PICKED_AUTHORIZER --> null ');
2385             -- =============== END DEBUG LOG ==================
2386 
2387             result := 'COMPLETE:MULTIPLE_USERS';
2388 
2389             -- =============== START DEBUG LOG ================
2390                DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg19',
2391                                  ' result --> ' || result);
2392             -- =============== END DEBUG LOG ==================
2393 
2394             return;
2395          END IF;
2396 
2397       END IF;
2398 
2399       IF (funcmode <> 'RUN') THEN
2400          result := 'COMPLETE';
2401          -- =============== START DEBUG LOG ================
2402             DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg20',
2403                               ' funcmode <> RUN -- result --> ' || result);
2404          -- =============== END DEBUG LOG ==================
2405          return;
2406       END IF;
2407 
2408       -- =============== START DEBUG LOG ================
2409          DEBUG_LOG_STRING (l_proc_level, 'Build_user_list.Msg21',
2410                            ' ** END BUILD_USER_LIST ** ');
2411       -- =============== END DEBUG LOG ==================
2412 
2413    EXCEPTION
2414       WHEN OTHERS THEN
2415            -- =============== START DEBUG LOG ================
2416               DEBUG_LOG_UNEXP_ERROR ('Build_user_list.Unexp1','DEFAULT');
2417            -- =============== END DEBUG LOG ==================
2418            wf_core.context('IGI_EXP_APPROVAL_PKG','build_user_list',itemtype,itemkey,
2419                            to_char(actid),funcmode);
2420            raise;
2421    END build_user_list;
2422 
2423 
2424 
2425    -- *************************************************************************
2426    --    CHECK_USER_POSITION
2427    -- *************************************************************************
2428 
2429    PROCEDURE check_user_position  ( itemtype IN  VARCHAR2,
2430                                     itemkey  IN  VARCHAR2,
2431                                     actid    IN  NUMBER,
2432                                     funcmode IN  VARCHAR2,
2433                                     result   OUT NOCOPY VARCHAR2) IS
2434 
2435       l_nid                  NUMBER;    -- notification id
2436       l_user_or_pos          VARCHAR2(30);
2437       l_picked_authorizer    VARCHAR2(240);
2438       l_current_position_id  per_all_positions.position_id%TYPE;
2439       l_role_name            VARCHAR2(240);
2440 
2441       e_wrong_user           EXCEPTION;
2442 
2443 
2444    BEGIN
2445 
2446       -- =============== START DEBUG LOG ================
2447          DEBUG_LOG_STRING (l_proc_level, 'Check_user_position.Msg1',
2448                            ' ** BEGIN CHECK_USER_POSITION ** ');
2449       -- =============== END DEBUG LOG ==================
2450 
2451       IF (funcmode = 'RUN') THEN
2452          -- Do not do anything when called in 'RUN' mode
2453          null;
2454       END IF;
2455 
2456       IF (funcmode = 'RESPOND') THEN
2457 
2458          -- =============== START DEBUG LOG ================
2459             DEBUG_LOG_STRING (l_proc_level, 'Check_user_position.Msg2',
2460                               ' funcmode = RESPOND ');
2461          -- =============== END DEBUG LOG ==================
2462 
2463          l_nid := wf_engine.context_nid;
2464 
2465          -- =============== START DEBUG LOG ================
2466             DEBUG_LOG_STRING (l_proc_level, 'Check_user_position.Msg3',
2467                               ' l_nid --> ' || l_nid);
2468          -- =============== END DEBUG LOG ==================
2469 
2470          l_user_or_pos := wf_notification.GetAttrText(l_nid,'RESULT');
2471 
2472          -- =============== START DEBUG LOG ================
2473             DEBUG_LOG_STRING (l_proc_level, 'Check_user_position.Msg4',
2474                               ' l_user_or_pos --> ' || l_user_or_pos);
2475          -- =============== END DEBUG LOG ==================
2476 
2477          IF (l_user_or_pos = 'USER') THEN
2478 
2479             -- =============== START DEBUG LOG ================
2480                DEBUG_LOG_STRING (l_proc_level, 'Check_user_position.Msg5',
2481                                  ' l_user_or_pos = USER ');
2482             -- =============== END DEBUG LOG ==================
2483 
2484             -- The notification responder chose to send approval request to chosen user
2485             l_picked_authorizer := wf_notification.GetAttrText(l_nid,'PICKED_AUTHORIZER');
2486 
2487             -- =============== START DEBUG LOG ================
2488                DEBUG_LOG_STRING (l_proc_level, 'Check_user_position.Msg6',
2489                                  ' GetAttrText PICKED_AUTHORIZER --> ' || l_picked_authorizer);
2490             -- =============== END DEBUG LOG ==================
2491 
2492             -- Get the current position id
2493             l_current_position_id
2494                := wf_engine.GetItemAttrNumber( itemtype => itemtype,
2495                                                itemkey  => itemkey,
2496                                                aname    => 'CURRENT_POSITION_ID');
2497 
2498             -- =============== START DEBUG LOG ================
2499                DEBUG_LOG_STRING (l_proc_level, 'Check_user_position.Msg7',
2500                                  ' GetItemAttrNumber CURRENT_POSITION_ID --> ' ||l_current_position_id );
2501             -- =============== END DEBUG LOG ==================
2502 
2503             -- Set the role name
2504             l_role_name := 'POS:'||to_char(l_current_position_id);
2505 
2506             -- =============== START DEBUG LOG ================
2507                DEBUG_LOG_STRING (l_proc_level, 'Check_user_position.Msg8',
2508                                  ' l_role_name --> ' || l_role_name);
2509                DEBUG_LOG_STRING (l_proc_level, 'Check_user_position.Msg9',
2510                                  ' Calling wf_directory.IsPerformer with '
2511                                ||' l_picked_authorizer --> ' || l_picked_authorizer
2512                                ||' l_role_name --> ' ||  l_role_name);
2513             -- =============== END DEBUG LOG ==================
2514 
2515             -- Check that the chosen authorizer is assigned to the current position
2516             IF (wf_directory.IsPerformer(l_picked_authorizer,l_role_name)) THEN
2517                result := 'COMPLETE:USER';
2518                -- =============== START DEBUG LOG ================
2519                   DEBUG_LOG_STRING (l_proc_level, 'Check_user_position.Msg10',
2520                                     ' wf_directory.IsPerformer --> TRUE - result -> ' || result);
2521                -- =============== END DEBUG LOG ==================
2522                return;
2523             ELSE
2524                -- =============== START DEBUG LOG ================
2525                   DEBUG_LOG_STRING (l_proc_level, 'Check_user_position.Msg11',
2526                                     ' wf_directory.IsPerformer --> FALSE - Raise e_wrong_user');
2527                -- =============== END DEBUG LOG ==================
2528                -- Chosen authorizer is not assigned to current position so raise error
2529                RAISE e_wrong_user;
2530             END IF;
2531 
2532          ELSE
2533             result := 'COMPLETE:POS';
2534             -- =============== START DEBUG LOG ================
2535                DEBUG_LOG_STRING (l_proc_level, 'Check_user_position.Msg12',
2536                                  ' result --> ' || result);
2537             -- =============== END DEBUG LOG ==================
2538             return;
2539          END IF;
2540 
2541       END IF;
2542 
2543       -- =============== START DEBUG LOG ================
2544          DEBUG_LOG_STRING (l_proc_level, 'Check_user_position.Msg13',
2545                            ' ** END CHECK_USER_POSITION ** ');
2546       -- =============== END DEBUG LOG ==================
2547 
2548    EXCEPTION
2549       WHEN e_wrong_user THEN
2550            fnd_message.set_name('IGI','IGI_EXP_INVALID_AUTHORIZER');
2551            -- =============== START DEBUG LOG ================
2552               DEBUG_LOG_UNEXP_ERROR ('Check_user_position.Unexp1','USER');
2553            -- =============== END DEBUG LOG ==================
2554            app_exception.raise_exception;
2555       WHEN OTHERS THEN
2556            -- =============== START DEBUG LOG ================
2557               DEBUG_LOG_UNEXP_ERROR ('Check_user_position.Unexp2','DEFAULT');
2558            -- =============== END DEBUG LOG ==================
2559            wf_core.context('IGI_EXP_APPROVAL_PKG','check_user_position',itemtype,itemkey,
2560                            to_char(actid),funcmode);
2561            raise;
2562    END check_user_position;
2563 
2564 
2565    -- *************************************************************************
2566    --    SET_POS_AS_AUTH
2567    -- *************************************************************************
2568 
2569    PROCEDURE set_pos_as_auth      ( itemtype IN  VARCHAR2,
2570                                     itemkey  IN  VARCHAR2,
2571                                     actid    IN  NUMBER,
2572                                     funcmode IN  VARCHAR2,
2573                                     result   OUT NOCOPY VARCHAR2) IS
2574 
2575       l_current_position_id    per_all_positions.position_id%TYPE;
2576       l_current_auth_role      VARCHAR2(240);
2577       l_tu_id                  igi_exp_tus.tu_id%TYPE;
2578 
2579    BEGIN
2580 
2581       -- =============== START DEBUG LOG ================
2582          DEBUG_LOG_STRING (l_proc_level, 'Set_pos_as_auth.Msg1',
2583                            ' ** START SET_POS_AS_AUTH ** ');
2584       -- =============== END DEBUG LOG ==================
2585 
2586       IF (funcmode = 'RUN') THEN
2587 
2588          -- Get the current position id
2589          l_current_position_id
2590             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
2591                                             itemkey  => itemkey,
2592                                             aname    => 'CURRENT_POSITION_ID');
2593 
2594          -- =============== START DEBUG LOG ================
2595             DEBUG_LOG_STRING (l_proc_level, 'Set_pos_as_auth.Msg1',
2596                               ' GetItemAttrNumber CURRENT_POSITION_ID -->' || l_current_position_id);
2597          -- =============== END DEBUG LOG ==================
2598 
2599          l_current_auth_role := 'POS:'||to_char(l_current_position_id);
2600 
2601          -- =============== START DEBUG LOG ================
2602             DEBUG_LOG_STRING (l_proc_level, 'Set_pos_as_auth.Msg1',
2603                               ' l_current_auth_role -->' || l_current_auth_role);
2604          -- =============== END DEBUG LOG ==================
2605 
2606          -- Set the current_authorizer_role attribute to the position
2607             wf_engine.SetItemAttrText  ( itemtype => itemtype,
2608                                          itemkey  => itemkey,
2609                                          aname    => 'CURRENT_AUTHORIZER_ROLE',
2610                                          avalue   => l_current_auth_role);
2611 
2612          -- =============== START DEBUG LOG ================
2613             DEBUG_LOG_STRING (l_proc_level, 'Set_pos_as_auth.Msg1',
2614                               ' SetItemAttrText CURRENT_AUTHORIZER_ROLE -->' || l_current_auth_role);
2615          -- =============== END DEBUG LOG ==================
2616 
2617          -- Since the next authorizer user is unknown (it is anyone at the
2618          -- next position) then the value of the column next_approver_user_id
2619          -- on the TU table should be set to null since nothing can be displayed
2620          -- there.
2621          -- First get the TU id
2622 
2623          l_tu_id
2624             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
2625                                             itemkey  => itemkey,
2626                                             aname    => 'TU_ID');
2627 
2628          -- =============== START DEBUG LOG ================
2629             DEBUG_LOG_STRING (l_proc_level, 'Set_pos_as_auth.Msg1',
2630                               ' GetItemAttrNumber TU_ID -->' || l_tu_id);
2631          -- =============== END DEBUG LOG ==================
2632 
2633          -- Update the next approver column to null
2634          UPDATE igi_exp_tus
2635          SET    next_approver_user_id = null
2636          WHERE  tu_id = l_tu_id;
2637 
2638          -- =============== START DEBUG LOG ================
2639             DEBUG_LOG_STRING (l_proc_level, 'Set_pos_as_auth.Msg1',
2640                               ' Update igi_exp_tus for tu_id ' ||l_tu_id );
2641          -- =============== END DEBUG LOG ==================
2642 
2643       END IF;
2644 
2645       IF (funcmode <> 'RUN') THEN
2646          result := 'COMPLETE';
2647          -- =============== START DEBUG LOG ================
2648             DEBUG_LOG_STRING (l_proc_level, 'Set_pos_as_auth.Msg1',
2649                               ' funcmode <> RUN -- result --> ' || result );
2650          -- =============== END DEBUG LOG ==================
2651          return;
2652       END IF;
2653 
2654       -- =============== START DEBUG LOG ================
2655          DEBUG_LOG_STRING (l_proc_level, 'Set_pos_as_auth.Msg1',
2656                            ' ** END SET_POS_AS_AUTH ** ');
2657       -- =============== END DEBUG LOG ==================
2658 
2659    EXCEPTION
2660       WHEN OTHERS THEN
2661            wf_core.context('IGI_EXP_APPROVAL_PKG','set_pos_as_auth',itemtype,itemkey,
2662                          to_char(actid),funcmode);
2663            -- =============== START DEBUG LOG ================
2664               DEBUG_LOG_UNEXP_ERROR ('Set_pos_as_auth.Unexp1','DEFAULT');
2665            -- =============== END DEBUG LOG ==================
2666            raise;
2667    END set_pos_as_auth;
2668 
2669 
2670    -- *************************************************************************
2671    --    SET_CHOSEN_USER_AS_AUTH
2672    -- *************************************************************************
2673 
2674    PROCEDURE set_chosen_user_as_auth( itemtype IN  VARCHAR2,
2675                                       itemkey  IN  VARCHAR2,
2676                                       actid    IN  NUMBER,
2677                                       funcmode IN  VARCHAR2,
2678                                       result   OUT NOCOPY VARCHAR2) IS
2679 
2680       l_current_auth_role  VARCHAR2(240);
2681       l_auth_id            fnd_user.user_id%TYPE;
2682       l_tu_id              igi_exp_tus.tu_id%TYPE;
2683 
2684    BEGIN
2685 
2686       -- =============== START DEBUG LOG ================
2687          DEBUG_LOG_STRING (l_proc_level, 'Set_chosen_user_as_auth.Msg1',
2688                            ' ** START SET_CHOSEN_USER_AS_AUTH ** ');
2689       -- =============== END DEBUG LOG ==================
2690 
2691       IF (funcmode = 'RUN') THEN
2692 
2693          -- Get the picked authorizer role
2694          l_current_auth_role
2695             := wf_engine.GetItemAttrText  ( itemtype => itemtype,
2696                                             itemkey  => itemkey,
2697                                             aname    => 'PICKED_AUTHORIZER');
2698 
2699          -- =============== START DEBUG LOG ================
2700             DEBUG_LOG_STRING (l_proc_level, 'Set_chosen_user_as_auth.Msg2',
2701                               ' GetItemAttrText PICKED_AUTHORIZER --> ' || l_current_auth_role);
2702          -- =============== END DEBUG LOG ==================
2703 
2704          -- Need to update the TU table to show the next authorizer of the TU
2705          -- First get the TU id
2706          l_tu_id
2707             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
2708                                             itemkey  => itemkey,
2709                                             aname    => 'TU_ID');
2710 
2711          -- =============== START DEBUG LOG ================
2712             DEBUG_LOG_STRING (l_proc_level, 'Set_chosen_user_as_auth.Msg3',
2713                               ' GetItemAttrNumbe TU_ID --> '|| l_tu_id);
2714          -- =============== END DEBUG LOG ==================
2715 
2716          -- Get the user_id of the authorizer
2717          SELECT user_id
2718          INTO   l_auth_id
2719          FROM   fnd_user
2720          WHERE  user_name = l_current_auth_role;
2721 
2722          -- =============== START DEBUG LOG ================
2723             DEBUG_LOG_STRING (l_proc_level, 'Set_chosen_user_as_auth.Msg4',
2724                               ' Get the user_id of the authorizer --> ' || l_auth_id);
2725          -- =============== END DEBUG LOG ==================
2726 
2727          -- Update the TU table with the next authorizer id
2728          UPDATE igi_exp_tus
2729          SET    next_approver_user_id = l_auth_id
2730          WHERE  tu_id = l_tu_id;
2731 
2732          -- =============== START DEBUG LOG ================
2733             DEBUG_LOG_STRING (l_proc_level, 'Set_chosen_user_as_auth.Msg5',
2734                               ' UPDATE igi_exp_tus with ' || l_auth_id || ' for ' || l_tu_id);
2735          -- =============== END DEBUG LOG ==================
2736 
2737          -- Set the current_authorizer_role attribute
2738          wf_engine.SetItemAttrText  ( itemtype => itemtype,
2739                                       itemkey  => itemkey,
2740                                       aname    => 'CURRENT_AUTHORIZER_ROLE',
2741                                       avalue   => l_current_auth_role);
2742 
2743          -- =============== START DEBUG LOG ================
2744             DEBUG_LOG_STRING (l_proc_level, 'Set_chosen_user_as_auth.Msg6',
2745                               ' SetItemAttrText CURRENT_AUTHORIZER_ROLE --> ' || l_current_auth_role);
2746          -- =============== END DEBUG LOG ==================
2747 
2748       END IF;
2749 
2750       IF (funcmode <> 'RUN') THEN
2751          result := 'COMPLETE';
2752          -- =============== START DEBUG LOG ================
2753             DEBUG_LOG_STRING (l_proc_level, 'Set_chosen_user_as_auth.Msg7',
2754                               ' funcmode <> RUN - result --> ' || result);
2755          -- =============== END DEBUG LOG ==================
2756          return;
2757       END IF;
2758 
2759       -- =============== START DEBUG LOG ================
2760          DEBUG_LOG_STRING (l_proc_level, 'Set_chosen_user_as_auth.Msg8',
2761                            ' ** END SET_CHOSEN_USER_AS_AUTH ** ');
2762       -- =============== END DEBUG LOG ==================
2763 
2764    EXCEPTION
2765       WHEN OTHERS THEN
2766            wf_core.context('IGI_EXP_APPROVAL_PKG','set_chosen_user_as_auth',itemtype,itemkey,
2767                            to_char(actid),funcmode);
2768            -- =============== START DEBUG LOG ================
2769               DEBUG_LOG_UNEXP_ERROR ('Set_chosen_user_as_auth.Unexp1','DEFAULT');
2770            -- =============== END DEBUG LOG ==================
2771            raise;
2772    END set_chosen_user_as_auth;
2773 
2774 
2775 
2776    -- *************************************************************************
2777    --    IS_AUTH_ALLOWED_RETURN
2778    -- *************************************************************************
2779 
2780    PROCEDURE is_auth_allowed_return ( itemtype IN  VARCHAR2,
2781                                       itemkey  IN  VARCHAR2,
2782                                       actid    IN  NUMBER,
2783                                       funcmode IN  VARCHAR2,
2784                                       result   OUT NOCOPY VARCHAR2) IS
2785 
2786       CURSOR c_return_assign(p_position_id  igi_exp_pos_actions.position_id%TYPE)
2787       IS
2788          SELECT return
2789          FROM   igi_exp_pos_actions
2790          WHERE  position_id = p_position_id;
2791 
2792       l_authorizer_history_list  VARCHAR2(1000);
2793       l_num                      NUMBER;
2794       l_current_position_id      hr_all_positions_f.position_id%TYPE;
2795       l_return_allowed           VARCHAR2(1);
2796 
2797    BEGIN
2798 
2799       -- =============== START DEBUG LOG ================
2800          DEBUG_LOG_STRING (l_proc_level, 'Is_auth_allowed_return.Msg1',
2801                            ' ** START IS_AUTH_ALLOWED_RETURN ** ');
2802       -- =============== END DEBUG LOG ==================
2803 
2804       IF (funcmode = 'RUN') THEN
2805 
2806          -- First need to check if there is more than one authorizer on the
2807          -- authorizer history list.  If there is only one authorizer in the
2808          -- list, it should not be possible to return the TU (as there is
2809          -- no authorizer to return it to).
2810 
2811          -- Get the authorizer history list
2812          l_authorizer_history_list
2813             := wf_engine.GetItemAttrText  ( itemtype => itemtype,
2814                                             itemkey  => itemkey,
2815                                             aname    => 'AUTHORIZER_HISTORY_LIST');
2816 
2817          -- =============== START DEBUG LOG ================
2818             DEBUG_LOG_STRING (l_proc_level, 'Is_auth_allowed_return.Msg2',
2819                               ' GetItemAttrText AUTHORIZER_HISTORY_LIST --> ' || l_authorizer_history_list);
2820          -- =============== END DEBUG LOG ==================
2821 
2822          -- Check if there is more than one authorizer in list
2823          -- (i.e. check for any commas in list as commas are used as delimiters
2824          -- between authorizers)
2825          l_num := INSTR(l_authorizer_history_list,',');
2826 
2827          -- =============== START DEBUG LOG ================
2828             DEBUG_LOG_STRING (l_proc_level, 'Is_auth_allowed_return.Msg3',
2829                               ' l_num --> ' || l_num);
2830          -- =============== END DEBUG LOG ==================
2831 
2832          IF (l_num = 0) THEN
2833 
2834             -- There is only one authorizer in list (i.e. the current authorizer)
2835             -- so the current authorizer should not be allowed to return the TU
2836             -- Set the result to 'No' and exit
2837 
2838             result := 'COMPLETE:N';
2839             -- =============== START DEBUG LOG ================
2840                DEBUG_LOG_STRING (l_proc_level, 'Is_auth_allowed_return.Msg4',
2841                                  ' l_num = 0 -- result --> ' || result);
2842             -- =============== END DEBUG LOG ==================
2843             return;
2844 
2845          ELSE
2846             -- (l_num > 0) so there is more than one authorizer in list
2847             -- Now need to check if the current authorizer's position
2848             -- has the ability to return TUs.  This is defined during EXP
2849             -- action assignment setup.
2850             -- Get the position id of the current authorizer
2851 
2852             l_current_position_id
2853                := wf_engine.GetItemAttrNumber( itemtype => itemtype,
2854                                                itemkey  => itemkey,
2855                                                aname    => 'CURRENT_POSITION_ID');
2856 
2857             -- =============== START DEBUG LOG ================
2858                DEBUG_LOG_STRING (l_proc_level, 'Is_auth_allowed_return.Msg5',
2859                                  ' GetItemAttrNumber CURRENT_POSITION_ID --> ' || l_current_position_id);
2860             -- =============== END DEBUG LOG ==================
2861 
2862             -- Check if this position has the ability to return TUs.
2863             OPEN c_return_assign(l_current_position_id);
2864             FETCH c_return_assign INTO l_return_allowed;
2865 
2866             -- =============== START DEBUG LOG ================
2867                DEBUG_LOG_STRING (l_proc_level, 'Is_auth_allowed_return.Msg6',
2868                                  ' l_return_allowed --> ' || l_return_allowed);
2869             -- =============== END DEBUG LOG ==================
2870 
2871             IF (c_return_assign%NOTFOUND) THEN
2872                CLOSE c_return_assign;
2873                -- Set the result to 'No Assignments' and exit
2874                result := 'COMPLETE:NO_ASSIGN';
2875                -- =============== START DEBUG LOG ================
2876                   DEBUG_LOG_STRING (l_proc_level, 'Is_auth_allowed_return.Msg7',
2877                                     ' c_return_assign%NOTFOUND - TRUE - result --> ' || result);
2878                -- =============== END DEBUG LOG ==================
2879                return;
2880             END IF;
2881             CLOSE c_return_assign;
2882 
2883             IF (l_return_allowed = 'Y') THEN
2884                -- Set the result to 'Yes' and exit
2885                result := 'COMPLETE:Y';
2886                -- =============== START DEBUG LOG ================
2887                   DEBUG_LOG_STRING (l_proc_level, 'Is_auth_allowed_return.Msg8',
2888                                     ' l_return_allowed = Y  -- result --> ' || result);
2889                -- =============== END DEBUG LOG ==================
2890                return;
2891             ELSE
2892                -- return not allowed for this position
2893                -- Set the result to 'No' and exit
2894                result := 'COMPLETE:N';
2895                -- =============== START DEBUG LOG ================
2896                   DEBUG_LOG_STRING (l_proc_level, 'Is_auth_allowed_return.Msg9',
2897                                     ' l_return_allowed = N -- result --> ' || result);
2898                -- =============== END DEBUG LOG ==================
2899                return;
2900             END IF;
2901 
2902          END IF;
2903 
2904       END IF;
2905 
2906       IF (funcmode <> 'RUN') THEN
2907          result := 'COMPLETE';
2908          -- =============== START DEBUG LOG ================
2909             DEBUG_LOG_STRING (l_proc_level, 'Is_auth_allowed_return.Msg10',
2910                               ' funcmode <> RUN -- result --> ' || result);
2911          -- =============== END DEBUG LOG ==================
2912          return;
2913       END IF;
2914 
2915       -- =============== START DEBUG LOG ================
2916          DEBUG_LOG_STRING (l_proc_level, 'Is_auth_allowed_return.Msg11',
2917                            ' ** END IS_AUTH_ALLOWED_RETURN ** ');
2918       -- =============== END DEBUG LOG ==================
2919 
2920    EXCEPTION
2921       WHEN OTHERS THEN
2922            wf_core.context('IGI_EXP_APPROVAL_PKG','is_auth_allowed_return',itemtype,itemkey,
2923                            to_char(actid),funcmode);
2924            -- =============== START DEBUG LOG ================
2925               DEBUG_LOG_UNEXP_ERROR ('Is_auth_allowed_return.Unexp1','DEFAULT');
2926            -- =============== END DEBUG LOG ==================
2927            raise;
2928    END is_auth_allowed_return;
2929 
2930    -- *************************************************************************
2931    --    SET_CURR_AUTH_TO_RESPONDER
2932    -- *************************************************************************
2933 
2934    PROCEDURE set_curr_auth_to_responder  ( itemtype IN  VARCHAR2,
2935                                            itemkey  IN  VARCHAR2,
2936                                            actid    IN  NUMBER,
2937                                            funcmode IN  VARCHAR2,
2938                                            result   OUT NOCOPY VARCHAR2) IS
2939 
2940       l_nid                  NUMBER;    -- notification id
2941       l_num                  NUMBER;
2942       l_current_auth_role    VARCHAR2(240);
2943 
2944    BEGIN
2945 
2946       -- =============== START DEBUG LOG ================
2947          DEBUG_LOG_STRING (l_proc_level, 'Set_curr_auth_to_responder.Msg1',
2948                            ' ** START SET_CURR_AUTH_TO_RESPONDER ** ');
2949       -- =============== END DEBUG LOG ==================
2950 
2951       IF (funcmode = 'RUN') THEN
2952          -- do nothing in run mode
2953          null;
2954       END IF;
2955 
2956       IF (funcmode = 'RESPOND') THEN
2957 
2958          -- This is run in respond mode for all notifications in the process
2959          -- 'TU Authorization Request Process' (TU_AUTH_REQUEST_PROCESS)
2960          -- If the current authorizer role is currently set as a position role
2961          -- we want to set it to the actual user who responded to the notification
2962          -- to ensure subsequent notifications are sent to the responder and not
2963          -- to all users at the position
2964 
2965          -- =============== START DEBUG LOG ================
2966             DEBUG_LOG_STRING (l_proc_level, 'Set_curr_auth_to_responder.Msg2',
2967                               ' funcmode = RESPOND ');
2968          -- =============== END DEBUG LOG ==================
2969 
2970          l_nid := wf_engine.context_nid;
2971 
2972          -- =============== START DEBUG LOG ================
2973             DEBUG_LOG_STRING (l_proc_level, 'Set_curr_auth_to_responder.Msg3',
2974                               ' l_nid --> ' || l_nid);
2975          -- =============== END DEBUG LOG ==================
2976 
2977          -- Get the current authoriser role item attribute
2978          l_current_auth_role
2979             := wf_engine.GetItemAttrText  ( itemtype => itemtype,
2980                                             itemkey  => itemkey,
2981                                             aname    => 'CURRENT_AUTHORIZER_ROLE');
2982 
2983          -- =============== START DEBUG LOG ================
2984             DEBUG_LOG_STRING (l_proc_level, 'Set_curr_auth_to_responder.Msg4',
2985                               ' GetItemAttrText CURRENT_AUTHORIZER_ROLE --> ' || l_current_auth_role);
2986          -- =============== END DEBUG LOG ==================
2987 
2988          -- Find out NOCOPY if the current authorizer role is set to a position
2989          l_num := INSTR(l_current_auth_role,'POS:');
2990 
2991          -- =============== START DEBUG LOG ================
2992             DEBUG_LOG_STRING (l_proc_level, 'Set_curr_auth_to_responder.Msg5',
2993                               ' l_num --> ' || l_num);
2994          -- =============== END DEBUG LOG ==================
2995 
2996          IF (l_num = 0) THEN
2997 
2998             -- The current authorizer role is not set as a position, so do nothing
2999             -- =============== START DEBUG LOG ================
3000                DEBUG_LOG_STRING (l_proc_level, 'Set_curr_auth_to_responder.Msg6',
3001                                  ' l_num = 0 ');
3002             -- =============== END DEBUG LOG ==================
3003             null;
3004 
3005          ELSE
3006 
3007             -- (l_num > 0)
3008             -- The current authorizer role is set as a position, so want to set it to
3009             -- the responder user instead.
3010 
3011             -- Get the responder
3012             l_current_auth_role := wf_engine.context_text;
3013 
3014             -- =============== START DEBUG LOG ================
3015                DEBUG_LOG_STRING (l_proc_level, 'Set_curr_auth_to_responder.Msg7',
3016                                  ' l_num > 0 -- l_current_auth_role --> ' || l_current_auth_role);
3017             -- =============== END DEBUG LOG ==================
3018 
3019             -- Set the current authorizer role attribute to the responder
3020             wf_engine.SetItemAttrText  ( itemtype => itemtype,
3021                                          itemkey  => itemkey,
3022                                          aname    => 'CURRENT_AUTHORIZER_ROLE',
3023                                          avalue   => l_current_auth_role);
3024 
3025             -- =============== START DEBUG LOG ================
3026                DEBUG_LOG_STRING (l_proc_level, 'Set_curr_auth_to_responder.Msg8',
3027                                  ' SetItemAttrText CURRENT_AUTHORIZER_ROLE --> ' || l_current_auth_role);
3028             -- =============== END DEBUG LOG ==================
3029 
3030          END IF;
3031 
3032          -- =============== START DEBUG LOG ================
3033             DEBUG_LOG_STRING (l_proc_level, 'Set_curr_auth_to_responder.Msg9',
3034                               ' calling set_tu_form_to_query with l_nid --> ' || l_nid);
3035          -- =============== END DEBUG LOG ==================
3036 
3037          -- OPSF(I) EXP Bug 2388078  S Brewer 17-JUN-2002 Start(2)
3038          -- Also need to call the procedure to set the TU form to query only mode
3039          -- for this notification
3040          set_tu_form_to_query(l_nid);
3041 
3042       END IF;
3043 
3044       IF (funcmode = 'TIMEOUT') THEN
3045 
3046          -- =============== START DEBUG LOG ================
3047             DEBUG_LOG_STRING (l_proc_level, 'Set_curr_auth_to_responder.Msg10',
3048                               ' funcmode = TIMEOUT -- calling set_tu_form_to_query with l_nid --> ' || l_nid);
3049          -- =============== END DEBUG LOG ==================
3050 
3051          -- Need to call the procedure to set the TU form to query only mode
3052          -- for this notification
3053          set_tu_form_to_query(l_nid);
3054 
3055       END IF;
3056       -- OPSF(I) EXP Bug 2388078  S Brewer 17-JUN-2002 End(2)
3057 
3058       -- =============== START DEBUG LOG ================
3059          DEBUG_LOG_STRING (l_proc_level, 'Set_curr_auth_to_responder.Msg11',
3060                            ' ** END SET_CURR_AUTH_TO_RESPONDER ** ');
3061       -- =============== END DEBUG LOG ==================
3062 
3063    EXCEPTION
3064       WHEN OTHERS THEN
3065            wf_core.context('IGI_EXP_APPROVAL_PKG','set_curr_auth_to_responder',itemtype,itemkey,
3066                             to_char(actid),funcmode);
3067            -- =============== START DEBUG LOG ================
3068               DEBUG_LOG_UNEXP_ERROR ('Is_auth_allowed_return.Unexp1','DEFAULT');
3069            -- =============== END DEBUG LOG ==================
3070            raise;
3071    END set_curr_auth_to_responder;
3072 
3073 
3074 
3075    -- *************************************************************************
3076    --    ADD_AUTH_TO_HISTORY
3077    -- *************************************************************************
3078 
3079    PROCEDURE add_auth_to_history  ( itemtype IN  VARCHAR2,
3080                                     itemkey  IN  VARCHAR2,
3081                                     actid    IN  NUMBER,
3082                                     funcmode IN  VARCHAR2,
3083                                     result   OUT NOCOPY VARCHAR2) IS
3084 
3085       l_authorizer_history_list  VARCHAR2(1000);
3086       l_current_auth_role        VARCHAR2(240);
3087 
3088    BEGIN
3089 
3090       -- =============== START DEBUG LOG ================
3091          DEBUG_LOG_STRING (l_proc_level, 'Add_auth_to_history.Msg1',
3092                            ' ** START ADD_AUTH_TO_HISTORY ** ');
3093       -- =============== END DEBUG LOG ==================
3094 
3095       IF (funcmode = 'RUN') THEN
3096 
3097          -- Want to add the current authorizer to the authorizer history
3098          -- list.
3099 
3100          -- Get the current authorizer
3101          l_current_auth_role
3102             := wf_engine.GetItemAttrText  ( itemtype => itemtype,
3103                                             itemkey  => itemkey,
3104                                             aname    => 'CURRENT_AUTHORIZER_ROLE');
3105 
3106          -- =============== START DEBUG LOG ================
3107             DEBUG_LOG_STRING (l_proc_level, 'Add_auth_to_history.Msg2',
3108                               ' GetItemAttrText CURRENT_AUTHORIZER_ROLE --> ' || l_current_auth_role);
3109          -- =============== END DEBUG LOG ==================
3110 
3111          -- Get the authorizer history list
3112          l_authorizer_history_list
3113             := wf_engine.GetItemAttrText  ( itemtype => itemtype,
3114                                             itemkey  => itemkey,
3115                                             aname    => 'AUTHORIZER_HISTORY_LIST');
3116 
3117          -- =============== START DEBUG LOG ================
3118             DEBUG_LOG_STRING (l_proc_level, 'Add_auth_to_history.Msg3',
3119                               ' GetItemAttrText AUTHORIZER_HISTORY_LIST --> ' || l_authorizer_history_list);
3120          -- =============== END DEBUG LOG ==================
3121 
3122          -- Add the current authorizer to the authorizer history list
3123          l_authorizer_history_list :=
3124             l_authorizer_history_list||','||l_current_auth_role;
3125 
3126          -- =============== START DEBUG LOG ================
3127             DEBUG_LOG_STRING (l_proc_level, 'Add_auth_to_history.Msg4',
3128                               ' l_authorizer_history_list --> ' || l_authorizer_history_list);
3129          -- =============== END DEBUG LOG ==================
3130 
3131          -- Set the authorizer_history_list attribute
3132          wf_engine.SetItemAttrText  ( itemtype => itemtype,
3133                                       itemkey  => itemkey,
3134                                       aname    => 'AUTHORIZER_HISTORY_LIST',
3135                                       avalue   => l_authorizer_history_list);
3136 
3137          -- =============== START DEBUG LOG ================
3138             DEBUG_LOG_STRING (l_proc_level, 'Add_auth_to_history.Msg5',
3139                               ' SetItemAttrText AUTHORIZER_HISTORY_LIST --> ' || l_authorizer_history_list);
3140          -- =============== END DEBUG LOG ==================
3141 
3142       END IF;
3143 
3144       IF (funcmode <> 'RUN') THEN
3145          result := 'COMPLETE';
3146          -- =============== START DEBUG LOG ================
3147             DEBUG_LOG_STRING (l_proc_level, 'Add_auth_to_history.Msg6',
3148                               ' funcmode <> RUN -- result --> ' || result);
3149          -- =============== END DEBUG LOG ==================
3150          return;
3151       END IF;
3152 
3153       -- =============== START DEBUG LOG ================
3154          DEBUG_LOG_STRING (l_proc_level, 'Add_auth_to_history.Msg7',
3155                            ' ** END ADD_AUTH_TO_HISTORY ** ');
3156       -- =============== END DEBUG LOG ==================
3157 
3158    EXCEPTION
3159       WHEN OTHERS THEN
3160          wf_core.context('IGI_EXP_APPROVAL_PKG','add_auth_to_history',itemtype,itemkey,
3161                          to_char(actid),funcmode);
3162            -- =============== START DEBUG LOG ================
3163               DEBUG_LOG_UNEXP_ERROR ('Add_auth_to_history.Unexp1','DEFAULT');
3164            -- =============== END DEBUG LOG ==================
3165          raise;
3166 
3167    END add_auth_to_history;
3168 
3169 
3170 
3171    -- *************************************************************************
3172    --    SET_CURRENT_POSITION_TO_SUBORD
3173    -- *************************************************************************
3174 
3175    PROCEDURE set_current_position_to_subord( itemtype IN  VARCHAR2,
3176                                              itemkey  IN  VARCHAR2,
3177                                              actid    IN  NUMBER,
3178                                              funcmode IN  VARCHAR2,
3179                                              result   OUT NOCOPY VARCHAR2) IS
3180 
3181      CURSOR c_get_subord_pos(p_position_id per_all_positions.position_id%TYPE
3182                             ,p_pos_structure_version_id per_pos_structure_versions.pos_structure_version_id%TYPE
3183                             ,p_business_group_id hr_all_positions_f.business_group_id%TYPE)
3184      IS
3185         SELECT subordinate_position_id
3186         FROM   per_pos_structure_elements
3187         WHERE  pos_structure_version_id = p_pos_structure_version_id
3188         AND    business_group_id = p_business_group_id
3189         AND    parent_position_id = p_position_id;
3190 
3191       l_current_position_id      hr_all_positions_f.position_id%TYPE;
3192       l_subord_position_id       hr_all_positions_f.position_id%TYPE;
3193       l_subord_position_name     hr_all_positions_f.name%TYPE;
3194       l_transmitter_position_id  hr_all_positions_f.position_id%TYPE;
3195       l_business_group_id        hr_all_positions_f.business_group_id%TYPE;
3196       l_pos_structure_version_id per_pos_structure_versions.pos_structure_version_id%TYPE;
3197       l_organization_id          hr_all_positions_f.organization_id%TYPE;
3198 
3199       e_no_subord_pos EXCEPTION;
3200 
3201    BEGIN
3202 
3203       -- =============== START DEBUG LOG ================
3204          DEBUG_LOG_STRING (l_proc_level, 'Set_current_position_to_subord.Msg1',
3205                            ' ** START SET_CURRENT_POSITION_TO_SUBORD ** ');
3206       -- =============== END DEBUG LOG ==================
3207 
3208       IF (funcmode = 'RUN') THEN
3209 
3210          -- This procedure will set the current position id attribute
3211          -- to be the subordinate position of the current position.
3212          -- It is called when a TU is returned to the previous
3213          -- authorizer (in the subordinate position).
3214 
3215          -- First check if the current position id is the same as the
3216          -- transmitter's position id.  In which case, we should not
3217          -- set it to the subordinate position - it should never go
3218          -- below the TU transmitter's level
3219 
3220          -- Get the position id of the TU transmitter
3221          l_transmitter_position_id
3222             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
3223                                             itemkey  => itemkey,
3224                                             aname    => 'TRANSMITTER_POSITION_ID');
3225 
3226          -- =============== START DEBUG LOG ================
3227             DEBUG_LOG_STRING (l_proc_level, 'Set_current_position_to_subord.Msg2',
3228                               ' GetItemAttrNumber TRANSMITTER_POSITION_ID --> ' || l_transmitter_position_id);
3229          -- =============== END DEBUG LOG ==================
3230 
3231          -- Get the current position id
3232          l_current_position_id
3233             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
3234                                             itemkey  => itemkey,
3235                                             aname    => 'CURRENT_POSITION_ID');
3236 
3237          -- =============== START DEBUG LOG ================
3238             DEBUG_LOG_STRING (l_proc_level, 'Set_current_position_to_subord.Msg3',
3239                               ' GetItemAttrNumber CURRENT_POSITION_ID --> ' || l_current_position_id);
3240          -- =============== END DEBUG LOG ==================
3241 
3242          IF (l_current_position_id = l_transmitter_position_id) THEN
3243             -- =============== START DEBUG LOG ================
3244                DEBUG_LOG_STRING (l_proc_level, 'Set_current_position_to_subord.Msg4',
3245                                  ' l_current_position_id = l_transmitter_position_id - return ');
3246             -- =============== END DEBUG LOG ==================
3247             -- Since this is the transmitter's position, do nothing
3248             return;
3249          END IF;
3250 
3251          -- Get the values of the attributes needed:
3252          -- Position structure version and business group.
3253 
3254          -- Get the position structure version id
3255          l_pos_structure_version_id
3256             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
3257                                             itemkey  => itemkey,
3258                                             aname    => 'POS_STRUCTURE_VERSION_ID');
3259 
3260          -- =============== START DEBUG LOG ================
3261             DEBUG_LOG_STRING (l_proc_level, 'Set_current_position_to_subord.Msg5',
3262                               ' GetItemAttrNumber POS_STRUCTURE_VERSION_ID --> ' || l_pos_structure_version_id);
3263          -- =============== END DEBUG LOG ==================
3264 
3265          -- Get the business group
3266          l_business_group_id
3267             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
3268                                             itemkey  => itemkey,
3269                                             aname    => 'BUSINESS_GROUP_ID');
3270 
3271          -- =============== START DEBUG LOG ================
3272             DEBUG_LOG_STRING (l_proc_level, 'Set_current_position_to_subord.Msg6',
3273                               ' GetItemAttrNumber BUSINESS_GROUP_ID --> ' || l_business_group_id);
3274          -- =============== END DEBUG LOG ==================
3275 
3276          -- Get the organization_id
3277          l_organization_id
3278             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
3279                                             itemkey  => itemkey,
3280                                             aname    => 'ORGANIZATION_ID');
3281 
3282          -- =============== START DEBUG LOG ================
3283             DEBUG_LOG_STRING (l_proc_level, 'Set_current_position_to_subord.Msg7',
3284                               ' GetItemAttrNumber ORGANIZATION_ID --> ' || l_organization_id);
3285          -- =============== END DEBUG LOG ==================
3286 
3287          -- Get the subordinate position of the current position
3288          OPEN c_get_subord_pos(l_current_position_id
3289                               ,l_pos_structure_version_id
3290                               ,l_business_group_id);
3291          FETCH c_get_subord_pos INTO l_subord_position_id;
3292 
3293          -- =============== START DEBUG LOG ================
3294             DEBUG_LOG_STRING (l_proc_level, 'Set_current_position_to_subord.Msg8',
3295                               ' l_subord_position_id --> ' || l_subord_position_id);
3296          -- =============== END DEBUG LOG ==================
3297 
3298          IF (c_get_subord_pos%NOTFOUND) THEN
3299             -- =============== START DEBUG LOG ================
3300                DEBUG_LOG_STRING (l_proc_level, 'Set_current_position_to_subord.Msg9',
3301                                  ' c_get_subord_pos%NOTFOUND = TRUE resie e_no_subord_pos ');
3302             -- =============== END DEBUG LOG ==================
3303             RAISE e_no_subord_pos;
3304          END IF;
3305          CLOSE c_get_subord_pos;
3306 
3307          -- Get the name of the subordinate position
3308          SELECT name
3309          INTO   l_subord_position_name
3310          FROM   hr_all_positions_f
3311          WHERE  position_id = l_subord_position_id
3312          AND    business_group_id = l_business_group_id
3313          AND    organization_id   = l_organization_id;
3314 
3315          -- =============== START DEBUG LOG ================
3316             DEBUG_LOG_STRING (l_proc_level, 'Set_current_position_to_subord.Msg10',
3317                               ' l_subord_position_name --> ' || l_subord_position_name);
3318          -- =============== END DEBUG LOG ==================
3319 
3320          -- Set the current position id attribute to the subordinate position
3321          wf_engine.SetItemAttrNumber( itemtype => itemtype,
3322                                       itemkey  => itemkey,
3323                                       aname    => 'CURRENT_POSITION_ID',
3324                                       avalue   => l_subord_position_id);
3325 
3326          -- =============== START DEBUG LOG ================
3327             DEBUG_LOG_STRING (l_proc_level, 'Set_current_position_to_subord.Msg11',
3328                               ' SetItemAttrNumber CURRENT_POSITION_ID --> ' || l_subord_position_id);
3329          -- =============== END DEBUG LOG ==================
3330 
3331          -- Set the current position name attribute to the subordinate position
3332          wf_engine.SetItemAttrText  ( itemtype => itemtype,
3333                                       itemkey  => itemkey,
3334                                       aname    => 'CURRENT_POSITION_NAME',
3335                                       avalue   => l_subord_position_name);
3336 
3337          -- =============== START DEBUG LOG ================
3338             DEBUG_LOG_STRING (l_proc_level, 'Set_current_position_to_subord.Msg12',
3339                               ' SetItemAttrText CURRENT_POSITION_NAME --> ' || l_subord_position_name);
3340          -- =============== END DEBUG LOG ==================
3341 
3342       END IF;
3343 
3344       IF (funcmode <> 'RUN') THEN
3345          result := 'COMPLETE';
3346          -- =============== START DEBUG LOG ================
3347             DEBUG_LOG_STRING (l_proc_level, 'Set_current_position_to_subord.Msg13',
3348                               ' funcmode <> RUN -- result --> ' || result);
3349          -- =============== END DEBUG LOG ==================
3350          return;
3351       END IF;
3352 
3353       -- =============== START DEBUG LOG ================
3354          DEBUG_LOG_STRING (l_proc_level, 'Set_current_position_to_subord.Msg14',
3355                            ' ** END SET_CURRENT_POSITION_TO_SUBORD ** ');
3356       -- =============== END DEBUG LOG ==================
3357 
3358    EXCEPTION
3359       WHEN e_no_subord_pos THEN
3360          wf_core.context('IGI_EXP_APPROVAL_PKG','set_current_position_to_subord',itemtype,itemkey,
3361                          to_char(actid),funcmode,'Subordinate of current position not found in hierarchy');
3362          IF (c_get_subord_pos%ISOPEN) THEN
3363             CLOSE c_get_subord_pos;
3364          END IF;
3365          -- =============== START DEBUG LOG ================
3366             DEBUG_LOG_STRING (l_proc_level, 'Set_current_position_to_subord.Msg15',
3367                               ' EXCEPTION e_no_subord_pos - No subordinate found. ');
3368          -- =============== END DEBUG LOG ==================
3369          raise;
3370 
3371       WHEN OTHERS THEN
3372          wf_core.context('IGI_EXP_APPROVAL_PKG','set_current_position_to_subord',itemtype,itemkey,
3373                          to_char(actid),funcmode);
3374          -- =============== START DEBUG LOG ================
3375             DEBUG_LOG_UNEXP_ERROR ('Set_current_position_to_subord.Unexp1','DEFAULT');
3376          -- =============== END DEBUG LOG ==================
3377         raise;
3378 
3379    END set_current_position_to_subord;
3380 
3381 
3382 
3383    -- *************************************************************************
3384    --    SET_CURRENT_AUTH_TO_PREV_AUTH
3385    -- *************************************************************************
3386 
3387    PROCEDURE set_current_auth_to_prev_auth ( itemtype IN  VARCHAR2,
3388                                              itemkey  IN  VARCHAR2,
3389                                              actid    IN  NUMBER,
3390                                              funcmode IN  VARCHAR2,
3391                                              result   OUT NOCOPY VARCHAR2) IS
3392 
3393       l_returner_name              VARCHAR2(240);
3394       l_authorizer_history_list    VARCHAR2(1000);
3395       l_new_auth_history_list      VARCHAR2(1000);
3396       l_num1                       NUMBER;
3397       l_num2                       NUMBER;
3398       l_prev_authorizer            fnd_user.user_name%TYPE;
3399 
3400       e_no_prev_auth               EXCEPTION;
3401 
3402    BEGIN
3403 
3404       -- =============== START DEBUG LOG ================
3405          DEBUG_LOG_STRING (l_proc_level, 'Set_current_auth_to_prev_auth.Msg1',
3406                            ' ** START SET_CURRENT_AUTH_TO_PREV_AUTH ** ');
3407       -- =============== END DEBUG LOG ==================
3408 
3409       IF (funcmode = 'RUN') THEN
3410 
3411          -- Firstly, we need to find the returner of the TU
3412          -- Get the current authoriser
3413          l_returner_name
3414             := wf_engine.GetItemAttrText  ( itemtype => itemtype,
3415                                             itemkey  => itemkey,
3416                                             aname    => 'CURRENT_AUTHORIZER_ROLE');
3417 
3418          -- =============== START DEBUG LOG ================
3419             DEBUG_LOG_STRING (l_proc_level, 'Set_current_auth_to_prev_auth.Msg2',
3420                               ' GetItemAttrText CURRENT_AUTHORIZER_ROLE --> ' || l_returner_name);
3421          -- =============== END DEBUG LOG ==================
3422 
3423          -- Set the returner_name attribute
3424          wf_engine.SetItemAttrText  ( itemtype => itemtype,
3425                                       itemkey  => itemkey,
3426                                       aname    => 'RETURNER_NAME',
3427                                       avalue   => l_returner_name);
3428 
3429 
3430          -- =============== START DEBUG LOG ================
3431             DEBUG_LOG_STRING (l_proc_level, 'Set_current_auth_to_prev_auth.Msg3',
3432                               ' SetItemAttrText RETURNER_NAME --> ' || l_returner_name);
3433          -- =============== END DEBUG LOG ==================
3434 
3435          -- Now we need to remove the current authorizer from the
3436          -- authorizer history list
3437 
3438          -- Get the authorizer history list
3439          l_authorizer_history_list
3440             := wf_engine.GetItemAttrText  ( itemtype => itemtype,
3441                                             itemkey  => itemkey,
3442                                             aname    => 'AUTHORIZER_HISTORY_LIST');
3443 
3444          -- =============== START DEBUG LOG ================
3445             DEBUG_LOG_STRING (l_proc_level, 'Set_current_auth_to_prev_auth.Msg4',
3446                               ' GetItemAttrText AUTHORIZER_HISTORY_LIST --> ' || l_authorizer_history_list);
3447          -- =============== END DEBUG LOG ==================
3448 
3449          -- This will return the position of the last comma in the history list
3450          l_num1 := INSTR(l_authorizer_history_list,',',-1);
3451 
3452          -- =============== START DEBUG LOG ================
3453             DEBUG_LOG_STRING (l_proc_level, 'Set_current_auth_to_prev_auth.Msg5',
3454                               ' l_num1 -> ' || l_num1);
3455          -- =============== END DEBUG LOG ==================
3456 
3457          IF (l_num1 = 0) THEN
3458             -- =============== START DEBUG LOG ================
3459                DEBUG_LOG_STRING (l_proc_level, 'Set_current_auth_to_prev_auth.Msg6',
3460                                  ' l_num1 = 0 -- RAISE e_no_prev_auth ');
3461             -- =============== END DEBUG LOG ==================
3462             -- There is only one user in the history list, so cannot continue
3463             RAISE e_no_prev_auth;
3464          END IF;
3465 
3466          -- There is more than one authorizer in the history list, so delete
3467          -- the last authorizer by taking a substring of the original list
3468          -- up to the last comma (delimiter)
3469          l_new_auth_history_list := SUBSTR(l_authorizer_history_list,1,l_num1-1);
3470 
3471          -- =============== START DEBUG LOG ================
3472             DEBUG_LOG_STRING (l_proc_level, 'Set_current_auth_to_prev_auth.Msg7',
3473                               ' l_new_auth_history_list --> ' || l_new_auth_history_list);
3474          -- =============== END DEBUG LOG ==================
3475 
3476          -- Set the authorizer_history_list attribute
3477          wf_engine.SetItemAttrText  ( itemtype => itemtype,
3478                                       itemkey  => itemkey,
3479                                       aname    => 'AUTHORIZER_HISTORY_LIST',
3480                                       avalue   => l_new_auth_history_list);
3481 
3482          -- =============== START DEBUG LOG ================
3483             DEBUG_LOG_STRING (l_proc_level, 'Set_current_auth_to_prev_auth.Msg8',
3484                               ' SetItemAttrText AUTHORIZER_HISTORY_LIST --> ' || l_new_auth_history_list);
3485          -- =============== END DEBUG LOG ==================
3486 
3487          -- Now we need to find the previous authorizer (using the authorizer history
3488          -- list).
3489 
3490          -- This will return the position of the last comma in the new history list
3491          l_num2 := INSTR(l_new_auth_history_list,',',-1);
3492 
3493          -- =============== START DEBUG LOG ================
3494             DEBUG_LOG_STRING (l_proc_level, 'Set_current_auth_to_prev_auth.Msg9',
3495                               ' l_num2 --> ' || l_num2);
3496          -- =============== END DEBUG LOG ==================
3497 
3498          IF (l_num2 = 0) THEN
3499             -- There is only one authorizer left in new history list
3500             -- so set the previous authorizer attribute to that authorizer
3501             l_prev_authorizer := l_new_auth_history_list;
3502             -- =============== START DEBUG LOG ================
3503                DEBUG_LOG_STRING (l_proc_level, 'Set_current_auth_to_prev_auth.Msg10',
3504                                  ' l_num2 = 0 -- l_prev_authorizer --> ' || l_prev_authorizer);
3505             -- =============== END DEBUG LOG ==================
3506          ELSE
3507             -- There is more than one authorizer in the new history list, so
3508             -- get the previous authorizer by taking a substring of the new list
3509             -- up to the last comma (delimiter)
3510             l_prev_authorizer := SUBSTR(l_new_auth_history_list,l_num2+1);
3511             -- =============== START DEBUG LOG ================
3512                DEBUG_LOG_STRING (l_proc_level, 'Set_current_auth_to_prev_auth.Msg11',
3513                                  ' l_num2 != 0 -- l_prev_authorizer --> ' || l_prev_authorizer);
3514             -- =============== END DEBUG LOG ==================
3515          END IF;
3516 
3517          -- Set the current_authorizer_role attribute to the previous authorizer
3518          wf_engine.SetItemAttrText  ( itemtype => itemtype,
3519                                       itemkey  => itemkey,
3520                                       aname    => 'CURRENT_AUTHORIZER_ROLE',
3521                                       avalue   => l_prev_authorizer);
3522 
3523          -- =============== START DEBUG LOG ================
3524             DEBUG_LOG_STRING (l_proc_level, 'Set_current_auth_to_prev_auth.Msg12',
3525                               ' SetItemAttrText CURRENT_AUTHORIZER_ROLE --> ' || l_prev_authorizer);
3526          -- =============== END DEBUG LOG ==================
3527 
3528       END IF;
3529 
3530       IF (funcmode <> 'RUN') THEN
3531          result := 'COMPLETE';
3532          -- =============== START DEBUG LOG ================
3533             DEBUG_LOG_STRING (l_proc_level, 'Set_current_auth_to_prev_auth.Msg13',
3534                               ' funcmode <> RUN -- result --> ' || result);
3535          -- =============== END DEBUG LOG ==================
3536          return;
3537       END IF;
3538 
3539       -- =============== START DEBUG LOG ================
3540          DEBUG_LOG_STRING (l_proc_level, 'Set_current_auth_to_prev_auth.Msg14',
3541                            ' ** END SET_CURRENT_AUTH_TO_PREV_AUTH ** ');
3542       -- =============== END DEBUG LOG ==================
3543 
3544    EXCEPTION
3545       WHEN e_no_prev_auth THEN
3546          wf_core.context('IGI_EXP_APPROVAL_PKG','set_current_auth_to_prev_auth',itemtype,itemkey,
3547                          to_char(actid),funcmode,'No previous authorizer found in history list');
3548          -- =============== START DEBUG LOG ================
3549             DEBUG_LOG_STRING (l_proc_level, 'Set_current_auth_to_prev_auth.Msg15',
3550                               ' EXCEPTION - e_no_prev_auth - No previous authorizer ');
3551          -- =============== END DEBUG LOG ==================
3552          raise;
3553 
3554       WHEN OTHERS THEN
3555          wf_core.context('IGI_EXP_APPROVAL_PKG','set_current_auth_to_prev_auth',itemtype,itemkey,
3556                          to_char(actid),funcmode);
3557          -- =============== START DEBUG LOG ================
3558             DEBUG_LOG_UNEXP_ERROR ('Set_current_auth_to_prev_auth.Unexp1','DEFAULT');
3559          -- =============== END DEBUG LOG ==================
3560          raise;
3561 
3562    END set_current_auth_to_prev_auth;
3563 
3564 
3565    -- *************************************************************************
3566    --    RESET_DU_STATUSES
3567    -- *************************************************************************
3568 
3569    PROCEDURE reset_du_statuses    ( itemtype IN  VARCHAR2,
3570                                     itemkey  IN  VARCHAR2,
3571                                     actid    IN  NUMBER,
3572                                     funcmode IN  VARCHAR2,
3573                                     result   OUT NOCOPY VARCHAR2) IS
3574 
3575       l_tu_id   igi_exp_tus.tu_id%TYPE;
3576 
3577    BEGIN
3578 
3579       -- =============== START DEBUG LOG ================
3580          DEBUG_LOG_STRING (l_proc_level, 'Reset_du_statuses.Msg1',
3581                            ' ** START RESET_DU_STATUSES ** ');
3582       -- =============== END DEBUG LOG ==================
3583 
3584      IF (funcmode = 'RUN') THEN
3585 
3586          -- If the returner made any changes to the dialog unit statuses
3587          -- through the transmission unit form and then decided to return
3588          -- the TU, we need to reset the dialog unit statuses to their
3589          -- original state.  If the dialog unit has been put on hold 'HLD'
3590          -- then the original state would be Approved.
3591          -- If the dialog unit has been rejected and there still exist
3592          -- transactions within it then the original state would be
3593          -- Approved.
3594          -- Also, if the returner made no changes to the dialog unit statuses:
3595          -- If the dialog unit has a status of 'Approved and Transmitted'
3596          -- then the original state would be Approved.  (We need to change
3597          -- the dialog unit statuses back to approved for returned dialog
3598          -- units so that the authorizer who receives the returned TU
3599          -- does not have to update all the dialog units to approved again
3600          -- (They already approved the dialog units when they first received
3601          -- the approval request).
3602 
3603          -- Get the TU id
3604          l_tu_id
3605             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
3606                                             itemkey  => itemkey,
3607                                             aname    => 'TU_ID');
3608 
3609          -- =============== START DEBUG LOG ================
3610             DEBUG_LOG_STRING (l_proc_level, 'Reset_du_statuses.Msg2',
3611                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
3612          -- =============== END DEBUG LOG ==================
3613 
3614          -- Change the status of the dialog units on hold
3615          UPDATE igi_exp_dus dus
3616          SET    dus.du_status = 'APP'
3617          WHERE  dus.du_status = 'HLD'
3618          AND    dus.tu_id = l_tu_id;
3619 
3620          -- =============== START DEBUG LOG ================
3621             DEBUG_LOG_STRING (l_proc_level, 'Reset_du_statuses.Msg3',
3622                               ' UPDATE igi_exp_dus dus HLD to APP ' || SQL%ROWCOUNT);
3623          -- =============== END DEBUG LOG ==================
3624 
3625          -- Change the status of dialog units which have been rejected
3626          -- but still contain transactions.
3627          UPDATE igi_exp_dus dus
3628          SET    dus.du_status = 'APP'
3629          WHERE  dus.du_status = 'REJ'
3630          AND    dus.tu_id = l_tu_id
3631          AND EXISTS (SELECT 'AR'
3632                      FROM   igi_exp_ar_trans ar
3633                      WHERE  ar.du_id = dus.du_id
3634                      UNION
3635                      SELECT 'AP'
3636                      FROM   igi_exp_ap_trans ap
3637                      WHERE  ap.du_id = dus.du_id);
3638 
3639          -- =============== START DEBUG LOG ================
3640             DEBUG_LOG_STRING (l_proc_level, 'Reset_du_statuses.Msg4',
3641                               ' UPDATE igi_exp_dus status - REJ to APP' || SQL%ROWCOUNT);
3642          -- =============== END DEBUG LOG ==================
3643 
3644          -- Change the status of the dialog units which are in status
3645          -- approved and transmitted
3646          UPDATE igi_exp_dus dus
3647          SET    dus.du_status = 'APP'
3648          WHERE  dus.du_status = 'ATR'
3649          AND    dus.tu_id = l_tu_id;
3650 
3651          -- =============== START DEBUG LOG ================
3652             DEBUG_LOG_STRING (l_proc_level, 'Reset_du_statuses.Msg5',
3653                               ' UPDATE igi_exp_dus status -- ATR to APP ' || SQL%ROWCOUNT);
3654          -- =============== END DEBUG LOG ==================
3655 
3656       END IF;
3657 
3658       IF (funcmode <> 'RUN') THEN
3659          result := 'COMPLETE';
3660          -- =============== START DEBUG LOG ================
3661             DEBUG_LOG_STRING (l_proc_level, 'Reset_du_statuses.Msg6',
3662                               ' funcmode <> RUN -- result --> ' || result);
3663          -- =============== END DEBUG LOG ==================
3664          return;
3665       END IF;
3666 
3667       -- =============== START DEBUG LOG ================
3668          DEBUG_LOG_STRING (l_proc_level, 'Reset_du_statuses.Msg7',
3669                            ' ** END RESET_DU_STATUSES ** ');
3670       -- =============== END DEBUG LOG ==================
3671 
3672    EXCEPTION
3673       WHEN OTHERS THEN
3674          wf_core.context('IGI_EXP_APPROVAL_PKG','reset_du_statuses',itemtype,itemkey,
3675                          to_char(actid),funcmode);
3676          -- =============== START DEBUG LOG ================
3677             DEBUG_LOG_UNEXP_ERROR ('Reset_du_statuses.Unexp1','DEFAULT');
3678          -- =============== END DEBUG LOG ==================
3679          raise;
3680 
3681    END reset_du_statuses;
3682 
3683 
3684 
3685    -- *************************************************************************
3686    --    CHECK_DUS_ACTIONED
3687    -- *************************************************************************
3688 
3689    PROCEDURE check_dus_actioned   ( itemtype IN  VARCHAR2,
3690                                     itemkey  IN  VARCHAR2,
3691                                     actid    IN  NUMBER,
3692                                     funcmode IN  VARCHAR2,
3693                                     result   OUT NOCOPY VARCHAR2) IS
3694 
3695       l_tu_id       igi_exp_tus.tu_id%TYPE;
3696       l_no_of_dus   NUMBER;
3697 
3698    BEGIN
3699 
3700       -- =============== START DEBUG LOG ================
3701          DEBUG_LOG_STRING (l_proc_level, 'Check_dus_actioned.Msg1',
3702                            ' ** START CHECK_DUS_ACTIONED ** ');
3703       -- =============== END DEBUG LOG ==================
3704 
3705       IF (funcmode = 'RUN') THEN
3706 
3707          -- Get the TU id
3708          l_tu_id
3709             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
3710                                             itemkey  => itemkey,
3711                                             aname    => 'TU_ID');
3712 
3713          -- =============== START DEBUG LOG ================
3714             DEBUG_LOG_STRING (l_proc_level, 'Check_dus_actioned.Msg2',
3715                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
3716          -- =============== END DEBUG LOG ==================
3717 
3718          -- Check that all the DUs in the TU have been actioned
3719          -- i.e. that they have been set to a status of Approved(APP)
3720          -- Rejected (REJ) or On Hold (HLD)
3721          SELECT count(*)
3722          INTO   l_no_of_dus
3723          FROM   igi_exp_dus
3724          WHERE  tu_id = l_tu_id
3725          AND    du_status NOT IN ('APP','REJ','HLD');
3726 
3727          -- =============== START DEBUG LOG ================
3728             DEBUG_LOG_STRING (l_proc_level, 'Check_dus_actioned.Msg3',
3729                               ' l_no_of_dus --> '|| l_no_of_dus);
3730          -- =============== END DEBUG LOG ==================
3731 
3732          IF (l_no_of_dus <> 0) THEN
3733             -- At least one du has not been actioned
3734             -- Set the result to 'Yes'
3735             result := 'COMPLETE:Y';
3736          ELSE
3737             -- All the dus have been actioned
3738             -- Set the result to 'No'
3739             result := 'COMPLETE:N';
3740          END IF;
3741 
3742          -- =============== START DEBUG LOG ================
3743             DEBUG_LOG_STRING (l_proc_level, 'Check_dus_actioned.Msg4',
3744                               ' result --> ' || result);
3745          -- =============== END DEBUG LOG ==================
3746 
3747       END IF;
3748 
3749       IF (funcmode <> 'RUN') THEN
3750          result := 'COMPLETE';
3751          -- =============== START DEBUG LOG ================
3752             DEBUG_LOG_STRING (l_proc_level, 'Check_dus_actioned.Msg5',
3753                               ' funcmode <> RUN -- result --> ' || result);
3754          -- =============== END DEBUG LOG ==================
3755          return;
3756       END IF;
3757 
3758       -- =============== START DEBUG LOG ================
3759          DEBUG_LOG_STRING (l_proc_level, 'Check_dus_actioned.Msg6',
3760                            ' ** END CHECK_DUS_ACTIONED ** ');
3761       -- =============== END DEBUG LOG ==================
3762 
3763    EXCEPTION
3764       WHEN OTHERS THEN
3765          wf_core.context('IGI_EXP_APPROVAL_PKG','check_dus_actioned',itemtype,itemkey,
3766                          to_char(actid),funcmode);
3767          -- =============== START DEBUG LOG ================
3768             DEBUG_LOG_UNEXP_ERROR ('Check_dus_actioned.Unexp1','DEFAULT');
3769          -- =============== END DEBUG LOG ==================
3770          raise;
3771 
3772    END check_dus_actioned;
3773 
3774 
3775    -- *************************************************************************
3776    --    SET_DUS_TO_ATR
3777    -- *************************************************************************
3778 
3779    PROCEDURE set_dus_to_atr       ( itemtype IN  VARCHAR2,
3780                                     itemkey  IN  VARCHAR2,
3781                                     actid    IN  NUMBER,
3782                                     funcmode IN  VARCHAR2,
3783                                     result   OUT NOCOPY VARCHAR2) IS
3784 
3785       l_tu_id   igi_exp_tus.tu_id%TYPE;
3786 
3787    BEGIN
3788 
3789       -- =============== START DEBUG LOG ================
3790          DEBUG_LOG_STRING (l_proc_level, 'Set_dus_to_atr.Msg1',
3791                            ' ** START SET_DUS_TO_ATR ** ');
3792       -- =============== END DEBUG LOG ==================
3793 
3794       IF (funcmode = 'RUN') THEN
3795 
3796          -- Need to set approved DUs to status 'Approved and Transmitted'
3797          -- Get the TU id
3798          l_tu_id
3799             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
3800                                             itemkey  => itemkey,
3801                                             aname    => 'TU_ID');
3802 
3803          -- =============== START DEBUG LOG ================
3804             DEBUG_LOG_STRING (l_proc_level, 'Set_dus_to_atr.Msg2',
3805                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
3806          -- =============== END DEBUG LOG ==================
3807 
3808          UPDATE igi_exp_dus
3809          SET    du_status = 'ATR'
3810          WHERE  du_status = 'APP'
3811          AND    tu_id = l_tu_id;
3812 
3813          -- =============== START DEBUG LOG ================
3814             DEBUG_LOG_STRING (l_proc_level, 'Set_dus_to_atr.Msg3',
3815                               ' UPDATE igi_exp_dus APP - ATR');
3816          -- =============== END DEBUG LOG ==================
3817 
3818       END IF;
3819 
3820       IF (funcmode <> 'RUN') THEN
3821          result := 'COMPLETE';
3822          -- =============== START DEBUG LOG ================
3823             DEBUG_LOG_STRING (l_proc_level, 'Set_dus_to_atr.Msg4',
3824                               ' funcmode <> RUN  -- result --> ' || result);
3825          -- =============== END DEBUG LOG ==================
3826          return;
3827       END IF;
3828 
3829       -- =============== START DEBUG LOG ================
3830          DEBUG_LOG_STRING (l_proc_level, 'Set_dus_to_atr.Msg5',
3831                            ' ** END SET_DUS_TO_ATR ** ');
3832       -- =============== END DEBUG LOG ==================
3833 
3834    EXCEPTION
3835       WHEN OTHERS THEN
3836          wf_core.context('IGI_EXP_APPROVAL_PKG','set_dus_to_atr',itemtype,itemkey,
3837                          to_char(actid),funcmode);
3838          -- =============== START DEBUG LOG ================
3839             DEBUG_LOG_UNEXP_ERROR ('Set_dus_to_atr.Unexp1','DEFAULT');
3840          -- =============== END DEBUG LOG ==================
3841          raise;
3842    END set_dus_to_atr;
3843 
3844    -- *************************************************************************
3845    --    LIST_ANY_DUS_ON_HOLD
3846    -- *************************************************************************
3847 
3848    PROCEDURE list_any_dus_on_hold ( itemtype IN  VARCHAR2,
3849                                     itemkey  IN  VARCHAR2,
3850                                     actid    IN  NUMBER,
3851                                     funcmode IN  VARCHAR2,
3852                                     result   OUT NOCOPY VARCHAR2)
3853    IS
3854 
3855 
3856       CURSOR c_du_hold_info(p_tu_id igi_exp_dus.tu_id%TYPE)
3857       IS
3858          SELECT du_order_number
3859                ,du_legal_number
3860          FROM   igi_exp_dus
3861          WHERE  tu_id = p_tu_id
3862          AND    du_status = 'HLD';
3863 
3864       l_tu_id         igi_exp_dus.tu_id%TYPE;
3865       l_hold_count    NUMBER;
3866       l_du_hold_list  VARCHAR2(28000);
3867 
3868    BEGIN
3869 
3870       -- =============== START DEBUG LOG ================
3871          DEBUG_LOG_STRING (l_proc_level, 'List_any_dus_on_hold.Msg1',
3872                            ' ** START LIST_ANY_DUS_ON_HOLD ** ');
3873       -- =============== END DEBUG LOG ==================
3874 
3875       IF (funcmode = 'RUN') THEN
3876 
3877          -- Get the TU id
3878          l_tu_id
3879             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
3880                                             itemkey  => itemkey,
3881                                             aname    => 'TU_ID');
3882 
3883          -- =============== START DEBUG LOG ================
3884             DEBUG_LOG_STRING (l_proc_level, 'List_any_dus_on_hold.Msg2',
3885                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
3886          -- =============== END DEBUG LOG ==================
3887 
3888          SELECT count(*)
3889          INTO   l_hold_count
3890          FROM   igi_exp_dus
3891          WHERE  du_status = 'HLD'
3892          AND    tu_id = l_tu_id;
3893 
3894          -- =============== START DEBUG LOG ================
3895             DEBUG_LOG_STRING (l_proc_level, 'List_any_dus_on_hold.Msg3',
3896                               ' l_hold_count --> ' || l_hold_count);
3897          -- =============== END DEBUG LOG ==================
3898 
3899          IF (l_hold_count = 0) THEN
3900             -- No DUs have been put on hold
3901             -- Set result to 'No'
3902             result := 'COMPLETE:N';
3903             -- =============== START DEBUG LOG ================
3904                DEBUG_LOG_STRING (l_proc_level, 'List_any_dus_on_hold.Msg4',
3905                                  ' l_hold_count = 0 -- result --> ' || result);
3906             -- =============== END DEBUG LOG ==================
3907 
3908          ELSE
3909             -- At least one DU has been put on hold
3910             -- Need to create a list of numbers of all DUs put on hold
3911             -- for including in the notification
3912 
3913 
3914             FOR I IN c_du_hold_info(l_tu_id)
3915             LOOP
3916 
3917                IF (l_du_hold_list is NULL) THEN
3918                   l_du_hold_list := I.du_order_number;
3919                ELSE
3920                   l_du_hold_list := l_du_hold_list ||I.du_order_number;
3921                END IF;
3922 
3923                -- =============== START DEBUG LOG ================
3924                   DEBUG_LOG_STRING (l_proc_level, 'List_any_dus_on_hold.Msg5',
3925                                     ' du_order_number --> ' || I.du_order_number);
3926                -- =============== END DEBUG LOG ==================
3927 
3928                IF (I.du_legal_number is not null) THEN
3929                   l_du_hold_list := l_du_hold_list||' ('||I.du_legal_number||')';
3930                END IF;
3931 
3932                -- =============== START DEBUG LOG ================
3933                   DEBUG_LOG_STRING (l_proc_level, 'List_any_dus_on_hold.Msg6',
3934                                     ' I.du_legal_number --> ' || I.du_legal_number);
3935                -- =============== END DEBUG LOG ==================
3936 
3937                l_du_hold_list := l_du_hold_list||fnd_global.local_chr(10);
3938 
3939                IF LENGTH(l_du_hold_list) > 28000 THEN
3940                   exit;
3941                END IF;
3942 
3943             END LOOP;
3944 
3945            -- Set the all_dus_list attribute
3946             wf_engine.SetItemAttrText  ( itemtype => itemtype,
3947                                          itemkey  => itemkey,
3948                                          aname    => 'ADD_ATTR1',
3949                                          avalue   => substr(l_du_hold_list, 1, 4000));
3950 
3951             -- =============== START DEBUG LOG ================
3952                DEBUG_LOG_STRING (l_proc_level, 'List_any_dus_on_hold.Msg7',
3953                                  ' SetItemAttrText ADD_ATTR1 --> ' || substr(l_du_hold_list, 1, 4000));
3954             -- =============== END DEBUG LOG ==================
3955 
3956             wf_engine.SetItemAttrText  ( itemtype => itemtype,
3957                                          itemkey  => itemkey,
3958                                          aname    => 'ADD_ATTR2',
3959                                          avalue   => substr(l_du_hold_list, 4001, 4000));
3960 
3961             -- =============== START DEBUG LOG ================
3962                DEBUG_LOG_STRING (l_proc_level, 'List_any_dus_on_hold.Msg8',
3963                                  ' SetItemAttrText ADD_ATTR2 --> ' || substr(l_du_hold_list, 4001, 4000));
3964             -- =============== END DEBUG LOG ==================
3965 
3966             wf_engine.SetItemAttrText  ( itemtype => itemtype,
3967                                          itemkey  => itemkey,
3968                                          aname    => 'ADD_ATTR3',
3969                                          avalue   => substr(l_du_hold_list, 8001, 4000));
3970 
3971             -- =============== START DEBUG LOG ================
3972                DEBUG_LOG_STRING (l_proc_level, 'List_any_dus_on_hold.Msg9',
3973                                  ' SetItemAttrText ADD_ATTR3 --> ' || substr(l_du_hold_list, 8001, 4000));
3974             -- =============== END DEBUG LOG ==================
3975 
3976             wf_engine.SetItemAttrText  ( itemtype => itemtype,
3977                                          itemkey  => itemkey,
3978                                          aname    => 'ADD_ATTR4',
3979                                          avalue   => substr(l_du_hold_list, 12001, 4000));
3980 
3981             -- =============== START DEBUG LOG ================
3982                DEBUG_LOG_STRING (l_proc_level, 'List_any_dus_on_hold.Msg10',
3983                                  ' SetItemAttrText ADD_ATTR4 --> ' || substr(l_du_hold_list, 12001, 4000));
3984             -- =============== END DEBUG LOG ==================
3985 
3986             wf_engine.SetItemAttrText  ( itemtype => itemtype,
3987                                          itemkey  => itemkey,
3988                                          aname    => 'ADD_ATTR5',
3989                                          avalue   => substr(l_du_hold_list, 16001, 4000));
3990 
3991             -- =============== START DEBUG LOG ================
3992                DEBUG_LOG_STRING (l_proc_level, 'List_any_dus_on_hold.Msg11',
3993                                  ' SetItemAttrText ADD_ATTR5 --> ' || substr(l_du_hold_list, 16001, 4000));
3994             -- =============== END DEBUG LOG ==================
3995 
3996             wf_engine.SetItemAttrText  ( itemtype => itemtype,
3997                                          itemkey  => itemkey,
3998                                          aname    => 'ADD_ATTR6',
3999                                          avalue   => substr(l_du_hold_list, 20001, 4000));
4000 
4001             -- =============== START DEBUG LOG ================
4002                DEBUG_LOG_STRING (l_proc_level, 'List_any_dus_on_hold.Msg12',
4003                                  ' SetItemAttrText ADD_ATTR6 --> ' || substr(l_du_hold_list, 20001, 4000));
4004             -- =============== END DEBUG LOG ==================
4005 
4006             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4007                                          itemkey  => itemkey,
4008                                          aname    => 'ADD_ATTR7',
4009                                          avalue   => substr(l_du_hold_list, 24001, 4000));
4010 
4011 
4012             -- =============== START DEBUG LOG ================
4013                DEBUG_LOG_STRING (l_proc_level, 'List_any_dus_on_hold.Msg13',
4014                                  ' SetItemAttrText ADD_ATTR7 --> ' || substr(l_du_hold_list, 24001, 4000));
4015             -- =============== END DEBUG LOG ==================
4016 
4017             -- Set the all_dus_list attribute
4018             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4019                                          itemkey  => itemkey,
4020                                          aname    => 'ALL_DUS_LIST',
4021                                          avalue   => 'plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
4022 
4023             -- =============== START DEBUG LOG ================
4024                DEBUG_LOG_STRING (l_proc_level, 'List_any_dus_on_hold.Msg14',
4025                                  ' SetItemAttrText ALL_DUS_LIST --> ' ||
4026                                  ' plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
4027             -- =============== END DEBUG LOG ==================
4028 
4029 
4030             -- Set the result to 'Yes'
4031             result := 'COMPLETE:Y';
4032 
4033             -- =============== START DEBUG LOG ================
4034                DEBUG_LOG_STRING (l_proc_level, 'List_any_dus_on_hold.Msg15',
4035                                  ' result --> ' || result);
4036             -- =============== END DEBUG LOG ==================
4037 
4038          END IF;
4039 
4040       END IF;
4041 
4042       IF (funcmode <> 'RUN') THEN
4043          result := 'COMPLETE';
4044          -- =============== START DEBUG LOG ================
4045             DEBUG_LOG_STRING (l_proc_level, 'List_any_dus_on_hold.Msg16',
4046                               ' funcmode <> RUN -- result --> ' || result);
4047          -- =============== END DEBUG LOG ==================
4048          return;
4049       END IF;
4050 
4051       -- =============== START DEBUG LOG ================
4052          DEBUG_LOG_STRING (l_proc_level, 'List_any_dus_on_hold.Msg17',
4053                            ' ** END LIST_ANY_DUS_ON_HOLD ** ');
4054       -- =============== END DEBUG LOG ==================
4055 
4056    EXCEPTION
4057       WHEN OTHERS THEN
4058          wf_core.context('IGI_EXP_APPROVAL_PKG','list_any_dus_on_hold',itemtype,itemkey,
4059                          to_char(actid),funcmode);
4060          -- =============== START DEBUG LOG ================
4061             DEBUG_LOG_UNEXP_ERROR ('List_any_dus_on_hold.Unexp1','DEFAULT');
4062          -- =============== END DEBUG LOG ==================
4063          raise;
4064 
4065    END list_any_dus_on_hold;
4066 
4067 
4068    -- *************************************************************************
4069    --    GET_NEXT_DU_ON_HOLD
4070    -- *************************************************************************
4071 
4072    PROCEDURE get_next_du_on_hold  ( itemtype IN  VARCHAR2,
4073                                     itemkey  IN  VARCHAR2,
4074                                     actid    IN  NUMBER,
4075                                     funcmode IN  VARCHAR2,
4076                                     result   OUT NOCOPY VARCHAR2) IS
4077 
4078       CURSOR c_next_du_hld(p_tu_id igi_exp_dus.tu_id%TYPE)
4079       IS
4080          SELECT du_id
4081                ,du_by_user_id
4082          FROM   igi_exp_dus
4083          WHERE  tu_id = p_tu_id
4084          AND    du_status = 'HLD'
4085          AND    rownum = 1;
4086 
4087       CURSOR c_du_info(p_tu_id igi_exp_dus.tu_id%TYPE
4088                       ,p_du_preparer_id igi_exp_dus.du_by_user_id%TYPE)
4089       IS
4090          SELECT du_order_number
4091                ,du_legal_number
4092          FROM   igi_exp_dus
4093          WHERE  tu_id = p_tu_id
4094          AND    du_status = 'HLD'
4095          AND    du_by_user_id = p_du_preparer_id;
4096 
4097       l_tu_id            igi_exp_dus.tu_id%TYPE;
4098       l_du_id            igi_exp_dus.du_id%TYPE;
4099       l_du_prep_id       igi_exp_dus.du_by_user_id%TYPE;
4100       l_du_prep_name     fnd_user.user_name%TYPE;
4101       l_du_by_prep_list  VARCHAR2(28000);
4102 
4103    BEGIN
4104 
4105       -- =============== START DEBUG LOG ================
4106          DEBUG_LOG_STRING (l_proc_level, 'Get_next_du_on_hold.Msg1',
4107                            ' ** START GET_NEXT_DU_ON_HOLD  ** ');
4108       -- =============== END DEBUG LOG ==================
4109 
4110       IF (funcmode = 'RUN') THEN
4111 
4112          -- Get the TU id
4113          l_tu_id
4114             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
4115                                             itemkey  => itemkey,
4116                                             aname    => 'TU_ID');
4117 
4118          -- =============== START DEBUG LOG ================
4119             DEBUG_LOG_STRING (l_proc_level, 'Get_next_du_on_hold.Msg2',
4120                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
4121          -- =============== END DEBUG LOG ==================
4122 
4123          OPEN  c_next_du_hld(l_tu_id);
4124          FETCH c_next_du_hld INTO l_du_id,l_du_prep_id;
4125 
4126          -- =============== START DEBUG LOG ================
4127             DEBUG_LOG_STRING (l_proc_level, 'Get_next_du_on_hold.Msg3',
4128                               ' l_du_id --> ' || l_du_id ||
4129                               ' l_du_prep_id --> ' || l_du_prep_id );
4130          -- =============== END DEBUG LOG ==================
4131 
4132          IF c_next_du_hld%NOTFOUND THEN
4133             result := 'COMPLETE:NO_DUS_IN_LIST';
4134             -- =============== START DEBUG LOG ================
4135                DEBUG_LOG_STRING (l_proc_level, 'Get_next_du_on_hold.Msg4',
4136                                  ' c_next_du_hld%NOTFOUND -- result --> ' || result );
4137             -- =============== END DEBUG LOG ==================
4138 
4139          ELSE
4140 
4141             -- The next DU has been fetched
4142             -- Set the temp_du_preparer_id attribute
4143             wf_engine.SetItemAttrNumber( itemtype => itemtype,
4144                                          itemkey  => itemkey,
4145                                          aname    => 'TEMP_DU_PREPARER_ID',
4146                                          avalue   => l_du_prep_id);
4147 
4148             -- =============== START DEBUG LOG ================
4149                DEBUG_LOG_STRING (l_proc_level, 'Get_next_du_on_hold.Msg5',
4150                                  ' SetItemAttrNumber TEMP_DU_PREPARER_ID --> ' || l_du_prep_id);
4151             -- =============== END DEBUG LOG ==================
4152 
4153             -- Get the name of the preparer to send the notification to
4154             SELECT user_name
4155             INTO   l_du_prep_name
4156             FROM   fnd_user
4157             WHERE  user_id = l_du_prep_id;
4158 
4159             -- =============== START DEBUG LOG ================
4160                DEBUG_LOG_STRING (l_proc_level, 'Get_next_du_on_hold.Msg6',
4161                                  ' l_du_prep_name --> ' || l_du_prep_name);
4162             -- =============== END DEBUG LOG ==================
4163 
4164             -- Set the temp_du_preparer_name attribute
4165             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4166                                          itemkey  => itemkey,
4167                                          aname    => 'TEMP_DU_PREPARER_NAME',
4168                                          avalue   => l_du_prep_name);
4169 
4170             -- =============== START DEBUG LOG ================
4171                DEBUG_LOG_STRING (l_proc_level, 'Get_next_du_on_hold.Msg7',
4172                                  ' SetItemAttrText TEMP_DU_PREPARER_NAME --> ' || l_du_prep_name );
4173             -- =============== END DEBUG LOG ==================
4174 
4175             -- Find all 'On Hold' DUs prepared by this user and create list
4176             -- to use in notification
4177 
4178             FOR I IN c_du_info(l_tu_id,l_du_prep_id)
4179             LOOP
4180 
4181                IF (l_du_by_prep_list is NULL) THEN
4182                   l_du_by_prep_list := I.du_order_number;
4183                ELSE
4184                   l_du_by_prep_list := l_du_by_prep_list ||I.du_order_number;
4185                END IF;
4186 
4187                -- =============== START DEBUG LOG ================
4188                   DEBUG_LOG_STRING (l_proc_level, 'Get_next_du_on_hold.Msg8',
4189                                     ' I.du_order_number --> ' || I.du_order_number);
4190                -- =============== END DEBUG LOG ==================
4191 
4192                IF (I.du_legal_number is not null) THEN
4193                   l_du_by_prep_list := l_du_by_prep_list||' ('||I.du_legal_number||')';
4194                END IF;
4195 
4196                -- =============== START DEBUG LOG ================
4197                   DEBUG_LOG_STRING (l_proc_level, 'Get_next_du_on_hold.Msg9',
4198                                     ' I.du_legal_number --> ' || I.du_legal_number);
4199                -- =============== END DEBUG LOG ==================
4200 
4201                l_du_by_prep_list := l_du_by_prep_list||fnd_global.local_chr(10);
4202 
4203                IF LENGTH(l_du_by_prep_list) > 28000 THEN
4204                   exit;
4205                END IF;
4206 
4207             END LOOP;
4208 
4209            -- Set the all_dus_list attribute
4210             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4211                                          itemkey  => itemkey,
4212                                          aname    => 'ADD_ATTR1',
4213                                          avalue   => substr(l_du_by_prep_list, 1, 4000));
4214 
4215             -- =============== START DEBUG LOG ================
4216                DEBUG_LOG_STRING (l_proc_level, 'Get_next_du_on_hold.Msg10',
4217                                  ' SetItemAttrText ADD_ATTR1 --> ' || substr(l_du_by_prep_list, 1, 4000));
4218             -- =============== END DEBUG LOG ==================
4219 
4220             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4221                                          itemkey  => itemkey,
4222                                          aname    => 'ADD_ATTR2',
4223                                          avalue   => substr(l_du_by_prep_list, 4001, 4000));
4224 
4225             -- =============== START DEBUG LOG ================
4226                DEBUG_LOG_STRING (l_proc_level, 'Get_next_du_on_hold.Msg11',
4227                                  ' SetItemAttrText ADD_ATTR2 --> ' || substr(l_du_by_prep_list, 4001, 4000));
4228             -- =============== END DEBUG LOG ==================
4229 
4230             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4231                                          itemkey  => itemkey,
4232                                          aname    => 'ADD_ATTR3',
4233                                          avalue   => substr(l_du_by_prep_list, 8001, 4000));
4234 
4235             -- =============== START DEBUG LOG ================
4236                DEBUG_LOG_STRING (l_proc_level, 'Get_next_du_on_hold.Msg12',
4237                                  ' SetItemAttrText ADD_ATTR3 --> ' || substr(l_du_by_prep_list, 8001, 4000));
4238             -- =============== END DEBUG LOG ==================
4239 
4240             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4241                                          itemkey  => itemkey,
4242                                          aname    => 'ADD_ATTR4',
4243                                          avalue   => substr(l_du_by_prep_list, 12001, 4000));
4244 
4245             -- =============== START DEBUG LOG ================
4246                DEBUG_LOG_STRING (l_proc_level, 'Get_next_du_on_hold.Msg13',
4247                                  ' SetItemAttrText ADD_ATTR4 --> ' || substr(l_du_by_prep_list, 12001, 4000));
4248             -- =============== END DEBUG LOG ==================
4249 
4250             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4251                                          itemkey  => itemkey,
4252                                          aname    => 'ADD_ATTR5',
4253                                          avalue   => substr(l_du_by_prep_list, 16001, 4000));
4254 
4255             -- =============== START DEBUG LOG ================
4256                DEBUG_LOG_STRING (l_proc_level, 'Get_next_du_on_hold.Msg14',
4257                                  ' SetItemAttrText ADD_ATTR5 --> ' || substr(l_du_by_prep_list, 16001, 4000));
4258             -- =============== END DEBUG LOG ==================
4259 
4260             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4261                                          itemkey  => itemkey,
4262                                          aname    => 'ADD_ATTR6',
4263                                          avalue   => substr(l_du_by_prep_list, 20001, 4000));
4264 
4265             -- =============== START DEBUG LOG ================
4266                DEBUG_LOG_STRING (l_proc_level, 'Get_next_du_on_hold.Msg15',
4267                                  ' SetItemAttrText ADD_ATTR6 --> ' || substr(l_du_by_prep_list, 20001, 4000));
4268             -- =============== END DEBUG LOG ==================
4269 
4270             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4271                                          itemkey  => itemkey,
4272                                          aname    => 'ADD_ATTR7',
4273                                          avalue   => substr(l_du_by_prep_list, 24001, 4000));
4274 
4275 
4276             -- =============== START DEBUG LOG ================
4277                DEBUG_LOG_STRING (l_proc_level, 'Get_next_du_on_hold.Msg16',
4278                                  ' SetItemAttrText ADD_ATTR7 --> ' || substr(l_du_by_prep_list, 24001, 4000));
4279             -- =============== END DEBUG LOG ==================
4280 
4281             -- Set the temp_du_by_prep_list attribute
4282             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4283                                          itemkey  => itemkey,
4284                                          aname    => 'TEMP_DU_BY_PREP_LIST',
4285                                          avalue   => 'plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
4286 
4287             -- =============== START DEBUG LOG ================
4288                DEBUG_LOG_STRING (l_proc_level, 'Get_next_du_on_hold.Msg17',
4289                                  ' SetItemAttrText TEMP_DU_BY_PREP_LIST --> ' ||
4290                                  'plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
4291             -- =============== END DEBUG LOG ==================
4292 
4293             -- Set the result to 'Next DU Fetched'
4294             result := 'COMPLETE:NEXT_DU_FETCHED';
4295 
4296             -- =============== START DEBUG LOG ================
4297                DEBUG_LOG_STRING (l_proc_level, 'Get_next_du_on_hold.Msg18',
4298                                  ' result --> ' || result);
4299             -- =============== END DEBUG LOG ==================
4300 
4301          END IF;
4302 
4303          IF (c_next_du_hld%ISOPEN) THEN
4304             CLOSE c_next_du_hld;
4305          END IF;
4306 
4307       END IF;
4308 
4309       IF (funcmode <> 'RUN') THEN
4310          result := 'COMPLETE';
4311          -- =============== START DEBUG LOG ================
4312             DEBUG_LOG_STRING (l_proc_level, 'Get_next_du_on_hold.Msg19',
4313                               'funcmode <> RUN -- result --> ' || result);
4314          -- =============== END DEBUG LOG ==================
4315          return;
4316       END IF;
4317 
4318       -- =============== START DEBUG LOG ================
4319          DEBUG_LOG_STRING (l_proc_level, 'Get_next_du_on_hold.Msg20',
4320                            ' ** END GET_NEXT_DU_ON_HOLD  ** ');
4321       -- =============== END DEBUG LOG ==================
4322 
4323    EXCEPTION
4324       WHEN OTHERS THEN
4325          wf_core.context('IGI_EXP_APPROVAL_PKG','get_next_du_on_hold',itemtype,itemkey,
4326                          to_char(actid),funcmode);
4327          -- =============== START DEBUG LOG ================
4328             DEBUG_LOG_UNEXP_ERROR ('Get_next_du_on_hold.Unexp1','DEFAULT');
4329          -- =============== END DEBUG LOG ==================
4330          raise;
4331 
4332    END get_next_du_on_hold;
4333 
4334 
4335    -- *************************************************************************
4336    --    REMOVE_DUS_ON_HOLD
4337    -- *************************************************************************
4338 
4339    PROCEDURE remove_dus_on_hold   ( itemtype IN  VARCHAR2,
4340                                     itemkey  IN  VARCHAR2,
4341                                     actid    IN  NUMBER,
4342                                     funcmode IN  VARCHAR2,
4343                                     result   OUT NOCOPY VARCHAR2) IS
4344 
4345       l_tu_id      igi_exp_dus.tu_id%TYPE;
4346       l_du_prep_id igi_exp_dus.du_by_user_id%TYPE;
4347       l_du_amount  igi_exp_dus.du_amount%TYPE;
4348 
4349    BEGIN
4350 
4351       -- =============== START DEBUG LOG ================
4352          DEBUG_LOG_STRING (l_proc_level, 'Remove_dus_on_hold.Msg1',
4353                            ' ** START REMOVE_DUS_ON_HOLD  ** ');
4354       -- =============== END DEBUG LOG ==================
4355 
4356       IF (funcmode = 'RUN') THEN
4357 
4358          -- Get the TU id
4359          l_tu_id
4360             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
4361                                             itemkey  => itemkey,
4362                                             aname    => 'TU_ID');
4363 
4364          -- =============== START DEBUG LOG ================
4365             DEBUG_LOG_STRING (l_proc_level, 'Remove_dus_on_hold.Msg2',
4366                               ' GetItemAttrNumber TU_ID --> '|| l_tu_id);
4367          -- =============== END DEBUG LOG ==================
4368 
4369          -- Get the DU Preparer id
4370          l_du_prep_id
4371             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
4372                                             itemkey  => itemkey,
4373                                             aname    => 'TEMP_DU_PREPARER_ID');
4374 
4375          -- =============== START DEBUG LOG ================
4376             DEBUG_LOG_STRING (l_proc_level, 'Remove_dus_on_hold.Msg3',
4377                               ' GetItemAttrNumber TEMP_DU_PREPARER_ID --> ' || l_du_prep_id);
4378          -- =============== END DEBUG LOG ==================
4379 
4380          -- Before releasing DUs from this TU, want to update the TU amount
4381          -- i.e. New TU amount = TU amount - released DU amount
4382          -- Find the total amount of all DUs about to be released
4383          SELECT sum(du_amount)
4384          INTO   l_du_amount
4385          FROM   igi_exp_dus
4386          WHERE  tu_id = l_tu_id
4387          AND    du_by_user_id = l_du_prep_id
4388          AND    du_status = 'HLD';
4389 
4390          -- =============== START DEBUG LOG ================
4391             DEBUG_LOG_STRING (l_proc_level, 'Remove_dus_on_hold.Msg4',
4392                               ' l_du_amount --> ' || l_du_amount);
4393          -- =============== END DEBUG LOG ==================
4394 
4395          -- Now update the TU amount
4396          UPDATE igi_exp_tus
4397          SET    tu_amount = tu_amount - l_du_amount
4398          WHERE  tu_id = l_tu_id;
4399 
4400          -- =============== START DEBUG LOG ================
4401             DEBUG_LOG_STRING (l_proc_level, 'Remove_dus_on_hold.Msg5',
4402                               '  UPDATE igi_exp_tus tu-amount ' || SQL%ROWCOUNT);
4403          -- =============== END DEBUG LOG ==================
4404 
4405          -- Want to release all DUs in this TU with status 'On Hold' which
4406          -- have been prepared by this user.
4407 
4408          UPDATE igi_exp_dus
4409          SET    tu_id = null
4410          WHERE  tu_id = l_tu_id
4411          AND    du_by_user_id = l_du_prep_id
4412          AND    du_status = 'HLD';
4413 
4414          -- =============== START DEBUG LOG ================
4415             DEBUG_LOG_STRING (l_proc_level, 'Remove_dus_on_hold.Msg6',
4416                               ' UPDATE igi_exp_dus tu_id to NULL --> ' || SQL%ROWCOUNT);
4417          -- =============== END DEBUG LOG ==================
4418 
4419       END IF;
4420 
4421       IF (funcmode <> 'RUN') THEN
4422          result := 'COMPLETE';
4423          -- =============== START DEBUG LOG ================
4424             DEBUG_LOG_STRING (l_proc_level, 'Remove_dus_on_hold.Msg7',
4425                               ' funcmode <> RUN -- result --> ' || result);
4426          -- =============== END DEBUG LOG ==================
4427          return;
4428       END IF;
4429 
4430       -- =============== START DEBUG LOG ================
4431          DEBUG_LOG_STRING (l_proc_level, 'Remove_dus_on_hold.Msg8',
4432                            ' ** START REMOVE_DUS_ON_HOLD  ** ');
4433       -- =============== END DEBUG LOG ==================
4434 
4435    EXCEPTION
4436       WHEN OTHERS THEN
4437          wf_core.context('IGI_EXP_APPROVAL_PKG','remove_dus_on_hold',itemtype,itemkey,
4438                          to_char(actid),funcmode);
4439          -- =============== START DEBUG LOG ================
4440             DEBUG_LOG_UNEXP_ERROR ('Remove_dus_on_hold.Unexp1','DEFAULT');
4441          -- =============== END DEBUG LOG ==================
4442          raise;
4443 
4444    END remove_dus_on_hold;
4445 
4446 
4447 -- OPSF(I) EXP Bug 2415293  S Brewer 11-JUL-2002 Start(1)
4448 -- Modified the select statements in the following procedure to make them simpler
4449 -- Only check for rejected DUs - do not need to check if the DUs contain transactions
4450 -- This procedure can then be used in the 'Process Rejected Legal DUs' workflow
4451 -- process too.
4452 -- To see previous version of this procedure, look at previous file versions
4453 
4454    -- *************************************************************************
4455    --    LIST_ANY_REJECTED_DUS
4456    -- *************************************************************************
4457 
4458    PROCEDURE list_any_rejected_dus( itemtype IN  VARCHAR2,
4459                                     itemkey  IN  VARCHAR2,
4460                                     actid    IN  NUMBER,
4461                                     funcmode IN  VARCHAR2,
4462                                     result   OUT NOCOPY VARCHAR2) IS
4463 
4464       CURSOR c_du_rej_info(p_tu_id igi_exp_dus.tu_id%TYPE)
4465       IS
4466          SELECT du_order_number
4467                ,du_legal_number
4468          FROM   igi_exp_dus du
4469          WHERE  tu_id = p_tu_id
4470          AND    du_status = 'REJ';
4471 
4472       l_tu_id        igi_exp_dus.tu_id%TYPE;
4473       l_rej_count    NUMBER;
4474       l_du_rej_list  VARCHAR2(28000);
4475 
4476 
4477    BEGIN
4478 
4479       -- =============== START DEBUG LOG ================
4480          DEBUG_LOG_STRING (l_proc_level, 'List_any_rejected_dus.Msg1',
4481                            ' ** START LIST_ANY_REJECTED_DUS ** ');
4482       -- =============== END DEBUG LOG ==================
4483 
4484       IF (funcmode = 'RUN') THEN
4485 
4486          -- Get the TU id
4487          l_tu_id
4488             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
4489                                             itemkey  => itemkey,
4490                                             aname    => 'TU_ID');
4491 
4492          -- =============== START DEBUG LOG ================
4493             DEBUG_LOG_STRING (l_proc_level, 'List_any_rejected_dus.Msg2',
4494                               ' l_tu_id --> ' || l_tu_id);
4495          -- =============== END DEBUG LOG ==================
4496 
4497          -- Find out NOCOPY if there are any DUs which have been rejected
4498          -- (i.e. if the status of the DU is 'Rejected' )
4499          SELECT count(*)
4500          INTO   l_rej_count
4501          FROM   igi_exp_dus du
4502          WHERE  tu_id = l_tu_id
4503          AND    du_status = 'REJ';
4504 
4505          -- =============== START DEBUG LOG ================
4506             DEBUG_LOG_STRING (l_proc_level, 'List_any_rejected_dus.Msg3',
4507                               ' l_rej_count --> ' || l_rej_count);
4508          -- =============== END DEBUG LOG ==================
4509 
4510          IF (l_rej_count = 0) THEN
4511             --  There are no DUs in the TU which have been rejected
4512             -- Set the result to 'No'
4513             result := 'COMPLETE:N';
4514 
4515             -- =============== START DEBUG LOG ================
4516                DEBUG_LOG_STRING (l_proc_level, 'List_any_rejected_dus.Msg4',
4517                                  ' l_rej_count --> ' || l_rej_count);
4518             -- =============== END DEBUG LOG ==================
4519 
4520          ELSE
4521 
4522             -- There is at least one DU in the TU which has been rejected
4523             -- Need to create a list of numbers of all rejected DUs
4524             -- for including in the notification
4525             FOR I IN c_du_rej_info(l_tu_id)
4526             LOOP
4527 
4528                IF (l_du_rej_list is NULL) THEN
4529                   l_du_rej_list := I.du_order_number;
4530                ELSE
4531                   l_du_rej_list := l_du_rej_list||I.du_order_number;
4532                END IF;
4533 
4534                -- =============== START DEBUG LOG ================
4535                   DEBUG_LOG_STRING (l_proc_level, 'List_any_rejected_dus.Msg5',
4536                                     ' I.du_order_number --> ' || I.du_order_number);
4537                -- =============== END DEBUG LOG ==================
4538 
4539                IF (I.du_legal_number is not null) THEN
4540                   l_du_rej_list := l_du_rej_list||' ('||I.du_legal_number||')';
4541                END IF;
4542 
4543                -- =============== START DEBUG LOG ================
4544                   DEBUG_LOG_STRING (l_proc_level, 'List_any_rejected_dus.Msg6',
4545                                     ' I.du_legal_number --> ' || I.du_legal_number);
4546                -- =============== END DEBUG LOG ==================
4547 
4548                l_du_rej_list := l_du_rej_list||fnd_global.local_chr(10);
4549 
4550                IF LENGTH(l_du_rej_list) > 28000 THEN
4551                   exit;
4552                END IF;
4553 
4554             END LOOP;
4555 
4556             -- Set the all_dus_list attribute
4557             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4558                                          itemkey  => itemkey,
4559                                          aname    => 'ADD_ATTR1',
4560                                          avalue   => substr(l_du_rej_list, 1, 4000));
4561 
4562             -- =============== START DEBUG LOG ================
4563                DEBUG_LOG_STRING (l_proc_level, 'List_any_rejected_dus.Msg7',
4564                                  ' SetItemAttrText ADD_ATTR1 --> ' || substr(l_du_rej_list, 1, 4000));
4565             -- =============== END DEBUG LOG ==================
4566 
4567             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4568                                          itemkey  => itemkey,
4569                                          aname    => 'ADD_ATTR2',
4570                                          avalue   => substr(l_du_rej_list, 4001, 4000));
4571 
4572             -- =============== START DEBUG LOG ================
4573                DEBUG_LOG_STRING (l_proc_level, 'List_any_rejected_dus.Msg8',
4574                                  ' SetItemAttrText ADD_ATTR2 --> ' || substr(l_du_rej_list, 4001, 4000));
4575             -- =============== END DEBUG LOG ==================
4576 
4577             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4578                                          itemkey  => itemkey,
4579                                          aname    => 'ADD_ATTR3',
4580                                          avalue   => substr(l_du_rej_list, 8001, 4000));
4581 
4582             -- =============== START DEBUG LOG ================
4583                DEBUG_LOG_STRING (l_proc_level, 'List_any_rejected_dus.Msg9',
4584                                  ' SetItemAttrText ADD_ATTR3 --> ' || substr(l_du_rej_list, 8001, 4000));
4585             -- =============== END DEBUG LOG ==================
4586 
4587             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4588                                          itemkey  => itemkey,
4589                                          aname    => 'ADD_ATTR4',
4590                                          avalue   => substr(l_du_rej_list, 12001, 4000));
4591 
4592             -- =============== START DEBUG LOG ================
4593                DEBUG_LOG_STRING (l_proc_level, 'List_any_rejected_dus.Msg10',
4594                                  ' SetItemAttrText ADD_ATTR4 --> ' || substr(l_du_rej_list, 12001, 4000));
4595             -- =============== END DEBUG LOG ==================
4596 
4597             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4598                                          itemkey  => itemkey,
4599                                          aname    => 'ADD_ATTR5',
4600                                          avalue   => substr(l_du_rej_list, 16001, 4000));
4601 
4602             -- =============== START DEBUG LOG ================
4603                DEBUG_LOG_STRING (l_proc_level, 'List_any_rejected_dus.Msg11',
4604                                  ' SetItemAttrText ADD_ATTR5 --> ' || substr(l_du_rej_list, 16001, 4000));
4605             -- =============== END DEBUG LOG ==================
4606 
4607             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4608                                          itemkey  => itemkey,
4609                                          aname    => 'ADD_ATTR6',
4610                                          avalue   => substr(l_du_rej_list, 20001, 4000));
4611 
4612             -- =============== START DEBUG LOG ================
4613                DEBUG_LOG_STRING (l_proc_level, 'List_any_rejected_dus.Msg12',
4614                                  ' SetItemAttrText ADD_ATTR6 --> ' || substr(l_du_rej_list, 20001, 4000));
4615             -- =============== END DEBUG LOG ==================
4616 
4617             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4618                                          itemkey  => itemkey,
4619                                          aname    => 'ADD_ATTR7',
4620                                          avalue   => substr(l_du_rej_list, 24001, 4000));
4621 
4622             -- =============== START DEBUG LOG ================
4623                DEBUG_LOG_STRING (l_proc_level, 'List_any_rejected_dus.Msg13',
4624                                  ' SetItemAttrText ADD_ATTR7 --> ' || substr(l_du_rej_list, 24001, 4000));
4625             -- =============== END DEBUG LOG ==================
4626 
4627             -- Set the temp_du_by_prep_list attribute
4628             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4629                                          itemkey  => itemkey,
4630                                          aname    => 'ALL_DUS_LIST',
4631                                          avalue   => 'plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
4632 
4633             -- =============== START DEBUG LOG ================
4634                DEBUG_LOG_STRING (l_proc_level, 'List_any_rejected_dus.Msg14',
4635                                  ' SetItemAttrText ALL_DUS_LIST --> ' ||
4636                                  ' plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
4637             -- =============== END DEBUG LOG ==================
4638 
4639             -- Set the result to 'Yes'
4640             result := 'COMPLETE:Y';
4641 
4642             -- =============== START DEBUG LOG ================
4643                DEBUG_LOG_STRING (l_proc_level, 'List_any_rejected_dus.Msg15',
4644                                  ' result --> ' || result);
4645             -- =============== END DEBUG LOG ==================
4646 
4647         END IF;
4648 
4649       END IF;
4650 
4651       IF (funcmode <> 'RUN') THEN
4652          result := 'COMPLETE';
4653          -- =============== START DEBUG LOG ================
4654             DEBUG_LOG_STRING (l_proc_level, 'List_any_rejected_dus.Msg16',
4655                               ' funcmode <> RUN -- result --> ' || result );
4656          -- =============== END DEBUG LOG ==================
4657          return;
4658       END IF;
4659 
4660       -- =============== START DEBUG LOG ================
4661          DEBUG_LOG_STRING (l_proc_level, 'List_any_rejected_dus.Msg17',
4662                            ' ** END LIST_ANY_REJECTED_DUS ** ');
4663       -- =============== END DEBUG LOG ==================
4664 
4665    EXCEPTION
4666       WHEN OTHERS THEN
4667          wf_core.context('IGI_EXP_APPROVAL_PKG','list_any_rejected_dus',itemtype,itemkey,
4668                          to_char(actid),funcmode);
4669          -- =============== START DEBUG LOG ================
4670             DEBUG_LOG_UNEXP_ERROR ('List_any_rejected_dus.Unexp1','DEFAULT');
4671          -- =============== END DEBUG LOG ==================
4672          raise;
4673 
4674    END list_any_rejected_dus;
4675 
4676 
4677 -- OPSF(I) EXP Bug 2415293  S Brewer 11-JUL-2002 Start(2)
4678 -- Modified the select statements in the following procedure to make them simpler
4679 -- Only check for rejected DUs - do not need to check if the DUs contain transactions
4680 -- To see previous version of this procedure, look at previous file versions
4681 
4682    -- *************************************************************************
4683    --    GET_NEXT_REJECTED_DU
4684    -- *************************************************************************
4685 
4686    PROCEDURE get_next_rejected_du ( itemtype IN  VARCHAR2,
4687                                     itemkey  IN  VARCHAR2,
4688                                     actid    IN  NUMBER,
4689                                     funcmode IN  VARCHAR2,
4690                                     result   OUT NOCOPY VARCHAR2) IS
4691 
4692       CURSOR c_next_du_rej(p_tu_id igi_exp_dus.tu_id%TYPE)
4693       IS
4694          SELECT du_id
4695                ,du_by_user_id
4696          FROM   igi_exp_dus du
4697          WHERE  tu_id = p_tu_id
4698          AND    du_status = 'REJ'
4699 	 AND    EXISTS (SELECT 'AR'
4700                         FROM   igi_exp_ar_trans ar
4701                         WHERE  ar.du_id = du.du_id
4702                         UNION
4703                         SELECT 'AP'
4704                         FROM   igi_exp_ap_trans ap
4705                         WHERE  ap.du_id = du.du_id)
4706          AND    rownum = 1;
4707 
4708       CURSOR c_rej_du_info(p_tu_id igi_exp_dus.tu_id%TYPE
4709                           ,p_du_preparer_id igi_exp_dus.du_by_user_id%TYPE)
4710       IS
4711          SELECT du_order_number
4712                ,du_legal_number
4713          FROM   igi_exp_dus du
4714          WHERE  tu_id = p_tu_id
4715          AND    du_status = 'REJ'
4716          AND    du_by_user_id = p_du_preparer_id;
4717 
4718       l_tu_id           igi_exp_dus.tu_id%TYPE;
4719       l_du_id           igi_exp_dus.du_id%TYPE;
4720       l_du_prep_id      igi_exp_dus.du_by_user_id%TYPE;
4721       l_du_prep_name    fnd_user.user_name%TYPE;
4722       l_no              NUMBER := 0 ;
4723       l_du_rej_list     VARCHAR2(28000);
4724 
4725    BEGIN
4726 
4727       -- =============== START DEBUG LOG ================
4728          DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg1',
4729                            ' ** START GET_NEXT_REJECTED_DU ** ');
4730       -- =============== END DEBUG LOG ==================
4731 
4732       IF (funcmode = 'RUN') THEN
4733 
4734          -- Get the TU id
4735          l_tu_id
4736             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
4737                                             itemkey  => itemkey,
4738                                             aname    => 'TU_ID');
4739 
4740          -- =============== START DEBUG LOG ================
4741             DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg2',
4742                               'GetItemAttrNumber TU_ID --> ' || l_tu_id );
4743          -- =============== END DEBUG LOG ==================
4744 
4745          -- Get the next rejected DU in this TU
4746          OPEN c_next_du_rej(l_tu_id);
4747          FETCH c_next_du_rej INTO l_du_id, l_du_prep_id;
4748 
4749          -- =============== START DEBUG LOG ================
4750             DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg3',
4751                               ' l_du_id --> ' || l_du_id || ' l_du_prep_id --> ' || l_du_prep_id);
4752          -- =============== END DEBUG LOG ==================
4753 
4754          IF (c_next_du_rej%NOTFOUND) THEN
4755             -- There are no more rejected DUs to deal with
4756             -- Set result to 'No More DUs'
4757             result := 'COMPLETE:NO_DUS_IN_LIST';
4758 
4759             -- =============== START DEBUG LOG ================
4760                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg4',
4761                                  ' result --> ' || result);
4762             -- =============== END DEBUG LOG ==================
4763 
4764          ELSE
4765 
4766             -- The next rejected DU has been fetched
4767             -- Set the temp_du_preparer_id attribute
4768             wf_engine.SetItemAttrNumber( itemtype => itemtype,
4769                                          itemkey  => itemkey,
4770                                          aname    => 'TEMP_DU_PREPARER_ID',
4771                                          avalue   => l_du_prep_id);
4772 
4773             -- =============== START DEBUG LOG ================
4774                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg5',
4775                                  ' SetItemAttrNumber TEMP_DU_PREPARER_ID --> ' || l_du_prep_id);
4776             -- =============== END DEBUG LOG ==================
4777 
4778             -- Get the name of the preparer to send the notification to
4779             SELECT user_name
4780             INTO   l_du_prep_name
4781             FROM   fnd_user
4782             WHERE  user_id = l_du_prep_id;
4783 
4784             -- =============== START DEBUG LOG ================
4785                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg6',
4786                                  ' l_du_prep_name --> ' || l_du_prep_name);
4787             -- =============== END DEBUG LOG ==================
4788 
4789             -- Set the temp_du_preparer_name attribute
4790             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4791                                          itemkey  => itemkey,
4792                                          aname    => 'TEMP_DU_PREPARER_NAME',
4793                                          avalue   => l_du_prep_name);
4794 
4795             -- =============== START DEBUG LOG ================
4796                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg7',
4797                                  ' SetItemAttrText TEMP_DU_PREPARER_NAME --> ' || l_du_prep_name);
4798             -- =============== END DEBUG LOG ==================
4799 
4800             FOR I IN c_rej_du_info(l_tu_id,l_du_prep_id)
4801             LOOP
4802 
4803                IF (l_du_rej_list is NULL) THEN
4804                   l_du_rej_list := I.du_order_number;
4805                ELSE
4806                   l_du_rej_list := l_du_rej_list ||I.du_order_number;
4807                END IF;
4808 
4809                -- =============== START DEBUG LOG ================
4810                   DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg8',
4811                                     ' I.du_order_number --> ' || I.du_order_number);
4812                -- =============== END DEBUG LOG ==================
4813 
4814                IF (I.du_legal_number is not null) THEN
4815                   l_du_rej_list := l_du_rej_list||' ('||I.du_legal_number||')';
4816                END IF;
4817 
4818                -- =============== START DEBUG LOG ================
4819                   DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg9',
4820                                     ' I.du_legal_number --> ' || I.du_legal_number);
4821                -- =============== END DEBUG LOG ==================
4822 
4823                l_du_rej_list := l_du_rej_list||fnd_global.local_chr(10);
4824 
4825                IF LENGTH(l_du_rej_list) > 28000 THEN
4826                   exit;
4827                END IF;
4828 
4829             END LOOP;
4830 
4831            -- Set the all_dus_list attribute
4832             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4833                                          itemkey  => itemkey,
4834                                          aname    => 'ADD_ATTR1',
4835                                          avalue   => substr(l_du_rej_list, 1, 4000));
4836 
4837             -- =============== START DEBUG LOG ================
4838                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg10',
4839                                  ' SetItemAttrText ADD_ATTR1 --> ' || substr(l_du_rej_list, 1, 4000));
4840             -- =============== END DEBUG LOG ==================
4841 
4842             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4843                                          itemkey  => itemkey,
4844                                          aname    => 'ADD_ATTR2',
4845                                          avalue   => substr(l_du_rej_list, 4001, 4000));
4846 
4847             -- =============== START DEBUG LOG ================
4848                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg11',
4849                                  ' SetItemAttrText ADD_ATTR2 --> ' || substr(l_du_rej_list, 4001, 4000));
4850             -- =============== END DEBUG LOG ==================
4851 
4852             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4853                                          itemkey  => itemkey,
4854                                          aname    => 'ADD_ATTR3',
4855                                          avalue   => substr(l_du_rej_list, 8001, 4000));
4856 
4857             -- =============== START DEBUG LOG ================
4858                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg12',
4859                                  ' SetItemAttrText ADD_ATTR3 --> ' || substr(l_du_rej_list, 8001, 4000));
4860             -- =============== END DEBUG LOG ==================
4861 
4862             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4863                                          itemkey  => itemkey,
4864                                          aname    => 'ADD_ATTR4',
4865                                          avalue   => substr(l_du_rej_list, 12001, 4000));
4866 
4867             -- =============== START DEBUG LOG ================
4868                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg13',
4869                                  ' SetItemAttrText ADD_ATTR4 --> ' || substr(l_du_rej_list, 12001, 4000));
4870             -- =============== END DEBUG LOG ==================
4871 
4872             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4873                                          itemkey  => itemkey,
4874                                          aname    => 'ADD_ATTR5',
4875                                          avalue   => substr(l_du_rej_list, 16001, 4000));
4876 
4877             -- =============== START DEBUG LOG ================
4878                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg14',
4879                                  ' SetItemAttrText ADD_ATTR5 --> ' || substr(l_du_rej_list, 16001, 4000));
4880             -- =============== END DEBUG LOG ==================
4881 
4882             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4883                                          itemkey  => itemkey,
4884                                          aname    => 'ADD_ATTR6',
4885                                          avalue   => substr(l_du_rej_list, 20001, 4000));
4886 
4887             -- =============== START DEBUG LOG ================
4888                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg15',
4889                                  ' SetItemAttrText ADD_ATTR6 --> ' || substr(l_du_rej_list, 20001, 4000));
4890             -- =============== END DEBUG LOG ==================
4891 
4892             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4893                                          itemkey  => itemkey,
4894                                          aname    => 'ADD_ATTR7',
4895                                          avalue   => substr(l_du_rej_list, 24001, 4000));
4896 
4897 
4898             -- =============== START DEBUG LOG ================
4899                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg16',
4900                                  ' SetItemAttrText ADD_ATTR7 --> ' || substr(l_du_rej_list, 24001, 4000));
4901             -- =============== END DEBUG LOG ==================
4902 
4903             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4904                                          itemkey  => itemkey,
4905                                          aname    => 'TEMP_DU_BY_PREP_LIST',
4906                                          avalue   => 'plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
4907 
4908             -- =============== START DEBUG LOG ================
4909                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg17',
4910                                  ' SetItemAttrText ALL_DUS_LIST --> ' ||
4911                                  ' plsqlclob:igi_exp_approval_pkg.Cerate_du_list/'||itemtype||':'||itemkey);
4912             -- =============== END DEBUG LOG ==================
4913 
4914             -- Set the result to 'Next DU Fetched'
4915             result := 'COMPLETE:NEXT_DU_FETCHED';
4916 
4917             -- =============== START DEBUG LOG ================
4918                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg18',
4919                                  ' result --> ' || result);
4920             -- =============== END DEBUG LOG ==================
4921 
4922          END IF;
4923 
4924          IF (c_next_du_rej%ISOPEN) THEN
4925             CLOSE c_next_du_rej;
4926          END IF;
4927 
4928       END IF;
4929 
4930       IF (funcmode <> 'RUN') THEN
4931          result := 'COMPLETE';
4932          -- =============== START DEBUG LOG ================
4933             DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg19',
4934                               ' funcmode <> RUN -- result --> ' || result);
4935          -- =============== END DEBUG LOG ==================
4936          return;
4937       END IF;
4938 
4939       -- =============== START DEBUG LOG ================
4940          DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg20',
4941                            ' ** END GET_NEXT_REJECTED_DU ** ');
4942       -- =============== END DEBUG LOG ==================
4943 
4944    EXCEPTION
4945       WHEN OTHERS THEN
4946          wf_core.context('IGI_EXP_APPROVAL_PKG','get_next_rejected_du',itemtype,itemkey,
4947                          to_char(actid),funcmode);
4948          -- =============== START DEBUG LOG ================
4949             DEBUG_LOG_UNEXP_ERROR ('Get_next_rejected_du.Unexp1','DEFAULT');
4950          -- =============== END DEBUG LOG ==================
4951          raise;
4952 
4953    END get_next_rejected_du;
4954    -- OPSF(I) EXP Bug 2415293  S Brewer 11-JUL-2002 End(2)
4955 
4956 
4957 
4958    -- *************************************************************************
4959    --    REM_TRX_FROM_REJ_DUS
4960    -- *************************************************************************
4961 
4962    PROCEDURE rem_trx_from_rej_dus ( itemtype IN  VARCHAR2,
4963                                     itemkey  IN  VARCHAR2,
4964                                     actid    IN  NUMBER,
4965                                     funcmode IN  VARCHAR2,
4966                                     result   OUT NOCOPY VARCHAR2) IS
4967 
4968       CURSOR c_rej_dus(p_tu_id igi_exp_dus.tu_id%TYPE
4969                       ,p_du_preparer_id igi_exp_dus.du_by_user_id%TYPE)
4970       IS
4971          SELECT du_id
4972          FROM   igi_exp_dus du
4973          WHERE  tu_id = p_tu_id
4974          AND    du_status = 'REJ'
4975          AND    du_by_user_id = p_du_preparer_id
4976          AND    EXISTS (SELECT 'AR'
4977                         FROM   igi_exp_ar_trans ar
4978                         WHERE  ar.du_id = du.du_id
4979                         UNION
4980                         SELECT 'AP'
4981                         FROM   igi_exp_ap_trans ap
4982                         WHERE  ap.du_id = du.du_id);
4983 
4984       l_tu_id          igi_exp_dus.tu_id%TYPE;
4985       l_du_prep_id     igi_exp_dus.du_by_user_id%TYPE;
4986       l_du_id          igi_exp_dus.du_id%TYPE;
4987       l_du_amount      igi_exp_dus.du_amount%TYPE;
4988 
4989    BEGIN
4990 
4991       -- =============== START DEBUG LOG ================
4992          DEBUG_LOG_STRING (l_proc_level, 'Rem_trx_from_rej_dus.Msg1',
4993                            ' ** START REM_TRX_FROM_REJ_DUS ** ');
4994       -- =============== END DEBUG LOG ==================
4995 
4996      IF (funcmode = 'RUN') THEN
4997 
4998          -- Want to remove all transactions contained within rejected
4999          -- dialog units
5000 
5001          -- Get the TU id
5002          l_tu_id
5003             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5004                                             itemkey  => itemkey,
5005                                             aname    => 'TU_ID');
5006 
5007          -- =============== START DEBUG LOG ================
5008             DEBUG_LOG_STRING (l_proc_level, 'Rem_trx_from_rej_dus.Msg2',
5009                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
5010          -- =============== END DEBUG LOG ==================
5011 
5012          -- Get the DU preparer id
5013          l_du_prep_id
5014             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5015                                             itemkey  => itemkey,
5016                                             aname    => 'TEMP_DU_PREPARER_ID');
5017 
5018          -- =============== START DEBUG LOG ================
5019             DEBUG_LOG_STRING (l_proc_level, 'Rem_trx_from_rej_dus.Msg3',
5020                               ' GetItemAttrNumber TEMP_DU_PREPARER_ID --> '|| l_du_prep_id);
5021          -- =============== END DEBUG LOG ==================
5022 
5023          FOR I IN c_rej_dus(l_tu_id,l_du_prep_id)
5024          LOOP
5025 
5026             DELETE FROM igi_exp_ar_trans
5027             WHERE  du_id = I.du_id;
5028 
5029             -- =============== START DEBUG LOG ================
5030                DEBUG_LOG_STRING (l_proc_level, 'Rem_trx_from_rej_dus.Msg4',
5031                                  'DELETE FROM igi_exp_ar_trans --> ' || SQL%ROWCOUNT);
5032             -- =============== END DEBUG LOG ==================
5033 
5034             DELETE FROM igi_exp_ap_trans
5035             WHERE du_id = I.du_id;
5036 
5037             -- =============== START DEBUG LOG ================
5038                DEBUG_LOG_STRING (l_proc_level, 'Rem_trx_from_rej_dus.Msg5',
5039                                  ' DELETE FROM igi_exp_ap_trans --> ' || SQL%ROWCOUNT);
5040             -- =============== END DEBUG LOG ==================
5041 
5042          END LOOP;
5043 
5044          -- OPSF(I) EXP Bug 2415293  S Brewer 18-JUL-2002 Start(2)
5045          -- Now that the transactions have been removed from the DUs
5046          -- need to update the DU amounts to 0.  But before doing
5047          -- this, update the TU amount
5048          -- i.e. New TU amount = TU amount - DU amount
5049 
5050          -- First find the total DU amount
5051          SELECT sum(du_amount)
5052          INTO   l_du_amount
5053          FROM   igi_exp_dus
5054          WHERE  tu_id = l_tu_id
5055          AND    du_by_user_id = l_du_prep_id
5056          AND    du_status = 'REJ';
5057 
5058          -- =============== START DEBUG LOG ================
5059             DEBUG_LOG_STRING (l_proc_level, 'Rem_trx_from_rej_dus.Msg6',
5060                               ' l_du_amount --> ' || l_du_amount);
5061          -- =============== END DEBUG LOG ==================
5062 
5063          -- Update the TU amount
5064          UPDATE igi_exp_tus
5065          SET    tu_amount = tu_amount - l_du_amount
5066          WHERE  tu_id = l_tu_id;
5067 
5068          -- =============== START DEBUG LOG ================
5069             DEBUG_LOG_STRING (l_proc_level, 'Rem_trx_from_rej_dus.Msg7',
5070                               ' UPDATE igi_exp_tus --> ' || SQL%ROWCOUNT);
5071          -- =============== END DEBUG LOG ==================
5072 
5073          -- Now update the DU amount to 0
5074          UPDATE igi_exp_dus
5075          SET    du_amount = 0
5076          WHERE  tu_id = l_tu_id
5077          AND    du_by_user_id = l_du_prep_id
5078          AND    du_status = 'REJ';
5079 
5080          -- OPSF(I) EXP Bug 2415293  S Brewer 18-JUL-2002 End(2)
5081 
5082          -- =============== START DEBUG LOG ================
5083             DEBUG_LOG_STRING (l_proc_level, 'Rem_trx_from_rej_dus.Msg8',
5084                               ' UPDATE igi_exp_dus du_amount = 0 --> ' || SQL%ROWCOUNT);
5085          -- =============== END DEBUG LOG ==================
5086 
5087       END IF;
5088 
5089       IF (funcmode <> 'RUN') THEN
5090          result := 'COMPLETE';
5091          -- =============== START DEBUG LOG ================
5092             DEBUG_LOG_STRING (l_proc_level, 'Rem_trx_from_rej_dus.Msg9',
5093                               ' funcmode <> RUN -- result --> ' || result);
5094          -- =============== END DEBUG LOG ==================
5095          return;
5096       END IF;
5097 
5098       -- =============== START DEBUG LOG ================
5099          DEBUG_LOG_STRING (l_proc_level, 'Rem_trx_from_rej_dus.Msg10',
5100                            ' ** END REM_TRX_FROM_REJ_DUS ** ');
5101       -- =============== END DEBUG LOG ==================
5102 
5103    EXCEPTION
5104       WHEN OTHERS THEN
5105          wf_core.context('IGI_EXP_APPROVAL_PKG','rem_trx_from_rej_dus',itemtype,itemkey,
5106                          to_char(actid),funcmode);
5107          -- =============== START DEBUG LOG ================
5108             DEBUG_LOG_UNEXP_ERROR ('Rem_trx_from_rej_dus.Unexp1','DEFAULT');
5109          -- =============== END DEBUG LOG ==================
5110          raise;
5111 
5112    END rem_trx_from_rej_dus;
5113 
5114 
5115    -- *************************************************************************
5116    --    IS_LEGAL_NUM_REQ
5117    -- *************************************************************************
5118 
5119    PROCEDURE is_legal_num_req     ( itemtype IN  VARCHAR2,
5120                                     itemkey  IN  VARCHAR2,
5121                                     actid    IN  NUMBER,
5122                                     funcmode IN  VARCHAR2,
5123                                     result   OUT NOCOPY VARCHAR2) IS
5124 
5125       l_legal_num_pos_id   igi_exp_apprv_profiles.legal_num_pos_id%TYPE;
5126       l_current_pos_id     per_all_positions.position_id%TYPE;
5127 
5128    BEGIN
5129 
5130       -- =============== START DEBUG LOG ================
5131          DEBUG_LOG_STRING (l_proc_level, 'Is_legal_num_req.Msg1',
5132                            ' ** START IS_LEGAL_NUM_REQ ** ');
5133       -- =============== END DEBUG LOG ==================
5134 
5135       IF (funcmode = 'RUN') THEN
5136 
5137          -- Get the legal numbering position id
5138          l_legal_num_pos_id
5139             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5140                                             itemkey  => itemkey,
5141                                             aname    => 'LEGAL_NUM_POS_ID');
5142 
5143          -- =============== START DEBUG LOG ================
5144             DEBUG_LOG_STRING (l_proc_level, 'Is_legal_num_req.Msg2',
5145                               'GetItemAttrNumber LEGAL_NUM_POS_ID --> ' || l_legal_num_pos_id);
5146          -- =============== END DEBUG LOG ==================
5147 
5148          -- If the current position is the legal numbering position
5149          -- the we need to generate legal numbers for the TU and DUs
5150          -- Get the current position id
5151          l_current_pos_id
5152             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5153                                             itemkey  => itemkey,
5154                                             aname    => 'CURRENT_POSITION_ID');
5155 
5156          -- =============== START DEBUG LOG ================
5157             DEBUG_LOG_STRING (l_proc_level, 'Is_legal_num_req.Msg3',
5158                               ' GetItemAttrNumber CURRENT_POSITION_ID --> ' || l_current_pos_id);
5159          -- =============== END DEBUG LOG ==================
5160 
5161          IF (l_current_pos_id = l_legal_num_pos_id) THEN
5162             -- Set the result to 'Yes'
5163             result := 'COMPLETE:Y';
5164             -- =============== START DEBUG LOG ================
5165                DEBUG_LOG_STRING (l_proc_level, 'Is_legal_num_req.Msg4',
5166                                  ' l_current_pos_id = l_legal_num_pos_id -- result --> ' || result);
5167             -- =============== END DEBUG LOG ==================
5168 
5169          ELSE
5170             -- Set the result to 'No'
5171             result := 'COMPLETE:N';
5172             -- =============== START DEBUG LOG ================
5173                DEBUG_LOG_STRING (l_proc_level, 'Is_legal_num_req.Msg5',
5174                                  ' result --> ' || result);
5175             -- =============== END DEBUG LOG ==================
5176          END IF;
5177 
5178       END IF;
5179 
5180       IF (funcmode <> 'RUN') THEN
5181          result := 'COMPLETE';
5182          -- =============== START DEBUG LOG ================
5183             DEBUG_LOG_STRING (l_proc_level, 'Is_legal_num_req.Msg6',
5184                               ' funcmode <> RUN -- result --> '|| result );
5185          -- =============== END DEBUG LOG ==================
5186          return;
5187       END IF;
5188 
5189       -- =============== START DEBUG LOG ================
5190          DEBUG_LOG_STRING (l_proc_level, 'Is_legal_num_req.Msg7',
5191                            ' ** END IS_LEGAL_NUM_REQ ** ');
5192       -- =============== END DEBUG LOG ==================
5193 
5194    EXCEPTION
5195       WHEN OTHERS THEN
5196          wf_core.context('IGI_EXP_APPROVAL_PKG','is_legal_num_req',itemtype,itemkey,
5197                          to_char(actid),funcmode);
5198          -- =============== START DEBUG LOG ================
5199             DEBUG_LOG_UNEXP_ERROR ('Is_legal_num_req.Unexp1','DEFAULT');
5200          -- =============== END DEBUG LOG ==================
5201           raise;
5202 
5203    END is_legal_num_req;
5204 
5205 
5206    -- *************************************************************************
5207    --    APPLY_TU_LEGAL_NUM
5208    -- *************************************************************************
5209 
5210    PROCEDURE apply_tu_legal_num   ( itemtype IN  VARCHAR2,
5211                                     itemkey  IN  VARCHAR2,
5212                                     actid    IN  NUMBER,
5213                                     funcmode IN  VARCHAR2,
5214                                     result   OUT NOCOPY VARCHAR2) IS
5215 
5216       l_tu_id               igi_exp_dus.tu_id%TYPE;
5217       l_tu_type_header_id   igi_exp_tus.tu_type_header_id%TYPE;
5218       l_tu_fiscal_year      igi_exp_tus.tu_fiscal_year%TYPE;
5219       l_tu_legal_number     igi_exp_tus.tu_legal_number%TYPE;
5220       l_tu_full_number      VARCHAR2(240);
5221       l_error_message       VARCHAR2(250);
5222 
5223    BEGIN
5224 
5225       -- =============== START DEBUG LOG ================
5226          DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg1',
5227                            ' ** START APPLY_TU_LEGAL_NUM ** ');
5228       -- =============== END DEBUG LOG ==================
5229 
5230      IF (funcmode = 'RUN') THEN
5231 
5232          -- Get the TU id
5233          l_tu_id
5234             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5235                                             itemkey  => itemkey,
5236                                             aname    => 'TU_ID');
5237 
5238          -- =============== START DEBUG LOG ================
5239             DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg2',
5240                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id );
5241          -- =============== END DEBUG LOG ==================
5242 
5243          -- Get the TU type and the fiscal year of the TU
5244          SELECT tu_type_header_id
5245                ,tu_fiscal_year
5246          INTO   l_tu_type_header_id
5247                ,l_tu_fiscal_year
5248          FROM   igi_exp_tus
5249          WHERE  tu_id = l_tu_id;
5250 
5251          -- =============== START DEBUG LOG ================
5252             DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg3',
5253                               ' l_tu_type_header_id --> ' || l_tu_type_header_id ||
5254                               ' l_tu_fiscal_year --> ' || l_tu_fiscal_year);
5255             DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg4',
5256                               ' Calling igi_exp_utils.generate_number ');
5257          -- =============== END DEBUG LOG ==================
5258 
5259          -- Get the legal number for the TU
5260          igi_exp_utils.generate_number('TU'                 -- pi_number_type
5261                                       ,'L'                  -- pi_number_class
5262                                       ,l_tu_type_header_id  -- pi_du_tu_type_id
5263                                       ,l_tu_fiscal_year     -- pi_fiscal_year
5264                                       ,l_tu_legal_number    -- po_du_tu_number
5265                                       ,l_error_message);    -- po_error_message
5266 
5267          -- =============== START DEBUG LOG ================
5268             DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg5',
5269                               ' l_tu_legal_number --> ' || l_tu_legal_number);
5270          -- =============== END DEBUG LOG ==================
5271 
5272          IF (l_tu_legal_number is null) THEN
5273             -- An error occurred generating the TU legal number
5274             -- Set the error message attribute to be used in the
5275             -- notification sent to the system administrator
5276 
5277             -- Set the error_message attribute
5278             wf_engine.SetItemAttrText  ( itemtype => itemtype,
5279                                          itemkey  => itemkey,
5280                                          aname    => 'ERROR_MESSAGE',
5281                                          avalue   => l_error_message);
5282 
5283             -- =============== START DEBUG LOG ================
5284                DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg6',
5285                                  ' SetItemAttrText ERROR_MESSAGE --> ' || l_error_message);
5286             -- =============== END DEBUG LOG ==================
5287 
5288             -- Exit with result 'Failure
5289             result := 'COMPLETE:FAILURE';
5290 
5291             -- =============== START DEBUG LOG ================
5292                DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg7',
5293                                  ' result --> ' || result);
5294             -- =============== END DEBUG LOG ==================
5295 
5296             return;
5297 
5298          ELSE
5299 
5300             -- TU Legal number was generated successfully
5301             -- Apply the legal number to the TU
5302             UPDATE igi_exp_tus
5303             SET    tu_legal_number = l_tu_legal_number
5304             WHERE  tu_id = l_tu_id;
5305 
5306 
5307             -- =============== START DEBUG LOG ================
5308                DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg8',
5309                                  'UPDATE igi_exp_tus -  ' || SQL%ROWCOUNT);
5310             -- =============== END DEBUG LOG ==================
5311 
5312             -- OPSF(I) EXP Bug 2567802 26-Sep-2002  S Brewer  Start(2)
5313             -- Set the TU Full Number attribute to include the legal number
5314             l_tu_full_number
5315             := wf_engine.GetItemAttrText  ( itemtype => itemtype,
5316                                             itemkey  => itemkey,
5317                                             aname    => 'TU_FULL_NUMBER');
5318 
5319             -- =============== START DEBUG LOG ================
5320                DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg9',
5321                                  ' GetItemAttrText TU_FULL_NUMBER --> ' || l_tu_full_number);
5322             -- =============== END DEBUG LOG ==================
5323 
5324             l_tu_full_number := l_tu_full_number||' ('||l_tu_legal_number||')';
5325 
5326             -- =============== START DEBUG LOG ================
5327                DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg10',
5328                                  ' l_tu_full_number --> ' || l_tu_full_number);
5329             -- =============== END DEBUG LOG ==================
5330 
5331             wf_engine.SetItemAttrText  ( itemtype => itemtype,
5332                                          itemkey  => itemkey,
5333                                          aname    => 'TU_FULL_NUMBER',
5334                                          avalue   => l_tu_legal_number);
5335 
5336             -- OPSF(I) EXP Bug 2567802 26-Sep-2002  S Brewer  End(2)
5337 
5338             -- =============== START DEBUG LOG ================
5339                DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg11',
5340                                  ' SetItemAttrText TU_FULL_NUMBER --> ' || l_tu_legal_number);
5341             -- =============== END DEBUG LOG ==================
5342 
5343             -- Set the result to Success
5344             result := 'COMPLETE:SUCCESS';
5345 
5346             -- =============== START DEBUG LOG ================
5347                DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg12',
5348                                  ' result --> ' || result);
5349             -- =============== END DEBUG LOG ==================
5350 
5351          END IF;
5352 
5353       END IF;
5354 
5355       IF (funcmode <> 'RUN') THEN
5356          result := 'COMPLETE';
5357          -- =============== START DEBUG LOG ================
5358             DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg13',
5359                               ' funcmode <> RUN -- result --> ' || result);
5360          -- =============== END DEBUG LOG ==================
5361          return;
5362       END IF;
5363 
5364       -- =============== START DEBUG LOG ================
5365          DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg14',
5366                            ' ** END APPLY_TU_LEGAL_NUM ** ');
5367       -- =============== END DEBUG LOG ==================
5368 
5369    EXCEPTION
5370       WHEN OTHERS THEN
5371          wf_core.context('IGI_EXP_APPROVAL_PKG','apply_tu_legal_num',itemtype,itemkey,
5372                          to_char(actid),funcmode);
5373          -- =============== START DEBUG LOG ================
5374             DEBUG_LOG_UNEXP_ERROR ('Apply_tu_legal_num.Unexp1','DEFAULT');
5375          -- =============== END DEBUG LOG ==================
5376          raise;
5377 
5378    END apply_tu_legal_num;
5379 
5380 
5381 
5382    -- *************************************************************************
5383    --    APPLY_DU_LEGAL_NUM
5384    -- *************************************************************************
5385 
5386    PROCEDURE apply_du_legal_num   ( itemtype IN  VARCHAR2,
5387                                     itemkey  IN  VARCHAR2,
5388                                     actid    IN  NUMBER,
5389                                     funcmode IN  VARCHAR2,
5390                                     result   OUT NOCOPY VARCHAR2) IS
5391 
5392       CURSOR c_get_du(p_tu_id  igi_exp_dus.tu_id%TYPE)
5393       IS
5394          SELECT du_id
5395                ,du_type_header_id
5396                ,du_fiscal_year
5397                ,du_order_number
5398          FROM   igi_exp_dus
5399          WHERE  tu_id = p_tu_id
5400          AND du_status = 'ATR';
5401 
5402       l_tu_id              igi_exp_dus.tu_id%TYPE;
5403       l_du_id              igi_exp_dus.du_id%TYPE;
5404       l_du_type_header_id  igi_exp_dus.du_type_header_id%TYPE;
5405       l_du_fiscal_year     igi_exp_dus.du_fiscal_year%TYPE;
5406       l_du_order_number    igi_exp_dus.du_order_number%TYPE;
5407       l_du_legal_number    igi_exp_dus.du_legal_number%TYPE;
5408       l_error_message      VARCHAR2(250);
5409       l_du_failed          VARCHAR2(1):='N';
5410 
5411    BEGIN
5412 
5413       -- =============== START DEBUG LOG ================
5414          DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg1',
5415                            ' ** START APPLY_DU_LEGAL_NUM ** ');
5416       -- =============== END DEBUG LOG ==================
5417 
5418       IF (funcmode = 'RUN') THEN
5419 
5420          -- Get the tu id
5421          l_tu_id
5422             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5423                                             itemkey  => itemkey,
5424                                             aname    => 'TU_ID');
5425 
5426          -- =============== START DEBUG LOG ================
5427             DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg2',
5428                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
5429          -- =============== END DEBUG LOG ==================
5430 
5431          savepoint legal_num_save;
5432 
5433          -- =============== START DEBUG LOG ================
5434             DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg3',
5435                               ' set savepoint legal_num_save ');
5436          -- =============== END DEBUG LOG ==================
5437 
5438          OPEN c_get_du(l_tu_id);
5439          LOOP
5440 
5441             FETCH c_get_du INTO l_du_id
5442                               , l_du_type_header_id
5443                               , l_du_fiscal_year
5444                               , l_du_order_number;
5445 
5446             -- =============== START DEBUG LOG ================
5447                DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg4',
5448                                  ' l_du_id --> ' || l_du_id ||
5449                                  ' l_du_type_header_id --> ' || l_du_type_header_id ||
5450                                  ' l_du_fiscal_year --> ' || l_du_fiscal_year ||
5451                                  ' l_du_order_number --> ' || l_du_order_number);
5452             -- =============== END DEBUG LOG ==================
5453 
5454             EXIT WHEN c_get_du%NOTFOUND;
5455 
5456             -- =============== START DEBUG LOG ================
5457                DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg5',
5458                                  ' calling  igi_exp_utils.generate_number ');
5459             -- =============== END DEBUG LOG ==================
5460 
5461             -- Get the legal number for the DU
5462             igi_exp_utils.generate_number('DU'                 -- pi_number_type
5463                                          ,'L'                  -- pi_number_class
5464                                          ,l_du_type_header_id  -- pi_du_tu_type_id
5465                                          ,l_du_fiscal_year     -- pi_fiscal_year
5466                                          ,l_du_legal_number    -- po_du_tu_number
5467                                          ,l_error_message);    -- po_error_message
5468 
5469             -- =============== START DEBUG LOG ================
5470                DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg6',
5471                                  ' l_du_legal_number --> ' || l_du_legal_number);
5472             -- =============== END DEBUG LOG ==================
5473 
5474             IF (l_du_legal_number is null) THEN
5475                -- An error occurred generating the DU legal number
5476                -- Set the error message attribute to be used in the
5477                -- notification sent to the system administrator
5478 
5479                -- Set the error_message attribute
5480                wf_engine.SetItemAttrText  ( itemtype => itemtype,
5481                                             itemkey  => itemkey,
5482                                             aname    => 'ERROR_MESSAGE',
5483                                             avalue   => l_error_message);
5484 
5485                -- =============== START DEBUG LOG ================
5486                   DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg7',
5487                                     ' SetItemAttrText ERROR_MESSAGE --> ' || l_error_message);
5488                -- =============== END DEBUG LOG ==================
5489 
5490                -- Set the legal_num_failed_du attribute
5491                wf_engine.SetItemAttrText  ( itemtype => itemtype,
5492                                             itemkey  => itemkey,
5493                                             aname    => 'LEGAL_NUM_FAILED_DU',
5494                                             avalue   => l_du_order_number);
5495 
5496                -- =============== START DEBUG LOG ================
5497                   DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg8',
5498                                     ' SetItemAttrText LEGAL_NUM_FAILED_DU --> ' || l_du_order_number);
5499                -- =============== END DEBUG LOG ==================
5500 
5501                -- rollback any legal numbering which did work
5502                rollback to legal_num_save;
5503 
5504                -- =============== START DEBUG LOG ================
5505                   DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg9',
5506                                     ' rollback to legal_num_save ');
5507                -- =============== END DEBUG LOG ==================
5508 
5509                -- set result to 'Failure'
5510                result := 'COMPLETE:FAILURE';
5511 
5512                -- =============== START DEBUG LOG ================
5513                   DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg10',
5514                                     ' result --> ' || result );
5515                -- =============== END DEBUG LOG ==================
5516 
5517                -- set l_du_failed to 'Y'
5518                l_du_failed := 'Y';
5519 
5520                -- =============== START DEBUG LOG ================
5521                   DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg11',
5522                                     ' l_du_failed --> ' || l_du_failed);
5523                -- =============== END DEBUG LOG ==================
5524 
5525                -- exit loop
5526                EXIT;
5527 
5528             ELSE
5529 
5530                -- DU Legal number was generated successfully
5531                -- Apply the legal number to the DU
5532                UPDATE igi_exp_dus
5533                SET    du_legal_number = l_du_legal_number
5534                WHERE  du_id = l_du_id;
5535 
5536                -- =============== START DEBUG LOG ================
5537                   DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg12',
5538                                     ' UPDATE igi_exp_dus --> ' || SQL%ROWCOUNT);
5539                -- =============== END DEBUG LOG ==================
5540 
5541             END IF;
5542          END LOOP;
5543 
5544          IF (c_get_du%ISOPEN) THEN
5545             CLOSE c_get_du;
5546          END IF;
5547 
5548          IF (l_du_failed = 'Y') THEN
5549             -- set result to 'Failure'
5550             result := 'COMPLETE:FAILURE';
5551          ELSE
5552             -- set result to 'Success'
5553             result := 'COMPLETE:SUCCESS';
5554          END IF;
5555 
5556          -- =============== START DEBUG LOG ================
5557             DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg13',
5558                               ' result --> ' || result);
5559          -- =============== END DEBUG LOG ==================
5560 
5561       END IF;
5562 
5563       IF (funcmode <> 'RUN') THEN
5564          result := 'COMPLETE';
5565          -- =============== START DEBUG LOG ================
5566             DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg14',
5567                               ' ** START APPLY_DU_LEGAL_NUM ** ');
5568          -- =============== END DEBUG LOG ==================
5569          return;
5570       END IF;
5571 
5572       -- =============== START DEBUG LOG ================
5573          DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg15',
5574                            ' ** END APPLY_DU_LEGAL_NUM ** ');
5575       -- =============== END DEBUG LOG ==================
5576 
5577    EXCEPTION
5578       WHEN OTHERS THEN
5579          wf_core.context('IGI_EXP_APPROVAL_PKG','apply_du_legal_num',itemtype,itemkey,
5580                          to_char(actid),funcmode);
5581          -- =============== START DEBUG LOG ================
5582             DEBUG_LOG_UNEXP_ERROR ('Apply_du_legal_num.Unexp1','DEFAULT');
5583          -- =============== END DEBUG LOG ==================
5584          raise;
5585 
5586    END apply_du_legal_num;
5587 
5588 
5589 
5590    -- *************************************************************************
5591    --    SET_TU_STATUS
5592    -- *************************************************************************
5593 
5594    PROCEDURE set_tu_status        ( itemtype IN  VARCHAR2,
5595                                     itemkey  IN  VARCHAR2,
5596                                     actid    IN  NUMBER,
5597                                     funcmode IN  VARCHAR2,
5598                                     result   OUT NOCOPY VARCHAR2) IS
5599 
5600       l_tu_id        igi_exp_dus.tu_id%TYPE;
5601       l_tu_status    igi_exp_tus.tu_status%TYPE;
5602       l_atr_du_count NUMBER;
5603 
5604       -- Bug 4051910
5605       -- Check if the TU has a status
5606       CURSOR C_stat(p_tu_id number)
5607       IS
5608          SELECT tu_status
5609          FROM   igi_exp_tus
5610          WHERE  tu_id = p_tu_id;
5611 
5612 
5613 
5614    BEGIN
5615 
5616       -- =============== START DEBUG LOG ================
5617          DEBUG_LOG_STRING (l_proc_level, 'Set_tu_status.Msg1',
5618                            ' ** START SET_TU_STATUS ** ');
5619       -- =============== END DEBUG LOG ==================
5620 
5621       IF (funcmode = 'RUN') THEN
5622 
5623          -- Get the TU id
5624          l_tu_id
5625             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5626                                             itemkey  => itemkey,
5627                                             aname    => 'TU_ID');
5628 
5629          -- =============== START DEBUG LOG ================
5630             DEBUG_LOG_STRING (l_proc_level, 'Set_tu_status.Msg2',
5631                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
5632          -- =============== END DEBUG LOG ==================
5633 
5634          -- Bug 4051910
5635          OPEN  c_stat(l_tu_id);
5636          FETCH c_stat INTO l_tu_status;
5637          CLOSE c_stat;
5638 
5639          -- =============== START DEBUG LOG ================
5640             DEBUG_LOG_STRING (l_proc_level, 'Set_tu_status.Msg3',
5641                               ' l_tu_status --> ' || l_tu_status);
5642          -- =============== END DEBUG LOG ==================
5643 
5644          IF (l_tu_status = 'TRA') THEN
5645 
5646             UPDATE igi_exp_tus
5647             SET    tu_status = 'ATR'
5648             WHERE  tu_id = l_tu_id;
5649             -- =============== START DEBUG LOG ================
5650                DEBUG_LOG_STRING (l_proc_level, 'Set_tu_status.Msg4',
5651                                  ' UPDATE igi_exp_tus --> ' || SQL%ROWCOUNT);
5652             -- =============== END DEBUG LOG ==================
5653 
5654          END IF;
5655 
5656          -- Find how many DUs in the TU are approved
5657          SELECT count(*)
5658          INTO   l_atr_du_count
5659          FROM   igi_exp_dus
5660          WHERE  tu_id = l_tu_id
5661          AND    du_status = 'ATR';
5662 
5663          -- =============== START DEBUG LOG ================
5664             DEBUG_LOG_STRING (l_proc_level, 'Set_tu_status.Msg5',
5665                               ' l_atr_du_count --> ' || l_atr_du_count);
5666          -- =============== END DEBUG LOG ==================
5667 
5668          IF (l_atr_du_count = 0) THEN
5669             -- This TU contains no approved DUs
5670             -- Set the result to 'TU Empty'
5671             result := 'COMPLETE:TU_EMPTY';
5672             -- =============== START DEBUG LOG ================
5673                DEBUG_LOG_STRING (l_proc_level, 'Set_tu_status.Msg6',
5674                                  ' l_atr_du_count = 0 -- result --> ' || result);
5675             -- =============== END DEBUG LOG ==================
5676          ELSE
5677             -- This TU contains at least one approved DU
5678             -- Set the result to 'TU Not Empty'
5679             result := 'COMPLETE:TU_NOT_EMPTY';
5680             -- =============== START DEBUG LOG ================
5681                DEBUG_LOG_STRING (l_proc_level, 'Set_tu_status.Msg7',
5682                                  ' result --> ' || result);
5683             -- =============== END DEBUG LOG ==================
5684          END IF;
5685       END IF;
5686 
5687       IF (funcmode <> 'RUN') THEN
5688          result := 'COMPLETE';
5689          -- =============== START DEBUG LOG ================
5690             DEBUG_LOG_STRING (l_proc_level, 'Set_tu_status.Msg8',
5691                               ' funcmode <> RUN -- result --> ' || result);
5692          -- =============== END DEBUG LOG ==================
5693          return;
5694       END IF;
5695 
5696       -- =============== START DEBUG LOG ================
5697          DEBUG_LOG_STRING (l_proc_level, 'Set_tu_status.Msg9',
5698                            ' ** END SET_TU_STATUS ** ');
5699       -- =============== END DEBUG LOG ==================
5700 
5701    EXCEPTION
5702       WHEN OTHERS THEN
5703          wf_core.context('IGI_EXP_APPROVAL_PKG','set_tu_status',itemtype,itemkey,
5704                          to_char(actid),funcmode);
5705          -- =============== START DEBUG LOG ================
5706             DEBUG_LOG_UNEXP_ERROR ('Set_tu_status.Unexp1','DEFAULT');
5707          -- =============== END DEBUG LOG ==================
5708          raise;
5709 
5710    END set_tu_status;
5711 
5712 
5713    -- *************************************************************************
5714    --    GET_PARENT_POSITION
5715    -- *************************************************************************
5716 
5717    PROCEDURE get_parent_position  ( itemtype IN  VARCHAR2,
5718                                     itemkey  IN  VARCHAR2,
5719                                     actid    IN  NUMBER,
5720                                     funcmode IN  VARCHAR2,
5721                                     result   OUT NOCOPY VARCHAR2) IS
5722 
5723      CURSOR c_get_parent_position(p_position_id per_all_positions.position_id%TYPE
5724                                  ,p_pos_structure_version_id per_pos_structure_versions.pos_structure_version_id%TYPE
5725                                  ,p_business_group_id hr_all_positions_f.business_group_id%TYPE)
5726      IS
5727         SELECT parent_position_id
5728         FROM   per_pos_structure_elements
5729         WHERE  pos_structure_version_id = p_pos_structure_version_id
5730         AND    business_group_id = p_business_group_id
5731         AND    subordinate_position_id = p_position_id;
5732 
5733       l_position_id              per_all_positions.position_id%TYPE;
5734       l_parent_pos_id            per_all_positions.position_id%TYPE;
5735       l_parent_pos_name          per_all_positions.name%TYPE;
5736       l_final_apprv_pos_id       igi_exp_apprv_profiles.final_apprv_pos_id%TYPE;
5737       l_business_group_id        hr_all_positions_f.business_group_id%TYPE;
5738       l_pos_structure_version_id per_pos_structure_versions.pos_structure_version_id%TYPE;
5739 
5740    BEGIN
5741 
5742       -- =============== START DEBUG LOG ================
5743          DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg1',
5744                            ' ** START GET_PARENT_POSITION ** ');
5745       -- =============== END DEBUG LOG ==================
5746 
5747       IF (funcmode = 'RUN') THEN
5748 
5749          -- Get the current position id
5750          l_position_id
5751             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5752                                             itemkey  => itemkey,
5753                                             aname    => 'CURRENT_POSITION_ID');
5754 
5755          -- =============== START DEBUG LOG ================
5756             DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg2',
5757                               ' GetItemAttrNumber CURRENT_POSITION_ID --> ' || l_position_id);
5758          -- =============== END DEBUG LOG ==================
5759 
5760          -- Get the final approver position id
5761          l_final_apprv_pos_id
5762             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5763                                             itemkey  => itemkey,
5764                                             aname    => 'FINAL_APPRV_POS_ID');
5765 
5766          -- =============== START DEBUG LOG ================
5767             DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg3',
5768                               ' GetItemAttrNumber FINAL_APPRV_POS_ID --> ' || l_final_apprv_pos_id);
5769          -- =============== END DEBUG LOG ==================
5770 
5771          -- If the current position is the final approver position then
5772          -- this position has no parent position
5773          IF (l_position_id = l_final_apprv_pos_id) THEN
5774             -- set the result to 'No Parent' and exit
5775             result := 'COMPLETE:NO_PARENT';
5776             -- =============== START DEBUG LOG ================
5777                DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg4',
5778                                  ' l_position_id = l_final_apprv_pos_id -- result --> ' || result);
5779             -- =============== END DEBUG LOG ==================
5780             return;
5781          END IF;
5782 
5783          -- Now need to check if there is a parent position in the HR hierarchy
5784          -- Get the position structure version id
5785          l_pos_structure_version_id
5786             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5787                                             itemkey  => itemkey,
5788                                             aname    => 'POS_STRUCTURE_VERSION_ID');
5789 
5790          -- =============== START DEBUG LOG ================
5791             DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg5',
5792                               ' GetItemAttrNumber POS_STRUCTURE_VERSION_ID --> ' ||l_pos_structure_version_id);
5793          -- =============== END DEBUG LOG ==================
5794 
5795          -- Get the business group id
5796          l_business_group_id
5797             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5798                                             itemkey  => itemkey,
5799                                             aname    => 'BUSINESS_GROUP_ID');
5800 
5801          -- =============== START DEBUG LOG ================
5802             DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg6',
5803                               ' GetItemAttrNumber BUSINESS_GROUP_ID --> ' || l_business_group_id);
5804          -- =============== END DEBUG LOG ==================
5805 
5806          OPEN c_get_parent_position(l_position_id
5807                                    ,l_pos_structure_version_id
5808                                    ,l_business_group_id);
5809          FETCH c_get_parent_position INTO l_parent_pos_id;
5810 
5811          -- =============== START DEBUG LOG ================
5812             DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg7',
5813                               ' l_position_id --> ' || l_position_id ||
5814                               ' l_pos_structure_version_id --> ' || l_pos_structure_version_id ||
5815                               ' l_business_group_id --> ' || l_business_group_id);
5816          -- =============== END DEBUG LOG ==================
5817 
5818          IF c_get_parent_position%NOTFOUND THEN
5819             -- The current position does not have a parent in the HR hierarchy
5820             -- Set result to No Parent and exit
5821             result := 'COMPLETE:NO_PARENT';
5822             -- =============== START DEBUG LOG ================
5823                DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg8',
5824                                  ' c_get_parent_position%NOTFOUND --> TRUE -- result --> ' || result);
5825             -- =============== END DEBUG LOG ==================
5826             return;
5827          ELSE
5828             -- The current position has a parent
5829             -- Set the workflow attribute current_position_id to the parent position
5830             wf_engine.SetItemAttrNumber( itemtype => itemtype,
5831                                          itemkey  => itemkey,
5832                                          aname    => 'CURRENT_POSITION_ID',
5833                                          avalue   => l_parent_pos_id);
5834 
5835             -- =============== START DEBUG LOG ================
5836                DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg9',
5837                                  ' SetItemAttrNumber CURRENT_POSITION_ID --> ' || l_parent_pos_id);
5838             -- =============== END DEBUG LOG ==================
5839 
5840             -- Get the position name
5841             SELECT name
5842             INTO   l_parent_pos_name
5843             FROM   hr_all_positions_f
5844             WHERE  position_id = l_parent_pos_id;
5845 
5846             -- =============== START DEBUG LOG ================
5847                DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg10',
5848                                  ' l_parent_pos_name --> ' || l_parent_pos_name);
5849             -- =============== END DEBUG LOG ==================
5850 
5851             -- Set the workflow attribute current_position_name to the parent position
5852             wf_engine.SetItemAttrText  ( itemtype => itemtype,
5853                                          itemkey  => itemkey,
5854                                          aname    => 'CURRENT_POSITION_NAME',
5855                                          avalue   => l_parent_pos_name);
5856 
5857             -- =============== START DEBUG LOG ================
5858                DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg11',
5859                                  ' SetItemAttrText CURRENT_POSITION_NAME --> ' || l_parent_pos_name);
5860             -- =============== END DEBUG LOG ==================
5861 
5862             -- Set the result to Has a parent
5863             result := 'COMPLETE:HAS_PARENT';
5864 
5865             -- =============== START DEBUG LOG ================
5866                DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg12',
5867                                  ' result --> ' || result);
5868             -- =============== END DEBUG LOG ==================
5869 
5870             return;
5871 
5872          END IF;
5873 
5874       END IF;
5875 
5876       IF (funcmode <> 'RUN') THEN
5877          result := 'COMPLETE';
5878          -- =============== START DEBUG LOG ================
5879             DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg13',
5880                               ' funcmode <> RUN -- result --> ' || result);
5881          -- =============== END DEBUG LOG ==================
5882          return;
5883       END IF;
5884 
5885       -- =============== START DEBUG LOG ================
5886          DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg14',
5887                            ' ** END GET_PARENT_POSITION ** ');
5888       -- =============== END DEBUG LOG ==================
5889 
5890    EXCEPTION
5891       WHEN OTHERS THEN
5892          wf_core.context('IGI_EXP_APPROVAL_PKG','get_parent_position',itemtype,itemkey,
5893                          to_char(actid),funcmode);
5894          -- =============== START DEBUG LOG ================
5895             DEBUG_LOG_UNEXP_ERROR ('Get_parent_position.Unexp1','DEFAULT');
5896          -- =============== END DEBUG LOG ==================
5897          raise;
5898 
5899    END get_parent_position;
5900 
5901 
5902 
5903    -- *************************************************************************
5904    --    GET_NEXT_INCOMPLETE_DU
5905    -- *************************************************************************
5906 
5907    PROCEDURE get_next_incomplete_du( itemtype IN  VARCHAR2,
5908                                      itemkey  IN  VARCHAR2,
5909                                      actid    IN  NUMBER,
5910                                      funcmode IN  VARCHAR2,
5911                                      result   OUT NOCOPY VARCHAR2) IS
5912 
5913       l_tu_id        igi_exp_dus.tu_id%TYPE;
5914       l_du_prep_name fnd_user.user_name%TYPE;
5915       l_du_id        igi_exp_dus.du_id%TYPE;
5916 
5917    BEGIN
5918 
5919       -- =============== START DEBUG LOG ================
5920          DEBUG_LOG_STRING (l_proc_level, 'Get_next_incomplete_du.Msg1',
5921                            ' ** START GET_NEXT_INCOMPLETE_DU ** ');
5922       -- =============== END DEBUG LOG ==================
5923 
5924       IF (funcmode = 'RUN') THEN
5925 
5926          -- Get the TU id
5927          l_tu_id
5928             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5929                                             itemkey  => itemkey,
5930                                             aname    => 'TU_ID');
5931 
5932          -- =============== START DEBUG LOG ================
5933             DEBUG_LOG_STRING (l_proc_level, 'Get_next_incomplete_du.Msg1',
5934                               ' ** START GET_NEXT_INCOMPLETE_DU ** ');
5935          -- =============== END DEBUG LOG ==================
5936 
5937          -- Get the next DU which has been approved and needs completing
5938          SELECT du.du_id
5939                ,fnd.user_name
5940          INTO   l_du_id
5941                ,l_du_prep_name
5942          FROM   igi_exp_dus du
5943                ,fnd_user fnd
5944          WHERE  du.tu_id = l_tu_id
5945          AND    du.du_status = 'ATR'
5946          AND    du.du_by_user_id = fnd.user_id
5947          AND    rownum = 1;
5948 
5949          -- =============== START DEBUG LOG ================
5950             DEBUG_LOG_STRING (l_proc_level, 'Get_next_incomplete_du.Msg1',
5951                               ' ** START GET_NEXT_INCOMPLETE_DU ** ');
5952          -- =============== END DEBUG LOG ==================
5953 
5954          -- Set the du_id_for_completion attribute
5955          wf_engine.SetItemAttrNumber( itemtype => itemtype,
5956                                       itemkey  => itemkey,
5957                                       aname    => 'DU_ID_FOR_COMPLETION',
5958                                       avalue   => l_du_id);
5959 
5960          -- =============== START DEBUG LOG ================
5961             DEBUG_LOG_STRING (l_proc_level, 'Get_next_incomplete_du.Msg1',
5962                               ' ** START GET_NEXT_INCOMPLETE_DU ** ');
5963          -- =============== END DEBUG LOG ==================
5964 
5965          -- Set the du_prep_name_for_com attribute
5966          wf_engine.SetItemAttrText  ( itemtype => itemtype,
5967                                       itemkey  => itemkey,
5968                                       aname    => 'DU_PREP_NAME_FOR_COM',
5969                                       avalue   => l_du_prep_name);
5970 
5971          -- =============== START DEBUG LOG ================
5972             DEBUG_LOG_STRING (l_proc_level, 'Get_next_incomplete_du.Msg1',
5973                               ' ** START GET_NEXT_INCOMPLETE_DU ** ');
5974          -- =============== END DEBUG LOG ==================
5975 
5976       END IF;
5977 
5978       IF (funcmode <> 'RUN') THEN
5979          result := 'COMPLETE';
5980          -- =============== START DEBUG LOG ================
5981             DEBUG_LOG_STRING (l_proc_level, 'Get_next_incomplete_du.Msg1',
5982                               ' ** START GET_NEXT_INCOMPLETE_DU ** ');
5983          -- =============== END DEBUG LOG ==================
5984          return;
5985       END IF;
5986 
5987       -- =============== START DEBUG LOG ================
5988          DEBUG_LOG_STRING (l_proc_level, 'Get_next_incomplete_du.Msg1',
5989                            ' ** START GET_NEXT_INCOMPLETE_DU ** ');
5990       -- =============== END DEBUG LOG ==================
5991 
5992    EXCEPTION
5993       WHEN OTHERS THEN
5994          wf_core.context('IGI_EXP_APPROVAL_PKG','get_next_incomplete_du',itemtype,itemkey,
5995                          to_char(actid),funcmode);
5996          -- =============== START DEBUG LOG ================
5997             DEBUG_LOG_UNEXP_ERROR ('Get_next_incomplete_du.Unexp1','DEFAULT');
5998          -- =============== END DEBUG LOG ==================
5999          raise;
6000    END get_next_incomplete_du;
6001 
6002    -- *************************************************************************
6003    --    PROCESS_TRANSACTIONS
6004    -- *************************************************************************
6005 
6006    PROCEDURE process_transactions ( itemtype IN  VARCHAR2,
6007                                     itemkey  IN  VARCHAR2,
6008                                     actid    IN  NUMBER,
6009                                     funcmode IN  VARCHAR2,
6010                                     result   OUT NOCOPY VARCHAR2) IS
6011 
6012       l_du_id                igi_exp_dus.du_id%TYPE;
6013       l_app_id               igi_exp_du_type_headers.application_id%TYPE;
6014       l_order_number         igi_exp_dus.du_order_number%TYPE;
6015       l_legal_number         igi_exp_dus.du_legal_number%TYPE;
6016       l_failed_du            VARCHAR2(510);
6017       l_failed_trx           VARCHAR2(50);
6018       l_gl_date              DATE := sysdate;
6019       l_error_message        VARCHAR2(4000);
6020       l_trx_failed_err_mess  VARCHAR2(4000);
6021       l_trx_id               NUMBER;
6022 
6023    BEGIN
6024 
6025       -- =============== START DEBUG LOG ================
6026          DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg1',
6027                            ' ** START PROCESS_TRANSACTIONS ** ');
6028       -- =============== END DEBUG LOG ==================
6029 
6030       IF (funcmode = 'RUN') THEN
6031 
6032          -- Get the DU id
6033          l_du_id
6034             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
6035                                             itemkey  => itemkey,
6036                                             aname    => 'DU_ID_FOR_COMPLETION');
6037 
6038          -- =============== START DEBUG LOG ================
6039             DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg2',
6040                               ' GetItemAttrNumber DU_ID_FOR_COMPLETION --> ' || l_du_id);
6041          -- =============== END DEBUG LOG ==================
6042 
6043          -- Get the application id for the du
6044          SELECT du_type.application_id
6045          INTO   l_app_id
6046          FROM   igi_exp_du_type_headers_all du_type
6047                ,igi_exp_dus du
6048          WHERE  du.du_id = l_du_id
6049          AND    du.du_type_header_id = du_type.du_type_header_id;
6050 
6051          -- =============== START DEBUG LOG ================
6052             DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg3',
6053                               ' l_app_id --> ' || l_app_id);
6054             DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg4',
6055                               ' Calling igi_exp_utils.complete_du ');
6056          -- =============== END DEBUG LOG ==================
6057 
6058          -- Call the utility to complete (or approve) transactions
6059          igi_exp_utils.complete_du(l_du_id          -- p_du_id
6060                                   ,l_app_id         -- p_app_id
6061                                   ,l_gl_date        -- p_gl_date
6062                                   ,l_error_message  -- p_error_message
6063                                   ,l_trx_id);       -- p_trx_id
6064 
6065          -- =============== START DEBUG LOG ================
6066             DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg5',
6067                               ' l_error_message --> ' || l_error_message);
6068          -- =============== END DEBUG LOG ==================
6069 
6070          IF (l_error_message <> 'Success') THEN
6071 
6072             SELECT du_order_number, du_legal_number
6073             INTO   l_order_number, l_legal_number
6074             FROM   igi_exp_dus
6075             WHERE  du_id = l_du_id;
6076 
6077             -- =============== START DEBUG LOG ================
6078                DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg6',
6079                                  ' l_order_number --> ' || l_order_number ||
6080                                  ' l_legal_number --> ' || l_legal_number);
6081             -- =============== END DEBUG LOG ==================
6082 
6083             l_failed_du := l_order_number;
6084 
6085             -- =============== START DEBUG LOG ================
6086                DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg7',
6087                                  ' l_failed_du --> ' || l_failed_du);
6088             -- =============== END DEBUG LOG ==================
6089 
6090             IF (l_legal_number is not null) THEN
6091                l_failed_du := l_failed_du||' ('||l_legal_number||')';
6092             END IF;
6093 
6094             -- =============== START DEBUG LOG ================
6095                DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg8',
6096                                  ' After if -- l_failed_du --> ' || l_failed_du);
6097             -- =============== END DEBUG LOG ==================
6098 
6099             IF (l_trx_id is not null) THEN
6100                -- If the process failed for a particular transaction then
6101                -- Find the transaction name of the failed transaction
6102                IF (l_app_id = 200) THEN
6103 
6104                   -- =============== START DEBUG LOG ================
6105                      DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg9',
6106                                        ' l_trx_id is not null AND l_app_id = 200 ');
6107                   -- =============== END DEBUG LOG ==================
6108 
6109                   SELECT invoice_num
6110                   INTO   l_failed_trx
6111                   FROM   ap_invoices
6112                   WHERE  invoice_id = l_trx_id;
6113 
6114                   -- =============== START DEBUG LOG ================
6115                      DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg10',
6116                                        ' l_failed_trx --> ' || l_failed_trx);
6117                   -- =============== END DEBUG LOG ==================
6118 
6119                ELSIF (l_app_id = 222) THEN
6120 
6121                   -- =============== START DEBUG LOG ================
6122                      DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg11',
6123                                        ' l_trx_id is not null AND l_app_id = 222 ');
6124                   -- =============== END DEBUG LOG ==================
6125 
6126                   SELECT trx_number
6127                   INTO   l_failed_trx
6128                   FROM   ra_customer_trx
6129                   WHERE  customer_trx_id = l_trx_id;
6130 
6131                   -- =============== START DEBUG LOG ================
6132                      DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg12',
6133                                        ' l_failed_trx --> ' || l_failed_trx);
6134                   -- =============== END DEBUG LOG ==================
6135 
6136                END IF;
6137             END IF;
6138 
6139 
6140             -- Set the failed_du attribute
6141             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6142                                          itemkey  => itemkey,
6143                                          aname    => 'FAILED_DU',
6144                                          avalue   => l_failed_du);
6145 
6146             -- =============== START DEBUG LOG ================
6147                DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg13',
6148                                  ' SetItemAttrText FAILED_DU --> ' || l_failed_du);
6149             -- =============== END DEBUG LOG ==================
6150 
6151             -- Set the failed_trx attribute
6152             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6153                                          itemkey  => itemkey,
6154                                          aname    => 'FAILED_TRX',
6155                                          avalue   => l_failed_trx);
6156 
6157             -- =============== START DEBUG LOG ================
6158                DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg14',
6159                                  ' SetItemAttrText FAILED_TRX --> ' || l_failed_trx);
6160             -- =============== END DEBUG LOG ==================
6161 
6162             -- Want the trx_failed_error_message to be a list of du_ids which
6163             -- failed along with the error message for each du
6164             -- Therefore, get the current item attribute trx_failed_error_message
6165             -- and append this DU_ID and error message to it.
6166 
6167             -- Get the current error message
6168             l_trx_failed_err_mess
6169                := wf_engine.GetItemAttrText  ( itemtype => itemtype,
6170                                                itemkey  => itemkey,
6171                                                aname    => 'TRX_FAILED_ERROR_MESSAGE');
6172 
6173             -- =============== START DEBUG LOG ================
6174                DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg15',
6175                                  ' GetItemAttrText TRX_FAILED_ERROR_MESSAGE --> ' || l_trx_failed_err_mess);
6176             -- =============== END DEBUG LOG ==================
6177 
6178 
6179             -- Append this DU and error message to it
6180             l_trx_failed_err_mess := l_trx_failed_err_mess||', '||to_char(l_du_id)||l_error_message;
6181 
6182             -- =============== START DEBUG LOG ================
6183                DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg16',
6184                                  ' l_trx_failed_err_mess --> ' || l_trx_failed_err_mess);
6185             -- =============== END DEBUG LOG ==================
6186 
6187             -- Set the trx_failed_error_message attribute
6188             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6189                                          itemkey  => itemkey,
6190                                          aname    => 'TRX_FAILED_ERROR_MESSAGE',
6191                                          avalue   => l_trx_failed_err_mess);
6192 
6193             -- =============== START DEBUG LOG ================
6194                DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg17',
6195                                  ' SetItemAttrText TRX_FAILED_ERROR_MESSAGE --> ' || l_trx_failed_err_mess);
6196             -- =============== END DEBUG LOG ==================
6197 
6198             -- Set the result to 'Failure'
6199             result := 'COMPLETE:FAILURE';
6200 
6201          ELSE
6202             result := 'COMPLETE:SUCCESS';
6203 
6204          END IF;
6205 
6206          -- =============== START DEBUG LOG ================
6207             DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg18',
6208                               ' result --> ' || result);
6209          -- =============== END DEBUG LOG ==================
6210 
6211       END IF;
6212 
6213       IF (funcmode <> 'RUN') THEN
6214          result := 'COMPLETE';
6215          -- =============== START DEBUG LOG ================
6216             DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg19',
6217                               ' funcmode <> RUN -- result --> ' || result);
6218          -- =============== END DEBUG LOG ==================
6219          return;
6220       END IF;
6221 
6222       -- =============== START DEBUG LOG ================
6223          DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg20',
6224                            ' ** END PROCESS_TRANSACTIONS ** ');
6225       -- =============== END DEBUG LOG ==================
6226 
6227    EXCEPTION
6228       WHEN OTHERS THEN
6229          wf_core.context('IGI_EXP_APPROVAL_PKG','process_transactions',itemtype,itemkey,
6230                          to_char(actid),funcmode);
6231          -- =============== START DEBUG LOG ================
6232             DEBUG_LOG_UNEXP_ERROR ('Process_transactions.Unexp1','DEFAULT');
6233          -- =============== END DEBUG LOG ==================
6234          raise;
6235 
6236    END process_transactions;
6237 
6238 
6239    -- *************************************************************************
6240    --    SET_DU_TO_COMPLETE
6241    -- *************************************************************************
6242 
6243    PROCEDURE set_du_to_complete   ( itemtype IN  VARCHAR2,
6244                                     itemkey  IN  VARCHAR2,
6245                                     actid    IN  NUMBER,
6246                                     funcmode IN  VARCHAR2,
6247                                     result   OUT NOCOPY VARCHAR2) IS
6248 
6249       l_du_id    igi_exp_dus.du_id%TYPE;
6250 
6251    BEGIN
6252 
6253       -- =============== START DEBUG LOG ================
6254          DEBUG_LOG_STRING (l_proc_level, 'Set_du_to_complete.Msg1',
6255                            ' ** START SET_DU_TO_COMPLETE ** ');
6256       -- =============== END DEBUG LOG ==================
6257 
6258       IF (funcmode = 'RUN') THEN
6259 
6260          -- Get the DU id
6261          l_du_id
6262             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
6263                                             itemkey  => itemkey,
6264                                             aname    => 'DU_ID_FOR_COMPLETION');
6265 
6266          -- =============== START DEBUG LOG ================
6267             DEBUG_LOG_STRING (l_proc_level, 'Set_du_to_complete.Msg1',
6268                               ' GetItemAttrNumber DU_ID_FOR_COMPLETION --> '|| l_du_id);
6269          -- =============== END DEBUG LOG ==================
6270 
6271          UPDATE igi_exp_dus
6272          SET    du_status = 'COM'
6273          WHERE  du_id = l_du_id;
6274 
6275          -- =============== START DEBUG LOG ================
6276             DEBUG_LOG_STRING (l_proc_level, 'Set_du_to_complete.Msg1',
6277                               ' UPDATE igi_exp_dus status - COM --> ' || SQL%ROWCOUNT);
6278          -- =============== END DEBUG LOG ==================
6279 
6280       END IF;
6281 
6282       IF (funcmode <> 'RUN') THEN
6283          result := 'COMPLETE';
6284          -- =============== START DEBUG LOG ================
6285             DEBUG_LOG_STRING (l_proc_level, 'Set_du_to_complete.Msg1',
6286                               ' funcmode <> RUN -- result --> ' || result);
6287          -- =============== END DEBUG LOG ==================
6288          return;
6289       END IF;
6290 
6291       -- =============== START DEBUG LOG ================
6292          DEBUG_LOG_STRING (l_proc_level, 'Set_du_to_complete.Msg1',
6293                            ' ** END SET_DU_TO_COMPLETE ** ');
6294       -- =============== END DEBUG LOG ==================
6295 
6296    EXCEPTION
6297       WHEN OTHERS THEN
6298          wf_core.context('IGI_EXP_APPROVAL_PKG','set_du_to_complete',itemtype,itemkey,
6299                          to_char(actid),funcmode);
6300          -- =============== START DEBUG LOG ================
6301             DEBUG_LOG_UNEXP_ERROR ('Set_du_to_complete.Unexp1','DEFAULT');
6302          -- =============== END DEBUG LOG ==================
6303          raise;
6304 
6305    END set_du_to_complete;
6306 
6307 
6308 
6309    -- *************************************************************************
6310    --    PUT_FAILED_DU_ON_HOLD
6311    -- *************************************************************************
6312 
6313    PROCEDURE put_failed_du_on_hold( itemtype IN  VARCHAR2,
6314                                     itemkey  IN  VARCHAR2,
6315                                     actid    IN  NUMBER,
6316                                     funcmode IN  VARCHAR2,
6317                                     result   OUT NOCOPY VARCHAR2) IS
6318 
6319       l_du_id    igi_exp_dus.du_id%TYPE;
6320 
6321    BEGIN
6322 
6323       -- =============== START DEBUG LOG ================
6324          DEBUG_LOG_STRING (l_proc_level, 'Put_failed_du_on_hold.Msg1',
6325                            ' ** START PUT_FAILED_DU_ON_HOLD ** ');
6326       -- =============== END DEBUG LOG ==================
6327 
6328       IF (funcmode = 'RUN') THEN
6329 
6330          -- Get the DU id
6331          l_du_id
6332             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
6333                                             itemkey  => itemkey,
6334                                             aname    => 'DU_ID_FOR_COMPLETION');
6335 
6336          -- =============== START DEBUG LOG ================
6337             DEBUG_LOG_STRING (l_proc_level, 'Put_failed_du_on_hold.Msg2',
6338                               ' GetItemAttrNumber DU_ID_FOR_COMPLETION --> ' || l_du_id);
6339          -- =============== END DEBUG LOG ==================
6340 
6341          UPDATE igi_exp_dus
6342          SET    du_status = 'HLD'
6343          WHERE  du_id = l_du_id;
6344 
6345          -- =============== START DEBUG LOG ================
6346             DEBUG_LOG_STRING (l_proc_level, 'Put_failed_du_on_hold.Msg3',
6347                               ' UPDATE igi_exp_dus du_status = HLD --> ' || SQL%ROWCOUNT);
6348          -- =============== END DEBUG LOG ==================
6349 
6350       END IF;
6351 
6352       IF (funcmode <> 'RUN') THEN
6353          result := 'COMPLETE';
6354          -- =============== START DEBUG LOG ================
6355             DEBUG_LOG_STRING (l_proc_level, 'Put_failed_du_on_hold.Msg4',
6356                               ' funcmode <> RUN -- result --> ' || result);
6357          -- =============== END DEBUG LOG ==================
6358          return;
6359       END IF;
6360 
6361       -- =============== START DEBUG LOG ================
6362          DEBUG_LOG_STRING (l_proc_level, 'Put_failed_du_on_hold.Msg5',
6363                            ' ** END PUT_FAILED_DU_ON_HOLD ** ');
6364       -- =============== END DEBUG LOG ==================
6365 
6366    EXCEPTION
6367       WHEN OTHERS THEN
6368          wf_core.context('IGI_EXP_APPROVAL_PKG','put_failed_du_on_hold',itemtype,itemkey,
6369                          to_char(actid),funcmode);
6370          -- =============== START DEBUG LOG ================
6371             DEBUG_LOG_UNEXP_ERROR ('Put_failed_du_on_hold.Unexp1','DEFAULT');
6372          -- =============== END DEBUG LOG ==================
6373          raise;
6374 
6375    END put_failed_du_on_hold;
6376 
6377 
6378    -- *************************************************************************
6379    --    CHECK_DUS_COMPLETED
6380    -- *************************************************************************
6381 
6382    PROCEDURE check_dus_completed  ( itemtype IN  VARCHAR2,
6383                                     itemkey  IN  VARCHAR2,
6384                                     actid    IN  NUMBER,
6385                                     funcmode IN  VARCHAR2,
6386                                     result   OUT NOCOPY VARCHAR2) IS
6387 
6388       l_tu_id        igi_exp_dus.tu_id%TYPE;
6389       l_incom_count  NUMBER;
6390 
6391    BEGIN
6392 
6393       -- =============== START DEBUG LOG ================
6394          DEBUG_LOG_STRING (l_proc_level, 'Check_dus_completed.Msg1',
6395                            ' ** START CHECK_DUS_COMPLETED ** ');
6396       -- =============== END DEBUG LOG ==================
6397 
6398       IF (funcmode = 'RUN') THEN
6399 
6400          -- Get the TU id
6401          l_tu_id
6402             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
6403                                             itemkey  => itemkey,
6404                                             aname    => 'TU_ID');
6405 
6406          -- =============== START DEBUG LOG ================
6407             DEBUG_LOG_STRING (l_proc_level, 'Check_dus_completed.Msg2',
6408                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
6409          -- =============== END DEBUG LOG ==================
6410 
6411          SELECT count(*)
6412          INTO   l_incom_count
6413          FROM   igi_exp_dus
6414          WHERE  tu_id = l_tu_id
6415          AND    du_status = 'ATR';
6416 
6417          -- =============== START DEBUG LOG ================
6418             DEBUG_LOG_STRING (l_proc_level, 'Check_dus_completed.Msg3',
6419                               ' l_incom_count --> ' || l_incom_count);
6420          -- =============== END DEBUG LOG ==================
6421 
6422 
6423          IF (l_incom_count = 0) THEN
6424             -- There are no more DUs left waiting completion
6425             -- Set the result to 'No'
6426             result := 'COMPLETE:N';
6427          ELSE
6428             -- There is at least one DU waiting completion
6429             -- Set the result to 'Yes'
6430             result := 'COMPLETE:Y';
6431          END IF;
6432 
6433          -- =============== START DEBUG LOG ================
6434             DEBUG_LOG_STRING (l_proc_level, 'Check_dus_completed.Msg4',
6435                               ' result --> ' || result);
6436          -- =============== END DEBUG LOG ==================
6437 
6438       END IF;
6439 
6440       IF (funcmode <> 'RUN') THEN
6441          result := 'COMPLETE';
6442          -- =============== START DEBUG LOG ================
6443             DEBUG_LOG_STRING (l_proc_level, 'Check_dus_completed.Msg5',
6444                               ' funcmode <> RUN -- result --> ' || result);
6445          -- =============== END DEBUG LOG ==================
6446          return;
6447       END IF;
6448 
6449       -- =============== START DEBUG LOG ================
6450          DEBUG_LOG_STRING (l_proc_level, 'Check_dus_completed.Msg6',
6451                            ' ** END CHECK_DUS_COMPLETED ** ');
6452       -- =============== END DEBUG LOG ==================
6453 
6454    EXCEPTION
6455       WHEN OTHERS THEN
6456          wf_core.context('IGI_EXP_APPROVAL_PKG','check_dus_completed',itemtype,itemkey,
6457                          to_char(actid),funcmode);
6458          -- =============== START DEBUG LOG ================
6459             DEBUG_LOG_UNEXP_ERROR ('Check_dus_completed.Unexp1','DEFAULT');
6460          -- =============== END DEBUG LOG ==================
6461          raise;
6462    END check_dus_completed;
6463 
6464 
6465 
6466    -- *************************************************************************
6467    --    ANY_DUS_WITH_TRX_FAIL
6468    -- *************************************************************************
6469 
6470    PROCEDURE any_dus_with_trx_fail( itemtype IN  VARCHAR2,
6471                                     itemkey  IN  VARCHAR2,
6472                                     actid    IN  NUMBER,
6473                                     funcmode IN  VARCHAR2,
6474                                     result   OUT NOCOPY VARCHAR2) IS
6475 
6476 
6477       l_tu_id           igi_exp_dus.tu_id%TYPE;
6478       l_failed_du_count NUMBER;
6479       l_du_hold_list    VARCHAR2(28000);
6480 
6481       CURSOR c_du_hold_info(p_tu_id igi_exp_dus.tu_id%TYPE)
6482       IS
6483          SELECT du_order_number
6484                ,du_legal_number
6485          FROM   igi_exp_dus
6486          WHERE  tu_id = p_tu_id
6487          AND    du_status = 'HLD';
6488 
6489    BEGIN
6490 
6491       -- =============== START DEBUG LOG ================
6492          DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg1',
6493                            ' ** START ANY_DUS_WITH_TRX_FAIL ** ');
6494       -- =============== END DEBUG LOG ==================
6495 
6496       IF (funcmode = 'RUN') THEN
6497 
6498          -- Get the TU id
6499          l_tu_id
6500             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
6501                                             itemkey  => itemkey,
6502                                             aname    => 'TU_ID');
6503 
6504          -- =============== START DEBUG LOG ================
6505             DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg2',
6506                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
6507          -- =============== END DEBUG LOG ==================
6508 
6509          SELECT count(*)
6510          INTO   l_failed_du_count
6511          FROM   igi_exp_dus
6512          WHERE  tu_id = l_tu_id
6513          AND    du_status = 'HLD';
6514 
6515          -- =============== START DEBUG LOG ================
6516             DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg3',
6517                               ' l_failed_du_count --> ' || l_failed_du_count);
6518          -- =============== END DEBUG LOG ==================
6519 
6520          IF (l_failed_du_count = 0) THEN
6521             -- No DUs were put on hold due to transaction failure
6522             -- Set the result to 'No'
6523             result := 'COMPLETE:N';
6524 
6525             -- =============== START DEBUG LOG ================
6526                DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg4',
6527                                  ' result --> ' || result);
6528             -- =============== END DEBUG LOG ==================
6529 
6530          ELSE
6531 
6532             FOR I IN c_du_hold_info(l_tu_id)
6533             LOOP
6534 
6535                IF (l_du_hold_list is NULL) THEN
6536                   l_du_hold_list := I.du_order_number;
6537                ELSE
6538                   l_du_hold_list := l_du_hold_list ||I.du_order_number;
6539                END IF;
6540 
6541                -- =============== START DEBUG LOG ================
6542                   DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg5',
6543                                     ' du_order_number --> ' || I.du_order_number);
6544                -- =============== END DEBUG LOG ==================
6545 
6546                IF (I.du_legal_number is not null) THEN
6547                   l_du_hold_list := l_du_hold_list||' ('||I.du_legal_number||')';
6548                END IF;
6549 
6550                -- =============== START DEBUG LOG ================
6551                   DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg6',
6552                                     ' I.du_legal_number --> ' || I.du_legal_number);
6553                -- =============== END DEBUG LOG ==================
6554 
6555                l_du_hold_list := l_du_hold_list||fnd_global.local_chr(10);
6556 
6557                IF LENGTH(l_du_hold_list) > 28000 THEN
6558                   exit;
6559                END IF;
6560 
6561             END LOOP;
6562 
6563            -- Set the all_dus_list attribute
6564             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6565                                          itemkey  => itemkey,
6566                                          aname    => 'ADD_ATTR1',
6567                                          avalue   => substr(l_du_hold_list, 1, 4000));
6568 
6569             -- =============== START DEBUG LOG ================
6570                DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg7',
6571                                  ' SetItemAttrText ADD_ATTR1 --> ' || substr(l_du_hold_list, 1, 4000));
6572             -- =============== END DEBUG LOG ==================
6573 
6574             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6575                                          itemkey  => itemkey,
6576                                          aname    => 'ADD_ATTR2',
6577                                          avalue   => substr(l_du_hold_list, 4001, 4000));
6578 
6579             -- =============== START DEBUG LOG ================
6580                DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg8',
6581                                  ' SetItemAttrText ADD_ATTR2 --> ' || substr(l_du_hold_list, 4001, 4000));
6582             -- =============== END DEBUG LOG ==================
6583 
6584             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6585                                          itemkey  => itemkey,
6586                                          aname    => 'ADD_ATTR3',
6587                                          avalue   => substr(l_du_hold_list, 8001, 4000));
6588 
6589             -- =============== START DEBUG LOG ================
6590                DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg9',
6591                                  ' SetItemAttrText ADD_ATTR3 --> ' || substr(l_du_hold_list, 8001, 4000));
6592             -- =============== END DEBUG LOG ==================
6593 
6594             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6595                                          itemkey  => itemkey,
6596                                          aname    => 'ADD_ATTR4',
6597                                          avalue   => substr(l_du_hold_list, 12001, 4000));
6598 
6599             -- =============== START DEBUG LOG ================
6600                DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg10',
6601                                  ' SetItemAttrText ADD_ATTR4 --> ' || substr(l_du_hold_list, 12001, 4000));
6602             -- =============== END DEBUG LOG ==================
6603 
6604             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6605                                          itemkey  => itemkey,
6606                                          aname    => 'ADD_ATTR5',
6607                                          avalue   => substr(l_du_hold_list, 16001, 4000));
6608 
6609             -- =============== START DEBUG LOG ================
6610                DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg11',
6611                                  ' SetItemAttrText ADD_ATTR5 --> ' || substr(l_du_hold_list, 16001, 4000));
6612             -- =============== END DEBUG LOG ==================
6613 
6614             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6615                                          itemkey  => itemkey,
6616                                          aname    => 'ADD_ATTR6',
6617                                          avalue   => substr(l_du_hold_list, 20001, 4000));
6618 
6619             -- =============== START DEBUG LOG ================
6620                DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg12',
6621                                  ' SetItemAttrText ADD_ATTR6 --> ' || substr(l_du_hold_list, 20001, 4000));
6622             -- =============== END DEBUG LOG ==================
6623 
6624             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6625                                          itemkey  => itemkey,
6626                                          aname    => 'ADD_ATTR7',
6627                                          avalue   => substr(l_du_hold_list, 24001, 4000));
6628 
6629             -- =============== START DEBUG LOG ================
6630                DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg13',
6631                                  ' SetItemAttrText ADD_ATTR7 --> ' || substr(l_du_hold_list, 24001, 4000));
6632             -- =============== END DEBUG LOG ==================
6633 
6634             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6635                                          itemkey  => itemkey,
6636                                          aname    => 'ALL_DUS_LIST',
6637                                          avalue   => 'plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
6638 
6639 
6640             -- =============== START DEBUG LOG ================
6641                DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg14',
6642                                  ' SetItemAttrText ALL_DUS_LIST --> ' ||
6643                                  ' plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
6644             -- =============== END DEBUG LOG ==================
6645 
6646             -- Set the result to 'Yes'
6647             result := 'COMPLETE:Y';
6648 
6649             -- =============== START DEBUG LOG ================
6650                DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg15',
6651                                  ' result --> ' || result);
6652             -- =============== END DEBUG LOG ==================
6653 
6654          END IF;
6655 
6656       END IF;
6657 
6658       IF (funcmode <> 'RUN') THEN
6659          result := 'COMPLETE';
6660          -- =============== START DEBUG LOG ================
6661             DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg16',
6662                               ' funcmode <> RUN -- result --> ' || result);
6663          -- =============== END DEBUG LOG ==================
6664          return;
6665       END IF;
6666 
6667       -- =============== START DEBUG LOG ================
6668          DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg17',
6669                            ' ** END ANY_DUS_WITH_TRX_FAIL ** ');
6670       -- =============== END DEBUG LOG ==================
6671 
6672    EXCEPTION
6673       WHEN OTHERS THEN
6674          wf_core.context('IGI_EXP_APPROVAL_PKG','any_dus_with_trx_fail',itemtype,itemkey,
6675                          to_char(actid),funcmode);
6676          -- =============== START DEBUG LOG ================
6677             DEBUG_LOG_UNEXP_ERROR ('Any_dus_with_trx_fail.Unexp1','DEFAULT');
6678          -- =============== END DEBUG LOG ==================
6679          raise;
6680 
6681    END any_dus_with_trx_fail;
6682 
6683 
6684 
6685    -- *************************************************************************
6686    --    REMOVE_ALL_ON_HOLD_DUS
6687    -- *************************************************************************
6688 
6689    PROCEDURE remove_all_on_hold_dus( itemtype IN  VARCHAR2,
6690                                     itemkey  IN  VARCHAR2,
6691                                     actid    IN  NUMBER,
6692                                     funcmode IN  VARCHAR2,
6693                                     result   OUT NOCOPY VARCHAR2) IS
6694 
6695       l_tu_id      igi_exp_dus.tu_id%TYPE;
6696       l_du_amount  igi_exp_dus.du_amount%TYPE;
6697 
6698    BEGIN
6699 
6700       -- =============== START DEBUG LOG ================
6701          DEBUG_LOG_STRING (l_proc_level, 'Remove_all_on_hold_dus.Msg1',
6702                            ' ** START REMOVE_ALL_ON_HOLD_DUS ** ');
6703       -- =============== END DEBUG LOG ==================
6704 
6705       IF (funcmode = 'RUN') THEN
6706 
6707          -- Get the TU id
6708          l_tu_id
6709             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
6710                                             itemkey  => itemkey,
6711                                             aname    => 'TU_ID');
6712 
6713          -- =============== START DEBUG LOG ================
6714             DEBUG_LOG_STRING (l_proc_level, 'Remove_all_on_hold_dus.Msg2',
6715                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
6716          -- =============== END DEBUG LOG ==================
6717 
6718          -- OPSF(I) EXP Bug 2415293  S Brewer 18-JUL-2002 Start(3)
6719          -- Before removing the DUs which were put on hold, we need
6720          -- to update the TU amount to reflect the DUs were removed
6721          -- So, find the total DU amount for the DUs to be removed
6722          -- and update the TU amount
6723          -- i.e. New TU amount = TU amount - DU amount
6724 
6725          -- Find the total DU amount
6726          SELECT sum(du_amount)
6727          INTO   l_du_amount
6728          FROM   igi_exp_dus
6729          WHERE  tu_id = l_tu_id
6730          AND    du_status = 'HLD';
6731 
6732          -- =============== START DEBUG LOG ================
6733             DEBUG_LOG_STRING (l_proc_level, 'Remove_all_on_hold_dus.Msg3',
6734                               ' l_du_amount --> ' || l_du_amount);
6735          -- =============== END DEBUG LOG ==================
6736 
6737          -- Now update the TU amount
6738          UPDATE igi_exp_tus
6739          SET    tu_amount = tu_amount - l_du_amount
6740          WHERE  tu_id = l_tu_id;
6741 
6742          -- =============== START DEBUG LOG ================
6743             DEBUG_LOG_STRING (l_proc_level, 'Remove_all_on_hold_dus.Msg4',
6744                               ' UPDATE igi_exp_tus -> ' || SQL%ROWCOUNT);
6745          -- =============== END DEBUG LOG ==================
6746 
6747 
6748          -- OPSF(I) EXP Bug 2415293  S Brewer 18-JUL-2002 End(3)
6749 
6750          -- Remove the DUs which were put on hold (due to transaction
6751          -- completion failure)  from the TU
6752          UPDATE igi_exp_dus
6753          SET    tu_id = null
6754          WHERE  tu_id = l_tu_id
6755          AND    du_status = 'HLD';
6756 
6757          -- =============== START DEBUG LOG ================
6758             DEBUG_LOG_STRING (l_proc_level, 'Remove_all_on_hold_dus.Msg5',
6759                               ' UPDATE igi_exp_dus status = HLD --> ' || SQL%ROWCOUNT);
6760          -- =============== END DEBUG LOG ==================
6761 
6762       END IF;
6763 
6764       IF (funcmode <> 'RUN') THEN
6765          result := 'COMPLETE';
6766          -- =============== START DEBUG LOG ================
6767             DEBUG_LOG_STRING (l_proc_level, 'Remove_all_on_hold_dus.Msg6',
6768                               ' funcmode <> RUN -- result --> ' || result);
6769          -- =============== END DEBUG LOG ==================
6770          return;
6771       END IF;
6772 
6773       -- =============== START DEBUG LOG ================
6774          DEBUG_LOG_STRING (l_proc_level, 'Remove_all_on_hold_dus.Msg7',
6775                            ' ** END REMOVE_ALL_ON_HOLD_DUS ** ');
6776       -- =============== END DEBUG LOG ==================
6777 
6778    EXCEPTION
6779       WHEN OTHERS THEN
6780          wf_core.context('IGI_EXP_APPROVAL_PKG','remove_all_on_hold_dus',itemtype,itemkey,
6781                          to_char(actid),funcmode);
6782          -- =============== START DEBUG LOG ================
6783             DEBUG_LOG_UNEXP_ERROR ('Remove_all_on_hold_dus.Unexp1','DEFAULT');
6784          -- =============== END DEBUG LOG ==================
6785          raise;
6786 
6787    END remove_all_on_hold_dus;
6788 
6789 
6790 
6791    -- *************************************************************************
6792    --    CHECK_FOR_COMPLETE_DUS
6793    -- *************************************************************************
6794 
6795    PROCEDURE check_for_complete_dus( itemtype IN  VARCHAR2,
6796                                     itemkey  IN  VARCHAR2,
6797                                     actid    IN  NUMBER,
6798                                     funcmode IN  VARCHAR2,
6799                                     result   OUT NOCOPY VARCHAR2) IS
6800 
6801       l_tu_id          igi_exp_dus.tu_id%TYPE;
6802       l_com_du_count   NUMBER;
6803 
6804    BEGIN
6805 
6806       -- =============== START DEBUG LOG ================
6807          DEBUG_LOG_STRING (l_proc_level, 'Check_for_complete_dus.Msg1',
6808                            ' ** START CHECK_FOR_COMPLETE_DUS ** ');
6809       -- =============== END DEBUG LOG ==================
6810 
6811       IF (funcmode = 'RUN') THEN
6812 
6813          -- Get the TU id
6814          l_tu_id
6815             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
6816                                             itemkey  => itemkey,
6817                                             aname    => 'TU_ID');
6818 
6819          -- =============== START DEBUG LOG ================
6820             DEBUG_LOG_STRING (l_proc_level, 'Check_for_complete_dus.Msg2',
6821                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
6822          -- =============== END DEBUG LOG ==================
6823 
6824          SELECT count(*)
6825          INTO   l_com_du_count
6826          FROM   igi_exp_dus
6827          WHERE  tu_id = l_tu_id
6828          AND    du_status = 'COM';
6829 
6830          -- =============== START DEBUG LOG ================
6831             DEBUG_LOG_STRING (l_proc_level, 'Check_for_complete_dus.Msg3',
6832                               ' l_com_du_count --> ' || l_com_du_count);
6833          -- =============== END DEBUG LOG ==================
6834 
6835          IF (l_com_du_count = 0) THEN
6836             -- There are no completed DUs in this TU
6837             -- Set result to 'No'
6838             result := 'COMPLETE:N';
6839          ELSE
6840             -- There is at least one completed DU in this TU
6841             -- Set result to 'Yes'
6842             result := 'COMPLETE:Y';
6843          END IF;
6844 
6845          -- =============== START DEBUG LOG ================
6846             DEBUG_LOG_STRING (l_proc_level, 'Check_for_complete_dus.Msg4',
6847                               ' result --> ' || result);
6848          -- =============== END DEBUG LOG ==================
6849       END IF;
6850 
6851       IF (funcmode <> 'RUN') THEN
6852          result := 'COMPLETE';
6853          -- =============== START DEBUG LOG ================
6854             DEBUG_LOG_STRING (l_proc_level, 'Check_for_complete_dus.Msg5',
6855                               'funcmode <> RUN -- result --> ' || result);
6856          -- =============== END DEBUG LOG ==================
6857          return;
6858       END IF;
6859 
6860       -- =============== START DEBUG LOG ================
6861          DEBUG_LOG_STRING (l_proc_level, 'Check_for_complete_dus.Msg6',
6862                            ' ** END CHECK_FOR_COMPLETE_DUS ** ');
6863       -- =============== END DEBUG LOG ==================
6864 
6865    EXCEPTION
6866       WHEN OTHERS THEN
6867          wf_core.context('IGI_EXP_APPROVAL_PKG','check_for_complete_dus',itemtype,itemkey,
6868                          to_char(actid),funcmode);
6869          -- =============== START DEBUG LOG ================
6870             DEBUG_LOG_UNEXP_ERROR ('Check_for_complete_dus.Unexp1','DEFAULT');
6871          -- =============== END DEBUG LOG ==================
6872          raise;
6873    END check_for_complete_dus;
6874 
6875 
6876 
6877    -- *************************************************************************
6878    --    BUILD_PREP_LIST_OF_COM_DUS
6879    -- *************************************************************************
6880 
6881    PROCEDURE build_prep_list_of_com_dus( itemtype IN  VARCHAR2,
6882                                          itemkey  IN  VARCHAR2,
6883                                          actid    IN  NUMBER,
6884                                          funcmode IN  VARCHAR2,
6885                                          result   OUT NOCOPY VARCHAR2) IS
6886 
6887       CURSOR c_prep_list(p_tu_id igi_exp_dus.tu_id%TYPE)
6888       IS
6889          SELECT distinct du_by_user_id
6890          FROM   igi_exp_dus
6891          WHERE  tu_id = p_tu_id
6892          AND    du_status = 'COM';
6893 
6894       l_tu_id     igi_exp_dus.tu_id%TYPE;
6895       l_user_id   igi_exp_dus.du_by_user_id%TYPE;
6896       l_user_list VARCHAR2(1000);
6897 
6898 
6899    BEGIN
6900 
6901       -- =============== START DEBUG LOG ================
6902          DEBUG_LOG_STRING (l_proc_level, 'Build_prep_list_of_com_dus.Msg1',
6903                            ' ** START BUILD_PREP_LIST_OF_COM_DUS ** ');
6904       -- =============== END DEBUG LOG ==================
6905 
6906       IF (funcmode = 'RUN') THEN
6907 
6908          -- Get the TU id
6909          l_tu_id
6910             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
6911                                             itemkey  => itemkey,
6912                                             aname    => 'TU_ID');
6913 
6914          -- =============== START DEBUG LOG ================
6915             DEBUG_LOG_STRING (l_proc_level, 'Build_prep_list_of_com_dus.Msg2',
6916                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
6917          -- =============== END DEBUG LOG ==================
6918 
6919          OPEN c_prep_list(l_tu_id);
6920          LOOP
6921             FETCH c_prep_list INTO l_user_id;
6922             EXIT WHEN c_prep_list%NOTFOUND;
6923             l_user_list := l_user_list||','||l_user_id;
6924             -- =============== START DEBUG LOG ================
6925                DEBUG_LOG_STRING (l_proc_level, 'Build_prep_list_of_com_dus.Msg3',
6926                                  ' l_user_list --> ' || l_user_list);
6927             -- =============== END DEBUG LOG ==================
6928          END LOOP;
6929          CLOSE c_prep_list;
6930 
6931             -- Set the all_dus_list attribute
6932             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6933                                          itemkey  => itemkey,
6934                                          aname    => 'COM_DU_PREP_LIST',
6935                                          avalue   => l_user_list);
6936 
6937       -- =============== START DEBUG LOG ================
6938          DEBUG_LOG_STRING (l_proc_level, 'Build_prep_list_of_com_dus.Msg4',
6939                            ' SetItemAttrText COM_DU_PREP_LIST --> ' || l_user_list);
6940       -- =============== END DEBUG LOG ==================
6941 
6942       END IF;
6943 
6944       IF (funcmode <> 'RUN') THEN
6945          result := 'COMPLETE';
6946          -- =============== START DEBUG LOG ================
6947             DEBUG_LOG_STRING (l_proc_level, 'Build_prep_list_of_com_dus.Msg5',
6948                               ' funcmode <> RUN -- result --> ' || result);
6949          -- =============== END DEBUG LOG ==================
6950          return;
6951       END IF;
6952 
6953       -- =============== START DEBUG LOG ================
6954          DEBUG_LOG_STRING (l_proc_level, 'Build_prep_list_of_com_dus.Msg6',
6955                            ' ** END BUILD_PREP_LIST_OF_COM_DUS ** ');
6956       -- =============== END DEBUG LOG ==================
6957 
6958    EXCEPTION
6959       WHEN OTHERS THEN
6960          wf_core.context('IGI_EXP_APPROVAL_PKG','build_prep_list_of_com_dus',itemtype,itemkey,
6961                          to_char(actid),funcmode);
6962          -- =============== START DEBUG LOG ================
6963             DEBUG_LOG_UNEXP_ERROR ('Build_prep_list_of_com_dus.Unexp1','DEFAULT');
6964          -- =============== END DEBUG LOG ==================
6965          raise;
6966 
6967    END build_prep_list_of_com_dus;
6968 
6969    -- *************************************************************************
6970    --    GET_NEXT_PREP
6971    -- *************************************************************************
6972 
6973    PROCEDURE get_next_prep        ( itemtype IN  VARCHAR2,
6974                                     itemkey  IN  VARCHAR2,
6975                                     actid    IN  NUMBER,
6976                                     funcmode IN  VARCHAR2,
6977                                     result   OUT NOCOPY VARCHAR2) IS
6978 
6979       l_num             NUMBER;
6980       l_prep_list       VARCHAR2(1000);
6981       l_next_prep       NUMBER;
6982       l_next_prep_name  fnd_user.user_name%TYPE;
6983       l_tu_id           igi_exp_dus.tu_id%TYPE;
6984 
6985       l_com_du_list     VARCHAR2(28000);
6986 
6987       CURSOR c_com_dus(p_tu_id igi_exp_dus.tu_id%TYPE
6988                       ,p_du_by_user_id igi_exp_dus.du_by_user_id%TYPE)
6989       IS
6990          SELECT du_order_number
6991                ,du_legal_number
6992          FROM   igi_exp_dus
6993          WHERE  tu_id = p_tu_id
6994          AND    du_status = 'COM'
6995          AND    du_by_user_id = p_du_by_user_id;
6996 
6997 
6998    BEGIN
6999 
7000      -- =============== START DEBUG LOG ================
7001         DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg1',
7002                           ' ** START GET_NEXT_PREP ** ');
7003      -- =============== END DEBUG LOG ==================
7004 
7005      IF (funcmode = 'RUN') THEN
7006 
7007          -- Get the list of preparers of completed DUS
7008          l_prep_list
7009             := wf_engine.GetItemAttrText  ( itemtype => itemtype,
7010                                             itemkey  => itemkey,
7011                                             aname    => 'COM_DU_PREP_LIST');
7012 
7013          -- =============== START DEBUG LOG ================
7014             DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg2',
7015                               ' GetItemAttrText COM_DU_PREP_LIST --> ' || l_prep_list);
7016          -- =============== END DEBUG LOG ==================
7017 
7018          IF (l_prep_list is null) THEN
7019             -- There are no more preparers in the list
7020             -- Set result to 'No More Preparers In List'
7021             result := 'COMPLETE:NO_PREPS_IN_LIST';
7022             -- =============== START DEBUG LOG ================
7023                DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg3',
7024                                  ' l_prep_list is null -- result --> ' || result);
7025             -- =============== END DEBUG LOG ==================
7026             return;
7027          END IF;
7028 
7029          l_num := INSTR(l_prep_list,',',-1);
7030 
7031          -- =============== START DEBUG LOG ================
7032             DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg4',
7033                               ' l_num --> ' || l_num);
7034          -- =============== END DEBUG LOG ==================
7035 
7036          IF (l_num = 0) THEN
7037             -- There is only one preparer left in list
7038             l_next_prep := l_prep_list;
7039          ELSE
7040             -- There is more than one preparer in list
7041             l_next_prep := SUBSTR(l_prep_list,l_num + 1);
7042          END IF;
7043 
7044          -- =============== START DEBUG LOG ================
7045             DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg5',
7046                               ' l_next_prep --> ' || l_next_prep);
7047          -- =============== END DEBUG LOG ==================
7048 
7049          -- Set the temp_du_preparer_id attribute
7050          wf_engine.SetItemAttrNumber( itemtype => itemtype,
7051                                       itemkey  => itemkey,
7052                                       aname    => 'TEMP_DU_PREPARER_ID',
7053                                       avalue   => l_next_prep);
7054 
7055          -- =============== START DEBUG LOG ================
7056             DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg6',
7057                               ' SetItemAttrNumber TEMP_DU_PREPARER_ID --> '||l_next_prep);
7058          -- =============== END DEBUG LOG ==================
7059 
7060          SELECT user_name
7061          INTO   l_next_prep_name
7062          FROM   fnd_user
7063          WHERE  user_id = l_next_prep;
7064 
7065          -- =============== START DEBUG LOG ================
7066             DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg7',
7067                               ' l_next_prep_name --> ' || l_next_prep_name);
7068          -- =============== END DEBUG LOG ==================
7069 
7070          -- Set the temp_du_preparer attribute
7071          wf_engine.SetItemAttrText  ( itemtype => itemtype,
7072                                       itemkey  => itemkey,
7073                                       aname    => 'TEMP_DU_PREPARER_NAME',
7074                                       avalue   => l_next_prep_name);
7075 
7076          -- =============== START DEBUG LOG ================
7077             DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg8',
7078                               ' SetItemAttrText TEMP_DU_PREPARER_NAME --> ' || l_next_prep_name);
7079          -- =============== END DEBUG LOG ==================
7080 
7081          -- Get the TU id
7082          l_tu_id
7083             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
7084                                             itemkey  => itemkey,
7085                                             aname    => 'TU_ID');
7086 
7087 
7088             FOR I IN c_com_dus(l_tu_id, l_next_prep)
7089             LOOP
7090 
7091                IF (l_com_du_list is NULL) THEN
7092                   l_com_du_list := I.du_order_number;
7093                ELSE
7094                   l_com_du_list := l_com_du_list ||I.du_order_number;
7095                END IF;
7096 
7097                -- =============== START DEBUG LOG ================
7098                   DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg9',
7099                                     ' du_order_number --> ' || I.du_order_number);
7100                -- =============== END DEBUG LOG ==================
7101 
7102                IF (I.du_legal_number is not null) THEN
7103                   l_com_du_list := l_com_du_list||' ('||I.du_legal_number||')';
7104                END IF;
7105 
7106                -- =============== START DEBUG LOG ================
7107                   DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg10',
7108                                     ' I.du_legal_number --> ' || I.du_legal_number);
7109                -- =============== END DEBUG LOG ==================
7110 
7111                l_com_du_list := l_com_du_list||fnd_global.local_chr(10);
7112 
7113                IF LENGTH(l_com_du_list) > 28000 THEN
7114                   exit;
7115                END IF;
7116 
7117             END LOOP;
7118 
7119 
7120            -- Set the all_dus_list attribute
7121             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7122                                          itemkey  => itemkey,
7123                                          aname    => 'ADD_ATTR1',
7124                                          avalue   => substr(l_com_du_list, 1, 4000));
7125 
7126             -- =============== START DEBUG LOG ================
7127                DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg11',
7128                                  ' SetItemAttrText ADD_ATTR1 --> ' || substr(l_com_du_list, 1, 4000));
7129             -- =============== END DEBUG LOG ==================
7130 
7131             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7132                                          itemkey  => itemkey,
7133                                          aname    => 'ADD_ATTR2',
7134                                          avalue   => substr(l_com_du_list, 4001, 4000));
7135 
7136             -- =============== START DEBUG LOG ================
7137                DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg12',
7138                                  ' SetItemAttrText ADD_ATTR2 --> ' || substr(l_com_du_list, 4001, 4000));
7139             -- =============== END DEBUG LOG ==================
7140 
7141             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7142                                          itemkey  => itemkey,
7143                                          aname    => 'ADD_ATTR3',
7144                                          avalue   => substr(l_com_du_list, 8001, 4000));
7145 
7146             -- =============== START DEBUG LOG ================
7147                DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg13',
7148                                  ' SetItemAttrText ADD_ATTR3 --> ' || substr(l_com_du_list, 8001, 4000));
7149             -- =============== END DEBUG LOG ==================
7150 
7151             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7152                                          itemkey  => itemkey,
7153                                          aname    => 'ADD_ATTR4',
7154                                          avalue   => substr(l_com_du_list, 12001, 4000));
7155 
7156             -- =============== START DEBUG LOG ================
7157                DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg14',
7158                                  ' SetItemAttrText ADD_ATTR4 --> ' || substr(l_com_du_list, 12001, 4000));
7159             -- =============== END DEBUG LOG ==================
7160 
7161             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7162                                          itemkey  => itemkey,
7163                                          aname    => 'ADD_ATTR5',
7164                                          avalue   => substr(l_com_du_list, 16001, 4000));
7165 
7166             -- =============== START DEBUG LOG ================
7167                DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg15',
7168                                  ' SetItemAttrText ADD_ATTR5 --> ' || substr(l_com_du_list, 16001, 4000));
7169             -- =============== END DEBUG LOG ==================
7170 
7171             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7172                                          itemkey  => itemkey,
7173                                          aname    => 'ADD_ATTR6',
7174                                          avalue   => substr(l_com_du_list, 20001, 4000));
7175 
7176             -- =============== START DEBUG LOG ================
7177                DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg16',
7178                                  ' SetItemAttrText ADD_ATTR6 --> ' || substr(l_com_du_list, 20001, 4000));
7179             -- =============== END DEBUG LOG ==================
7180 
7181             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7182                                          itemkey  => itemkey,
7183                                          aname    => 'ADD_ATTR7',
7184                                          avalue   => substr(l_com_du_list, 24001, 4000));
7185 
7186 
7187             -- =============== START DEBUG LOG ================
7188                DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg17',
7189                                  ' SetItemAttrText ADD_ATTR7 --> ' || substr(l_com_du_list, 24001, 4000));
7190             -- =============== END DEBUG LOG ==================
7191 
7192             wf_engine.SetItemAttrText(itemtype => itemtype,
7193                                       itemkey  => itemkey,
7194                                       aname    => 'TEMP_DU_BY_PREP_LIST',
7195                                       avalue   => 'plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
7196 
7197             -- =============== START DEBUG LOG ================
7198                DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg18',
7199                                  ' SetItemAttrText TEMP_DU_BY_PREP_LIST --> ' ||
7200                                  ' plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
7201             -- =============== END DEBUG LOG ==================
7202 
7203          -- Set the result to 'Next Preparer Fetched'
7204          result := 'COMPLETE:NEXT_PREP_FETCHED';
7205 
7206          -- =============== START DEBUG LOG ================
7207             DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg19',
7208                               ' result --> ' || result);
7209          -- =============== END DEBUG LOG ==================
7210 
7211       END IF;
7212 
7213       IF (funcmode <> 'RUN') THEN
7214          result := 'COMPLETE';
7215          -- =============== START DEBUG LOG ================
7216             DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg20',
7217                               ' funcmode <> RUN -- result --> ' || result);
7218          -- =============== END DEBUG LOG ==================
7219          return;
7220       END IF;
7221 
7222       -- =============== START DEBUG LOG ================
7223          DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg21',
7224                            ' ** END GET_NEXT_PREP ** ');
7225       -- =============== END DEBUG LOG ==================
7226 
7227    EXCEPTION
7228       WHEN OTHERS THEN
7229          wf_core.context('IGI_EXP_APPROVAL_PKG','get_next_prep',itemtype,itemkey,
7230                          to_char(actid),funcmode);
7231          -- =============== START DEBUG LOG ================
7232             DEBUG_LOG_UNEXP_ERROR ('Get_next_prep.Unexp1','DEFAULT');
7233          -- =============== END DEBUG LOG ==================
7234          raise;
7235 
7236    END get_next_prep;
7237 
7238 
7239 
7240    -- *************************************************************************
7241    --    REMOVE_PREP_FROM_LIST
7242    -- *************************************************************************
7243 
7244    PROCEDURE remove_prep_from_list( itemtype IN  VARCHAR2,
7245                                     itemkey  IN  VARCHAR2,
7246                                     actid    IN  NUMBER,
7247                                     funcmode IN  VARCHAR2,
7248                                     result   OUT NOCOPY VARCHAR2) IS
7249 
7250       l_num           NUMBER;
7251       l_prep_list     VARCHAR2(1000);
7252       l_new_prep_list VARCHAR2(1000);
7253 
7254    BEGIN
7255 
7256       -- =============== START DEBUG LOG ================
7257          DEBUG_LOG_STRING (l_proc_level, 'Remove_prep_from_list.Msg1',
7258                            ' ** START REMOVE_PREP_FROM_LIST ** ');
7259       -- =============== END DEBUG LOG ==================
7260 
7261       IF (funcmode = 'RUN') THEN
7262 
7263          -- Get the list of preparers of completed dus
7264          l_prep_list
7265             := wf_engine.GetItemAttrText  ( itemtype => itemtype,
7266                                             itemkey  => itemkey,
7267                                             aname    => 'COM_DU_PREP_LIST');
7268 
7269          -- =============== START DEBUG LOG ================
7270             DEBUG_LOG_STRING (l_proc_level, 'Remove_prep_from_list.Msg2',
7271                               ' GetItemAttrText COM_DU_PREP_LIST --> ' || l_prep_list);
7272          -- =============== END DEBUG LOG ==================
7273 
7274          -- This will remove the last preparer id from the list
7275          l_num := INSTR(l_prep_list,',',-1);
7276          l_new_prep_list := SUBSTR(l_prep_list,1,l_num-1);
7277 
7278          -- =============== START DEBUG LOG ================
7279             DEBUG_LOG_STRING (l_proc_level, 'Remove_prep_from_list.Msg3',
7280                               ' l_num --> ' || l_num || ' l_new_prep_list --> ' || l_new_prep_list);
7281          -- =============== END DEBUG LOG ==================
7282 
7283          -- Set the com_du_prep_list attribute to the new list
7284          wf_engine.SetItemAttrText  ( itemtype => itemtype,
7285                                       itemkey  => itemkey,
7286                                       aname    => 'COM_DU_PREP_LIST',
7287                                       avalue   => l_new_prep_list);
7288 
7289          -- =============== START DEBUG LOG ================
7290             DEBUG_LOG_STRING (l_proc_level, 'Remove_prep_from_list.Msg4',
7291                               ' SetItemAttrText COM_DU_PREP_LIST --> ' || l_new_prep_list);
7292          -- =============== END DEBUG LOG ==================
7293 
7294       END IF;
7295 
7296       IF (funcmode <> 'RUN') THEN
7297          result := 'COMPLETE';
7298          -- =============== START DEBUG LOG ================
7299             DEBUG_LOG_STRING (l_proc_level, 'Remove_prep_from_list.Msg5',
7300                               ' funcmode <> RUN -- result --> ' || result);
7301          -- =============== END DEBUG LOG ==================
7302          return;
7303       END IF;
7304 
7305       -- =============== START DEBUG LOG ================
7306          DEBUG_LOG_STRING (l_proc_level, 'Remove_prep_from_list.Msg6',
7307                           ' ** END REMOVE_PREP_FROM_LIST ** ');
7308       -- =============== END DEBUG LOG ==================
7309 
7310    EXCEPTION
7311       WHEN OTHERS THEN
7312          wf_core.context('IGI_EXP_APPROVAL_PKG','remove_prep_from_list',itemtype,itemkey,
7313                          to_char(actid),funcmode);
7314          -- =============== START DEBUG LOG ================
7315             DEBUG_LOG_UNEXP_ERROR ('Remove_prep_from_list.Unexp1','DEFAULT');
7316          -- =============== END DEBUG LOG ==================
7317          raise;
7318    END remove_prep_from_list;
7319 
7320 
7321 
7322    -- *************************************************************************
7323    --    SET_TU_TO_COMPLETE
7324    -- *************************************************************************
7325 
7326    PROCEDURE set_tu_to_complete   ( itemtype IN  VARCHAR2,
7327                                     itemkey  IN  VARCHAR2,
7328                                     actid    IN  NUMBER,
7329                                     funcmode IN  VARCHAR2,
7330                                     result   OUT NOCOPY VARCHAR2) IS
7331 
7332       l_tu_id    igi_exp_dus.tu_id%TYPE;
7333 
7334    BEGIN
7335 
7336       -- =============== START DEBUG LOG ================
7337          DEBUG_LOG_STRING (l_proc_level, 'Set_tu_to_complete.Msg1',
7338                           ' ** START SET_TU_TO_COMPLETE ** ');
7339       -- =============== END DEBUG LOG ==================
7340 
7341       IF (funcmode = 'RUN') THEN
7342 
7343          -- Get the TU id
7344          l_tu_id
7345             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
7346                                             itemkey  => itemkey,
7347                                             aname    => 'TU_ID');
7348 
7349          -- =============== START DEBUG LOG ================
7350             DEBUG_LOG_STRING (l_proc_level, 'Set_tu_to_complete.Msg2',
7351                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
7352          -- =============== END DEBUG LOG ==================
7353 
7354          UPDATE igi_exp_tus
7355          SET    tu_status = 'COM'
7356          WHERE  tu_id = l_tu_id;
7357 
7358          -- =============== START DEBUG LOG ================
7359             DEBUG_LOG_STRING (l_proc_level, 'Set_tu_to_complete.Msg3',
7360                               ' UPDATE igi_exp_tus --> ' || SQL%ROWCOUNT);
7361          -- =============== END DEBUG LOG ==================
7362 
7363       END IF;
7364 
7365       IF (funcmode <> 'RUN') THEN
7366          result := 'COMPLETE';
7367          -- =============== START DEBUG LOG ================
7368             DEBUG_LOG_STRING (l_proc_level, 'Set_tu_to_complete.Msg4',
7369                               ' funcmode <> RUN -- result --> ' || result);
7370          -- =============== END DEBUG LOG ==================
7371          return;
7372       END IF;
7373 
7374       -- =============== START DEBUG LOG ================
7375          DEBUG_LOG_STRING (l_proc_level, 'Set_tu_to_complete.Msg5',
7376                           ' ** END SET_TU_TO_COMPLETE ** ');
7377       -- =============== END DEBUG LOG ==================
7378 
7379    EXCEPTION
7380       WHEN OTHERS THEN
7381          wf_core.context('IGI_EXP_APPROVAL_PKG','set_tu_to_complete',itemtype,itemkey,
7382                          to_char(actid),funcmode);
7383          -- =============== START DEBUG LOG ================
7384             DEBUG_LOG_UNEXP_ERROR ('set_tu_to_complete.Unexp1','DEFAULT');
7385          -- =============== END DEBUG LOG ==================
7386          raise;
7387 
7388    END set_tu_to_complete;
7389 
7390 
7391 
7392    -- OPSF(I) EXP Bug 2415293  S Brewer 11-JUL-2002 Start(3)
7393    -- Added new procedures does_tu_have_legal_num and
7394    -- remove_rej_dus_from_tu  and get_next_rejected_legal_du
7395 
7396    -- *************************************************************************
7397    --    DOES_TU_HAVE_LEGAL_NUM
7398    -- *************************************************************************
7399 
7400    PROCEDURE does_tu_have_legal_num( itemtype IN  VARCHAR2,
7401                                      itemkey  IN  VARCHAR2,
7402                                      actid    IN  NUMBER,
7403                                      funcmode IN  VARCHAR2,
7404                                      result   OUT NOCOPY VARCHAR2) IS
7405 
7406     l_tu_id            igi_exp_dus.tu_id%TYPE;
7407       l_tu_legal_number  igi_exp_tus.tu_legal_number%TYPE;
7408  -- Check if the TU has a legal number
7409  -- Bug 4051910
7410       CURSOR c_leg_num(c_tu_id number) is
7411          SELECT tu_legal_number
7412          FROM   igi_exp_tus
7413          WHERE  tu_id = c_tu_id;
7414 
7415 
7416 
7417 
7418    BEGIN
7419 
7420       -- =============== START DEBUG LOG ================
7421          DEBUG_LOG_STRING (l_proc_level, 'Does_tu_have_legal_num.Msg1',
7422                           ' ** START DOES_TU_HAVE_LEGAL_NUM ** ');
7423       -- =============== END DEBUG LOG ==================
7424 
7425       IF (funcmode = 'RUN') THEN
7426 
7427          -- Get the TU id
7428          l_tu_id
7429             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
7430                                             itemkey  => itemkey,
7431                                             aname    => 'TU_ID');
7432 
7433          -- =============== START DEBUG LOG ================
7434             DEBUG_LOG_STRING (l_proc_level, 'Does_tu_have_legal_num.Msg2',
7435                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
7436          -- =============== END DEBUG LOG ==================
7437 
7438        -- Bug 4051910
7439       OPEN c_leg_num(l_tu_id);
7440       FETCH c_leg_num INTO l_tu_legal_number;
7441       CLOSE c_leg_num;
7442 
7443 
7444          -- =============== START DEBUG LOG ================
7445             DEBUG_LOG_STRING (l_proc_level, 'Does_tu_have_legal_num.Msg3',
7446                               ' l_tu_legal_number --> ' || l_tu_legal_number);
7447          -- =============== END DEBUG LOG ==================
7448 
7449          IF (l_tu_legal_number is null) THEN
7450             -- The TU has not been assigned a legal number
7451             -- Set the result to 'No'
7452             result := 'COMPLETE:N';
7453          ELSE
7454             -- The TU has been assigned a legal number
7455             -- Set the result to 'Yes'
7456             result := 'COMPLETE:Y';
7457          END IF;
7458 
7459          -- =============== START DEBUG LOG ================
7460             DEBUG_LOG_STRING (l_proc_level, 'Does_tu_have_legal_num.Msg4',
7461                               ' result --> ' || result);
7462          -- =============== END DEBUG LOG ==================
7463 
7464       END IF;
7465 
7466       IF (funcmode <> 'RUN') THEN
7467          result := 'COMPLETE';
7468          -- =============== START DEBUG LOG ================
7469             DEBUG_LOG_STRING (l_proc_level, 'Does_tu_have_legal_num.Msg5',
7470                               ' funcmode <> RUN -- result --> ' || result);
7471          -- =============== END DEBUG LOG ==================
7472          return;
7473       END IF;
7474 
7475       -- =============== START DEBUG LOG ================
7476          DEBUG_LOG_STRING (l_proc_level, 'Does_tu_have_legal_num.Msg6',
7477                            ' ** END DOES_TU_HAVE_LEGAL_NUM ** ');
7478       -- =============== END DEBUG LOG ==================
7479 
7480    EXCEPTION
7481       WHEN OTHERS THEN
7482          wf_core.context('IGI_EXP_APPROVAL_PKG','does_tu_have_legal_num',itemtype,itemkey,
7483                          to_char(actid),funcmode);
7484          -- =============== START DEBUG LOG ================
7485             DEBUG_LOG_UNEXP_ERROR ('Does_tu_have_legal_num.Unexp1','DEFAULT');
7486          -- =============== END DEBUG LOG ==================
7487          raise;
7488    END does_tu_have_legal_num;
7489 
7490 
7491 
7492    -- *************************************************************************
7493    --    REMOVE_REJ_DUS_FROM_TU
7494    -- *************************************************************************
7495 
7496    PROCEDURE remove_rej_dus_from_tu( itemtype IN  VARCHAR2,
7497                                      itemkey  IN  VARCHAR2,
7498                                      actid    IN  NUMBER,
7499                                      funcmode IN  VARCHAR2,
7500                                      result   OUT NOCOPY VARCHAR2) IS
7501 
7502       l_tu_id       igi_exp_dus.tu_id%TYPE;
7503       l_du_prep_id  igi_exp_dus.du_by_user_id%TYPE;
7504 
7505    BEGIN
7506 
7507       -- =============== START DEBUG LOG ================
7508          DEBUG_LOG_STRING (l_proc_level, 'Remove_rej_dus_from_tu.Msg1',
7509                            ' ** START  REMOVE_REJ_DUS_FROM_TU ** ');
7510       -- =============== END DEBUG LOG ==================
7511 
7512       IF (funcmode = 'RUN') THEN
7513 
7514          -- Get the TU id
7515          l_tu_id
7516             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
7517                                             itemkey  => itemkey,
7518                                             aname    => 'TU_ID');
7519 
7520          -- =============== START DEBUG LOG ================
7521             DEBUG_LOG_STRING (l_proc_level, 'Remove_rej_dus_from_tu.Msg2',
7522                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
7523          -- =============== END DEBUG LOG ==================
7524 
7525          -- Get the DU preparer id
7526          l_du_prep_id
7527             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
7528                                             itemkey  => itemkey,
7529                                             aname    => 'TEMP_DU_PREPARER_ID');
7530 
7531 
7532          -- =============== START DEBUG LOG ================
7533             DEBUG_LOG_STRING (l_proc_level, 'Remove_rej_dus_from_tu.Msg3',
7534                               ' GetItemAttrNumber TEMP_DU_PREPARER_ID --> ' || l_du_prep_id );
7535          -- =============== END DEBUG LOG ==================
7536 
7537          -- Remove the rejected DUs (prepared by user l_du_prep_id) from the
7538          -- TU
7539 
7540 	 -- FP Bug 7711356 (not updating the tu_id as null for rejected DU's)
7541          /*UPDATE igi_exp_dus
7542          SET    tu_id = null
7543          WHERE  tu_id = l_tu_id
7544          AND    du_by_user_id = l_du_prep_id
7545          AND    du_status = 'REJ';*/
7546 
7547          -- =============== START DEBUG LOG ================
7548             DEBUG_LOG_STRING (l_proc_level, 'Remove_rej_dus_from_tu.Msg4',
7549                               ' UPDATE igi_exp_dus du_status = REJ --> ' || SQL%ROWCOUNT);
7550          -- =============== END DEBUG LOG ==================
7551 
7552       END IF;
7553 
7554       IF (funcmode <> 'RUN') THEN
7555          result := 'COMPLETE';
7556          -- =============== START DEBUG LOG ================
7557             DEBUG_LOG_STRING (l_proc_level, 'Remove_rej_dus_from_tu.Msg5',
7558                               ' funcmode <> RUN -- result --> ' || result);
7559          -- =============== END DEBUG LOG ==================
7560          return;
7561       END IF;
7562 
7563       -- =============== START DEBUG LOG ================
7564          DEBUG_LOG_STRING (l_proc_level, 'Remove_rej_dus_from_tu.Msg6',
7565                            ' ** START  REMOVE_REJ_DUS_FROM_TU ** ');
7566       -- =============== END DEBUG LOG ==================
7567 
7568    EXCEPTION
7569       WHEN OTHERS THEN
7570          wf_core.context('IGI_EXP_APPROVAL_PKG','remove_rej_dus_from_tu',itemtype,itemkey,
7571                          to_char(actid),funcmode);
7572          -- =============== START DEBUG LOG ================
7573             DEBUG_LOG_UNEXP_ERROR ('Remove_rej_dus_from_tu.Unexp1','DEFAULT');
7574          -- =============== END DEBUG LOG ==================
7575         raise;
7576    END remove_rej_dus_from_tu;
7577 
7578 
7579    -- *************************************************************************
7580    --    GET_NEXT_REJECTED_LEGAL_DU
7581    -- *************************************************************************
7582 
7583    PROCEDURE get_next_rejected_legal_du( itemtype IN  VARCHAR2,
7584                                          itemkey  IN  VARCHAR2,
7585                                          actid    IN  NUMBER,
7586                                          funcmode IN  VARCHAR2,
7587                                          result   OUT NOCOPY VARCHAR2) IS
7588 
7589       CURSOR c_next_du_rej(p_tu_id igi_exp_dus.tu_id%TYPE)
7590       IS
7591          SELECT du_id
7592                ,du_by_user_id
7593          FROM   igi_exp_dus du
7594          WHERE  tu_id = p_tu_id
7595          AND    du_status = 'REJ'
7596          AND    EXISTS (SELECT 'AR'
7597                         FROM   igi_exp_ar_trans ar
7598                         WHERE  ar.du_id = du.du_id
7599                         UNION
7600                         SELECT 'AP'
7601                         FROM   igi_exp_ap_trans ap
7602                         WHERE  ap.du_id = du.du_id)
7603          AND    rownum = 1;
7604 
7605 
7606       CURSOR c_rej_du_info(p_tu_id igi_exp_dus.tu_id%TYPE
7607                           ,p_du_preparer_id igi_exp_dus.du_by_user_id%TYPE)
7608       IS
7609          SELECT du_order_number
7610                ,du_legal_number
7611          FROM   igi_exp_dus du
7612          WHERE  tu_id = p_tu_id
7613          AND    du_status = 'REJ'
7614          AND    du_by_user_id = p_du_preparer_id;
7615 
7616 
7617       l_tu_id           igi_exp_dus.tu_id%TYPE;
7618       l_du_id           igi_exp_dus.du_id%TYPE;
7619       l_du_prep_id      igi_exp_dus.du_by_user_id%TYPE;
7620       l_du_prep_name    fnd_user.user_name%TYPE;
7621 
7622       l_du_rej_list     VARCHAR2(28000);
7623 
7624 
7625    BEGIN
7626 
7627     -- =============== START DEBUG LOG ================
7628        DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg1',
7629                          ' ** START  GET_NEXT_REJECTED_LEGAL_DU ** ');
7630     -- =============== END DEBUG LOG ==================
7631 
7632       IF (funcmode = 'RUN') THEN
7633 
7634          -- Get the TU id
7635          l_tu_id
7636             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
7637                                             itemkey  => itemkey,
7638                                             aname    => 'TU_ID');
7639 
7640          -- =============== START DEBUG LOG ================
7641             DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg2',
7642                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
7643          -- =============== END DEBUG LOG ==================
7644 
7645          -- Get the next rejected legal DU in this TU
7646          OPEN c_next_du_rej(l_tu_id);
7647          FETCH c_next_du_rej INTO l_du_id, l_du_prep_id;
7648 
7649          -- =============== START DEBUG LOG ================
7650             DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg3',
7651                               ' l_du_id --> ' || l_du_id || ' l_du_prep_id --> ' || l_du_prep_id);
7652          -- =============== END DEBUG LOG ==================
7653 
7654          IF (c_next_du_rej%NOTFOUND) THEN
7655             -- There are no more rejected DUs to deal with
7656             -- Set result to 'No More DUs'
7657             result := 'COMPLETE:NO_DUS_IN_LIST';
7658 
7659             -- =============== START DEBUG LOG ================
7660                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg4',
7661                                  ' c_next_du_rej%NOTFOUND -- result --> ' || result);
7662             -- =============== END DEBUG LOG ==================
7663 
7664          ELSE
7665             -- The next rejected DU has been fetched
7666             -- Set the temp_du_preparer_id attribute
7667             wf_engine.SetItemAttrNumber( itemtype => itemtype,
7668                                          itemkey  => itemkey,
7669                                          aname    => 'TEMP_DU_PREPARER_ID',
7670                                          avalue   => l_du_prep_id);
7671 
7672             -- =============== START DEBUG LOG ================
7673                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg5',
7674                                  ' SetItemAttrNumber TEMP_DU_PREPARER_ID --> ' || l_du_prep_id);
7675             -- =============== END DEBUG LOG ==================
7676 
7677             -- Get the name of the preparer to send the notification to
7678             SELECT user_name
7679             INTO   l_du_prep_name
7680             FROM   fnd_user
7681             WHERE  user_id = l_du_prep_id;
7682 
7683             -- =============== START DEBUG LOG ================
7684                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg6',
7685                                  ' l_du_prep_name --> ' || l_du_prep_name);
7686             -- =============== END DEBUG LOG ==================
7687 
7688             -- Set the temp_du_preparer_name attribute
7689             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7690                                          itemkey  => itemkey,
7691                                          aname    => 'TEMP_DU_PREPARER_NAME',
7692                                          avalue   => l_du_prep_name);
7693 
7694             -- =============== START DEBUG LOG ================
7695                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg7',
7696                                  ' SetItemAttrText TEMP_DU_PREPARER_NAME --> ' || l_du_prep_name);
7697             -- =============== END DEBUG LOG ==================
7698 
7699             FOR I IN c_rej_du_info(l_tu_id,l_du_prep_id)
7700             LOOP
7701 
7702                IF (l_du_rej_list is NULL) THEN
7703                   l_du_rej_list := I.du_order_number;
7704                ELSE
7705                   l_du_rej_list := l_du_rej_list ||I.du_order_number;
7706                END IF;
7707 
7708                -- =============== START DEBUG LOG ================
7709                   DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg8',
7710                                     ' du_order_number --> ' || I.du_order_number);
7711                -- =============== END DEBUG LOG ==================
7712 
7713                IF (I.du_legal_number is not null) THEN
7714                   l_du_rej_list := l_du_rej_list||' ('||I.du_legal_number||')';
7715                END IF;
7716 
7717                -- =============== START DEBUG LOG ================
7718                   DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg9',
7719                                     ' I.du_legal_number --> ' || I.du_legal_number);
7720                -- =============== END DEBUG LOG ==================
7721 
7722                l_du_rej_list := l_du_rej_list||fnd_global.local_chr(10);
7723 
7724                IF LENGTH(l_du_rej_list) > 28000 THEN
7725                   exit;
7726                END IF;
7727 
7728             END LOOP;
7729 
7730            -- Set the all_dus_list attribute
7731             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7732                                          itemkey  => itemkey,
7733                                          aname    => 'ADD_ATTR1',
7734                                          avalue   => substr(l_du_rej_list, 1, 4000));
7735 
7736             -- =============== START DEBUG LOG ================
7737                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg10',
7738                                  ' SetItemAttrText ADD_ATTR1 --> ' || substr(l_du_rej_list, 1, 4000));
7739             -- =============== END DEBUG LOG ==================
7740 
7741             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7742                                          itemkey  => itemkey,
7743                                          aname    => 'ADD_ATTR2',
7744                                          avalue   => substr(l_du_rej_list, 4001, 4000));
7745 
7746             -- =============== START DEBUG LOG ================
7747                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg11',
7748                                  ' SetItemAttrText ADD_ATTR2 --> ' || substr(l_du_rej_list, 4001, 4000));
7749             -- =============== END DEBUG LOG ==================
7750 
7751             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7752                                          itemkey  => itemkey,
7753                                          aname    => 'ADD_ATTR3',
7754                                          avalue   => substr(l_du_rej_list, 8001, 4000));
7755 
7756             -- =============== START DEBUG LOG ================
7757                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg12',
7758                                  ' SetItemAttrText ADD_ATTR3 --> ' || substr(l_du_rej_list, 8001, 4000));
7759             -- =============== END DEBUG LOG ==================
7760 
7761             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7762                                          itemkey  => itemkey,
7763                                          aname    => 'ADD_ATTR4',
7764                                          avalue   => substr(l_du_rej_list, 12001, 4000));
7765 
7766             -- =============== START DEBUG LOG ================
7767                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg13',
7768                                  ' SetItemAttrText ADD_ATTR4 --> ' || substr(l_du_rej_list, 12001, 4000));
7769             -- =============== END DEBUG LOG ==================
7770 
7771             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7772                                          itemkey  => itemkey,
7773                                          aname    => 'ADD_ATTR5',
7774                                          avalue   => substr(l_du_rej_list, 16001, 4000));
7775 
7776             -- =============== START DEBUG LOG ================
7777                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg14',
7778                                  ' SetItemAttrText ADD_ATTR5 --> ' || substr(l_du_rej_list, 16001, 4000));
7779             -- =============== END DEBUG LOG ==================
7780 
7781             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7782                                          itemkey  => itemkey,
7783                                          aname    => 'ADD_ATTR6',
7784                                          avalue   => substr(l_du_rej_list, 20001, 4000));
7785 
7786             -- =============== START DEBUG LOG ================
7787                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg15',
7788                                  ' SetItemAttrText ADD_ATTR6 --> ' || substr(l_du_rej_list, 20001, 4000));
7789             -- =============== END DEBUG LOG ==================
7790 
7791             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7792                                          itemkey  => itemkey,
7793                                          aname    => 'ADD_ATTR7',
7794                                          avalue   => substr(l_du_rej_list, 24001, 4000));
7795 
7796 
7797             -- =============== START DEBUG LOG ================
7798                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg16',
7799                                  ' SetItemAttrText ADD_ATTR7 --> ' || substr(l_du_rej_list, 24001, 4000));
7800             -- =============== END DEBUG LOG ==================
7801 
7802             -- Set the temp_du_by_prep_list attribute
7803             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7804                                          itemkey  => itemkey,
7805                                          aname    => 'TEMP_DU_BY_PREP_LIST',
7806                                          avalue   => 'plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
7807 
7808 
7809             -- =============== START DEBUG LOG ================
7810                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg17',
7811                                  ' SetItemAttrText TEMP_DU_BY_PREP_LIST --> ' ||
7812                                  ' plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
7813             -- =============== END DEBUG LOG ==================
7814 
7815             -- Set the result to 'Next DU Fetched'
7816             result := 'COMPLETE:NEXT_DU_FETCHED';
7817 
7818             -- =============== START DEBUG LOG ================
7819                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg18',
7820                                  ' result --> '||result);
7821             -- =============== END DEBUG LOG ==================
7822 
7823          END IF;
7824 
7825          IF (c_next_du_rej%ISOPEN) THEN
7826             CLOSE c_next_du_rej;
7827          END IF;
7828 
7829       END IF;
7830 
7831       IF (funcmode <> 'RUN') THEN
7832          result := 'COMPLETE';
7833          -- =============== START DEBUG LOG ================
7834             DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg19',
7835                               ' funcmode <> RUN -- result --> '|| result);
7836          -- =============== END DEBUG LOG ==================
7837          return;
7838       END IF;
7839 
7840       -- =============== START DEBUG LOG ================
7841          DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg20',
7842                            ' ** END  GET_NEXT_REJECTED_LEGAL_DU ** ');
7843       -- =============== END DEBUG LOG ==================
7844 
7845    EXCEPTION
7846       WHEN OTHERS THEN
7847          wf_core.context('IGI_EXP_APPROVAL_PKG','get_next_rejected_legal_du',itemtype,itemkey,
7848                          to_char(actid),funcmode);
7849          -- =============== START DEBUG LOG ================
7850             DEBUG_LOG_UNEXP_ERROR ('Get_next_rejected_legal_du.Unexp1','DEFAULT');
7851          -- =============== END DEBUG LOG ==================
7852          raise;
7853 
7854    END get_next_rejected_legal_du;
7855    -- OPSF(I) EXP Bug 2415293  S Brewer 11-JUL-2002 End(3)
7856 
7857 
7858    -- OPSF(I) EXP Bug 2379693  S Brewer 16-JUL-2002 Start(1)
7859    -- Added new procedure is_transmitter_final_apprv
7860 
7861    -- *************************************************************************
7862    --    IS_TRANSMITTER_FINAL_APPRV
7863    -- *************************************************************************
7864 
7865    PROCEDURE is_transmitter_final_apprv( itemtype IN  VARCHAR2,
7866                                          itemkey  IN  VARCHAR2,
7867                                          actid    IN  NUMBER,
7868                                          funcmode IN  VARCHAR2,
7869                                          result   OUT NOCOPY VARCHAR2) IS
7870 
7871       l_transmitter_position_id  per_all_positions.position_id%TYPE;
7872       l_final_apprv_pos_id       igi_exp_apprv_profiles.final_apprv_pos_id%TYPE;
7873 
7874    BEGIN
7875 
7876       -- =============== START DEBUG LOG ================
7877          DEBUG_LOG_STRING (l_proc_level, 'Is_transmitter_final_apprv.Msg1',
7878                            ' ** START  IS_TRANSMITTER_FINAL_APPRV ** ');
7879       -- =============== END DEBUG LOG ==================
7880 
7881       IF (funcmode = 'RUN') THEN
7882 
7883          -- Get the transmitter position id
7884          l_transmitter_position_id
7885             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
7886                                             itemkey  => itemkey,
7887                                             aname    => 'TRANSMITTER_POSITION_ID');
7888 
7889          -- =============== START DEBUG LOG ================
7890             DEBUG_LOG_STRING (l_proc_level, 'Is_transmitter_final_apprv.Msg2',
7891                               ' GetItemAttrNumber TRANSMITTER_POSITION_ID --> '||l_transmitter_position_id);
7892          -- =============== END DEBUG LOG ==================
7893 
7894          -- Get the final approver position id
7895          l_final_apprv_pos_id
7896             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
7897                                             itemkey  => itemkey,
7898                                             aname    => 'FINAL_APPRV_POS_ID');
7899 
7900          -- =============== START DEBUG LOG ================
7901             DEBUG_LOG_STRING (l_proc_level, 'Is_transmitter_final_apprv.Msg3',
7902                               ' GetItemAttrNumber FINAL_APPRV_POS_ID --> '||l_final_apprv_pos_id );
7903          -- =============== END DEBUG LOG ==================
7904 
7905          -- Check if the transmitter position is the same as the final position
7906          IF (l_transmitter_position_id = l_final_apprv_pos_id) THEN
7907             -- The transmitter has the final approval position
7908             -- Set the result to 'Yes'
7909             result := 'COMPLETE:Y';
7910          ELSE
7911             -- The transmitter is not at the final approval position
7912             -- Set the result to 'No'
7913             result := 'COMPLETE:N';
7914          END IF;
7915 
7916          -- =============== START DEBUG LOG ================
7917             DEBUG_LOG_STRING (l_proc_level, 'Is_transmitter_final_apprv.Msg4',
7918                               ' result --> '|| result);
7919          -- =============== END DEBUG LOG ==================
7920 
7921       END IF;
7922 
7923       IF (funcmode <> 'RUN') THEN
7924          result := 'COMPLETE';
7925          -- =============== START DEBUG LOG ================
7926             DEBUG_LOG_STRING (l_proc_level, 'Is_transmitter_final_apprv.Msg5',
7927                               ' funcmode <> RUN -- result --> ' || result);
7928          -- =============== END DEBUG LOG ==================
7929          return;
7930       END IF;
7931 
7932       -- =============== START DEBUG LOG ================
7933          DEBUG_LOG_STRING (l_proc_level, 'Is_transmitter_final_apprv.Msg6',
7934                            ' ** END  IS_TRANSMITTER_FINAL_APPRV ** ');
7935       -- =============== END DEBUG LOG ==================
7936 
7937    EXCEPTION
7938       WHEN OTHERS THEN
7939          wf_core.context('IGI_EXP_APPROVAL_PKG','is_transmitter_final_apprv',itemtype,itemkey,
7940                          to_char(actid),funcmode);
7941          -- =============== START DEBUG LOG ================
7942             DEBUG_LOG_UNEXP_ERROR ('Is_transmitter_final_apprv.Unexp1','DEFAULT');
7943          -- =============== END DEBUG LOG ==================
7944           raise;
7945 
7946    END is_transmitter_final_apprv;
7947    -- OPSF(I) EXP Bug 2379693  S Brewer 16-JUL-2002 End(1)
7948 
7949 END igi_exp_approval_pkg;