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