[Home] [Help]
PACKAGE BODY: APPS.PO_DRAFTS_PVT
Source
1 PACKAGE BODY po_drafts_pvt AS
2 /* $Header: PO_DRAFTS_PVT.plb 120.59.12020000.8 2013/03/25 08:25:54 mabaig ship $ */
3
4 d_pkg_name CONSTANT varchar2(50) :=
5 PO_LOG.get_package_base('PO_DRAFTS_PVT');
6
7 -- <Conc Mods Project>
8 -- Declare a table to store lock (F, P, S) compatibilities
9 g_entity_lock_comp_tbl po_entity_lock_comp_tbl_type;
10
11
12 -------------------------------------------------------
13 ----------- PRIVATE PROCEDURES PROTOTYPE --------------
14 -------------------------------------------------------
15
16 PROCEDURE pre_apply
17 ( p_draft_info IN DRAFT_INFO_REC_TYPE
18 );
19
20 PROCEDURE set_new_revision
21 ( p_draft_info IN DRAFT_INFO_REC_TYPE
22 );
23
24 PROCEDURE complete_transfer
25 ( p_draft_info IN DRAFT_INFO_REC_TYPE,
26 p_delete_draft IN VARCHAR2
27 );
28
29 PROCEDURE update_acceptance_status
30 ( p_draft_id IN NUMBER,
31 p_acceptance_action IN VARCHAR2
32 );
33
34 FUNCTION is_doc_in_updatable_state
35 ( p_po_header_id IN NUMBER,
36 p_role IN VARCHAR2
37 ) RETURN VARCHAR2;
38
39 -- <Conc Mods Project>
40 PROCEDURE lock_and_check_compatibility(
41 p_draft_id IN NUMBER,
42 x_return_status OUT NOCOPY VARCHAR2,
43 x_results OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
44 );
45
46 PROCEDURE identify_header_locks
47 ( p_draft_id IN NUMBER
48 );
49
50 PROCEDURE identify_line_locks
51 ( p_draft_id IN NUMBER
52 );
53
54 PROCEDURE identify_shipment_locks
55 ( p_draft_id IN NUMBER
56 );
57
58 PROCEDURE identify_dist_locks
59 ( p_draft_id IN NUMBER
60 );
61
62 PROCEDURE identify_uda_header_locks
63 ( p_draft_id IN NUMBER
64 );
65
66 PROCEDURE identify_uda_line_locks
67 ( p_draft_id IN NUMBER
68 );
69
70 PROCEDURE identify_uda_shipment_locks
71 ( p_draft_id IN NUMBER
72 );
73
74 -- Elins project
75 PROCEDURE identify_exhibit_locks
76 ( p_draft_id IN NUMBER
77 );
78
79 PROCEDURE create_update_locks
80 ( p_draft_id IN NUMBER,
81 p_return_status IN OUT NOCOPY VARCHAR2,
82 x_results OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
83 );
84
85 -------------------------------------------------------
86 -------------- PUBLIC PROCEDURES ----------------------
87 -------------------------------------------------------
88
89
90
91 -----------------------------------------------------------------------
92 --Start of Comments
93 --Name: update_revnum_headers_ext
94 --Pre-reqs: None
95 --Modifies:
96 --Locks:
97 --Function:
98 -- updates the revision_num of po_headers_all_ext_b if draft_type is mod
99 --Parameters:
100 --IN:p_draft_id IN NUMBER
101 -- p_po_header_id IN NUMBER
102 --IN OUT:
103 --OUT:
104 --Notes:
105 --Testing:
106 --End of Comments
107 ------------------------------------------------------------------------
108 PROCEDURE update_revnum_headers_ext
109 (p_draft_id IN NUMBER,
110 p_po_header_id IN NUMBER
111 )
112 IS
113 l_header_revision NUMBER;
114 l_is_mod_document VARCHAR2(1);
115 d_position NUMBER;
116 d_api_name CONSTANT VARCHAR2(30) := 'update_revnum_headers_ext';
117 d_module CONSTANT VARCHAR2(100) := d_pkg_name || d_api_name || '.';
118 BEGIN
119 IF (PO_LOG.d_proc) THEN
120 PO_LOG.proc_begin(d_module, 'p_draft_id', p_draft_id);
121 PO_LOG.proc_begin(d_module, 'p_po_header_id', p_po_header_id);
122 END IF;
123 d_position := 0;
124
125 SELECT revision_num
126 INTO l_header_revision
127 FROM po_headers_all
128 WHERE po_header_id = p_po_header_id;
129 -- bug 13633396, l_header_revision is already incremented so no need
130 -- to increment it by 1
131
132 -- bug 13648412 , added the parameter d_position to PO_LOG.stmt
133 IF PO_LOG.d_stmt THEN
134 PO_LOG.stmt(d_module,d_position,'l_header_revision',l_header_revision);
135 END IF;
136
137 d_position:=10;
138
139 BEGIN
140
141 SELECT 'Y'
142 INTO l_is_mod_document
143 FROM po_drafts
144 WHERE draft_id = p_draft_id
145 AND draft_type = 'MOD';
146 EXCEPTION
147 WHEN others THEN
148 l_is_mod_document := 'N';
149 END;
150
151 -- bug 13648412 , added the parameter d_position to PO_LOG.stmt
152 IF PO_LOG.d_stmt THEN
153 PO_LOG.stmt(d_module,d_position,'l_is_mod_document',l_is_mod_document);
154 END IF;
155
156 IF l_is_mod_document ='Y' THEN
157 UPDATE po_headers_all_ext_b phaeb
158 SET revision_num = l_header_revision
159 WHERE EXISTS ( SELECT 'Lock exists for the address'
160 FROM po_entity_locks poel
161 WHERE poel.entity_pk1 = phaeb.po_header_id
162 AND poel.entity_pk2 = phaeb.c_ext_attr39 -- address type
163 AND poel.lock_by_draft_id = p_draft_id
164 AND poel.entity_name = G_LOCK_ADDRESS_ENTITY
165 )
166 AND phaeb.po_header_id = p_po_header_id
167 AND phaeb.draft_id = -1
168 AND phaeb.c_ext_attr40 = 'PO_UDA_ADDRESS_TYPES';
169 END IF;
170
171 IF (PO_LOG.d_proc) THEN
172 PO_LOG.proc_end(d_module, 'number of rows updated', SQL%ROWCOUNT);
173 END IF;
174
175 END update_revnum_headers_ext;
176
177 -----------------------------------------------------------------------
178 --Start of Comments
179 --Name: draft_id_nextval
180 --Pre-reqs: None
181 --Modifies:
182 --Locks:
183 --Function:
184 -- Return next draft id from sequence PO_DRAFTS_S
185 --Parameters:
186 --IN:
187 --IN OUT:
188 --OUT:
189 --Returns:
190 -- Next draft id from sequence
191 --Notes:
192 --Testing:
193 --End of Comments
194 ------------------------------------------------------------------------
195 FUNCTION draft_id_nextval
196 RETURN NUMBER IS
197
198 l_draft_id NUMBER;
199 BEGIN
200 SELECT PO_DRAFTS_S.nextval
201 INTO l_draft_id
202 FROM DUAL;
203
204 RETURN l_draft_id;
205 END draft_id_nextval;
206
207 -----------------------------------------------------------------------
208 --Start of Comments
209 --Name: transfer_draft_to_txn
210 --Pre-reqs: None
211 --Modifies:
212 --Locks:
213 -- transaction tables if update is allowed
214 --Function:
215 -- API to move the draft changes to transaction table
216 --Parameters:
217 --IN:
218 --p_draft_id
219 -- draft unique identifier
220 --p_po_header_id
221 -- unique identifier for document with the draft changes
222 --p_delete_processed_draft
223 -- indicates whether draft changes should be removed after the process
224 -- If FND_API.G_TRUE, draft records will be removed after the process
225 -- If FND_API.G_FALSE, draft records will retain after the process
226 -- If 'X', drafts records except for the one in PO_DRAFTS will be removed
227 -- after the process
228 --IN OUT:
229 --OUT:
230 --x_return_status
231 -- status of the procedure
232 --Returns:
233 --Notes:
234 --Testing:
235 --End of Comments
236 ------------------------------------------------------------------------
237 PROCEDURE transfer_draft_to_txn
238 ( p_api_version IN NUMBER,
239 p_init_msg_list IN VARCHAR2,
240 p_draft_id IN NUMBER,
241 p_po_header_id IN NUMBER,
242 p_delete_processed_draft IN VARCHAR2,
243 p_acceptance_action IN VARCHAR2,
244 x_return_status OUT NOCOPY VARCHAR2,
245 p_caller IN VARCHAR2 DEFAULT NULL
246 ) IS
247
248 d_api_name CONSTANT VARCHAR2(30) := 'transfer_draft_to_txn';
249 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
250 d_position NUMBER;
251
252 d_api_version CONSTANT NUMBER := 1.0;
253
254 l_draft_info DRAFT_INFO_REC_TYPE;
255 l_status_rec PO_STATUS_REC_TYPE;
256 l_return_status VARCHAR2(1);
257 l_rebuild_attribs BOOLEAN := TRUE; -- 4902870
258 l_type VARCHAR2(20); -- 4902870
259 l_is_mod_document VARCHAR2(1); --bug9846958
260 l_new_approval_status PO_HEADERS_ALL.AUTHORIZATION_STATUS%TYPE; --bug 9407474
261 l_header_revision NUMBER;--concurent Mod
262 l_document_type_code VARCHAR2(500);
263 l_document_style_id NUMBER;
264 l_enabled_flag VARCHAR2(5);
265 l_return_status_uda VARCHAR2(1);
266
267 BEGIN
268 d_position := 0;
269
270 SAVEPOINT transfer_draft_to_txn_sp;
271
272 IF (PO_LOG.d_proc) THEN
273 PO_LOG.proc_begin(d_module);
274 PO_LOG.proc_begin(d_module, 'p_init_msg_list', p_init_msg_list);
275 PO_LOG.proc_begin(d_module, 'p_draft_id', p_draft_id);
276 PO_LOG.proc_begin(d_module, 'p_po_header_id', p_po_header_id);
277 PO_LOG.proc_begin(d_module, 'p_delete_processed_draft',
278 p_delete_processed_draft);
279 PO_LOG.proc_begin(d_module, 'p_acceptance_action', p_acceptance_action);
280 END IF;
281
282 IF (FND_API.to_boolean(p_init_msg_list)) THEN
283 FND_MSG_PUB.initialize;
284 END IF;
285
286 IF (NOT FND_API.Compatible_API_Call
287 ( p_current_version_number => d_api_version
288 , p_caller_version_number => p_api_version
289 , p_api_name => d_api_name
290 , p_pkg_name => d_pkg_name
291 )
292 ) THEN
293
294 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
295 END IF; -- not compatible_api
296
297 x_return_status := FND_API.G_RET_STS_SUCCESS;
298
299 -- if acceptance action is specified, we need to propogate the action to
300 -- all levels
301 IF (p_acceptance_action IS NOT NULL) THEN
302 IF (PO_LOG.d_stmt) THEN
303 PO_LOG.stmt(d_module, d_position, 'update acceptance action');
304 END IF;
305
306 update_acceptance_status
307 ( p_draft_id => p_draft_id,
308 p_acceptance_action => p_acceptance_action
309 );
310 END IF;
311
312 d_position := 10;
313 -- gather draft related information and put it into l_draft_info
314 populate_draft_info
315 ( p_draft_id => p_draft_id,
316 p_po_header_id => p_po_header_id,
317 x_draft_info => l_draft_info
318 );
319
320 IF (l_draft_info.doc_type <> 'QUOTATION') THEN
321
322 d_position := 20;
323
324 -- determine the new approval status for the document
325 PO_DRAFT_APPR_STATUS_PVT.update_approval_status
326 ( p_draft_info => l_draft_info
327 , x_rebuild_attribs => l_rebuild_attribs -- Bug#4902870
328 );
329
330
331 -- bug4176111
332 -- actions to be done before applying draft changes to txn tables
333 d_position := 30;
334 pre_apply
335 ( p_draft_info => l_draft_info
336 );
337
338 d_position := 40;
339 -- move changes from draft to transaction tables
340 apply_changes
341 ( p_draft_info => l_draft_info
342 );
343
344 d_position := 50;
345 -- determine new revision
346 -- bug9846958..In case of CLM modification, the revision of the base document
347 -- needs to be incremented for every change. hence teh check to validate if
348 -- the change requires a new document revision is not applicable for
349 -- modifications
350 BEGIN
351
352 SELECT 'Y'
353 INTO l_is_mod_document
354 FROM po_drafts
355 WHERE draft_id = p_draft_id
356 AND draft_type = 'MOD';
357 EXCEPTION
358 WHEN others THEN
359 l_is_mod_document := 'N';
360 END;
361
362 IF l_is_mod_document = 'Y' THEN
363 SELECT revision_num
364 INTO l_header_revision
365 FROM po_headers_all
366 WHERE po_header_id = p_po_header_id;
367
368 -- Increment the revision number
369 l_header_revision := l_header_revision + 1;
370
371 UPDATE po_headers_all
372 SET revision_num = l_header_revision,
373 revised_date = SYSDATE
374 WHERE po_header_id = p_po_header_id;
375
376 -- <Conc Mods Project START>
377 -- Update the revision number for all lines locked by the current mod
378 UPDATE po_lines_all pla
379 SET revision_num = l_header_revision
380 WHERE EXISTS ( SELECT 'Lock exists for the line'
381 FROM po_entity_locks poel
382 WHERE poel.entity_pk1 = pla.po_line_id
383 AND poel.lock_by_draft_id = p_draft_id
384 AND poel.entity_name = G_LOCK_LINE_ENTITY
385 )
386 --<PAR Project> : Stamping revision_num for newly added lines on mod.
387 OR EXISTS ( SELECT 'New Line'
388 FROM po_lines_draft_all pld
389 WHERE pld.po_line_id = pla.po_line_id
390 AND pld.draft_id = p_draft_id
391 AND pld.change_status = 'NEW'
392 )
393 AND pla.po_header_id = p_po_header_id;
394
395 -- Update the revision number for all line_location locked by the current mod
396 UPDATE po_line_locations_all plla
397 SET revision_num = l_header_revision
398 WHERE EXISTS ( SELECT 'Lock exists for the shipment'
399 FROM po_entity_locks poel
400 WHERE poel.entity_pk1 = plla.line_location_id
401 AND poel.lock_by_draft_id = p_draft_id
402 AND poel.entity_name = G_LOCK_SHIPMENT_ENTITY
403 )
404 --<PAR Project> : Stamping revision_num for newly added shipment on mod.
405 OR EXISTS ( SELECT 'New Shipment'
406 FROM po_line_locations_draft_all plld
407 WHERE plld.line_location_id = plla.line_location_id
408 AND plld.draft_id = p_draft_id
409 AND plld.change_status = 'NEW'
410 )
411 AND plla.po_header_id=p_po_header_id;
412
413 -- Update the revision number for all distributions locked by the current mod
414 UPDATE po_distributions_all pda
415 SET revision_num = l_header_revision
416 WHERE EXISTS ( SELECT 'Lock exists for the distribution'
417 FROM po_entity_locks poel
418 WHERE poel.entity_pk1 = pda.po_distribution_id
419 AND poel.lock_by_draft_id = p_draft_id
420 AND poel.entity_name = G_LOCK_DIST_ENTITY
421 )
422 --<PAR Project> : Stamping revision_num for newly added shipment on mod.
423 OR EXISTS ( SELECT 'New Distribution'
424 FROM po_distributions_draft_all pdd
425 WHERE pdd.po_distribution_id = pda.po_distribution_id
426 AND pdd.draft_id = p_draft_id
427 AND pdd.change_status = 'NEW'
428 )
429 AND pda.po_header_id=p_po_header_id;
430
431 -- Update the revision number for all exhibits locked/modofied by the current mod
432 UPDATE po_exhibit_details pex
433 SET revision_num = l_header_revision
434 WHERE EXISTS ( SELECT 'Lock exists for the exhibit'
435 FROM po_entity_locks poel
436 WHERE poel.entity_pk1 = pex.po_exhibit_details_id
437 AND poel.lock_by_draft_id = p_draft_id
438 --AND poel.entity_name = G_LOCK_EXHIBIT_ENTITY
439 )
440 --<PAR Project> : Stamping revision_num for newly added shipment on mod.
441 OR EXISTS ( SELECT 'New Exhibit'
442 FROM po_exhibit_details_draft pexd
443 WHERE pexd.po_exhibit_details_id = pex.po_exhibit_details_id
444 AND pexd.draft_id = p_draft_id
445 AND pexd.change_status = 'NEW'
446 )
447 AND pex.po_header_id=p_po_header_id;
448
449 d_position := 55;
450 IF PO_LOG.d_stmt THEN
451 PO_LOG.stmt(d_module,d_position,'Uda update handled in PO_DRAFT_MERGE_PKG.MergeReserve_Autonomous');
452 END IF;
453 -- <Conc Mods Project END>
454 ELSE
455 set_new_revision
456 ( p_draft_info => l_draft_info
457 );
458 END IF;
459 /* end big9846958 */
460
461 l_type := PO_CATALOG_INDEX_PVT.TYPE_BLANKET; --Bug#4902870
462
463 ELSE -- QUOTATION
464 l_type := PO_CATALOG_INDEX_PVT.TYPE_QUOTATION; --Bug#4902870
465 -- For quotations, there is no need to performa approval status or revision
466 -- checking
467
468 IF (PO_LOG.d_stmt) THEN
469 PO_LOG.stmt(d_module, d_position, 'document is quotation');
470 END IF;
471
472 d_position := 60;
473 apply_changes
474 ( p_draft_info => l_draft_info
475 );
476
477 END IF;
478
479 d_position := 70;
480
481 -- <Unified Catalog R12 Start>
482 -- Generate the default translations for the Attribute TLP records.
483 -- (Call this BEFORE complete_transfer because it deletes drafts)
484 PO_ATTRIBUTE_VALUES_PVT.gen_draft_line_translations
485 (
486 p_draft_id => p_draft_id
487 , p_doc_type => l_draft_info.doc_subtype
488 );
489 -- <Unified Catalog R12 End>
490
491 -- mark transction as completed
492 complete_transfer
493 ( p_draft_info => l_draft_info,
494 p_delete_draft => p_delete_processed_draft
495 );
496
497 d_position := 80;
498
499
500 --bug 9407474 start
501 -- Previous control flow was not taking care of the case where changes made to a 'Approved' document do not cause it to
502 -- go into 'Requires Reapproval' status.
503 -- While saving doc, if it is 'approved', it should not be locked. Following fix unlocks doc if it is
504 -- in 'APPROVED' states.
505
506 SELECT authorization_status
507 INTO l_new_approval_status
508 FROM po_headers_all
509 WHERE po_header_id = p_po_header_id;
510
511 IF(l_new_approval_status = 'APPROVED') THEN
512
513 unlock_document(p_po_header_id);
514 ELSE
515 -- document can be saved by any person (not necessary buyer). So, cant determine with which role it should be locked.
516 -- there is no scenario found where document does not get a locked when it is needed. Hence, leaving else part null.
517
518 NULL ;
519 END IF;
520
521 --bug 9407474 end
522
523
524 --Bug#4902870
525 if(l_rebuild_attribs) then
526 PO_CATALOG_INDEX_PVT.rebuild_index
527 ( p_type => l_type,
528 p_po_header_id => p_po_header_id
529 );
530 -- Bug 14277142 : Calling iP rebuild index only if call is not from PO_DRAFT_MERGE_PKG.MergeReserve_Autonomous Code and
531 -- in case of blanket so that item becomes serachable in iP store.
532 IF NVL(p_caller,'N') <> 'MERGE' AND l_type = PO_CATALOG_INDEX_PVT.TYPE_BLANKET THEN
533 -- Rebuild catalog search index.
534 d_position := 90;
535 BEGIN
536 ICX_CAT_INTERMEDIA_INDEX_PVT.rebuild_index;
537 EXCEPTION
538 WHEN OTHERS THEN
539 IF (PO_LOG.d_stmt) THEN
540 PO_LOG.stmt(d_module, d_position, 'Exception while call to ICX_CAT_INTERMEDIA_INDEX_PVT.rebuild_index and erorr encountered is '
541 ||SQLCODE||' -ERROR- '||SQLERRM );
542 END IF;
543 END;
544 end if;
545 END IF;
546
547 IF (PO_LOG.d_proc) THEN
548 PO_LOG.proc_end(d_module);
549 END IF;
550
551 EXCEPTION
552 WHEN OTHERS THEN
553
554 ROLLBACK TO transfer_draft_to_txn_sp;
555 PO_MESSAGE_S.add_exc_msg
556 ( p_pkg_name => d_pkg_name,
557 p_procedure_name => d_api_name || '.' || d_position
558 );
559
560 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
561 END transfer_draft_to_txn;
562
563
564 -----------------------------------------------------------------------
565 --Start of Comments
566 --Name: remove_draft_changes
567 --Pre-reqs: None
568 --Modifies:
569 --Locks:
570 -- None
571 --Function:
572 -- Removes all draft changes at all levels
573 --Parameters:
574 --IN:
575 --p_draft_id
576 -- draft unique identifier
577 --p_exclude_ctrl_tbl
578 -- determines whether control table should be excluded from deletion
579 -- FND_API.G_TRUE if PO_DRAFTS should be excluded
580 -- FND_API.G_FALSE if PO_DRAFTS should not be excluded
581 --IN OUT:
582 --OUT:
583 --x_return_status
584 -- return status of the procedure
585 --Returns:
586 --Notes:
587 --Testing:
588 --End of Comments
589 ------------------------------------------------------------------------
590 PROCEDURE remove_draft_changes
591 ( p_draft_id IN NUMBER,
592 p_exclude_ctrl_tbl IN VARCHAR2,
593 x_return_status OUT NOCOPY VARCHAR2
594 ) IS
595
596 d_api_name CONSTANT VARCHAR2(30) := 'remove_draft_changes';
597 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
598 d_position NUMBER;
599 po_line_ids_tbl PO_TBL_NUMBER; --UCA Changes
600
601 BEGIN
602
603 d_position := 0;
604 IF (PO_LOG.d_proc) THEN
605 PO_LOG.proc_begin(d_module);
606 END IF;
607
608 x_return_status := FND_API.G_RET_STS_SUCCESS;
609
610 PO_HEADERS_DRAFT_PKG.delete_rows
611 ( p_draft_id => p_draft_id,
612 p_po_header_id => NULL
613 );
614
615 --UCA Changes Begin.
616 --Called before line delete as line.org_id needed to determine if uca enabled
617 d_position := 5;
618 IF p_draft_id IS NOT NULL AND p_draft_id <> -1 THEN
619 Select po_line_id
620 BULK Collect into po_line_ids_tbl
621 from po_lines_draft_all pold
622 where pold.draft_id = p_draft_id;
623 --Calling delete line UCAS
624 delete_line_ucas(p_po_draft_id => p_draft_id,
625 po_line_ids_tbl => po_line_ids_tbl);
626 END IF;
627 --UCA Changes End.
628
629 d_position := 10;
630 PO_LINES_DRAFT_PKG.delete_rows
631 ( p_draft_id => p_draft_id,
632 p_po_line_id => NULL
633 );
634
635 d_position := 20;
636 PO_LINE_LOCATIONS_DRAFT_PKG.delete_rows
637 ( p_draft_id => p_draft_id,
638 p_line_location_id => NULL
639 );
640
641 d_position := 30;
642 PO_DISTRIBUTIONS_DRAFT_PKG.delete_rows
643 ( p_draft_id => p_draft_id,
644 p_po_distribution_id => NULL
645 );
646
647 d_position := 40;
648 PO_GA_ORG_ASSIGN_DRAFT_PKG.delete_rows
649 ( p_draft_id => p_draft_id,
650 p_org_assignment_id => NULL
651 );
652
653 d_position := 50;
654 PO_PRICE_DIFF_DRAFT_PKG.delete_rows
655 ( p_draft_id => p_draft_id,
656 p_price_differential_id => NULL
657 );
658
659 d_position := 60;
660 PO_NOTIFICATION_CTRL_DRAFT_PKG.delete_rows
661 ( p_draft_id => p_draft_id,
662 p_notification_id => NULL
663 );
664
665 d_position := 70;
666 PO_ATTR_VALUES_DRAFT_PKG.delete_rows
667 ( p_draft_id => p_draft_id,
668 p_attribute_values_id => NULL
669 );
670
671 d_position := 80;
672 PO_ATTR_VALUES_TLP_DRAFT_PKG.delete_rows
673 ( p_draft_id => p_draft_id,
674 p_attribute_values_tlp_id => NULL
675 );
676
677 --<Enhanced Pricing Start>
678 d_position := 85;
679 PO_PRICE_ADJ_DRAFT_PKG.delete_rows
680 ( p_draft_id => p_draft_id,
681 p_price_adjustment_id => NULL
682 );
683 --<Enhanced Pricing End>
684
685 --<CLM Phase 4 - Elins project Start>
686 d_position := 85;
687 PO_EXHIBITS_PVT.delete_rows
688 ( p_draft_id => p_draft_id,
689 p_po_exhibit_details_id => NULL
690 );
691 --<CLM Phase 4 - Elins project End>
692
693 d_position := 90;
694 IF (NVL(p_exclude_ctrl_tbl, FND_API.G_FALSE) = FND_API.G_FALSE) THEN
695 -- delete draft control table as well
696 DELETE FROM po_drafts
697 WHERE draft_id = p_draft_id;
698 END IF;
699
700 d_position := 100;
701 IF (PO_LOG.d_proc) THEN
702 PO_LOG.proc_end(d_module);
703 END IF;
704 EXCEPTION
705 WHEN OTHERS THEN
706 PO_MESSAGE_S.add_exc_msg
707 ( p_pkg_name => d_pkg_name,
708 p_procedure_name => d_api_name || '.' || d_position
709 );
710
711 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
712 END remove_draft_changes;
713
714
715
716 -----------------------------------------------------------------------
717 --Start of Comments
718 --Name: populate_draft_info
719 --Pre-reqs: None
720 --Modifies:
721 --Locks:
722 -- None
723 --Function:
724 -- Populates record structure that holds draft information
725 --Parameters:
726 --IN:
727 --p_draft_id
728 -- draft unique identifier
729 --p_po_header_id
730 -- document unique identifier
731 --IN OUT:
732 --OUT:
733 --x_draft_info
734 -- record that holds draft information
735 --Returns:
736 --Notes:
737 --Testing:
738 --End of Comments
739 ------------------------------------------------------------------------
740 PROCEDURE populate_draft_info
741 ( p_draft_id IN NUMBER,
742 p_po_header_id IN NUMBER,
743 x_draft_info OUT NOCOPY DRAFT_INFO_REC_TYPE
744 ) IS
745
746 d_api_name CONSTANT VARCHAR2(30) := 'populate_draft_info';
747 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
748 d_position NUMBER;
749
750 l_type_lookup_code PO_HEADERS_ALL.type_lookup_code%TYPE;
751 l_quote_type_lookup_code PO_HEADERS_ALL.quote_type_lookup_code%TYPE;
752
753
754 BEGIN
755
756 d_position := 0;
757 IF (PO_LOG.d_proc) THEN
758 PO_LOG.proc_begin(d_module);
759 END IF;
760
761 x_draft_info.draft_id := p_draft_id;
762 x_draft_info.po_header_id := p_po_header_id;
763
764 -- SQL What: Check whether po_header_id specified already
765 -- exists in PO_HEADERS_ALL
766 -- SQL Why: Need to see whether it is a new document being created
767 SELECT NVL(MAX(FND_API.G_FALSE), FND_API.G_TRUE)
768 INTO x_draft_info.new_document
769 FROM po_headers_all POH
770 WHERE POH.po_header_id = p_po_header_id;
771
772 IF (x_draft_info.new_document = FND_API.G_TRUE) THEN
773 d_position := 10;
774 SELECT PHD.type_lookup_code,
775 PHD.quote_type_lookup_code,
776 NVL(PHD.global_agreement_flag, 'N')
777 INTO l_type_lookup_code,
778 l_quote_type_lookup_code,
779 x_draft_info.ga_flag
780 FROM PO_HEADERS_DRAFT_ALL PHD
781 WHERE PHD.po_header_id = p_po_header_id
782 AND PHD.draft_id = p_draft_id;
783 ELSE
784 d_position := 20;
785 -- If it's not new document, then the changes may not contain header
786 -- change. Get the information from the underlined transaction table
787 SELECT PHA.type_lookup_code,
788 PHA.quote_type_lookup_code,
789 NVL(PHA.global_agreement_flag, 'N')
790 INTO l_type_lookup_code,
791 l_quote_type_lookup_code,
792 x_draft_info.ga_flag
793 FROM PO_HEADERS_ALL PHA
794 WHERE PHA.po_header_id = p_po_header_id;
795 END IF;
796
797 -- <Mod Project> Get the draft type
798 SELECT draft_type
799 INTO x_draft_info.draft_type
800 FROM po_drafts pod
801 WHERE pod.draft_id = p_draft_id;
802
803 d_position := 30;
804 IF (l_type_lookup_code = 'QUOTATION') THEN
805 x_draft_info.doc_type := 'QUOTATION';
806 x_draft_info.doc_subtype := l_quote_type_lookup_code;
807 ELSE
808 IF (l_type_lookup_code = 'STANDARD') THEN
809 x_draft_info.doc_type := 'PO';
810 ELSIF (l_type_lookup_code IN ('BLANKET', 'CONTRACT')) THEN
811 x_draft_info.doc_type := 'PA';
812 END IF;
813
814 x_draft_info.doc_subtype := l_type_lookup_code;
815 END IF;
816
817 d_position := 40;
818 -- check if header gets changed
819 x_draft_info.headers_changed :=
820 PO_HEADERS_DRAFT_PVT.draft_changes_exist
821 ( p_draft_id => p_draft_id,
822 p_po_header_id => NULL
823 );
824
825 d_position := 50;
826 -- check if any line gets changed
827 x_draft_info.lines_changed :=
828 PO_LINES_DRAFT_PVT.draft_changes_exist
829 ( p_draft_id => p_draft_id,
830 p_po_line_id => NULL
831 );
832
833 d_position := 60;
834 -- check if any line location gets changed
835 x_draft_info.line_locations_changed :=
836 PO_LINE_LOCATIONS_DRAFT_PVT.draft_changes_exist
837 ( p_draft_id => p_draft_id,
838 p_line_location_id => NULL
839 );
840
841 d_position := 70;
842 -- check if any distribution gets changed
843 x_draft_info.distributions_changed :=
844 PO_DISTRIBUTIONS_DRAFT_PVT.draft_changes_exist
845 ( p_draft_id => p_draft_id,
846 p_po_distribution_id => NULL
847 );
848
849 d_position := 80;
850 -- check if any org assignment gets changed
851 x_draft_info.ga_org_assign_changed :=
852 PO_GA_ORG_ASSIGN_DRAFT_PVT.draft_changes_exist
853 ( p_draft_id => p_draft_id,
854 p_org_assignment_id => NULL
855 );
856
857 d_position := 90;
858 -- check if price differentials gets changed
859 x_draft_info.price_diff_changed :=
860 PO_PRICE_DIFF_DRAFT_PVT.draft_changes_exist
861 ( p_draft_id => p_draft_id,
862 p_price_differential_id => NULL
863 );
864
865 d_position := 100;
866 -- check if any notification control gets changed
867 x_draft_info.notification_ctrl_changed :=
868 PO_NOTIFICATION_CTRL_DRAFT_PVT.draft_changes_exist
869 ( p_draft_id => p_draft_id,
870 p_notification_id => NULL
871 );
872
873 d_position := 110;
874 -- check if any attribute values record gets changed
875 x_draft_info.attr_values_changed :=
876 PO_ATTR_VALUES_DRAFT_PVT.draft_changes_exist
877 ( p_draft_id => p_draft_id,
878 p_attribute_values_id => NULL
879 );
880
881 d_position := 120;
882 -- check if any attribute values record gets changed
883 x_draft_info.attr_values_tlp_changed :=
884 PO_ATTR_VALUES_TLP_DRAFT_PVT.draft_changes_exist
885 ( p_draft_id => p_draft_id,
886 p_attribute_values_tlp_id => NULL
887 );
888
889 --<Enhanced Pricing Start>
890 d_position := 130;
891 -- check if any price adjustment record gets changed
892 x_draft_info.price_adj_changed :=
893 PO_PRICE_ADJ_DRAFT_PVT.draft_changes_exist
894 ( p_draft_id => p_draft_id,
895 p_price_adjustment_id => NULL
896 );
897 --<Enhanced Pricing End>
898
899 --<CLM Phase 4 - Elins project Start>
900 d_position := 140;
901
902 x_draft_info.exhibits_changed :=
903 PO_EXHIBITS_PVT.draft_changes_exist
904 ( p_draft_id => p_draft_id,
905 p_po_exhibit_details_id => NULL
906 );
907 --<CLM Phase 4 - Elins project End>
908
909
910 d_position := 140;
911 IF (PO_LOG.d_stmt) THEN
912 PO_LOG.stmt(d_module, d_position, 'draft_id', x_draft_info.draft_id);
913 PO_LOG.stmt(d_module, d_position, 'po_header_id',
914 x_draft_info.po_header_id);
915 PO_LOG.stmt(d_module, d_position, 'doc_type', x_draft_info.doc_type);
916 PO_LOG.stmt(d_module, d_position, 'doc_subtype', x_draft_info.doc_subtype);
917 PO_LOG.stmt(d_module, d_position, 'ga_flag', x_draft_info.ga_flag);
918 PO_LOG.stmt(d_module, d_position, 'new_document',
919 x_draft_info.new_document);
920 PO_LOG.stmt(d_module, d_position, 'headers_changed',
921 x_draft_info.headers_changed);
922 PO_LOG.stmt(d_module, d_position, 'lines_changed',
923 x_draft_info.lines_changed);
924 PO_LOG.stmt(d_module, d_position, 'line_locations_changed',
925 x_draft_info.line_locations_changed);
926 PO_LOG.stmt(d_module, d_position, 'distributions_changed',
927 x_draft_info.distributions_changed);
928 PO_LOG.stmt(d_module, d_position, 'ga_org_assign_changed',
929 x_draft_info.ga_org_assign_changed);
930 PO_LOG.stmt(d_module, d_position, 'price_diff_changed',
931 x_draft_info.price_diff_changed);
932 PO_LOG.stmt(d_module, d_position, 'notification_ctrl_changed',
933 x_draft_info.notification_ctrl_changed);
934 PO_LOG.stmt(d_module, d_position, 'attribute_values_changed',
935 x_draft_info.attr_values_changed);
936 PO_LOG.stmt(d_module, d_position, 'attribute_values_tlp_changed',
937 x_draft_info.attr_values_tlp_changed);
938 --Enhanced Pricing
939 PO_LOG.stmt(d_module, d_position, 'price_adjustments_changed',
940 x_draft_info.price_adj_changed);
941 PO_LOG.stmt(d_module, d_position, 'exhibits_changed',
942 x_draft_info.exhibits_changed);
943 END IF;
944
945 IF (PO_LOG.d_proc) THEN
946 PO_LOG.proc_end(d_module);
947 END IF;
948 EXCEPTION
949 WHEN OTHERS THEN
950 PO_MESSAGE_S.add_exc_msg
951 ( p_pkg_name => d_pkg_name,
952 p_procedure_name => d_api_name || '.' || d_position
953 );
954 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
955 END populate_draft_info;
956
957 -- bug4176111
958 -----------------------------------------------------------------------
959 --Start of Comments
960 --Name: pre_apply
961 --Function: This is the procedure to call before any draft data is moved
962 -- to transaction table
963 --
964 --Parameters:
965 --IN:
966 --p_draft_info
967 -- record structure that holds draft information
968 --IN OUT:
969 --OUT:
970 --End of Comments
971 ------------------------------------------------------------------------
972
973 PROCEDURE pre_apply
974 ( p_draft_info IN DRAFT_INFO_REC_TYPE
975 ) IS
976 d_api_name CONSTANT VARCHAR2(30) := 'pre_apply';
977 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
978 d_position NUMBER;
979
980 BEGIN
981
982 IF (PO_LOG.d_proc) THEN
983 PO_LOG.proc_begin(d_module);
984 END IF;
985
986 d_position := 0;
987
988 PO_LINES_DRAFT_PVT.maintain_retroactive_change
989 ( p_draft_info => p_draft_info
990 );
991
992 d_position := 10;
993
994 PO_LINE_LOCATIONS_DRAFT_PVT.maintain_retroactive_change
995 ( p_draft_info => p_draft_info
996 );
997
998
999 IF (PO_LOG.d_proc) THEN
1000 PO_LOG.proc_end(d_module);
1001 END IF;
1002
1003 EXCEPTION
1004 WHEN OTHERS THEN
1005 PO_MESSAGE_S.add_exc_msg
1006 ( p_pkg_name => d_pkg_name,
1007 p_procedure_name => d_api_name || '.' || d_position
1008 );
1009 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1010 END pre_apply;
1011
1012
1013
1014
1015
1016 -----------------------------------------------------------------------
1017 --Start of Comments
1018 --Name: find_draft
1019 --Function: Find a non-completed draft that meets the search criteria. It also
1020 -- returns extra information about the draft
1021 --
1022 --Parameters:
1023 --IN:
1024 --p_po_header_id
1025 -- document id
1026 --IN OUT:
1027 --x_draft_id
1028 -- The draft id identifying the draft changes.
1029 --x_draft_status
1030 -- Status of the draft
1031 --x_draft_owner_role
1032 -- Owner role of the draft
1033 --OUT:
1034 --End of Comments
1035 ------------------------------------------------------------------------
1036
1037 PROCEDURE find_draft
1038 ( p_po_header_id IN NUMBER,
1039 x_draft_id OUT NOCOPY NUMBER,
1040 x_draft_status OUT NOCOPY VARCHAR2,
1041 x_draft_owner_role OUT NOCOPY VARCHAR2
1042 ) IS
1043 d_api_name CONSTANT VARCHAR2(30) := 'find_draft';
1044 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
1045 d_position NUMBER;
1046
1047 BEGIN
1048 d_position := 0;
1049 IF (PO_LOG.d_proc) THEN
1050 PO_LOG.proc_begin(d_module);
1051 END IF;
1052
1053 --SQL What: Search for a non-completed draft given the document id
1054 --SQL Why:
1055 SELECT DFT.draft_id,
1056 DFT.status,
1057 DFT.owner_role
1058 INTO x_draft_id,
1059 x_draft_status,
1060 x_draft_owner_role
1061 FROM po_drafts DFT
1062 WHERE DFT.document_id = p_po_header_id
1063 AND DFT.status <> g_status_COMPLETED
1064 AND DFT.status <> g_status_WITHDRAWN --Mod Project
1065 AND Nvl(dft.draft_type,'NULL') <> 'PAR'; --<PAR Project>
1066
1067 d_position := 10;
1068
1069 IF (PO_LOG.d_proc) THEN
1070 PO_LOG.proc_end(d_module, 'draft_id', x_draft_id);
1071 PO_LOG.proc_end(d_module, 'draft_status', x_draft_status);
1072 PO_LOG.proc_end(d_module, 'draft_owner_role', x_draft_owner_role);
1073 PO_LOG.proc_end(d_module);
1074 END IF;
1075
1076 EXCEPTION
1077 WHEN NO_DATA_FOUND THEN
1078 x_draft_id := NULL;
1079 x_draft_status := NULL;
1080 x_draft_owner_role := NULL;
1081 WHEN OTHERS THEN
1082 x_draft_id := NULL;
1083 x_draft_status := NULL;
1084 x_draft_owner_role := NULL;
1085 END find_draft;
1086
1087 -----------------------------------------------------------------------
1088 --Start of Comments
1089 --Name: find_draft
1090 --Function: Find a non-completed draft that meets the search criteria.
1091 -- This is an overloadded procedure
1092 --Parameters:
1093 --IN:
1094 --p_po_header_id
1095 -- document id
1096 --IN OUT:
1097 --x_draft_id
1098 -- The draft id identifying the draft changes.
1099 --OUT:
1100 --End of Comments
1101 ------------------------------------------------------------------------
1102
1103 PROCEDURE find_draft
1104 ( p_po_header_id IN NUMBER,
1105 x_draft_id OUT NOCOPY NUMBER
1106 ) IS
1107 d_api_name CONSTANT VARCHAR2(30) := 'find_draft';
1108 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
1109 d_position NUMBER;
1110
1111 l_draft_status PO_DRAFTS.status%TYPE;
1112 l_draft_owner_role PO_DRAFTS.owner_role%TYPE;
1113
1114 BEGIN
1115 d_position := 0;
1116 IF (PO_LOG.d_proc) THEN
1117 PO_LOG.proc_begin(d_module);
1118 END IF;
1119
1120 find_draft
1121 ( p_po_header_id => p_po_header_id,
1122 x_draft_id => x_draft_id,
1123 x_draft_status => l_draft_status,
1124 x_draft_owner_role => l_draft_owner_role
1125 );
1126
1127 IF (PO_LOG.d_proc) THEN
1128 PO_LOG.proc_end(d_module, 'draft_id', x_draft_id);
1129 PO_LOG.proc_end(d_module);
1130 END IF;
1131 END find_draft;
1132
1133 -----------------------------------------------------------------------
1134 --Start of Comments
1135 --Name: get_request_id
1136 --Function:
1137 -- Get request id that is processing the draft
1138 --Parameters:
1139 --IN:
1140 --p_draft_id
1141 -- draft unique identifier
1142 --IN OUT:
1143 --OUT:
1144 --x_request_id
1145 -- request_id processing the draft
1146 --Returns:
1147 --End of Comments
1148 ------------------------------------------------------------------------
1149 PROCEDURE get_request_id
1150 ( p_draft_id IN NUMBER,
1151 x_request_id OUT NOCOPY NUMBER
1152 ) IS
1153
1154 d_api_name CONSTANT VARCHAR2(30) := 'get_request_id';
1155 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
1156 d_position NUMBER;
1157
1158 BEGIN
1159 d_position := 0;
1160
1161 IF (PO_LOG.d_proc) THEN
1162 PO_LOG.proc_begin(d_module);
1163 END IF;
1164
1165 SELECT request_id
1166 INTO x_request_id
1167 FROM po_drafts
1168 WHERE draft_id = p_draft_id;
1169
1170 IF (PO_LOG.d_proc) THEN
1171 PO_LOG.proc_end(d_module);
1172 END IF;
1173
1174 EXCEPTION
1175 WHEN OTHERS THEN
1176 PO_MESSAGE_S.add_exc_msg
1177 ( p_pkg_name => d_pkg_name,
1178 p_procedure_name => d_api_name || '.' || d_position
1179 );
1180 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1181 END get_request_id;
1182
1183 -----------------------------------------------------------------------
1184 --Start of Comments
1185 --Name: get_lock_owner_info
1186 --Function:
1187 -- Gets lock owner and role info for the document in transaction table.
1188 -- This
1189 --Parameters:
1190 --IN:p_po_header_id
1191 -- document header id
1192 --IN OUT:
1193 --OUT:
1194 --x_lock_owner_role
1195 -- role of the user locking the document
1196 --x_lock_owner_user_id
1197 -- id of the user having control of the document
1198 --End of Comments
1199 ------------------------------------------------------------------------
1200 PROCEDURE get_lock_owner_info
1201 ( p_po_header_id IN NUMBER,
1202 x_lock_owner_role OUT NOCOPY VARCHAR2,
1203 x_lock_owner_user_id OUT NOCOPY NUMBER
1204 ) IS
1205 d_api_name CONSTANT VARCHAR2(30) := 'get_lock_owner_info';
1206 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
1207 d_position NUMBER;
1208
1209 BEGIN
1210
1211 d_position := 0;
1212 IF (PO_LOG.d_proc) THEN
1213 PO_LOG.proc_begin(d_module);
1214 END IF;
1215
1216 --SQL What: get information about the user locking the document
1217 --SQL Why: these are the values getting returned
1218 SELECT lock_owner_role,
1219 lock_owner_user_id
1220 INTO x_lock_owner_role,
1221 x_lock_owner_user_id
1222 FROM po_headers_all
1223 WHERE po_header_id = p_po_header_id;
1224
1225 IF (PO_LOG.d_proc) THEN
1226 PO_LOG.proc_end(d_module);
1227 END IF;
1228
1229 EXCEPTION
1230 WHEN NO_DATA_FOUND THEN
1231 x_lock_owner_role := NULL;
1232 x_lock_owner_user_id := NULL;
1233
1234 END get_lock_owner_info;
1235
1236 -----------------------------------------------------------------------
1237 --Start of Comments
1238 --Name: set_lock_owner_info
1239 --Function:
1240 -- sets lock owner and role info for the document in transaction table.
1241 -- This
1242 --Parameters:
1243 --IN:
1244 --p_po_header_id
1245 -- document header id
1246 --p_role
1247 -- role of the user
1248 --p_role_user_id
1249 -- user id of the user
1250 --IN OUT:
1251 --OUT:
1252 --End of Comments
1253 ------------------------------------------------------------------------
1254 PROCEDURE set_lock_owner_info
1255 ( p_po_header_id IN NUMBER,
1256 p_role IN VARCHAR2,
1257 p_role_user_id IN NUMBER
1258 ) IS
1259 d_api_name CONSTANT VARCHAR2(30) := 'set_lock_owner_info';
1260 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
1261 d_position NUMBER;
1262
1263 BEGIN
1264
1265 d_position := 0;
1266 IF (PO_LOG.d_proc) THEN
1267 PO_LOG.proc_begin(d_module);
1268 PO_LOG.proc_begin(d_module, 'p_role', p_role);
1269 PO_LOG.proc_begin(d_module, 'p_role_user_id', p_role_user_id);
1270 END IF;
1271
1272 --SQL What: update lock owner role and lock owner id
1273 --SQL Why: This is what this procedure is doing
1274 UPDATE po_headers_all
1275 SET lock_owner_role = p_role,
1276 lock_owner_user_id = p_role_user_id
1277 WHERE po_header_id = p_po_header_id;
1278
1279 IF (PO_LOG.d_proc) THEN
1280 PO_LOG.proc_end(d_module);
1281 END IF;
1282 END set_lock_owner_info;
1283
1284
1285 -----------------------------------------------------------------------
1286 --Start of Comments
1287 --Name: update_permission_check
1288 --Function:
1289 -- Checks whether user can update the document based on draft and
1290 -- functional locking status - This is just a subset of checks to determine
1291 -- whether a document can be updated
1292 --Parameters:
1293 --IN:
1294 --p_calling_module
1295 -- indicate where this API is invoked from
1296 --p_po_header_id
1297 -- document header id
1298 --p_role
1299 -- role of the user
1300 --IN OUT:
1301 --OUT:
1302 --x_update_allowed
1303 -- indicates whether user has
1304 -- authority to update the document
1305 --x_lock_applicable
1306 -- returns whether locking is applicable for the document
1307 --x_unlock_required
1308 -- if update is allowed, checks whether unlock needs to be done before
1309 -- updating
1310 --x_message
1311 -- placeholder for whatever error message that prevents the document
1312 -- from being updatable
1313 --End of Comments
1314 ------------------------------------------------------------------------
1315
1316 PROCEDURE update_permission_check
1317 ( p_calling_module IN VARCHAR2,
1318 p_po_header_id IN NUMBER,
1319 p_role IN VARCHAR2,
1320 p_skip_cat_upload_chk IN VARCHAR2,
1321 x_update_allowed OUT NOCOPY VARCHAR2,
1322 x_locking_applicable OUT NOCOPY VARCHAR2,
1323 x_unlock_required OUT NOCOPY VARCHAR2,
1324 x_message OUT NOCOPY VARCHAR2
1325 ) IS
1326 d_api_name CONSTANT VARCHAR2(30) := 'update_permission_check';
1327 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
1328 d_position NUMBER;
1329
1330 l_draft_id PO_DRAFTS.draft_id%TYPE;
1331 l_draft_status PO_DRAFTS.status%TYPE;
1332 l_draft_owner_role PO_DRAFTS.owner_role%TYPE;
1333
1334 l_calling_module VARCHAR2(100);
1335 l_upload_in_progress VARCHAR2(1);
1336 l_upload_status_code VARCHAR2(30);
1337 l_upload_requestor_role PO_DRAFTS.owner_role%TYPE;
1338 l_upload_requestor_role_id PO_DRAFTS.owner_user_id%TYPE;
1339 l_upload_job_number NUMBER;
1340 l_upload_status_display VARCHAR2(80);
1341
1342 l_authorization_status PO_HEADERS_ALL.authorization_status%TYPE;
1343 l_supplier_auth_enabled PO_HEADERS_ALL.supplier_auth_enabled_flag%TYPE;
1344 l_cat_admin_auth_enabled PO_HEADERS_ALL.cat_admin_auth_enabled_flag%TYPE;
1345 l_current_lock_owner_role PO_HEADERS_ALL.lock_owner_role%TYPE;
1346 l_current_lock_owner_id PO_HEADERS_ALL.lock_owner_user_id%TYPE;
1347
1348 l_updatable_state VARCHAR2(1); -- bug5532550
1349 BEGIN
1350
1351 d_position := 0;
1352 IF (PO_LOG.d_proc) THEN
1353 PO_LOG.proc_begin(d_module);
1354 END IF;
1355
1356 x_update_allowed := FND_API.G_TRUE;
1357 x_locking_applicable := FND_API.G_TRUE;
1358 x_unlock_required := FND_API.G_FALSE;
1359
1360 -- Default calling module if one is not specified
1361 l_calling_module := NVL(p_calling_module, g_call_mod_UNKNOWN);
1362
1363 IF (p_po_header_id IS NULL) THEN
1364 d_position := 10;
1365
1366 IF (PO_LOG.d_stmt) THEN
1367 PO_LOG.stmt (d_module, d_position, 'no po header id. Quitting');
1368 END IF;
1369
1370 -- no document to check. Simply return
1371 RETURN;
1372 END IF;
1373
1374 -- Bug 12700941 starts
1375 -- Getting the lock owner role details before so that based on the lock owner and current role
1376 -- appropriate mesage can be displayed to the user.
1377
1378 d_position := 15;
1379
1380 get_lock_owner_info
1381 ( p_po_header_id => p_po_header_id,
1382 x_lock_owner_role => l_current_lock_owner_role,
1383 x_lock_owner_user_id => l_current_lock_owner_id
1384 );
1385
1386 IF (PO_LOG.d_stmt) THEN
1387 PO_LOG.stmt (d_module, d_position, 'lock owner role', l_current_lock_owner_role);
1388 PO_LOG.stmt (d_module, d_position, 'lock owner user id', l_current_lock_owner_id);
1389 END IF;
1390
1391 -- Bug 12700941 ends
1392
1393 d_position := 20;
1394 -- search for any non-completed draft
1395 find_draft
1396 ( p_po_header_id => p_po_header_id,
1397 x_draft_id => l_draft_id,
1398 x_draft_status => l_draft_status,
1399 x_draft_owner_role => l_draft_owner_role
1400 );
1401 --<conc mod project>
1402 x_locking_applicable := is_locking_applicable
1403 ( p_po_header_id => p_po_header_id,
1404 p_role => p_role
1405 );
1406 IF (l_draft_id IS NOT NULL) THEN
1407
1408 IF (PO_LOG.d_stmt) THEN
1409 PO_LOG.stmt (d_module, d_position, 'has active draft');
1410 END IF;
1411
1412 d_position := 30;
1413
1414 -- modules other than HTML UI or PDOI cannot handle draft changes
1415 --<Bug#4382472>
1416 --Added FORMS PO SUMMARY module to the list as we would allow the breaking of the lock from PO Summary
1417 --Form.
1418 -- bug 5358300
1419 -- Added g_call_mod_HTML_UI_SAVE to the list as we would allow online save operations on the document
1420 IF ( l_calling_module NOT IN (g_call_mod_HTML_UI, g_call_mod_HTML_UI_SAVE, g_call_mod_PDOI, g_call_mod_FORMS_PO_SUMMARY)) THEN
1421 x_message := 'PO_DOC_LOCKED';
1422 x_update_allowed := FND_API.G_FALSE;
1423 RETURN;
1424 END IF;
1425
1426 -- Disallow update if one of the following is true
1427 -- 1) status of the draft is 'IN PROCESS', meaning it's pending for buyer
1428 -- acceptance
1429 -- 2) status is PDOI PROCESSING, and the calling module is not PDOI
1430 -- (status = PDOI PROCESSING may mean that there was an unhandled
1431 -- exception during PDOI. Within PDOI there is code to handle
1432 -- such case to recover the document so we do not want to prevent
1433 -- PDOI from processing this document here)
1434 IF (l_draft_status = g_status_IN_PROCESS AND x_locking_applicable = FND_API.G_TRUE ) THEN
1435 x_message := 'PO_BUYER_ACCEPTANCE_PENDING';
1436 x_update_allowed := FND_API.G_FALSE;
1437 RETURN;
1438
1439 ELSIF (l_draft_status = g_status_PDOI_PROCESSING AND
1440 l_calling_module <> g_call_mod_PDOI ) THEN
1441
1442 x_message := 'PO_UPLOAD_PENDING_RUNNING';
1443 x_update_allowed := FND_API.G_FALSE;
1444 RETURN;
1445
1446 -- Bug 12700941 :
1447 -- if the lock owner is same as current role and there is error, he should face error
1448 -- If the lock owner is Buyer and Cat.Admin/Supplier is the current role,
1449 -- then user should see the error as the "Document is locked by other Role"
1450 -- if the lock owner is Cat.Admin/Supplier and Buyer is the current role,
1451 -- the user should get a warning and he can break the lock and continue
1452 -- If the Upload failure is due to PDOI Error, then also the USer will see the
1453 -- Standard Upload Error, In View Upload Errors, he/she will be able to see the exact error message.
1454 ELSIF (l_draft_status = g_status_PDOI_ERROR
1455 AND l_calling_module <> g_call_mod_PDOI) THEN
1456
1457 if(l_current_lock_owner_role = p_role OR l_current_lock_owner_role IS NULL) THEN
1458 x_message := 'PO_UPLOAD_ERROR';
1459 x_update_allowed := FND_API.G_FALSE;
1460 RETURN;
1461 ELSE
1462 x_message := 'PO_DOC_LOCKED_BY_OTHER_ROLE';
1463 IF(p_role <> PO_GLOBAL.g_role_BUYER) THEN
1464 x_update_allowed := FND_API.G_FALSE;
1465 ELSE
1466 x_unlock_required := FND_API.G_TRUE;
1467 END IF;
1468 -- Bug 12700941 ends
1469 RETURN;
1470 END IF;
1471
1472 END IF;
1473 END IF;
1474
1475 d_position := 40;
1476
1477 IF ( NVL(p_skip_cat_upload_chk, FND_API.G_FALSE) = FND_API.G_FALSE) THEN
1478 -- Call iP API to see if there is catalog uploading activity. If so,
1479 -- Prevent locking
1480
1481 -- bug5014131
1482 -- Changed the API call to the one that checks any in progress upload
1483 get_in_process_upload_info
1484 ( p_po_header_id => p_po_header_id,
1485 x_upload_in_progress => l_upload_in_progress,
1486 x_upload_status_code => l_upload_status_code,
1487 x_upload_requestor_role => l_upload_requestor_role,
1488 x_upload_requestor_role_id => l_upload_requestor_role_id,
1489 x_upload_job_number => l_upload_job_number,
1490 x_upload_status_display => l_upload_status_display
1491 );
1492
1493 IF (l_upload_in_progress = FND_API.G_TRUE) THEN
1494 IF (l_upload_status_code IN (g_upload_status_PENDING, g_upload_status_RUNNING)) THEN
1495 IF (PO_LOG.d_stmt) THEN
1496 PO_LOG.stmt (d_module, d_position, 'in progress catalog upload');
1497 END IF;
1498
1499 x_message := 'PO_UPLOAD_PENDING_RUNNING';
1500 x_update_allowed := FND_API.G_FALSE;
1501 RETURN;
1502 ELSIF (l_upload_status_code = g_upload_status_ERROR) THEN
1503 IF (PO_LOG.d_stmt) THEN
1504 PO_LOG.stmt (d_module, d_position, 'errored catalog upload');
1505 END IF;
1506
1507 -- Bug 12700941 :
1508 -- if the lock owner is same as current role and there is error, he should face error
1509 -- If the lock owner is Buyer and Cat.Admin/Supplier is the current role,
1510 -- then user should see the error as the "Document is locked by other Role"
1511 -- if the lock owner is Cat.Admin/Supplier and Buyer is the current role,
1512 -- the user should get a warning and he can break the lock and continue
1513
1514 if(l_upload_requestor_role = p_role) THEN
1515 x_message := 'PO_UPLOAD_ERROR';
1516 x_update_allowed := FND_API.G_FALSE;
1517 RETURN;
1518 ELSE
1519 x_message := 'PO_DOC_LOCKED_BY_OTHER_ROLE';
1520 IF(p_role <> PO_GLOBAL.g_role_BUYER) THEN
1521 x_update_allowed := FND_API.G_FALSE;
1522 ELSE
1523 x_unlock_required := FND_API.G_TRUE;
1524 END IF;
1525
1526 RETURN;
1527 END IF;
1528 END IF;
1529 END IF;
1530 END IF;
1531 -- Bug 12700941 ends
1532
1533
1534
1535 IF (x_locking_applicable = FND_API.G_FALSE) THEN
1536 IF (PO_LOG.d_stmt) THEN
1537 PO_LOG.stmt (d_module, d_position, 'locking is not applicable');
1538 END IF;
1539
1540 -- if locking is not applicable, then we are done with the checks.
1541 -- simply return
1542 RETURN;
1543 END IF;
1544
1545 d_position := 50;
1546
1547 IF (p_role = PO_GLOBAL.g_role_SUPPLIER) THEN
1548 l_supplier_auth_enabled :=
1549 get_supplier_auth_enabled_flag
1550 ( p_po_header_id => p_po_header_id
1551 );
1552
1553 -- supplier is allowed to get the lock only if the document is enabled
1554 -- for supplier authoring
1555 IF (NVL(l_supplier_auth_enabled, 'N') = 'N') THEN
1556 x_message := 'PO_UPDATE_NOT_ALLOWED';
1557 x_update_allowed := FND_API.G_FALSE;
1558 RETURN;
1559 END IF;
1560 END IF;
1561
1562 IF (p_role = PO_GLOBAL.g_role_CAT_ADMIN) THEN
1563 l_cat_admin_auth_enabled :=
1564 get_cat_admin_auth_enable_flag
1565 ( p_po_header_id => p_po_header_id
1566 );
1567
1568 -- cat admin is allowed to get the lock only if the document is enabled
1569 -- for Cat Admin authoring
1570 IF (NVL(l_cat_admin_auth_enabled, 'N') = 'N') THEN
1571 x_message := 'PO_UPDATE_NOT_ALLOWED';
1572 x_update_allowed := FND_API.G_FALSE;
1573 RETURN;
1574 END IF;
1575 END IF;
1576
1577 d_position := 55;
1578
1579 SELECT NVL(authorization_status, 'INCOMPLETE')
1580 INTO l_authorization_status
1581 FROM po_headers_all
1582 WHERE po_header_id = p_po_header_id;
1583
1584 -- do not allow document update by non-buyer role if
1585 -- document is not in INCOMPLETE or APPROVED status
1586 IF ( p_role <> PO_GLOBAL.g_role_BUYER AND
1587 l_authorization_status NOT IN ('INCOMPLETE', 'APPROVED')) THEN
1588
1589 IF (PO_LOG.d_stmt) THEN
1590 PO_LOG.stmt (d_module, d_position, 'auth status = ' ||
1591 l_authorization_status || '. This role cannot update the document ' ||
1592 'in this status');
1593 END IF;
1594
1595 x_message := 'PO_AUTH_STATUS_ERROR';
1596 x_update_allowed := FND_API.G_FALSE;
1597 RETURN;
1598 END IF;
1599
1600 -- bug5532550 START
1601 -- Check and make sure that the document is in a state allowing
1602 -- updates
1603
1604 l_updatable_state := is_doc_in_updatable_state
1605 ( p_po_header_id => p_po_header_id,
1606 p_role => p_role
1607 );
1608
1609 IF ( l_updatable_state = FND_API.G_FALSE ) THEN
1610 x_message := 'PO_ALL_CADM_DOC_CANT_BE_OPENED';
1611 x_update_allowed := FND_API.G_FALSE;
1612 RETURN;
1613 END IF;
1614
1615 -- bug5532550 END
1616
1617 -- Bug 12700941 : Moved the call to get_lock_owner_info up as the lock_owner infor was needed
1618 -- to show the appropriate error message can be shown based on lock owner role
1619
1620 IF ( l_calling_module in (g_call_mod_HTML_UI,g_call_mod_FORMS_PO_SUMMARY)) THEN --<Bug4382472>
1621
1622 d_position := 70;
1623
1624 IF (p_role = l_current_lock_owner_role OR
1625 l_current_lock_owner_role IS NULL) THEN
1626
1627 -- In HTML, a role can update the document if
1628 -- the same role is currently locking the document OR
1629 -- nobody is locking the document
1630
1631 -- In such cases, we can simply take the default value of the
1632 -- update_allowed_flag (FND_API.G_TRUE)
1633 NULL;
1634 ELSIF (p_role = PO_GLOBAL.g_role_BUYER) THEN
1635 x_message := 'PO_DOC_LOCKED_BY_OTHER_ROLE';
1636 -- if role is buyer and the role currently locking the document
1637 -- is different, we need to unlock the document first
1638 x_unlock_required := FND_API.G_TRUE;
1639 RETURN;
1640 ELSE
1641 -- cannot update - role is not BUYER and it is currently locked
1642 -- by somebody else
1643 x_message := 'PO_DOC_LOCKED_BY_OTHER_ROLE';
1644 x_update_allowed := FND_API.G_FALSE;
1645 RETURN;
1646 END IF;
1647
1648 ELSIF (l_calling_module in (g_call_mod_HTML_UI_SAVE)) THEN
1649 -- bug 5358300
1650 -- call during html save operation
1651 -- current role must have lock on document
1652 d_position := 80;
1653
1654 -- If coming from html save operation, nobody has update authority
1655 -- if document is currently locked by some other role
1656
1657 IF (p_role <> l_current_lock_owner_role) THEN
1658 x_message := 'PO_DOC_LOCKED_BY_OTHER_ROLE';
1659 x_update_allowed := FND_API.G_FALSE;
1660 RETURN;
1661 END IF;
1662
1663 ELSE
1664 d_position := 90;
1665
1666 -- If coming from anywhere else, nobody has update authority
1667 -- if document is currently locked by some other role
1668
1669 IF (p_role <> l_current_lock_owner_role) THEN
1670 x_message := 'PO_DOC_LOCKED';
1671 x_update_allowed := FND_API.G_FALSE;
1672 RETURN;
1673 END IF;
1674
1675 END IF;
1676
1677 IF (PO_LOG.d_proc) THEN
1678 PO_LOG.proc_end(d_module);
1679 END IF;
1680
1681 EXCEPTION
1682 WHEN OTHERS THEN
1683 PO_MESSAGE_S.add_exc_msg
1684 ( p_pkg_name => d_pkg_name,
1685 p_procedure_name => d_api_name || '.' || d_position
1686 );
1687 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1688 END update_permission_check;
1689
1690 -- update_permission_check - 2
1691 PROCEDURE update_permission_check
1692 ( p_calling_module IN VARCHAR2,
1693 p_po_header_id IN NUMBER,
1694 p_role IN VARCHAR2,
1695 p_skip_cat_upload_chk IN VARCHAR2,
1696 x_update_allowed OUT NOCOPY VARCHAR2,
1697 x_locking_applicable OUT NOCOPY VARCHAR2,
1698 x_unlock_required OUT NOCOPY VARCHAR2,
1699 x_message OUT NOCOPY VARCHAR2,
1700 x_token_name_tbl OUT NOCOPY PO_TBL_VARCHAR30,
1701 x_token_value_tbl OUT NOCOPY PO_TBL_VARCHAR2000
1702 ) IS
1703
1704 l_num_records NUMBER;
1705 l_style_name PO_DOC_STYLE_HEADERS.style_name%TYPE;
1706
1707 BEGIN
1708 update_permission_check
1709 ( p_calling_module => p_calling_module,
1710 p_po_header_id => p_po_header_id,
1711 p_role => p_role,
1712 p_skip_cat_upload_chk => p_skip_cat_upload_chk,
1713 x_update_allowed => x_update_allowed,
1714 x_locking_applicable => x_locking_applicable,
1715 x_unlock_required => x_unlock_required,
1716 x_message => x_message
1717 );
1718
1719 x_token_name_tbl := PO_TBL_VARCHAR30();
1720 x_token_value_tbl := PO_TBL_VARCHAR2000();
1721
1722 IF (x_update_allowed = FND_API.G_TRUE) THEN
1723 RETURN;
1724 END IF;
1725
1726 l_style_name := PO_DOC_STYLE_PVT.get_style_display_name
1727 (p_doc_id => p_po_header_id);
1728
1729 IF (x_message IN ('PO_DOC_LOCKED', 'PO_UPDATE_NOT_ALLOWED',
1730 'PO_AUTH_STATUS_ERROR', 'PO_DOC_LOCKED_BY_OTHER_ROLE',
1731 'PO_UPLOAD_PENDING_RUNNING', 'PO_UPLOAD_ERROR',
1732 'PO_BUYER_ACCEPTANCE_PENDING',
1733 'PO_LOCKED_BY_PDOI_ERR')) THEN
1734 x_token_name_tbl := PO_TBL_VARCHAR30 ('STYLE_NAME');
1735 x_token_value_tbl := PO_TBL_VARCHAR2000 (l_style_name);
1736 END IF;
1737
1738 END update_permission_check;
1739
1740 -- update_permission_check - 3
1741 PROCEDURE update_permission_check
1742 ( p_calling_module IN VARCHAR2,
1743 p_po_header_id IN NUMBER,
1744 p_role IN VARCHAR2,
1745 p_skip_cat_upload_chk IN VARCHAR2,
1746 x_update_allowed OUT NOCOPY VARCHAR2,
1747 x_locking_applicable OUT NOCOPY VARCHAR2,
1748 x_unlock_required OUT NOCOPY VARCHAR2,
1749 x_message OUT NOCOPY VARCHAR2,
1750 x_message_text OUT NOCOPY VARCHAR2
1751 ) IS
1752
1753 l_token_name_tbl PO_TBL_VARCHAR30;
1754 l_token_value_tbl PO_TBL_VARCHAR2000;
1755
1756 BEGIN
1757 update_permission_check
1758 ( p_calling_module => p_calling_module,
1759 p_po_header_id => p_po_header_id,
1760 p_role => p_role,
1761 p_skip_cat_upload_chk => p_skip_cat_upload_chk,
1762 x_update_allowed => x_update_allowed,
1763 x_locking_applicable => x_locking_applicable,
1764 x_unlock_required => x_unlock_required,
1765 x_message => x_message,
1766 x_token_name_tbl => l_token_name_tbl,
1767 x_token_value_tbl => l_token_value_tbl
1768 );
1769
1770 IF (x_update_allowed = FND_API.G_TRUE) THEN
1771 RETURN;
1772 END IF;
1773
1774 FND_MESSAGE.set_name ('PO', x_message);
1775 FOR i IN 1..l_token_name_tbl.COUNT LOOP
1776 FND_MESSAGE.set_token (l_token_name_tbl(i), l_token_value_tbl(i));
1777 END LOOP;
1778
1779 x_message_text := FND_MESSAGE.get;
1780
1781 END update_permission_check;
1782
1783
1784 -----------------------------------------------------------------------
1785 --Start of Comments
1786 --Name: unlock_document
1787 --Function: unlock the document by setting role and role id to null
1788 --Parameters:
1789 --IN:
1790 --p_po_header_id
1791 --document header id
1792 --IN OUT:
1793 --OUT:
1794 --End of Comments
1795 ------------------------------------------------------------------------
1796
1797 PROCEDURE unlock_document
1798 ( p_po_header_id IN NUMBER
1799 ) IS
1800 d_api_name CONSTANT VARCHAR2(30) := 'unlock_document';
1801 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
1802 d_position NUMBER;
1803
1804 l_draft_id PO_DRAFTS.draft_id%TYPE;
1805 l_draft_status PO_DRAFTS.status%TYPE;
1806 l_draft_owner_role PO_DRAFTS.owner_role%TYPE;
1807
1808 l_return_status VARCHAR2(1);
1809
1810 BEGIN
1811
1812 d_position := 0;
1813 IF (PO_LOG.d_proc) THEN
1814 PO_LOG.proc_begin(d_module);
1815 END IF;
1816
1817 find_draft
1818 ( p_po_header_id => p_po_header_id,
1819 x_draft_id => l_draft_id,
1820 x_draft_status => l_draft_status,
1821 x_draft_owner_role => l_draft_owner_role
1822 );
1823
1824 IF ( l_draft_id IS NOT NULL ) THEN
1825 d_position := 10;
1826
1827 IF (PO_LOG.d_stmt) THEN
1828 PO_LOG.stmt(d_module, d_position, 'need to remove draft changes');
1829 END IF;
1830
1831 PO_DRAFTS_PVT.remove_draft_changes
1832 ( p_draft_id => l_draft_id,
1833 p_exclude_ctrl_tbl => FND_API.G_FALSE,
1834 x_return_status => l_return_status
1835 );
1836
1837 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1838 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1839 END IF;
1840 END IF;
1841
1842 -- unlock document by setting lock owner role to NULL
1843 set_lock_owner_info
1844 ( p_po_header_id => p_po_header_id,
1845 p_role => NULL,
1846 p_role_user_id => NULL
1847 );
1848
1849 IF (PO_LOG.d_proc) THEN
1850 PO_LOG.proc_end(d_module);
1851 END IF;
1852
1853 END unlock_document;
1854
1855
1856
1857 -----------------------------------------------------------------------
1858 --Start of Comments
1859 --Name: lock_document
1860 --Function:
1861 -- Set document lock of the document. it first unlocks the document, removes
1862 -- draft changes before locking
1863 --Parameters:
1864 --IN:
1865 --p_po_header_id
1866 -- document header id
1867 --p_role
1868 -- role of the user
1869 --p_role_user_id
1870 -- role id of the user
1871 --p_unlock_current
1872 -- indicates whether the document needs to go through draft cleanup
1873 --IN OUT:
1874 --OUT:
1875 --RETURNS
1876 --
1877 --End of Comments
1878 ------------------------------------------------------------------------
1879 PROCEDURE lock_document
1880 ( p_po_header_id IN NUMBER,
1881 p_role IN VARCHAR2,
1882 p_role_user_id IN NUMBER,
1883 p_unlock_current IN VARCHAR2
1884 ) IS
1885 d_api_name CONSTANT VARCHAR2(30) := 'lock_document';
1886 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
1887 d_position NUMBER;
1888
1889 l_locking_applicable VARCHAR2(1);
1890 BEGIN
1891
1892 d_position := 0;
1893 IF (PO_LOG.d_proc) THEN
1894 PO_LOG.proc_begin(d_module);
1895 END IF;
1896
1897 l_locking_applicable := is_locking_applicable
1898 ( p_po_header_id => p_po_header_id,
1899 p_role => p_role
1900 );
1901
1902 IF (l_locking_applicable = FND_API.G_FALSE) THEN
1903 RETURN;
1904 END IF;
1905
1906 IF (p_unlock_current = FND_API.G_TRUE) THEN
1907 unlock_document
1908 ( p_po_header_id => p_po_header_id
1909 );
1910 END IF;
1911
1912 d_position := 10;
1913 set_lock_owner_info
1914 ( p_po_header_id => p_po_header_id,
1915 p_role => p_role,
1916 p_role_user_id => p_role_user_id
1917 );
1918
1919 IF (PO_LOG.d_proc) THEN
1920 PO_LOG.proc_end(d_module);
1921 END IF;
1922 END lock_document;
1923
1924
1925 -----------------------------------------------------------------------
1926 --Start of Comments
1927 --Name: is_locking_applicable
1928 --Function:
1929 -- check whether locking of the document is required
1930 --Parameters:
1931 --IN:
1932 --p_po_header_id
1933 -- document header id
1934 --p_role
1935 -- role of the user
1936 --End of Comments
1937 ------------------------------------------------------------------------
1938 FUNCTION is_locking_applicable
1939 ( p_po_header_id IN NUMBER,
1940 p_role IN VARCHAR2
1941 ) RETURN VARCHAR2 IS
1942
1943 d_api_name CONSTANT VARCHAR2(30) := 'is_locking_applicable';
1944 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
1945 d_position NUMBER;
1946
1947 l_applicable VARCHAR2(1) := FND_API.G_TRUE;
1948
1949 l_type_lookup_code PO_HEADERS_ALL.type_lookup_code%TYPE;
1950 l_ga_flag PO_HEADERS_ALL.global_agreement_flag%TYPE;
1951 l_approved_date PO_HEADERS_ALL.approved_date%TYPE;
1952 l_current_lock_owner_role PO_HEADERS_ALL.lock_owner_role%TYPE;
1953
1954 BEGIN
1955
1956 d_position := 0;
1957 IF (PO_LOG.d_proc) THEN
1958 PO_LOG.proc_begin(d_module);
1959 END IF;
1960
1961 -- SQL What: Get several columns from PO tables
1962 -- SQL Why: Need all these columns to determine whether locking
1963 -- is applicable
1964 SELECT type_lookup_code,
1965 NVL(global_agreement_flag, 'N'),
1966 approved_date,
1967 lock_owner_role
1968 INTO l_type_lookup_code,
1969 l_ga_flag,
1970 l_approved_date,
1971 l_current_lock_owner_role
1972 FROM po_headers_all
1973 WHERE po_header_id = p_po_header_id;
1974
1975 -- locking is applicable only for global blanket agreement
1976 -- <Conc Mods Project> Bypass locking for Mod enabled styles
1977 IF (NOT (l_type_lookup_code = 'BLANKET' AND l_ga_flag = 'Y')
1978 OR is_mod_enabled(p_po_header_id) = FND_API.G_TRUE) THEN
1979
1980 l_applicable := FND_API.G_FALSE;
1981
1982 ELSIF ( l_current_lock_owner_role IS NULL AND
1983 p_role = PO_GLOBAL.g_role_BUYER AND
1984 l_approved_date IS NULL ) THEN
1985
1986 l_applicable := FND_API.G_FALSE;
1987 END IF;
1988
1989 IF (PO_LOG.d_proc) THEN
1990 PO_LOG.proc_end(d_module, 'l_applicable', l_applicable);
1991 END IF;
1992
1993 RETURN l_applicable;
1994
1995 EXCEPTION
1996 WHEN NO_DATA_FOUND THEN
1997 l_applicable := FND_API.G_FALSE;
1998 RETURN l_applicable;
1999 END is_locking_applicable;
2000
2001 -----------------------------------------------------------------------
2002 --Start of Comments
2003 --Name: is_draft_applicable
2004 --Function:
2005 -- check whether the document can have pending drafts
2006 --Parameters:
2007 --IN:
2008 --p_po_header_id
2009 -- document header id
2010 --p_role
2011 -- role of the user
2012 --End of Comments
2013 ------------------------------------------------------------------------
2014 FUNCTION is_draft_applicable
2015 ( p_po_header_id IN NUMBER,
2016 p_role IN VARCHAR2
2017 ) RETURN VARCHAR2 IS
2018
2019 d_api_name CONSTANT VARCHAR2(30) := 'is_draft_applicable';
2020 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
2021 d_position NUMBER;
2022
2023 l_applicable VARCHAR2(1) := FND_API.G_TRUE;
2024
2025 l_type_lookup_code PO_HEADERS_ALL.type_lookup_code%TYPE;
2026 l_ga_flag PO_HEADERS_ALL.global_agreement_flag%TYPE;
2027 BEGIN
2028 d_position := 0;
2029
2030 IF (PO_LOG.d_proc) THEN
2031 PO_LOG.proc_begin(d_module);
2032 END IF;
2033
2034 -- SQL What: Get several columns from PO tables
2035 -- SQL Why: Need all these columns to determine whether locking
2036 -- is applicable
2037 SELECT type_lookup_code,
2038 NVL(global_agreement_flag, 'N')
2039 INTO l_type_lookup_code,
2040 l_ga_flag
2041 FROM po_headers_all
2042 WHERE po_header_id = p_po_header_id;
2043
2044 d_position := 10;
2045
2046 -- locking is applicable only for global blanket agreement
2047 IF (NOT (l_type_lookup_code = 'BLANKET' AND l_ga_flag = 'Y')) THEN
2048
2049 l_applicable := FND_API.G_FALSE;
2050
2051 ELSIF ( p_role = PO_GLOBAL.g_role_BUYER) THEN
2052
2053 l_applicable := FND_API.G_FALSE;
2054 END IF;
2055
2056 IF (PO_LOG.d_proc) THEN
2057 PO_LOG.proc_end(d_module, 'l_applicable', l_applicable);
2058 END IF;
2059
2060 RETURN l_applicable;
2061
2062 EXCEPTION
2063 WHEN NO_DATA_FOUND THEN
2064 l_applicable := FND_API.G_FALSE;
2065 RETURN l_applicable;
2066 END is_draft_applicable;
2067
2068
2069
2070 -----------------------------------------------------------------------
2071 --Start of Comments
2072 --Name: lock_document_with_validate
2073 --Function:
2074 -- Same as lock_document, except that it performs update_permission_check
2075 -- procedure before going to lock_document procedure.
2076 --Parameters:
2077 --IN:
2078 --p_calling_module
2079 -- indicates where the procedure is called from
2080 --p_po_header_id
2081 -- document header id
2082 --p_role
2083 -- role of the user
2084 --p_role_user_id
2085 -- role id of the user
2086 --OUT:
2087 --x_locking_allowed
2088 -- indicate whether locking was permitted
2089 --x_message
2090 -- error message when locking has not been permitted
2091 --End of Comments
2092 ------------------------------------------------------------------------
2093
2094 PROCEDURE lock_document_with_validate
2095 ( p_calling_module IN VARCHAR2,
2096 p_po_header_id IN NUMBER,
2097 p_role IN VARCHAR2,
2098 p_role_user_id IN NUMBER,
2099 x_locking_allowed OUT NOCOPY VARCHAR2,
2100 x_message OUT NOCOPY VARCHAR2,
2101 x_message_text OUT NOCOPY VARCHAR2
2102 ) IS
2103 d_api_name CONSTANT VARCHAR2(30) := 'lock_document_with_validate';
2104 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
2105 d_position NUMBER;
2106
2107 l_message VARCHAR2(2000);
2108 l_locking_applicable VARCHAR2(1);
2109 l_unlock_required VARCHAR2(1);
2110
2111 BEGIN
2112
2113 d_position := 0;
2114 IF (PO_LOG.d_proc) THEN
2115 PO_LOG.proc_begin(d_module);
2116 END IF;
2117
2118 update_permission_check
2119 ( p_calling_module => p_calling_module,
2120 p_po_header_id => p_po_header_id,
2121 p_role => p_role,
2122 x_update_allowed => x_locking_allowed,
2123 x_locking_applicable => l_locking_applicable,
2124 x_unlock_required => l_unlock_required,
2125 x_message => x_message,
2126 x_message_text => x_message_text
2127 );
2128
2129
2130 -- if locking is not allowed, do not need to continue to lock the
2131 -- document
2132 IF (l_locking_applicable = FND_API.G_FALSE OR
2133 x_locking_allowed = FND_API.G_FALSE) THEN
2134 RETURN;
2135 END IF;
2136
2137 d_position := 10;
2138
2139 lock_document
2140 ( p_po_header_id => p_po_header_id,
2141 p_role => p_role,
2142 p_role_user_id => p_role_user_id,
2143 p_unlock_current => l_unlock_required
2144 );
2145
2146 IF (PO_LOG.d_proc) THEN
2147 PO_LOG.proc_end(d_module);
2148 END IF;
2149 END lock_document_with_validate;
2150
2151 -----------------------------------------------------------------------
2152 --Start of Comments
2153 --Name: update_draft_status
2154 --Function:
2155 -- updates status of the draft
2156 --Parameters:
2157 --IN:
2158 --p_draft_id
2159 -- draft id of the pending changes
2160 --End of Comments
2161 ------------------------------------------------------------------------
2162
2163 PROCEDURE update_draft_status
2164 ( p_draft_id IN NUMBER,
2165 p_new_status IN VARCHAR2
2166 ) IS
2167 d_api_name CONSTANT VARCHAR2(30) := 'update_draft_status';
2168 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
2169 d_position NUMBER;
2170
2171 l_cur_conc_request_id NUMBER := FND_GLOBAL.conc_request_id;
2172 BEGIN
2173
2174 d_position := 0;
2175 IF (PO_LOG.d_proc) THEN
2176 PO_LOG.proc_begin(d_module);
2177 END IF;
2178
2179 -- for request id, populate only if the draft is being processed by PDOI
2180 UPDATE po_drafts
2181 SET status = p_new_status,
2182 request_id = DECODE (p_new_status,
2183 g_status_PDOI_PROCESSING, l_cur_conc_request_id,
2184 NULL)
2185 WHERE draft_id = p_draft_id;
2186
2187 IF (PO_LOG.d_proc) THEN
2188 PO_LOG.proc_end(d_module);
2189 END IF;
2190
2191 END update_draft_status;
2192
2193 -----------------------------------------------------------------------
2194 --Start of Comments
2195 --Name: pending_changes_exist
2196 --Function:
2197 -- check whether a non-completed draft exists in the system
2198 --Parameters:
2199 --IN:
2200 --p_po_header_id
2201 -- document id of the record
2202 --End of Comments
2203 ------------------------------------------------------------------------
2204
2205 FUNCTION pending_changes_exist
2206 ( p_po_header_id IN NUMBER
2207 ) RETURN VARCHAR2 IS
2208
2209 d_api_name CONSTANT VARCHAR2(30) := 'pending_changes_exist';
2210 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
2211 d_position NUMBER;
2212
2213 --l_draft_id PO_DRAFTS.draft_id%TYPE;
2214 --l_draft_status PO_DRAFTS.status%TYPE;
2215 --l_draft_owner_role PO_DRAFTS.owner_role%TYPE;
2216
2217 l_pending_changes_exist VARCHAR2(1) := FND_API.G_FALSE;
2218 BEGIN
2219
2220 d_position := 0;
2221 IF (PO_LOG.d_proc) THEN
2222 PO_LOG.proc_begin(d_module);
2223 END IF;
2224
2225 /*find_draft
2226 ( p_po_header_id => p_po_header_id,
2227 x_draft_id => l_draft_id,
2228 x_draft_status => l_draft_status,
2229 x_draft_owner_role => l_draft_owner_role
2230 );
2231
2232 IF (l_draft_id IS NOT NULL) THEN
2233 l_pending_changes_exist := FND_API.G_TRUE;
2234 END IF;*/
2235
2236 -- <Mod Project>
2237 -- Do not call find_draft. Execute separate query.
2238 -- Exclude entries with draft_type = 'MOD'/'ARCHIVE'
2239 SELECT FND_API.G_TRUE
2240 INTO l_pending_changes_exist
2241 FROM dual
2242 WHERE EXISTS (SELECT 'Draft Exists'
2243 FROM po_drafts
2244 WHERE document_id = p_po_header_id
2245 AND status <> g_status_COMPLETED
2246 AND NVL(draft_type,g_draft_type_DOC_CHANGE) = g_draft_type_DOC_CHANGE);
2247
2248 IF (PO_LOG.d_proc) THEN
2249 PO_LOG.proc_end(d_module, 'l_pending_changes_exist', l_pending_changes_exist);
2250 END IF;
2251
2252 RETURN l_pending_changes_exist;
2253
2254 EXCEPTION
2255 WHEN NO_DATA_FOUND THEN
2256 l_pending_changes_exist := FND_API.G_FALSE;
2257 IF (PO_LOG.d_proc) THEN
2258 PO_LOG.proc_end(d_module, 'NO_DATA_FOUND: l_pending_changes_exist', l_pending_changes_exist);
2259 END IF;
2260 RETURN l_pending_changes_exist;
2261 END pending_changes_exist;
2262
2263 -----------------------------------------------------------------------
2264 --Start of Comments
2265 --Name: changes_exist_for_draft
2266 --Function:
2267 -- Given the draft id table, check whether there exist any draft changes
2268 -- at any entity for each draft id. FND_API.G_TRUE will be populated to
2269 -- the corresponding entry in the returned table
2270 --Parameters:
2271 --IN:
2272 --p_draft_id_tbl
2273 -- draft id table
2274 --RETURN
2275 -- list of VARCHAR2(1) indicating whether the draft id has draft changes
2276 -- at any entity level for the corrsponding entry in p_draft_id_tbl
2277 --End of Comments
2278 ------------------------------------------------------------------------
2279 FUNCTION changes_exist_for_draft
2280 ( p_draft_id_tbl PO_TBL_NUMBER
2281 ) RETURN PO_TBL_VARCHAR1 IS
2282
2283 d_api_name CONSTANT VARCHAR2(30) := 'changes_exist_for_draft';
2284 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
2285 d_position NUMBER;
2286
2287 l_null_id_tbl PO_TBL_NUMBER := PO_TBL_NUMBER();
2288
2289 l_master_chg_exist_tbl PO_TBL_VARCHAR1 := PO_TBL_VARCHAR1();
2290 l_chg_exist_tbl PO_TBL_VARCHAR1 := PO_TBL_VARCHAR1();
2291 BEGIN
2292
2293 d_position := 0;
2294
2295 IF (PO_LOG.d_proc) THEN
2296 PO_LOG.proc_begin (d_module);
2297 END IF;
2298
2299 l_null_id_tbl.EXTEND(p_draft_id_tbl.COUNT);
2300 l_master_chg_exist_tbl.EXTEND(p_draft_id_tbl.COUNT);
2301 l_chg_exist_tbl.EXTEND(p_draft_id_tbl.COUNT);
2302
2303 d_position := 10;
2304
2305 -- check if header gets changed
2306 l_master_chg_exist_tbl :=
2307 PO_HEADERS_DRAFT_PVT.draft_changes_exist
2308 ( p_draft_id_tbl => p_draft_id_tbl,
2309 p_po_header_id_tbl => l_null_id_tbl
2310 );
2311
2312 d_position := 20;
2313 -- check if any line gets changed
2314 l_chg_exist_tbl :=
2315 PO_LINES_DRAFT_PVT.draft_changes_exist
2316 ( p_draft_id_tbl => p_draft_id_tbl,
2317 p_po_line_id_tbl => l_null_id_tbl
2318 );
2319
2320 FOR i IN 1..l_master_chg_exist_tbl.COUNT LOOP
2321 IF (l_chg_exist_tbl(i) = FND_API.G_TRUE) THEN
2322 l_master_chg_exist_tbl(i) := FND_API.G_TRUE;
2323 END IF;
2324 END LOOP;
2325
2326 d_position := 30;
2327 -- check if any line location gets changed
2328 l_chg_exist_tbl :=
2329 PO_LINE_LOCATIONS_DRAFT_PVT.draft_changes_exist
2330 ( p_draft_id_tbl => p_draft_id_tbl,
2331 p_line_location_id_tbl => l_null_id_tbl
2332 );
2333
2334 FOR i IN 1..l_master_chg_exist_tbl.COUNT LOOP
2335 IF (l_chg_exist_tbl(i) = FND_API.G_TRUE) THEN
2336 l_master_chg_exist_tbl(i) := FND_API.G_TRUE;
2337 END IF;
2338 END LOOP;
2339
2340 d_position := 40;
2341 -- check if any distribution gets changed
2342 l_chg_exist_tbl :=
2343 PO_DISTRIBUTIONS_DRAFT_PVT.draft_changes_exist
2344 ( p_draft_id_tbl => p_draft_id_tbl,
2345 p_po_distribution_id_tbl => l_null_id_tbl
2346 );
2347
2348 FOR i IN 1..l_master_chg_exist_tbl.COUNT LOOP
2349 IF (l_chg_exist_tbl(i) = FND_API.G_TRUE) THEN
2350 l_master_chg_exist_tbl(i) := FND_API.G_TRUE;
2351 END IF;
2352 END LOOP;
2353
2354 d_position := 50;
2355 -- check if any org assignment gets changed
2356 l_chg_exist_tbl :=
2357 PO_GA_ORG_ASSIGN_DRAFT_PVT.draft_changes_exist
2358 ( p_draft_id_tbl => p_draft_id_tbl,
2359 p_org_assignment_id_tbl => l_null_id_tbl
2360 );
2361
2362 FOR i IN 1..l_master_chg_exist_tbl.COUNT LOOP
2363 IF (l_chg_exist_tbl(i) = FND_API.G_TRUE) THEN
2364 l_master_chg_exist_tbl(i) := FND_API.G_TRUE;
2365 END IF;
2366 END LOOP;
2367
2368 d_position := 60;
2369 -- check if price differentials gets changed
2370 l_chg_exist_tbl :=
2371 PO_PRICE_DIFF_DRAFT_PVT.draft_changes_exist
2372 ( p_draft_id_tbl => p_draft_id_tbl,
2373 p_price_differential_id_tbl => l_null_id_tbl
2374 );
2375
2376 FOR i IN 1..l_master_chg_exist_tbl.COUNT LOOP
2377 IF (l_chg_exist_tbl(i) = FND_API.G_TRUE) THEN
2378 l_master_chg_exist_tbl(i) := FND_API.G_TRUE;
2379 END IF;
2380 END LOOP;
2381
2382 d_position := 70;
2383 -- check if any notification control gets changed
2384 l_chg_exist_tbl :=
2385 PO_NOTIFICATION_CTRL_DRAFT_PVT.draft_changes_exist
2386 ( p_draft_id_tbl => p_draft_id_tbl,
2387 p_notification_id_tbl => l_null_id_tbl
2388 );
2389
2390 FOR i IN 1..l_master_chg_exist_tbl.COUNT LOOP
2391 IF (l_chg_exist_tbl(i) = FND_API.G_TRUE) THEN
2392 l_master_chg_exist_tbl(i) := FND_API.G_TRUE;
2393 END IF;
2394 END LOOP;
2395
2396 d_position := 80;
2397 -- check if any attribute values record gets changed
2398 l_chg_exist_tbl :=
2399 PO_ATTR_VALUES_DRAFT_PVT.draft_changes_exist
2400 ( p_draft_id_tbl => p_draft_id_tbl,
2401 p_attribute_values_id_tbl => l_null_id_tbl
2402 );
2403
2404 FOR i IN 1..l_master_chg_exist_tbl.COUNT LOOP
2405 IF (l_chg_exist_tbl(i) = FND_API.G_TRUE) THEN
2406 l_master_chg_exist_tbl(i) := FND_API.G_TRUE;
2407 END IF;
2408 END LOOP;
2409
2410 d_position := 90;
2411 -- check if any attribute values record gets changed
2412 l_chg_exist_tbl :=
2413 PO_ATTR_VALUES_TLP_DRAFT_PVT.draft_changes_exist
2414 ( p_draft_id_tbl => p_draft_id_tbl,
2415 p_attribute_values_tlp_id_tbl => l_null_id_tbl
2416 );
2417
2418 FOR i IN 1..l_master_chg_exist_tbl.COUNT LOOP
2419 IF (l_chg_exist_tbl(i) = FND_API.G_TRUE) THEN
2420 l_master_chg_exist_tbl(i) := FND_API.G_TRUE;
2421 END IF;
2422 END LOOP;
2423
2424 --<Enhanced Pricing Start>
2425 d_position := 100;
2426 -- check if any price adjustments record gets changed
2427 l_chg_exist_tbl :=
2428 PO_PRICE_ADJ_DRAFT_PVT.draft_changes_exist
2429 ( p_draft_id_tbl => p_draft_id_tbl,
2430 p_price_adjustment_id_tbl => l_null_id_tbl
2431 );
2432
2433 FOR i IN 1..l_master_chg_exist_tbl.COUNT LOOP
2434 IF (l_chg_exist_tbl(i) = FND_API.G_TRUE) THEN
2435 l_master_chg_exist_tbl(i) := FND_API.G_TRUE;
2436 END IF;
2437 END LOOP;
2438 --<Enhanced Pricing End>
2439
2440 IF (PO_LOG.d_proc) THEN
2441 PO_LOG.proc_end (d_module);
2442 END IF;
2443
2444 RETURN l_master_chg_exist_tbl;
2445
2446 END changes_exist_for_draft;
2447
2448
2449
2450
2451 -----------------------------------------------------------------------
2452 --Start of Comments
2453 --Name: is_pending_buyer_acceptance
2454 --Function:
2455 -- checks whether the draft changes have been submitted for buyer acceptance
2456 --Parameters:
2457 --IN:
2458 --p_po_header_id
2459 -- document header id.
2460 --End of Comments
2461 ------------------------------------------------------------------------
2462
2463 FUNCTION is_pending_buyer_acceptance
2464 ( p_po_header_id IN NUMBER
2465 ) RETURN VARCHAR2 IS
2466
2467 d_api_name CONSTANT VARCHAR2(30) := 'is_pending_buyer_acceptance';
2468 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
2469 d_position NUMBER;
2470
2471 l_draft_id PO_DRAFTS.draft_id%TYPE;
2472 l_draft_status PO_DRAFTS.status%TYPE;
2473 l_draft_owner_role PO_DRAFTS.owner_role%TYPE;
2474
2475 l_pending_acceptance VARCHAR2(1) := FND_API.G_FALSE;
2476 BEGIN
2477
2478 d_position := 0;
2479 IF (PO_LOG.d_proc) THEN
2480 PO_LOG.proc_begin(d_module);
2481 END IF;
2482
2483 find_draft
2484 ( p_po_header_id => p_po_header_id,
2485 x_draft_id => l_draft_id,
2486 x_draft_status => l_draft_status,
2487 x_draft_owner_role => l_draft_owner_role
2488 );
2489
2490 IF (l_draft_status = g_status_IN_PROCESS) THEN
2491 l_pending_acceptance := FND_API.G_TRUE;
2492 END IF;
2493
2494 IF (PO_LOG.d_proc) THEN
2495 PO_LOG.proc_end(d_module, 'l_pending_acceptance', l_pending_acceptance);
2496 END IF;
2497
2498 RETURN l_pending_acceptance;
2499
2500 END is_pending_buyer_acceptance;
2501
2502
2503 -----------------------------------------------------------------------
2504 --Start of Comments
2505 --Name: lock_merge_view_records
2506 --Function:
2507 -- given the table id and draft id, obtain DB lock for the draft and
2508 -- transaciton table
2509 --Parameters:
2510 --IN:
2511 --p_view_name
2512 -- View name of the merge view
2513 --p_entity_id
2514 -- primary key of the transaction table.
2515 --p_draft_id
2516 -- draft unique identifier
2517 --RETURN:
2518 -- a flag indicating whether there are problems during locking
2519 --End of Comments
2520 ------------------------------------------------------------------------
2521
2522 FUNCTION lock_merge_view_records
2523 ( p_view_name IN VARCHAR2,
2524 p_entity_id IN NUMBER,
2525 p_draft_id IN NUMBER
2526 ) RETURN VARCHAR2 IS
2527
2528 d_api_name CONSTANT VARCHAR2(30) := 'lock_merge_view_records';
2529 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
2530 d_position NUMBER;
2531
2532 -- Assign exception with a name
2533 INVALID_VIEW_NAME_EXC EXCEPTION;
2534 RESOURCE_BUSY_EXC EXCEPTION;
2535 PRAGMA EXCEPTION_INIT (RESOURCE_BUSY_EXC, -54);
2536
2537 l_success VARCHAR2(1) := FND_API.G_TRUE;
2538
2539 BEGIN
2540
2541 d_position := 0;
2542 IF (PO_LOG.d_proc) THEN
2543 PO_LOG.proc_begin(d_module);
2544 END IF;
2545
2546 IF (p_view_name = 'PO_HEADERS_MERGE_V') THEN
2547 d_position := 10;
2548
2549 PO_HEADERS_DRAFT_PKG.lock_draft_record
2550 ( p_po_header_id => p_entity_id,
2551 p_draft_id => p_draft_id
2552 );
2553
2554 PO_HEADERS_DRAFT_PKG.lock_transaction_record
2555 ( p_po_header_id => p_entity_id
2556 );
2557
2558 ELSIF (p_view_name = 'PO_LINES_MERGE_V') THEN
2559 d_position := 20;
2560
2561 PO_LINES_DRAFT_PKG.lock_draft_record
2562 ( p_po_line_id => p_entity_id,
2563 p_draft_id => p_draft_id
2564 );
2565
2566 PO_LINES_DRAFT_PKG.lock_transaction_record
2567 ( p_po_line_id => p_entity_id
2568 );
2569
2570 ELSIF (p_view_name = 'PO_LINE_LOCATIONS_MERGE_V') THEN
2571 d_position := 30;
2572
2573 PO_LINE_LOCATIONS_DRAFT_PKG.lock_draft_record
2574 ( p_line_location_id => p_entity_id,
2575 p_draft_id => p_draft_id
2576 );
2577
2578 PO_LINE_LOCATIONS_DRAFT_PKG.lock_transaction_record
2579 ( p_line_location_id => p_entity_id
2580 );
2581
2582 ELSIF (p_view_name = 'PO_DISTRIBUTIONS_MERGE_V') THEN
2583 d_position := 40;
2584
2585 PO_DISTRIBUTIONS_DRAFT_PKG.lock_draft_record
2586 ( p_po_distribution_id => p_entity_id,
2587 p_draft_id => p_draft_id
2588 );
2589
2590 PO_DISTRIBUTIONS_DRAFT_PKG.lock_transaction_record
2591 ( p_po_distribution_id => p_entity_id
2592 );
2593
2594 ELSIF (p_view_name = 'PO_GA_ORG_ASSIGN_MERGE_V') THEN
2595 d_position := 50;
2596
2597 PO_GA_ORG_ASSIGN_DRAFT_PKG.lock_draft_record
2598 ( p_org_assignment_id => p_entity_id,
2599 p_draft_id => p_draft_id
2600 );
2601
2602 PO_GA_ORG_ASSIGN_DRAFT_PKG.lock_transaction_record
2603 ( p_org_assignment_id => p_entity_id
2604 );
2605
2606 ELSIF (p_view_name = 'PO_PRICE_DIFF_MERGE_V') THEN
2607 d_position := 60;
2608
2609 PO_PRICE_DIFF_DRAFT_PKG.lock_draft_record
2610 ( p_price_differential_id => p_entity_id,
2611 p_draft_id => p_draft_id
2612 );
2613
2614 PO_PRICE_DIFF_DRAFT_PKG.lock_transaction_record
2615 ( p_price_differential_id => p_entity_id
2616 );
2617
2618 ELSIF (p_view_name = 'PO_NOTIFICATION_CTRL_MERGE_V') THEN
2619 d_position := 70;
2620
2621 PO_NOTIFICATION_CTRL_DRAFT_PKG.lock_draft_record
2622 ( p_notification_id => p_entity_id,
2623 p_draft_id => p_draft_id
2624 );
2625
2626 PO_NOTIFICATION_CTRL_DRAFT_PKG.lock_transaction_record
2627 ( p_notification_id => p_entity_id
2628 );
2629
2630 ELSIF (p_view_name = 'PO_ATTR_VALUES_MERGE_V') THEN
2631 d_position := 80;
2632
2633 PO_ATTR_VALUES_DRAFT_PKG.lock_draft_record
2634 ( p_attribute_values_id => p_entity_id,
2635 p_draft_id => p_draft_id
2636 );
2637
2638 PO_ATTR_VALUES_DRAFT_PKG.lock_transaction_record
2639 ( p_attribute_values_id => p_entity_id
2640 );
2641
2642 ELSIF (p_view_name = 'PO_ATTR_VALUES_TLP_MERGE_V') THEN
2643 d_position := 90;
2644
2645 PO_ATTR_VALUES_TLP_DRAFT_PKG.lock_draft_record
2646 ( p_attribute_values_tlp_id => p_entity_id,
2647 p_draft_id => p_draft_id
2648 );
2649
2650 PO_ATTR_VALUES_TLP_DRAFT_PKG.lock_transaction_record
2651 ( p_attribute_values_tlp_id => p_entity_id
2652 );
2653
2654 --<Enhanced Pricing Start>
2655 ELSIF (p_view_name = 'PO_PRICE_ADJUSTMENTS_MERGE_V') THEN
2656 d_position := 100;
2657
2658 PO_PRICE_ADJ_DRAFT_PKG.lock_draft_record
2659 ( p_price_adjustment_id => p_entity_id,
2660 p_draft_id => p_draft_id
2661 );
2662
2663 PO_PRICE_ADJ_DRAFT_PKG.lock_transaction_record
2664 ( p_price_adjustment_id => p_entity_id
2665 );
2666 --<Enhanced Pricing End>
2667
2668 --<CLM Phase 4 - Elins project start>
2669 ELSIF (p_view_name = 'PO_EXHIBIT_DETAILS_MERGE_V') THEN
2670 d_position := 100;
2671
2672 PO_EXHIBITS_PVT.lock_draft_record
2673 ( p_po_exhibit_details_id => p_entity_id,
2674 p_draft_id => p_draft_id
2675 );
2676
2677 PO_EXHIBITS_PVT.lock_transaction_record
2678 ( p_po_exhibit_details_id => p_entity_id
2679 );
2680 --<CLM Phase 4 - Elins project start>
2681
2682
2683 ELSE
2684 d_position := 110;
2685
2686 RAISE INVALID_VIEW_NAME_EXC;
2687 END IF;
2688
2689 IF (PO_LOG.d_proc) THEN
2690 PO_LOG.proc_end(d_module);
2691 END IF;
2692
2693 RETURN FND_API.G_TRUE;
2694
2695 EXCEPTION
2696 WHEN RESOURCE_BUSY_EXC THEN
2697 -- come here if database locking cannot be acquired
2698 l_success := FND_API.G_FALSE;
2699 RETURN FND_API.G_FALSE;
2700
2701 WHEN INVALID_VIEW_NAME_EXC THEN
2702 IF (PO_LOG.d_exc) THEN
2703 PO_LOG.exc(d_module, d_position, 'Invalid view name');
2704 END IF;
2705
2706 l_success := FND_API.G_FALSE;
2707 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2708 WHEN OTHERS THEN
2709 l_success := FND_API.G_FALSE;
2710
2711 PO_MESSAGE_S.add_exc_msg
2712 ( p_pkg_name => d_pkg_name,
2713 p_procedure_name => d_api_name || '.' || d_position
2714 );
2715
2716 RAISE;
2717 END lock_merge_view_records;
2718
2719
2720
2721
2722 -----------------------------------------------------------------------
2723 --Start of Comments
2724 --Name: get_supplier_auth_enabled_flag
2725 --Pre-reqs: None
2726 --Modifies:
2727 --Locks:
2728 -- None
2729 --Function:
2730 -- Returns back the supp_auth_enabled_flag value
2731 --Parameters:
2732 --IN:
2733 --p_po_header_id
2734 -- header_id of the document
2735 --IN OUT:
2736 --OUT:
2737 --Returns:
2738 --Notes:
2739 --Testing:
2740 --End of Comments
2741 ------------------------------------------------------------------------
2742 FUNCTION get_supplier_auth_enabled_flag
2743 (p_po_header_id IN NUMBER
2744 ) RETURN VARCHAR2 IS
2745
2746 d_api_name CONSTANT VARCHAR2(30) := 'get_supplier_authoring_status';
2747 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
2748 d_position NUMBER;
2749 l_supplier_auth_enabled_flag VARCHAR2(1);
2750
2751 BEGIN
2752
2753 d_position := 0;
2754 IF (PO_LOG.d_proc) THEN
2755 PO_LOG.proc_begin(d_module);
2756 END IF;
2757
2758 SELECT supplier_auth_enabled_flag
2759 INTO l_supplier_auth_enabled_flag
2760 FROM po_headers_all
2761 WHERE po_header_id = p_po_header_id;
2762
2763 return l_supplier_auth_enabled_flag;
2764
2765 EXCEPTION
2766 WHEN no_data_found THEN
2767 RETURN NULL;
2768 WHEN others THEN
2769 po_message_s.sql_error('get_supp_auth_enabled_flag',d_position, sqlcode);
2770 raise;
2771
2772 END get_supplier_auth_enabled_flag;
2773
2774 -----------------------------------------------------------------------
2775 --Start of Comments
2776 --Name: set_supplier_auth_enabled_flag
2777 --Pre-reqs: None
2778 --Modifies:
2779 --Locks:
2780 -- None
2781 --Function:
2782 -- Sets the supp_auth_enabled_flag value
2783 --Parameters:
2784 --IN:
2785 --p_po_header_id
2786 -- header_id of the document
2787 --p_supplier_auth_enabled_flag
2788 -- the value to set
2789 --IN OUT:
2790 --OUT:
2791 --Returns:
2792 --Notes:
2793 --Testing:
2794 --End of Comments
2795 ------------------------------------------------------------------------
2796 FUNCTION set_supplier_auth_enabled_flag
2797 (p_po_header_id IN NUMBER,
2798 p_supplier_auth_enabled_flag IN VARCHAR2
2799 ) RETURN VARCHAR2 IS
2800
2801 d_api_name CONSTANT VARCHAR2(30) := 'set_supplier_authoring_status';
2802 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
2803 d_position NUMBER;
2804
2805 BEGIN
2806
2807 d_position := 0;
2808 IF (PO_LOG.d_proc) THEN
2809 PO_LOG.proc_begin(d_module);
2810 END IF;
2811
2812 UPDATE po_headers_all
2813 SET supplier_auth_enabled_flag
2814 = p_supplier_auth_enabled_flag
2815 WHERE po_header_id = p_po_header_id;
2816
2817 return FND_API.G_RET_STS_SUCCESS;
2818
2819 EXCEPTION
2820 WHEN no_data_found THEN
2821 RETURN FND_API.G_RET_STS_ERROR;
2822 WHEN others THEN
2823 po_message_s.sql_error('get_supp_auth_enabled_flag',d_position, sqlcode);
2824 raise;
2825
2826 END set_supplier_auth_enabled_flag;
2827
2828 -----------------------------------------------------------------------
2829 --Start of Comments
2830 --Name: get_cat_admin_auth_enable_flag
2831 --Pre-reqs: None
2832 --Modifies:
2833 --Locks:
2834 -- None
2835 --Function:
2836 -- Returns back the cat_admin_auth_enabled_flag value
2837 --Parameters:
2838 --IN:
2839 --p_po_header_id
2840 -- header_id of the document
2841 --IN OUT:
2842 --OUT:
2843 --Returns:
2844 --Notes:
2845 --Testing:
2846 --End of Comments
2847 ------------------------------------------------------------------------
2848 FUNCTION get_cat_admin_auth_enable_flag
2849 (p_po_header_id IN NUMBER
2850 ) RETURN VARCHAR2 IS
2851
2852 d_api_name CONSTANT VARCHAR2(30) := 'get_cat_admin_authoring_status';
2853 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
2854 d_position NUMBER;
2855 l_cat_admin_auth_enable_flag VARCHAR2(1);
2856
2857 BEGIN
2858
2859 d_position := 0;
2860 IF (PO_LOG.d_proc) THEN
2861 PO_LOG.proc_begin(d_module);
2862 END IF;
2863
2864 SELECT cat_admin_auth_enabled_flag
2865 INTO l_cat_admin_auth_enable_flag
2866 FROM po_headers_all
2867 WHERE po_header_id = p_po_header_id;
2868
2869 return l_cat_admin_auth_enable_flag;
2870
2871 EXCEPTION
2872 WHEN no_data_found THEN
2873 RETURN NULL;
2874 WHEN others THEN
2875 po_message_s.sql_error('get_cat_admin_auth_enable_flag',d_position, sqlcode);
2876 raise;
2877
2878 END get_cat_admin_auth_enable_flag;
2879
2880 -----------------------------------------------------------------------
2881 --Start of Comments
2882 --Name: set_cat_admin_auth_enable_flag
2883 --Pre-reqs: None
2884 --Modifies:
2885 --Locks:
2886 -- None
2887 --Function:
2888 -- Sets the cat_admin_auth_enable_flag value
2889 --Parameters:
2890 --IN:
2891 --p_po_header_id
2892 -- header_id of the document
2893 --p_cat_admin_auth_enable_flag
2894 -- the value to set
2895 --IN OUT:
2896 --OUT:
2897 --Returns:
2898 --Notes:
2899 --Testing:
2900 --End of Comments
2901 ------------------------------------------------------------------------
2902 FUNCTION set_cat_admin_auth_enable_flag
2903 (p_po_header_id IN NUMBER,
2904 p_cat_admin_auth_enable_flag IN VARCHAR2
2905 ) RETURN VARCHAR2 IS
2906
2907 d_api_name CONSTANT VARCHAR2(30) := 'set_cat_admin_authoring_status';
2908 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
2909 d_position NUMBER;
2910
2911 BEGIN
2912
2913 d_position := 0;
2914 IF (PO_LOG.d_proc) THEN
2915 PO_LOG.proc_begin(d_module);
2916 END IF;
2917
2918 UPDATE po_headers_all
2919 SET cat_admin_auth_enabled_flag
2920 = p_cat_admin_auth_enable_flag
2921 WHERE po_header_id = p_po_header_id;
2922
2923 return FND_API.G_RET_STS_SUCCESS;
2924
2925 EXCEPTION
2926 WHEN no_data_found THEN
2927 RETURN FND_API.G_RET_STS_ERROR;
2928 WHEN others THEN
2929 po_message_s.sql_error('get_cat_admin_auth_enable_flag',d_position, sqlcode);
2930 raise;
2931
2932 END set_cat_admin_auth_enable_flag;
2933
2934 -- bug 5014131 START
2935 -----------------------------------------------------------------------
2936 --Start of Comments
2937 --Name: get_upload_status_info
2938 --Function:
2939 -- Get the catalog upload status based on user role
2940 --Parameters:
2941 --IN:
2942 --p_po_header_id
2943 -- header_id of the document
2944 --p_role
2945 --
2946 --IN OUT:
2947 --OUT:
2948 -- upload_status_code
2949 -- upload_requestor_role_id id of the role
2950 -- upload_job_number latest upload job id
2951 -- upload_is_error Whether Upload errored out
2952 --Returns:
2953 --Notes:
2954 --Testing:
2955 --End of Comments
2956 ------------------------------------------------------------------------
2957 PROCEDURE get_upload_status_info
2958 ( p_po_header_id IN NUMBER,
2959 p_role IN VARCHAR2,
2960 x_upload_status_code OUT NOCOPY VARCHAR2,
2961 x_upload_requestor_role_id OUT NOCOPY NUMBER,
2962 x_upload_job_number OUT NOCOPY NUMBER,
2963 x_upload_status_display OUT NOCOPY VARCHAR2,
2964 x_upload_is_error OUT NOCOPY NUMBER -- Bug#5518826
2965 ) IS
2966
2967 BEGIN
2968
2969 --Bug#5518826
2970 --Added is_error column in the select clause
2971 SELECT job_status,
2972 -- role_user_id,
2973 job_number,
2974 job_status_display,
2975 is_error
2976 INTO x_upload_status_code,
2977 --x_upload_requestor_role_id,
2978 x_upload_job_number,
2979 x_upload_status_display,
2980 x_upload_is_error
2981 FROM icx_cat_latest_batch_jobs_v
2982 WHERE po_header_Id = p_po_header_id
2983 AND role = p_role;
2984
2985 EXCEPTION
2986 WHEN NO_DATA_FOUND THEN
2987 x_upload_status_code := 'NOT_REQUESTED';
2988 x_upload_requestor_role_id := NULL;
2989 x_upload_job_number := NULL;
2990 x_upload_status_display := NULL;
2991 x_upload_is_error := NULL;
2992 END get_upload_status_info;
2993
2994 -----------------------------------------------------------------------
2995 --Start of Comments
2996 --Name: get_in_process_upload_info
2997 --Function:
2998 -- Return the information for the upload that in progress regardless
2999 -- of the role
3000 --Parameters:
3001 --IN:
3002 --p_po_header_id
3003 -- header_id of the document
3004 --p_role
3005 -- role of the user
3006 --IN OUT:
3007 --OUT:
3008 -- upload_in_progress: FND_API.G_TRUE if there's one upload that's not yet
3009 -- complete
3010 -- upload_status_code
3011 -- upload_requestor_role
3012 -- upload_requestor_role_id id of the role
3013 -- upload_job_id latest upload job id
3014 -- upload_status_display
3015 --Returns:
3016 --Notes:
3017 --Testing:
3018 --End of Comments
3019 ------------------------------------------------------------------------
3020 PROCEDURE get_in_process_upload_info
3021 ( p_po_header_id IN NUMBER,
3022 x_upload_in_progress OUT NOCOPY VARCHAR2,
3023 x_upload_status_code OUT NOCOPY VARCHAR2,
3024 x_upload_requestor_role OUT NOCOPY VARCHAR2,
3025 x_upload_requestor_role_id OUT NOCOPY NUMBER,
3026 x_upload_job_number OUT NOCOPY NUMBER,
3027 x_upload_status_display OUT NOCOPY VARCHAR2
3028 ) IS
3029
3030 BEGIN
3031 x_upload_in_progress := FND_API.G_FALSE;
3032
3033 -- return the upload status for any upload that's considered 'IN PROGRESS'
3034 -- Bug 12700941, Role was not being fetched, so fetched it and used it later
3035 SELECT job_status,
3036 -- role_user_id,
3037 ROLE,
3038 job_number,
3039 job_status_display
3040 INTO x_upload_status_code,
3041 --x_upload_requestor_role_id,
3042 x_upload_requestor_role,
3043 x_upload_job_number,
3044 x_upload_status_display
3045 FROM icx_cat_latest_batch_jobs_v
3046 WHERE po_header_id = p_po_header_id
3047 AND job_status IN (g_upload_status_PENDING,
3048 g_upload_status_RUNNING,
3049 g_upload_status_ERROR)
3050 AND ROWNUM = 1;
3051
3052 x_upload_in_progress := FND_API.G_TRUE;
3053
3054 EXCEPTION
3055 WHEN NO_DATA_FOUND THEN
3056 NULL;
3057 END get_in_process_upload_info;
3058
3059 -- bug 5014131 END
3060
3061 -- bug5090429 START
3062 -- Overloaded procedure for another one. All the parameters required by
3063 -- the other one can be derived from p_po_header_id
3064 PROCEDURE unlock_document_and_send_notif
3065 ( p_commit IN VARCHAR2 := FND_API.G_FALSE,
3066 p_po_header_id IN NUMBER
3067 ) IS
3068
3069 d_api_name CONSTANT VARCHAR2(30) := 'unlock_document_and_send_notif';
3070 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
3071 d_position NUMBER;
3072
3073 l_org_id PO_HEADERS_ALL.org_id%TYPE;
3074 l_segment1 PO_HEADERS_ALL.segment1%TYPE;
3075 l_revision_num PO_HEADERS_ALL.revision_num%TYPE;
3076
3077 BEGIN
3078
3079 d_position := 0;
3080
3081 IF (PO_LOG.d_proc) THEN
3082 PO_LOG.proc_begin(d_module,'p_commit',p_commit);
3083 PO_LOG.proc_begin(d_module,'p_po_header_id',p_po_header_id);
3084 END IF;
3085
3086 SELECT org_id,
3087 segment1,
3088 revision_num
3089 INTO l_org_id,
3090 l_segment1,
3091 l_revision_num
3092 FROM po_headers_all
3093 WHERE po_header_id = p_po_header_id;
3094
3095 unlock_document_and_send_notif
3096 ( p_commit => p_commit,
3097 p_po_header_id => p_po_header_id,
3098 p_org_id => l_org_id,
3099 p_segment1 => l_segment1,
3100 p_revision_num => l_revision_num
3101 );
3102
3103 IF (PO_LOG.d_proc) THEN
3104 PO_LOG.proc_end(d_module,'p_commit',p_commit);
3105 END IF;
3106
3107 EXCEPTION
3108 WHEN OTHERS THEN
3109 PO_MESSAGE_S.add_exc_msg
3110 ( p_pkg_name => d_pkg_name,
3111 p_procedure_name => d_api_name || '.' || d_position
3112 );
3113
3114 RAISE;
3115 END unlock_document_and_send_notif;
3116
3117
3118
3119 -- bug5090429 END
3120
3121
3122 --<Bug#4382472 Start>
3123 -----------------------------------------------------------------------
3124 --Start of Comments
3125 --Name: unlock_document_and_send_notif
3126 --Pre-reqs:
3127 -- None
3128 --Modifies:None
3129 --Locks:
3130 -- None
3131 --Parameters:
3132 --IN:
3133 --p_commit
3134 -- Flag to indicate whether the procedure will commit or not.
3135 --p_po_header_id
3136 -- header_id of the document
3137 --p_org_id
3138 -- Unique Identifier for Org to which document belongs
3139 --p_segment1
3140 -- Document Number
3141 --p_revision_num
3142 -- Revision Number of the document
3143 --Returns:
3144 --Notes:
3145 --Testing:
3146 --End of Comments
3147 ------------------------------------------------------------------------
3148 procedure unlock_document_and_send_notif(p_commit IN VARCHAR2,
3149 p_po_header_id IN NUMBER,
3150 p_org_id IN NUMBER,
3151 p_segment1 IN VARCHAR2,
3152 p_revision_num IN NUMBER)
3153 IS
3154 d_api_name CONSTANT VARCHAR2(30) := 'unlock_document_and_send_notif';
3155 d_module CONSTANT VARCHAR2(2000) := PO_LOG.get_subprogram_base(d_pkg_name, d_api_name);
3156 d_pos NUMBER := 0;
3157
3158 l_agreement_info FND_NEW_MESSAGES.message_text%type := NULL;
3159 l_doc_style_name PO_DOC_STYLE_LINES_TL.display_name%type := NULL;
3160 l_ou_name HR_OPERATING_UNITS.name%type := NULL;
3161
3162 l_lock_owner_role PO_HEADERS_ALL.lock_owner_role%TYPE;
3163 l_lock_owner_user_id PO_HEADERS_ALL.lock_owner_user_id%TYPE;
3164
3165 l_agent_id PO_HEADERS_ALL.agent_id%TYPE;
3166 BEGIN
3167
3168 IF (PO_LOG.d_proc) THEN
3169 PO_LOG.proc_begin(d_module,'p_commit',p_commit);
3170 PO_LOG.proc_begin(d_module,'p_po_header_id',p_po_header_id);
3171 PO_LOG.proc_begin(d_module,'p_org_id',p_org_id);
3172 PO_LOG.proc_begin(d_module,'p_segment1',p_segment1);
3173 PO_LOG.proc_begin(d_module,'p_revision_num',p_revision_num);
3174 END IF;
3175
3176 -- bug5090429
3177 -- Get who is locking the document
3178
3179 get_lock_owner_info
3180 ( p_po_header_id => p_po_header_id,
3181 x_lock_owner_role => l_lock_owner_role,
3182 x_lock_owner_user_id => l_lock_owner_user_id
3183 );
3184
3185
3186 --Unlock the document
3187 unlock_document(p_po_header_id => p_po_header_id);
3188
3189 -- Bug 12700941 starts :
3190 -- Buyer can break the lock if the Upload was by Cat. Admin/Suppplier and
3191 -- if the Upload was successful or had errors
3192 -- So clearing the errors from ICX table and PO interface tables.
3193
3194 --Clear Errors from ICX Jobs Table when buyer breaks the lock
3195 UPDATE icx_cat_batch_jobs
3196 SET JOB_STATUS ='COMPLETED'
3197 WHERE po_header_id=p_po_header_id;
3198
3199 -- Purging the errored record FROM PO INTERFACE and PO_INTERFACE_ERROR tables
3200 po_docs_interface_purge.process_po_interface_tables(
3201 NULL,
3202 NULL,
3203 'Y',
3204 'Y',
3205 NULL,
3206 NULL,
3207 NULL,
3208 NULL,
3209 p_po_header_id);
3210 -- Bug 12700941 ends
3211
3212 d_pos := 10;
3213 --Get Operating Unit Name
3214 l_ou_name := PO_MOAC_UTILS_PVT.get_ou_name(p_org_id);
3215 IF (PO_LOG.d_stmt) THEN
3216 PO_LOG.stmt(d_module,d_pos,'l_ou_name',l_ou_name);
3217 END IF;
3218
3219 d_pos := 20;
3220 --Get the Agreement's Title as we get by calling getTitle of HTML page's controller
3221 IF nvl(p_revision_num, 0) > 0 THEN
3222 fnd_message.set_name('PO', 'PO_DOCUMENT_PO_TTL_INFO_REV');
3223 fnd_message.set_token('POREVNUM', p_revision_num);
3224 ELSE
3225 fnd_message.set_name('PO', 'PO_DOCUMENT_PO_TTL_INFO_NO_REV');
3226 END IF;
3227
3228 d_pos := 30;
3229 l_doc_style_name := PO_DOC_STYLE_PVT.get_style_display_name(p_po_header_id);
3230 IF (PO_LOG.d_stmt) THEN
3231 PO_LOG.stmt(d_module,d_pos,'l_doc_style_name',l_doc_style_name);
3232 END IF;
3233
3234 d_pos := 40;
3235 fnd_message.set_token('PONUM', p_segment1);
3236 fnd_message.set_token('DOCSTYLE', l_doc_style_name);
3237 l_agreement_info := fnd_message.get;
3238 IF (PO_LOG.d_stmt) THEN
3239 PO_LOG.stmt(d_module,d_pos,'l_agreement_info',l_agreement_info);
3240 END IF;
3241
3242 d_pos := 50;
3243 --Send the notification
3244
3245 -- bug5249393
3246 -- The notification from is always the buyer
3247 SELECT agent_id
3248 INTO l_agent_id
3249 FROM po_headers_all
3250 WHERE po_header_id = p_po_header_id;
3251
3252 -- bug5090429
3253 -- Changed the signature of the API
3254 PO_ONLINE_AUTHORING_WF_ACTIONS.start_changes_discarded_wf
3255 ( p_agreement_id => p_po_header_id,
3256 p_agreement_info => l_agreement_info,
3257 p_lock_owner_role => l_lock_owner_role,
3258 p_lock_owner_user_id => l_lock_owner_user_id,
3259 p_buyer_user_id => l_agent_id -- bug5249393
3260 );
3261
3262 d_pos := 60;
3263 --Commit the changes
3264 IF p_commit = FND_API.G_TRUE THEN
3265 COMMIT WORK;
3266 END IF;
3267
3268 IF (PO_LOG.d_proc) THEN
3269 PO_LOG.proc_end(d_module);
3270 END IF;
3271 EXCEPTION
3272 WHEN OTHERS THEN
3273 PO_MESSAGE_S.add_exc_msg
3274 ( p_pkg_name => d_pkg_name,
3275 p_procedure_name => d_api_name || '.' || d_pos
3276 );
3277
3278 PO_MESSAGE_S.sql_error('unlock_document_and_send_notif',d_pos, sqlcode);
3279 RAISE;
3280 END unlock_document_and_send_notif;
3281 --<Bug#4382472 End>
3282
3283 -------------------------------------------------------
3284 -------------- PRIVATE PROCEDURES ---------------------
3285 -------------------------------------------------------
3286
3287 -----------------------------------------------------------------------
3288 --Start of Comments < bug5532550 >
3289 --Name: is_doc_in_updatable_state
3290 --Function:
3291 -- check whether the document is in a status updatable by the role
3292 --Parameters:
3293 --IN:
3294 --p_po_header_id
3295 -- document header id
3296 --p_role
3297 -- role of the user
3298 --End of Comments
3299 ------------------------------------------------------------------------
3300 FUNCTION is_doc_in_updatable_state
3301 ( p_po_header_id IN NUMBER,
3302 p_role IN VARCHAR2
3303 ) RETURN VARCHAR2 IS
3304
3305 d_api_name CONSTANT VARCHAR2(30) := 'is_doc_in_updatable_state';
3306 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
3307 d_position NUMBER;
3308
3309 l_dummy NUMBER;
3310
3311 BEGIN
3312
3313 d_position := 0;
3314 IF (PO_LOG.d_proc) THEN
3315 PO_LOG.proc_begin(d_module);
3316 END IF;
3317
3318 IF (p_role IN (PO_GLOBAL.g_role_SUPPLIER,
3319 PO_GLOBAL.g_role_CAT_ADMIN)) THEN
3320
3321 SELECT 1
3322 INTO l_dummy
3323 FROM po_headers_all POH
3324 WHERE POH.po_header_id = p_po_header_id
3325 AND NVL(cancel_flag, 'N') = 'N'
3326 AND NVL(closed_code, 'OPEN') NOT IN ('CLOSED', 'FINALLY CLOSED')
3327 AND NVL(frozen_flag, 'N') <> 'Y'
3328 AND NVL(user_hold_flag, 'N') <> 'Y';
3329
3330 RETURN FND_API.G_TRUE;
3331 ELSE
3332 RETURN FND_API.G_TRUE;
3333 END IF;
3334
3335 IF (PO_LOG.d_proc) THEN
3336 PO_LOG.proc_end(d_module);
3337 END IF;
3338 EXCEPTION
3339 WHEN NO_DATA_FOUND THEN
3340 RETURN FND_API.G_FALSE;
3341 END is_doc_in_updatable_state;
3342
3343 -----------------------------------------------------------------------
3344 --Start of Comments
3345 --Name: apply_changes
3346 --Pre-reqs: None
3347 --Modifies:
3348 --Locks:
3349 -- None
3350 --Function:
3351 -- Merge data to transaction tables at each level
3352 --Parameters:
3353 --IN:
3354 --p_draft_info
3355 -- record structure that holds draft information
3356 --IN OUT:
3357 --OUT:
3358 --Returns:
3359 --Notes:
3360 --Testing:
3361 --End of Comments
3362 ------------------------------------------------------------------------
3363 PROCEDURE apply_changes
3364 ( p_draft_info IN DRAFT_INFO_REC_TYPE
3365 ) IS
3366
3367 d_api_name CONSTANT VARCHAR2(30) := 'apply_changes';
3368 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
3369 d_position NUMBER;
3370
3371 l_is_clm_document VARCHAR2(1);
3372
3373 BEGIN
3374 d_position := 0;
3375 IF (PO_LOG.d_proc) THEN
3376 PO_LOG.proc_begin(d_module);
3377 END IF;
3378
3379 PO_HEADERS_DRAFT_PVT.apply_changes
3380 (p_draft_info => p_draft_info
3381 );
3382
3383 d_position := 10;
3384 PO_LINES_DRAFT_PVT.apply_changes
3385 (p_draft_info => p_draft_info
3386 );
3387
3388 d_position := 20;
3389 PO_LINE_LOCATIONS_DRAFT_PVT.apply_changes
3390 (p_draft_info => p_draft_info
3391 );
3392
3393 d_position := 30;
3394 PO_DISTRIBUTIONS_DRAFT_PVT.apply_changes
3395 (p_draft_info => p_draft_info
3396 );
3397
3398 d_position := 40;
3399 PO_GA_ORG_ASSIGN_DRAFT_PVT.apply_changes
3400 (p_draft_info => p_draft_info
3401 );
3402
3403 d_position := 50;
3404 PO_PRICE_DIFF_DRAFT_PVT.apply_changes
3405 (p_draft_info => p_draft_info
3406 );
3407
3408 d_position := 60;
3409 PO_NOTIFICATION_CTRL_DRAFT_PVT.apply_changes
3410 (p_draft_info => p_draft_info
3411 );
3412
3413 d_position := 70;
3414 PO_ATTR_VALUES_DRAFT_PVT.apply_changes
3415 (p_draft_info => p_draft_info
3416 );
3417
3418 d_position := 80;
3419 PO_ATTR_VALUES_TLP_DRAFT_PVT.apply_changes
3420 (p_draft_info => p_draft_info
3421 );
3422
3423 --<Enhanced Pricing Start>
3424 d_position := 90;
3425 PO_PRICE_ADJ_DRAFT_PVT.apply_changes
3426 (p_draft_info => p_draft_info
3427 );
3428 --<Enhanced Pricing End>
3429
3430 --CLM Phase 4 - Elins project Start
3431 d_position := 90;
3432 PO_EXHIBITS_PVT.apply_changes
3433 (p_draft_info => p_draft_info
3434 );
3435 --Elins End
3436
3437 l_is_clm_document := PO_CLM_INTG_GRP.IS_CLM_DOCUMENT(p_doc_type => 'PO',p_document_id => p_draft_info.po_header_id);
3438
3439 IF (PO_LOG.d_stmt) THEN
3440 PO_LOG.stmt(d_module, d_position, 'l_is_clm_document:'||l_is_clm_document);
3441 END IF;
3442 -- Bug: 13948625
3443 -- Re-written the logic to send the requisitions back to pool when CLM document or its lines/distributions deleted.
3444 -- apply_changes proc of PO_XX_DRAFT_PVT above has a call to update_req_for_linked_po_count, where
3445 -- the linked_po_count is updated for unlinked requisitions and those reqs CLINs(Autocreated/SoftLinked)
3446 -- and PSlins(Softlinked) inserted into GT table for further procession(updating the reqs_in_pool_flag for entire
3447 -- Clin-Slin structure if eligible) in the below proc update_reqs_in_pool_flag.
3448 -- This should be called only for CLM Standard document.
3449
3450 IF (p_draft_info.doc_subtype = 'STANDARD' AND l_is_clm_document = 'Y') THEN
3451 PO_REQ_LINES_SV.update_reqs_in_pool_flag;
3452 END IF;
3453
3454 d_position := 100;
3455 IF (PO_LOG.d_proc) THEN
3456 PO_LOG.proc_end(d_module);
3457 END IF;
3458 EXCEPTION
3459 WHEN OTHERS THEN
3460 PO_MESSAGE_S.add_exc_msg
3461 ( p_pkg_name => d_pkg_name,
3462 p_procedure_name => d_api_name || '.' || d_position
3463 );
3464 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3465 END apply_changes;
3466
3467
3468 -----------------------------------------------------------------------
3469 --Start of Comments
3470 --Name: set_new_revision
3471 --Pre-reqs: None
3472 --Modifies:
3473 --Locks:
3474 -- None
3475 --Function:
3476 -- Update document revision, if necessary
3477 --Parameters:
3478 --IN:
3479 --p_draft_info
3480 -- record structure that holds draft information
3481 --IN OUT:
3482 --OUT:
3483 --Returns:
3484 --Notes:
3485 --Testing:
3486 --End of Comments
3487 ------------------------------------------------------------------------
3488 PROCEDURE set_new_revision
3489 ( p_draft_info DRAFT_INFO_REC_TYPE
3490 ) IS
3491
3492 TYPE rev_check_level_tbl_type IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;
3493
3494 d_api_name CONSTANT VARCHAR2(30) := 'set_new_revision';
3495 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
3496 d_position NUMBER;
3497
3498 l_orig_revision_num PO_HEADERS_ALL.revision_num%TYPE;
3499 l_rev_check_level_tbl rev_check_level_tbl_type;
3500 l_index NUMBER := 0;
3501 l_new_revision_num PO_HEADERS_ALL.revision_num%TYPE;
3502 l_return_status VARCHAR2(1);
3503 l_message VARCHAR2(2000);
3504 l_new_ame_appr_id_req VARCHAR2(1) := 'N';
3505 l_ame_transaction_type PO_HEADERS_ALL.ame_transaction_type%TYPE;
3506
3507 BEGIN
3508 d_position := 0;
3509 IF (PO_LOG.d_proc) THEN
3510 PO_LOG.proc_begin(d_module);
3511 END IF;
3512
3513 IF (p_draft_info.new_document = FND_API.G_TRUE) THEN
3514 RETURN;
3515 END IF;
3516
3517 SELECT PH.revision_num
3518 INTO l_orig_revision_num
3519 FROM po_headers_all PH
3520 WHERE PH.po_header_id = p_draft_info.po_header_id;
3521
3522 d_position := 10;
3523 -- determine which level(s) do we need to check for revision change
3524 IF (p_draft_info.headers_changed = FND_API.G_TRUE
3525 OR p_draft_info.ga_org_assign_changed = FND_API.G_TRUE) THEN
3526
3527 l_index := l_index +1;
3528 l_rev_check_level_tbl(l_index) := 'HEADER';
3529 END IF;
3530
3531 d_position := 20;
3532 IF (p_draft_info.lines_changed = FND_API.G_TRUE) THEN
3533 l_index := l_index +1;
3534 l_rev_check_level_tbl(l_index) := 'LINES';
3535 END IF;
3536
3537 d_position := 30;
3538 IF (p_draft_info.line_locations_changed = FND_API.G_TRUE) THEN
3539 l_index := l_index +1;
3540 l_rev_check_level_tbl(l_index) := 'SHIPMENTS';
3541 END IF;
3542
3543 d_position := 40;
3544 IF (p_draft_info.distributions_changed = FND_API.G_TRUE) THEN
3545 l_index := l_index +1;
3546 l_rev_check_level_tbl(l_index) := 'DISTRIBUTIONS';
3547 END IF;
3548
3549 d_position := 50;
3550 IF (p_draft_info.price_diff_changed = FND_API.G_TRUE) THEN
3551 l_index := l_index +1;
3552 l_rev_check_level_tbl(l_index) := 'PO_LINE_PRICE_DIFF';
3553
3554 IF (p_draft_info.doc_subtype = 'BLANKET') THEN
3555 l_index := l_index +1;
3556 l_rev_check_level_tbl(l_index) := 'PO_PB_PRICE_DIFF';
3557 END IF;
3558 END IF;
3559
3560 d_position := 60;
3561 l_new_revision_num := l_orig_revision_num;
3562
3563 FOR i IN 1..l_index LOOP
3564 d_position := 70;
3565
3566 PO_DOCUMENT_REVISION_GRP.check_new_revision
3567 ( p_api_version => 1.0,
3568 p_doc_type => p_draft_info.doc_type,
3569 p_doc_subtype => p_draft_info.doc_subtype,
3570 p_doc_id => p_draft_info.po_header_id,
3571 p_table_name => l_rev_check_level_tbl(i),
3572 x_return_status => l_return_status,
3573 x_doc_revision_num => l_new_revision_num,
3574 x_message => l_message
3575 );
3576
3577 d_position := 80;
3578 IF (l_return_status <> 'S') THEN
3579 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3580 END IF;
3581
3582 IF (l_orig_revision_num <> l_new_revision_num) THEN
3583 d_position := 90;
3584
3585 -- <AME Project> Generate new ame_approval_id and
3586 -- update ame_transaction_type when revision changes.
3587 -- This should be done only for POs for which
3588 -- 1. Modification is disabled.
3589 -- 2. AME is enabled.
3590 BEGIN
3591 SELECT 'Y',
3592 podsh.ame_transaction_type
3593 INTO l_new_ame_appr_id_req,
3594 l_ame_transaction_type
3595 FROM po_headers_all poh,
3596 po_doc_style_headers podsh
3597 WHERE poh.style_id = podsh.style_id
3598 AND NVL(podsh.change_process_type,'CHANGE_ORDER') <> 'MODIFICATION'
3599 AND podsh.ame_transaction_type IS NOT NULL
3600 AND poh.po_header_id = p_draft_info.po_header_id;
3601 EXCEPTION
3602 WHEN NO_DATA_FOUND THEN
3603 l_new_ame_appr_id_req := 'N';
3604 END;
3605
3606 UPDATE po_headers_all
3607 SET revision_num = l_new_revision_num,
3608 revised_date = SYSDATE,
3609 ame_approval_id = DECODE(l_new_ame_appr_id_req,
3610 'Y', po_ame_approvals_s.NEXTVAL,
3611 ame_approval_id),
3612 ame_transaction_type = DECODE(l_new_ame_appr_id_req,
3613 'Y', l_ame_transaction_type,
3614 ame_transaction_type)
3615 WHERE po_header_id = p_draft_info.po_header_id;
3616
3617 -- revision has been incremented. No need to check another level
3618 EXIT;
3619 END IF;
3620 END LOOP;
3621
3622 d_position := 100;
3623 IF (PO_LOG.d_proc) THEN
3624 PO_LOG.proc_end(d_module);
3625 END IF;
3626 EXCEPTION
3627 WHEN OTHERS THEN
3628 PO_MESSAGE_S.add_exc_msg
3629 ( p_pkg_name => d_pkg_name,
3630 p_procedure_name => d_api_name || '.' || d_position
3631 );
3632 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3633 END set_new_revision;
3634
3635
3636 -----------------------------------------------------------------------
3637 --Start of Comments
3638 --Name: complete_transfer
3639 --Pre-reqs: None
3640 --Modifies:
3641 --Locks:
3642 -- None
3643 --Function:
3644 -- Mark transfer process as completed. If draft changes should be
3645 -- removed, then all draft changes will get deleted
3646 --Parameters:
3647 --IN:
3648 --p_draft_info
3649 -- record structure that holds draft information
3650 --p_delete_draft
3651 -- flag to indicate whether draft changes should get removed from draft
3652 -- tables. Possible values are FND_API.G_TRUE, FND_API.G_FALSE, 'X'
3653 --IN OUT:
3654 --OUT:
3655 --Returns:
3656 --Notes:
3657 --Testing:
3658 --End of Comments
3659 ------------------------------------------------------------------------
3660 PROCEDURE complete_transfer
3661 ( p_draft_info IN DRAFT_INFO_REC_TYPE,
3662 p_delete_draft IN VARCHAR2
3663 ) IS
3664
3665 d_api_name CONSTANT VARCHAR2(30) := 'complete_transfer';
3666 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
3667 d_position NUMBER;
3668
3669 l_return_status VARCHAR2(1);
3670 l_exclude_ctrl_tbl VARCHAR2(1);
3671
3672 BEGIN
3673 d_position := 0;
3674 IF (PO_LOG.d_proc) THEN
3675 PO_LOG.proc_begin(d_module);
3676 END IF;
3677
3678 -- delete_draft = 'X' means that the PO_DRAFTS table should be
3679 -- excluded from deletion. We should just mark it as 'COMPLETED'
3680
3681 IF (p_delete_draft = FND_API.G_FALSE OR
3682 p_delete_draft = 'X') THEN
3683
3684 d_position := 10;
3685
3686 update_draft_status
3687 ( p_draft_id => p_draft_info.draft_id,
3688 p_new_status => g_status_COMPLETED
3689 );
3690
3691 END IF;
3692
3693 IF (p_delete_draft = FND_API.G_TRUE OR
3694 p_delete_draft = 'X') THEN
3695
3696 IF (p_delete_draft = FND_API.G_TRUE) THEN
3697 l_exclude_ctrl_tbl := FND_API.G_FALSE;
3698 ELSIF (p_delete_draft = 'X') THEN
3699 l_exclude_ctrl_tbl := FND_API.G_TRUE;
3700 END IF;
3701
3702 d_position := 20;
3703 remove_draft_changes
3704 ( p_draft_id => p_draft_info.draft_id,
3705 p_exclude_ctrl_tbl => l_exclude_ctrl_tbl,
3706 x_return_status => l_return_status
3707 );
3708
3709 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
3710 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3711 END IF;
3712 END IF;
3713
3714 d_position := 30;
3715 IF (PO_LOG.d_proc) THEN
3716 PO_LOG.proc_end(d_module);
3717 END IF;
3718 EXCEPTION
3719 WHEN OTHERS THEN
3720 PO_MESSAGE_S.add_exc_msg
3721 ( p_pkg_name => d_pkg_name,
3722 p_procedure_name => d_api_name || '.' || d_position
3723 );
3724 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3725 END complete_transfer;
3726
3727
3728 -----------------------------------------------------------------------
3729 --Start of Comments
3730 --Name: update_acceptance_status
3731 --Pre-reqs: None
3732 --Modifies:
3733 --Locks:
3734 -- None
3735 --Function:
3736 -- This procedure performs mass update of the draft records if action is
3737 -- either ACCEPT_ALL or REJECT_ALL
3738 --Parameters:
3739 --IN:
3740 --p_draft_id
3741 -- draft unique identifier
3742 --p_acceptance_action
3743 -- either g_ACCEPT_ALL (Accept all changes) or g_REJECT_ALL
3744 -- (Reject all changes)
3745 --IN OUT:
3746 --OUT:
3747 --Returns:
3748 --Notes:
3749 --Testing:
3750 --End of Comments
3751 ------------------------------------------------------------------------
3752 PROCEDURE update_acceptance_status
3753 ( p_draft_id IN NUMBER,
3754 p_acceptance_action IN VARCHAR2
3755 ) IS
3756
3757 d_api_name CONSTANT VARCHAR2(30) := 'update_acceptance_status';
3758 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
3759 d_position NUMBER;
3760
3761 l_change_accepted_flag PO_HEADERS_DRAFT_ALL.change_accepted_flag%TYPE := NULL;
3762
3763 BEGIN
3764
3765 d_position := 0;
3766 IF (PO_LOG.d_proc) THEN
3767 PO_LOG.proc_begin(d_module);
3768 END IF;
3769
3770 IF (p_acceptance_action = g_ACCEPT_ALL) THEN
3771 l_change_accepted_flag := 'Y';
3772 ELSIF (p_acceptance_action = g_REJECT_ALL) THEN
3773 l_change_accepted_flag := 'N';
3774 END IF;
3775
3776 d_position := 20;
3777
3778 IF (l_change_accepted_flag IS NOT NULL) THEN
3779 d_position := 30;
3780 UPDATE po_headers_draft_all
3781 SET change_accepted_flag = l_change_accepted_flag
3782 WHERE draft_id = p_draft_id
3783 AND change_accepted_flag IS NULL;
3784
3785 d_position := 40;
3786 UPDATE po_lines_draft_all
3787 SET change_accepted_flag = l_change_accepted_flag
3788 WHERE draft_id = p_draft_id
3789 AND change_accepted_flag IS NULL;
3790
3791 d_position := 50;
3792 UPDATE po_line_locations_draft_all
3793 SET change_accepted_flag = l_change_accepted_flag
3794 WHERE draft_id = p_draft_id
3795 AND change_accepted_flag IS NULL;
3796
3797 d_position := 60;
3798 UPDATE po_distributions_draft_all
3799 SET change_accepted_flag = l_change_accepted_flag
3800 WHERE draft_id = p_draft_id
3801 AND change_accepted_flag IS NULL;
3802
3803 d_position := 70;
3804 UPDATE po_ga_org_assign_draft
3805 SET change_accepted_flag = l_change_accepted_flag
3806 WHERE draft_id = p_draft_id
3807 AND change_accepted_flag IS NULL;
3808
3809 d_position := 80;
3810 UPDATE po_price_diff_draft
3811 SET change_accepted_flag = l_change_accepted_flag
3812 WHERE draft_id = p_draft_id
3813 AND change_accepted_flag IS NULL;
3814
3815 d_position := 90;
3816 UPDATE po_notification_ctrl_draft
3817 SET change_accepted_flag = l_change_accepted_flag
3818 WHERE draft_id = p_draft_id
3819 AND change_accepted_flag IS NULL;
3820
3821 d_position := 100;
3822 UPDATE po_attribute_values_draft
3823 SET change_accepted_flag = l_change_accepted_flag
3824 WHERE draft_id = p_draft_id
3825 AND change_accepted_flag IS NULL;
3826
3827 d_position := 110;
3828 UPDATE po_attribute_values_tlp_draft
3829 SET change_accepted_flag = l_change_accepted_flag
3830 WHERE draft_id = p_draft_id
3831 AND change_accepted_flag IS NULL;
3832
3833 --<Enhanced Pricing Start>
3834 d_position := 120;
3835 UPDATE po_price_adjustments_draft
3836 SET change_accepted_flag = l_change_accepted_flag
3837 WHERE draft_id = p_draft_id
3838 AND change_accepted_flag IS NULL;
3839 --<Enhanced Pricing End>
3840
3841 END IF;
3842
3843 IF (PO_LOG.d_proc) THEN
3844 PO_LOG.proc_end(d_module);
3845 END IF;
3846
3847 EXCEPTION
3848 WHEN OTHERS THEN
3849 PO_MESSAGE_S.add_exc_msg
3850 ( p_pkg_name => d_pkg_name,
3851 p_procedure_name => d_api_name || '.' || d_position
3852 );
3853 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3854 END update_acceptance_status;
3855
3856 -----------------------------------------------------------------------
3857 --Start of Comments
3858 --Name: is_draft_exist
3859 --Function:
3860 -- check whether a MOD exists for a PO
3861 --Parameters:
3862 --IN:
3863 --p_po_header_id
3864 -- document id of the record
3865 --End of Comments
3866 ------------------------------------------------------------------------
3867
3868 FUNCTION is_draft_exist
3869 ( p_po_header_id IN NUMBER
3870 ) RETURN VARCHAR2 IS
3871
3872 d_api_name CONSTANT VARCHAR2(30) := 'is_draft_exist';
3873 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
3874 d_position NUMBER;
3875
3876 l_is_draft_exist VARCHAR2(1) := FND_API.G_FALSE;
3877 l_draft_count NUMBER;
3878
3879 BEGIN
3880
3881 d_position := 0;
3882 IF (PO_LOG.d_proc) THEN
3883 PO_LOG.proc_begin(d_module);
3884 END IF;
3885
3886 SELECT Count(*)
3887 INTO l_draft_count
3888 FROM po_drafts
3889 WHERE document_id=p_po_header_id
3890 AND draft_type='MOD';
3891
3892 IF (l_draft_count > 0 ) THEN
3893 l_is_draft_exist := FND_API.G_TRUE;
3894 END IF;
3895
3896 IF (PO_LOG.d_proc) THEN
3897 PO_LOG.proc_end(d_module, 'l_is_draft_exist', l_is_draft_exist);
3898 END IF;
3899
3900 RETURN l_is_draft_exist;
3901
3902 END is_draft_exist;
3903
3904
3905 -----------------------------------------------------------------------
3906 --Start of Comments
3907 --Name: is_mod_enabled
3908 --Function:
3909 -- check whether a PO is Mod Enabled or Not
3910 --Parameters:
3911 --IN:
3912 --p_po_header_id
3913 -- document id of the record
3914 --End of Comments
3915 -----------------------------------------------------------------------
3916
3917 FUNCTION is_mod_enabled
3918 ( p_po_header_id IN NUMBER
3919 ) RETURN VARCHAR2 IS
3920
3921 d_api_name CONSTANT VARCHAR2(30) := 'is_mod_enabled';
3922 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
3923 d_position NUMBER;
3924
3925 l_is_mod_enabled VARCHAR2(1) := FND_API.G_FALSE;
3926 l_mod_flag VARCHAR2(1):= 'N';
3927
3928 BEGIN
3929
3930 d_position := 0;
3931 IF (PO_LOG.d_proc) THEN
3932 PO_LOG.proc_begin(d_module);
3933 END IF;
3934
3935 BEGIN
3936
3937 SELECT 'Y'
3938 INTO l_mod_flag
3939 FROM dual
3940 WHERE EXISTS(SELECT 'mod enabled po'
3941 FROM po_doc_style_headers pdsh ,
3942 po_headers_all poh
3943 WHERE pdsh.style_id=poh.style_id
3944 AND poh.po_header_id=p_po_header_id
3945 AND pdsh.change_process_type='MODIFICATION');
3946
3947 EXCEPTION
3948 WHEN No_Data_Found THEN
3949 l_mod_flag :='N';
3950 END;
3951
3952 IF (l_mod_flag = 'Y' ) THEN
3953 l_is_mod_enabled := FND_API.G_TRUE;
3954 END IF;
3955
3956
3957 IF (PO_LOG.d_proc) THEN
3958 PO_LOG.proc_end(d_module, 'l_is_mod_enabled', l_is_mod_enabled);
3959 END IF;
3960
3961 RETURN l_is_mod_enabled;
3962
3963 END is_mod_enabled;
3964
3965 -----------------------------------------------------------------------
3966 --Start of Comments
3967 --Name: is_open_mod_exist
3968 --Function:
3969 -- check whether for the given style_id any open mod exists
3970 --Parameters:
3971 --IN:
3972 --p_style_id of the record
3973 --End of Comments
3974 ------------------------------------------------------------------------
3975 FUNCTION is_open_mod_exist
3976 ( p_style_id IN NUMBER
3977 ) RETURN VARCHAR2 IS
3978
3979 l_open_mod_exist_flag VARCHAR2(1);
3980 BEGIN
3981
3982 BEGIN
3983 SELECT 'Y'
3984 INTO l_open_mod_exist_flag
3985 FROM dual
3986 WHERE EXISTS (SELECT 'Open Mod Exists'
3987 FROM po_drafts pod,
3988 po_headers_all poh
3989 WHERE pod.document_id = poh.po_header_id
3990 AND poh.style_id = p_style_id
3991 AND pod.draft_type= 'MOD'
3992 AND pod.status IN ('DRAFT','REJECTED','IN PROCESS',
3993 'PRE-APPROVED','SUPPLIER SIGN'));
3994
3995 EXCEPTION
3996 WHEN NO_DATA_FOUND THEN
3997 l_open_mod_exist_flag := 'N';
3998 END;
3999
4000 RETURN l_open_mod_exist_flag;
4001 END is_open_mod_exist;
4002
4003 --------------------------------------------------------------------------------
4004 --Start of Comments
4005 --Name: lock_entities
4006 -- <Conc Mods Project>
4007 --Pre-reqs: None
4008 --Modifies:
4009 -- po_entity_locks
4010 --Locks:
4011 -- po_headers_all, po_lines_all, po_line_locations_all, po_distributions_all,
4012 -- po_headers_all_ext_b,po_lines_all_ext_b,po_line_locations_all_ext_b,
4013 -- po_distributions_all_ext_b, tl tables
4014 --Function:
4015 -- This procedure generates the change data for the passed entities PKs,
4016 -- creates entries in po_entity_locks table corresponding to the modified
4017 -- attributes, and locks the required rows in transaction tables.
4018 --Parameters:
4019 --IN:
4020 --p_document_type
4021 -- document type of the current Modification - Award/IDV
4022 --p_entity_name_tbl
4023 -- table of entity names
4024 --p_pk1
4025 -- primary key 1 value, stores po_header_id
4026 --p_pk2
4027 -- primary key 2 value, stores draft_id
4028 --p_pk3_tbl
4029 -- table of primary key 3 values, stores po_line_id
4030 --p_pk4_tbl
4031 -- table of primary key 4 values, stores po_line_location_id
4032 --p_pk5_tbl
4033 -- table of primary key 5 values, stores po_distribution_id
4034 --IN OUT:
4035 --OUT:
4036 --x_return_status
4037 -- return status of the procedure
4038 --Notes:
4039 --End of Comments
4040 --------------------------------------------------------------------------------
4041 PROCEDURE lock_entities(
4042 p_entity_name_tbl IN PO_TBL_VARCHAR30,
4043 p_draft_id IN NUMBER,
4044 p_pk1_tbl IN PO_TBL_VARCHAR240,
4045 p_pk2_tbl IN PO_TBL_VARCHAR240,
4046 p_pk3_tbl IN PO_TBL_VARCHAR240,
4047 p_pk4_tbl IN PO_TBL_VARCHAR240,
4048 x_return_status OUT NOCOPY VARCHAR2,
4049 x_results OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
4050 )
4051 IS
4052 l_return_status VARCHAR2(1);
4053 l_error_msg VARCHAR2(2000);
4054 l_document_type_code VARCHAR2(500);
4055 l_document_style_id NUMBER;
4056 l_enabled_flag VARCHAR2(5);
4057 l_return_status_uda VARCHAR2(1);
4058 l_po_header_id NUMBER;
4059 d_position NUMBER;
4060 d_api_name CONSTANT VARCHAR2(30) := 'lock_entities';
4061 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
4062 BEGIN
4063
4064 ----------------------------------------------------------
4065 -- Insert modified entities PKs into GT table
4066 -- and determine locks required for various entities
4067 ----------------------------------------------------------
4068 IF (PO_LOG.d_proc) THEN
4069 PO_LOG.proc_begin(d_module);
4070 PO_LOG.proc_begin(d_module, 'p_draft_id', p_draft_id);
4071 END IF;
4072 -- Clean up the gt table
4073 DELETE FROM po_session_gt
4074 WHERE index_char1 IN (G_CHANGED_ENTTIES_ID, G_LOCKS_REQUIRED_ID);
4075
4076 -- Insert changed entities into gt table
4077 FORALL i IN 1..p_entity_name_tbl.COUNT
4078 INSERT INTO po_session_gt(
4079 key,
4080 index_char1, -- records identifier
4081 index_char2, -- entity name
4082 char1, -- entity_pk1
4083 char2, -- entity_pk2
4084 char3, -- entity_pk3
4085 char4 -- entity_pk4
4086 )
4087 VALUES(
4088 po_session_gt_s.NEXTVAL,
4089 G_CHANGED_ENTTIES_ID,
4090 p_entity_name_tbl(i),
4091 p_pk1_tbl(i),
4092 p_pk2_tbl(i),
4093 p_pk3_tbl(i),
4094 p_pk4_tbl(i)
4095 );
4096
4097 d_position := 10;
4098
4099
4100 IF PO_LOG.d_stmt THEN
4101 PO_LOG.stmt(d_module,d_position,'Nmber Of rows Inserted'||SQL%ROWCOUNT);
4102 END IF;
4103
4104 identify_header_locks(p_draft_id =>p_draft_id);
4105 identify_line_locks (p_draft_id =>p_draft_id);
4106 identify_shipment_locks (p_draft_id =>p_draft_id);
4107 identify_dist_locks (p_draft_id =>p_draft_id);
4108 -- Elins project
4109 identify_exhibit_locks (p_draft_id =>p_draft_id);
4110
4111 -- chk for uda enabled
4112 SELECT pha.TYPE_LOOKUP_CODE, pha.STYLE_ID,phd.po_header_id
4113 INTO l_document_type_code, l_document_style_id, l_po_header_id
4114 FROM po_headers_all pha, po_headers_draft_all phd
4115 WHERE pha.PO_HEADER_ID = phd.PO_HEADER_ID
4116 AND phd.draft_id=p_draft_id ;
4117
4118 d_position := 20;
4119 IF PO_LOG.d_stmt THEN
4120 PO_LOG.stmt(d_module,d_position,'Before Check_Uda_Enabled');
4121 END IF;
4122
4123 PO_CLM_CLO_UTIL.Check_po_Uda_Enabled
4124 (
4125 p_document_type_code => l_document_type_code
4126 ,p_document_style_id => l_document_style_id
4127 ,x_enabled_flag => l_enabled_flag
4128 ,x_return_status => l_return_status_uda
4129 );
4130
4131 d_position := 30;
4132 IF PO_LOG.d_stmt THEN
4133 PO_LOG.stmt(d_module,d_position,'After Check_Uda_Enabled with x_return_status : ' || l_return_status_uda);
4134 END IF;
4135
4136
4137 IF l_return_status_uda = FND_API.G_RET_STS_UNEXP_ERROR THEN
4138 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4139 END IF;
4140
4141 IF l_enabled_flag = 'Y' THEN
4142 identify_uda_header_locks (p_draft_id =>p_draft_id);
4143 identify_uda_line_locks (p_draft_id =>p_draft_id);
4144 identify_uda_shipment_locks (p_draft_id =>p_draft_id);
4145 END IF;
4146
4147 create_update_locks (p_draft_id =>p_draft_id,
4148 p_return_status=> x_return_status,
4149 x_results =>x_results);
4150
4151 IF (PO_LOG.d_proc) THEN
4152 PO_LOG.proc_end(d_module);
4153 END IF;
4154
4155 EXCEPTION
4156 WHEN OTHERS THEN
4157 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4158 RAISE;
4159 END lock_entities;
4160
4161 --------------------------------------------------------------------------------
4162 --Start of Comments
4163 --Name: identify_header_locks
4164 -- <Conc Mods Project>
4165 --Pre-reqs: None
4166 --Modifies:
4167 -- po_entity_locks
4168 --Locks:
4169 -- po_headers_all, po_ga_org_assignments, po_notification_controls
4170 --Function:
4171 -- This procedure generates the change data for the passed entities PKs,
4172 -- creates entries in po_entity_locks table corresponding to the modified
4173 -- attributes, and locks the required rows in transaction tables.
4174 --Parameters:
4175 --IN:
4176 --p_draft_id
4177 -- draft id of the current Modification - Award/IDV
4178 --Notes:
4179 --End of Comments
4180 --------------------------------------------------------------------------------
4181
4182 PROCEDURE identify_header_locks(
4183 p_draft_id IN NUMBER
4184 )
4185 IS
4186 d_api_name CONSTANT VARCHAR2(30) := 'identify_header_locks';
4187 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
4188 d_position NUMBER;
4189
4190 BEGIN
4191
4192 d_position:=0;
4193 IF (PO_LOG.d_proc) THEN
4194 PO_LOG.proc_begin(d_module);
4195 PO_LOG.proc_begin(d_module, 'p_draft_id', p_draft_id);
4196 END IF;
4197
4198 -- Insert Header level locks required into gt table
4199 INSERT INTO po_session_gt(
4200 key,
4201 index_char1, -- records identifier
4202 index_char2, -- entity_name
4203 char1, -- entity_pk1
4204 num1, -- lock_by_draft_id
4205 char5 -- lock_type
4206 )
4207 SELECT po_session_gt_s.NEXTVAL,
4208 G_LOCKS_REQUIRED_ID,
4209 G_LOCK_HEADER_ENTITY,
4210 draft.po_header_id,
4211 draft.draft_id,
4212 CASE
4213 WHEN base.p_lock_attrs <> draft.p_lock_attrs THEN 'P'
4214 WHEN base.s_lock_attrs <> draft.s_lock_attrs THEN 'S'
4215 ELSE NULL
4216 END lock_type
4217 FROM (SELECT poh.po_header_id,
4218 G_DRAFT_ID_MINUS_1 draft_id,
4219 po_header_mod_s_lock_attrs(
4220 NVL(poh.amount_limit, G_NULL_NUM)
4221 ) s_lock_attrs,
4222 po_header_mod_p_lock_attrs(
4223 NVL(poh.user_document_status, G_NULL_CHAR),
4224 NVL(poh.vendor_site_id, G_NULL_NUM),
4225 NVL(poh.vendor_contact_id, G_NULL_NUM),
4226 NVL(poh.supplier_notif_method, G_NULL_CHAR),
4227 NVL(poh.fax, G_NULL_CHAR),
4228 NVL(poh.email_address, G_NULL_CHAR),
4229 NVL(poh.clm_external_idv, G_NULL_CHAR),
4230 NVL(poh.clm_vendor_offer_number, G_NULL_CHAR),
4231 NVL(poh.clm_effective_date, G_NULL_DATE),
4232 NVL(poh.agent_id, G_NULL_NUM),
4233 NVL(poh.clm_award_administrator, G_NULL_CHAR),
4234 NVL(poh.comments, G_NULL_CHAR),
4235 NVL(poh.confirming_order_flag, G_NULL_CHAR),
4236 NVL(poh.terms_id, G_NULL_NUM),
4237 NVL(poh.ship_to_location_id, G_NULL_NUM),
4238 NVL(poh.bill_to_location_id, G_NULL_NUM),
4239 NVL(poh.ship_via_lookup_code, G_NULL_CHAR),
4240 NVL(poh.freight_terms_lookup_code, G_NULL_CHAR),
4241 NVL(poh.fob_lookup_code, G_NULL_CHAR),
4242 NVL(poh.shipping_control, G_NULL_CHAR),
4243 NVL(poh.note_to_vendor, G_NULL_CHAR),
4244 NVL(poh.note_to_receiver, G_NULL_CHAR),
4245 NVL(poh.blanket_total_amount, G_NULL_NUM),
4246 NVL(poh.price_update_tolerance, G_NULL_NUM),
4247 NVL(poh.start_date, G_NULL_DATE),
4248 NVL(poh.end_date, G_NULL_DATE),
4249 NVL(poh.clm_max_order_amount, G_NULL_NUM),
4250 NVL(poh.clm_min_order_amount, G_NULL_NUM),
4251 NVL(poh.clm_min_guarantee_award_amt, G_NULL_NUM),
4252 NVL(poh.clm_min_guar_award_amt_percent, G_NULL_NUM),
4253 NVL(poh.auto_sourcing_flag, G_NULL_CHAR),
4254 NVL(poh.update_sourcing_rules_flag, G_NULL_CHAR),
4255 NVL(poh.retro_price_apply_updates_flag, G_NULL_CHAR),
4256 NVL(poh.retro_price_comm_updates_flag, g_null_char),
4257 NVL(poh.attribute_category ,G_NULL_CHAR),
4258 NVL(poh.attribute1 ,G_NULL_CHAR),
4259 NVL(poh.attribute2 ,G_NULL_CHAR),
4260 NVL(poh.attribute3 ,G_NULL_CHAR),
4261 NVL(poh.attribute4 ,G_NULL_CHAR),
4262 NVL(poh.attribute5 ,G_NULL_CHAR),
4263 NVL(poh.attribute6 ,G_NULL_CHAR),
4264 NVL(poh.attribute7 ,G_NULL_CHAR),
4265 NVL(poh.attribute8 ,G_NULL_CHAR),
4266 NVL(poh.attribute9 ,G_NULL_CHAR),
4267 NVL(poh.attribute10 ,G_NULL_CHAR),
4268 NVL(poh.attribute11 ,G_NULL_CHAR),
4269 NVL(poh.attribute12 ,G_NULL_CHAR),
4270 NVL(poh.attribute13 ,G_NULL_CHAR),
4271 NVL(poh.attribute14 ,g_null_char),
4272 NVL(poh.attribute15 ,G_NULL_CHAR),
4273 NVL(poh.umbrella_program_id ,G_NULL_NUM),
4274 NVL(poh.clm_contract_finance_code, G_NULL_CHAR),
4275 NVL(poh.clm_payment_instr_code, G_NULL_CHAR)
4276 ) p_lock_attrs
4277 FROM po_headers_all poh,
4278 po_session_gt pogt
4279 WHERE poh.po_header_id = pogt.char1 -- po_header_id
4280 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
4281 AND pogt.index_char2 = G_LOCK_HEADER_ENTITY
4282 ) base,
4283 (SELECT pohd.po_header_id,
4284 pohd.draft_id,
4285 po_header_mod_s_lock_attrs(
4286 NVL(pohd.amount_limit, G_NULL_NUM)
4287 ) s_lock_attrs,
4288 po_header_mod_p_lock_attrs(
4289 NVL(pohd.user_document_status, G_NULL_CHAR),
4290 NVL(pohd.vendor_site_id, G_NULL_NUM),
4291 NVL(pohd.vendor_contact_id, G_NULL_NUM),
4292 NVL(pohd.supplier_notif_method, G_NULL_CHAR),
4293 NVL(pohd.fax, G_NULL_CHAR),
4294 NVL(pohd.email_address, G_NULL_CHAR),
4295 NVL(pohd.clm_external_idv, G_NULL_CHAR),
4296 NVL(pohd.clm_vendor_offer_number, G_NULL_CHAR),
4297 NVL(pohd.clm_effective_date, G_NULL_DATE),
4298 NVL(pohd.agent_id, G_NULL_NUM),
4299 NVL(pohd.clm_award_administrator, G_NULL_CHAR),
4300 NVL(pohd.comments, G_NULL_CHAR),
4301 NVL(pohd.confirming_order_flag, G_NULL_CHAR),
4302 NVL(pohd.terms_id, G_NULL_NUM),
4303 NVL(pohd.ship_to_location_id, G_NULL_NUM),
4304 NVL(pohd.bill_to_location_id, G_NULL_NUM),
4305 NVL(pohd.ship_via_lookup_code, G_NULL_CHAR),
4306 NVL(pohd.freight_terms_lookup_code, G_NULL_CHAR),
4307 NVL(pohd.fob_lookup_code, G_NULL_CHAR),
4308 NVL(pohd.shipping_control, G_NULL_CHAR),
4309 NVL(pohd.note_to_vendor, G_NULL_CHAR),
4310 NVL(pohd.note_to_receiver, G_NULL_CHAR),
4311 NVL(pohd.blanket_total_amount, G_NULL_NUM),
4312 NVL(pohd.price_update_tolerance, G_NULL_NUM),
4313 NVL(pohd.start_date, G_NULL_DATE),
4314 NVL(pohd.end_date, G_NULL_DATE),
4315 NVL(pohd.clm_max_order_amount, G_NULL_NUM),
4316 NVL(pohd.clm_min_order_amount, G_NULL_NUM),
4317 NVL(pohd.clm_min_guarantee_award_amt, G_NULL_NUM),
4318 NVL(pohd.clm_min_guar_award_amt_percent, G_NULL_NUM),
4319 NVL(pohd.auto_sourcing_flag, G_NULL_CHAR),
4320 NVL(pohd.update_sourcing_rules_flag, G_NULL_CHAR),
4321 NVL(pohd.retro_price_apply_updates_flag, g_null_char),
4322 NVL(pohd.retro_price_comm_updates_flag, G_NULL_CHAR),
4323 NVL(pohd.attribute_category ,G_NULL_CHAR),
4324 NVL(pohd.attribute1 ,G_NULL_CHAR),
4325 NVL(pohd.attribute2 ,G_NULL_CHAR),
4326 NVL(pohd.attribute3 ,G_NULL_CHAR),
4327 NVL(pohd.attribute4 ,G_NULL_CHAR),
4328 NVL(pohd.attribute5 ,G_NULL_CHAR),
4329 NVL(pohd.attribute6 ,G_NULL_CHAR),
4330 NVL(pohd.attribute7 ,G_NULL_CHAR),
4331 NVL(pohd.attribute8 ,G_NULL_CHAR),
4332 NVL(pohd.attribute9 ,G_NULL_CHAR),
4333 NVL(pohd.attribute10 ,G_NULL_CHAR),
4334 NVL(pohd.attribute11 ,G_NULL_CHAR),
4335 NVL(pohd.attribute12 ,G_NULL_CHAR),
4336 NVL(pohd.attribute13 ,G_NULL_CHAR),
4337 nvl(pohd.attribute14 ,g_null_char),
4338 NVL(pohd.attribute15 ,G_NULL_CHAR),
4339 NVL(pohd.umbrella_program_id ,G_NULL_NUM),
4340 NVL(pohd.clm_contract_finance_code, G_NULL_CHAR),
4341 NVL(pohd.clm_payment_instr_code, G_NULL_CHAR)
4342 ) p_lock_attrs
4343 FROM po_headers_draft_all pohd,
4344 po_session_gt pogt
4345 WHERE pohd.draft_id = p_draft_id
4346 AND pohd.po_header_id = pogt.char1 -- po_header_id
4347 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
4348 AND pogt.index_char2 = G_LOCK_HEADER_ENTITY
4349 ) draft
4350 WHERE base.p_lock_attrs <> draft.p_lock_attrs
4351 OR base.s_lock_attrs <> draft.s_lock_attrs;
4352
4353 d_position:=10;
4354 IF (PO_LOG.d_stmt) THEN
4355 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
4356 PO_LOG.stmt(d_module, d_position, 'Number of Records Inserted',SQL%ROWCOUNT);
4357 END IF;
4358
4359 -- Identify Header level locks required because of change in po_ga_org_assignments
4360 INSERT INTO po_session_gt(
4361 key,
4362 index_char1, -- records identifier
4363 index_char2, -- entity_name
4364 char1, -- entity_pk1
4365 num1, -- lock_by_draft_id
4366 char5 -- lock_type
4367 )
4368 SELECT po_session_gt_s.NEXTVAL,
4369 G_LOCKS_REQUIRED_ID,
4370 G_LOCK_HEADER_ENTITY,
4371 draft.po_header_id,
4372 draft.draft_id,
4373 CASE
4374 WHEN base.p_lock_attrs <> draft.p_lock_attrs THEN 'P'
4375 ELSE NULL
4376 END lock_type
4377 FROM (SELECT pgoa.po_header_id,
4378 G_DRAFT_ID_MINUS_1 draft_id,
4379 po_ga_org_asg_p_lock_attrs(
4380 NVL(pgoa.purchasing_org_id ,g_null_num),
4381 NVL(pgoa.vendor_site_id ,G_NULL_NUM)
4382 ) p_lock_attrs,
4383 pgoa.org_assignment_id
4384 FROM po_ga_org_assignments pgoa,
4385 po_session_gt pogt
4386 WHERE pgoa.po_header_id = pogt.char1 -- po_header_id
4387 and pogt.index_char1 = G_CHANGED_ENTTIES_ID
4388 and pogt.index_char2 = G_LOCK_HEADER_ENTITY
4389 ) base,--done
4390 (SELECT pgoad.po_header_id,
4391 pgoad.draft_id,
4392 po_ga_org_asg_p_lock_attrs(
4393 NVL(pgoad.purchasing_org_id ,G_NULL_NUM),
4394 NVL(pgoad.vendor_site_id ,G_NULL_NUM)
4395 ) P_LOCK_ATTRS,
4396 pgoad.org_assignment_id
4397 FROM po_ga_org_assign_draft pgoad,
4398 po_session_gt pogt
4399 WHERE pgoad.draft_id = p_draft_id
4400 AND pgoad.po_header_id = pogt.char1 -- po_header_id
4401 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
4402 AND pogt.index_char2 = G_LOCK_HEADER_ENTITY
4403 ) draft
4404 WHERE base.org_assignment_id = draft.org_assignment_id
4405 AND base.p_lock_attrs <> draft.p_lock_attrs;
4406
4407 d_position:=20;
4408 IF (PO_LOG.d_stmt) THEN
4409 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
4410 PO_LOG.stmt(d_module,d_position ,'number of rows Inserted ',SQL%ROWCOUNT);
4411 END IF;
4412
4413 -- Identify Header level locks required because of change in po_notification_controls
4414 INSERT INTO po_session_gt(
4415 key,
4416 index_char1, -- records identifier
4417 index_char2, -- entity_name
4418 char1, -- entity_pk1
4419 num1, -- lock_by_draft_id
4420 char5 -- lock_type
4421 )
4422 SELECT po_session_gt_s.NEXTVAL,
4423 G_LOCKS_REQUIRED_ID,
4424 G_LOCK_HEADER_ENTITY,
4425 draft.po_header_id,
4426 draft.draft_id,
4427 CASE
4428 WHEN base.p_lock_attrs <> draft.p_lock_attrs THEN 'P'
4429 ELSE NULL
4430 END lock_type
4431 FROM (SELECT pnc.po_header_id,
4432 G_DRAFT_ID_MINUS_1 draft_id,
4433 po_notif_ctrl_p_lock_attrs(
4434 NVL(pnc.notification_condition_code ,G_NULL_CHAR),
4435 NVL(pnc.notification_qty_percentage ,G_NULL_NUM),
4436 NVL(pnc.notification_amount ,G_NULL_NUM),
4437 NVL(pnc.start_date_active ,G_NULL_DATE),
4438 NVL(pnc.end_date_active ,G_NULL_DATE)
4439 ) p_lock_attrs,
4440 pnc.notification_id
4441 FROM po_notification_controls pnc,
4442 po_session_gt pogt
4443 WHERE pnc.po_header_id = pogt.char1 -- po_header_id
4444 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
4445 AND pogt.index_char2 = G_LOCK_HEADER_ENTITY
4446 ) base,
4447 (SELECT pncd.po_header_id,
4448 pncd.draft_id,
4449 po_notif_ctrl_p_lock_attrs(
4450 NVL(pncd.notification_condition_code ,G_NULL_CHAR),
4451 NVL(pncd.notification_qty_percentage ,G_NULL_NUM),
4452 NVL(pncd.notification_amount ,G_NULL_NUM),
4453 NVL(pncd.start_date_active ,G_NULL_DATE),
4454 NVL(pncd.end_date_active ,G_NULL_DATE)
4455 ) p_lock_attrs,
4456 pncd.notification_id
4457 FROM po_notification_ctrl_draft pncd,
4458 po_session_gt pogt
4459 WHERE pncd.draft_id = p_draft_id
4460 AND pncd.po_header_id = pogt.char1 -- po_header_id
4461 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
4462 AND pogt.index_char2 = G_LOCK_HEADER_ENTITY
4463 ) draft
4464 WHERE base.notification_id = draft.notification_id
4465 AND base.p_lock_attrs <> draft.p_lock_attrs;
4466
4467 d_position:=30;
4468 IF (PO_LOG.d_stmt) THEN
4469 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
4470 PO_LOG.stmt(d_module,d_position ,'number of rows Inserted ',SQL%ROWCOUNT);
4471 END IF;
4472
4473 d_position:=40;
4474 IF (PO_LOG.d_proc) THEN
4475 PO_LOG.proc_end(d_module);
4476 END IF;
4477 EXCEPTION
4478 WHEN OTHERS THEN
4479 IF (PO_LOG.d_exc) THEN
4480 PO_LOG.exc(d_module,d_position,SQLCODE || SQLERRM);
4481 END IF;
4482 RAISE;
4483 END identify_header_locks;
4484
4485
4486 --------------------------------------------------------------------------------
4487 --Start of Comments
4488 --Name: identify_line_locks
4489 -- <Conc Mods Project>
4490 --Pre-reqs: None
4491 --Modifies:
4492 -- po_entity_locks
4493 --Locks:
4494 -- po_lines_all, po_attribute_values, po_attribute_values_tlp, price breaks, po_price_differentials.
4495 --Function:
4496 -- This procedure generates the change data for the passed entities PKs,
4497 -- creates entries in po_entity_locks table corresponding to the modified
4498 -- attributes, and locks the required rows in transaction tables.
4499 --Parameters:
4500 --IN:
4501 --p_draft_id
4502 -- draft id of the current Modification - Award/IDV
4503 --Notes:
4504 --End of Comments
4505 --------------------------------------------------------------------------------
4506 PROCEDURE identify_line_locks(
4507 p_draft_id IN NUMBER
4508 ) IS
4509 d_api_name CONSTANT VARCHAR2(30) := 'identify_line_locks';
4510 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
4511 d_position NUMBER;
4512
4513 BEGIN
4514
4515 d_position:=0;
4516 IF (PO_LOG.d_proc) THEN
4517 PO_LOG.proc_begin(d_module);
4518 PO_LOG.proc_begin(d_module, 'p_draft_id', p_draft_id);
4519 END IF;
4520
4521 -- Identify Line level locks required and insert into gt table
4522 INSERT INTO po_session_gt(
4523 key,
4524 index_char1, -- records identifier
4525 index_char2, -- entity_name
4526 char1, -- entity_pk1
4527 num1, -- lock_by_draft_id
4528 char5 -- lock_type
4529 )
4530 SELECT po_session_gt_s.NEXTVAL,
4531 G_LOCKS_REQUIRED_ID,
4532 G_LOCK_LINE_ENTITY,
4533 draft.po_line_id,
4534 draft.draft_id,
4535 CASE
4536 WHEN base.f_lock_attrs <> draft.f_lock_attrs THEN 'F'
4537 WHEN base.p_lock_attrs <> draft.p_lock_attrs THEN 'P'
4538 WHEN base.s_lock_attrs <> draft.s_lock_attrs THEN 'S'
4539 ELSE NULL
4540 END lock_type
4541 FROM (SELECT pol.po_line_id,
4542 G_DRAFT_ID_MINUS_1 draft_id,
4543 po_line_mod_s_lock_attrs(
4544 NVL(pol.quantity, G_NULL_NUM),
4545 NVL(pol.secondary_qty, G_NULL_NUM),
4546 NVL(pol.amount, G_NULL_NUM)
4547 ) s_lock_attrs,
4548 po_line_mod_p_lock_attrs(
4549 NVL(pol.line_type_id ,G_NULL_NUM),
4550 NVL(pol.item_revision ,G_NULL_CHAR),
4551 NVL(pol.item_description ,G_NULL_CHAR),
4552 NVL(pol.vendor_product_num ,G_NULL_CHAR),
4553 NVL(pol.transaction_reason_code ,G_NULL_CHAR),
4554 NVL(pol.capital_expense_flag ,G_NULL_CHAR),
4555 NVL(pol.user_document_status ,G_NULL_CHAR),
4556 NVL(pol.category_id ,G_NULL_NUM),
4557 NVL(pol.preferred_grade ,G_NULL_CHAR),
4558 NVL(pol.negotiated_by_preparer_flag ,G_NULL_CHAR),
4559 NVL(pol.clm_option_from_date ,G_NULL_DATE),
4560 NVL(pol.clm_option_to_date ,G_NULL_DATE),
4561 NVL(pol.recoupment_rate ,G_NULL_NUM),
4562 NVL(pol.progress_payment_rate ,G_NULL_NUM),
4563 NVL(pol.max_retainage_amount ,G_NULL_NUM),
4564 NVL(pol.retainage_rate ,G_NULL_NUM),
4565 NVL(pol.note_to_vendor,G_NULL_CHAR),
4566 NVL(pol.supplier_part_auxid ,G_NULL_CHAR),
4567 NVL(pol.un_number_id ,G_NULL_NUM),
4568 NVL(pol.hazard_class_id ,G_NULL_NUM),
4569 NVL(pol.ip_category_id ,G_NULL_NUM),
4570 NVL(pol.allow_price_override_flag ,G_NULL_CHAR),
4571 NVL(pol.not_to_exceed_price ,G_NULL_NUM),
4572 NVL(pol.expiration_date ,G_NULL_DATE),
4573 NVL(pol.min_release_amount ,G_NULL_NUM),
4574 NVL(pol.committed_amount ,G_NULL_NUM),
4575 NVL(pol.quantity_committed ,G_NULL_NUM),
4576 NVL(pol.clm_order_start_date ,G_NULL_DATE),
4577 NVL(pol.clm_max_total_amount ,G_NULL_NUM),
4578 NVL(pol.clm_min_total_amount ,G_NULL_NUM),
4579 NVL(pol.clm_max_total_quantity ,G_NULL_NUM),
4580 NVL(pol.clm_min_total_quantity ,G_NULL_NUM),
4581 NVL(pol.clm_max_order_amount ,G_NULL_NUM),
4582 NVL(pol.clm_min_order_amount ,G_NULL_NUM),
4583 NVL(pol.clm_order_end_date ,G_NULL_DATE),
4584 NVL(pol.clm_max_order_quantity ,G_NULL_NUM),
4585 NVL(pol.clm_min_order_quantity ,G_NULL_NUM),
4586 NVL(pol.clm_total_amount_ordered ,G_NULL_NUM),
4587 NVL(pol.clm_total_quantity_ordered ,G_NULL_NUM),
4588 NVL(pol.attribute_category ,G_NULL_CHAR),
4589 NVL(pol.attribute1 ,G_NULL_CHAR),
4590 NVL(pol.attribute2 ,G_NULL_CHAR),
4591 NVL(pol.attribute3 ,G_NULL_CHAR),
4592 NVL(pol.attribute4 ,G_NULL_CHAR),
4593 NVL(pol.attribute5 ,G_NULL_CHAR),
4594 NVL(pol.attribute6 ,G_NULL_CHAR),
4595 NVL(pol.attribute7 ,G_NULL_CHAR),
4596 NVL(pol.attribute8 ,G_NULL_CHAR),
4597 NVL(pol.attribute9 ,G_NULL_CHAR),
4598 NVL(pol.attribute10 ,G_NULL_CHAR),
4599 NVL(pol.attribute11 ,G_NULL_CHAR),
4600 NVL(pol.attribute12 ,G_NULL_CHAR),
4601 NVL(pol.attribute13 ,G_NULL_CHAR),
4602 NVL(pol.attribute14 ,G_NULL_CHAR),
4603 NVL(pol.attribute15 ,G_NULL_CHAR),
4604 NVL(pol.oke_contract_header_id, G_NULL_NUM),
4605 NVL(pol.oke_contract_version_id, G_NULL_NUM),
4606 NVL(pol.clm_payment_instr_code, G_NULL_CHAR),
4607 NVL(pol.clm_pop_exception_reason, G_NULL_CHAR)
4608 ) p_lock_attrs,
4609 po_line_mod_f_lock_attrs(
4610 NVL(pol.clm_exercised_flag, G_NULL_CHAR),
4611 NVL(pol.contract_type, G_NULL_CHAR),
4612 NVL(pol.cost_constraint, G_NULL_CHAR),
4613 NVL(pol.unit_meas_lookup_code, G_NULL_CHAR),
4614 NVL(pol.unit_price, G_NULL_NUM),
4615 NVL(pol.clm_exercised_date, G_NULL_DATE),
4616 NVL(pol.from_header_id, G_NULL_NUM),
4617 NVL(pol.from_line_id, G_NULL_NUM),
4618 NVL(pol.clm_idc_type, G_NULL_CHAR)
4619 ) f_lock_attrs
4620 FROM po_lines_all pol,
4621 po_session_gt pogt
4622 WHERE pol.po_line_id = pogt.char1 -- po_line_id
4623 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
4624 AND pogt.index_char2 = G_LOCK_LINE_ENTITY
4625 ) base,
4626 (SELECT pold.po_line_id,
4627 pold.draft_id,
4628 po_line_mod_s_lock_attrs(
4629 NVL(pold.quantity, G_NULL_NUM),
4630 NVL(pold.secondary_qty, G_NULL_NUM),
4631 NVL(pold.amount, G_NULL_NUM)
4632 ) s_lock_attrs,
4633 po_line_mod_p_lock_attrs(
4634 NVL(pold.line_type_id ,G_NULL_NUM),
4635 NVL(pold.item_revision ,G_NULL_CHAR),
4636 NVL(pold.item_description ,G_NULL_CHAR),
4637 NVL(pold.vendor_product_num ,G_NULL_CHAR),
4638 NVL(pold.transaction_reason_code ,G_NULL_CHAR),
4639 NVL(pold.capital_expense_flag ,G_NULL_CHAR),
4640 NVL(pold.user_document_status ,G_NULL_CHAR),
4641 NVL(pold.category_id ,G_NULL_NUM),
4642 NVL(pold.preferred_grade ,G_NULL_CHAR),
4643 NVL(pold.negotiated_by_preparer_flag ,G_NULL_CHAR),
4644 NVL(pold.clm_option_from_date ,G_NULL_DATE),
4645 NVL(pold.clm_option_to_date ,G_NULL_DATE),
4646 NVL(pold.recoupment_rate ,G_NULL_NUM),
4647 NVL(pold.progress_payment_rate ,G_NULL_NUM),
4648 NVL(pold.max_retainage_amount ,G_NULL_NUM),
4649 NVL(pold.retainage_rate ,G_NULL_NUM),
4650 NVL(pold.note_to_vendor ,G_NULL_CHAR),
4651 NVL(pold.supplier_part_auxid ,G_NULL_CHAR),
4652 NVL(pold.un_number_id ,G_NULL_NUM),
4653 NVL(pold.hazard_class_id ,G_NULL_NUM),
4654 NVL(pold.ip_category_id ,G_NULL_NUM),
4655 NVL(pold.allow_price_override_flag ,G_NULL_CHAR),
4656 NVL(pold.not_to_exceed_price ,G_NULL_NUM),
4657 NVL(pold.expiration_date ,G_NULL_DATE),
4658 NVL(pold.min_release_amount ,G_NULL_NUM),
4659 NVL(pold.committed_amount ,G_NULL_NUM),
4660 NVL(pold.quantity_committed ,G_NULL_NUM),
4661 NVL(pold.clm_order_start_date ,G_NULL_DATE),
4662 NVL(pold.clm_max_total_amount ,G_NULL_NUM),
4663 NVL(pold.clm_min_total_amount ,G_NULL_NUM),
4664 NVL(pold.clm_max_total_quantity ,G_NULL_NUM),
4665 NVL(pold.clm_min_total_quantity ,G_NULL_NUM),
4666 NVL(pold.clm_max_order_amount ,G_NULL_NUM),
4667 NVL(pold.clm_min_order_amount ,G_NULL_NUM),
4668 NVL(pold.clm_order_end_date ,G_NULL_DATE),
4669 NVL(pold.clm_max_order_quantity ,G_NULL_NUM),
4670 NVL(pold.clm_min_order_quantity ,G_NULL_NUM),
4671 NVL(pold.clm_total_amount_ordered ,G_NULL_NUM),
4672 NVL(pold.clm_total_quantity_ordered ,G_NULL_NUM),
4673 NVL(pold.attribute_category ,G_NULL_CHAR),
4674 NVL(pold.attribute1 ,G_NULL_CHAR),
4675 NVL(pold.attribute2 ,G_NULL_CHAR),
4676 NVL(pold.attribute3 ,G_NULL_CHAR),
4677 NVL(pold.attribute4 ,G_NULL_CHAR),
4678 NVL(pold.attribute5 ,G_NULL_CHAR),
4679 NVL(pold.attribute6 ,G_NULL_CHAR),
4680 NVL(pold.attribute7 ,G_NULL_CHAR),
4681 NVL(pold.attribute8 ,G_NULL_CHAR),
4682 NVL(pold.attribute9 ,G_NULL_CHAR),
4683 NVL(pold.attribute10 ,G_NULL_CHAR),
4684 NVL(pold.attribute11 ,G_NULL_CHAR),
4685 NVL(pold.attribute12 ,G_NULL_CHAR),
4686 NVL(pold.attribute13 ,G_NULL_CHAR),
4687 NVL(pold.attribute14 ,G_NULL_CHAR),
4688 NVL(pold.attribute15 ,G_NULL_CHAR),
4689 NVL(pold.oke_contract_header_id, G_NULL_NUM),
4690 NVL(pold.oke_contract_version_id, G_NULL_NUM),
4691 NVL(pold.clm_payment_instr_code, G_NULL_CHAR),
4692 NVL(pold.clm_pop_exception_reason, G_NULL_CHAR)
4693 ) p_lock_attrs,
4694 po_line_mod_f_lock_attrs(
4695 NVL(pold.clm_exercised_flag, G_NULL_CHAR),
4696 NVL(pold.contract_type, G_NULL_CHAR),
4697 NVL(pold.cost_constraint, G_NULL_CHAR),
4698 NVL(pold.unit_meas_lookup_code, G_NULL_CHAR),
4699 NVL(pold.unit_price, G_NULL_NUM),
4700 NVL(pold.clm_exercised_date, G_NULL_DATE),
4701 NVL(pold.from_header_id, G_NULL_NUM),
4702 NVL(pold.from_line_id, G_NULL_NUM),
4703 NVL(pold.clm_idc_type, G_NULL_CHAR)
4704 ) f_lock_attrs
4705 FROM po_lines_draft_all pold,
4706 po_session_gt pogt
4707 WHERE pold.draft_id = p_draft_id
4708 AND pold.po_line_id = pogt.char1 -- po_line_id
4709 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
4710 AND pogt.index_char2 = G_LOCK_LINE_ENTITY
4711 ) draft
4712 WHERE base.po_line_id = draft.po_line_id
4713 AND (base.f_lock_attrs <> draft.f_lock_attrs
4714 OR base.p_lock_attrs <> draft.p_lock_attrs
4715 OR base.s_lock_attrs <> draft.s_lock_attrs);
4716
4717 d_position:=10;
4718 IF (PO_LOG.d_stmt) THEN
4719 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
4720 PO_LOG.stmt(d_module,d_position ,'number of rows Updated ',SQL%ROWCOUNT);
4721 END IF;
4722
4723 -- Identify Line level locks required because of change in po_attribute_values
4724 INSERT INTO po_session_gt(
4725 key,
4726 index_char1, -- records identifier
4727 index_char2, -- entity_name
4728 char1, -- entity_pk1
4729 num1, -- lock_by_draft_id
4730 char5 -- lock_type
4731 )
4732 SELECT po_session_gt_s.NEXTVAL,
4733 G_LOCKS_REQUIRED_ID,
4734 G_LOCK_LINE_ENTITY,
4735 draft.po_line_id,
4736 draft.draft_id,
4737 CASE
4738 WHEN base.p_lock_attrs <> draft.p_lock_attrs THEN 'P'
4739 ELSE NULL
4740 END lock_type
4741 FROM (SELECT poav.po_line_id,
4742 G_DRAFT_ID_MINUS_1 draft_id,
4743 po_attr_val_p_lock_attrs(
4744 NVL(poav.supplier_url ,G_NULL_CHAR),
4745 NVL(poav.manufacturer_url ,G_NULL_CHAR),
4746 NVL(poav.manufacturer_part_num ,G_NULL_CHAR),
4747 NVL(poav.attachment_url ,G_NULL_CHAR),
4748 NVL(poav.lead_time ,G_NULL_NUM),
4749 NVL(poav.unspsc ,G_NULL_CHAR),
4750 NVL(poav.picture ,G_NULL_CHAR),
4751 nvl(poav.thumbnail_image ,G_NULL_CHAR),
4752 NVL(poav.availability ,G_NULL_CHAR)
4753 ) p_lock_attrs,
4754 poav.attribute_values_id
4755 FROM po_attribute_values poav,
4756 po_session_gt pogt
4757 WHERE poav.po_line_id = pogt.char1 -- po_line_id
4758 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
4759 AND pogt.index_char2 = G_LOCK_LINE_ENTITY
4760 ) base,
4761 (SELECT poavd.po_line_id,
4762 poavd.draft_id,
4763 po_attr_val_p_lock_attrs(
4764 NVL(poavd.supplier_url ,G_NULL_CHAR),
4765 NVL(poavd.manufacturer_url ,G_NULL_CHAR),
4766 NVL(poavd.manufacturer_part_num ,G_NULL_CHAR),
4767 NVL(poavd.attachment_url ,G_NULL_CHAR),
4768 NVL(poavd.lead_time ,G_NULL_NUM),
4769 NVL(poavd.unspsc ,G_NULL_CHAR),
4770 NVL(poavd.picture ,G_NULL_CHAR),
4771 nvl(poavd.thumbnail_image ,G_NULL_CHAR),
4772 NVL(poavd.availability ,G_NULL_CHAR)
4773 ) p_lock_attrs,
4774 poavd.attribute_values_id
4775 FROM po_attribute_values_draft poavd,
4776 po_session_gt pogt
4777 WHERE poavd.draft_id = p_draft_id
4778 AND poavd.po_line_id = pogt.char1 -- po_line_id
4779 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
4780 AND pogt.index_char2 = G_LOCK_LINE_ENTITY
4781 ) draft
4782 WHERE base.attribute_values_id = draft.attribute_values_id
4783 AND base.p_lock_attrs <> draft.p_lock_attrs;
4784
4785 d_position:=20;
4786 IF (PO_LOG.d_stmt) THEN
4787 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
4788 PO_LOG.stmt(d_module,d_position ,'number of rows Inserted ',SQL%ROWCOUNT);
4789 END IF;
4790
4791 -- Identify Line level locks required because of change in po_attribute_values_tlp
4792 INSERT INTO po_session_gt(
4793 key,
4794 index_char1, -- records identifier
4795 index_char2, -- entity_name
4796 char1, -- entity_pk1
4797 num1, -- lock_by_draft_id
4798 char5 -- lock_type
4799 )
4800 SELECT po_session_gt_s.NEXTVAL,
4801 G_LOCKS_REQUIRED_ID,
4802 G_LOCK_LINE_ENTITY,
4803 draft.po_line_id,
4804 draft.draft_id,
4805 CASE
4806 WHEN base.p_lock_attrs <> draft.p_lock_attrs THEN 'P'
4807 ELSE NULL
4808 END lock_type
4809 FROM (SELECT poavt.po_line_id,
4810 G_DRAFT_ID_MINUS_1 draft_id,
4811 po_attr_val_tlp_p_lock_attrs(
4812 NVL(poavt.long_description ,G_NULL_CHAR),
4813 NVL(poavt.manufacturer ,G_NULL_CHAR),
4814 NVL(poavt.ALIAS ,G_NULL_CHAR),
4815 NVL(poavt.comments ,G_NULL_CHAR)
4816 ) p_lock_attrs,
4817 poavt.attribute_values_tlp_id
4818 FROM po_attribute_values_tlp poavt,
4819 po_session_gt pogt
4820 WHERE poavt.po_line_id = pogt.char1 -- po_line_id
4821 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
4822 AND pogt.index_char2 = G_LOCK_LINE_ENTITY
4823 ) base,
4824 (SELECT poavtd.po_line_id,
4825 poavtd.draft_id,
4826 po_attr_val_tlp_p_lock_attrs(
4827 NVL(poavtd.long_description ,G_NULL_CHAR),
4828 NVL(poavtd.manufacturer ,G_NULL_CHAR),
4829 NVL(poavtd.ALIAS ,G_NULL_CHAR),
4830 NVL(poavtd.comments ,G_NULL_CHAR)
4831 ) p_lock_attrs,
4832 poavtd.attribute_values_tlp_id
4833 FROM po_attribute_values_tlp_draft poavtd,
4834 po_session_gt pogt
4835 WHERE poavtd.draft_id = p_draft_id
4836 AND poavtd.po_line_id = pogt.char1 -- po_line_id
4837 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
4838 AND pogt.index_char2 = G_LOCK_LINE_ENTITY
4839 ) draft
4840 WHERE base.attribute_values_tlp_id = draft.attribute_values_tlp_id
4841 AND base.p_lock_attrs <> draft.p_lock_attrs;
4842
4843 d_position:=30;
4844 IF (PO_LOG.d_stmt) THEN
4845 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
4846 PO_LOG.stmt(d_module,d_position ,'number of rows Inserted ',SQL%ROWCOUNT);
4847 END IF;
4848 -- Identify Line level locks required because of change in price breaks
4849 INSERT INTO po_session_gt(
4850 key,
4851 index_char1, -- records identifier
4852 index_char2, -- entity_name
4853 char1, -- entity_pk1
4854 num1, -- lock_by_draft_id
4855 char5 -- lock_type
4856 )
4857 SELECT po_session_gt_s.NEXTVAL,
4858 G_LOCKS_REQUIRED_ID,
4859 G_LOCK_LINE_ENTITY,
4860 draft.po_line_id,
4861 draft.draft_id,
4862 CASE
4863 WHEN base.p_lock_attrs <> draft.p_lock_attrs THEN 'P'
4864 ELSE NULL
4865 END lock_type
4866 FROM (SELECT ppbr.po_line_id,
4867 G_DRAFT_ID_MINUS_1 draft_id,
4868 po_price_brk_mod_p_lock_attrs(
4869 NVL(ppbr.shipment_num ,G_NULL_NUM),
4870 NVL(ppbr.ship_to_organization_id ,G_NULL_NUM),
4871 NVL(ppbr.ship_to_location_id ,G_NULL_NUM),
4872 NVL(ppbr.quantity ,G_NULL_NUM),
4873 NVL(ppbr.price_override ,G_NULL_NUM),
4874 NVL(ppbr.price_discount ,G_NULL_NUM),
4875 NVL(ppbr.start_date ,G_NULL_DATE),
4876 NVL(ppbr.end_date ,G_NULL_DATE)
4877 ) p_lock_attrs ,
4878 ppbr.line_location_id
4879 FROM po_line_locations_all ppbr,
4880 po_session_gt pogt
4881 WHERE ppbr.po_line_id = pogt.char1 -- po_header_id
4882 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
4883 AND pogt.index_char2 = G_LOCK_LINE_ENTITY
4884 AND ppbr.shipment_type = 'PRICE BREAK'
4885 ) base,
4886 (SELECT ppbrd.po_line_id,
4887 ppbrd.draft_id,
4888 po_price_brk_mod_p_lock_attrs(
4889 NVL(ppbrd.shipment_num ,G_NULL_NUM),
4890 NVL(ppbrd.ship_to_organization_id ,G_NULL_NUM),
4891 NVL(ppbrd.ship_to_location_id ,G_NULL_NUM),
4892 NVL(ppbrd.quantity ,G_NULL_NUM),
4893 NVL(ppbrd.price_override ,G_NULL_NUM),
4894 NVL(ppbrd.price_discount ,G_NULL_NUM),
4895 NVL(ppbrd.start_date ,G_NULL_DATE),
4896 NVL(ppbrd.end_date ,G_NULL_DATE)
4897 ) p_lock_attrs,
4898 ppbrd.line_location_id
4899 FROM po_line_locations_draft_all ppbrd,
4900 po_session_gt pogt
4901 WHERE ppbrd.draft_id = p_draft_id
4902 AND ppbrd.po_line_id = pogt.char1 -- po_line_id
4903 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
4904 AND pogt.index_char2 = G_LOCK_LINE_ENTITY
4905 AND ppbrd.shipment_type = 'PRICE BREAK'
4906 ) draft
4907 WHERE base.line_location_id = draft.line_location_id
4908 AND base.p_lock_attrs <> draft.p_lock_attrs;
4909
4910 d_position:=40;
4911 IF (PO_LOG.d_stmt) THEN
4912 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
4913 PO_LOG.stmt(d_module,d_position ,'number of rows Inserted ',SQL%ROWCOUNT);
4914 END IF;
4915 -- Identify Line level locks required because of change in po_price_differentials
4916 INSERT INTO po_session_gt(
4917 key,
4918 index_char1, -- records identifier
4919 index_char2, -- entity_name
4920 char1, -- entity_pk1
4921 num1, -- lock_by_draft_id
4922 char5 -- lock_type
4923 )
4924 SELECT po_session_gt_s.NEXTVAL,
4925 G_LOCKS_REQUIRED_ID,
4926 G_LOCK_LINE_ENTITY,
4927 draft.entity_id, -- po_lin
4928 draft.draft_id,
4929 CASE
4930 WHEN base.p_lock_attrs <> draft.p_lock_attrs THEN 'P'
4931 ELSE NULL
4932 END lock_type
4933 FROM (SELECT ppd.entity_id,
4934 g_draft_id_minus_1 draft_id,
4935 po_price_diff_p_lock_attrs(
4936 NVL(ppd.price_differential_num ,G_NULL_NUM),
4937 NVL(ppd.multiplier ,G_NULL_NUM),
4938 NVL(ppd.enabled_flag ,G_NULL_CHAR),
4939 NVL(ppd.min_multiplier ,G_NULL_NUM),
4940 NVL(ppd.max_multiplier ,G_NULL_NUM)
4941 ) p_lock_attrs,
4942 ppd.price_differential_id
4943 FROM po_price_differentials ppd,
4944 po_session_gt pogt
4945 WHERE ppd.entity_id = pogt.char1 -- po_line_id
4946 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
4947 AND pogt.index_char2 = G_LOCK_LINE_ENTITY
4948 ) base,
4949 (SELECT ppdr.entity_id,
4950 ppdr.draft_id,
4951 po_price_diff_p_lock_attrs(
4952 NVL(ppdr.price_differential_num ,G_NULL_NUM),
4953 NVL(ppdr.multiplier ,G_NULL_NUM),
4954 NVL(ppdr.enabled_flag ,G_NULL_CHAR),
4955 NVL(ppdr.min_multiplier ,G_NULL_NUM),
4956 NVL(ppdr.max_multiplier ,G_NULL_NUM)
4957 ) p_lock_attrs,
4958 ppdr.price_differential_id
4959 FROM po_price_diff_draft ppdr,
4960 po_session_gt pogt
4961 WHERE ppdr.draft_id = p_draft_id
4962 AND ppdr.entity_id = pogt.char1 -- po_header_id
4963 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
4964 AND pogt.index_char2 = G_LOCK_LINE_ENTITY
4965 ) draft
4966 WHERE base.price_differential_id = draft.price_differential_id
4967 AND base.p_lock_attrs <> draft.p_lock_attrs;
4968
4969 d_position:=50;
4970 IF (PO_LOG.d_stmt) THEN
4971 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
4972 PO_LOG.stmt(d_module,d_position ,'number of rows Inserted ',SQL%ROWCOUNT);
4973 END IF;
4974
4975 -- if new shipment is added via Mod, then lock the line as S so that another
4976 -- Mod can not take a full lock on the line.
4977 INSERT INTO po_session_gt(
4978 key,
4979 index_char1, -- records identifier
4980 index_char2, -- entity_name
4981 char1, -- entity_pk1
4982 num1, -- lock_by_draft_id
4983 char5 -- lock_type
4984 )
4985 SELECT po_session_gt_s.NEXTVAL,
4986 G_LOCKS_REQUIRED_ID,
4987 G_LOCK_LINE_ENTITY,
4988 pol.po_line_id,
4989 p_draft_id,
4990 'S'
4991 FROM po_lines_all pol,
4992 po_drafts dft
4993 WHERE EXISTS ( SELECT line_location_id -- new shipment added
4994 FROM po_line_locations_draft_all poll_draft
4995 WHERE poll_draft.po_line_id = pol.po_line_id
4996 AND poll_draft.draft_id = p_draft_id
4997 MINUS
4998 SELECT line_location_id
4999 FROM po_line_locations_all poll_base
5000 WHERE poll_base.po_line_id = pol.po_line_id
5001 )
5002 AND pol.po_header_id = dft.document_id
5003 AND dft.draft_id = p_draft_id;
5004
5005 -- if new distribution is added via Mod, then lock the line as S so that
5006 -- another Mod can not take a full lock on the line.
5007 INSERT INTO po_session_gt(
5008 key,
5009 index_char1, -- records identifier
5010 index_char2, -- entity_name
5011 char1, -- entity_pk1
5012 num1, -- lock_by_draft_id
5013 char5 -- lock_type
5014 )
5015 SELECT po_session_gt_s.NEXTVAL,
5016 G_LOCKS_REQUIRED_ID,
5017 G_LOCK_LINE_ENTITY,
5018 pol.po_line_id,
5019 p_draft_id,
5020 'S'
5021 FROM po_lines_all pol,
5022 po_drafts dft
5023 WHERE EXISTS ( SELECT po_distribution_id -- new distribution added
5024 FROM po_distributions_draft_all pod_draft
5025 WHERE pod_draft.po_line_id = pol.po_line_id
5026 AND pod_draft.draft_id = p_draft_id
5027 MINUS
5028 SELECT po_distribution_id
5029 FROM po_distributions_all pod_base
5030 WHERE pod_base.po_line_id = pol.po_line_id
5031 )
5032 AND pol.po_header_id = dft.document_id
5033 AND dft.draft_id = p_draft_id;
5034
5035
5036 IF (PO_LOG.d_proc) THEN
5037 PO_LOG.proc_end(d_module);
5038 END IF;
5039
5040 EXCEPTION
5041 WHEN OTHERS THEN
5042 IF (PO_LOG.d_exc) THEN
5043 PO_LOG.exc(d_module,d_position,SQLCODE || SQLERRM);
5044 END IF;
5045 RAISE;
5046 END identify_line_locks;
5047
5048
5049 --------------------------------------------------------------------------------
5050 --Start of Comments
5051 --Name: identify_shipment_locks
5052 -- <Conc Mods Project>
5053 --Pre-reqs: None
5054 --Modifies:
5055 -- po_entity_locks
5056 --Locks:
5057 -- po_line_locations_all, locks because of line F lock.
5058 --Function:
5059 -- This procedure generates the change data for the passed entities PKs,
5060 -- creates entries in po_entity_locks table corresponding to the modified
5061 -- attributes, and locks the required rows in transaction tables.
5062 --Parameters:
5063 --IN:
5064 --p_draft_id
5065 -- draft id of the current Modification - Award/IDV
5066 --Notes:
5067 --End of Comments
5068 --------------------------------------------------------------------------------
5069 PROCEDURE identify_shipment_locks(
5070 p_draft_id IN NUMBER
5071 )
5072 IS
5073 d_api_name CONSTANT VARCHAR2(30) := 'identify_shipment_locks';
5074 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
5075 d_position NUMBER;
5076
5077 BEGIN
5078 d_position:=0;
5079 IF (PO_LOG.d_proc) THEN
5080 PO_LOG.proc_begin(d_module);
5081 PO_LOG.proc_begin(d_module, 'p_draft_id', p_draft_id);
5082 END IF;
5083
5084 -- Identify Shipment level locks required and insert into gt table
5085 INSERT INTO po_session_gt(
5086 key,
5087 index_char1, -- records identifier
5088 index_char2, -- entity_name
5089 char1, -- entity_pk1
5090 num1, -- lock_by_draft_id
5091 char5 -- lock_type
5092 )
5093 SELECT po_session_gt_s.NEXTVAL,
5094 G_LOCKS_REQUIRED_ID,
5095 G_LOCK_SHIPMENT_ENTITY,
5096 draft.line_location_id,
5097 draft.draft_id,
5098 CASE
5099 WHEN base.f_lock_attrs <> draft.f_lock_attrs THEN 'F'
5100 WHEN base.p_lock_attrs <> draft.p_lock_attrs THEN 'P'
5101 WHEN base.s_lock_attrs <> draft.s_lock_attrs THEN 'S'
5102 ELSE NULL
5103 END lock_type
5104 FROM (SELECT poll.line_location_id,
5105 G_DRAFT_ID_MINUS_1 draft_id,
5106 po_line_loc_mod_s_lock_attrs(
5107 NVL(poll.quantity, G_NULL_NUM),
5108 NVL(poll.secondary_quantity, G_NULL_NUM),
5109 NVL(poll.amount, G_NULL_NUM)
5110 ) s_lock_attrs,
5111 po_line_loc_mod_p_lock_attrs(
5112 NVL(poll.need_by_date ,G_NULL_DATE),
5113 NVL(poll.promised_date ,G_NULL_DATE),
5114 NVL(poll.clm_period_perf_start_date ,G_NULL_DATE),
5115 NVL(poll.clm_period_perf_end_date ,G_NULL_DATE),
5116 NVL(poll.days_early_receipt_allowed ,G_NULL_NUM),
5117 NVL(poll.days_late_receipt_allowed ,G_NULL_NUM),
5118 NVL(poll.receipt_days_exception_code ,G_NULL_CHAR),
5119 NVL(poll.allow_substitute_receipts_flag ,G_NULL_CHAR),
5120 NVL(poll.receive_close_tolerance ,G_NULL_NUM),
5121 NVL(poll.qty_rcv_tolerance ,G_NULL_NUM),
5122 NVL(poll.qty_rcv_exception_code ,G_NULL_CHAR),
5123 NVL(poll.receiving_routing_id ,G_NULL_NUM),
5124 NVL(poll.enforce_ship_to_location_code ,G_NULL_CHAR),
5125 NVL(poll.note_to_receiver ,G_NULL_CHAR),
5126 NVL(poll.vmi_flag ,G_NULL_CHAR),
5127 NVL(poll.consigned_flag ,G_NULL_CHAR),
5128 NVL(poll.preferred_grade ,G_NULL_CHAR),
5129 NVL(poll.country_of_origin_code ,G_NULL_CHAR),
5130 NVL(poll.encumbered_flag ,G_NULL_CHAR),
5131 NVL(poll.firm_status_lookup_code ,G_NULL_CHAR),
5132 NVL(poll.attribute_category ,G_NULL_CHAR),
5133 NVL(poll.attribute1 ,G_NULL_CHAR),
5134 NVL(poll.attribute2 ,G_NULL_CHAR),
5135 NVL(poll.attribute3 ,G_NULL_CHAR),
5136 NVL(poll.attribute4 ,G_NULL_CHAR),
5137 NVL(poll.attribute5 ,G_NULL_CHAR),
5138 NVL(poll.attribute6 ,G_NULL_CHAR),
5139 NVL(poll.attribute7 ,G_NULL_CHAR),
5140 NVL(poll.attribute8 ,G_NULL_CHAR),
5141 NVL(poll.attribute9 ,G_NULL_CHAR),
5142 NVL(poll.attribute10 ,G_NULL_CHAR),
5143 NVL(poll.attribute11 ,G_NULL_CHAR),
5144 NVL(poll.attribute12 ,G_NULL_CHAR),
5145 NVL(poll.attribute13 ,G_NULL_CHAR),
5146 NVL(poll.attribute14 ,G_NULL_CHAR),
5147 NVL(poll.attribute15 ,G_NULL_CHAR),
5148 NVL(poll.accrue_on_receipt_flag ,G_NULL_CHAR),
5149 NVL(poll.match_option ,G_NULL_CHAR),
5150 NVL(poll.invoice_close_tolerance ,G_NULL_NUM),
5151 NVL(poll.payment_type ,G_NULL_CHAR),
5152 NVL(poll.price_override ,G_NULL_NUM),
5153 NVL(poll.description ,G_NULL_CHAR),
5154 NVL(poll.inspection_required_flag ,G_NULL_CHAR ),--bug-13571320
5155 NVL(poll.receipt_required_flag ,G_NULL_CHAR )--bug-13571320
5156 ) p_lock_attrs,
5157 po_line_loc_mod_f_lock_attrs(
5158 NVL(poll.ship_to_location_id ,G_NULL_NUM),
5159 NVL(poll.ship_to_organization_id ,G_NULL_NUM),
5160 NVL(poll.unit_meas_lookup_code, G_NULL_CHAR),
5161 NVL(poll.transaction_flow_header_id ,G_NULL_NUM)
5162 ) f_lock_attrs
5163 FROM po_line_locations_all poll,
5164 po_session_gt pogt
5165 WHERE poll.line_location_id = pogt.char1 -- po_line_id
5166 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
5167 AND pogt.index_char2 = G_LOCK_SHIPMENT_ENTITY
5168 AND poll.shipment_type <> 'PRICE BREAK'
5169 ) base,
5170 (SELECT polld.line_location_id,
5171 polld.draft_id,
5172 po_line_loc_mod_s_lock_attrs(
5173 NVL(polld.quantity, G_NULL_NUM),
5174 NVL(polld.secondary_quantity, G_NULL_NUM),
5175 NVL(polld.amount, G_NULL_NUM)
5176 ) s_lock_attrs,
5177 po_line_loc_mod_p_lock_attrs(
5178 NVL(polld.need_by_date ,G_NULL_DATE),
5179 NVL(polld.promised_date ,G_NULL_DATE),
5180 NVL(polld.clm_period_perf_start_date ,G_NULL_DATE),
5181 NVL(polld.clm_period_perf_end_date ,G_NULL_DATE),
5182 NVL(polld.days_early_receipt_allowed ,G_NULL_NUM),
5183 NVL(polld.days_late_receipt_allowed ,G_NULL_NUM),
5184 NVL(polld.receipt_days_exception_code ,G_NULL_CHAR),
5185 NVL(polld.allow_substitute_receipts_flag ,G_NULL_CHAR),
5186 NVL(polld.receive_close_tolerance ,G_NULL_NUM),
5187 NVL(polld.qty_rcv_tolerance ,G_NULL_NUM),
5188 NVL(polld.qty_rcv_exception_code ,G_NULL_CHAR),
5189 NVL(polld.receiving_routing_id ,G_NULL_NUM),
5190 NVL(polld.enforce_ship_to_location_code ,G_NULL_CHAR),
5191 NVL(polld.note_to_receiver ,G_NULL_CHAR),
5192 NVL(polld.vmi_flag ,G_NULL_CHAR),
5193 NVL(polld.consigned_flag ,G_NULL_CHAR),
5194 NVL(polld.preferred_grade ,G_NULL_CHAR),
5195 NVL(polld.country_of_origin_code ,G_NULL_CHAR),
5196 NVL(polld.encumbered_flag ,G_NULL_CHAR),
5197 NVL(polld.firm_status_lookup_code ,G_NULL_CHAR),
5198 NVL(polld.attribute_category ,G_NULL_CHAR),
5199 NVL(polld.attribute1 ,G_NULL_CHAR),
5200 NVL(polld.attribute2 ,G_NULL_CHAR),
5201 NVL(polld.attribute3 ,G_NULL_CHAR),
5202 NVL(polld.attribute4 ,G_NULL_CHAR),
5203 NVL(polld.attribute5 ,G_NULL_CHAR),
5204 NVL(polld.attribute6 ,G_NULL_CHAR),
5205 NVL(polld.attribute7 ,G_NULL_CHAR),
5206 NVL(polld.attribute8 ,G_NULL_CHAR),
5207 NVL(polld.attribute9 ,G_NULL_CHAR),
5208 NVL(polld.attribute10 ,G_NULL_CHAR),
5209 NVL(polld.attribute11 ,G_NULL_CHAR),
5210 NVL(polld.attribute12 ,G_NULL_CHAR),
5211 NVL(polld.attribute13 ,G_NULL_CHAR),
5212 NVL(polld.attribute14 ,G_NULL_CHAR),
5213 NVL(polld.attribute15 ,G_NULL_CHAR),
5214 NVL(polld.accrue_on_receipt_flag ,G_NULL_CHAR),
5215 NVL(polld.match_option ,G_NULL_CHAR),
5216 NVL(polld.invoice_close_tolerance ,G_NULL_NUM),
5217 NVL(polld.payment_type ,G_NULL_CHAR),
5218 NVL(polld.price_override ,G_NULL_NUM),
5219 NVL(polld.description ,G_NULL_CHAR),
5220 NVL(polld.inspection_required_flag ,G_NULL_CHAR ),-- bug13571320
5221 NVL(polld.receipt_required_flag ,G_NULL_CHAR )-- bug13571320
5222 ) p_lock_attrs,
5223 po_line_loc_mod_f_lock_attrs(
5224 NVL(polld.ship_to_location_id ,G_NULL_NUM),
5225 NVL(polld.ship_to_organization_id ,G_NULL_NUM),
5226 NVL(polld.unit_meas_lookup_code, G_NULL_CHAR),
5227 NVL(polld.transaction_flow_header_id ,G_NULL_NUM)
5228 ) f_lock_attrs
5229 FROM po_line_locations_draft_all polld,
5230 po_session_gt pogt
5231 WHERE polld.draft_id = p_draft_id
5232 AND polld.line_location_id = pogt.char1 -- line_location_id
5233 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
5234 AND pogt.index_char2 = G_LOCK_SHIPMENT_ENTITY
5235 AND polld.shipment_type <> 'PRICE BREAK'
5236 ) draft
5237 WHERE base.line_location_id = draft.line_location_id
5238 AND (base.f_lock_attrs <> draft.f_lock_attrs
5239 OR base.p_lock_attrs <> draft.p_lock_attrs
5240 OR base.s_lock_attrs <> draft.s_lock_attrs);
5241
5242 d_position:=10;
5243 IF (PO_LOG.d_stmt) THEN
5244 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
5245 PO_LOG.stmt(d_module,d_position ,'number of rows Updated ',SQL%ROWCOUNT);
5246 END IF;
5247
5248 -- If the Line is F locked, then lock the shipment as F
5249 -- Here we need to consider two cases:
5250 -- 1. When the line is changed in the currest request
5251 -- 2. When the line is changed in earlier request and already locked, and
5252 -- not changed in current request.
5253 INSERT INTO po_session_gt(
5254 key,
5255 index_char1, -- records identifier
5256 index_char2, -- entity_name
5257 char1, -- entity_pk1
5258 num1, -- lock_by_draft_id
5259 char5 -- lock_type
5260 )
5261 SELECT po_session_gt_s.NEXTVAL,
5262 G_LOCKS_REQUIRED_ID,
5263 G_LOCK_SHIPMENT_ENTITY,
5264 poll.line_location_id,
5265 p_draft_id,
5266 'F'
5267 FROM po_line_locations_all poll,
5268 po_drafts dft
5269 WHERE poll.po_header_id = dft.document_id
5270 AND dft.draft_id = p_draft_id
5271 AND (EXISTS (SELECT 'Line is modified in current txn and requires F lock'
5272 FROM po_session_gt pol_lcks
5273 WHERE pol_lcks.index_char1 = G_LOCKS_REQUIRED_ID
5274 AND pol_lcks.index_char2 = G_LOCK_LINE_ENTITY
5275 AND pol_lcks.char5 = 'F' -- lock_type
5276 AND poll.po_line_id = pol_lcks.char1) -- entity_pk1
5277 OR EXISTS (SELECT 'Line is already F locked and not modified in current txn'
5278 FROM po_entity_locks poel,
5279 po_session_gt poll_ch
5280 WHERE poel.entity_name = G_LOCK_LINE_ENTITY
5281 AND poel.lock_type = 'F'
5282 AND poel.entity_pk1 = poll.po_line_id
5283 AND poll_ch.index_char1 = G_CHANGED_ENTTIES_ID
5284 AND poll_ch.index_char2 = G_LOCK_SHIPMENT_ENTITY -- entity_name
5285 AND poll_ch.char1 = poll.line_location_id -- entity_pk1
5286 AND NOT EXISTS (SELECT 'Line modified in current txn'
5287 FROM po_session_gt pol_ch
5288 WHERE pol_ch.index_char1 = G_CHANGED_ENTTIES_ID
5289 AND pol_ch.index_char2 = G_LOCK_LINE_ENTITY -- entity_name
5290 AND pol_ch.char1 = poel.entity_pk1) -- entity_pk1
5291 )
5292 );
5293
5294 d_position:=20;
5295 IF (PO_LOG.d_stmt) THEN
5296 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
5297 PO_LOG.stmt(d_module,d_position ,'number of rows Inserted ',SQL%ROWCOUNT);
5298 END IF;
5299
5300 d_position:=30;
5301 IF (PO_LOG.d_proc) THEN
5302 PO_LOG.proc_end(d_module);
5303 END IF;
5304
5305 EXCEPTION
5306 WHEN OTHERS THEN
5307 IF (PO_LOG.d_exc) THEN
5308 PO_LOG.exc(d_module,d_position,SQLCODE || SQLERRM);
5309 END IF;
5310 RAISE;
5311
5312 END identify_shipment_locks;
5313
5314
5315 --------------------------------------------------------------------------------
5316 --Start of Comments
5317 --Name: identify_dist_locks
5318 -- <Conc Mods Project>
5319 --Pre-reqs: None
5320 --Modifies:
5321 -- po_entity_locks
5322 --Locks:
5323 -- po_distributions_all, locks because of line/shipment F lock
5324 --Function:
5325 -- This procedure generates the change data for the passed entities PKs,
5326 -- creates entries in po_entity_locks table corresponding to the modified
5327 -- attributes, and locks the required rows in transaction tables.
5328 --Parameters:
5329 --IN:
5330 --p_draft_id
5331 -- draft id of the current Modification - Award/IDV
5332 --Notes:
5333 --End of Comments
5334 --------------------------------------------------------------------------------
5335 PROCEDURE identify_dist_locks(
5336 p_draft_id IN NUMBER
5337 )
5338 IS
5339 d_api_name CONSTANT VARCHAR2(30) := 'identify_dist_locks';
5340 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
5341 d_position NUMBER;
5342
5343 BEGIN
5344 d_position:=0;
5345 IF (PO_LOG.d_proc) THEN
5346 PO_LOG.proc_begin(d_module);
5347 PO_LOG.proc_begin(d_module, 'p_draft_id', p_draft_id);
5348 END IF;
5349
5350 -- Identify Distribution level locks required and insert into gt table
5351 INSERT INTO po_session_gt(
5352 key,
5353 index_char1, -- records identifier
5354 index_char2, -- entity_name
5355 char1, -- entity_pk1
5356 num1, -- lock_by_draft_id
5357 char5 -- lock_type
5358 )
5359 SELECT po_session_gt_s.NEXTVAL,
5360 G_LOCKS_REQUIRED_ID,
5361 G_LOCK_DIST_ENTITY,
5362 draft.po_distribution_id,
5363 draft.draft_id,
5364 CASE
5365 WHEN base.f_lock_attrs <> draft.f_lock_attrs THEN 'F'
5366 WHEN base.p_lock_attrs <> draft.p_lock_attrs THEN 'P'
5367 WHEN base.s_lock_attrs <> draft.s_lock_attrs THEN 'S'
5368 ELSE NULL
5369 END lock_type
5370 FROM (SELECT pod.po_distribution_id,
5371 G_DRAFT_ID_MINUS_1 draft_id,
5372 po_dist_mod_s_lock_attrs(
5373 NVL(pod.funded_value ,G_NULL_NUM),
5374 NVL(pod.quantity_ordered ,G_NULL_NUM),
5375 NVL(pod.amount_ordered ,G_NULL_NUM)
5376 ) s_lock_attrs,
5377 po_dist_mod_p_lock_attrs(
5378 NVL(pod.clm_defence_funding ,G_NULL_CHAR),
5379 NVL(pod.gl_encumbered_date ,G_NULL_DATE),
5380 NVL(pod.deliver_to_person_id ,G_NULL_NUM),
5381 NVL(pod.deliver_to_location_id ,G_NULL_NUM),
5382 NVL(pod.req_header_reference_num ,G_NULL_NUM),
5383 NVL(pod.req_line_reference_num ,G_NULL_NUM),
5384 NVL(pod.wip_operation_seq_num ,G_NULL_NUM),
5385 NVL(pod.wip_resource_seq_num ,G_NULL_NUM),
5386 NVL(pod.clm_misc_loa ,G_NULL_CHAR),
5387 NVL(pod.clm_fms_case_number ,G_NULL_CHAR),
5388 NVL(pod.clm_agency_acct_identifier ,G_NULL_CHAR),
5389 NVL(pod.dest_charge_account_id ,G_NULL_NUM),
5390 NVL(pod.code_combination_id ,G_NULL_NUM),
5391 NVL(pod.recovery_rate ,G_NULL_NUM),
5392 NVL(pod.project_id ,G_NULL_NUM),
5393 NVL(pod.task_id ,G_NULL_NUM),
5394 NVL(pod.award_id ,G_NULL_NUM),
5395 NVL(pod.expenditure_type ,G_NULL_CHAR),
5396 NVL(pod.expenditure_organization_id ,G_NULL_NUM),
5397 NVL(pod.expenditure_item_date ,G_NULL_DATE),
5398 NVL(pod.end_item_unit_number ,G_NULL_CHAR),
5399 NVL(pod.oke_contract_line_id ,G_NULL_NUM),
5400 NVL(pod.oke_contract_deliverable_id ,G_NULL_NUM),
5401 NVL(pod.attribute_category ,G_NULL_CHAR),
5402 NVL(pod.attribute1 ,G_NULL_CHAR),
5403 NVL(pod.attribute2 ,G_NULL_CHAR),
5404 NVL(pod.attribute3 ,G_NULL_CHAR),
5405 NVL(pod.attribute4 ,G_NULL_CHAR),
5406 NVL(pod.attribute5 ,G_NULL_CHAR),
5407 NVL(pod.attribute6 ,G_NULL_CHAR),
5408 NVL(pod.attribute7 ,G_NULL_CHAR),
5409 NVL(pod.attribute8 ,G_NULL_CHAR),
5410 NVL(pod.attribute9 ,G_NULL_CHAR),
5411 NVL(pod.attribute10 ,G_NULL_CHAR),
5412 NVL(pod.attribute11 ,G_NULL_CHAR),
5413 NVL(pod.attribute12 ,G_NULL_CHAR),
5414 NVL(pod.attribute13 ,G_NULL_CHAR),
5415 NVL(pod.attribute14 ,G_NULL_CHAR),
5416 NVL(pod.attribute15 ,G_NULL_CHAR),
5417 NVL(pod.clm_payment_sequence_num ,G_NULL_NUM)
5418 ) p_lock_attrs,
5419 po_dist_mod_f_lock_attrs(
5420 NVL(pod.partial_funded_flag ,G_NULL_CHAR),
5421 NVL(pod.destination_type_code ,G_NULL_CHAR),
5422 NVL(pod.destination_subinventory ,G_NULL_CHAR)
5423 ) f_lock_attrs
5424 FROM po_distributions_all pod,
5425 po_session_gt pogt
5426 WHERE pod.po_distribution_id = pogt.char1 -- po_line_id
5427 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
5428 AND pogt.index_char2 = G_LOCK_DIST_ENTITY
5429 ) base,
5430 (SELECT podd.po_distribution_id,
5431 podd.draft_id,
5432 po_dist_mod_s_lock_attrs(
5433 NVL(podd.funded_value ,G_NULL_NUM),
5434 NVL(podd.quantity_ordered,G_NULL_NUM),
5435 NVL(podd.amount_ordered ,G_NULL_NUM)
5436 ) s_lock_attrs,
5437 po_dist_mod_p_lock_attrs(
5438 NVL(podd.clm_defence_funding ,G_NULL_CHAR),
5439 NVL(podd.gl_encumbered_date ,G_NULL_DATE),
5440 NVL(podd.deliver_to_person_id ,G_NULL_NUM),
5441 NVL(podd.deliver_to_location_id ,G_NULL_NUM),
5442 NVL(podd.req_header_reference_num ,G_NULL_NUM),
5443 NVL(podd.req_line_reference_num ,G_NULL_NUM),
5444 NVL(podd.wip_operation_seq_num ,G_NULL_NUM),
5445 NVL(podd.wip_resource_seq_num ,G_NULL_NUM),
5446 NVL(podd.clm_misc_loa ,G_NULL_CHAR),
5447 NVL(podd.clm_fms_case_number ,G_NULL_CHAR),
5448 NVL(podd.clm_agency_acct_identifier ,G_NULL_CHAR),
5449 NVL(podd.dest_charge_account_id ,G_NULL_NUM),
5450 NVL(podd.code_combination_id ,G_NULL_NUM),
5451 NVL(podd.recovery_rate ,G_NULL_NUM),
5452 NVL(podd.project_id ,G_NULL_NUM),
5453 NVL(podd.task_id ,G_NULL_NUM),
5454 NVL(podd.award_id ,G_NULL_NUM),
5455 NVL(podd.expenditure_type ,G_NULL_CHAR),
5456 NVL(podd.expenditure_organization_id ,G_NULL_NUM),
5457 NVL(podd.expenditure_item_date ,G_NULL_DATE),
5458 NVL(podd.end_item_unit_number ,G_NULL_CHAR),
5459 NVL(podd.oke_contract_line_id ,G_NULL_NUM),
5460 NVL(podd.oke_contract_deliverable_id ,G_NULL_NUM),
5461 NVL(podd.attribute_category ,G_NULL_CHAR),
5462 NVL(podd.attribute1 ,G_NULL_CHAR),
5463 NVL(podd.attribute2 ,G_NULL_CHAR),
5464 NVL(podd.attribute3 ,G_NULL_CHAR),
5465 NVL(podd.attribute4 ,G_NULL_CHAR),
5466 NVL(podd.attribute5 ,G_NULL_CHAR),
5467 NVL(podd.attribute6 ,G_NULL_CHAR),
5468 NVL(podd.attribute7 ,G_NULL_CHAR),
5469 NVL(podd.attribute8 ,G_NULL_CHAR),
5470 NVL(podd.attribute9 ,G_NULL_CHAR),
5471 NVL(podd.attribute10 ,G_NULL_CHAR),
5472 NVL(podd.attribute11 ,G_NULL_CHAR),
5473 NVL(podd.attribute12 ,G_NULL_CHAR),
5474 NVL(podd.attribute13 ,G_NULL_CHAR),
5475 NVL(podd.attribute14 ,G_NULL_CHAR),
5476 NVL(podd.attribute15 ,G_NULL_CHAR),
5477 NVL(podd.clm_payment_sequence_num ,G_NULL_NUM)
5478 ) p_lock_attrs,
5479 po_dist_mod_f_lock_attrs(
5480 NVL(podd.partial_funded_flag ,G_NULL_CHAR),
5481 NVL(podd.destination_type_code ,G_NULL_CHAR),
5482 NVL(podd.destination_subinventory ,G_NULL_CHAR)
5483 ) f_lock_attrs
5484 FROM po_distributions_draft_all podd,
5485 po_session_gt pogt
5486 WHERE podd.draft_id = p_draft_id
5487 AND podd.po_distribution_id = pogt.char1 -- po_distribution_id
5488 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
5489 AND pogt.index_char2 = G_LOCK_DIST_ENTITY
5490 ) draft
5491 WHERE base.po_distribution_id = draft.po_distribution_id
5492 AND (base.f_lock_attrs <> draft.f_lock_attrs
5493 OR base.p_lock_attrs <> draft.p_lock_attrs
5494 OR base.s_lock_attrs <> draft.s_lock_attrs);
5495
5496
5497 d_position:=10;
5498 IF (PO_LOG.d_stmt) THEN
5499 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
5500 PO_LOG.stmt(d_module,d_position ,'number of rows Updated ',SQL%ROWCOUNT);
5501 END IF;
5502
5503 -- If the Line is F locked, then lock the Distribution as F
5504 -- Here we need to consider four cases:
5505 -- 1. When the line is changed in the currest request
5506 -- 2. When the line is changed in earlier request and already locked, and
5507 -- not changed in current request.
5508 -- 3. When the shipment is changed in the currest request
5509 -- 4. When the shipment is changed in earlier request and already locked, and
5510 -- not changed in current request.
5511 INSERT INTO po_session_gt(
5512 key,
5513 index_char1, -- records identifier
5514 index_char2, -- entity_name
5515 char1, -- entity_pk1
5516 num1, -- lock_by_draft_id
5517 char5 -- lock_type
5518 )
5519 SELECT po_session_gt_s.NEXTVAL,
5520 G_LOCKS_REQUIRED_ID,
5521 G_LOCK_DIST_ENTITY,
5522 pod.po_distribution_id,
5523 p_draft_id,
5524 'F'
5525 FROM po_distributions_all pod,
5526 po_drafts dft
5527 WHERE pod.po_header_id = dft.document_id
5528 AND dft.draft_id = p_draft_id
5529 AND (EXISTS (SELECT 'Line is modified in current txn and requires F lock'
5530 FROM po_session_gt pol_lcks
5531 WHERE pol_lcks.index_char1 = G_LOCKS_REQUIRED_ID
5532 AND pol_lcks.index_char2 = G_LOCK_LINE_ENTITY
5533 AND pol_lcks.char5 = 'F' -- lock_type
5534 AND pod.po_line_id = pol_lcks.char1) -- entity_pk1
5535 OR EXISTS (SELECT 'Line is already F locked and not modified in current txn'
5536 FROM po_entity_locks poel,
5537 po_session_gt pod_ch
5538 WHERE poel.entity_name = G_LOCK_LINE_ENTITY
5539 AND poel.lock_type = 'F'
5540 AND poel.entity_pk1 = pod.po_line_id
5541 AND pod_ch.index_char1 = G_CHANGED_ENTTIES_ID
5542 AND pod_ch.index_char2 = G_LOCK_DIST_ENTITY -- entity_name
5543 AND pod_ch.char1 = pod.po_distribution_id -- entity_pk1
5544 AND NOT EXISTS (SELECT 'Line modified in current txn'
5545 FROM po_session_gt pol_ch
5546 WHERE pol_ch.index_char1 = G_CHANGED_ENTTIES_ID
5547 AND pol_ch.index_char2 = G_LOCK_LINE_ENTITY -- entity_name
5548 AND pol_ch.char1 = poel.entity_pk1) -- entity_pk1
5549 )
5550 OR EXISTS (SELECT 'shipment is modified in current txn and requires F lock'
5551 FROM po_session_gt poll_lcks
5552 WHERE poll_lcks.index_char1 = G_LOCKS_REQUIRED_ID
5553 AND poll_lcks.index_char2 = G_LOCK_SHIPMENT_ENTITY
5554 AND poll_lcks.char5 = 'F' -- lock_type
5555 AND pod.line_location_id = poll_lcks.char1) -- entity_pk1
5556 OR EXISTS (SELECT 'Shipment is already F locked and not modified in current txn'
5557 FROM po_entity_locks poel,
5558 po_session_gt pod_ch
5559 WHERE poel.entity_name = G_LOCK_SHIPMENT_ENTITY
5560 AND poel.lock_type = 'F'
5561 AND poel.entity_pk1 = pod.line_location_id
5562 AND pod_ch.index_char1 = G_CHANGED_ENTTIES_ID
5563 AND pod_ch.index_char2 = G_LOCK_DIST_ENTITY -- entity_name
5564 AND pod_ch.char1 = pod.po_distribution_id -- entity_pk1
5565 AND NOT EXISTS (SELECT 'Shipment modified in current txn'
5566 FROM po_session_gt poll_ch
5567 WHERE poll_ch.index_char1 = G_CHANGED_ENTTIES_ID
5568 AND poll_ch.index_char2 = G_LOCK_SHIPMENT_ENTITY -- entity_name
5569 AND poll_ch.char1 = poel.entity_pk1) -- entity_pk1
5570 )
5571 );
5572
5573
5574 d_position:=20;
5575 IF (PO_LOG.d_stmt) THEN
5576 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
5577 PO_LOG.stmt(d_module,d_position ,'number of rows Inserted ',SQL%ROWCOUNT);
5578 END IF;
5579 d_position:=30;
5580 IF (PO_LOG.d_proc) THEN
5581 PO_LOG.proc_end(d_module);
5582 END IF;
5583
5584 EXCEPTION
5585 WHEN OTHERS THEN
5586 IF (PO_LOG.d_exc) THEN
5587 PO_LOG.exc(d_module,d_position,SQLCODE || SQLERRM);
5588 END IF;
5589 RAISE;
5590 END identify_dist_locks;
5591
5592
5593 --------------------------------------------------------------------------------
5594 --Start of Comments
5595 --Name: identify_uda_header_locks
5596 -- <Conc Mods Project>
5597 --Pre-reqs: None
5598 --Modifies:
5599 -- po_entity_locks
5600 --Locks:
5601 -- po_headers_all_ext_b, header multi-row, po_headers_all_ext_tl, addresses
5602 --Function:
5603 -- This procedure generates the change data for the passed entities PKs,
5604 -- creates entries in po_entity_locks table corresponding to the modified
5605 -- attributes, and locks the required rows in transaction tables.
5606 --Parameters:
5607 --IN:
5608 --p_draft_id
5609 -- draft id of the current Modification - Award/IDV
5610 --Notes:
5611 --End of Comments
5612 --------------------------------------------------------------------------------
5613 PROCEDURE identify_uda_header_locks(
5614 p_draft_id IN NUMBER
5615 )
5616 IS
5617 d_api_name CONSTANT VARCHAR2(30) := 'identify_uda_header_locks';
5618 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
5619 d_position NUMBER;
5620 l_po_header_id NUMBER;
5621 BEGIN
5622
5623 d_position:=0;
5624 IF (PO_LOG.d_proc) THEN
5625 PO_LOG.proc_begin(d_module);
5626 PO_LOG.proc_begin(d_module, 'p_draft_id', p_draft_id);
5627 END IF;
5628
5629 -- Identify Header level locks required because of change in po_headers_all_ext_b
5630 INSERT INTO po_session_gt(
5631 key,
5632 index_char1, -- records identifier
5633 index_char2, -- entity_name
5634 char1, -- entity_pk1
5635 num1, -- lock_by_draft_id
5636 char5 -- lock_type
5637 )
5638 SELECT po_session_gt_s.NEXTVAL,
5639 G_LOCKS_REQUIRED_ID,
5640 G_LOCK_HEADER_ENTITY,
5641 draft.po_header_id,
5642 draft.draft_id,
5643 CASE
5644 WHEN base.p_lock_attrs <> draft.p_lock_attrs THEN 'P'
5645 ELSE NULL
5646 END lock_type
5647 FROM (SELECT phb.po_header_id,
5648 phb.draft_id,
5649 po_uda_mod_p_lock_attrs(
5650 NVL(phb.c_ext_attr1 ,G_NULL_CHAR),
5651 NVL(phb.c_ext_attr2 ,G_NULL_CHAR),
5652 NVL(phb.c_ext_attr3 ,G_NULL_CHAR),
5653 NVL(phb.c_ext_attr4 ,G_NULL_CHAR),
5654 NVL(phb.c_ext_attr5 ,G_NULL_CHAR),
5655 NVL(phb.c_ext_attr6 ,G_NULL_CHAR),
5656 NVL(phb.c_ext_attr7 ,G_NULL_CHAR),
5657 NVL(phb.c_ext_attr8 ,G_NULL_CHAR),
5658 NVL(phb.c_ext_attr9 ,G_NULL_CHAR),
5659 NVL(phb.c_ext_attr10 ,G_NULL_CHAR),
5660 NVL(phb.c_ext_attr11 ,G_NULL_CHAR),
5661 NVL(phb.c_ext_attr12 ,G_NULL_CHAR),
5662 NVL(phb.c_ext_attr13 ,G_NULL_CHAR),
5663 NVL(phb.c_ext_attr14 ,G_NULL_CHAR),
5664 NVL(phb.c_ext_attr15 ,G_NULL_CHAR),
5665 NVL(phb.c_ext_attr16 ,G_NULL_CHAR),
5666 NVL(phb.c_ext_attr17 ,G_NULL_CHAR),
5667 NVL(phb.c_ext_attr18 ,G_NULL_CHAR),
5668 NVL(phb.c_ext_attr19 ,G_NULL_CHAR),
5669 NVL(phb.c_ext_attr20 ,G_NULL_CHAR),
5670 NVL(phb.c_ext_attr21 ,G_NULL_CHAR),
5671 NVL(phb.c_ext_attr22 ,G_NULL_CHAR),
5672 NVL(phb.c_ext_attr23 ,G_NULL_CHAR),
5673 NVL(phb.c_ext_attr24 ,G_NULL_CHAR),
5674 NVL(phb.c_ext_attr25 ,G_NULL_CHAR),
5675 NVL(phb.c_ext_attr26 ,G_NULL_CHAR),
5676 NVL(phb.c_ext_attr27 ,G_NULL_CHAR),
5677 NVL(phb.c_ext_attr28 ,G_NULL_CHAR),
5678 NVL(phb.c_ext_attr29 ,G_NULL_CHAR),
5679 NVL(phb.c_ext_attr30 ,G_NULL_CHAR),
5680 NVL(phb.c_ext_attr31 ,G_NULL_CHAR),
5681 NVL(phb.c_ext_attr32 ,G_NULL_CHAR),
5682 NVL(phb.c_ext_attr33 ,G_NULL_CHAR),
5683 NVL(phb.c_ext_attr34 ,G_NULL_CHAR),
5684 NVL(phb.c_ext_attr35 ,G_NULL_CHAR),
5685 NVL(phb.c_ext_attr36 ,G_NULL_CHAR),
5686 NVL(phb.c_ext_attr37 ,G_NULL_CHAR),
5687 NVL(phb.c_ext_attr38 ,G_NULL_CHAR),
5688 NVL(phb.c_ext_attr39 ,G_NULL_CHAR),
5689 NVL(phb.c_ext_attr40 ,G_NULL_CHAR),
5690 NVL(phb.n_ext_attr1 ,G_NULL_NUM),
5691 NVL(phb.n_ext_attr2 ,G_NULL_NUM),
5692 NVL(phb.n_ext_attr3 ,G_NULL_NUM),
5693 NVL(phb.n_ext_attr4 ,G_NULL_NUM),
5694 NVL(phb.n_ext_attr5 ,G_NULL_NUM),
5695 NVL(phb.n_ext_attr6 ,G_NULL_NUM),
5696 NVL(phb.n_ext_attr7 ,G_NULL_NUM),
5697 NVL(phb.n_ext_attr8 ,G_NULL_NUM),
5698 NVL(phb.n_ext_attr9 ,G_NULL_NUM),
5699 NVL(phb.n_ext_attr10 ,G_NULL_NUM),
5700 NVL(phb.n_ext_attr11 ,G_NULL_NUM),
5701 NVL(phb.n_ext_attr12 ,G_NULL_NUM),
5702 NVL(phb.n_ext_attr13 ,G_NULL_NUM),
5703 NVL(phb.n_ext_attr14 ,G_NULL_NUM),
5704 NVL(phb.n_ext_attr15 ,G_NULL_NUM),
5705 NVL(phb.n_ext_attr16 ,G_NULL_NUM),
5706 NVL(phb.n_ext_attr17 ,G_NULL_NUM),
5707 NVL(phb.n_ext_attr18 ,G_NULL_NUM),
5708 NVL(phb.n_ext_attr19 ,G_NULL_NUM),
5709 NVL(phb.n_ext_attr20 ,G_NULL_NUM),
5710 NVL(phb.uom_ext_attr1 ,G_NULL_CHAR),
5711 NVL(phb.uom_ext_attr2 ,G_NULL_CHAR),
5712 NVL(phb.uom_ext_attr3 ,G_NULL_CHAR),
5713 NVL(phb.uom_ext_attr4 ,G_NULL_CHAR),
5714 NVL(phb.uom_ext_attr5 ,G_NULL_CHAR),
5715 NVL(phb.uom_ext_attr6 ,G_NULL_CHAR),
5716 NVL(phb.uom_ext_attr7 ,G_NULL_CHAR),
5717 NVL(phb.uom_ext_attr8 ,G_NULL_CHAR),
5718 NVL(phb.uom_ext_attr9 ,G_NULL_CHAR),
5719 NVL(phb.uom_ext_attr10 ,G_NULL_CHAR),
5720 NVL(phb.uom_ext_attr11 ,G_NULL_CHAR),
5721 NVL(phb.uom_ext_attr12 ,G_NULL_CHAR),
5722 NVL(phb.uom_ext_attr13 ,G_NULL_CHAR),
5723 NVL(phb.uom_ext_attr14 ,G_NULL_CHAR),
5724 NVL(phb.uom_ext_attr15 ,G_NULL_CHAR),
5725 NVL(phb.uom_ext_attr16 ,G_NULL_CHAR),
5726 NVL(phb.uom_ext_attr17 ,G_NULL_CHAR),
5727 NVL(phb.uom_ext_attr18 ,G_NULL_CHAR),
5728 NVL(phb.uom_ext_attr19 ,G_NULL_CHAR),
5729 NVL(phb.uom_ext_attr20 ,G_NULL_CHAR),
5730 NVL(phb.d_ext_attr1 ,G_NULL_DATE),
5731 NVL(phb.d_ext_attr2 ,G_NULL_DATE),
5732 NVL(phb.d_ext_attr3 ,G_NULL_DATE),
5733 NVL(phb.d_ext_attr4 ,G_NULL_DATE),
5734 NVL(phb.d_ext_attr5 ,G_NULL_DATE),
5735 NVL(phb.d_ext_attr6 ,G_NULL_DATE),
5736 NVL(phb.d_ext_attr7 ,G_NULL_DATE),
5737 NVL(phb.d_ext_attr8 ,G_NULL_DATE),
5738 NVL(phb.d_ext_attr9 ,G_NULL_DATE),
5739 NVL(phb.d_ext_attr10 ,G_NULL_DATE)
5740 ) p_lock_attrs,
5741 phb.attr_group_id
5742 FROM po_headers_all_ext_b phb,
5743 po_session_gt pogt,
5744 ego_fnd_dsc_flx_ctx_ext ag
5745 WHERE phb.po_header_id = pogt.char1 -- po_header_id
5746 AND phb.draft_id = G_DRAFT_ID_MINUS_1
5747 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
5748 AND pogt.index_char2 = G_LOCK_HEADER_ENTITY
5749 AND phb.attr_group_id = ag.attr_group_id
5750 AND ag.multi_row = 'N'
5751 ) base,
5752 (SELECT phbd.po_header_id,
5753 phbd.draft_id,
5754 po_uda_mod_p_lock_attrs(
5755 NVL(phbd.c_ext_attr1 ,G_NULL_CHAR),
5756 NVL(phbd.c_ext_attr2 ,G_NULL_CHAR),
5757 NVL(phbd.c_ext_attr3 ,G_NULL_CHAR),
5758 NVL(phbd.c_ext_attr4 ,G_NULL_CHAR),
5759 NVL(phbd.c_ext_attr5 ,G_NULL_CHAR),
5760 NVL(phbd.c_ext_attr6 ,G_NULL_CHAR),
5761 NVL(phbd.c_ext_attr7 ,G_NULL_CHAR),
5762 NVL(phbd.c_ext_attr8 ,G_NULL_CHAR),
5763 NVL(phbd.c_ext_attr9 ,G_NULL_CHAR),
5764 NVL(phbd.c_ext_attr10 ,G_NULL_CHAR),
5765 NVL(phbd.c_ext_attr11 ,G_NULL_CHAR),
5766 NVL(phbd.c_ext_attr12 ,G_NULL_CHAR),
5767 NVL(phbd.c_ext_attr13 ,G_NULL_CHAR),
5768 NVL(phbd.c_ext_attr14 ,G_NULL_CHAR),
5769 NVL(phbd.c_ext_attr15 ,G_NULL_CHAR),
5770 NVL(phbd.c_ext_attr16 ,G_NULL_CHAR),
5771 NVL(phbd.c_ext_attr17 ,G_NULL_CHAR),
5772 NVL(phbd.c_ext_attr18 ,G_NULL_CHAR),
5773 NVL(phbd.c_ext_attr19 ,G_NULL_CHAR),
5774 NVL(phbd.c_ext_attr20 ,G_NULL_CHAR),
5775 NVL(phbd.c_ext_attr21 ,G_NULL_CHAR),
5776 NVL(phbd.c_ext_attr22 ,G_NULL_CHAR),
5777 NVL(phbd.c_ext_attr23 ,G_NULL_CHAR),
5778 NVL(phbd.c_ext_attr24 ,G_NULL_CHAR),
5779 NVL(phbd.c_ext_attr25 ,G_NULL_CHAR),
5780 NVL(phbd.c_ext_attr26 ,G_NULL_CHAR),
5781 NVL(phbd.c_ext_attr27 ,G_NULL_CHAR),
5782 NVL(phbd.c_ext_attr28 ,G_NULL_CHAR),
5783 NVL(phbd.c_ext_attr29 ,G_NULL_CHAR),
5784 NVL(phbd.c_ext_attr30 ,G_NULL_CHAR),
5785 NVL(phbd.c_ext_attr31 ,G_NULL_CHAR),
5786 NVL(phbd.c_ext_attr32 ,G_NULL_CHAR),
5787 NVL(phbd.c_ext_attr33 ,G_NULL_CHAR),
5788 NVL(phbd.c_ext_attr34 ,G_NULL_CHAR),
5789 NVL(phbd.c_ext_attr35 ,G_NULL_CHAR),
5790 NVL(phbd.c_ext_attr36 ,G_NULL_CHAR),
5791 NVL(phbd.c_ext_attr37 ,G_NULL_CHAR),
5792 NVL(phbd.c_ext_attr38 ,G_NULL_CHAR),
5793 NVL(phbd.c_ext_attr39 ,G_NULL_CHAR),
5794 NVL(phbd.c_ext_attr40 ,G_NULL_CHAR),
5795 NVL(phbd.n_ext_attr1 ,G_NULL_NUM),
5796 NVL(phbd.n_ext_attr2 ,G_NULL_NUM),
5797 NVL(phbd.n_ext_attr3 ,G_NULL_NUM),
5798 NVL(phbd.n_ext_attr4 ,G_NULL_NUM),
5799 NVL(phbd.n_ext_attr5 ,G_NULL_NUM),
5800 NVL(phbd.n_ext_attr6 ,G_NULL_NUM),
5801 NVL(phbd.n_ext_attr7 ,G_NULL_NUM),
5802 NVL(phbd.n_ext_attr8 ,G_NULL_NUM),
5803 NVL(phbd.n_ext_attr9 ,G_NULL_NUM),
5804 NVL(phbd.n_ext_attr10 ,G_NULL_NUM),
5805 NVL(phbd.n_ext_attr11 ,G_NULL_NUM),
5806 NVL(phbd.n_ext_attr12 ,G_NULL_NUM),
5807 NVL(phbd.n_ext_attr13 ,G_NULL_NUM),
5808 NVL(phbd.n_ext_attr14 ,G_NULL_NUM),
5809 NVL(phbd.n_ext_attr15 ,G_NULL_NUM),
5810 NVL(phbd.n_ext_attr16 ,G_NULL_NUM),
5811 NVL(phbd.n_ext_attr17 ,G_NULL_NUM),
5812 NVL(phbd.n_ext_attr18 ,G_NULL_NUM),
5813 NVL(phbd.n_ext_attr19 ,G_NULL_NUM),
5814 NVL(phbd.n_ext_attr20 ,G_NULL_NUM),
5815 NVL(phbd.uom_ext_attr1 ,G_NULL_CHAR),
5816 NVL(phbd.uom_ext_attr2 ,G_NULL_CHAR),
5817 NVL(phbd.uom_ext_attr3 ,G_NULL_CHAR),
5818 NVL(phbd.uom_ext_attr4 ,G_NULL_CHAR),
5819 NVL(phbd.uom_ext_attr5 ,G_NULL_CHAR),
5820 NVL(phbd.uom_ext_attr6 ,G_NULL_CHAR),
5821 NVL(phbd.uom_ext_attr7 ,G_NULL_CHAR),
5822 NVL(phbd.uom_ext_attr8 ,G_NULL_CHAR),
5823 NVL(phbd.uom_ext_attr9 ,G_NULL_CHAR),
5824 NVL(phbd.uom_ext_attr10 ,G_NULL_CHAR),
5825 NVL(phbd.uom_ext_attr11 ,G_NULL_CHAR),
5826 NVL(phbd.uom_ext_attr12 ,G_NULL_CHAR),
5827 NVL(phbd.uom_ext_attr13 ,G_NULL_CHAR),
5828 NVL(phbd.uom_ext_attr14 ,G_NULL_CHAR),
5829 NVL(phbd.uom_ext_attr15 ,G_NULL_CHAR),
5830 NVL(phbd.uom_ext_attr16 ,G_NULL_CHAR),
5831 NVL(phbd.uom_ext_attr17 ,G_NULL_CHAR),
5832 NVL(phbd.uom_ext_attr18 ,G_NULL_CHAR),
5833 NVL(phbd.uom_ext_attr19 ,G_NULL_CHAR),
5834 NVL(phbd.uom_ext_attr20 ,G_NULL_CHAR),
5835 NVL(phbd.d_ext_attr1 ,G_NULL_DATE),
5836 NVL(phbd.d_ext_attr2 ,G_NULL_DATE),
5837 NVL(phbd.d_ext_attr3 ,G_NULL_DATE),
5838 NVL(phbd.d_ext_attr4 ,G_NULL_DATE),
5839 NVL(phbd.d_ext_attr5 ,G_NULL_DATE),
5840 NVL(phbd.d_ext_attr6 ,G_NULL_DATE),
5841 NVL(phbd.d_ext_attr7 ,G_NULL_DATE),
5842 NVL(phbd.d_ext_attr8 ,G_NULL_DATE),
5843 nvl(phbd.d_ext_attr9 ,g_null_date),
5844 NVL(phbd.d_ext_attr10 ,G_NULL_DATE)
5845 ) p_lock_attrs,
5846 phbd.attr_group_id
5847 FROM po_headers_all_ext_b phbd,
5848 po_session_gt pogt,
5849 ego_fnd_dsc_flx_ctx_ext ag
5850 WHERE phbd.draft_id = p_draft_id
5851 AND phbd.po_header_id = pogt.char1 -- po_header_id
5852 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
5853 AND pogt.index_char2 = G_LOCK_HEADER_ENTITY
5854 AND phbd.attr_group_id = ag.attr_group_id
5855 AND ag.multi_row = 'N'
5856 ) draft
5857 WHERE base.attr_group_id = draft.attr_group_id
5858 AND base.p_lock_attrs <> draft.p_lock_attrs;
5859
5860 d_position:=10;
5861 IF (PO_LOG.d_stmt) THEN
5862 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
5863 PO_LOG.stmt(d_module,d_position ,'number of rows Updated ',SQL%ROWCOUNT);
5864 END IF;
5865
5866 SELECT document_id
5867 INTO l_po_header_id
5868 FROM po_drafts
5869 WHERE draft_id = p_draft_id;
5870
5871 -- When a UDA attribute group does not have any attribute which has default
5872 -- value and user also does not enter any attribute value, then records
5873 -- for such attribute groups are not created in po_headers_all_ext_b.
5874 -- Now if user modifies such attribute groups in Mod, then a new record is
5875 -- created with the draft_id. We need to identify such records and lock the
5876 -- header as P lock.
5877 INSERT INTO po_session_gt(
5878 key,
5879 index_char1, -- records identifier
5880 index_char2, -- entity_name
5881 char1, -- entity_pk1
5882 num1, -- lock_by_draft_id
5883 char5 -- lock_type
5884 )
5885 SELECT po_session_gt_s.NEXTVAL,
5886 G_LOCKS_REQUIRED_ID,
5887 G_LOCK_HEADER_ENTITY,
5888 phda.po_header_id,
5889 p_draft_id,
5890 'P'
5891 FROM po_headers_draft_all phda,
5892 po_session_gt pogt
5893 WHERE phda.draft_id= p_draft_id
5894 AND phda.po_header_id = pogt.char1 -- po_header_id
5895 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
5896 AND pogt.index_char2 = G_LOCK_HEADER_ENTITY
5897 AND EXISTS (SELECT draft.attr_group_id
5898 FROM po_headers_all_ext_b draft,
5899 po_uda_ag_template_usages uda_usg,
5900 ego_fnd_dsc_flx_ctx_ext ag
5901 WHERE draft.po_header_id = l_po_header_id
5902 AND draft.draft_id = p_draft_id
5903 AND draft.uda_template_id = uda_usg.template_id
5904 AND draft.attr_group_id = uda_usg.attribute_group_id
5905 AND uda_usg.attribute_category NOT IN ('DOCUMENT_NUMBERING', 'MODIFICATIONS')
5906 AND draft.attr_group_id = ag.attr_group_id
5907 AND ag.multi_row = 'N'
5908 MINUS
5909 SELECT base.attr_group_id
5910 FROM po_headers_all_ext_b base,
5911 po_uda_ag_template_usages uda_usg,
5912 ego_fnd_dsc_flx_ctx_ext ag
5913 WHERE base.po_header_id = l_po_header_id
5914 AND base.draft_id = -1
5915 AND base.uda_template_id = uda_usg.template_id
5916 AND base.attr_group_id = uda_usg.attribute_group_id
5917 AND uda_usg.attribute_category NOT IN ('DOCUMENT_NUMBERING', 'MODIFICATIONS')
5918 AND base.attr_group_id = ag.attr_group_id
5919 AND ag.multi_row = 'N'
5920 );
5921
5922 d_position:=15;
5923 IF (PO_LOG.d_stmt) THEN
5924 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
5925 PO_LOG.stmt(d_module,d_position ,'number of rows Inserted ',SQL%ROWCOUNT);
5926 END IF;
5927
5928 -- Identify Header level locks required because of change in multi-row
5929 -- attribute groups in po_headers_all_ext_b.
5930 -- Ignore the addresses.
5931 INSERT INTO po_session_gt(
5932 key,
5933 index_char1, -- records identifier
5934 index_char2, -- entity_name
5935 char1, -- entity_pk1
5936 num1, -- lock_by_draft_id
5937 char5 -- lock_type
5938 )
5939 SELECT po_session_gt_s.NEXTVAL,
5940 G_LOCKS_REQUIRED_ID,
5941 G_LOCK_HEADER_ENTITY,
5942 pohd.po_header_id,
5943 pohd.draft_id,
5944 'P'
5945 FROM po_headers_draft_all pohd,
5946 po_session_gt pogt
5947 WHERE pohd.draft_id = p_draft_id
5948 AND pohd.po_header_id = pogt.char1 -- po_header_id
5949 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
5950 AND pogt.index_char2 = G_LOCK_HEADER_ENTITY
5951 AND EXISTS (-- Consider the added/updated records as a change
5952 SELECT c_ext_attr1,
5953 c_ext_attr2,
5954 c_ext_attr3,
5955 c_ext_attr4,
5956 c_ext_attr5,
5957 c_ext_attr6,
5958 c_ext_attr7,
5959 c_ext_attr8,
5960 c_ext_attr9,
5961 c_ext_attr10,
5962 c_ext_attr11,
5963 c_ext_attr12,
5964 c_ext_attr13,
5965 c_ext_attr14,
5966 c_ext_attr15,
5967 c_ext_attr16,
5968 c_ext_attr17,
5969 c_ext_attr18,
5970 c_ext_attr19,
5971 c_ext_attr20,
5972 c_ext_attr21,
5973 c_ext_attr22,
5974 c_ext_attr23,
5975 c_ext_attr24,
5976 c_ext_attr25,
5977 c_ext_attr26,
5978 c_ext_attr27,
5979 c_ext_attr28,
5980 c_ext_attr29,
5981 c_ext_attr30,
5982 c_ext_attr31,
5983 c_ext_attr32,
5984 c_ext_attr33,
5985 c_ext_attr34,
5986 c_ext_attr35,
5987 c_ext_attr36,
5988 c_ext_attr37,
5989 c_ext_attr38,
5990 c_ext_attr39,
5991 c_ext_attr40,
5992 n_ext_attr1,
5993 n_ext_attr2,
5994 n_ext_attr3,
5995 n_ext_attr4,
5996 n_ext_attr5,
5997 n_ext_attr6,
5998 n_ext_attr7,
5999 n_ext_attr8,
6000 n_ext_attr9,
6001 n_ext_attr10,
6002 n_ext_attr11,
6003 n_ext_attr12,
6004 n_ext_attr13,
6005 n_ext_attr14,
6006 n_ext_attr15,
6007 n_ext_attr16,
6008 n_ext_attr17,
6009 n_ext_attr18,
6010 n_ext_attr19,
6011 n_ext_attr20,
6012 uom_ext_attr1,
6013 uom_ext_attr2,
6014 uom_ext_attr3,
6015 uom_ext_attr4,
6016 uom_ext_attr5,
6017 uom_ext_attr6,
6018 uom_ext_attr7,
6019 uom_ext_attr8,
6020 uom_ext_attr9,
6021 uom_ext_attr10,
6022 uom_ext_attr11,
6023 uom_ext_attr12,
6024 uom_ext_attr13,
6025 uom_ext_attr14,
6026 uom_ext_attr15,
6027 uom_ext_attr16,
6028 uom_ext_attr17,
6029 uom_ext_attr18,
6030 uom_ext_attr19,
6031 uom_ext_attr20,
6032 d_ext_attr1,
6033 d_ext_attr2,
6034 d_ext_attr3,
6035 d_ext_attr4,
6036 d_ext_attr5,
6037 d_ext_attr6,
6038 d_ext_attr7,
6039 d_ext_attr8,
6040 d_ext_attr9,
6041 d_ext_attr10
6042 FROM po_headers_all_ext_b pohextb,
6043 ego_fnd_dsc_flx_ctx_ext ag
6044 WHERE pohextb.po_header_id = pohd.po_header_id
6045 AND pohextb.draft_id = p_draft_id
6046 AND pohextb.attr_group_id = ag.attr_group_id
6047 AND ag.multi_row = 'Y'
6048 AND (pohextb.c_ext_attr40 <> 'PO_UDA_ADDRESS_TYPES'
6049 OR pohextb.c_ext_attr40 IS NULL)
6050 MINUS
6051 SELECT c_ext_attr1,
6052 c_ext_attr2,
6053 c_ext_attr3,
6054 c_ext_attr4,
6055 c_ext_attr5,
6056 c_ext_attr6,
6057 c_ext_attr7,
6058 c_ext_attr8,
6059 c_ext_attr9,
6060 c_ext_attr10,
6061 c_ext_attr11,
6062 c_ext_attr12,
6063 c_ext_attr13,
6064 c_ext_attr14,
6065 c_ext_attr15,
6066 c_ext_attr16,
6067 c_ext_attr17,
6068 c_ext_attr18,
6069 c_ext_attr19,
6070 c_ext_attr20,
6071 c_ext_attr21,
6072 c_ext_attr22,
6073 c_ext_attr23,
6074 c_ext_attr24,
6075 c_ext_attr25,
6076 c_ext_attr26,
6077 c_ext_attr27,
6078 c_ext_attr28,
6079 c_ext_attr29,
6080 c_ext_attr30,
6081 c_ext_attr31,
6082 c_ext_attr32,
6083 c_ext_attr33,
6084 c_ext_attr34,
6085 c_ext_attr35,
6086 c_ext_attr36,
6087 c_ext_attr37,
6088 c_ext_attr38,
6089 c_ext_attr39,
6090 c_ext_attr40,
6091 n_ext_attr1,
6092 n_ext_attr2,
6093 n_ext_attr3,
6094 n_ext_attr4,
6095 n_ext_attr5,
6096 n_ext_attr6,
6097 n_ext_attr7,
6098 n_ext_attr8,
6099 n_ext_attr9,
6100 n_ext_attr10,
6101 n_ext_attr11,
6102 n_ext_attr12,
6103 n_ext_attr13,
6104 n_ext_attr14,
6105 n_ext_attr15,
6106 n_ext_attr16,
6107 n_ext_attr17,
6108 n_ext_attr18,
6109 n_ext_attr19,
6110 n_ext_attr20,
6111 uom_ext_attr1,
6112 uom_ext_attr2,
6113 uom_ext_attr3,
6114 uom_ext_attr4,
6115 uom_ext_attr5,
6116 uom_ext_attr6,
6117 uom_ext_attr7,
6118 uom_ext_attr8,
6119 uom_ext_attr9,
6120 uom_ext_attr10,
6121 uom_ext_attr11,
6122 uom_ext_attr12,
6123 uom_ext_attr13,
6124 uom_ext_attr14,
6125 uom_ext_attr15,
6126 uom_ext_attr16,
6127 uom_ext_attr17,
6128 uom_ext_attr18,
6129 uom_ext_attr19,
6130 uom_ext_attr20,
6131 d_ext_attr1,
6132 d_ext_attr2,
6133 d_ext_attr3,
6134 d_ext_attr4,
6135 d_ext_attr5,
6136 d_ext_attr6,
6137 d_ext_attr7,
6138 d_ext_attr8,
6139 d_ext_attr9,
6140 d_ext_attr10
6141 FROM po_headers_all_ext_b pohextb,
6142 ego_fnd_dsc_flx_ctx_ext ag
6143 WHERE pohextb.po_header_id = pohd.po_header_id
6144 AND pohextb.draft_id = G_DRAFT_ID_MINUS_1
6145 AND pohextb.attr_group_id = ag.attr_group_id
6146 AND ag.multi_row = 'Y'
6147 AND (pohextb.c_ext_attr40 <> 'PO_UDA_ADDRESS_TYPES'
6148 OR pohextb.c_ext_attr40 IS NULL)
6149 UNION ALL
6150 -- Consider the deleted records as a change
6151 SELECT c_ext_attr1,
6152 c_ext_attr2,
6153 c_ext_attr3,
6154 c_ext_attr4,
6155 c_ext_attr5,
6156 c_ext_attr6,
6157 c_ext_attr7,
6158 c_ext_attr8,
6159 c_ext_attr9,
6160 c_ext_attr10,
6161 c_ext_attr11,
6162 c_ext_attr12,
6163 c_ext_attr13,
6164 c_ext_attr14,
6165 c_ext_attr15,
6166 c_ext_attr16,
6167 c_ext_attr17,
6168 c_ext_attr18,
6169 c_ext_attr19,
6170 c_ext_attr20,
6171 c_ext_attr21,
6172 c_ext_attr22,
6173 c_ext_attr23,
6174 c_ext_attr24,
6175 c_ext_attr25,
6176 c_ext_attr26,
6177 c_ext_attr27,
6178 c_ext_attr28,
6179 c_ext_attr29,
6180 c_ext_attr30,
6181 c_ext_attr31,
6182 c_ext_attr32,
6183 c_ext_attr33,
6184 c_ext_attr34,
6185 c_ext_attr35,
6186 c_ext_attr36,
6187 c_ext_attr37,
6188 c_ext_attr38,
6189 c_ext_attr39,
6190 c_ext_attr40,
6191 n_ext_attr1,
6192 n_ext_attr2,
6193 n_ext_attr3,
6194 n_ext_attr4,
6195 n_ext_attr5,
6196 n_ext_attr6,
6197 n_ext_attr7,
6198 n_ext_attr8,
6199 n_ext_attr9,
6200 n_ext_attr10,
6201 n_ext_attr11,
6202 n_ext_attr12,
6203 n_ext_attr13,
6204 n_ext_attr14,
6205 n_ext_attr15,
6206 n_ext_attr16,
6207 n_ext_attr17,
6208 n_ext_attr18,
6209 n_ext_attr19,
6210 n_ext_attr20,
6211 uom_ext_attr1,
6212 uom_ext_attr2,
6213 uom_ext_attr3,
6214 uom_ext_attr4,
6215 uom_ext_attr5,
6216 uom_ext_attr6,
6217 uom_ext_attr7,
6218 uom_ext_attr8,
6219 uom_ext_attr9,
6220 uom_ext_attr10,
6221 uom_ext_attr11,
6222 uom_ext_attr12,
6223 uom_ext_attr13,
6224 uom_ext_attr14,
6225 uom_ext_attr15,
6226 uom_ext_attr16,
6227 uom_ext_attr17,
6228 uom_ext_attr18,
6229 uom_ext_attr19,
6230 uom_ext_attr20,
6231 d_ext_attr1,
6232 d_ext_attr2,
6233 d_ext_attr3,
6234 d_ext_attr4,
6235 d_ext_attr5,
6236 d_ext_attr6,
6237 d_ext_attr7,
6238 d_ext_attr8,
6239 d_ext_attr9,
6240 d_ext_attr10
6241 FROM po_headers_all_ext_b pohextb,
6242 ego_fnd_dsc_flx_ctx_ext ag
6243 WHERE pohextb.po_header_id = pohd.po_header_id
6244 AND pohextb.draft_id = G_DRAFT_ID_MINUS_1
6245 AND pohextb.attr_group_id = ag.attr_group_id
6246 AND ag.multi_row = 'Y'
6247 AND (pohextb.c_ext_attr40 <> 'PO_UDA_ADDRESS_TYPES'
6248 OR pohextb.c_ext_attr40 IS NULL)
6249 MINUS
6250 SELECT c_ext_attr1,
6251 c_ext_attr2,
6252 c_ext_attr3,
6253 c_ext_attr4,
6254 c_ext_attr5,
6255 c_ext_attr6,
6256 c_ext_attr7,
6257 c_ext_attr8,
6258 c_ext_attr9,
6259 c_ext_attr10,
6260 c_ext_attr11,
6261 c_ext_attr12,
6262 c_ext_attr13,
6263 c_ext_attr14,
6264 c_ext_attr15,
6265 c_ext_attr16,
6266 c_ext_attr17,
6267 c_ext_attr18,
6268 c_ext_attr19,
6269 c_ext_attr20,
6270 c_ext_attr21,
6271 c_ext_attr22,
6272 c_ext_attr23,
6273 c_ext_attr24,
6274 c_ext_attr25,
6275 c_ext_attr26,
6276 c_ext_attr27,
6277 c_ext_attr28,
6278 c_ext_attr29,
6279 c_ext_attr30,
6280 c_ext_attr31,
6281 c_ext_attr32,
6282 c_ext_attr33,
6283 c_ext_attr34,
6284 c_ext_attr35,
6285 c_ext_attr36,
6286 c_ext_attr37,
6287 c_ext_attr38,
6288 c_ext_attr39,
6289 c_ext_attr40,
6290 n_ext_attr1,
6291 n_ext_attr2,
6292 n_ext_attr3,
6293 n_ext_attr4,
6294 n_ext_attr5,
6295 n_ext_attr6,
6296 n_ext_attr7,
6297 n_ext_attr8,
6298 n_ext_attr9,
6299 n_ext_attr10,
6300 n_ext_attr11,
6301 n_ext_attr12,
6302 n_ext_attr13,
6303 n_ext_attr14,
6304 n_ext_attr15,
6305 n_ext_attr16,
6306 n_ext_attr17,
6307 n_ext_attr18,
6308 n_ext_attr19,
6309 n_ext_attr20,
6310 uom_ext_attr1,
6311 uom_ext_attr2,
6312 uom_ext_attr3,
6313 uom_ext_attr4,
6314 uom_ext_attr5,
6315 uom_ext_attr6,
6316 uom_ext_attr7,
6317 uom_ext_attr8,
6318 uom_ext_attr9,
6319 uom_ext_attr10,
6320 uom_ext_attr11,
6321 uom_ext_attr12,
6322 uom_ext_attr13,
6323 uom_ext_attr14,
6324 uom_ext_attr15,
6325 uom_ext_attr16,
6326 uom_ext_attr17,
6327 uom_ext_attr18,
6328 uom_ext_attr19,
6329 uom_ext_attr20,
6330 d_ext_attr1,
6331 d_ext_attr2,
6332 d_ext_attr3,
6333 d_ext_attr4,
6334 d_ext_attr5,
6335 d_ext_attr6,
6336 d_ext_attr7,
6337 d_ext_attr8,
6338 d_ext_attr9,
6339 d_ext_attr10
6340 FROM po_headers_all_ext_b pohextb,
6341 ego_fnd_dsc_flx_ctx_ext ag
6342 WHERE pohextb.po_header_id = pohd.po_header_id
6343 AND pohextb.draft_id = p_draft_id
6344 AND pohextb.attr_group_id = ag.attr_group_id
6345 AND ag.multi_row = 'Y'
6346 AND (pohextb.c_ext_attr40 <> 'PO_UDA_ADDRESS_TYPES'
6347 OR pohextb.c_ext_attr40 IS NULL)
6348 );
6349 d_position:=20;
6350 IF (PO_LOG.d_stmt) THEN
6351 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
6352 PO_LOG.stmt(d_module,d_position ,'number of rows Updated ',SQL%ROWCOUNT);
6353 END IF;
6354
6355 -- Identify Header level locks required because of change in po_headers_all_ext_tl
6356 INSERT INTO po_session_gt(
6357 key,
6358 index_char1, -- records identifier
6359 index_char2, -- entity_name
6360 char1, -- entity_pk1
6361 num1, -- lock_by_draft_id
6362 char5 -- lock_type
6363 )
6364 SELECT po_session_gt_s.NEXTVAL,
6365 G_LOCKS_REQUIRED_ID,
6366 G_LOCK_HEADER_ENTITY,
6367 draft.po_header_id,
6368 draft.draft_id,
6369 CASE
6370 WHEN base.p_lock_attrs <> draft.p_lock_attrs THEN 'P'
6371 ELSE NULL
6372 end lock_type
6373 FROM (SELECT put.po_header_id,
6374 put.draft_id,
6375 po_uda_tl_mod_p_lock_attrs(
6376 NVL(put.tl_ext_attr1 ,G_NULL_CHAR),
6377 NVL(put.tl_ext_attr2 ,G_NULL_CHAR),
6378 NVL(put.tl_ext_attr3 ,G_NULL_CHAR),
6379 NVL(put.tl_ext_attr4 ,G_NULL_CHAR),
6380 NVL(put.tl_ext_attr5 ,G_NULL_CHAR),
6381 NVL(put.tl_ext_attr6 ,G_NULL_CHAR),
6382 NVL(put.tl_ext_attr7 ,G_NULL_CHAR),
6383 NVL(put.tl_ext_attr8 ,G_NULL_CHAR),
6384 NVL(put.tl_ext_attr9 ,G_NULL_CHAR),
6385 NVL(put.tl_ext_attr10 ,G_NULL_CHAR),
6386 NVL(put.tl_ext_attr11 ,G_NULL_CHAR),
6387 NVL(put.tl_ext_attr12 ,G_NULL_CHAR),
6388 NVL(put.tl_ext_attr13 ,G_NULL_CHAR),
6389 NVL(put.tl_ext_attr14 ,G_NULL_CHAR),
6390 NVL(put.tl_ext_attr15 ,G_NULL_CHAR),
6391 NVL(put.tl_ext_attr16 ,G_NULL_CHAR),
6392 NVL(put.tl_ext_attr17 ,G_NULL_CHAR),
6393 NVL(put.tl_ext_attr18 ,G_NULL_CHAR),
6394 NVL(put.tl_ext_attr19 ,G_NULL_CHAR),
6395 NVL(put.tl_ext_attr20 ,G_NULL_CHAR),
6396 NVL(put.tl_ext_attr21 ,G_NULL_CHAR),
6397 NVL(put.tl_ext_attr22 ,G_NULL_CHAR),
6398 NVL(put.tl_ext_attr23 ,G_NULL_CHAR),
6399 NVL(put.tl_ext_attr24 ,G_NULL_CHAR),
6400 NVL(put.tl_ext_attr25 ,G_NULL_CHAR),
6401 NVL(put.tl_ext_attr26 ,G_NULL_CHAR),
6402 NVL(put.tl_ext_attr27 ,G_NULL_CHAR),
6403 NVL(put.tl_ext_attr28 ,G_NULL_CHAR),
6404 NVL(put.tl_ext_attr29 ,G_NULL_CHAR),
6405 NVL(put.tl_ext_attr30 ,G_NULL_CHAR),
6406 NVL(put.tl_ext_attr31 ,G_NULL_CHAR),
6407 NVL(put.tl_ext_attr32 ,G_NULL_CHAR),
6408 NVL(put.tl_ext_attr33 ,G_NULL_CHAR),
6409 NVL(put.tl_ext_attr34 ,G_NULL_CHAR),
6410 NVL(put.tl_ext_attr35 ,G_NULL_CHAR),
6411 NVL(put.tl_ext_attr36 ,G_NULL_CHAR),
6412 NVL(put.tl_ext_attr37 ,G_NULL_CHAR),
6413 NVL(put.tl_ext_attr38 ,G_NULL_CHAR),
6414 nvl(put.tl_ext_attr39 ,G_NULL_CHAR),
6415 NVL(put.tl_ext_attr40 ,G_NULL_CHAR)
6416 ) p_lock_attrs,
6417 put.attr_group_id,
6418 put.language
6419 FROM po_headers_all_ext_tl put,
6420 po_session_gt pogt
6421 where put.po_header_id = pogt.char1 -- po_header_id
6422 AND put.draft_id =G_DRAFT_ID_MINUS_1
6423 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
6424 and pogt.index_char2 = g_lock_header_entity
6425 ) base,
6426 (select putd.po_header_id,
6427 putd.draft_id,
6428 po_uda_tl_mod_p_lock_attrs(
6429 NVL(putd.tl_ext_attr1 ,G_NULL_CHAR),
6430 NVL(putd.tl_ext_attr2 ,G_NULL_CHAR),
6431 NVL(putd.tl_ext_attr3 ,G_NULL_CHAR),
6432 NVL(putd.tl_ext_attr4 ,G_NULL_CHAR),
6433 NVL(putd.tl_ext_attr5 ,G_NULL_CHAR),
6434 NVL(putd.tl_ext_attr6 ,G_NULL_CHAR),
6435 NVL(putd.tl_ext_attr7 ,G_NULL_CHAR),
6436 NVL(putd.tl_ext_attr8 ,G_NULL_CHAR),
6437 NVL(putd.tl_ext_attr9 ,G_NULL_CHAR),
6438 NVL(putd.tl_ext_attr10 ,G_NULL_CHAR),
6439 NVL(putd.tl_ext_attr11 ,G_NULL_CHAR),
6440 NVL(putd.tl_ext_attr12 ,G_NULL_CHAR),
6441 NVL(putd.tl_ext_attr13 ,G_NULL_CHAR),
6442 NVL(putd.tl_ext_attr14 ,G_NULL_CHAR),
6443 NVL(putd.tl_ext_attr15 ,G_NULL_CHAR),
6444 NVL(putd.tl_ext_attr16 ,G_NULL_CHAR),
6445 NVL(putd.tl_ext_attr17 ,G_NULL_CHAR),
6446 NVL(putd.tl_ext_attr18 ,G_NULL_CHAR),
6447 NVL(putd.tl_ext_attr19 ,G_NULL_CHAR),
6448 NVL(putd.tl_ext_attr20 ,G_NULL_CHAR),
6449 NVL(putd.tl_ext_attr21 ,G_NULL_CHAR),
6450 NVL(putd.tl_ext_attr22 ,G_NULL_CHAR),
6451 NVL(putd.tl_ext_attr23 ,G_NULL_CHAR),
6452 NVL(putd.tl_ext_attr24 ,G_NULL_CHAR),
6453 NVL(putd.tl_ext_attr25 ,G_NULL_CHAR),
6454 NVL(putd.tl_ext_attr26 ,G_NULL_CHAR),
6455 NVL(putd.tl_ext_attr27 ,G_NULL_CHAR),
6456 NVL(putd.tl_ext_attr28 ,G_NULL_CHAR),
6457 NVL(putd.tl_ext_attr29 ,G_NULL_CHAR),
6458 NVL(putd.tl_ext_attr30 ,G_NULL_CHAR),
6459 NVL(putd.tl_ext_attr31 ,G_NULL_CHAR),
6460 NVL(putd.tl_ext_attr32 ,G_NULL_CHAR),
6461 NVL(putd.tl_ext_attr33 ,G_NULL_CHAR),
6462 NVL(putd.tl_ext_attr34 ,G_NULL_CHAR),
6463 NVL(putd.tl_ext_attr35 ,G_NULL_CHAR),
6464 NVL(putd.tl_ext_attr36 ,G_NULL_CHAR),
6465 NVL(putd.tl_ext_attr37 ,G_NULL_CHAR),
6466 NVL(putd.tl_ext_attr38 ,G_NULL_CHAR),
6467 nvl(putd.tl_ext_attr39 ,g_null_char),
6468 NVL(putd.tl_ext_attr40 ,G_NULL_CHAR)
6469 ) p_lock_attrs,
6470 putd.attr_group_id,
6471 putd.language
6472 FROM po_headers_all_ext_tl putd,
6473 po_session_gt pogt
6474 WHERE putd.draft_id = p_draft_id
6475 AND putd.po_header_id = pogt.char1 -- po_header_id
6476 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
6477 and pogt.index_char2 = g_lock_header_entity
6478 ) draft
6479 where base.attr_group_id = draft.attr_group_id
6480 AND base.language = draft.language
6481 AND base.p_lock_attrs <> draft.p_lock_attrs;
6482 d_position:=30;
6483 IF (PO_LOG.d_stmt) THEN
6484 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
6485 PO_LOG.stmt(d_module,d_position ,'number of rows Updated ',SQL%ROWCOUNT);
6486 END IF;
6487
6488 -- Identify UDA Addresses level locks required and insert into gt table
6489 INSERT INTO po_session_gt(
6490 key,
6491 index_char1, -- records identifier
6492 index_char2, -- entity_name
6493 char1, -- entity_pk1
6494 char2, -- entity_pk2
6495 num1, -- lock_by_draft_id
6496 char5 -- lock_type
6497 )
6498 SELECT po_session_gt_s.NEXTVAL,
6499 G_LOCKS_REQUIRED_ID,
6500 G_LOCK_ADDRESS_ENTITY,
6501 draft.po_header_id,
6502 draft.c_ext_attr39,
6503 draft.draft_id,
6504 CASE
6505 WHEN base.p_lock_attrs <> draft.p_lock_attrs THEN 'P'
6506 ELSE NULL
6507 END lock_type
6508 FROM (SELECT phb.po_header_id,
6509 phb.draft_id,
6510 po_uda_mod_p_lock_attrs(
6511 NVL(phb.c_ext_attr1 ,G_NULL_CHAR),
6512 NVL(phb.c_ext_attr2 ,G_NULL_CHAR),
6513 NVL(phb.c_ext_attr3 ,G_NULL_CHAR),
6514 NVL(phb.c_ext_attr4 ,G_NULL_CHAR),
6515 NVL(phb.c_ext_attr5 ,G_NULL_CHAR),
6516 NVL(phb.c_ext_attr6 ,G_NULL_CHAR),
6517 NVL(phb.c_ext_attr7 ,G_NULL_CHAR),
6518 NVL(phb.c_ext_attr8 ,G_NULL_CHAR),
6519 NVL(phb.c_ext_attr9 ,G_NULL_CHAR),
6520 NVL(phb.c_ext_attr10 ,G_NULL_CHAR),
6521 NVL(phb.c_ext_attr11 ,G_NULL_CHAR),
6522 NVL(phb.c_ext_attr12 ,G_NULL_CHAR),
6523 NVL(phb.c_ext_attr13 ,G_NULL_CHAR),
6524 NVL(phb.c_ext_attr14 ,G_NULL_CHAR),
6525 NVL(phb.c_ext_attr15 ,G_NULL_CHAR),
6526 NVL(phb.c_ext_attr16 ,G_NULL_CHAR),
6527 NVL(phb.c_ext_attr17 ,G_NULL_CHAR),
6528 NVL(phb.c_ext_attr18 ,G_NULL_CHAR),
6529 NVL(phb.c_ext_attr19 ,G_NULL_CHAR),
6530 NVL(phb.c_ext_attr20 ,G_NULL_CHAR),
6531 NVL(phb.c_ext_attr21 ,G_NULL_CHAR),
6532 NVL(phb.c_ext_attr22 ,G_NULL_CHAR),
6533 NVL(phb.c_ext_attr23 ,G_NULL_CHAR),
6534 NVL(phb.c_ext_attr24 ,G_NULL_CHAR),
6535 NVL(phb.c_ext_attr25 ,G_NULL_CHAR),
6536 NVL(phb.c_ext_attr26 ,G_NULL_CHAR),
6537 NVL(phb.c_ext_attr27 ,G_NULL_CHAR),
6538 NVL(phb.c_ext_attr28 ,G_NULL_CHAR),
6539 NVL(phb.c_ext_attr29 ,G_NULL_CHAR),
6540 NVL(phb.c_ext_attr30 ,G_NULL_CHAR),
6541 NVL(phb.c_ext_attr31 ,G_NULL_CHAR),
6542 NVL(phb.c_ext_attr32 ,G_NULL_CHAR),
6543 NVL(phb.c_ext_attr33 ,G_NULL_CHAR),
6544 NVL(phb.c_ext_attr34 ,G_NULL_CHAR),
6545 NVL(phb.c_ext_attr35 ,G_NULL_CHAR),
6546 NVL(phb.c_ext_attr36 ,G_NULL_CHAR),
6547 NVL(phb.c_ext_attr37 ,G_NULL_CHAR),
6548 NVL(phb.c_ext_attr38 ,G_NULL_CHAR),
6549 NVL(phb.c_ext_attr39 ,G_NULL_CHAR),
6550 NVL(phb.c_ext_attr40 ,G_NULL_CHAR),
6551 NVL(phb.n_ext_attr1 ,G_NULL_NUM),
6552 NVL(phb.n_ext_attr2 ,G_NULL_NUM),
6553 NVL(phb.n_ext_attr3 ,G_NULL_NUM),
6554 NVL(phb.n_ext_attr4 ,G_NULL_NUM),
6555 NVL(phb.n_ext_attr5 ,G_NULL_NUM),
6556 NVL(phb.n_ext_attr6 ,G_NULL_NUM),
6557 NVL(phb.n_ext_attr7 ,G_NULL_NUM),
6558 NVL(phb.n_ext_attr8 ,G_NULL_NUM),
6559 NVL(phb.n_ext_attr9 ,G_NULL_NUM),
6560 NVL(phb.n_ext_attr10 ,G_NULL_NUM),
6561 NVL(phb.n_ext_attr11 ,G_NULL_NUM),
6562 NVL(phb.n_ext_attr12 ,G_NULL_NUM),
6563 NVL(phb.n_ext_attr13 ,G_NULL_NUM),
6564 NVL(phb.n_ext_attr14 ,G_NULL_NUM),
6565 NVL(phb.n_ext_attr15 ,G_NULL_NUM),
6566 NVL(phb.n_ext_attr16 ,G_NULL_NUM),
6567 NVL(phb.n_ext_attr17 ,G_NULL_NUM),
6568 NVL(phb.n_ext_attr18 ,G_NULL_NUM),
6569 NVL(phb.n_ext_attr19 ,G_NULL_NUM),
6570 NVL(phb.n_ext_attr20 ,G_NULL_NUM),
6571 NVL(phb.uom_ext_attr1 ,G_NULL_CHAR),
6572 NVL(phb.uom_ext_attr2 ,G_NULL_CHAR),
6573 NVL(phb.uom_ext_attr3 ,G_NULL_CHAR),
6574 NVL(phb.uom_ext_attr4 ,G_NULL_CHAR),
6575 NVL(phb.uom_ext_attr5 ,G_NULL_CHAR),
6576 NVL(phb.uom_ext_attr6 ,G_NULL_CHAR),
6577 NVL(phb.uom_ext_attr7 ,G_NULL_CHAR),
6578 NVL(phb.uom_ext_attr8 ,G_NULL_CHAR),
6579 NVL(phb.uom_ext_attr9 ,G_NULL_CHAR),
6580 NVL(phb.uom_ext_attr10 ,G_NULL_CHAR),
6581 NVL(phb.uom_ext_attr11 ,G_NULL_CHAR),
6582 NVL(phb.uom_ext_attr12 ,G_NULL_CHAR),
6583 NVL(phb.uom_ext_attr13 ,G_NULL_CHAR),
6584 NVL(phb.uom_ext_attr14 ,G_NULL_CHAR),
6585 NVL(phb.uom_ext_attr15 ,G_NULL_CHAR),
6586 NVL(phb.uom_ext_attr16 ,G_NULL_CHAR),
6587 NVL(phb.uom_ext_attr17 ,G_NULL_CHAR),
6588 NVL(phb.uom_ext_attr18 ,G_NULL_CHAR),
6589 NVL(phb.uom_ext_attr19 ,G_NULL_CHAR),
6590 NVL(phb.uom_ext_attr20 ,G_NULL_CHAR),
6591 NVL(phb.d_ext_attr1 ,G_NULL_DATE),
6592 NVL(phb.d_ext_attr2 ,G_NULL_DATE),
6593 NVL(phb.d_ext_attr3 ,G_NULL_DATE),
6594 NVL(phb.d_ext_attr4 ,G_NULL_DATE),
6595 NVL(phb.d_ext_attr5 ,G_NULL_DATE),
6596 NVL(phb.d_ext_attr6 ,G_NULL_DATE),
6597 NVL(phb.d_ext_attr7 ,G_NULL_DATE),
6598 NVL(phb.d_ext_attr8 ,G_NULL_DATE),
6599 NVL(phb.d_ext_attr9 ,G_NULL_DATE),
6600 NVL(phb.d_ext_attr10 ,G_NULL_DATE)
6601 ) P_LOCK_ATTRS,
6602 phb.attr_group_id,
6603 phb.c_ext_attr39
6604 FROM po_headers_all_ext_b phb,
6605 po_session_gt pogt
6606 WHERE phb.po_header_id = pogt.char1 -- po_header_id
6607 AND phb.draft_id = G_DRAFT_ID_MINUS_1
6608 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
6609 AND pogt.index_char2 = G_LOCK_ADDRESS_ENTITY
6610 AND phb.c_ext_attr40='PO_UDA_ADDRESS_TYPES'
6611 ) base,
6612 (SELECT phbd.po_header_id,
6613 phbd.draft_id,
6614 po_uda_mod_p_lock_attrs(
6615 NVL(phbd.c_ext_attr1 ,G_NULL_CHAR),
6616 NVL(phbd.c_ext_attr2 ,G_NULL_CHAR),
6617 NVL(phbd.c_ext_attr3 ,G_NULL_CHAR),
6618 NVL(phbd.c_ext_attr4 ,G_NULL_CHAR),
6619 NVL(phbd.c_ext_attr5 ,G_NULL_CHAR),
6620 NVL(phbd.c_ext_attr6 ,G_NULL_CHAR),
6621 NVL(phbd.c_ext_attr7 ,G_NULL_CHAR),
6622 NVL(phbd.c_ext_attr8 ,G_NULL_CHAR),
6623 NVL(phbd.c_ext_attr9 ,G_NULL_CHAR),
6624 NVL(phbd.c_ext_attr10 ,G_NULL_CHAR),
6625 NVL(phbd.c_ext_attr11 ,G_NULL_CHAR),
6626 NVL(phbd.c_ext_attr12 ,G_NULL_CHAR),
6627 NVL(phbd.c_ext_attr13 ,G_NULL_CHAR),
6628 NVL(phbd.c_ext_attr14 ,G_NULL_CHAR),
6629 NVL(phbd.c_ext_attr15 ,G_NULL_CHAR),
6630 NVL(phbd.c_ext_attr16 ,G_NULL_CHAR),
6631 NVL(phbd.c_ext_attr17 ,G_NULL_CHAR),
6632 NVL(phbd.c_ext_attr18 ,G_NULL_CHAR),
6633 NVL(phbd.c_ext_attr19 ,G_NULL_CHAR),
6634 NVL(phbd.c_ext_attr20 ,G_NULL_CHAR),
6635 NVL(phbd.c_ext_attr21 ,G_NULL_CHAR),
6636 NVL(phbd.c_ext_attr22 ,G_NULL_CHAR),
6637 NVL(phbd.c_ext_attr23 ,G_NULL_CHAR),
6638 NVL(phbd.c_ext_attr24 ,G_NULL_CHAR),
6639 NVL(phbd.c_ext_attr25 ,G_NULL_CHAR),
6640 NVL(phbd.c_ext_attr26 ,G_NULL_CHAR),
6641 NVL(phbd.c_ext_attr27 ,G_NULL_CHAR),
6642 NVL(phbd.c_ext_attr28 ,G_NULL_CHAR),
6643 NVL(phbd.c_ext_attr29 ,G_NULL_CHAR),
6644 NVL(phbd.c_ext_attr30 ,G_NULL_CHAR),
6645 NVL(phbd.c_ext_attr31 ,G_NULL_CHAR),
6646 NVL(phbd.c_ext_attr32 ,G_NULL_CHAR),
6647 NVL(phbd.c_ext_attr33 ,G_NULL_CHAR),
6648 NVL(phbd.c_ext_attr34 ,G_NULL_CHAR),
6649 NVL(phbd.c_ext_attr35 ,G_NULL_CHAR),
6650 NVL(phbd.c_ext_attr36 ,G_NULL_CHAR),
6651 NVL(phbd.c_ext_attr37 ,G_NULL_CHAR),
6652 NVL(phbd.c_ext_attr38 ,G_NULL_CHAR),
6653 NVL(phbd.c_ext_attr39 ,G_NULL_CHAR),
6654 NVL(phbd.c_ext_attr40 ,G_NULL_CHAR),
6655 NVL(phbd.n_ext_attr1 ,G_NULL_NUM),
6656 NVL(phbd.n_ext_attr2 ,G_NULL_NUM),
6657 NVL(phbd.n_ext_attr3 ,G_NULL_NUM),
6658 NVL(phbd.n_ext_attr4 ,G_NULL_NUM),
6659 NVL(phbd.n_ext_attr5 ,G_NULL_NUM),
6660 NVL(phbd.n_ext_attr6 ,G_NULL_NUM),
6661 NVL(phbd.n_ext_attr7 ,G_NULL_NUM),
6662 NVL(phbd.n_ext_attr8 ,G_NULL_NUM),
6663 NVL(phbd.n_ext_attr9 ,G_NULL_NUM),
6664 NVL(phbd.n_ext_attr10 ,G_NULL_NUM),
6665 NVL(phbd.n_ext_attr11 ,G_NULL_NUM),
6666 NVL(phbd.n_ext_attr12 ,G_NULL_NUM),
6667 NVL(phbd.n_ext_attr13 ,G_NULL_NUM),
6668 NVL(phbd.n_ext_attr14 ,G_NULL_NUM),
6669 NVL(phbd.n_ext_attr15 ,G_NULL_NUM),
6670 NVL(phbd.n_ext_attr16 ,G_NULL_NUM),
6671 NVL(phbd.n_ext_attr17 ,G_NULL_NUM),
6672 NVL(phbd.n_ext_attr18 ,G_NULL_NUM),
6673 NVL(phbd.n_ext_attr19 ,G_NULL_NUM),
6674 NVL(phbd.n_ext_attr20 ,G_NULL_NUM),
6675 NVL(phbd.uom_ext_attr1 ,G_NULL_CHAR),
6676 NVL(phbd.uom_ext_attr2 ,G_NULL_CHAR),
6677 NVL(phbd.uom_ext_attr3 ,G_NULL_CHAR),
6678 NVL(phbd.uom_ext_attr4 ,G_NULL_CHAR),
6679 NVL(phbd.uom_ext_attr5 ,G_NULL_CHAR),
6680 NVL(phbd.uom_ext_attr6 ,G_NULL_CHAR),
6681 NVL(phbd.uom_ext_attr7 ,G_NULL_CHAR),
6682 NVL(phbd.uom_ext_attr8 ,G_NULL_CHAR),
6683 NVL(phbd.uom_ext_attr9 ,G_NULL_CHAR),
6684 NVL(phbd.uom_ext_attr10 ,G_NULL_CHAR),
6685 NVL(phbd.uom_ext_attr11 ,G_NULL_CHAR),
6686 NVL(phbd.uom_ext_attr12 ,G_NULL_CHAR),
6687 NVL(phbd.uom_ext_attr13 ,G_NULL_CHAR),
6688 NVL(phbd.uom_ext_attr14 ,G_NULL_CHAR),
6689 NVL(phbd.uom_ext_attr15 ,G_NULL_CHAR),
6690 NVL(phbd.uom_ext_attr16 ,G_NULL_CHAR),
6691 NVL(phbd.uom_ext_attr17 ,G_NULL_CHAR),
6692 NVL(phbd.uom_ext_attr18 ,G_NULL_CHAR),
6693 NVL(phbd.uom_ext_attr19 ,G_NULL_CHAR),
6694 NVL(phbd.uom_ext_attr20 ,G_NULL_CHAR),
6695 NVL(phbd.d_ext_attr1 ,G_NULL_DATE),
6696 NVL(phbd.d_ext_attr2 ,G_NULL_DATE),
6697 NVL(phbd.d_ext_attr3 ,G_NULL_DATE),
6698 NVL(phbd.d_ext_attr4 ,G_NULL_DATE),
6699 NVL(phbd.d_ext_attr5 ,G_NULL_DATE),
6700 NVL(phbd.d_ext_attr6 ,G_NULL_DATE),
6701 NVL(phbd.d_ext_attr7 ,G_NULL_DATE),
6702 NVL(phbd.d_ext_attr8 ,G_NULL_DATE),
6703 nvl(phbd.d_ext_attr9 ,g_null_date),
6704 NVL(phbd.d_ext_attr10 ,G_NULL_DATE)
6705 ) p_lock_attrs,
6706 phbd.attr_group_id,
6707 phbd.c_ext_attr39
6708 FROM po_headers_all_ext_b phbd,
6709 po_session_gt pogt
6710 WHERE phbd.draft_id = p_draft_id
6711 AND phbd.po_header_id = pogt.char1 -- po_header_id
6712 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
6713 AND pogt.index_char2 = G_LOCK_ADDRESS_ENTITY
6714 AND phbd.c_ext_attr40 = 'PO_UDA_ADDRESS_TYPES'
6715 ) draft
6716 WHERE base.attr_group_id = draft.attr_group_id
6717 AND BASE.c_ext_attr39 = DRAFT.c_ext_attr39
6718 AND base.p_lock_attrs <> draft.p_lock_attrs;
6719
6720 d_position:=40;
6721 IF (PO_LOG.d_stmt) THEN
6722 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
6723 PO_LOG.stmt(d_module,d_position ,'number of rows Updated ',SQL%ROWCOUNT);
6724 END IF;
6725
6726 d_position:=50;
6727 IF (PO_LOG.d_proc) THEN
6728 PO_LOG.proc_end(d_module);
6729 END IF;
6730
6731 EXCEPTION
6732 WHEN OTHERS THEN
6733 IF (PO_LOG.d_exc) THEN
6734 PO_LOG.exc(d_module,d_position,SQLCODE || SQLERRM);
6735 END IF;
6736 RAISE;
6737 END identify_uda_header_locks;
6738
6739
6740
6741 --------------------------------------------------------------------------------
6742 --Start of Comments
6743 --Name: identify_uda_line_locks
6744 -- <Conc Mods Project>
6745 --Pre-reqs: None
6746 --Modifies:
6747 -- po_entity_locks
6748 --Locks:
6749 -- po_lines_all_ext_b, po_lines_all_ext_tl, complex pricing attributes.
6750 --Function:
6751 -- This procedure generates the change data for the passed entities PKs,
6752 -- creates entries in po_entity_locks table corresponding to the modified
6753 -- attributes, and locks the required rows in transaction tables.
6754 --Parameters:
6755 --IN:
6756 --p_draft_id
6757 -- draft id of the current Modification - Award/IDV
6758 --Notes:
6759 --End of Comments
6760 --------------------------------------------------------------------------------
6761
6762 PROCEDURE identify_uda_line_locks(
6763 p_draft_id IN NUMBER
6764 )
6765 IS
6766 d_api_name CONSTANT VARCHAR2(30) := 'identify_uda_line_locks';
6767 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
6768 d_position NUMBER;
6769
6770 BEGIN
6771 -- Identify Line level locks required because of change in po_lines_all_ext_b
6772 d_position:=0;
6773 IF (PO_LOG.d_proc) THEN
6774 PO_LOG.proc_begin(d_module);
6775 PO_LOG.proc_begin(d_module, 'p_draft_id', p_draft_id);
6776 END IF;
6777
6778 INSERT INTO po_session_gt(
6779 key,
6780 index_char1, -- records identifier
6781 index_char2, -- entity_name
6782 char1, -- entity_pk1
6783 num1, -- lock_by_draft_id
6784 char5 -- lock_type
6785 )
6786 SELECT po_session_gt_s.NEXTVAL,
6787 G_LOCKS_REQUIRED_ID,
6788 G_LOCK_LINE_ENTITY,
6789 draft.po_line_id,
6790 draft.draft_id,
6791 CASE
6792 WHEN base.p_lock_attrs <> draft.p_lock_attrs THEN 'P'
6793 ELSE NULL
6794 END lock_type
6795 FROM (SELECT plb.po_line_id,
6796 plb.draft_id,
6797 po_uda_mod_p_lock_attrs(
6798 NVL(plb.c_ext_attr1 ,G_NULL_CHAR),
6799 NVL(plb.c_ext_attr2 ,G_NULL_CHAR),
6800 NVL(plb.c_ext_attr3 ,G_NULL_CHAR),
6801 NVL(plb.c_ext_attr4 ,G_NULL_CHAR),
6802 NVL(plb.c_ext_attr5 ,G_NULL_CHAR),
6803 NVL(plb.c_ext_attr6 ,G_NULL_CHAR),
6804 NVL(plb.c_ext_attr7 ,G_NULL_CHAR),
6805 NVL(plb.c_ext_attr8 ,G_NULL_CHAR),
6806 NVL(plb.c_ext_attr9 ,G_NULL_CHAR),
6807 NVL(plb.c_ext_attr10 ,G_NULL_CHAR),
6808 NVL(plb.c_ext_attr11 ,G_NULL_CHAR),
6809 NVL(plb.c_ext_attr12 ,G_NULL_CHAR),
6810 NVL(plb.c_ext_attr13 ,G_NULL_CHAR),
6811 NVL(plb.c_ext_attr14 ,G_NULL_CHAR),
6812 NVL(plb.c_ext_attr15 ,G_NULL_CHAR),
6813 NVL(plb.c_ext_attr16 ,G_NULL_CHAR),
6814 NVL(plb.c_ext_attr17 ,G_NULL_CHAR),
6815 NVL(plb.c_ext_attr18 ,G_NULL_CHAR),
6816 NVL(plb.c_ext_attr19 ,G_NULL_CHAR),
6817 NVL(plb.c_ext_attr20 ,G_NULL_CHAR),
6818 NVL(plb.c_ext_attr21 ,G_NULL_CHAR),
6819 NVL(plb.c_ext_attr22 ,G_NULL_CHAR),
6820 NVL(plb.c_ext_attr23 ,G_NULL_CHAR),
6821 NVL(plb.c_ext_attr24 ,G_NULL_CHAR),
6822 NVL(plb.c_ext_attr25 ,G_NULL_CHAR),
6823 NVL(plb.c_ext_attr26 ,G_NULL_CHAR),
6824 NVL(plb.c_ext_attr27 ,G_NULL_CHAR),
6825 NVL(plb.c_ext_attr28 ,G_NULL_CHAR),
6826 NVL(plb.c_ext_attr29 ,G_NULL_CHAR),
6827 NVL(plb.c_ext_attr30 ,G_NULL_CHAR),
6828 NVL(plb.c_ext_attr31 ,G_NULL_CHAR),
6829 NVL(plb.c_ext_attr32 ,G_NULL_CHAR),
6830 NVL(plb.c_ext_attr33 ,G_NULL_CHAR),
6831 NVL(plb.c_ext_attr34 ,G_NULL_CHAR),
6832 NVL(plb.c_ext_attr35 ,G_NULL_CHAR),
6833 NVL(plb.c_ext_attr36 ,G_NULL_CHAR),
6834 NVL(plb.c_ext_attr37 ,G_NULL_CHAR),
6835 NVL(plb.c_ext_attr38 ,G_NULL_CHAR),
6836 NVL(plb.c_ext_attr39 ,G_NULL_CHAR),
6837 NVL(plb.c_ext_attr40 ,G_NULL_CHAR),
6838 NVL(plb.n_ext_attr1 ,G_NULL_NUM),
6839 NVL(plb.n_ext_attr2 ,G_NULL_NUM),
6840 NVL(plb.n_ext_attr3 ,G_NULL_NUM),
6841 NVL(plb.n_ext_attr4 ,G_NULL_NUM),
6842 NVL(plb.n_ext_attr5 ,G_NULL_NUM),
6843 NVL(plb.n_ext_attr6 ,G_NULL_NUM),
6844 NVL(plb.n_ext_attr7 ,G_NULL_NUM),
6845 NVL(plb.n_ext_attr8 ,G_NULL_NUM),
6846 NVL(plb.n_ext_attr9 ,G_NULL_NUM),
6847 NVL(plb.n_ext_attr10 ,G_NULL_NUM),
6848 NVL(plb.n_ext_attr11 ,G_NULL_NUM),
6849 NVL(plb.n_ext_attr12 ,G_NULL_NUM),
6850 NVL(plb.n_ext_attr13 ,G_NULL_NUM),
6851 NVL(plb.n_ext_attr14 ,G_NULL_NUM),
6852 NVL(plb.n_ext_attr15 ,G_NULL_NUM),
6853 NVL(plb.n_ext_attr16 ,G_NULL_NUM),
6854 NVL(plb.n_ext_attr17 ,G_NULL_NUM),
6855 NVL(plb.n_ext_attr18 ,G_NULL_NUM),
6856 NVL(plb.n_ext_attr19 ,G_NULL_NUM),
6857 NVL(plb.n_ext_attr20 ,G_NULL_NUM),
6858 NVL(plb.uom_ext_attr1 ,G_NULL_CHAR),
6859 NVL(plb.uom_ext_attr2 ,G_NULL_CHAR),
6860 NVL(plb.uom_ext_attr3 ,G_NULL_CHAR),
6861 NVL(plb.uom_ext_attr4 ,G_NULL_CHAR),
6862 NVL(plb.uom_ext_attr5 ,G_NULL_CHAR),
6863 NVL(plb.uom_ext_attr6 ,G_NULL_CHAR),
6864 NVL(plb.uom_ext_attr7 ,G_NULL_CHAR),
6865 NVL(plb.uom_ext_attr8 ,G_NULL_CHAR),
6866 NVL(plb.uom_ext_attr9 ,G_NULL_CHAR),
6867 NVL(plb.uom_ext_attr10 ,G_NULL_CHAR),
6868 NVL(plb.uom_ext_attr11 ,G_NULL_CHAR),
6869 NVL(plb.uom_ext_attr12 ,G_NULL_CHAR),
6870 NVL(plb.uom_ext_attr13 ,G_NULL_CHAR),
6871 NVL(plb.uom_ext_attr14 ,G_NULL_CHAR),
6872 NVL(plb.uom_ext_attr15 ,G_NULL_CHAR),
6873 NVL(plb.uom_ext_attr16 ,G_NULL_CHAR),
6874 NVL(plb.uom_ext_attr17 ,G_NULL_CHAR),
6875 NVL(plb.uom_ext_attr18 ,G_NULL_CHAR),
6876 NVL(plb.uom_ext_attr19 ,G_NULL_CHAR),
6877 NVL(plb.uom_ext_attr20 ,G_NULL_CHAR),
6878 NVL(plb.d_ext_attr1 ,G_NULL_DATE),
6879 NVL(plb.d_ext_attr2 ,G_NULL_DATE),
6880 NVL(plb.d_ext_attr3 ,G_NULL_DATE),
6881 NVL(plb.d_ext_attr4 ,G_NULL_DATE),
6882 NVL(plb.d_ext_attr5 ,G_NULL_DATE),
6883 NVL(plb.d_ext_attr6 ,G_NULL_DATE),
6884 NVL(plb.d_ext_attr7 ,G_NULL_DATE),
6885 NVL(plb.d_ext_attr8 ,G_NULL_DATE),
6886 NVL(plb.d_ext_attr9 ,G_NULL_DATE),
6887 NVL(plb.d_ext_attr10 ,G_NULL_DATE)
6888 ) p_lock_attrs,
6889 plb.attr_group_id
6890 FROM po_lines_all_ext_b plb,
6891 po_session_gt pogt
6892 WHERE plb.po_line_id = pogt.char1 -- po_line_id
6893 AND plb.draft_id = G_DRAFT_ID_MINUS_1
6894 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
6895 and pogt.index_char2 = g_lock_line_entity
6896 AND NOT EXISTS (SELECT 'exclude PRICING attribute category'
6897 FROM po_uda_ag_template_usages puatu,
6898 po_lines_all pla
6899 WHERE puatu.template_id = pla.uda_template_id
6900 AND puatu.attribute_category = 'PRICING'
6901 AND pla.po_line_id = plb.po_line_id
6902 AND puatu.attribute_group_id = plb.attr_group_id
6903 )
6904 ) base,
6905 (SELECT plbd.po_line_id,
6906 plbd.draft_id,
6907 po_uda_mod_p_lock_attrs(
6908 NVL(plbd.c_ext_attr1 ,G_NULL_CHAR),
6909 NVL(plbd.c_ext_attr2 ,G_NULL_CHAR),
6910 NVL(plbd.c_ext_attr3 ,G_NULL_CHAR),
6911 NVL(plbd.c_ext_attr4 ,G_NULL_CHAR),
6912 NVL(plbd.c_ext_attr5 ,G_NULL_CHAR),
6913 NVL(plbd.c_ext_attr6 ,G_NULL_CHAR),
6914 NVL(plbd.c_ext_attr7 ,G_NULL_CHAR),
6915 NVL(plbd.c_ext_attr8 ,G_NULL_CHAR),
6916 NVL(plbd.c_ext_attr9 ,G_NULL_CHAR),
6917 NVL(plbd.c_ext_attr10 ,G_NULL_CHAR),
6918 NVL(plbd.c_ext_attr11 ,G_NULL_CHAR),
6919 NVL(plbd.c_ext_attr12 ,G_NULL_CHAR),
6920 NVL(plbd.c_ext_attr13 ,G_NULL_CHAR),
6921 NVL(plbd.c_ext_attr14 ,G_NULL_CHAR),
6922 NVL(plbd.c_ext_attr15 ,G_NULL_CHAR),
6923 NVL(plbd.c_ext_attr16 ,G_NULL_CHAR),
6924 NVL(plbd.c_ext_attr17 ,G_NULL_CHAR),
6925 NVL(plbd.c_ext_attr18 ,G_NULL_CHAR),
6926 NVL(plbd.c_ext_attr19 ,G_NULL_CHAR),
6927 NVL(plbd.c_ext_attr20 ,G_NULL_CHAR),
6928 NVL(plbd.c_ext_attr21 ,G_NULL_CHAR),
6929 NVL(plbd.c_ext_attr22 ,G_NULL_CHAR),
6930 NVL(plbd.c_ext_attr23 ,G_NULL_CHAR),
6931 NVL(plbd.c_ext_attr24 ,G_NULL_CHAR),
6932 NVL(plbd.c_ext_attr25 ,G_NULL_CHAR),
6933 NVL(plbd.c_ext_attr26 ,G_NULL_CHAR),
6934 NVL(plbd.c_ext_attr27 ,G_NULL_CHAR),
6935 NVL(plbd.c_ext_attr28 ,G_NULL_CHAR),
6936 NVL(plbd.c_ext_attr29 ,G_NULL_CHAR),
6937 NVL(plbd.c_ext_attr30 ,G_NULL_CHAR),
6938 NVL(plbd.c_ext_attr31 ,G_NULL_CHAR),
6939 NVL(plbd.c_ext_attr32 ,G_NULL_CHAR),
6940 NVL(plbd.c_ext_attr33 ,G_NULL_CHAR),
6941 NVL(plbd.c_ext_attr34 ,G_NULL_CHAR),
6942 NVL(plbd.c_ext_attr35 ,G_NULL_CHAR),
6943 NVL(plbd.c_ext_attr36 ,G_NULL_CHAR),
6944 NVL(plbd.c_ext_attr37 ,G_NULL_CHAR),
6945 NVL(plbd.c_ext_attr38 ,G_NULL_CHAR),
6946 NVL(plbd.c_ext_attr39 ,G_NULL_CHAR),
6947 NVL(plbd.c_ext_attr40 ,G_NULL_CHAR),
6948 NVL(plbd.n_ext_attr1 ,G_NULL_NUM),
6949 NVL(plbd.n_ext_attr2 ,G_NULL_NUM),
6950 NVL(plbd.n_ext_attr3 ,G_NULL_NUM),
6951 NVL(plbd.n_ext_attr4 ,G_NULL_NUM),
6952 NVL(plbd.n_ext_attr5 ,G_NULL_NUM),
6953 NVL(plbd.n_ext_attr6 ,G_NULL_NUM),
6954 NVL(plbd.n_ext_attr7 ,G_NULL_NUM),
6955 NVL(plbd.n_ext_attr8 ,G_NULL_NUM),
6956 NVL(plbd.n_ext_attr9 ,G_NULL_NUM),
6957 NVL(plbd.n_ext_attr10 ,G_NULL_NUM),
6958 NVL(plbd.n_ext_attr11 ,G_NULL_NUM),
6959 NVL(plbd.n_ext_attr12 ,G_NULL_NUM),
6960 NVL(plbd.n_ext_attr13 ,G_NULL_NUM),
6961 NVL(plbd.n_ext_attr14 ,G_NULL_NUM),
6962 NVL(plbd.n_ext_attr15 ,G_NULL_NUM),
6963 NVL(plbd.n_ext_attr16 ,G_NULL_NUM),
6964 NVL(plbd.n_ext_attr17 ,G_NULL_NUM),
6965 NVL(plbd.n_ext_attr18 ,G_NULL_NUM),
6966 NVL(plbd.n_ext_attr19 ,G_NULL_NUM),
6967 NVL(plbd.n_ext_attr20 ,G_NULL_NUM),
6968 NVL(plbd.uom_ext_attr1 ,G_NULL_CHAR),
6969 NVL(plbd.uom_ext_attr2 ,G_NULL_CHAR),
6970 NVL(plbd.uom_ext_attr3 ,G_NULL_CHAR),
6971 NVL(plbd.uom_ext_attr4 ,G_NULL_CHAR),
6972 NVL(plbd.uom_ext_attr5 ,G_NULL_CHAR),
6973 NVL(plbd.uom_ext_attr6 ,G_NULL_CHAR),
6974 NVL(plbd.uom_ext_attr7 ,G_NULL_CHAR),
6975 NVL(plbd.uom_ext_attr8 ,G_NULL_CHAR),
6976 NVL(plbd.uom_ext_attr9 ,G_NULL_CHAR),
6977 NVL(plbd.uom_ext_attr10 ,G_NULL_CHAR),
6978 NVL(plbd.uom_ext_attr11 ,G_NULL_CHAR),
6979 NVL(plbd.uom_ext_attr12 ,G_NULL_CHAR),
6980 NVL(plbd.uom_ext_attr13 ,G_NULL_CHAR),
6981 NVL(plbd.uom_ext_attr14 ,G_NULL_CHAR),
6982 NVL(plbd.uom_ext_attr15 ,G_NULL_CHAR),
6983 NVL(plbd.uom_ext_attr16 ,G_NULL_CHAR),
6984 NVL(plbd.uom_ext_attr17 ,G_NULL_CHAR),
6985 NVL(plbd.uom_ext_attr18 ,G_NULL_CHAR),
6986 NVL(plbd.uom_ext_attr19 ,G_NULL_CHAR),
6987 NVL(plbd.uom_ext_attr20 ,G_NULL_CHAR),
6988 NVL(plbd.d_ext_attr1 ,G_NULL_DATE),
6989 NVL(plbd.d_ext_attr2 ,G_NULL_DATE),
6990 NVL(plbd.d_ext_attr3 ,G_NULL_DATE),
6991 NVL(plbd.d_ext_attr4 ,G_NULL_DATE),
6992 NVL(plbd.d_ext_attr5 ,G_NULL_DATE),
6993 NVL(plbd.d_ext_attr6 ,G_NULL_DATE),
6994 NVL(plbd.d_ext_attr7 ,G_NULL_DATE),
6995 NVL(plbd.d_ext_attr8 ,G_NULL_DATE),
6996 NVL(plbd.d_ext_attr9 ,G_NULL_DATE),
6997 NVL(plbd.d_ext_attr10 ,G_NULL_DATE)
6998 ) p_lock_attrs,
6999 plbd.attr_group_id
7000 FROM po_lines_all_ext_b plbd,
7001 po_session_gt pogt
7002 WHERE plbd.draft_id = p_draft_id
7003 AND plbd.po_line_id = pogt.char1 -- po_line_id
7004 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
7005 AND pogt.index_char2 = G_LOCK_LINE_ENTITY
7006 AND NOT EXISTS (SELECT 'exclude PRICING attribute category'
7007 FROM po_uda_ag_template_usages puatu,
7008 po_lines_all pla
7009 where puatu.template_id = pla.uda_template_id
7010 AND puatu.attribute_category = 'PRICING'
7011 AND pla.po_line_id = plbd.po_line_id
7012 AND puatu.attribute_group_id = plbd.attr_group_id
7013 )
7014 ) draft
7015 WHERE base.attr_group_id = draft.attr_group_id
7016 AND base.p_lock_attrs <> draft.p_lock_attrs;
7017
7018 d_position:=10;
7019 IF (PO_LOG.d_stmt) THEN
7020 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
7021 PO_LOG.stmt(d_module,d_position ,'number of rows INserted ',SQL%ROWCOUNT);
7022 END IF;
7023
7024 -- When a UDA attribute group does not have any attribute which has default
7025 -- value and user also does not enter any attribute value, then records
7026 -- for such attribute groups are not created in po_lines_all_ext_b.
7027 -- Now if user modifies such attribute groups in Mod, then a new record is
7028 -- created with the draft_id. We need to identify such records and lock the
7029 -- line as P lock.
7030 INSERT INTO po_session_gt(
7031 key,
7032 index_char1, -- records identifier
7033 index_char2, -- entity_name
7034 char1, -- entity_pk1
7035 num1, -- lock_by_draft_id
7036 char5 -- lock_type
7037 )
7038 SELECT po_session_gt_s.NEXTVAL,
7039 G_LOCKS_REQUIRED_ID,
7040 G_LOCK_LINE_ENTITY,
7041 plbd.po_line_id,
7042 p_draft_id,
7043 'P'
7044 FROM po_lines_draft_all plbd,
7045 po_session_gt pogt
7046 WHERE plbd.draft_id = p_draft_id
7047 AND plbd.po_line_id = pogt.char1 -- po_line_id
7048 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
7049 AND pogt.index_char2 = G_LOCK_LINE_ENTITY
7050 AND EXISTS (SELECT draft.attr_group_id
7051 FROM po_lines_all_ext_b draft,
7052 po_uda_ag_template_usages uda_usg
7053 WHERE draft.po_line_id = plbd.po_line_id
7054 AND draft.draft_id = p_draft_id
7055 AND draft.uda_template_id = uda_usg.template_id
7056 AND draft.attr_group_id = uda_usg.attribute_group_id
7057 AND uda_usg.attribute_category <> 'PRICING'
7058 MINUS
7059 SELECT base.attr_group_id
7060 FROM po_lines_all_ext_b base,
7061 po_uda_ag_template_usages uda_usg
7062 WHERE base.po_line_id = plbd.po_line_id
7063 AND base.draft_id = -1
7064 AND base.uda_template_id = uda_usg.template_id
7065 AND base.attr_group_id = uda_usg.attribute_group_id
7066 AND uda_usg.attribute_category <> 'PRICING'
7067 );
7068
7069 d_position:=15;
7070 IF (PO_LOG.d_stmt) THEN
7071 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
7072 PO_LOG.stmt(d_module,d_position ,'number of rows Inserted ',SQL%ROWCOUNT);
7073 END IF;
7074
7075 -- Identify Line level locks required because of change in po_lines_all_ext_tl
7076 INSERT INTO po_session_gt(
7077 key,
7078 index_char1, -- records identifier
7079 index_char2, -- entity_name
7080 char1, -- entity_pk1
7081 num1, -- lock_by_draft_id
7082 char5 -- lock_type
7083 )
7084 SELECT po_session_gt_s.NEXTVAL,
7085 G_LOCKS_REQUIRED_ID,
7086 G_LOCK_LINE_ENTITY,
7087 draft.po_line_id,
7088 draft.draft_id,
7089 CASE
7090 WHEN base.p_lock_attrs <> draft.p_lock_attrs THEN 'P'
7091 ELSE NULL
7092 end lock_type
7093 FROM (SELECT plt.po_line_id,
7094 plt.draft_id,
7095 po_uda_tl_mod_p_lock_attrs(
7096 NVL(plt.tl_ext_attr1 ,G_NULL_CHAR),
7097 NVL(plt.tl_ext_attr2 ,G_NULL_CHAR),
7098 NVL(plt.tl_ext_attr3 ,G_NULL_CHAR),
7099 NVL(plt.tl_ext_attr4 ,G_NULL_CHAR),
7100 NVL(plt.tl_ext_attr5 ,G_NULL_CHAR),
7101 NVL(plt.tl_ext_attr6 ,G_NULL_CHAR),
7102 NVL(plt.tl_ext_attr7 ,G_NULL_CHAR),
7103 NVL(plt.tl_ext_attr8 ,G_NULL_CHAR),
7104 NVL(plt.tl_ext_attr9 ,G_NULL_CHAR),
7105 NVL(plt.tl_ext_attr10 ,G_NULL_CHAR),
7106 NVL(plt.tl_ext_attr11 ,G_NULL_CHAR),
7107 NVL(plt.tl_ext_attr12 ,G_NULL_CHAR),
7108 NVL(plt.tl_ext_attr13 ,G_NULL_CHAR),
7109 NVL(plt.tl_ext_attr14 ,G_NULL_CHAR),
7110 NVL(plt.tl_ext_attr15 ,G_NULL_CHAR),
7111 NVL(plt.tl_ext_attr16 ,G_NULL_CHAR),
7112 NVL(plt.tl_ext_attr17 ,G_NULL_CHAR),
7113 NVL(plt.tl_ext_attr18 ,G_NULL_CHAR),
7114 NVL(plt.tl_ext_attr19 ,G_NULL_CHAR),
7115 NVL(plt.tl_ext_attr20 ,G_NULL_CHAR),
7116 NVL(plt.tl_ext_attr21 ,G_NULL_CHAR),
7117 NVL(plt.tl_ext_attr22 ,G_NULL_CHAR),
7118 NVL(plt.tl_ext_attr23 ,G_NULL_CHAR),
7119 NVL(plt.tl_ext_attr24 ,G_NULL_CHAR),
7120 NVL(plt.tl_ext_attr25 ,G_NULL_CHAR),
7121 NVL(plt.tl_ext_attr26 ,G_NULL_CHAR),
7122 NVL(plt.tl_ext_attr27 ,G_NULL_CHAR),
7123 NVL(plt.tl_ext_attr28 ,G_NULL_CHAR),
7124 NVL(plt.tl_ext_attr29 ,G_NULL_CHAR),
7125 NVL(plt.tl_ext_attr30 ,G_NULL_CHAR),
7126 NVL(plt.tl_ext_attr31 ,G_NULL_CHAR),
7127 NVL(plt.tl_ext_attr32 ,G_NULL_CHAR),
7128 NVL(plt.tl_ext_attr33 ,G_NULL_CHAR),
7129 NVL(plt.tl_ext_attr34 ,G_NULL_CHAR),
7130 NVL(plt.tl_ext_attr35 ,G_NULL_CHAR),
7131 NVL(plt.tl_ext_attr36 ,G_NULL_CHAR),
7132 NVL(plt.tl_ext_attr37 ,G_NULL_CHAR),
7133 NVL(plt.tl_ext_attr38 ,G_NULL_CHAR),
7134 NVL(plt.tl_ext_attr39 ,G_NULL_CHAR),
7135 NVL(plt.tl_ext_attr40 ,G_NULL_CHAR)
7136 ) p_lock_attrs,
7137 plt.attr_group_id,
7138 plt.language
7139 FROM po_lines_all_ext_tl plt,
7140 po_session_gt pogt
7141 where plt.po_line_id = pogt.char1 -- po_line_id
7142 AND plt.draft_id = G_DRAFT_ID_MINUS_1
7143 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
7144 and pogt.index_char2 = g_lock_header_entity
7145 ) base,
7146 (select pltd.po_line_id,
7147 pltd.draft_id,
7148 po_uda_tl_mod_p_lock_attrs(
7149 NVL(pltd.tl_ext_attr1 ,G_NULL_CHAR),
7150 NVL(pltd.tl_ext_attr2 ,G_NULL_CHAR),
7151 NVL(pltd.tl_ext_attr3 ,G_NULL_CHAR),
7152 NVL(pltd.tl_ext_attr4 ,G_NULL_CHAR),
7153 NVL(pltd.tl_ext_attr5 ,G_NULL_CHAR),
7154 NVL(pltd.tl_ext_attr6 ,G_NULL_CHAR),
7155 NVL(pltd.tl_ext_attr7 ,G_NULL_CHAR),
7156 NVL(pltd.tl_ext_attr8 ,G_NULL_CHAR),
7157 NVL(pltd.tl_ext_attr9 ,G_NULL_CHAR),
7158 NVL(pltd.tl_ext_attr10 ,G_NULL_CHAR),
7159 NVL(pltd.tl_ext_attr11 ,G_NULL_CHAR),
7160 NVL(pltd.tl_ext_attr12 ,G_NULL_CHAR),
7161 NVL(pltd.tl_ext_attr13 ,G_NULL_CHAR),
7162 NVL(pltd.tl_ext_attr14 ,G_NULL_CHAR),
7163 NVL(pltd.tl_ext_attr15 ,G_NULL_CHAR),
7164 NVL(pltd.tl_ext_attr16 ,G_NULL_CHAR),
7165 NVL(pltd.tl_ext_attr17 ,G_NULL_CHAR),
7166 NVL(pltd.tl_ext_attr18 ,G_NULL_CHAR),
7167 NVL(pltd.tl_ext_attr19 ,G_NULL_CHAR),
7168 NVL(pltd.tl_ext_attr20 ,G_NULL_CHAR),
7169 NVL(pltd.tl_ext_attr21 ,G_NULL_CHAR),
7170 NVL(pltd.tl_ext_attr22 ,G_NULL_CHAR),
7171 NVL(pltd.tl_ext_attr23 ,G_NULL_CHAR),
7172 NVL(pltd.tl_ext_attr24 ,G_NULL_CHAR),
7173 NVL(pltd.tl_ext_attr25 ,G_NULL_CHAR),
7174 NVL(pltd.tl_ext_attr26 ,G_NULL_CHAR),
7175 NVL(pltd.tl_ext_attr27 ,G_NULL_CHAR),
7176 NVL(pltd.tl_ext_attr28 ,G_NULL_CHAR),
7177 NVL(pltd.tl_ext_attr29 ,G_NULL_CHAR),
7178 NVL(pltd.tl_ext_attr30 ,G_NULL_CHAR),
7179 NVL(pltd.tl_ext_attr31 ,G_NULL_CHAR),
7180 NVL(pltd.tl_ext_attr32 ,G_NULL_CHAR),
7181 NVL(pltd.tl_ext_attr33 ,G_NULL_CHAR),
7182 NVL(pltd.tl_ext_attr34 ,G_NULL_CHAR),
7183 NVL(pltd.tl_ext_attr35 ,G_NULL_CHAR),
7184 NVL(pltd.tl_ext_attr36 ,G_NULL_CHAR),
7185 NVL(pltd.tl_ext_attr37 ,G_NULL_CHAR),
7186 NVL(pltd.tl_ext_attr38 ,G_NULL_CHAR),
7187 NVL(pltd.tl_ext_attr39 ,G_NULL_CHAR),
7188 NVL(pltd.tl_ext_attr40 ,G_NULL_CHAR)
7189 ) p_lock_attrs,
7190 pltd.attr_group_id,
7191 pltd.language
7192 FROM po_lines_all_ext_tl pltd,
7193 po_session_gt pogt
7194 WHERE pltd.draft_id = p_draft_id
7195 AND pltd.po_line_id = pogt.char1 -- po_header_id
7196 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
7197 and pogt.index_char2 = g_lock_header_entity
7198 ) draft
7199 where base.attr_group_id = draft.attr_group_id
7200 AND base.language = draft.language
7201 AND base.p_lock_attrs <> draft.p_lock_attrs;
7202
7203 d_position:=20;
7204 IF (PO_LOG.d_stmt) THEN
7205 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
7206 PO_LOG.stmt(d_module,d_position ,'number of rows Inserted ',SQL%ROWCOUNT);
7207 END IF;
7208
7209 -- Identify Line level Complex Pricing Attribtues changes and corresponding
7210 -- lock required and insert into gt table
7211
7212 -- Identify S type of locks required
7213 INSERT INTO po_session_gt(
7214 key,
7215 index_char1, -- records identifier
7216 index_char2, -- entity_name
7217 char1, -- entity_pk1
7218 num1, -- lock_by_draft_id
7219 char5 -- lock_type
7220 )
7221 SELECT po_session_gt_s.NEXTVAL,
7222 G_LOCKS_REQUIRED_ID,
7223 G_LOCK_LINE_ENTITY,
7224 polext_base.po_line_id,
7225 polext_draft.draft_id,
7226 'S'
7227 FROM po_lines_all_ext_b polext_base,
7228 po_lines_all_ext_b polext_draft,
7229 po_session_gt pogt
7230 WHERE EXISTS (SELECT 'Is Complex Pricig Attribute'
7231 FROM po_uda_ag_template_usages agtu,
7232 po_lines_all pol
7233 WHERE polext_base.po_line_id = pol.po_line_id
7234 AND pol.uda_template_id = agtu.template_id
7235 AND polext_base.attr_group_id = agtu.attribute_group_id
7236 AND agtu.attribute_category = 'PRICING')
7237 AND polext_draft.draft_id = p_draft_id
7238 AND polext_base.draft_id = -1
7239 AND polext_base.po_line_id = polext_draft.po_line_id
7240 AND polext_base.attr_group_id = polext_draft.attr_group_id
7241 -- ignore delta and old values records
7242 AND polext_base.data_level_id = polext_draft.data_level_id
7243 AND polext_base.po_line_id = pogt.char1 -- po_line_id
7244 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID -- records identifier
7245 AND pogt.index_char2 = G_LOCK_LINE_ENTITY -- entity_name
7246 AND (NVL(polext_base.n_ext_attr1, G_NULL_NUM) <> NVL(polext_draft.n_ext_attr1, G_NULL_NUM)
7247 OR NVL(polext_base.n_ext_attr3, G_NULL_NUM) <> NVL(polext_draft.n_ext_attr3, G_NULL_NUM)
7248 OR NVL(polext_base.n_ext_attr4, G_NULL_NUM) <> NVL(polext_draft.n_ext_attr4, G_NULL_NUM)
7249 OR NVL(polext_base.n_ext_attr5, G_NULL_NUM) <> NVL(polext_draft.n_ext_attr5, G_NULL_NUM)
7250 OR NVL(polext_base.n_ext_attr7, G_NULL_NUM) <> NVL(polext_draft.n_ext_attr7, G_NULL_NUM)
7251 OR NVL(polext_base.n_ext_attr8, G_NULL_NUM) <> NVL(polext_draft.n_ext_attr8, G_NULL_NUM)
7252 OR NVL(polext_base.n_ext_attr10, G_NULL_NUM) <> NVL(polext_draft.n_ext_attr10, G_NULL_NUM)
7253 OR NVL(polext_base.n_ext_attr11, G_NULL_NUM) <> NVL(polext_draft.n_ext_attr11, G_NULL_NUM)
7254 OR NVL(polext_base.n_ext_attr20, G_NULL_NUM) <> NVL(polext_draft.n_ext_attr20, G_NULL_NUM)
7255 -- include n_ext_attr2 even if it is used as UNIT_PRICE
7256 -- if UNIT_PRICE is changed F lock will be taken in the next SQL
7257 OR NVL(polext_base.n_ext_attr2, G_NULL_NUM) <> NVL(polext_draft.n_ext_attr2, G_NULL_NUM)
7258 );
7259
7260 d_position:=30;
7261 IF (PO_LOG.d_stmt) THEN
7262 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
7263 PO_LOG.stmt(d_module,d_position ,'number of rows Inserted ',SQL%ROWCOUNT);
7264 END IF;
7265
7266 -- Identify F type of locks required, i.e. if UOM or UNIT_PRICE have changed
7267 INSERT INTO po_session_gt(
7268 key,
7269 index_char1, -- records identifier
7270 index_char2, -- entity_name
7271 char1, -- entity_pk1
7272 num1, -- lock_by_draft_id
7273 char5 -- lock_type
7274 )
7275 SELECT po_session_gt_s.NEXTVAL,
7276 G_LOCKS_REQUIRED_ID,
7277 G_LOCK_LINE_ENTITY,
7278 polext_base.po_line_id,
7279 polext_draft.draft_id,
7280 'F'
7281 FROM po_lines_all_ext_b polext_base,
7282 po_lines_all_ext_b polext_draft,
7283 po_session_gt pogt
7284 WHERE EXISTS (SELECT 'Is Complex Pricig Attribute'
7285 FROM po_uda_ag_template_usages agtu,
7286 po_lines_all pol
7287 WHERE polext_base.po_line_id = pol.po_line_id
7288 AND pol.uda_template_id = agtu.template_id
7289 AND polext_base.attr_group_id = agtu.attribute_group_id
7290 AND agtu.attribute_category = 'PRICING')
7291 AND polext_draft.draft_id = p_draft_id
7292 AND polext_base.draft_id = -1
7293 AND polext_base.po_line_id = polext_draft.po_line_id
7294 AND polext_base.attr_group_id = polext_draft.attr_group_id
7295 -- ignore delta and old values records
7296 AND polext_base.data_level_id = polext_draft.data_level_id
7297 AND polext_base.po_line_id = pogt.char1 -- po_line_id
7298 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID -- records identifier
7299 AND pogt.index_char2 = G_LOCK_LINE_ENTITY -- entity_name
7300 AND (NVL(polext_base.c_ext_attr1, G_NULL_CHAR) <> NVL(polext_draft.c_ext_attr1, G_NULL_CHAR)
7301 -- compare n_ext_attr2 only if it is used as UNIT_PRICE
7302 OR NVL(polext_base.n_ext_attr2, G_NULL_NUM) <> NVL(polext_draft.n_ext_attr2, G_NULL_NUM)
7303 AND EXISTS (SELECT 'n_ext_attr2 used as UNIT_PRICE'
7304 FROM ego_attrs_v attrs,
7305 ego_obj_attr_grp_assocs_v att_assoc,
7306 po_uda_ag_template_usages agtu,
7307 po_lines_all pol
7308 WHERE attrs.attr_group_type = att_assoc.attr_group_type
7309 AND attrs.attr_group_name = att_assoc.attr_group_name
7310 --AND attrs.attr_group_type = 'PO_LINE_EXT_ATTRS'
7311 --AND attrs.attr_group_name LIKE 'AMT%'
7312 AND attrs.attr_name = 'UNIT_PRICE'
7313 AND polext_base.attr_group_id = att_assoc.attr_group_id
7314 AND polext_base.po_line_id = pol.po_line_id
7315 AND pol.uda_template_id = agtu.template_id
7316 AND polext_base.attr_group_id = agtu.attribute_group_id
7317 AND agtu.attribute_category = 'PRICING')
7318 );
7319
7320 d_position:=40;
7321 IF (PO_LOG.d_stmt) THEN
7322 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
7323 PO_LOG.stmt(d_module,d_position ,'number of rows Inserted ',SQL%ROWCOUNT);
7324 END IF;
7325
7326 d_position:=50;
7327 IF (PO_LOG.d_proc) THEN
7328 PO_LOG.proc_end(d_module);
7329 END IF;
7330
7331 EXCEPTION
7332 WHEN OTHERS THEN
7333 IF (PO_LOG.d_exc) THEN
7334 PO_LOG.exc(d_module,d_position,SQLCODE || SQLERRM);
7335 END IF;
7336 RAISE;
7337 END identify_uda_line_locks;
7338
7339
7340 --------------------------------------------------------------------------------
7341 --Start of Comments
7342 --Name: identify_uda_shipment_locks
7343 -- <Conc Mods Project>
7344 --Pre-reqs: None
7345 --Modifies:
7346 -- po_entity_locks
7347 --Locks:
7348 -- po_line_locations_all_ext_b, po_line_locations_all_ext_tl
7349 --Function:
7350 -- This procedure generates the change data for the passed entities PKs,
7351 -- creates entries in po_entity_locks table corresponding to the modified
7352 -- attributes, and locks the required rows in transaction tables.
7353 --Parameters:
7354 --IN:
7355 --p_draft_id
7356 -- draft id of the current Modification - Award/IDV
7357 --Notes:
7358 --End of Comments
7359 --------------------------------------------------------------------------------
7360 PROCEDURE identify_uda_shipment_locks(
7361 p_draft_id IN NUMBER
7362 )
7363 IS
7364 d_api_name CONSTANT VARCHAR2(30) := 'identify_uda_shipment_locks';
7365 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
7366 d_position NUMBER;
7367
7368 BEGIN
7369
7370 d_position:=0;
7371 IF (PO_LOG.d_proc) THEN
7372 PO_LOG.proc_begin(d_module);
7373 PO_LOG.proc_begin(d_module, 'p_draft_id', p_draft_id);
7374 END IF;
7375 -- Identify Shipment level locks required because of change in po_line_locations_all_ext_b
7376 INSERT INTO po_session_gt(
7377 key,
7378 index_char1, -- records identifier
7379 index_char2, -- entity_name
7380 char1, -- entity_pk1
7381 num1, -- lock_by_draft_id
7382 char5 -- lock_type
7383 )
7384 SELECT po_session_gt_s.NEXTVAL,
7385 G_LOCKS_REQUIRED_ID,
7386 G_LOCK_SHIPMENT_ENTITY,
7387 draft.line_location_id,
7388 draft.draft_id,
7389 CASE
7390 WHEN base.p_lock_attrs <> draft.p_lock_attrs THEN 'P'
7391 ELSE NULL
7392 END lock_type
7393 FROM (SELECT pllb.line_location_id,
7394 pllb.draft_id,
7395 po_uda_mod_p_lock_attrs(
7396 NVL(pllb.c_ext_attr1 ,G_NULL_CHAR),
7397 NVL(pllb.c_ext_attr2 ,G_NULL_CHAR),
7398 NVL(pllb.c_ext_attr3 ,G_NULL_CHAR),
7399 NVL(pllb.c_ext_attr4 ,G_NULL_CHAR),
7400 NVL(pllb.c_ext_attr5 ,G_NULL_CHAR),
7401 NVL(pllb.c_ext_attr6 ,G_NULL_CHAR),
7402 NVL(pllb.c_ext_attr7 ,G_NULL_CHAR),
7403 NVL(pllb.c_ext_attr8 ,G_NULL_CHAR),
7404 NVL(pllb.c_ext_attr9 ,G_NULL_CHAR),
7405 NVL(pllb.c_ext_attr10 ,G_NULL_CHAR),
7406 NVL(pllb.c_ext_attr11 ,G_NULL_CHAR),
7407 NVL(pllb.c_ext_attr12 ,G_NULL_CHAR),
7408 NVL(pllb.c_ext_attr13 ,G_NULL_CHAR),
7409 NVL(pllb.c_ext_attr14 ,G_NULL_CHAR),
7410 NVL(pllb.c_ext_attr15 ,G_NULL_CHAR),
7411 NVL(pllb.c_ext_attr16 ,G_NULL_CHAR),
7412 NVL(pllb.c_ext_attr17 ,G_NULL_CHAR),
7413 NVL(pllb.c_ext_attr18 ,G_NULL_CHAR),
7414 NVL(pllb.c_ext_attr19 ,G_NULL_CHAR),
7415 NVL(pllb.c_ext_attr20 ,G_NULL_CHAR),
7416 NVL(pllb.c_ext_attr21 ,G_NULL_CHAR),
7417 NVL(pllb.c_ext_attr22 ,G_NULL_CHAR),
7418 NVL(pllb.c_ext_attr23 ,G_NULL_CHAR),
7419 NVL(pllb.c_ext_attr24 ,G_NULL_CHAR),
7420 NVL(pllb.c_ext_attr25 ,G_NULL_CHAR),
7421 NVL(pllb.c_ext_attr26 ,G_NULL_CHAR),
7422 NVL(pllb.c_ext_attr27 ,G_NULL_CHAR),
7423 NVL(pllb.c_ext_attr28 ,G_NULL_CHAR),
7424 NVL(pllb.c_ext_attr29 ,G_NULL_CHAR),
7425 NVL(pllb.c_ext_attr30 ,G_NULL_CHAR),
7426 NVL(pllb.c_ext_attr31 ,G_NULL_CHAR),
7427 NVL(pllb.c_ext_attr32 ,G_NULL_CHAR),
7428 NVL(pllb.c_ext_attr33 ,G_NULL_CHAR),
7429 NVL(pllb.c_ext_attr34 ,G_NULL_CHAR),
7430 NVL(pllb.c_ext_attr35 ,G_NULL_CHAR),
7431 NVL(pllb.c_ext_attr36 ,G_NULL_CHAR),
7432 NVL(pllb.c_ext_attr37 ,G_NULL_CHAR),
7433 NVL(pllb.c_ext_attr38 ,G_NULL_CHAR),
7434 NVL(pllb.c_ext_attr39 ,G_NULL_CHAR),
7435 NVL(pllb.c_ext_attr40 ,G_NULL_CHAR),
7436 NVL(pllb.n_ext_attr1 ,G_NULL_NUM),
7437 NVL(pllb.n_ext_attr2 ,G_NULL_NUM),
7438 NVL(pllb.n_ext_attr3 ,G_NULL_NUM),
7439 NVL(pllb.n_ext_attr4 ,G_NULL_NUM),
7440 NVL(pllb.n_ext_attr5 ,G_NULL_NUM),
7441 NVL(pllb.n_ext_attr6 ,G_NULL_NUM),
7442 NVL(pllb.n_ext_attr7 ,G_NULL_NUM),
7443 NVL(pllb.n_ext_attr8 ,G_NULL_NUM),
7444 NVL(pllb.n_ext_attr9 ,G_NULL_NUM),
7445 NVL(pllb.n_ext_attr10 ,G_NULL_NUM),
7446 NVL(pllb.n_ext_attr11 ,G_NULL_NUM),
7447 NVL(pllb.n_ext_attr12 ,G_NULL_NUM),
7448 NVL(pllb.n_ext_attr13 ,G_NULL_NUM),
7449 NVL(pllb.n_ext_attr14 ,G_NULL_NUM),
7450 NVL(pllb.n_ext_attr15 ,G_NULL_NUM),
7451 NVL(pllb.n_ext_attr16 ,G_NULL_NUM),
7452 NVL(pllb.n_ext_attr17 ,G_NULL_NUM),
7453 NVL(pllb.n_ext_attr18 ,G_NULL_NUM),
7454 NVL(pllb.n_ext_attr19 ,G_NULL_NUM),
7455 NVL(pllb.n_ext_attr20 ,G_NULL_NUM),
7456 NVL(pllb.uom_ext_attr1 ,G_NULL_CHAR),
7457 NVL(pllb.uom_ext_attr2 ,G_NULL_CHAR),
7458 NVL(pllb.uom_ext_attr3 ,G_NULL_CHAR),
7459 NVL(pllb.uom_ext_attr4 ,G_NULL_CHAR),
7460 NVL(pllb.uom_ext_attr5 ,G_NULL_CHAR),
7461 NVL(pllb.uom_ext_attr6 ,G_NULL_CHAR),
7462 NVL(pllb.uom_ext_attr7 ,G_NULL_CHAR),
7463 NVL(pllb.uom_ext_attr8 ,G_NULL_CHAR),
7464 NVL(pllb.uom_ext_attr9 ,G_NULL_CHAR),
7465 NVL(pllb.uom_ext_attr10 ,G_NULL_CHAR),
7466 NVL(pllb.uom_ext_attr11 ,G_NULL_CHAR),
7467 NVL(pllb.uom_ext_attr12 ,G_NULL_CHAR),
7468 NVL(pllb.uom_ext_attr13 ,G_NULL_CHAR),
7469 NVL(pllb.uom_ext_attr14 ,G_NULL_CHAR),
7470 NVL(pllb.uom_ext_attr15 ,G_NULL_CHAR),
7471 NVL(pllb.uom_ext_attr16 ,G_NULL_CHAR),
7472 NVL(pllb.uom_ext_attr17 ,G_NULL_CHAR),
7473 NVL(pllb.uom_ext_attr18 ,G_NULL_CHAR),
7474 NVL(pllb.uom_ext_attr19 ,G_NULL_CHAR),
7475 NVL(pllb.uom_ext_attr20 ,G_NULL_CHAR),
7476 NVL(pllb.d_ext_attr1 ,G_NULL_DATE),
7477 NVL(pllb.d_ext_attr2 ,G_NULL_DATE),
7478 NVL(pllb.d_ext_attr3 ,G_NULL_DATE),
7479 NVL(pllb.d_ext_attr4 ,G_NULL_DATE),
7480 NVL(pllb.d_ext_attr5 ,G_NULL_DATE),
7481 NVL(pllb.d_ext_attr6 ,G_NULL_DATE),
7482 NVL(pllb.d_ext_attr7 ,G_NULL_DATE),
7483 NVL(pllb.d_ext_attr8 ,G_NULL_DATE),
7484 NVL(pllb.d_ext_attr9 ,G_NULL_DATE),
7485 NVL(pllb.d_ext_attr10 ,G_NULL_DATE)
7486 ) p_lock_attrs,
7487 pllb.attr_group_id
7488 FROM po_line_locations_all_ext_b pllb,
7489 po_session_gt pogt
7490 WHERE pllb.line_location_id = pogt.char1 -- po_header_id
7491 AND pllb.draft_id = G_DRAFT_ID_MINUS_1
7492 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
7493 AND pogt.index_char2 = G_LOCK_SHIPMENT_ENTITY
7494 ) base,
7495 (SELECT pllbd.line_location_id,
7496 pllbd.draft_id,
7497 po_uda_mod_p_lock_attrs(
7498 NVL(pllbd.c_ext_attr1 ,G_NULL_CHAR),
7499 NVL(pllbd.c_ext_attr2 ,G_NULL_CHAR),
7500 NVL(pllbd.c_ext_attr3 ,G_NULL_CHAR),
7501 NVL(pllbd.c_ext_attr4 ,G_NULL_CHAR),
7502 NVL(pllbd.c_ext_attr5 ,G_NULL_CHAR),
7503 NVL(pllbd.c_ext_attr6 ,G_NULL_CHAR),
7504 NVL(pllbd.c_ext_attr7 ,G_NULL_CHAR),
7505 NVL(pllbd.c_ext_attr8 ,G_NULL_CHAR),
7506 NVL(pllbd.c_ext_attr9 ,G_NULL_CHAR),
7507 NVL(pllbd.c_ext_attr10 ,G_NULL_CHAR),
7508 NVL(pllbd.c_ext_attr11 ,G_NULL_CHAR),
7509 NVL(pllbd.c_ext_attr12 ,G_NULL_CHAR),
7510 NVL(pllbd.c_ext_attr13 ,G_NULL_CHAR),
7511 NVL(pllbd.c_ext_attr14 ,G_NULL_CHAR),
7512 NVL(pllbd.c_ext_attr15 ,G_NULL_CHAR),
7513 NVL(pllbd.c_ext_attr16 ,G_NULL_CHAR),
7514 NVL(pllbd.c_ext_attr17 ,G_NULL_CHAR),
7515 NVL(pllbd.c_ext_attr18 ,G_NULL_CHAR),
7516 NVL(pllbd.c_ext_attr19 ,G_NULL_CHAR),
7517 NVL(pllbd.c_ext_attr20 ,G_NULL_CHAR),
7518 NVL(pllbd.c_ext_attr21 ,G_NULL_CHAR),
7519 NVL(pllbd.c_ext_attr22 ,G_NULL_CHAR),
7520 NVL(pllbd.c_ext_attr23 ,G_NULL_CHAR),
7521 NVL(pllbd.c_ext_attr24 ,G_NULL_CHAR),
7522 NVL(pllbd.c_ext_attr25 ,G_NULL_CHAR),
7523 NVL(pllbd.c_ext_attr26 ,G_NULL_CHAR),
7524 NVL(pllbd.c_ext_attr27 ,G_NULL_CHAR),
7525 NVL(pllbd.c_ext_attr28 ,G_NULL_CHAR),
7526 NVL(pllbd.c_ext_attr29 ,G_NULL_CHAR),
7527 NVL(pllbd.c_ext_attr30 ,G_NULL_CHAR),
7528 NVL(pllbd.c_ext_attr31 ,G_NULL_CHAR),
7529 NVL(pllbd.c_ext_attr32 ,G_NULL_CHAR),
7530 NVL(pllbd.c_ext_attr33 ,G_NULL_CHAR),
7531 NVL(pllbd.c_ext_attr34 ,G_NULL_CHAR),
7532 NVL(pllbd.c_ext_attr35 ,G_NULL_CHAR),
7533 NVL(pllbd.c_ext_attr36 ,G_NULL_CHAR),
7534 NVL(pllbd.c_ext_attr37 ,G_NULL_CHAR),
7535 NVL(pllbd.c_ext_attr38 ,G_NULL_CHAR),
7536 NVL(pllbd.c_ext_attr39 ,G_NULL_CHAR),
7537 NVL(pllbd.c_ext_attr40 ,G_NULL_CHAR),
7538 NVL(pllbd.n_ext_attr1 ,G_NULL_NUM),
7539 NVL(pllbd.n_ext_attr2 ,G_NULL_NUM),
7540 NVL(pllbd.n_ext_attr3 ,G_NULL_NUM),
7541 NVL(pllbd.n_ext_attr4 ,G_NULL_NUM),
7542 NVL(pllbd.n_ext_attr5 ,G_NULL_NUM),
7543 NVL(pllbd.n_ext_attr6 ,G_NULL_NUM),
7544 NVL(pllbd.n_ext_attr7 ,G_NULL_NUM),
7545 NVL(pllbd.n_ext_attr8 ,G_NULL_NUM),
7546 NVL(pllbd.n_ext_attr9 ,G_NULL_NUM),
7547 NVL(pllbd.n_ext_attr10 ,G_NULL_NUM),
7548 NVL(pllbd.n_ext_attr11 ,G_NULL_NUM),
7549 NVL(pllbd.n_ext_attr12 ,G_NULL_NUM),
7550 NVL(pllbd.n_ext_attr13 ,G_NULL_NUM),
7551 NVL(pllbd.n_ext_attr14 ,G_NULL_NUM),
7552 NVL(pllbd.n_ext_attr15 ,G_NULL_NUM),
7553 NVL(pllbd.n_ext_attr16 ,G_NULL_NUM),
7554 NVL(pllbd.n_ext_attr17 ,G_NULL_NUM),
7555 NVL(pllbd.n_ext_attr18 ,G_NULL_NUM),
7556 NVL(pllbd.n_ext_attr19 ,G_NULL_NUM),
7557 NVL(pllbd.n_ext_attr20 ,G_NULL_NUM),
7558 NVL(pllbd.uom_ext_attr1 ,G_NULL_CHAR),
7559 NVL(pllbd.uom_ext_attr2 ,G_NULL_CHAR),
7560 NVL(pllbd.uom_ext_attr3 ,G_NULL_CHAR),
7561 NVL(pllbd.uom_ext_attr4 ,G_NULL_CHAR),
7562 NVL(pllbd.uom_ext_attr5 ,G_NULL_CHAR),
7563 NVL(pllbd.uom_ext_attr6 ,G_NULL_CHAR),
7564 NVL(pllbd.uom_ext_attr7 ,G_NULL_CHAR),
7565 NVL(pllbd.uom_ext_attr8 ,G_NULL_CHAR),
7566 NVL(pllbd.uom_ext_attr9 ,G_NULL_CHAR),
7567 NVL(pllbd.uom_ext_attr10 ,G_NULL_CHAR),
7568 NVL(pllbd.uom_ext_attr11 ,G_NULL_CHAR),
7569 NVL(pllbd.uom_ext_attr12 ,G_NULL_CHAR),
7570 NVL(pllbd.uom_ext_attr13 ,G_NULL_CHAR),
7571 NVL(pllbd.uom_ext_attr14 ,G_NULL_CHAR),
7572 NVL(pllbd.uom_ext_attr15 ,G_NULL_CHAR),
7573 NVL(pllbd.uom_ext_attr16 ,G_NULL_CHAR),
7574 NVL(pllbd.uom_ext_attr17 ,G_NULL_CHAR),
7575 NVL(pllbd.uom_ext_attr18 ,G_NULL_CHAR),
7576 NVL(pllbd.uom_ext_attr19 ,G_NULL_CHAR),
7577 NVL(pllbd.uom_ext_attr20 ,G_NULL_CHAR),
7578 NVL(pllbd.d_ext_attr1 ,G_NULL_DATE),
7579 NVL(pllbd.d_ext_attr2 ,G_NULL_DATE),
7580 NVL(pllbd.d_ext_attr3 ,G_NULL_DATE),
7581 NVL(pllbd.d_ext_attr4 ,G_NULL_DATE),
7582 NVL(pllbd.d_ext_attr5 ,G_NULL_DATE),
7583 NVL(pllbd.d_ext_attr6 ,G_NULL_DATE),
7584 NVL(pllbd.d_ext_attr7 ,G_NULL_DATE),
7585 NVL(pllbd.d_ext_attr8 ,G_NULL_DATE),
7586 NVL(pllbd.d_ext_attr9 ,G_NULL_DATE),
7587 NVL(pllbd.d_ext_attr10 ,G_NULL_DATE)
7588 ) p_lock_attrs,
7589 pllbd.attr_group_id
7590 FROM po_line_locations_all_ext_b pllbd,
7591 po_session_gt pogt
7592 WHERE pllbd.draft_id = p_draft_id
7593 AND pllbd.line_location_id = pogt.char1 -- line_location_id
7594 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
7595 AND pogt.index_char2 = G_LOCK_SHIPMENT_ENTITY
7596 ) draft
7597 WHERE base.attr_group_id = draft.attr_group_id
7598 AND base.p_lock_attrs <> draft.p_lock_attrs;
7599
7600 d_position:=10;
7601 IF (PO_LOG.d_stmt) THEN
7602 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
7603 PO_LOG.stmt(d_module,d_position ,'number of rows Inserted ',SQL%ROWCOUNT);
7604 END IF;
7605
7606 -- When a UDA attribute group does not have any attribute which has default
7607 -- value and user also does not enter any attribute value, then records
7608 -- for such attribute groups are not created in po_line_locations_all_ext_b.
7609 -- Now if user modifies such attribute groups in Mod, then a new record is
7610 -- created with the draft_id. We need to identify such records and lock the
7611 -- shipment as P lock.
7612 INSERT INTO po_session_gt(
7613 key,
7614 index_char1, -- records identifier
7615 index_char2, -- entity_name
7616 char1, -- entity_pk1
7617 num1, -- lock_by_draft_id
7618 char5 -- lock_type
7619 )
7620 SELECT po_session_gt_s.NEXTVAL,
7621 G_LOCKS_REQUIRED_ID,
7622 G_LOCK_SHIPMENT_ENTITY,
7623 pllbd.line_location_id,
7624 p_draft_id,
7625 'P'
7626 FROM po_line_locations_draft_all pllbd,
7627 po_session_gt pogt
7628 WHERE pllbd.draft_id = p_draft_id
7629 AND pllbd.line_location_id = pogt.char1 -- line_location_id
7630 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
7631 AND pogt.index_char2 = G_LOCK_SHIPMENT_ENTITY
7632 AND EXISTS (SELECT draft.attr_group_id
7633 FROM po_line_locations_all_ext_b draft
7634 WHERE draft.line_location_id = pllbd.line_location_id
7635 AND draft.draft_id = p_draft_id
7636 MINUS
7637 SELECT base.attr_group_id
7638 FROM po_line_locations_all_ext_b base
7639 WHERE base.line_location_id = pllbd.line_location_id
7640 AND base.draft_id = -1
7641 );
7642
7643 IF (PO_LOG.d_stmt) THEN
7644 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
7645 PO_LOG.stmt(d_module,d_position ,'number of rows Inserted ',SQL%ROWCOUNT);
7646 END IF;
7647
7648 -- Identify Shipment level locks required because of change in po_line_locations_all_ext_tl
7649 INSERT INTO po_session_gt(
7650 key,
7651 index_char1, -- records identifier
7652 index_char2, -- entity_name
7653 char1, -- entity_pk1
7654 num1, -- lock_by_draft_id
7655 char5 -- lock_type
7656 )
7657 SELECT po_session_gt_s.NEXTVAL,
7658 G_LOCKS_REQUIRED_ID,
7659 G_LOCK_SHIPMENT_ENTITY,
7660 draft.line_location_id,
7661 draft.draft_id,
7662 CASE
7663 WHEN base.p_lock_attrs <> draft.p_lock_attrs THEN 'P'
7664 ELSE NULL
7665 END LOCK_TYPE
7666 FROM (SELECT pllt.line_location_id,
7667 pllt.draft_id,
7668 po_uda_tl_mod_p_lock_attrs(
7669 NVL(pllt.tl_ext_attr1 ,G_NULL_CHAR),
7670 NVL(pllt.tl_ext_attr2 ,G_NULL_CHAR),
7671 NVL(pllt.tl_ext_attr3 ,G_NULL_CHAR),
7672 NVL(pllt.tl_ext_attr4 ,G_NULL_CHAR),
7673 NVL(pllt.tl_ext_attr5 ,G_NULL_CHAR),
7674 NVL(pllt.tl_ext_attr6 ,G_NULL_CHAR),
7675 NVL(pllt.tl_ext_attr7 ,G_NULL_CHAR),
7676 NVL(pllt.tl_ext_attr8 ,G_NULL_CHAR),
7677 NVL(pllt.tl_ext_attr9 ,G_NULL_CHAR),
7678 NVL(pllt.tl_ext_attr10 ,G_NULL_CHAR),
7679 NVL(pllt.tl_ext_attr11 ,G_NULL_CHAR),
7680 NVL(pllt.tl_ext_attr12 ,G_NULL_CHAR),
7681 NVL(pllt.tl_ext_attr13 ,G_NULL_CHAR),
7682 NVL(pllt.tl_ext_attr14 ,G_NULL_CHAR),
7683 NVL(pllt.tl_ext_attr15 ,G_NULL_CHAR),
7684 NVL(pllt.tl_ext_attr16 ,G_NULL_CHAR),
7685 NVL(pllt.tl_ext_attr17 ,G_NULL_CHAR),
7686 NVL(pllt.tl_ext_attr18 ,G_NULL_CHAR),
7687 NVL(pllt.tl_ext_attr19 ,G_NULL_CHAR),
7688 NVL(pllt.tl_ext_attr20 ,G_NULL_CHAR),
7689 NVL(pllt.tl_ext_attr21 ,G_NULL_CHAR),
7690 NVL(pllt.tl_ext_attr22 ,G_NULL_CHAR),
7691 NVL(pllt.tl_ext_attr23 ,G_NULL_CHAR),
7692 NVL(pllt.tl_ext_attr24 ,G_NULL_CHAR),
7693 NVL(pllt.tl_ext_attr25 ,G_NULL_CHAR),
7694 NVL(pllt.tl_ext_attr26 ,G_NULL_CHAR),
7695 NVL(pllt.tl_ext_attr27 ,G_NULL_CHAR),
7696 NVL(pllt.tl_ext_attr28 ,G_NULL_CHAR),
7697 NVL(pllt.tl_ext_attr29 ,G_NULL_CHAR),
7698 NVL(pllt.tl_ext_attr30 ,G_NULL_CHAR),
7699 NVL(pllt.tl_ext_attr31 ,G_NULL_CHAR),
7700 NVL(pllt.tl_ext_attr32 ,G_NULL_CHAR),
7701 NVL(pllt.tl_ext_attr33 ,G_NULL_CHAR),
7702 NVL(pllt.tl_ext_attr34 ,G_NULL_CHAR),
7703 NVL(pllt.tl_ext_attr35 ,G_NULL_CHAR),
7704 NVL(pllt.tl_ext_attr36 ,G_NULL_CHAR),
7705 NVL(pllt.tl_ext_attr37 ,G_NULL_CHAR),
7706 NVL(pllt.tl_ext_attr38 ,G_NULL_CHAR),
7707 NVL(pllt.tl_ext_attr39 ,G_NULL_CHAR),
7708 NVL(pllt.tl_ext_attr40 ,G_NULL_CHAR)
7709 ) p_lock_attrs,
7710 pllt.attr_group_id,
7711 pllt.language
7712 FROM po_line_locations_all_ext_tl pllt,
7713 po_session_gt pogt
7714 where pllt.line_location_id = pogt.char1 -- line_location_id
7715 AND pllt.draft_id = G_DRAFT_ID_MINUS_1
7716 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
7717 and pogt.index_char2 = G_LOCK_SHIPMENT_ENTITY
7718 ) BASE,
7719 (select plltd.line_location_id,
7720 plltd.draft_id,
7721 po_uda_tl_mod_p_lock_attrs(
7722 NVL(plltd.tl_ext_attr1 ,G_NULL_CHAR),
7723 NVL(plltd.tl_ext_attr2 ,G_NULL_CHAR),
7724 NVL(plltd.tl_ext_attr3 ,G_NULL_CHAR),
7725 NVL(plltd.tl_ext_attr4 ,G_NULL_CHAR),
7726 NVL(plltd.tl_ext_attr5 ,G_NULL_CHAR),
7727 NVL(plltd.tl_ext_attr6 ,G_NULL_CHAR),
7728 NVL(plltd.tl_ext_attr7 ,G_NULL_CHAR),
7729 NVL(plltd.tl_ext_attr8 ,G_NULL_CHAR),
7730 NVL(plltd.tl_ext_attr9 ,G_NULL_CHAR),
7731 NVL(plltd.tl_ext_attr10 ,G_NULL_CHAR),
7732 NVL(plltd.tl_ext_attr11 ,G_NULL_CHAR),
7733 NVL(plltd.tl_ext_attr12 ,G_NULL_CHAR),
7734 NVL(plltd.tl_ext_attr13 ,G_NULL_CHAR),
7735 NVL(plltd.tl_ext_attr14 ,G_NULL_CHAR),
7736 NVL(plltd.tl_ext_attr15 ,G_NULL_CHAR),
7737 NVL(plltd.tl_ext_attr16 ,G_NULL_CHAR),
7738 NVL(plltd.tl_ext_attr17 ,G_NULL_CHAR),
7739 NVL(plltd.tl_ext_attr18 ,G_NULL_CHAR),
7740 NVL(plltd.tl_ext_attr19 ,G_NULL_CHAR),
7741 NVL(plltd.tl_ext_attr20 ,G_NULL_CHAR),
7742 NVL(plltd.tl_ext_attr21 ,G_NULL_CHAR),
7743 NVL(plltd.tl_ext_attr22 ,G_NULL_CHAR),
7744 NVL(plltd.tl_ext_attr23 ,G_NULL_CHAR),
7745 NVL(plltd.tl_ext_attr24 ,G_NULL_CHAR),
7746 NVL(plltd.tl_ext_attr25 ,G_NULL_CHAR),
7747 NVL(plltd.tl_ext_attr26 ,G_NULL_CHAR),
7748 NVL(plltd.tl_ext_attr27 ,G_NULL_CHAR),
7749 NVL(plltd.tl_ext_attr28 ,G_NULL_CHAR),
7750 NVL(plltd.tl_ext_attr29 ,G_NULL_CHAR),
7751 NVL(plltd.tl_ext_attr30 ,G_NULL_CHAR),
7752 NVL(plltd.tl_ext_attr31 ,G_NULL_CHAR),
7753 NVL(plltd.tl_ext_attr32 ,G_NULL_CHAR),
7754 NVL(plltd.tl_ext_attr33 ,G_NULL_CHAR),
7755 NVL(plltd.tl_ext_attr34 ,G_NULL_CHAR),
7756 NVL(plltd.tl_ext_attr35 ,G_NULL_CHAR),
7757 NVL(plltd.tl_ext_attr36 ,G_NULL_CHAR),
7758 NVL(plltd.tl_ext_attr37 ,G_NULL_CHAR),
7759 NVL(plltd.tl_ext_attr38 ,G_NULL_CHAR),
7760 NVL(plltd.tl_ext_attr39 ,G_NULL_CHAR),
7761 NVL(plltd.tl_ext_attr40 ,G_NULL_CHAR)
7762 ) p_lock_attrs,
7763 plltd.attr_group_id,
7764 plltd.language
7765 FROM po_line_locations_all_ext_tl plltd,
7766 po_session_gt pogt
7767 WHERE plltd.draft_id = p_draft_id
7768 AND plltd.line_location_id = pogt.char1 -- po_header_id
7769 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
7770 and pogt.index_char2 = G_LOCK_SHIPMENT_ENTITY
7771 ) draft
7772 where base.attr_group_id = draft.attr_group_id
7773 AND base.language = draft.language
7774 AND base.p_lock_attrs <> draft.p_lock_attrs;
7775
7776 d_position:=20;
7777 IF (PO_LOG.d_stmt) THEN
7778 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
7779 PO_LOG.stmt(d_module,d_position ,'number of rows Inserted ',SQL%ROWCOUNT);
7780 END IF;
7781 d_position:=30;
7782 IF (PO_LOG.d_proc) THEN
7783 PO_LOG.proc_end(d_module);
7784 END IF;
7785
7786 EXCEPTION
7787 WHEN OTHERS THEN
7788 IF (PO_LOG.d_exc) THEN
7789 PO_LOG.exc(d_module,d_position,SQLCODE || SQLERRM);
7790 END IF;
7791 RAISE;
7792 END identify_uda_shipment_locks;
7793
7794
7795
7796 --------------------------------------------------------------------------------
7797 --Start of Comments
7798 --Name: create_update_locks
7799 -- <Conc Mods Project>
7800 --Pre-reqs: None
7801 --Modifies:
7802 -- po_entity_locks
7803 --Function:
7804 -- sqls to delete/insert/update locks in po_entity_locks table.
7805 --Parameters:
7806 --IN:
7807 --p_draft_id
7808 -- draft id of the current Modification - Award/IDV
7809 --Notes:
7810 --End of Comments
7811 --------------------------------------------------------------------------------
7812
7813 PROCEDURE create_update_locks(
7814 p_draft_id IN NUMBER,
7815 p_return_status IN OUT NOCOPY VARCHAR2,
7816 x_results OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
7817 )
7818 IS
7819 d_api_name CONSTANT VARCHAR2(30) := 'create_update_locks';
7820 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
7821 d_position NUMBER;
7822 BEGIN
7823 ---------------------------------------------------------------
7824 -- Create/Update/Delete locks
7825 -- This is a generic code for all entities
7826 ---------------------------------------------------------------
7827 d_position:=0;
7828 IF (PO_LOG.d_proc) THEN
7829 PO_LOG.proc_begin(d_module);
7830 PO_LOG.proc_begin(d_module, 'p_draft_id', p_draft_id);
7831 END IF;
7832 -- Delete locks for enties being updated for which lock is not required
7833 DELETE
7834 FROM po_entity_locks poel
7835 WHERE poel.lock_by_draft_id = p_draft_id
7836 AND NOT EXISTS
7837 (SELECT 'Lock required'
7838 FROM po_session_gt pogt
7839 WHERE pogt.index_char1 = G_LOCKS_REQUIRED_ID
7840 AND pogt.index_char2 = poel.entity_name
7841 AND pogt.num1 = poel.lock_by_draft_id
7842 AND pogt.char1 = poel.entity_pk1
7843 AND NVL(pogt.char2, G_NULL_CHAR) = NVL(poel.entity_pk2, G_NULL_CHAR)
7844 AND NVL(pogt.char3, G_NULL_CHAR) = NVL(poel.entity_pk3, G_NULL_CHAR)
7845 AND NVL(pogt.char4, G_NULL_CHAR) = NVL(poel.entity_pk4, G_NULL_CHAR)
7846 )
7847 AND EXISTS
7848 (SELECT 'Entity changed in current transaction'
7849 FROM po_session_gt pogt
7850 WHERE pogt.index_char1 = G_CHANGED_ENTTIES_ID
7851 AND pogt.index_char2 = poel.entity_name
7852 AND pogt.char1 = poel.entity_pk1
7853 AND NVL(pogt.char2, G_NULL_CHAR) = NVL(poel.entity_pk2, G_NULL_CHAR)
7854 AND NVL(pogt.char3, G_NULL_CHAR) = NVL(poel.entity_pk3, G_NULL_CHAR)
7855 AND NVL(pogt.char4, G_NULL_CHAR) = NVL(poel.entity_pk4, G_NULL_CHAR)
7856 );
7857 d_position:=10;
7858 IF (PO_LOG.d_stmt) THEN
7859 PO_LOG.stmt(d_module, d_position, 'Number of Rows Deleted',SQL%ROWCOUNT);
7860 END IF;
7861 -- Create/Update lock entries in po_entity_locks
7862 MERGE INTO po_entity_locks lck_tbl
7863 USING (
7864 SELECT pogt.index_char2 entity_name,
7865 pogt.char1 entity_pk1,
7866 pogt.char2 entity_pk2,
7867 pogt.char3 entity_pk3,
7868 pogt.char4 entity_pk4,
7869 pogt.num1 lock_by_draft_id,
7870 SUBSTR(MAX(CASE pogt.char5
7871 WHEN 'F' THEN '5-F'
7872 WHEN 'P' THEN '3-P'
7873 WHEN 'S' THEN '1-S'
7874 ELSE NULL
7875 END),
7876 3) lock_type
7877 FROM po_session_gt pogt
7878 WHERE pogt.index_char1 = G_LOCKS_REQUIRED_ID
7879 GROUP BY pogt.index_char2, -- entity_name
7880 pogt.char1, -- entity_pk1
7881 pogt.char2, -- entity_pk2
7882 pogt.char3, -- entity_pk3
7883 pogt.char4, -- entity_pk4
7884 pogt.num1 -- lock_by_draft_id
7885 ) lck_dat
7886 ON (lck_tbl.entity_name = lck_dat.entity_name
7887 AND lck_tbl.entity_pk1 = lck_dat.entity_pk1
7888 AND NVL(lck_tbl.entity_pk2, G_NULL_CHAR) = NVL(lck_dat.entity_pk2, G_NULL_CHAR)
7889 AND NVL(lck_tbl.entity_pk3, G_NULL_CHAR) = NVL(lck_dat.entity_pk3, G_NULL_CHAR)
7890 AND NVL(lck_tbl.entity_pk4, G_NULL_CHAR) = NVL(lck_dat.entity_pk4, G_NULL_CHAR)
7891 AND lck_tbl.lock_by_draft_id = lck_dat.lock_by_draft_id)
7892 WHEN MATCHED THEN
7893 UPDATE
7894 SET
7895 lck_tbl.lock_type = lck_dat.lock_type,
7896 lck_tbl.last_update_date = SYSDATE,
7897 lck_tbl.last_updated_by = fnd_global.user_id,
7898 lck_tbl.last_update_login = fnd_global.login_id
7899 WHEN NOT MATCHED THEN
7900 INSERT(
7901 lck_tbl.po_entity_lock_id,
7902 lck_tbl.entity_name,
7903 lck_tbl.entity_pk1,
7904 lck_tbl.entity_pk2,
7905 lck_tbl.entity_pk3,
7906 lck_tbl.entity_pk4,
7907 lck_tbl.lock_by_draft_id,
7908 lck_tbl.lock_type,
7909 lck_tbl.last_update_date,
7910 lck_tbl.last_updated_by,
7911 lck_tbl.last_update_login,
7912 lck_tbl.creation_date,
7913 lck_tbl.created_by)
7914 VALUES(
7915 po_entity_locks_s.NEXTVAL,
7916 lck_dat.entity_name,
7917 lck_dat.entity_pk1,
7918 lck_dat.entity_pk2,
7919 lck_dat.entity_pk3,
7920 lck_dat.entity_pk4,
7921 lck_dat.lock_by_draft_id,
7922 lck_dat.lock_type,
7923 SYSDATE,
7924 fnd_global.user_id,
7925 fnd_global.login_id,
7926 SYSDATE,
7927 fnd_global.user_id);
7928
7929 d_position:=10;
7930 IF (PO_LOG.d_stmt) THEN
7931 PO_LOG.stmt(d_module, d_position,'Number Of rows Merged',SQL%ROWCOUNT);
7932 END IF;
7933 -- lock the transaction tables records and check for lock compatibilities
7934
7935 lock_and_check_compatibility(
7936 p_draft_id => p_draft_id,
7937 x_return_status => p_return_status,
7938 x_results =>x_results
7939 );
7940
7941 d_position:=40;
7942 IF (PO_LOG.d_proc) THEN
7943 PO_LOG.proc_end(d_module);
7944 END IF;
7945 EXCEPTION
7946 WHEN OTHERS THEN
7947 IF (PO_LOG.d_exc) THEN
7948 PO_LOG.exc(d_module,d_position,SQLCODE || SQLERRM);
7949 END IF;
7950 RAISE;
7951 END create_update_locks;
7952 --------------------------------------------------------------------------------
7953 --Start of Comments
7954 --Name: lock_and_check_compatibility
7955 -- <Conc Mods Project>
7956 --Pre-reqs:
7957 -- po_entity_locks is populated
7958 --Modifies: None
7959 --Locks:
7960 -- po_headers_all, po_lines_all, po_line_locations_all, po_distributions_all
7961 --Function:
7962 -- This procedure locks the required rows in transaction tables, and checks if
7963 -- the requested locks are compatible with existing locks.
7964 --Parameters:
7965 --IN:
7966 --p_draft_id
7967 -- draft_id of the Modification
7968 --IN OUT:
7969 --OUT:
7970 --x_return_status
7971 -- return status of the procedure
7972 --Notes:
7973 --End of Comments
7974 --------------------------------------------------------------------------------
7975 PROCEDURE lock_and_check_compatibility(
7976 p_draft_id IN NUMBER,
7977 x_return_status OUT NOCOPY VARCHAR2,
7978 x_results OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
7979 )
7980 IS
7981 l_entity_id_tbl PO_TBL_NUMBER;
7982 l_err_entity_tbl PO_TBL_VARCHAR60;
7983 l_err_pk1_tbl PO_TBL_VARCHAR240;
7984 l_lock_by_mod_num_tbl PO_TBL_VARCHAR100;
7985 l_err_msg_name VARCHAR2(60);
7986 d_api_name CONSTANT VARCHAR2(30) := 'identify_header_locks';
7987 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
7988 d_position NUMBER;
7989 l_token1_name VARCHAR2(30);
7990 l_token1_value VARCHAR2(30);
7991 l_entity_type VARCHAR2(30);
7992
7993 BEGIN
7994
7995 x_return_status := FND_API.G_RET_STS_SUCCESS;
7996 x_results := PO_VALIDATION_RESULTS_TYPE.new_instance();
7997 l_lock_by_mod_num_tbl:=PO_TBL_VARCHAR100();
7998
7999 d_position:=0;
8000 IF (PO_LOG.d_proc) THEN
8001 PO_LOG.proc_begin(d_module);
8002 PO_LOG.proc_begin(d_module, 'p_draft_id', p_draft_id);
8003 END IF;
8004 --------------------------------------------------------------------
8005 -- Lock the transaction table entity rows which have been modified
8006 -- in the current transaction, and rows exists in po_entity_locks
8007 --------------------------------------------------------------------
8008
8009 -- Lock header row
8010 SELECT poh.po_header_id
8011 BULK COLLECT
8012 INTO l_entity_id_tbl
8013 FROM po_headers_all poh
8014 WHERE EXISTS (SELECT 'lock exists'
8015 FROM po_entity_locks poel
8016 WHERE poel.entity_name = G_LOCK_HEADER_ENTITY
8017 AND poel.lock_by_draft_id = p_draft_id
8018 AND poel.entity_pk1 = poh.po_header_id)
8019 FOR UPDATE;
8020
8021 d_position:=10;
8022 FOR i in 1..l_entity_id_tbl.COUNT LOOP
8023 IF (PO_LOG.d_stmt) THEN
8024 PO_LOG.stmt(d_module, d_position, 'po_header_id',l_entity_id_tbl(i));
8025 END IF;
8026 END LOOP;
8027
8028 -- Lock line rows
8029 SELECT pol.po_line_id
8030 BULK COLLECT
8031 INTO l_entity_id_tbl
8032 FROM po_lines_all pol
8033 WHERE EXISTS (SELECT 'lock exists'
8034 FROM po_entity_locks poel
8035 WHERE poel.entity_name = G_LOCK_LINE_ENTITY
8036 AND poel.lock_by_draft_id = p_draft_id
8037 AND poel.entity_pk1 = pol.po_line_id)
8038 FOR UPDATE;
8039
8040 d_position:=20;
8041 FOR i in 1..l_entity_id_tbl.COUNT LOOP
8042 IF (PO_LOG.d_stmt) THEN
8043 PO_LOG.stmt(d_module, d_position, 'po_line_id and G_LOCK_LINE_ENTITY',l_entity_id_tbl(i));
8044 END IF;
8045 END LOOP;
8046
8047 -- Lock shipment rows
8048 SELECT poll.po_line_id
8049 BULK COLLECT
8050 INTO l_entity_id_tbl
8051 FROM po_line_locations_all poll
8052 WHERE EXISTS (SELECT 'lock exists'
8053 FROM po_entity_locks poel
8054 WHERE poel.entity_name = G_LOCK_SHIPMENT_ENTITY
8055 AND poel.lock_by_draft_id = p_draft_id
8056 AND poel.entity_pk1 = poll.line_location_id)
8057 FOR UPDATE;
8058 d_position:=30;
8059 FOR i in 1.. l_entity_id_tbl.COUNT LOOP
8060 IF (PO_LOG.d_stmt) THEN
8061 PO_LOG.stmt(d_module, d_position, 'po_line_id and G_LOCK_SHIPMENT_ENTITY',l_entity_id_tbl(i));
8062 END IF;
8063 END LOOP;
8064 -- Lock distribution rows
8065 SELECT pod.po_line_id
8066 BULK COLLECT
8067 INTO l_entity_id_tbl
8068 FROM po_distributions_all pod
8069 WHERE EXISTS (SELECT 'lock exists'
8070 FROM po_entity_locks poel
8071 WHERE poel.entity_name = G_LOCK_DIST_ENTITY
8072 AND poel.lock_by_draft_id = p_draft_id
8073 AND poel.entity_pk1 = pod.po_distribution_id)
8074 FOR UPDATE;
8075 d_position:=40;
8076 FOR i in 1.. l_entity_id_tbl.COUNT LOOP
8077 IF (PO_LOG.d_stmt) THEN
8078 PO_LOG.stmt(d_module, d_position, 'po_line_id and G_LOCK_DIST_ENTITY',l_entity_id_tbl(i));
8079 END IF;
8080 END LOOP;
8081 ----------------------------------------------------------
8082 -- Check for lock incompatibilities and raise exceptions.
8083 ----------------------------------------------------------
8084
8085 -- Collect all incompatible locks for the current document
8086 SELECT poel_curr.entity_name,
8087 poel_curr.entity_pk1,
8088 pod.modification_number
8089 BULK COLLECT
8090 INTO l_err_entity_tbl,
8091 l_err_pk1_tbl,
8092 l_lock_by_mod_num_tbl
8093 FROM po_entity_locks poel_curr,
8094 po_entity_locks poel_oth,
8095 TABLE(g_entity_lock_comp_tbl) comp,
8096 po_drafts pod
8097 WHERE poel_curr.lock_by_draft_id = p_draft_id
8098 AND poel_oth.lock_by_draft_id <> p_draft_id
8099 AND poel_curr.entity_name = poel_oth.entity_name
8100 AND poel_curr.entity_pk1 = poel_oth.entity_pk1
8101 AND NVL(poel_curr.entity_pk2, -1) = NVL(poel_oth.entity_pk2, -1)
8102 AND NVL(poel_curr.entity_pk3, -1) = NVL(poel_oth.entity_pk3, -1)
8103 AND NVL(poel_curr.entity_pk4, -1) = NVL(poel_oth.entity_pk4, -1)
8104 AND comp.lock_type1 = poel_curr.lock_type
8105 AND comp.lock_type2 = poel_oth.lock_type
8106 AND comp.is_compatible = 'I'
8107 AND poel_oth.lock_by_draft_id = pod.draft_id;
8108
8109 d_position:=50;
8110 IF (PO_LOG.d_stmt) THEN
8111 FOR i in 1..l_err_entity_tbl.COUNT LOOP
8112 PO_LOG.stmt(d_module, d_position, 'entity_name',l_err_entity_tbl(i));
8113 PO_LOG.stmt(d_module, d_position, 'entity_pk1',l_err_pk1_tbl(i));
8114 PO_LOG.stmt(d_module, d_position, 'modification_number',l_lock_by_mod_num_tbl(i));
8115 END LOOP;
8116 END IF;
8117
8118 -- For each incompatible lock, add an error message to the fnd message stack
8119 FOR i IN 1 .. l_err_entity_tbl.COUNT LOOP
8120 CASE l_err_entity_tbl(i)
8121 WHEN G_LOCK_HEADER_ENTITY THEN
8122 l_err_msg_name := 'PO_MOD_HEADER_LOCK_ERR';
8123 l_entity_type := PO_VALIDATIONS.c_entity_type_header;
8124
8125 WHEN G_LOCK_LINE_ENTITY THEN
8126 l_err_msg_name := 'PO_MOD_LINE_LOCK_ERR';
8127 l_entity_type := PO_VALIDATIONS.c_entity_type_LINE;
8128
8129 WHEN G_LOCK_SHIPMENT_ENTITY THEN
8130 l_err_msg_name := 'PO_MOD_SHIP_LOCK_ERR';
8131 l_entity_type := PO_VALIDATIONS.c_entity_type_LINE_LOCATION;
8132
8133 WHEN G_LOCK_DIST_ENTITY THEN
8134 l_err_msg_name := 'PO_MOD_DIST_LOCK_ERR';
8135 l_entity_type := PO_VALIDATIONS.c_entity_type_DISTRIBUTION;
8136
8137 ELSE
8138 l_err_msg_name := 'PO_MOD_HEADER_LOCK_ERR';
8139
8140 END CASE;
8141
8142 l_token1_name:='MOD_NUM';
8143 l_token1_value :=TO_CHAR(l_lock_by_mod_num_tbl(i));
8144
8145 x_results.add_result(
8146 p_entity_type => l_entity_type ,
8147 p_entity_id => l_err_pk1_tbl(i) ,
8148 p_message_name => l_err_msg_name ,
8149 p_token1_name => l_token1_name,
8150 p_token1_value => l_token1_value,
8151 p_column_name => NULL
8152 );
8153
8154 x_return_status := FND_API.G_RET_STS_ERROR;
8155 END LOOP;
8156
8157 d_position:=60;
8158 IF (PO_LOG.d_proc) THEN
8159 PO_LOG.proc_end(d_module);
8160 END IF;
8161 EXCEPTION
8162 WHEN OTHERS THEN
8163 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8164 IF (PO_LOG.d_exc) THEN
8165 PO_LOG.exc(d_module,d_position,SQLCODE || SQLERRM);
8166 END IF;
8167 RAISE;
8168 END lock_and_check_compatibility;
8169
8170 --------------------------------------------------------------------------------
8171 --Start of Comments
8172 --Name: revert_header_action
8173 -- <Conc Mods Project>
8174 --Function:
8175 -- This procedure reverts the changes at header level
8176 --Parameters:
8177 --IN:
8178 --p_po_header_id
8179 -- header id of the Modification
8180 --p_draft_id
8181 -- draft id of the modification
8182 --IN OUT:
8183 --OUT:
8184 --x_return_status
8185 -- return status of the procedure
8186 --Notes:
8187 --End of Comments
8188 --------------------------------------------------------------------------------
8189 PROCEDURE revert_header_action(
8190 p_po_header_id IN NUMBER,
8191 p_draft_id IN NUMBER,
8192 x_return_status OUT NOCOPY VARCHAR2 )
8193 IS
8194 l_errormessage VARCHAR2(2000);
8195 d_api_name CONSTANT VARCHAR2(30) := 'revert_header_action';
8196 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
8197 d_position NUMBER;
8198 l_functional_area_code VARCHAR2(500);
8199 l_document_type_code VARCHAR2(500);
8200 l_document_style_id NUMBER;
8201 l_enabled_flag VARCHAR2(5);
8202 l_errorcode VARCHAR2(50);
8203 l_msg_count NUMBER;
8204 l_msg_data VARCHAR2(4000);
8205 l_return_status VARCHAR2(1);
8206
8207 --Category CUSTOM5340 corresponds to Modification Specific Exception. The user can use delete option
8208 -- to undo the changes for these attachments. Hence skipping this category in revert
8209 cursor get_to_be_deleted_attachments(p_header_id NUMBER,p_draft_id NUMBER, p_entity_name VARCHAR2) is
8210 select fad.attached_document_id , fd.datatype_id
8211 from fnd_attached_documents fad, fnd_documents fd
8212 where fad.entity_name = p_entity_name
8213 and fad.pk1_value = to_char(p_header_id) || '-' || to_char(p_draft_id)
8214 AND fd.document_id = fad.document_id
8215 AND fad.category_id <> (SELECT category_id
8216 FROM fnd_document_categories
8217 WHERE application_id = 201 AND name = 'CUSTOM5340'
8218 );
8219 BEGIN
8220 IF (PO_LOG.d_proc) THEN
8221 PO_LOG.proc_begin(d_module);
8222 PO_LOG.proc_begin(d_module, 'p_draft_id', p_draft_id);
8223 PO_LOG.proc_begin(d_module, 'p_po_header_id', p_po_header_id);
8224 END IF;
8225
8226 d_position := 10;
8227
8228 select type_lookup_code, style_id
8229 into l_document_type_code, l_document_style_id
8230 from po_headers_all
8231 where po_header_id = p_po_header_id;
8232
8233 po_clm_clo_util.check_po_uda_enabled
8234 (
8235 p_document_type_code => l_document_type_code
8236 ,p_document_style_id => l_document_style_id
8237 ,x_enabled_flag => l_enabled_flag
8238 ,x_return_status => l_return_status
8239 );
8240
8241 d_position := 20;
8242
8243 IF (PO_LOG.d_stmt) THEN
8244 PO_LOG.stmt(d_module,d_position ,'Check Uda enabled returned ',l_enabled_flag);
8245 END IF;
8246
8247 PO_MOD_SYNC_PROCESS_PVT.sync_headers
8248 (
8249 p_draft_id => p_draft_id
8250 ,p_uda_enabled_flag => l_enabled_flag
8251 ,p_ignore_rev_number =>'Y'
8252 ,x_return_status => x_return_status
8253 );
8254
8255 d_position := 30;
8256
8257 DELETE
8258 FROM po_entity_locks pel
8259 WHERE pel.entity_pk1 = p_po_header_id
8260 AND pel.lock_by_draft_id = p_draft_id
8261 AND pel.entity_name IN (PO_DRAFTS_PVT.G_LOCK_ADDRESS_ENTITY, PO_DRAFTS_PVT.G_LOCK_HEADER_ENTITY,G_LOCK_HEADER_ATTACH_ENTITY);
8262
8263 IF (PO_LOG.d_stmt) THEN
8264 PO_LOG.stmt(d_module,d_position ,'Deleted po_entity_locks');
8265 PO_LOG.stmt(d_module,d_position ,'number of rows deleted ',SQL%ROWCOUNT);
8266 END IF;
8267
8268
8269 -- Bug 13938456 <Conc Mod Attachments>
8270 --Delete header level attachments other tham modifictaion specific attachments
8271 FOR l_rec in get_to_be_deleted_attachments(p_po_header_id,p_draft_id,'PO_HEADERS')
8272 LOOP
8273 fnd_attached_documents3_pkg.delete_row
8274 ( X_attached_document_id => l_rec.attached_document_id,
8275 X_datatype_id => l_rec.datatype_id,
8276 delete_document_flag => 'Y'
8277 );
8278 END LOOP;
8279
8280 FOR l_rec in get_to_be_deleted_attachments(p_po_header_id,p_draft_id,'PO_HEADERS_DEL')
8281 LOOP
8282 fnd_attached_documents3_pkg.delete_row
8283 ( X_attached_document_id => l_rec.attached_document_id,
8284 X_datatype_id => l_rec.datatype_id,
8285 delete_document_flag => 'Y'
8286 );
8287 END LOOP;
8288
8289 --<PAR Project> : Revert back any backing header dummy req to DWB
8290 PO_MOD_CONTROL_PVT.update_header_dummy_req(p_draft_id);
8291
8292 x_return_status := FND_API.G_RET_STS_SUCCESS;
8293 EXCEPTION
8294 WHEN OTHERS THEN
8295 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8296 IF (PO_LOG.d_exc) THEN
8297 PO_LOG.exc(d_module,SQLCODE || SQLERRM);
8298 END IF;
8299 RAISE;
8300 END revert_header_action;
8301
8302
8303 --------------------------------------------------------------------------------
8304 --Start of Comments
8305 --Name: revert_dist_action
8306 -- <Conc Mods Project>
8307 --Function:
8308 -- This procedure reverts the changes at distribution level
8309 --Parameters:
8310 --IN:
8311 --p_po_draft_id
8312 -- draft id of the Modification
8313 --po_dest_line_ids_tbl
8314 -- list of distribution ids
8315 --IN OUT:
8316 --OUT:
8317 --x_return_status
8318 -- return status of the procedure
8319 --Notes:
8320 --End of Comments
8321 --------------------------------------------------------------------------------
8322 PROCEDURE revert_dist_action(
8323 p_po_draft_id IN NUMBER,
8324 po_dest_line_ids_tbl IN PO_TBL_NUMBER,
8325 x_return_status OUT NOCOPY VARCHAR2 )
8326 IS
8327 l_errormessage VARCHAR2(2000);
8328 d_api_name CONSTANT VARCHAR2(30) := 'revert_dist_action';
8329 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
8330 d_position NUMBER;
8331 l_par_dist_tbl PO_TBL_NUMBER;
8332 BEGIN
8333
8334 IF (PO_LOG.d_proc) THEN
8335 PO_LOG.proc_begin(d_module);
8336 PO_LOG.proc_begin(d_module, 'p_po_draft_id', p_po_draft_id);
8337 PO_LOG.proc_begin(d_module, 'po_dest_line_ids_tbl', po_dest_line_ids_tbl);
8338 END IF;
8339
8340 d_position := 10;
8341
8342 --<PAR Project>
8343 IF ( po_dest_line_ids_tbl.Count > 0) THEN
8344 PO_REQ_LINES_SV.update_req_for_linked_po_count (po_dest_line_ids_tbl,
8345 'DISTRIBUTION MOD');
8346 PO_REQ_LINES_SV.update_reqs_in_pool_flag;
8347 END IF;
8348 --<PAR Changes End>
8349
8350
8351 FORALL itr IN 1..po_dest_line_ids_tbl.Count
8352 DELETE
8353 FROM po_distributions_draft_all
8354 WHERE po_distribution_id = po_dest_line_ids_tbl(itr)
8355 AND draft_id = p_po_draft_id;
8356
8357 FORALL itr IN 1..po_dest_line_ids_tbl.Count
8358 DELETE
8359 FROM po_entity_locks pel
8360 WHERE pel.entity_pk1 = po_dest_line_ids_tbl(itr)
8361 AND pel.lock_by_draft_id = p_po_draft_id
8362 AND pel.entity_name = PO_DRAFTS_PVT.G_LOCK_DIST_ENTITY;
8363
8364 IF (PO_LOG.d_stmt) THEN
8365 PO_LOG.stmt(d_module,d_position ,'Deleted po_entity_locks');
8366 PO_LOG.stmt(d_module,d_position ,'number of rows deleted ',SQL%ROWCOUNT);
8367 END IF;
8368 x_return_status := FND_API.G_RET_STS_SUCCESS;
8369
8370 EXCEPTION
8371 WHEN OTHERS THEN
8372 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8373 IF (PO_LOG.d_exc) THEN
8374 PO_LOG.exc(d_module,SQLCODE || SQLERRM);
8375 END IF;
8376 RAISE;
8377 END revert_dist_action;
8378
8379 PROCEDURE revert_shipment_action(
8380 p_po_draft_id IN NUMBER,
8381 po_ship_ids_tbl IN PO_TBL_NUMBER,
8382 x_return_status OUT NOCOPY VARCHAR2 )
8383 IS
8384 l_errormessage VARCHAR2(2000);
8385 d_api_name CONSTANT VARCHAR2(30) := 'revert_shipment_action';
8386 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
8387 d_position NUMBER;
8388 po_distribution_id_tbl PO_TBL_NUMBER;
8389
8390 --Category CUSTOM5340 corresponds to Modification Specific Exception. The user can use delete option
8391 -- to undo the changes for these attachments. Hence skipping this category in revert
8392 cursor get_to_be_deleted_attachments(p_line_location_id NUMBER,p_draft_id NUMBER, p_entity_name VARCHAR2) is
8393 select fad.attached_document_id , fd.datatype_id
8394 from fnd_attached_documents fad, fnd_documents fd
8395 where fad.entity_name = p_entity_name
8396 and fad.pk1_value = to_char(p_line_location_id) || '-' || to_char(p_draft_id)
8397 AND fd.document_id = fad.document_id
8398 AND fad.category_id <> (SELECT category_id
8399 FROM fnd_document_categories
8400 WHERE application_id = 201 AND name = 'CUSTOM5340'
8401 );
8402 BEGIN
8403
8404 d_position := 10;
8405
8406 IF (PO_LOG.d_proc) THEN
8407 PO_LOG.proc_begin(d_module);
8408 PO_LOG.proc_begin(d_module, 'p_po_draft_id', p_po_draft_id);
8409 PO_LOG.proc_begin(d_module, 'po_ship_ids_tbl', po_ship_ids_tbl);
8410 END IF;
8411
8412 SELECT po_distribution_id
8413 BULK COLLECT INTO po_distribution_id_tbl
8414 FROM po_distributions_all pda
8415 WHERE pda.line_location_id IN (SELECT * FROM TABLE(po_ship_ids_tbl));
8416
8417 FORALL itr IN 1..po_ship_ids_tbl.Count
8418 DELETE
8419 FROM po_line_locations_draft_all
8420 WHERE line_location_id = po_ship_ids_tbl(itr)
8421 AND draft_id = p_po_draft_id;
8422
8423 FORALL itr IN 1..po_ship_ids_tbl.Count
8424 DELETE
8425 FROM po_entity_locks pel
8426 WHERE pel.entity_pk1 = po_ship_ids_tbl(itr)
8427 AND pel.lock_by_draft_id = p_po_draft_id
8428 AND pel.entity_name IN (PO_DRAFTS_PVT.G_LOCK_SHIPMENT_ENTITY,PO_DRAFTS_PVT.G_LOCK_SHIPMENT_ATTACH_ENTITY);
8429
8430 IF (PO_LOG.d_stmt) THEN
8431 PO_LOG.stmt(d_module,d_position ,'Deleted po_entity_locks');
8432 PO_LOG.stmt(d_module,d_position ,'number of rows deleted ',SQL%ROWCOUNT);
8433 END IF;
8434
8435 FORALL itr IN 1..po_ship_ids_tbl.Count
8436 DELETE
8437 FROM po_line_locations_all_ext_b
8438 WHERE line_location_id = po_ship_ids_tbl(itr) AND draft_id = p_po_draft_id;
8439
8440 FORALL itr IN 1..po_ship_ids_tbl.Count
8441 DELETE
8442 FROM po_line_locations_all_ext_tl
8443 WHERE line_location_id = po_ship_ids_tbl(itr) AND draft_id = p_po_draft_id;
8444
8445 --Bug 13938456<Conc Mod Attachments>
8446 --Delete shipment level attachments other tham modifictaion specific attachments
8447 FOR itr IN 1..po_ship_ids_tbl.Count LOOP
8448 FOR l_rec in get_to_be_deleted_attachments(po_ship_ids_tbl(itr),p_po_draft_id,'PO_SHIPMENTS') LOOP
8449 fnd_attached_documents3_pkg.delete_row
8450 ( X_attached_document_id => l_rec.attached_document_id,
8451 X_datatype_id => l_rec.datatype_id,
8452 delete_document_flag => 'Y'
8453 );
8454 END LOOP;
8455
8456 FOR l_rec in get_to_be_deleted_attachments(po_ship_ids_tbl(itr),p_po_draft_id,'PO_SHIPMENTS_DEL') LOOP
8457 fnd_attached_documents3_pkg.delete_row
8458 ( X_attached_document_id => l_rec.attached_document_id,
8459 X_datatype_id => l_rec.datatype_id,
8460 delete_document_flag => 'Y'
8461 );
8462 END LOOP;
8463 END LOOP;
8464
8465 d_position := 20;
8466
8467 revert_dist_action(p_po_draft_id,po_distribution_id_tbl,x_return_status);
8468
8469 x_return_status := FND_API.G_RET_STS_SUCCESS;
8470
8471 EXCEPTION
8472 WHEN OTHERS THEN
8473 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8474 IF (PO_LOG.d_exc) THEN
8475 PO_LOG.exc(d_module,SQLCODE || SQLERRM);
8476 END IF;
8477 RAISE;
8478 END revert_shipment_action;
8479
8480 PROCEDURE revert_line_action(
8481 p_po_draft_id IN NUMBER,
8482 po_line_ids_tbl IN PO_TBL_NUMBER,
8483 x_return_status OUT NOCOPY VARCHAR2 )
8484 IS
8485 l_errormessage VARCHAR2(2000);
8486 d_api_name CONSTANT VARCHAR2(30) := 'revert_line_action';
8487 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
8488 d_position NUMBER;
8489 no_of_dist NUMBER;
8490 po_line_location_id_tbl PO_TBL_NUMBER;
8491
8492 --Category CUSTOM5340 corresponds to Modification Specific Exception. The user can use delete option
8493 -- to undo the changes for these attachments. Hence skipping this category in revert
8494 cursor get_to_be_deleted_attachments(p_line_id NUMBER,p_draft_id NUMBER,p_entity_name VARCHAR2) is
8495 select fad.attached_document_id , fd.datatype_id
8496 from fnd_attached_documents fad, fnd_documents fd
8497 where fad.entity_name = p_entity_name
8498 and fad.pk1_value = to_char(p_line_id) || '-' || to_char(p_draft_id)
8499 AND fd.document_id = fad.document_id
8500 AND fad.category_id <> (SELECT category_id
8501 FROM fnd_document_categories
8502 WHERE application_id = 201 AND name = 'CUSTOM5340'
8503 );
8504
8505 BEGIN
8506
8507 d_position := 10;
8508 IF (PO_LOG.d_proc) THEN
8509 PO_LOG.proc_begin(d_module, 'p_po_draft_id', p_po_draft_id);
8510 PO_LOG.proc_begin(d_module, 'po_line_ids_tbl', po_line_ids_tbl);
8511 END IF;
8512
8513 SELECT line_location_id
8514 BULK COLLECT INTO po_line_location_id_tbl
8515 FROM po_line_locations_all poll
8516 WHERE poll.po_line_id IN (SELECT * FROM TABLE(po_line_ids_tbl));
8517
8518 --UCA Changes Begin.
8519 --Called before line delete as line.org_id needed to determine if uca enabled
8520 delete_line_ucas(p_po_draft_id => p_po_draft_id,
8521 po_line_ids_tbl => po_line_ids_tbl);
8522 --UCA Changes End.
8523 --<PAR Project Begin>
8524 IF ( po_line_ids_tbl.Count > 0) THEN
8525 PO_REQ_LINES_SV.update_req_for_linked_po_count (po_line_ids_tbl,
8526 'LINE');
8527 PO_REQ_LINES_SV.update_reqs_in_pool_flag;
8528 END IF;
8529 --<PAR Project Ends>
8530
8531
8532 FORALL i IN 1..po_line_ids_tbl.Count()
8533 DELETE
8534 FROM po_lines_draft_all
8535 WHERE po_line_id = po_line_ids_tbl(i)
8536 AND draft_id = p_po_draft_id;
8537
8538 FORALL i IN 1..po_line_ids_tbl.Count()
8539 DELETE
8540 FROM po_entity_locks pel
8541 WHERE pel.entity_pk1 = po_line_ids_tbl(i)
8542 AND pel.lock_by_draft_id = p_po_draft_id
8543 AND pel.entity_name IN (PO_DRAFTS_PVT.G_LOCK_LINE_ENTITY,PO_DRAFTS_PVT.G_LOCK_LINE_ATTACH_ENTITY);
8544
8545 IF (PO_LOG.d_stmt) THEN
8546 PO_LOG.stmt(d_module,d_position ,'Deleted po_entity_locks');
8547 PO_LOG.stmt(d_module,d_position ,'number of rows deleted ',SQL%ROWCOUNT);
8548 END IF;
8549
8550 FORALL i IN 1..po_line_ids_tbl.Count()
8551 DELETE
8552 FROM po_lines_all_ext_b
8553 WHERE (po_line_id = po_line_ids_tbl(i) -- main record for Mod
8554 AND draft_id = p_po_draft_id)
8555 OR -- old record for Mod complex pricing attribute
8556 (po_line_id = po_line_ids_tbl(i)
8557 AND draft_id = -1
8558 AND pk1_value = p_po_draft_id)
8559 OR -- delta record for Mod complex pricing attribute
8560 (po_line_id = -po_line_ids_tbl(i)
8561 AND draft_id = -p_po_draft_id
8562 AND pk1_value = -p_po_draft_id);
8563
8564 FORALL i IN 1..po_line_ids_tbl.Count()
8565 DELETE
8566 FROM po_lines_all_ext_tl
8567 WHERE (po_line_id = po_line_ids_tbl(i) -- main record for Mod
8568 AND draft_id = p_po_draft_id)
8569 OR -- old record for Mod complex pricing attribute
8570 (po_line_id = po_line_ids_tbl(i)
8571 AND draft_id = -1
8572 AND pk1_value = p_po_draft_id)
8573 OR -- delta record for Mod complex pricing attribute
8574 (po_line_id = -po_line_ids_tbl(i)
8575 AND draft_id = -p_po_draft_id
8576 AND pk1_value = -p_po_draft_id);
8577
8578 d_position := 20;
8579 revert_shipment_action(p_po_draft_id,po_line_location_id_tbl,x_return_status);
8580 x_return_status := FND_API.G_RET_STS_SUCCESS;
8581
8582 --Bug 13938456<Conc Mod Attachments>
8583 --Delete line level attachments other than modifictaion specific attachments
8584 FOR itr IN 1..po_line_ids_tbl.Count LOOP
8585 FOR l_rec in get_to_be_deleted_attachments(po_line_ids_tbl(itr),p_po_draft_id,'PO_LINES') LOOP
8586 fnd_attached_documents3_pkg.delete_row
8587 ( X_attached_document_id => l_rec.attached_document_id,
8588 X_datatype_id => l_rec.datatype_id,
8589 delete_document_flag => 'Y'
8590 );
8591 END LOOP;
8592
8593 FOR l_rec in get_to_be_deleted_attachments(po_line_ids_tbl(itr),p_po_draft_id,'PO_LINES_DEL') LOOP
8594 fnd_attached_documents3_pkg.delete_row
8595 ( X_attached_document_id => l_rec.attached_document_id,
8596 X_datatype_id => l_rec.datatype_id,
8597 delete_document_flag => 'Y'
8598 );
8599 END LOOP;
8600 END LOOP;
8601
8602 EXCEPTION
8603 WHEN OTHERS THEN
8604 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8605 IF (PO_LOG.d_exc) THEN
8606 PO_LOG.exc(d_module,SQLCODE || SQLERRM);
8607 END IF;
8608 RAISE;
8609 END revert_line_action;
8610
8611
8612 /*
8613 Deletes draft data and uda data for line entity which is deleted
8614 from UI. i.e. delete_flag is 'Y'.
8615 */
8616 PROCEDURE delete_marked_lines(
8617 p_draft_id IN NUMBER)
8618 IS
8619 l_line_id_tbl PO_TBL_NUMBER;
8620 d_api_name CONSTANT VARCHAR2(30) := 'delete_marked_lines';
8621 d_module CONSTANT VARCHAR2(100) := d_pkg_name || d_api_name || '.';
8622 l_return_status varchar2(1);
8623 l_msg_count number;
8624 l_msg_data varchar2(200);
8625 l_info_flag VARCHAR2(1);
8626
8627 d_position NUMBER :=0;
8628
8629 BEGIN
8630
8631 IF (PO_LOG.d_stmt) THEN
8632 PO_LOG.proc_begin(d_module, 'p_draft_id: ', p_draft_id);
8633 END IF;
8634
8635 --delete line data
8636 SELECT po_line_id
8637 BULK COLLECT
8638 INTO l_line_id_tbl
8639 FROM po_lines_draft_all
8640 WHERE delete_flag = 'Y'
8641 AND draft_id = p_draft_id
8642 AND NVL(change_accepted_flag, 'Y') = 'Y';
8643
8644 -- Options Enhancement:
8645 -- Sending the notification to Requseter , if the priced slin/option line is deleted
8646 -- but the parent/base clin is not yet deleted
8647 -- In case of PO, document_id is draft_id
8648 pon_clm_clo_util_pkg.SEND_LINE_DELETED_NOTIF( p_caller=>'PO_MOD'
8649 ,p_document_id => p_draft_id
8650 ,p_document_line_id => null
8651 ,x_return_status=>l_return_status
8652 ,x_msg_count=>l_msg_count
8653 ,x_msg_data =>l_msg_data);
8654
8655 -- Bug: 13948625
8656 -- If any deleted Mod lines found, send the linked requisitions back to pool
8657 -- if entire Clin-Slin structure eligible.
8658 IF (l_line_id_tbl.Count > 0) THEN
8659
8660 IF (PO_LOG.d_stmt) THEN
8661 PO_LOG.stmt(d_module, d_position, 'Deleted Lines Found');
8662 END IF;
8663 -- This will update the linked_po_count of the linked requisitions to these deleted
8664 -- Info and Option lines.
8665 PO_REQ_LINES_SV.update_req_for_linked_po_count (l_line_id_tbl, 'LINE');
8666
8667 END IF;
8668
8669 --UCA Changes Begin.
8670 --Called before line delete as line.org_id needed to determine if uca enabled
8671 delete_line_ucas(p_po_draft_id => p_draft_id,
8672 po_line_ids_tbl => l_line_id_tbl);
8673 --UCA Changes End.
8674
8675
8676 FORALL i IN 1..l_line_id_tbl.Count()
8677 DELETE FROM po_lines_draft_all
8678 WHERE po_line_id = l_line_id_tbl(i)
8679 AND draft_id = p_draft_id;
8680
8681 FORALL i IN 1..l_line_id_tbl.Count()
8682 DELETE FROM po_lines_all_ext_b
8683 WHERE po_line_id = l_line_id_tbl(i)
8684 AND draft_id = p_draft_id;
8685
8686 FORALL i IN 1..l_line_id_tbl.Count()
8687 DELETE FROM po_lines_all_ext_tl
8688 WHERE po_line_id = l_line_id_tbl(i)
8689 AND draft_id = p_draft_id;
8690
8691 --Bug 13938456 <Cond Mod Attachments - deleting attachmnets>
8692 FOR i IN 1..l_line_id_tbl.Count() LOOP
8693 FND_ATTACHED_DOCUMENTS2_PKG.delete_attachments
8694 ( 'PO_LINES',
8695 l_line_id_tbl(i)||'-'||p_draft_id,
8696 '', '', '', '', '');
8697 FND_ATTACHED_DOCUMENTS2_PKG.delete_attachments
8698 ( 'PO_LINES_DEL',
8699 l_line_id_tbl(i)||'-'||p_draft_id,
8700 '', '', '', '', '');
8701 END LOOP;
8702
8703 IF (PO_LOG.d_stmt) THEN
8704 PO_LOG.proc_end(d_module, 'Deleted line id(s): ', l_line_id_tbl);
8705 END IF;
8706
8707 END delete_marked_lines;
8708
8709
8710 /*
8711 Deletes draft data and uda data for shipment entity which is deleted
8712 from UI. i.e. delete_flag is 'Y'.
8713 */
8714 PROCEDURE delete_marked_shipments(
8715 p_draft_id IN NUMBER)
8716 IS
8717 l_line_loc_id_tbl PO_TBL_NUMBER;
8718 l_linked_req_line_id PO_TBL_NUMBER;
8719 l_req_dist_id PO_TBL_NUMBER;
8720
8721 d_api_name CONSTANT VARCHAR2(30) := 'delete_marked_shipments';
8722 d_module CONSTANT VARCHAR2(100) := d_pkg_name || d_api_name || '.';
8723
8724 BEGIN
8725
8726 IF (PO_LOG.d_stmt) THEN
8727 PO_LOG.proc_begin(d_module, 'p_draft_id: ', p_draft_id);
8728 END IF;
8729
8730 --delete line location data
8731 SELECT line_location_id
8732 BULK COLLECT
8733 INTO l_line_loc_id_tbl
8734 FROM po_line_locations_draft_all
8735 WHERE delete_flag = 'Y'
8736 AND draft_id = p_draft_id
8737 AND NVL(change_accepted_flag, 'Y') = 'Y';
8738
8739 FORALL i IN 1..l_line_loc_id_tbl.Count()
8740 DELETE FROM po_line_locations_draft_all
8741 WHERE line_location_id = l_line_loc_id_tbl(i)
8742 AND draft_id = p_draft_id;
8743
8744 FORALL i IN 1..l_line_loc_id_tbl.Count()
8745 DELETE FROM po_line_locations_all_ext_b
8746 WHERE line_location_id = l_line_loc_id_tbl(i)
8747 AND draft_id = p_draft_id;
8748
8749 FORALL i IN 1..l_line_loc_id_tbl.Count()
8750 DELETE FROM po_line_locations_all_ext_tl
8751 WHERE line_location_id = l_line_loc_id_tbl(i)
8752 AND draft_id = p_draft_id;
8753
8754 --Bug 13938456- <Cond Mod Attachmnts>
8755 FOR i IN 1..l_line_loc_id_tbl.Count() LOOP
8756 FND_ATTACHED_DOCUMENTS2_PKG.delete_attachments
8757 ( 'PO_SHIPMENTS',
8758 l_line_loc_id_tbl(i)||'-'||p_draft_id,
8759 '', '', '', '', '');
8760 FND_ATTACHED_DOCUMENTS2_PKG.delete_attachments
8761 ( 'PO_SHIPMENTS_DEL',
8762 l_line_loc_id_tbl(i)||'-'||p_draft_id,
8763 '', '', '', '', '');
8764 END LOOP;
8765
8766
8767 IF (PO_LOG.d_stmt) THEN
8768 PO_LOG.proc_end(d_module, 'Deleted shipment id(s): ', l_line_loc_id_tbl);
8769 END IF;
8770 END delete_marked_shipments;
8771
8772
8773 /*
8774 Deletes draft data for distribution entity which is deleted
8775 from UI. i.e. delete_flag is 'Y'.
8776 */
8777 PROCEDURE delete_marked_distributions(
8778 p_draft_id IN NUMBER)
8779 IS
8780 l_distribution_id_tbl PO_TBL_NUMBER;
8781 d_api_name CONSTANT VARCHAR2(30) := 'delete_marked_distributions';
8782 d_module CONSTANT VARCHAR2(100) := d_pkg_name || d_api_name || '.';
8783 BEGIN
8784
8785 IF (PO_LOG.d_stmt) THEN
8786 PO_LOG.proc_begin(d_module, 'p_draft_id: ', p_draft_id);
8787 END IF;
8788
8789 -- delete distributions data
8790 SELECT po_distribution_id
8791 BULK COLLECT
8792 INTO l_distribution_id_tbl
8793 FROM po_distributions_draft_all
8794 WHERE delete_flag = 'Y'
8795 AND draft_id = p_draft_id
8796 AND NVL(change_accepted_flag, 'Y') = 'Y';
8797
8798 -- Bug: 13948625
8799 -- If any deleted Mod lines found, send the linked requisitions back to pool
8800 -- if entire Clin-Slin structure eligible.
8801 IF (l_distribution_id_tbl. Count > 0) THEN
8802
8803 -- This will update the linked_po_count of the linked requisitions to these deleted
8804 -- priced lines.
8805 PO_REQ_LINES_SV.update_req_for_linked_po_count (l_distribution_id_tbl, 'DISTRIBUTION MOD');
8806 END IF;
8807
8808 FORALL i IN 1..l_distribution_id_tbl.Count()
8809 DELETE FROM po_distributions_draft_all
8810 WHERE po_distribution_id = l_distribution_id_tbl(i)
8811 AND draft_id = p_draft_id;
8812
8813 IF (PO_LOG.d_stmt) THEN
8814 PO_LOG.proc_end(d_module, 'Deleted distribution id(s): ', l_distribution_id_tbl);
8815 END IF;
8816 END delete_marked_distributions;
8817
8818
8819 --------------------------------------------------------------------------------
8820 --Start of Comments
8821 --Name: delete_marked_entities
8822 -- <Conc Mods Project>
8823 --Function:
8824 -- This procedure deletes the marked entities(lines,shipments,distributions
8825 -- by calling related procedures
8826 --Parameters:
8827 --IN:
8828 --p_draft_id:
8829 -- draft id of the Modification
8830 --IN OUT:
8831 --OUT:
8832 --Notes:
8833 --End of Comments
8834 --------------------------------------------------------------------------------
8835 PROCEDURE delete_marked_entities(
8836 p_draft_id IN NUMBER
8837 )
8838 IS
8839 BEGIN
8840 /**
8841 Calling delete_marked_lines, shipments and distributions procedures.
8842 These procedures remove entities marked for removal i.e. delete_flag
8843 is set to 'Y'. This is for entities in modification.
8844 */
8845 delete_marked_lines(p_draft_id);
8846 delete_marked_shipments(p_draft_id);
8847 delete_marked_distributions(p_draft_id);
8848
8849 -- Bug: 13948625
8850 -- Re-written the logic to send the requisitions back to pool when CLM document or its lines/distributions deleted.
8851 -- Call to delete_marked_lines/distributions above has a call to update_req_for_linked_po_count, where
8852 -- the linked_po_count is updated for unlinked requisitions and those reqs CLINs(Autocreated/SoftLinked)
8853 -- and PSlins(Softlinked) inserted into GT table for further procession(updating the reqs_in_pool_flag for entire
8854 -- Clin-Slin structure if eligible) in the below proc update_reqs_in_pool_flag.
8855
8856 PO_REQ_LINES_SV.update_reqs_in_pool_flag;
8857
8858 END delete_marked_entities;
8859
8860
8861 --------------------------------------------------------------------------------
8862 --Start of Comments
8863 --Name: clean_up_extra_uda
8864 -- Bug 13006217
8865 --Function:
8866 --This procedure deletes extra uda from ext tables
8867 -- po_lines_all_ext_b --> cleans up extra records for PRICING attribute
8868 -- po_headers_all_ext_b --> cleans up extra records for FORMS attribute
8869 -- po_lines_all_ext_tl --> cleans up extra records for PRICING attribute
8870 -- po_headers_all_ext_tl --> cleans up extra records for FORMS attribute
8871 --Parameters:
8872 --IN:
8873 --p_draft_id:
8874 -- draft id of the PO/Modification
8875 --p_po_header_id:
8876 -- header id of the PO
8877 --IN OUT:
8878 --OUT:
8879 --Notes:
8880 --End of Comments
8881 --------------------------------------------------------------------------------
8882 PROCEDURE clean_up_extra_uda(
8883 p_po_header_id IN NUMBER,
8884 p_draft_id IN NUMBER)
8885 IS
8886
8887 d_api_name CONSTANT VARCHAR2(30) := 'clean_up_extra_uda';
8888 d_module CONSTANT VARCHAR2(100) := d_pkg_name || d_api_name || '.';
8889 d_position NUMBER :=0;
8890
8891 BEGIN
8892
8893 IF (PO_LOG.d_stmt) THEN
8894 PO_LOG.proc_begin(d_module, 'p_draft_id: ', p_draft_id);
8895 END IF;
8896
8897 --Delete extra PRICING attribute record from po_lines_all_ext_b
8898 DELETE FROM po_lines_all_ext_b ple
8899 where ( Abs(ple.po_line_id), Abs(ple.draft_id) ) IN ( SELECT po_line_id, Decode(draft_id,-1,1,draft_id)
8900 FROM po_lines_merge_v
8901 WHERE po_header_id = p_po_header_id
8902 AND draft_id = p_draft_id
8903 )
8904 AND EXISTS ( SELECT 1
8905 FROM po_lines_merge_v plm , po_uda_ag_template_usages ptu
8906 WHERE plm.po_line_id = Abs(ple.po_line_id)
8907 AND plm.draft_id = Decode(p_draft_id,
8908 -1,-1,
8909 Abs(ple.draft_id))
8910 AND ptu.attribute_category = 'PRICING'
8911 AND ptu.template_id = plm.uda_template_id
8912 AND ( NVL(ptu.attribute1, '*') <> NVL(plm.clm_idc_type, '*')
8913 OR
8914 Nvl(ptu.attribute2, '*') <> Nvl(plm.contract_type, '*')
8915 )
8916 AND ple.attr_group_id = ptu.attribute_group_id
8917 );
8918
8919 IF (PO_LOG.d_stmt) THEN
8920 PO_LOG.stmt(d_module,d_position ,'Deleted extra prcing uda records from po_lines_all_ext_b');
8921 PO_LOG.stmt(d_module,d_position ,'number of rows deleted ',SQL%ROWCOUNT);
8922 END IF;
8923
8924 d_position := 10;
8925 --Delete extra PRICING attribute record from po_lines_all_ext_tl
8926 DELETE FROM po_lines_all_ext_tl ple
8927 where ( Abs(ple.po_line_id), Abs(ple.draft_id) ) IN ( SELECT po_line_id, Decode(draft_id,-1,1,draft_id)
8928 FROM po_lines_merge_v
8929 WHERE po_header_id = p_po_header_id
8930 AND draft_id = p_draft_id
8931 )
8932
8933 AND EXISTS ( SELECT 1
8934 FROM po_lines_merge_v plm , po_uda_ag_template_usages ptu
8935 WHERE plm.po_line_id = Abs(ple.po_line_id)
8936 AND plm.draft_id = Decode(p_draft_id,
8937 -1,-1,
8938 Abs(ple.draft_id))
8939 AND ptu.attribute_category = 'PRICING'
8940 AND ptu.template_id = plm.uda_template_id
8941 AND ( NVL(ptu.attribute1, '*') <> NVL(plm.clm_idc_type, '*')
8942 OR
8943 Nvl(ptu.attribute2, '*') <> Nvl(plm.contract_type, '*')
8944 )
8945 AND ple.attr_group_id = ptu.attribute_group_id
8946 );
8947 IF (PO_LOG.d_stmt) THEN
8948 PO_LOG.stmt(d_module,d_position ,'Deleted extra prcing uda records from po_lines_all_ext_tl');
8949 PO_LOG.stmt(d_module,d_position ,'number of rows deleted ',SQL%ROWCOUNT);
8950 END IF;
8951
8952 d_position := 20;
8953 --Delete extra FORMS attribute record from po_headers_all_ext_b
8954 DELETE FROM po_headers_all_ext_b phe
8955 where phe.po_header_id = p_po_header_id
8956 AND Nvl(phe.draft_id,-1) = p_draft_id
8957
8958 AND EXISTS ( SELECT 1
8959 FROM po_headers_merge_v phm , po_uda_ag_template_usages ptu
8960 WHERE phm.po_header_id = phe.po_header_id
8961 AND phm.draft_id = Nvl(phe.draft_id,-1)
8962 AND ptu.attribute_category = 'FORMS'
8963 AND ptu.template_id = phm.uda_template_id
8964 AND Nvl(ptu.attribute1, '*') <> Nvl(phm.clm_standard_form, '*')
8965 AND phe.attr_group_id = ptu.attribute_group_id
8966 );
8967 IF (PO_LOG.d_stmt) THEN
8968 PO_LOG.stmt(d_module,d_position ,'Deleted extra forms uda records from po_headers_all_ext_b');
8969 PO_LOG.stmt(d_module,d_position ,'number of rows deleted ',SQL%ROWCOUNT);
8970 END IF;
8971
8972 d_position := 30;
8973 --Delete extra FORMS attribute record from po_headers_all_ext_tl
8974 DELETE FROM po_headers_all_ext_tl phe
8975 where phe.po_header_id = p_po_header_id
8976 AND Nvl(phe.draft_id,-1) = p_draft_id
8977
8978 AND EXISTS ( SELECT 1
8979 FROM po_headers_merge_v phm , po_uda_ag_template_usages ptu
8980 WHERE phm.po_header_id = phe.po_header_id
8981 AND phm.draft_id = Nvl(phe.draft_id,-1)
8982 AND ptu.attribute_category = 'FORMS'
8983 AND ptu.template_id = phm.uda_template_id
8984 AND Nvl(ptu.attribute1, '*') <> Nvl(phm.clm_standard_form, '*')
8985 AND phe.attr_group_id = ptu.attribute_group_id
8986 );
8987 IF (PO_LOG.d_stmt) THEN
8988 PO_LOG.stmt(d_module,d_position ,'Deleted extra forms uda records from po_headers_all_ext_tl');
8989 PO_LOG.stmt(d_module,d_position ,'number of rows deleted ',SQL%ROWCOUNT);
8990 END IF;
8991
8992 d_position := 40;
8993 IF (PO_LOG.d_stmt) THEN
8994 PO_LOG.proc_end(d_module);
8995 END IF;
8996
8997 END clean_up_extra_uda;
8998
8999 --------------------------------------------------------------------------------
9000 --Start of Comments
9001 --Name: get_attachment_count_for_mod
9002 -- Conc Mod Attachments
9003 --Function:
9004 --This function returns the no of attachments (other than mod specific category) of the modifictaion
9005 -- p_po_header_id --> header id of the PO
9006 -- p_po_draft_id --> draft id of the PO/Modification
9007 -- p_entity_name --> entity level at which the attachemnts are added
9008 --Notes:
9009 --End of Comments
9010 --------------------------------------------------------------------------------
9011
9012
9013 FUNCTION get_attachment_count_for_mod(
9014 p_po_header_id IN NUMBER,
9015 p_po_draft_id IN NUMBER,
9016 p_entity_name IN VARCHAR2
9017 ) RETURN NUMBER IS
9018
9019 l_count NUMBER;
9020
9021 BEGIN
9022
9023 SELECT Count(*) INTO l_count
9024 FROM FND_ATTACHED_DOCUMENTS
9025 WHERE entity_name = p_entity_name
9026 AND pk1_value = p_po_header_id||'-'|| p_po_draft_id
9027 AND category_id <> (SELECT category_id
9028 FROM fnd_document_categories_vl
9029 WHERE application_id = 201 AND name = 'CUSTOM5340'
9030 );
9031
9032 RETURN l_count;
9033
9034 END get_attachment_count_for_mod;
9035
9036 --Bug 13938456<Attachment Project>
9037 --------------------------------------------------------------------------------
9038 --Start of Comments
9039 --Name: copy_attachment
9040 -- Conc Mod Attachments
9041 --Function:
9042 --This procedure creates Locks in the po_locks_entity table
9043 -- also, it call another prcedure fnd_attached_documents2_pkg.copy_attachments,
9044 -- which copies the selected attachment into fnd_attached_documents table
9045 -- p_lock_entity_name --> one among 'PO_HEADER_ATTACH','PO_LINE_ATTACH'
9046 -- 'PO_SHIPMENT_ATTACH'
9047 -- p_lock_entity_pk1 --> one among po_header_id, po_line_id,line_location_id
9048 -- p_lock_entity_pk3 --> null
9049 -- p_lock_entity_pk3 --> null
9050 -- p_lock_by_draft_id --> draft_id of the PO/Mod
9051 --p_lock_type --> 'P' for copyaction, 'F' for Delete Action
9052 -- p_from_entity_name --> entity level at which the attachemnts are added
9053 -- p_to_entity_name --> entity level at which the attachemnts are copied
9054 -- p_orig_attach_doc_id --> attachmentId of the selected attachment
9055 --Notes:
9056 --End of Comments
9057 --------------------------------------------------------------------------------
9058 PROCEDURE copy_attachment(
9059 p_lock_entity_name IN VARCHAR2,
9060 p_lock_entity_pk1 IN VARCHAR2,--it is the same as x_from_pk1_value
9061 p_lock_entity_pk3 IN VARCHAR2 DEFAULT NULL,
9062 p_lock_entity_pk4 IN VARCHAR2 DEFAULT NULL,
9063 p_lock_by_draft_id IN NUMBER,
9064 p_lock_type IN VARCHAR2,
9065 p_from_entity_name IN VARCHAR2,
9066 p_to_entity_name IN VARCHAR2,
9067 p_orig_attach_doc_id IN NUMBER)---- is same as p_lock_entity_pk2
9068 IS
9069 d_api_name CONSTANT VARCHAR2(30) := 'copy_attachment';
9070 d_module CONSTANT VARCHAR2(100) := d_pkg_name || d_api_name || '.';
9071 d_position NUMBER :=0;
9072 BEGIN
9073
9074 IF (PO_LOG.d_stmt) THEN
9075 PO_LOG.proc_begin(d_module, 'p_lock_entity_name: ', p_lock_entity_name);
9076 PO_LOG.proc_begin(d_module, 'p_lock_entity_pk1: ', p_lock_entity_pk1);
9077 PO_LOG.proc_begin(d_module, 'p_lock_entity_pk3: ', p_lock_entity_pk3);
9078 PO_LOG.proc_begin(d_module, 'p_lock_entity_pk4: ', p_lock_entity_pk4);
9079 PO_LOG.proc_begin(d_module, 'p_lock_by_draft_id: ', p_lock_by_draft_id);
9080 PO_LOG.proc_begin(d_module, 'p_lock_type: ', p_lock_type);
9081 PO_LOG.proc_begin(d_module, 'p_from_entity_name: ', p_from_entity_name);
9082 PO_LOG.proc_begin(d_module, 'p_to_entity_name: ', p_to_entity_name);
9083 PO_LOG.proc_begin(d_module, 'p_orig_attach_doc_id: ', p_orig_attach_doc_id);
9084 END IF;
9085
9086 INSERT INTO po_entity_locks(
9087 po_entity_lock_id,
9088 entity_name,
9089 entity_pk1,
9090 entity_pk2,
9091 entity_pk3,
9092 entity_pk4,
9093 lock_by_draft_id,
9094 lock_type,
9095 last_update_date,
9096 last_updated_by,
9097 last_update_login,
9098 creation_date,
9099 created_by
9100 )
9101 VALUES(
9102 po_entity_locks_s.NEXTVAL,
9103 p_lock_entity_name,
9104 p_lock_entity_pk1,
9105 TO_CHAR(p_orig_attach_doc_id),
9106 p_lock_entity_pk3,
9107 p_lock_entity_pk4,
9108 p_lock_by_draft_id,
9109 p_lock_type ,
9110 SYSDATE,
9111 fnd_global.user_id,
9112 fnd_global.login_id,
9113 SYSDATE,
9114 fnd_global.user_id
9115 );
9116
9117 IF (PO_LOG.d_proc) THEN
9118 PO_LOG.proc_end(d_module, 'number of rows updated', SQL%ROWCOUNT);
9119 END IF;
9120
9121 fnd_attached_documents2_pkg.copy_attachments
9122 ( X_from_entity_name => p_from_entity_name,
9123 X_from_pk1_value => p_lock_entity_pk1,
9124 X_to_entity_name => p_to_entity_name,
9125 X_to_pk1_value => p_lock_entity_pk1 || '-' || TO_CHAR(p_lock_by_draft_id),
9126 X_orig_attach_doc_id =>p_orig_attach_doc_id
9127 );
9128
9129 IF (PO_LOG.d_stmt) THEN
9130 PO_LOG.proc_end(d_module);
9131 END IF;
9132
9133 END;
9134
9135 --------------------------------------------------------------------------------
9136 --Start of Comments
9137 --Name: modify_exhibit_details
9138 -- CLM Phase 4 - Elins project
9139 --Function:
9140 --This procedure will insert the exhibit details into po_exhibit_details for the new Elins created for that dicument.
9141 --Parameters:
9142 --IN:
9143 --p_draft_id:
9144 -- draft id of the PO/Modification
9145 --p_po_header_id:
9146 -- header id of the PO
9147 --IN OUT:
9148 --OUT:
9149 --Notes:
9150 --End of Comments
9151 --------------------------------------------------------------------------------
9152 PROCEDURE modify_exhibit_details (
9153 p_po_header_id IN NUMBER,
9154 p_draft_id IN NUMBER,
9155 p_revision_num IN NUMBER)
9156
9157 IS
9158
9159 d_api_name CONSTANT VARCHAR2(30) := 'modify_exhibit_details';
9160 d_module CONSTANT VARCHAR2(100) := d_pkg_name || d_api_name || '.';
9161 d_position NUMBER :=0;
9162 l_count NUMBER := -1;
9163
9164 po_header_id_tbl PO_TBL_NUMBER;
9165 po_draft_id_tbl PO_TBL_NUMBER;
9166 clm_exhibit_name_tbl PO_TBL_VARCHAR30;
9167 po_exhibit_details_id_tbl PO_TBL_NUMBER;
9168
9169
9170 BEGIN
9171
9172 IF (PO_LOG.d_stmt) THEN
9173 PO_LOG.proc_begin(d_module, 'p_draft_id: ', p_draft_id);
9174 PO_LOG.proc_begin(d_module, 'p_po_header_id: ', p_po_header_id);
9175 PO_LOG.proc_begin(d_module, 'p_revision_num: ', p_revision_num);
9176 END IF;
9177
9178 -- Fecth all the newly created elins of Mod and Award, that does not already exists in our exhibit table
9179 SELECT DISTINCT
9180 clm_exhibit_name,
9181 pl.po_header_id,
9182 pl.draft_id
9183 BULK COLLECT INTO
9184 clm_exhibit_name_tbl,
9185 po_header_id_tbl,
9186 po_draft_id_tbl
9187 FROM
9188 po_lines_merge_v pl
9189 WHERE pl.clm_exhibit_name IS NOT NULL
9190 AND pl.po_header_id = p_po_header_id
9191 AND pl.draft_id = p_draft_id
9192 AND Nvl(pl.delete_flag,'N') <> 'Y'
9193 AND NOT EXISTS (SELECT 1 FROM po_exhibit_details_merge_v ex
9194 WHERE ex.exhibit_name = pl.clm_exhibit_name
9195 AND ex.po_header_id = pl.po_header_id
9196 AND ex.draft_id = pl.draft_id
9197 AND Nvl(ex.delete_flag,'N') <> 'Y');
9198
9199
9200 d_position := 5;
9201
9202 IF (PO_LOG.d_stmt) THEN
9203 PO_LOG.stmt(d_module,d_position ,'Fetched the new exhibit details',clm_exhibit_name_tbl.count);
9204 PO_LOG.stmt(d_module,d_position ,'number of rows selected ',SQL%ROWCOUNT);
9205 END IF;
9206
9207 -- Insert the exhibits that are created in document but does not exist in the PO_EXHIBIT_DETAILS
9208 FORALL idx IN 1..clm_exhibit_name_tbl.Count
9209 INSERT INTO po_exhibit_details_draft
9210 (
9211 po_exhibit_details_id,
9212 exhibit_name,
9213 exhibit_description,
9214 is_cdrl,
9215 po_header_id,
9216 draft_id,
9217 change_status,
9218 revision_num,
9219 LAST_UPDATE_DATE,
9220 LAST_UPDATED_BY,
9221 CREATION_DATE,
9222 CREATED_BY,
9223 LAST_UPDATE_LOGIN
9224 )
9225 (
9226 SELECT
9227 po_exhibit_details_s.nextval,
9228 clm_exhibit_name_tbl(idx),
9229 null, -- Description
9230 'N', -- IsCdrl (Cdrl is inserted by contracts team)
9231 po_header_id_tbl(idx),
9232 po_draft_id_tbl(idx),
9233 'NEW',--ChangeStatus
9234 Nvl(p_revision_num,0),
9235 SYSDATE,
9236 fnd_global.user_id,
9237 SYSDATE,
9238 fnd_global.user_id,
9239 fnd_global.login_id
9240 FROM
9241 dual
9242 ) ;
9243
9244
9245 d_position := 10;
9246
9247 IF (PO_LOG.d_stmt) THEN
9248 PO_LOG.stmt(d_module,d_position ,'number of rows selected ',SQL%ROWCOUNT);
9249 END IF;
9250
9251 SELECT DISTINCT
9252 po_exhibit_details_id,
9253 exhibit_name,
9254 po_header_id,
9255 draft_id
9256 BULK COLLECT INTO
9257 po_exhibit_details_id_tbl,
9258 clm_exhibit_name_tbl,
9259 po_header_id_tbl,
9260 po_draft_id_tbl
9261 FROM po_exhibit_details_merge_v ex
9262 WHERE ex.po_header_id = p_po_header_id
9263 AND ex.draft_id = p_draft_id
9264 AND ex.is_cdrl = 'N'
9265 AND Nvl(ex.delete_flag,'N') <> 'Y'
9266 AND NOT EXISTS (SELECT 1 FROM po_lines_draft_all PLD
9267 WHERE PLD.draft_id = ex.draft_id
9268 AND ex.exhibit_name = PLD.clm_exhibit_name
9269 AND NVL(PLD.delete_flag, 'N') <> 'Y')
9270 AND NOT EXISTS (SELECT 1 FROM po_lines_all pl
9271 WHERE pl.po_header_id = p_po_header_id
9272 AND ex.exhibit_name = pl.clm_exhibit_name
9273 AND NOT EXISTS (SELECT 1 FROM po_lines_draft_all pd
9274 WHERE pl.po_line_id = pd.po_line_id
9275 AND NVL(pd.delete_flag, 'N') = 'Y')
9276 );
9277
9278 IF (PO_LOG.d_stmt) THEN
9279 PO_LOG.stmt(d_module,d_position ,'Fetched the exhibit details for deletion',po_exhibit_details_id_tbl.count);
9280 PO_LOG.stmt(d_module,d_position ,'number of rows selected ',SQL%ROWCOUNT);
9281 END IF;
9282
9283 -- Delete the exhibits that does not exists in document but exist in the PO_EXHIBIT_DETAILS
9284 FORALL idx IN 1..po_exhibit_details_id_tbl.Count
9285 INSERT INTO po_exhibit_details_draft
9286 (
9287 po_exhibit_details_id,
9288 exhibit_name,
9289 exhibit_description,
9290 is_cdrl,
9291 po_header_id,
9292 draft_id,
9293 delete_flag,
9294 revision_num,
9295 LAST_UPDATE_DATE,
9296 LAST_UPDATED_BY,
9297 CREATION_DATE,
9298 CREATED_BY,
9299 LAST_UPDATE_LOGIN
9300 )
9301 (
9302 SELECT po_exhibit_details_id_tbl(idx),
9303 clm_exhibit_name_tbl(idx),
9304 null,
9305 'N',--DummyValue
9306 po_header_id_tbl(idx),
9307 po_draft_id_tbl(idx),
9308 'Y',-- Delete Flag
9309 Nvl(p_revision_num,0),
9310 SYSDATE,
9311 fnd_global.user_id,
9312 SYSDATE,
9313 fnd_global.user_id,
9314 fnd_global.login_id
9315 FROM dual
9316 WHERE NOT EXISTS (SELECT 1 FROM po_exhibit_details_draft exd
9317 WHERE exd.po_exhibit_details_id = po_exhibit_details_id_tbl(idx)
9318 )
9319 );
9320
9321 d_position := 20;
9322
9323 IF (PO_LOG.d_stmt) THEN
9324 PO_LOG.stmt(d_module,d_position ,'number of rows inserted for deletion ',SQL%ROWCOUNT);
9325 END IF;
9326
9327 UPDATE po_exhibit_details_draft ex
9328 SET ex.delete_flag = 'Y'
9329 WHERE ex.po_exhibit_details_id IN (SELECT column_value FROM TABLE(po_exhibit_details_id_tbl));
9330
9331 IF (PO_LOG.d_stmt) THEN
9332 PO_LOG.stmt(d_module,d_position ,'number of rows set for deletion ',SQL%ROWCOUNT);
9333 END IF;
9334
9335 d_position := 30;
9336 IF (PO_LOG.d_stmt) THEN
9337 PO_LOG.proc_end(d_module);
9338 END IF;
9339
9340 END modify_exhibit_details;
9341
9342 -----------------------------------------------------------------------
9343 --Start of Comments
9344 --<PAR Project>
9345 --Name: any_par_exist
9346 --Function:
9347 -- check whether for the given style_id any PAR exists
9348 --Parameters:
9349 --IN:
9350 --p_style_id of the record
9351 --End of Comments
9352 ------------------------------------------------------------------------
9353 FUNCTION is_par_exist
9354 ( p_style_id IN NUMBER
9355 ) RETURN VARCHAR2 IS
9356
9357 l_par_exist_flag VARCHAR2(1);
9358 BEGIN
9359
9360 BEGIN
9361 SELECT 'Y'
9362 INTO l_par_exist_flag
9363 FROM dual
9364 WHERE EXISTS (SELECT 'PAR Exists'
9365 FROM po_drafts pod,
9366 po_headers_all poh
9367 WHERE pod.document_id = poh.po_header_id
9368 AND poh.style_id = p_style_id
9369 AND pod.draft_type= 'PAR');
9370
9371 EXCEPTION
9372 WHEN NO_DATA_FOUND THEN
9373 l_par_exist_flag := 'N';
9374 END;
9375
9376 RETURN l_par_exist_flag;
9377 END is_par_exist;
9378
9379 --UCA Changes Begin
9380 --------------------------------------------------------------------------------
9381 --Start of Comments
9382 --Name: delete_line_ucas
9383 -- CLM Phase 4 - UCA Project
9384 --Function:
9385 --This Procedure will delete the ucas for the given po line ids and
9386 --for the given draft id, if UCA is enabled.
9387 --Parameters:
9388 --IN:
9389 --p_po_draft_id:
9390 -- draft id of the PO/Modification
9391 --po_line_ids_tbl:
9392 -- Table of line ids for which the uca details should be deleted.
9393 --IN OUT:
9394 --OUT:
9395 --Notes:
9396 --End of Comments
9397 --------------------------------------------------------------------------------
9398 PROCEDURE delete_line_ucas(p_po_draft_id IN NUMBER,
9399 po_line_ids_tbl IN PO_TBL_NUMBER)
9400 IS
9401 d_api_name CONSTANT VARCHAR2(30) := 'delete_line_ucas';
9402 d_module CONSTANT VARCHAR2(2000) := d_pkg_name
9403 || d_api_name
9404 || '.';
9405 d_position NUMBER;
9406 l_isucaenabled VARCHAR2(1) := 'N';
9407 BEGIN
9408 d_position := 10;
9409
9410 IF ( po_log.d_proc ) THEN
9411 po_log.Proc_begin(d_module, 'p_po_draft_id', p_po_draft_id);
9412
9413 po_log.Proc_begin(d_module, 'po_line_ids_tbl', po_line_ids_tbl);
9414 END IF;
9415 IF po_line_ids_tbl IS NOT NULL AND po_line_ids_tbl.count() > 0 THEN
9416 SELECT
9417 Nvl(po_core_s.Retrieveoptionvalue(org_id, po_core_s.g_undef_cont_act_col),
9418 'N'
9419 )
9420 INTO l_isucaenabled
9421 FROM po_lines_merge_v
9422 WHERE po_line_id = po_line_ids_tbl(1)
9423 AND draft_id = p_po_draft_id;
9424 END IF;
9425
9426 IF l_isucaenabled = 'Y' THEN
9427 -- revert the changes for undefinitizing mods
9428 forall ucaindex IN 1 .. po_line_ids_tbl.Count()
9429 DELETE FROM po_line_ucas
9430 WHERE po_line_id = Po_line_ids_tbl(ucaindex)
9431 AND undef_draft_id = p_po_draft_id;
9432 --revert the values for definitizing mods
9433 forall ucaindex IN 1 .. po_line_ids_tbl.Count()
9434 UPDATE po_line_ucas
9435 SET def_draft_id = NULL,
9436 def_description = NULL,
9437 def_par_draft_id = NULL
9438 WHERE po_line_id = Po_line_ids_tbl(ucaindex)
9439 AND ( def_draft_id = p_po_draft_id
9440 OR def_par_draft_id = p_po_draft_id );
9441 END IF;
9442 IF (PO_LOG.d_stmt) THEN
9443 PO_LOG.proc_end(d_module);
9444 END IF;
9445 d_position := 20;
9446 EXCEPTION
9447 WHEN OTHERS THEN
9448 IF (PO_LOG.d_stmt) THEN
9449 PO_LOG.stmt(d_module, d_position, 'Exception While deleting Line ucas'
9450 ||SQLCODE||' -ERROR- '||SQLERRM );
9451 END IF;
9452 END delete_line_ucas;
9453
9454 --UCA Changes End.
9455
9456
9457
9458 --------------------------------------------------------------------------------
9459 --Start of Comments
9460 --Name: identify_exhibit_locks
9461 -- <Conc Mods Project>
9462 --Pre-reqs: None
9463 --Modifies:
9464 -- po_entity_locks
9465 --Locks:
9466 -- po_exhibit_details
9467 --Function:
9468 -- This procedure generates the change data for the passed entities PKs,
9469 -- creates entries in po_entity_locks table corresponding to the modified
9470 -- attributes, and locks the required rows in transaction tables.
9471 --Parameters:
9472 --IN:
9473 --p_draft_id
9474 -- draft id of the current Modification - Award/IDV
9475 --Notes:
9476 --End of Comments
9477 --------------------------------------------------------------------------------
9478
9479 PROCEDURE identify_exhibit_locks(
9480 p_draft_id IN NUMBER
9481 )
9482 IS
9483 d_api_name CONSTANT VARCHAR2(30) := 'identify_exhibit_locks';
9484 d_module CONSTANT VARCHAR2(2000) := d_pkg_name || d_api_name || '.';
9485 d_position NUMBER;
9486
9487 BEGIN
9488
9489 d_position:=0;
9490 IF (PO_LOG.d_proc) THEN
9491 PO_LOG.proc_begin(d_module);
9492 PO_LOG.proc_begin(d_module, 'p_draft_id', p_draft_id);
9493 END IF;
9494
9495 -- Insert Exhibit level locks required into gt table
9496 INSERT INTO po_session_gt(
9497 key,
9498 index_char1, -- records identifier
9499 index_char2, -- entity_name
9500 char1, -- entity_pk1
9501 num1, -- lock_by_draft_id
9502 char5 -- lock_type
9503 )
9504 SELECT po_session_gt_s.NEXTVAL,
9505 G_LOCKS_REQUIRED_ID,
9506 G_LOCK_EXHIBIT_ENTITY,
9507 draft.po_exhibit_details_id, -- po_exhibit_details_id
9508 draft.draft_id,
9509 CASE
9510 WHEN base.p_lock_attrs <> draft.p_lock_attrs THEN 'P'
9511 ELSE NULL
9512 END lock_type
9513 FROM (SELECT pex.po_exhibit_details_id,
9514 G_DRAFT_ID_MINUS_1 draft_id,
9515 po_exhibit_mod_p_lock_attrs(
9516 NVL(pex.exhibit_description ,G_NULL_CHAR),
9517 NVL(pex.reference_line_id ,G_NULL_NUM)
9518 ) p_lock_attrs
9519 FROM po_exhibit_details pex,
9520 po_session_gt pogt
9521 WHERE pex.po_exhibit_details_id = pogt.char1 -- po_exhibit_details_id
9522 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
9523 AND pogt.index_char2 = G_LOCK_EXHIBIT_ENTITY
9524 ) base,
9525 (SELECT pexd.po_exhibit_details_id,
9526 pexd.draft_id,
9527 po_exhibit_mod_p_lock_attrs(
9528 NVL(pexd.exhibit_description ,G_NULL_CHAR),
9529 NVL(pexd.reference_line_id ,G_NULL_NUM)
9530 ) p_lock_attrs
9531 FROM po_exhibit_details_draft pexd,
9532 po_session_gt pogt
9533 WHERE pexd.draft_id = p_draft_id
9534 AND pexd.po_exhibit_details_id = pogt.char1 -- po_exhibit_details_id
9535 AND pogt.index_char1 = G_CHANGED_ENTTIES_ID
9536 AND pogt.index_char2 = G_LOCK_EXHIBIT_ENTITY
9537 ) draft
9538 WHERE base.po_exhibit_details_id = draft.po_exhibit_details_id
9539 AND base.p_lock_attrs <> draft.p_lock_attrs;
9540
9541
9542 d_position:=10;
9543 IF (PO_LOG.d_stmt) THEN
9544 PO_LOG.stmt_all_session_gt(d_module, d_position, G_LOCKS_REQUIRED_ID);
9545 PO_LOG.stmt(d_module, d_position, 'Number of Records Inserted',SQL%ROWCOUNT);
9546 END IF;
9547
9548 d_position:=40;
9549 IF (PO_LOG.d_proc) THEN
9550 PO_LOG.proc_end(d_module);
9551 END IF;
9552 EXCEPTION
9553 WHEN OTHERS THEN
9554 IF (PO_LOG.d_exc) THEN
9555 PO_LOG.exc(d_module,d_position,SQLCODE || SQLERRM);
9556 END IF;
9557 RAISE;
9558 END identify_exhibit_locks;
9559
9560
9561 -------------------------------------------------------
9562 ---------- PROCEDURES DECLARATION ENDS HERE -----------
9563 ----------- INITIALIZATION SECTION STARTS -------------
9564 -------------------------------------------------------
9565
9566 BEGIN
9567 -- <Conc Mods Project>
9568 -- Initialize the pl/sql table with lock compatibilities
9569 -- C = Compatible, I = Incompatible
9570 g_entity_lock_comp_tbl := po_entity_lock_comp_tbl_type();
9571 g_entity_lock_comp_tbl.extend(9);
9572 g_entity_lock_comp_tbl(1) := po_entity_lock_comp_type('S', 'S', 'C');
9573 g_entity_lock_comp_tbl(2) := po_entity_lock_comp_type('S', 'P', 'C');
9574 g_entity_lock_comp_tbl(3) := po_entity_lock_comp_type('S', 'F', 'I');
9575 g_entity_lock_comp_tbl(4) := po_entity_lock_comp_type('P', 'S', 'C');
9576 g_entity_lock_comp_tbl(5) := po_entity_lock_comp_type('P', 'P', 'I');
9577 g_entity_lock_comp_tbl(6) := po_entity_lock_comp_type('P', 'F', 'I');
9578 g_entity_lock_comp_tbl(7) := po_entity_lock_comp_type('F', 'S', 'I');
9579 g_entity_lock_comp_tbl(8) := po_entity_lock_comp_type('F', 'P', 'I');
9580 g_entity_lock_comp_tbl(9) := po_entity_lock_comp_type('F', 'F', 'I');
9581
9582 END PO_DRAFTS_PVT;