DBA Data[Home] [Help]

PACKAGE BODY: APPS.AP_WORKFLOW_PKG

Source


1 PACKAGE BODY AP_WORKFLOW_PKG AS
2 /* $Header: aphanwfb.pls 120.64.12010000.4 2008/08/08 03:12:27 sparames ship $ */
3 --------------------------------------------------------------
4 --                    Global Variables                      --
5 --------------------------------------------------------------
6 G_CURRENT_RUNTIME_LEVEL CONSTANT NUMBER := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
7 G_LEVEL_STATEMENT       CONSTANT NUMBER := FND_LOG.LEVEL_STATEMENT;
8 G_MODULE_NAME           CONSTANT VARCHAR2(100) := 'AP_WORKFLOW_PKG';
9 G_LEVEL_PROCEDURE       CONSTANT NUMBER := FND_LOG.LEVEL_PROCEDURE;
10 
11 --  Public Procedure Specifications
12 
13 -- Procedure Definitions
14 PROCEDURE insert_history_table(p_hist_rec IN AP_INV_APRVL_HIST%ROWTYPE) IS
15 l_api_name              CONSTANT VARCHAR2(200) := 'insert_history_table';
16 l_debug_info            VARCHAR2(2000);
17 l_hist_id               AP_INV_APRVL_HIST_ALL.APPROVAL_HISTORY_ID%TYPE;
18 l_iteration             NUMBER;
19 BEGIN
20    SELECT AP_INV_APRVL_HIST_S.nextval
21    INTO l_hist_id
22    FROM dual;
23    --insert into the history table
24    INSERT INTO  AP_INV_APRVL_HIST_ALL
25      (APPROVAL_HISTORY_ID
26      ,HISTORY_TYPE
27      ,INVOICE_ID
28      ,ITERATION
29      ,RESPONSE
30      ,APPROVER_ID
31      ,APPROVER_NAME
32      ,CREATED_BY
33      ,CREATION_DATE
34      ,LAST_UPDATE_DATE
35      ,LAST_UPDATED_BY
36      ,LAST_UPDATE_LOGIN
37      ,ORG_ID
38      ,AMOUNT_APPROVED
39      ,HOLD_ID
40      ,LINE_NUMBER
41      ,APPROVER_COMMENTS
42      ,NOTIFICATION_ORDER)
43    VALUES (
44      l_hist_id
45      ,p_hist_rec.HISTORY_TYPE
46      ,p_hist_rec.INVOICE_ID
47      ,p_hist_rec.ITERATION
48      ,p_hist_rec.RESPONSE
49      ,p_hist_rec.APPROVER_ID
50      ,p_hist_rec.APPROVER_NAME
51      ,p_hist_rec.CREATED_BY
52      ,p_hist_rec.CREATION_DATE
53      ,p_hist_rec.LAST_UPDATE_DATE
54      ,p_hist_rec.LAST_UPDATED_BY
55      ,p_hist_rec.LAST_UPDATE_LOGIN
56      ,p_hist_rec.ORG_ID
57      ,p_hist_rec.AMOUNT_APPROVED
58      ,p_hist_rec.HOLD_ID
59      ,p_hist_rec.LINE_NUMBER
60      ,p_hist_rec.APPROVER_COMMENTS
61      ,p_hist_rec.NOTIFICATION_ORDER);
62    l_debug_info := 'After Insert into AP_INV_APRVL_HIST_ALL';
63    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
64       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,
65                                         l_debug_info);
66    END IF;
67    commit;
68 END insert_history_table;
69 PROCEDURE recreate_pay_scheds(
70           p_invoice_id                  IN            NUMBER,
71           p_calling_sequence            IN            VARCHAR2)
72 
73 IS
74   l_item_sum               ap_invoices_all.invoice_amount%TYPE;
75   l_tax_sum                ap_invoices_all.invoice_amount%TYPE;
76   l_misc_sum               ap_invoices_all.invoice_amount%TYPE;
77   l_frt_sum                ap_invoices_all.invoice_amount%TYPE;
78   l_retained_sum           ap_invoices_all.invoice_amount%TYPE;
79   l_curr_calling_sequence  VARCHAR2(2000);
80   l_debug_info             VARCHAR2(500);
81   l_api_name               VARCHAR2(50);
82   l_hold_count             NUMBER;
83   l_line_count             NUMBER;
84   l_line_total             NUMBER;
85   l_Sched_Hold_count       NUMBER;
86   l_inv_currency_code      ap_invoices_all.invoice_currency_code%TYPE;
87   l_invoice_date           ap_invoices_all.invoice_date%TYPE;
88 
89 
90 BEGIN
91   -- Update the calling sequence
92 
93   l_curr_calling_sequence := 'recreate_pay_scheds <-'||P_calling_sequence;
94 
95   l_api_name := 'recreate_pay_scheds';
96 
97   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
98       FND_LOG.STRING(G_LEVEL_PROCEDURE,G_MODULE_NAME||l_api_name,'AP_ISP_UTILITIES_PKG.update_invoice_header2(+)');
99   END IF;
100 
101   l_debug_info := 'Step 1. update invoice amount: invoice_id = ';
102   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
103       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
104   END IF;
105 
106   BEGIN
107 
108        SELECT SUM(DECODE(line_type_lookup_code,'ITEM',NVL(amount, 0) - NVL(included_tax_amount, 0) ,0))  ITEM_SUM,
109               SUM(DECODE(line_type_lookup_code,'TAX',amount,0)) + SUM(NVL(included_tax_amount, 0)) TAX_SUM,
110               SUM(DECODE(line_type_lookup_code,'MISCELLANEOUS',NVL(amount, 0) - NVL(included_tax_amount, 0),0)) MISC_SUM,
111               SUM(DECODE(line_type_lookup_code,'FREIGHT',NVL(amount, 0) - NVL(included_tax_amount, 0),0)) FREIGHT_SUM,
112               sum(decode(line_type_lookup_code, 'ITEM', NVL(retained_amount, 0), 0)) RETAINAGE_SUM
113        INTO   l_item_sum, l_tax_sum, l_misc_sum, l_frt_sum, l_retained_sum
114        FROM   ap_invoice_lines_all
115       WHERE  invoice_id = p_invoice_id;
116 
117   EXCEPTION
118     WHEN NO_DATA_FOUND THEN
119       l_debug_info := 'no lines found for the invoice id = '|| p_invoice_id;
120       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
121           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name, l_debug_info);
122       END IF;
123   END;
124 
125 
126     update ap_invoices_all
127     set    invoice_amount = l_item_sum + l_tax_sum + l_misc_sum + l_frt_sum + l_retained_sum,
128            amount_applicable_to_discount = l_item_sum + l_tax_sum + l_misc_sum + l_frt_sum + l_retained_sum,
129            net_of_retainage_flag =  DECODE(l_retained_sum, 0, 'N', 'Y')
130     where  invoice_id = p_invoice_id;
131 
132 
133 
134   l_debug_info := 'Creating Pay Schedules ';
135   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
136       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
137   END IF;
138 
139   AP_INVOICES_POST_PROCESS_PKG.insert_children (
140             X_invoice_id               => p_invoice_id,
141             X_Payment_Priority         => 99,
142             X_Hold_count               => l_hold_count,
143             X_Line_count               => l_line_count,
144             X_Line_Total               => l_line_total,
145             X_calling_sequence         => l_curr_calling_sequence,
146             X_Sched_Hold_count         => l_Sched_Hold_count);
147 
148 EXCEPTION
149     WHEN OTHERS THEN
150       IF (SQLCODE <> -20001) THEN
151         rollback;
152         FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
153         FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
154         FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE',l_curr_calling_sequence);
155         FND_MESSAGE.SET_TOKEN('PARAMETERS',
156              ' P_invoice_id = '     || p_invoice_id
157           ||', P_calling_sequence = ' || l_curr_calling_sequence);
158         FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
159       END IF;
160 
161       APP_EXCEPTION.RAISE_EXCEPTION;
162 
163 END recreate_pay_scheds;
164 
165 PROCEDURE get_approver(itemtype IN VARCHAR2,
166                         itemkey IN VARCHAR2,
167                         actid   IN NUMBER,
168                         funcmode IN VARCHAR2,
169                         resultout  OUT NOCOPY VARCHAR2 ) IS
170    l_invoice_id            NUMBER;
171    l_hold_id 		   NUMBER;
172    l_next_approver         ame_util.approverRecord;
173    l_api_name              CONSTANT VARCHAR2(200) := 'Get_Approver';
174    l_debug_info            VARCHAR2(2000);
175    l_org_id                NUMBER;
176    l_role                  VARCHAR2(50);
177    l_role_display          VARCHAR2(150);
178    l_display_name          VARCHAR2(150);
179    l_hist_id               AP_INV_APRVL_HIST.APPROVAL_HISTORY_ID%TYPE;
180    l_name                  VARCHAR2(30);
181    l_hist_rec              AP_INV_APRVL_HIST%ROWTYPE;
182    l_iteration             NUMBER;
183    l_notf_iteration        NUMBER;
184 
185 
186 
187 BEGIN
188    l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
189                         itemkey,
190                         'ORG_ID');
191 
192    l_invoice_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
193                         itemkey,
194                         'INVOICE_ID');
195 
196    l_hold_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
197                         itemkey,
198                         'HOLD_ID');
199    l_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
200                         itemkey,
201                         'ITERATION');
202 
203    l_notf_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
204                         itemkey,
205                         'NOTF_ITERATION');
206 
207    l_debug_info := l_api_name || ': get variables from workflow' ||
208                 ', l_invoice_id = ' || l_invoice_id ||
209                 ', l_hold_id = ' || l_hold_id ||
210                 ', l_org_id = ' || l_org_id;
211    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
212       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,
213                                         l_debug_info);
214    END IF;
215 
216 
217    --get the next approver
218 
219    AME_API.getNextApprover(applicationIdIn => 200,
220                         transactionTypeIn => 'APHLD',
221                         transactionIdIn => to_char(l_hold_id),
222                         nextApproverOut => l_next_approver
223                         );
224    l_debug_info := l_api_name || ': after call to ame';
225    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
226        FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
227          l_api_name,l_debug_info);
228    END IF;
229    IF l_next_approver.approval_status = ame_util.exceptionStatus THEN
230       l_debug_info := 'Error in AME_API.getNextApprover call';
231       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
232           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
233             l_api_name,l_debug_info);
234       END IF;
235       APP_EXCEPTION.RAISE_EXCEPTION;
236    END IF;
237    IF l_next_approver.person_id is null THEN /*no approver on the list*/
238       resultout := wf_engine.eng_completed||':'||'N';
239    ELSE -- have approver
240       WF_DIRECTORY.GetRoleName('PER',
241                                l_next_approver.person_id,l_role,
242                                l_role_display);
243       WF_DIRECTORY.GetUserName('PER',
244                                 l_next_approver.person_id,
245                                 l_name,
246                                 l_display_name);
247       WF_ENGINE.SetItemAttrText(itemtype,
248                         itemkey,
249                         'INTERNAL_REP_ROLE',
250                         l_role);
251 
252       WF_ENGINE.SetItemAttrText(itemtype,
253                                   itemkey,
254                                   'ORIG_SYSTEM',
255                                   'PER');
256 
257       WF_ENGINE.SetItemAttrText(itemtype,
258                                   itemkey,
259                                   'INTERNAL_REP_DISPLAY_NAME',
260                                   l_display_name);
261 
262       WF_ENGINE.SetItemAttrNumber(itemtype,
263                         itemkey,
264                         'INTERNAL_REP_PERSON_ID',
265                         l_next_approver.person_id);
266       --Now set the environment
267       MO_GLOBAL.INIT ('SQLAP');
268       MO_GLOBAL.set_policy_context('S',l_org_id);
269 
270       l_hist_rec.HISTORY_TYPE := 'HOLDAPPROVAL';
271       l_hist_rec.INVOICE_ID   := l_invoice_id;
272       l_hist_rec.ITERATION    := l_iteration;
273       l_hist_rec.RESPONSE     := 'SENT';
274       l_hist_rec.APPROVER_ID  := l_next_approver.person_id;
275       l_hist_rec.APPROVER_NAME:= l_display_name;
276       l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
277       l_hist_rec.CREATION_DATE:= sysdate;
278       l_hist_rec.LAST_UPDATE_DATE := sysdate;
279       l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
280       l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
281       l_hist_rec.ORG_ID            := l_org_id;
282       l_hist_rec.AMOUNT_APPROVED   := 0;
283       l_hist_rec.HOLD_ID           := l_hold_id;
284       l_hist_rec.NOTIFICATION_ORDER := l_notf_iteration;
285 
286       insert_history_table(p_hist_rec => l_hist_rec);
287 
288       resultout := wf_engine.eng_completed||':'||'Y';
289    END IF;
290 
291 EXCEPTION
292 
293 WHEN OTHERS
294    THEN
295         WF_CORE.CONTEXT('APINVHDN','GET_APPROVER',itemtype, itemkey,
296                         to_char(actid), funcmode);
297         RAISE;
298 END get_approver;
299 
300 PROCEDURE is_negotiable_flow(itemtype IN VARCHAR2,
301                         itemkey IN VARCHAR2,
302                         actid   IN NUMBER,
303                         funcmode IN VARCHAR2,
304                         resultout  OUT NOCOPY VARCHAR2 ) IS
305 
306    l_org_id NUMBER;
307    l_invoice_id NUMBER;
308    l_hold_id NUMBER;
309    l_num number;
310    l_debug_info            VARCHAR2(2000);
311    l_api_name              CONSTANT VARCHAR2(200) := 'is_negotiable_flow';
312 BEGIN
313    l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
314                         itemkey,
315                         'ORG_ID');
316 
317    l_invoice_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
318                         itemkey,
319                         'INVOICE_ID');
320 
321    l_hold_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
322                         itemkey,
323                         'HOLD_ID');
324    l_debug_info := 'Before select';
325    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
326           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
327                          l_api_name,l_debug_info);
328    END IF;
329    select count(1)
330    into   l_num
331    from   ap_invoice_lines_all ail
332    where  ail.invoice_id = l_invoice_id
333    and    ail.org_id = l_org_id
334    and    ail.line_type_lookup_code = 'ITEM'
335    and    exists (
336                      (select h.line_location_id
337                       from   ap_holds_all h
338                       where  h.invoice_id = l_invoice_id
339                       and    h.org_id = l_org_id
340                       and    h.hold_id = l_hold_id
341                       and    ail.po_line_location_id = h.line_location_id
342                       and    h.status_flag = 'S'
343                       and    h.hold_lookup_code in ('PRICE', 'QTY ORD', 'QTY REC', 'AMT ORD', 'AMT REC')));
344    IF l_num > 0 THEN
345       resultout := wf_engine.eng_completed||':'||'Y';
346       WF_ENGINE.SetItemAttrText(itemtype,
347                                   itemkey,
348                                   'NOTF_CONTEXT',
349                                   'HOLDNEGOTIABLE');
350    ELSE
351       WF_ENGINE.SetItemAttrText(itemtype,
352                                   itemkey,
353                                   'NOTF_CONTEXT',
354                                   'HOLDNONNEGOTIABLE');
355       resultout := wf_engine.eng_completed||':'||'N';
356    END IF;
357    l_debug_info := 'After select, reultout : ' || resultout;
358    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
359           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
360                          l_api_name,l_debug_info);
361    END IF;
362 EXCEPTION
363 
364 WHEN OTHERS
365    THEN
366         WF_CORE.CONTEXT('APINVHDN','is_negotiable_flow',itemtype, itemkey,
367                         to_char(actid), funcmode);
368         RAISE;
369 END is_negotiable_flow;
370 
371 PROCEDURE process_ack_pomatched(itemtype IN VARCHAR2,
372                         itemkey IN VARCHAR2,
373                         actid   IN NUMBER,
374                         funcmode IN VARCHAR2,
375                         resultout  OUT NOCOPY VARCHAR2 ) IS
376 
377    l_org_id NUMBER;
378    l_invoice_id NUMBER;
379    l_hold_id NUMBER;
380    l_approver_id NUMBER;
381    l_display_name          VARCHAR2(150);
382    l_hist_rec              AP_INV_APRVL_HIST%ROWTYPE;
383    l_api_name              CONSTANT VARCHAR2(200) := 'process_ack_pomatched';
384    l_debug_info            VARCHAR2(2000);
385    l_iteration             NUMBER;
386    l_notf_iteration        NUMBER;
387 
388 BEGIN
389    l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
390                         itemkey,
391                         'ORG_ID');
392 
393    l_invoice_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
394                         itemkey,
395                         'INVOICE_ID');
396 
397    l_hold_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
398                         itemkey,
399                         'HOLD_ID');
400 
401    l_approver_id  := WF_ENGINE.GETITEMATTRNumber(itemtype,
402                         itemkey,
403                         'INTERNAL_REP_PERSON_ID');
404 
405    l_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
406                         itemkey,
407                         'ITERATION');
408 
409    l_notf_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
410                         itemkey,
411                         'NOTF_ITERATION');
412    l_display_name := WF_ENGINE.getItemAttrText(itemtype, itemkey,
413                                        'INTERNAL_REP_DISPLAY_NAME');
414 
415 
416    --Now set the environment
417    MO_GLOBAL.INIT ('SQLAP');
418    MO_GLOBAL.set_policy_context('S',l_org_id);
419 
420    l_hist_rec.HISTORY_TYPE := 'HOLDAPPROVAL';
421    l_hist_rec.INVOICE_ID   := l_invoice_id;
422    l_hist_rec.ITERATION    := l_iteration;
423    l_hist_rec.NOTIFICATION_ORDER := l_notf_iteration;
424    l_hist_rec.RESPONSE     := 'ACKNOWLEDGE';
425    l_hist_rec.APPROVER_ID  := l_approver_id;
426    l_hist_rec.APPROVER_NAME:= l_display_name;
427    l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
428    l_hist_rec.CREATION_DATE:= sysdate;
429    l_hist_rec.LAST_UPDATE_DATE := sysdate;
430    l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
431    l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
432    l_hist_rec.ORG_ID            := l_org_id;
433    l_hist_rec.AMOUNT_APPROVED   := null;
434    l_hist_rec.HOLD_ID           := l_hold_id;
435 
436    l_debug_info := 'Before insert_history_table';
437    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
438           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
439                          l_api_name,l_debug_info);
440    END IF;
441    insert_history_table(p_hist_rec => l_hist_rec);
442 
443 
444    l_debug_info := 'Before AME_API.updateApprovalStatus2';
445    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
446           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
447                          l_api_name,l_debug_info);
448    END IF;
449    AME_API.updateApprovalStatus2(applicationIdIn => 200,
450                                 transactionIdIn     => to_char(l_hold_id),
451                                 approvalStatusIn    => AME_UTIL.approvedStatus,
452                                 approverPersonIdIn  => l_approver_id,
453                                 approverUserIdIn    => NULL,
454                                 transactionTypeIn =>  'APHLD');
455 
456    resultout := wf_engine.eng_completed||':'||'Y';
457 EXCEPTION
458 
459 WHEN OTHERS
460    THEN
461         WF_CORE.CONTEXT('APINVHDN','process_ack_pomatched',itemtype, itemkey,
462                         to_char(actid), funcmode);
463         RAISE;
464 END process_ack_pomatched;
465 PROCEDURE process_rel_pomatched(itemtype IN VARCHAR2,
466                         itemkey IN VARCHAR2,
467                         actid   IN NUMBER,
468                         funcmode IN VARCHAR2,
469                         resultout  OUT NOCOPY VARCHAR2 ) IS
470    l_org_id                NUMBER;
471    l_invoice_id            NUMBER;
472    l_hold_id               NUMBER;
473    l_approver_id           NUMBER;
474    l_display_name          VARCHAR2(150);
475    l_hist_rec              AP_INV_APRVL_HIST%ROWTYPE;
476    l_api_name              CONSTANT VARCHAR2(200) := 'process_rel_pomatched';
477    l_debug_info            VARCHAR2(2000);
478    l_iteration             NUMBER;
479    l_notf_iteration        NUMBER;
480 
481 BEGIN
482    l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
483                         itemkey,
484                         'ORG_ID');
485 
486    l_invoice_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
487                         itemkey,
488                         'INVOICE_ID');
489 
490    l_hold_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
491                         itemkey,
492                         'HOLD_ID');
493 
494    l_approver_id  := WF_ENGINE.GETITEMATTRNumber(itemtype,
495                         itemkey,
496                         'INTERNAL_REP_PERSON_ID');
497 
498    l_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
499                         itemkey,
500                         'ITERATION');
501 
502    l_notf_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
503                         itemkey,
504                         'NOTF_ITERATION');
505 
506    l_display_name := WF_ENGINE.getItemAttrText(itemtype, itemkey,
507                                        'INTERNAL_REP_DISPLAY_NAME');
508 
509    --Now set the environment
510    MO_GLOBAL.INIT ('SQLAP');
511    MO_GLOBAL.set_policy_context('S',l_org_id);
512 
513    l_hist_rec.HISTORY_TYPE := 'HOLDAPPROVAL';
514    l_hist_rec.INVOICE_ID   := l_invoice_id;
515    l_hist_rec.ITERATION    := l_iteration;
516    l_hist_rec.NOTIFICATION_ORDER := l_notf_iteration;
517    l_hist_rec.RESPONSE     := 'RELEASE';
518    l_hist_rec.APPROVER_ID  := l_approver_id;
519    l_hist_rec.APPROVER_NAME:= l_display_name;
520    l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
521    l_hist_rec.CREATION_DATE:= sysdate;
522    l_hist_rec.LAST_UPDATE_DATE := sysdate;
523    l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
524    l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
525    l_hist_rec.ORG_ID            := l_org_id;
526    l_hist_rec.AMOUNT_APPROVED   := null;
527    l_hist_rec.HOLD_ID           := l_hold_id;
528 
529    l_debug_info := 'Before ap_isp_utilities_pkg.release_hold';
530    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
531           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
532                          l_api_name,l_debug_info);
533    END IF;
534    ap_isp_utilities_pkg.release_hold(p_hold_id => l_hold_id);
535 
536    l_debug_info := 'Before insert_history_table';
537    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
538           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
539                          l_api_name,l_debug_info);
540    END IF;
541    insert_history_table(p_hist_rec => l_hist_rec);
542 
543 
544    l_debug_info := 'Before AME_API.updateApprovalStatus2';
545    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
546           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
547                          l_api_name,l_debug_info);
548    END IF;
549    AME_API.updateApprovalStatus2(applicationIdIn => 200,
550                                 transactionIdIn     => to_char(l_hold_id),
551                                 approvalStatusIn    => AME_UTIL.approvedStatus,
552                                 approverPersonIdIn  => l_approver_id,
553                                 approverUserIdIn    => NULL,
554                                 transactionTypeIn =>  'APHLD');
555 
556    UPDATE ap_holds_all
557    SET    wf_status = 'RELEASED'
558    WHERE  hold_id = l_hold_id;
559 
560    resultout := wf_engine.eng_completed||':'||'Y';
561 EXCEPTION
562 
563 WHEN OTHERS
564    THEN
565         WF_CORE.CONTEXT('APINVHDN','process_rel_pomatched',itemtype, itemkey,
566                         to_char(actid), funcmode);
567         RAISE;
568 END process_rel_pomatched;
569 PROCEDURE process_ack_pounmatched(itemtype IN VARCHAR2,
570                         itemkey IN VARCHAR2,
571                         actid   IN NUMBER,
572                         funcmode IN VARCHAR2,
573                         resultout  OUT NOCOPY VARCHAR2 ) IS
574    l_org_id                NUMBER;
575    l_invoice_id            NUMBER;
576    l_hold_id               NUMBER;
577    l_approver_id           NUMBER;
578    l_display_name          VARCHAR2(150);
579    l_hist_rec              AP_INV_APRVL_HIST%ROWTYPE;
580    l_api_name              CONSTANT VARCHAR2(200) := 'process_ack_pounmatched';
581    l_debug_info            VARCHAR2(2000);
582    l_iteration             NUMBER;
583    l_notf_iteration        NUMBER;
584 
585 BEGIN
586    l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
587                         itemkey,
588                         'ORG_ID');
589 
590    l_invoice_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
591                         itemkey,
592                         'INVOICE_ID');
593 
594    l_hold_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
595                         itemkey,
596                         'HOLD_ID');
597 
598    l_approver_id  := WF_ENGINE.GETITEMATTRNumber(itemtype,
599                         itemkey,
600                         'INTERNAL_REP_PERSON_ID');
601 
602    l_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
603                         itemkey,
604                         'ITERATION');
605 
606    l_notf_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
607                         itemkey,
608                         'NOTF_ITERATION');
609 
610    l_display_name := WF_ENGINE.getItemAttrText(itemtype, itemkey,
611                                        'INTERNAL_REP_DISPLAY_NAME');
612 
613    --Now set the environment
614    MO_GLOBAL.INIT ('SQLAP');
615    MO_GLOBAL.set_policy_context('S',l_org_id);
616 
617    l_hist_rec.HISTORY_TYPE := 'HOLDAPPROVAL';
618    l_hist_rec.INVOICE_ID   := l_invoice_id;
619    l_hist_rec.ITERATION    := l_iteration;
620    l_hist_rec.NOTIFICATION_ORDER := l_notf_iteration;
621    l_hist_rec.RESPONSE     := 'ACKNOWLEDGE';
622    l_hist_rec.APPROVER_ID  := l_approver_id;
623    l_hist_rec.APPROVER_NAME:= l_display_name;
624    l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
625    l_hist_rec.CREATION_DATE:= sysdate;
626    l_hist_rec.LAST_UPDATE_DATE := sysdate;
627    l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
628    l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
629    l_hist_rec.ORG_ID            := l_org_id;
630    l_hist_rec.AMOUNT_APPROVED   := null;
631    l_hist_rec.HOLD_ID           := l_hold_id;
632 
633    l_debug_info := 'Before insert_history_table';
634    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
635           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
636                          l_api_name,l_debug_info);
637    END IF;
638    insert_history_table(p_hist_rec => l_hist_rec);
639 
640 
641    l_debug_info := 'Before AME_API.updateApprovalStatus2';
642    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
643           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
644                          l_api_name,l_debug_info);
645    END IF;
646    AME_API.updateApprovalStatus2(applicationIdIn => 200,
647                                 transactionIdIn     => to_char(l_hold_id),
648                                 approvalStatusIn    => AME_UTIL.approvedStatus,
649                                 approverPersonIdIn  => l_approver_id,
650                                 approverUserIdIn    => NULL,
651                                 transactionTypeIn =>  'APHLD');
652 
653    resultout := wf_engine.eng_completed||':'||'Y';
654 EXCEPTION
655 
656 WHEN OTHERS
657    THEN
658         WF_CORE.CONTEXT('APINVHDN','process_ack_pounmatched',itemtype, itemkey,
659                         to_char(actid), funcmode);
660         RAISE;
661 END process_ack_pounmatched;
662 PROCEDURE process_rel_pounmatched(itemtype IN VARCHAR2,
663                         itemkey IN VARCHAR2,
664                         actid   IN NUMBER,
665                         funcmode IN VARCHAR2,
666                         resultout  OUT NOCOPY VARCHAR2 ) IS
667    l_org_id                NUMBER;
668    l_invoice_id            NUMBER;
669    l_hold_id               NUMBER;
670    l_approver_id           NUMBER;
671    l_display_name          VARCHAR2(150);
672    l_hist_rec              AP_INV_APRVL_HIST%ROWTYPE;
673    l_api_name              CONSTANT VARCHAR2(200) := 'process_rel_pounmatched';
674    l_debug_info            VARCHAR2(2000);
675    l_iteration             NUMBER;
676    l_notf_iteration        NUMBER;
677 
678 BEGIN
679    l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
680                         itemkey,
681                         'ORG_ID');
682 
683    l_invoice_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
684                         itemkey,
685                         'INVOICE_ID');
686 
687    l_hold_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
688                         itemkey,
689                         'HOLD_ID');
690 
691    l_approver_id  := WF_ENGINE.GETITEMATTRNumber(itemtype,
692                         itemkey,
693                         'INTERNAL_REP_PERSON_ID');
694 
695    l_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
696                         itemkey,
697                         'ITERATION');
698 
699    l_notf_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
700                         itemkey,
701                         'NOTF_ITERATION');
702 
703    l_display_name := WF_ENGINE.getItemAttrText(itemtype, itemkey,
704                                        'INTERNAL_REP_DISPLAY_NAME');
705    --Now set the environment
706    MO_GLOBAL.INIT ('SQLAP');
707    MO_GLOBAL.set_policy_context('S',l_org_id);
708 
709    l_hist_rec.HISTORY_TYPE := 'HOLDAPPROVAL';
710    l_hist_rec.INVOICE_ID   := l_invoice_id;
711    l_hist_rec.ITERATION    := l_iteration;
712    l_hist_rec.NOTIFICATION_ORDER := l_notf_iteration;
713    l_hist_rec.RESPONSE     := 'RELEASE';
714    l_hist_rec.APPROVER_ID  := l_approver_id;
715    l_hist_rec.APPROVER_NAME:= l_display_name;
716    l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
717    l_hist_rec.CREATION_DATE:= sysdate;
718    l_hist_rec.LAST_UPDATE_DATE := sysdate;
719    l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
720    l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
721    l_hist_rec.ORG_ID            := l_org_id;
722    l_hist_rec.AMOUNT_APPROVED   := null;
723    l_hist_rec.HOLD_ID           := l_hold_id;
724 
725    l_debug_info := 'Before ap_isp_utilities_pkg.release_hold';
726    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
727           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
728                          l_api_name,l_debug_info);
729    END IF;
730    ap_isp_utilities_pkg.release_hold(p_hold_id => l_hold_id);
731 
732    l_debug_info := 'Before insert_history_table';
733    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
734           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
735                          l_api_name,l_debug_info);
736    END IF;
737    insert_history_table(p_hist_rec => l_hist_rec);
738 
739 
740    l_debug_info := 'Before AME_API.updateApprovalStatus2';
741    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
742           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
743                          l_api_name,l_debug_info);
744    END IF;
745    AME_API.updateApprovalStatus2(applicationIdIn => 200,
746                                 transactionIdIn     => to_char(l_hold_id),
747                                 approvalStatusIn    => AME_UTIL.approvedStatus,
748                                 approverPersonIdIn  => l_approver_id,
749                                 approverUserIdIn    => NULL,
750                                 transactionTypeIn =>  'APHLD');
751 
752    UPDATE ap_holds_all
753    SET    wf_status = 'RELEASED'
754    WHERE  hold_id = l_hold_id;
755 
756    resultout := wf_engine.eng_completed||':'||'Y';
757 EXCEPTION
758 
759 WHEN OTHERS
760    THEN
761         WF_CORE.CONTEXT('APINVHDN','process_rel_pounmatched',itemtype, itemkey,
762                         to_char(actid), funcmode);
763         RAISE;
764 END process_rel_pounmatched;
765 
766 PROCEDURE is_it_internal(itemtype IN VARCHAR2,
767                         itemkey IN VARCHAR2,
768                         actid   IN NUMBER,
769                         funcmode IN VARCHAR2,
770                         resultout  OUT NOCOPY VARCHAR2 ) IS
771 l_notf_receipient_type VARCHAR2(50);
772 BEGIN
773    l_notf_receipient_type := WF_ENGINE.getItemAttrText(itemtype, itemkey,
774                                        'NOTF_RECEIPIENT_TYPE');
775    IF l_notf_receipient_type = 'INTERNAL' THEN
776       resultout := wf_engine.eng_completed||':'||'Y';
777    ELSE
778       resultout := wf_engine.eng_completed||':'||'N';
779    END IF;
780 EXCEPTION
781 
782 WHEN OTHERS
783    THEN
784         WF_CORE.CONTEXT('APINVHNE','is_it_internal',itemtype, itemkey,
785                         to_char(actid), funcmode);
786         RAISE;
787 END is_it_internal;
788 PROCEDURE get_supplier_contact(itemtype IN VARCHAR2,
789                         itemkey IN VARCHAR2,
790                         actid   IN NUMBER,
791                         funcmode IN VARCHAR2,
792                         resultout  OUT NOCOPY VARCHAR2 ) IS
793 
794 BEGIN
795    resultout := wf_engine.eng_completed||':'||'Y';
796 EXCEPTION
797 
798 WHEN OTHERS
799    THEN
800         WF_CORE.CONTEXT('APINVHNE','get_supplier_contact',itemtype, itemkey,
801                         to_char(actid), funcmode);
802         RAISE;
803 END get_supplier_contact;
804 
805 PROCEDURE process_accept_ext(itemtype IN VARCHAR2,
806                         itemkey IN VARCHAR2,
807                         actid   IN NUMBER,
808                         funcmode IN VARCHAR2,
809                         resultout  OUT NOCOPY VARCHAR2 ) IS
810    l_org_id NUMBER;
811    l_invoice_id NUMBER;
812    l_hold_id NUMBER;
813    l_approver_id NUMBER;
814    l_internal_approver_id  NUMBER;
815    l_display_name          VARCHAR2(150);
816    l_hist_rec              AP_INV_APRVL_HIST%ROWTYPE;
817    l_api_name              CONSTANT VARCHAR2(200) := 'process_accept_ext';
818    l_debug_info            VARCHAR2(2000);
819    l_parentkey             VARCHAR2(50);
820    l_iteration             NUMBER;
821    l_notf_iteration        NUMBER;
822    l_success               BOOLEAN;
823    l_error_code            VARCHAR2(4000);
824    l_curr_calling_sequence VARCHAR2(2000);
825 
826 
827 BEGIN
828    l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
829                         itemkey,
830                         'ORG_ID');
831 
832    l_invoice_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
833                         itemkey,
834                         'INVOICE_ID');
835 
836    l_hold_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
837                         itemkey,
838                         'HOLD_ID');
839 
840    l_approver_id  := WF_ENGINE.GETITEMATTRNumber(itemtype,
841                         itemkey,
842                         'SUPPLIER_PERSON_ID');
843    l_internal_approver_id  := WF_ENGINE.GETITEMATTRNumber(itemtype,
844                         itemkey,
845                         'INTERNAL_REP_PERSON_ID');
846    l_display_name  := WF_ENGINE.GETITEMATTRText(itemtype,
847                         itemkey,
848                         'SUPPLIER_DISPLAY_NAME');
849    l_parentkey  := WF_ENGINE.GETITEMATTRText(itemtype,
850                         itemkey,
851                         'PARENT_KEY');
852 
853    l_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
854                         itemkey,
855                         'ITERATION');
856 
857    l_notf_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
858                         itemkey,
859                         'NOTF_ITERATION');
860 
861    --Now set the environment
862    MO_GLOBAL.INIT ('SQLAP');
863    MO_GLOBAL.set_policy_context('S',l_org_id);
864 
865    l_curr_calling_sequence := 'ap_workflow_pkg.process_accept_ext';
866    l_success := ap_etax_pkg.calling_etax(
867                      p_invoice_id         => l_invoice_id,
868                      p_calling_mode       => 'CALCULATE',
869                      p_all_error_messages => 'N',
870                      p_error_code         => l_error_code,
871                      p_calling_sequence   => l_curr_calling_sequence);
872 
873    l_hist_rec.HISTORY_TYPE := 'HOLDNEGOTIATION';
874    l_hist_rec.INVOICE_ID   := l_invoice_id;
875    l_hist_rec.ITERATION    := l_iteration;
876    l_hist_rec.NOTIFICATION_ORDER := l_notf_iteration;
877    l_hist_rec.RESPONSE     := 'ACCEPT';
878    l_hist_rec.APPROVER_ID  := l_approver_id;
879    l_hist_rec.APPROVER_NAME:= l_display_name;
880    l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
881    l_hist_rec.CREATION_DATE:= sysdate;
882    l_hist_rec.LAST_UPDATE_DATE := sysdate;
883    l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
884    l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
885    l_hist_rec.ORG_ID            := l_org_id;
886    l_hist_rec.AMOUNT_APPROVED   := null;
887    l_hist_rec.HOLD_ID           := l_hold_id;
888 
889    l_debug_info := 'Before ap_isp_utilities_pkg.release_hold';
890    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
891           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
892                          l_api_name,l_debug_info);
893    END IF;
894    ap_isp_utilities_pkg.release_hold(p_hold_id => l_hold_id);
895 
896    l_debug_info := 'Before insert_history_table';
897    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
898           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
899                          l_api_name,l_debug_info);
900    END IF;
901    insert_history_table(p_hist_rec => l_hist_rec);
902 
903 
904    l_debug_info := 'Before AME_API.updateApprovalStatus2';
905    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
906           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
907                          l_api_name,l_debug_info);
908    END IF;
909    AME_API.updateApprovalStatus2(applicationIdIn => 200,
910                                 transactionIdIn     => to_char(l_hold_id),
911                                 approvalStatusIn    => AME_UTIL.approvedStatus,
912                                 approverPersonIdIn  => l_internal_approver_id,
913                                 approverUserIdIn    => NULL,
914                                 transactionTypeIn =>  'APHLD');
915 
916    l_debug_info := 'Before wf_engine.CompleteActivity';
917    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
918           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
919                          l_api_name,l_debug_info);
920    END IF;
921    wf_engine.CompleteActivity(
922                      itemType => 'APINVHDN',
923                      itemKey  => l_parentkey,
924                      activity => 'HOLD_MAIN:WAITNEGOTIABLE',
925                      result   => 'NULL');
926 
927    UPDATE ap_holds_all
928    SET    wf_status = 'RELEASED'
929    WHERE  hold_id = l_hold_id;
930 
931    resultout := wf_engine.eng_completed||':'||'Y';
932 EXCEPTION
933 
934 WHEN OTHERS
935    THEN
936         WF_CORE.CONTEXT('APINVHNE','process_accept_ext',itemtype, itemkey,
937                         to_char(actid), funcmode);
938         RAISE;
939 END process_accept_ext;
940 
941 PROCEDURE get_first_approver(itemtype IN VARCHAR2,
942                         itemkey IN VARCHAR2,
943                         actid   IN NUMBER,
944                         funcmode IN VARCHAR2,
945                         resultout  OUT NOCOPY VARCHAR2 ) IS
946 
947 BEGIN
948    resultout := wf_engine.eng_completed||':'||'Y';
949 EXCEPTION
950 
951 WHEN OTHERS
952    THEN
953         WF_CORE.CONTEXT('APINVHNE','get_first_approver',itemtype, itemkey,
954                         to_char(actid), funcmode);
955         RAISE;
956 END get_first_approver;
957 
958 PROCEDURE process_cancel_inv_by_sup(itemtype IN VARCHAR2,
959                         itemkey IN VARCHAR2,
960                         actid   IN NUMBER,
961                         funcmode IN VARCHAR2,
962                         resultout  OUT NOCOPY VARCHAR2 ) IS
963    l_org_id NUMBER;
964    l_invoice_id NUMBER;
965    l_hold_id NUMBER;
966    l_approver_id NUMBER;
967    l_display_name          VARCHAR2(150);
968    l_hist_rec              AP_INV_APRVL_HIST%ROWTYPE;
969    l_api_name              CONSTANT VARCHAR2(200) := 'process_cancel_inv_by_sup';
970    l_debug_info            VARCHAR2(2000);
971    l_parentkey             VARCHAR2(50);
972    l_result                BOOLEAN;
973    l_last_updated_by number;
974    l_last_update_login number;
975    l_accounting_date date;
976    l_message_name varchar2(30);
977    l_invoice_amount number;
978    l_base_amount number;
979    l_temp_cancelled_amount number;
980    l_cancelled_by number;
981    l_cancelled_amount number;
982    l_cancelled_date date;
983    l_last_update_date date;
984    l_original_prepayment_amount number;
985    l_pay_curr_invoice_amount number;
986    l_token varchar2(30);
987    l_internal_approver_id  NUMBER;
988    l_iteration             NUMBER;
989    l_notf_iteration        NUMBER;
990 
991 
992    cursor invoice is
993                 select  gl_date,
994                         last_updated_by,
995                         last_update_login
996                 from    ap_invoices_all
997                 where   invoice_id = l_invoice_id
998                 and     org_id = l_org_id;
999 
1000 
1001 
1002 BEGIN
1003    l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
1004                         itemkey,
1005                         'ORG_ID');
1006 
1007    l_invoice_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
1008                         itemkey,
1009                         'INVOICE_ID');
1010 
1011    l_hold_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
1012                         itemkey,
1013                         'HOLD_ID');
1014 
1015    l_approver_id  := WF_ENGINE.GETITEMATTRNumber(itemtype,
1016                         itemkey,
1017                         'SUPPLIER_PERSON_ID');
1018    l_internal_approver_id  := WF_ENGINE.GETITEMATTRNumber(itemtype,
1019                         itemkey,
1020                         'INTERNAL_REP_PERSON_ID');
1021    l_display_name  := WF_ENGINE.GETITEMATTRText(itemtype,
1022                         itemkey,
1023                         'SUPPLIER_DISPLAY_NAME');
1024    l_parentkey  := WF_ENGINE.GETITEMATTRText(itemtype,
1025                         itemkey,
1026                         'PARENT_KEY');
1027 
1028    l_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
1029                         itemkey,
1030                         'ITERATION');
1031 
1032    l_notf_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
1033                         itemkey,
1034                         'NOTF_ITERATION');
1035 
1036    --Now set the environment
1037    MO_GLOBAL.INIT ('SQLAP');
1038    MO_GLOBAL.set_policy_context('S',l_org_id);
1039 
1040    l_hist_rec.HISTORY_TYPE := 'HOLDNEGOTIATION';
1041    l_hist_rec.INVOICE_ID   := l_invoice_id;
1042    l_hist_rec.ITERATION    := l_iteration;
1043    l_hist_rec.NOTIFICATION_ORDER := l_notf_iteration;
1044    l_hist_rec.RESPONSE     := 'CANCEL';
1045    l_hist_rec.APPROVER_ID  := l_approver_id;
1046    l_hist_rec.APPROVER_NAME:= l_display_name;
1047    l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
1048    l_hist_rec.CREATION_DATE:= sysdate;
1049    l_hist_rec.LAST_UPDATE_DATE := sysdate;
1050    l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
1051    l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
1052    l_hist_rec.ORG_ID            := l_org_id;
1053    l_hist_rec.AMOUNT_APPROVED   := null;
1054    l_hist_rec.HOLD_ID           := l_hold_id;
1055    l_debug_info := 'Before Ap_Cancel_Single_Invoice';
1056    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1057           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
1058                          l_api_name,l_debug_info);
1059    END IF;
1060 
1061    open invoice;
1062    fetch invoice into l_accounting_date, l_last_updated_by, l_last_update_login;
1063    close invoice;
1064 
1065    l_result := ap_cancel_pkg.ap_cancel_single_invoice(
1066                 l_invoice_id,
1067                 l_last_updated_by,
1068                 l_last_update_login,
1069                 sysdate,                                -- accounting_date
1070                 l_message_name,
1071                 l_invoice_amount,
1072                 l_base_amount,
1073                 l_temp_cancelled_amount,
1074                 l_cancelled_by,
1075                 l_cancelled_amount,
1076                 l_cancelled_date,
1077                 l_last_update_date,
1078                 l_original_prepayment_amount,
1079                 l_pay_curr_invoice_amount,
1080                 l_token,
1081                 null);
1082 
1083 
1084    l_debug_info := 'Before insert_history_table';
1085    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1086           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
1087                          l_api_name,l_debug_info);
1088    END IF;
1089    insert_history_table(p_hist_rec => l_hist_rec);
1090 
1091 
1092    l_debug_info := 'Before AME_API.updateApprovalStatus2';
1093    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1094           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
1095                          l_api_name,l_debug_info);
1096    END IF;
1097    AME_API.updateApprovalStatus2(applicationIdIn => 200,
1098                                 transactionIdIn     => to_char(l_hold_id),
1099                                 approvalStatusIn    => AME_UTIL.rejectStatus,
1100                                 approverPersonIdIn  => l_internal_approver_id,
1101                                 approverUserIdIn    => NULL,
1102                                 transactionTypeIn =>  'APHLD');
1103 
1104    l_debug_info := 'Before wf_engine.CompleteActivity';
1105    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1106           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
1107                          l_api_name,l_debug_info);
1108    END IF;
1109    wf_engine.CompleteActivity(
1110                      itemType => 'APINVHDN',
1111                      itemKey  => l_parentkey,
1112                      activity => 'HOLD_MAIN:WAITNEGOTIABLE',
1113                      result   => 'NULL');
1114 
1115    resultout := wf_engine.eng_completed||':'||'Y';
1116 EXCEPTION
1117 
1118 WHEN OTHERS
1119    THEN
1120         WF_CORE.CONTEXT('APINVHNE','process_cancel_inv_by_sup',itemtype,
1121                         itemkey, to_char(actid), funcmode);
1122         RAISE;
1123 END process_cancel_inv_by_sup;
1124 
1125 PROCEDURE process_accept_int(itemtype IN VARCHAR2,
1126                         itemkey IN VARCHAR2,
1127                         actid   IN NUMBER,
1128                         funcmode IN VARCHAR2,
1129                         resultout  OUT NOCOPY VARCHAR2 ) IS
1130    l_org_id NUMBER;
1131    l_invoice_id NUMBER;
1132    l_hold_id NUMBER;
1133    l_approver_id NUMBER;
1134    l_display_name          VARCHAR2(150);
1135    l_hist_rec              AP_INV_APRVL_HIST%ROWTYPE;
1136    l_api_name              CONSTANT VARCHAR2(200) := 'process_accept_int';
1137    l_debug_info            VARCHAR2(2000);
1138    l_parentkey             VARCHAR2(50);
1139    l_iteration             NUMBER;
1140    l_notf_iteration        NUMBER;
1141    l_success               BOOLEAN;
1142    l_error_code            VARCHAR2(4000);
1143    l_curr_calling_sequence VARCHAR2(2000);
1144 BEGIN
1145    l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
1146                         itemkey,
1147                         'ORG_ID');
1148 
1149    l_invoice_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
1150                         itemkey,
1151                         'INVOICE_ID');
1152 
1153    l_hold_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
1154                         itemkey,
1155                         'HOLD_ID');
1156 
1157    l_approver_id  := WF_ENGINE.GETITEMATTRNumber(itemtype,
1158                         itemkey,
1159                         'INTERNAL_REP_PERSON_ID');
1160    l_display_name  := WF_ENGINE.GETITEMATTRText(itemtype,
1161                         itemkey,
1162                         'INTERNAL_REP_DISPLAY_NAME');
1163    l_parentkey  := WF_ENGINE.GETITEMATTRText(itemtype,
1164                         itemkey,
1165                         'PARENT_KEY');
1166 
1167    l_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
1168                         itemkey,
1169                         'ITERATION');
1170 
1171    l_notf_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
1172                         itemkey,
1173                         'NOTF_ITERATION');
1174 
1175 
1176    --Now set the environment
1177    MO_GLOBAL.INIT ('SQLAP');
1178    MO_GLOBAL.set_policy_context('S',l_org_id);
1179 
1180    l_curr_calling_sequence := 'ap_workflow_pkg.process_accept_ext';
1181    l_success := ap_etax_pkg.calling_etax(
1182                      p_invoice_id         => l_invoice_id,
1183                      p_calling_mode       => 'CALCULATE',
1184                      p_all_error_messages => 'N',
1185                      p_error_code         => l_error_code,
1186                      p_calling_sequence   => l_curr_calling_sequence);
1187    l_hist_rec.HISTORY_TYPE := 'LINESNEGOTIATION';
1188    l_hist_rec.INVOICE_ID   := l_invoice_id;
1189    l_hist_rec.ITERATION    := l_iteration;
1190    l_hist_rec.NOTIFICATION_ORDER := l_notf_iteration;
1191    l_hist_rec.RESPONSE     := 'ACCEPT';
1192    l_hist_rec.APPROVER_ID  := l_approver_id;
1193    l_hist_rec.APPROVER_NAME:= l_display_name;
1194    l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
1195    l_hist_rec.CREATION_DATE:= sysdate;
1196    l_hist_rec.LAST_UPDATE_DATE := sysdate;
1197    l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
1198    l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
1199    l_hist_rec.ORG_ID            := l_org_id;
1200    l_hist_rec.AMOUNT_APPROVED   := null;
1201    l_hist_rec.HOLD_ID           := l_hold_id;
1202 
1203    l_debug_info := 'Before ap_isp_utilities_pkg.release_hold';
1204    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1205           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
1206                          l_api_name,l_debug_info);
1207    END IF;
1208    ap_isp_utilities_pkg.release_hold(p_hold_id => l_hold_id);
1209 
1210    l_debug_info := 'Before insert_history_table';
1211    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1212           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
1213                          l_api_name,l_debug_info);
1214    END IF;
1215    insert_history_table(p_hist_rec => l_hist_rec);
1216 
1217 
1218    l_debug_info := 'Before AME_API.updateApprovalStatus2';
1219    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1220           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
1221                          l_api_name,l_debug_info);
1222    END IF;
1223 
1224    AME_API.updateApprovalStatus2(applicationIdIn => 200,
1225                                 transactionIdIn     => to_char(l_hold_id),
1226                                 approvalStatusIn    => AME_UTIL.approvedStatus,
1227                                 approverPersonIdIn  => l_approver_id,
1228                                 approverUserIdIn    => NULL,
1229                                 transactionTypeIn =>  'APHLD');
1230 
1231    l_debug_info := 'Before wf_engine.CompleteActivity';
1232    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1233           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
1234                          l_api_name,l_debug_info);
1235    END IF;
1236    wf_engine.CompleteActivity(
1237                      itemType => 'APINVHDN',
1238                      itemKey  => l_parentkey,
1239                      activity => 'HOLD_MAIN:WAITNEGOTIABLE',
1240                      result   => 'NULL');
1241 
1242 
1243    UPDATE ap_holds_all
1244    SET    wf_status = 'RELEASED'
1245    WHERE  hold_id = l_hold_id;
1246 
1247    resultout := wf_engine.eng_completed||':'||'Y';
1248 EXCEPTION
1249 
1250 WHEN OTHERS
1251    THEN
1252         WF_CORE.CONTEXT('APINVHNE','process_accept_int',itemtype,
1253                         itemkey, to_char(actid), funcmode);
1254         RAISE;
1255 END process_accept_int;
1256 
1257 /*
1258 APINVAPR - Main Approval Process
1259 */
1260 
1261 
1262 --------------------------------------------------------------
1263 --  Public Procedures called from WF process
1264 --------------------------------------------------------------
1265 
1266 PROCEDURE Check_Header_Requirements(itemtype IN VARCHAR2,
1267                         itemkey IN VARCHAR2,
1268                         actid   IN NUMBER,
1269                         funcmode IN VARCHAR2,
1270                         resultout OUT NOCOPY VARCHAR2) IS
1271 
1272 	l_result 	       ame_util.stringlist;
1273 	l_reason 	       ame_util.stringlist;
1274 	l_invoice_id	 NUMBER;
1275       l_hist_rec         AP_INV_APRVL_HIST%ROWTYPE;
1276 	l_tr_reason	       VARCHAR2(240);
1277 	l_api_name	       CONSTANT VARCHAR2(200) := 'Check_Header_Requirements';
1278 	l_org_id	       NUMBER;
1279 	l_rejected_check	 BOOLEAN  := FALSE;
1280 	l_required_check	 BOOLEAN  := TRUE;
1281 	l_iteration	       NUMBER;
1282 	l_amount	       NUMBER;
1283 	l_debug_info	 VARCHAR2(2000);
1284 
1285 BEGIN
1286 
1287         IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1288           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
1289                          l_api_name,
1290                          'AP_IAW_PKG.'|| l_api_name);
1291         END IF;
1292 
1293 	l_debug_info := 'set variables from workflow';
1294         IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1295           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
1296 			l_api_name,l_debug_info);
1297         END IF;
1298 
1299 	l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
1300                         itemkey,
1301                         'ORG_ID');
1302 
1303 	l_invoice_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
1304                         itemkey,
1305                         'INVOICE_ID');
1306 
1307 	l_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
1308                         itemkey,
1309                         'ITERATION');
1310 
1311 	l_debug_info := 'get invoice amount';
1312 	IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1313           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
1314 			l_api_name,l_debug_info);
1315         END IF;
1316 
1317 	SELECT invoice_amount
1318 	INTO l_amount
1319 	FROM ap_invoices_all
1320 	WHERE invoice_id = l_invoice_id;
1321 
1322 	l_debug_info := 'check AME if production rules should prevent approval';
1323 	IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1324           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
1325 		l_api_name,l_debug_info);
1326         END IF;
1327 
1328 	ame_api2.getTransactionProductions(
1329                 applicationIdIn     => 200,
1330 		    transactionIdIn     => to_char(l_invoice_id),
1331 		    transactionTypeIn   => 'APINV',
1332 		    variableNamesOut    => l_result,
1333 		    variableValuesOut   => l_reason);
1334 
1335 	IF l_result IS NOT NULL THEN
1336 		l_debug_info := 'loop through production results';
1337 		IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1338           		FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
1339 						l_api_name,l_debug_info);
1340         	END IF;
1341 		FOR i IN 1..l_result.count LOOP
1342 
1343 			IF l_result(i) = 'NO INVOICE APPROVAL REQUIRED' THEN
1344 
1345 
1346 				--set required flag
1347 				l_required_check := FALSE;
1348 
1349 
1350 				l_debug_info := 'get translation of reason';
1351 				IF (G_LEVEL_STATEMENT >=
1352 					G_CURRENT_RUNTIME_LEVEL) THEN
1353           				FND_LOG.STRING(G_LEVEL_STATEMENT,
1354 					G_MODULE_NAME||
1355 					l_api_name,l_debug_info);
1356         			END IF;
1357 
1358 				SELECT displayed_field
1359 				into l_tr_reason
1360                        		FROM   ap_lookup_codes
1361                        		WHERE  lookup_code = l_result(i)
1362                        		and    lookup_type = 'NLS TRANSLATION';
1363 
1364 
1365 				l_debug_info := 'populate history record Variables';
1366 				IF (G_LEVEL_STATEMENT >=
1367 					G_CURRENT_RUNTIME_LEVEL) THEN
1368           				FND_LOG.STRING(G_LEVEL_STATEMENT,
1369 					G_MODULE_NAME||
1370 					l_api_name,l_debug_info);
1371         			END IF;
1372 
1373 				l_hist_rec.invoice_id        := l_invoice_id;
1374 				l_hist_rec.iteration         := l_iteration;
1375 				l_hist_rec.response          := 'APPROVED';
1376 				l_hist_rec.approver_comments := l_tr_reason;
1377 				l_hist_rec.approver_id       :=
1378 					FND_PROFILE.VALUE('AP_IAW_USER');
1379 				l_hist_rec.org_id            := l_org_id;
1380 				l_hist_rec.created_by        :=
1381 					FND_PROFILE.VALUE('AP_IAW_USER');
1382 				l_hist_rec.creation_date     := sysdate;
1383 				l_hist_rec.last_update_date  := sysdate;
1384 				l_hist_rec.last_updated_by   :=
1385 					FND_PROFILE.VALUE('AP_IAW_USER');
1386 				l_hist_rec.last_update_login := -1;
1387 				l_hist_rec.amount_approved   := l_amount;
1388                         l_hist_rec.history_type      := 'DOCUMENTAPPROVAL';
1389 
1390 				l_debug_info := 'populate history record';
1391 				IF (G_LEVEL_STATEMENT >=
1392 					G_CURRENT_RUNTIME_LEVEL) THEN
1393           				FND_LOG.STRING(G_LEVEL_STATEMENT,
1394 					G_MODULE_NAME||
1395 					l_api_name,l_debug_info);
1396         			END IF;
1397 
1398                         insert_history_table(p_hist_rec => l_hist_rec);
1399 
1400 				l_debug_info := 'Set transaction statuses';
1401 				IF (G_LEVEL_STATEMENT >=
1402                                                 G_CURRENT_RUNTIME_LEVEL) THEN
1403                                         FND_LOG.STRING(G_LEVEL_STATEMENT,
1404 					G_MODULE_NAME||
1405                                         l_api_name,l_debug_info);
1406                                 END IF;
1407 
1408 				UPDATE AP_INVOICES_ALL
1409 				SET WFApproval_Status = 'NOT REQUIRED'
1410 				WHERE Invoice_Id = l_invoice_id
1411 				AND WFApproval_Status = 'INITIATED';
1412 
1413 				UPDATE AP_INVOICE_LINES_ALL
1414 				SET WFApproval_Status = 'NOT REQUIRED'
1415 				WHERE Invoice_Id = l_invoice_id
1416 				AND WFApproval_Status = 'INITIATED';
1417 
1418 				resultout := wf_engine.eng_completed||':'||'N';
1419 
1420 				--we do not care if there are anymore
1421 				--productions
1422 				EXIT;
1423 
1424 			ELSIF l_result(i) = 'INVOICE NOT READY' THEN
1425 
1426 				--we need to know if header was rejected by
1427 				--check
1428 				l_rejected_check := TRUE;
1429 
1430 				l_debug_info := 'get translated reason value';
1431 				IF (G_LEVEL_STATEMENT >=
1432                                                 G_CURRENT_RUNTIME_LEVEL) THEN
1433                                         FND_LOG.STRING(G_LEVEL_STATEMENT,
1434 					G_MODULE_NAME||
1435                                         l_api_name,l_debug_info);
1436                                 END IF;
1437 
1438 				SELECT displayed_field
1439                                 into l_tr_reason
1440                                 FROM   ap_lookup_codes
1441                                 WHERE  lookup_code = l_result(i)
1442                                 and    lookup_type = 'NLS TRANSLATION';
1443 
1444 			END IF; --results
1445 		END LOOP; -- production string lists
1446 
1447 		IF l_required_check = TRUE and l_rejected_check = TRUE THEN
1448 
1449        			l_debug_info := 'populate history record Variables';
1450                         IF (G_LEVEL_STATEMENT >=
1451                                   G_CURRENT_RUNTIME_LEVEL) THEN
1452                        	            FND_LOG.STRING(G_LEVEL_STATEMENT,
1453 						G_MODULE_NAME||
1454                                              l_api_name,l_debug_info);
1455                         END IF;
1456                         l_hist_rec.invoice_id         := l_invoice_id;
1457                         l_hist_rec.iteration          := l_iteration;
1458                         l_hist_rec.response           := 'REJECTED';
1459                         l_hist_rec.approver_comments  := l_tr_reason;
1460                         l_hist_rec.approver_id        :=
1461                                 FND_PROFILE.VALUE('AP_IAW_USER');
1462                         l_hist_rec.org_id             := l_org_id;
1463 			      l_hist_rec.created_by               :=
1464                                         FND_PROFILE.VALUE('AP_IAW_USER');
1465                         l_hist_rec.creation_date      := sysdate;
1466                         l_hist_rec.last_update_date   := sysdate;
1467                         l_hist_rec.last_updated_by    :=
1468                                         FND_PROFILE.VALUE('AP_IAW_USER');
1469                         l_hist_rec.last_update_login  := -1;
1470                         l_hist_rec.amount_approved    := l_amount;
1471                         l_hist_rec.history_type       := 'DOCUMENTAPPROVAL';
1472 
1473        			l_debug_info := 'populate history record';
1474                         IF (G_LEVEL_STATEMENT >=
1475                                   G_CURRENT_RUNTIME_LEVEL) THEN
1476                        	            FND_LOG.STRING(G_LEVEL_STATEMENT,
1477 						G_MODULE_NAME||
1478                                              l_api_name,l_debug_info);
1479                         END IF;
1480 
1481                         insert_history_table(p_hist_rec => l_hist_rec);
1482 
1483                         UPDATE AP_INVOICES_ALL
1484                         SET WFApproval_Status = 'REJECTED'
1485                         WHERE Invoice_Id = l_invoice_id
1486                         AND WFApproval_Status = 'INITIATED';
1487 
1488                         UPDATE AP_INVOICE_LINES_ALL
1489                         SET WFApproval_Status = 'REJECTED'
1490                         WHERE Invoice_Id = l_invoice_id
1491                         AND WFApproval_Status = 'INITIATED';
1492 
1493 			resultout := wf_engine.eng_completed||':'||'N';
1494 		END IF; --required and rejected
1495 
1496 	ELSE --there were no production results
1497 
1498 		l_debug_info := 'continue with workflow';
1499                 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1500                 	FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
1501                                                l_api_name,l_debug_info);
1502                 END IF;
1503 		resultout := wf_engine.eng_completed||':'||'Y';
1504 
1505 	END IF;
1506 
1507 	resultout := nvl(resultout, wf_engine.eng_completed||':'||'Y');
1508 
1509 EXCEPTION
1510 WHEN OTHERS
1511         THEN
1512           WF_CORE.CONTEXT('APINVLDP','Check_Header_Requirements',itemtype, itemkey,
1513                                   to_char(actid), funcmode);
1514           RAISE;
1515 
1516 END Check_Header_Requirements;
1517 
1518 PROCEDURE check_line_requirements(itemtype IN VARCHAR2,
1519                         itemkey IN VARCHAR2,
1520                         actid   IN NUMBER,
1521                         funcmode IN VARCHAR2,
1522                         resultout  OUT NOCOPY VARCHAR2 ) IS
1523 
1524 	CURSOR matched_lines (l_invoice_id IN VARCHAR2) IS
1525 	   SELECT line_number, amount
1526 	   FROM ap_invoice_lines_all
1527 	   WHERE po_header_id is not null
1528 	   AND invoice_id = l_invoice_id
1529 	   AND wfapproval_status = 'INITIATED';
1530 
1531 	l_result 	         ame_util.stringlist;
1532 	l_reason 	         ame_util.stringlist;
1533 	l_invoice_id	   NUMBER;
1534 	l_l_hist	         AP_INV_APRVL_HIST%ROWTYPE;
1535 	l_tr_reason	         VARCHAR2(240);
1536 	l_api_name	         CONSTANT VARCHAR2(200) := 'Check_Line_Requirements';
1537 	l_org_id	         NUMBER;
1538 	l_required_check	   BOOLEAN  := TRUE;
1539 	l_iteration	         NUMBER;
1540 	l_amount	         NUMBER;
1541 	l_debug_info	   VARCHAR2(2000);
1542 	l_line_number        NUMBER;
1543       l_lines_require_approval NUMBER;
1544 
1545 BEGIN
1546 
1547         IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
1548           FND_LOG.STRING(G_LEVEL_PROCEDURE,G_MODULE_NAME||
1549                          l_api_name,
1550                          'AP_WORKFLOW_PKG.'|| l_api_name);
1551         END IF;
1552 
1553 	/*
1554 	l_debug_info := 'set variables from workflow';
1555         IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1556           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
1557 			l_api_name,l_debug_info);
1558         END IF;
1559 
1560 	l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
1561                         itemkey,
1562                         'ORG_ID');
1563 
1564 	l_invoice_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
1565                         itemkey,
1566                         'INVOICE_ID');
1567 
1568 	l_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
1569                         itemkey,
1570                         'ITERATION');
1571 
1572 	--check AME if any production rules should prevent approval
1573 	ame_api2.getTransactionProductions(applicationIdIn => 200,
1574 		transactionIdIn     =>   to_char(l_invoice_id),
1575 		transactionTypeIn   =>   'APINV',
1576 		variableNamesOut    =>   l_result,
1577 		variableValuesOut   =>   l_reason);
1578 
1579 
1580 	--current hack because AME allows us to set production conditions
1581 	--at the line level, but the production results are always at the
1582 	--transaction level.
1583 	--So we are looking for line level production pairs, but
1584 	--we will still need to identify which lines apply.
1585 
1586 	IF l_result IS NOT NULL THEN
1587 	   --loop through production results
1588 	   FOR i IN 1..l_result.count LOOP
1589 		IF l_result(i) = 'NO LINE APPROVAL REQUIRED' THEN
1590 
1591 		   IF l_reason(i) = 'LINE MATCHED' THEN
1592 
1593 		  	l_debug_info := 'get translation';
1594 			IF (G_LEVEL_STATEMENT >=
1595 						G_CURRENT_RUNTIME_LEVEL) THEN
1596           		   FND_LOG.STRING(G_LEVEL_STATEMENT,
1597 					G_MODULE_NAME||
1598 					l_api_name,l_debug_info);
1599         		END IF;
1600 
1601 			SELECT displayed_field
1602 			into l_tr_reason
1603                		FROM   ap_lookup_codes
1604                		WHERE  lookup_code = l_result(i)
1605                		and    lookup_type = 'NLS TRANSLATION';
1606 
1607 		  	l_debug_info := 'Open Lines Cursor to Update History Tables';
1608 			IF (G_LEVEL_STATEMENT >=
1609 						G_CURRENT_RUNTIME_LEVEL) THEN
1610           		   FND_LOG.STRING(G_LEVEL_STATEMENT,
1611 					G_MODULE_NAME||
1612 					l_api_name,l_debug_info);
1613         		END IF;
1614 
1615 			OPEN matched_lines(l_invoice_id);
1616 			LOOP
1617 
1618 		  	   l_debug_info := 'After Open Into Fetch Lines Cursor';
1619 			   IF (G_LEVEL_STATEMENT >=
1620 						G_CURRENT_RUNTIME_LEVEL) THEN
1621           		       FND_LOG.STRING(G_LEVEL_STATEMENT,
1622 				   	    G_MODULE_NAME||
1623 					    l_api_name,l_debug_info);
1624         		   END IF;
1625 
1626 			   FETCH matched_lines
1627 			   INTO l_line_number, l_amount;
1628 			   EXIT WHEN matched_lines%NOTFOUND;
1629 
1630 		  	   l_debug_info := 'Populate History Variables';
1631 			   IF (G_LEVEL_STATEMENT >=
1632 						G_CURRENT_RUNTIME_LEVEL) THEN
1633           		       FND_LOG.STRING(G_LEVEL_STATEMENT,
1634 				   	    G_MODULE_NAME||
1635 					    l_api_name,l_debug_info);
1636         		   END IF;
1637 
1638 				--populate history record
1639 				l_l_hist.invoice_id           := l_invoice_id;
1640 				l_l_hist.iteration            := l_iteration;
1641 				l_l_hist.response             := 'APPROVED';
1642 				l_l_hist.approver_comments    := l_tr_reason;
1643 				l_l_hist.approver_id          :=
1644 			        	FND_PROFILE.VALUE('AP_IAW_USER');
1645 				l_l_hist.org_id               := l_org_id;
1646 				l_l_hist.line_number          := l_line_number;
1647 				l_l_hist.amount_approved      :=
1648 						l_amount;
1649 			 	l_l_hist.created_by           :=
1650 					FND_PROFILE.VALUE('AP_IAW_USER');
1651 				l_l_hist.creation_date        := sysdate;
1652 				l_l_hist.last_updated_by      :=
1653 					FND_PROFILE.VALUE('AP_IAW_USER');
1654 				l_l_hist.last_update_date     := sysdate;
1655 				l_l_hist.last_update_login    := -1;
1656 				l_l_hist.item_class           := 'APINV';
1657 				l_l_hist.item_id              := l_invoice_id;
1658                         l_l_hist.history_type         := 'LINEAPPROVAL';
1659 
1660  		  	      l_debug_info := 'Populate History';
1661 			      IF (G_LEVEL_STATEMENT >=
1662 				   		G_CURRENT_RUNTIME_LEVEL) THEN
1663           		          FND_LOG.STRING(G_LEVEL_STATEMENT,
1664 				   	    G_MODULE_NAME||
1665 					    l_api_name,l_debug_info);
1666         		      END IF;
1667 
1668                         insert_history_table(
1669                               p_hist_rec => l_l_hist);
1670 
1671 			END LOOP; --matched lines
1672                         CLOSE matched_lines;
1673 
1674  		  	l_debug_info := 'Update Lines Approval Status';
1675 			IF (G_LEVEL_STATEMENT >=
1676 			     G_CURRENT_RUNTIME_LEVEL) THEN
1677           		     FND_LOG.STRING(G_LEVEL_STATEMENT,
1678 				   	    G_MODULE_NAME||
1679 					    l_api_name,l_debug_info);
1680         		END IF;
1681 
1682 			--Set transaction statuses
1683 			UPDATE AP_INVOICE_LINES_ALL
1684 			SET WFApproval_Status = 'NOT REQUIRED'
1685 			WHERE Invoice_Id = l_invoice_id
1686 			AND PO_Header_Id IS NOT NULL
1687 			AND WFApproval_Status = 'INITIATED';
1688 
1689 			--setting counter to end because we get
1690 			--production pairs at the transaction level
1691 			--but are checking for line requirements
1692 			--Therefore, once we fix all the lines above
1693 			--we do not need to check for any other line
1694 			--production pairs.
1695 			EXIT;
1696 		   END IF; --reason
1697 		END IF; --results
1698 	   END LOOP; -- production string lists
1699 	END IF; --productions
1700 
1701       l_debug_info := 'Check if any more lines require approval';
1702 	IF (G_LEVEL_STATEMENT >=
1703 	     G_CURRENT_RUNTIME_LEVEL) THEN
1704            FND_LOG.STRING(G_LEVEL_STATEMENT,
1705                           G_MODULE_NAME||l_api_name,l_debug_info);
1706       END IF;
1707 
1708       SELECT count(*)
1709       INTO   l_lines_require_approval
1710       FROM   ap_invoice_lines_all
1711       WHERE  invoice_id = l_invoice_id
1712       AND WFApproval_Status = 'INITIATED';
1713 
1714       IF l_lines_require_approval > 0  THEN
1715          l_debug_info := 'Still some lines require approval';
1716 	   IF (G_LEVEL_STATEMENT >=
1717 	        G_CURRENT_RUNTIME_LEVEL) THEN
1718              FND_LOG.STRING(G_LEVEL_STATEMENT,
1719                           G_MODULE_NAME||l_api_name,l_debug_info);
1720          END IF;
1721          resultout := wf_engine.eng_completed||':'||'Y';
1722       ELSE
1723          l_debug_info := 'No More Lines require approval in this invoice';
1724 	   IF (G_LEVEL_STATEMENT >=
1725 	        G_CURRENT_RUNTIME_LEVEL) THEN
1726              FND_LOG.STRING(G_LEVEL_STATEMENT,
1727                           G_MODULE_NAME||l_api_name,l_debug_info);
1728          END IF;
1729          resultout := wf_engine.eng_completed||':'||'N';
1730       END IF;
1731       */
1732          resultout := wf_engine.eng_completed||':'||'Y';
1733 
1734 EXCEPTION
1735 
1736 WHEN OTHERS
1737    THEN
1738         WF_CORE.CONTEXT('APINVAPR','check_line_requirements',itemtype,
1739                         itemkey, to_char(actid), funcmode);
1740         IF matched_lines%ISOPEN THEN
1741            CLOSE matched_lines;
1742         END IF;
1743         RAISE;
1744 END check_line_requirements;
1745 
1746 PROCEDURE get_approvers(itemtype IN VARCHAR2,
1747                         itemkey IN VARCHAR2,
1748                         actid   IN NUMBER,
1749                         funcmode IN VARCHAR2,
1750                         resultout  OUT NOCOPY VARCHAR2 ) IS
1751 
1752       l_invoice_id      NUMBER;
1753       l_complete        VARCHAR2(1);
1754       l_next_approvers  ame_util.approversTable2;
1755       l_next_approver   ame_util.approverRecord2;
1756       l_index           ame_util.idList;
1757       l_ids             ame_util.stringList;
1758       l_class           ame_util.stringList;
1759       l_source          ame_util.longStringList;
1760       l_line_num        NUMBER;
1761       l_api_name        CONSTANT VARCHAR2(200) := 'Get_Approvers';
1762       l_iteration       NUMBER;
1763       l_debug_info      VARCHAR2(2000);
1764       l_org_id          NUMBER;
1765       l_hist_rec        AP_INV_APRVL_HIST%ROWTYPE;
1766 
1767 BEGIN
1768   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
1769      FND_LOG.STRING(G_LEVEL_PROCEDURE,
1770                     G_MODULE_NAME||l_api_name,
1771                     'AP_WORKFLOW_PKG.'|| l_api_name);
1772   END IF;
1773   l_debug_info := l_api_name ||
1774                   ': get variables from workflow: itemtype = ' ||
1775                    itemtype ||
1776 			', itemkey = ' || itemkey;
1777   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1778       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
1779                      l_api_name,l_debug_info);
1780   END IF;
1781 
1782   l_invoice_id := WF_ENGINE.GETITEMATTRNumber
1783                   (itemtype,
1784                    itemkey,
1785                    'INVOICE_ID');
1786   l_iteration :=  WF_ENGINE.GETITEMATTRNumber
1787                   (itemtype,
1788                    itemkey,
1789                    'ITERATION');
1790   l_org_id := WF_ENGINE.GETITEMATTRNumber
1791               (itemtype,
1792                itemkey,
1793                'ORG_ID');
1794   l_debug_info := l_api_name ||
1795                   ': get variables from workflow' ||
1796                   ', l_invoice_id = ' || l_invoice_id ||
1797                   ', l_iteration = ' || l_iteration ||
1798                   ', l_org_id = ' || l_org_id;
1799   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1800       FND_LOG.STRING(G_LEVEL_STATEMENT,
1801                      G_MODULE_NAME||l_api_name,
1802                      l_debug_info);
1803   END IF;
1804 
1805   --get the next layer (stage) of approvers
1806   AME_API2.getNextApprovers1
1807            (applicationIdIn               => 200,
1808             transactionTypeIn             => 'APINV',
1809             transactionIdIn               => to_char(l_invoice_id),
1810             flagApproversAsNotifiedIn     => ame_util.booleanFalse,
1811             approvalProcessCompleteYNOut  => l_complete,
1812             nextApproversOut              => l_next_approvers,
1813             itemIndexesOut                => l_index,
1814             itemIdsOut                    => l_ids,
1815             itemClassesOut                => l_class,
1816             itemSourcesOut                => l_source);
1817 
1818   -- More values in the approver list
1819   l_debug_info := l_api_name || ': after call to ame';
1820   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1821       FND_LOG.STRING(G_LEVEL_STATEMENT,
1822                      G_MODULE_NAME||l_api_name,
1823                      l_debug_info);
1824   END IF;
1825 
1826   IF l_complete = ame_util.booleanFalse THEN
1827      -- Loop through approvers' table returned by AME
1828      l_debug_info := l_api_name || ': more approvers';
1829      IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1830         FND_LOG.STRING(G_LEVEL_STATEMENT,
1831                        G_MODULE_NAME||l_api_name,
1832                        l_debug_info);
1833      END IF;
1834      l_debug_info := l_api_name ||
1835                      ': looping through approvers'||
1836                      ', next_approvers.count = ' ||
1837                      l_next_approvers.count;
1838      IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1839         FND_LOG.STRING(G_LEVEL_STATEMENT,
1840                        G_MODULE_NAME||l_api_name,
1841                        l_debug_info);
1842      END IF;
1843      --
1844      FOR l_table IN 1..l_next_approvers.count LOOP
1845         l_next_approver := l_next_approvers(l_table);
1846         IF nvl(l_next_approver.item_class,'line item') <>
1847            ame_util.headerItemClassName
1848 	THEN
1849         l_debug_info := l_api_name || ': item_id = '|| l_next_approver.item_id;
1850         IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1851            FND_LOG.STRING(G_LEVEL_STATEMENT,
1852                           G_MODULE_NAME||l_api_name,
1853                           l_debug_info);
1854         END IF;
1855         --
1856         --if the approver record does not have a value for item_id,
1857         --we need to use the item lists returned by AME to determine
1858         --the items associated with this approver.
1859         --
1860         IF l_next_approver.item_id IS NULL THEN
1861            l_debug_info := 'item_id is null';
1862            IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1863               FND_LOG.STRING(G_LEVEL_STATEMENT,
1864                              G_MODULE_NAME||l_api_name,
1865                              l_debug_info);
1866            END IF;
1867            FOR l_rec IN 1..l_index.count LOOP
1868              --l_index contains the mapping between
1869              --approvers and items
1870              l_debug_info := 'looping through l_rec';
1871              IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1872                 FND_LOG.STRING(G_LEVEL_STATEMENT,
1873                                G_MODULE_NAME||l_api_name,
1874                                l_debug_info);
1875              END IF;
1876              IF l_index(l_rec) = l_table THEN
1877                 l_debug_info := 'check type of item class';
1878                 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1879                    FND_LOG.STRING(G_LEVEL_STATEMENT,
1880                                   G_MODULE_NAME||l_api_name,
1881                                   l_debug_info);
1882                 END IF;
1883                 --Depending on the type of item class, we need to set
1884                 --some variables. Need correction once project/dist seeded
1885                 IF l_class(l_rec) = ame_util.lineItemItemClassName THEN
1886                   l_line_num := l_ids(l_rec);
1887                 ELSIF l_class(l_rec) = 'project code' THEN
1888                   -- Manoj:
1889                   -- Need to have an array of lines
1890                   --
1891                   /*SELECT Invoice_Line_Number
1892                   INTO   l_line_num
1893                   FROM   AP_INVOICE_DISTRIBUTIONS_ALL
1894                   WHERE project_id =l_ids(l_rec);*/
1895                   null;
1896                 ELSIF l_class(l_rec) = ame_util.costCenterItemClassName THEN
1897                   -- Manoj:
1898                   -- Need to have an array of lines
1899                   --
1900                   /*SELECT Invoice_Line_Number
1901                   INTO   l_line_num
1902                   FROM   AP_INVOICE_DISTRIBUTIONS_ALL
1903                   WHERE  project_id =l_ids(l_rec);*/
1904                   null;
1905                 ELSIF l_class(l_rec) <>
1906                       ame_util.lineItemItemClassName
1907                       AND l_class(l_rec) <>
1908                       ame_util.headerItemClassName THEN
1909                   SELECT Invoice_Line_Number
1910                   INTO   l_line_num
1911                   FROM   AP_INVOICE_DISTRIBUTIONS_ALL
1912                   WHERE  invoice_distribution_id = l_ids(l_rec);
1913                 END IF; --l_class
1914 /**************/
1915                 --IF l_class(l_rec) <>
1916                 --      ame_util.headerItemClassName THEN
1917                 AME_API2.updateApprovalStatus2(applicationIdIn => 200,
1918                            transactionIdIn     => to_char(l_invoice_id),
1919                            approvalStatusIn    => AME_UTIL.notifiedStatus,
1920                            approverNameIn  => l_next_approver.NAME,
1921                            transactionTypeIn =>  'APINV',
1922                            itemClassIn     => l_class(l_rec),
1923                            itemIdIn        => l_ids(l_rec));
1924                 --END IF;
1925 /**************/
1926 
1927                 --
1928                 --Insert record into ap_apinv_approvers
1929                 --
1930                 INSERT INTO AP_APINV_APPROVERS(
1931 				INVOICE_ID,
1932 				INVOICE_ITERATION,
1933 				INVOICE_KEY,
1934 				LINE_NUMBER,
1935 				NOTIFICATION_STATUS,
1936 				ROLE_NAME,
1937 				ORIG_SYSTEM,
1938 				ORIG_SYSTEM_ID,
1939 				DISPLAY_NAME,
1940 				APPROVER_CATEGORY,
1941 				API_INSERTION,
1942 				AUTHORITY,
1943 				APPROVAL_STATUS,
1944 				ACTION_TYPE_ID,
1945 				GROUP_OR_CHAIN_ID,
1946 				OCCURRENCE,
1947 				SOURCE,
1948 				ITEM_CLASS,
1949 				ITEM_ID,
1950 				ITEM_CLASS_ORDER_NUMBER,
1951 				ITEM_ORDER_NUMBER,
1952 				SUB_LIST_ORDER_NUMBER,
1953 				ACTION_TYPE_ORDER_NUMBER,
1954 				GROUP_OR_CHAIN_ORDER_NUMBER,
1955 				MEMBER_ORDER_NUMBER,
1956 				APPROVER_ORDER_NUMBER,
1957 				LAST_UPDATED_BY,
1958 				LAST_UPDATE_DATE,
1959 				LAST_UPDATE_LOGIN,
1960 				CREATED_BY,
1961 				CREATION_DATE,
1962 				PROGRAM_APPLICATION_ID,
1963 				PROGRAM_ID,
1964 				PROGRAM_UPDATE_DATE,
1965 				REQUEST_ID )
1966 				VALUES(
1967 				l_invoice_id,
1968 				l_iteration,
1969 				itemkey,
1970 				l_line_num,
1971 				'PEND',
1972 				l_next_approver.NAME,
1973 				l_next_approver.ORIG_SYSTEM,
1974 				l_next_approver.ORIG_SYSTEM_ID,
1975 				l_next_approver.DISPLAY_NAME,
1976 				l_next_approver.APPROVER_CATEGORY,
1977 				l_next_approver.API_INSERTION,
1978 				l_next_approver.AUTHORITY,
1979 				l_next_approver.APPROVAL_STATUS,
1980 				l_next_approver.ACTION_TYPE_ID,
1981 				l_next_approver.GROUP_OR_CHAIN_ID,
1982 				l_next_approver.OCCURRENCE,
1983 				l_next_approver.SOURCE,
1984 				l_class(l_rec),
1985 				l_ids(l_rec),
1986 				l_next_approver.ITEM_CLASS_ORDER_NUMBER,
1987 				l_next_approver.ITEM_ORDER_NUMBER,
1988 				l_next_approver.SUB_LIST_ORDER_NUMBER,
1989 				l_next_approver.ACTION_TYPE_ORDER_NUMBER,
1990 				l_next_approver.GROUP_OR_CHAIN_ORDER_NUMBER,
1991 				l_next_approver.MEMBER_ORDER_NUMBER,
1992 				l_next_approver.APPROVER_ORDER_NUMBER,
1993 				nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1),
1994 								sysdate,
1995 				nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),
1996 								-1),
1997 				nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1),
1998 				sysdate,
1999 				200,
2000 				0,
2001 				sysdate,
2002 				0);
2003                 l_debug_info := 'after insert';
2004                 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2005                    FND_LOG.STRING(G_LEVEL_STATEMENT,
2006                                   G_MODULE_NAME||l_api_name,
2007                                   l_debug_info);
2008                 END IF;
2009                 l_debug_info := 'Before calling insert_history_table';
2010                 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2011                    FND_LOG.STRING(G_LEVEL_STATEMENT,
2012                                   G_MODULE_NAME||l_api_name,
2013                                   l_debug_info);
2014                 END IF;
2015                 l_hist_rec.HISTORY_TYPE := 'LINESAPPROVAL';
2016                 l_hist_rec.INVOICE_ID   := l_invoice_id;
2017                 l_hist_rec.line_number   := l_line_num;
2018                 l_hist_rec.amount_approved := 0;
2019 
2020                 l_hist_rec.ITERATION    := l_iteration;
2021                 l_hist_rec.RESPONSE     := 'SENT';
2022                 l_hist_rec.APPROVER_ID  := l_next_approver.ORIG_SYSTEM_ID;
2023                 l_hist_rec.APPROVER_NAME:= l_next_approver.DISPLAY_NAME;
2024                 l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
2025                 l_hist_rec.CREATION_DATE:= sysdate;
2026                 l_hist_rec.LAST_UPDATE_DATE := sysdate;
2027                 l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
2028                 l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
2029                 l_hist_rec.ORG_ID            := l_org_id;
2030 
2031 
2032                 insert_history_table(p_hist_rec => l_hist_rec);
2033 
2034                 l_debug_info := 'After calling insert_history_table';
2035                 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2036                    FND_LOG.STRING(G_LEVEL_STATEMENT,
2037                                   G_MODULE_NAME||l_api_name,
2038                                   l_debug_info);
2039                 END IF;
2040              END IF; --l_index mapping
2041            END LOOP; -- l_index mapping
2042         ELSE  --only one item_id per approver
2043           l_debug_info := 'only one item_id per approver';
2044           IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2045              FND_LOG.STRING(G_LEVEL_STATEMENT,
2046                             G_MODULE_NAME||l_api_name,
2047                             l_debug_info);
2048           END IF;
2049           --
2050           --Depending on the type of item class, we need to set
2051           --some variables:
2052           --
2053 	    IF l_next_approver.item_class =
2054              ame_util.lineItemItemClassName THEN
2055              l_line_num := l_next_approver.item_id;
2056           ELSIF l_next_approver.item_class = 'project code' THEN
2057              -- Manoj:
2058              -- Need to have an array of lines
2059              --
2060              /*SELECT Invoice_Line_Number
2061              INTO   l_line_num
2062              FROM   AP_INVOICE_DISTRIBUTIONS_ALL
2063              WHERE  project_id = l_next_approver.item_id;*/
2064              null;
2065           ELSIF l_next_approver.item_class =
2066                 ame_util.costCenterItemClassName THEN
2067              -- Manoj:
2068              -- Need to have an array of lines
2069              --
2070              /*SELECT Invoice_Line_Number
2071              INTO   l_line_num
2072              FROM   AP_INVOICE_DISTRIBUTIONS_ALL
2073              WHERE  project_id = l_next_approver.item_id;*/
2074              null;
2075           ELSIF l_next_approver.item_class <>
2076                 ame_util.lineItemItemClassName
2077                 AND l_next_approver.item_class <>
2078                 ame_util.headerItemClassName THEN
2079              SELECT Invoice_Line_Number
2080              INTO   l_line_num
2081              FROM   AP_INVOICE_DISTRIBUTIONS_ALL
2082              WHERE  invoice_distribution_id = l_next_approver.item_id;
2083           END IF; --l_class
2084 
2085 /********/
2086                 --IF l_next_approver.item_class <>
2087                 --ame_util.headerItemClassName THEN
2088                 AME_API2.updateApprovalStatus2(applicationIdIn => 200,
2089                            transactionIdIn     => to_char(l_invoice_id),
2090                            approvalStatusIn    => AME_UTIL.notifiedStatus,
2091                            approverNameIn  => l_next_approver.NAME,
2092                            transactionTypeIn =>  'APINV',
2093                            itemClassIn     => l_next_approver.item_class,
2094                            itemIdIn        => l_next_approver.item_id);
2095                 --END IF;
2096 /*********/
2097           --Insert record into ap_apinv_approvers
2098           INSERT INTO AP_APINV_APPROVERS(
2099 				INVOICE_ID,
2100 				INVOICE_ITERATION,
2101 				INVOICE_KEY,
2102 				LINE_NUMBER,
2103 				NOTIFICATION_STATUS,
2104 				ROLE_NAME,
2105 				ORIG_SYSTEM,
2106 				ORIG_SYSTEM_ID,
2107 				DISPLAY_NAME,
2108 				APPROVER_CATEGORY,
2109 				API_INSERTION,
2110 				AUTHORITY,
2111 				APPROVAL_STATUS,
2112 				ACTION_TYPE_ID,
2113 				GROUP_OR_CHAIN_ID,
2114 				OCCURRENCE,
2115 				SOURCE,
2116 				ITEM_CLASS,
2117 				ITEM_ID,
2118 				ITEM_CLASS_ORDER_NUMBER,
2119 				ITEM_ORDER_NUMBER,
2120 				SUB_LIST_ORDER_NUMBER,
2121 				ACTION_TYPE_ORDER_NUMBER,
2122 				GROUP_OR_CHAIN_ORDER_NUMBER,
2123 				MEMBER_ORDER_NUMBER,
2124 				APPROVER_ORDER_NUMBER,
2125 				LAST_UPDATED_BY,
2126 				LAST_UPDATE_DATE,
2127 				LAST_UPDATE_LOGIN,
2128 				CREATED_BY,
2129 				CREATION_DATE,
2130 				PROGRAM_APPLICATION_ID,
2131 				PROGRAM_ID,
2132 				PROGRAM_UPDATE_DATE,
2133 				REQUEST_ID )
2134 				VALUES(
2135 				l_invoice_id,
2136 				l_iteration,
2137 				itemkey,
2138 				l_line_num,
2139 				'PEND',
2140 				l_next_approver.NAME,
2141 				l_next_approver.ORIG_SYSTEM,
2142 				l_next_approver.ORIG_SYSTEM_ID,
2143 				l_next_approver.DISPLAY_NAME,
2144 				l_next_approver.APPROVER_CATEGORY,
2145 				l_next_approver.API_INSERTION,
2146 				l_next_approver.AUTHORITY,
2147 				l_next_approver.APPROVAL_STATUS,
2148 				l_next_approver.ACTION_TYPE_ID,
2149 				l_next_approver.GROUP_OR_CHAIN_ID,
2150 				l_next_approver.OCCURRENCE,
2151 				l_next_approver.SOURCE,
2152 				l_next_approver.item_class,
2153 				l_next_approver.item_id,
2154 				l_next_approver.ITEM_CLASS_ORDER_NUMBER,
2155 				l_next_approver.ITEM_ORDER_NUMBER,
2156 				l_next_approver.SUB_LIST_ORDER_NUMBER,
2157 				l_next_approver.ACTION_TYPE_ORDER_NUMBER,
2158 				l_next_approver.GROUP_OR_CHAIN_ORDER_NUMBER,
2159 				l_next_approver.MEMBER_ORDER_NUMBER,
2160 				l_next_approver.APPROVER_ORDER_NUMBER,
2161 				nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1),
2162                                 				sysdate,
2163                                 nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),
2164 								-1),
2165                                 nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1),
2166                                 sysdate,
2167                                 200,
2168                                 0,
2169                                 sysdate,
2170                                 0);
2171            l_debug_info := 'Before calling insert_history_table';
2172            IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2173                    FND_LOG.STRING(G_LEVEL_STATEMENT,
2174                                   G_MODULE_NAME||l_api_name,
2175                                   l_debug_info);
2176            END IF;
2177            l_hist_rec.HISTORY_TYPE := 'LINESAPPROVAL';
2178            l_hist_rec.INVOICE_ID   := l_invoice_id;
2179            l_hist_rec.line_number   := l_line_num;
2180            l_hist_rec.amount_approved := 0;
2181 
2182            l_hist_rec.ITERATION    := l_iteration;
2183            l_hist_rec.RESPONSE     := 'SENT';
2184            l_hist_rec.APPROVER_ID  := l_next_approver.ORIG_SYSTEM_ID;
2185            l_hist_rec.APPROVER_NAME:= l_next_approver.DISPLAY_NAME;
2186            l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID
2187         ')),-1);
2188            l_hist_rec.CREATION_DATE:= sysdate;
2189            l_hist_rec.LAST_UPDATE_DATE := sysdate;
2190            l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USE
2191         R_ID')),-1);
2192            l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LO
2193         GIN_ID')),-1);
2194            l_hist_rec.ORG_ID            := l_org_id;
2195 
2196 
2197            insert_history_table(p_hist_rec => l_hist_rec);
2198            l_debug_info := 'After calling insert_history_table';
2199            IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2200                    FND_LOG.STRING(G_LEVEL_STATEMENT,
2201                                   G_MODULE_NAME||l_api_name,
2202                                   l_debug_info);
2203            END IF;
2204         END IF; --more than one item_id per approver
2205         END IF; -- end if for IF nvl(l_next_approver.item_class,
2206 	        -- 'line item') <> ame_util.headerItemClassName
2207      END LOOP; --nextApprovers table
2208   END IF; --complete
2209   resultout := wf_engine.eng_completed;
2210 EXCEPTION
2211    WHEN OTHERS THEN
2212         WF_CORE.CONTEXT('APINVAPR','get_approvers',itemtype,
2213                         itemkey, to_char(actid), funcmode);
2214         RAISE;
2215 END get_approvers;
2216 
2217 PROCEDURE identify_approvers(itemtype IN VARCHAR2,
2218                         itemkey IN VARCHAR2,
2219                         actid   IN NUMBER,
2220                         funcmode IN VARCHAR2,
2221                         resultout  OUT NOCOPY VARCHAR2 ) IS
2222   l_invoice_id	NUMBER;
2223   l_iteratation	NUMBER;
2224   l_not_iteration	NUMBER;
2225   l_pend		NUMBER;
2226   l_sent		NUMBER;
2227   l_comp		NUMBER;
2228   l_name		VARCHAR2(320);
2229   l_api_name	CONSTANT VARCHAR2(200) := 'Identify_Approvers';
2230   l_iteration	NUMBER;
2231   l_debug_info	VARCHAR2(2000);
2232 
2233   l_org_id                      NUMBER;
2234   l_role                        VARCHAR2(50);
2235   l_orig_id                     NUMBER;
2236   l_invoice_type_lookup_code    ap_invoices_all.invoice_type_lookup_code%TYPE;
2237 
2238   CURSOR Group_Approvers IS
2239   SELECT distinct role_name
2240   FROM   ap_apinv_approvers
2241   WHERE  notification_status = 'PEND'
2242   AND    invoice_key = itemkey
2243   AND    line_number IS NOT NULL;
2244 
2245 BEGIN
2246 
2247   l_pend := 0;
2248 
2249   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
2250      FND_LOG.STRING(G_LEVEL_PROCEDURE,
2251                     G_MODULE_NAME||l_api_name,
2252                     'AP_WORKFLOW_PKG.'|| l_api_name);
2253   END IF;
2254   l_debug_info := l_api_name ||
2255                   ': get variables from workflow: itemtype = ' ||
2256                    itemtype ||
2257 			', itemkey = ' || itemkey;
2258   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2259       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2260                      l_api_name,l_debug_info);
2261   END IF;
2262 
2263   l_invoice_id := WF_ENGINE.GETITEMATTRNumber
2264                   (itemtype,
2265                    itemkey,
2266                    'INVOICE_ID');
2267   l_iteration := WF_ENGINE.GETITEMATTRNumber
2268                  (itemtype,
2269                   itemkey,
2270                   'ITERATION');
2271 
2272   l_debug_info := l_api_name ||': invoice_id = ' ||
2273                   l_invoice_id ||
2274 			', iteration = ' ||
2275                   l_iteration;
2276   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2277      FND_LOG.STRING(G_LEVEL_STATEMENT,
2278                     G_MODULE_NAME||l_api_name,
2279                     l_debug_info);
2280   END IF;
2281 
2282   l_debug_info := 'Check for Pending Approvers to be notified';
2283   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2284      FND_LOG.STRING(G_LEVEL_STATEMENT,
2285                     G_MODULE_NAME||l_api_name,
2286                     l_debug_info);
2287   END IF;
2288 
2289   l_debug_info := 'Process Group Approvers Cursor';
2290   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2291      FND_LOG.STRING(G_LEVEL_STATEMENT,
2292                     G_MODULE_NAME||l_api_name,
2293                     l_debug_info);
2294   END IF;
2295 
2296   FOR Group_Approvers_Rec IN Group_Approvers LOOP
2297 
2298     l_debug_info := 'Inside Group Approvers Loop for Role: '||
2299                     Group_Approvers_Rec.role_name;
2300     IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2301        FND_LOG.STRING(G_LEVEL_STATEMENT,
2302                       G_MODULE_NAME||l_api_name,
2303                       l_debug_info);
2304     END IF;
2305 
2306     l_pend := 1;
2307 
2308     l_debug_info := 'Get Notification Iteration';
2309     IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2310        FND_LOG.STRING(G_LEVEL_STATEMENT,
2311                       G_MODULE_NAME||l_api_name,
2312                       l_debug_info);
2313     END IF;
2314 
2315     SELECT nvl(max(notification_iteration),0) + 1
2316     INTO   l_not_iteration
2317     FROM   ap_apinv_approvers
2318     WHERE  invoice_key = itemkey;
2319 
2320     l_debug_info := 'Notification Iteration:'||l_not_iteration;
2321     IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2322        FND_LOG.STRING(G_LEVEL_STATEMENT,
2323                       G_MODULE_NAME||l_api_name,
2324                       l_debug_info);
2325     END IF;
2326 
2327     l_debug_info := 'Update Iteration Value in ap_apinv_approvers';
2328     IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2329        FND_LOG.STRING(G_LEVEL_STATEMENT,
2330                       G_MODULE_NAME||l_api_name,
2331                       l_debug_info);
2332     END IF;
2333 
2334     UPDATE ap_apinv_approvers
2335     SET    notification_iteration = l_not_iteration,
2336            notification_key = itemkey || '_' || l_not_iteration,
2337            child_process_item_key = itemkey || '_' || l_not_iteration,
2338 	   child_process_item_type = 'APINVAPR',
2339            item_key = itemkey || '_' || l_not_iteration,
2340 	   item_type = 'APINVAPR'
2341     WHERE  role_Name = Group_Approvers_Rec.role_name
2342     AND    invoice_key = itemkey
2343     AND    line_number IS NOT NULL
2344     AND    notification_status = 'PEND';
2345 
2346   END LOOP;
2347 
2348   IF l_pend <> 0 THEN
2349     resultout := wf_engine.eng_completed||':'||'MORE';
2350   ELSE
2351     l_debug_info := 'Into the No Pending Case';
2352     IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2353        FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2354                       l_api_name,l_debug_info);
2355     END IF;
2356 
2357     BEGIN
2358       SELECT SUM(DECODE(notification_status, 'SENT', 1, 0)),
2359              SUM(DECODE(notification_status, 'COMP', 1, 0))
2360       INTO   l_sent,
2361              l_comp
2362       FROM   ap_apinv_approvers
2363       WHERE  invoice_key = itemkey
2364       GROUP BY invoice_key;
2365     EXCEPTION
2366       WHEN OTHERS THEN
2367         l_sent := 0;
2368         l_comp := 0;
2369     END;
2370     l_debug_info := l_api_name ||
2371                     ': sent = ' || l_sent ||
2372 			  ', complete = ' || l_comp;
2373     IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2374        FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2375                       l_api_name,l_debug_info);
2376     END IF;
2377 
2378     --None sent at all
2379     IF l_sent = 0 and l_comp = 0 THEN
2380 
2381       l_debug_info := 'Into l_sent = 0 and l_comp = 0 case';
2382       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2383          FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2384                         l_api_name,l_debug_info);
2385       END IF;
2386 
2387       l_debug_info := 'Setting Approval Status for Line Records';
2388       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2389          FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2390                         l_api_name,l_debug_info);
2391       END IF;
2392 
2393       /* For Invoices whose source is ISP there should always be
2394          an approver. So if there are no approvers we should mark
2395 	 them as Rejected. */
2396 
2397       SELECT invoice_type_lookup_code
2398       INTO   l_invoice_type_lookup_code
2399       FROM   ap_invoices_all
2400       WHERE  invoice_id = l_invoice_id;
2401 
2402       UPDATE AP_INVOICE_LINES_ALL
2403       SET WFApproval_Status = DECODE(l_invoice_type_lookup_code
2404                                     ,'INVOICE REQUEST','REJECTED'
2405                                     ,'CREDIT MEMO REQUEST','REJECTED'
2406                                     ,'NOT REQUIRED')
2407       WHERE Invoice_Id = l_invoice_id
2408       AND WFApproval_Status = 'INITIATED';
2409 
2410       l_debug_info := 'Cleanup ap_apinv_approvers';
2411       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2412          FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2413                         l_api_name,l_debug_info);
2414       END IF;
2415 
2416 
2417       DELETE FROM AP_APINV_APPROVERS
2418       WHERE Invoice_Id = l_invoice_id;
2419 
2420 
2421       l_debug_info := 'Set the Result to Finish';
2422       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2423          FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2424                         l_api_name,l_debug_info);
2425       END IF;
2426 
2427       resultout := wf_engine.eng_completed||':'||'FINISH';
2428 
2429     ELSIF l_sent >0 THEN
2430 
2431       l_debug_info := 'Set the Result to Finish';
2432       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2433          FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2434                         l_api_name,l_debug_info);
2435       END IF;
2436       resultout := wf_engine.eng_completed||':'||'WAIT';
2437 
2438     ELSIF l_sent = 0 AND l_comp >0 THEN
2439 
2440       l_debug_info := l_api_name ||': all complete but none sent';
2441       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2442          FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2443                         l_api_name,l_debug_info);
2444       END IF;
2445 
2446       l_debug_info := 'Set the Invoice Line Approval Status to Approved if it was part of the approval process';
2447       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2448          FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2449                         l_api_name,l_debug_info);
2450       END IF;
2451 
2452       UPDATE   AP_INVOICE_LINES_ALL
2453       SET      WFApproval_Status = 'WFAPPROVED'
2454       WHERE    Invoice_Id = l_invoice_id
2455       AND      WFApproval_Status = 'INITIATED'
2456       AND      Line_Number IN (SELECT DISTINCT Line_Number
2457                                FROM   AP_APINV_APPROVERS
2458                                WHERE  invoice_id = l_invoice_id
2459                                AND    Invoice_Iteration = l_iteration
2460 			       AND    NOTIFICATION_STATUS = 'COMP');
2461 
2462       l_debug_info := 'Set the Invoice Line Approval Status to Not Required if it was not part of the approval process';
2463       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2464          FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2465                         l_api_name,l_debug_info);
2466       END IF;
2467 
2468       UPDATE AP_INVOICE_LINES_ALL
2469       SET WFApproval_Status = 'NOT REQUIRED'
2470       WHERE Invoice_Id = l_invoice_id
2471       AND WFApproval_Status = 'INITIATED';
2472 
2473       l_debug_info := 'Clear the ap_apinv_approvers';
2474       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2475          FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2476                         l_api_name,l_debug_info);
2477       END IF;
2478 
2479 
2480       DELETE FROM AP_APINV_APPROVERS
2481       WHERE Invoice_Id = l_invoice_id;
2482 
2483 
2484 
2485       resultout := wf_engine.eng_completed||':'||'FINISH';
2486     END IF; -- sent/complete checks
2487   END IF;
2488 
2489 EXCEPTION
2490 
2491 WHEN OTHERS
2492    THEN
2493        IF Group_Approvers%ISOpen THEN
2494          Close Group_Approvers;
2495        END IF;
2496         WF_CORE.CONTEXT('APINVAPR','identify_approvers',itemtype,
2497                         itemkey, to_char(actid), funcmode);
2498         RAISE;
2499 END identify_approvers;
2500 
2501 PROCEDURE launch_approval_notifications(itemtype IN VARCHAR2,
2502                         itemkey IN VARCHAR2,
2503                         actid   IN NUMBER,
2504                         funcmode IN VARCHAR2,
2505                         resultout  OUT NOCOPY VARCHAR2 ) IS
2506 
2507   l_invoice_id number;
2508   l_iteration  number;
2509   l_rowid rowid := null;
2510   l_notification_key varchar2(320);
2511   l_org_id number;
2512 
2513   l_invoice_supplier_name       VARCHAR2(240);
2514   l_invoice_supplier_site       VARCHAR2(15);
2515   l_invoice_number              VARCHAR2(50);
2516   l_invoice_date                DATE;
2517   l_invoice_description         VARCHAR2(240);
2518   l_invoice_total               NUMBER;
2519   l_invoice_currency_code       VARCHAR2(15);
2520   l_role_name                   VARCHAR2(320);
2521   l_orig_system                 ap_apinv_approvers.orig_system%TYPE;
2522   l_orig_system_id              number(15);
2523   l_invoice_iteration           number;
2524   l_notification_iteration      number;
2525   l_approver_name               varchar2(360);
2526 
2527   CURSOR Notif_Process IS
2528   SELECT distinct role_name
2529   FROM   ap_apinv_approvers
2530   WHERE  notification_status = 'PEND'
2531   AND    invoice_key = itemKey
2532   AND    line_number is NOT NULL
2533   AND    notification_key IS NOT NULL;
2534 
2535   l_api_name	CONSTANT VARCHAR2(200) := 'launch_approval_notifications';
2536   l_debug_info		VARCHAR2(2000);
2537 
2538 BEGIN
2539 
2540   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
2541      FND_LOG.STRING(G_LEVEL_PROCEDURE,
2542                     G_MODULE_NAME||l_api_name,
2543                     'AP_WORKFLOW_PKG.'|| l_api_name);
2544   END IF;
2545   l_debug_info := l_api_name ||
2546                   ': get variables from workflow: itemtype = ' ||
2547                    itemtype ||
2548 			', itemkey = ' || itemkey;
2549   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2550       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2551                      l_api_name,l_debug_info);
2552   END IF;
2553 
2554   l_invoice_id := WF_ENGINE.GETITEMATTRNumber
2555                   (itemtype,
2556                    itemkey,
2557                    'INVOICE_ID');
2558   l_org_id := WF_ENGINE.GETITEMATTRNumber
2559                  (itemtype,
2560                   itemkey,
2561                   'ORG_ID');
2562 
2563   l_debug_info := l_api_name ||': invoice_id = ' ||
2564                   l_invoice_id ||
2565 			', Org ID = ' ||
2566                   l_org_id;
2567   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2568      FND_LOG.STRING(G_LEVEL_STATEMENT,
2569                     G_MODULE_NAME||l_api_name,
2570                     l_debug_info);
2571   END IF;
2572 
2573 -- Bug5892455 added the union for 'Payment Request' type invoices
2574 -- For payment Request type invoices the vendor is a customer whose
2575 -- data wil be there in hz_party tables
2576 SELECT     vendor_name,
2577            vendor_site_code,
2578            invoice_num,
2579            invoice_date,
2580            description,
2581            invoice_amount,
2582            invoice_currency_code
2583 INTO
2584             l_invoice_supplier_name,
2585             l_invoice_supplier_site,
2586             l_invoice_number,
2587             l_invoice_date,
2588             l_invoice_description,
2589             l_invoice_total,
2590             l_invoice_currency_code
2591 FROM
2592 (SELECT
2593              PV.vendor_name vendor_name,
2594              PVS.vendor_site_code vendor_site_code,
2595              AI.invoice_num,
2596              AI.invoice_date,
2597              AI.description,
2598              NVL(AI.invoice_amount, 0) invoice_amount,
2599              AI.invoice_currency_code
2600   FROM
2601              ap_invoices_all AI,
2602              po_vendors PV,
2603              po_vendor_sites_all PVS
2604   WHERE
2605              AI.invoice_id = l_invoice_id AND
2606              AI.vendor_id = PV.vendor_id AND
2607              AI.invoice_type_lookup_code  <> 'PAYMENT REQUEST' AND
2608              AI.vendor_site_id = PVS.vendor_site_id(+)
2609 UNION ALL
2610   SELECT
2611              HZP.party_name vendor_name,
2612              HZPS.party_site_name vendor_site_code,
2613              AI.invoice_num,
2614              AI.invoice_date,
2615              AI.description,
2616              NVL(AI.invoice_amount, 0) invoice_amount,
2617              AI.invoice_currency_code
2618    FROM
2619              ap_invoices_all AI,
2620              hz_parties HZP,
2621              hz_party_sites HZPS
2622    WHERE
2623              AI.invoice_id = l_invoice_id AND
2624              AI.party_id = HZP.party_id AND
2625              AI.invoice_type_lookup_code  = 'PAYMENT REQUEST' and
2626              AI.party_site_id = HZPS.party_site_id(+))
2627 ;
2628   l_debug_info := l_api_name ||
2629                   ': supplier_name ' || l_invoice_supplier_name ||
2630                   ', invoice_num = '|| l_invoice_number ||
2631                   ', invoice_total = '|| l_invoice_total;
2632   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2633       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2634                      l_api_name,l_debug_info);
2635   END IF;
2636 
2637 
2638 
2639   l_debug_info := 'Process Notif_Process Cursor';
2640   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2641       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2642                      l_api_name,l_debug_info);
2643   END IF;
2644 
2645   FOR Notif_Process_Rec IN Notif_Process LOOP
2646 
2647 
2648     IF Notif_Process_Rec.role_name IS NOT NULL THEN
2649 
2650       l_debug_info := l_api_name ||
2651                       ': Role Name ' || Notif_Process_Rec.role_name;
2652       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2653           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2654                          l_api_name,l_debug_info);
2655       END IF;
2656 
2657       l_debug_info := 'Before: Create The Lines Sub Process';
2658       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2659           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2660                          l_api_name,l_debug_info);
2661       END IF;
2662 
2663       SELECT notification_key,
2664              invoice_iteration,
2665              notification_iteration,
2666              orig_system,
2667              orig_system_id
2668       INTO   l_notification_key,
2669              l_invoice_iteration,
2670              l_notification_iteration,
2671              l_orig_system,
2672              l_orig_system_id
2673       FROM   ap_apinv_approvers
2674       WHERE  role_name = Notif_Process_Rec.role_name
2675       AND    notification_status = 'PEND'
2676       AND    invoice_key = itemKey
2677       AND    rownum = 1;
2678 
2679       l_debug_info := l_api_name ||
2680                       ': Notification Key ' || l_notification_key;
2681       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2682           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2683                          l_api_name,l_debug_info);
2684       END IF;
2685 
2686       WF_ENGINE.createProcess('APINVAPR',
2687                                l_notification_key,
2688                                'APPROVAL_INVOICE_LINES');
2689 
2690       l_debug_info := 'After: Create The Lines Sub Process';
2691       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2692           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2693                          l_api_name,l_debug_info);
2694       END IF;
2695 
2696       l_debug_info := 'Set the attributes';
2697       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2698           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2699                          l_api_name,l_debug_info);
2700       END IF;
2701 
2702       WF_DIRECTORY.GetUserName(l_orig_system,
2703                                 l_orig_system_id,
2704                                 Notif_Process_Rec.role_name,
2705                                 l_approver_name);
2706 
2707       WF_ENGINE.SetItemAttrNumber('APINVAPR',
2708                                   l_notification_key,
2709                                   'ORG_ID',
2710                                   l_org_id);
2711       WF_ENGINE.SetItemAttrNumber('APINVAPR',
2712                                   l_notification_key,
2713                                   'INVOICE_ID',
2714                                   l_invoice_id);
2715       WF_ENGINE.SetItemAttrNumber('APINVAPR',
2716                                   l_notification_key,
2717                                   'INVOICE_ITERATION',
2718                                   l_invoice_iteration);
2719       WF_ENGINE.SetItemAttrNumber('APINVAPR',
2720                                   l_notification_key,
2721                                   'NOTF_ITERATION',
2722                                   l_notification_iteration);
2723       WF_ENGINE.SetItemAttrNumber('APINVAPR',
2724                                   l_notification_key,
2725                                   'APPROVER_ID',
2726                                   l_orig_system_id);
2727       WF_ENGINE.SETITEMATTRTEXT('APINVAPR',
2728                                 l_notification_key,
2729                                 'ROLE_NAME',
2730                                 Notif_Process_Rec.role_name);
2731       WF_ENGINE.SETITEMATTRTEXT('APINVAPR',
2732                                  l_notification_key,
2733                                  'APPROVER_NAME',
2734                                  l_approver_name);
2735       WF_ENGINE.SETITEMATTRTEXT('APINVAPR',
2736                                 l_notification_key,
2737                                 'INVOICE_SUPPLIER_NAME',
2738                                 l_invoice_supplier_name);
2739       WF_ENGINE.SETITEMATTRTEXT('APINVAPR',
2740                                 l_notification_key,
2741                                 'INVOICE_SUPPLIER_SITE',
2742                                 l_invoice_supplier_site);
2743       WF_ENGINE.SETITEMATTRTEXT('APINVAPR',
2744                                 l_notification_key,
2745                                 'INVOICE_NUMBER',
2746                                 l_invoice_number);
2747       WF_ENGINE.SETITEMATTRDATE('APINVAPR',
2748                                 l_notification_key,
2749                                 'INVOICE_DATE',
2750                                 l_invoice_date);
2751       WF_ENGINE.SETITEMATTRTEXT('APINVAPR',
2752                                 l_notification_key,
2753                                 'INVOICE_DESCRIPTION',
2754                                 l_invoice_description);
2755       WF_ENGINE.SETITEMATTRTEXT('APINVAPR',
2756                                 l_notification_key,
2757                                 'NOTIFICATION_KEY',
2758                                 l_notification_key);
2759       WF_ENGINE.SETITEMATTRNUMBER
2760     		(
2761       		itemtype => 'APINVAPR',
2762       		itemkey => l_notification_key,
2763       		aname => 'INVOICE_TOTAL',
2764       		avalue => l_invoice_total
2765     		);
2766       WF_ENGINE.SETITEMATTRTEXT
2767     		(
2768       		itemtype => 'APINVAPR',
2769       		itemkey => l_notification_key,
2770       		aname => 'INVOICE_CURRENCY_CODE',
2771       		avalue => l_invoice_currency_code
2772     		);
2773 
2774       l_debug_info := 'Select the Role and Approver information';
2775       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2776           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2777                          l_api_name,l_debug_info);
2778       END IF;
2779       l_debug_info := 'Define Parent Child Association';
2780       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2781           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2782                          l_api_name,l_debug_info);
2783       END IF;
2784 
2785       WF_ENGINE.setItemParent('APINVAPR',
2786                               l_notification_key,
2787                               'APINVAPR',
2788                               itemKey,
2789                               null);
2790 
2791       l_debug_info := 'Start the child process';
2792       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2793           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2794                          l_api_name,l_debug_info);
2795       END IF;
2796 
2797       wf_engine.startProcess('APINVAPR', l_notification_key);
2798 
2799       l_debug_info := 'Update the ap_apinv_approvers notification status';
2800       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2801           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2802                          l_api_name,l_debug_info);
2803       END IF;
2804 
2805       UPDATE ap_apinv_approvers
2806       SET    notification_status = 'SENT'
2807       WHERE  notification_key = l_notification_key;
2808 
2809     END IF;
2810 
2811   END LOOP;
2812 
2813   resultout := wf_engine.eng_completed||':'||'Y';
2814 
2815 EXCEPTION
2816 
2817 WHEN OTHERS
2818    THEN
2819         IF Notif_Process%ISOpen THEN
2820           CLOSE Notif_Process;
2821         END IF;
2822         WF_CORE.CONTEXT('APINVAPR','launch_approval_notifications',itemtype,
2823                         itemkey, to_char(actid), funcmode);
2824         RAISE;
2825 END launch_approval_notifications;
2826 
2827 PROCEDURE launch_neg_notifications(itemtype IN VARCHAR2,
2828                         itemkey IN VARCHAR2,
2829                         actid   IN NUMBER,
2830                         funcmode IN VARCHAR2,
2831                         resultout  OUT NOCOPY VARCHAR2 ) IS
2832 
2833 BEGIN
2834    resultout := wf_engine.eng_completed||':'||'Y';
2835 EXCEPTION
2836 
2837 WHEN OTHERS
2838    THEN
2839         WF_CORE.CONTEXT('APINVAPR','launch_neg_notifications',itemtype,
2840                         itemkey, to_char(actid), funcmode);
2841         RAISE;
2842 END launch_neg_notifications;
2843 
2844 PROCEDURE process_doc_rejection(itemtype IN VARCHAR2,
2845                         itemkey IN VARCHAR2,
2846                         actid   IN NUMBER,
2847                         funcmode IN VARCHAR2,
2848                         resultout  OUT NOCOPY VARCHAR2 ) IS
2849    l_invoice_id    NUMBER(15);
2850    l_iteration     NUMBER(15);
2851    l_comments      VARCHAR2(240);
2852    l_amount       ap_invoices_all.invoice_amount%TYPE;
2853    l_status        VARCHAR2(50);
2854    l_org_id        NUMBER(15);
2855    l_user_id       NUMBER(15);
2856    l_login_id      NUMBER(15);
2857    l_api_name      CONSTANT VARCHAR2(200) := 'process_doc_rejection';
2858    l_debug_info    VARCHAR2(2000);
2859    l_hist_rec      AP_INV_APRVL_HIST%ROWTYPE;
2860    l_approver_name VARCHAR2(150);
2861    l_approver_id   NUMBER;
2862    l_esc_flag      VARCHAR2(1);
2863    l_esc_approver_name VARCHAR2(150);
2864    l_document_approver VARCHAR2(150);
2865    l_role VARCHAR2(150);
2866    l_esc_role_name VARCHAR2(150);
2867    l_esc_approver_id   NUMBER;
2868    l_invoice_total     NUMBER;
2869 
2870 
2871 BEGIN
2872 
2873    l_debug_info := 'Start';
2874    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2875           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2876                          l_api_name,l_debug_info);
2877    END IF;
2878 
2879    l_invoice_id := WF_ENGINE.GetItemAttrNumber(itemtype,
2880                              itemkey,
2881                              'INVOICE_ID');
2882 
2883    l_comments := WF_ENGINE.GetItemAttrText(itemtype,
2884                              itemkey,
2885                              'WF_NOTE');
2886 
2887    l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
2888                    itemkey,
2889                    'ORG_ID');
2890 
2891    l_invoice_total := WF_ENGINE.GETITEMATTRNumber(itemtype,
2892                    itemkey,
2893                    'INVOICE_TOTAL');
2894 
2895    l_approver_name := WF_ENGINE.GetItemAttrText(itemtype,
2896                              itemkey,
2897                              'APPROVER_NAME');
2898 
2899    l_esc_role_name := WF_ENGINE.GetItemAttrText(itemtype,
2900                              itemkey,
2901                              'ESC_ROLE_NAME');
2902 
2903    l_document_approver := WF_ENGINE.GetItemAttrText(itemtype,
2904                              itemkey,
2905                              'DOCUMENT_APPROVER');
2906 
2907    l_approver_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
2908                    itemkey,
2909                    'APPROVER_ID');
2910 
2911    l_esc_flag  := WF_ENGINE.GetItemAttrText(itemtype,
2912                              itemkey,
2913                              'ESCALATED');
2914 
2915    l_esc_approver_name := WF_ENGINE.GetItemAttrText(itemtype,
2916                              itemkey,
2917                              'ESC_APPROVER_NAME');
2918 
2919    l_esc_approver_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
2920                    itemkey,
2921                    'ESC_APPROVER_ID');
2922 
2923    l_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
2924                         itemkey,
2925                         'ITERATION');
2926 
2927 
2928    l_user_id := nvl(to_number(fnd_profile.value('USER_ID')),-1);
2929    l_login_id := nvl(to_number(fnd_profile.value('LOGIN_ID')),-1);
2930    IF nvl(l_esc_flag,'N') = 'N' THEN
2931       l_role := l_document_approver;
2932    ELSE
2933       l_role := l_esc_role_name;
2934    END IF;
2935 
2936    l_debug_info := 'Before calling AME esc_flag : ' || l_esc_flag;
2937    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2938           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2939                          l_api_name,l_debug_info);
2940    END IF;
2941    AME_API2.updateApprovalStatus2(applicationIdIn => 200,
2942              transactionIdIn     => to_char(l_invoice_id),
2943              approvalStatusIn    => AME_UTIL.rejectStatus,
2944              approverNameIn  => l_role,
2945              transactionTypeIn =>  'APINV',
2946              itemClassIn     => ame_util.headerItemClassName,
2947              itemIdIn        => to_char(l_invoice_id));
2948 
2949    fnd_client_info.set_org_context(l_org_id);
2950 
2951    l_hist_rec.HISTORY_TYPE := 'DOCUMENTAPPROVAL';
2952    l_hist_rec.INVOICE_ID   := l_invoice_id;
2953    l_hist_rec.ITERATION    := l_iteration;
2954    l_hist_rec.RESPONSE     := 'REJECT';
2955    l_hist_rec.APPROVER_COMMENTS     := l_comments;
2956    IF nvl(l_esc_flag,'N') = 'N' THEN
2957       l_hist_rec.APPROVER_ID  := l_approver_id;
2958       l_hist_rec.APPROVER_NAME:= l_approver_name;
2959    ELSE
2960       l_hist_rec.APPROVER_ID  := l_esc_approver_id;
2961       l_hist_rec.APPROVER_NAME:= l_esc_approver_name;
2962    END IF;
2963    l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
2964    l_hist_rec.CREATION_DATE:= sysdate;
2965    l_hist_rec.LAST_UPDATE_DATE := sysdate;
2966    l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
2967    l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
2968    l_hist_rec.ORG_ID            := l_org_id;
2969    l_hist_rec.AMOUNT_APPROVED   := l_invoice_total;
2970 
2971    l_debug_info := 'Before calling insert_history_table';
2972    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2973           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2974                          l_api_name,l_debug_info);
2975    END IF;
2976 
2977    insert_history_table(p_hist_rec => l_hist_rec);
2978    l_debug_info := 'Before UPDATE AP_INVOICES_ALL';
2979    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2980           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2981                          l_api_name,l_debug_info);
2982    END IF;
2983 
2984    UPDATE AP_INVOICES_ALL
2985    SET    wfapproval_status = 'REJECTED'
2986    WHERE invoice_id = l_invoice_id;
2987 
2988    l_debug_info := 'End';
2989    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2990           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
2991                          l_api_name,l_debug_info);
2992    END IF;
2993 
2994    resultout := wf_engine.eng_completed||':'||'Y';
2995 EXCEPTION
2996 WHEN OTHERS
2997    THEN
2998         WF_CORE.CONTEXT('APINVAPR','process_doc_rejection',itemtype,
2999                         itemkey, to_char(actid), funcmode);
3000         RAISE;
3001 END process_doc_rejection;
3002 PROCEDURE process_doc_approval(itemtype IN VARCHAR2,
3003                         itemkey IN VARCHAR2,
3004                         actid   IN NUMBER,
3005                         funcmode IN VARCHAR2,
3006                         resultout  OUT NOCOPY VARCHAR2 ) IS
3007    l_invoice_id    NUMBER(15);
3008    l_comments      VARCHAR2(240);
3009    l_amount       ap_invoices_all.invoice_amount%TYPE;
3010    l_status        VARCHAR2(50);
3011    l_org_id        NUMBER(15);
3012    l_user_id       NUMBER(15);
3013    l_login_id      NUMBER(15);
3014    l_api_name      CONSTANT VARCHAR2(200) := 'process_doc_approval';
3015    l_debug_info    VARCHAR2(2000);
3016    l_hist_rec      AP_INV_APRVL_HIST%ROWTYPE;
3017    l_approver_name VARCHAR2(150);
3018    l_approver_id   NUMBER;
3019    l_esc_flag      VARCHAR2(1);
3020    l_esc_approver_name  VARCHAR2(150);
3021    l_document_approver  VARCHAR2(150);
3022    l_role               VARCHAR2(150);
3023    l_esc_role_name      VARCHAR2(150);
3024    l_esc_approver_id    NUMBER;
3025    l_invoice_total      NUMBER;
3026    l_iteration             NUMBER;
3027    l_notf_iteration        NUMBER;
3028 -- added for the delegation enhancement
3029    l_role_name             VARCHAR2(50);
3030    l_esc_role_actual     VARCHAR2(50);
3031 
3032 
3033 BEGIN
3034 
3035    l_debug_info := 'Start';
3036    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3037           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3038                          l_api_name,l_debug_info);
3039    END IF;
3040 
3041    l_invoice_id := WF_ENGINE.GetItemAttrNumber(itemtype,
3042                              itemkey,
3043                              'INVOICE_ID');
3044 
3045    l_comments := WF_ENGINE.GetItemAttrText(itemtype,
3046                              itemkey,
3047                              'WF_NOTE');
3048 
3049    l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
3050                    itemkey,
3051                    'ORG_ID');
3052 
3053    l_invoice_total := WF_ENGINE.GETITEMATTRNumber(itemtype,
3054                    itemkey,
3055                    'INVOICE_TOTAL');
3056 
3057    l_approver_name := WF_ENGINE.GetItemAttrText(itemtype,
3058                              itemkey,
3059                              'APPROVER_NAME');
3060 
3061    l_esc_role_name := WF_ENGINE.GetItemAttrText(itemtype,
3062                              itemkey,
3063                              'ESC_ROLE_NAME');
3064 
3065    l_document_approver := WF_ENGINE.GetItemAttrText(itemtype,
3066                              itemkey,
3067                              'DOCUMENT_APPROVER');
3068 
3069    l_approver_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
3070                    itemkey,
3071                    'APPROVER_ID');
3072 
3073    l_esc_flag  := WF_ENGINE.GetItemAttrText(itemtype,
3074                              itemkey,
3075                              'ESCALATED');
3076 
3077    l_esc_approver_name := WF_ENGINE.GetItemAttrText(itemtype,
3078                              itemkey,
3079                              'ESC_APPROVER_NAME');
3080 
3081    l_esc_approver_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
3082                    itemkey,
3083                    'ESC_APPROVER_ID');
3084 
3085    l_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
3086                         itemkey,
3087                         'ITERATION');
3088 
3089    l_notf_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
3090                         itemkey,
3091                         'NOTF_ITERATION');
3092 	-- added for the delegation enhancement
3093 	  l_role_name      :=WF_ENGINE.GetItemAttrText(itemtype,
3094                                     itemkey,
3095                                     'ROLE_ACTUAL');
3096    l_esc_role_actual := WF_ENGINE.GetItemAttrText(itemtype,
3097                                             itemkey,
3098                                             'ESC_ROLE_ACTUAL');
3099 -- added for the delegation enhancement
3100    l_user_id := nvl(to_number(fnd_profile.value('USER_ID')),-1);
3101    l_login_id := nvl(to_number(fnd_profile.value('LOGIN_ID')),-1);
3102    IF nvl(l_esc_flag,'N') = 'N' THEN
3103       l_role := l_role_name; -- added for the delegation enhancement
3104       --l_role := l_document_approver;
3105    ELSE
3106       l_role := l_esc_role_actual ;
3107       --l_role := l_esc_role_name;
3108    END IF;
3109 
3110    l_debug_info := 'Before calling AME esc_flag : ' || l_esc_flag;
3111    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3112           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3113                          l_api_name,l_debug_info);
3114    END IF;
3115    AME_API2.updateApprovalStatus2(applicationIdIn => 200,
3116              transactionIdIn     => to_char(l_invoice_id),
3117              approvalStatusIn    => AME_UTIL.approvedStatus,
3118              approverNameIn  => l_role,
3119              transactionTypeIn =>  'APINV',
3120              itemClassIn     => ame_util.headerItemClassName,
3121              itemIdIn        => to_char(l_invoice_id));
3122 
3123    fnd_client_info.set_org_context(l_org_id);
3124 
3125    l_hist_rec.HISTORY_TYPE := 'DOCUMENTAPPROVAL';
3126    l_hist_rec.INVOICE_ID   := l_invoice_id;
3127    l_hist_rec.ITERATION    := l_iteration;
3128    l_hist_rec.NOTIFICATION_ORDER := l_notf_iteration;
3129    l_hist_rec.RESPONSE     := 'APPROVED';
3130    IF nvl(l_esc_flag,'N') = 'N' THEN
3131       l_hist_rec.APPROVER_ID  := l_approver_id;
3132       l_hist_rec.APPROVER_NAME:= l_approver_name;
3133    ELSE
3134       l_hist_rec.APPROVER_ID  := l_esc_approver_id;
3135       l_hist_rec.APPROVER_NAME:= l_esc_approver_name;
3136    END IF;
3137    l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
3138    l_hist_rec.CREATION_DATE:= sysdate;
3139    l_hist_rec.LAST_UPDATE_DATE := sysdate;
3140    l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
3141    l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
3142    l_hist_rec.ORG_ID            := l_org_id;
3143    l_hist_rec.AMOUNT_APPROVED   := l_invoice_total;
3144    l_hist_rec.APPROVER_COMMENTS := l_comments;
3145 
3146    l_debug_info := 'Before calling insert_history_table';
3147    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3148           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3149                          l_api_name,l_debug_info);
3150    END IF;
3151 
3152    insert_history_table(p_hist_rec => l_hist_rec);
3153 
3154 
3155 -- Set WF_NOTE to null
3156 -- 01/24/2007
3157 
3158   WF_ENGINE.SetItemAttrText('APINVAPR',
3159                         itemkey,
3160                         'WF_NOTE',
3161                         null);
3162 -- added for the delegation enhancement
3163 
3164   WF_ENGINE.SetItemAttrText(itemtype,
3165                             itemkey,
3166                             'FORWARD_ROLE',
3167                             null);
3168 -- added for the delegation enhancement
3169 
3170 
3171 
3172    l_debug_info := 'End';
3173    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3174           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3175                          l_api_name,l_debug_info);
3176    END IF;
3177 
3178 
3179    resultout := wf_engine.eng_completed||':'||'Y';
3180 EXCEPTION
3181 WHEN OTHERS
3182    THEN
3183         WF_CORE.CONTEXT('APINVAPR','process_doc_approval',itemtype,
3184                         itemkey, to_char(actid), funcmode);
3185         RAISE;
3186 END process_doc_approval;
3187 
3188 PROCEDURE process_lines_rejection(itemtype IN VARCHAR2,
3189                         itemkey IN VARCHAR2,
3190                         actid   IN NUMBER,
3191                         funcmode IN VARCHAR2,
3192                         resultout  OUT NOCOPY VARCHAR2 ) IS
3193 
3194    --Define cursor for lines affected by notification
3195    --Note that Invoice_Key s/b the same for all records in the cursor
3196    --but I want to avoid another select on the table
3197    CURSOR   Items_Cur(itemkey IN VARCHAR2) IS
3198    SELECT invap.Item_Class, invap.Item_Id, invap.Role_Name,
3199           invap.Invoice_Key, al.line_number, al.amount
3200    FROM   AP_APINV_APPROVERS invap, AP_INVOICE_LINES_ALL al
3201    WHERE  invap.Notification_Key = itemkey
3202    AND    al.line_number = invap.line_number
3203    AND    al.invoice_id  = invap.invoice_id;
3204 
3205    l_api_name      CONSTANT VARCHAR2(200) := 'process_lines_rejection';
3206    l_invoice_id    NUMBER;
3207    l_level         VARCHAR2(20);
3208    l_result        VARCHAR2(20);
3209    l_invoice_key   VARCHAR2(50);
3210    l_name          AP_APINV_APPROVERS.ROLE_NAME%TYPE;
3211    l_item_class    AP_APINV_APPROVERS.ITEM_CLASS%TYPE;
3212    l_item_id       AP_APINV_APPROVERS.ITEM_ID%TYPE;
3213    l_debug_info    VARCHAR2(2000);
3214    l_user_id       NUMBER(15);
3215    l_login_id      NUMBER(15);
3216    l_hist_rec      AP_INV_APRVL_HIST%ROWTYPE;
3217    l_approver_name VARCHAR2(150);
3218    l_approver_id   NUMBER;
3219    l_esc_flag      VARCHAR2(1);
3220    l_esc_approver_name VARCHAR2(150);
3221    l_role_name     VARCHAR2(150);
3222    l_role VARCHAR2(150);
3223    l_esc_role_name VARCHAR2(150);
3224    l_esc_approver_id   NUMBER;
3225    l_line_total     NUMBER;
3226    l_iteration     NUMBER(15);
3227    l_comments      VARCHAR2(240);
3228    l_org_id        NUMBER(15);
3229    l_line_number   ap_invoice_lines_all.line_number%TYPE;
3230    l_line_amount   ap_invoice_lines_all.amount%TYPE;
3231    l_notf_iteration        NUMBER;
3232 
3233 
3234 
3235 BEGIN
3236    l_debug_info := 'Start';
3237    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3238           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3239                          l_api_name,l_debug_info);
3240    END IF;
3241    l_invoice_id := WF_ENGINE.GetItemAttrNumber(itemtype,
3242                                   itemkey,
3243                                   'INVOICE_ID');
3244 
3245    l_iteration := WF_ENGINE.GetItemAttrNumber(itemtype,
3246                              itemkey,
3247                              'ITERATION');
3248 
3249    l_comments := WF_ENGINE.GetItemAttrText(itemtype,
3250                              itemkey,
3251                              'WF_NOTE');
3252 
3253    l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
3254                    itemkey,
3255                    'ORG_ID');
3256 
3257    l_approver_name := WF_ENGINE.GetItemAttrText(itemtype,
3258                              itemkey,
3259                              'APPROVER_NAME');
3260 
3261    l_esc_role_name := WF_ENGINE.GetItemAttrText(itemtype,
3262                              itemkey,
3263                              'ESC_ROLE_NAME');
3264 
3265    l_role_name := WF_ENGINE.GetItemAttrText(itemtype,
3266                              itemkey,
3267                              'ROLE_NAME');
3268 
3269    l_approver_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
3270                    itemkey,
3271                    'APPROVER_ID');
3272 
3273    l_esc_flag  := WF_ENGINE.GetItemAttrText(itemtype,
3274                              itemkey,
3275                              'ESCALATED');
3276    l_esc_approver_name := WF_ENGINE.GetItemAttrText(itemtype,
3277                              itemkey,
3278                              'ESC_APPROVER_NAME');
3279 
3280    l_esc_approver_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
3281                    itemkey,
3282                    'ESC_APPROVER_ID');
3283 
3284    l_notf_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
3285                         itemkey,
3286                         'NOTF_ITERATION');
3287 
3288    l_user_id := nvl(to_number(fnd_profile.value('USER_ID')),-1);
3289    l_login_id := nvl(to_number(fnd_profile.value('LOGIN_ID')),-1);
3290    IF nvl(l_esc_flag,'N') = 'N' THEN
3291       l_role := l_role_name;
3292    ELSE
3293       l_role := l_esc_role_name;
3294    END IF;
3295 
3296    l_debug_info := 'Before Update Approvers table';
3297    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3298           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3299                          l_api_name,l_debug_info);
3300    END IF;
3301    --Update Approvers table
3302    UPDATE AP_APINV_APPROVERS
3303    SET Notification_status = 'COMP'
3304    WHERE Notification_Key = itemkey;
3305 
3306    fnd_client_info.set_org_context(l_org_id);
3307 
3308    l_hist_rec.HISTORY_TYPE := 'LINESAPPROVAL';
3309    l_hist_rec.INVOICE_ID   := l_invoice_id;
3310    l_hist_rec.ITERATION    := l_iteration;
3311    l_hist_rec.NOTIFICATION_ORDER := l_notf_iteration;
3312    l_hist_rec.APPROVER_COMMENTS := l_comments;
3313    l_hist_rec.RESPONSE     := 'REJECT';
3314    IF nvl(l_esc_flag,'N') = 'N' THEN
3315       l_hist_rec.APPROVER_ID  := l_approver_id;
3316       l_hist_rec.APPROVER_NAME:= l_approver_name;
3317    ELSE
3318       l_hist_rec.APPROVER_ID  := l_esc_approver_id;
3319       l_hist_rec.APPROVER_NAME:= l_esc_approver_name;
3320    END IF;
3321    l_hist_rec.APPROVER_COMMENTS := l_comments;
3322    l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
3323    l_hist_rec.CREATION_DATE:= sysdate;
3324    l_hist_rec.LAST_UPDATE_DATE := sysdate;
3325    l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
3326    l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
3327    l_hist_rec.ORG_ID            := l_org_id;
3328    --update AME status
3329    --For Future  check with ame as to when updateApprovalStatuses will be
3330    --available so there  will not be a need to loop.
3331    OPEN Items_Cur(itemkey);
3332    LOOP
3333 
3334       FETCH Items_Cur INTO l_item_class, l_item_id, l_name,
3335                                    l_invoice_key,l_line_number, l_line_amount;
3336       EXIT WHEN Items_Cur%NOTFOUND OR Items_Cur%NOTFOUND IS NULL;
3337 
3338       --update AME with response
3339       AME_API2.updateApprovalStatus2(applicationIdIn => 200,
3340                            transactionIdIn     => to_char(l_invoice_id),
3341                            approvalStatusIn    => AME_UTIL.rejectStatus,
3342                            approverNameIn  => l_name,
3343                            transactionTypeIn =>  'APINV',
3344                            itemClassIn     => l_item_class,
3345                            itemIdIn        => l_item_id);
3346       l_hist_rec.line_number   := l_line_number;
3347       l_hist_rec.AMOUNT_APPROVED   := l_line_amount;
3348 
3349       l_debug_info := 'Before calling insert_history_table for Line'
3350                        || l_line_number;
3351       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3352              FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3353                             l_api_name,l_debug_info);
3354       END IF;
3355 
3356       insert_history_table(p_hist_rec => l_hist_rec);
3357    END LOOP;
3358    CLOSE Items_Cur;
3359 
3360 
3361    l_user_id := nvl(to_number(fnd_profile.value('USER_ID')),-1);
3362    l_login_id := nvl(to_number(fnd_profile.value('LOGIN_ID')),-1);
3363    UPDATE AP_INVOICE_LINES
3364    SET    wfapproval_status = 'REJECTED'
3365           ,Last_Update_Date = sysdate
3366           ,Last_Updated_By = l_user_id
3367           ,Last_Update_Login = l_login_id
3368    WHERE invoice_id = l_invoice_id
3369    AND wfapproval_status <> 'MANUALLY APPROVED'
3370    AND line_number in (SELECT line_number
3371                        FROM ap_apinv_approvers
3372                        WHERE notification_key = itemkey);
3373    BEGIN
3374 
3375       SELECT invoice_key
3376       INTO   l_invoice_key
3377       FROM   AP_APINV_APPROVERS
3378       WHERE  Notification_Key = itemkey
3379       AND    rownum = 1;
3380    EXCEPTION
3381       WHEN NO_DATA_FOUND THEN
3382          l_debug_info := 'No Data Found in SELECT from AP_APINV_APPROVERS' ;
3383       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3384              FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3385                             l_api_name,l_debug_info);
3386       END IF;
3387       RAISE;
3388 
3389    END;
3390    l_debug_info := 'Before CompleteActivity APPROVAL_MAIN:BLOCK' ||
3391                    'l_invoice_key = ' || l_invoice_key;
3392    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3393           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3394                          l_api_name,l_debug_info);
3395    END IF;
3396    wf_engine.CompleteActivity(
3397                         itemType => 'APINVAPR',
3398                         itemKey  => l_invoice_key,
3399                         activity => 'APPROVAL_MAIN:BLOCK',
3400                         result   => 'NULL');
3401 
3402    l_debug_info := 'End';
3403    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3404           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3405                          l_api_name,l_debug_info);
3406    END IF;
3407    resultout := wf_engine.eng_completed||':'||'Y';
3408 EXCEPTION
3409 
3410 WHEN OTHERS
3411    THEN
3412         WF_CORE.CONTEXT('APINVAPR','process_lines_rejection',itemtype,
3413                         itemkey, to_char(actid), funcmode);
3414         RAISE;
3415 END process_lines_rejection;
3416 PROCEDURE process_lines_approval(itemtype IN VARCHAR2,
3417                         itemkey IN VARCHAR2,
3418                         actid   IN NUMBER,
3419                         funcmode IN VARCHAR2,
3420                         resultout  OUT NOCOPY VARCHAR2 ) IS
3421 
3422    --Define cursor for lines affected by notification
3423    --Note that Invoice_Key s/b the same for all records in the cursor
3424    --but I want to avoid another select on the table
3425    CURSOR   Items_Cur(itemkey IN VARCHAR2) IS
3426    SELECT invap.Item_Class, invap.Item_Id, invap.Role_Name,
3427           invap.Invoice_Key, al.line_number, al.amount
3428    FROM   AP_APINV_APPROVERS invap, AP_INVOICE_LINES_ALL al
3429    WHERE  invap.Notification_Key = itemkey
3430    AND    al.line_number = invap.line_number
3431    AND    al.invoice_id  = invap.invoice_id;
3432 
3433    l_api_name      CONSTANT VARCHAR2(200) := 'process_lines_approval';
3434    l_invoice_id    NUMBER;
3435    l_level         VARCHAR2(20);
3436    l_result        VARCHAR2(20);
3437    l_invoice_key   VARCHAR2(50);
3438    l_name          AP_APINV_APPROVERS.ROLE_NAME%TYPE;
3439    l_item_class    AP_APINV_APPROVERS.ITEM_CLASS%TYPE;
3440    l_item_id       AP_APINV_APPROVERS.ITEM_ID%TYPE;
3441    l_debug_info    VARCHAR2(2000);
3442    l_user_id       NUMBER(15);
3443    l_login_id      NUMBER(15);
3444    l_hist_rec      AP_INV_APRVL_HIST%ROWTYPE;
3445    l_approver_name VARCHAR2(150);
3446    l_approver_id   NUMBER;
3447    l_esc_flag      VARCHAR2(1);
3448    l_esc_approver_name VARCHAR2(150);
3449    l_role_name     VARCHAR2(150);
3450    l_role VARCHAR2(150);
3451    l_esc_role_name VARCHAR2(150);
3452    l_esc_approver_id   NUMBER;
3453    l_line_total     NUMBER;
3454    l_iteration     NUMBER(15);
3455    l_comments      VARCHAR2(240);
3456    l_org_id        NUMBER(15);
3457    l_line_number   ap_invoice_lines_all.line_number%TYPE;
3458    l_line_amount   ap_invoice_lines_all.amount%TYPE;
3459    l_notf_iteration        NUMBER;
3460 
3461 
3462 
3463 BEGIN
3464    l_debug_info := 'Start';
3465    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3466           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3467                          l_api_name,l_debug_info);
3468    END IF;
3469    l_invoice_id := WF_ENGINE.GetItemAttrNumber(itemtype,
3470                                   itemkey,
3471                                   'INVOICE_ID');
3472 
3473    l_iteration := WF_ENGINE.GetItemAttrNumber(itemtype,
3474                              itemkey,
3475                              'ITERATION');
3476 
3477    l_notf_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
3478                         itemkey,
3479                         'NOTF_ITERATION');
3480 
3481    l_comments := WF_ENGINE.GetItemAttrText(itemtype,
3482                              itemkey,
3483                              'WF_NOTE');
3484 
3485    l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
3486                    itemkey,
3487                    'ORG_ID');
3488 
3489    l_approver_name := WF_ENGINE.GetItemAttrText(itemtype,
3490                              itemkey,
3491                              'APPROVER_NAME');
3492 
3493    l_esc_role_name := WF_ENGINE.GetItemAttrText(itemtype,
3494                              itemkey,
3495                              'ESC_ROLE_NAME');
3496 
3497    l_role_name := WF_ENGINE.GetItemAttrText(itemtype,
3498                              itemkey,
3499                              'ROLE_NAME');
3500 
3501    l_approver_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
3502                    itemkey,
3503                    'APPROVER_ID');
3504 
3505    l_esc_flag  := WF_ENGINE.GetItemAttrText(itemtype,
3506                              itemkey,
3507                              'ESCALATED');
3508    l_esc_approver_name := WF_ENGINE.GetItemAttrText(itemtype,
3509                              itemkey,
3510                              'ESC_APPROVER_NAME');
3511 
3512    l_esc_approver_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
3513                    itemkey,
3514                    'ESC_APPROVER_ID');
3515 	/*-- added for the delegation enhancement
3516 	  l_role_name      :=WF_ENGINE.GetItemAttrText(itemtype,
3517                                     itemkey,
3518                                     'ROLE_ACTUAL');
3519    l_esc_role_actual := WF_ENGINE.GetItemAttrText(itemtype,
3520                                             itemkey,
3521                                             'ESC_ROLE_ACTUAL');
3522 -- added for the delegation enhancement
3523 
3524    l_user_id := nvl(to_number(fnd_profile.value('USER_ID')),-1);
3525    l_login_id := nvl(to_number(fnd_profile.value('LOGIN_ID')),-1);
3526    IF nvl(l_esc_flag,'N') = 'N' THEN
3527       l_role := l_role_name; -- added for the delegation enhancement
3528       --l_role := l_document_approver;
3529    ELSE
3530       l_role := l_esc_role_actual ;
3531       --l_role := l_esc_role_name;
3532    END IF;  */
3533 
3534    l_user_id := nvl(to_number(fnd_profile.value('USER_ID')),-1);
3535    l_login_id := nvl(to_number(fnd_profile.value('LOGIN_ID')),-1);
3536    IF nvl(l_esc_flag,'N') = 'N' THEN
3537       l_role := l_role_name;
3538    ELSE
3539       l_role := l_esc_role_name;
3540    END IF;
3541 
3542    l_debug_info := 'Before Update Approvers table';
3543    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3544           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3545                          l_api_name,l_debug_info);
3546    END IF;
3547    --Update Approvers table
3548    UPDATE AP_APINV_APPROVERS
3549    SET Notification_status = 'COMP'
3550    WHERE Notification_Key = itemkey;
3551 
3552    fnd_client_info.set_org_context(l_org_id);
3553 
3554    l_hist_rec.HISTORY_TYPE := 'LINESAPPROVAL';
3555    l_hist_rec.INVOICE_ID   := l_invoice_id;
3556    l_hist_rec.ITERATION    := l_iteration;
3557    l_hist_rec.NOTIFICATION_ORDER := l_notf_iteration;
3558    l_hist_rec.APPROVER_COMMENTS := l_comments;
3559    l_hist_rec.RESPONSE     := 'APPROVED';
3560    IF nvl(l_esc_flag,'N') = 'N' THEN
3561       l_hist_rec.APPROVER_ID  := l_approver_id;
3562       l_hist_rec.APPROVER_NAME:= l_approver_name;
3563    ELSE
3564       l_hist_rec.APPROVER_ID  := l_esc_approver_id;
3565       l_hist_rec.APPROVER_NAME:= l_esc_approver_name;
3566    END IF;
3567    l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
3568    l_hist_rec.CREATION_DATE:= sysdate;
3569    l_hist_rec.LAST_UPDATE_DATE := sysdate;
3570    l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
3571    l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
3572    l_hist_rec.ORG_ID            := l_org_id;
3573    --update AME status
3574    --For Future  check with ame as to when updateApprovalStatuses will be
3575    --available so there  will not be a need to loop.
3576    OPEN Items_Cur(itemkey);
3577    LOOP
3578 
3579       FETCH Items_Cur INTO l_item_class, l_item_id, l_name,
3580                                    l_invoice_key,l_line_number, l_line_amount;
3581       EXIT WHEN Items_Cur%NOTFOUND OR Items_Cur%NOTFOUND IS NULL;
3582 
3583       --update AME with response
3584       AME_API2.updateApprovalStatus2(applicationIdIn => 200,
3585                            transactionIdIn     => to_char(l_invoice_id),
3586                            approvalStatusIn    => AME_UTIL.approvedStatus,
3587                            approverNameIn  => l_name,
3588                            transactionTypeIn =>  'APINV',
3589                            itemClassIn     => l_item_class,
3590                            itemIdIn        => l_item_id);
3591       l_hist_rec.line_number   := l_line_number;
3592       l_hist_rec.AMOUNT_APPROVED   := l_line_amount;
3593 
3594       l_debug_info := 'Before calling insert_history_table for Line'
3595                        || l_line_number;
3596       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3597              FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3598                             l_api_name,l_debug_info);
3599       END IF;
3600 
3601       insert_history_table(p_hist_rec => l_hist_rec);
3602    END LOOP;
3603    CLOSE Items_Cur;
3604 
3605 
3606    l_user_id := nvl(to_number(fnd_profile.value('USER_ID')),-1);
3607    l_login_id := nvl(to_number(fnd_profile.value('LOGIN_ID')),-1);
3608    BEGIN
3609 
3610       SELECT invoice_key
3611       INTO   l_invoice_key
3612       FROM   AP_APINV_APPROVERS
3613       WHERE  Notification_Key = itemkey
3614       AND    rownum = 1;
3615    EXCEPTION
3616       WHEN NO_DATA_FOUND THEN
3617          l_debug_info := 'No Data Found in SELECT from AP_APINV_APPROVERS' ;
3618       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3619              FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3620                             l_api_name,l_debug_info);
3621       END IF;
3622       RAISE;
3623 
3624    END;
3625 
3626    l_debug_info := 'Before CompleteActivity APPROVAL_MAIN:BLOCK' ||
3627                    'l_invoice_key = ' || l_invoice_key;
3628    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3629           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3630                          l_api_name,l_debug_info);
3631    END IF;
3632    wf_engine.CompleteActivity(
3633                         itemType => 'APINVAPR',
3634                         itemKey  => l_invoice_key,
3635                         activity => 'APPROVAL_MAIN:BLOCK',
3636                         result   => 'NULL');
3637 
3638    l_debug_info := 'End';
3639    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3640           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3641                          l_api_name,l_debug_info);
3642    END IF;
3643    resultout := wf_engine.eng_completed||':'||'Y';
3644 EXCEPTION
3645 
3646 WHEN OTHERS
3647    THEN
3648         WF_CORE.CONTEXT('APINVAPR','process_lines_approval',itemtype,
3649                         itemkey, to_char(actid), funcmode);
3650         RAISE;
3651 END process_lines_approval;
3652 
3653 PROCEDURE set_document_approver(itemtype IN VARCHAR2,
3654                         itemkey IN VARCHAR2,
3655                         actid   IN NUMBER,
3656                         funcmode IN VARCHAR2,
3657                         resultout  OUT NOCOPY VARCHAR2 ) IS
3658 
3659 BEGIN
3660    resultout := wf_engine.eng_completed||':'||'Y';
3661 EXCEPTION
3662 
3663 WHEN OTHERS
3664    THEN
3665         WF_CORE.CONTEXT('APINVAPR','set_document_approver',itemtype,
3666                         itemkey, to_char(actid), funcmode);
3667         RAISE;
3668 END set_document_approver;
3669 
3670 PROCEDURE set_lines_approver(itemtype IN VARCHAR2,
3671                         itemkey IN VARCHAR2,
3672                         actid   IN NUMBER,
3673                         funcmode IN VARCHAR2,
3674                         resultout  OUT NOCOPY VARCHAR2 ) IS
3675 
3676 BEGIN
3677    resultout := wf_engine.eng_completed||':'||'Y';
3678 EXCEPTION
3679 
3680 WHEN OTHERS
3681    THEN
3682         WF_CORE.CONTEXT('APINVAPR','set_lines_approver',itemtype,
3683                         itemkey, to_char(actid), funcmode);
3684         RAISE;
3685 END set_lines_approver;
3686 
3687 /*
3688 APINVNEG - AP Invoice Approval Negotiation
3689 */
3690 
3691 PROCEDURE get_last_approver(itemtype IN VARCHAR2,
3692                         itemkey IN VARCHAR2,
3693                         actid   IN NUMBER,
3694                         funcmode IN VARCHAR2,
3695                         resultout  OUT NOCOPY VARCHAR2 ) IS
3696 
3697 BEGIN
3698    resultout := wf_engine.eng_completed||':'||'Y';
3699 EXCEPTION
3700 
3701 WHEN OTHERS
3702    THEN
3703         WF_CORE.CONTEXT('APINVNEG','get_last_approver',itemtype,
3704                         itemkey, to_char(actid), funcmode);
3705         RAISE;
3706 END get_last_approver;
3707 PROCEDURE aprvl_get_supplier_contact(itemtype IN VARCHAR2,
3708                         itemkey IN VARCHAR2,
3709                         actid   IN NUMBER,
3710                         funcmode IN VARCHAR2,
3711                         resultout  OUT NOCOPY VARCHAR2 ) IS
3712 
3713 BEGIN
3714    resultout := wf_engine.eng_completed||':'||'Y';
3715 EXCEPTION
3716 
3717 WHEN OTHERS
3718    THEN
3719         WF_CORE.CONTEXT('APINVNEG','aprvl_get_supplier_contact',itemtype,
3720                         itemkey, to_char(actid), funcmode);
3721         RAISE;
3722 END aprvl_get_supplier_contact;
3723 
3724 PROCEDURE aprvl_process_accept_ext(itemtype IN VARCHAR2,
3725                         itemkey IN VARCHAR2,
3726                         actid   IN NUMBER,
3727                         funcmode IN VARCHAR2,
3728                         resultout  OUT NOCOPY VARCHAR2 ) IS
3729    l_api_name      CONSTANT VARCHAR2(200) := 'aprvl_process_accept_ext';
3730    l_invoice_id    NUMBER;
3731    l_level         VARCHAR2(20);
3732    l_result        VARCHAR2(20);
3733    l_invoice_key   VARCHAR2(50);
3734    l_name          AP_APINV_APPROVERS.ROLE_NAME%TYPE;
3735    l_item_class    AP_APINV_APPROVERS.ITEM_CLASS%TYPE;
3736    l_item_id       AP_APINV_APPROVERS.ITEM_ID%TYPE;
3737    l_debug_info    VARCHAR2(2000);
3738    l_user_id       NUMBER(15);
3739    l_login_id      NUMBER(15);
3740    l_hist_rec      AP_INV_APRVL_HIST%ROWTYPE;
3741    l_approver_name VARCHAR2(150);
3742    l_approver_id   NUMBER;
3743    l_role_name     VARCHAR2(150);
3744    l_role VARCHAR2(150);
3745    l_supplier_name VARCHAR2(150);
3746    l_supplier_role VARCHAR2(150);
3747    l_supplier_person_id   NUMBER;
3748    l_line_total     NUMBER;
3749    l_iteration     NUMBER(15);
3750    l_comments      VARCHAR2(240);
3751    l_org_id        NUMBER(15);
3752    l_line_number   ap_invoice_lines_all.line_number%TYPE;
3753    l_line_amount   ap_invoice_lines_all.amount%TYPE;
3754    l_parent_key    VARCHAR2(150);
3755    l_notf_iteration        NUMBER;
3756    l_curr_calling_sequence  VARCHAR2(2000);
3757    l_invoice_type_lookup_code ap_invoices_all.invoice_type_lookup_code%TYPE;
3758 
3759 BEGIN
3760 
3761    l_curr_calling_sequence
3762              := 'AP_WORKFLOW_PKG.aprvl_process_accept_ext';
3763    l_debug_info := 'Start';
3764    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3765           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3766                          l_api_name,l_debug_info);
3767    END IF;
3768    l_invoice_id := WF_ENGINE.GetItemAttrNumber(itemtype,
3769                                   itemkey,
3770                                   'INVOICE_ID');
3771 
3772    l_iteration := WF_ENGINE.GetItemAttrNumber(itemtype,
3773                              itemkey,
3774                              'ITERATION');
3775 
3776    l_parent_key := WF_ENGINE.GetItemAttrText(itemtype,
3777                              itemkey,
3778                              'PARENT_KEY');
3779 
3780    l_comments := WF_ENGINE.GetItemAttrText(itemtype,
3781                              itemkey,
3782                              'WF_NOTE');
3783 
3784    l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
3785                    itemkey,
3786                    'ORG_ID');
3787 
3788    MO_GLOBAL.INIT ('SQLAP');
3789    MO_GLOBAL.set_policy_context('S',l_org_id);
3790 
3791 
3792    l_approver_name := WF_ENGINE.GetItemAttrText(itemtype,
3793                              itemkey,
3794                              'INTERNAL_REP_DISPLAY_NAME');
3795 
3796    l_role_name := WF_ENGINE.GetItemAttrText(itemtype,
3797                              itemkey,
3798                              'INTERNAL_REP_ROLE');
3799 
3800    l_approver_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
3801                    itemkey,
3802                    'INTERNAL_REP_PERSON_ID');
3803 
3804 
3805    l_supplier_name := WF_ENGINE.GetItemAttrText(itemtype,
3806                              itemkey,
3807                              'SUPPLIER_DISPLAY_NAME');
3808 
3809    l_supplier_role := WF_ENGINE.GetItemAttrText(itemtype,
3810                              itemkey,
3811                              'SUPPLIER_ROLE');
3812 
3813    l_supplier_person_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
3814                              itemkey,
3815                              'SUPPLIER_PERSON_ID');
3816 
3817    l_notf_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
3818                         itemkey,
3819                         'NOTF_ITERATION');
3820 
3821 
3822    l_user_id := nvl(to_number(fnd_profile.value('USER_ID')),-1);
3823    l_login_id := nvl(to_number(fnd_profile.value('LOGIN_ID')),-1);
3824 
3825 
3826    l_hist_rec.HISTORY_TYPE := 'DOCUMENTAPPROVAL';
3827    l_hist_rec.INVOICE_ID   := l_invoice_id;
3828    l_hist_rec.ITERATION    := l_iteration;
3829    l_hist_rec.NOTIFICATION_ORDER := l_notf_iteration;
3830    l_hist_rec.APPROVER_COMMENTS := l_comments;
3831    l_hist_rec.RESPONSE     := 'ACCEPT';
3832    l_hist_rec.APPROVER_ID  := l_supplier_person_id;
3833    l_hist_rec.APPROVER_NAME:= l_supplier_name;
3834    l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
3835    l_hist_rec.CREATION_DATE:= sysdate;
3836    l_hist_rec.LAST_UPDATE_DATE := sysdate;
3837    l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
3838    l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
3839    l_hist_rec.ORG_ID            := l_org_id;
3840    --update AME status
3841    --For Future  check with ame as to when updateApprovalStatuses will be
3842    --available so there  will not be a need to loop.
3843 
3844       --update AME with response
3845    /*
3846    AME_API2.updateApprovalStatus2(applicationIdIn => 200,
3847              transactionIdIn     => to_char(l_invoice_id),
3848              approvalStatusIn    => AME_UTIL.approvedStatus,
3849              approverNameIn  => l_role_name,
3850              transactionTypeIn =>  'APINV',
3851              itemClassIn     => ame_util.headerItemClassName,
3852              itemIdIn        => to_char(l_invoice_id));
3853    */
3854    l_hist_rec.AMOUNT_APPROVED   := null;
3855 
3856    l_debug_info := 'Before calling insert_history_table for Line'
3857                        || l_line_number;
3858    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3859       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3860                             l_api_name,l_debug_info);
3861    END IF;
3862    insert_history_table(p_hist_rec => l_hist_rec);
3863 
3864 
3865    l_debug_info := 'Before calling recreate_pay_scheds';
3866    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3867           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3868                          l_api_name,l_debug_info);
3869    END IF;
3870    SELECT invoice_type_lookup_code
3871    INTO   l_invoice_type_lookup_code
3872    FROM   AP_INVOICES_ALL
3873    WHERE  invoice_id = l_invoice_id;
3874    IF l_invoice_type_lookup_code IN ('INVOICE REQUEST'
3875                                     ,'CREDIT MEMO REQUEST') THEN
3876       recreate_pay_scheds(l_invoice_id,l_curr_calling_sequence);
3877    END IF;
3878 
3879    wf_engine.CompleteActivity(
3880                         itemType => 'APINVAPR',
3881                         itemKey  => l_parent_key,
3882                         activity => 'APPROVAL_INVOICE:DOCUMENT_APPROVAL_REQUEST',
3883                         result   => 'APPROVED');
3884 
3885    l_debug_info := 'End';
3886    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3887           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3888                          l_api_name,l_debug_info);
3889    END IF;
3890 
3891    resultout := wf_engine.eng_completed||':'||'Y';
3892 EXCEPTION
3893 
3894 WHEN OTHERS
3895    THEN
3896         WF_CORE.CONTEXT('APINVNEG','aprvl_process_accept_ext',itemtype,
3897                         itemkey, to_char(actid), funcmode);
3898         RAISE;
3899 END aprvl_process_accept_ext;
3900 
3901 PROCEDURE aprvl_process_accept_int(itemtype IN VARCHAR2,
3902                         itemkey IN VARCHAR2,
3903                         actid   IN NUMBER,
3904                         funcmode IN VARCHAR2,
3905                         resultout  OUT NOCOPY VARCHAR2 ) IS
3906    l_api_name      CONSTANT VARCHAR2(200) := 'aprvl_process_accept_int';
3907    l_invoice_id    NUMBER;
3908    l_level         VARCHAR2(20);
3909    l_result        VARCHAR2(20);
3910    l_invoice_key   VARCHAR2(50);
3911    l_name          AP_APINV_APPROVERS.ROLE_NAME%TYPE;
3912    l_item_class    AP_APINV_APPROVERS.ITEM_CLASS%TYPE;
3913    l_item_id       AP_APINV_APPROVERS.ITEM_ID%TYPE;
3914    l_debug_info    VARCHAR2(2000);
3915    l_user_id       NUMBER(15);
3916    l_login_id      NUMBER(15);
3917    l_hist_rec      AP_INV_APRVL_HIST%ROWTYPE;
3918    l_approver_name VARCHAR2(150);
3919    l_approver_id   NUMBER;
3920    l_role_name     VARCHAR2(150);
3921    l_role VARCHAR2(150);
3922    l_supplier_name VARCHAR2(150);
3923    l_supplier_role VARCHAR2(150);
3924    l_supplier_person_id   NUMBER;
3925    l_line_total     NUMBER;
3926    l_iteration     NUMBER(15);
3927    l_comments      VARCHAR2(240);
3928    l_org_id        NUMBER(15);
3929    l_line_number   ap_invoice_lines_all.line_number%TYPE;
3930    l_line_amount   ap_invoice_lines_all.amount%TYPE;
3931    l_parent_key    VARCHAR2(150);
3932    l_notf_iteration        NUMBER;
3933    l_curr_calling_sequence  VARCHAR2(2000);
3934    l_invoice_type_lookup_code ap_invoices_all.invoice_type_lookup_code%TYPE;
3935 
3936 BEGIN
3937    l_debug_info := 'Start';
3938    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3939           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
3940                          l_api_name,l_debug_info);
3941    END IF;
3942    l_curr_calling_sequence := 'AP_WORKFLOW_PKG.aprvl_process_accept_int';
3943    l_invoice_id := WF_ENGINE.GetItemAttrNumber(itemtype,
3944                                   itemkey,
3945                                   'INVOICE_ID');
3946 
3947    l_iteration := WF_ENGINE.GetItemAttrNumber(itemtype,
3948                              itemkey,
3949                              'ITERATION');
3950 
3951    l_parent_key := WF_ENGINE.GetItemAttrText(itemtype,
3952                              itemkey,
3953                              'PARENT_KEY');
3954 
3955    l_comments := WF_ENGINE.GetItemAttrText(itemtype,
3956                              itemkey,
3957                              'WF_NOTE');
3958 
3959    l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
3960                    itemkey,
3961                    'ORG_ID');
3962 
3963    MO_GLOBAL.INIT ('SQLAP');
3964    MO_GLOBAL.set_policy_context('S',l_org_id);
3965 
3966 
3967    l_approver_name := WF_ENGINE.GetItemAttrText(itemtype,
3968                              itemkey,
3969                              'INTERNAL_REP_DISPLAY_NAME');
3970 
3971    l_role_name := WF_ENGINE.GetItemAttrText(itemtype,
3972                              itemkey,
3973                              'INTERNAL_REP_ROLE');
3974 
3975    l_approver_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
3976                    itemkey,
3977                    'INTERNAL_REP_PERSON_ID');
3978 
3979 
3980    l_supplier_name := WF_ENGINE.GetItemAttrText(itemtype,
3981                              itemkey,
3982                              'SUPPLIER_DISPLAY_NAME');
3983 
3984    l_supplier_role := WF_ENGINE.GetItemAttrText(itemtype,
3985                              itemkey,
3986                              'SUPPLIER_ROLE');
3987 
3988    l_supplier_person_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
3989                              itemkey,
3990                              'SUPPLIER_PERSON_ID');
3991 
3992    l_notf_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
3993                         itemkey,
3994                         'NOTF_ITERATION');
3995 
3996 
3997    l_user_id := nvl(to_number(fnd_profile.value('USER_ID')),-1);
3998    l_login_id := nvl(to_number(fnd_profile.value('LOGIN_ID')),-1);
3999 
4000    l_hist_rec.HISTORY_TYPE := 'DOCUMENTAPPROVAL';
4001    l_hist_rec.INVOICE_ID   := l_invoice_id;
4002    l_hist_rec.ITERATION    := l_iteration;
4003    l_hist_rec.NOTIFICATION_ORDER := l_notf_iteration;
4004    l_hist_rec.APPROVER_COMMENTS := l_comments;
4005    l_hist_rec.RESPONSE     := 'ACCEPT';
4006    l_hist_rec.APPROVER_ID  := l_approver_id;
4007    l_hist_rec.APPROVER_NAME:= l_approver_name;
4008    l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
4009    l_hist_rec.CREATION_DATE:= sysdate;
4010    l_hist_rec.LAST_UPDATE_DATE := sysdate;
4011    l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
4012    l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
4013    l_hist_rec.ORG_ID            := l_org_id;
4014    --update AME status
4015    --For Future  check with ame as to when updateApprovalStatuses will be
4016    --available so there  will not be a need to loop.
4017 
4018 
4019    l_debug_info := 'Before calling recreate_pay_scheds';
4020    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4021           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
4022                          l_api_name,l_debug_info);
4023    END IF;
4024    SELECT invoice_type_lookup_code
4025    INTO   l_invoice_type_lookup_code
4026    FROM   AP_INVOICES_ALL
4027    WHERE  invoice_id = l_invoice_id;
4028    IF l_invoice_type_lookup_code IN ('INVOICE REQUEST'
4029                                     ,'CREDIT MEMO REQUEST') THEN
4030       recreate_pay_scheds(l_invoice_id,l_curr_calling_sequence);
4031    END IF;
4032    l_debug_info := 'End';
4033    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4034           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
4035                          l_api_name,l_debug_info);
4036    END IF;
4037    wf_engine.CompleteActivity(
4038                         itemType => 'APINVAPR',
4039                         itemKey  => l_parent_key,
4040                         activity => 'APPROVAL_INVOICE:DOCUMENT_APPROVAL_REQUEST',
4041                         result   => 'APPROVED');
4042 
4043    resultout := wf_engine.eng_completed||':'||'Y';
4044 EXCEPTION
4045 
4046 WHEN OTHERS
4047    THEN
4048         WF_CORE.CONTEXT('APINVNEG','aprvl_process_accept_int',itemtype,
4049                         itemkey, to_char(actid), funcmode);
4050         RAISE;
4051 END aprvl_process_accept_int;
4052 
4053 PROCEDURE aprvl_process_cancel_inv_sup(itemtype IN VARCHAR2,
4054                         itemkey IN VARCHAR2,
4055                         actid   IN NUMBER,
4056                         funcmode IN VARCHAR2,
4057                         resultout  OUT NOCOPY VARCHAR2 ) IS
4058 
4059    --Define cursor for lines affected by notification
4060    --Note that Invoice_Key s/b the same for all records in the cursor
4061    --but I want to avoid another select on the table
4062    CURSOR   Items_Cur(itemkey IN VARCHAR2) IS
4063    SELECT invap.Item_Class, invap.Item_Id, invap.Role_Name,
4064           invap.Invoice_Key, al.line_number, al.amount
4065    FROM   AP_APINV_APPROVERS invap, AP_INVOICE_LINES_ALL al
4066    WHERE  invap.child_process_item_key = itemkey
4067    AND    al.line_number = invap.line_number
4068    AND    al.invoice_id  = invap.invoice_id;
4069    l_api_name      CONSTANT VARCHAR2(200) := 'aprvl_process_cancel_inv_sup';
4070    l_invoice_id    NUMBER;
4071    l_level         VARCHAR2(20);
4072    l_invoice_key   VARCHAR2(50);
4073    l_name          AP_APINV_APPROVERS.ROLE_NAME%TYPE;
4074    l_item_class    AP_APINV_APPROVERS.ITEM_CLASS%TYPE;
4075    l_item_id       AP_APINV_APPROVERS.ITEM_ID%TYPE;
4076    l_debug_info    VARCHAR2(2000);
4077    l_user_id       NUMBER(15);
4078    l_login_id      NUMBER(15);
4079    l_hist_rec      AP_INV_APRVL_HIST%ROWTYPE;
4080    l_approver_name VARCHAR2(150);
4081    l_approver_id   NUMBER;
4082    l_role_name     VARCHAR2(150);
4083    l_role VARCHAR2(150);
4084    l_supplier_name VARCHAR2(150);
4085    l_supplier_role VARCHAR2(150);
4086    l_supplier_person_id   NUMBER;
4087    l_line_total     NUMBER;
4088    l_iteration     NUMBER(15);
4089    l_comments      VARCHAR2(240);
4090    l_org_id        NUMBER(15);
4091    l_line_number   ap_invoice_lines_all.line_number%TYPE;
4092    l_line_amount   ap_invoice_lines_all.amount%TYPE;
4093    l_parent_key    VARCHAR2(150);
4094    l_result                BOOLEAN;
4095    l_last_updated_by number;
4096    l_last_update_login number;
4097    l_accounting_date date;
4098    l_message_name varchar2(30);
4099    l_invoice_amount number;
4100    l_base_amount number;
4101    l_temp_cancelled_amount number;
4102    l_cancelled_by number;
4103    l_cancelled_amount number;
4104    l_cancelled_date date;
4105    l_last_update_date date;
4106    l_original_prepayment_amount number;
4107    l_pay_curr_invoice_amount number;
4108    l_token varchar2(30);
4109    l_notf_iteration        NUMBER;
4110 
4111    cursor invoice is
4112                 select  gl_date,
4113                         last_updated_by,
4114                         last_update_login
4115                 from    ap_invoices_all
4116                 where   invoice_id = l_invoice_id
4117                 and     org_id = l_org_id;
4118 BEGIN
4119 
4120    l_debug_info := 'Start';
4121    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4122           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
4123                          l_api_name,l_debug_info);
4124    END IF;
4125    l_invoice_id := WF_ENGINE.GetItemAttrNumber(itemtype,
4126                                   itemkey,
4127                                   'INVOICE_ID');
4128 
4129    l_iteration := WF_ENGINE.GetItemAttrNumber(itemtype,
4130                              itemkey,
4131                              'ITERATION');
4132 
4133    l_parent_key := WF_ENGINE.GetItemAttrText(itemtype,
4134                              itemkey,
4135                              'PARENT_KEY');
4136 
4137    l_comments := WF_ENGINE.GetItemAttrText(itemtype,
4138                              itemkey,
4139                              'WF_NOTE');
4140 
4141    l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
4142                    itemkey,
4143                    'ORG_ID');
4144 
4145    MO_GLOBAL.INIT ('SQLAP');
4146    MO_GLOBAL.set_policy_context('S',l_org_id);
4147 
4148 
4149    l_approver_name := WF_ENGINE.GetItemAttrText(itemtype,
4150                              itemkey,
4151                              'INTERNAL_REP_DISPLAY_NAME');
4152 
4153    l_role_name := WF_ENGINE.GetItemAttrText(itemtype,
4154                              itemkey,
4155                              'INTERNAL_REP_ROLE');
4156 
4157    l_approver_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
4158                    itemkey,
4159                    'INTERNAL_REP_PERSON_ID');
4160 
4161 
4162    l_supplier_name := WF_ENGINE.GetItemAttrText(itemtype,
4163                              itemkey,
4164                              'INTERNAL_REP_DISPLAY_NAME');
4165 
4166    l_supplier_role := WF_ENGINE.GetItemAttrText(itemtype,
4167                              itemkey,
4168                              'INTERNAL_REP_ROLE');
4169 
4170    l_supplier_person_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
4171                              itemkey,
4172                              'INTERNAL_REP_PERSON_ID');
4173 
4174    l_notf_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
4175                         itemkey,
4176                         'NOTF_ITERATION');
4177 
4178 
4179    l_user_id := nvl(to_number(fnd_profile.value('USER_ID')),-1);
4180    l_login_id := nvl(to_number(fnd_profile.value('LOGIN_ID')),-1);
4181 
4182    l_debug_info := 'Before Update Approvers table';
4183    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4184           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
4185                          l_api_name,l_debug_info);
4186    END IF;
4187 
4188    l_debug_info := 'Before Ap_Cancel_Single_Invoice';
4189    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4190           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
4191                          l_api_name,l_debug_info);
4192    END IF;
4193 
4194 
4195    l_hist_rec.HISTORY_TYPE := 'LINESNEGOTIATION';
4196    l_hist_rec.INVOICE_ID   := l_invoice_id;
4197    l_hist_rec.ITERATION    := l_iteration;
4198    l_hist_rec.NOTIFICATION_ORDER := l_notf_iteration;
4199    l_hist_rec.APPROVER_COMMENTS := l_comments;
4200    l_hist_rec.RESPONSE     := 'CANCEL';
4201    l_hist_rec.APPROVER_ID  := l_approver_id;
4202    l_hist_rec.APPROVER_NAME:= l_approver_name;
4203    l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
4204    l_hist_rec.CREATION_DATE:= sysdate;
4205    l_hist_rec.LAST_UPDATE_DATE := sysdate;
4206    l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
4207    l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
4208    l_hist_rec.ORG_ID            := l_org_id;
4209    --update AME status
4210    --For Future  check with ame as to when updateApprovalStatuses will be
4211    --available so there  will not be a need to loop.
4212 
4213    /* Not needed since we are completing the parent activity
4214    --update AME with response
4215    AME_API2.updateApprovalStatus2(applicationIdIn => 200,
4216              transactionIdIn     => to_char(l_invoice_id),
4217              approvalStatusIn    => AME_UTIL.rejectStatus,
4218              approverNameIn  => l_role_name,
4219              transactionTypeIn =>  'APINV',
4220              itemClassIn     => ame_util.headerItemClassName,
4221              itemIdIn        => to_char(l_invoice_id));
4222    */
4223    l_debug_info := 'Before calling insert_history_table for Line'
4224                        || l_line_number;
4225    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4226              FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
4227                             l_api_name,l_debug_info);
4228    END IF;
4229    insert_history_table(p_hist_rec => l_hist_rec);
4230 
4231    open invoice;
4232    fetch invoice into l_accounting_date, l_last_updated_by, l_last_update_login;
4233    close invoice;
4234 
4235 
4236    l_result := ap_cancel_pkg.ap_cancel_single_invoice(
4237                 l_invoice_id,
4238                 l_last_updated_by,
4239                 l_last_update_login,
4240                 sysdate,                                -- accounting_date
4241                 l_message_name,
4242                 l_invoice_amount,
4243                 l_base_amount,
4244                 l_temp_cancelled_amount,
4245                 l_cancelled_by,
4246                 l_cancelled_amount,
4247                 l_cancelled_date,
4248                 l_last_update_date,
4249                 l_original_prepayment_amount,
4250                 l_pay_curr_invoice_amount,
4251                 l_token,
4252                 null);
4253 
4254    wf_engine.CompleteActivity(
4255                         itemType => 'APINVAPR',
4256                         itemKey  => l_parent_key,
4257                         activity => 'APPROVAL_INVOICE:DOCUMENT_APPROVAL_REQUEST',
4258                         result   => 'REJECTED');
4259 
4260 
4261    l_debug_info := 'End';
4262    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4263           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
4264                          l_api_name,l_debug_info);
4265    END IF;
4266 
4267    resultout := wf_engine.eng_completed||':'||'Y';
4268 EXCEPTION
4269 
4270 WHEN OTHERS
4271    THEN
4272         WF_CORE.CONTEXT('APINVNEG','aprvl_process_cancel_inv_sup',itemtype,
4273                         itemkey, to_char(actid), funcmode);
4274         RAISE;
4275 END aprvl_process_cancel_inv_sup;
4276 PROCEDURE create_hold_neg_process(p_hold_id IN NUMBER,
4277                                   p_ext_contact_id IN NUMBER,
4278                                   parentkey IN VARCHAR2,
4279                                   childkey  IN VARCHAR2,
4280 				  int_ext_indicator IN VARCHAR2,
4281 				  newchildprocess OUT NOCOPY VARCHAR2) IS
4282 /*-----------------------------------------------------------------------+
4283  | Cursor Declarations                                                   |
4284  +-----------------------------------------------------------------------*/
4285 CURSOR csr_ap_hold_neg_details IS
4286 SELECT PV.vendor_name,
4287        AI.invoice_num,
4288        AI.invoice_date,
4289        AI.description,
4290        AI.org_id,
4291        AI.invoice_id,
4292        AI.approval_iteration,
4293        nvl(p_ext_contact_id, AI.vendor_contact_id),
4294        NVL(AI.invoice_amount, 0),
4295        ahc.hold_instruction
4296 FROM   ap_holds_all ah,
4297        ap_invoices_all AI,
4298        po_vendors PV,
4299        ap_hold_codes ahc
4300 WHERE  ah.hold_id = p_hold_id
4301 AND    AI.invoice_id = ah.invoice_id
4302 AND    AI.vendor_id = PV.vendor_id
4303 AND    AH.hold_lookup_code = AHC.hold_lookup_code;
4304 l_vendor_name po_vendors.vendor_name%TYPE;
4305 l_invoice_num ap_invoices_all.invoice_num%TYPE;
4306 l_invoice_date  ap_invoices_all.invoice_date%TYPE;
4307 l_invoice_description ap_invoices_all.description%TYPE;
4308 l_invoice_id ap_invoices_all.invoice_id%TYPE;
4309 l_org_id ap_invoices_all.org_id%TYPE;
4310 l_name                  VARCHAR2(30);
4311 l_display_name          VARCHAR2(150);
4312 l_role                  VARCHAR2(50);
4313 l_role_display          VARCHAR2(150);
4314 l_new_child_ItemKey     VARCHAR2(30);
4315 l_person_id             NUMBER(15);
4316 l_hist_rec              AP_INV_APRVL_HIST%ROWTYPE;
4317 l_notf_receipient_type  VARCHAR2(50);
4318 l_iteration             NUMBER;
4319 l_notf_iteration        NUMBER;
4320 l_ext_person_id         NUMBER(15);
4321 l_ext_user_id           NUMBER(15);
4322 l_hold_instr            ap_hold_codes.hold_instruction%TYPE;
4323 l_total                 ap_invoices_all.invoice_amount%TYPE;
4324 BEGIN
4325    l_notf_iteration := 1; /* For Now Hold Approval has only one round of
4326                              Approvers */
4327    SELECT AP_NEGOTIATION_HIST_S.nextval
4328    INTO   l_new_child_ItemKey
4329    FROM   dual;
4330 
4331    OPEN csr_ap_hold_neg_details;
4332    FETCH csr_ap_hold_neg_details INTO
4333          l_vendor_name,
4334 	 l_invoice_num,
4335 	 l_invoice_date,
4336 	 l_invoice_description,
4337 	 l_org_id,
4338 	 l_invoice_id,
4339 	 l_iteration,
4340 	 l_ext_user_id,
4341 	 l_total,
4342 	 l_hold_instr;
4343    CLOSE csr_ap_hold_neg_details;
4344 
4345    wf_engine.createProcess('APINVHNE', l_new_child_itemkey, 'HOLD_NEGOTIATION');
4346    WF_ENGINE.setItemParent('APINVHNE', l_new_child_itemkey,
4347 	                   'APINVHDN', parentkey, null);
4348    WF_ENGINE.SetItemAttrNumber('APINVHNE',
4349                         l_new_child_itemkey,
4350                         'HOLD_ID',
4351                         p_hold_id);
4352    WF_ENGINE.SetItemAttrNumber('APINVHNE',
4353                         l_new_child_itemkey,
4354                         'INVOICE_ID',
4355                         l_invoice_id);
4356    WF_ENGINE.SetItemAttrNumber('APINVHNE',
4357                         l_new_child_itemkey,
4358                         'ORG_ID',
4359                         l_org_id);
4360    WF_ENGINE.SetItemAttrNumber('APINVHNE',
4361                         l_new_child_itemkey,
4362                         'INVOICE_TOTAL',
4363                         l_total);
4364    WF_ENGINE.SetItemAttrText('APINVHNE',
4365                         l_new_child_itemkey,
4366                         'HOLD_INSTRUCTION',
4367                         l_hold_instr);
4368    WF_ENGINE.SetItemAttrText('APINVHNE',
4369                         l_new_child_itemkey,
4370                         'INVOICE_SUPPLIER_NAME',
4371                         l_vendor_name);
4372    WF_ENGINE.SetItemAttrText('APINVHNE',
4373                         l_new_child_itemkey,
4374                         'INVOICE_NUMBER',
4375                         l_invoice_num);
4376    WF_ENGINE.SetItemAttrDate('APINVHNE',
4377                         l_new_child_itemkey,
4378                         'INVOICE_DATE',
4379                         l_invoice_date);
4380    WF_ENGINE.SetItemAttrText('APINVHNE',
4381                         l_new_child_itemkey,
4382                         'INVOICE_DESCRIPTION',
4383                         l_invoice_description);
4384    WF_ENGINE.SetItemAttrText('APINVHNE',
4385                         l_new_child_itemkey,
4386                         'PARENT_KEY',
4387                         parentkey);
4388    WF_ENGINE.SetItemAttrText('APINVHNE',
4389                      l_new_child_itemkey,
4390                      'HOLD_TYPE',
4391                      WF_ENGINE.GETITEMATTRText('APINVHDN',
4392 		     parentkey,
4393 		     'HOLD_TYPE'));
4394 
4395    /* Current context is Internal or External
4396       If Current Context is Internal that means that the negotiation is going
4397       out to External supplier and if Current context is External then the
4398       negotiation is going out to the internal Rep. */
4399    IF int_ext_indicator = 'I' and l_ext_user_id IS NOT NULL THEN
4400 
4401       WF_DIRECTORY.GetRoleName('FND_USR',l_ext_user_id,l_role,
4402                                l_role_display);
4403       l_person_id := l_ext_user_id;
4404       WF_DIRECTORY.GetUserName('FND_USR',
4405                                 l_ext_user_id,
4406                                 l_name,
4407                                 l_display_name);
4408       WF_ENGINE.SetItemAttrText('APINVHNE',
4409                         l_new_child_itemkey,
4410                         'SUPPLIER_ROLE',
4411                         l_role);
4412       WF_ENGINE.SetItemAttrText('APINVHNE',
4413                                   l_new_child_itemkey,
4414                                   'SUPPLIER_DISPLAY_NAME',
4415                                   l_display_name);
4416       WF_ENGINE.SetItemAttrNumber('APINVHNE',
4417                         l_new_child_itemkey,
4418                         'SUPPLIER_PERSON_ID',
4419                         l_ext_user_id);
4420 
4421       WF_ENGINE.SetItemAttrText('APINVHNE',
4422                         l_new_child_itemkey,
4423                         'NOTF_RECEIPIENT_TYPE',
4424                         'EXTERNAL');
4425       WF_ENGINE.SetItemAttrText('APINVHNE',
4426                                   l_new_child_itemkey,
4427                                   'INTERNAL_REP_DISPLAY_NAME',
4428                                   WF_ENGINE.GETITEMATTRText('APINVHDN',
4429 				                             parentkey,
4430 						             'INTERNAL_REP_DISPLAY_NAME'));
4431       WF_ENGINE.SetItemAttrNumber('APINVHNE',
4432                                   l_new_child_itemkey,
4433                                   'INTERNAL_REP_PERSON_ID',
4434                                   WF_ENGINE.GETITEMATTRNumber('APINVHDN',
4435 				                             parentkey,
4436 						             'INTERNAL_REP_PERSON_ID'));
4437       WF_ENGINE.SetItemAttrText('APINVHNE',
4438                                   l_new_child_itemkey,
4439                                   'ORIG_SYSTEM',
4440                                   WF_ENGINE.GETITEMATTRText('APINVHDN',
4441 				                             parentkey,
4442 						             'ORIG_SYSTEM'));
4443       WF_ENGINE.SetItemAttrText('APINVHNE',
4444                                   l_new_child_itemkey,
4445                                   'INTERNAL_REP_ROLE',
4446                                   WF_ENGINE.GETITEMATTRText('APINVHDN',
4447 				                             parentkey,
4448 						             'INTERNAL_REP_ROLE'));
4449    ELSIF int_ext_indicator = 'E' THEN
4450 
4451       l_role := WF_ENGINE.GETITEMATTRText('APINVHDN',
4452                                           parentkey,
4453 			                  'INTERNAL_REP_ROLE');
4454       WF_ENGINE.SetItemAttrText('APINVHNE',
4455                         l_new_child_itemkey,
4456                         'INTERNAL_REP_ROLE',
4457                         l_role);
4458       WF_ENGINE.SetItemAttrText('APINVHNE',
4459                         l_new_child_itemkey,
4460                         'DISP_NOT_RECEIVER',
4461                         l_role);
4462       l_display_name := WF_ENGINE.GETITEMATTRText('APINVHDN',
4463                                           parentkey,
4464 			                  'INTERNAL_REP_DISPLAY_NAME');
4465       WF_ENGINE.SetItemAttrText('APINVHNE',
4466                                   l_new_child_itemkey,
4467                                   'INTERNAL_REP_DISPLAY_NAME',
4468                                   l_display_name);
4469       l_person_id := WF_ENGINE.GETITEMATTRNumber('APINVHDN',
4470                                           parentkey,
4471 			                  'INTERNAL_REP_PERSON_ID');
4472       WF_ENGINE.SetItemAttrNumber('APINVHNE',
4473                         l_new_child_itemkey,
4474                         'INTERNAL_REP_PERSON_ID',
4475                         l_person_id);
4476       WF_ENGINE.SetItemAttrText('APINVHNE',
4477                         l_new_child_itemkey,
4478                         'NOTF_RECEIPIENT_TYPE',
4479                         'INTERNAL');
4480       WF_ENGINE.SetItemAttrText('APINVHNE',
4481                                   l_new_child_itemkey,
4482                                   'ORIG_SYSTEM',
4483                                   WF_ENGINE.GETITEMATTRText('APINVHDN',
4484 				                             parentkey,
4485 						             'ORIG_SYSTEM'));
4486       WF_ENGINE.SetItemAttrText('APINVHNE',
4487                                   l_new_child_itemkey,
4488                                   'SUPPLIER_DISPLAY_NAME',
4489                                   WF_ENGINE.GETITEMATTRText('APINVHNE',
4490 				                             childkey,
4491 						             'SUPPLIER_DISPLAY_NAME'));
4492 
4493    END IF;
4494    WF_ENGINE.startProcess('APINVHNE', l_new_child_itemkey);
4495    MO_GLOBAL.INIT ('SQLAP');
4496    MO_GLOBAL.set_policy_context('S',l_org_id);
4497 
4498    -- Complete the previous negotiation process if any.
4499 
4500    IF childkey IS NOT NULL THEN
4501       l_notf_receipient_type :=  WF_ENGINE.GetItemAttrText('APINVHNE',
4502                                childkey,
4503                                'NOTF_RECEIPIENT_TYPE');
4504       IF l_notf_receipient_type = 'INTERNAL' THEN
4505 
4506           wf_engine.CompleteActivity(
4507                      itemType => 'APINVHNE',
4508                      itemKey  => childkey,
4509                      activity => 'HOLD_NEGOTIATION:WAITINTERNAL',
4510                      result   => 'NULL');
4511       ELSE
4512           wf_engine.CompleteActivity(
4513                      itemType => 'APINVHNE',
4514                      itemKey  => childkey,
4515                      activity => 'HOLD_NEGOTIATION:WAITEXTERNAL',
4516                      result   => 'NULL');
4517       END IF;
4518 
4519    END IF;
4520 
4521    l_hist_rec.HISTORY_TYPE := 'HOLDNEGOTIATION';
4522    l_hist_rec.INVOICE_ID   := l_invoice_id;
4523    l_hist_rec.ITERATION    := l_iteration;
4524    l_hist_rec.NOTIFICATION_ORDER := l_notf_iteration;
4525    l_hist_rec.RESPONSE     := 'SENT';
4526    l_hist_rec.APPROVER_ID  := l_person_id;
4527    l_hist_rec.APPROVER_NAME:= l_display_name;
4528    l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
4529    l_hist_rec.CREATION_DATE:= sysdate;
4530    l_hist_rec.LAST_UPDATE_DATE := sysdate;
4531    l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
4532    l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
4533    l_hist_rec.ORG_ID            := l_org_id;
4534    l_hist_rec.AMOUNT_APPROVED   := 0;
4535    l_hist_rec.HOLD_ID           := p_hold_id;
4536 
4537    insert_history_table(p_hist_rec => l_hist_rec);
4538    newchildprocess := l_new_child_itemkey;
4539 
4540    UPDATE ap_holds_all
4541    SET    wf_status = 'NEGOTIATE'
4542    WHERE  hold_id = p_hold_id;
4543 
4544 EXCEPTION
4545 
4546 WHEN OTHERS
4547    THEN
4548         RAISE;
4549 
4550 END create_hold_neg_process;
4551 
4552 PROCEDURE create_hold_wf_process(p_hold_id IN NUMBER) IS
4553 /*-----------------------------------------------------------------------+
4554  | Cursor Declarations                                                   |
4555  +-----------------------------------------------------------------------*/
4556 CURSOR csr_ap_hold_details IS
4557 SELECT PV.vendor_name,
4558        AI.invoice_num,
4559        AI.invoice_date,
4560        AI.description,
4561        AI.org_id,
4562        AI.invoice_id,
4563        alk.displayed_field,
4564        NVL(AI.invoice_amount, 0),
4565        ahc.hold_instruction
4566 FROM   ap_holds_all ah,
4567        ap_invoices_all AI,
4568        po_vendors PV,
4569        ap_lookup_codes alk,
4570        ap_hold_codes ahc
4571 WHERE  ah.hold_id = p_hold_id
4572 AND    alk.lookup_code = ah.hold_lookup_code
4573 AND    AI.invoice_id = ah.invoice_id
4574 AND    AI.vendor_id = PV.vendor_id
4575 AND    AH.hold_lookup_code = AHC.hold_lookup_code;
4576 l_vendor_name po_vendors.vendor_name%TYPE;
4577 l_invoice_num ap_invoices_all.invoice_num%TYPE;
4578 l_invoice_date  ap_invoices_all.invoice_date%TYPE;
4579 l_invoice_description ap_invoices_all.description%TYPE;
4580 l_invoice_id ap_invoices_all.invoice_id%TYPE;
4581 l_hold_type ap_lookup_codes.displayed_field%TYPE;
4582 l_org_id ap_invoices_all.org_id%TYPE;
4583 l_itemkey VARCHAR2(50);
4584 l_hold_instr            ap_hold_codes.hold_instruction%TYPE;
4585 l_total                 ap_invoices_all.invoice_amount%TYPE;
4586 
4587 BEGIN
4588    /* For the main process itemkey has to be hold_id */
4589    l_itemkey := p_hold_id;
4590 
4591    OPEN csr_ap_hold_details;
4592    FETCH csr_ap_hold_details INTO
4593          l_vendor_name,
4594          l_invoice_num,
4595          l_invoice_date,
4596          l_invoice_description,
4597          l_org_id,
4598          l_invoice_id,
4599 	 l_hold_type,
4600          l_total,
4601 	 l_hold_instr;
4602 
4603    CLOSE csr_ap_hold_details;
4604 
4605 
4606    wf_engine.createProcess('APINVHDN', l_itemkey, 'HOLD_MAIN');
4607    WF_ENGINE.SetItemAttrNumber('APINVHDN',
4608                         l_itemkey,
4609                         'INVOICE_ID',
4610                         l_invoice_id);
4611    WF_ENGINE.SetItemAttrNumber('APINVHDN',
4612                         l_itemkey,
4613                         'HOLD_ID',
4614                         p_hold_id);
4615    WF_ENGINE.SetItemAttrNumber('APINVHDN',
4616                         l_itemkey,
4617                         'ORG_ID',
4618                         l_org_id);
4619    WF_ENGINE.SetItemAttrNumber('APINVHDN',
4620                         l_itemkey,
4621                         'INVOICE_TOTAL',
4622                         l_total);
4623    WF_ENGINE.SetItemAttrText('APINVHDN',
4624                         l_itemkey,
4625                         'HOLD_INSTRUCTION',
4626                         l_hold_instr);
4627    WF_ENGINE.SetItemAttrText('APINVHDN',
4628                         l_itemkey,
4629                         'INVOICE_SUPPLIER_NAME',
4630                         l_vendor_name);
4631    WF_ENGINE.SetItemAttrText('APINVHDN',
4632                         l_itemkey,
4633                         'INVOICE_NUMBER',
4634                         l_invoice_num);
4635    WF_ENGINE.SetItemAttrDate('APINVHDN',
4636                         l_itemkey,
4637                         'INVOICE_DATE',
4638                         l_invoice_date);
4639    WF_ENGINE.SetItemAttrText('APINVHDN',
4640                         l_itemkey,
4641                         'INVOICE_DESCRIPTION',
4642                         l_invoice_description);
4643    WF_ENGINE.SetItemAttrText('APINVHDN',
4644                         l_itemkey,
4645                         'HOLD_TYPE',
4646                         l_hold_type);
4647    WF_ENGINE.SetItemAttrText('APINVHDN',
4648                         l_itemkey,
4649                         'PARENT_KEY',
4650                         l_itemkey);
4651    WF_ENGINE.startProcess('APINVHDN', l_itemkey);
4652 
4653    UPDATE ap_holds_all
4654    SET    wf_status = 'STARTED'
4655    WHERE  hold_id = p_hold_id;
4656 
4657 EXCEPTION
4658 
4659 WHEN OTHERS
4660    THEN
4661         RAISE;
4662 
4663 END create_hold_wf_process;
4664 PROCEDURE get_header_approver(itemtype IN VARCHAR2,
4665                         itemkey IN VARCHAR2,
4666                         actid   IN NUMBER,
4667                         funcmode IN VARCHAR2,
4668                         resultout  OUT NOCOPY VARCHAR2 ) IS
4669 l_admin_approver AME_UTIL.approverRecord;
4670 l_ret_approver VARCHAR2(50);
4671 l_name          VARCHAR2(30);
4672 l_display_name  VARCHAR2(150);
4673 l_debug_info    VARCHAR2(50);
4674 l_role          VARCHAR2(50);
4675 l_role_display  VARCHAR2(150);
4676 l_org_id        NUMBER(15);
4677 l_error_message               VARCHAR2(2000);
4678 l_invoice_id    NUMBER(15);
4679 l_iteration     NUMBER(9);
4680 l_count         NUMBER(9);
4681 l_hist_rec      AP_INV_APRVL_HIST%ROWTYPE;
4682 l_notf_iteration        NUMBER;
4683 l_complete              VARCHAR2(1);
4684 l_next_approvers        ame_util.approversTable2;
4685 l_next_approver         ame_util.approverRecord2;
4686 l_index                 ame_util.idList;
4687 l_ids                   ame_util.stringList;
4688 l_class                 ame_util.stringList;
4689 l_source                ame_util.longStringList;
4690 l_ampersand             varchar2(1);
4691 Cursor C_invoice (p_invoice_id IN ap_invoices_all.invoice_id%TYPE) IS
4692 SELECT invoice_type_lookup_code
4693       ,gl_date
4694       ,ap_utilities_pkg.get_gl_period_name(gl_date
4695                                           ,org_id)
4696 FROM   ap_invoices_all
4697 WHERE  invoice_id = p_invoice_id;
4698 l_invoice_type_lookup_code ap_invoices_all.invoice_type_lookup_code%TYPE;
4699 l_gl_date ap_invoices_all.gl_date%TYPE;
4700 l_new_gl_date ap_invoices_all.gl_date%TYPE;
4701 l_period_name ap_invoice_lines_all.period_name%TYPE;
4702 l_new_period_name ap_invoice_lines_all.period_name%TYPE;
4703 l_terms_id ap_invoices_all.terms_id%TYPE;
4704 l_terms_date ap_invoices_all.terms_date%TYPE;
4705 l_count_rejects number;
4706 l_inv_match_type VARCHAR2(80);
4707 
4708 BEGIN
4709 
4710    /* First Check if any of the lines got rejected. If so then
4711    Header status need to be set as Needs Reapproval and any lines
4712    in Initiated status need to be updated to Required. */
4713 
4714    l_invoice_id := substr(itemkey, 1, instr(itemkey,'_')-1);
4715    l_count_rejects := 0;
4716 
4717    SELECT count(*)
4718    into   l_count_rejects
4719    FROM   ap_invoice_lines_all
4720    WHERE  invoice_id = l_invoice_id
4721    AND    wfapproval_status = 'REJECTED';
4722 
4723    IF l_count_rejects = 0 THEN
4724    select '&'
4725    into   l_ampersand
4726    from   dual
4727    where  1 like 1 escape '&';
4728    l_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
4729                         itemkey,
4730                         'ITERATION');
4731 
4732    l_notf_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
4733                         itemkey,
4734                         'NOTF_ITERATION');
4735 
4736    /*
4737    AME_API.getNextApprover(200,
4738                            substr(itemkey, 1, instr(itemkey,'_')-1),
4739                            'APINV',
4740                            l_next_approver);
4741    */
4742    AME_API2.getNextApprovers1(applicationIdIn => 200,
4743                         transactionTypeIn => 'APINV',
4744                         transactionIdIn => substr(itemkey, 1, instr(itemkey,'_')-1),
4745                         flagApproversAsNotifiedIn => ame_util.booleanFalse,
4746                         approvalProcessCompleteYNOut => l_complete,
4747                         nextApproversOut => l_next_approvers,
4748                         itemIndexesOut => l_index,
4749                         itemIdsOut => l_ids,
4750                         itemClassesOut => l_class,
4751                         itemSourcesOut => l_source
4752                         );
4753 
4754 
4755 
4756    l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
4757                    itemkey,
4758                    'ORG_ID');
4759 
4760    l_invoice_id := substr(itemkey, 1, instr(itemkey,'_')-1);
4761    l_iteration := substr(itemkey, instr(itemkey,'_')+1, length(itemkey));
4762 
4763    --Now set the environment
4764    MO_GLOBAL.INIT ('SQLAP');
4765    MO_GLOBAL.set_policy_context('S',l_org_id);
4766 
4767    --IF l_complete = ame_util.booleanTrue THEN /*no approver on the list*/
4768    IF l_next_approvers.count < 1 THEN
4769            resultout := wf_engine.eng_completed||':'||'FINISH';
4770 
4771            --check for prior approvers
4772            SELECT count(*)
4773            INTO l_count
4774            FROM ap_inv_aprvl_hist
4775            WHERE invoice_id = l_invoice_id
4776            AND iteration = l_iteration
4777            AND RESPONSE <> 'MANUALLY APPROVED'
4778            AND history_type = 'DOCUMENTAPPROVAL';
4779 
4780            IF l_count >0 THEN
4781                    --update invoice header status
4782                    UPDATE AP_INVOICES_ALL
4783                    SET wfapproval_status = 'WFAPPROVED'
4784                    WHERE invoice_id = l_invoice_id
4785                    AND wfapproval_status <> 'MANUALLY APPROVED';
4786            ELSE
4787                    UPDATE AP_INVOICES_ALL
4788                    SET wfapproval_status = decode(invoice_type_lookup_code,
4789 		                           'INVOICE REQUEST','REJECTED',
4790 					   'CREDIT MEMO REQUEST','REJECTED',
4791 					   'NOT REQUIRED')
4792                    WHERE invoice_id = l_invoice_id
4793                    AND wfapproval_status <> 'MANUALLY APPROVED';
4794            END IF;
4795            l_inv_match_type := WF_ENGINE.GetItemAttrText('APINVAPR',
4796                                                          itemkey,
4797                                                          'INV_MATCH_TYPE');
4798 	   IF l_inv_match_type = 'UNMATCHED' THEN
4799               UPDATE AP_INVOICE_LINES_ALL
4800               SET wfapproval_status = 'NOT REQUIRED'
4801               WHERE invoice_id = l_invoice_id
4802               AND wfapproval_status <> 'MANUALLY APPROVED';
4803 	   END IF;
4804            /* Logic for Converting ISP requests into Invoices */
4805            OPEN C_invoice(l_invoice_id);
4806            FETCH C_invoice
4807            INTO l_invoice_type_lookup_code
4808                ,l_gl_date
4809                ,l_period_name;
4810            CLOSE C_invoice;
4811            IF l_invoice_type_lookup_code IN ('INVOICE REQUEST'
4812                                           ,'CREDIT MEMO REQUEST')
4813 	   AND l_count > 0 THEN
4814 
4815               ap_utilities_pkg.get_open_gl_date(P_Date => l_gl_date
4816                                ,P_Period_Name => l_new_period_name
4817                                ,P_GL_Date     => l_new_gl_date
4818                                ,P_Org_Id      => l_org_id);
4819               ap_isp_utilities_pkg.get_payment_terms (
4820                        p_invoice_id => l_invoice_id,
4821                        p_terms_id   => l_terms_id,
4822                        p_terms_date => l_terms_date,
4823                        p_calling_sequence =>
4824                              'ap_workflow_pkg.get_header_approver');
4825 
4826 
4827               UPDATE AP_INVOICES_ALL
4828               SET    invoice_type_lookup_code =
4829                         DECODE(invoice_type_lookup_code
4830                               ,'INVOICE REQUEST','STANDARD'
4831                               ,'CREDIT MEMO REQUEST', 'CREDIT'
4832                               ,invoice_type_lookup_code),
4833                      terms_id   = l_terms_id,
4834                      terms_date = l_terms_date
4835               WHERE  invoice_id = l_invoice_id;
4836               IF l_period_name <> l_new_period_name THEN
4837 
4838                  UPDATE AP_INVOICES_ALL
4839                  SET    gl_date = l_new_gl_date
4840                  WHERE  invoice_id = l_invoice_id;
4841 
4842                  UPDATE ap_invoice_lines_all
4843                  SET    accounting_date = l_new_gl_date
4844                        ,period_name     = l_new_period_name
4845                  WHERE  invoice_id      = l_invoice_id;
4846 
4847                  UPDATE ap_invoice_distributions_all
4848                  SET    accounting_date = l_new_gl_date
4849                        ,period_name     = l_new_period_name
4850                  WHERE  invoice_id      = l_invoice_id;
4851 
4852               END IF;
4853            END IF;
4854 
4855    ELSE /*have approver*/
4856            l_next_approver := l_next_approvers(1);
4857            WF_DIRECTORY.GetRoleName(l_next_approver.ORIG_SYSTEM
4858 	    ,l_next_approver.ORIG_SYSTEM_ID,l_role,l_role_display);
4859 
4860            WF_DIRECTORY.GetUserName(l_next_approver.ORIG_SYSTEM,
4861                            l_next_approver.ORIG_SYSTEM_ID,
4862                            l_name,
4863                            l_display_name);
4864 
4865            WF_ENGINE.SetItemAttrText(itemtype,
4866                    itemkey,
4867                    'APPROVER_NAME',
4868                    l_display_name);
4869 
4870            WF_ENGINE.SetItemAttrNumber(itemtype,
4871                    itemkey,
4872                    'APPROVER_ID',
4873                    l_next_approver.ORIG_SYSTEM_ID); /****
4874 		              POTENTIAL BUG ************/
4875 
4876            WF_ENGINE.SetItemAttrText(itemtype,
4877                    itemkey,
4878                    'DOCUMENT_APPROVER',
4879                    l_role);
4880 
4881            WF_ENGINE.SetItemAttrText(itemtype,
4882                    itemkey,
4883                    'ORIG_SYSTEM',
4884                    l_next_approver.ORIG_SYSTEM);
4885 
4886            WF_ENGINE.SetItemAttrNumber(itemtype,
4887                         itemkey,
4888                         'NOTF_ITERATION',
4889                         nvl(l_notf_iteration,0) + 1);
4890 	   /*
4891            WF_ENGINE.SETITEMATTRTEXT
4892                 (
4893                  itemtype => itemtype,
4894                  itemkey  => itemkey,
4895                  aname    => 'INVOICE_ATTACHMENTS',
4896                  avalue   => ('FND:entity=AP_INVOICES' || l_ampersand ||
4897                          'pk1name=INVOICE_ID' || l_ampersand
4898                                               || 'pk1value=' || l_invoice_id));
4899 	   */
4900            --call set attributes so that notification tokens will be correct
4901            --set_attribute_values(itemtype,itemkey);
4902       l_hist_rec.HISTORY_TYPE := 'DOCUMENTAPPROVAL';
4903       l_hist_rec.INVOICE_ID   := l_invoice_id;
4904       l_hist_rec.ITERATION    := l_iteration;
4905       l_hist_rec.NOTIFICATION_ORDER := nvl(l_notf_iteration,0) + 1;
4906       l_hist_rec.RESPONSE     := 'SENT';
4907       l_hist_rec.APPROVER_ID  := l_next_approver.ORIG_SYSTEM_ID;
4908       /********** POTENTIAL BUG ABOVE********************/
4909       l_hist_rec.APPROVER_NAME:= l_display_name;
4910       l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
4911       l_hist_rec.CREATION_DATE:= sysdate;
4912       l_hist_rec.LAST_UPDATE_DATE := sysdate;
4913       l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
4914       l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
4915       l_hist_rec.ORG_ID            := l_org_id;
4916       l_hist_rec.AMOUNT_APPROVED   := 0;
4917 
4918       insert_history_table(p_hist_rec => l_hist_rec);
4919            resultout := wf_engine.eng_completed||':'||'MORE';
4920 
4921    END IF;
4922 
4923    ELSE  /* For IF l_count_rejects = 0, so there are rejections */
4924       /* Should never go through following update since all lines
4925       should be either Rejected or approved by this time */
4926       UPDATE AP_INVOICE_LINES_ALL
4927       SET    wfapproval_status = 'REQUIRED'
4928       WHERE  invoice_id = l_invoice_id
4929       AND    wfapproval_status = 'INITIATED';
4930 
4931       UPDATE ap_invoices_all
4932       SET    wfapproval_status = 'NEEDS WFREAPPROVAL'
4933       WHERE  invoice_id = l_invoice_id;
4934 
4935       resultout := wf_engine.eng_completed||':'||'FINISH';
4936    END IF;
4937 EXCEPTION
4938 
4939 WHEN OTHERS
4940    THEN
4941         WF_CORE.CONTEXT('APINVAPR','get_header_approver',itemtype,
4942                         itemkey, to_char(actid), funcmode);
4943         RAISE;
4944 
4945 END get_header_approver;
4946 PROCEDURE escalate_doc_approval(itemtype IN VARCHAR2,
4947                         itemkey IN VARCHAR2,
4948                         actid   IN NUMBER,
4949                         funcmode IN VARCHAR2,
4950                         resultout  OUT NOCOPY VARCHAR2 ) IS
4951    l_esc_approver          AME_UTIL.approverRecord2;
4952    l_name                  VARCHAR2(30);
4953    l_esc_approver_name     VARCHAR2(150);
4954    l_esc_approver_id       NUMBER(15);
4955    l_approver_id           NUMBER(15);
4956    l_invoice_id            NUMBER(15);
4957    l_hist_id               NUMBER(15);
4958    l_role                  VARCHAR2(50);
4959    l_esc_role              VARCHAR2(50);
4960    l_esc_role_display      VARCHAR2(150);
4961    l_org_id                NUMBER(15);
4962    l_level                 VARCHAR2(10);
4963    l_api_name              CONSTANT VARCHAR2(200) :=
4964                                    'escalate_doc_approval';
4965    l_debug_info            VARCHAR2(2000);
4966    l_iteration             NUMBER;
4967    l_invoice_total         NUMBER;
4968    l_hist_rec              AP_INV_APRVL_HIST%ROWTYPE;
4969    l_notf_iteration        NUMBER;
4970 
4971 
4972 BEGIN
4973    l_debug_info := 'Start';
4974    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4975           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
4976                          l_api_name,l_debug_info);
4977    END IF;
4978 
4979    --Get the current approver info
4980    l_approver_id := WF_ENGINE.GetItemAttrNumber(itemtype,
4981                              itemkey,
4982                              'APPROVER_ID');
4983 
4984    l_invoice_id := WF_ENGINE.GetItemAttrNumber(itemtype,
4985                              itemkey,
4986                              'INVOICE_ID');
4987 
4988    l_invoice_total := WF_ENGINE.GetItemAttrNumber(itemtype,
4989                              itemkey,
4990                              'INVOICE_TOTAL');
4991 
4992    l_iteration := WF_ENGINE.GetItemAttrNumber(itemtype,
4993                              itemkey,
4994                              'ITERATION');
4995 
4996    l_notf_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
4997                         itemkey,
4998                         'NOTF_ITERATION');
4999 
5000    l_org_id := WF_ENGINE.GetItemAttrNumber(itemtype,
5001                              itemkey,
5002                              'ORG_ID');
5003 
5004    l_role  := WF_ENGINE.GetItemAttrText(itemtype,
5005                              itemkey,
5006                              'DOCUMENT_APPROVER');
5007 
5008 
5009    --Now set the environment
5010    MO_GLOBAL.INIT ('SQLAP');
5011    MO_GLOBAL.set_policy_context('S',l_org_id);
5012 
5013    -- see if we have an TCA/WF Directory api for this select
5014    /*
5015    SELECT supervisor_id
5016    INTO l_esc_approver_id
5017    FROM per_employees_current_x
5018    WHERE employee_id = l_approver_id;
5019    */
5020  -- bug#6837841 Changes  Starts
5021    /*SELECT user_id
5022    INTO   l_esc_approver_id
5023    FROM   fnd_user
5024    WHERE  employee_id =
5025           (SELECT supervisor_id
5026 	   FROM   per_employees_current_x
5027 	   WHERE  employee_id = l_approver_id);
5028 
5029    WF_DIRECTORY.GetUserName('FND_USR',
5030                    l_esc_approver_id,
5031                    l_name,
5032                    l_esc_approver_name);
5033    WF_DIRECTORY.GetRoleName('FND_USR',
5034                    l_esc_approver_id,
5035                    l_esc_role,
5036                    l_esc_role_display);*/
5037 
5038    SELECT supervisor_id   INTO   l_esc_approver_id
5039 	   FROM   per_employees_current_x
5040 	   WHERE  employee_id = l_approver_id;
5041 
5042    WF_DIRECTORY.GetUserName('PER',
5043                    l_esc_approver_id,
5044                    l_name,
5045                    l_esc_approver_name);
5046    WF_DIRECTORY.GetRoleName('PER',
5047                    l_esc_approver_id,
5048                    l_esc_role,
5049                    l_esc_role_display);
5050 -- bug#6837841 Changes End
5051    l_esc_approver.name := l_esc_role;
5052    l_esc_approver.api_insertion := ame_util.apiInsertion;
5053    l_esc_approver.authority := ame_util.authorityApprover;
5054    l_esc_approver.approval_status := ame_util.forwardStatus;
5055 
5056    --update AME
5057    AME_API2.updateApprovalStatus2(applicationIdIn => 200,
5058                       transactionTypeIn =>  'APINV',
5059                       transactionIdIn     => to_char(l_invoice_id),
5060                       approvalStatusIn    => AME_UTIL.noResponseStatus,
5061                       approverNameIn  => l_role,
5062                       itemClassIn    => ame_util.headerItemClassName,
5063                       itemIdIn    => to_char(l_invoice_id),
5064                       forwardeeIn       => l_esc_approver);
5065    --Set WF attributes
5066    WF_ENGINE.SetItemAttrText(itemtype,
5067                    itemkey,
5068                    'ESC_APPROVER_NAME',
5069                    l_esc_approver_name);
5070 
5071    WF_ENGINE.SetItemAttrNumber(itemtype,
5072                    itemkey,
5073                    'ESC_APPROVER_ID',
5074                    l_esc_approver_id);
5075 
5076    WF_ENGINE.SetItemAttrText(itemtype,
5077                    itemkey,
5078                    'ESC_ROLE_NAME',
5079                    l_esc_role);
5080 
5081    WF_ENGINE.SetItemAttrText(itemtype,
5082                    itemkey,
5083                    'ESCALATED',
5084                    'Y');
5085    l_hist_rec.HISTORY_TYPE := 'DOCUMENTAPPROVAL';
5086    l_hist_rec.INVOICE_ID   := l_invoice_id;
5087    l_hist_rec.ITERATION    := l_iteration;
5088    l_hist_rec.NOTIFICATION_ORDER := l_notf_iteration;
5089    l_hist_rec.RESPONSE     := 'ESCALATED';
5090    l_hist_rec.APPROVER_ID  := l_esc_approver_id;
5091    l_hist_rec.APPROVER_NAME:= l_esc_approver_name;
5092    l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
5093    l_hist_rec.CREATION_DATE:= sysdate;
5094    l_hist_rec.LAST_UPDATE_DATE := sysdate;
5095    l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
5096    l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
5097    l_hist_rec.ORG_ID            := l_org_id;
5098    l_hist_rec.AMOUNT_APPROVED   := l_invoice_total;
5099 
5100    l_debug_info := 'Before insert_history_table';
5101    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5102           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
5103                          l_api_name,l_debug_info);
5104    END IF;
5105    insert_history_table(p_hist_rec => l_hist_rec);
5106 
5107 EXCEPTION
5108 WHEN OTHERS
5109    THEN
5110         WF_CORE.CONTEXT('APINVAPR','get_header_approver',itemtype,
5111                         itemkey, to_char(actid), funcmode);
5112         RAISE;
5113 END escalate_doc_approval;
5114 PROCEDURE escalate_lines_approval(itemtype IN VARCHAR2,
5115                         itemkey IN VARCHAR2,
5116                         actid   IN NUMBER,
5117                         funcmode IN VARCHAR2,
5118                         resultout  OUT NOCOPY VARCHAR2 ) IS
5119 
5120    --Define cursor for lines affected by notification
5121    CURSOR   Items_Cur(itemkey IN VARCHAR2) IS
5122    SELECT invap.Item_Class, invap.Item_Id, invap.Role_Name,
5123           invap.Invoice_Key, al.line_number, al.amount
5124    FROM   AP_APINV_APPROVERS invap, AP_INVOICE_LINES_ALL al
5125    WHERE  invap.Notification_Key = itemkey
5126    AND    al.line_number = invap.line_number
5127    AND    al.invoice_id  = invap.invoice_id;
5128 
5129    l_esc_approver       AME_UTIL.approverRecord2;
5130    l_name          	VARCHAR2(30);
5131    l_esc_approver_name  VARCHAR2(150);
5132    l_esc_approver_id    NUMBER(15);
5133    l_approver_id   	NUMBER(15);
5134    l_invoice_id    	NUMBER(15);
5135    l_hist_id       	NUMBER(15);
5136    l_role	        VARCHAR2(50);
5137    l_esc_role         	VARCHAR2(50);
5138    l_esc_role_display  	VARCHAR2(150);
5139    l_org_id        	NUMBER(15);
5140    l_api_name           CONSTANT VARCHAR2(200) :=
5141                                         'Escalate_Lines_approval';
5142    l_debug_info         VARCHAR2(2000);
5143    l_iteration          NUMBER;
5144    l_item_class		VARCHAR2(50);
5145    l_item_id		NUMBER;
5146    l_line_number        ap_invoice_lines_all.line_number%TYPE;
5147    l_line_amount        ap_invoice_lines_all.amount%TYPE;
5148    l_hist_rec           AP_INV_APRVL_HIST%ROWTYPE;
5149    l_comments           VARCHAR2(240);
5150    l_esc_flag           VARCHAR2(1);
5151    l_invoice_key        VARCHAR2(50);
5152    l_notf_iteration     NUMBER;
5153 
5154 
5155 BEGIN
5156 
5157    l_debug_info := 'Start';
5158    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5159           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
5160                          l_api_name,l_debug_info);
5161    END IF;
5162 
5163 
5164    --Get the current approver info
5165    l_approver_id := WF_ENGINE.GetItemAttrNumber(itemtype,
5166                                   itemkey,
5167                                   'APPROVER_ID');
5168 
5169    l_invoice_id := WF_ENGINE.GetItemAttrNumber(itemtype,
5170                                   itemkey,
5171                                   'INVOICE_ID');
5172 
5173    l_iteration := WF_ENGINE.GetItemAttrNumber(itemtype,
5174                                   itemkey,
5175                                   'ITERATION');
5176 
5177    l_org_id := WF_ENGINE.GetItemAttrNumber(itemtype,
5178                                   itemkey,
5179                                   'ORG_ID');
5180 
5181    l_role  := WF_ENGINE.GetItemAttrText(itemtype,
5182                                   itemkey,
5183                                   'ROLE_NAME');
5184 
5185    l_notf_iteration := WF_ENGINE.GETITEMATTRNumber(itemtype,
5186                         itemkey,
5187                         'NOTF_ITERATION');
5188 
5189    --Now set the environment
5190    MO_GLOBAL.INIT ('SQLAP');
5191    MO_GLOBAL.set_policy_context('S',l_org_id);
5192 
5193    --amy see if we have an TCA/WF Directory api for this select
5194    /*
5195    SELECT supervisor_id
5196    INTO l_esc_approver_id
5197    FROM per_employees_current_x
5198    WHERE employee_id = l_approver_id;
5199    */
5200    SELECT user_id
5201    INTO   l_esc_approver_id
5202    FROM   fnd_user
5203    WHERE  employee_id =
5204           (SELECT supervisor_id
5205            FROM   per_employees_current_x
5206            WHERE  employee_id = l_approver_id);
5207 
5208 
5209    WF_DIRECTORY.GetUserName('FND_USR',
5210                         l_esc_approver_id,
5211                         l_name,
5212                         l_esc_approver_name);
5213 
5214    WF_DIRECTORY.GetRoleName('FND_USR',
5215    			l_esc_approver_id,
5216    			l_esc_role,
5217    			l_esc_role_display);
5218 
5219    l_esc_approver.name := l_esc_role;
5220    l_esc_approver.api_insertion := ame_util.apiInsertion;
5221    l_esc_approver.authority := ame_util.authorityApprover;
5222    l_esc_approver.approval_status := ame_util.forwardStatus;
5223 
5224    l_hist_rec.HISTORY_TYPE := 'LINESAPPROVAL';
5225    l_hist_rec.INVOICE_ID   := l_invoice_id;
5226    l_hist_rec.ITERATION    := l_iteration;
5227    l_hist_rec.NOTIFICATION_ORDER := l_notf_iteration;
5228    l_hist_rec.APPROVER_COMMENTS := l_comments;
5229    l_hist_rec.RESPONSE     := 'ESCALATED';
5230    l_hist_rec.APPROVER_ID  := l_esc_approver_id;
5231    l_hist_rec.APPROVER_NAME:= l_esc_approver_name;
5232    l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
5233    l_hist_rec.CREATION_DATE:= sysdate;
5234    l_hist_rec.LAST_UPDATE_DATE := sysdate;
5235    l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
5236    l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
5237    l_hist_rec.ORG_ID            := l_org_id;
5238    --update AME status
5239    --For Future  check with ame as to when updateApprovalStatuses will be
5240    --available so there  will not be a need to loop.
5241    OPEN Items_Cur(itemkey);
5242    LOOP
5243 
5244       FETCH Items_Cur INTO l_item_class, l_item_id, l_name,
5245                                    l_invoice_key,l_line_number, l_line_amount;
5246       EXIT WHEN Items_Cur%NOTFOUND OR Items_Cur%NOTFOUND IS NULL;
5247 
5248       --update AME
5249       AME_API2.updateApprovalStatus2(applicationIdIn => 200,
5250               		   transactionTypeIn =>  'APINV',
5251                            transactionIdIn     => to_char(l_invoice_id),
5252                            approvalStatusIn    => AME_UTIL.noResponseStatus,
5253                            approverNameIn  => l_role,
5254                            itemClassIn    => l_item_class,
5255                            itemIdIn    => l_item_id,
5256                            forwardeeIn       => l_esc_approver);
5257 
5258       l_hist_rec.line_number   := l_line_number;
5259       l_hist_rec.AMOUNT_APPROVED   := l_line_amount;
5260 
5261       l_debug_info := 'Before calling insert_history_table for Line'
5262                        || l_line_number;
5263       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5264              FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
5265                             l_api_name,l_debug_info);
5266       END IF;
5267 
5268       insert_history_table(p_hist_rec => l_hist_rec);
5269 
5270    END LOOP;
5271    CLOSE Items_Cur;
5272 
5273    --Set WF attributes
5274    WF_ENGINE.SetItemAttrText(itemtype,
5275                         itemkey,
5276                         'ESC_APPROVER_NAME',
5277                         l_esc_approver_name);
5278 
5279    WF_ENGINE.SetItemAttrNumber(itemtype,
5280                         itemkey,
5281                         'ESC_APPROVER_ID',
5282                         l_esc_approver_id);
5283 
5284    WF_ENGINE.SetItemAttrText(itemtype,
5285                         itemkey,
5286                         'ESC_ROLE_NAME',
5287                         l_esc_role);
5288 
5289    WF_ENGINE.SetItemAttrText(itemtype,
5290                    itemkey,
5291                    'ESCALATED',
5292                    'Y');
5293 
5294 EXCEPTION
5295 WHEN OTHERS
5296    THEN
5297         WF_CORE.CONTEXT('APINVAPR','get_header_approver',itemtype,
5298                         itemkey, to_char(actid), funcmode);
5299         RAISE;
5300 END escalate_lines_approval;
5301 PROCEDURE awake_approval_main(itemtype IN VARCHAR2,
5302                         itemkey IN VARCHAR2,
5303                         actid   IN NUMBER,
5304                         funcmode IN VARCHAR2,
5305                         resultout  OUT NOCOPY VARCHAR2 ) IS
5306    l_api_name           CONSTANT VARCHAR2(200) :=
5307                                         'awake_approval_main';
5308    l_debug_info         VARCHAR2(2000);
5309    l_invoice_key        VARCHAR2(150);
5310 
5311 BEGIN
5312    l_debug_info := 'Start';
5313    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5314           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
5315                          l_api_name,l_debug_info);
5316    END IF;
5317    BEGIN
5318 
5319       SELECT invoice_key
5320       INTO   l_invoice_key
5321       FROM   AP_APINV_APPROVERS
5322       WHERE  Notification_Key = itemkey
5323       AND    rownum = 1;
5324    EXCEPTION
5325       WHEN NO_DATA_FOUND THEN
5326          l_debug_info := 'No Data Found in SELECT from AP_APINV_APPROVERS' ;
5327       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5328              FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
5329                             l_api_name,l_debug_info);
5330       END IF;
5331       RAISE;
5332 
5333    END;
5334    l_debug_info := 'Before CompleteActivity APPROVAL_MAIN:BLOCK' ||
5335                    'l_invoice_key = ' || l_invoice_key;
5336    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5337           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
5338                          l_api_name,l_debug_info);
5339    END IF;
5340    wf_engine.CompleteActivity(
5341                         itemType => 'APINVAPR',
5342                         itemKey  => l_invoice_key,
5343                         activity => 'APPROVAL_MAIN:BLOCK',
5344                         result   => 'NULL');
5345 
5346    l_debug_info := 'End';
5347    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5348           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
5349                          l_api_name,l_debug_info);
5350    END IF;
5351 
5352 
5353 EXCEPTION
5354 WHEN OTHERS
5355    THEN
5356         WF_CORE.CONTEXT('APINVAPR','awake_approval_main',itemtype,
5357                         itemkey, to_char(actid), funcmode);
5358         RAISE;
5359 END awake_approval_main;
5360 
5361 PROCEDURE create_lineapp_neg_process(p_invoice_id IN NUMBER,
5362 					  p_ext_user_id IN NUMBER,
5363 					  p_invoice_amount IN NUMBER,
5364                                           parentkey IN VARCHAR2,
5365                                           childkey  IN VARCHAR2,
5366 					  int_ext_indicator IN VARCHAR2,
5367 					  p_wfitemkey OUT NOCOPY VARCHAR2) IS
5368 /*-----------------------------------------------------------------------+
5369  | Cursor Declarations                                                   |
5370  +-----------------------------------------------------------------------*/
5371    CURSOR csr_ap_aprvl_neg_details IS
5372    SELECT PV.vendor_name,
5373           AI.invoice_num,
5374           AI.invoice_date,
5375           AI.description,
5376           AI.org_id,
5377           AI.invoice_id,
5378           AI.approval_iteration,
5379           AI.vendor_contact_id,
5380           NVL(AI.invoice_amount, 0)
5381    FROM   ap_invoices_all AI,
5382           po_vendors PV
5383    WHERE  AI.invoice_id = p_invoice_id
5384    AND    AI.vendor_id = PV.vendor_id;
5385    l_api_name      CONSTANT VARCHAR2(200) := 'create_lineapproval_neg_process';
5386    l_vendor_name po_vendors.vendor_name%TYPE;
5387    l_invoice_num ap_invoices_all.invoice_num%TYPE;
5388    l_invoice_date  ap_invoices_all.invoice_date%TYPE;
5389    l_invoice_description ap_invoices_all.description%TYPE;
5390    l_invoice_id ap_invoices_all.invoice_id%TYPE;
5391    l_org_id ap_invoices_all.org_id%TYPE;
5392    l_name                  VARCHAR2(30);
5393    l_display_name          VARCHAR2(150);
5394    l_role                  VARCHAR2(50);
5395    l_role_display          VARCHAR2(150);
5396    l_new_child_ItemKey     VARCHAR2(30);
5397    l_person_id             NUMBER(15);
5398    l_hist_rec              AP_INV_APRVL_HIST%ROWTYPE;
5399    l_notf_receipient_type  VARCHAR2(50);
5400    l_iteration             NUMBER;
5401    l_notf_iteration        NUMBER;
5402    l_invoice_key   VARCHAR2(50);
5403    l_role_name          AP_APINV_APPROVERS.ROLE_NAME%TYPE;
5404    l_item_class    AP_APINV_APPROVERS.ITEM_CLASS%TYPE;
5405    l_item_id       AP_APINV_APPROVERS.ITEM_ID%TYPE;
5406    l_debug_info    VARCHAR2(2000);
5407    l_line_number   ap_invoice_lines_all.line_number%TYPE;
5408    l_line_amount   ap_invoice_lines_all.amount%TYPE;
5409    l_ext_person_id NUMBER(15);
5410    l_ext_user_id NUMBER(15);
5411    l_total                 ap_invoices_all.invoice_amount%TYPE;
5412 
5413 BEGIN
5414    l_debug_info := 'Start';
5415    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5416           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
5417                          l_api_name,l_debug_info);
5418    END IF;
5419    SELECT AP_NEGOTIATION_HIST_S.nextval
5420    INTO   l_new_child_ItemKey
5421    FROM   dual;
5422 
5423    OPEN csr_ap_aprvl_neg_details;
5424    FETCH csr_ap_aprvl_neg_details INTO
5425          l_vendor_name,
5426 	 l_invoice_num,
5427 	 l_invoice_date,
5428 	 l_invoice_description,
5429 	 l_org_id,
5430 	 l_invoice_id,
5431 	 l_iteration,
5432 	 l_ext_user_id,
5433          l_total;
5434    CLOSE csr_ap_aprvl_neg_details;
5435 
5436    l_ext_user_id := p_ext_user_id;
5437 
5438    wf_engine.createProcess('APINVNEG', l_new_child_itemkey,
5439                            'APPROVAL_NEGOTIATION');
5440    WF_ENGINE.setItemParent('APINVNEG', l_new_child_itemkey,
5441 	                   'APINVAPR', parentkey, null);
5442    WF_ENGINE.SetItemAttrNumber('APINVNEG',
5443                         l_new_child_itemkey,
5444                         'INVOICE_ID',
5445                         l_invoice_id);
5446    WF_ENGINE.SetItemAttrNumber('APINVNEG',
5447                         l_new_child_itemkey,
5448                         'ORG_ID',
5449                         l_org_id);
5450    WF_ENGINE.SetItemAttrNumber('APINVNEG',
5451                         l_new_child_itemkey,
5452                         'INVOICE_TOTAL',
5453                         nvl(p_invoice_amount,l_total));
5454    WF_ENGINE.SetItemAttrNumber('APINVAPR',
5455                         parentkey,
5456                         'INVOICE_TOTAL',
5457                         nvl(p_invoice_amount,l_total));
5458    WF_ENGINE.SetItemAttrText('APINVNEG',
5459                         l_new_child_itemkey,
5460                         'INVOICE_SUPPLIER_NAME',
5461                         l_vendor_name);
5462    WF_ENGINE.SetItemAttrText('APINVNEG',
5463                         l_new_child_itemkey,
5464                         'INVOICE_NUMBER',
5465                         l_invoice_num);
5466    WF_ENGINE.SetItemAttrDate('APINVNEG',
5467                         l_new_child_itemkey,
5468                         'INVOICE_DATE',
5469                         l_invoice_date);
5470    WF_ENGINE.SetItemAttrText('APINVNEG',
5471                         l_new_child_itemkey,
5472                         'INVOICE_DESCRIPTION',
5473                         l_invoice_description);
5474    WF_ENGINE.SetItemAttrText('APINVNEG',
5475                         l_new_child_itemkey,
5476                         'PARENT_KEY',
5477                         parentkey);
5478    WF_ENGINE.SetItemAttrText('APINVNEG',
5479                         l_new_child_itemkey,
5480                         'NOTIFICATION_KEY',
5481                         l_new_child_itemkey);
5482 
5483    WF_ENGINE.SetItemAttrNumber('APINVNEG',
5484                         l_new_child_itemkey,
5485                         'ITERATION',
5486                         l_iteration);
5487    WF_ENGINE.SetItemAttrText('APINVNEG',
5488                                   l_new_child_itemkey,
5489                                   'ORIG_SYSTEM',
5490                                   WF_ENGINE.GETITEMATTRText('APINVAPR',
5491 				                             parentkey,
5492 						             'ORIG_SYSTEM'));
5493    /* Currently the sender is Internal  and sending to External*/
5494    IF int_ext_indicator = 'I' and l_ext_user_id IS NOT NULL THEN
5495 
5496       WF_DIRECTORY.GetRoleName('FND_USR',l_ext_user_id,l_role,
5497                                l_role_display);
5498       l_person_id := l_ext_user_id;
5499       WF_DIRECTORY.GetUserName('FND_USR',
5500                                 l_ext_user_id,
5501                                 l_name,
5502                                 l_display_name);
5503       WF_ENGINE.SetItemAttrText('APINVNEG',
5504                         l_new_child_itemkey,
5505                         'SUPPLIER_ROLE',
5506                         l_role);
5507       WF_ENGINE.SetItemAttrText('APINVNEG',
5508                                   l_new_child_itemkey,
5509                                   'SUPPLIER_DISPLAY_NAME',
5510                                   l_display_name);
5511       WF_ENGINE.SetItemAttrNumber('APINVNEG',
5512                         l_new_child_itemkey,
5513                         'SUPPLIER_PERSON_ID',
5514                         l_ext_user_id);
5515 
5516       WF_ENGINE.SetItemAttrText('APINVNEG',
5517                         l_new_child_itemkey,
5518                         'NOTF_RECEIPIENT_TYPE',
5519                         'EXTERNAL');
5520       WF_ENGINE.SetItemAttrText('APINVNEG',
5521                                   l_new_child_itemkey,
5522                                   'INTERNAL_REP_DISPLAY_NAME',
5523                                   WF_ENGINE.GETITEMATTRText('APINVAPR',
5524                                                              parentkey,
5525                                                              'APPROVER_NAME'));
5526       WF_ENGINE.SetItemAttrText('APINVNEG',
5527                                   l_new_child_itemkey,
5528                                   'INTERNAL_REP_ROLE',
5529                                   WF_ENGINE.GETITEMATTRText('APINVAPR',
5530                                                              parentkey,
5531                                                              'DOCUMENT_APPROVER'));
5532 
5533    /* Currently the sender is external (supplier) and sending to
5534       Internal Rep */
5535    ELSIF int_ext_indicator = 'E' THEN
5536 
5537       l_role := WF_ENGINE.GETITEMATTRText('APINVAPR',
5538                                           parentkey,
5539 			                  'DOCUMENT_APPROVER');
5540       WF_ENGINE.SetItemAttrText('APINVNEG',
5541                         l_new_child_itemkey,
5542                         'INTERNAL_REP_ROLE',
5543                         l_role);
5544       WF_ENGINE.SetItemAttrText('APINVNEG',
5545                         l_new_child_itemkey,
5546                         'DISP_NOT_RECEIVER',
5547                         l_role);
5548       l_display_name := WF_ENGINE.GETITEMATTRText('APINVAPR',
5549                                           parentkey,
5550 			                  'APPROVER_NAME');
5551       WF_ENGINE.SetItemAttrText('APINVNEG',
5552                                   l_new_child_itemkey,
5553                                   'INTERNAL_REP_DISPLAY_NAME',
5554                                   l_display_name);
5555       l_person_id := WF_ENGINE.GETITEMATTRNumber('APINVAPR',
5556                                           parentkey,
5557 			                  'APPROVER_ID');
5558       WF_ENGINE.SetItemAttrNumber('APINVNEG',
5559                         l_new_child_itemkey,
5560                         'INTERNAL_REP_PERSON_ID',
5561                         l_person_id);
5562       WF_ENGINE.SetItemAttrText('APINVNEG',
5563                         l_new_child_itemkey,
5564                         'NOTF_RECEIPIENT_TYPE',
5565                         'INTERNAL');
5566       WF_ENGINE.SetItemAttrText('APINVNEG',
5567                                   l_new_child_itemkey,
5568                                   'SUPPLIER_DISPLAY_NAME',
5569                                   WF_ENGINE.GETITEMATTRText('APINVNEG',
5570                                                              childkey,
5571                                                              'SUPPLIER_DISPLAY_NAME'));
5572       WF_ENGINE.SetItemAttrText('APINVNEG',
5573                                   l_new_child_itemkey,
5574                                   'SUPPLIER_ROLE',
5575                                   WF_ENGINE.GETITEMATTRText('APINVNEG',
5576                                                              childkey,
5577                                                              'SUPPLIER_ROLE'));
5578 
5579    END IF;
5580    WF_ENGINE.startProcess('APINVNEG', l_new_child_itemkey);
5581    MO_GLOBAL.INIT ('SQLAP');
5582    MO_GLOBAL.set_policy_context('S',l_org_id);
5583 
5584    IF childkey IS NOT NULL THEN
5585       l_notf_receipient_type :=  WF_ENGINE.GetItemAttrText('APINVNEG',
5586                                   childkey,
5587                                   'NOTF_RECEIPIENT_TYPE');
5588       IF l_notf_receipient_type = 'INTERNAL' THEN
5589 
5590           wf_engine.CompleteActivity(
5591                      itemType => 'APINVNEG',
5592                      itemKey  => childkey,
5593                      activity => 'APPROVAL_NEGOTIATION:WAITINTLINEAPRVL',
5594                      result   => 'NULL');
5595       ELSE
5596           wf_engine.CompleteActivity(
5597                      itemType => 'APINVNEG',
5598                      itemKey  => childkey,
5599                      activity => 'APPROVAL_NEGOTIATION:WAITEXTLINEAPRVL',
5600                      result   => 'NULL');
5601       END IF;
5602 
5603    END IF;
5604 
5605    p_wfitemkey := l_new_child_itemkey;
5606    l_debug_info := 'End';
5607    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5608           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
5609                          l_api_name,l_debug_info);
5610    END IF;
5611 
5612 
5613 EXCEPTION
5614 
5615 WHEN OTHERS
5616    THEN
5617         RAISE;
5618 
5619 END create_lineapp_neg_process;
5620 
5621 PROCEDURE create_invapp_process(p_invoice_id IN NUMBER
5622                        ,p_approval_iteration IN NUMBER DEFAULT NULL
5623                        ,p_wfitemkey OUT NOCOPY VARCHAR2) IS
5624 /*-----------------------------------------------------------------------+
5625  | Cursor Declarations                                                   |
5626  +-----------------------------------------------------------------------*/
5627 -- Bug5892455 added the union for 'Payment Request' type invoices
5628 -- For payment Request type invoices the vendor is a customer whose
5629 -- data wil be there in hz_party tables
5630 CURSOR csr_ap_inv_details IS
5631 SELECT PV.vendor_name,
5632        AI.invoice_num,
5633        AI.invoice_date,
5634        AI.description,
5635        AI.org_id,
5636        AI.invoice_id,
5637        NVL(AI.invoice_amount, 0)
5638 FROM   ap_invoices_all AI,
5639        ap_suppliers PV
5640 WHERE  AI.invoice_id = p_invoice_id
5641 AND    AI.invoice_type_lookup_code <> 'PAYMENT REQUEST'
5642 AND    AI.vendor_id = PV.vendor_id
5643 UNION ALL
5644 SELECT HZP.party_name,
5645        AI.invoice_num,
5646        AI.invoice_date,
5647        AI.description,
5648        AI.org_id,
5649        AI.invoice_id,
5650        NVL(AI.invoice_amount, 0)
5651 FROM   ap_invoices_all AI,
5652        hz_parties HZP
5653 WHERE  AI.invoice_id = p_invoice_id
5654 AND    AI.invoice_type_lookup_code = 'PAYMENT REQUEST'
5655 AND    AI.party_id = HZP.party_id;
5656 
5657 l_vendor_name po_vendors.vendor_name%TYPE;
5658 l_invoice_num ap_invoices_all.invoice_num%TYPE;
5659 l_invoice_date  ap_invoices_all.invoice_date%TYPE;
5660 l_invoice_description ap_invoices_all.description%TYPE;
5661 l_invoice_id ap_invoices_all.invoice_id%TYPE;
5662 l_org_id ap_invoices_all.org_id%TYPE;
5663 l_itemkey VARCHAR2(50);
5664 l_iteration AP_INVOICES_ALL.APPROVAL_ITERATION%TYPE;
5665 l_api_name      CONSTANT VARCHAR2(200) := 'create_invapp_process';
5666 l_debug_info    VARCHAR2(2000);
5667 l_total                 ap_invoices_all.invoice_amount%TYPE;
5668 l_calling_sequence      VARCHAR2(2000);
5669 l_num NUMBER;
5670 
5671 
5672 
5673 BEGIN
5674    l_debug_info := 'Start';
5675    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5676           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
5677                          l_api_name,l_debug_info);
5678    END IF;
5679    l_debug_info := 'Before UPDATE AP_INVOICES_ALL';
5680    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5681           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
5682                          l_api_name,l_debug_info);
5683    END IF;
5684    l_calling_sequence := l_api_name;
5685    UPDATE AP_INVOICES_ALL
5686    SET    WFAPPROVAL_STATUS = 'INITIATED'
5687    WHERE  invoice_id = p_invoice_id;
5688    /*
5689    UPDATE AP_INVOICE_LINES_ALL
5690    SET    WFAPPROVAL_STATUS = 'INITIATED'
5691    where  invoice_id = p_invoice_id;
5692    */
5693 
5694    l_debug_info := 'Before ame_api2.clearAllApprovals';
5695    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5696           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
5697                          l_api_name,l_debug_info);
5698    END IF;
5699 
5700    ame_api2.clearAllApprovals(
5701                               applicationidin => 200,
5702                               transactiontypein => 'APINV',
5703                               transactionidin => p_invoice_id);
5704    OPEN csr_ap_inv_details;
5705    FETCH csr_ap_inv_details INTO
5706          l_vendor_name,
5707          l_invoice_num,
5708          l_invoice_date,
5709          l_invoice_description,
5710          l_org_id,
5711          l_invoice_id,
5712          l_total;
5713    CLOSE csr_ap_inv_details;
5714    l_iteration := nvl(p_approval_iteration,1);
5715    l_itemkey := to_char(p_invoice_id) || '_' || to_char(l_iteration);
5716 
5717    l_debug_info := 'Before Calling WF_ENGINE.createProcess(APINVAPR,'
5718                    || l_itemkey || ',APPROVAL_MAIN);';
5719    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5720           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
5721                          l_api_name,l_debug_info);
5722    END IF;
5723 
5724    wf_engine.createProcess('APINVAPR', l_itemkey, 'APPROVAL_MAIN');
5725    l_debug_info := 'Before setting item attributes' ;
5726    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5727           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
5728                          l_api_name,l_debug_info);
5729    END IF;
5730 
5731    WF_ENGINE.SetItemAttrNumber('APINVAPR',
5732                         l_itemkey,
5733                         'INVOICE_ID',
5734                         l_invoice_id);
5735    WF_ENGINE.SetItemAttrNumber('APINVAPR',
5736                         l_itemkey,
5737                         'ORG_ID',
5738                         l_org_id);
5739    WF_ENGINE.SetItemAttrNumber('APINVAPR',
5740                         l_itemkey,
5741                         'INVOICE_TOTAL',
5742                         l_total);
5743    WF_ENGINE.SetItemAttrText('APINVAPR',
5744                         l_itemkey,
5745                         'INVOICE_SUPPLIER_NAME',
5746                         l_vendor_name);
5747    WF_ENGINE.SetItemAttrText('APINVAPR',
5748                         l_itemkey,
5749                         'INVOICE_NUMBER',
5750                         l_invoice_num);
5751    WF_ENGINE.SetItemAttrDate('APINVAPR',
5752                         l_itemkey,
5753                         'INVOICE_DATE',
5754                         l_invoice_date);
5755    WF_ENGINE.SetItemAttrText('APINVAPR',
5756                         l_itemkey,
5757                         'INVOICE_DESCRIPTION',
5758                         l_invoice_description);
5759    WF_ENGINE.SetItemAttrNumber('APINVAPR',
5760                         l_itemkey,
5761                         'ITERATION',
5762                         l_iteration);
5763    WF_ENGINE.SetItemAttrText('APINVAPR',
5764                         l_itemkey,
5765                         'NOTIFICATION_KEY',
5766                         l_itemkey);
5767    /* Set wfapproval status at the line level so that AME doesnt return
5768       any Line levcel approvers for the matched case even if the rules
5769       have been so set up. */
5770    l_debug_info := 'Before UPDATE AP_INVOICE_LINES_ALL';
5771    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5772           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
5773                          l_api_name,l_debug_info);
5774    END IF;
5775    SELECT COUNT(*)
5776      INTO l_num
5777      FROM ap_invoice_lines_all
5778     WHERE po_header_id IS NOT NULL
5779       AND invoice_id = l_invoice_id;
5780 
5781    IF l_num > 0 THEN
5782       WF_ENGINE.SetItemAttrText('APINVAPR',
5783                                   l_itemkey,
5784                                   'INV_MATCH_TYPE',
5785                                   'MATCHED');
5786       UPDATE AP_INVOICE_LINES_ALL
5787       SET    WFAPPROVAL_STATUS = 'INITIATED'
5788       where  invoice_id = p_invoice_id;
5789    ELSE
5790       WF_ENGINE.SetItemAttrText('APINVAPR',
5791                                   l_itemkey,
5792                                   'INV_MATCH_TYPE',
5793                                   'UNMATCHED');
5794       UPDATE AP_INVOICE_LINES_ALL
5795       SET    WFAPPROVAL_STATUS = 'NOT REQUIRED'
5796       where  invoice_id = p_invoice_id;
5797    END IF;
5798 
5799    l_debug_info := 'Before Calling WF_ENGINE.startProcess(APINVAPR,'
5800                    || l_itemkey || ');';
5801    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5802           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
5803                          l_api_name,l_debug_info);
5804    END IF;
5805    WF_ENGINE.startProcess('APINVAPR', l_itemkey);
5806    l_debug_info := 'After Calling WF_ENGINE.startProcess' ;
5807    p_wfitemkey := l_itemkey;
5808    l_debug_info := 'End';
5809    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5810           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
5811                          l_api_name,l_debug_info);
5812    END IF;
5813 
5814 
5815 EXCEPTION
5816 
5817 WHEN OTHERS
5818    THEN
5819     IF (SQLCODE <> -20001) THEN
5820       FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
5821       FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
5822       FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_calling_sequence);
5823       FND_MESSAGE.SET_TOKEN('DEBUG_INFO', l_debug_info);
5824     END IF;
5825     APP_EXCEPTION.RAISE_EXCEPTION;
5826 END create_invapp_process;
5827 
5828 FUNCTION Stop_Approval(
5829                         p_invoice_id IN NUMBER,
5830 			p_line_number IN NUMBER,
5831 			p_calling_sequence IN VARCHAR2) RETURN BOOLEAN IS
5832 
5833 	--Define cursor for wf and ame records that need to be stopped
5834 	CURSOR   Item_Cur IS
5835 	SELECT Item_Class, Item_Id, Role_Name, Invoice_Key, Notification_Key
5836 	FROM AP_APINV_APPROVERS
5837 	WHERE Invoice_ID = p_invoice_id
5838 	AND NOTIFICATION_STATUS = 'SENT'
5839 	GROUP BY Item_Class, Item_Id, Role_Name, Invoice_Key, Notification_Key
5840 	ORDER BY Notification_Key;
5841 
5842 	CURSOR   Line_Item_Cur IS
5843         SELECT Item_Class, Item_Id, Role_Name, Invoice_Key, Notification_Key
5844         FROM AP_APINV_APPROVERS
5845         WHERE Invoice_ID = p_invoice_id
5846 	AND Line_Number = p_line_number
5847         AND NOTIFICATION_STATUS = 'SENT'
5848         GROUP BY Item_Class, Item_Id, Role_Name, Invoice_Key, Notification_Key
5849         ORDER BY Notification_Key;
5850 
5851 	l_api_name      CONSTANT VARCHAR2(200) := 'Stop_Approval';
5852         l_item_class    AP_APINV_APPROVERS.ITEM_CLASS%TYPE;
5853         l_item_id       AP_APINV_APPROVERS.ITEM_ID%TYPE;
5854 	l_invoice_id	NUMBER;
5855 	l_invoice_key   AP_APINV_APPROVERS.INVOICE_KEY%TYPE;
5856         l_not_key       AP_APINV_APPROVERS.NOTIFICATION_KEY%TYPE;
5857 	l_old_not_key   AP_APINV_APPROVERS.NOTIFICATION_KEY%TYPE;
5858 	l_name	        AP_APINV_APPROVERS.ROLE_NAME%TYPE;
5859         l_debug_info    VARCHAR2(2000);
5860         l_wf_exist      BOOLEAN;
5861         l_approval_iteration AP_INVOICES.approval_iteration%type;
5862         l_end_date      DATE;
5863         l_calling_sequence      VARCHAR2(2000);
5864 
5865 BEGIN
5866 
5867         IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5868           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'AP_IAW_PKG.'|| l_api_name);
5869         END IF;
5870 
5871         l_calling_sequence := l_api_name || ' <-' || p_calling_sequence;
5872 
5873         /*Bug4926114  Added the following part to check of code
5874                       to check whether workflow is active or not */
5875         select approval_iteration
5876         into   l_approval_iteration
5877         from   ap_invoices
5878         where  invoice_id=p_invoice_id;
5879 
5880         l_invoice_key := p_invoice_id||'_'||l_approval_iteration;
5881 
5882         BEGIN
5883           SELECT  end_date
5884           INTO    l_end_date
5885           FROM    wf_items
5886           WHERE   item_type = 'APINVAPR'
5887           AND     item_key  = l_invoice_key;
5888 
5889           l_wf_exist  := TRUE;
5890        EXCEPTION
5891        WHEN NO_DATA_FOUND THEN
5892          l_wf_exist  := FALSE;
5893        END;
5894 
5895        If not (l_wf_exist) OR l_end_date is NOT NULL then
5896               return TRUE;
5897        end if;
5898 
5899 	IF p_line_number IS NULL THEN
5900 	   --End WF processes
5901 	   WF_Engine.abortProcess(
5902 		itemType => 'APINVAPR',
5903 		itemKey  => l_invoice_key,
5904 		process => 'APPROVAL_MAIN');
5905 
5906 	   l_debug_info := 'opening item cursor';
5907            IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5908               FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,
5909                                         l_debug_info);
5910            END IF;
5911 
5912            OPEN Item_Cur;
5913            LOOP
5914 
5915                 FETCH Item_Cur INTO l_item_class, l_item_id, l_name,
5916 					l_invoice_key, l_not_key;
5917                 EXIT WHEN Item_Cur%NOTFOUND;
5918 
5919 
5920 		AME_API2.updateApprovalStatus2(applicationIdIn => 200,
5921                                 transactionIdIn     => to_char(l_invoice_id),
5922                                 approvalStatusIn    => AME_UTIL.nullStatus,
5923                                 approverNameIn  => l_name,
5924                                 transactionTypeIn =>  'APINV',
5925                                 itemClassIn     => l_item_class,
5926                                 itemIdIn        => l_item_id);
5927 
5928 		IF l_not_key <> nvl(l_old_not_key, 'dummy') THEN
5929 
5930 			WF_Engine.abortProcess(
5931 			itemType => 'APINVAPR',
5932 			itemKey  => l_not_key,
5933 			process => 'APPROVAL_INVOICE_LINES');
5934 
5935 			l_old_not_key := l_not_key;
5936 		END IF;
5937 
5938            END LOOP;
5939            CLOSE Item_Cur;
5940 
5941 	ELSE --just a line
5942 
5943            l_debug_info := 'opening line item cursor';
5944            IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5945               FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,
5946                                         l_debug_info);
5947            END IF;
5948 
5949            OPEN Line_Item_Cur;
5950            LOOP
5951 
5952                 FETCH Line_Item_Cur INTO l_item_class, l_item_id, l_name,
5953                                         l_invoice_key, l_not_key;
5954                 EXIT WHEN Line_Item_Cur%NOTFOUND;
5955 
5956 
5957                 AME_API2.updateApprovalStatus2(applicationIdIn => 200,
5958                                 transactionIdIn     => to_char(l_invoice_id),
5959                                 approvalStatusIn    => AME_UTIL.nullStatus,
5960                                 approverNameIn  => l_name,
5961                                 transactionTypeIn =>  'APINV',
5962                                 itemClassIn     => l_item_class,
5963                                 itemIdIn        => l_item_id);
5964 
5965                 IF l_not_key <> nvl(l_old_not_key, 'dummy') THEN
5966 
5967                         WF_Engine.abortProcess(
5968                         itemType => 'APINVAPR',
5969                         itemKey  => l_not_key,
5970                         process => 'APPROVAL_INVOICE_LINES');
5971 
5972                         l_old_not_key := l_not_key;
5973                 END IF;
5974 
5975            END LOOP;
5976            CLOSE Line_Item_Cur;
5977 	END IF; --just a line
5978 
5979 	return true;
5980 
5981 EXCEPTION
5982   WHEN OTHERS THEN
5983 
5984     IF (SQLCODE <> -20001) THEN
5985       FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
5986       FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
5987       FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_calling_sequence);
5988       FND_MESSAGE.SET_TOKEN('DEBUG_INFO', l_debug_info);
5989     END IF;
5990     APP_EXCEPTION.RAISE_EXCEPTION;
5991 
5992 END Stop_Approval;
5993 PROCEDURE process_single_line_response(p_invoice_id IN NUMBER,
5994                                        p_line_number IN NUMBER,
5995                                        p_response IN VARCHAR2,
5996                                        p_itemkey  IN VARCHAR2,
5997                                        p_comments IN VARCHAR2) IS
5998    --Define cursor for lines affected by notification
5999    --Note that Invoice_Key s/b the same for all records in the cursor
6000    --but I want to avoid another select on the table
6001    CURSOR   Items_Cur IS
6002    SELECT invap.Item_Class, invap.Item_Id, invap.Role_Name,
6003           invap.Invoice_Key, al.line_number, al.amount
6004    FROM   AP_APINV_APPROVERS invap, AP_INVOICE_LINES_ALL al
6005    WHERE  invap.child_process_item_key = p_itemkey
6006    AND    invap.line_number = p_line_number
6007    AND    invap.invoice_id = p_invoice_id
6008    AND    al.line_number = invap.line_number
6009    AND    al.invoice_id  = invap.invoice_id;
6010 
6011    l_api_name      CONSTANT VARCHAR2(200) := 'process_single_line_response';
6012    l_debug_info    VARCHAR2(2000);
6013    l_parentkey     VARCHAR2(150);
6014    l_invoice_id    NUMBER;
6015    l_level         VARCHAR2(20);
6016    l_result        VARCHAR2(20);
6017    l_invoice_key   VARCHAR2(50);
6018    l_name          AP_APINV_APPROVERS.ROLE_NAME%TYPE;
6019    l_item_class    AP_APINV_APPROVERS.ITEM_CLASS%TYPE;
6020    l_item_id       AP_APINV_APPROVERS.ITEM_ID%TYPE;
6021    l_user_id       NUMBER(15);
6022    l_login_id      NUMBER(15);
6023    l_hist_rec      AP_INV_APRVL_HIST%ROWTYPE;
6024    l_approver_name VARCHAR2(150);
6025    l_approver_id   NUMBER;
6026    l_esc_flag      VARCHAR2(1);
6027    l_esc_approver_name VARCHAR2(150);
6028    l_role_name     VARCHAR2(150);
6029    l_role VARCHAR2(150);
6030    l_esc_role_name VARCHAR2(150);
6031    l_esc_approver_id   NUMBER;
6032    l_line_total     NUMBER;
6033    l_iteration     NUMBER(15);
6034    l_comments      VARCHAR2(240);
6035    l_org_id        NUMBER(15);
6036    l_line_number   ap_invoice_lines_all.line_number%TYPE;
6037    l_line_amount   ap_invoice_lines_all.amount%TYPE;
6038    l_notf_iteration        NUMBER;
6039    l_response      ap_inv_aprvl_hist_all.response%TYPE;
6040    l_sent           NUMBER;
6041 BEGIN
6042    l_debug_info := 'Start';
6043    l_sent := 0;
6044    IF p_response = 'APPROVE'
6045    THEN l_response := 'APPROVED';
6046    ELSIF p_response = 'REJECT'
6047    THEN l_response := 'REJECTED';
6048    ELSE l_response := p_response;
6049    END IF;
6050 
6051 
6052    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6053           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6054                          l_api_name,l_debug_info);
6055    END IF;
6056 
6057    l_invoice_id := WF_ENGINE.GetItemAttrNumber('APINVAPR',
6058                                   p_itemkey,
6059                                   'INVOICE_ID');
6060 
6061    l_iteration := WF_ENGINE.GetItemAttrNumber('APINVAPR',
6062                              p_itemkey,
6063                              'ITERATION');
6064 
6065    l_notf_iteration := WF_ENGINE.GETITEMATTRNumber('APINVAPR',
6066                         p_itemkey,
6067                         'NOTF_ITERATION');
6068 
6069    l_comments := WF_ENGINE.GetItemAttrText('APINVAPR',
6070                              p_itemkey,
6071                              'WF_NOTE');
6072 
6073    l_org_id := WF_ENGINE.GETITEMATTRNumber('APINVAPR',
6074                    p_itemkey,
6075                    'ORG_ID');
6076 
6077    l_approver_name := WF_ENGINE.GetItemAttrText('APINVAPR',
6078                              p_itemkey,
6079                              'APPROVER_NAME');
6080 
6081    l_esc_role_name := WF_ENGINE.GetItemAttrText('APINVAPR',
6082                              p_itemkey,
6083                              'ESC_ROLE_NAME');
6084 
6085    l_role_name := WF_ENGINE.GetItemAttrText('APINVAPR',
6086                              p_itemkey,
6087                              'ROLE_NAME');
6088 
6089    l_approver_id := WF_ENGINE.GETITEMATTRNumber('APINVAPR',
6090                    p_itemkey,
6091                    'APPROVER_ID');
6092 
6093    l_esc_flag  := WF_ENGINE.GetItemAttrText('APINVAPR',
6094                              p_itemkey,
6095                              'ESCALATED');
6096    l_esc_approver_name := WF_ENGINE.GetItemAttrText('APINVAPR',
6097                              p_itemkey,
6098                              'ESC_APPROVER_NAME');
6099 
6100    l_esc_approver_id := WF_ENGINE.GETITEMATTRNumber('APINVAPR',
6101                    p_itemkey,
6102                    'ESC_APPROVER_ID');
6103 
6104    l_user_id := nvl(to_number(fnd_profile.value('USER_ID')),-1);
6105    l_login_id := nvl(to_number(fnd_profile.value('LOGIN_ID')),-1);
6106    IF nvl(l_esc_flag,'N') = 'N' THEN
6107       l_role := l_role_name;
6108    ELSE
6109       l_role := l_esc_role_name;
6110    END IF;
6111 
6112    l_debug_info := 'Before Update Approvers table';
6113    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6114           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6115                          l_api_name,l_debug_info);
6116    END IF;
6117    --Update Approvers table
6118    IF l_response in ('APPROVED','REJECTED','ACCEPT') THEN
6119       UPDATE AP_APINV_APPROVERS
6120       SET Notification_status = 'COMP'
6121       WHERE CHILD_PROCESS_ITEM_KEY = p_itemkey
6122       AND   INVOICE_ID = p_invoice_id
6123       AND   LINE_NUMBER = p_line_number;
6124    END IF;
6125 
6126    fnd_client_info.set_org_context(l_org_id);
6127 
6128    l_hist_rec.HISTORY_TYPE := 'LINESAPPROVAL';
6129    l_hist_rec.INVOICE_ID   := l_invoice_id;
6130    l_hist_rec.ITERATION    := l_iteration;
6131    l_hist_rec.NOTIFICATION_ORDER := l_notf_iteration;
6132    l_hist_rec.APPROVER_COMMENTS := l_comments;
6133    l_hist_rec.RESPONSE     := l_response;
6134    IF nvl(l_esc_flag,'N') = 'N' THEN
6135       l_hist_rec.APPROVER_ID  := l_approver_id;
6136       l_hist_rec.APPROVER_NAME:= l_approver_name;
6137    ELSE
6138       l_hist_rec.APPROVER_ID  := l_esc_approver_id;
6139       l_hist_rec.APPROVER_NAME:= l_esc_approver_name;
6140    END IF;
6141    l_hist_rec.CREATED_BY   := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
6142    l_hist_rec.CREATION_DATE:= sysdate;
6143    l_hist_rec.LAST_UPDATE_DATE := sysdate;
6144    l_hist_rec.LAST_UPDATED_BY  := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
6145    l_hist_rec.LAST_UPDATE_LOGIN := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
6146    l_hist_rec.ORG_ID            := l_org_id;
6147    --update AME status
6148    --For Future  check with ame as to when updateApprovalStatuses will be
6149    --available so there  will not be a need to loop.
6150    OPEN Items_Cur;
6151 
6152    FETCH Items_Cur INTO l_item_class, l_item_id, l_name,
6153                                 l_invoice_key,l_line_number, l_line_amount;
6154    --update AME with response
6155    IF l_response IN ('APPROVED','ACCEPT') THEN
6156       AME_API2.updateApprovalStatus2(applicationIdIn => 200,
6157                            transactionIdIn     => to_char(l_invoice_id),
6158                            approvalStatusIn    => AME_UTIL.approvedStatus,
6159                            approverNameIn  => l_name,
6160                            transactionTypeIn =>  'APINV',
6161                            itemClassIn     => l_item_class,
6162                            itemIdIn        => l_item_id);
6163    ELSIF l_response = 'REJECTED' THEN
6164       AME_API2.updateApprovalStatus2(applicationIdIn => 200,
6165                            transactionIdIn     => to_char(l_invoice_id),
6166                            approvalStatusIn    => AME_UTIL.rejectStatus,
6167                            approverNameIn  => l_name,
6168                            transactionTypeIn =>  'APINV',
6169                            itemClassIn     => l_item_class,
6170                            itemIdIn        => l_item_id);
6171    END IF;
6172    l_hist_rec.line_number   := l_line_number;
6173    l_hist_rec.AMOUNT_APPROVED   := l_line_amount;
6174 
6175    l_debug_info := 'Before calling insert_history_table for Line'
6176                     || l_line_number;
6177    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6178           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6179                          l_api_name,l_debug_info);
6180    END IF;
6181 
6182    insert_history_table(p_hist_rec => l_hist_rec);
6183    CLOSE Items_Cur;
6184 
6185 
6186    l_user_id := nvl(to_number(fnd_profile.value('USER_ID')),-1);
6187    l_login_id := nvl(to_number(fnd_profile.value('LOGIN_ID')),-1);
6188 
6189    IF l_response = 'REJECTED' THEN
6190       UPDATE AP_INVOICE_LINES_ALL
6191       SET    wfapproval_status = 'REJECTED'
6192              ,Last_Update_Date = sysdate
6193              ,Last_Updated_By = l_user_id
6194              ,Last_Update_Login = l_login_id
6195       WHERE invoice_id = p_invoice_id
6196       AND wfapproval_status <> 'MANUALLY APPROVED'
6197       AND line_number = p_line_number;
6198    END IF;
6199 
6200    BEGIN
6201 
6202       SELECT invoice_key
6203       INTO   l_invoice_key
6204       FROM   AP_APINV_APPROVERS
6205       WHERE  invoice_id = p_invoice_id
6206       AND    line_number = p_line_number
6207       AND    child_process_item_key = p_itemkey
6208       AND    rownum = 1;
6209    EXCEPTION
6210       WHEN NO_DATA_FOUND THEN
6211          l_debug_info := 'No Data Found in SELECT from AP_APINV_APPROVERS' ;
6212       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6213              FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6214                             l_api_name,l_debug_info);
6215       END IF;
6216       RAISE;
6217 
6218    END;
6219 
6220    /* The following is being called from OA layer after
6221    Initial Commit. so commenting it out here.
6222 
6223    SELECT count(*)
6224    INTO  l_sent
6225    FROM  AP_APINV_APPROVERS
6226    WHERE Notification_status = 'SENT'
6227    AND   child_process_item_key = p_itemkey
6228    AND   INVOICE_ID = p_invoice_id
6229    AND   LINE_NUMBER = p_line_number;
6230    IF l_sent = 0 THEN
6231       BEGIN
6232          wf_engine.CompleteActivity(
6233                         itemType => 'APINVAPR',
6234                         itemKey  => p_itemkey,
6235                         activity => 'APPROVAL_INVOICE_LINES:WAITLINEAPRVL',
6236                         result   => 'NULL');
6237 
6238       EXCEPTION
6239          WHEN OTHERS THEN NULL;
6240       END;
6241    END IF;
6242    */
6243    l_debug_info := 'End';
6244    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6245           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6246                          l_api_name,l_debug_info);
6247    END IF;
6248 END process_single_line_response;
6249 
6250 /*get_attribute_value is called by AME when determining the value for more
6251 complicated attributes.  It can be called at the header or line level, and
6252 the p_attribute_name is used to determine what the return value should be.
6253 p_context is currently a miscellaneous parameter to be used as necessary in
6254 the future.  The goal with this function is to avoid adding a new function
6255 for each new AME attribute.*/
6256 
6257 FUNCTION Get_Attribute_Value(p_invoice_id IN NUMBER,
6258                    p_sub_class_id IN NUMBER DEFAULT NULL,
6259                    p_attribute_name IN VARCHAR2,
6260                    p_context IN VARCHAR2 DEFAULT NULL)
6261                                  RETURN VARCHAR2 IS
6262 
6263         l_debug_info    VARCHAR2(2000);
6264         l_return_val    VARCHAR2(2000);
6265         l_count_pa_rel  NUMBER;
6266         l_sum_matched   NUMBER;
6267         l_sum_calc      NUMBER;
6268         l_line_count    NUMBER;
6269         l_item_count    NUMBER;
6270         l_api_name      CONSTANT VARCHAR2(200) := 'Get_Attribute_Value';
6271 
6272 BEGIN
6273 
6274         IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6275           FND_LOG.STRING(G_LEVEL_PROCEDURE,G_MODULE_NAME||l_api_name,'AP_IAW_PKG.'|| l_api_name);
6276         END IF;
6277 
6278         IF p_context = 'header' THEN
6279                 --dealing with a header level attribute
6280                 IF p_attribute_name =
6281                         'SUPPLIER_INVOICE_EXPENDITURE_ORGANIZATION_NAME' THEN
6282 
6283                   SELECT organization
6284                     INTO l_return_val
6285                     FROM PA_EXP_ORGS_IT
6286                    WHERE organization_id=(SELECT expenditure_organization_id
6287                                        FROM ap_invoices_all
6288                                        WHERE invoice_id = p_invoice_id);
6289 
6290                 ELSIF p_attribute_name= 'SUPPLIER_INVOICE_PROJECT_RELATED' THEN
6291 
6292                         SELECT count(invoice_distribution_id)
6293                         INTO l_count_pa_rel
6294                         FROM ap_invoice_distributions_all
6295                         WHERE invoice_id = p_invoice_id
6296                         AND project_id is not null;
6297 
6298                         IF l_count_pa_rel >0 THEN
6299                                 l_return_val := 'Y';
6300                         ELSE
6301                                 l_return_val := 'N';
6302                         END IF;
6303 
6304                 ELSIF p_attribute_name= 'SUPPLIER_INVOICE_MATCHED' THEN
6305                         --an invoice is considered matched if all item
6306                         --lines are matched
6307 
6308                         SELECT sum(decode(po_header_id, null, 0, 1)),
6309                                         count(line_number)
6310                         INTO l_sum_matched, l_item_count
6311                         FROM ap_invoice_lines_all
6312                         WHERE invoice_id = p_invoice_id
6313                         AND line_type_lookup_code = 'ITEM';
6314 
6315                         IF l_sum_matched >0
6316                                 and l_sum_matched = l_item_count THEN
6317                                 l_return_val := 'Y';
6318                         ELSE
6319                                 l_return_val := 'N';
6320                         END IF;
6321                 ELSIF  p_attribute_name= 'SUPPLIER_INVOICE_TAX_CALCULATED' THEN
6322 
6323                         SELECT sum(decode(tax_already_calculated_flag, 'Y',
6324                                         1, 0)), count(line_number)
6325                         INTO l_sum_calc, l_line_count
6326                         FROM ap_invoice_lines_all
6327                         WHERE invoice_id = p_invoice_id
6328                         AND line_type_lookup_code not in ('TAX','AWT');
6329 
6330                         IF l_sum_calc >0 and l_sum_matched = l_line_count THEN
6331                                 l_return_val := 'Y';
6332                         ELSE
6333                                 l_return_val := 'N';
6334                         END IF;
6335 
6336                 END IF;
6337 
6338         ELSIF p_context = 'distribution' THEN
6339                 IF p_attribute_name =
6340                         'SUPPLIER_INVOICE_DISTRIBUTION_PO_BUYER_EMP_NUM' THEN
6341 
6342                    SELECT employee_number
6343                      INTO l_return_val
6344                      FROM per_all_people_f pap
6345                     WHERE person_id = (SELECT ph.agent_id
6346                            FROM ap_invoice_distributions_all aid,
6347                                 po_distributions_all pd,
6348                                 po_headers_all ph
6349                            WHERE pd.po_distribution_id =
6350                                 aid.po_distribution_id
6351                            AND  pd.po_header_id = ph.po_header_id
6352                            AND aid.invoice_distribution_id =
6353                                                 p_sub_class_id
6354                            AND pd.creation_date >= pap.effective_start_date
6355                            AND pd.creation_date <=
6356                                       nvl(pap.effective_end_date,sysdate));
6357 
6358                 ELSIF p_attribute_name =
6359                   'SUPPLIER_INVOICE_DISTRIBUTION_PO_REQUESTER_EMP_NUM' THEN
6360 
6361                   SELECT employee_number
6362                     INTO l_return_val
6363                     FROM per_all_people_f pap
6364                    WHERE person_id = (
6365                         SELECT pd.deliver_to_person_id
6366                           FROM ap_invoice_distributions_all aid,
6367                                po_distributions_all pd
6368                          WHERE pd.po_distribution_id =
6369                                aid.po_distribution_id
6370                            AND aid.invoice_distribution_id =
6371                                       p_sub_class_id
6372                            AND pd.creation_date >= pap.effective_start_date
6373                            AND pd.creation_date <=
6374                                       nvl(pap.effective_end_date,sysdate));
6375                 END IF;
6376         ELSIF p_context = 'line item' THEN
6377 
6378                 IF p_attribute_name = 'SUPPLIER_INVOICE_LINE_MATCHED' THEN
6379                         SELECT decode(po_header_id, null, 'N', 'Y')
6380                         INTO l_return_val
6381                         FROM ap_invoice_lines_all
6382                         WHERE invoice_id = p_invoice_id
6383                         AND line_number = p_sub_class_id;
6384 
6385                 END IF;
6386         END IF;
6387 
6388         return l_return_val;
6389 
6390 EXCEPTION
6391   WHEN OTHERS THEN
6392     Wf_Core.Context('APINVLDP', 'get_attribute_value',
6393                     p_invoice_id , p_sub_class_id, p_attribute_name,
6394                                 l_debug_info);
6395     raise;
6396 
6397 END Get_Attribute_Value;
6398 
6399 /* This function is called from AME in order to provide the relevant segment
6400 of the account fexfield to the calling AME attribute usage*/
6401 FUNCTION AP_Dist_Accounting_Flex(p_seg_name IN VARCHAR2,
6402                                  p_dist_id IN NUMBER) RETURN VARCHAR2 IS
6403 
6404         l_segments                      FND_FLEX_EXT.SEGMENTARRAY;
6405         l_result                        BOOLEAN;
6406         l_chart_of_accounts_id          NUMBER;
6407         l_num_segments                  NUMBER;
6408         l_segment_num                   NUMBER;
6409         l_reason_flex                   VARCHAR2(2000):='';
6410         l_segment_delimiter             VARCHAR2(1);
6411         l_seg_val                       VARCHAR2(50);
6412         l_ccid                          NUMBER;
6413         l_sob                           NUMBER;
6414         l_debug_info                    VARCHAR2(2000);
6415         l_api_name      CONSTANT VARCHAR2(200) := 'AP_Dist_Accounting_Flex';
6416 
6417 BEGIN
6418         IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6419           FND_LOG.STRING(G_LEVEL_PROCEDURE,G_MODULE_NAME||l_api_name,'AP_IAW_PKG.'|| l_api_name);
6420         END IF;
6421 
6422         SELECT dist_code_combination_id,set_of_books_id
6423         INTO l_ccid,l_sob
6424         FROM ap_invoice_distributions_all
6425         WHERE invoice_distribution_id=p_dist_id;
6426 
6427         SELECT chart_of_accounts_id
6428         INTO l_chart_of_accounts_id
6429         FROM gl_sets_of_books
6430        WHERE set_of_books_id = l_sob;
6431 
6432         l_segment_delimiter := FND_FLEX_EXT.GET_DELIMITER(
6433                                                 'SQLGL',
6434                                                 'GL#',
6435                                                 l_chart_of_accounts_id);
6436         IF (NOT l_result) THEN
6437             l_reason_flex := FND_MESSAGE.GET;
6438         END IF;
6439 
6440         l_result := FND_FLEX_EXT.GET_SEGMENTS(
6441                                       'SQLGL',
6442                                       'GL#',
6443                                       l_chart_of_accounts_id,
6444                                       l_ccid,
6445                                       l_num_segments,
6446                                       l_segments);
6447 
6448         IF (NOT l_result) THEN
6449             l_reason_flex := FND_MESSAGE.GET;
6450         END IF;
6451 
6452         l_result := FND_FLEX_APIS.GET_QUALIFIER_SEGNUM(
6453                                     101,
6454                                     'GL#',
6455                                     l_chart_of_accounts_id,
6456                                     p_seg_name,
6457                                     l_segment_num);
6458         IF (NOT l_result) THEN
6459             l_reason_flex := FND_MESSAGE.GET;
6460         END IF;
6461 
6462         l_seg_val := l_segments(l_segment_num);
6463 
6464         return l_seg_val;
6465 
6466 EXCEPTION
6467   WHEN OTHERS THEN
6468     Wf_Core.Context('APINVLDP', 'p_dist_accounting_flex',
6469              p_seg_name , p_dist_id, l_debug_info);
6470     raise;
6471 END AP_Dist_Accounting_Flex;
6472 
6473 PROCEDURE continue_hold_workflow(itemtype IN VARCHAR2,
6474                         itemkey IN VARCHAR2,
6475                         actid   IN NUMBER,
6476                         funcmode IN VARCHAR2,
6477                         resultout  OUT NOCOPY VARCHAR2 ) IS
6478 
6479    l_org_id NUMBER;
6480    l_invoice_id NUMBER;
6481    l_hold_id NUMBER;
6482    l_num number;
6483    l_hold_release_code     ap_holds_all.release_lookup_code%TYPE;
6484    l_debug_info            VARCHAR2(2000);
6485    l_api_name              CONSTANT VARCHAR2(200) := 'continue_hold_workflow';
6486 BEGIN
6487    l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
6488                         itemkey,
6489                         'ORG_ID');
6490 
6491    l_invoice_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
6492                         itemkey,
6493                         'INVOICE_ID');
6494 
6495    l_hold_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
6496                         itemkey,
6497                         'HOLD_ID');
6498    l_debug_info := 'Before select';
6499    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6500           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6501                          l_api_name,l_debug_info);
6502    END IF;
6503    select aha.release_lookup_code
6504    into   l_hold_release_code
6505    from   ap_holds_all aha,
6506           ap_hold_codes ahc
6507    where  aha.invoice_id = l_invoice_id
6508    and    aha.org_id = l_org_id
6509    and    aha.hold_lookup_code = ahc.hold_lookup_code
6510    and    aha.hold_id = l_hold_id;
6511    IF l_hold_release_code IS NULL  THEN
6512       resultout := wf_engine.eng_completed||':'||'Y';
6513    ELSE
6514       resultout := wf_engine.eng_completed||':'||'N';
6515    END IF;
6516    l_debug_info := 'After select, reultout : ' || resultout;
6517    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6518           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6519                          l_api_name,l_debug_info);
6520    END IF;
6521 EXCEPTION
6522 
6523 WHEN OTHERS
6524    THEN
6525         WF_CORE.CONTEXT('APINVHDN','continue_hold_workflow',itemtype, itemkey,
6526                         to_char(actid), funcmode);
6527         RAISE;
6528 END continue_hold_workflow;
6529 
6530 PROCEDURE exists_initial_wait(itemtype IN VARCHAR2,
6531                         itemkey IN VARCHAR2,
6532                         actid   IN NUMBER,
6533                         funcmode IN VARCHAR2,
6534                         resultout  OUT NOCOPY VARCHAR2 ) IS
6535 
6536    l_org_id NUMBER;
6537    l_invoice_id NUMBER;
6538    l_hold_id NUMBER;
6539    l_num number;
6540    l_wait_time             NUMBER;
6541    l_debug_info            VARCHAR2(2000);
6542    l_api_name              CONSTANT VARCHAR2(200) := 'exists_initial_wait';
6543 BEGIN
6544    l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
6545                         itemkey,
6546                         'ORG_ID');
6547 
6548    l_invoice_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
6549                         itemkey,
6550                         'INVOICE_ID');
6551 
6552    l_hold_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
6553                         itemkey,
6554                         'HOLD_ID');
6555    l_debug_info := 'Before select';
6556    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6557           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6558                          l_api_name,l_debug_info);
6559    END IF;
6560    select nvl(ahc.wait_before_notify_days,0)*24*60
6561    into   l_wait_time
6562    from   ap_holds_all aha,
6563           ap_hold_codes ahc
6564    where  aha.invoice_id = l_invoice_id
6565    and    aha.org_id = l_org_id
6566    and    aha.hold_lookup_code = ahc.hold_lookup_code
6567    and    aha.hold_id = l_hold_id;
6568    IF l_wait_time  > 0 THEN
6569       WF_ENGINE.SetItemAttrNumber(itemtype,
6570                         itemkey,
6571                         'INITIAL_WAIT_TIME',
6572                         l_wait_time);
6573 
6574       resultout := wf_engine.eng_completed||':'||'Y';
6575    ELSE
6576       resultout := wf_engine.eng_completed||':'||'N';
6577    END IF;
6578    l_debug_info := 'After select, reultout : ' || resultout;
6579    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6580           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6581                          l_api_name,l_debug_info);
6582    END IF;
6583 EXCEPTION
6584 
6585 WHEN OTHERS
6586    THEN
6587         WF_CORE.CONTEXT('APINVHDN','exists_initial_wait',itemtype, itemkey,
6588                         to_char(actid), funcmode);
6589         RAISE;
6590 END exists_initial_wait;
6591 
6592 PROCEDURE is_hold_released(itemtype IN VARCHAR2,
6593                         itemkey IN VARCHAR2,
6594                         actid   IN NUMBER,
6595                         funcmode IN VARCHAR2,
6596                         resultout  OUT NOCOPY VARCHAR2 ) IS
6597 
6598    l_org_id NUMBER;
6599    l_invoice_id NUMBER;
6600    l_hold_id NUMBER;
6601    l_num number;
6602    l_hold_release_code     ap_holds_all.release_lookup_code%TYPE;
6603    l_wait_time             NUMBER;
6604    l_debug_info            VARCHAR2(2000);
6605    l_api_name              CONSTANT VARCHAR2(200) := 'is_hold_released';
6606 BEGIN
6607    l_org_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
6608                         itemkey,
6609                         'ORG_ID');
6610 
6611    l_invoice_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
6612                         itemkey,
6613                         'INVOICE_ID');
6614 
6615    l_hold_id := WF_ENGINE.GETITEMATTRNumber(itemtype,
6616                         itemkey,
6617                         'HOLD_ID');
6618    l_debug_info := 'Before select';
6619    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6620           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6621                          l_api_name,l_debug_info);
6622    END IF;
6623    select aha.release_lookup_code,
6624           nvl(ahc.wait_before_notify_days,0)*24*60
6625    into   l_hold_release_code,
6626           l_wait_time
6627    from   ap_holds_all aha,
6628           ap_hold_codes ahc
6629    where  aha.invoice_id = l_invoice_id
6630    and    aha.org_id = l_org_id
6631    and    aha.hold_lookup_code = ahc.hold_lookup_code
6632    and    aha.hold_id = l_hold_id;
6633    IF l_hold_release_code IS NOT NULL
6634    OR l_wait_time = 0 THEN
6635       resultout := wf_engine.eng_completed||':'||'Y';
6636    ELSE
6637       WF_ENGINE.SetItemAttrNumber(itemtype,
6638                         itemkey,
6639                         'REMINDER_WAIT_TIME',
6640                         l_wait_time);
6641       resultout := wf_engine.eng_completed||':'||'N';
6642    END IF;
6643    l_debug_info := 'After select, reultout : ' || resultout;
6644    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6645           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6646                          l_api_name,l_debug_info);
6647    END IF;
6648 EXCEPTION
6649 
6650 WHEN OTHERS
6651    THEN
6652         WF_CORE.CONTEXT('APINVHDN','is_hold_released',itemtype, itemkey,
6653                         to_char(actid), funcmode);
6654         RAISE;
6655 END is_hold_released;
6656 PROCEDURE abort_holds_workflow(p_hold_id IN NUMBER) IS
6657    l_api_name      CONSTANT VARCHAR2(200) := 'abort_holds_workflow';
6658    l_debug_info    VARCHAR2(2000);
6659 BEGIN
6660    l_debug_info := 'Start';
6661    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6662           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6663                          l_api_name,l_debug_info);
6664    END IF;
6665 
6666    UPDATE ap_holds_all
6667    SET    wf_status = 'MANUALLYRELEASED'
6668    WHERE  hold_id = p_hold_id;
6669 
6670    l_debug_info := 'End';
6671    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6672           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6673                          l_api_name,l_debug_info);
6674    END IF;
6675 END;
6676 
6677 FUNCTION IS_INV_NEGOTIATED(
6678                  p_invoice_id IN ap_invoice_lines_all.invoice_id%TYPE
6679 		,p_org_id IN ap_invoice_lines_all.org_id%TYPE)
6680 		RETURN BOOLEAN IS
6681    l_num_lines_under_neg NUMBER;
6682    l_num_holds_under_neg NUMBER;
6683    l_debug_info       VARCHAR2(2000);
6684    l_api_name         CONSTANT VARCHAR2(200) := 'IS_INV_NEGOTIATED';
6685 
6686 BEGIN
6687    l_num_holds_under_neg := 0;
6688    l_num_lines_under_neg := 0;
6689 
6690    l_debug_info := 'Before select for l_num_holds_under_neg';
6691    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6692           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6693                          l_api_name,l_debug_info);
6694    END IF;
6695 
6696    SELECT count(*)
6697    INTO   l_num_holds_under_neg
6698    FROM   ap_holds_all aha
6699    WHERE  aha.invoice_id = p_invoice_id
6700    AND    aha.org_id = p_org_id
6701    AND    aha.wf_status = 'NEGOTIATE';
6702 
6703    l_debug_info := 'After select for l_num_holds_under_neg, l_num_holds_under_neg = ' || l_num_holds_under_neg;
6704    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6705           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6706                          l_api_name,l_debug_info);
6707    END IF;
6708    IF l_num_holds_under_neg > 0 THEN
6709       RETURN(TRUE);
6710    END IF;
6711 
6712    l_debug_info := 'Before select for l_num_lines_under_neg';
6713    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6714           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6715                          l_api_name,l_debug_info);
6716    END IF;
6717 
6718    SELECT COUNT(*)
6719    INTO   l_num_lines_under_neg
6720    FROM   ap_invoice_lines_all ail, ap_apinv_approvers aaa
6721    WHERE  ail.invoice_id = p_invoice_id
6722    AND    ail.org_id = p_org_id
6723    AND    aaa.invoice_id = ail.invoice_id
6724    AND    aaa.line_number = ail.line_number
6725    AND    aaa.approval_status = 'NEGOTIATE';
6726 
6727    l_debug_info := 'After select for l_num_lines_under_neg, l_num_lines_under_neg = ' || l_num_lines_under_neg;
6728    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6729           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6730                          l_api_name,l_debug_info);
6731    END IF;
6732    IF l_num_lines_under_neg > 0 THEN
6733       RETURN(TRUE);
6734    END IF;
6735    RETURN(FALSE);
6736 EXCEPTION
6737    WHEN OTHERS THEN
6738       APP_EXCEPTION.RAISE_EXCEPTION;
6739 END IS_INV_NEGOTIATED;
6740 
6741 /* Bug 5590138. Bring to from old apiawleb.pls */
6742 
6743 /*This procedure gets a table of approvers and their associated items, for
6744 the application history forms.*/
6745 
6746 PROCEDURE Get_All_Approvers(p_invoice_id IN NUMBER,
6747                         p_calling_sequence IN VARCHAR2) IS
6748 
6749         l_invoice_id            NUMBER;
6750         l_complete              VARCHAR2(1);
6751         l_next_approvers        ame_util.approversTable2;
6752         l_next_approver         ame_util.approverRecord2;
6753         l_index                 ame_util.idList;
6754         l_ids                   ame_util.stringList;
6755         l_class                 ame_util.stringList;
6756         l_source                ame_util.longStringList;
6757         l_line_num              NUMBER;
6758         l_api_name              CONSTANT VARCHAR2(200) := 'Get_All_Approvers';
6759         l_iteration             NUMBER;
6760         l_debug_info            VARCHAR2(2000);
6761         l_org_id                NUMBER;
6762         l_calling_sequence      VARCHAR2(2000);
6763         l_wfapproval_status     varchar2(30);
6764 
6765 BEGIN
6766 
6767         IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6768           FND_LOG.STRING(G_LEVEL_PROCEDURE,G_MODULE_NAME||l_api_name,'AP_IAW_PKG.'|| l_api_name);
6769         END IF;
6770 
6771         l_calling_sequence := 'AP_WORLFLOW_PKG.'||l_api_name || ' <-' || p_calling_sequence;
6772 
6773         l_debug_info := 'set variables from workflow';
6774         IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6775           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,
6776                                         l_debug_info);
6777         END IF;
6778 
6779         l_invoice_id := p_invoice_id;
6780         BEGIN
6781           SELECT NVL(wfapproval_status, 'NOT REQUIRED')
6782           INTO l_wfapproval_status
6783           FROM   ap_invoices_all
6784           WHERE  invoice_id = l_invoice_id;
6785         END;
6786 
6787 
6788         -- Bug 5590138. Add the PLSQL Block
6789 
6790         IF l_wfapproval_status IN ('REQUIRED', 'INITIATED',
6791                                    'STOPPED',  'NEEDS WFREAPPROVAL') THEN
6792           BEGIN
6793            --get all of the approvers
6794             AME_API2.getAllApprovers1(applicationIdIn => 200,
6795                         transactionTypeIn => 'APINV',
6796                         transactionIdIn => to_char(l_invoice_id),
6797                         approvalProcessCompleteYNOut => l_complete,
6798                         approversOut => l_next_approvers,
6799                         itemIndexesOut => l_index,
6800                         itemIdsOut => l_ids,
6801                         itemClassesOut => l_class,
6802                         itemSourcesOut => l_source
6803                         );
6804           EXCEPTION
6805             WHEN NO_DATA_FOUND THEN
6806               NULL;
6807             WHEN OTHERS THEN
6808               FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
6809               FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
6810               FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_calling_sequence);
6811               FND_MESSAGE.SET_TOKEN('DEBUG_INFO', l_debug_info);
6812               APP_EXCEPTION.RAISE_EXCEPTION;
6813           END;
6814 
6815         END IF;
6816 
6817 
6818         --More values in the approver list
6819         l_debug_info := 'after call to ame';
6820         IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6821           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6822                         l_api_name,l_debug_info);
6823         END IF;
6824         IF l_complete = ame_util.booleanFalse THEN
6825            --Loop through approvers' table returned by AME
6826            l_debug_info := 'more approvers';
6827            IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6828                 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6829                         l_api_name,l_debug_info);
6830            END IF;
6831 
6832            FOR l_table IN
6833                 nvl(l_next_approvers.First,0)..nvl(l_next_Approvers.Last,-1)
6834                                                                          LOOP
6835                 l_debug_info := 'looping through approvers';
6836                 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6837                         FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6838                         l_api_name,l_debug_info);
6839                 END IF;
6840                 --set the record variable
6841                 l_next_approver := l_next_approvers(l_table);
6842 
6843                 --if the approver record does not have a value for item_id,
6844                 --we need to
6845                 --use the item lists returned by AME to determine
6846                 --the items associated
6847                 --with this approver.
6848                 IF l_next_approver.item_id IS NULL THEN
6849                    l_debug_info := 'item_id is null';
6850                    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6851                         FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6852                         l_api_name,l_debug_info);
6853                    END IF;
6854 
6855                    FOR l_rec IN 1..l_index.count LOOP
6856                         --l_index contains the mapping between
6857                         --approvers and items
6858                         l_debug_info := 'looping through l_rec';
6859                         IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6860                                 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6861                                 l_api_name,l_debug_info);
6862                         END IF;
6863                         IF l_index(l_rec) = l_table THEN
6864                            l_debug_info := 'check type of item class';
6865                            IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6866                                 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6867                                 l_api_name,l_debug_info);
6868                            END IF;
6869                            --Depending on the type of item class, we need to set
6870                            --some variables
6871                            --amy need correction once project/dist seeded
6872                            IF l_class(l_rec) =
6873                                 ame_util.lineItemItemClassName THEN
6874                                 l_line_num := l_ids(l_rec);
6875                            ELSIF l_class(l_rec) = 'project code' THEN
6876 
6877                                 SELECT Invoice_Line_Number
6878                                 INTO l_line_num
6879                                 FROM AP_INVOICE_DISTRIBUTIONS_ALL
6880                                 WHERE project_id =l_ids(l_rec);
6881                            ELSIF l_class(l_rec) =
6882                                 ame_util.costCenterItemClassName THEN
6883 
6884                                 SELECT Invoice_Line_Number
6885                                 INTO l_line_num
6886                                 FROM AP_INVOICE_DISTRIBUTIONS_ALL
6887                                 WHERE project_id =l_ids(l_rec);
6888                            --distributions
6889                            ELSIF l_class(l_rec) <>
6890                                         ame_util.lineItemItemClassName
6891                                 AND l_class(l_rec) <>
6892                                         ame_util.headerItemClassName THEN
6893 
6894                                 SELECT Invoice_Line_Number
6895                                 INTO l_line_num
6896                                 FROM AP_INVOICE_DISTRIBUTIONS_ALL
6897                                 WHERE invoice_distribution_id = l_ids(l_rec);
6898 
6899                            END IF; --l_class
6900 
6901                            --Insert record into ap_approvers_list_gt
6902                            INSERT INTO AP_APPROVERS_LIST_GT(
6903                                 TRANSACTION_ID,  -- Bug 5624200
6904                                 LINE_NUMBER,
6905                                 ROLE_NAME,
6906                                 ORIG_SYSTEM,
6907                                 ORIG_SYSTEM_ID,
6908                                 DISPLAY_NAME,
6909                                 APPROVER_CATEGORY,
6910                                 API_INSERTION,
6911                                 AUTHORITY,
6912                                 APPROVAL_STATUS,
6913                                 ITEM_CLASS,
6914                                 ITEM_ID,
6915                                 APPROVER_ORDER_NUMBER)
6916                                 VALUES(
6917                                 p_invoice_id,
6918                                 decode( l_class(l_rec),
6919 				       'header',null,
6920 				       l_line_num),
6921                                 l_next_approver.NAME,
6922                                 l_next_approver.ORIG_SYSTEM,
6923                                 l_next_approver.ORIG_SYSTEM_ID,
6924                                 l_next_approver.DISPLAY_NAME,
6925                                 l_next_approver.APPROVER_CATEGORY,
6926                                 l_next_approver.API_INSERTION,
6927                                 l_next_approver.AUTHORITY,
6928                                 l_next_approver.APPROVAL_STATUS,
6929                                 l_class(l_rec),
6930 				l_ids(l_rec),
6931                                 l_next_approver.APPROVER_ORDER_NUMBER);
6932 
6933                                 l_debug_info := 'after insert';
6934                                 IF (G_LEVEL_STATEMENT >=
6935                                         G_CURRENT_RUNTIME_LEVEL) THEN
6936                                         FND_LOG.STRING(G_LEVEL_STATEMENT,
6937                                                         G_MODULE_NAME||
6938                                                 l_api_name,l_debug_info);
6939                                 END IF;
6940                         END IF; --l_index mapping
6941                    END LOOP; -- l_index mapping
6942 
6943                 ELSE  --only one item_id per approver
6944 
6945                     l_debug_info := 'only one item_id per approver';
6946                    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6947                         FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
6948                         l_api_name,l_debug_info);
6949                    END IF;
6950                    --Depending on the type of item class, we need to set
6951                    --some variables:
6952                    IF l_next_approver.item_class =
6953                                 ame_util.lineItemItemClassName THEN
6954                         l_line_num := l_next_approver.item_id;
6955                    ELSIF l_next_approver.item_class = 'project code' THEN
6956 
6957                         SELECT Invoice_Line_Number
6958                         INTO l_line_num
6959                         FROM AP_INVOICE_DISTRIBUTIONS_ALL
6960                         WHERE project_id = l_next_approver.item_id;
6961                    ELSIF l_next_approver.item_class =
6962                                 ame_util.costCenterItemClassName THEN
6963 
6964                         SELECT Invoice_Line_Number
6965                         INTO l_line_num
6966                         FROM AP_INVOICE_DISTRIBUTIONS_ALL
6967                         WHERE project_id = l_next_approver.item_id;
6968                    --distributions
6969                    ELSIF l_next_approver.item_class <>
6970                                         ame_util.lineItemItemClassName
6971                          AND l_next_approver.item_class <>
6972                                         ame_util.headerItemClassName THEN
6973 
6974                         SELECT Invoice_Line_Number
6975                         INTO l_line_num
6976                         FROM AP_INVOICE_DISTRIBUTIONS_ALL
6977                         WHERE invoice_distribution_id = l_next_approver.item_id;
6978 
6979                    END IF; --l_class
6980                         -- Bug 5590138. Modified table to AP_APPROVERS_LIST_GT
6981                         -- from AP_APINV_APPROVERS
6982                         --Insert record into ap_approvers_list_gt
6983                         INSERT INTO AP_APPROVERS_LIST_GT(
6984                                TRANSACTION_ID,  -- Bug 5624200
6985                                LINE_NUMBER,
6986                                 ROLE_NAME,
6987                                 ORIG_SYSTEM,
6988                                 ORIG_SYSTEM_ID,
6989                                 DISPLAY_NAME,
6990                                 APPROVER_CATEGORY,
6991                                 API_INSERTION,
6992                                 AUTHORITY,
6993                                  APPROVAL_STATUS,
6994                                 ITEM_CLASS,
6995                                 ITEM_ID,
6996                                 APPROVER_ORDER_NUMBER)
6997                                 VALUES(
6998                                 p_invoice_id,
6999                                 decode(l_next_approver.item_class,
7000 				       'header',null,
7001 				       l_line_num),
7002                                 l_next_approver.NAME,
7003                                 l_next_approver.ORIG_SYSTEM,
7004                                 l_next_approver.ORIG_SYSTEM_ID,
7005                                 l_next_approver.DISPLAY_NAME,
7006                                 l_next_approver.APPROVER_CATEGORY,
7007                                 l_next_approver.API_INSERTION,
7008                                 l_next_approver.AUTHORITY,
7009                                 l_next_approver.APPROVAL_STATUS,
7010                                 l_next_approver.item_class,
7011 				l_next_approver.item_id,
7012                                 l_next_approver.APPROVER_ORDER_NUMBER);
7013 
7014                 END IF; --more than one item_id per approver
7015 
7016            END LOOP; --nextApprovers table
7017 
7018         END IF; --complete
7019 
7020 EXCEPTION
7021 WHEN OTHERS
7022         THEN
7023     IF (SQLCODE <> -20001) THEN
7024       FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
7025       FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
7026       FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_calling_sequence);
7027       FND_MESSAGE.SET_TOKEN('DEBUG_INFO', l_debug_info);
7028     END IF;
7029     APP_EXCEPTION.RAISE_EXCEPTION;
7030 
7031 END Get_All_Approvers;
7032 
7033 /*This function terminates any invoice approval workflow processes
7034  when a user turns off the 'Use Invoice Approval Workflow' payables
7035 option. */
7036 
7037 PROCEDURE Terminate_Approval(
7038 			errbuf OUT NOCOPY VARCHAR2,
7039                         retcode           OUT NOCOPY NUMBER) IS
7040 
7041 	--Define cursor for wf and ame records that need to be terminated
7042 	/* Order by Logic is needed since there is a parent/child
7043 	   relationship and Child process has to be aborted before
7044 	   the parent. */
7045 	CURSOR   key_cur IS
7046         SELECT   item_key, item_type,root_activity,
7047 	         SUBSTR(item_key,1,INSTR(item_key,'_')-1) invoice_id
7048 	FROM     wf_items
7049 	WHERE    item_type IN ('APINVAPR','APINVNEG')
7050 	AND      end_date is NOT NULL
7051 	ORDER BY decode(root_activity,'APPROVAL_MAIN','3'
7052 	                             ,'APPROVAL_INVOICE_LINES','2'
7053 				     ,'APPROVAL_NEGOTIATION', '1') asc;
7054 
7055 	l_api_name      CONSTANT VARCHAR2(200) := 'Terminate_Approval';
7056 	l_item_key      wf_items.item_key%TYPE;
7057 	l_item_type     wf_items.item_type%TYPE;
7058 	l_process       wf_items.root_activity%TYPE;
7059 	l_invoice_id	NUMBER;
7060         l_debug_info    VARCHAR2(2000);
7061         l_calling_sequence      VARCHAR2(2000);
7062 
7063 BEGIN
7064 
7065         IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
7066           FND_LOG.STRING(G_LEVEL_PROCEDURE,G_MODULE_NAME||l_api_name,'AP_IAW_PKG.'|| l_api_name);
7067         END IF;
7068 
7069         l_calling_sequence := l_api_name;
7070 
7071 	l_debug_info := 'opening key cursor';
7072         IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7073           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,
7074                                         l_debug_info);
7075         END IF;
7076 
7077         OPEN key_Cur;
7078         LOOP
7079 
7080            FETCH key_Cur INTO l_item_key, l_item_type,
7081 		                   l_process, l_invoice_id;
7082 
7083            EXIT WHEN key_Cur%NOTFOUND OR key_Cur%NOTFOUND IS NULL;
7084 
7085 	   WF_Engine.abortProcess(
7086 			itemType => l_item_type,
7087 			itemKey  => l_item_key,
7088 			process => l_process);
7089 
7090 	   --we only need to clear for main process
7091 	   IF l_process = 'APPROVAL_MAIN' THEN
7092 
7093 	      AME_API2.clearAllApprovals(applicationIdIn => 200,
7094                        transactionIdIn     => to_char(l_invoice_id),
7095                        transactionTypeIn =>  'APINV');
7096 
7097            END IF;
7098 
7099         END LOOP;
7100         CLOSE key_Cur;
7101 
7102 	--Clear all iaw processing records
7103 
7104 	DELETE FROM AP_APINV_APPROVERS;
7105 
7106 
7107 	--Set the lines status
7108 	UPDATE  ap_invoice_lines_all
7109     	SET  wfapproval_status = 'NOT REQUIRED'
7110   	WHERE  wfapproval_status in ('INITIATED','REQUIRED'
7111 	                            ,'REJECTED','NEEDS WFREAPPROVAL'
7112 				    ,'STOPPED');
7113 
7114 	--Set the header status
7115 	UPDATE  ap_invoices_all
7116     	SET  wfapproval_status = 'NOT REQUIRED'
7117   	WHERE  wfapproval_status in ('INITIATED','REQUIRED'
7118 	                            ,'REJECTED','NEEDS WFREAPPROVAL'
7119 				    ,'STOPPED');
7120 
7121 EXCEPTION
7122   WHEN OTHERS THEN
7123 
7124     IF (SQLCODE <> -20001) THEN
7125       FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
7126       FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
7127       FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_calling_sequence);
7128       FND_MESSAGE.SET_TOKEN('DEBUG_INFO', l_debug_info);
7129     END IF;
7130     APP_EXCEPTION.RAISE_EXCEPTION;
7131 
7132 END Terminate_Approval;
7133 PROCEDURE wakeup_lineapproval_process( p_invoice_id IN NUMBER,
7134                                        p_itemkey  IN VARCHAR2) IS
7135 l_sent          NUMBER;
7136 l_invoice_key   VARCHAR2(50);
7137 l_api_name      CONSTANT VARCHAR2(200) := 'wakeup_lineapproval_process';
7138 l_debug_info    VARCHAR2(2000);
7139 
7140 BEGIN
7141    l_debug_info := 'Start';
7142    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7143           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7144                          l_api_name,l_debug_info);
7145    END IF;
7146    SELECT count(*)
7147    INTO  l_sent
7148    FROM  AP_APINV_APPROVERS
7149    WHERE Notification_status = 'SENT'
7150    AND   child_process_item_key = p_itemkey
7151    AND   invoice_id = p_invoice_id;
7152    IF l_sent = 0 THEN
7153       wf_engine.CompleteActivity(
7154                         itemType => 'APINVAPR',
7155                         itemKey  => p_itemkey,
7156                         activity => 'APPROVAL_INVOICE_LINES:WAITLINEAPRVL',
7157                         result   => 'NULL');
7158    ELSE
7159 
7160       BEGIN
7161 
7162          SELECT invoice_key
7163          INTO   l_invoice_key
7164          FROM   AP_APINV_APPROVERS
7165          WHERE  Notification_Key = p_itemkey
7166          AND    invoice_id = p_invoice_id
7167          AND    rownum = 1;
7168       EXCEPTION
7169          WHEN NO_DATA_FOUND THEN
7170             l_debug_info := 'No Data Found in SELECT from AP_APINV_APPROVERS' ;
7171          IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7172                 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7173                                l_api_name,l_debug_info);
7174          END IF;
7175          RAISE;
7176 
7177       END;
7178       l_debug_info := 'Before CompleteActivity APPROVAL_MAIN:BLOCK' ||
7179                       'l_invoice_key = ' || l_invoice_key;
7180       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7181              FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7182                             l_api_name,l_debug_info);
7183       END IF;
7184       BEGIN
7185          wf_engine.CompleteActivity(
7186                            itemType => 'APINVAPR',
7187                            itemKey  => l_invoice_key,
7188                            activity => 'APPROVAL_MAIN:BLOCK',
7189                            result   => 'NULL');
7190       EXCEPTION
7191       WHEN OTHERS THEN NULL;
7192       END;
7193    END IF;
7194    l_debug_info := 'End';
7195    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7196           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7197                          l_api_name,l_debug_info);
7198    END IF;
7199 EXCEPTION
7200    WHEN OTHERS THEN NULL;
7201 END wakeup_lineapproval_process;
7202 
7203 PROCEDURE is_invoice_matched(itemtype IN VARCHAR2,
7204                         itemkey IN VARCHAR2,
7205                         actid   IN NUMBER,
7206                         funcmode IN VARCHAR2,
7207                         resultout  OUT NOCOPY VARCHAR2 ) IS
7208    l_match_type VARCHAR2(80);
7209    l_debug_info            VARCHAR2(2000);
7210    l_api_name              CONSTANT VARCHAR2(200) := 'is_invoice_matched';
7211 BEGIN
7212    l_match_type := WF_ENGINE.GETITEMATTRText(itemtype,
7213                         itemkey,
7214                         'INV_MATCH_TYPE');
7215 
7216 
7217    IF l_match_type = 'MATCHED' THEN
7218       resultout := wf_engine.eng_completed||':'||'Y';
7219    ELSE
7220       resultout := wf_engine.eng_completed||':'||'N';
7221    END IF;
7222    l_debug_info := 'resultout : ' || resultout;
7223    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7224           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7225                          l_api_name,l_debug_info);
7226    END IF;
7227 EXCEPTION
7228 
7229 WHEN OTHERS
7230    THEN
7231         WF_CORE.CONTEXT('APINVAPR','is_invoice_matched',itemtype,
7232                         itemkey, to_char(actid), funcmode);
7233         RAISE;
7234 END is_invoice_matched;
7235 
7236 PROCEDURE aprvl_process_reject_int(itemtype IN VARCHAR2,
7237                         itemkey IN VARCHAR2,
7238                         actid   IN NUMBER,
7239                         funcmode IN VARCHAR2,
7240                         resultout  OUT NOCOPY VARCHAR2 ) IS
7241    l_api_name      CONSTANT VARCHAR2(200) := 'aprvl_process_reject_int';
7242    l_debug_info    VARCHAR2(2000);
7243    l_parent_key    VARCHAR2(150);
7244 BEGIN
7245    l_parent_key := WF_ENGINE.GetItemAttrText(itemtype,
7246                              itemkey,
7247                              'PARENT_KEY');
7248 
7249    wf_engine.CompleteActivity(
7250                         itemType => 'APINVAPR',
7251                         itemKey  => l_parent_key,
7252                         activity => 'APPROVAL_INVOICE:DOCUMENT_APPROVAL_REQUEST',
7253                         result   => 'REJECTED');
7254    resultout := wf_engine.eng_completed||':'||'Y';
7255 EXCEPTION
7256 
7257 WHEN OTHERS
7258    THEN
7259         WF_CORE.CONTEXT('APINVNEG','aprvl_process_reject_int',itemtype,
7260                         itemkey, to_char(actid), funcmode);
7261         RAISE;
7262 END aprvl_process_reject_int;
7263 PROCEDURE approve_button( p_itemkey  IN VARCHAR2) IS
7264 l_api_name      CONSTANT VARCHAR2(200) := 'approve_button';
7265 l_debug_info    VARCHAR2(2000);
7266 l_invoice_id    NUMBER(15); -- Bug 6845397
7267 
7268 BEGIN
7269    l_debug_info := 'Start';
7270    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7271           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7272                          l_api_name,l_debug_info);
7273    END IF;
7274    -- Bug 6845397. Getting invoice id.
7275    l_invoice_id := substr(p_itemkey, 1, instr(p_itemkey,'_')-1);
7276    BEGIN
7277       wf_engine.CompleteActivity(
7278                            itemType => 'APINVAPR',
7279                            itemKey  => p_itemkey,
7280                            activity => 'APPROVAL_INVOICE:DOCUMENT_APPROVAL_REQUEST',
7281                            result   => 'APPROVED');
7282    EXCEPTION
7283    WHEN OTHERS THEN NULL;
7284    END;
7285    -- Bug 6845397.
7286    -- Added code to set the generate_dists flag of invoice lines to D, if the line has
7287    -- atleast one invoice distribution.
7288 
7289    l_debug_info := 'Updating the generate_dists of ap_invoice_lines. Invoice_id = ' || l_invoice_id;
7290    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7291           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7292                          l_api_name,l_debug_info);
7293    END IF;
7294    update ap_invoice_lines_all ail
7295    set generate_dists = decode(ail.generate_dists, 'Y', 'D', ail.generate_dists)
7296    where ail.invoice_id = l_invoice_id
7297      and exists( select 1 from ap_invoice_distributions_all aid
7298                  where aid.invoice_id = l_invoice_id
7299                    and aid.invoice_line_number = ail.line_number) ;
7300 
7301    -- End bug 6845397
7302    l_debug_info := 'End';
7303    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7304           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7305                          l_api_name,l_debug_info);
7306    END IF;
7307 EXCEPTION
7308    WHEN OTHERS THEN
7309    l_debug_info := 'Exception during update.';
7310    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7311           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7312                          l_api_name,l_debug_info);
7313    END IF ;
7314    APP_EXCEPTION.RAISE_EXCEPTION;
7315 END approve_button;
7316 PROCEDURE reject_button( p_itemkey  IN VARCHAR2) IS
7317 l_api_name      CONSTANT VARCHAR2(200) := 'reject_button';
7318 l_debug_info    VARCHAR2(2000);
7319 
7320 BEGIN
7321    l_debug_info := 'Start';
7322    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7323           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7324                          l_api_name,l_debug_info);
7325    END IF;
7326    BEGIN
7327       wf_engine.CompleteActivity(
7328                            itemType => 'APINVAPR',
7329                            itemKey  => p_itemkey,
7330                            activity => 'APPROVAL_INVOICE:DOCUMENT_APPROVAL_REQUEST',
7331                            result   => 'REJECTED');
7332    EXCEPTION
7333    WHEN OTHERS THEN NULL;
7334    END;
7335    l_debug_info := 'End';
7336    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7337           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7338                          l_api_name,l_debug_info);
7339    END IF;
7340 EXCEPTION
7341       WHEN OTHERS THEN NULL;
7342 END reject_button;
7343 
7344 PROCEDURE accept_invoice_button( p_itemkey  IN VARCHAR2) IS
7345 l_api_name      CONSTANT VARCHAR2(200) := 'accept_invoice_button';
7346 l_debug_info    VARCHAR2(2000);
7347 
7348 BEGIN
7349    l_debug_info := 'Start';
7350    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7351           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7352                          l_api_name,l_debug_info);
7353    END IF;
7354    BEGIN
7355       wf_engine.CompleteActivity(
7356                           itemType => 'APINVNEG',
7357                           itemKey  => p_itemkey,
7358                           activity => 'APPROVAL_NEGOTIATION:NOTIFY_SUP_NEGOTIATION',
7359                           result   => 'ACCEPT');
7360    EXCEPTION
7361       WHEN OTHERS THEN NULL;
7362    END;
7363    l_debug_info := 'End';
7364    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7365           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7366                          l_api_name,l_debug_info);
7367    END IF;
7368 EXCEPTION
7369    WHEN OTHERS THEN NULL;
7370 END accept_invoice_button;
7371 PROCEDURE accept_invoice_int_button( p_itemkey  IN VARCHAR2) IS
7372 l_api_name      CONSTANT VARCHAR2(200) := 'accept_invoice_int_button';
7373 l_debug_info    VARCHAR2(2000);
7374 
7375 BEGIN
7376    l_debug_info := 'Start';
7377    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7378           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7379                          l_api_name,l_debug_info);
7380    END IF;
7381    BEGIN
7382       wf_engine.CompleteActivity(
7383                           itemType => 'APINVNEG',
7384                           itemKey  => p_itemkey,
7385                           activity => 'APPROVAL_NEGOTIATION:NOTIFY_INT_NEGOTIATION',
7386                           result   => 'ACCEPT');
7387    EXCEPTION
7388       WHEN OTHERS THEN NULL;
7389    END;
7390    l_debug_info := 'End';
7391    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7392           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7393                          l_api_name,l_debug_info);
7394    END IF;
7395 EXCEPTION
7396    WHEN OTHERS THEN NULL;
7397 END accept_invoice_int_button;
7398 
7399 PROCEDURE cancel_invoice_aprvl_button( p_itemkey  IN VARCHAR2) IS
7400 l_api_name      CONSTANT VARCHAR2(200) := 'cancel_invoice_aprvl_button';
7401 l_debug_info    VARCHAR2(2000);
7402 
7403 BEGIN
7404    l_debug_info := 'Start';
7405    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7406           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7407                          l_api_name,l_debug_info);
7408    END IF;
7409    BEGIN
7410       wf_engine.CompleteActivity(
7411                           itemType => 'APINVNEG',
7412                           itemKey  => p_itemkey,
7413                           activity => 'APPROVAL_NEGOTIATION:NOTIFY_SUP_NEGOTIATION',
7414                           result   => 'CANCELINVOICE');
7415    EXCEPTION
7416       WHEN OTHERS THEN NULL;
7417    END;
7418    l_debug_info := 'End';
7419    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7420           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7421                          l_api_name,l_debug_info);
7422    END IF;
7423 EXCEPTION
7424    WHEN OTHERS THEN NULL;
7425 END cancel_invoice_aprvl_button;
7426 
7427 PROCEDURE set_comments( p_itemkey  IN VARCHAR2,  p_notif_id IN VARCHAR2,  p_notes in VARCHAR2) IS
7428 l_api_name      CONSTANT VARCHAR2(200) := 'set_comments';
7429 l_debug_info    VARCHAR2(2000);
7430 BEGIN
7431 
7432    l_debug_info := 'Start';
7433    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7434           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7435                          l_api_name,l_debug_info);
7436    END IF;
7437 
7438    WF_ENGINE.SetItemAttrText('APINVAPR',
7439                         p_itemkey,
7440                         'WF_NOTE',
7441                         p_notes);
7442 
7443    l_debug_info := 'Inserting wf_notes for approval from product page';
7444    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7445           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7446                          l_api_name,l_debug_info);
7447    END IF;
7448 
7449 -- Save approval comments in wf_notification_attributes
7450 -- when approval action is triggered from product page (Inv Details)
7451 
7452    if p_notes is not null then
7453     WF_NOTIFICATION.setAttrText(	to_number(p_notif_id),
7454 				'WF_NOTE',
7455 				p_notes);
7456    end if;
7457 
7458    l_debug_info := 'End';
7459    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7460           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7461                          l_api_name,l_debug_info);
7462    END IF;
7463 
7464 EXCEPTION
7465    WHEN OTHERS THEN NULL;
7466 END;
7467 
7468 PROCEDURE is_payment_request(itemtype IN VARCHAR2,
7469                         itemkey IN VARCHAR2,
7470                         actid   IN NUMBER,
7471                         funcmode IN VARCHAR2,
7472                         resultout  OUT NOCOPY VARCHAR2 ) IS
7473    l_invoice_id ap_invoices_all.invoice_id%TYPE;
7474    l_inv_type ap_invoices_all.invoice_type_lookup_code%TYPE;
7475    l_debug_info            VARCHAR2(2000);
7476    l_api_name              CONSTANT VARCHAR2(200) := 'is_payment_request';
7477 BEGIN
7478    l_invoice_id := WF_ENGINE.GETITEMATTRNumber
7479                   (itemtype,
7480                    itemkey,
7481                    'INVOICE_ID');
7482    SELECT ai.invoice_type_lookup_code
7483    INTO   l_inv_type
7484    FROM   ap_invoices_all ai
7485    WHERE  invoice_id = l_invoice_id;
7486 
7487    IF l_inv_type = 'PAYMENT REQUEST' THEN
7488       resultout := wf_engine.eng_completed||':'||'Y';
7489    ELSE
7490       resultout := wf_engine.eng_completed||':'||'N';
7491    END IF;
7492    l_debug_info := 'resultout : ' || resultout;
7493    IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7494           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||
7495                          l_api_name,l_debug_info);
7496    END IF;
7497 EXCEPTION
7498 
7499 WHEN OTHERS
7500    THEN
7501         WF_CORE.CONTEXT('APINVAPR','is_payment_request',itemtype,
7502                         itemkey, to_char(actid), funcmode);
7503         RAISE;
7504 END is_payment_request;
7505 -- ANSETHUR 18-APR-2008
7506 /*
7507 PROCEDURE NAME : notification_handler
7508 PROJECT : R12 - Workflow Delegation enhancement
7509 PURPOSE : This procedure is attached to the notifications in order
7510           to populate the forward to role attribute during the delegation
7511           and to create history entries.Also the throws error when the
7512           notification ownership is transfered.
7513 */
7514 PROCEDURE notification_handler( itemtype  IN VARCHAR2,
7515                                 itemkey   IN VARCHAR2,
7516                                 actid     IN NUMBER,
7517                                 funcmode  IN VARCHAR2,
7518                                 resultout OUT NOCOPY VARCHAR2 ) IS
7519 l_invoice_id               NUMBER(15);
7520 l_iteration                NUMBER;
7521 l_status	                 VARCHAR2(50);
7522 l_response                 VARCHAR2(50);
7523 l_nid                      number;
7524 l_forward_to_person_id     number;
7525 l_result                   varchar2(100);
7526 l_orig_system              WF_ROLES.ORIG_SYSTEM%TYPE;
7527 l_orig_sys_id              WF_ROLES.ORIG_SYSTEM_ID%TYPE;
7528 l_role                     VARCHAR2(50);
7529 l_role_display             VARCHAR2(150);
7530 l_org_id                   NUMBER(15);
7531 l_name                     VARCHAR2(30);
7532 l_display_name             VARCHAR2(150);
7533 l_forward_to_user_id       WF_ROLES.ORIG_SYSTEM_ID%TYPE;
7534 l_esc_approver             AME_UTIL.approverRecord;
7535 l_rec_role                 VARCHAR2(50);
7536 l_comments                 VARCHAR2(240);
7537 l_hist_id                  NUMBER(15);
7538 l_amount                   ap_invoices_all.invoice_amount%TYPE;
7539 l_user_id                  NUMBER(15);
7540 l_login_id                 NUMBER(15);
7541 l_hist_rec                 AP_INV_APRVL_HIST%ROWTYPE;
7542 l_notf_iteration           NUMBER;
7543 l_role_name                VARCHAR2(50);
7544 l_esc_flag                 VARCHAR2(1);
7545 l_esc_role                 VARCHAR2(50);
7546 l_esc_role_actual          VARCHAR2(50);
7547 l_role_actual              VARCHAR2(50);
7548 l_fwd_role                 VARCHAR2(50);
7549 l_invoice_total            NUMBER;
7550 
7551 CURSOR c_get_user ( p_rec_role IN VARCHAR2 ) IS
7552   SELECT user_id,employee_id
7553   FROM   FND_USER
7554   WHERE  USER_NAME=p_rec_role;
7555 
7556 CURSOR c_get_response ( p_invoice_id IN NUMBER) IS
7557   Select response
7558   From   ap_inv_aprvl_hist
7559   WHERE  approval_history_id=(select max(approval_history_id)from ap_inv_aprvl_hist
7560 		                         where invoice_id= p_invoice_id);
7561 
7562 BEGIN
7563     l_nid := WF_ENGINE.context_nid;
7564     l_invoice_id := WF_ENGINE.GetItemAttrNumber(itemtype,
7565                                                 itemkey,
7566                                                 'INVOICE_ID');
7567 
7568     l_org_id := WF_ENGINE.GETITEMATTRNumber(  itemtype,
7569                                               itemkey,
7570                                               'ORG_ID');
7571 
7572     l_iteration := WF_ENGINE.GetItemAttrNumber( itemtype,
7573                                                 itemkey,
7574                                                 'ITERATION');
7575     l_comments := WF_ENGINE.GetItemAttrText(itemtype,
7576                                             itemkey,
7577                                             'WF_NOTE');
7578     l_notf_iteration := WF_ENGINE.GetItemAttrnumber(itemtype,
7579                                                     itemkey,
7580                                                     'NOTF_ITERATION');
7581     l_esc_flag := WF_ENGINE.GetItemAttrnumber(itemtype,
7582                                                     itemkey,
7583                                                     'ESCALATED');
7584     l_role_actual := WF_ENGINE.GetItemAttrText(itemtype,
7585                                             itemkey,
7586                                             'ROLE_ACTUAL');
7587     l_esc_role_actual := WF_ENGINE.GetItemAttrText(itemtype,
7588                                             itemkey,
7589                                             'ESC_ROLE_ACTUAL');
7590     l_fwd_role := WF_ENGINE.GetItemAttrText(itemtype,
7591                                             itemkey,
7592                                             'FORWARD_ROLE');
7593    l_invoice_total := WF_ENGINE.GETITEMATTRNumber(itemtype,
7594                    itemkey,
7595                    'INVOICE_TOTAL');
7596 -- getting approver in the document_approver and setting in the ROLE_ACTUAL attribute
7597 -- So even if the notification is delegated the ame will be updated in the for the actual approver
7598 -- the further level of approval will be done by the owners supervisors and also the same
7599 -- notification won't be sent to  this approver again
7600          IF ((nvl(l_esc_flag,'N') = 'N')and (l_fwd_role is null) ) THEN
7601           l_role_name :=WF_ENGINE.GetItemAttrText(itemtype,
7602                                     itemkey,
7603                                     'DOCUMENT_APPROVER');
7604           WF_ENGINE.SetItemAttrText(itemtype,
7605                                     itemkey,
7606                                     'ROLE_ACTUAL',
7607                                     l_role_name);
7608 
7609           elsif ((nvl(l_esc_flag,'N') = 'Y')and (l_esc_role_actual is null) ) THEN
7610           l_esc_role :=WF_ENGINE.GetItemAttrText( itemtype,
7611                                                   itemkey,
7612                                                   'ESC_ROLE_NAME');
7613           WF_ENGINE.SetItemAttrText( itemtype,
7614                                      itemkey,
7615                                      'ESC_ROLE_ACTUAL',
7616                                      l_esc_role);
7617 
7618           end if ;
7619 -- end
7620 
7621 
7622   IF (funcmode ='FORWARD') then
7623          l_rec_role :=WF_ENGINE.context_text;
7624          l_status:='DELEGATED';
7625 
7626          --fnd_client_info.set_org_context(l_org_id);
7627           --Now set the environment
7628          MO_GLOBAL.INIT ('SQLAP');
7629          MO_GLOBAL.set_policy_context('S',l_org_id);
7630 
7631 
7632          /*insert_history(      l_invoice_id,
7633                               l_iteration,
7634                               l_org_id,
7635                               l_status);*/
7636 
7637 
7638 
7639           OPEN  c_get_user ( l_rec_role);
7640           FETCH c_get_user INTO l_forward_to_user_id,l_forward_to_person_id;
7641           CLOSE c_get_user;
7642 
7643           IF l_forward_to_person_id is not NULL then
7644                      l_orig_system := 'PER';
7645                      l_orig_sys_id := l_forward_to_person_id;
7646           ELSE
7647                      l_orig_system := 'FND_USR';
7648                      l_orig_sys_id := l_forward_to_user_id;
7649           END IF;
7650           WF_DIRECTORY.GetRoleName( l_orig_system,
7651                                     l_orig_sys_id,
7652                                     l_role,
7653                                     l_role_display);
7654 
7655           WF_DIRECTORY.GetUserName( l_orig_system,
7656                                     l_orig_sys_id,
7657                                     l_name,
7658                                     l_display_name);
7659 
7660 
7661           WF_ENGINE.SetItemAttrText(itemtype,
7662                                     itemkey,
7663                                     'FORWARD_ROLE',
7664                                     l_role);
7665         IF nvl(l_esc_flag,'N') = 'N' THEN
7666 
7667 
7668           WF_ENGINE.SetItemAttrText(itemtype,
7669                                     itemkey,
7670                                     'DOCUMENT_APPROVER',
7671                                     l_role);
7672           WF_ENGINE.SetItemAttrText( itemtype,
7673                                      itemkey,
7674                                      'APPROVER_NAME',
7675                                      l_display_name);
7676 
7677            WF_ENGINE.SetItemAttrNumber(itemtype,
7678                                        itemkey,
7679                                        'APPROVER_ID',
7680                                        l_orig_sys_id);
7681        /* WF_ENGINE.SetItemAttrText( itemtype,
7682                                      itemkey,
7683                                      'ORIG_SYSTEM',
7684                                      l_orig_system);     */
7685 
7686         else
7687           WF_ENGINE.SetItemAttrText(itemtype,
7688                                     itemkey,
7689                                     'ESC_ROLE_NAME',
7690                                     l_role);
7691           WF_ENGINE.SetItemAttrText( itemtype,
7692                                      itemkey,
7693                                      'ESC_APPROVER_NAME',
7694                                      l_display_name);
7695 
7696            WF_ENGINE.SetItemAttrNumber(itemtype,
7697                                        itemkey,
7698                                        'ESC_APPROVER_ID',
7699                                        l_orig_sys_id);
7700 
7701         end if ;
7702 
7703           l_comments                    := nvl(l_comments,'None');
7704           l_comments                    :='To: '||l_display_name||' '||'    With Comment:'||l_comments;
7705 
7706           l_hist_rec.HISTORY_TYPE       := 'DOCUMENTAPPROVAL';
7707           l_hist_rec.INVOICE_ID         := l_invoice_id;
7708           l_hist_rec.ITERATION          := l_iteration;
7709           l_hist_rec.RESPONSE           := l_status;
7710 
7711           l_hist_rec.APPROVER_ID        := l_orig_sys_id;
7712           l_hist_rec.APPROVER_NAME      := l_display_name;
7713 
7714           l_hist_rec.CREATED_BY         := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
7715           l_hist_rec.CREATION_DATE      := sysdate;
7716           l_hist_rec.LAST_UPDATE_DATE   := sysdate;
7717           l_hist_rec.LAST_UPDATED_BY    := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
7718           l_hist_rec.LAST_UPDATE_LOGIN  := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
7719           l_hist_rec.ORG_ID             := l_org_id;
7720           l_hist_rec.AMOUNT_APPROVED    := l_invoice_total;--0;
7721           l_hist_rec.NOTIFICATION_ORDER := l_notf_iteration;
7722           l_hist_rec.APPROVER_COMMENTS  := l_comments;
7723 
7724           insert_history_table(p_hist_rec => l_hist_rec);
7725 
7726            /*--Bug6406901, added the approver_name to the update cmd to populate correct value in AP_INV_APRVL_HLIST
7727            UPDATE AP_INV_APRVL_HIST
7728            set   APPROVER_COMMENTS = l_comments, approver_name = l_display_name
7729            WHERE APPROVAL_HISTORY_ID =(select max(APPROVAL_HISTORY_ID) from AP_INV_APRVL_HIST
7730                                         where invoice_id=l_invoice_id);*/
7731            resultout := wf_engine.eng_completed || ':' || wf_engine.eng_null;
7732            return;
7733    End if;
7734 
7735       /* BEGIN
7736            Select response into l_response
7737            From   ap_inv_aprvl_hist
7738            WHERE  approval_history_id=(select max(approval_history_id)from ap_inv_aprvl_hist
7739     			                             where invoice_id=l_invoice_id);
7740        EXCEPTION
7741          WHEN OTHERS THEN
7742           NULL;
7743        END; */
7744           OPEN  c_get_response ( l_invoice_id);
7745           FETCH c_get_response INTO l_response;
7746           CLOSE c_get_response;
7747 
7748 	IF (funcmode = 'RESPOND' and l_response='DELEGATED') then
7749             /*l_result := wf_notification.GetAttrText(l_nid, 'RESULT');
7750 
7751             If (l_result='APPROVED') then
7752             l_result:='WFAPPROVED';
7753             End IF;
7754 
7755 
7756             insert_history(l_invoice_id,
7757                         l_iteration,
7758                         l_org_id,
7759                         l_result);
7760 
7761 
7762           WF_ENGINE.SetItemAttrText(  itemtype,
7763                                       itemkey,
7764                                       'FORWARD_ROLE',
7765                                       NULL);-- */
7766 
7767             resultout := wf_engine.eng_completed || ':' || wf_engine.eng_null;
7768             return;
7769   End if;
7770 
7771 
7772   -- Don't allow transfer
7773   if ( funcmode = 'TRANSFER' ) then
7774        resultout := 'ERROR:WFSRV_NO_DELEGATE';
7775        return;
7776   end if;
7777 
7778 return;
7779 EXCEPTION
7780 
7781 WHEN OTHERS
7782    THEN
7783         WF_CORE.CONTEXT('AP_WF',itemtype, itemkey, to_char(actid), funcmode);
7784         RAISE;
7785 
7786 END;
7787 /*
7788 PROCEDURE NAME : forward_check
7789 PROJECT : R12 - Workflow Delegation enhancement
7790 PURPOSE : This procedure is attached to the check_forward node.
7791           This procedure checks before escalation whether the notification
7792           is forwarded when there is a time out. If the result is N
7793           (i.e when the notification is not a forwarded one) ,
7794           then the escalation notification is sent.If the result is Y, then the
7795           document is rejected.
7796 */
7797 PROCEDURE forward_check(itemtype   IN VARCHAR2,
7798                         itemkey    IN VARCHAR2,
7799                         actid      IN NUMBER,
7800                         funcmode   IN VARCHAR2,
7801                         resultout  OUT NOCOPY VARCHAR2 ) IS
7802 l_forward_role_name   varchar2(50);
7803 l_current_role_name   varchar2(50);
7804 l_temp_invoice_id     NUMBER(15);     -- Bug 5037108
7805 l_error_message       VARCHAR2(2000); -- Bug 5037108
7806 l_debug_info 	        VARCHAR2(50);   -- Bug 5037108
7807 
7808 BEGIN
7809   l_forward_role_name :=     WF_ENGINE.GetItemAttrText(itemtype,
7810                               itemkey,
7811                               'FORWARD_ROLE');
7812   l_current_role_name :=     WF_ENGINE.GetItemAttrText(itemtype,
7813                               itemkey,
7814                               'DOCUMENT_APPROVER');
7815 
7816   IF  l_forward_role_name is NULL or l_forward_role_name=' ' THEN
7817             resultout := wf_engine.eng_completed||':'||'N';
7818   ELSE
7819         IF(nvl(l_forward_role_name,'') = nvl(l_current_role_name,'')) then
7820             resultout := wf_engine.eng_completed||':'||'Y';
7821        /* -- Bug 5037108 starts
7822              BEGIN
7823                 SELECT invoice_id
7824                 INTO l_temp_invoice_id
7825                 FROM ap_invoices
7826                 WHERE invoice_id = substr(itemkey, 1, instr(itemkey,'_')-1)
7827   	            AND  wfapproval_status <> 'MANUALLY APPROVED'
7828                 FOR UPDATE NOWAIT;
7829 
7830               EXCEPTION
7831                WHEN OTHERS THEN
7832                 l_debug_info := 'Invoice is in lock. Please try later';
7833                 FND_MESSAGE.Set_Name('SQLAP', 'AP_CARD_VERIFY_LOCK_FAILED');
7834                 l_error_message := FND_MESSAGE.Get;
7835                 APP_EXCEPTION.RAISE_EXCEPTION;
7836               END;
7837         -- Bug 5037108 Ends
7838 
7839                 UPDATE AP_INVOICES
7840                 SET wfapproval_status = 'REJECTED'
7841                 WHERE invoice_id = substr(itemkey, 1, instr(itemkey,'_')-1)
7842                 AND wfapproval_status <> 'MANUALLY APPROVED'; */
7843         ELSE
7844               resultout := wf_engine.eng_completed||':'||'N';
7845         END If;
7846 
7847   END IF;
7848 
7849 EXCEPTION
7850 
7851 WHEN FND_API.G_EXC_ERROR
7852         THEN
7853           WF_CORE.CONTEXT('APINV','SELECT_APPROVER',itemtype, itemkey,
7854                                   to_char(actid), funcmode);
7855           RAISE;
7856 WHEN FND_API.G_EXC_UNEXPECTED_ERROR
7857         THEN
7858           WF_CORE.CONTEXT('APINV','SELECT_APPROVER',itemtype, itemkey,
7859                                   to_char(actid), funcmode);
7860           RAISE;
7861 
7862 WHEN OTHERS
7863         THEN
7864           WF_CORE.CONTEXT('APINV','SELECT_APPROVER',itemtype, itemkey,
7865                                   to_char(actid), funcmode);
7866           RAISE;
7867 
7868 END;
7869 /*
7870 PROCEDURE NAME : notification_handler_lines
7871 PROJECT : R12 - Workflow Delegation enhancement
7872 PURPOSE : This procedure is attached to the notifications in the lines Approval
7873           in order to populate the forward to role attribute during the delegation
7874           and to create history entries.Also the throws error when the
7875           notification ownership is transfered.
7876 */
7877 PROCEDURE notification_handler_lines( itemtype  IN VARCHAR2,
7878                                 itemkey   IN VARCHAR2,
7879                                 actid     IN NUMBER,
7880                                 funcmode  IN VARCHAR2,
7881                                 resultout OUT NOCOPY VARCHAR2 ) IS
7882 l_invoice_id               NUMBER(15);
7883 l_iteration                NUMBER;
7884 l_status	                 VARCHAR2(50);
7885 l_response                 VARCHAR2(50);
7886 l_nid                      number;
7887 l_forward_to_person_id     number;
7888 l_result                   varchar2(100);
7889 l_orig_system              WF_ROLES.ORIG_SYSTEM%TYPE;
7890 l_orig_sys_id              WF_ROLES.ORIG_SYSTEM_ID%TYPE;
7891 l_role                     VARCHAR2(50);
7892 l_role_display             VARCHAR2(150);
7893 l_org_id                   NUMBER(15);
7894 l_name                     VARCHAR2(30);
7895 l_display_name             VARCHAR2(150);
7896 l_forward_to_user_id       WF_ROLES.ORIG_SYSTEM_ID%TYPE;
7897 l_esc_approver             AME_UTIL.approverRecord;
7898 l_rec_role                 VARCHAR2(50);
7899 l_comments                 VARCHAR2(240);
7900 l_hist_id                  NUMBER(15);
7901 l_amount                   ap_invoices_all.invoice_amount%TYPE;
7902 l_user_id                  NUMBER(15);
7903 l_login_id                 NUMBER(15);
7904 l_hist_rec                 AP_INV_APRVL_HIST%ROWTYPE;
7905 l_notf_iteration           NUMBER;
7906 l_line_number              ap_invoice_lines_all.line_number%TYPE;
7907 l_line_amount              ap_invoice_lines_all.amount%TYPE;
7908 l_role_name                varchar2(50);
7909 l_esc_flag                 varchar2(1);
7910 l_esc_role                 varchar2(50);
7911 
7912 
7913 CURSOR c_get_user ( p_rec_role IN VARCHAR2 ) IS
7914   SELECT user_id,employee_id
7915   FROM   FND_USER
7916   WHERE  USER_NAME=p_rec_role;
7917 
7918 CURSOR c_get_response ( p_invoice_id IN NUMBER) IS
7919   Select response
7920   From   ap_inv_aprvl_hist
7921   WHERE  approval_history_id=(select max(approval_history_id)from ap_inv_aprvl_hist
7922 		                         where invoice_id= p_invoice_id);
7923 
7924 
7925    CURSOR   Items_Cur(itemkey IN VARCHAR2) IS
7926    SELECT  al.line_number, al.amount
7927    FROM   AP_APINV_APPROVERS invap, AP_INVOICE_LINES_ALL al
7928    WHERE  invap.Notification_Key = itemkey
7929    AND    al.line_number = invap.line_number
7930    AND    al.invoice_id  = invap.invoice_id;
7931 BEGIN
7932     l_nid := WF_ENGINE.context_nid;
7933     l_invoice_id := WF_ENGINE.GetItemAttrNumber(itemtype,
7934                                                 itemkey,
7935                                                 'INVOICE_ID');
7936 
7937     l_org_id := WF_ENGINE.GETITEMATTRNumber(  itemtype,
7938                                               itemkey,
7939                                               'ORG_ID');
7940 
7941     l_iteration := WF_ENGINE.GetItemAttrNumber( itemtype,
7942                                                 itemkey,
7943                                                 'ITERATION');
7944     l_comments := WF_ENGINE.GetItemAttrText(itemtype,
7945                                             itemkey,
7946                                             'WF_NOTE');
7947     l_notf_iteration := WF_ENGINE.GetItemAttrnumber(itemtype,
7948                                                     itemkey,
7949                                                     'NOTF_ITERATION');
7950     l_esc_flag := WF_ENGINE.GetItemAttrText(itemtype,
7951                                             itemkey,
7952                                             'ESCALATED');
7953 
7954 -- getting approver in the ROLE_NAME and setting in the ROLE_ACTUAL attribute
7955 -- on case of escalated notifications getting the approver from ESC_ROLE_NAME and setting it to ESC_ROLE_ACTUAL
7956 -- So even if the notification is delegated the ame will be updated in the for the actual approver
7957 -- the further level of approval will be done by the owners supervisors and also the same
7958 -- notification won't be sent to  this approver again
7959         IF nvl(l_esc_flag,'N') = 'N' THEN
7960           l_role_name :=WF_ENGINE.GetItemAttrText(itemtype,
7961                                     itemkey,
7962                                     'ROLE_NAME');
7963 
7964           WF_ENGINE.SetItemAttrText(itemtype,
7965                                     itemkey,
7966                                     'ROLE_ACTUAL',
7967                                     l_role_name);
7968 
7969         elsif nvl(l_esc_flag,'N') = 'Y' THEN
7970           l_esc_role :=WF_ENGINE.GetItemAttrText( itemtype,
7971                                                   itemkey,
7972                                                   'ESC_ROLE_NAME');
7973           WF_ENGINE.SetItemAttrText( itemtype,
7974                                      itemkey,
7975                                      'ESC_ROLE_ACTUAL',
7976                                      l_esc_role);
7977 
7978         end if ;
7979 -- end
7980   IF (funcmode ='FORWARD') then
7981          l_rec_role :=WF_ENGINE.context_text;
7982          l_status:='DELEGATED';
7983 
7984          --fnd_client_info.set_org_context(l_org_id);
7985           --Now set the environment
7986          MO_GLOBAL.INIT ('SQLAP');
7987          MO_GLOBAL.set_policy_context('S',l_org_id);
7988 
7989 
7990          /*insert_history(      l_invoice_id,
7991                               l_iteration,
7992                               l_org_id,
7993                               l_status);*/
7994 
7995 
7996 
7997           OPEN  c_get_user ( l_rec_role);
7998           FETCH c_get_user INTO l_forward_to_user_id,l_forward_to_person_id;
7999           CLOSE c_get_user;
8000 
8001           IF l_forward_to_person_id is not NULL then
8002                      l_orig_system := 'PER';
8003                      l_orig_sys_id := l_forward_to_person_id;
8004           ELSE
8005                      l_orig_system := 'FND_USR';
8006                      l_orig_sys_id := l_forward_to_user_id;
8007           END IF;
8008           WF_DIRECTORY.GetRoleName( l_orig_system,
8009                                     l_orig_sys_id,
8010                                     l_role,
8011                                     l_role_display);
8012 
8013           WF_DIRECTORY.GetUserName( l_orig_system,
8014                                     l_orig_sys_id,
8015                                     l_name,
8016                                     l_display_name);
8017 
8018           WF_ENGINE.SetItemAttrText(itemtype,
8019                                     itemkey,
8020                                     'FORWARD_ROLE_LINES',
8021                                     l_role);
8022 
8023 
8024      IF nvl(l_esc_flag,'N') = 'N' THEN
8025 
8026 
8027           WF_ENGINE.SetItemAttrText(itemtype,
8028                                     itemkey,
8029                                     'ROLE_NAME',
8030                                     l_role);
8031           WF_ENGINE.SetItemAttrText( itemtype,
8032                                      itemkey,
8033                                      'APPROVER_NAME',
8034                                      l_display_name);
8035 
8036            WF_ENGINE.SetItemAttrNumber(itemtype,
8037                                        itemkey,
8038                                        'APPROVER_ID',
8039                                        l_orig_sys_id);
8040        /* WF_ENGINE.SetItemAttrText( itemtype,
8041                                      itemkey,
8042                                      'ORIG_SYSTEM',
8043                                      l_orig_system);     */
8044 
8045         else
8046           WF_ENGINE.SetItemAttrText(itemtype,
8047                                     itemkey,
8048                                     'ESC_ROLE_NAME',
8049                                     l_role);
8050           WF_ENGINE.SetItemAttrText( itemtype,
8051                                      itemkey,
8052                                      'ESC_APPROVER_NAME',
8053                                      l_display_name);
8054 
8055            WF_ENGINE.SetItemAttrNumber(itemtype,
8056                                        itemkey,
8057                                        'ESC_APPROVER_ID',
8058                                        l_orig_sys_id);
8059 
8060         end if ;
8061 
8062           l_comments                    := nvl(l_comments,'None');
8063           l_comments                    :='To: '||l_display_name||' '||'    With Comment:'||l_comments;
8064 
8065           l_hist_rec.HISTORY_TYPE       := 'LINESAPPROVAL';
8066           l_hist_rec.INVOICE_ID         := l_invoice_id;
8067           l_hist_rec.ITERATION          := l_iteration;
8068           l_hist_rec.RESPONSE           := l_status;
8069           l_hist_rec.APPROVER_ID        := l_orig_sys_id;
8070           l_hist_rec.APPROVER_NAME      := l_display_name;
8071           l_hist_rec.CREATED_BY         := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
8072           l_hist_rec.CREATION_DATE      := sysdate;
8073           l_hist_rec.LAST_UPDATE_DATE   := sysdate;
8074           l_hist_rec.LAST_UPDATED_BY    := nvl(TO_NUMBER(FND_PROFILE.VALUE('USER_ID')),-1);
8075           l_hist_rec.LAST_UPDATE_LOGIN  := nvl(TO_NUMBER(FND_PROFILE.VALUE('LOGIN_ID')),-1);
8076           l_hist_rec.ORG_ID             := l_org_id;
8077           l_hist_rec.AMOUNT_APPROVED    := 0;
8078           l_hist_rec.NOTIFICATION_ORDER := l_notf_iteration;
8079           l_hist_rec.APPROVER_COMMENTS  := l_comments;
8080           /*l_hist_rec.line_number        := l_line_number;
8081           l_hist_rec.AMOUNT_APPROVED    := l_line_amount;
8082 
8083           insert_history_table(p_hist_rec => l_hist_rec);*/
8084 
8085            OPEN Items_Cur(itemkey);
8086            LOOP
8087 
8088               FETCH Items_Cur INTO l_line_number, l_line_amount;
8089               EXIT WHEN Items_Cur%NOTFOUND OR Items_Cur%NOTFOUND IS NULL;
8090 
8091 
8092               l_hist_rec.line_number   := l_line_number;
8093               l_hist_rec.AMOUNT_APPROVED   := l_line_amount;
8094 
8095               insert_history_table(p_hist_rec => l_hist_rec);
8096            END LOOP;
8097            CLOSE Items_Cur;
8098            /*--Bug6406901, added the approver_name to the update cmd to populate correct value in AP_INV_APRVL_HLIST
8099            UPDATE AP_INV_APRVL_HIST
8100            set   APPROVER_COMMENTS = l_comments, approver_name = l_display_name
8101            WHERE APPROVAL_HISTORY_ID =(select max(APPROVAL_HISTORY_ID) from AP_INV_APRVL_HIST
8102                                         where invoice_id=l_invoice_id);*/
8103            resultout := wf_engine.eng_completed || ':' || wf_engine.eng_null;
8104            return;
8105    End if;
8106 
8107       /* BEGIN
8108            Select response into l_response
8109            From   ap_inv_aprvl_hist
8110            WHERE  approval_history_id=(select max(approval_history_id)from ap_inv_aprvl_hist
8111     			                             where invoice_id=l_invoice_id);
8112        EXCEPTION
8113          WHEN OTHERS THEN
8114           NULL;
8115        END; */
8116 
8117         /*  OPEN  c_get_response ( l_invoice_id);
8118           FETCH c_get_response INTO l_response;
8119           CLOSE c_get_response;
8120 
8121 	IF (funcmode = 'RESPOND' and l_response='DELEGATED') then
8122             l_result := wf_notification.GetAttrText(l_nid, 'RESULT');
8123 
8124             If (l_result='APPROVED') then
8125             l_result:='WFAPPROVED';
8126             End IF;
8127 
8128 
8129             insert_history(l_invoice_id,
8130                         l_iteration,
8131                         l_org_id,
8132                         l_result);
8133 
8134 
8135           WF_ENGINE.SetItemAttrText(  itemtype,
8136                                       itemkey,
8137                                       'FORWARD_ROLE',
8138                                       NULL);
8139 
8140             resultout := wf_engine.eng_completed || ':' || wf_engine.eng_null;
8141             return;
8142   End if;*/
8143   -- Don't allow transfer
8144   if ( funcmode = 'TRANSFER' ) then
8145        resultout := 'ERROR:WFSRV_NO_DELEGATE';
8146        return;
8147   end if;
8148 
8149 return;
8150 EXCEPTION
8151 
8152 WHEN OTHERS
8153    THEN
8154         WF_CORE.CONTEXT('AP_WF',itemtype, itemkey, to_char(actid), funcmode);
8155         RAISE;
8156 
8157 END;
8158 /*
8159 PROCEDURE NAME : forward_check_lines
8160 PROJECT : R12 - Workflow Delegation enhancement
8161 PURPOSE : This procedure is attached to the check_forward_lines node.
8162           This procedure checks before escalation whether the notification
8163           is forwarded when there is a time out. If the result is N
8164           (i.e when the notification is not a forwarded one) ,
8165           then the escalation notification is sent.If the result is Y, then the
8166           document is rejected.
8167 */
8168 PROCEDURE forward_check_lines(itemtype   IN VARCHAR2,
8169                         itemkey    IN VARCHAR2,
8170                         actid      IN NUMBER,
8171                         funcmode   IN VARCHAR2,
8172                         resultout  OUT NOCOPY VARCHAR2 ) IS
8173 l_forward_role_name   varchar2(50);
8174 l_current_role_name   varchar2(50);
8175 l_temp_invoice_id     NUMBER(15);
8176 l_error_message       VARCHAR2(2000);
8177 l_debug_info 	        VARCHAR2(50);
8178 
8179 BEGIN
8180   l_forward_role_name :=     WF_ENGINE.GetItemAttrText(itemtype,
8181                               itemkey,
8182                               'FORWARD_ROLE_LINES');
8183   l_current_role_name :=     WF_ENGINE.GetItemAttrText(itemtype,
8184                               itemkey,
8185                               'ROLE_NAME');
8186 
8187   IF  l_forward_role_name is NULL or l_forward_role_name=' ' THEN
8188             resultout := wf_engine.eng_completed||':'||'N';
8189   ELSE
8190         IF(nvl(l_forward_role_name,'') = nvl(l_current_role_name,'')) then
8191             resultout := wf_engine.eng_completed||':'||'Y';
8192        /* -- Bug 5037108 starts
8193              BEGIN
8194                 SELECT invoice_id
8195                 INTO l_temp_invoice_id
8196                 FROM ap_invoices
8197                 WHERE invoice_id = substr(itemkey, 1, instr(itemkey,'_')-1)
8198   	            AND  wfapproval_status <> 'MANUALLY APPROVED'
8199                 FOR UPDATE NOWAIT;
8200 
8201               EXCEPTION
8202                WHEN OTHERS THEN
8203                 l_debug_info := 'Invoice is in lock. Please try later';
8204                 FND_MESSAGE.Set_Name('SQLAP', 'AP_CARD_VERIFY_LOCK_FAILED');
8205                 l_error_message := FND_MESSAGE.Get;
8206                 APP_EXCEPTION.RAISE_EXCEPTION;
8207               END;
8208         -- Bug 5037108 Ends
8209 
8210                 UPDATE AP_INVOICES
8211                 SET wfapproval_status = 'REJECTED'
8212                 WHERE invoice_id = substr(itemkey, 1, instr(itemkey,'_')-1)
8213                 AND wfapproval_status <> 'MANUALLY APPROVED'; */
8214         ELSE
8215               resultout := wf_engine.eng_completed||':'||'N';
8216         END If;
8217 
8218   END IF;
8219 
8220 EXCEPTION
8221 
8222 WHEN FND_API.G_EXC_ERROR
8223         THEN
8224           WF_CORE.CONTEXT('APINV','SELECT_APPROVER',itemtype, itemkey,
8225                                   to_char(actid), funcmode);
8226           RAISE;
8227 WHEN FND_API.G_EXC_UNEXPECTED_ERROR
8228         THEN
8229           WF_CORE.CONTEXT('APINV','SELECT_APPROVER',itemtype, itemkey,
8230                                   to_char(actid), funcmode);
8231           RAISE;
8232 
8233 WHEN OTHERS
8234         THEN
8235           WF_CORE.CONTEXT('APINV','SELECT_APPROVER',itemtype, itemkey,
8236                                   to_char(actid), funcmode);
8237           RAISE;
8238 
8239 END;
8240 END AP_WORKFLOW_PKG;