[Home] [Help]
PACKAGE BODY: APPS.PO_DOCUMENT_ACTION_AUTH
Source
1 PACKAGE BODY PO_DOCUMENT_ACTION_AUTH AS
2 -- $Header: POXDAAPB.pls 120.8.12020000.3 2013/02/10 17:04:21 vegajula ship $
3
4 -- Private package constants
5
6 g_pkg_name CONSTANT varchar2(30) := 'PO_DOCUMENT_ACTION_AUTH';
7 g_log_head CONSTANT VARCHAR2(50) := 'po.plsql.'|| g_pkg_name || '.';
8
9
10 -- Forward Declare Private Methods
11 --As part of bug fix 13507482, changing this procedure to public
12 /*
13 PROCEDURE get_supply_action_name(
14 p_action IN VARCHAR2
15 , p_document_type IN VARCHAR2
16 , p_document_subtype IN VARCHAR2
17 , x_supply_action OUT NOCOPY VARCHAR2
18 , x_return_status OUT NOCOPY VARCHAR2
19 );
20 */
21
22 -- Public Methods (to be used only by other DOCUMENT_ACTION packages)
23
24 ------------------------------------------------------------------------------
25 --Start of Comments
26 --Name: approve
27 --Pre-reqs:
28 -- Document is locked.
29 -- Org context is set to that of document.
30 --Modifies:
31 -- None, directly.
32 --Locks:
33 -- None.
34 --Function:
35 -- This procedure handles logic to approves a document.
36 -- The logic is:
37 -- 1. update action history
38 -- 2. update document authorization status and approved flags
39 -- 3. if not a PA, call appropriate supply action
40 -- 4. if not a requisition, archive the document.
41 --Replaces:
42 -- This method covers some of the logic in poxdmaction in poxdm.lpc.
43 --Parameters:
44 --IN:
45 -- p_action_ctl_rec
46 -- Record containing all necessary parameters for action.
47 --OUT:
48 -- p_action_ctl_rec
49 -- Record contains variables that record output values depending
50 -- on the action. All actions will populate at least a return_status.
51 --End of Comments
52 -------------------------------------------------------------------------------
53 PROCEDURE approve(
54 p_action_ctl_rec IN OUT NOCOPY PO_DOCUMENT_ACTION_PVT.doc_action_call_rec_type
55 )
56 IS
57
58 l_ret_sts VARCHAR2(1);
59 l_err_msg VARCHAR2(200);
60 l_bool_ret_sts BOOLEAN;
61
62 l_msg_data VARCHAR2(2000);
63 l_msg_count NUMBER;
64
65 d_progress NUMBER;
66 d_module VARCHAR2(70) := 'po.plsql.PO_DOCUMENT_ACTION_AUTH.approve';
67
68 l_supply_action VARCHAR2(40);
69 l_enable_payment_inst VARCHAR2(1); -- Payment Instruction
70 l_org_id NUMBER;
71
72 BEGIN
73
74 d_progress := 0;
75 IF (PO_LOG.d_proc) THEN
76 PO_LOG.proc_begin(d_module);
77 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.document_id', p_action_ctl_rec.document_id);
78 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.document_type', p_action_ctl_rec.document_type);
79 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.document_subtype', p_action_ctl_rec.document_subtype);
80 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.action', p_action_ctl_rec.action);
81 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.new_document_status', p_action_ctl_rec.new_document_status);
82 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.employee_id', p_action_ctl_rec.employee_id);
83 END IF;
84
85 d_progress := 10;
86
87 BEGIN
88
89 IF (PO_LOG.d_stmt) THEN
90 PO_LOG.stmt(d_module, d_progress, 'Calling change_doc_auth_state');
91 END IF;
92
93 PO_DOCUMENT_ACTION_UTIL.change_doc_auth_state(
94 p_document_id => p_action_ctl_rec.document_id
95 , p_document_type => p_action_ctl_rec.document_type
96 , p_document_subtype => p_action_ctl_rec.document_subtype
97 , p_draft_id => p_action_ctl_rec.draft_id -- Bug 13444730
98 , p_action => 'APPROVE'
99 , p_fwd_to_id => p_action_ctl_rec.forward_to_id
100 , p_offline_code => p_action_ctl_rec.offline_code
101 , p_approval_path_id => p_action_ctl_rec.approval_path_id
102 , p_note => p_action_ctl_rec.note
103 , p_new_status => PO_DOCUMENT_ACTION_PVT.g_doc_status_APPROVED
104 , p_notify_action => 'APPROVAL'
105 , p_notify_employee => p_action_ctl_rec.forward_to_id
106 , x_return_status => l_ret_sts
107 );
108
109 IF (l_ret_sts <> 'S')
110 THEN
111
112 d_progress := 20;
113 p_action_ctl_rec.return_status := 'U';
114 l_err_msg := 'change_doc_auth_state not successful';
115 RAISE PO_CORE_S.g_early_return_exc;
116
117 END IF;
118 /* Bug 14046925 : Skipping supply and archive for Mod*/
119 if p_action_ctl_rec.draft_id <> -1 then
120 p_action_ctl_rec.return_status := 'S';
121 return;
122 end if;
123
124 d_progress := 30;
125
126 IF (p_action_ctl_rec.document_type <> 'PA')
127 THEN
128
129 get_supply_action_name(
130 p_action => p_action_ctl_rec.action
131 , p_document_type => p_action_ctl_rec.document_type
132 , p_document_subtype => p_action_ctl_rec.document_subtype
133 , x_return_status => l_ret_sts
134 , x_supply_action => l_supply_action
135 );
136
137 IF (l_ret_sts <> 'S')
138 THEN
139 d_progress := 40;
140 p_action_ctl_rec.return_status := 'U';
141 l_err_msg := 'get_supply_action_name not successful';
142 RAISE PO_CORE_S.g_early_return_exc;
143 END IF;
144
145 d_progress := 50;
146 IF (PO_LOG.d_stmt) THEN
147 PO_LOG.stmt(d_module, d_progress, 'l_supply_action', l_supply_action);
148 END IF;
149
150 l_bool_ret_sts :=
151 PO_SUPPLY.po_req_supply(
152 p_docid => p_action_ctl_rec.document_id
153 , p_lineid => NULL
154 , p_shipid => NULL
155 , p_action => l_supply_action
156 , p_recreate_flag => FALSE
157 , p_qty => NULL
158 , p_receipt_date => NULL
159 );
160
161 IF (NOT l_bool_ret_sts)
162 THEN
163 d_progress := 60;
164 l_err_msg := 'po_req_supply returned false';
165 RAISE PO_CORE_S.g_early_return_exc;
166 END IF;
167
168 END IF; -- p_action_ctl_rec.document_type <> 'PA'
169
170 d_progress := 70;
171 -- <Unified Catalog R12 Start>
172 IF ((p_action_ctl_rec.document_type = 'PA') AND
173 (p_action_ctl_rec.document_subtype = 'BLANKET'))
174 THEN
175 -- Rebuild catalog search index.
176 -- Call this procedure BEFORE calling archive_po because this one
177 -- compares against the archive tables to check if any of the
178 -- searchable fields have been modified or not.
179 PO_CATALOG_INDEX_PVT.rebuild_index
180 (
181 p_type => PO_CATALOG_INDEX_PVT.TYPE_BLANKET
182 , p_po_header_id => P_ACTION_CTL_REC.document_id
183 );
184
185 END IF; -- if Blanket Agreement
186 -- <Unified Catalog R12 End>
187
188 d_progress := 80;
189 IF (p_action_ctl_rec.document_type <> 'REQUISITION')
190 THEN
191
192 -- Payment Instruction
193 -- Generate payment sequence only if it is enabled in clm opions page and doc type is PO.
194 IF p_action_ctl_rec.document_type = 'PO' THEN
195
196 SELECT org_id INTO l_org_id
197 FROM po_headers_all poh
198 WHERE poh.po_header_id = p_action_ctl_rec.document_id ;
199 l_enable_payment_inst := PO_CORE_S.retrieveOptionValue(p_org_id => l_org_id,
200 p_option_column => PO_CORE_S.g_PAYMENT_INSTR_COL);
201 IF l_enable_payment_inst = 'Y' THEN
202 PO_CORE_S3.generate_payment_sequence (p_po_header_id => p_action_ctl_rec.document_id);
203 END IF;
204 END IF;
205
206 PO_DOCUMENT_ARCHIVE_GRP.archive_po(
207 p_api_version => 1.0
208 , p_document_id => p_action_ctl_rec.document_id
209 , p_document_type => p_action_ctl_rec.document_type
210 , p_document_subtype => p_action_ctl_rec.document_subtype
211 , p_process => 'APPROVE'
212 , x_return_status => l_ret_sts
213 , x_msg_count => l_msg_count
214 , x_msg_data => l_msg_data
215 );
216
217 IF (l_ret_sts <> 'S')
218 THEN
219 d_progress := 90;
220 l_err_msg := 'archive_po not successful';
221 RAISE PO_CORE_S.g_early_return_exc;
222 END IF;
223
224 END IF; -- if p_action_ctl_rec.document_type <> 'REQUISITION'
225
226 -- TODO: ANALYZE return_code value (as opposed to return_status).
227 p_action_ctl_rec.return_status := 'S';
228
229 EXCEPTION
230 WHEN PO_CORE_S.g_early_return_exc THEN
231 p_action_ctl_rec.return_status := 'U';
232 IF (PO_LOG.d_exc) THEN
233 PO_LOG.exc(d_module, d_progress, l_err_msg);
234 END IF;
235 PO_DOCUMENT_ACTION_PVT.error_msg_append(d_module, d_progress, l_err_msg);
236
237 END;
238
239 IF (PO_LOG.d_proc) THEN
240 PO_LOG.proc_end(d_module, 'p_action_ctl_rec.return_status', p_action_ctl_rec.return_status);
241 PO_LOG.proc_end(d_module);
242 END IF;
243
244 RETURN;
245
246 EXCEPTION
247 WHEN OTHERS THEN
248 p_action_ctl_rec.return_status := 'U';
249
250 PO_DOCUMENT_ACTION_PVT.error_msg_append(d_module, d_progress, SQLCODE, SQLERRM);
251 IF (PO_LOG.d_exc) THEN
252 PO_LOG.exc(d_module, d_progress, SQLCODE || SQLERRM);
253 PO_LOG.proc_end(d_module, 'p_action_ctl_rec.return_status', p_action_ctl_rec.return_status);
254 PO_LOG.proc_end(d_module);
255 END IF;
256
257 RETURN;
258
259 END approve;
260
261
262 ------------------------------------------------------------------------------
263 --Start of Comments
264 --Name: reject
265 --Pre-reqs:
266 -- Document is locked.
267 -- Org context is set to that of document.
268 --Modifies:
269 -- None, directly.
270 --Locks:
271 -- None.
272 --Function:
273 -- This procedure handles logic to reject a document that is
274 -- either pre-approved or in process.
275 -- The logic is:
276 -- 1. check that document is in right status
277 -- 2. handle encumbrance
278 -- 3. update action history
279 -- 4. update document authorization status
280 -- 5. if not a PA, call appropriate supply action
281 --Replaces:
282 -- This method covers the logic in podareject in podar.lpc.
283 --Parameters:
284 --IN:
285 -- p_action_ctl_rec
286 -- Record containing all necessary parameters for action.
287 --OUT:
288 -- p_action_ctl_rec
289 -- Record contains variables that record output values depending
290 -- on the action. All actions will populate at least a return_status.
291 --End of Comments
292 -------------------------------------------------------------------------------
293 PROCEDURE reject(
294 p_action_ctl_rec IN OUT NOCOPY PO_DOCUMENT_ACTION_PVT.doc_action_call_rec_type
295 )
296 IS
297
298 l_doc_state_ok BOOLEAN;
299 l_preparer_id PO_HEADERS_ALL.agent_id%TYPE;
300
301 l_ret_sts VARCHAR2(1);
302 l_err_msg VARCHAR2(200);
303 l_bool_ret_sts BOOLEAN;
304
305 l_enc_flag VARCHAR2(1);
306 l_enc_ret_code VARCHAR2(10);
307 l_enc_report_id NUMBER;
308
309 l_supply_action VARCHAR2(40);
310
311 d_progress NUMBER;
312 d_module VARCHAR2(70) := 'po.plsql.PO_DOCUMENT_ACTION_AUTH.reject';
313
314 BEGIN
315
316 d_progress := 0;
317 IF (PO_LOG.d_proc) THEN
318 PO_LOG.proc_begin(d_module);
319 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.document_id', p_action_ctl_rec.document_id);
320 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.document_type', p_action_ctl_rec.document_type);
321 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.document_subtype', p_action_ctl_rec.document_subtype);
322 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.draft_id', p_action_ctl_rec.draft_id); --CLM Apprvl
323 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.action', p_action_ctl_rec.action);
324 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.forward_to_id', p_action_ctl_rec.forward_to_id);
325 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.approval_path_id', p_action_ctl_rec.approval_path_id);
326 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.note', p_action_ctl_rec.note);
327 END IF;
328
329 d_progress := 10;
330
331 BEGIN
332
333 PO_DOCUMENT_ACTION_CHECK.reject_status_check(p_action_ctl_rec);
334
335 d_progress := 20;
336
337 IF (p_action_ctl_rec.return_status <> 'S')
338 THEN
339
340 d_progress := 30;
341 p_action_ctl_rec.return_status := 'U';
342 l_err_msg := 'reject_status_check not successful';
343 RAISE PO_CORE_S.g_early_return_exc;
344
345 END IF;
346
347 IF (p_action_ctl_rec.return_code IS NOT NULL)
348 THEN
349
350 d_progress := 40;
351 p_action_ctl_rec.return_status := 'S';
352 p_action_ctl_rec.return_code := 'STATE_FAILED';
353 l_err_msg := 'State check failed';
354 RAISE PO_CORE_S.g_early_return_exc;
355
356 END IF;
357
358 -- reset return status and return code after reject_status_check call
359 p_action_ctl_rec.return_status := NULL;
360 p_action_ctl_rec.return_code := NULL;
361
362 d_progress := 50;
363
364 PO_DOCUMENT_ACTION_UTIL.get_doc_preparer_id(
365 p_document_id => p_action_ctl_rec.document_id
366 , p_document_type => p_action_ctl_rec.document_type
367 , p_draft_id => p_action_ctl_rec.draft_id -- CLM Apprvl
368 , x_return_status => l_ret_sts
369 , x_preparer_id => l_preparer_id
370 );
371
372 IF (l_ret_sts <> 'S')
373 THEN
374
375 d_progress := 60;
376 p_action_ctl_rec.return_status := 'U';
377 l_err_msg := 'get_doc_preparer_id not successful';
378 RAISE PO_CORE_S.g_early_return_exc;
379
380 END IF;
381
382 d_progress := 70;
383
384 IF (PO_LOG.d_stmt) THEN
385 PO_LOG.stmt(d_module, d_progress, 'l_preparer_id', l_preparer_id);
386 END IF;
387
388
389 IF ( PO_CORE_S.is_encumbrance_on(
390 p_doc_type => p_action_ctl_rec.document_type
391 , p_org_id => NULL
392 )
393 )
394 THEN
395 l_enc_flag := 'Y';
396 ELSE
397 l_enc_flag := 'N';
398 END IF;
399
400 --CLM Apprvl--Need to bypass funds processing for Modification documents
401 IF p_action_ctl_rec.document_type = 'PO' AND p_action_ctl_rec.draft_id IS NOT NULL AND p_action_ctl_rec.draft_id <> -1 THEN
402 l_enc_flag := 'N';
403 END IF;
404
405 d_progress := 80;
406
407 IF ((l_enc_flag = 'Y') AND (p_action_ctl_rec.document_type = 'PA')
408 AND (p_action_ctl_rec.document_subtype = 'BLANKET'))
409 THEN
410
411 d_progress := 90;
412
413 SELECT nvl(poh.encumbrance_required_flag, 'N')
414 INTO l_enc_flag
415 FROM po_headers_all poh
416 WHERE po_header_id = p_action_ctl_rec.document_id;
417
418 END IF;
419
420 IF (PO_LOG.d_stmt) THEN
421 PO_LOG.stmt(d_module, d_progress, 'l_enc_flag', l_enc_flag);
422 END IF;
423
424
425 IF ((l_enc_flag = 'Y') AND (p_action_ctl_rec.document_subtype <> 'CONTRACT')) -- bug 8498264
426 THEN
427
428 d_progress := 100;
429
430 PO_DOCUMENT_FUNDS_PVT.do_reject(
431 x_return_status => l_ret_sts
432 , p_doc_type => p_action_ctl_rec.document_type
433 , p_doc_subtype => p_action_ctl_rec.document_subtype
434 , p_doc_level => PO_DOCUMENT_FUNDS_PVT.g_doc_level_HEADER
435 , p_doc_level_id => p_action_ctl_rec.document_id
436 , p_use_enc_gt_flag => PO_DOCUMENT_FUNDS_PVT.g_parameter_NO
437 , p_override_funds => PO_DOCUMENT_FUNDS_PVT.g_parameter_NO
438 , p_use_gl_date => PO_DOCUMENT_FUNDS_PVT.g_parameter_USE_PROFILE
439 , p_override_date => SYSDATE
440 , x_po_return_code => l_enc_ret_code
441 , x_online_report_id => l_enc_report_id
442 );
443
444
445 IF (l_ret_sts <> FND_API.g_ret_sts_success)
446 THEN
447
448 d_progress := 110;
449 p_action_ctl_rec.return_status := 'U';
450 l_err_msg := 'do_reject not successful';
451 RAISE PO_CORE_S.g_early_return_exc;
452
453 END IF;
454
455 d_progress := 120;
456
457 IF (PO_LOG.d_stmt) THEN
458 PO_LOG.stmt(d_module, d_progress, 'l_enc_ret_code', l_enc_ret_code);
459 PO_LOG.stmt(d_module, d_progress, 'l_enc_report_id', l_enc_report_id);
460 END IF;
461
462 p_action_ctl_rec.online_report_id := l_enc_report_id;
463
464 IF ((l_enc_ret_code = PO_DOCUMENT_FUNDS_PVT.g_return_SUCCESS)
465 OR (l_enc_ret_code = PO_DOCUMENT_FUNDS_PVT.g_return_WARNING))
466 THEN
467
468 d_progress := 125;
469 -- Just continue with reject action.
470
471 ELSIF (l_enc_ret_code = PO_DOCUMENT_FUNDS_PVT.g_return_PARTIAL)
472 THEN
473
474 d_progress := 130;
475 p_action_ctl_rec.return_status := 'S';
476 p_action_ctl_rec.return_code := 'P';
477 l_err_msg := 'funds do_reject partial';
478 RAISE PO_CORE_S.g_early_return_exc;
479
480 ELSIF (l_enc_ret_code = PO_DOCUMENT_FUNDS_PVT.g_return_FAILURE)
481 THEN
482
483 d_progress := 140;
484 p_action_ctl_rec.return_status := 'S';
485 p_action_ctl_rec.return_code := 'F';
486 l_err_msg := 'funds do_reject failure';
487 RAISE PO_CORE_S.g_early_return_exc;
488
489 ELSIF (l_enc_ret_code = PO_DOCUMENT_FUNDS_PVT.g_return_FATAL)
490 THEN
491
492 d_progress := 150;
493 p_action_ctl_rec.return_status := 'S';
494 p_action_ctl_rec.return_code := 'T';
495 l_err_msg := 'funds do_reject fatal';
496 RAISE PO_CORE_S.g_early_return_exc;
497
498 ELSE
499
500 d_progress := 160;
501 p_action_ctl_rec.return_status := 'U';
502 l_err_msg := 'Bad return code from funds do_reject';
503 RAISE PO_CORE_S.g_early_return_exc;
504
505 END IF; -- if l_enc_ret_code IN (...)
506
507 END IF; -- if l_enc_flag = 'Y' ...
508
509 d_progress := 170;
510
511 IF (PO_LOG.d_stmt) THEN
512 PO_LOG.stmt(d_module, d_progress, 'Calling change_doc_auth_state');
513 END IF;
514
515 PO_DOCUMENT_ACTION_UTIL.change_doc_auth_state(
516 p_document_id => p_action_ctl_rec.document_id
517 , p_document_type => p_action_ctl_rec.document_type
518 , p_document_subtype => p_action_ctl_rec.document_subtype
519 , p_draft_id => p_action_ctl_rec.draft_id -- CLM Apprvl
520 , p_action => 'REJECT'
521 , p_fwd_to_id => p_action_ctl_rec.forward_to_id
522 , p_offline_code => p_action_ctl_rec.offline_code
523 , p_approval_path_id => p_action_ctl_rec.approval_path_id
524 , p_note => p_action_ctl_rec.note
525 , p_new_status => PO_DOCUMENT_ACTION_PVT.g_doc_status_REJECTED
526 , p_notify_action => 'REJECTED_BY_APPROVER'
527 , p_notify_employee => l_preparer_id
528 , x_return_status => l_ret_sts
529 );
530
531 IF (l_ret_sts <> 'S')
532 THEN
533
534 d_progress := 180;
535 p_action_ctl_rec.return_status := 'U';
536 l_err_msg := 'change_doc_auth_state not successful';
537 RAISE PO_CORE_S.g_early_return_exc;
538
539 END IF;
540
541 d_progress := 190;
542 -- Bug 9488727 supply/reservations need not be altered for reject action
543 -- IF (p_action_ctl_rec.document_type <> 'PA') AND (p_action_ctl_rec.draft_id IS NULL OR p_action_ctl_rec.draft_id = -1) /*CLM Apprvl, included the condition to check if it is modification doc and skip the supply logic if so.*/
544 -- THEN
545 --
546 -- get_supply_action_name(
547 -- p_action => p_action_ctl_rec.action
548 -- , p_document_type => p_action_ctl_rec.document_type
549 -- , p_document_subtype => p_action_ctl_rec.document_subtype
550 -- , x_return_status => l_ret_sts
551 -- , x_supply_action => l_supply_action
552 -- );
553 --
554 -- IF (l_ret_sts <> 'S')
555 -- THEN
556 -- d_progress := 195;
557 -- p_action_ctl_rec.return_status := 'U';
558 -- l_err_msg := 'get_supply_action_name not successful';
559 -- RAISE PO_CORE_S.g_early_return_exc;
560 -- END IF;
561 --
562 -- d_progress := 200;
563 -- IF (PO_LOG.d_stmt) THEN
564 -- PO_LOG.stmt(d_module, d_progress, 'l_supply_action', l_supply_action);
565 -- END IF;
566 --
567 -- l_bool_ret_sts :=
568 -- PO_SUPPLY.po_req_supply(
569 -- p_docid => p_action_ctl_rec.document_id
570 -- , p_lineid => NULL
571 -- , p_shipid => NULL
572 -- , p_action => l_supply_action
573 -- , p_recreate_flag => FALSE
574 -- , p_qty => NULL
575 -- , p_receipt_date => NULL
576 -- );
577 --
578 -- IF (NOT l_bool_ret_sts)
579 -- THEN
580 -- d_progress := 210;
581 -- p_action_ctl_rec.return_status := 'U';
582 -- l_err_msg := 'po_req_supply returned false';
583 -- RAISE PO_CORE_S.g_early_return_exc;
584 -- END IF;
585 --
586 -- END IF; -- document_type <> 'PA'
587
588 p_action_ctl_rec.return_status := 'S';
589
590 EXCEPTION
591 WHEN PO_CORE_S.g_early_return_exc THEN
592 IF (p_action_ctl_rec.return_status = 'U')
593 THEN
594 IF (PO_LOG.d_exc) THEN
595 PO_LOG.exc(d_module, d_progress, l_err_msg);
596 END IF;
597 END IF;
598
599 PO_DOCUMENT_ACTION_PVT.error_msg_append(d_module, d_progress, l_err_msg);
600
601 END;
602
603 IF (PO_LOG.d_proc) THEN
604 PO_LOG.proc_end(d_module, 'p_action_ctl_rec.return_status', p_action_ctl_rec.return_status);
605 PO_LOG.proc_end(d_module, 'p_action_ctl_rec.return_code', p_action_ctl_rec.return_code);
606 PO_LOG.proc_end(d_module, 'p_action_ctl_rec.online_report_id', p_action_ctl_rec.online_report_id);
607 PO_LOG.proc_end(d_module);
608 END IF;
609
610 RETURN;
611
612 EXCEPTION
613 WHEN OTHERS THEN
614 p_action_ctl_rec.return_status := 'U';
615
616 PO_DOCUMENT_ACTION_PVT.error_msg_append(d_module, d_progress, SQLCODE, SQLERRM);
617 IF (PO_LOG.d_exc) THEN
618 PO_LOG.exc(d_module, d_progress, SQLCODE || SQLERRM);
619 PO_LOG.proc_end(d_module, 'p_action_ctl_rec.return_status', p_action_ctl_rec.return_status);
620 PO_LOG.proc_end(d_module);
621 END IF;
622
623 RETURN;
624
625 END reject;
626
627
628 ------------------------------------------------------------------------------
629 --Start of Comments
630 --Name: forward
631 --Pre-reqs:
632 -- Document is locked.
633 -- Org context is set to that of document.
634 --Modifies:
635 -- None, directly.
636 --Locks:
637 -- None.
638 --Function:
639 -- This procedure handles the forwarding of a document from one employee
640 -- to another. It is just a wrapper around PO_DOCUMENT_ACTION_UTIL.change_doc_auth_state().
641 -- The logic is:
642 -- 1. update action history
643 -- 2. update document authorization status, if necessary
644 --Replaces:
645 -- This method covers some of the logic in poxdmaction in poxdm.lpc.
646 --Parameters:
647 --IN:
648 -- p_action_ctl_rec
649 -- Record containing all necessary parameters for action.
650 --OUT:
651 -- p_action_ctl_rec
652 -- Record contains variables that record output values depending
653 -- on the action. All actions will populate at least a return_status.
654 --End of Comments
655 -------------------------------------------------------------------------------
656 PROCEDURE forward(
657 p_action_ctl_rec IN OUT NOCOPY PO_DOCUMENT_ACTION_PVT.doc_action_call_rec_type
658 )
659 IS
660
661 l_ret_sts VARCHAR2(1);
662 l_err_msg VARCHAR2(200);
663
664 d_progress NUMBER;
665 d_module VARCHAR2(70) := 'po.plsql.PO_DOCUMENT_ACTION_AUTH.forward';
666
667 BEGIN
668
669 d_progress := 0;
670 IF (PO_LOG.d_proc) THEN
671 PO_LOG.proc_begin(d_module);
672 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.document_id', p_action_ctl_rec.document_id);
673 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.document_type', p_action_ctl_rec.document_type);
674 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.document_subtype', p_action_ctl_rec.document_subtype);
675 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.action', p_action_ctl_rec.action);
676 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.forward_to_id', p_action_ctl_rec.forward_to_id);
677 END IF;
678
679 d_progress := 10;
680
681 BEGIN
682
683 IF (PO_LOG.d_stmt) THEN
684 PO_LOG.stmt(d_module, d_progress, 'Calling change_doc_auth_state');
685 END IF;
686
687 PO_DOCUMENT_ACTION_UTIL.change_doc_auth_state(
688 p_document_id => p_action_ctl_rec.document_id
689 , p_document_type => p_action_ctl_rec.document_type
690 , p_document_subtype => p_action_ctl_rec.document_subtype
691 , p_draft_id => p_action_ctl_rec.draft_id -- CLM Apprvl
692 , p_action => 'FORWARD'
693 , p_fwd_to_id => p_action_ctl_rec.forward_to_id
694 , p_offline_code => p_action_ctl_rec.offline_code
695 , p_approval_path_id => p_action_ctl_rec.approval_path_id
696 , p_note => p_action_ctl_rec.note
697 , p_new_status => p_action_ctl_rec.new_document_status
698 , p_notify_action => 'APPROVAL'
699 , p_notify_employee => p_action_ctl_rec.forward_to_id
700 , x_return_status => l_ret_sts
701 );
702
703 IF (l_ret_sts <> 'S')
704 THEN
705 d_progress := 20;
706 l_ret_sts := 'U';
707 l_err_msg := 'change doc state not successful';
708 RAISE PO_CORE_S.g_early_return_exc;
709 END IF;
710
711 d_progress := 30;
712 l_ret_sts := 'S';
713
714 EXCEPTION
715 WHEN PO_CORE_S.g_early_return_exc THEN
716 IF (PO_LOG.d_exc) THEN
717 PO_LOG.exc(d_module, d_progress, l_err_msg);
718 END IF;
719 PO_DOCUMENT_ACTION_PVT.error_msg_append(d_module, d_progress, l_err_msg);
720
721 END;
722
723 p_action_ctl_rec.return_status := l_ret_sts;
724 IF (PO_LOG.d_proc) THEN
725 PO_LOG.proc_end(d_module, 'p_action_ctl_rec.return_status', p_action_ctl_rec.return_status);
726 PO_LOG.proc_end(d_module);
727 END IF;
728
729 RETURN;
730
731 EXCEPTION
732 WHEN OTHERS THEN
733 p_action_ctl_rec.return_status := 'U';
734
735 PO_DOCUMENT_ACTION_PVT.error_msg_append(d_module, d_progress, SQLCODE, SQLERRM);
736 IF (PO_LOG.d_exc) THEN
737 PO_LOG.exc(d_module, d_progress, SQLCODE || SQLERRM);
738 PO_LOG.proc_end(d_module, 'p_action_ctl_rec.return_status', p_action_ctl_rec.return_status);
739 PO_LOG.proc_end(d_module);
740 END IF;
741
742 RETURN;
743
744 END forward;
745
746 ------------------------------------------------------------------------------
747 --Start of Comments
748 --Name: return_action
749 --Pre-reqs:
750 -- Document is locked.
751 -- Org context is set to that of document.
752 --Modifies:
753 -- None, directly.
754 --Locks:
755 -- None.
756 --Function:
757 -- This procedure handles logic to return a requistion during autocreate.
758 -- The logic is:
759 -- 1. verify document is requisition
760 -- 2. verify requisition state - e.g. that it is approved.
761 -- 3. handle encumbrance
762 -- 4. update action history
763 -- 5. update authorization_status and appropriate flags
764 -- 6. call appropriate methods to handle supply
765 --Replaces:
766 -- This method covers some of the logic in podatreturn in podat.lpc.
767 --Parameters:
768 --IN:
769 -- p_action_ctl_rec
770 -- Record containing all necessary parameters for action.
771 --OUT:
772 -- p_action_ctl_rec
773 -- Record contains variables that record output values depending
774 -- on the action. All actions will populate at least a return_status.
775 --End of Comments
776 -------------------------------------------------------------------------------
777 PROCEDURE return_action(
778 p_action_ctl_rec IN OUT NOCOPY PO_DOCUMENT_ACTION_PVT.doc_action_call_rec_type
779 )
780 IS
781
782 l_ret_sts VARCHAR2(1);
783 l_bool_ret_sts BOOLEAN;
784 l_err_msg VARCHAR2(200);
785
786 l_allowed_states PO_DOCUMENT_ACTION_UTIL.doc_state_rec_type;
787 l_doc_state_ok BOOLEAN;
788
789 l_req_enc_on BOOLEAN;
790 l_enc_ret_code VARCHAR2(10);
791 l_enc_report_id NUMBER;
792
793 l_preparer_id PO_REQUISITION_HEADERS.preparer_id%TYPE;
794 l_supply_action VARCHAR2(40);
795
796 d_progress NUMBER;
797 d_module VARCHAR2(70) := 'po.plsql.PO_DOCUMENT_ACTION_AUTH.return_action';
798
799 BEGIN
800
801 d_progress := 0;
802 IF (PO_LOG.d_proc) THEN
803 PO_LOG.proc_begin(d_module);
804 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.document_id', p_action_ctl_rec.document_id);
805 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.document_type', p_action_ctl_rec.document_type);
806 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.document_subtype', p_action_ctl_rec.document_subtype);
807 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.action', p_action_ctl_rec.action);
808 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.note', p_action_ctl_rec.note);
809 PO_LOG.proc_begin(d_module, 'p_action_ctl_rec.approval_path_id', p_action_ctl_rec.approval_path_id);
810 END IF;
811
812 d_progress := 10;
813
814 BEGIN
815
816 IF (p_action_ctl_rec.document_type <> 'REQUISITION')
817 THEN
818
819 d_progress := 20;
820 l_err_msg := 'Invalid document type';
821 l_ret_sts := 'U';
822 RAISE PO_CORE_S.g_early_return_exc;
823
824 END IF;
825
826 d_progress := 30;
827
828 l_allowed_states.auth_states(1) := PO_DOCUMENT_ACTION_PVT.g_doc_status_APPROVED;
829 l_allowed_states.hold_flag := 'N';
830 l_allowed_states.frozen_flag := 'N';
831 l_allowed_states.closed_states(1) := PO_DOCUMENT_ACTION_PVT.g_doc_closed_sts_CLOSED;
832 l_allowed_states.closed_states(2) := PO_DOCUMENT_ACTION_PVT.g_doc_closed_sts_OPEN;
833
834 l_doc_state_ok := PO_DOCUMENT_ACTION_UTIL.check_doc_state(
835 p_document_id => p_action_ctl_rec.document_id
836 , p_document_type => p_action_ctl_rec.document_type
837 , p_draft_id => p_action_ctl_rec.draft_id -- CLM Apprvl
838 , p_allowed_states => l_allowed_states
839 , x_return_status => l_ret_sts
840 );
841
842 IF (l_ret_sts <> 'S')
843 THEN
844
845 d_progress := 40;
846 l_err_msg := 'check_doc_state not successful';
847 RAISE PO_CORE_S.g_early_return_exc;
848
849 END IF;
850
851 IF (NOT l_doc_state_ok)
852 THEN
853
854 d_progress := 45;
855 l_ret_sts := 'S';
856 p_action_ctl_rec.return_code := 'STATE_FAILED';
857 l_err_msg := 'State check failed.';
858 RAISE PO_CORE_S.g_early_return_exc;
859
860 END IF;
861
862 d_progress := 50;
863
864 l_req_enc_on := PO_CORE_S.is_encumbrance_on(
865 p_doc_type => PO_CORE_S.g_doc_type_REQUISITION
866 , p_org_id => NULL
867 );
868
869 d_progress := 60;
870 IF (PO_LOG.d_stmt) THEN
871 PO_LOG.stmt(d_module, d_progress, 'l_req_enc_on', l_req_enc_on);
872 END IF;
873
874 IF (l_req_enc_on)
875 ---Bug#14332568 : Added below condition so that The Requistion is not be un-reserved during Return action.
876 -- Any changes on the line done during amendment creation will take care of further encumbrance actions
877 AND po_partial_funding_pkg.is_CLM_Enabled = 'N'
878 THEN
879
880 d_progress := 70;
881
882 PO_DOCUMENT_FUNDS_PVT.do_return(
883 x_return_status => l_ret_sts
884 , p_doc_type => p_action_ctl_rec.document_type
885 , p_doc_subtype => p_action_ctl_rec.document_subtype
886 , p_doc_level => PO_DOCUMENT_FUNDS_PVT.g_doc_level_HEADER
887 , p_doc_level_id => p_action_ctl_rec.document_id
888 , p_use_enc_gt_flag => PO_DOCUMENT_FUNDS_PVT.g_parameter_NO
889 , p_use_gl_date => PO_DOCUMENT_FUNDS_PVT.g_parameter_USE_PROFILE
890 , p_override_date => SYSDATE
891 , x_po_return_code => l_enc_ret_code
892 , x_online_report_id => l_enc_report_id
893 );
894
895
896 IF (l_ret_sts <> FND_API.g_ret_sts_success)
897 THEN
898
899 d_progress := 80;
900 l_ret_sts := 'U';
901 l_err_msg := 'do_return not successful';
902 RAISE PO_CORE_S.g_early_return_exc;
903
904 END IF;
905
906 d_progress := 90;
907
908 IF (PO_LOG.d_stmt) THEN
909 PO_LOG.stmt(d_module, d_progress, 'l_enc_ret_code', l_enc_ret_code);
910 PO_LOG.stmt(d_module, d_progress, 'l_enc_report_id', l_enc_report_id);
911 END IF;
912
913 p_action_ctl_rec.online_report_id := l_enc_report_id;
914
915 IF ((l_enc_ret_code = PO_DOCUMENT_FUNDS_PVT.g_return_SUCCESS)
916 OR (l_enc_ret_code = PO_DOCUMENT_FUNDS_PVT.g_return_WARNING))
917 THEN
918
919 d_progress := 100;
920 -- Just continue with return action.
921
922 ELSIF (l_enc_ret_code = PO_DOCUMENT_FUNDS_PVT.g_return_PARTIAL)
923 THEN
924
925 d_progress := 110;
926 l_ret_sts := 'S';
927 p_action_ctl_rec.return_code := 'P';
928 l_err_msg := 'funds do_return partial';
929 RAISE PO_CORE_S.g_early_return_exc;
930
931 ELSIF (l_enc_ret_code = PO_DOCUMENT_FUNDS_PVT.g_return_FAILURE)
932 THEN
933
934 d_progress := 120;
935 l_ret_sts := 'S';
936 p_action_ctl_rec.return_code := 'F';
937 l_err_msg := 'funds do_return failure';
938 RAISE PO_CORE_S.g_early_return_exc;
939
940 ELSIF (l_enc_ret_code = PO_DOCUMENT_FUNDS_PVT.g_return_FATAL)
941 THEN
942
943 d_progress := 130;
944 l_ret_sts := 'S';
945 p_action_ctl_rec.return_code := 'T';
946 l_err_msg := 'funds do_return fatal';
947 RAISE PO_CORE_S.g_early_return_exc;
948
949 ELSE
950
951 d_progress := 140;
952 l_ret_sts := 'U';
953 l_err_msg := 'Bad return code from funds do_return';
954 RAISE PO_CORE_S.g_early_return_exc;
955
956 END IF; -- if l_enc_ret_code IN (...)
957
958 END IF; -- IF l_req_enc_on
959
960 d_progress := 150;
961
962 PO_DOCUMENT_ACTION_UTIL.get_doc_preparer_id(
963 p_document_id => p_action_ctl_rec.document_id
964 , p_document_type => p_action_ctl_rec.document_type
965 , p_draft_id => p_action_ctl_rec.draft_id -- CLM Apprvl
966 , x_return_status => l_ret_sts
967 , x_preparer_id => l_preparer_id
968 );
969
970 IF (l_ret_sts <> 'S')
971 THEN
972
973 d_progress := 160;
974 l_ret_sts := 'U';
975 l_err_msg := 'get_doc_preparer_id not successful';
976 RAISE PO_CORE_S.g_early_return_exc;
977
978 END IF;
979
980 d_progress := 170;
981
982 IF (PO_LOG.d_stmt) THEN
983 PO_LOG.stmt(d_module, d_progress, 'Calling change_doc_auth_state');
984 END IF;
985
986 PO_DOCUMENT_ACTION_UTIL.change_doc_auth_state(
987 p_document_id => p_action_ctl_rec.document_id
988 , p_document_type => p_action_ctl_rec.document_type
989 , p_document_subtype => p_action_ctl_rec.document_subtype
990 , p_draft_id => p_action_ctl_rec.draft_id -- CLM Apprvl
991 , p_action => 'RETURN'
992 , p_fwd_to_id => NULL
993 , p_offline_code => NULL
994 , p_approval_path_id => p_action_ctl_rec.approval_path_id
995 , p_note => p_action_ctl_rec.note
996 , p_new_status => PO_DOCUMENT_ACTION_PVT.g_doc_status_RETURNED
997 , p_notify_action => 'APPROVAL'
998 , p_notify_employee => l_preparer_id
999 , x_return_status => l_ret_sts
1000 );
1001
1002 IF (l_ret_sts <> 'S')
1003 THEN
1004
1005 d_progress := 180;
1006 l_ret_sts := 'U';
1007 l_err_msg := 'change_doc_auth_state not successful';
1008 RAISE PO_CORE_S.g_early_return_exc;
1009
1010 END IF;
1011
1012 d_progress := 190;
1013
1014 get_supply_action_name(
1015 p_action => p_action_ctl_rec.action
1016 , p_document_type => p_action_ctl_rec.document_type
1017 , p_document_subtype => p_action_ctl_rec.document_subtype
1018 , x_return_status => l_ret_sts
1019 , x_supply_action => l_supply_action
1020 );
1021
1022 IF (l_ret_sts <> 'S')
1023 THEN
1024 d_progress := 195;
1025 l_ret_sts := 'U';
1026 l_err_msg := 'get_supply_action_name not successful';
1027 RAISE PO_CORE_S.g_early_return_exc;
1028 END IF;
1029
1030 d_progress := 200;
1031 IF (PO_LOG.d_stmt) THEN
1032 PO_LOG.stmt(d_module, d_progress, 'l_supply_action', l_supply_action);
1033 END IF;
1034
1035 l_bool_ret_sts :=
1036 PO_SUPPLY.po_req_supply(
1037 p_docid => p_action_ctl_rec.document_id
1038 , p_lineid => NULL
1039 , p_shipid => NULL
1040 , p_action => l_supply_action
1041 , p_recreate_flag => FALSE
1042 , p_qty => NULL
1043 , p_receipt_date => NULL
1044 );
1045
1046 IF (NOT l_bool_ret_sts)
1047 THEN
1048 d_progress := 210;
1049 l_ret_sts := 'U';
1050 l_err_msg := 'po_req_supply returned false';
1051 RAISE PO_CORE_S.g_early_return_exc;
1052 END IF;
1053
1054 d_progress := 220;
1055 p_action_ctl_rec.return_code := NULL;
1056 l_ret_sts := 'S';
1057
1058 EXCEPTION
1059 WHEN PO_CORE_S.g_early_return_exc THEN
1060 IF (l_ret_sts = 'U') THEN
1061 IF (PO_LOG.d_exc) THEN
1062 PO_LOG.exc(d_module, d_progress, l_err_msg);
1063 END IF;
1064 END IF;
1065
1066 PO_DOCUMENT_ACTION_PVT.error_msg_append(d_module, d_progress, l_err_msg);
1067 END;
1068
1069 p_action_ctl_rec.return_status := l_ret_sts;
1070 IF (PO_LOG.d_proc) THEN
1071 PO_LOG.proc_end(d_module, 'p_action_ctl_rec.return_status', p_action_ctl_rec.return_status);
1072 PO_LOG.proc_end(d_module, 'p_action_ctl_rec.return_code', p_action_ctl_rec.return_code);
1073 PO_LOG.proc_end(d_module, 'p_action_ctl_rec.online_report_id', p_action_ctl_rec.online_report_id);
1074 PO_LOG.proc_end(d_module);
1075 END IF;
1076
1077 RETURN;
1078
1079 EXCEPTION
1080 WHEN OTHERS THEN
1081 p_action_ctl_rec.return_status := 'U';
1082
1083 PO_DOCUMENT_ACTION_PVT.error_msg_append(d_module, d_progress, SQLCODE, SQLERRM);
1084 IF (PO_LOG.d_exc) THEN
1085 PO_LOG.exc(d_module, d_progress, SQLCODE || SQLERRM);
1086 PO_LOG.proc_end(d_module, 'p_action_ctl_rec.return_status', p_action_ctl_rec.return_status);
1087 PO_LOG.proc_end(d_module);
1088 END IF;
1089
1090 RETURN;
1091
1092 END return_action;
1093
1094 -- Private package methods
1095
1096 ------------------------------------------------------------------------------
1097 --Start of Comments
1098 --Name: get_supply_action_name
1099 --Pre-reqs:
1100 -- None.
1101 --Modifies:
1102 -- None.
1103 --Locks:
1104 -- None.
1105 --Function:
1106 -- Given an action and document type, returns the appropriate supply action
1107 -- to call via PO_SUPPLY.po_req_supply().
1108 --Parameters:
1109 --IN:
1110 -- p_action
1111 -- REJECT, APPROVE, RETURN
1112 -- p_document_type
1113 -- APPROVE/REJECT: PO, PA, RELEASE, REQUISITION
1114 -- RETURN: REQUISITION
1115 -- p_document_subtype
1116 -- RELEASE: BLANKET, SCHEDULED
1117 -- PO: PLANNED, STANDARD
1118 -- PA: CONTRACT, BLANKET
1119 --OUT:
1120 -- x_return_status
1121 -- 'S' if successful
1122 -- 'U' if unexpected error
1123 -- x_supply_action
1124 -- Name of supply action to pass to PO_SUPPLY.po_req_supply()
1125 --End of Comments
1126 -------------------------------------------------------------------------------
1127 PROCEDURE get_supply_action_name(
1128 p_action IN VARCHAR2
1129 , p_document_type IN VARCHAR2
1130 , p_document_subtype IN VARCHAR2
1131 , x_supply_action OUT NOCOPY VARCHAR2
1132 , x_return_status OUT NOCOPY VARCHAR2
1133 )
1134 IS
1135
1136 d_progress NUMBER;
1137 d_module VARCHAR2(70) := 'po.plsql.PO_DOCUMENT_ACTION_AUTH.get_supply_action_name';
1138
1139 l_supply_action VARCHAR2(40);
1140
1141 BEGIN
1142
1143 d_progress := 0;
1144 IF (PO_LOG.d_proc) THEN
1145 PO_LOG.proc_begin(d_module);
1146 PO_LOG.proc_begin(d_module, 'p_document_type', p_document_subtype);
1147 PO_LOG.proc_begin(d_module, 'p_document_type', p_document_subtype);
1148 END IF;
1149
1150 IF (p_action IN (PO_DOCUMENT_ACTION_PVT.g_doc_action_APPROVE,
1151 PO_DOCUMENT_ACTION_PVT.g_doc_action_REJECT))
1152 THEN
1153
1154 IF (p_document_type = 'PO')
1155 THEN
1156
1157 d_progress := 10;
1158 l_supply_action := 'Approve_PO_Supply';
1159
1160 ELSIF (p_document_type = 'RELEASE')
1161 THEN
1162 d_progress := 20;
1163 IF (p_document_subtype = 'BLANKET')
1164 THEN
1165 d_progress := 30;
1166 l_supply_action := 'Approve_Blanket_Release_Supply';
1167 ELSE
1168 d_progress := 40;
1169 l_supply_action := 'Approve_Planned_Release_Supply';
1170 END IF;
1171
1172 ELSIF (p_document_type = 'REQUISITION')
1173 THEN
1174
1175 d_progress := 50;
1176 l_supply_action := 'Approve_Req_Supply';
1177
1178 END IF; -- document_type = 'PO'
1179
1180 ELSIF ((p_action = PO_DOCUMENT_ACTION_PVT.g_doc_action_RETURN)
1181 AND (p_document_type = 'REQUISITION'))
1182 THEN
1183
1184 d_progress := 60;
1185 l_supply_action := 'Remove_Return_Req_Supply';
1186
1187 ELSE
1188
1189 RAISE PO_CORE_S.g_invalid_call_exc;
1190
1191 END IF; -- p_action IN ...
1192
1193 x_supply_action := l_supply_action;
1194 x_return_status := 'S';
1195
1196 IF (PO_LOG.d_proc) THEN
1197 PO_LOG.proc_end(d_module, 'x_return_status', x_return_status);
1198 PO_LOG.proc_end(d_module, 'x_supply_action', x_supply_action);
1199 PO_LOG.proc_end(d_module);
1200 END IF;
1201
1202 EXCEPTION
1203 WHEN OTHERS THEN
1204 x_return_status := 'U';
1205 PO_DOCUMENT_ACTION_PVT.error_msg_append(d_module, d_progress, SQLCODE, SQLERRM);
1206 IF (PO_LOG.d_exc) THEN
1207 PO_LOG.exc(d_module, d_progress, SQLCODE || SQLERRM);
1208 PO_LOG.proc_end(d_module, 'x_return_status', x_return_status);
1209 PO_LOG.proc_end(d_module);
1210 END IF;
1211
1212 RETURN;
1213 END get_supply_action_name;
1214
1215
1216 END PO_DOCUMENT_ACTION_AUTH;