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