[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;