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.13.12010000.2 2008/08/04 13:01:27 sasukuma 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
333      -- =============== START DEBUG LOG ================
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 
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');
460 
457 
458          mo_global.set_policy_context('S',l_work_item_org_id);
459          /*  Bug# 5905190 MOAC changes ends */
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
581 
578       wf_engine.SetItemOwner( itemtype => l_itemtype,
579                               itemkey  => l_itemkey,
580                               owner    => p_tu_transmitter_name);
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,
690       -- =============== START DEBUG LOG ================
687                                    aname    => 'AUTHORIZER_HISTORY_LIST',
688                                    avalue   => p_tu_transmitter_name);
689 
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',
810       l_msg := fnd_message.get;
807                                    avalue   => l_msg);
808 
809       fnd_message.set_name ('IGI', 'IGI_EXP_LEGAL_NUM_ERROR');
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');
918                                    aname    => 'TU_DU_REMOVE',
915       l_msg := fnd_message.get;
916       wf_engine.SetItemAttrText  ( itemtype => l_itemtype,
917                                    itemkey  => l_itemkey,
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,
1025 
1022                                    itemkey  => l_itemkey,
1023                                    aname    => 'TU_VALIDATION_ERROR',
1024                                    avalue   => l_msg);
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',
1140 
1137                                      p_orig_system_id => l_transmitter_emp_id,
1138                                      p_name           => l_transmitter_emp_name,
1139                                      p_display_name   => l_display_name );
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 ** ');
1250 
1247       -- =============== END DEBUG LOG ==================
1248 
1249       IF (funcmode = 'RUN') THEN
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 
1385 
1382            wf_core.context('IGI_EXP_APPROVAL_PKG','emp_has_position',itemtype,itemkey,
1383                            to_char(actid),funcmode);
1384            RAISE;
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,
1493             DEBUG_LOG_STRING (l_proc_level, 'Position_in_hierarchy.Msg4',
1490                                             aname    => 'TRANSMITTER_POSITION_ID');
1491 
1492          -- =============== START DEBUG LOG ================
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 ================
1594             RAISE e_pos_hier_ver_not_found;
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 ==================
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.
1702          wf_engine.SetItemAttrNumber( itemtype => itemtype,
1699          -- Set the pos_structure_element_id for reference purposes.
1700 
1701          -- Set the pos_structure_element_id attribute
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
1809          -- Get the values of the attributes needed:
1806          -- If the TU transmitter's position IS the final position
1807          -- it is ok to continue with the workflow approval.
1808 
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',
1910                   l_final_apprv_found := 'Y';
1907                                        ' l_parent_pos_id = l_final_apprv_pos_id ');
1908                   -- =============== END DEBUG LOG ==================
1909 
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,
2027             DEBUG_LOG_STRING (l_proc_level, 'Update_tu_status_to_avl.Msg3',
2024                                             aname    => 'TU_ID');
2025 
2026          -- =============== START DEBUG LOG ================
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
2147            wf_core.context('IGI_EXP_APPROVAL_PKG','update_dus_to_in_a_tu',itemtype,itemkey,
2144            -- =============== START DEBUG LOG ================
2145               DEBUG_LOG_UNEXP_ERROR ('Update_tu_status_to_avl.Unexp1','DEFAULT');
2146            -- =============== END DEBUG LOG ==================
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 );
2253                          ,l_business_group_id
2250          -- =============== END DEBUG LOG ==================
2251 
2252          OPEN c_user_list(l_current_position_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 
2366                                          aname    => 'USER_LIST',
2363             -- Set the user_list attribute to the list of users found
2364             wf_engine.SetItemAttrText  ( itemtype => itemtype,
2365                                          itemkey  => itemkey,
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 ');
2485             l_picked_authorizer := wf_notification.GetAttrText(l_nid,'PICKED_AUTHORIZER');
2482             -- =============== END DEBUG LOG ==================
2483 
2484             -- The notification responder chose to send approval request to chosen user
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 
2591                                             itemkey  => itemkey,
2588          -- Get the current position id
2589          l_current_position_id
2590             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
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 ================
2703 
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 ==================
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
2816 
2813             := wf_engine.GetItemAttrText  ( itemtype => itemtype,
2814                                             itemkey  => itemkey,
2815                                             aname    => 'AUTHORIZER_HISTORY_LIST');
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
2925               DEBUG_LOG_UNEXP_ERROR ('Is_auth_allowed_return.Unexp1','DEFAULT');
2922            wf_core.context('IGI_EXP_APPROVAL_PKG','is_auth_allowed_return',itemtype,itemkey,
2923                            to_char(actid),funcmode);
2924            -- =============== START DEBUG LOG ================
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 
3035          -- =============== END DEBUG LOG ==================
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);
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
3148                               ' funcmode <> RUN -- result --> ' || result);
3145          result := 'COMPLETE';
3146          -- =============== START DEBUG LOG ================
3147             DEBUG_LOG_STRING (l_proc_level, 'Add_auth_to_history.Msg6',
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 
3254          -- Get the position structure version id
3251          -- Get the values of the attributes needed:
3252          -- Position structure version and business group.
3253 
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 
3356       -- =============== END DEBUG LOG ==================
3353       -- =============== START DEBUG LOG ================
3354          DEBUG_LOG_STRING (l_proc_level, 'Set_current_position_to_subord.Msg14',
3355                            ' ** END SET_CURRENT_POSITION_TO_SUBORD ** ');
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 ');
3464          END IF;
3461             -- =============== END DEBUG LOG ==================
3462             -- There is only one user in the history list, so cannot continue
3463             RAISE e_no_prev_auth;
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 ==================
3563 
3560          raise;
3561 
3562    END set_current_auth_to_prev_auth;
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,
3678          -- =============== END DEBUG LOG ==================
3675                          to_char(actid),funcmode);
3676          -- =============== START DEBUG LOG ================
3677             DEBUG_LOG_UNEXP_ERROR ('Reset_du_statuses.Unexp1','DEFAULT');
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,
3803          -- =============== START DEBUG LOG ================
3800                                             itemkey  => itemkey,
3801                                             aname    => 'TU_ID');
3802 
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 ================
3927 
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 ==================
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,
4023             -- =============== START DEBUG LOG ================
4020                                          aname    => 'ALL_DUS_LIST',
4021                                          avalue   => 'plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
4022 
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
4145                                          aname    => 'TEMP_DU_PREPARER_ID',
4142             -- Set the temp_du_preparer_id attribute
4143             wf_engine.SetItemAttrNumber( itemtype => itemtype,
4144                                          itemkey  => itemkey,
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 
4248             -- =============== END DEBUG LOG ==================
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));
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',
4356       IF (funcmode = 'RUN') THEN
4353                            ' ** START REMOVE_DUS_ON_HOLD  ** ');
4354       -- =============== END DEBUG LOG ==================
4355 
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';
4474       l_du_rej_list  VARCHAR2(28000);
4471 
4472       l_tu_id        igi_exp_dus.tu_id%TYPE;
4473       l_rej_count    NUMBER;
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',
4587             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4584                                  ' SetItemAttrText ADD_ATTR3 --> ' || substr(l_du_rej_list, 8001, 4000));
4585             -- =============== END DEBUG LOG ==================
4586 
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 
4689                                     funcmode IN  VARCHAR2,
4686    PROCEDURE get_next_rejected_du ( itemtype IN  VARCHAR2,
4687                                     itemkey  IN  VARCHAR2,
4688                                     actid    IN  NUMBER,
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    rownum = 1;
4700 
4701       CURSOR c_rej_du_info(p_tu_id igi_exp_dus.tu_id%TYPE
4702                           ,p_du_preparer_id igi_exp_dus.du_by_user_id%TYPE)
4703       IS
4704          SELECT du_order_number
4705                ,du_legal_number
4706          FROM   igi_exp_dus du
4707          WHERE  tu_id = p_tu_id
4708          AND    du_status = 'REJ'
4709          AND    du_by_user_id = p_du_preparer_id;
4710 
4711       l_tu_id           igi_exp_dus.tu_id%TYPE;
4712       l_du_id           igi_exp_dus.du_id%TYPE;
4713       l_du_prep_id      igi_exp_dus.du_by_user_id%TYPE;
4714       l_du_prep_name    fnd_user.user_name%TYPE;
4715       l_no              NUMBER := 0 ;
4716       l_du_rej_list     VARCHAR2(28000);
4717 
4718    BEGIN
4719 
4720       -- =============== START DEBUG LOG ================
4721          DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg1',
4722                            ' ** START GET_NEXT_REJECTED_DU ** ');
4723       -- =============== END DEBUG LOG ==================
4724 
4725       IF (funcmode = 'RUN') THEN
4726 
4727          -- Get the TU id
4728          l_tu_id
4729             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
4730                                             itemkey  => itemkey,
4731                                             aname    => 'TU_ID');
4732 
4733          -- =============== START DEBUG LOG ================
4734             DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg2',
4735                               'GetItemAttrNumber TU_ID --> ' || l_tu_id );
4736          -- =============== END DEBUG LOG ==================
4737 
4738          -- Get the next rejected DU in this TU
4739          OPEN c_next_du_rej(l_tu_id);
4740          FETCH c_next_du_rej INTO l_du_id, l_du_prep_id;
4741 
4742          -- =============== START DEBUG LOG ================
4743             DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg3',
4744                               ' l_du_id --> ' || l_du_id || ' l_du_prep_id --> ' || l_du_prep_id);
4745          -- =============== END DEBUG LOG ==================
4746 
4747          IF (c_next_du_rej%NOTFOUND) THEN
4748             -- There are no more rejected DUs to deal with
4749             -- Set result to 'No More DUs'
4750             result := 'COMPLETE:NO_DUS_IN_LIST';
4751 
4752             -- =============== START DEBUG LOG ================
4753                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg4',
4754                                  ' result --> ' || result);
4755             -- =============== END DEBUG LOG ==================
4756 
4757          ELSE
4758 
4759             -- The next rejected DU has been fetched
4760             -- Set the temp_du_preparer_id attribute
4761             wf_engine.SetItemAttrNumber( itemtype => itemtype,
4762                                          itemkey  => itemkey,
4763                                          aname    => 'TEMP_DU_PREPARER_ID',
4764                                          avalue   => l_du_prep_id);
4765 
4766             -- =============== START DEBUG LOG ================
4767                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg5',
4768                                  ' SetItemAttrNumber TEMP_DU_PREPARER_ID --> ' || l_du_prep_id);
4769             -- =============== END DEBUG LOG ==================
4770 
4771             -- Get the name of the preparer to send the notification to
4772             SELECT user_name
4773             INTO   l_du_prep_name
4774             FROM   fnd_user
4775             WHERE  user_id = l_du_prep_id;
4776 
4777             -- =============== START DEBUG LOG ================
4778                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg6',
4779                                  ' l_du_prep_name --> ' || l_du_prep_name);
4780             -- =============== END DEBUG LOG ==================
4781 
4782             -- Set the temp_du_preparer_name attribute
4783             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4784                                          itemkey  => itemkey,
4785                                          aname    => 'TEMP_DU_PREPARER_NAME',
4786                                          avalue   => l_du_prep_name);
4787 
4788             -- =============== START DEBUG LOG ================
4789                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg7',
4790                                  ' SetItemAttrText TEMP_DU_PREPARER_NAME --> ' || l_du_prep_name);
4791             -- =============== END DEBUG LOG ==================
4792 
4793             FOR I IN c_rej_du_info(l_tu_id,l_du_prep_id)
4794             LOOP
4795 
4796                IF (l_du_rej_list is NULL) THEN
4797                   l_du_rej_list := I.du_order_number;
4798                ELSE
4799                   l_du_rej_list := l_du_rej_list ||I.du_order_number;
4800                END IF;
4801 
4802                -- =============== START DEBUG LOG ================
4806 
4803                   DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg8',
4804                                     ' I.du_order_number --> ' || I.du_order_number);
4805                -- =============== END DEBUG LOG ==================
4807                IF (I.du_legal_number is not null) THEN
4808                   l_du_rej_list := l_du_rej_list||' ('||I.du_legal_number||')';
4809                END IF;
4810 
4811                -- =============== START DEBUG LOG ================
4812                   DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg9',
4813                                     ' I.du_legal_number --> ' || I.du_legal_number);
4814                -- =============== END DEBUG LOG ==================
4815 
4816                l_du_rej_list := l_du_rej_list||fnd_global.local_chr(10);
4817 
4818                IF LENGTH(l_du_rej_list) > 28000 THEN
4819                   exit;
4820                END IF;
4821 
4822             END LOOP;
4823 
4824            -- Set the all_dus_list attribute
4825             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4826                                          itemkey  => itemkey,
4827                                          aname    => 'ADD_ATTR1',
4828                                          avalue   => substr(l_du_rej_list, 1, 4000));
4829 
4830             -- =============== START DEBUG LOG ================
4831                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg10',
4832                                  ' SetItemAttrText ADD_ATTR1 --> ' || substr(l_du_rej_list, 1, 4000));
4833             -- =============== END DEBUG LOG ==================
4834 
4835             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4836                                          itemkey  => itemkey,
4837                                          aname    => 'ADD_ATTR2',
4838                                          avalue   => substr(l_du_rej_list, 4001, 4000));
4839 
4840             -- =============== START DEBUG LOG ================
4841                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg11',
4842                                  ' SetItemAttrText ADD_ATTR2 --> ' || substr(l_du_rej_list, 4001, 4000));
4843             -- =============== END DEBUG LOG ==================
4844 
4845             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4846                                          itemkey  => itemkey,
4847                                          aname    => 'ADD_ATTR3',
4848                                          avalue   => substr(l_du_rej_list, 8001, 4000));
4849 
4850             -- =============== START DEBUG LOG ================
4851                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg12',
4852                                  ' SetItemAttrText ADD_ATTR3 --> ' || substr(l_du_rej_list, 8001, 4000));
4853             -- =============== END DEBUG LOG ==================
4854 
4855             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4856                                          itemkey  => itemkey,
4857                                          aname    => 'ADD_ATTR4',
4858                                          avalue   => substr(l_du_rej_list, 12001, 4000));
4859 
4860             -- =============== START DEBUG LOG ================
4861                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg13',
4862                                  ' SetItemAttrText ADD_ATTR4 --> ' || substr(l_du_rej_list, 12001, 4000));
4863             -- =============== END DEBUG LOG ==================
4864 
4865             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4866                                          itemkey  => itemkey,
4867                                          aname    => 'ADD_ATTR5',
4868                                          avalue   => substr(l_du_rej_list, 16001, 4000));
4869 
4870             -- =============== START DEBUG LOG ================
4871                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg14',
4872                                  ' SetItemAttrText ADD_ATTR5 --> ' || substr(l_du_rej_list, 16001, 4000));
4873             -- =============== END DEBUG LOG ==================
4874 
4875             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4876                                          itemkey  => itemkey,
4877                                          aname    => 'ADD_ATTR6',
4878                                          avalue   => substr(l_du_rej_list, 20001, 4000));
4879 
4880             -- =============== START DEBUG LOG ================
4881                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg15',
4882                                  ' SetItemAttrText ADD_ATTR6 --> ' || substr(l_du_rej_list, 20001, 4000));
4883             -- =============== END DEBUG LOG ==================
4884 
4885             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4886                                          itemkey  => itemkey,
4887                                          aname    => 'ADD_ATTR7',
4888                                          avalue   => substr(l_du_rej_list, 24001, 4000));
4889 
4890 
4891             -- =============== START DEBUG LOG ================
4892                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg16',
4893                                  ' SetItemAttrText ADD_ATTR7 --> ' || substr(l_du_rej_list, 24001, 4000));
4894             -- =============== END DEBUG LOG ==================
4895 
4896             wf_engine.SetItemAttrText  ( itemtype => itemtype,
4897                                          itemkey  => itemkey,
4898                                          aname    => 'TEMP_DU_BY_PREP_LIST',
4902                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg17',
4899                                          avalue   => 'plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
4900 
4901             -- =============== START DEBUG LOG ================
4903                                  ' SetItemAttrText ALL_DUS_LIST --> ' ||
4904                                  ' plsqlclob:igi_exp_approval_pkg.Cerate_du_list/'||itemtype||':'||itemkey);
4905             -- =============== END DEBUG LOG ==================
4906 
4907             -- Set the result to 'Next DU Fetched'
4908             result := 'COMPLETE:NEXT_DU_FETCHED';
4909 
4910             -- =============== START DEBUG LOG ================
4911                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg18',
4912                                  ' result --> ' || result);
4913             -- =============== END DEBUG LOG ==================
4914 
4915          END IF;
4916 
4917          IF (c_next_du_rej%ISOPEN) THEN
4918             CLOSE c_next_du_rej;
4919          END IF;
4920 
4921       END IF;
4922 
4923       IF (funcmode <> 'RUN') THEN
4924          result := 'COMPLETE';
4925          -- =============== START DEBUG LOG ================
4926             DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg19',
4927                               ' funcmode <> RUN -- result --> ' || result);
4928          -- =============== END DEBUG LOG ==================
4929          return;
4930       END IF;
4931 
4932       -- =============== START DEBUG LOG ================
4933          DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_du.Msg20',
4934                            ' ** END GET_NEXT_REJECTED_DU ** ');
4935       -- =============== END DEBUG LOG ==================
4936 
4937    EXCEPTION
4938       WHEN OTHERS THEN
4939          wf_core.context('IGI_EXP_APPROVAL_PKG','get_next_rejected_du',itemtype,itemkey,
4940                          to_char(actid),funcmode);
4941          -- =============== START DEBUG LOG ================
4942             DEBUG_LOG_UNEXP_ERROR ('Get_next_rejected_du.Unexp1','DEFAULT');
4943          -- =============== END DEBUG LOG ==================
4944          raise;
4945 
4946    END get_next_rejected_du;
4947    -- OPSF(I) EXP Bug 2415293  S Brewer 11-JUL-2002 End(2)
4948 
4949 
4950 
4951    -- *************************************************************************
4952    --    REM_TRX_FROM_REJ_DUS
4953    -- *************************************************************************
4954 
4955    PROCEDURE rem_trx_from_rej_dus ( itemtype IN  VARCHAR2,
4956                                     itemkey  IN  VARCHAR2,
4957                                     actid    IN  NUMBER,
4958                                     funcmode IN  VARCHAR2,
4959                                     result   OUT NOCOPY VARCHAR2) IS
4960 
4961       CURSOR c_rej_dus(p_tu_id igi_exp_dus.tu_id%TYPE
4962                       ,p_du_preparer_id igi_exp_dus.du_by_user_id%TYPE)
4963       IS
4964          SELECT du_id
4965          FROM   igi_exp_dus du
4966          WHERE  tu_id = p_tu_id
4967          AND    du_status = 'REJ'
4968          AND    du_by_user_id = p_du_preparer_id
4969          AND    EXISTS (SELECT 'AR'
4970                         FROM   igi_exp_ar_trans ar
4971                         WHERE  ar.du_id = du.du_id
4972                         UNION
4973                         SELECT 'AP'
4974                         FROM   igi_exp_ap_trans ap
4975                         WHERE  ap.du_id = du.du_id);
4976 
4977       l_tu_id          igi_exp_dus.tu_id%TYPE;
4978       l_du_prep_id     igi_exp_dus.du_by_user_id%TYPE;
4979       l_du_id          igi_exp_dus.du_id%TYPE;
4980       l_du_amount      igi_exp_dus.du_amount%TYPE;
4981 
4982    BEGIN
4983 
4984       -- =============== START DEBUG LOG ================
4985          DEBUG_LOG_STRING (l_proc_level, 'Rem_trx_from_rej_dus.Msg1',
4986                            ' ** START REM_TRX_FROM_REJ_DUS ** ');
4987       -- =============== END DEBUG LOG ==================
4988 
4989      IF (funcmode = 'RUN') THEN
4990 
4991          -- Want to remove all transactions contained within rejected
4992          -- dialog units
4993 
4994          -- Get the TU id
4995          l_tu_id
4996             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
4997                                             itemkey  => itemkey,
4998                                             aname    => 'TU_ID');
4999 
5000          -- =============== START DEBUG LOG ================
5001             DEBUG_LOG_STRING (l_proc_level, 'Rem_trx_from_rej_dus.Msg2',
5002                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
5003          -- =============== END DEBUG LOG ==================
5004 
5005          -- Get the DU preparer id
5006          l_du_prep_id
5007             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5008                                             itemkey  => itemkey,
5009                                             aname    => 'TEMP_DU_PREPARER_ID');
5010 
5011          -- =============== START DEBUG LOG ================
5012             DEBUG_LOG_STRING (l_proc_level, 'Rem_trx_from_rej_dus.Msg3',
5013                               ' GetItemAttrNumber TEMP_DU_PREPARER_ID --> '|| l_du_prep_id);
5014          -- =============== END DEBUG LOG ==================
5015 
5016          FOR I IN c_rej_dus(l_tu_id,l_du_prep_id)
5017          LOOP
5018 
5019             DELETE FROM igi_exp_ar_trans
5023                DEBUG_LOG_STRING (l_proc_level, 'Rem_trx_from_rej_dus.Msg4',
5020             WHERE  du_id = I.du_id;
5021 
5022             -- =============== START DEBUG LOG ================
5024                                  'DELETE FROM igi_exp_ar_trans --> ' || SQL%ROWCOUNT);
5025             -- =============== END DEBUG LOG ==================
5026 
5027             DELETE FROM igi_exp_ap_trans
5028             WHERE du_id = I.du_id;
5029 
5030             -- =============== START DEBUG LOG ================
5031                DEBUG_LOG_STRING (l_proc_level, 'Rem_trx_from_rej_dus.Msg5',
5032                                  ' DELETE FROM igi_exp_ap_trans --> ' || SQL%ROWCOUNT);
5033             -- =============== END DEBUG LOG ==================
5034 
5035          END LOOP;
5036 
5037          -- OPSF(I) EXP Bug 2415293  S Brewer 18-JUL-2002 Start(2)
5038          -- Now that the transactions have been removed from the DUs
5039          -- need to update the DU amounts to 0.  But before doing
5040          -- this, update the TU amount
5041          -- i.e. New TU amount = TU amount - DU amount
5042 
5043          -- First find the total DU amount
5044          SELECT sum(du_amount)
5045          INTO   l_du_amount
5046          FROM   igi_exp_dus
5047          WHERE  tu_id = l_tu_id
5048          AND    du_by_user_id = l_du_prep_id
5049          AND    du_status = 'REJ';
5050 
5051          -- =============== START DEBUG LOG ================
5052             DEBUG_LOG_STRING (l_proc_level, 'Rem_trx_from_rej_dus.Msg6',
5053                               ' l_du_amount --> ' || l_du_amount);
5054          -- =============== END DEBUG LOG ==================
5055 
5056          -- Update the TU amount
5057          UPDATE igi_exp_tus
5058          SET    tu_amount = tu_amount - l_du_amount
5059          WHERE  tu_id = l_tu_id;
5060 
5061          -- =============== START DEBUG LOG ================
5062             DEBUG_LOG_STRING (l_proc_level, 'Rem_trx_from_rej_dus.Msg7',
5063                               ' UPDATE igi_exp_tus --> ' || SQL%ROWCOUNT);
5064          -- =============== END DEBUG LOG ==================
5065 
5066          -- Now update the DU amount to 0
5067          UPDATE igi_exp_dus
5068          SET    du_amount = 0
5069          WHERE  tu_id = l_tu_id
5070          AND    du_by_user_id = l_du_prep_id
5071          AND    du_status = 'REJ';
5072 
5073          -- OPSF(I) EXP Bug 2415293  S Brewer 18-JUL-2002 End(2)
5074 
5075          -- =============== START DEBUG LOG ================
5076             DEBUG_LOG_STRING (l_proc_level, 'Rem_trx_from_rej_dus.Msg8',
5077                               ' UPDATE igi_exp_dus du_amount = 0 --> ' || SQL%ROWCOUNT);
5078          -- =============== END DEBUG LOG ==================
5079 
5080       END IF;
5081 
5082       IF (funcmode <> 'RUN') THEN
5083          result := 'COMPLETE';
5084          -- =============== START DEBUG LOG ================
5085             DEBUG_LOG_STRING (l_proc_level, 'Rem_trx_from_rej_dus.Msg9',
5086                               ' funcmode <> RUN -- result --> ' || result);
5087          -- =============== END DEBUG LOG ==================
5088          return;
5089       END IF;
5090 
5091       -- =============== START DEBUG LOG ================
5092          DEBUG_LOG_STRING (l_proc_level, 'Rem_trx_from_rej_dus.Msg10',
5093                            ' ** END REM_TRX_FROM_REJ_DUS ** ');
5094       -- =============== END DEBUG LOG ==================
5095 
5096    EXCEPTION
5097       WHEN OTHERS THEN
5098          wf_core.context('IGI_EXP_APPROVAL_PKG','rem_trx_from_rej_dus',itemtype,itemkey,
5099                          to_char(actid),funcmode);
5100          -- =============== START DEBUG LOG ================
5101             DEBUG_LOG_UNEXP_ERROR ('Rem_trx_from_rej_dus.Unexp1','DEFAULT');
5102          -- =============== END DEBUG LOG ==================
5103          raise;
5104 
5105    END rem_trx_from_rej_dus;
5106 
5107 
5108    -- *************************************************************************
5109    --    IS_LEGAL_NUM_REQ
5110    -- *************************************************************************
5111 
5112    PROCEDURE is_legal_num_req     ( itemtype IN  VARCHAR2,
5113                                     itemkey  IN  VARCHAR2,
5114                                     actid    IN  NUMBER,
5115                                     funcmode IN  VARCHAR2,
5116                                     result   OUT NOCOPY VARCHAR2) IS
5117 
5118       l_legal_num_pos_id   igi_exp_apprv_profiles.legal_num_pos_id%TYPE;
5119       l_current_pos_id     per_all_positions.position_id%TYPE;
5120 
5121    BEGIN
5122 
5123       -- =============== START DEBUG LOG ================
5124          DEBUG_LOG_STRING (l_proc_level, 'Is_legal_num_req.Msg1',
5125                            ' ** START IS_LEGAL_NUM_REQ ** ');
5126       -- =============== END DEBUG LOG ==================
5127 
5128       IF (funcmode = 'RUN') THEN
5129 
5130          -- Get the legal numbering position id
5131          l_legal_num_pos_id
5132             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5133                                             itemkey  => itemkey,
5134                                             aname    => 'LEGAL_NUM_POS_ID');
5135 
5136          -- =============== START DEBUG LOG ================
5137             DEBUG_LOG_STRING (l_proc_level, 'Is_legal_num_req.Msg2',
5138                               'GetItemAttrNumber LEGAL_NUM_POS_ID --> ' || l_legal_num_pos_id);
5142          -- the we need to generate legal numbers for the TU and DUs
5139          -- =============== END DEBUG LOG ==================
5140 
5141          -- If the current position is the legal numbering position
5143          -- Get the current position id
5144          l_current_pos_id
5145             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5146                                             itemkey  => itemkey,
5147                                             aname    => 'CURRENT_POSITION_ID');
5148 
5149          -- =============== START DEBUG LOG ================
5150             DEBUG_LOG_STRING (l_proc_level, 'Is_legal_num_req.Msg3',
5151                               ' GetItemAttrNumber CURRENT_POSITION_ID --> ' || l_current_pos_id);
5152          -- =============== END DEBUG LOG ==================
5153 
5154          IF (l_current_pos_id = l_legal_num_pos_id) THEN
5155             -- Set the result to 'Yes'
5156             result := 'COMPLETE:Y';
5157             -- =============== START DEBUG LOG ================
5158                DEBUG_LOG_STRING (l_proc_level, 'Is_legal_num_req.Msg4',
5159                                  ' l_current_pos_id = l_legal_num_pos_id -- result --> ' || result);
5160             -- =============== END DEBUG LOG ==================
5161 
5162          ELSE
5163             -- Set the result to 'No'
5164             result := 'COMPLETE:N';
5165             -- =============== START DEBUG LOG ================
5166                DEBUG_LOG_STRING (l_proc_level, 'Is_legal_num_req.Msg5',
5167                                  ' result --> ' || result);
5168             -- =============== END DEBUG LOG ==================
5169          END IF;
5170 
5171       END IF;
5172 
5173       IF (funcmode <> 'RUN') THEN
5174          result := 'COMPLETE';
5175          -- =============== START DEBUG LOG ================
5176             DEBUG_LOG_STRING (l_proc_level, 'Is_legal_num_req.Msg6',
5177                               ' funcmode <> RUN -- result --> '|| result );
5178          -- =============== END DEBUG LOG ==================
5179          return;
5180       END IF;
5181 
5182       -- =============== START DEBUG LOG ================
5183          DEBUG_LOG_STRING (l_proc_level, 'Is_legal_num_req.Msg7',
5184                            ' ** END IS_LEGAL_NUM_REQ ** ');
5185       -- =============== END DEBUG LOG ==================
5186 
5187    EXCEPTION
5188       WHEN OTHERS THEN
5189          wf_core.context('IGI_EXP_APPROVAL_PKG','is_legal_num_req',itemtype,itemkey,
5190                          to_char(actid),funcmode);
5191          -- =============== START DEBUG LOG ================
5192             DEBUG_LOG_UNEXP_ERROR ('Is_legal_num_req.Unexp1','DEFAULT');
5193          -- =============== END DEBUG LOG ==================
5194           raise;
5195 
5196    END is_legal_num_req;
5197 
5198 
5199    -- *************************************************************************
5200    --    APPLY_TU_LEGAL_NUM
5201    -- *************************************************************************
5202 
5203    PROCEDURE apply_tu_legal_num   ( itemtype IN  VARCHAR2,
5204                                     itemkey  IN  VARCHAR2,
5205                                     actid    IN  NUMBER,
5206                                     funcmode IN  VARCHAR2,
5207                                     result   OUT NOCOPY VARCHAR2) IS
5208 
5209       l_tu_id               igi_exp_dus.tu_id%TYPE;
5210       l_tu_type_header_id   igi_exp_tus.tu_type_header_id%TYPE;
5211       l_tu_fiscal_year      igi_exp_tus.tu_fiscal_year%TYPE;
5212       l_tu_legal_number     igi_exp_tus.tu_legal_number%TYPE;
5213       l_tu_full_number      VARCHAR2(240);
5214       l_error_message       VARCHAR2(250);
5215 
5216    BEGIN
5217 
5218       -- =============== START DEBUG LOG ================
5219          DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg1',
5220                            ' ** START APPLY_TU_LEGAL_NUM ** ');
5221       -- =============== END DEBUG LOG ==================
5222 
5223      IF (funcmode = 'RUN') THEN
5224 
5225          -- Get the TU id
5226          l_tu_id
5227             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5228                                             itemkey  => itemkey,
5229                                             aname    => 'TU_ID');
5230 
5231          -- =============== START DEBUG LOG ================
5232             DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg2',
5233                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id );
5234          -- =============== END DEBUG LOG ==================
5235 
5236          -- Get the TU type and the fiscal year of the TU
5237          SELECT tu_type_header_id
5238                ,tu_fiscal_year
5239          INTO   l_tu_type_header_id
5240                ,l_tu_fiscal_year
5241          FROM   igi_exp_tus
5242          WHERE  tu_id = l_tu_id;
5243 
5244          -- =============== START DEBUG LOG ================
5245             DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg3',
5246                               ' l_tu_type_header_id --> ' || l_tu_type_header_id ||
5247                               ' l_tu_fiscal_year --> ' || l_tu_fiscal_year);
5248             DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg4',
5249                               ' Calling igi_exp_utils.generate_number ');
5250          -- =============== END DEBUG LOG ==================
5251 
5252          -- Get the legal number for the TU
5256                                       ,l_tu_fiscal_year     -- pi_fiscal_year
5253          igi_exp_utils.generate_number('TU'                 -- pi_number_type
5254                                       ,'L'                  -- pi_number_class
5255                                       ,l_tu_type_header_id  -- pi_du_tu_type_id
5257                                       ,l_tu_legal_number    -- po_du_tu_number
5258                                       ,l_error_message);    -- po_error_message
5259 
5260          -- =============== START DEBUG LOG ================
5261             DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg5',
5262                               ' l_tu_legal_number --> ' || l_tu_legal_number);
5263          -- =============== END DEBUG LOG ==================
5264 
5265          IF (l_tu_legal_number is null) THEN
5266             -- An error occurred generating the TU legal number
5267             -- Set the error message attribute to be used in the
5268             -- notification sent to the system administrator
5269 
5270             -- Set the error_message attribute
5271             wf_engine.SetItemAttrText  ( itemtype => itemtype,
5272                                          itemkey  => itemkey,
5273                                          aname    => 'ERROR_MESSAGE',
5274                                          avalue   => l_error_message);
5275 
5276             -- =============== START DEBUG LOG ================
5277                DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg6',
5278                                  ' SetItemAttrText ERROR_MESSAGE --> ' || l_error_message);
5279             -- =============== END DEBUG LOG ==================
5280 
5281             -- Exit with result 'Failure
5282             result := 'COMPLETE:FAILURE';
5283 
5284             -- =============== START DEBUG LOG ================
5285                DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg7',
5286                                  ' result --> ' || result);
5287             -- =============== END DEBUG LOG ==================
5288 
5289             return;
5290 
5291          ELSE
5292 
5293             -- TU Legal number was generated successfully
5294             -- Apply the legal number to the TU
5295             UPDATE igi_exp_tus
5296             SET    tu_legal_number = l_tu_legal_number
5297             WHERE  tu_id = l_tu_id;
5298 
5299 
5300             -- =============== START DEBUG LOG ================
5301                DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg8',
5302                                  'UPDATE igi_exp_tus -  ' || SQL%ROWCOUNT);
5303             -- =============== END DEBUG LOG ==================
5304 
5305             -- OPSF(I) EXP Bug 2567802 26-Sep-2002  S Brewer  Start(2)
5306             -- Set the TU Full Number attribute to include the legal number
5307             l_tu_full_number
5308             := wf_engine.GetItemAttrText  ( itemtype => itemtype,
5309                                             itemkey  => itemkey,
5310                                             aname    => 'TU_FULL_NUMBER');
5311 
5312             -- =============== START DEBUG LOG ================
5313                DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg9',
5314                                  ' GetItemAttrText TU_FULL_NUMBER --> ' || l_tu_full_number);
5315             -- =============== END DEBUG LOG ==================
5316 
5317             l_tu_full_number := l_tu_full_number||' ('||l_tu_legal_number||')';
5318 
5319             -- =============== START DEBUG LOG ================
5320                DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg10',
5321                                  ' l_tu_full_number --> ' || l_tu_full_number);
5322             -- =============== END DEBUG LOG ==================
5323 
5324             wf_engine.SetItemAttrText  ( itemtype => itemtype,
5325                                          itemkey  => itemkey,
5326                                          aname    => 'TU_FULL_NUMBER',
5327                                          avalue   => l_tu_legal_number);
5328 
5329             -- OPSF(I) EXP Bug 2567802 26-Sep-2002  S Brewer  End(2)
5330 
5331             -- =============== START DEBUG LOG ================
5332                DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg11',
5333                                  ' SetItemAttrText TU_FULL_NUMBER --> ' || l_tu_legal_number);
5334             -- =============== END DEBUG LOG ==================
5335 
5336             -- Set the result to Success
5337             result := 'COMPLETE:SUCCESS';
5338 
5339             -- =============== START DEBUG LOG ================
5340                DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg12',
5341                                  ' result --> ' || result);
5342             -- =============== END DEBUG LOG ==================
5343 
5344          END IF;
5345 
5346       END IF;
5347 
5348       IF (funcmode <> 'RUN') THEN
5349          result := 'COMPLETE';
5350          -- =============== START DEBUG LOG ================
5351             DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg13',
5352                               ' funcmode <> RUN -- result --> ' || result);
5353          -- =============== END DEBUG LOG ==================
5354          return;
5355       END IF;
5356 
5357       -- =============== START DEBUG LOG ================
5358          DEBUG_LOG_STRING (l_proc_level, 'Apply_tu_legal_num.Msg14',
5359                            ' ** END APPLY_TU_LEGAL_NUM ** ');
5360       -- =============== END DEBUG LOG ==================
5361 
5362    EXCEPTION
5366          -- =============== START DEBUG LOG ================
5363       WHEN OTHERS THEN
5364          wf_core.context('IGI_EXP_APPROVAL_PKG','apply_tu_legal_num',itemtype,itemkey,
5365                          to_char(actid),funcmode);
5367             DEBUG_LOG_UNEXP_ERROR ('Apply_tu_legal_num.Unexp1','DEFAULT');
5368          -- =============== END DEBUG LOG ==================
5369          raise;
5370 
5371    END apply_tu_legal_num;
5372 
5373 
5374 
5375    -- *************************************************************************
5376    --    APPLY_DU_LEGAL_NUM
5377    -- *************************************************************************
5378 
5379    PROCEDURE apply_du_legal_num   ( itemtype IN  VARCHAR2,
5380                                     itemkey  IN  VARCHAR2,
5381                                     actid    IN  NUMBER,
5382                                     funcmode IN  VARCHAR2,
5383                                     result   OUT NOCOPY VARCHAR2) IS
5384 
5385       CURSOR c_get_du(p_tu_id  igi_exp_dus.tu_id%TYPE)
5386       IS
5387          SELECT du_id
5388                ,du_type_header_id
5389                ,du_fiscal_year
5390                ,du_order_number
5391          FROM   igi_exp_dus
5392          WHERE  tu_id = p_tu_id
5393          AND du_status = 'ATR';
5394 
5395       l_tu_id              igi_exp_dus.tu_id%TYPE;
5396       l_du_id              igi_exp_dus.du_id%TYPE;
5397       l_du_type_header_id  igi_exp_dus.du_type_header_id%TYPE;
5398       l_du_fiscal_year     igi_exp_dus.du_fiscal_year%TYPE;
5399       l_du_order_number    igi_exp_dus.du_order_number%TYPE;
5400       l_du_legal_number    igi_exp_dus.du_legal_number%TYPE;
5401       l_error_message      VARCHAR2(250);
5402       l_du_failed          VARCHAR2(1):='N';
5403 
5404    BEGIN
5405 
5406       -- =============== START DEBUG LOG ================
5407          DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg1',
5408                            ' ** START APPLY_DU_LEGAL_NUM ** ');
5409       -- =============== END DEBUG LOG ==================
5410 
5411       IF (funcmode = 'RUN') THEN
5412 
5413          -- Get the tu id
5414          l_tu_id
5415             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5416                                             itemkey  => itemkey,
5417                                             aname    => 'TU_ID');
5418 
5419          -- =============== START DEBUG LOG ================
5420             DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg2',
5421                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
5422          -- =============== END DEBUG LOG ==================
5423 
5424          savepoint legal_num_save;
5425 
5426          -- =============== START DEBUG LOG ================
5427             DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg3',
5428                               ' set savepoint legal_num_save ');
5429          -- =============== END DEBUG LOG ==================
5430 
5431          OPEN c_get_du(l_tu_id);
5432          LOOP
5433 
5434             FETCH c_get_du INTO l_du_id
5435                               , l_du_type_header_id
5436                               , l_du_fiscal_year
5437                               , l_du_order_number;
5438 
5439             -- =============== START DEBUG LOG ================
5440                DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg4',
5441                                  ' l_du_id --> ' || l_du_id ||
5442                                  ' l_du_type_header_id --> ' || l_du_type_header_id ||
5443                                  ' l_du_fiscal_year --> ' || l_du_fiscal_year ||
5444                                  ' l_du_order_number --> ' || l_du_order_number);
5445             -- =============== END DEBUG LOG ==================
5446 
5447             EXIT WHEN c_get_du%NOTFOUND;
5448 
5449             -- =============== START DEBUG LOG ================
5450                DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg5',
5451                                  ' calling  igi_exp_utils.generate_number ');
5452             -- =============== END DEBUG LOG ==================
5453 
5454             -- Get the legal number for the DU
5455             igi_exp_utils.generate_number('DU'                 -- pi_number_type
5456                                          ,'L'                  -- pi_number_class
5457                                          ,l_du_type_header_id  -- pi_du_tu_type_id
5458                                          ,l_du_fiscal_year     -- pi_fiscal_year
5459                                          ,l_du_legal_number    -- po_du_tu_number
5460                                          ,l_error_message);    -- po_error_message
5461 
5462             -- =============== START DEBUG LOG ================
5463                DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg6',
5464                                  ' l_du_legal_number --> ' || l_du_legal_number);
5465             -- =============== END DEBUG LOG ==================
5466 
5467             IF (l_du_legal_number is null) THEN
5468                -- An error occurred generating the DU legal number
5469                -- Set the error message attribute to be used in the
5470                -- notification sent to the system administrator
5471 
5472                -- Set the error_message attribute
5473                wf_engine.SetItemAttrText  ( itemtype => itemtype,
5474                                             itemkey  => itemkey,
5475                                             aname    => 'ERROR_MESSAGE',
5479                   DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg7',
5476                                             avalue   => l_error_message);
5477 
5478                -- =============== START DEBUG LOG ================
5480                                     ' SetItemAttrText ERROR_MESSAGE --> ' || l_error_message);
5481                -- =============== END DEBUG LOG ==================
5482 
5483                -- Set the legal_num_failed_du attribute
5484                wf_engine.SetItemAttrText  ( itemtype => itemtype,
5485                                             itemkey  => itemkey,
5486                                             aname    => 'LEGAL_NUM_FAILED_DU',
5487                                             avalue   => l_du_order_number);
5488 
5489                -- =============== START DEBUG LOG ================
5490                   DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg8',
5491                                     ' SetItemAttrText LEGAL_NUM_FAILED_DU --> ' || l_du_order_number);
5492                -- =============== END DEBUG LOG ==================
5493 
5494                -- rollback any legal numbering which did work
5495                rollback to legal_num_save;
5496 
5497                -- =============== START DEBUG LOG ================
5498                   DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg9',
5499                                     ' rollback to legal_num_save ');
5500                -- =============== END DEBUG LOG ==================
5501 
5502                -- set result to 'Failure'
5503                result := 'COMPLETE:FAILURE';
5504 
5505                -- =============== START DEBUG LOG ================
5506                   DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg10',
5507                                     ' result --> ' || result );
5508                -- =============== END DEBUG LOG ==================
5509 
5510                -- set l_du_failed to 'Y'
5511                l_du_failed := 'Y';
5512 
5513                -- =============== START DEBUG LOG ================
5514                   DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg11',
5515                                     ' l_du_failed --> ' || l_du_failed);
5516                -- =============== END DEBUG LOG ==================
5517 
5518                -- exit loop
5519                EXIT;
5520 
5521             ELSE
5522 
5523                -- DU Legal number was generated successfully
5524                -- Apply the legal number to the DU
5525                UPDATE igi_exp_dus
5526                SET    du_legal_number = l_du_legal_number
5527                WHERE  du_id = l_du_id;
5528 
5529                -- =============== START DEBUG LOG ================
5530                   DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg12',
5531                                     ' UPDATE igi_exp_dus --> ' || SQL%ROWCOUNT);
5532                -- =============== END DEBUG LOG ==================
5533 
5534             END IF;
5535          END LOOP;
5536 
5537          IF (c_get_du%ISOPEN) THEN
5538             CLOSE c_get_du;
5539          END IF;
5540 
5541          IF (l_du_failed = 'Y') THEN
5542             -- set result to 'Failure'
5543             result := 'COMPLETE:FAILURE';
5544          ELSE
5545             -- set result to 'Success'
5546             result := 'COMPLETE:SUCCESS';
5547          END IF;
5548 
5549          -- =============== START DEBUG LOG ================
5550             DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg13',
5551                               ' result --> ' || result);
5552          -- =============== END DEBUG LOG ==================
5553 
5554       END IF;
5555 
5556       IF (funcmode <> 'RUN') THEN
5557          result := 'COMPLETE';
5558          -- =============== START DEBUG LOG ================
5559             DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg14',
5560                               ' ** START APPLY_DU_LEGAL_NUM ** ');
5561          -- =============== END DEBUG LOG ==================
5562          return;
5563       END IF;
5564 
5565       -- =============== START DEBUG LOG ================
5566          DEBUG_LOG_STRING (l_proc_level, 'Apply_du_legal_num.Msg15',
5567                            ' ** END APPLY_DU_LEGAL_NUM ** ');
5568       -- =============== END DEBUG LOG ==================
5569 
5570    EXCEPTION
5571       WHEN OTHERS THEN
5572          wf_core.context('IGI_EXP_APPROVAL_PKG','apply_du_legal_num',itemtype,itemkey,
5573                          to_char(actid),funcmode);
5574          -- =============== START DEBUG LOG ================
5575             DEBUG_LOG_UNEXP_ERROR ('Apply_du_legal_num.Unexp1','DEFAULT');
5576          -- =============== END DEBUG LOG ==================
5577          raise;
5578 
5579    END apply_du_legal_num;
5580 
5581 
5582 
5583    -- *************************************************************************
5584    --    SET_TU_STATUS
5585    -- *************************************************************************
5586 
5587    PROCEDURE set_tu_status        ( itemtype IN  VARCHAR2,
5588                                     itemkey  IN  VARCHAR2,
5589                                     actid    IN  NUMBER,
5590                                     funcmode IN  VARCHAR2,
5591                                     result   OUT NOCOPY VARCHAR2) IS
5592 
5593       l_tu_id        igi_exp_dus.tu_id%TYPE;
5594       l_tu_status    igi_exp_tus.tu_status%TYPE;
5598       -- Check if the TU has a status
5595       l_atr_du_count NUMBER;
5596 
5597       -- Bug 4051910
5599       CURSOR C_stat(p_tu_id number)
5600       IS
5601          SELECT tu_status
5602          FROM   igi_exp_tus
5603          WHERE  tu_id = p_tu_id;
5604 
5605 
5606 
5607    BEGIN
5608 
5609       -- =============== START DEBUG LOG ================
5610          DEBUG_LOG_STRING (l_proc_level, 'Set_tu_status.Msg1',
5611                            ' ** START SET_TU_STATUS ** ');
5612       -- =============== END DEBUG LOG ==================
5613 
5614       IF (funcmode = 'RUN') THEN
5615 
5616          -- Get the TU id
5617          l_tu_id
5618             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5619                                             itemkey  => itemkey,
5620                                             aname    => 'TU_ID');
5621 
5622          -- =============== START DEBUG LOG ================
5623             DEBUG_LOG_STRING (l_proc_level, 'Set_tu_status.Msg2',
5624                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
5625          -- =============== END DEBUG LOG ==================
5626 
5627          -- Bug 4051910
5628          OPEN  c_stat(l_tu_id);
5629          FETCH c_stat INTO l_tu_status;
5630          CLOSE c_stat;
5631 
5632          -- =============== START DEBUG LOG ================
5633             DEBUG_LOG_STRING (l_proc_level, 'Set_tu_status.Msg3',
5634                               ' l_tu_status --> ' || l_tu_status);
5635          -- =============== END DEBUG LOG ==================
5636 
5637          IF (l_tu_status = 'TRA') THEN
5638 
5639             UPDATE igi_exp_tus
5640             SET    tu_status = 'ATR'
5641             WHERE  tu_id = l_tu_id;
5642             -- =============== START DEBUG LOG ================
5643                DEBUG_LOG_STRING (l_proc_level, 'Set_tu_status.Msg4',
5644                                  ' UPDATE igi_exp_tus --> ' || SQL%ROWCOUNT);
5645             -- =============== END DEBUG LOG ==================
5646 
5647          END IF;
5648 
5649          -- Find how many DUs in the TU are approved
5650          SELECT count(*)
5651          INTO   l_atr_du_count
5652          FROM   igi_exp_dus
5653          WHERE  tu_id = l_tu_id
5654          AND    du_status = 'ATR';
5655 
5656          -- =============== START DEBUG LOG ================
5657             DEBUG_LOG_STRING (l_proc_level, 'Set_tu_status.Msg5',
5658                               ' l_atr_du_count --> ' || l_atr_du_count);
5659          -- =============== END DEBUG LOG ==================
5660 
5661          IF (l_atr_du_count = 0) THEN
5662             -- This TU contains no approved DUs
5663             -- Set the result to 'TU Empty'
5664             result := 'COMPLETE:TU_EMPTY';
5665             -- =============== START DEBUG LOG ================
5666                DEBUG_LOG_STRING (l_proc_level, 'Set_tu_status.Msg6',
5667                                  ' l_atr_du_count = 0 -- result --> ' || result);
5668             -- =============== END DEBUG LOG ==================
5669          ELSE
5670             -- This TU contains at least one approved DU
5671             -- Set the result to 'TU Not Empty'
5672             result := 'COMPLETE:TU_NOT_EMPTY';
5673             -- =============== START DEBUG LOG ================
5674                DEBUG_LOG_STRING (l_proc_level, 'Set_tu_status.Msg7',
5675                                  ' result --> ' || result);
5676             -- =============== END DEBUG LOG ==================
5677          END IF;
5678       END IF;
5679 
5680       IF (funcmode <> 'RUN') THEN
5681          result := 'COMPLETE';
5682          -- =============== START DEBUG LOG ================
5683             DEBUG_LOG_STRING (l_proc_level, 'Set_tu_status.Msg8',
5684                               ' funcmode <> RUN -- result --> ' || result);
5685          -- =============== END DEBUG LOG ==================
5686          return;
5687       END IF;
5688 
5689       -- =============== START DEBUG LOG ================
5690          DEBUG_LOG_STRING (l_proc_level, 'Set_tu_status.Msg9',
5691                            ' ** END SET_TU_STATUS ** ');
5692       -- =============== END DEBUG LOG ==================
5693 
5694    EXCEPTION
5695       WHEN OTHERS THEN
5696          wf_core.context('IGI_EXP_APPROVAL_PKG','set_tu_status',itemtype,itemkey,
5697                          to_char(actid),funcmode);
5698          -- =============== START DEBUG LOG ================
5699             DEBUG_LOG_UNEXP_ERROR ('Set_tu_status.Unexp1','DEFAULT');
5700          -- =============== END DEBUG LOG ==================
5701          raise;
5702 
5703    END set_tu_status;
5704 
5705 
5706    -- *************************************************************************
5707    --    GET_PARENT_POSITION
5708    -- *************************************************************************
5709 
5710    PROCEDURE get_parent_position  ( itemtype IN  VARCHAR2,
5711                                     itemkey  IN  VARCHAR2,
5712                                     actid    IN  NUMBER,
5713                                     funcmode IN  VARCHAR2,
5714                                     result   OUT NOCOPY VARCHAR2) IS
5715 
5716      CURSOR c_get_parent_position(p_position_id per_all_positions.position_id%TYPE
5717                                  ,p_pos_structure_version_id per_pos_structure_versions.pos_structure_version_id%TYPE
5721         FROM   per_pos_structure_elements
5718                                  ,p_business_group_id hr_all_positions_f.business_group_id%TYPE)
5719      IS
5720         SELECT parent_position_id
5722         WHERE  pos_structure_version_id = p_pos_structure_version_id
5723         AND    business_group_id = p_business_group_id
5724         AND    subordinate_position_id = p_position_id;
5725 
5726       l_position_id              per_all_positions.position_id%TYPE;
5727       l_parent_pos_id            per_all_positions.position_id%TYPE;
5728       l_parent_pos_name          per_all_positions.name%TYPE;
5729       l_final_apprv_pos_id       igi_exp_apprv_profiles.final_apprv_pos_id%TYPE;
5730       l_business_group_id        hr_all_positions_f.business_group_id%TYPE;
5731       l_pos_structure_version_id per_pos_structure_versions.pos_structure_version_id%TYPE;
5732 
5733    BEGIN
5734 
5735       -- =============== START DEBUG LOG ================
5736          DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg1',
5737                            ' ** START GET_PARENT_POSITION ** ');
5738       -- =============== END DEBUG LOG ==================
5739 
5740       IF (funcmode = 'RUN') THEN
5741 
5742          -- Get the current position id
5743          l_position_id
5744             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5745                                             itemkey  => itemkey,
5746                                             aname    => 'CURRENT_POSITION_ID');
5747 
5748          -- =============== START DEBUG LOG ================
5749             DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg2',
5750                               ' GetItemAttrNumber CURRENT_POSITION_ID --> ' || l_position_id);
5751          -- =============== END DEBUG LOG ==================
5752 
5753          -- Get the final approver position id
5754          l_final_apprv_pos_id
5755             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5756                                             itemkey  => itemkey,
5757                                             aname    => 'FINAL_APPRV_POS_ID');
5758 
5759          -- =============== START DEBUG LOG ================
5760             DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg3',
5761                               ' GetItemAttrNumber FINAL_APPRV_POS_ID --> ' || l_final_apprv_pos_id);
5762          -- =============== END DEBUG LOG ==================
5763 
5764          -- If the current position is the final approver position then
5765          -- this position has no parent position
5766          IF (l_position_id = l_final_apprv_pos_id) THEN
5767             -- set the result to 'No Parent' and exit
5768             result := 'COMPLETE:NO_PARENT';
5769             -- =============== START DEBUG LOG ================
5770                DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg4',
5771                                  ' l_position_id = l_final_apprv_pos_id -- result --> ' || result);
5772             -- =============== END DEBUG LOG ==================
5773             return;
5774          END IF;
5775 
5776          -- Now need to check if there is a parent position in the HR hierarchy
5777          -- Get the position structure version id
5778          l_pos_structure_version_id
5779             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5780                                             itemkey  => itemkey,
5781                                             aname    => 'POS_STRUCTURE_VERSION_ID');
5782 
5783          -- =============== START DEBUG LOG ================
5784             DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg5',
5785                               ' GetItemAttrNumber POS_STRUCTURE_VERSION_ID --> ' ||l_pos_structure_version_id);
5786          -- =============== END DEBUG LOG ==================
5787 
5788          -- Get the business group id
5789          l_business_group_id
5790             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5791                                             itemkey  => itemkey,
5792                                             aname    => 'BUSINESS_GROUP_ID');
5793 
5794          -- =============== START DEBUG LOG ================
5795             DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg6',
5796                               ' GetItemAttrNumber BUSINESS_GROUP_ID --> ' || l_business_group_id);
5797          -- =============== END DEBUG LOG ==================
5798 
5799          OPEN c_get_parent_position(l_position_id
5800                                    ,l_pos_structure_version_id
5801                                    ,l_business_group_id);
5802          FETCH c_get_parent_position INTO l_parent_pos_id;
5803 
5804          -- =============== START DEBUG LOG ================
5805             DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg7',
5806                               ' l_position_id --> ' || l_position_id ||
5807                               ' l_pos_structure_version_id --> ' || l_pos_structure_version_id ||
5808                               ' l_business_group_id --> ' || l_business_group_id);
5809          -- =============== END DEBUG LOG ==================
5810 
5811          IF c_get_parent_position%NOTFOUND THEN
5812             -- The current position does not have a parent in the HR hierarchy
5813             -- Set result to No Parent and exit
5814             result := 'COMPLETE:NO_PARENT';
5815             -- =============== START DEBUG LOG ================
5816                DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg8',
5817                                  ' c_get_parent_position%NOTFOUND --> TRUE -- result --> ' || result);
5821             -- The current position has a parent
5818             -- =============== END DEBUG LOG ==================
5819             return;
5820          ELSE
5822             -- Set the workflow attribute current_position_id to the parent position
5823             wf_engine.SetItemAttrNumber( itemtype => itemtype,
5824                                          itemkey  => itemkey,
5825                                          aname    => 'CURRENT_POSITION_ID',
5826                                          avalue   => l_parent_pos_id);
5827 
5828             -- =============== START DEBUG LOG ================
5829                DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg9',
5830                                  ' SetItemAttrNumber CURRENT_POSITION_ID --> ' || l_parent_pos_id);
5831             -- =============== END DEBUG LOG ==================
5832 
5833             -- Get the position name
5834             SELECT name
5835             INTO   l_parent_pos_name
5836             FROM   hr_all_positions_f
5837             WHERE  position_id = l_parent_pos_id;
5838 
5839             -- =============== START DEBUG LOG ================
5840                DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg10',
5841                                  ' l_parent_pos_name --> ' || l_parent_pos_name);
5842             -- =============== END DEBUG LOG ==================
5843 
5844             -- Set the workflow attribute current_position_name to the parent position
5845             wf_engine.SetItemAttrText  ( itemtype => itemtype,
5846                                          itemkey  => itemkey,
5847                                          aname    => 'CURRENT_POSITION_NAME',
5848                                          avalue   => l_parent_pos_name);
5849 
5850             -- =============== START DEBUG LOG ================
5851                DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg11',
5852                                  ' SetItemAttrText CURRENT_POSITION_NAME --> ' || l_parent_pos_name);
5853             -- =============== END DEBUG LOG ==================
5854 
5855             -- Set the result to Has a parent
5856             result := 'COMPLETE:HAS_PARENT';
5857 
5858             -- =============== START DEBUG LOG ================
5859                DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg12',
5860                                  ' result --> ' || result);
5861             -- =============== END DEBUG LOG ==================
5862 
5863             return;
5864 
5865          END IF;
5866 
5867       END IF;
5868 
5869       IF (funcmode <> 'RUN') THEN
5870          result := 'COMPLETE';
5871          -- =============== START DEBUG LOG ================
5872             DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg13',
5873                               ' funcmode <> RUN -- result --> ' || result);
5874          -- =============== END DEBUG LOG ==================
5875          return;
5876       END IF;
5877 
5878       -- =============== START DEBUG LOG ================
5879          DEBUG_LOG_STRING (l_proc_level, 'Get_parent_position.Msg14',
5880                            ' ** END GET_PARENT_POSITION ** ');
5881       -- =============== END DEBUG LOG ==================
5882 
5883    EXCEPTION
5884       WHEN OTHERS THEN
5885          wf_core.context('IGI_EXP_APPROVAL_PKG','get_parent_position',itemtype,itemkey,
5886                          to_char(actid),funcmode);
5887          -- =============== START DEBUG LOG ================
5888             DEBUG_LOG_UNEXP_ERROR ('Get_parent_position.Unexp1','DEFAULT');
5889          -- =============== END DEBUG LOG ==================
5890          raise;
5891 
5892    END get_parent_position;
5893 
5894 
5895 
5896    -- *************************************************************************
5897    --    GET_NEXT_INCOMPLETE_DU
5898    -- *************************************************************************
5899 
5900    PROCEDURE get_next_incomplete_du( itemtype IN  VARCHAR2,
5901                                      itemkey  IN  VARCHAR2,
5902                                      actid    IN  NUMBER,
5903                                      funcmode IN  VARCHAR2,
5904                                      result   OUT NOCOPY VARCHAR2) IS
5905 
5906       l_tu_id        igi_exp_dus.tu_id%TYPE;
5907       l_du_prep_name fnd_user.user_name%TYPE;
5908       l_du_id        igi_exp_dus.du_id%TYPE;
5909 
5910    BEGIN
5911 
5912       -- =============== START DEBUG LOG ================
5913          DEBUG_LOG_STRING (l_proc_level, 'Get_next_incomplete_du.Msg1',
5914                            ' ** START GET_NEXT_INCOMPLETE_DU ** ');
5915       -- =============== END DEBUG LOG ==================
5916 
5917       IF (funcmode = 'RUN') THEN
5918 
5919          -- Get the TU id
5920          l_tu_id
5921             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
5922                                             itemkey  => itemkey,
5923                                             aname    => 'TU_ID');
5924 
5925          -- =============== START DEBUG LOG ================
5926             DEBUG_LOG_STRING (l_proc_level, 'Get_next_incomplete_du.Msg1',
5927                               ' ** START GET_NEXT_INCOMPLETE_DU ** ');
5928          -- =============== END DEBUG LOG ==================
5929 
5930          -- Get the next DU which has been approved and needs completing
5931          SELECT du.du_id
5932                ,fnd.user_name
5933          INTO   l_du_id
5934                ,l_du_prep_name
5938          AND    du.du_status = 'ATR'
5935          FROM   igi_exp_dus du
5936                ,fnd_user fnd
5937          WHERE  du.tu_id = l_tu_id
5939          AND    du.du_by_user_id = fnd.user_id
5940          AND    rownum = 1;
5941 
5942          -- =============== START DEBUG LOG ================
5943             DEBUG_LOG_STRING (l_proc_level, 'Get_next_incomplete_du.Msg1',
5944                               ' ** START GET_NEXT_INCOMPLETE_DU ** ');
5945          -- =============== END DEBUG LOG ==================
5946 
5947          -- Set the du_id_for_completion attribute
5948          wf_engine.SetItemAttrNumber( itemtype => itemtype,
5949                                       itemkey  => itemkey,
5950                                       aname    => 'DU_ID_FOR_COMPLETION',
5951                                       avalue   => l_du_id);
5952 
5953          -- =============== START DEBUG LOG ================
5954             DEBUG_LOG_STRING (l_proc_level, 'Get_next_incomplete_du.Msg1',
5955                               ' ** START GET_NEXT_INCOMPLETE_DU ** ');
5956          -- =============== END DEBUG LOG ==================
5957 
5958          -- Set the du_prep_name_for_com attribute
5959          wf_engine.SetItemAttrText  ( itemtype => itemtype,
5960                                       itemkey  => itemkey,
5961                                       aname    => 'DU_PREP_NAME_FOR_COM',
5962                                       avalue   => l_du_prep_name);
5963 
5964          -- =============== START DEBUG LOG ================
5965             DEBUG_LOG_STRING (l_proc_level, 'Get_next_incomplete_du.Msg1',
5966                               ' ** START GET_NEXT_INCOMPLETE_DU ** ');
5967          -- =============== END DEBUG LOG ==================
5968 
5969       END IF;
5970 
5971       IF (funcmode <> 'RUN') THEN
5972          result := 'COMPLETE';
5973          -- =============== START DEBUG LOG ================
5974             DEBUG_LOG_STRING (l_proc_level, 'Get_next_incomplete_du.Msg1',
5975                               ' ** START GET_NEXT_INCOMPLETE_DU ** ');
5976          -- =============== END DEBUG LOG ==================
5977          return;
5978       END IF;
5979 
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 
5985    EXCEPTION
5986       WHEN OTHERS THEN
5987          wf_core.context('IGI_EXP_APPROVAL_PKG','get_next_incomplete_du',itemtype,itemkey,
5988                          to_char(actid),funcmode);
5989          -- =============== START DEBUG LOG ================
5990             DEBUG_LOG_UNEXP_ERROR ('Get_next_incomplete_du.Unexp1','DEFAULT');
5991          -- =============== END DEBUG LOG ==================
5992          raise;
5993    END get_next_incomplete_du;
5994 
5995    -- *************************************************************************
5996    --    PROCESS_TRANSACTIONS
5997    -- *************************************************************************
5998 
5999    PROCEDURE process_transactions ( itemtype IN  VARCHAR2,
6000                                     itemkey  IN  VARCHAR2,
6001                                     actid    IN  NUMBER,
6002                                     funcmode IN  VARCHAR2,
6003                                     result   OUT NOCOPY VARCHAR2) IS
6004 
6005       l_du_id                igi_exp_dus.du_id%TYPE;
6006       l_app_id               igi_exp_du_type_headers.application_id%TYPE;
6007       l_order_number         igi_exp_dus.du_order_number%TYPE;
6008       l_legal_number         igi_exp_dus.du_legal_number%TYPE;
6009       l_failed_du            VARCHAR2(510);
6010       l_failed_trx           VARCHAR2(50);
6011       l_gl_date              DATE := sysdate;
6012       l_error_message        VARCHAR2(4000);
6013       l_trx_failed_err_mess  VARCHAR2(4000);
6014       l_trx_id               NUMBER;
6015 
6016    BEGIN
6017 
6018       -- =============== START DEBUG LOG ================
6019          DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg1',
6020                            ' ** START PROCESS_TRANSACTIONS ** ');
6021       -- =============== END DEBUG LOG ==================
6022 
6023       IF (funcmode = 'RUN') THEN
6024 
6025          -- Get the DU id
6026          l_du_id
6027             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
6028                                             itemkey  => itemkey,
6029                                             aname    => 'DU_ID_FOR_COMPLETION');
6030 
6031          -- =============== START DEBUG LOG ================
6032             DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg2',
6033                               ' GetItemAttrNumber DU_ID_FOR_COMPLETION --> ' || l_du_id);
6034          -- =============== END DEBUG LOG ==================
6035 
6036          -- Get the application id for the du
6037          SELECT du_type.application_id
6038          INTO   l_app_id
6039          FROM   igi_exp_du_type_headers_all du_type
6040                ,igi_exp_dus du
6041          WHERE  du.du_id = l_du_id
6042          AND    du.du_type_header_id = du_type.du_type_header_id;
6043 
6044          -- =============== START DEBUG LOG ================
6045             DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg3',
6046                               ' l_app_id --> ' || l_app_id);
6047             DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg4',
6051          -- Call the utility to complete (or approve) transactions
6048                               ' Calling igi_exp_utils.complete_du ');
6049          -- =============== END DEBUG LOG ==================
6050 
6052          igi_exp_utils.complete_du(l_du_id          -- p_du_id
6053                                   ,l_app_id         -- p_app_id
6054                                   ,l_gl_date        -- p_gl_date
6055                                   ,l_error_message  -- p_error_message
6056                                   ,l_trx_id);       -- p_trx_id
6057 
6058          -- =============== START DEBUG LOG ================
6059             DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg5',
6060                               ' l_error_message --> ' || l_error_message);
6061          -- =============== END DEBUG LOG ==================
6062 
6063          IF (l_error_message <> 'Success') THEN
6064 
6065             SELECT du_order_number, du_legal_number
6066             INTO   l_order_number, l_legal_number
6067             FROM   igi_exp_dus
6068             WHERE  du_id = l_du_id;
6069 
6070             -- =============== START DEBUG LOG ================
6071                DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg6',
6072                                  ' l_order_number --> ' || l_order_number ||
6073                                  ' l_legal_number --> ' || l_legal_number);
6074             -- =============== END DEBUG LOG ==================
6075 
6076             l_failed_du := l_order_number;
6077 
6078             -- =============== START DEBUG LOG ================
6079                DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg7',
6080                                  ' l_failed_du --> ' || l_failed_du);
6081             -- =============== END DEBUG LOG ==================
6082 
6083             IF (l_legal_number is not null) THEN
6084                l_failed_du := l_failed_du||' ('||l_legal_number||')';
6085             END IF;
6086 
6087             -- =============== START DEBUG LOG ================
6088                DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg8',
6089                                  ' After if -- l_failed_du --> ' || l_failed_du);
6090             -- =============== END DEBUG LOG ==================
6091 
6092             IF (l_trx_id is not null) THEN
6093                -- If the process failed for a particular transaction then
6094                -- Find the transaction name of the failed transaction
6095                IF (l_app_id = 200) THEN
6096 
6097                   -- =============== START DEBUG LOG ================
6098                      DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg9',
6099                                        ' l_trx_id is not null AND l_app_id = 200 ');
6100                   -- =============== END DEBUG LOG ==================
6101 
6102                   SELECT invoice_num
6103                   INTO   l_failed_trx
6104                   FROM   ap_invoices
6105                   WHERE  invoice_id = l_trx_id;
6106 
6107                   -- =============== START DEBUG LOG ================
6108                      DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg10',
6109                                        ' l_failed_trx --> ' || l_failed_trx);
6110                   -- =============== END DEBUG LOG ==================
6111 
6112                ELSIF (l_app_id = 222) THEN
6113 
6114                   -- =============== START DEBUG LOG ================
6115                      DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg11',
6116                                        ' l_trx_id is not null AND l_app_id = 222 ');
6117                   -- =============== END DEBUG LOG ==================
6118 
6119                   SELECT trx_number
6120                   INTO   l_failed_trx
6121                   FROM   ra_customer_trx
6122                   WHERE  customer_trx_id = l_trx_id;
6123 
6124                   -- =============== START DEBUG LOG ================
6125                      DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg12',
6126                                        ' l_failed_trx --> ' || l_failed_trx);
6127                   -- =============== END DEBUG LOG ==================
6128 
6129                END IF;
6130             END IF;
6131 
6132 
6133             -- Set the failed_du attribute
6134             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6135                                          itemkey  => itemkey,
6136                                          aname    => 'FAILED_DU',
6137                                          avalue   => l_failed_du);
6138 
6139             -- =============== START DEBUG LOG ================
6140                DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg13',
6141                                  ' SetItemAttrText FAILED_DU --> ' || l_failed_du);
6142             -- =============== END DEBUG LOG ==================
6143 
6144             -- Set the failed_trx attribute
6145             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6146                                          itemkey  => itemkey,
6147                                          aname    => 'FAILED_TRX',
6148                                          avalue   => l_failed_trx);
6149 
6150             -- =============== START DEBUG LOG ================
6151                DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg14',
6152                                  ' SetItemAttrText FAILED_TRX --> ' || l_failed_trx);
6153             -- =============== END DEBUG LOG ==================
6154 
6158             -- and append this DU_ID and error message to it.
6155             -- Want the trx_failed_error_message to be a list of du_ids which
6156             -- failed along with the error message for each du
6157             -- Therefore, get the current item attribute trx_failed_error_message
6159 
6160             -- Get the current error message
6161             l_trx_failed_err_mess
6162                := wf_engine.GetItemAttrText  ( itemtype => itemtype,
6163                                                itemkey  => itemkey,
6164                                                aname    => 'TRX_FAILED_ERROR_MESSAGE');
6165 
6166             -- =============== START DEBUG LOG ================
6167                DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg15',
6168                                  ' GetItemAttrText TRX_FAILED_ERROR_MESSAGE --> ' || l_trx_failed_err_mess);
6169             -- =============== END DEBUG LOG ==================
6170 
6171 
6172             -- Append this DU and error message to it
6173             l_trx_failed_err_mess := l_trx_failed_err_mess||', '||to_char(l_du_id)||l_error_message;
6174 
6175             -- =============== START DEBUG LOG ================
6176                DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg16',
6177                                  ' l_trx_failed_err_mess --> ' || l_trx_failed_err_mess);
6178             -- =============== END DEBUG LOG ==================
6179 
6180             -- Set the trx_failed_error_message attribute
6181             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6182                                          itemkey  => itemkey,
6183                                          aname    => 'TRX_FAILED_ERROR_MESSAGE',
6184                                          avalue   => l_trx_failed_err_mess);
6185 
6186             -- =============== START DEBUG LOG ================
6187                DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg17',
6188                                  ' SetItemAttrText TRX_FAILED_ERROR_MESSAGE --> ' || l_trx_failed_err_mess);
6189             -- =============== END DEBUG LOG ==================
6190 
6191             -- Set the result to 'Failure'
6192             result := 'COMPLETE:FAILURE';
6193 
6194          ELSE
6195             result := 'COMPLETE:SUCCESS';
6196 
6197          END IF;
6198 
6199          -- =============== START DEBUG LOG ================
6200             DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg18',
6201                               ' result --> ' || result);
6202          -- =============== END DEBUG LOG ==================
6203 
6204       END IF;
6205 
6206       IF (funcmode <> 'RUN') THEN
6207          result := 'COMPLETE';
6208          -- =============== START DEBUG LOG ================
6209             DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg19',
6210                               ' funcmode <> RUN -- result --> ' || result);
6211          -- =============== END DEBUG LOG ==================
6212          return;
6213       END IF;
6214 
6215       -- =============== START DEBUG LOG ================
6216          DEBUG_LOG_STRING (l_proc_level, 'Process_transactions.Msg20',
6217                            ' ** END PROCESS_TRANSACTIONS ** ');
6218       -- =============== END DEBUG LOG ==================
6219 
6220    EXCEPTION
6221       WHEN OTHERS THEN
6222          wf_core.context('IGI_EXP_APPROVAL_PKG','process_transactions',itemtype,itemkey,
6223                          to_char(actid),funcmode);
6224          -- =============== START DEBUG LOG ================
6225             DEBUG_LOG_UNEXP_ERROR ('Process_transactions.Unexp1','DEFAULT');
6226          -- =============== END DEBUG LOG ==================
6227          raise;
6228 
6229    END process_transactions;
6230 
6231 
6232    -- *************************************************************************
6233    --    SET_DU_TO_COMPLETE
6234    -- *************************************************************************
6235 
6236    PROCEDURE set_du_to_complete   ( itemtype IN  VARCHAR2,
6237                                     itemkey  IN  VARCHAR2,
6238                                     actid    IN  NUMBER,
6239                                     funcmode IN  VARCHAR2,
6240                                     result   OUT NOCOPY VARCHAR2) IS
6241 
6242       l_du_id    igi_exp_dus.du_id%TYPE;
6243 
6244    BEGIN
6245 
6246       -- =============== START DEBUG LOG ================
6247          DEBUG_LOG_STRING (l_proc_level, 'Set_du_to_complete.Msg1',
6248                            ' ** START SET_DU_TO_COMPLETE ** ');
6249       -- =============== END DEBUG LOG ==================
6250 
6251       IF (funcmode = 'RUN') THEN
6252 
6253          -- Get the DU id
6254          l_du_id
6255             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
6256                                             itemkey  => itemkey,
6257                                             aname    => 'DU_ID_FOR_COMPLETION');
6258 
6259          -- =============== START DEBUG LOG ================
6260             DEBUG_LOG_STRING (l_proc_level, 'Set_du_to_complete.Msg1',
6261                               ' GetItemAttrNumber DU_ID_FOR_COMPLETION --> '|| l_du_id);
6262          -- =============== END DEBUG LOG ==================
6263 
6264          UPDATE igi_exp_dus
6265          SET    du_status = 'COM'
6266          WHERE  du_id = l_du_id;
6267 
6268          -- =============== START DEBUG LOG ================
6269             DEBUG_LOG_STRING (l_proc_level, 'Set_du_to_complete.Msg1',
6273       END IF;
6270                               ' UPDATE igi_exp_dus status - COM --> ' || SQL%ROWCOUNT);
6271          -- =============== END DEBUG LOG ==================
6272 
6274 
6275       IF (funcmode <> 'RUN') THEN
6276          result := 'COMPLETE';
6277          -- =============== START DEBUG LOG ================
6278             DEBUG_LOG_STRING (l_proc_level, 'Set_du_to_complete.Msg1',
6279                               ' funcmode <> RUN -- result --> ' || result);
6280          -- =============== END DEBUG LOG ==================
6281          return;
6282       END IF;
6283 
6284       -- =============== START DEBUG LOG ================
6285          DEBUG_LOG_STRING (l_proc_level, 'Set_du_to_complete.Msg1',
6286                            ' ** END SET_DU_TO_COMPLETE ** ');
6287       -- =============== END DEBUG LOG ==================
6288 
6289    EXCEPTION
6290       WHEN OTHERS THEN
6291          wf_core.context('IGI_EXP_APPROVAL_PKG','set_du_to_complete',itemtype,itemkey,
6292                          to_char(actid),funcmode);
6293          -- =============== START DEBUG LOG ================
6294             DEBUG_LOG_UNEXP_ERROR ('Set_du_to_complete.Unexp1','DEFAULT');
6295          -- =============== END DEBUG LOG ==================
6296          raise;
6297 
6298    END set_du_to_complete;
6299 
6300 
6301 
6302    -- *************************************************************************
6303    --    PUT_FAILED_DU_ON_HOLD
6304    -- *************************************************************************
6305 
6306    PROCEDURE put_failed_du_on_hold( itemtype IN  VARCHAR2,
6307                                     itemkey  IN  VARCHAR2,
6308                                     actid    IN  NUMBER,
6309                                     funcmode IN  VARCHAR2,
6310                                     result   OUT NOCOPY VARCHAR2) IS
6311 
6312       l_du_id    igi_exp_dus.du_id%TYPE;
6313 
6314    BEGIN
6315 
6316       -- =============== START DEBUG LOG ================
6317          DEBUG_LOG_STRING (l_proc_level, 'Put_failed_du_on_hold.Msg1',
6318                            ' ** START PUT_FAILED_DU_ON_HOLD ** ');
6319       -- =============== END DEBUG LOG ==================
6320 
6321       IF (funcmode = 'RUN') THEN
6322 
6323          -- Get the DU id
6324          l_du_id
6325             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
6326                                             itemkey  => itemkey,
6327                                             aname    => 'DU_ID_FOR_COMPLETION');
6328 
6329          -- =============== START DEBUG LOG ================
6330             DEBUG_LOG_STRING (l_proc_level, 'Put_failed_du_on_hold.Msg2',
6331                               ' GetItemAttrNumber DU_ID_FOR_COMPLETION --> ' || l_du_id);
6332          -- =============== END DEBUG LOG ==================
6333 
6334          UPDATE igi_exp_dus
6335          SET    du_status = 'HLD'
6336          WHERE  du_id = l_du_id;
6337 
6338          -- =============== START DEBUG LOG ================
6339             DEBUG_LOG_STRING (l_proc_level, 'Put_failed_du_on_hold.Msg3',
6340                               ' UPDATE igi_exp_dus du_status = HLD --> ' || SQL%ROWCOUNT);
6341          -- =============== END DEBUG LOG ==================
6342 
6343       END IF;
6344 
6345       IF (funcmode <> 'RUN') THEN
6346          result := 'COMPLETE';
6347          -- =============== START DEBUG LOG ================
6348             DEBUG_LOG_STRING (l_proc_level, 'Put_failed_du_on_hold.Msg4',
6349                               ' funcmode <> RUN -- result --> ' || result);
6350          -- =============== END DEBUG LOG ==================
6351          return;
6352       END IF;
6353 
6354       -- =============== START DEBUG LOG ================
6355          DEBUG_LOG_STRING (l_proc_level, 'Put_failed_du_on_hold.Msg5',
6356                            ' ** END PUT_FAILED_DU_ON_HOLD ** ');
6357       -- =============== END DEBUG LOG ==================
6358 
6359    EXCEPTION
6360       WHEN OTHERS THEN
6361          wf_core.context('IGI_EXP_APPROVAL_PKG','put_failed_du_on_hold',itemtype,itemkey,
6362                          to_char(actid),funcmode);
6363          -- =============== START DEBUG LOG ================
6364             DEBUG_LOG_UNEXP_ERROR ('Put_failed_du_on_hold.Unexp1','DEFAULT');
6365          -- =============== END DEBUG LOG ==================
6366          raise;
6367 
6368    END put_failed_du_on_hold;
6369 
6370 
6371    -- *************************************************************************
6372    --    CHECK_DUS_COMPLETED
6373    -- *************************************************************************
6374 
6375    PROCEDURE check_dus_completed  ( itemtype IN  VARCHAR2,
6376                                     itemkey  IN  VARCHAR2,
6377                                     actid    IN  NUMBER,
6378                                     funcmode IN  VARCHAR2,
6379                                     result   OUT NOCOPY VARCHAR2) IS
6380 
6381       l_tu_id        igi_exp_dus.tu_id%TYPE;
6382       l_incom_count  NUMBER;
6383 
6384    BEGIN
6385 
6386       -- =============== START DEBUG LOG ================
6387          DEBUG_LOG_STRING (l_proc_level, 'Check_dus_completed.Msg1',
6388                            ' ** START CHECK_DUS_COMPLETED ** ');
6389       -- =============== END DEBUG LOG ==================
6390 
6391       IF (funcmode = 'RUN') THEN
6392 
6393          -- Get the TU id
6394          l_tu_id
6398 
6395             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
6396                                             itemkey  => itemkey,
6397                                             aname    => 'TU_ID');
6399          -- =============== START DEBUG LOG ================
6400             DEBUG_LOG_STRING (l_proc_level, 'Check_dus_completed.Msg2',
6401                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
6402          -- =============== END DEBUG LOG ==================
6403 
6404          SELECT count(*)
6405          INTO   l_incom_count
6406          FROM   igi_exp_dus
6407          WHERE  tu_id = l_tu_id
6408          AND    du_status = 'ATR';
6409 
6410          -- =============== START DEBUG LOG ================
6411             DEBUG_LOG_STRING (l_proc_level, 'Check_dus_completed.Msg3',
6412                               ' l_incom_count --> ' || l_incom_count);
6413          -- =============== END DEBUG LOG ==================
6414 
6415 
6416          IF (l_incom_count = 0) THEN
6417             -- There are no more DUs left waiting completion
6418             -- Set the result to 'No'
6419             result := 'COMPLETE:N';
6420          ELSE
6421             -- There is at least one DU waiting completion
6422             -- Set the result to 'Yes'
6423             result := 'COMPLETE:Y';
6424          END IF;
6425 
6426          -- =============== START DEBUG LOG ================
6427             DEBUG_LOG_STRING (l_proc_level, 'Check_dus_completed.Msg4',
6428                               ' result --> ' || result);
6429          -- =============== END DEBUG LOG ==================
6430 
6431       END IF;
6432 
6433       IF (funcmode <> 'RUN') THEN
6434          result := 'COMPLETE';
6435          -- =============== START DEBUG LOG ================
6436             DEBUG_LOG_STRING (l_proc_level, 'Check_dus_completed.Msg5',
6437                               ' funcmode <> RUN -- result --> ' || result);
6438          -- =============== END DEBUG LOG ==================
6439          return;
6440       END IF;
6441 
6442       -- =============== START DEBUG LOG ================
6443          DEBUG_LOG_STRING (l_proc_level, 'Check_dus_completed.Msg6',
6444                            ' ** END CHECK_DUS_COMPLETED ** ');
6445       -- =============== END DEBUG LOG ==================
6446 
6447    EXCEPTION
6448       WHEN OTHERS THEN
6449          wf_core.context('IGI_EXP_APPROVAL_PKG','check_dus_completed',itemtype,itemkey,
6450                          to_char(actid),funcmode);
6451          -- =============== START DEBUG LOG ================
6452             DEBUG_LOG_UNEXP_ERROR ('Check_dus_completed.Unexp1','DEFAULT');
6453          -- =============== END DEBUG LOG ==================
6454          raise;
6455    END check_dus_completed;
6456 
6457 
6458 
6459    -- *************************************************************************
6460    --    ANY_DUS_WITH_TRX_FAIL
6461    -- *************************************************************************
6462 
6463    PROCEDURE any_dus_with_trx_fail( itemtype IN  VARCHAR2,
6464                                     itemkey  IN  VARCHAR2,
6465                                     actid    IN  NUMBER,
6466                                     funcmode IN  VARCHAR2,
6467                                     result   OUT NOCOPY VARCHAR2) IS
6468 
6469 
6470       l_tu_id           igi_exp_dus.tu_id%TYPE;
6471       l_failed_du_count NUMBER;
6472       l_du_hold_list    VARCHAR2(28000);
6473 
6474       CURSOR c_du_hold_info(p_tu_id igi_exp_dus.tu_id%TYPE)
6475       IS
6476          SELECT du_order_number
6477                ,du_legal_number
6478          FROM   igi_exp_dus
6479          WHERE  tu_id = p_tu_id
6480          AND    du_status = 'HLD';
6481 
6482    BEGIN
6483 
6484       -- =============== START DEBUG LOG ================
6485          DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg1',
6486                            ' ** START ANY_DUS_WITH_TRX_FAIL ** ');
6487       -- =============== END DEBUG LOG ==================
6488 
6489       IF (funcmode = 'RUN') THEN
6490 
6491          -- Get the TU id
6492          l_tu_id
6493             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
6494                                             itemkey  => itemkey,
6495                                             aname    => 'TU_ID');
6496 
6497          -- =============== START DEBUG LOG ================
6498             DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg2',
6499                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
6500          -- =============== END DEBUG LOG ==================
6501 
6502          SELECT count(*)
6503          INTO   l_failed_du_count
6504          FROM   igi_exp_dus
6505          WHERE  tu_id = l_tu_id
6506          AND    du_status = 'HLD';
6507 
6508          -- =============== START DEBUG LOG ================
6509             DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg3',
6510                               ' l_failed_du_count --> ' || l_failed_du_count);
6511          -- =============== END DEBUG LOG ==================
6512 
6513          IF (l_failed_du_count = 0) THEN
6514             -- No DUs were put on hold due to transaction failure
6515             -- Set the result to 'No'
6516             result := 'COMPLETE:N';
6517 
6518             -- =============== START DEBUG LOG ================
6522 
6519                DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg4',
6520                                  ' result --> ' || result);
6521             -- =============== END DEBUG LOG ==================
6523          ELSE
6524 
6525             FOR I IN c_du_hold_info(l_tu_id)
6526             LOOP
6527 
6528                IF (l_du_hold_list is NULL) THEN
6529                   l_du_hold_list := I.du_order_number;
6530                ELSE
6531                   l_du_hold_list := l_du_hold_list ||I.du_order_number;
6532                END IF;
6533 
6534                -- =============== START DEBUG LOG ================
6535                   DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg5',
6536                                     ' du_order_number --> ' || I.du_order_number);
6537                -- =============== END DEBUG LOG ==================
6538 
6539                IF (I.du_legal_number is not null) THEN
6540                   l_du_hold_list := l_du_hold_list||' ('||I.du_legal_number||')';
6541                END IF;
6542 
6543                -- =============== START DEBUG LOG ================
6544                   DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg6',
6545                                     ' I.du_legal_number --> ' || I.du_legal_number);
6546                -- =============== END DEBUG LOG ==================
6547 
6548                l_du_hold_list := l_du_hold_list||fnd_global.local_chr(10);
6549 
6550                IF LENGTH(l_du_hold_list) > 28000 THEN
6551                   exit;
6552                END IF;
6553 
6554             END LOOP;
6555 
6556            -- Set the all_dus_list attribute
6557             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6558                                          itemkey  => itemkey,
6559                                          aname    => 'ADD_ATTR1',
6560                                          avalue   => substr(l_du_hold_list, 1, 4000));
6561 
6562             -- =============== START DEBUG LOG ================
6563                DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg7',
6564                                  ' SetItemAttrText ADD_ATTR1 --> ' || substr(l_du_hold_list, 1, 4000));
6565             -- =============== END DEBUG LOG ==================
6566 
6567             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6568                                          itemkey  => itemkey,
6569                                          aname    => 'ADD_ATTR2',
6570                                          avalue   => substr(l_du_hold_list, 4001, 4000));
6571 
6572             -- =============== START DEBUG LOG ================
6573                DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg8',
6574                                  ' SetItemAttrText ADD_ATTR2 --> ' || substr(l_du_hold_list, 4001, 4000));
6575             -- =============== END DEBUG LOG ==================
6576 
6577             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6578                                          itemkey  => itemkey,
6579                                          aname    => 'ADD_ATTR3',
6580                                          avalue   => substr(l_du_hold_list, 8001, 4000));
6581 
6582             -- =============== START DEBUG LOG ================
6583                DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg9',
6584                                  ' SetItemAttrText ADD_ATTR3 --> ' || substr(l_du_hold_list, 8001, 4000));
6585             -- =============== END DEBUG LOG ==================
6586 
6587             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6588                                          itemkey  => itemkey,
6589                                          aname    => 'ADD_ATTR4',
6590                                          avalue   => substr(l_du_hold_list, 12001, 4000));
6591 
6592             -- =============== START DEBUG LOG ================
6593                DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg10',
6594                                  ' SetItemAttrText ADD_ATTR4 --> ' || substr(l_du_hold_list, 12001, 4000));
6595             -- =============== END DEBUG LOG ==================
6596 
6597             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6598                                          itemkey  => itemkey,
6599                                          aname    => 'ADD_ATTR5',
6600                                          avalue   => substr(l_du_hold_list, 16001, 4000));
6601 
6602             -- =============== START DEBUG LOG ================
6603                DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg11',
6604                                  ' SetItemAttrText ADD_ATTR5 --> ' || substr(l_du_hold_list, 16001, 4000));
6605             -- =============== END DEBUG LOG ==================
6606 
6607             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6608                                          itemkey  => itemkey,
6609                                          aname    => 'ADD_ATTR6',
6610                                          avalue   => substr(l_du_hold_list, 20001, 4000));
6611 
6612             -- =============== START DEBUG LOG ================
6613                DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg12',
6614                                  ' SetItemAttrText ADD_ATTR6 --> ' || substr(l_du_hold_list, 20001, 4000));
6615             -- =============== END DEBUG LOG ==================
6616 
6617             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6618                                          itemkey  => itemkey,
6619                                          aname    => 'ADD_ATTR7',
6623                DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg13',
6620                                          avalue   => substr(l_du_hold_list, 24001, 4000));
6621 
6622             -- =============== START DEBUG LOG ================
6624                                  ' SetItemAttrText ADD_ATTR7 --> ' || substr(l_du_hold_list, 24001, 4000));
6625             -- =============== END DEBUG LOG ==================
6626 
6627             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6628                                          itemkey  => itemkey,
6629                                          aname    => 'ALL_DUS_LIST',
6630                                          avalue   => 'plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
6631 
6632 
6633             -- =============== START DEBUG LOG ================
6634                DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg14',
6635                                  ' SetItemAttrText ALL_DUS_LIST --> ' ||
6636                                  ' plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
6637             -- =============== END DEBUG LOG ==================
6638 
6639             -- Set the result to 'Yes'
6640             result := 'COMPLETE:Y';
6641 
6642             -- =============== START DEBUG LOG ================
6643                DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg15',
6644                                  ' result --> ' || result);
6645             -- =============== END DEBUG LOG ==================
6646 
6647          END IF;
6648 
6649       END IF;
6650 
6651       IF (funcmode <> 'RUN') THEN
6652          result := 'COMPLETE';
6653          -- =============== START DEBUG LOG ================
6654             DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg16',
6655                               ' funcmode <> RUN -- result --> ' || result);
6656          -- =============== END DEBUG LOG ==================
6657          return;
6658       END IF;
6659 
6660       -- =============== START DEBUG LOG ================
6661          DEBUG_LOG_STRING (l_proc_level, 'Any_dus_with_trx_fail.Msg17',
6662                            ' ** END ANY_DUS_WITH_TRX_FAIL ** ');
6663       -- =============== END DEBUG LOG ==================
6664 
6665    EXCEPTION
6666       WHEN OTHERS THEN
6667          wf_core.context('IGI_EXP_APPROVAL_PKG','any_dus_with_trx_fail',itemtype,itemkey,
6668                          to_char(actid),funcmode);
6669          -- =============== START DEBUG LOG ================
6670             DEBUG_LOG_UNEXP_ERROR ('Any_dus_with_trx_fail.Unexp1','DEFAULT');
6671          -- =============== END DEBUG LOG ==================
6672          raise;
6673 
6674    END any_dus_with_trx_fail;
6675 
6676 
6677 
6678    -- *************************************************************************
6679    --    REMOVE_ALL_ON_HOLD_DUS
6680    -- *************************************************************************
6681 
6682    PROCEDURE remove_all_on_hold_dus( itemtype IN  VARCHAR2,
6683                                     itemkey  IN  VARCHAR2,
6684                                     actid    IN  NUMBER,
6685                                     funcmode IN  VARCHAR2,
6686                                     result   OUT NOCOPY VARCHAR2) IS
6687 
6688       l_tu_id      igi_exp_dus.tu_id%TYPE;
6689       l_du_amount  igi_exp_dus.du_amount%TYPE;
6690 
6691    BEGIN
6692 
6693       -- =============== START DEBUG LOG ================
6694          DEBUG_LOG_STRING (l_proc_level, 'Remove_all_on_hold_dus.Msg1',
6695                            ' ** START REMOVE_ALL_ON_HOLD_DUS ** ');
6696       -- =============== END DEBUG LOG ==================
6697 
6698       IF (funcmode = 'RUN') THEN
6699 
6700          -- Get the TU id
6701          l_tu_id
6702             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
6703                                             itemkey  => itemkey,
6704                                             aname    => 'TU_ID');
6705 
6706          -- =============== START DEBUG LOG ================
6707             DEBUG_LOG_STRING (l_proc_level, 'Remove_all_on_hold_dus.Msg2',
6708                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
6709          -- =============== END DEBUG LOG ==================
6710 
6711          -- OPSF(I) EXP Bug 2415293  S Brewer 18-JUL-2002 Start(3)
6712          -- Before removing the DUs which were put on hold, we need
6713          -- to update the TU amount to reflect the DUs were removed
6714          -- So, find the total DU amount for the DUs to be removed
6715          -- and update the TU amount
6716          -- i.e. New TU amount = TU amount - DU amount
6717 
6718          -- Find the total DU amount
6719          SELECT sum(du_amount)
6720          INTO   l_du_amount
6721          FROM   igi_exp_dus
6722          WHERE  tu_id = l_tu_id
6723          AND    du_status = 'HLD';
6724 
6725          -- =============== START DEBUG LOG ================
6726             DEBUG_LOG_STRING (l_proc_level, 'Remove_all_on_hold_dus.Msg3',
6727                               ' l_du_amount --> ' || l_du_amount);
6728          -- =============== END DEBUG LOG ==================
6729 
6730          -- Now update the TU amount
6731          UPDATE igi_exp_tus
6732          SET    tu_amount = tu_amount - l_du_amount
6733          WHERE  tu_id = l_tu_id;
6734 
6735          -- =============== START DEBUG LOG ================
6736             DEBUG_LOG_STRING (l_proc_level, 'Remove_all_on_hold_dus.Msg4',
6740 
6737                               ' UPDATE igi_exp_tus -> ' || SQL%ROWCOUNT);
6738          -- =============== END DEBUG LOG ==================
6739 
6741          -- OPSF(I) EXP Bug 2415293  S Brewer 18-JUL-2002 End(3)
6742 
6743          -- Remove the DUs which were put on hold (due to transaction
6744          -- completion failure)  from the TU
6745          UPDATE igi_exp_dus
6746          SET    tu_id = null
6747          WHERE  tu_id = l_tu_id
6748          AND    du_status = 'HLD';
6749 
6750          -- =============== START DEBUG LOG ================
6751             DEBUG_LOG_STRING (l_proc_level, 'Remove_all_on_hold_dus.Msg5',
6752                               ' UPDATE igi_exp_dus status = HLD --> ' || SQL%ROWCOUNT);
6753          -- =============== END DEBUG LOG ==================
6754 
6755       END IF;
6756 
6757       IF (funcmode <> 'RUN') THEN
6758          result := 'COMPLETE';
6759          -- =============== START DEBUG LOG ================
6760             DEBUG_LOG_STRING (l_proc_level, 'Remove_all_on_hold_dus.Msg6',
6761                               ' funcmode <> RUN -- result --> ' || result);
6762          -- =============== END DEBUG LOG ==================
6763          return;
6764       END IF;
6765 
6766       -- =============== START DEBUG LOG ================
6767          DEBUG_LOG_STRING (l_proc_level, 'Remove_all_on_hold_dus.Msg7',
6768                            ' ** END REMOVE_ALL_ON_HOLD_DUS ** ');
6769       -- =============== END DEBUG LOG ==================
6770 
6771    EXCEPTION
6772       WHEN OTHERS THEN
6773          wf_core.context('IGI_EXP_APPROVAL_PKG','remove_all_on_hold_dus',itemtype,itemkey,
6774                          to_char(actid),funcmode);
6775          -- =============== START DEBUG LOG ================
6776             DEBUG_LOG_UNEXP_ERROR ('Remove_all_on_hold_dus.Unexp1','DEFAULT');
6777          -- =============== END DEBUG LOG ==================
6778          raise;
6779 
6780    END remove_all_on_hold_dus;
6781 
6782 
6783 
6784    -- *************************************************************************
6785    --    CHECK_FOR_COMPLETE_DUS
6786    -- *************************************************************************
6787 
6788    PROCEDURE check_for_complete_dus( itemtype IN  VARCHAR2,
6789                                     itemkey  IN  VARCHAR2,
6790                                     actid    IN  NUMBER,
6791                                     funcmode IN  VARCHAR2,
6792                                     result   OUT NOCOPY VARCHAR2) IS
6793 
6794       l_tu_id          igi_exp_dus.tu_id%TYPE;
6795       l_com_du_count   NUMBER;
6796 
6797    BEGIN
6798 
6799       -- =============== START DEBUG LOG ================
6800          DEBUG_LOG_STRING (l_proc_level, 'Check_for_complete_dus.Msg1',
6801                            ' ** START CHECK_FOR_COMPLETE_DUS ** ');
6802       -- =============== END DEBUG LOG ==================
6803 
6804       IF (funcmode = 'RUN') THEN
6805 
6806          -- Get the TU id
6807          l_tu_id
6808             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
6809                                             itemkey  => itemkey,
6810                                             aname    => 'TU_ID');
6811 
6812          -- =============== START DEBUG LOG ================
6813             DEBUG_LOG_STRING (l_proc_level, 'Check_for_complete_dus.Msg2',
6814                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
6815          -- =============== END DEBUG LOG ==================
6816 
6817          SELECT count(*)
6818          INTO   l_com_du_count
6819          FROM   igi_exp_dus
6820          WHERE  tu_id = l_tu_id
6821          AND    du_status = 'COM';
6822 
6823          -- =============== START DEBUG LOG ================
6824             DEBUG_LOG_STRING (l_proc_level, 'Check_for_complete_dus.Msg3',
6825                               ' l_com_du_count --> ' || l_com_du_count);
6826          -- =============== END DEBUG LOG ==================
6827 
6828          IF (l_com_du_count = 0) THEN
6829             -- There are no completed DUs in this TU
6830             -- Set result to 'No'
6831             result := 'COMPLETE:N';
6832          ELSE
6833             -- There is at least one completed DU in this TU
6834             -- Set result to 'Yes'
6835             result := 'COMPLETE:Y';
6836          END IF;
6837 
6838          -- =============== START DEBUG LOG ================
6839             DEBUG_LOG_STRING (l_proc_level, 'Check_for_complete_dus.Msg4',
6840                               ' result --> ' || result);
6841          -- =============== END DEBUG LOG ==================
6842       END IF;
6843 
6844       IF (funcmode <> 'RUN') THEN
6845          result := 'COMPLETE';
6846          -- =============== START DEBUG LOG ================
6847             DEBUG_LOG_STRING (l_proc_level, 'Check_for_complete_dus.Msg5',
6848                               'funcmode <> RUN -- result --> ' || result);
6849          -- =============== END DEBUG LOG ==================
6850          return;
6851       END IF;
6852 
6853       -- =============== START DEBUG LOG ================
6854          DEBUG_LOG_STRING (l_proc_level, 'Check_for_complete_dus.Msg6',
6855                            ' ** END CHECK_FOR_COMPLETE_DUS ** ');
6856       -- =============== END DEBUG LOG ==================
6857 
6858    EXCEPTION
6859       WHEN OTHERS THEN
6863             DEBUG_LOG_UNEXP_ERROR ('Check_for_complete_dus.Unexp1','DEFAULT');
6860          wf_core.context('IGI_EXP_APPROVAL_PKG','check_for_complete_dus',itemtype,itemkey,
6861                          to_char(actid),funcmode);
6862          -- =============== START DEBUG LOG ================
6864          -- =============== END DEBUG LOG ==================
6865          raise;
6866    END check_for_complete_dus;
6867 
6868 
6869 
6870    -- *************************************************************************
6871    --    BUILD_PREP_LIST_OF_COM_DUS
6872    -- *************************************************************************
6873 
6874    PROCEDURE build_prep_list_of_com_dus( itemtype IN  VARCHAR2,
6875                                          itemkey  IN  VARCHAR2,
6876                                          actid    IN  NUMBER,
6877                                          funcmode IN  VARCHAR2,
6878                                          result   OUT NOCOPY VARCHAR2) IS
6879 
6880       CURSOR c_prep_list(p_tu_id igi_exp_dus.tu_id%TYPE)
6881       IS
6882          SELECT distinct du_by_user_id
6883          FROM   igi_exp_dus
6884          WHERE  tu_id = p_tu_id
6885          AND    du_status = 'COM';
6886 
6887       l_tu_id     igi_exp_dus.tu_id%TYPE;
6888       l_user_id   igi_exp_dus.du_by_user_id%TYPE;
6889       l_user_list VARCHAR2(1000);
6890 
6891 
6892    BEGIN
6893 
6894       -- =============== START DEBUG LOG ================
6895          DEBUG_LOG_STRING (l_proc_level, 'Build_prep_list_of_com_dus.Msg1',
6896                            ' ** START BUILD_PREP_LIST_OF_COM_DUS ** ');
6897       -- =============== END DEBUG LOG ==================
6898 
6899       IF (funcmode = 'RUN') THEN
6900 
6901          -- Get the TU id
6902          l_tu_id
6903             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
6904                                             itemkey  => itemkey,
6905                                             aname    => 'TU_ID');
6906 
6907          -- =============== START DEBUG LOG ================
6908             DEBUG_LOG_STRING (l_proc_level, 'Build_prep_list_of_com_dus.Msg2',
6909                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
6910          -- =============== END DEBUG LOG ==================
6911 
6912          OPEN c_prep_list(l_tu_id);
6913          LOOP
6914             FETCH c_prep_list INTO l_user_id;
6915             EXIT WHEN c_prep_list%NOTFOUND;
6916             l_user_list := l_user_list||','||l_user_id;
6917             -- =============== START DEBUG LOG ================
6918                DEBUG_LOG_STRING (l_proc_level, 'Build_prep_list_of_com_dus.Msg3',
6919                                  ' l_user_list --> ' || l_user_list);
6920             -- =============== END DEBUG LOG ==================
6921          END LOOP;
6922          CLOSE c_prep_list;
6923 
6924             -- Set the all_dus_list attribute
6925             wf_engine.SetItemAttrText  ( itemtype => itemtype,
6926                                          itemkey  => itemkey,
6927                                          aname    => 'COM_DU_PREP_LIST',
6928                                          avalue   => l_user_list);
6929 
6930       -- =============== START DEBUG LOG ================
6931          DEBUG_LOG_STRING (l_proc_level, 'Build_prep_list_of_com_dus.Msg4',
6932                            ' SetItemAttrText COM_DU_PREP_LIST --> ' || l_user_list);
6933       -- =============== END DEBUG LOG ==================
6934 
6935       END IF;
6936 
6937       IF (funcmode <> 'RUN') THEN
6938          result := 'COMPLETE';
6939          -- =============== START DEBUG LOG ================
6940             DEBUG_LOG_STRING (l_proc_level, 'Build_prep_list_of_com_dus.Msg5',
6941                               ' funcmode <> RUN -- result --> ' || result);
6942          -- =============== END DEBUG LOG ==================
6943          return;
6944       END IF;
6945 
6946       -- =============== START DEBUG LOG ================
6947          DEBUG_LOG_STRING (l_proc_level, 'Build_prep_list_of_com_dus.Msg6',
6948                            ' ** END BUILD_PREP_LIST_OF_COM_DUS ** ');
6949       -- =============== END DEBUG LOG ==================
6950 
6951    EXCEPTION
6952       WHEN OTHERS THEN
6953          wf_core.context('IGI_EXP_APPROVAL_PKG','build_prep_list_of_com_dus',itemtype,itemkey,
6954                          to_char(actid),funcmode);
6955          -- =============== START DEBUG LOG ================
6956             DEBUG_LOG_UNEXP_ERROR ('Build_prep_list_of_com_dus.Unexp1','DEFAULT');
6957          -- =============== END DEBUG LOG ==================
6958          raise;
6959 
6960    END build_prep_list_of_com_dus;
6961 
6962    -- *************************************************************************
6963    --    GET_NEXT_PREP
6964    -- *************************************************************************
6965 
6966    PROCEDURE get_next_prep        ( itemtype IN  VARCHAR2,
6967                                     itemkey  IN  VARCHAR2,
6968                                     actid    IN  NUMBER,
6969                                     funcmode IN  VARCHAR2,
6970                                     result   OUT NOCOPY VARCHAR2) IS
6971 
6972       l_num             NUMBER;
6973       l_prep_list       VARCHAR2(1000);
6974       l_next_prep       NUMBER;
6975       l_next_prep_name  fnd_user.user_name%TYPE;
6976       l_tu_id           igi_exp_dus.tu_id%TYPE;
6977 
6978       l_com_du_list     VARCHAR2(28000);
6979 
6983          SELECT du_order_number
6980       CURSOR c_com_dus(p_tu_id igi_exp_dus.tu_id%TYPE
6981                       ,p_du_by_user_id igi_exp_dus.du_by_user_id%TYPE)
6982       IS
6984                ,du_legal_number
6985          FROM   igi_exp_dus
6986          WHERE  tu_id = p_tu_id
6987          AND    du_status = 'COM'
6988          AND    du_by_user_id = p_du_by_user_id;
6989 
6990 
6991    BEGIN
6992 
6993      -- =============== START DEBUG LOG ================
6994         DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg1',
6995                           ' ** START GET_NEXT_PREP ** ');
6996      -- =============== END DEBUG LOG ==================
6997 
6998      IF (funcmode = 'RUN') THEN
6999 
7000          -- Get the list of preparers of completed DUS
7001          l_prep_list
7002             := wf_engine.GetItemAttrText  ( itemtype => itemtype,
7003                                             itemkey  => itemkey,
7004                                             aname    => 'COM_DU_PREP_LIST');
7005 
7006          -- =============== START DEBUG LOG ================
7007             DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg2',
7008                               ' GetItemAttrText COM_DU_PREP_LIST --> ' || l_prep_list);
7009          -- =============== END DEBUG LOG ==================
7010 
7011          IF (l_prep_list is null) THEN
7012             -- There are no more preparers in the list
7013             -- Set result to 'No More Preparers In List'
7014             result := 'COMPLETE:NO_PREPS_IN_LIST';
7015             -- =============== START DEBUG LOG ================
7016                DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg3',
7017                                  ' l_prep_list is null -- result --> ' || result);
7018             -- =============== END DEBUG LOG ==================
7019             return;
7020          END IF;
7021 
7022          l_num := INSTR(l_prep_list,',',-1);
7023 
7024          -- =============== START DEBUG LOG ================
7025             DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg4',
7026                               ' l_num --> ' || l_num);
7027          -- =============== END DEBUG LOG ==================
7028 
7029          IF (l_num = 0) THEN
7030             -- There is only one preparer left in list
7031             l_next_prep := l_prep_list;
7032          ELSE
7033             -- There is more than one preparer in list
7034             l_next_prep := SUBSTR(l_prep_list,l_num + 1);
7035          END IF;
7036 
7037          -- =============== START DEBUG LOG ================
7038             DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg5',
7039                               ' l_next_prep --> ' || l_next_prep);
7040          -- =============== END DEBUG LOG ==================
7041 
7042          -- Set the temp_du_preparer_id attribute
7043          wf_engine.SetItemAttrNumber( itemtype => itemtype,
7044                                       itemkey  => itemkey,
7045                                       aname    => 'TEMP_DU_PREPARER_ID',
7046                                       avalue   => l_next_prep);
7047 
7048          -- =============== START DEBUG LOG ================
7049             DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg6',
7050                               ' SetItemAttrNumber TEMP_DU_PREPARER_ID --> '||l_next_prep);
7051          -- =============== END DEBUG LOG ==================
7052 
7053          SELECT user_name
7054          INTO   l_next_prep_name
7055          FROM   fnd_user
7056          WHERE  user_id = l_next_prep;
7057 
7058          -- =============== START DEBUG LOG ================
7059             DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg7',
7060                               ' l_next_prep_name --> ' || l_next_prep_name);
7061          -- =============== END DEBUG LOG ==================
7062 
7063          -- Set the temp_du_preparer attribute
7064          wf_engine.SetItemAttrText  ( itemtype => itemtype,
7065                                       itemkey  => itemkey,
7066                                       aname    => 'TEMP_DU_PREPARER_NAME',
7067                                       avalue   => l_next_prep_name);
7068 
7069          -- =============== START DEBUG LOG ================
7070             DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg8',
7071                               ' SetItemAttrText TEMP_DU_PREPARER_NAME --> ' || l_next_prep_name);
7072          -- =============== END DEBUG LOG ==================
7073 
7074          -- Get the TU id
7075          l_tu_id
7076             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
7077                                             itemkey  => itemkey,
7078                                             aname    => 'TU_ID');
7079 
7080 
7081             FOR I IN c_com_dus(l_tu_id, l_next_prep)
7082             LOOP
7083 
7084                IF (l_com_du_list is NULL) THEN
7085                   l_com_du_list := I.du_order_number;
7086                ELSE
7087                   l_com_du_list := l_com_du_list ||I.du_order_number;
7088                END IF;
7089 
7090                -- =============== START DEBUG LOG ================
7091                   DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg9',
7092                                     ' du_order_number --> ' || I.du_order_number);
7093                -- =============== END DEBUG LOG ==================
7094 
7095                IF (I.du_legal_number is not null) THEN
7099                -- =============== START DEBUG LOG ================
7096                   l_com_du_list := l_com_du_list||' ('||I.du_legal_number||')';
7097                END IF;
7098 
7100                   DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg10',
7101                                     ' I.du_legal_number --> ' || I.du_legal_number);
7102                -- =============== END DEBUG LOG ==================
7103 
7104                l_com_du_list := l_com_du_list||fnd_global.local_chr(10);
7105 
7106                IF LENGTH(l_com_du_list) > 28000 THEN
7107                   exit;
7108                END IF;
7109 
7110             END LOOP;
7111 
7112 
7113            -- Set the all_dus_list attribute
7114             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7115                                          itemkey  => itemkey,
7116                                          aname    => 'ADD_ATTR1',
7117                                          avalue   => substr(l_com_du_list, 1, 4000));
7118 
7119             -- =============== START DEBUG LOG ================
7120                DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg11',
7121                                  ' SetItemAttrText ADD_ATTR1 --> ' || substr(l_com_du_list, 1, 4000));
7122             -- =============== END DEBUG LOG ==================
7123 
7124             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7125                                          itemkey  => itemkey,
7126                                          aname    => 'ADD_ATTR2',
7127                                          avalue   => substr(l_com_du_list, 4001, 4000));
7128 
7129             -- =============== START DEBUG LOG ================
7130                DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg12',
7131                                  ' SetItemAttrText ADD_ATTR2 --> ' || substr(l_com_du_list, 4001, 4000));
7132             -- =============== END DEBUG LOG ==================
7133 
7134             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7135                                          itemkey  => itemkey,
7136                                          aname    => 'ADD_ATTR3',
7137                                          avalue   => substr(l_com_du_list, 8001, 4000));
7138 
7139             -- =============== START DEBUG LOG ================
7140                DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg13',
7141                                  ' SetItemAttrText ADD_ATTR3 --> ' || substr(l_com_du_list, 8001, 4000));
7142             -- =============== END DEBUG LOG ==================
7143 
7144             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7145                                          itemkey  => itemkey,
7146                                          aname    => 'ADD_ATTR4',
7147                                          avalue   => substr(l_com_du_list, 12001, 4000));
7148 
7149             -- =============== START DEBUG LOG ================
7150                DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg14',
7151                                  ' SetItemAttrText ADD_ATTR4 --> ' || substr(l_com_du_list, 12001, 4000));
7152             -- =============== END DEBUG LOG ==================
7153 
7154             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7155                                          itemkey  => itemkey,
7156                                          aname    => 'ADD_ATTR5',
7157                                          avalue   => substr(l_com_du_list, 16001, 4000));
7158 
7159             -- =============== START DEBUG LOG ================
7160                DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg15',
7161                                  ' SetItemAttrText ADD_ATTR5 --> ' || substr(l_com_du_list, 16001, 4000));
7162             -- =============== END DEBUG LOG ==================
7163 
7164             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7165                                          itemkey  => itemkey,
7166                                          aname    => 'ADD_ATTR6',
7167                                          avalue   => substr(l_com_du_list, 20001, 4000));
7168 
7169             -- =============== START DEBUG LOG ================
7170                DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg16',
7171                                  ' SetItemAttrText ADD_ATTR6 --> ' || substr(l_com_du_list, 20001, 4000));
7172             -- =============== END DEBUG LOG ==================
7173 
7174             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7175                                          itemkey  => itemkey,
7176                                          aname    => 'ADD_ATTR7',
7177                                          avalue   => substr(l_com_du_list, 24001, 4000));
7178 
7179 
7180             -- =============== START DEBUG LOG ================
7181                DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg17',
7182                                  ' SetItemAttrText ADD_ATTR7 --> ' || substr(l_com_du_list, 24001, 4000));
7183             -- =============== END DEBUG LOG ==================
7184 
7185             wf_engine.SetItemAttrText(itemtype => itemtype,
7186                                       itemkey  => itemkey,
7187                                       aname    => 'TEMP_DU_BY_PREP_LIST',
7188                                       avalue   => 'plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
7189 
7190             -- =============== START DEBUG LOG ================
7191                DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg18',
7192                                  ' SetItemAttrText TEMP_DU_BY_PREP_LIST --> ' ||
7196          -- Set the result to 'Next Preparer Fetched'
7193                                  ' plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
7194             -- =============== END DEBUG LOG ==================
7195 
7197          result := 'COMPLETE:NEXT_PREP_FETCHED';
7198 
7199          -- =============== START DEBUG LOG ================
7200             DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg19',
7201                               ' result --> ' || result);
7202          -- =============== END DEBUG LOG ==================
7203 
7204       END IF;
7205 
7206       IF (funcmode <> 'RUN') THEN
7207          result := 'COMPLETE';
7208          -- =============== START DEBUG LOG ================
7209             DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg20',
7210                               ' funcmode <> RUN -- result --> ' || result);
7211          -- =============== END DEBUG LOG ==================
7212          return;
7213       END IF;
7214 
7215       -- =============== START DEBUG LOG ================
7216          DEBUG_LOG_STRING (l_proc_level, 'Get_next_prep.Msg21',
7217                            ' ** END GET_NEXT_PREP ** ');
7218       -- =============== END DEBUG LOG ==================
7219 
7220    EXCEPTION
7221       WHEN OTHERS THEN
7222          wf_core.context('IGI_EXP_APPROVAL_PKG','get_next_prep',itemtype,itemkey,
7223                          to_char(actid),funcmode);
7224          -- =============== START DEBUG LOG ================
7225             DEBUG_LOG_UNEXP_ERROR ('Get_next_prep.Unexp1','DEFAULT');
7226          -- =============== END DEBUG LOG ==================
7227          raise;
7228 
7229    END get_next_prep;
7230 
7231 
7232 
7233    -- *************************************************************************
7234    --    REMOVE_PREP_FROM_LIST
7235    -- *************************************************************************
7236 
7237    PROCEDURE remove_prep_from_list( itemtype IN  VARCHAR2,
7238                                     itemkey  IN  VARCHAR2,
7239                                     actid    IN  NUMBER,
7240                                     funcmode IN  VARCHAR2,
7241                                     result   OUT NOCOPY VARCHAR2) IS
7242 
7243       l_num           NUMBER;
7244       l_prep_list     VARCHAR2(1000);
7245       l_new_prep_list VARCHAR2(1000);
7246 
7247    BEGIN
7248 
7249       -- =============== START DEBUG LOG ================
7250          DEBUG_LOG_STRING (l_proc_level, 'Remove_prep_from_list.Msg1',
7251                            ' ** START REMOVE_PREP_FROM_LIST ** ');
7252       -- =============== END DEBUG LOG ==================
7253 
7254       IF (funcmode = 'RUN') THEN
7255 
7256          -- Get the list of preparers of completed dus
7257          l_prep_list
7258             := wf_engine.GetItemAttrText  ( itemtype => itemtype,
7259                                             itemkey  => itemkey,
7260                                             aname    => 'COM_DU_PREP_LIST');
7261 
7262          -- =============== START DEBUG LOG ================
7263             DEBUG_LOG_STRING (l_proc_level, 'Remove_prep_from_list.Msg2',
7264                               ' GetItemAttrText COM_DU_PREP_LIST --> ' || l_prep_list);
7265          -- =============== END DEBUG LOG ==================
7266 
7267          -- This will remove the last preparer id from the list
7268          l_num := INSTR(l_prep_list,',',-1);
7269          l_new_prep_list := SUBSTR(l_prep_list,1,l_num-1);
7270 
7271          -- =============== START DEBUG LOG ================
7272             DEBUG_LOG_STRING (l_proc_level, 'Remove_prep_from_list.Msg3',
7273                               ' l_num --> ' || l_num || ' l_new_prep_list --> ' || l_new_prep_list);
7274          -- =============== END DEBUG LOG ==================
7275 
7276          -- Set the com_du_prep_list attribute to the new list
7277          wf_engine.SetItemAttrText  ( itemtype => itemtype,
7278                                       itemkey  => itemkey,
7279                                       aname    => 'COM_DU_PREP_LIST',
7280                                       avalue   => l_new_prep_list);
7281 
7282          -- =============== START DEBUG LOG ================
7283             DEBUG_LOG_STRING (l_proc_level, 'Remove_prep_from_list.Msg4',
7284                               ' SetItemAttrText COM_DU_PREP_LIST --> ' || l_new_prep_list);
7285          -- =============== END DEBUG LOG ==================
7286 
7287       END IF;
7288 
7289       IF (funcmode <> 'RUN') THEN
7290          result := 'COMPLETE';
7291          -- =============== START DEBUG LOG ================
7292             DEBUG_LOG_STRING (l_proc_level, 'Remove_prep_from_list.Msg5',
7293                               ' funcmode <> RUN -- result --> ' || result);
7294          -- =============== END DEBUG LOG ==================
7295          return;
7296       END IF;
7297 
7298       -- =============== START DEBUG LOG ================
7299          DEBUG_LOG_STRING (l_proc_level, 'Remove_prep_from_list.Msg6',
7300                           ' ** END REMOVE_PREP_FROM_LIST ** ');
7301       -- =============== END DEBUG LOG ==================
7302 
7303    EXCEPTION
7304       WHEN OTHERS THEN
7305          wf_core.context('IGI_EXP_APPROVAL_PKG','remove_prep_from_list',itemtype,itemkey,
7306                          to_char(actid),funcmode);
7307          -- =============== START DEBUG LOG ================
7308             DEBUG_LOG_UNEXP_ERROR ('Remove_prep_from_list.Unexp1','DEFAULT');
7309          -- =============== END DEBUG LOG ==================
7310          raise;
7311    END remove_prep_from_list;
7312 
7313 
7317    -- *************************************************************************
7314 
7315    -- *************************************************************************
7316    --    SET_TU_TO_COMPLETE
7318 
7319    PROCEDURE set_tu_to_complete   ( itemtype IN  VARCHAR2,
7320                                     itemkey  IN  VARCHAR2,
7321                                     actid    IN  NUMBER,
7322                                     funcmode IN  VARCHAR2,
7323                                     result   OUT NOCOPY VARCHAR2) IS
7324 
7325       l_tu_id    igi_exp_dus.tu_id%TYPE;
7326 
7327    BEGIN
7328 
7329       -- =============== START DEBUG LOG ================
7330          DEBUG_LOG_STRING (l_proc_level, 'Set_tu_to_complete.Msg1',
7331                           ' ** START SET_TU_TO_COMPLETE ** ');
7332       -- =============== END DEBUG LOG ==================
7333 
7334       IF (funcmode = 'RUN') THEN
7335 
7336          -- Get the TU id
7337          l_tu_id
7338             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
7339                                             itemkey  => itemkey,
7340                                             aname    => 'TU_ID');
7341 
7342          -- =============== START DEBUG LOG ================
7343             DEBUG_LOG_STRING (l_proc_level, 'Set_tu_to_complete.Msg2',
7344                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
7345          -- =============== END DEBUG LOG ==================
7346 
7347          UPDATE igi_exp_tus
7348          SET    tu_status = 'COM'
7349          WHERE  tu_id = l_tu_id;
7350 
7351          -- =============== START DEBUG LOG ================
7352             DEBUG_LOG_STRING (l_proc_level, 'Set_tu_to_complete.Msg3',
7353                               ' UPDATE igi_exp_tus --> ' || SQL%ROWCOUNT);
7354          -- =============== END DEBUG LOG ==================
7355 
7356       END IF;
7357 
7358       IF (funcmode <> 'RUN') THEN
7359          result := 'COMPLETE';
7360          -- =============== START DEBUG LOG ================
7361             DEBUG_LOG_STRING (l_proc_level, 'Set_tu_to_complete.Msg4',
7362                               ' funcmode <> RUN -- result --> ' || result);
7363          -- =============== END DEBUG LOG ==================
7364          return;
7365       END IF;
7366 
7367       -- =============== START DEBUG LOG ================
7368          DEBUG_LOG_STRING (l_proc_level, 'Set_tu_to_complete.Msg5',
7369                           ' ** END SET_TU_TO_COMPLETE ** ');
7370       -- =============== END DEBUG LOG ==================
7371 
7372    EXCEPTION
7373       WHEN OTHERS THEN
7374          wf_core.context('IGI_EXP_APPROVAL_PKG','set_tu_to_complete',itemtype,itemkey,
7375                          to_char(actid),funcmode);
7376          -- =============== START DEBUG LOG ================
7377             DEBUG_LOG_UNEXP_ERROR ('set_tu_to_complete.Unexp1','DEFAULT');
7378          -- =============== END DEBUG LOG ==================
7379          raise;
7380 
7381    END set_tu_to_complete;
7382 
7383 
7384 
7385    -- OPSF(I) EXP Bug 2415293  S Brewer 11-JUL-2002 Start(3)
7386    -- Added new procedures does_tu_have_legal_num and
7387    -- remove_rej_dus_from_tu  and get_next_rejected_legal_du
7388 
7389    -- *************************************************************************
7390    --    DOES_TU_HAVE_LEGAL_NUM
7391    -- *************************************************************************
7392 
7393    PROCEDURE does_tu_have_legal_num( itemtype IN  VARCHAR2,
7394                                      itemkey  IN  VARCHAR2,
7395                                      actid    IN  NUMBER,
7396                                      funcmode IN  VARCHAR2,
7397                                      result   OUT NOCOPY VARCHAR2) IS
7398 
7399     l_tu_id            igi_exp_dus.tu_id%TYPE;
7400       l_tu_legal_number  igi_exp_tus.tu_legal_number%TYPE;
7401  -- Check if the TU has a legal number
7402  -- Bug 4051910
7403       CURSOR c_leg_num(c_tu_id number) is
7404          SELECT tu_legal_number
7405          FROM   igi_exp_tus
7406          WHERE  tu_id = c_tu_id;
7407 
7408 
7409 
7410 
7411    BEGIN
7412 
7413       -- =============== START DEBUG LOG ================
7414          DEBUG_LOG_STRING (l_proc_level, 'Does_tu_have_legal_num.Msg1',
7415                           ' ** START DOES_TU_HAVE_LEGAL_NUM ** ');
7416       -- =============== END DEBUG LOG ==================
7417 
7418       IF (funcmode = 'RUN') THEN
7419 
7420          -- Get the TU id
7421          l_tu_id
7422             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
7423                                             itemkey  => itemkey,
7424                                             aname    => 'TU_ID');
7425 
7426          -- =============== START DEBUG LOG ================
7427             DEBUG_LOG_STRING (l_proc_level, 'Does_tu_have_legal_num.Msg2',
7428                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
7429          -- =============== END DEBUG LOG ==================
7430 
7431        -- Bug 4051910
7432       OPEN c_leg_num(l_tu_id);
7433       FETCH c_leg_num INTO l_tu_legal_number;
7434       CLOSE c_leg_num;
7435 
7436 
7437          -- =============== START DEBUG LOG ================
7438             DEBUG_LOG_STRING (l_proc_level, 'Does_tu_have_legal_num.Msg3',
7439                               ' l_tu_legal_number --> ' || l_tu_legal_number);
7440          -- =============== END DEBUG LOG ==================
7441 
7442          IF (l_tu_legal_number is null) THEN
7443             -- The TU has not been assigned a legal number
7444             -- Set the result to 'No'
7445             result := 'COMPLETE:N';
7446          ELSE
7447             -- The TU has been assigned a legal number
7448             -- Set the result to 'Yes'
7452          -- =============== START DEBUG LOG ================
7449             result := 'COMPLETE:Y';
7450          END IF;
7451 
7453             DEBUG_LOG_STRING (l_proc_level, 'Does_tu_have_legal_num.Msg4',
7454                               ' result --> ' || result);
7455          -- =============== END DEBUG LOG ==================
7456 
7457       END IF;
7458 
7459       IF (funcmode <> 'RUN') THEN
7460          result := 'COMPLETE';
7461          -- =============== START DEBUG LOG ================
7462             DEBUG_LOG_STRING (l_proc_level, 'Does_tu_have_legal_num.Msg5',
7463                               ' funcmode <> RUN -- result --> ' || result);
7464          -- =============== END DEBUG LOG ==================
7465          return;
7466       END IF;
7467 
7468       -- =============== START DEBUG LOG ================
7469          DEBUG_LOG_STRING (l_proc_level, 'Does_tu_have_legal_num.Msg6',
7470                            ' ** END DOES_TU_HAVE_LEGAL_NUM ** ');
7471       -- =============== END DEBUG LOG ==================
7472 
7473    EXCEPTION
7474       WHEN OTHERS THEN
7475          wf_core.context('IGI_EXP_APPROVAL_PKG','does_tu_have_legal_num',itemtype,itemkey,
7476                          to_char(actid),funcmode);
7477          -- =============== START DEBUG LOG ================
7478             DEBUG_LOG_UNEXP_ERROR ('Does_tu_have_legal_num.Unexp1','DEFAULT');
7479          -- =============== END DEBUG LOG ==================
7480          raise;
7481    END does_tu_have_legal_num;
7482 
7483 
7484 
7485    -- *************************************************************************
7486    --    REMOVE_REJ_DUS_FROM_TU
7487    -- *************************************************************************
7488 
7489    PROCEDURE remove_rej_dus_from_tu( itemtype IN  VARCHAR2,
7490                                      itemkey  IN  VARCHAR2,
7491                                      actid    IN  NUMBER,
7492                                      funcmode IN  VARCHAR2,
7493                                      result   OUT NOCOPY VARCHAR2) IS
7494 
7495       l_tu_id       igi_exp_dus.tu_id%TYPE;
7496       l_du_prep_id  igi_exp_dus.du_by_user_id%TYPE;
7497 
7498    BEGIN
7499 
7500       -- =============== START DEBUG LOG ================
7501          DEBUG_LOG_STRING (l_proc_level, 'Remove_rej_dus_from_tu.Msg1',
7502                            ' ** START  REMOVE_REJ_DUS_FROM_TU ** ');
7503       -- =============== END DEBUG LOG ==================
7504 
7505       IF (funcmode = 'RUN') THEN
7506 
7507          -- Get the TU id
7508          l_tu_id
7509             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
7510                                             itemkey  => itemkey,
7511                                             aname    => 'TU_ID');
7512 
7513          -- =============== START DEBUG LOG ================
7514             DEBUG_LOG_STRING (l_proc_level, 'Remove_rej_dus_from_tu.Msg2',
7515                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
7516          -- =============== END DEBUG LOG ==================
7517 
7518          -- Get the DU preparer id
7519          l_du_prep_id
7520             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
7521                                             itemkey  => itemkey,
7522                                             aname    => 'TEMP_DU_PREPARER_ID');
7523 
7524 
7525          -- =============== START DEBUG LOG ================
7526             DEBUG_LOG_STRING (l_proc_level, 'Remove_rej_dus_from_tu.Msg3',
7527                               ' GetItemAttrNumber TEMP_DU_PREPARER_ID --> ' || l_du_prep_id );
7528          -- =============== END DEBUG LOG ==================
7529 
7530          -- Remove the rejected DUs (prepared by user l_du_prep_id) from the
7531          -- TU
7532          UPDATE igi_exp_dus
7533          SET    tu_id = null
7534          WHERE  tu_id = l_tu_id
7535          AND    du_by_user_id = l_du_prep_id
7536          AND    du_status = 'REJ';
7537 
7538          -- =============== START DEBUG LOG ================
7539             DEBUG_LOG_STRING (l_proc_level, 'Remove_rej_dus_from_tu.Msg4',
7540                               ' UPDATE igi_exp_dus du_status = REJ --> ' || SQL%ROWCOUNT);
7541          -- =============== END DEBUG LOG ==================
7542 
7543       END IF;
7544 
7545       IF (funcmode <> 'RUN') THEN
7546          result := 'COMPLETE';
7547          -- =============== START DEBUG LOG ================
7548             DEBUG_LOG_STRING (l_proc_level, 'Remove_rej_dus_from_tu.Msg5',
7549                               ' funcmode <> RUN -- result --> ' || result);
7550          -- =============== END DEBUG LOG ==================
7551          return;
7552       END IF;
7553 
7554       -- =============== START DEBUG LOG ================
7555          DEBUG_LOG_STRING (l_proc_level, 'Remove_rej_dus_from_tu.Msg6',
7556                            ' ** START  REMOVE_REJ_DUS_FROM_TU ** ');
7557       -- =============== END DEBUG LOG ==================
7558 
7559    EXCEPTION
7560       WHEN OTHERS THEN
7561          wf_core.context('IGI_EXP_APPROVAL_PKG','remove_rej_dus_from_tu',itemtype,itemkey,
7562                          to_char(actid),funcmode);
7563          -- =============== START DEBUG LOG ================
7564             DEBUG_LOG_UNEXP_ERROR ('Remove_rej_dus_from_tu.Unexp1','DEFAULT');
7565          -- =============== END DEBUG LOG ==================
7566         raise;
7567    END remove_rej_dus_from_tu;
7568 
7569 
7570    -- *************************************************************************
7571    --    GET_NEXT_REJECTED_LEGAL_DU
7572    -- *************************************************************************
7573 
7574    PROCEDURE get_next_rejected_legal_du( itemtype IN  VARCHAR2,
7575                                          itemkey  IN  VARCHAR2,
7576                                          actid    IN  NUMBER,
7580       CURSOR c_next_du_rej(p_tu_id igi_exp_dus.tu_id%TYPE)
7577                                          funcmode IN  VARCHAR2,
7578                                          result   OUT NOCOPY VARCHAR2) IS
7579 
7581       IS
7582          SELECT du_id
7583                ,du_by_user_id
7584          FROM   igi_exp_dus du
7585          WHERE  tu_id = p_tu_id
7586          AND    du_status = 'REJ'
7587          AND    EXISTS (SELECT 'AR'
7588                         FROM   igi_exp_ar_trans ar
7589                         WHERE  ar.du_id = du.du_id
7590                         UNION
7591                         SELECT 'AP'
7592                         FROM   igi_exp_ap_trans ap
7593                         WHERE  ap.du_id = du.du_id)
7594          AND    rownum = 1;
7595 
7596 
7597       CURSOR c_rej_du_info(p_tu_id igi_exp_dus.tu_id%TYPE
7598                           ,p_du_preparer_id igi_exp_dus.du_by_user_id%TYPE)
7599       IS
7600          SELECT du_order_number
7601                ,du_legal_number
7602          FROM   igi_exp_dus du
7603          WHERE  tu_id = p_tu_id
7604          AND    du_status = 'REJ'
7605          AND    du_by_user_id = p_du_preparer_id
7606          AND    EXISTS (SELECT 'AR'
7607                         FROM   igi_exp_ar_trans ar
7608                         WHERE  ar.du_id = du.du_id
7609                         UNION
7610                         SELECT 'AP'
7611                         FROM   igi_exp_ap_trans ap
7612                         WHERE  ap.du_id = du.du_id);
7613 
7614       l_tu_id           igi_exp_dus.tu_id%TYPE;
7615       l_du_id           igi_exp_dus.du_id%TYPE;
7616       l_du_prep_id      igi_exp_dus.du_by_user_id%TYPE;
7617       l_du_prep_name    fnd_user.user_name%TYPE;
7618 
7619       l_du_rej_list     VARCHAR2(28000);
7620 
7621 
7622    BEGIN
7623 
7624     -- =============== START DEBUG LOG ================
7625        DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg1',
7626                          ' ** START  GET_NEXT_REJECTED_LEGAL_DU ** ');
7627     -- =============== END DEBUG LOG ==================
7628 
7629       IF (funcmode = 'RUN') THEN
7630 
7631          -- Get the TU id
7632          l_tu_id
7633             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
7634                                             itemkey  => itemkey,
7635                                             aname    => 'TU_ID');
7636 
7637          -- =============== START DEBUG LOG ================
7638             DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg2',
7639                               ' GetItemAttrNumber TU_ID --> ' || l_tu_id);
7640          -- =============== END DEBUG LOG ==================
7641 
7642          -- Get the next rejected legal DU in this TU
7643          OPEN c_next_du_rej(l_tu_id);
7644          FETCH c_next_du_rej INTO l_du_id, l_du_prep_id;
7645 
7646          -- =============== START DEBUG LOG ================
7647             DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg3',
7648                               ' l_du_id --> ' || l_du_id || ' l_du_prep_id --> ' || l_du_prep_id);
7649          -- =============== END DEBUG LOG ==================
7650 
7651          IF (c_next_du_rej%NOTFOUND) THEN
7652             -- There are no more rejected DUs to deal with
7653             -- Set result to 'No More DUs'
7654             result := 'COMPLETE:NO_DUS_IN_LIST';
7655 
7656             -- =============== START DEBUG LOG ================
7657                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg4',
7658                                  ' c_next_du_rej%NOTFOUND -- result --> ' || result);
7659             -- =============== END DEBUG LOG ==================
7660 
7661          ELSE
7662             -- The next rejected DU has been fetched
7663             -- Set the temp_du_preparer_id attribute
7664             wf_engine.SetItemAttrNumber( itemtype => itemtype,
7665                                          itemkey  => itemkey,
7666                                          aname    => 'TEMP_DU_PREPARER_ID',
7667                                          avalue   => l_du_prep_id);
7668 
7669             -- =============== START DEBUG LOG ================
7670                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg5',
7671                                  ' SetItemAttrNumber TEMP_DU_PREPARER_ID --> ' || l_du_prep_id);
7672             -- =============== END DEBUG LOG ==================
7673 
7674             -- Get the name of the preparer to send the notification to
7675             SELECT user_name
7676             INTO   l_du_prep_name
7677             FROM   fnd_user
7678             WHERE  user_id = l_du_prep_id;
7679 
7680             -- =============== START DEBUG LOG ================
7681                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg6',
7682                                  ' l_du_prep_name --> ' || l_du_prep_name);
7683             -- =============== END DEBUG LOG ==================
7684 
7685             -- Set the temp_du_preparer_name attribute
7686             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7687                                          itemkey  => itemkey,
7688                                          aname    => 'TEMP_DU_PREPARER_NAME',
7689                                          avalue   => l_du_prep_name);
7690 
7691             -- =============== START DEBUG LOG ================
7692                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg7',
7693                                  ' SetItemAttrText TEMP_DU_PREPARER_NAME --> ' || l_du_prep_name);
7694             -- =============== END DEBUG LOG ==================
7695 
7696             FOR I IN c_rej_du_info(l_tu_id,l_du_prep_id)
7697             LOOP
7698 
7699                IF (l_du_rej_list is NULL) THEN
7700                   l_du_rej_list := I.du_order_number;
7701                ELSE
7705                -- =============== START DEBUG LOG ================
7702                   l_du_rej_list := l_du_rej_list ||I.du_order_number;
7703                END IF;
7704 
7706                   DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg8',
7707                                     ' du_order_number --> ' || I.du_order_number);
7708                -- =============== END DEBUG LOG ==================
7709 
7710                IF (I.du_legal_number is not null) THEN
7711                   l_du_rej_list := l_du_rej_list||' ('||I.du_legal_number||')';
7712                END IF;
7713 
7714                -- =============== START DEBUG LOG ================
7715                   DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg9',
7716                                     ' I.du_legal_number --> ' || I.du_legal_number);
7717                -- =============== END DEBUG LOG ==================
7718 
7719                l_du_rej_list := l_du_rej_list||fnd_global.local_chr(10);
7720 
7721                IF LENGTH(l_du_rej_list) > 28000 THEN
7722                   exit;
7723                END IF;
7724 
7725             END LOOP;
7726 
7727            -- Set the all_dus_list attribute
7728             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7729                                          itemkey  => itemkey,
7730                                          aname    => 'ADD_ATTR1',
7731                                          avalue   => substr(l_du_rej_list, 1, 4000));
7732 
7733             -- =============== START DEBUG LOG ================
7734                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg10',
7735                                  ' SetItemAttrText ADD_ATTR1 --> ' || substr(l_du_rej_list, 1, 4000));
7736             -- =============== END DEBUG LOG ==================
7737 
7738             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7739                                          itemkey  => itemkey,
7740                                          aname    => 'ADD_ATTR2',
7741                                          avalue   => substr(l_du_rej_list, 4001, 4000));
7742 
7743             -- =============== START DEBUG LOG ================
7744                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg11',
7745                                  ' SetItemAttrText ADD_ATTR2 --> ' || substr(l_du_rej_list, 4001, 4000));
7746             -- =============== END DEBUG LOG ==================
7747 
7748             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7749                                          itemkey  => itemkey,
7750                                          aname    => 'ADD_ATTR3',
7751                                          avalue   => substr(l_du_rej_list, 8001, 4000));
7752 
7753             -- =============== START DEBUG LOG ================
7754                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg12',
7755                                  ' SetItemAttrText ADD_ATTR3 --> ' || substr(l_du_rej_list, 8001, 4000));
7756             -- =============== END DEBUG LOG ==================
7757 
7758             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7759                                          itemkey  => itemkey,
7760                                          aname    => 'ADD_ATTR4',
7761                                          avalue   => substr(l_du_rej_list, 12001, 4000));
7762 
7763             -- =============== START DEBUG LOG ================
7764                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg13',
7765                                  ' SetItemAttrText ADD_ATTR4 --> ' || substr(l_du_rej_list, 12001, 4000));
7766             -- =============== END DEBUG LOG ==================
7767 
7768             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7769                                          itemkey  => itemkey,
7770                                          aname    => 'ADD_ATTR5',
7771                                          avalue   => substr(l_du_rej_list, 16001, 4000));
7772 
7773             -- =============== START DEBUG LOG ================
7774                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg14',
7775                                  ' SetItemAttrText ADD_ATTR5 --> ' || substr(l_du_rej_list, 16001, 4000));
7776             -- =============== END DEBUG LOG ==================
7777 
7778             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7779                                          itemkey  => itemkey,
7780                                          aname    => 'ADD_ATTR6',
7781                                          avalue   => substr(l_du_rej_list, 20001, 4000));
7782 
7783             -- =============== START DEBUG LOG ================
7784                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg15',
7785                                  ' SetItemAttrText ADD_ATTR6 --> ' || substr(l_du_rej_list, 20001, 4000));
7786             -- =============== END DEBUG LOG ==================
7787 
7788             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7789                                          itemkey  => itemkey,
7790                                          aname    => 'ADD_ATTR7',
7791                                          avalue   => substr(l_du_rej_list, 24001, 4000));
7792 
7793 
7794             -- =============== START DEBUG LOG ================
7795                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg16',
7796                                  ' SetItemAttrText ADD_ATTR7 --> ' || substr(l_du_rej_list, 24001, 4000));
7797             -- =============== END DEBUG LOG ==================
7798 
7799             -- Set the temp_du_by_prep_list attribute
7800             wf_engine.SetItemAttrText  ( itemtype => itemtype,
7801                                          itemkey  => itemkey,
7802                                          aname    => 'TEMP_DU_BY_PREP_LIST',
7803                                          avalue   => 'plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
7804 
7805 
7809                                  ' plsqlclob:igi_exp_approval_pkg.Create_du_list/'||itemtype||':'||itemkey);
7806             -- =============== START DEBUG LOG ================
7807                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg17',
7808                                  ' SetItemAttrText TEMP_DU_BY_PREP_LIST --> ' ||
7810             -- =============== END DEBUG LOG ==================
7811 
7812             -- Set the result to 'Next DU Fetched'
7813             result := 'COMPLETE:NEXT_DU_FETCHED';
7814 
7815             -- =============== START DEBUG LOG ================
7816                DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg18',
7817                                  ' result --> '||result);
7818             -- =============== END DEBUG LOG ==================
7819 
7820          END IF;
7821 
7822          IF (c_next_du_rej%ISOPEN) THEN
7823             CLOSE c_next_du_rej;
7824          END IF;
7825 
7826       END IF;
7827 
7828       IF (funcmode <> 'RUN') THEN
7829          result := 'COMPLETE';
7830          -- =============== START DEBUG LOG ================
7831             DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg19',
7832                               ' funcmode <> RUN -- result --> '|| result);
7833          -- =============== END DEBUG LOG ==================
7834          return;
7835       END IF;
7836 
7837       -- =============== START DEBUG LOG ================
7838          DEBUG_LOG_STRING (l_proc_level, 'Get_next_rejected_legal_du.Msg20',
7839                            ' ** END  GET_NEXT_REJECTED_LEGAL_DU ** ');
7840       -- =============== END DEBUG LOG ==================
7841 
7842    EXCEPTION
7843       WHEN OTHERS THEN
7844          wf_core.context('IGI_EXP_APPROVAL_PKG','get_next_rejected_legal_du',itemtype,itemkey,
7845                          to_char(actid),funcmode);
7846          -- =============== START DEBUG LOG ================
7847             DEBUG_LOG_UNEXP_ERROR ('Get_next_rejected_legal_du.Unexp1','DEFAULT');
7848          -- =============== END DEBUG LOG ==================
7849          raise;
7850 
7851    END get_next_rejected_legal_du;
7852    -- OPSF(I) EXP Bug 2415293  S Brewer 11-JUL-2002 End(3)
7853 
7854 
7855    -- OPSF(I) EXP Bug 2379693  S Brewer 16-JUL-2002 Start(1)
7856    -- Added new procedure is_transmitter_final_apprv
7857 
7858    -- *************************************************************************
7859    --    IS_TRANSMITTER_FINAL_APPRV
7860    -- *************************************************************************
7861 
7862    PROCEDURE is_transmitter_final_apprv( itemtype IN  VARCHAR2,
7863                                          itemkey  IN  VARCHAR2,
7864                                          actid    IN  NUMBER,
7865                                          funcmode IN  VARCHAR2,
7866                                          result   OUT NOCOPY VARCHAR2) IS
7867 
7868       l_transmitter_position_id  per_all_positions.position_id%TYPE;
7869       l_final_apprv_pos_id       igi_exp_apprv_profiles.final_apprv_pos_id%TYPE;
7870 
7871    BEGIN
7872 
7873       -- =============== START DEBUG LOG ================
7874          DEBUG_LOG_STRING (l_proc_level, 'Is_transmitter_final_apprv.Msg1',
7875                            ' ** START  IS_TRANSMITTER_FINAL_APPRV ** ');
7876       -- =============== END DEBUG LOG ==================
7877 
7878       IF (funcmode = 'RUN') THEN
7879 
7880          -- Get the transmitter position id
7881          l_transmitter_position_id
7882             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
7883                                             itemkey  => itemkey,
7884                                             aname    => 'TRANSMITTER_POSITION_ID');
7885 
7886          -- =============== START DEBUG LOG ================
7887             DEBUG_LOG_STRING (l_proc_level, 'Is_transmitter_final_apprv.Msg2',
7888                               ' GetItemAttrNumber TRANSMITTER_POSITION_ID --> '||l_transmitter_position_id);
7889          -- =============== END DEBUG LOG ==================
7890 
7891          -- Get the final approver position id
7892          l_final_apprv_pos_id
7893             := wf_engine.GetItemAttrNumber( itemtype => itemtype,
7894                                             itemkey  => itemkey,
7895                                             aname    => 'FINAL_APPRV_POS_ID');
7896 
7897          -- =============== START DEBUG LOG ================
7898             DEBUG_LOG_STRING (l_proc_level, 'Is_transmitter_final_apprv.Msg3',
7899                               ' GetItemAttrNumber FINAL_APPRV_POS_ID --> '||l_final_apprv_pos_id );
7900          -- =============== END DEBUG LOG ==================
7901 
7902          -- Check if the transmitter position is the same as the final position
7903          IF (l_transmitter_position_id = l_final_apprv_pos_id) THEN
7904             -- The transmitter has the final approval position
7905             -- Set the result to 'Yes'
7906             result := 'COMPLETE:Y';
7907          ELSE
7908             -- The transmitter is not at the final approval position
7909             -- Set the result to 'No'
7910             result := 'COMPLETE:N';
7911          END IF;
7912 
7913          -- =============== START DEBUG LOG ================
7914             DEBUG_LOG_STRING (l_proc_level, 'Is_transmitter_final_apprv.Msg4',
7915                               ' result --> '|| result);
7916          -- =============== END DEBUG LOG ==================
7917 
7918       END IF;
7919 
7920       IF (funcmode <> 'RUN') THEN
7921          result := 'COMPLETE';
7922          -- =============== START DEBUG LOG ================
7923             DEBUG_LOG_STRING (l_proc_level, 'Is_transmitter_final_apprv.Msg5',
7924                               ' funcmode <> RUN -- result --> ' || result);
7925          -- =============== END DEBUG LOG ==================
7926          return;
7927       END IF;
7928 
7932       -- =============== END DEBUG LOG ==================
7929       -- =============== START DEBUG LOG ================
7930          DEBUG_LOG_STRING (l_proc_level, 'Is_transmitter_final_apprv.Msg6',
7931                            ' ** END  IS_TRANSMITTER_FINAL_APPRV ** ');
7933 
7934    EXCEPTION
7935       WHEN OTHERS THEN
7936          wf_core.context('IGI_EXP_APPROVAL_PKG','is_transmitter_final_apprv',itemtype,itemkey,
7937                          to_char(actid),funcmode);
7938          -- =============== START DEBUG LOG ================
7939             DEBUG_LOG_UNEXP_ERROR ('Is_transmitter_final_apprv.Unexp1','DEFAULT');
7940          -- =============== END DEBUG LOG ==================
7941           raise;
7942 
7943    END is_transmitter_final_apprv;
7944    -- OPSF(I) EXP Bug 2379693  S Brewer 16-JUL-2002 End(1)
7945 
7946 END igi_exp_approval_pkg;