1 PACKAGE BODY inv_project AS
2 /* $Header: INVPRJIB.pls 120.13.12020000.2 2012/10/26 03:00:35 xiameng ship $ */
3
4 G_PKG_NAME CONSTANT VARCHAR2(30) := 'INV_PROJECT';
5
6 G_DISPLAYED_SEGMENTS VARCHAR2(1000);
7 G_CONCATENATED_SEGMENTS VARCHAR2(1000);
8 G_PHYSICAL_LOCATOR VARCHAR2(1000);
9 G_PROJECT_COLUMN NUMBER;
10 G_TASK_COLUMN NUMBER;
11 G_PROJECT_NUMBER VARCHAR2(30);
12 G_PROJECT_ID NUMBER;
13 G_TASK_ID NUMBER;
14 G_TASK_NUMBER VARCHAR2(30);
15
16 G_LOC_CONC_QRY VARCHAR2(1000);
17 G_CONCATENATED_LOCATOR VARCHAR2(1000);
18 G_LOC_QRY_BLT VARCHAR2(1) := 'N';
19 /*For performace enhancements*/
20 g_delimiter VARCHAR2(1);
21 g_project_index NUMBER;
22 g_task_index NUMBER;
23 g_organization_id NUMBER;
24
25
26 PROCEDURE MYDEBUG(MSG IN VARCHAR2) IS
27
28 L_MSG VARCHAR2(5100);
29 l_len number;
30 l_count number;
31 l_start number;
32 l_subs varchar2(200);
33 BEGIN
34
35 L_MSG := MSG;
36
37 /* INV_MOBILE_HELPER_FUNCTIONS.TRACELOG(
38 P_ERR_MSG => L_MSG,
39 P_MODULE => G_PKG_NAME,
40 P_LEVEL => 4
41 );
42
43 l_len := length(l_msg);
44 l_count := floor(l_len/100) + 1;
45 l_start := 1;
46 for i in 1 .. l_count
47 loop
48 l_subs := substr(l_msg, l_start, (l_start +99));
49 dbms_output.put_line(l_subs);
50 l_start := l_start + 100;
51 end loop;*/
52 INV_LOG_UTIL.TRACE(
53 P_MESSAGE => L_MSG,
54 P_MODULE => G_PKG_NAME,
55 P_LEVEL => 4
56 );
57 exception
58 when others then
59 null;
60 END;
61
62
63
64 Procedure resolve_project_references(
65 source_project_id IN number,
66 source_project_number IN OUT NOCOPY varchar2,
67 source_task_id IN number,
68 source_task_number IN OUT NOCOPY varchar2,
69 p_project_id IN number,
70 p_project_number IN OUT NOCOPY varchar2,
71 t_task_id IN number,
72 t_task_number IN OUT NOCOPY varchar2,
73 to_project_id IN number,
74 to_project_number IN OUT NOCOPY varchar2,
75 to_task_id IN number,
76 to_task_number IN OUT NOCOPY varchar2,
77 pa_expenditure_org_id IN number,
78 pa_expenditure_org IN OUT NOCOPY varchar2,
79 success IN OUT NOCOPY boolean ) IS
80
81 l_cur_mfg_org_id NUMBER;
82 BEGIN
83
84 source_project_number := NULL;
85 source_task_number := NULL;
86 p_project_number := NULL;
87 t_task_number := NULL;
88 to_project_number := NULL;
89 to_task_number := NULL;
90 pa_expenditure_org := NULL;
91
92 -- bug 4662395 set the profile mfg_organization_id so
93 -- the call to PJM_PROJECTS_ALL_V will return data.
94 l_cur_mfg_org_id := TO_NUMBER(FND_PROFILE.VALUE('MFG_ORGANIZATION_ID'));
95
96 IF ( (pa_expenditure_org_id IS NOT NULL) AND
97 ( (l_cur_mfg_org_id IS NULL) OR
98 (l_cur_mfg_org_id IS NOT NULL AND l_cur_mfg_org_id <> FND_API.G_MISS_NUM)
99 )
100 ) THEN
101 FND_PROFILE.put('MFG_ORGANIZATION_ID',pa_expenditure_org_id);
102 END IF;
103
104
105 if ( source_project_id IS NOT NULL ) then
106 BEGIN
107 -- Modified For bug 1301035
108 /* Bug 2490166 */
109 /* SELECT m.segment1
110 INTO source_project_number
111 FROM pa_projects_all m
112 WHERE m.project_id = source_project_id ; */
113
114 SELECT m.project_number
115 INTO source_project_number
116 FROM pjm_projects_all_v m
117 WHERE m.project_id = source_project_id ;
118
119
120 EXCEPTION
121 WHEN NO_DATA_FOUND then
122 source_project_number := NULL;
123 END;
124 end if;
125
126
127
128 if ( p_project_id IS NOT NULL ) then
129 BEGIN
130 -- Modified For bug 1301035
131 /* Bug 2490166 */
132 /* SELECT my.segment1
133 INTO p_project_number
134 FROM pa_projects_all my
135 WHERE my.project_id = p_project_id ; */
136
137 SELECT my.project_number
138 INTO p_project_number
139 FROM pjm_projects_all_v my
140 WHERE my.project_id = p_project_id ;
141
142 success := TRUE ;
143 EXCEPTION
144 WHEN NO_DATA_FOUND then
145 p_project_number := NULL;
146 END;
147
148 end if;
149
150
151 if ( to_project_id IS NOT NULL ) then
152 BEGIN
153 -- Modified For bug 1301035
154 /* Bug 2490166 */
155 /* SELECT m.segment1
156 INTO to_project_number
157 FROM pa_projects_all m
158 WHERE m.project_id = to_project_id ; */
159
160 SELECT m.project_number
161 INTO to_project_number
162 FROM pjm_projects_all_v m
163 WHERE m.project_id = to_project_id ;
164 EXCEPTION
165 WHEN NO_DATA_FOUND then
166 to_project_number := NULL;
167
168 END;
169 end if;
170
171
172
173 if ( source_task_id IS NOT NULL ) then
174 BEGIN
175 SELECT m.task_number
176 INTO source_task_number
177 FROM pjm_tasks_v m
178 WHERE m.task_id = source_task_id
179 AND m.project_id = source_project_id;
180
181 EXCEPTION
182 WHEN NO_DATA_FOUND then
183 source_task_number := NULL;
184
185 END;
186 end if;
187
188
189
190 if ( t_task_id IS NOT NULL ) then
191 BEGIN
192 SELECT m.task_number
193 INTO t_task_number
194 FROM pjm_tasks_v m
195 WHERE m.task_id = t_task_id
196 AND m.project_id = p_project_id;
197
198 EXCEPTION
199 WHEN NO_DATA_FOUND then
200 t_task_number := NULL;
201
202 END;
203 end if;
204
205
206 if ( to_task_id IS NOT NULL ) then
207 BEGIN
208 SELECT m.task_number
209 INTO to_task_number
210 FROM pjm_tasks_v m
211 WHERE m.task_id = to_task_id
212 AND m.project_id = to_project_id;
213
214 EXCEPTION
215 WHEN NO_DATA_FOUND then
216 to_task_number := NULL;
217
218 END;
219 end if;
220
221
222 --Bug #5504073
223 --Added a ROWNUM = 1 while fetching expenditure org name
224 IF ( pa_expenditure_org_id IS NOT NULL ) then
225 BEGIN
226 SELECT m.name
227 INTO pa_expenditure_org
228 FROM pa_organizations_expend_v m
229 WHERE m.organization_id = pa_expenditure_org_id
230 AND active_flag='Y'
231 AND ROWNUM = 1;
232 EXCEPTION
233 WHEN NO_DATA_FOUND then
234 pa_expenditure_org := NULL;
235 END;
236 END IF;
237
238 success := TRUE;
239 EXCEPTION
240 WHEN OTHERS then
241 success := FALSE;
242
243 END resolve_project_references ;
244
245
246 Procedure org_project_parameters(
247 org_id IN number,
248 p_project_reference_enabled OUT NOCOPY number,
249 p_pm_cost_collection_enabled OUT NOCOPY number,
250 p_project_control_level OUT NOCOPY number,
251 success OUT NOCOPY boolean) IS
252 BEGIN
253 success := TRUE;
254 p_project_reference_enabled := 2;
255 p_pm_cost_collection_enabled := 2;
256 p_project_control_level := 1 ;
257 SELECT NVL(mp.project_reference_enabled, 2),
258 NVL(mp.pm_cost_collection_enabled,2),
259 NVL(mp.project_control_level,1)
260 INTO p_project_reference_enabled,
261 p_pm_cost_collection_enabled,
262 p_project_control_level
263 FROM mtl_parameters mp
264 WHERE organization_id = org_id ;
265
266 EXCEPTION
267 WHEN OTHERS then
268 success := FALSE ;
269
270 END org_project_parameters ;
271
272
273
274 Function onhand_qty(
275 org_id number,
276 sub_code varchar2,
277 loc_id number)return number IS
278
279 found number := -1;
280 qty_found number := 0 ;
281
282 BEGIN
283 SELECT NVL(SUM(primary_transaction_quantity),0)
284 INTO qty_found
285 FROM MTL_ONHAND_QUANTITIES_DETAIL
286 WHERE organization_id = org_id
287 AND subinventory_code = NVL(sub_code, subinventory_code)
288 AND NVL(locator_id,-9999) = NVL(loc_id, NVL(locator_id,-9999)) ;
289
290 return qty_found ;
291 EXCEPTION
292 WHEN NO_DATA_FOUND then
293 qty_found := 0 ;
294 return qty_found ;
295 WHEN OTHERS then
296 qty_found := -1 ;
297 return qty_found ;
298
299 END onhand_qty ;
300
301 Function pending_in_temp(
302 org_id number,
303 sub_code varchar2,
304 loc_id number) return number IS
305
306 found number := -1;
307 trx_found number := 0;
308
309 BEGIN
310 SELECT COUNT(transaction_temp_id)
311 INTO trx_found
312 FROM mtl_material_transactions_temp
313 WHERE organization_id = org_id
314 AND subinventory_code = NVL(sub_code, subinventory_code)
315 AND NVL(locator_id,-9999) = NVL(loc_id, NVL(locator_id,-9999)) ;
316
317 return trx_found ;
318 EXCEPTION
319 WHEN NO_DATA_FOUND then
320 trx_found := 0 ;
321 return trx_found ;
322 WHEN OTHERS then
323 trx_found := -1 ;
324 return trx_found ;
325 trx_found := NVL(trx_found, 0);
326
327 END pending_in_temp ;
328
329
330
331 Function pending_in_interface(
332 org_id number,
333 sub_code varchar2,
334 loc_id number) return number IS
335
336 found number := -1;
337 trx_found number := 0;
338
339 BEGIN
340 SELECT COUNT(transaction_interface_id)
341 INTO trx_found
342 FROM mtl_transactions_interface
343 WHERE organization_id = org_id
344 AND subinventory_code = NVL(sub_code, subinventory_code)
345 AND NVL(locator_id,-9999) = NVL(loc_id, NVL(locator_id,-9999)) ;
346
347 return trx_found ;
348 EXCEPTION
349 WHEN NO_DATA_FOUND then
350 trx_found := 0 ;
351 return trx_found ;
352 WHEN OTHERS then
353 trx_found := -1 ;
354 return trx_found ;
355
356
357 END pending_in_interface ;
358
359
360 Procedure onhand_pending_trx(
361 org_id IN number,
362 sub_code IN varchar2,
363 locator_id IN number,
364 onhand OUT NOCOPY boolean,
365 pending_trx OUT NOCOPY boolean,
366 success OUT NOCOPY boolean) IS
367
368 qty_found number := 0;
369 pending_trx_found number := 0;
370 onhand_return number;
371 pending_in_temp_return number;
372 pending_in_interface_return number ;
373
374
375
376 BEGIN
377 success := TRUE;
378
379 onhand_return := onhand_qty(org_id,sub_code,locator_id) ;
380 if ( onhand_return = 0 ) then
381 pending_in_temp_return := pending_in_temp(org_id,sub_code,locator_id) ;
382 if ( pending_in_temp_return = 0 ) then
383 pending_in_interface_return := pending_in_interface(org_id,sub_code,locator_id) ;
384 if ( pending_in_interface_return = 0 ) then
385 onhand := FALSE;
386 pending_trx := FALSE;
387 else
388 onhand := TRUE ;
389 pending_trx := TRUE ;
390 end if;
391 else
392 onhand := TRUE ;
393 pending_trx := TRUE ;
394 end if;
395 else
396 onhand := TRUE ;
397 pending_trx := TRUE ;
398 end if;
399 if ( (onhand_return < 0 ) OR (pending_in_temp_return < 0 ) OR
400 ( pending_in_interface_return < 0 ) ) then
401 success := FALSE;
402 end if;
403
404 END onhand_pending_trx;
405
406
407 Procedure populate_project_info(
408 FM_ORG_ID IN NUMBER,
409 TO_ORG_ID IN NUMBER,
410 FM_SUB IN VARCHAR2,
411 TO_SUB IN VARCHAR2,
412 FM_LOCATOR IN NUMBER,
413 TO_LOCATOR IN NUMBER,
414 F_PROJECT_ID IN OUT NOCOPY NUMBER,
415 F_TASK_ID IN OUT NOCOPY NUMBER,
416 T_PROJECT_ID IN OUT NOCOPY NUMBER,
417 T_TASK_ID IN OUT NOCOPY NUMBER,
418 ERROR_CODE OUT NOCOPY VARCHAR2,
419 ERROR_EXPL OUT NOCOPY VARCHAR2,
420 SRC_TYPE_ID IN NUMBER,
421 ACTION_ID IN NUMBER ,
422 SOURCE_ID IN NUMBER) IS
423 /*
424 Added source_id parameter to get the project and task of the source.
425 Currently the source_id field is used for passing the req_line_id.
426 This parameter could be used in future for other sources. For internal
427 order intransit shipment and internal req intransit receipt the source
428 id is the req_line_id. The project and task is selected from po_requisition_lines
429 table.
430 */
431 prj_ref_enabled number ;
432 prj_cntrl_level number;
433 to_org_prj_ref_enabled number;
434 to_org_prj_cntrl_level number;
435 translated_mesg varchar2(2000) := null;
436 v_buffer varchar2(241) := null;
437 x_return_status Varchar2(1);
438 BEGIN
439
440 error_code := null;
441 error_expl := null;
442 if ( (fm_org_id IS NULL ) OR (src_type_id IS NULL)
443 OR (action_id IS NULL ) ) then
444 fnd_message.set_name('INV','INV_DATA_ERROR');
445 fnd_message.set_token('ENTITY', 'populate_project_info');
446 translated_mesg := fnd_message.get ;
447 error_code := '';
448 error_expl := substr(translated_mesg,1,240) ;
449 return ;
450 end if;
451
452 SELECT NVL(project_reference_enabled,2), NVL(project_control_level,1)
453 INTO prj_ref_enabled, prj_cntrl_level
454 FROM mtl_parameters
455 WHERE organization_id = fm_org_id ;
456 /* We are going to get task ids no matter what the control level is
457 But are keeping reference for control level in case later we decide to
458 filter on this. So now, setting cntrl_level = 2 (task level)
459 */
460 prj_cntrl_level := 2 ;
461 if ( prj_ref_enabled = 2 ) then
462 if ( (action_id IN (3,21,12) )) then
463 goto handle_interorg ;
464 else
465 return ;
466 end if;
467 end if;
468
469 if ( f_project_id IS NULL and fm_locator is not NULL) then
470 SELECT project_id
471 INTO f_project_id
472 FROM mtl_item_locations
473 WHERE inventory_location_id = fm_locator
474 AND organization_id = fm_org_id ;
475 end if;
476
477 if ( f_task_id IS NULL AND f_project_id IS NOT NULL) then
478 if ( prj_cntrl_level = 2 AND prj_ref_enabled = 1 ) then
479 if ( fm_locator IS NOT NULL ) then
480 SELECT task_id
481 INTO f_task_id
482 FROM mtl_item_locations
483 WHERE NVL(project_id,-999) = NVL(f_project_id, -111)
484 AND inventory_location_id = fm_locator
485 AND organization_id = fm_org_id ;
486
487 end if;
488 end if;
489 end if;
490
491 if ( action_id in (2,28) ) then
492
493 if ( t_project_id IS NULL ) then
494 if ( to_locator IS NOT NULL ) then
495 SELECT project_id
496 INTO t_project_id
497 FROM mtl_item_locations
498 WHERE inventory_location_id = to_locator
499 AND organization_id = fm_org_id ;
500 end if;
501 end if;
502
503 if ( t_task_id IS NULL AND t_project_id IS NOT NULL) then
504 if ( to_locator IS NOT NULL ) then
505 SELECT task_id
506 INTO t_task_id
507 FROM mtl_item_locations
508 WHERE inventory_location_id = to_locator
509 AND organization_id = fm_org_id ;
510 end if;
511
512 end if;
513
514 end if;
515
516 <<handle_interorg>>
517 if ( (action_id = 3) OR (action_id = 21) OR (action_id = 12) ) then
518 if ( to_org_id IS NULL ) then
519 return;
520 end if;
521
522 SELECT NVL(project_reference_enabled,2), NVL(project_control_level,1)
523 INTO to_org_prj_ref_enabled, to_org_prj_cntrl_level
524 FROM mtl_parameters
525 WHERE organization_id = to_org_id ;
526
527 /* We are going to get task ids no matter what the control level is
528 But are keeping reference for control level in case later we decide to
529 filter on this. So now, setting cntrl_level = 2 (task level)
530 */
531
532 to_org_prj_cntrl_level := 2 ;
533 if ( to_org_prj_ref_enabled = 2 ) then
534 return;
535 end if;
536 If (action_id in (12,21) and source_id is not null) Then
537 If (src_type_id = 8 ) Then /* Intransit Shipment */
538 Get_project_info_from_Req(
539 x_return_status,
540 t_project_id,
541 t_task_id,
542 Source_Id);
543 Else /* for Intransit Receipt */
544 Get_project_info_for_RcvTrx(
545 x_return_status,
546 t_project_id,
547 t_task_id,
548 Source_Id);
549
550 End If;
551 If X_return_status <> FND_API.G_RET_STS_SUCCESS
552 Then
553 translated_mesg := fnd_message.get ;
554 error_code := '';
555 error_expl := substr(translated_mesg,1,240) ;
556 End If;
557 Return;
558 End If;
559
560 if ( t_project_id IS NULL ) then
561 if ( to_locator IS NOT NULL ) then
562
563 /* For an inventory intransit shipment,any locator entered on the form as
564 to_locator is not picked up by receiving as a default unless the transaction
565 default is set for that locator.
566 The same behaviour is true for project related locators and additionally
567 one cannot receive into a project related locator as well.
568 As MTL_SUPPLY does not support locators, the inventory moves from project
569 cost group to common and after receiving from common to common.*/
570
571 If (action_id = 21 and src_type_id = 13) Then
572 null;
573 Else
574 SELECT project_id
575 INTO t_project_id
576 FROM mtl_item_locations
577 WHERE inventory_location_id = to_locator
578 AND organization_id = to_org_id ;
579 End If;
580 end if;
581 end if;
582
583 if ( t_task_id IS NULL AND t_project_id IS NOT NULL) then
584 if ( to_locator IS NOT NULL ) then
585 SELECT task_id
586 INTO t_task_id
587 FROM mtl_item_locations
588 WHERE inventory_location_id = to_locator
589 AND organization_id = to_org_id ;
590 end if;
591
592 end if;
593
594 end if;
595
596 EXCEPTION
597 WHEN OTHERS then
598
599 fnd_message.set_name('INV','INV_UNHANDLED_ERR');
600 fnd_message.set_token('ENTITY1', 'populate_project_info');
601 v_buffer := to_char(SQLCODE) || ' '|| substr(SQLERRM,1,150);
602 fnd_message.set_token('ENTITY2', v_buffer);
603 translated_mesg := fnd_message.get ;
604 translated_mesg := substr(translated_mesg,1,230) ;
605 error_expl := translated_mesg ;
606
607 END populate_project_info;
608
609
610 Procedure call_cust_val(
611 V_item_id IN number
612 ,V_revision IN varchar2
613 ,V_org_id IN number
614 ,V_sub_code IN varchar2
615 ,V_locator_id IN number
616 ,V_xfr_org_id IN number
617 ,V_xfr_sub_code IN varchar2
618 ,V_xfr_locator_id IN number
619 ,V_quantity IN number
620 ,V_txn_type_id IN number
621 ,V_txn_action_id IN number
622 ,V_txn_source_type_id IN number
623 ,V_txn_source_id IN number
624 ,V_txn_source_name IN varchar2
625 ,V_project_id IN number
626 ,V_task_id IN OUT NOCOPY number
627 ,V_source_project_id IN number
628 ,V_source_task_id IN OUT NOCOPY number
629 ,V_to_project_id IN number
630 ,V_to_task_id IN OUT NOCOPY number
631 ,V_txn_date IN date
632 ,V_pa_expenditure_org_id IN number
633 ,V_expenditure_type IN varchar2
634 ,V_calling_module IN varchar2
635 ,V_user_id IN number
636 ,V_error_mesg OUT NOCOPY varchar2
637 ,V_warning_mesg OUT NOCOPY varchar2
638 ,V_success_flag OUT NOCOPY number
639 ,V_attribute_category IN varchar2
640 ,V_attribute1 IN varchar2
641 ,V_attribute2 IN varchar2
642 ,V_attribute3 IN varchar2
643 ,V_attribute4 IN varchar2
644 ,V_attribute5 IN varchar2
645 ,V_attribute6 IN varchar2
646 ,V_attribute7 IN varchar2
647 ,V_attribute8 IN varchar2
648 ,V_attribute9 IN varchar2
649 ,V_attribute10 IN varchar2
650 ,V_attribute11 IN varchar2
651 ,V_attribute12 IN varchar2
652 ,V_attribute13 IN varchar2
653 ,V_attribute14 IN varchar2
654 ,V_attribute15 IN varchar2
655 )
656 IS
657 x_fm_org_project_control_level number ;
658 x_to_org_project_control_level number;
659 original_task_id number;
660 original_source_task_id number;
661 original_to_task_id number;
662 translated_mesg varchar2(2000) := null;
663 Begin
664
665 v_error_mesg := null;
666 v_warning_mesg := null;
667
668 original_task_id := v_task_id ;
669 original_source_task_id := v_source_task_id ;
670 original_to_task_id := v_to_task_id ;
671 if ( v_org_id IS NULL ) then
672 fnd_message.set_name('INV','INV_DATA_ERROR');
673 fnd_message.set_token('ENTITY', 'call_customer_validation');
674 translated_mesg := fnd_message.get ;
675 v_error_mesg := substr(translated_mesg,1,240) ;
676 v_success_flag := -1 ;
677 return ;
678 end if;
679 if ( (v_txn_action_id = 3) AND v_xfr_org_id IS NULL ) then
680 fnd_message.set_name('INV','INV_DATA_ERROR');
681 fnd_message.set_token('ENTITY', 'call_customer_validation');
682 translated_mesg := fnd_message.get ;
683 v_error_mesg := substr(translated_mesg,1,240) ;
684 v_success_flag := -1 ;
685 return ;
686 end if;
687
688 SELECT NVL(project_control_level,1)
689 INTO x_fm_org_project_control_level
690 FROM mtl_parameters
691 WHERE organization_id = v_org_id ;
692
693 if ( v_txn_action_id = 3 ) then
694 SELECT NVL(project_control_level,1)
695 INTO x_to_org_project_control_level
696 FROM mtl_parameters
697 WHERE organization_id = v_xfr_org_id ;
698 end if;
699
700 /*
701 now call customers validation package
702 */
703
704 inv_prj_cust_val.validate(
705 V_item_id
706 ,V_revision
707 ,V_org_id
708 ,V_sub_code
709 ,V_locator_id
710 ,V_xfr_org_id
711 ,V_xfr_sub_code
712 ,V_xfr_locator_id
713 ,V_quantity
714 ,V_txn_type_id
715 ,V_txn_action_id
716 ,V_txn_source_type_id
717 ,V_txn_source_id
718 ,V_txn_source_name
719 ,V_project_id
720 ,V_task_id
721 ,V_source_project_id
722 ,V_source_task_id
723 ,V_to_project_id
724 ,V_to_task_id
725 ,V_txn_date
726 ,V_pa_expenditure_org_id
727 ,V_expenditure_type
728 ,V_calling_module
729 ,V_user_id
730 ,V_error_mesg
731 ,V_warning_mesg
732 ,V_success_flag
733 ,V_attribute_category
734 ,V_attribute1
735 ,V_attribute2
736 ,V_attribute3
737 ,V_attribute4
738 ,V_attribute5
739 ,V_attribute6
740 ,V_attribute7
741 ,V_attribute8
742 ,V_attribute9
743 ,V_attribute10
744 ,V_attribute11
745 ,V_attribute12
746 ,V_attribute13
747 ,V_attribute14
748 ,V_attribute15 );
749
750 /*
751 Overwrite returned task info if project control level was project,
752 otherwise, use task id info sent back by customer
753 */
754
755 if ( x_fm_org_project_control_level = 2 ) then
756 v_source_task_id := original_source_task_id ;
757 v_task_id := original_task_id ;
758 end if;
759
760 if ( x_to_org_project_control_level = 1 ) then
761 v_to_task_id := original_to_task_id ;
762 end if;
763
764 end call_cust_val ;
765
766 Procedure update_project_task(v_org_id number,
767 v_in_project_id number,
768 v_in_task_id number,
769 v_out_project_id in out NOCOPY number,
770 v_out_task_id in out NOCOPY number) is
771 v_project_reference_enabled number;
772 v_pm_cost_collection_enabled number;
773 v_project_control_level number;
774 v_success boolean;
775 begin
776 INV_PROJECT.org_project_parameters(v_org_id,
777 v_project_reference_enabled,
778 v_pm_cost_collection_enabled,
779 v_project_control_level,
780 v_success);
781 if v_success and v_project_reference_enabled = 1
782 then
783 if v_in_project_id is not null
784 then
785 v_out_project_id := v_in_project_id;
786 if v_in_task_id is not null
787 then
788 v_out_task_id := v_in_task_id;
789 end if;
790 end if;
791 end if;
792 end update_project_task;
793 Procedure update_project_task_number(v_org_id number,
794 v_in_project_id number,
795 v_in_task_id number,
796 v_out_project_id in out NOCOPY number,
797 v_out_task_id in out NOCOPY number,
798 v_out_project in out NOCOPY varchar2,
799 v_out_task in out NOCOPY varchar2) is
800 v_project_reference_enabled number;
801 v_pm_cost_collection_enabled number;
802 v_project_control_level number;
803 v_success boolean;
804 begin
805 INV_PROJECT.org_project_parameters(v_org_id,
806 v_project_reference_enabled,
807 v_pm_cost_collection_enabled,
808 v_project_control_level,
809 v_success);
810 if v_success and v_project_reference_enabled = 1
811 then
812 if v_in_project_id is not null
813 then
814 v_out_project_id := v_in_project_id;
815 begin
816
817 -- bug 4662395 set the profile mfg_organization_id so
818 -- the call to MTL_PROJECT_V will return data.
819
820 FND_PROFILE.put('MFG_ORGANIZATION_ID',v_org_id);
821
822 select project_number
823 into v_out_project
824 from mtl_project_v
825 where project_id = v_in_project_id;
826 exception
827 when others
828 then null;
829 end;
830 if v_in_task_id is not null
831 then
832 v_out_task_id := v_in_task_id;
833 begin
834 select task_number
835 into v_out_task
836 from mtl_task_v
837 where project_id = v_in_project_id
838 and task_id = v_in_task_id;
839 exception
840 when others
841 then null;
842 end;
843 end if;
844 end if;
845 end if;
846 end update_project_task_number;
847
848 /*
849 The Get_project_info_from_Req procedure is called in procedures
850 Get_project_loc_for_prj_Req and
851 populate_project_info procedure.
852
853 This procedure provides the project and task from
854 po_req_distributions_all via po_requisition_lines_all table
855 for the requisition_line_id in the
856 mtl_material_transactions_temp or the
857 transaction interface table.
858 */
859 Procedure Get_project_info_from_Req(
860 x_Return_Status Out NOCOPY Varchar2,
861 x_Project_Id Out NOCOPY Number,
862 x_Task_Id Out NOCOPY Number,
863 P_Req_Line_Id In Number) IS
864
865 l_req_project_id Number;
866 l_req_task_id Number;
867
868 Begin
869 x_return_status := FND_API.G_RET_STS_SUCCESS;
870
871 SELECT project_id,task_id
872 INTO l_req_project_id,l_req_task_id
873 FROM po_req_distributions_all
874 WHERE requisition_line_id = p_req_line_id;
875
876 x_project_id := l_req_project_id;
877 x_task_id := l_req_task_id;
878
879 Exception
880 When Others Then
881
882 X_return_Status := FND_API.G_RET_STS_UNEXP_ERROR;
883 FND_MSG_PUB.Build_Exc_Msg(
884 p_pkg_name =>'Inv_Project',
885 p_procedure_name => 'Get_project_info_from_Req');
886
887 End Get_project_info_from_Req;
888
889 /*
890 The Get_project_info_for_RcvTrx procedure is called in procedures
891 populate_project_info procedure.
892
893 This procedure gets the project and task from po_req_distributions_all
894 via rcv_transactions table for the rcv_transaction_id in the
895 mtl_material_transactions_temp.
896 */
897 Procedure Get_project_info_for_RcvTrx(
898 x_Return_Status Out NOCOPY Varchar2,
899 x_Project_Id Out NOCOPY Number,
900 x_Task_Id Out NOCOPY Number,
901 P_Rcv_Trx_Id In Number) IS
902
903 l_req_project_id Number;
904 l_req_task_id Number;
905
906 Begin
907 x_return_status := FND_API.G_RET_STS_SUCCESS;
908
909 SELECT prd.project_id, prd.task_id
910 INTO l_req_project_id,l_req_task_id
911 FROM po_req_distributions_all prd,
912 rcv_transactions rcv
913 WHERE rcv.transaction_id = P_Rcv_Trx_Id
914 And prd.requisition_line_id = rcv.requisition_line_id;
915
916 x_project_id := l_req_project_id;
917 x_task_id := l_req_task_id;
918
919 Exception
920 When Others Then
921
922 X_return_Status := FND_API.G_RET_STS_UNEXP_ERROR;
923 FND_MSG_PUB.Build_Exc_Msg(
924 p_pkg_name =>'Inv_Project',
925 p_procedure_name => 'Get_project_info_for_RcvTrx');
926
927 End Get_project_info_for_RcvTrx;
928
929 /*
930 /*
931 Procedure Get_project_loc_for_prj_Req appends the project and task to the
932 locator that is provided as input. This procedure takes care of creating a new
933 locator if all control levels are met. This procedure is called by inltev.ppc
934 */
935 Procedure Get_project_loc_for_prj_Req(
936 X_Return_Status Out NOCOPY Varchar2,
937 X_locator_Id In Out NOCOPY Number,
938 P_organization_id In Number,
939 P_Req_Line_Id In Number) IS
940
941 l_req_project_id Number;
942 l_req_task_id Number;
943 l_Project_locator_id Number;
944 l_return_status Varchar2(1);
945
946 Begin
947 x_return_status := FND_API.G_RET_STS_SUCCESS;
948 If P_Req_Line_Id is null Then
949 Return;
950 Else
951 Get_project_info_from_Req(
952 l_return_status,
953 l_req_project_id,
954 l_req_task_id,
955 P_Req_Line_Id);
956 If l_return_status <> FND_API.G_RET_STS_SUCCESS
957 Then
958 Return;
959 End If;
960 If l_req_project_id is null
961 Then
962 return;
963 Else
964 PJM_PROJECT_LOCATOR.Get_DefaultProjectLocator
965 (P_Organization_Id,
966 X_locator_Id,
967 l_req_project_id,
968 l_req_task_id,
969 l_project_locator_Id);
970 X_locator_Id := l_project_locator_Id;
971 End If;
972 End If;
973
974 Exception
975 When Others Then
976
977 X_return_Status := FND_API.G_RET_STS_UNEXP_ERROR;
978 FND_MSG_PUB.Build_Exc_Msg(
979 p_pkg_name =>'Inv_Project',
980 p_procedure_name => 'Get_project_loc_for_prj_Req');
981
982 End Get_project_loc_for_prj_Req;
983
984 Procedure Set_Org_client_info(X_return_Status Out NOCOPY Varchar2,
985 P_Organization_Id In Number) Is
986
987 l_Org_Id Number;
988 l_conreq_id number :=0; --bugfix 4643461
989
990 Begin
991 x_return_status := FND_API.G_RET_STS_SUCCESS;
992
993 l_conreq_id := fnd_global.conc_request_id;
994
995 IF nvl(g_organization_id,-999) <> nvl(P_Organization_Id,-999) THEN
996
997 -- bugfix 4643461 cache the org_id for pickrelease and TM only. which has concurrent req id not null.
998 -- Bug 5304874 Added INV_CACHE.is_pickrelease so that caching happens for pick release online cases also
999 if (l_conreq_id > 0 OR INV_CACHE.is_pickrelease) then
1000
1001 g_organization_id := P_Organization_Id;
1002
1003 end if;
1004
1005 --Commenting the Check Install for PJM, bug 3812559.
1006 /*IF PJM_INSTALL.CHECK_INSTALL
1007 THEN*/
1008 SELECT operating_unit
1009 INTO l_org_id
1010 FROM org_organization_definitions
1011 WHERE organization_id = P_Organization_Id;
1012
1013 if l_org_id is not null
1014 then
1015
1016 -- MOAC replace fnd_client_info.set_org_context
1017 -- with MO_GLOBAL.init
1018 MO_GLOBAL.init('INV');
1019 -- fnd_client_info.set_org_context(to_char(l_org_id));
1020 end if;
1021
1022 -- bugfix 4643461 added debug message
1023 if ( nvl(fnd_profile.value('INV_DEBUG_TRACE'), 0) = 1 ) then
1024 inv_log_util.trace('set client context : '||l_org_id, 'INV_PROJECT', 9);
1025 inv_log_util.trace('g_organization_id : '||g_organization_id, 'INV_PROJECT', 9);
1026 end if;
1027
1028
1029 /*END IF;*/
1030 END IF;
1031
1032 EXCEPTION
1033 WHEN OTHERS THEN
1034
1035 X_return_Status := FND_API.G_RET_STS_UNEXP_ERROR;
1036 FND_MSG_PUB.Build_Exc_Msg(
1037 p_pkg_name =>'Inv_Project',
1038 p_procedure_name => 'Set_Org_client_info');
1039
1040 END Set_Org_client_info;
1041
1042
1043 PROCEDURE SET_SESSION_PARAMETERS(
1044 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
1045 X_MSG_COUNT OUT NOCOPY NUMBER,
1046 X_MSG_DATA OUT NOCOPY VARCHAR2,
1047 P_ORGANIZATION_ID IN NUMBER
1048 ) IS
1049
1050 L_OPERATING_UNIT VARCHAR2(30);
1051
1052 BEGIN
1053
1054 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
1055
1056 FND_PROFILE.PUT('MFG_ORGANIZATION_ID', TO_CHAR(P_ORGANIZATION_ID));
1057
1058 FND_PROFILE.GET('ORG_ID', L_OPERATING_UNIT);
1059
1060 -- MOAC replace fnd_client_info.set_org_context
1061 -- with MO_GLOBAL.init
1062 MO_GLOBAL.init('INV');
1063 -- FND_CLIENT_INFO.SET_ORG_CONTEXT(L_OPERATING_UNIT);
1064
1065 FND_MSG_PUB.COUNT_AND_GET( P_COUNT => X_MSG_COUNT, P_DATA => X_MSG_DATA );
1066
1067 EXCEPTION
1068
1069 WHEN FND_API.G_EXC_ERROR THEN
1070
1071 X_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
1072 FND_MSG_PUB.COUNT_AND_GET( P_COUNT => X_MSG_COUNT, P_DATA => X_MSG_DATA );
1073
1074 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1075
1076 X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR;
1077 FND_MSG_PUB.COUNT_AND_GET( P_COUNT => X_MSG_COUNT, P_DATA => X_MSG_DATA );
1078
1079 WHEN OTHERS THEN
1080
1081 X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR;
1082 IF FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1083 FND_MSG_PUB.ADD_EXC_MSG( g_pkg_name, 'SET_SESSION_PARAMETERS');
1084 END IF;
1085 FND_MSG_PUB.COUNT_AND_GET( P_COUNT => X_MSG_COUNT, P_DATA => X_MSG_DATA );
1086
1087 END SET_SESSION_PARAMETERS;
1088
1089 Procedure get_proj_task_from_lpn(
1090 p_organization_Id IN NUMBER,
1091 p_lpn_id IN NUMBER,
1092 x_project_id OUT NOCOPY NUMBER,
1093 x_task_id OUT NOCOPY NUMBER,
1094 x_return_status OUT NOCOPY VARCHAR2,
1095 x_msg_count OUT NOCOPY NUMBER,
1096 x_msg_data OUT NOCOPY VARCHAR2)
1097 IS
1098 l_project_id NUMBER := NULL;
1099 l_task_id NUMBER := NULL;
1100 BEGIN
1101 x_return_status := FND_API.G_RET_STS_SUCCESS;
1102
1103 SELECT mil.segment19, mil.segment20
1104 INTO l_project_id, l_task_id
1105 FROM mtl_item_locations mil, wms_license_plate_numbers wlpn
1106 WHERE wlpn.lpn_id = p_lpn_id
1107 AND wlpn.organization_id = p_organization_id
1108 AND wlpn.organization_id = mil.organization_id
1109 AND wlpn.locator_id = mil.inventory_location_id;
1110
1111 x_project_id := l_project_id;
1112 x_task_id := l_task_id;
1113
1114 EXCEPTION
1115 WHEN NO_DATA_FOUND THEN
1116 BEGIN
1117 select DISTINCT project_id, task_id
1118 INTO l_project_id, l_task_id
1119 FROM mtl_txn_request_lines
1120 WHERE organization_id = p_organization_id
1121 AND lpn_id = p_lpn_id;
1122
1123 x_project_id := l_project_id;
1124 x_task_id := l_task_id;
1125 EXCEPTION
1126 WHEN NO_DATA_FOUND THEN
1127 x_project_id := NULL;
1128 x_task_id := NULL;
1129 WHEN TOO_MANY_ROWS THEN
1130 x_project_id := NULL;
1131 x_task_id := NULL;
1132 WHEN OTHERS THEN
1133 x_project_id := NULL;
1134 x_task_id := NULL;
1135 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1136 FND_MSG_PUB.Count_And_Get
1137 (p_encoded => FND_API.G_FALSE,
1138 p_count => x_msg_count,
1139 p_data => x_msg_data);
1140 END;
1141
1142 WHEN FND_API.G_EXC_ERROR THEN
1143 x_project_id := NULL;
1144 x_task_id := NULL;
1145 x_return_status := FND_API.G_RET_STS_ERROR ;
1146 FND_MSG_PUB.Count_And_Get
1147 (p_encoded => FND_API.G_FALSE,
1148 p_count => x_msg_count,
1149 p_data => x_msg_data);
1150 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1151 x_project_id := NULL;
1152 x_task_id := NULL;
1153 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1154 FND_MSG_PUB.Count_And_Get
1155 (p_encoded => FND_API.G_FALSE,
1156 p_count => x_msg_count,
1157 p_data => x_msg_data);
1158 WHEN OTHERS THEN
1159 x_project_id := NULL;
1160 x_task_id := NULL;
1161 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1162 FND_MSG_PUB.Count_And_Get
1163 (p_encoded => FND_API.G_FALSE,
1164 p_count => x_msg_count,
1165 p_data => x_msg_data);
1166 END get_proj_task_from_lpn;
1167
1168
1169
1170 Function Is_Project_Enabled(
1171 p_org_id IN NUMBER
1172 ) return varchar2
1173 IS
1174
1175 l_project_reference_enabled number;
1176 success varchar2(6);
1177
1178 BEGIN
1179 success := 'TRUE';
1180 SELECT NVL(project_reference_enabled,2)
1181 INTO l_project_reference_enabled
1182 FROM mtl_parameters
1183 WHERE organization_id = p_org_id ;
1184
1185 IF l_project_reference_enabled <> 1 THEN
1186 success := 'FALSE';
1187 END IF;
1188
1189 RETURN success;
1190
1191 EXCEPTION
1192 WHEN OTHERS then
1193 success := 'FALSE' ;
1194 RETURN success;
1195
1196 END Is_Project_Enabled ;
1197
1198 -- Procedure to clear global variables for locator, project and task
1199 PROCEDURE CLEAR_GLOBAL_VARS IS
1200 BEGIN
1201 G_PHYSICAL_LOCATOR := NULL;
1202 G_PROJECT_NUMBER := NULL;
1203 G_PROJECT_ID := NULL;
1204 G_TASK_NUMBER := NULL;
1205 G_TASK_ID := NULL;
1206 END CLEAR_GLOBAL_VARS;
1207
1208 /* Procedure to obtain the Locator Metadata.
1209 * Processing Logic: Get all the segments (except 19 and 20) and
1210 * their corresponding validation types. If the validation type
1211 * of all the esgments is 'N' then form a string comprising
1212 * concatenated segments with the delimiter
1213 * (eg. SEGMENT1||'.'||SEGMENT2||'.'||SEGMENT3
1214 * If any of the segments has a validation type other than N'
1215 * form the display string as ALL\index of SEGMENT19\index of SEGMENT20
1216 */
1217 PROCEDURE GET_LOCATOR_METADATA(
1218 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
1219 X_MSG_COUNT OUT NOCOPY NUMBER,
1220 X_MSG_DATA OUT NOCOPY VARCHAR2,
1221 X_DISPLAY OUT NOCOPY VARCHAR2,
1222 X_CONCATENATED OUT NOCOPY VARCHAR2,
1223 X_PROJECT_COLUMN OUT NOCOPY NUMBER,
1224 X_TASK_COLUMN OUT NOCOPY NUMBER
1225 ) IS
1226
1227 CURSOR CUR_SEG IS
1228 SELECT APPLICATION_COLUMN_NAME,
1229 ffs.FLEX_VALUE_SET_ID,
1230 ffv.VALIDATION_TYPE
1231 FROM FND_ID_FLEX_SEGMENTS ffs,
1232 FND_FLEX_VALUE_SETS ffv
1233 WHERE APPLICATION_ID = 401 -- 'INV'
1234 AND ID_FLEX_CODE = 'MTLL'
1235 AND ID_FLEX_NUM = 101 -- 'STOCK_LOCATORS'
1236 AND ENABLED_FLAG = 'Y'
1237 AND DISPLAY_FLAG = 'Y'
1238 AND ffv.FLEX_VALUE_SET_ID(+) = ffs.FLEX_VALUE_SET_ID
1239 ORDER BY SEGMENT_NUM;
1240
1241 L_RETURN VARCHAR2(90);
1242 L_ROWNUM NUMBER := 0;
1243 L_COLNAME VARCHAR2(15);
1244 L_VALUE_SET_ID NUMBER;
1245 L_VALIDATION_TYPE VARCHAR2(1);
1246 L_CONCAT VARCHAR2(1000);
1247 L_DELIM VARCHAR2(1);
1248 L_FIRST_TIME BOOLEAN := TRUE;
1249
1250 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
1251 BEGIN
1252
1253 OPEN CUR_SEG;
1254 LOOP
1255 FETCH CUR_SEG INTO L_COLNAME, L_VALUE_SET_ID, L_VALIDATION_TYPE;
1256 EXIT WHEN CUR_SEG%NOTFOUND;
1257 L_ROWNUM := L_ROWNUM + 1;
1258 IF (L_COLNAME = 'SEGMENT19') OR (L_COLNAME = 'SEGMENT20') THEN
1259 L_RETURN := L_RETURN ||'\0'||TO_CHAR(L_ROWNUM);
1260 IF (L_COLNAME = 'SEGMENT19') THEN
1261 X_PROJECT_COLUMN := L_ROWNUM;
1262 ELSE
1263 X_TASK_COLUMN := L_ROWNUM;
1264 END IF;
1265 ELSE
1266 --Get the delimter if it is the first non-project and non-task segment
1267 IF (L_FIRST_TIME) THEN
1268 IF (L_VALIDATION_TYPE = 'N') OR (L_VALIDATION_TYPE IS NULL) THEN
1269
1270 SELECT CONCATENATED_SEGMENT_DELIMITER
1271 INTO L_DELIM
1272 FROM FND_ID_FLEX_STRUCTURES
1273 WHERE ID_FLEX_CODE = 'MTLL' AND ROWNUM =1;
1274
1275 L_CONCAT := L_COLNAME;
1276 ELSE
1277 L_CONCAT := NULL;
1278 END IF;
1279 L_FIRST_TIME := FALSE;
1280 --From the 2nd segement onwards, check if l_concat is not null and the validation
1281 --type for the current segment is 'N' or there is none. If so then append the
1282 --delimiter and segment name to the concatenated segments string
1283 ELSE
1284 IF (L_VALIDATION_TYPE = 'N' OR L_VALIDATION_TYPE IS NULL)
1285 AND (L_CONCAT IS NOT NULL) THEN
1286 L_CONCAT := L_CONCAT || '||' || '''' || L_DELIM || '''' || '||' || L_COLNAME;
1287 ELSE
1288 L_CONCAT := NULL;
1289 END IF; --END IF l_validation_type IS N
1290 END IF; --END IF L_FIRST_TIME
1291 END IF; --END IF COL_NAME is SEGMENT19 or SEGMENT20
1292 END LOOP;
1293 CLOSE CUR_SEG;
1294
1295 X_DISPLAY := 'ALL'||L_RETURN;
1296 X_CONCATENATED := L_CONCAT;
1297
1298 FND_MSG_PUB.COUNT_AND_GET( P_COUNT => X_MSG_COUNT, P_DATA => X_MSG_DATA );
1299 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
1300
1301 EXCEPTION
1302 WHEN OTHERS THEN
1303
1304 IF (l_debug = 1) THEN
1305 MYDEBUG('EXCEPTION RAISED IN GET_LOCATOR_METADATA '||SQLERRM);
1306 END IF;
1307
1308 X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR;
1309 IF FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1310 FND_MSG_PUB.ADD_EXC_MSG( g_pkg_name, 'GET_LOCATOR_METADATA');
1311 END IF;
1312 FND_MSG_PUB.COUNT_AND_GET( P_COUNT => X_MSG_COUNT, P_DATA => X_MSG_DATA );
1313
1314 END GET_LOCATOR_METADATA;
1315
1316 /* Function to get the position of PROJECT column (SEGMENT19) */
1317 FUNCTION GET_PROJECT_COLUMN RETURN VARCHAR2 IS
1318 X_RETURN_STATUS VARCHAR2(1);
1319 X_MSG_DATA VARCHAR2(1000);
1320 X_MSG_COUNT NUMBER;
1321 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
1322 BEGIN
1323 IF (l_debug = 1) THEN
1324 MYDEBUG('GET_PROJECT_COLUMN: G_DISPLAYED_SEGMENTS: '||G_DISPLAYED_SEGMENTS);
1325 END IF;
1326 IF G_DISPLAYED_SEGMENTS IS NULL THEN
1327 GET_LOCATOR_METADATA( X_RETURN_STATUS => X_RETURN_STATUS,
1328 X_MSG_COUNT => X_MSG_COUNT,
1329 X_MSG_DATA => X_MSG_DATA,
1330 X_DISPLAY => G_DISPLAYED_SEGMENTS,
1331 X_CONCATENATED => G_CONCATENATED_SEGMENTS,
1332 X_PROJECT_COLUMN => G_PROJECT_COLUMN,
1333 X_TASK_COLUMN => G_TASK_COLUMN);
1334
1335 IF (l_debug = 1) THEN
1336 MYDEBUG('GET_PROJECT_COLUMN: GET_LOCATOR_METADATA: '||X_RETURN_STATUS);
1337 END IF;
1338 END IF;
1339 IF (l_debug = 1) THEN
1340 MYDEBUG('GET_PROJECT_COLUMN: RETURNS: '||G_PROJECT_COLUMN);
1341 END IF;
1342 RETURN G_PROJECT_COLUMN;
1343 END;
1344
1345 /* Function to get the position of TASK column (SEGMENT20) */
1346 FUNCTION GET_TASK_COLUMN RETURN VARCHAR2 IS
1347 X_RETURN_STATUS VARCHAR2(1);
1348 X_MSG_DATA VARCHAR2(1000);
1349 X_MSG_COUNT NUMBER;
1350 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
1351 BEGIN
1352 IF (l_debug = 1) THEN
1353 MYDEBUG('GET_TASK_COLUMN: G_DISPLAYED_SEGMENTS: '||G_DISPLAYED_SEGMENTS);
1354 END IF;
1355 IF G_DISPLAYED_SEGMENTS IS NULL THEN
1356 GET_LOCATOR_METADATA( X_RETURN_STATUS => X_RETURN_STATUS,
1357 X_MSG_COUNT => X_MSG_COUNT,
1358 X_MSG_DATA => X_MSG_DATA,
1359 X_DISPLAY => G_DISPLAYED_SEGMENTS,
1360 X_CONCATENATED => G_CONCATENATED_SEGMENTS,
1361 X_PROJECT_COLUMN => G_PROJECT_COLUMN,
1362 X_TASK_COLUMN => G_TASK_COLUMN);
1363 IF (l_debug = 1) THEN
1364 MYDEBUG('GET_TASK_COLUMN: GET_LOCATOR_METADATA: '||X_RETURN_STATUS);
1365 END IF;
1366 END IF;
1367 IF (l_debug = 1) THEN
1368 MYDEBUG('GET_TASK_COLUMN: RETURNS: '||G_TASK_COLUMN);
1369 END IF;
1370 RETURN G_TASK_COLUMN;
1371 END;
1372
1373 /* Function to fetch Physical Locator segments, project and task given locator and org
1374 * Processing Logic: Check if G_CONCATENATED_SEGMENTS is populated.
1375 * If yes then
1376 * Query MTL_ITEM_LOCATIONS to fetch concatenated physical locator segments, project Id
1377 * and Task Id for the passed locator Id/Org Id. Call get_project_number and get_task_number
1378 * to get Project Number and Task Number.
1379 * else
1380 * Use FND_FLEX_KEYVAL to fetch the Concatenated segment values, Project Id, Task Id,
1381 * Project Number and Task Number for the passed LocatorId/OrgId combination.
1382 * FND_FLEX_KEYVAL.CONCATENATED_SEGMENTS -- Concatenated display values
1383 * FND_FLEX_KEYVAL.SEGMENT_VALUES -- Table of Segment Values
1384 * The fetched values are stored in Package variables,
1385 */
1386 PROCEDURE FETCH_COMBINATION(P_LOCATOR_ID IN NUMBER,
1387 P_ORG_ID IN NUMBER) IS
1388 L_CC_ID_RET BOOLEAN;
1389 TYPE CUR_LOC IS REF CURSOR;
1390 c_locator CUR_LOC;
1391 l_loc_str VARCHAR2(1000);
1392 l_physical_locator VARCHAR2(1000);
1393 l_project_id NUMBER;
1394 l_task_id NUMBER;
1395 X_RETURN_STATUS VARCHAR2(1);
1396 X_MSG_DATA VARCHAR2(1000);
1397 X_MSG_COUNT NUMBER;
1398
1399 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
1400 BEGIN
1401 IF (l_debug = 1) THEN
1402 MYDEBUG('FETCH_COMBINATION: P_LOCATOR_ID: P_ORG_ID: '||P_LOCATOR_ID||' : '||P_ORG_ID);
1403 END IF;
1404
1405 IF G_DISPLAYED_SEGMENTS IS NULL THEN
1406 GET_LOCATOR_METADATA( X_RETURN_STATUS => X_RETURN_STATUS,
1407 X_MSG_COUNT => X_MSG_COUNT,
1408 X_MSG_DATA => X_MSG_DATA,
1409 X_DISPLAY => G_DISPLAYED_SEGMENTS,
1410 X_CONCATENATED => G_CONCATENATED_SEGMENTS,
1411 X_PROJECT_COLUMN => G_PROJECT_COLUMN,
1412 X_TASK_COLUMN => G_TASK_COLUMN);
1413 IF (l_debug = 1) THEN
1414 MYDEBUG('FETCH_COMBINATION: GET_LOCATOR_METADATA: '||X_RETURN_STATUS);
1415 END IF;
1416 END IF;
1417
1418 IF G_CONCATENATED_SEGMENTS IS NOT NULL THEN
1419
1420 IF (l_debug = 1) THEN
1421 MYDEBUG('Using MTL_ITEM_LOCATIONS to get locator, project and task info');
1422 END IF;
1423 --Build the string to fetch locator id, project Id and
1424 --task Id from MTL_ITEM_LOCATIONS
1425 l_loc_str := 'SELECT ' || G_CONCATENATED_SEGMENTS || ', ';
1426 l_loc_str := l_loc_str || 'PROJECT_ID, TASK_ID FROM MTL_ITEM_LOCATIONS ';
1427 l_loc_str := l_loc_str || 'WHERE INVENTORY_LOCATION_ID = :1 AND ORGANIZATION_ID = :2';
1428
1429 IF (l_debug = 1) THEN
1430 MYDEBUG('l_loc_str:' || l_loc_str);
1431 END IF;
1432
1433 --Open the cursor and store the results in session variables
1434 OPEN c_locator FOR l_loc_str USING P_LOCATOR_ID, P_ORG_ID;
1435 FETCH c_locator INTO l_physical_locator, l_project_id, l_task_id;
1436
1437 IF l_physical_locator IS NOT NULL THEN
1438 G_PHYSICAL_LOCATOR := l_physical_locator;
1439 ELSE
1440 G_PHYSICAL_LOCATOR := NULL;
1441 END IF;
1442
1443 IF l_project_id IS NOT NULL THEN
1444 G_PROJECT_NUMBER := GET_PROJECT_NUMBER(l_project_id);
1445 G_PROJECT_ID := l_project_id;
1446 ELSE
1447 G_PROJECT_NUMBER := NULL;
1448 G_PROJECT_ID := NULL;
1449 END IF;
1450
1451 IF l_task_id IS NOT NULL THEN
1452 G_TASK_NUMBER := GET_TASK_NUMBER(l_task_id);
1453 G_TASK_ID := l_task_id;
1454 ELSE
1455 G_TASK_NUMBER := NULL;
1456 G_TASK_ID := NULL;
1457 END IF;
1458 CLOSE c_locator;
1459
1460 --If any of the segments has a validation type other than 'N'
1461 ELSE
1462 IF (l_debug = 1) THEN
1463 MYDEBUG('Using FND APIs to get locator, project and task info');
1464 END IF;
1465 L_CC_ID_RET := FND_FLEX_KEYVAL.VALIDATE_CCID(
1466 APPL_SHORT_NAME => 'INV',
1467 KEY_FLEX_CODE => 'MTLL',
1468 STRUCTURE_NUMBER => 101,
1469 COMBINATION_ID => P_LOCATOR_ID,
1470 DISPLAYABLE => G_DISPLAYED_SEGMENTS,
1471 DATA_SET => P_ORG_ID,
1472 VRULE => NULL,
1473 SECURITY => 'IGNORE',
1474 GET_COLUMNS => NULL,
1475 RESP_APPL_ID => 401,
1476 RESP_ID => NULL,
1477 USER_ID => NULL,
1478 SELECT_COMB_FROM_VIEW => NULL
1479 );
1480 IF NOT L_CC_ID_RET THEN
1481 IF (l_debug = 1) THEN
1482 MYDEBUG('FETCH_COMBINATION: VALIDATE_CCID: CALL FAILED');
1483 MYDEBUG('FETCH_COMBINATION: VALIDATE_CCID: '||FND_FLEX_KEYVAL.ERROR_MESSAGE);
1484 END IF;
1485 CLEAR_GLOBAL_VARS;
1486 ELSE
1487 G_PHYSICAL_LOCATOR := FND_FLEX_KEYVAL.CONCATENATED_VALUES;
1488 G_PROJECT_NUMBER := FND_FLEX_KEYVAL.SEGMENT_VALUE(GET_PROJECT_COLUMN);
1489 G_PROJECT_ID := FND_FLEX_KEYVAL.SEGMENT_ID(GET_PROJECT_COLUMN);
1490 G_TASK_NUMBER := FND_FLEX_KEYVAL.SEGMENT_VALUE(GET_TASK_COLUMN);
1491 G_TASK_ID := FND_FLEX_KEYVAL.SEGMENT_ID(GET_TASK_COLUMN);
1492 END IF;
1493
1494 END IF; --END If g_concated_segments IS NOT NULL
1495
1496 IF (l_debug = 1) THEN
1497 MYDEBUG('LOC SEGS: ' || G_PHYSICAL_LOCATOR);
1498 MYDEBUG('G_PROJECT_NUMBER: ' || G_PROJECT_NUMBER);
1499 MYDEBUG('G_PROJECT_ID: ' || G_PROJECT_ID);
1500 MYDEBUG('G_TASK_NUMBER: ' || G_TASK_NUMBER);
1501 MYDEBUG('G_TASK_ID: ' || G_TASK_ID);
1502 END IF;
1503
1504 EXCEPTION
1505 WHEN OTHERS THEN
1506 IF (l_debug = 1) THEN
1507 MYDEBUG('FETCH_COMBINATION: RAISED EXCEPTION: '||SQLERRM);
1508 END IF;
1509 END FETCH_COMBINATION;
1510
1511 /* Function to get the concatenated Locator Segments (except project and task)
1512 * given Locator Id and Organization Id
1513 */
1514 FUNCTION GET_LOCSEGS(P_LOCATOR_ID IN NUMBER,
1515 P_ORG_ID IN NUMBER) RETURN VARCHAR2 IS
1516 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
1517 BEGIN
1518
1519 IF (l_debug = 1) THEN
1520 MYDEBUG('GET_LOCSEGS: P_LOCATOR_ID: P_ORG_ID: '||P_LOCATOR_ID||':'||P_ORG_ID);
1521 END IF;
1522
1523 /* If locator Id passed is not null then fetch the locator, project and
1524 * and task values. Else clear the session variables
1525 */
1526 IF P_LOCATOR_ID IS NOT NULL THEN
1527 FETCH_COMBINATION(P_LOCATOR_ID => P_LOCATOR_ID,
1528 P_ORG_ID => P_ORG_ID);
1529 ELSE
1530 IF (l_debug = 1) THEN
1531 mydebug('loc id is null');
1532 END IF;
1533 CLEAR_GLOBAL_VARS;
1534 END IF;
1535
1536 RETURN G_PHYSICAL_LOCATOR;
1537 END GET_LOCSEGS;
1538
1539 /*
1540 * This function returns the Project Number of the Project Id passed
1541 * Does not use FND API's.
1542 */
1543 FUNCTION GET_PROJECT_NUMBER(p_project_id IN NUMBER) RETURN VARCHAR2 IS
1544 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
1545 BEGIN
1546
1547 /* The below code is commented because it uses pjm_projects_mtll_v
1548 which requrires mfg_organization_id profile value needs to be set
1549 whereas inv_projectlocator_pu.get_project_number do not require */
1550
1551 -- If this code is ever uncommneted then the profile mfg_organization_id
1552 -- needs to be set by the calling object otherwise PJM_PROJECTS_MTLL_V
1553 -- will not return a value. Bug 4662395
1554
1555 /*SELECT PROJECT_NUMBER
1556 INTO L_PROJECT_NUMBER
1557 FROM PJM_PROJECTS_MTLL_V
1558 WHERE PROJECT_ID = P_PROJECT_ID;
1559
1560 IF (l_debug = 1) THEN
1561 MYDEBUG('GET_PROJECT_NUMBER: RETURNS '||L_PROJECT_NUMBER);
1562 END IF;
1563 RETURN L_PROJECT_NUMBER;*/
1564 return INV_ProjectLocator_PUB.GET_PROJECT_NUMBER(p_project_id);
1565
1566 END GET_PROJECT_NUMBER;
1567
1568 FUNCTION GET_TASK_NUMBER(P_TASK_ID IN NUMBER) RETURN VARCHAR2 IS
1569 L_TASK_NUMBER VARCHAR2(100);
1570 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
1571 BEGIN
1572
1573 /* SELECT TASK_NUMBER
1574 INTO L_TASK_NUMBER
1575 FROM PJM_TASKS_MTLL_V
1576 WHERE TASK_ID = P_TASK_ID;
1577
1578 IF (l_debug = 1) THEN
1579 MYDEBUG('GET_TASK_NUMBER: RETURNS '||L_TASK_NUMBER);
1580 END IF;
1581 RETURN L_TASK_NUMBER;*/
1582 return INV_ProjectLocator_PUB.GET_TASK_NUMBER(P_TASK_ID);
1583
1584 EXCEPTION
1585 WHEN OTHERS THEN
1586 IF (l_debug = 1) THEN
1587 MYDEBUG('GET_TASK_NUMBER: EXCEPTION '||SQLERRM);
1588 END IF;
1589 L_TASK_NUMBER := NULL;
1590 RETURN L_TASK_NUMBER;
1591 END GET_TASK_NUMBER;
1592
1593
1594 /*
1595 * These function are used to get the Project/Task Number of the Last Accessed
1596 * combination. They are for use in select statements e.g.
1597 * SELECT ..
1598 * ..
1599 * INV_PROJECT.GET_LOCSEGS(LOCATOR_ID,ORG_ID)
1600 * INV_PROJECT.GET_PROJECT_ID,
1601 * INV_PROJECT.GET_PROJECT_NUMBER,
1602 * INV_PROJECT.GET_TASK_ID,
1603 * INV_PROJECT.GET_TASK_NUMBER,
1604 * ..
1605 * FROM WMS_LICENSE_PLATE_NUMBERS
1606 *
1607 */
1608 FUNCTION GET_PROJECT_NUMBER RETURN VARCHAR2 IS
1609 BEGIN
1610 RETURN G_PROJECT_NUMBER;
1611 END GET_PROJECT_NUMBER;
1612
1613 FUNCTION GET_PROJECT_ID RETURN VARCHAR2 IS
1614 BEGIN
1615 RETURN G_PROJECT_ID;
1616 END GET_PROJECT_ID;
1617
1618 FUNCTION GET_TASK_NUMBER RETURN VARCHAR2 IS
1619 BEGIN
1620 RETURN G_TASK_NUMBER;
1621 END GET_TASK_NUMBER;
1622
1623 FUNCTION GET_TASK_ID RETURN VARCHAR2 IS
1624 BEGIN
1625 RETURN G_TASK_ID;
1626 END GET_TASK_ID;
1627
1628 /*
1629 * Procedure to obtain the Locator Metadata.
1630 * Processing Logic: Get all the segments and
1631 * their corresponding validation types. If the validation type
1632 * of all the esgments is 'N' then form a string comprising
1633 * concatenated segments with the delimiter
1634 * (eg. SEGMENT1||'.'||SEGMENT2||'.'||SEGMENT3
1635 */
1636 PROCEDURE CONC_LOC_QRY(
1637 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
1638 X_MSG_COUNT OUT NOCOPY NUMBER,
1639 X_MSG_DATA OUT NOCOPY VARCHAR2,
1640 X_CONCATENATED OUT NOCOPY VARCHAR2
1641 ) IS
1642
1643 CURSOR CUR_SEG IS
1644 SELECT APPLICATION_COLUMN_NAME,
1645 ffs.FLEX_VALUE_SET_ID,
1646 ffv.VALIDATION_TYPE
1647 FROM FND_ID_FLEX_SEGMENTS ffs,
1648 FND_FLEX_VALUE_SETS ffv
1649 WHERE APPLICATION_ID = 401 -- 'INV'
1650 AND ID_FLEX_CODE = 'MTLL'
1651 AND ID_FLEX_NUM = 101 -- 'STOCK_LOCATORS'
1652 AND ENABLED_FLAG = 'Y'
1653 AND DISPLAY_FLAG = 'Y'
1654 AND ffv.FLEX_VALUE_SET_ID(+) = ffs.FLEX_VALUE_SET_ID
1655 ORDER BY SEGMENT_NUM;
1656
1657 L_RETURN VARCHAR2(90);
1658 L_ROWNUM NUMBER := 0;
1659 L_COLNAME VARCHAR2(15);
1660 L_VALUE_SET_ID NUMBER;
1661 L_VALIDATION_TYPE VARCHAR2(1);
1662 L_CONCAT VARCHAR2(1000);
1663 L_DELIM VARCHAR2(1);
1664 L_FIRST_TIME BOOLEAN := TRUE;
1665 L_BSLASH_DELIM VARCHAR2(2); -- For Bug# 7623167
1666
1667 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
1668 BEGIN
1669
1670
1671 SELECT CONCATENATED_SEGMENT_DELIMITER
1672 INTO L_DELIM
1673 FROM FND_ID_FLEX_STRUCTURES
1674 WHERE ID_FLEX_CODE = 'MTLL' AND ROWNUM =1;
1675
1676 L_BSLASH_DELIM := '\' || L_DELIM; -- For Bug# 7623167
1677
1678 OPEN CUR_SEG;
1679 LOOP
1680 FETCH CUR_SEG INTO L_COLNAME, L_VALUE_SET_ID, L_VALIDATION_TYPE;
1681 EXIT WHEN CUR_SEG%NOTFOUND;
1682 L_ROWNUM := L_ROWNUM + 1;
1683 IF (L_FIRST_TIME) THEN
1684
1685
1686 /* Bug# 7623167: Added the replace fucntion to individual segments for getting the correct concatenated segments
1687 as if a segment is having the occurrence of the seperator then it should be prefixed by a backslash */
1688 IF (L_COLNAME = 'SEGMENT19') THEN
1689 --Commented For Bug# 7623167 and replaced below: L_CONCAT := 'inv_project.GET_PROJECT_NUMBER('||L_COLNAME||')'; --Changed for bug 3073756
1690 L_CONCAT := 'REPLACE(inv_project.GET_PROJECT_NUMBER('||L_COLNAME|| '),''' || L_DELIM || ''',''' || L_BSLASH_DELIM || ''')';
1691 ELSIF(L_COLNAME = 'SEGMENT20') THEN
1692 --Commented For Bug# 7623167 and replaced below: L_CONCAT := 'inv_project.GET_TASK_NUMBER('||L_COLNAME||')'; --Changed for bug 3073756
1693 L_CONCAT := 'REPLACE(inv_project.GET_TASK_NUMBER('||L_COLNAME|| '),''' || L_DELIM || ''',''' || L_BSLASH_DELIM || ''')';
1694 ELSIF (L_VALIDATION_TYPE = 'N' OR L_VALIDATION_TYPE IS NULL) THEN
1695 --Commented For Bug# 7623167 and replaced below: L_CONCAT := L_COLNAME;
1696 L_CONCAT := 'REPLACE('||L_COLNAME||',''' || L_DELIM || ''',''' || L_BSLASH_DELIM || ''')';
1697 ELSE
1698 L_CONCAT := NULL;
1699 END IF;
1700
1701
1702
1703 L_FIRST_TIME := FALSE;
1704 --From the 2nd segement onwards, check if l_concat is not null and the validation
1705 --type for the current segment is 'N' or there is none. If so then append the
1706 --delimiter and segment name to the concatenated segments string
1707 ELSE
1708 IF (L_CONCAT IS NULL) THEN
1709 L_CONCAT := NULL;
1710 ELSIF (L_COLNAME = 'SEGMENT19') THEN
1711 --Commented For Bug# 7623167 and replaced below: L_CONCAT := L_CONCAT || '||' || '''' || L_DELIM || '''' || '||' || 'inv_project.GET_PROJECT_NUMBER('||L_COLNAME||')';
1712 L_CONCAT := L_CONCAT || '||' || '''' || L_DELIM || '''' || '||' || 'REPLACE(inv_project.GET_PROJECT_NUMBER('||L_COLNAME|| '),''' || L_DELIM || ''',''' || L_BSLASH_DELIM || ''')';
1713 ELSIF(L_COLNAME = 'SEGMENT20') THEN
1714 --Commented For Bug# 7623167 and replaced below: L_CONCAT := L_CONCAT || '||' || '''' || L_DELIM || '''' || '||' || 'inv_project.GET_TASK_NUMBER('||L_COLNAME||')';
1715 L_CONCAT := L_CONCAT || '||' || '''' || L_DELIM || '''' || '||' || 'REPLACE(inv_project.GET_TASK_NUMBER('||L_COLNAME|| '),''' || L_DELIM || ''',''' || L_BSLASH_DELIM || ''')';
1716 ELSIF (L_VALIDATION_TYPE = 'N' OR L_VALIDATION_TYPE IS NULL) AND L_CONCAT IS NOT NULL THEN
1717 --Commented For Bug# 7623167 and replaced below: L_CONCAT := L_CONCAT || '||' || '''' || L_DELIM || '''' || '||' || L_COLNAME;
1718 L_CONCAT := L_CONCAT || '||' || '''' || L_DELIM || '''' || '||' || 'REPLACE('||L_COLNAME||',''' || L_DELIM || ''',''' || L_BSLASH_DELIM || ''')';
1719
1720 ELSE
1721 L_CONCAT := NULL;
1722 END IF;
1723 IF (l_debug = 1) THEN
1724 MYDEBUG('L_concat'||L_concat);
1725 END IF;
1726
1727 END IF; --END IF L_FIRST_TIME
1728
1729 END LOOP;
1730 CLOSE CUR_SEG;
1731
1732 IF (l_debug = 1) THEN
1733 MYDEBUG('L_OCNAT ' || L_CONCAT);
1734 END IF;
1735 X_CONCATENATED := L_CONCAT;
1736
1737
1738 FND_MSG_PUB.COUNT_AND_GET( P_COUNT => X_MSG_COUNT, P_DATA => X_MSG_DATA );
1739 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
1740
1741 EXCEPTION
1742 WHEN OTHERS THEN
1743
1744 IF (l_debug = 1) THEN
1745 MYDEBUG('EXCEPTION RAISED IN conc_loc_qry '||SQLERRM);
1746 END IF;
1747 X_CONCATENATED := null;
1748
1749 X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR;
1750 IF FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1751 FND_MSG_PUB.ADD_EXC_MSG( g_pkg_name, 'conc_loc_qry');
1752 END IF;
1753 FND_MSG_PUB.COUNT_AND_GET( P_COUNT => X_MSG_COUNT, P_DATA => X_MSG_DATA );
1754
1755 END CONC_LOC_QRY;
1756
1757
1758 /*
1759 * Get the concatenated and resolved locator
1760 * currently used by material workbench
1761 */
1762
1763
1764 FUNCTION GET_LOCATOR(P_LOCATOR_ID IN NUMBER,
1765 P_ORG_ID IN NUMBER) RETURN VARCHAR2 IS
1766 L_CC_ID_RET BOOLEAN;
1767 TYPE CUR_LOC IS REF CURSOR;
1768 c_locator CUR_LOC;
1769 l_loc_str VARCHAR2(1000);
1770 X_RETURN_STATUS VARCHAR2(1);
1771 X_MSG_DATA VARCHAR2(1000);
1772 X_MSG_COUNT NUMBER;
1773 L_CONCATED_LOCATOR VARCHAR2(400);
1774
1775 l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
1776 BEGIN
1777
1778 IF (l_debug = 1) THEN
1779 MYDEBUG('GET_LOCATOR: P_LOCATOR_ID: P_ORG_ID: '||P_LOCATOR_ID||' : '||P_ORG_ID);
1780 END IF;
1781 /* bug 8680793 */
1782 IF (NVL(P_LOCATOR_ID,0) <= 0) THEN
1783 IF (l_debug = 1) THEN
1784 MYDEBUG('Returning NULL as its not locator controlled');
1785 END IF;
1786 RETURN NULL;
1787 END IF;
1788
1789 IF (G_LOC_QRY_BLT <> 'Y') THEN
1790 G_LOC_QRY_BLT := 'Y';
1791 CONC_LOC_QRY(
1792 X_RETURN_STATUS => X_RETURN_STATUS,
1793 X_MSG_COUNT => X_MSG_COUNT,
1794 X_MSG_DATA => X_MSG_DATA,
1795 X_CONCATENATED => G_LOC_CONC_QRY
1796 );
1797 IF (l_debug = 1) THEN
1798 MYDEBUG('GET_LOCATOR: GET_LOCATOR_METADATA: '||X_RETURN_STATUS);
1799 END IF;
1800 END IF;
1801
1802 IF G_LOC_CONC_QRY IS NOT NULL THEN
1803
1804 IF (l_debug = 1) THEN
1805 MYDEBUG('Using MTL_ITEM_LOCATIONS to get locator, project and task info');
1806 END IF;
1807 --Build the string to fetch locator from MTL_ITEM_LOCATIONS
1808 l_loc_str := 'SELECT ' || G_LOC_CONC_QRY ;
1809 l_loc_str := l_loc_str || ' FROM MTL_ITEM_LOCATIONS ';
1810 l_loc_str := l_loc_str || ' WHERE INVENTORY_LOCATION_ID = :1 AND ORGANIZATION_ID = :2';
1811
1812 IF (l_debug = 1) THEN
1813 MYDEBUG('l_loc_str:' || l_loc_str);
1814 END IF;
1815
1816 --Open the cursor and store the results in session variables
1817 OPEN c_locator FOR l_loc_str USING P_LOCATOR_ID, P_ORG_ID;
1818 FETCH c_locator INTO l_concated_locator;
1819 CLOSE c_locator;
1820 G_CONCATENATED_LOCATOR := l_concated_locator;
1821
1822 --If any of the segments has a validation type other than 'N'
1823 ELSE
1824 IF (l_debug = 1) THEN
1825 MYDEBUG('Using FND APIs to get locator, project and task info');
1826 END IF;
1827 L_CC_ID_RET := FND_FLEX_KEYVAL.VALIDATE_CCID(
1828 APPL_SHORT_NAME => 'INV',
1829 KEY_FLEX_CODE => 'MTLL',
1830 STRUCTURE_NUMBER => 101,
1831 COMBINATION_ID => P_LOCATOR_ID,
1832 DISPLAYABLE => 'ALL',
1833 DATA_SET => P_ORG_ID,
1834 VRULE => NULL,
1835 SECURITY => 'IGNORE',
1836 GET_COLUMNS => NULL,
1837 RESP_APPL_ID => 401,
1838 RESP_ID => NULL,
1839 USER_ID => NULL,
1840 SELECT_COMB_FROM_VIEW => NULL
1841 );
1842 IF NOT L_CC_ID_RET THEN
1843 IF (l_debug = 1) THEN
1844 MYDEBUG('GET_LOCATOR: VALIDATE_CCID: CALL FAILED');
1845 MYDEBUG('GET_LOCATOR: VALIDATE_CCID: '||FND_FLEX_KEYVAL.ERROR_MESSAGE);
1846 END IF;
1847 ELSE
1848 G_CONCATENATED_LOCATOR := FND_FLEX_KEYVAL.CONCATENATED_VALUES;
1849 END IF;
1850
1851 END IF; --END If g_concated_segments IS NOT NULL
1852 IF (l_debug = 1) THEN
1853 MYDEBUG('LOCATOR: ' || G_CONCATENATED_LOCATOR);
1854 END IF;
1855 return G_CONCATENATED_LOCATOR;
1856
1857 EXCEPTION
1858 WHEN OTHERS THEN
1859 IF (l_debug = 1) THEN
1860 MYDEBUG('GET_LOCATOR: RAISED EXCEPTION: '||SQLERRM);
1861 END IF;
1862 RETURN NULL; --Added for bug 3073756
1863 END GET_LOCATOR;
1864
1865 /*Added overloaded function for performance enhancements...*/
1866 FUNCTION GET_LOCSEGS(p_concatenated_segments IN VARCHAR2)
1867 RETURN VARCHAR2 IS
1868 CURSOR cur_seg IS
1869 SELECT application_column_name
1870 FROM fnd_id_flex_segments ffs
1871 WHERE application_id = 401 -- 'INV'
1872 AND id_flex_code = 'MTLL'
1873 AND id_flex_num = 101 -- 'STOCK_LOCATORS'
1874 AND enabled_flag = 'Y'
1875 AND display_flag = 'Y'
1876 ORDER BY segment_num;
1877
1878 CURSOR c_delim IS
1879 SELECT concatenated_segment_delimiter
1880 FROM fnd_id_flex_structures
1881 WHERE id_flex_code = 'MTLL'
1882 AND ROWNUM = 1;
1883
1884 l_row_num NUMBER := 1;
1885 l_buf VARCHAR2(491);--BUG3306367
1886 l_new_segments VARCHAR2(491) := '';--BUG3306367
1887 i BINARY_INTEGER := 1;
1888 j BINARY_INTEGER := 1;
1889 k BINARY_INTEGER := 1;
1890 l_col_index BINARY_INTEGER := 1;
1891 BEGIN
1892 IF g_delimiter IS NULL THEN
1893 g_project_index := 0;
1894 g_task_index := 0;
1895 OPEN c_delim;
1896 FETCH c_delim INTO g_delimiter;
1897 CLOSE c_delim;
1898
1899 FOR rec1 IN cur_seg LOOP
1900 IF rec1.application_column_name = 'SEGMENT19' THEN
1901 g_project_index := l_row_num;
1902 END IF;
1903
1904 IF rec1.application_column_name = 'SEGMENT20' THEN
1905 g_task_index := l_row_num;
1906 END IF;
1907
1908 l_row_num := l_row_num + 1;
1909 END LOOP;
1910 END IF;
1911
1912 IF g_project_index = 0 THEN
1913 RETURN p_concatenated_segments;
1914 END IF;
1915
1916 LOOP
1917 <<skip_segment>>
1918 j := INSTR(p_concatenated_segments, g_delimiter, 1, i);
1919
1920 /*
1921 * j is initialized to 1, j is 0 only when the last
1922 * instance of the delimitor is already found.
1923 * In such a case fetch the rest of the string rather than
1924 * a substr..
1925 */
1926 IF j = 0 THEN
1927 l_buf := SUBSTR(p_concatenated_segments, k);
1928 ELSE
1929 IF SUBSTR(p_concatenated_segments, j - 1, 1) = '\' THEN
1930 i := i + 1;
1931 GOTO skip_segment;
1932 END IF;
1933
1934 l_buf := SUBSTR(p_concatenated_segments, k,(j - k));
1935 END IF;
1936
1937 IF l_col_index = g_project_index OR l_col_index = g_task_index THEN
1938 NULL;
1939 ELSE
1940 IF l_new_segments IS NULL THEN
1941 l_new_segments := l_buf;
1942 /*bug 3905395 */
1943 IF l_buf IS NULL THEN
1944 l_new_segments := fnd_api.g_miss_char;
1945 END IF;
1946 ELSE
1947 l_new_segments := l_new_segments || g_delimiter || l_buf;
1948 END IF;
1949 END IF;
1950
1951 k := j + 1;
1952 i := i + 1;
1953 l_col_index := l_col_index + 1;
1954 EXIT WHEN j = 0;
1955 END LOOP;
1956
1957 RETURN l_new_segments;
1958 END get_locsegs;
1959
1960 FUNCTION GET_PJM_LOCSEGS(p_concatenated_segments IN VARCHAR2)
1961 RETURN VARCHAR2 IS
1962 CURSOR cur_seg IS
1963 SELECT application_column_name
1964 FROM fnd_id_flex_segments ffs
1965 WHERE application_id = 401 -- 'INV'
1966 AND id_flex_code = 'MTLL'
1967 AND id_flex_num = 101 -- 'STOCK_LOCATORS'
1968 AND enabled_flag = 'Y'
1969 -- AND display_flag = 'Y' -- Bug 14712465 removed this
1970 ORDER BY segment_num;
1971
1972 CURSOR c_delim IS
1973 SELECT concatenated_segment_delimiter
1974 FROM fnd_id_flex_structures
1975 WHERE id_flex_code = 'MTLL'
1976 AND ROWNUM = 1;
1977
1978 l_row_num NUMBER := 1;
1979 l_buf VARCHAR2(491);--BUG3306367
1980 l_new_segments VARCHAR2(1000) := '';--BUG4700952
1981 i BINARY_INTEGER := 1;
1982 j BINARY_INTEGER := 1;
1983 k BINARY_INTEGER := 1;
1984 l_col_index BINARY_INTEGER := 1;
1985 l_project_id NUMBER;
1986 l_task_id NUMBER;
1987 l_pt_buf VARCHAR2(30);
1988 BEGIN
1989 IF p_concatenated_segments is null THEN
1990 return(NULL);
1991 END IF;
1992 IF g_delimiter IS NULL THEN
1993 g_project_index := 0;
1994 g_task_index := 0;
1995 OPEN c_delim;
1996 FETCH c_delim INTO g_delimiter;
1997 CLOSE c_delim;
1998
1999 FOR rec1 IN cur_seg LOOP
2000 IF rec1.application_column_name = 'SEGMENT19' THEN
2001 g_project_index := l_row_num;
2002 END IF;
2003
2004 IF rec1.application_column_name = 'SEGMENT20' THEN
2005 g_task_index := l_row_num;
2006 END IF;
2007
2008 l_row_num := l_row_num + 1;
2009 END LOOP;
2010 END IF;
2011
2012 IF g_project_index = 0 THEN
2013 RETURN p_concatenated_segments;
2014 END IF;
2015
2016 LOOP
2017 <<skip_segment>>
2018 j := INSTR(p_concatenated_segments, g_delimiter, 1, i);
2019
2020 /*
2021 * j is initialized to 1, j is 0 only when the last
2022 * instance of the delimitor is already found.
2023 * In such a case fetch the rest of the string rather than
2024 * a substr..
2025 */
2026 IF j = 0 THEN
2027 l_buf := SUBSTR(p_concatenated_segments, k);
2028 ELSE
2029 IF SUBSTR(p_concatenated_segments, j - 1, 1) = '\' THEN
2030 i := i + 1;
2031 GOTO skip_segment;
2032 END IF;
2033
2034 l_buf := SUBSTR(p_concatenated_segments, k,(j - k));
2035 END IF;
2036
2037 IF l_col_index = g_project_index OR l_col_index = g_task_index THEN
2038
2039 -- 4662395 For this function
2040 -- the calling object will be required
2041 -- to set the profile mfg_organization_id.
2042 -- If this profile remains unset then
2043 -- no value will return from PJM_PROJECTS_ALL_V
2044
2045 if (l_col_index = g_project_index) then
2046 l_project_id := to_number(l_buf);
2047 BEGIN
2048 SELECT m.project_number
2049 INTO l_pt_buf
2050 FROM pjm_projects_all_v m
2051 WHERE m.project_id = l_project_id
2052 AND ROWNUM = 1;
2053 EXCEPTION
2054 WHEN OTHERS THEN l_pt_buf := '';
2055 END;
2056 else
2057 BEGIN
2058 l_task_id := to_number(l_buf);
2059 SELECT m.task_number
2060 INTO l_pt_buf
2061 FROM pjm_tasks_v m
2062 WHERE m.task_id = l_task_id
2063 AND m.project_id = l_project_id
2064 AND ROWNUM = 1;
2065 EXCEPTION
2066 WHEN OTHERS THEN l_pt_buf := '';
2067 END;
2068
2069 end if;
2070
2071 l_new_segments := l_new_segments || g_delimiter || l_pt_buf;
2072 ELSE
2073 IF l_new_segments IS NULL THEN
2074 l_new_segments := l_buf;
2075 /*bug 3905395 */
2076 IF l_buf IS NULL THEN
2077 l_new_segments := fnd_api.g_miss_char;
2078 END IF;
2079 ELSE
2080 l_new_segments := l_new_segments || g_delimiter || l_buf;
2081 END IF;
2082 END IF;
2083
2084 k := j + 1;
2085 i := i + 1;
2086 l_col_index := l_col_index + 1;
2087 EXIT WHEN j = 0;
2088 END LOOP;
2089
2090 RETURN l_new_segments;
2091 END get_pjm_locsegs;
2092
2093
2094
2095 END inv_project;