1 PACKAGE BODY MRP_CL_FUNCTION AS
2 /* $Header: MRPCLHAB.pls 120.12.12010000.3 2008/08/25 10:48:56 sbyerram ship $ */
3 -- ===============================================================
4
5
6 G_BOM_GREATER_THAN_EQUAL_J NUMBER := 1;
7
8 G_BOM_LESS_THAN_J NUMBER := 0;
9
10 G_AHL_GREATER_THAN_EQUAL_J NUMBER := 1;
11
12 G_AHL_LESS_THAN_J NUMBER := 0;
13
14
15 G_WSH_GREATER_THAN_EQUAL_J NUMBER := 1;
16
17 G_WSH_LESS_THAN_J NUMBER := 0;
18
19 PROCEDURE APPS_INITIALIZE(
20 p_user_name IN VARCHAR2,
21 p_resp_name IN VARCHAR2,
22 p_application_name IN VARCHAR2 )
23 IS
24 lv_application_id NUMBER;
25
26 BEGIN
27
28 SELECT APPLICATION_ID
29 INTO lv_application_id
30 FROM FND_APPLICATION_VL
31 WHERE APPLICATION_NAME = p_application_name;
32
33 APPS_INITIALIZE (p_user_name,
34 p_resp_name,
35 p_application_name,
36 lv_application_id);
37
38 END APPS_INITIALIZE;
39
40 /* -- Added this procedure to accept application_id instead of application_name */
41
42 PROCEDURE APPS_INITIALIZE(
43 p_user_name IN VARCHAR2,
44 p_resp_name IN VARCHAR2,
45 p_application_name IN VARCHAR2,
46 p_application_id IN NUMBER )
47 IS
48 lv_user_id NUMBER;
49 lv_resp_id NUMBER;
50 lv_application_id NUMBER;
51 lv_log_msg VARCHAR2(500);
52
53 BEGIN
54
55 IF FND_GLOBAL.USER_ID = -1 THEN
56 /* if user_id = -1, it means this initialization process is needed */
57
58 BEGIN
59 SELECT USER_ID
60 INTO lv_user_id
61 FROM FND_USER
62 WHERE USER_NAME = p_user_name;
63 EXCEPTION
64 WHEN NO_DATA_FOUND THEN
65 raise_application_error (-20001, 'User not defined on Source instance');
66 END;
67
68 IF MRP_CL_FUNCTION.validateUser(lv_user_id,MSC_UTIL.TASK_COLL,lv_log_msg) THEN
69 MRP_CL_FUNCTION.MSC_Initialize(MSC_UTIL.TASK_COLL,
70 lv_user_id,
71 -1, --l_resp_id,
72 -1 --l_application_id
73 );
74 ELSE
75 MSC_UTIL.LOG_MSG(MSC_UTIL.G_D_STATUS, lv_log_msg);
76 raise_application_error (-20001, lv_log_msg);
77 END IF;
78
79 END IF;
80
81 END APPS_INITIALIZE;
82
83 FUNCTION Default_ABC_Assignment_Group ( p_org_id NUMBER)
84 RETURN NUMBER IS
85
86 CURSOR c1( ORG_ID NUMBER) IS
87 SELECT default_abc_assignment_group
88 FROM MRP_PARAMETERS
89 WHERE ORGANIZATION_ID = ORG_ID;
90
91 lv_res NUMBER:= NULL;
92
93 BEGIN
94
95 FOR c_rec IN c1(p_org_id) LOOP
96
97 lv_res:= c_rec.default_abc_assignment_group;
98
99 END LOOP;
100
101 RETURN lv_res;
102
103 END;
104
105 FUNCTION mrp_resource_cost(p_item_id in number,
106 p_org_id in number,
107 p_primary_cost_method in number)
108 RETURN NUMBER IS
109
110 CURSOR COST_C IS
111 SELECT NVL(cst.tl_resource,0)
112 + NVL(cst.tl_overhead,0)
113 + NVL(cst.tl_material_overhead,0)
114 + NVL(cst.tl_outside_processing,0)
115 FROM cst_item_costs cst,
116 cst_cost_types cct
117 WHERE cct.costing_method_type = p_primary_cost_method
118 AND cct.cost_type_id = DECODE(p_primary_cost_method,1,1,2,2,1)
119 AND cst.cost_type_id = cct.cost_type_id
120 AND cst.inventory_item_id = p_item_id
121 AND cst.organization_id = p_org_id;
122
123 CURSOR COST_C2 IS
124 SELECT NVL(cst.tl_resource,0)
125 + NVL(cst.tl_overhead,0)
126 + NVL(cst.tl_material_overhead,0)
127 + NVL(cst.tl_outside_processing,0)
128 FROM cst_cost_types cct,
129 cst_item_costs cst
130 WHERE cst.cost_type_id = cct.default_cost_type_id
131 AND cct.costing_method_type = p_primary_cost_method
132 AND cct.cost_type_id = DECODE(p_primary_cost_method,1,1,2,2,1)
133 AND cst.inventory_item_id = p_item_id
134 AND cst.organization_id = p_org_id;
135
136 l_cost NUMBER:= NULL;
137
138 BEGIN
139
140 OPEN COST_C;
141 FETCH COST_C into l_cost;
142 CLOSE COST_C;
143
144 IF l_cost IS NULL THEN
145
146 OPEN COST_C2;
147 FETCH COST_C2 into l_cost;
148 CLOSE COST_C2;
149
150 END IF;
151
152 RETURN(l_cost);
153
154 END mrp_resource_cost;
155
156
157 FUNCTION mrp_item_cost(p_item_id in number,
158 p_org_id in number,
159 p_primary_cost_method in number)
160 RETURN NUMBER IS
161
162 CURSOR COST_C IS
163 SELECT NVL(cst.item_cost,0)
164 FROM cst_item_costs cst,
165 cst_cost_types cct
166 WHERE cct.costing_method_type = p_primary_cost_method
167 AND cct.cost_type_id = DECODE(p_primary_cost_method,1,1,2,2,1)
168 AND cst.cost_type_id = cct.cost_type_id
169 AND cst.inventory_item_id = p_item_id
170 AND cst.organization_id = p_org_id;
171
172 CURSOR COST_C2 IS
173 SELECT NVL(cst.item_cost,0)
174 FROM cst_cost_types cct,
175 cst_item_costs cst
176 WHERE cst.cost_type_id = cct.default_cost_type_id
177 AND cct.costing_method_type = p_primary_cost_method
178 AND cct.cost_type_id = DECODE(p_primary_cost_method,1,1,2,2,1)
179 AND cst.inventory_item_id = p_item_id
180 AND cst.organization_id = p_org_id;
181
182 l_cost NUMBER:= NULL;
183
184 BEGIN
185
186 OPEN COST_C;
187 FETCH COST_C into l_cost;
188 CLOSE COST_C;
189
190 IF l_cost IS NULL THEN
191
192 OPEN COST_C2;
193 FETCH COST_C2 into l_cost;
194 CLOSE COST_C2;
195
196 END IF;
197
198
199 RETURN(l_cost);
200
201 END mrp_item_cost;
202
203
204 FUNCTION mrp_item_list_price(arg_item_id in number,
205 arg_org_id in number,
206 arg_uom_code in varchar2,
207 arg_process_flag in varchar2,
208 arg_primary_cost_method in number)
209 RETURN NUMBER
210 IS
211
212 /* according to bug 1221049, we use the new cursor definition recommended by
213 QP team(product 495).
214
215 CURSOR PRICE_C IS
216 SELECT round(list_price,NVL(spl.rounding_factor,2))
217 from oe_price_list_lines sopl,
218 oe_price_lists spl
219 where spl.price_list_id = arg_price_list_id
220 and sopl.price_list_id = spl.price_list_id
221 and sopl.inventory_item_id = arg_item_id
222 and nvl(sopl.unit_code,' ') = nvl(arg_uom_code,' ')
223 and sysdate between nvl(sopl.start_date_active, sysdate-1)
224 and nvl(sopl.end_date_active, sysdate+1);
225 */
226
227 /* For the bug # 2070983, adding + 0 to qpl.list_header_id to avoid the range
228 * scan on the index QP_LIST_LINES_U1, instead it will now do a unique scan
229 * on the index QP_LIST_LINES_PK
230 */
231
232 /* For Bug 2113445, converting rounding factor to follow OM rounding convention
233 by multiplying it by -1
234 */
235 CURSOR PRICE_D ( p_item_id IN VARCHAR2,
236 p_uom_code IN VARCHAR2) IS
237 /*
238 select round(operand,-1*(nvl(qplh.rounding_factor,2)))
239 from qp_list_headers_b qplh,
240 qp_list_lines qpl,
241 qp_pricing_attributes qpa
242 where qplh.list_header_id = p_price_list_id
243 and qpl.list_header_id + 0 = qplh.list_header_id
244 and qpl.list_line_id = qpa.list_line_id
245 and qpa.product_attribute_context = 'ITEM'
246 and qpa.product_attribute = 'PRICING_ATTRIBUTE1'
247 and qpa.product_attr_value = p_item_id
248 and ( qpa.product_uom_code = p_uom_code
249 OR ( qpa.product_uom_code IS NULL
250 AND p_uom_code IS NULL))
251 and ( qpl.start_date_active <= sysdate
252 OR qpl.start_date_active IS NULL)
253 and ( qpl.end_date_active >= sysdate
254 OR qpl.end_date_active IS NULL);
255 */
256 /* For Bug 2230228, based on QP Teams suggestion*/
257 SELECT ROUND(QPL.OPERAND,-1 * (NVL(QPLH.ROUNDING_FACTOR,2)))
258 FROM
259 QP_PRICING_ATTRIBUTES QPA ,
260 QP_LIST_LINES QPL,
261 QP_LIST_HEADERS_B QPLH
262 WHERE QPA.PRICING_PHASE_ID = 1
263 AND QPA.QUALIFICATION_IND = 4
264 AND QPA.PRODUCT_ATTRIBUTE_CONTEXT = 'ITEM'
265 AND QPA.PRODUCT_ATTRIBUTE = 'PRICING_ATTRIBUTE1'
266 AND QPA.PRODUCT_ATTR_VALUE = p_item_id
267 AND QPA.LIST_HEADER_ID = v_price_list_id
268 AND QPL.LIST_LINE_ID = QPA.LIST_LINE_ID
269 AND QPL.LIST_HEADER_ID = QPLH.LIST_HEADER_ID
270 AND QPA.PRODUCT_UOM_CODE = p_uom_code
271 AND (QPL.START_DATE_ACTIVE <= SYSDATE OR QPL.START_DATE_ACTIVE IS NULL )
272 AND (QPL.END_DATE_ACTIVE >= SYSDATE OR QPL.END_DATE_ACTIVE IS NULL) ;
273
274 CURSOR PRICE_D_NULL_UOM( p_item_id IN VARCHAR2)
275 IS
276 SELECT ROUND(QPL.OPERAND,-1 * (NVL(QPLH.ROUNDING_FACTOR,2)))
277 FROM QP_PRICING_ATTRIBUTES QPA ,
278 QP_LIST_LINES QPL,
279 QP_LIST_HEADERS_B QPLH
280 WHERE QPA.PRICING_PHASE_ID = 1
281 AND QPA.QUALIFICATION_IND = 4
282 AND QPA.PRODUCT_ATTRIBUTE_CONTEXT = 'ITEM'
283 AND QPA.PRODUCT_ATTRIBUTE = 'PRICING_ATTRIBUTE1'
284 AND QPA.PRODUCT_ATTR_VALUE = p_item_id
285 AND QPA.LIST_HEADER_ID = v_price_list_id
286 AND QPL.LIST_LINE_ID = QPA.LIST_LINE_ID
287 AND QPL.LIST_HEADER_ID = QPLH.LIST_HEADER_ID
288 AND QPA.PRODUCT_UOM_CODE IS NULL
289 AND (QPL.START_DATE_ACTIVE <= SYSDATE OR QPL.START_DATE_ACTIVE IS NULL )
290 AND (QPL.END_DATE_ACTIVE >= SYSDATE OR QPL.END_DATE_ACTIVE IS NULL) ;
291
292 lv_price number:= NULL;
293 BEGIN
294
295 IF arg_uom_code IS NULL THEN
296 OPEN PRICE_D_NULL_UOM(arg_item_id);
297 FETCH PRICE_D_NULL_UOM into lv_price;
298 CLOSE PRICE_D_NULL_UOM;
299 ELSE
300 OPEN PRICE_D( arg_item_id, arg_uom_code);
301 FETCH PRICE_D into lv_price;
302 CLOSE PRICE_D;
303 END IF;
304
305 /* OPM Team - OPM INventoryConvergence Project
306 OPM will not have separate price lists
307 IF (lv_price IS NULL) AND (arg_process_flag = 'Y') THEN
308 lv_price:= gmp_aps_output_pkg.retrieve_price_list
309 (arg_item_id,
310 arg_org_id);
311 END IF;
312 */
313
314 RETURN lv_price;
315
316 EXCEPTION
317
318 WHEN OTHERS THEN RETURN NULL;
319
320 END mrp_item_list_price;
321
322
323 FUNCTION mrp_item_supp_price(p_item_id in number,
324 p_asl_id in number)
325 RETURN NUMBER IS
326
327 CURSOR c_po_line IS
328 SELECT DOCUMENT_HEADER_ID , DOCUMENT_LINE_ID
329 FROM po_asl_documents
330 WHERE asl_id = p_asl_id
331 AND using_organization_id = -1
332 AND DOCUMENT_TYPE_CODE = 'BLANKET'; --??
333
334 CURSOR c_unit_price(c_header_id in number,
335 c_line_id in number) IS
336 SELECT NVL(pll.unit_price,0) unit_price
337 FROM po_lines_all pll
338 WHERE po_line_id = c_line_id
339 and po_header_id = c_header_id
340 and item_id = p_item_id
341 and (pll.cancel_date is null OR
342 pll.cancel_date >= SYSDATE)
343 and (pll.closed_date is null OR
344 pll.closed_date >= SYSDATE)
345 and (pll.expiration_date is null OR
346 pll.expiration_date >= SYSDATE);
347
348 l_header_id number;
349 l_line_id number;
350 l_unit_price number;
351
352 BEGIN
353 l_unit_price := -1;
354 FOR c_rec in c_po_line
355 LOOP
356 BEGIN
357 For c_rec1 in c_unit_price(c_rec.DOCUMENT_HEADER_ID,
358 c_rec.DOCUMENT_LINE_ID)
359 LOOP
360 IF c_rec1.unit_price > l_unit_price then
361 l_unit_price := c_rec1.unit_price;
362 END IF;
363 END LOOP;
364 END;
365 END LOOP;
366 IF l_unit_price = -1 THEN
367 RETURN (NULL);
368 ELSE
369 RETURN(l_unit_price);
370 END IF;
371
372 EXCEPTION
373 WHEN NO_DATA_FOUND THEN RETURN NULL;
374 WHEN OTHERS THEN RETURN NULL;
375 END mrp_item_supp_price;
376
377
378 /* This is being added corresponding to bug : 2062398. */
379 FUNCTION mrp_rev_cum_yield(p_wip_entity_id IN NUMBER,
380 p_org_id IN NUMBER,
381 p_bill_seq_id IN NUMBER,
382 p_co_prod_supply IN NUMBER)
383 RETURN NUMBER IS
384 l_rev_cum number := 1;
385 v_split number;
386 qty_to_move number;
387 curr_op_seq_id number;
388 v_curr_op_seq_num number;
389
390 v_sql_stmt1 varchar2(1000);
391 v_sql_stmt2 varchar2(1000);
392
393 BEGIN
394
395 begin
396
397 v_sql_stmt1 := ' SELECT bos.Operation_Seq_Num, nvl(bos.reverse_cumulative_yield,1), wo.quantity_waiting_to_move '
398 ||' , nvl(wo.operation_sequence_id,wo.previous_operation_seq_id) '
399 ||' FROM MRP_SN_OPR_SEQS bos, '
400 ||' MRP_SN_WOPRS wo '
401 ||' WHERE wo.organization_id = :p_org_id '
402 ||' AND wo.wip_entity_id = :p_wip_entity_id '
403 ||' AND (wo.quantity_in_queue <> 0 OR '
404 ||' wo.quantity_running <> 0 OR '
405 ||' wo.quantity_waiting_to_move <> 0) '
406 ||' AND nvl(wo.operation_sequence_id,wo.previous_operation_seq_id) = bos.operation_sequence_id ';
407
408 EXECUTE IMMEDIATE v_sql_stmt1
409 INTO v_curr_op_seq_num, l_rev_cum, qty_to_move, curr_op_seq_id
410 USING p_org_id, p_wip_entity_id;
411
412 exception
413 when others then
414 l_rev_cum := l_rev_cum;
415 end;
416
417 /* for bug: 2488331 get the RCY of next primary operation from the network, if the job is moved to to_move stage or
418 it is jumped to another opern and is in to_move stage */
419
420 IF (qty_to_move <> 0) THEN
421
422 begin
423 v_sql_stmt2 := ' SELECT nvl(bos.reverse_cumulative_yield,1) '
424 ||' FROM MRP_SN_OPR_SEQS bos, '
425 ||' MRP_SN_OPR_NETWORKS bon '
426 ||' WHERE bon.from_op_seq_id = :curr_op_seq_id '
427 ||' AND bon.to_op_seq_id = bos.operation_sequence_id '
428 ||' AND bon.transition_type = 1 ';
429
430 EXECUTE IMMEDIATE v_sql_stmt2
431 INTO l_rev_cum
432 USING curr_op_seq_id;
433
434 exception
435 when others then
436 l_rev_cum := l_rev_cum;
437 end;
438
439 END IF;
440
441 /* if the co-product flag on the job is yes , the apply the co-product split */
442 IF (p_co_prod_supply = 1) THEN
443 begin
444 SELECT nvl(wsc.split,100)
445 INTO v_split
446 FROM wsm_Co_products wsc
447 WHERE wsc.bill_sequence_id is not null
448 AND wsc.split > 0
449 AND wsc.bill_Sequence_id = p_bill_seq_id;
450
451 v_split := v_split/100;
452 l_rev_cum := v_split*l_rev_cum;
453
454 exception
455 when others then
456 l_rev_cum := l_rev_cum;
457 end;
458
459 END IF;
460
461 RETURN(l_rev_cum);
462
463 EXCEPTION
464 WHEN OTHERS THEN
465 RETURN 1;
466
467 END mrp_rev_cum_yield;
468
469
470 /*This is added to get the reverse cumulative yield for the current operation from the job details */
471 FUNCTION mrp_jd_rev_cum_yield(p_wip_entity_id IN NUMBER,
472 p_org_id IN NUMBER,
473 p_bill_seq_id IN NUMBER,
474 p_co_prod_supply IN NUMBER)
475 RETURN NUMBER IS
476 l_rev_cum number := 1;
477 lv_status number := 0;
478 v_split number;
479 qty_to_move number;
480 curr_op_seq_id number;
481 v_curr_op_seq_num number;
482
483 v_sql_stmt1 varchar2(1000);
484 v_sql_stmt2 varchar2(1000);
485
486 BEGIN
487
488 begin
489
490 v_sql_stmt1 := ' Select wdj.status_type, decode(wdj.status_type, 1, (select nvl(bos.reverse_cumulative_yield,1) from MRP_SN_LJ_OPRS bos where bos.wip_entity_id = wdj.wip_entity_id and upper(bos.Network_start_end) = ''S''),1) from '
491 ||' MRP_SN_DSCR_JOBS wdj '
492 ||' Where wdj.wip_entity_id = :p_wip_entity_id ';
493
494 EXECUTE IMMEDIATE v_sql_stmt1
495 INTO lv_status, l_rev_cum
496 USING p_wip_entity_id;
497 exception
498 when others then
499 l_rev_cum := l_rev_cum;
500 end;
501
502 if lv_status <> 1 then
503
504 begin
505
506 v_sql_stmt1 := ' SELECT bos.Operation_Seq_Num, nvl(bos.reverse_cumulative_yield,1), wo.quantity_waiting_to_move '
507 ||' , nvl(wo.operation_sequence_id,wo.previous_operation_seq_id) '
508 ||' FROM MRP_SN_LJ_OPRS bos, '
509 ||' MRP_SN_WOPRS wo '
510 ||' WHERE wo.organization_id = :p_org_id '
511 ||' AND wo.wip_entity_id = :p_wip_entity_id '
512 ||' AND (wo.quantity_in_queue <> 0 OR '
513 ||' wo.quantity_running <> 0 OR '
514 ||' wo.quantity_waiting_to_move <> 0) '
515 ||' AND bos.wip_entity_id = wo.wip_entity_id '
516 ||' AND nvl(wo.operation_sequence_id,wo.previous_operation_seq_id) = bos.operation_sequence_id ';
517
518 EXECUTE IMMEDIATE v_sql_stmt1
519 INTO v_curr_op_seq_num, l_rev_cum, qty_to_move, curr_op_seq_id
520 USING p_org_id, p_wip_entity_id;
521
522 exception
523 when others then
524 l_rev_cum := l_rev_cum;
525 end;
526
527 /* for bug: 2488331 get the RCY of next primary operation from the network, if the job is moved to to_move stage or
528 it is jumped to another opern and is in to_move stage */
529
530 IF (qty_to_move <> 0) THEN
531
532 begin
533 v_sql_stmt2 := ' SELECT nvl(bos.reverse_cumulative_yield,1) '
534 ||' FROM MRP_SN_LJ_OPRS bos, '
535 ||' MRP_SN_LJ_OPR_NWK bon '
536 ||' WHERE bon.from_op_seq_id = :curr_op_seq_id '
537 ||' AND bon.wip_entity_id = :p_wip_entity_id '
538 ||' AND bon.wip_entity_id = bos.wip_entity_id '
539 ||' AND bon.to_op_seq_id = bos.operation_sequence_id '
540 ||' AND bon.transition_type = 1 ';
541
542 EXECUTE IMMEDIATE v_sql_stmt2
543 INTO l_rev_cum
544 USING curr_op_seq_id, p_wip_entity_id;
545
546 exception
547 when others then
548 l_rev_cum := l_rev_cum;
549 end;
550
551 END IF;
552
553 END IF;
554
555 /* if the co-product flag on the job is yes , the apply the co-product split */
556 IF (p_co_prod_supply = 1) THEN
557 begin
558 SELECT nvl(wsc.split,100)
559 INTO v_split
560 FROM wsm_Co_products wsc
561 WHERE wsc.bill_sequence_id is not null
562 AND wsc.split > 0
563 AND wsc.bill_Sequence_id = p_bill_seq_id;
564
565 v_split := v_split/100;
566 l_rev_cum := v_split*l_rev_cum;
567
568 exception
569 when others then
570 l_rev_cum := l_rev_cum;
571 end;
572
573 END IF;
574
575 RETURN(l_rev_cum);
576
577 EXCEPTION
578 WHEN OTHERS THEN
579 RETURN 1;
580
581 END mrp_jd_rev_cum_yield;
582
583
584 /* modified this func to consider the co-product supply for bug:2401445 */
585 FUNCTION mrp_rev_cum_yield_unreleased(p_wip_entity_id in number,
586 p_org_id in number,
587 p_bill_seq_id in number,
588 p_co_prod_supply in number)
589 RETURN NUMBER IS
590
591 v_op_seq_num number;
592 v_operation_sequence_id number;
593 x_err_msg varchar2(2000);
594 x_err_code number;
595 e_user_exception EXCEPTION;
596 p_common_routing_sequence_id NUMBER;
597 lv_rev_cum number;
598 v_routing_seq_id number;
599
600 v_split number;
601
602 BEGIN
603
604 lv_rev_cum := 1;
605 v_split := 0;
606
607 Begin
608
609 SELECT nvl(wdj.common_routing_sequence_id,wdj.routing_reference_id)
610 into v_routing_seq_id
611 FROM wip_discrete_jobs wdj
612 WHERE wdj.wip_entity_id = p_wip_entity_id
613 AND wdj.organization_id = p_org_id;
614
615 Exception
616 WHEN NO_DATA_FOUND THEN RETURN 1;
617 WHEN OTHERS THEN RETURN 1;
618
619 End;
620
621
622 WSMPUTIL.find_common_routing(
623 p_routing_sequence_id => v_routing_seq_id
624 , p_common_routing_sequence_id => p_common_routing_sequence_id
625 , x_err_code => x_err_code
626 , x_err_msg => x_err_msg
627 );
628
629 If x_err_code <> 0 Then
630 raise e_user_exception;
631 End If;
632
633 WSMPUTIL.find_routing_start( p_common_routing_sequence_id ,
634 v_operation_sequence_id ,
635 x_err_code,
636 x_err_msg);
637
638 Begin
639 select reverse_cumulative_yield
640 into lv_rev_cum
641 from bom_operation_sequences
642 where operation_sequence_id = v_operation_sequence_id;
643
644 Exception
645 WHEN NO_DATA_FOUND THEN RETURN 1;
646 WHEN OTHERS THEN RETURN 1;
647
648 End;
649
650 Begin
651 IF (p_co_prod_supply = 1) THEN
652 select wsc.split
653 into v_split
654 from wsm_Co_products wsc
655 where wsc.bill_sequence_id is not null
656 and wsc.split > 0
657 and wsc.bill_Sequence_id = p_bill_seq_id;
658
659 v_split := v_split/100;
660 lv_rev_cum := v_split*lv_rev_cum;
661
662 ELSE
663 v_split := 0;
664 lv_rev_cum := lv_rev_cum;
665 END IF;
666
667 Exception
668 WHEN OTHERS THEN
669 v_split := 0;
670 lv_rev_cum := lv_rev_cum;
671 END;
672
673 RETURN lv_rev_cum;
674
675 EXCEPTION
676 WHEN NO_DATA_FOUND THEN RETURN 1;
677 WHEN OTHERS THEN RETURN 1;
678 END mrp_rev_cum_yield_unreleased;
679
680
681 /*over-loaded the func so that the old ver of view mrp_ap_wip_jobs_v does
682 not get invalid during patch application
683 This func will not be called in the collections */
684 FUNCTION mrp_rev_cum_yield(p_wip_entity_id in number,
685 p_org_id in number)
686 RETURN NUMBER IS
687
688 CURSOR c_rev_cum IS
689 SELECT bos.reverse_cumulative_yield
690 FROM wip_operations wo,
691 bom_operation_sequences bos
692 WHERE wo.wip_entity_id = p_wip_entity_id
693 AND wo.organization_id = p_org_id
694 AND (wo.quantity_in_queue <> 0 or
695 wo.quantity_running <> 0 or
696 wo.quantity_waiting_to_move <> 0)
697 AND nvl(wo.operation_sequence_id,wo.previous_operation_seq_id) = bos.operation_sequence_id;
698
699 l_rev_cum number;
700
701 BEGIN
702 l_rev_cum := 1;
703 FOR c_rec in c_rev_cum
704 LOOP
705 BEGIN
706 l_rev_cum := NVL(c_rec.reverse_cumulative_yield,1);
707 END;
708 END LOOP;
709 RETURN(l_rev_cum);
710
711 EXCEPTION
712 WHEN NO_DATA_FOUND THEN RETURN 1;
713 WHEN OTHERS THEN RETURN 1;
714 END mrp_rev_cum_yield;
715
716
717 /*over-loaded the func so that the old ver of view mrp_ap_wip_jobs_v does
718 not get invalid during patch application
719 This func will not be called in the collections */
720 FUNCTION mrp_rev_cum_yield_unreleased(p_wip_entity_id in number,
721 p_org_id in number)
722 RETURN NUMBER IS
723
724 v_op_seq_num number;
725 v_operation_sequence_id number;
726 x_err_msg varchar2(2000);
727 x_err_code number;
728 e_user_exception EXCEPTION;
729 p_common_routing_sequence_id NUMBER;
730 lv_rev_cum number;
731 v_routing_seq_id number;
732
733 BEGIN
734
735 lv_rev_cum := 1;
736
737 Begin
738
739 SELECT nvl(wdj.common_routing_sequence_id,wdj.routing_reference_id)
740 into v_routing_seq_id
741 FROM wip_discrete_jobs wdj
742 WHERE wdj.wip_entity_id = p_wip_entity_id
743 AND wdj.organization_id = p_org_id;
744 Exception
745
746 WHEN NO_DATA_FOUND THEN RETURN 1;
747 WHEN OTHERS THEN RETURN 1;
748
749
750 End;
751
752
753 WSMPUTIL.find_common_routing(
754 p_routing_sequence_id => v_routing_seq_id
755 , p_common_routing_sequence_id => p_common_routing_sequence_id
756 , x_err_code => x_err_code
757 , x_err_msg => x_err_msg
758 );
759
760 If x_err_code <> 0 Then
761 raise e_user_exception;
762 End If;
763
764 WSMPUTIL.find_routing_start( p_common_routing_sequence_id ,
765 v_operation_sequence_id ,
766 x_err_code,
767 x_err_msg);
768
769 Begin
770 select reverse_cumulative_yield
771 into lv_rev_cum
772 from bom_operation_sequences
773 where operation_sequence_id = v_operation_sequence_id;
774
775 Exception
776
777 WHEN NO_DATA_FOUND THEN RETURN 1;
778 WHEN OTHERS THEN RETURN 1;
779
780 End;
781
782
783 return lv_rev_cum;
784 EXCEPTION
785 WHEN NO_DATA_FOUND THEN RETURN 1;
786 WHEN OTHERS THEN RETURN 1;
787 END mrp_rev_cum_yield_unreleased;
788
789 FUNCTION mrp_day_uom_qty(p_uom_code in varchar2,
790 p_quantity in number)
791 RETURN NUMBER IS
792 day_uom boolean;
793 hour_uom boolean;
794 lv_day_qty number;
795 lv_uom_code varchar2(3);
796 lv_hr_uom_code varchar2(3);
797 lv_day_uom_code varchar2(3);
798 lv_hr_conversion_rate number;
799 lv_day_conversion_rate number;
800 lv_base_conversion_rate number;
801
802 CURSOR get_conversion(user_uom_code varchar2,prf_uom_code varchar2) IS
803 SELECT conversion_rate
804 FROM mtl_uom_conversions muc
805 WHERE muc.uom_code = user_uom_code
806 AND muc.inventory_item_id = 0
807 AND NVL(muc.disable_date, SYSDATE + 1) > SYSDATE
808 AND EXISTS (SELECT 1 from mtl_units_of_measure_tl b
809 WHERE b.uom_code = prf_uom_code
810 AND b.uom_class = muc.uom_class);
811
812 BEGIN
813 day_uom := true;
814 hour_uom := true;
815 lv_day_qty := p_quantity;
816 lv_uom_code := p_uom_code;
817 lv_hr_uom_code := fnd_profile.value('BOM:HOUR_UOM_CODE');
818 lv_day_uom_code := fnd_profile.value('MSC:DAY_UOM_CODE');
819
820 /* If the UOM entered in UI is same as MSC:Day UOM return the same value
821 No conversion is neeeded */
822 IF lv_day_uom_code IS NOT NULL THEN
823 IF (lv_day_uom_code = lv_uom_code) THEN
824 RETURN lv_day_qty;
825 END IF;
826 END IF;
827
828
829 IF lv_day_uom_code IS NULL THEN
830 day_uom := false;
831 /* IF MSC:Day UOM is not set then use Bom:Hour UOM to convert into hours
832 and then re-convert into days */
833 END IF;
834
835 IF day_uom THEN
836 /* IF MSC: Day UOM is set, get the conversion rate from user-entered UOM to base UOM */
837 OPEN get_conversion(lv_uom_code,lv_day_uom_code);
838 FETCH get_conversion INTO lv_base_conversion_rate;
839
840 IF get_conversion%NOTFOUND THEN
841 /* If no converision is defined between user defined uom and base UOM
842 do not use MSC: Day UOM, check if BOM:Hour UOM is defined */
843 day_uom := false;
844 IF get_conversion%ISOPEN THEN CLOSE get_conversion; END IF;
845
846 ELSE
847 BEGIN
848 /* get the conversion rate between MSC: Day UOM and the base UOM*/
849 SELECT conversion_rate
850 INTO lv_day_conversion_rate
851 FROM mtl_uom_conversions muc
852 WHERE muc.uom_code = lv_day_uom_code
853 AND muc.inventory_item_id = 0
854 AND NVL(muc.disable_date, SYSDATE + 1) > SYSDATE;
855
856 /* get the number of days using above conversions */
857 lv_day_qty := ceil(lv_day_qty * lv_base_conversion_rate / lv_day_conversion_rate);
858
859 IF get_conversion%ISOPEN THEN CLOSE get_conversion; END IF;
860
861 RETURN lv_day_qty;
862
863 EXCEPTION
864 WHEN NO_DATA_FOUND THEN
865 day_uom := false;
866 IF get_conversion%ISOPEN THEN CLOSE get_conversion; END IF;
867
868 WHEN OTHERS THEN
869 day_uom := false;
870 IF get_conversion%ISOPEN THEN CLOSE get_conversion; END IF;
871
872 END;
873
874 END IF;
875
876 END IF; -- MSC:Day UOM is used for conversion
877
878 IF (day_uom = false) THEN
879 /* IF the MSC:Day UOM is not set and Bom:Hour UOM is set and USer UOM is same as Bom:Hour UOM ,
880 return the number divided by 24 to convert into days */
881 IF lv_hr_uom_code IS NOT NULL THEN
882 IF (lv_hr_uom_code = lv_uom_code) THEN
883 lv_day_qty := ceil( lv_day_qty / 24 );
884 RETURN lv_day_qty;
885 END IF;
886 ELSE hour_uom:= FALSE;
887 END IF;
888 IF hour_uom THEN
889 /* IF BOM: Hour UOM is set and for any exception day_uom is false, get the conversion rate
890 from user-entered UOM and base UOM */
891 OPEN get_conversion(lv_uom_code,lv_hr_uom_code);
892 FETCH get_conversion INTO lv_base_conversion_rate;
893
894 IF get_conversion%NOTFOUND THEN
895 /* IF conversion between BOM: Hour UOM and user UOM is not defined,
896 return number/24 to get the number of days */
897 lv_day_qty := ceil( lv_day_qty / 24);
898 IF get_conversion%ISOPEN THEN CLOSE get_conversion; END IF;
899 RETURN lv_day_qty;
900 ELSE
901 BEGIN
902 /* Get conversion betwwen BOM: Hour UOM and base UOM */
903 SELECT nvl(conversion_rate,1/24)
904 INTO lv_hr_conversion_rate
905 FROM mtl_uom_conversions muc
906 WHERE muc.uom_code = lv_hr_uom_code
907 AND muc.inventory_item_id = 0
908 AND NVL(muc.disable_date, SYSDATE + 1) > SYSDATE;
909
910 /* get the number of days using conversions */
911 lv_day_qty := ceil(((lv_day_qty * lv_base_conversion_rate)/lv_hr_conversion_rate) / 24);
912
913 IF get_conversion%ISOPEN THEN CLOSE get_conversion; END IF;
914
915 RETURN lv_day_qty;
916
917 EXCEPTION
918
919 WHEN NO_DATA_FOUND THEN
920 IF get_conversion%ISOPEN THEN CLOSE get_conversion; END IF;
921 lv_day_qty := ceil( lv_day_qty / 24);
922 RETURN lv_day_qty;
923
924 WHEN OTHERS THEN
925 IF get_conversion%ISOPEN THEN CLOSE get_conversion; END IF;
926 lv_day_qty := ceil( lv_day_qty / 24);
927 RETURN lv_day_qty;
928 END;
929
930 END IF;
931 ELSE
932 lv_day_qty := ceil( lv_day_qty / 24);
933 RETURN lv_day_qty;
934
935 END IF; -- hour uom cond
936
937 END IF; -- Hour UOM is used for conversion
938
939 IF lv_day_qty = 0 THEN
940 lv_day_qty := 1 ;
941 END IF;
942
943 RETURN(lv_day_qty);
944
945 EXCEPTION
946 WHEN NO_DATA_FOUND THEN RETURN ceil(lv_day_qty/24);
947 WHEN OTHERS THEN RETURN ceil(lv_day_qty/24);
948
949 END mrp_day_uom_qty;
950 FUNCTION get_primary_quantity(p_org_id in number,
951 p_item_id in number,
952 p_primary_uom_code in varchar2)
953 RETURN NUMBER IS
954 lv_uom_code varchar2(3);
955 BEGIN
956 BEGIN
957
958 select uom_code
959 into lv_uom_code
960 from mtl_units_of_measure
961 where uom_class = v_yield_uom_class
962 and base_uom_flag = 'Y';
963 EXCEPTION
964 WHEN NO_DATA_FOUND THEN return -99999;
965
966 END;
967 return( inv_convert.inv_um_convert(
968 item_id => p_item_id,
969 precision => 9,
970 from_quantity => 1,
971 from_unit => p_primary_uom_code,
972 to_unit => lv_uom_code,
973 from_name => null,
974 to_name => null) );
975
976 exception
977 when others then return 1;
978
979 END get_primary_quantity;
980
981 FUNCTION GET_RESOURCE_OVERHEAD(res_id IN NUMBER, dept_id IN NUMBER,
982 org_id IN NUMBER, res_cost IN NUMBER)
983 return NUMBER
984 IS
985
986 v_overhead NUMBER := 0;
987 BASIS_RESOURCE_UNITS CONSTANT INTEGER := 3;
988 BASIS_RESOURCE_VALUE CONSTANT INTEGER := 4;
989
990 CST_FROZEN CONSTANT INTEGER := 1;
991
992 BEGIN
993
994 SELECT NVL(SUM(decode(basis_type,
995 BASIS_RESOURCE_VALUE, res_cost * NVL(rate_or_amount,0),
996 NVL(rate_or_amount,0)
997 )
998 ),0)
999 INTO v_overhead
1000 FROM cst_department_overheads
1001 WHERE organization_id = org_id
1002 AND department_id = dept_id
1003 AND cost_type_id = CST_FROZEN
1004 AND basis_type in (BASIS_RESOURCE_VALUE, BASIS_RESOURCE_UNITS)
1005 AND overhead_id IN (SELECT overhead_id
1006 FROM cst_resource_overheads res
1007 WHERE res.organization_id = org_id
1008 AND res.resource_id = res_id
1009 AND cost_type_id = CST_FROZEN);
1010
1011 RETURN v_overhead;
1012
1013 EXCEPTION
1014 WHEN OTHERS THEN
1015 v_overhead := 0;
1016 RETURN v_overhead;
1017
1018 END GET_RESOURCE_OVERHEAD;
1019
1020 /* Check whether bom version is above I. If yes return true else return false.*/
1021 FUNCTION CHECK_BOM_VER
1022 return NUMBER
1023 IS
1024 lv_patch_level VARCHAR2(100);
1025 lv_bom_ver NUMBER;
1026 lv_family_pack VARCHAR2(10);
1027
1028 BEGIN
1029
1030 select nvl(fpi.patch_level, 'Not Available')
1031 into lv_patch_level
1032 from fnd_application_vl fav, fnd_product_installations fpi
1033 where fav.application_id = fpi.application_id and
1034 fpi.APPLICATION_ID in (702);
1035
1036 If lv_patch_level = 'Not Available' Then
1037 return G_BOM_LESS_THAN_J;
1038 End if;
1039
1040 lv_family_pack := SUBSTR(lv_patch_level,1,3);
1041
1042 IF lv_family_pack = '11i' Then
1043
1044 lv_bom_ver := ASCII( SUBSTR(lv_patch_level,-1,1) );
1045
1046 if lv_bom_ver > 73 Then
1047 return G_BOM_GREATER_THAN_EQUAL_J;
1048 else
1049 return G_BOM_LESS_THAN_J;
1050 End if;
1051
1052 ELSE
1053 return G_BOM_GREATER_THAN_EQUAL_J;
1054
1055 END IF;
1056
1057 EXCEPTION
1058 When Others Then return G_BOM_LESS_THAN_J;
1059
1060 END CHECK_BOM_VER;
1061
1062 FUNCTION CHECK_AHL_VER
1063 return NUMBER
1064 IS
1065 lv_retval BOOLEAN;
1066 lv_dummy1 VARCHAR2(32);
1067 lv_dummy2 VARCHAR2(32);
1068 l_applsys_schema_ahl VARCHAR2(32);
1069 lv_ahl_exists NUMBER;
1070
1071 BEGIN
1072
1073 lv_retval := FND_INSTALLATION.GET_APP_INFO ( 'AHL', lv_dummy1, lv_dummy2, l_applsys_schema_ahl);
1074
1075 SELECT count(1) into lv_ahl_exists FROM all_tab_columns
1076 WHERE (OWNER, TABLE_NAME, COLUMN_NAME) in ((l_applsys_schema_ahl, 'AHL_SCHEDULE_MATERIALS', 'COMPLETED_QUANTITY'));
1077
1078 IF lv_ahl_exists =1 THEN
1079 return G_AHL_GREATER_THAN_EQUAL_J;
1080 else
1081 return G_AHL_LESS_THAN_J;
1082 End if;
1083
1084
1085 EXCEPTION
1086 When Others Then return G_AHL_LESS_THAN_J;
1087
1088 END CHECK_AHL_VER;
1089
1090
1091 FUNCTION GET_CURRENT_OP_SEQ_NUM( p_org_id IN NUMBER
1092 , p_wip_entity_id IN NUMBER)
1093 RETURN NUMBER
1094 IS
1095
1096 l_rev_cum number := 1;
1097 v_split number;
1098 qty_to_move number;
1099 curr_op_seq_id number;
1100 v_curr_op_seq_num number;
1101
1102 v_sql_stmt1 varchar2(1000);
1103
1104 BEGIN
1105
1106 begin
1107
1108 v_sql_stmt1 := ' SELECT bos.Operation_Seq_Num, nvl(bos.reverse_cumulative_yield,1), wo.quantity_waiting_to_move '
1109 ||' , nvl(wo.operation_sequence_id,wo.previous_operation_seq_id) '
1110 ||' FROM MRP_SN_OPR_SEQS bos, '
1111 ||' MRP_SN_WOPRS wo '
1112 ||' WHERE wo.organization_id = :p_org_id '
1113 ||' AND wo.wip_entity_id = :p_wip_entity_id '
1114 ||' AND (wo.quantity_in_queue <> 0 OR '
1115 ||' wo.quantity_running <> 0 OR '
1116 ||' wo.quantity_waiting_to_move <> 0) '
1117 ||' AND nvl(wo.operation_sequence_id,wo.previous_operation_seq_id) = bos.operation_sequence_id ';
1118
1119 EXECUTE IMMEDIATE v_sql_stmt1
1120 INTO v_curr_op_seq_num, l_rev_cum, qty_to_move, curr_op_seq_id
1121 USING p_org_id, p_wip_entity_id;
1122
1123 exception
1124 when others then
1125 return to_number(NULL);
1126 end;
1127
1128 RETURN v_curr_op_seq_num;
1129
1130 EXCEPTION
1131 WHEN OTHERS THEN
1132 v_curr_op_seq_num := to_number(NULL);
1133 RETURN v_curr_op_seq_num;
1134
1135 END GET_CURRENT_OP_SEQ_NUM;
1136
1137 /* To get the current routing operation sequence number from job details */
1138 FUNCTION GET_CURRENT_JD_OP_SEQ_NUM( p_org_id IN NUMBER
1139 , p_wip_entity_id IN NUMBER)
1140 RETURN NUMBER
1141 IS
1142
1143 v_curr_op_seq_num number := null;
1144
1145 v_sql_stmt1 varchar2(1000);
1146
1147 BEGIN
1148
1149 begin
1150
1151 v_sql_stmt1 := ' SELECT wo1.Wsm_Op_Seq_Num '
1152 ||' FROM MRP_SN_WOPRS wo, '
1153 ||' MRP_SN_WOPRS wo1 '
1154 ||' WHERE wo.organization_id = :p_org_id '
1155 ||' AND wo.wip_entity_id = :p_wip_entity_id '
1156 ||' AND (wo.quantity_in_queue <> 0 OR '
1157 ||' wo.quantity_running <> 0 OR '
1158 ||' wo.quantity_waiting_to_move <> 0) '
1159 ||' AND wo1.wip_entity_id = wo.wip_entity_id '
1160 ||' AND nvl(wo.operation_sequence_id,wo.previous_operation_seq_id) = wo1.operation_sequence_id'
1161 ||' AND rownum=1';
1162
1163 EXECUTE IMMEDIATE v_sql_stmt1
1164 INTO v_curr_op_seq_num
1165 USING p_org_id, p_wip_entity_id;
1166
1167 exception
1168 when others then
1169 return to_number(NULL);
1170 end;
1171
1172 RETURN v_curr_op_seq_num;
1173
1174 EXCEPTION
1175 WHEN OTHERS THEN
1176 v_curr_op_seq_num := to_number(NULL);
1177 RETURN v_curr_op_seq_num;
1178
1179 END GET_CURRENT_JD_OP_SEQ_NUM;
1180
1181 FUNCTION GET_CURRENT_JOB_OP_SEQ_NUM( p_org_id IN NUMBER
1182 , p_wip_entity_id IN NUMBER)
1183 RETURN NUMBER
1184 IS
1185
1186 v_curr_op_seq_num number := null;
1187 lv_status number := null;
1188
1189 v_sql_stmt varchar2(1000);
1190
1191 BEGIN
1192
1193 begin
1194
1195 v_sql_stmt := ' Select wdj.status_type from '
1196 ||' MRP_SN_DSCR_JOBS wdj '
1197 ||' Where wdj.wip_entity_id = :p_wip_entity_id ';
1198
1199 EXECUTE IMMEDIATE v_sql_stmt
1200 INTO lv_status
1201 USING p_wip_entity_id;
1202 exception
1203 when others then
1204 return to_number(NULL);
1205 end;
1206
1207 If lv_status = 1 Then
1208 begin
1209
1210 v_sql_stmt := ' SELECT wo.Operation_Seq_Num '
1211 ||' FROM MRP_SN_WOPRS wo '
1212 ||' WHERE wo.organization_id = :p_org_id '
1213 ||' AND wo.wip_entity_id = :p_wip_entity_id ';
1214
1215 EXECUTE IMMEDIATE v_sql_stmt
1216 INTO v_curr_op_seq_num
1217 USING p_org_id, p_wip_entity_id;
1218
1219 exception
1220 when others then
1221 return to_number(NULL);
1222 end;
1223
1224 Else
1225 begin
1226
1227 v_sql_stmt := ' SELECT wo.Operation_Seq_Num '
1228 ||' FROM MRP_SN_WOPRS wo '
1229 ||' WHERE wo.organization_id = :p_org_id '
1230 ||' AND wo.wip_entity_id = :p_wip_entity_id '
1231 ||' AND (wo.quantity_in_queue <> 0 OR '
1232 ||' wo.quantity_running <> 0 OR '
1233 ||' wo.quantity_waiting_to_move <> 0) ' ;
1234
1235 EXECUTE IMMEDIATE v_sql_stmt
1236 INTO v_curr_op_seq_num
1237 USING p_org_id, p_wip_entity_id;
1238
1239 exception
1240 when others then
1241 return to_number(NULL);
1242 end;
1243 END IF;
1244
1245 RETURN v_curr_op_seq_num;
1246
1247 EXCEPTION
1248 WHEN OTHERS THEN
1249 v_curr_op_seq_num := to_number(NULL);
1250 RETURN v_curr_op_seq_num;
1251
1252 END GET_CURRENT_JOB_OP_SEQ_NUM;
1253
1254 FUNCTION GET_CURRENT_RTNG_OP_SEQ_NUM( p_org_id IN NUMBER
1255 , p_wip_entity_id IN NUMBER)
1256 RETURN NUMBER
1257 IS
1258
1259 v_curr_rtng_op_seq_num number := 50000;
1260 v_sql_stmt varchar2(1000);
1261
1262 BEGIN
1263
1264 v_sql_stmt := ' SELECT nvl(wo.wsm_op_seq_num,50000) '
1265 ||' FROM MRP_SN_WOPRS wo '
1266 ||' WHERE wo.organization_id = :p_org_id '
1267 ||' AND wo.wip_entity_id = :p_wip_entity_id '
1268 ||' AND (wo.quantity_in_queue <> 0 OR '
1269 ||' wo.quantity_running <> 0 OR '
1270 ||' wo.quantity_waiting_to_move <> 0) ' ;
1271
1272
1273 EXECUTE IMMEDIATE v_sql_stmt
1274 INTO v_curr_rtng_op_seq_num
1275 USING p_org_id, p_wip_entity_id;
1276
1277
1278 RETURN v_curr_rtng_op_seq_num;
1279
1280 EXCEPTION
1281 WHEN OTHERS THEN
1282 v_curr_rtng_op_seq_num := to_number(NULL);
1283 RETURN v_curr_rtng_op_seq_num;
1284
1285 END GET_CURRENT_RTNG_OP_SEQ_NUM;
1286
1287 FUNCTION GETWFUSER(ORIG_SYS_ID in varchar2)
1288 RETURN varchar2
1289 IS
1290 p_wf_name varchar2(320);
1291 p_wf_full_name varchar2(1000);
1292 BEGIN
1293 wf_directory.getusername('PER',orig_sys_id,p_wf_name,p_wf_full_name) ;
1294 RETURN substr(p_wf_name,1,100);
1295 EXCEPTION
1296 WHEN OTHERS THEN
1297 p_wf_name := null;
1298 RETURN substr(p_wf_name,1,100);
1299 END GETWFUSER;
1300
1301
1302 FUNCTION GET_ROUTING_SEQ_ID ( p_primary_item_id IN NUMBER,
1303 p_org_id IN NUMBER,
1304 p_alt_ROUTING_DESIG IN VARCHAR2,
1305 p_common_rout_seq_id IN NUMBER)
1306 RETURN NUMBER
1307 IS
1308
1309 v_temp_sql_stmt varchar2(1000);
1310 v_routing_seq_id number;
1311
1312 BEGIN
1313
1314 v_temp_sql_stmt := ' SELECT ROUTING_SEQUENCE_ID '
1315 ||' FROM MRP_SN_OPR_RTNS '
1316 ||' WHERE ASSEMBLY_ITEM_ID = :p_primary_item_id '
1317 ||' AND ORGANIZATION_ID = :p_org_id '
1318 ||' AND nvl(ALTERNATE_ROUTING_DESIGNATOR,''-1'') = :p_alt_ROUTING_DESIG '
1319 ||' AND COMMON_ROUTING_SEQUENCE_ID = :p_common_rout_seq_id ';
1320
1321 EXECUTE IMMEDIATE v_temp_sql_stmt
1322 INTO v_routing_seq_id
1323 USING p_primary_item_id ,p_org_id ,p_alt_ROUTING_DESIG ,p_common_rout_seq_id;
1324
1325 RETURN v_routing_seq_id;
1326
1327 EXCEPTION
1328 WHEN OTHERS THEN
1329 RETURN to_number(null);
1330
1331 END get_routing_seq_id;
1332
1333 FUNCTION GET_PO_ORIG_NEED_BY_DATE ( p_po_header_id IN NUMBER,
1334 p_po_line_id IN NUMBER,
1335 p_po_line_location_id IN NUMBER
1336 )
1337 RETURN DATE
1338 IS
1339 l_orig_need_by_date DATE;
1340 v_sql_stmt VARCHAR2(2000);
1341
1342 BEGIN
1343
1344 v_sql_stmt :=
1345 ' select need_by_date '
1346 ||' from ( '
1347 ||' SELECT revision_num, '
1348 ||' need_by_date, '
1349 ||' quantity, '
1350 ||' RANK() OVER (PARTITION BY LINE_LOCATION_ID, PO_HEADER_ID,PO_LINE_ID '
1351 ||' order by revision_num) as seqnumber '
1352 ||' FROM po_line_locations_archive_all '
1353 ||' where PO_HEADER_ID = :p_po_header_id '
1354 ||' and po_line_id = :p_po_line_id '
1355 ||' and line_location_id = :p_po_line_location_id '
1356 ||' ) '
1357 ||' where seqnumber = 1 ';
1358
1359 EXECUTE IMMEDIATE v_sql_stmt INTO l_orig_need_by_date
1360 USING p_po_header_id,
1361 p_po_line_id,
1362 p_po_line_location_id;
1363
1364 return l_orig_need_by_date;
1365
1366 EXCEPTION WHEN OTHERS THEN
1367 return null;
1368 END GET_PO_ORIG_NEED_BY_DATE;
1369
1370 FUNCTION GET_PO_ORIG_QUANTITY ( p_po_header_id IN NUMBER,
1371 p_po_line_id IN NUMBER,
1372 p_po_line_location_id IN NUMBER
1373 )
1374 RETURN NUMBER IS
1375 l_quantity NUMBER ;
1376 v_sql_stmt VARCHAR2(2000);
1377
1378 BEGIN
1379
1380 v_sql_stmt :=
1381 ' select quantity '
1382 ||' from ( '
1383 ||' SELECT revision_num, '
1384 ||' need_by_date, '
1385 ||' quantity, '
1386 ||' RANK() OVER (PARTITION BY LINE_LOCATION_ID, PO_HEADER_ID,PO_LINE_ID '
1387 ||' order by revision_num) as seqnumber '
1388 ||' FROM po_line_locations_archive_all '
1389 ||' where PO_HEADER_ID = :p_po_header_id '
1390 ||' and po_line_id = :p_po_line_id '
1391 ||' and line_location_id = :p_po_line_location_id '
1392 ||' ) '
1393 ||' where seqnumber = 1 ';
1394
1395 EXECUTE IMMEDIATE v_sql_stmt INTO l_quantity
1396 USING p_po_header_id,
1397 p_po_line_id,
1398 p_po_line_location_id;
1399
1400 return l_quantity;
1401
1402 EXCEPTION WHEN OTHERS THEN
1403 return to_number(NULL);
1404 END GET_PO_ORIG_QUANTITY;
1405
1406 FUNCTION get_userenv_lang
1407 RETURN varchar2
1408 IS
1409 BEGIN
1410 RETURN userenv('LANG');
1411
1412 EXCEPTION
1413 WHEN OTHERS THEN
1414 RETURN 'US';
1415 END get_userenv_lang;
1416
1417 FUNCTION GET_COST_TYPE_ID ( p_org_id IN NUMBER )
1418 RETURN NUMBER
1419 IS
1420
1421 CURSOR COST_C IS
1422 SELECT NVL(FND_PROFILE.VALUE('MSC_COST_TYPE'),
1423 DECODE(cost_org.primary_cost_method,1,1,2,cost_org.AVG_RATES_COST_TYPE_ID,1))
1424 FROM mtl_parameters org, mtl_parameters cost_org
1425 WHERE org.cost_organization_id = cost_org.organization_id
1426 and org.organization_id = p_org_id;
1427
1428 CURSOR COST_C2 IS
1429 SELECT NVL(FND_PROFILE.VALUE('MSC_COST_TYPE'),1)
1430 FROM dual;
1431
1432 l_cost_type_id NUMBER:= NULL;
1433
1434 BEGIN
1435
1436 OPEN COST_C;
1437 FETCH COST_C into l_cost_type_id;
1438 CLOSE COST_C;
1439
1440 IF l_cost_type_id IS NULL THEN
1441 OPEN COST_C2;
1442 FETCH COST_C2 into l_cost_type_id;
1443 CLOSE COST_C2;
1444 END IF;
1445
1446 RETURN(l_cost_type_id);
1447
1448 END GET_COST_TYPE_ID ;
1449
1450 FUNCTION MAP_REGION_TO_SITE (p_last_update_date in DATE)
1451 RETURN NUMBER
1452 IS
1453
1454 Cursor regions_update is
1455 select max(LAST_UPDATE_DATE)
1456 from WSH_REGIONS;
1457
1458 Cursor po_vendors_update(p_date DATE) is
1459 select vendor_site_id
1460 from PO_VENDOR_SITES_ALL
1461 where last_update_date >= p_date and creation_date < p_date;
1462
1463 Cursor all_vendor_sites is
1464 select vendor_site_id,country,state,city,zip
1465 from PO_VENDOR_SITES_ALL;
1466
1467 Cursor new_vendor_sites(p_date DATE) is
1468 select vendor_site_id,country,state,city,zip
1469 from PO_VENDOR_SITES_ALL
1470 where last_update_date >= p_date;
1471
1472 TYPE VendorSiteTblTyp IS TABLE OF PO_VENDOR_SITES_ALL.VENDOR_SITE_ID%TYPE;
1473 TYPE CountryTblTyp IS TABLE OF PO_VENDOR_SITES_ALL.COUNTRY%TYPE;
1474 TYPE StateTblTyp IS TABLE OF PO_VENDOR_SITES_ALL.STATE%TYPE;
1475 TYPE CityTblTyp IS TABLE OF PO_VENDOR_SITES_ALL.CITY%TYPE;
1476 TYPE ZipTblTyp IS TABLE OF PO_VENDOR_SITES_ALL.ZIP%TYPE;
1477 TYPE NumTblTyp IS TABLE OF NUMBER;
1478
1479 l_vendor_site_tab VendorSiteTblTyp ;
1480 l_vendor_site_tab1 VendorSiteTblTyp ;
1481 l_country_tab CountryTblTyp;
1482 l_state_tab StateTblTyp;
1483 l_city_tab CityTblTyp;
1484 l_postal_tab ZipTblTyp;
1485 l_region_id_tab NumTblTyp := NumTblTyp();
1486 l_region_type_tab NumTblTyp := NumTblTyp();
1487 l_zone_level_tab NumTblTyp := NumTblTyp();
1488
1489 l_regions WSH_REGIONS_SEARCH_PKG.region_table;
1490
1491 region_last_update DATE := NULL;
1492 l_status NUMBER;
1493 lv_sql_stmt VARCHAR2(8000);
1494 v_current_date DATE;
1495 v_current_user NUMBER;
1496
1497
1498
1499 BEGIN
1500
1501 SELECT SYSDATE,
1502 FND_GLOBAL.USER_ID
1503 INTO v_current_date,
1504 v_current_user
1505 FROM DUAL;
1506
1507 OPEN regions_update;
1508 FETCH regions_update into region_last_update;
1509 CLOSE regions_update;
1510
1511
1512 IF region_last_update is NULL THEN
1513 Return(1);
1514 NULL;
1515 END IF;
1516 -- If wsh_regions has undergone change after last Collection, all mappings are re-established.
1517 IF (p_last_update_date is NULL) OR (region_last_update >= p_last_update_date) THEN
1518 -- delete mrp_region_sites completely.
1519 DELETE FROM MRP_REGION_SITES;
1520
1521 -- Get all vendor sites for re mapping.
1522 OPEN all_vendor_sites;
1523 FETCH all_vendor_sites BULK COLLECT
1524 INTO l_vendor_site_tab,
1525 l_country_tab,
1526 l_state_tab,
1527 l_city_tab,
1528 l_postal_tab;
1529 CLOSE all_vendor_sites;
1530 ELSE
1531 OPEN po_vendors_update (p_last_update_date);
1532 FETCH po_vendors_update BULK COLLECT
1533 INTO l_vendor_site_tab1;
1534 CLOSE po_vendors_update;
1535 -- bug 5985580
1536
1537 FOR j IN 1..l_vendor_site_tab1.COUNT LOOP
1538 BEGIN
1539 DELETE FROM MRP_REGION_SITES
1540 where vendor_site_id =l_vendor_site_tab1(j);
1541 EXCEPTION WHEN OTHERS THEN
1542 MRP_CL_REFRESH_SNAPSHOT.LOG_DEBUG(SQLERRM);
1543 MRP_CL_REFRESH_SNAPSHOT.LOG_DEBUG('There was an error in DELETEING Region to Sites');
1544 NULL;
1545 END;
1546 END LOOP;
1547 --
1548 -- If wsh_regions has not undergone any change after the last Collection, map only new vendor sites.
1549 OPEN new_vendor_sites(p_last_update_date);
1550 FETCH new_vendor_sites BULK COLLECT
1551 INTO l_vendor_site_tab,
1552 l_country_tab,
1553 l_state_tab,
1554 l_city_tab,
1555 l_postal_tab;
1556 CLOSE new_vendor_sites;
1557 END IF;
1558
1559 FOR i IN 1..l_vendor_site_tab.COUNT LOOP
1560 BEGIN
1561 WSH_REGIONS_SEARCH_PKG.Get_All_Region_Matches(
1562 p_country => null, -- p_country
1563 p_country_region => null, -- p_country_region
1564 p_state => null, -- p_state
1565 p_city => l_city_tab(i), -- p_city
1566 p_postal_code_from => l_postal_tab(i), -- p_postal_code_from
1567 p_postal_code_to => l_postal_tab(i), -- p_postal_code_to
1568 p_country_code => l_country_tab(i), -- p_country_code
1569 p_country_region_code => null, -- p_country_region_code
1570 p_state_code => l_state_tab(i), -- p_state_code
1571 p_city_code => null, -- p_city_code
1572 p_lang_code => userenv('LANG'), -- p_lang_code
1573 p_location_id => null, -- p_location_id
1574 p_zone_flag => 'Y', -- p_zone_flag
1575 x_status => l_status,
1576 x_regions => l_regions);
1577
1578 EXCEPTION WHEN OTHERS THEN
1579 MRP_CL_REFRESH_SNAPSHOT.LOG_DEBUG(SQLERRM);
1580 MRP_CL_REFRESH_SNAPSHOT.LOG_DEBUG('There was an error in Get All Region Matches for City '||l_city_tab(i)||' State ' ||l_state_tab(i)||' Country '||l_country_tab(i) );
1581
1582 NULL;
1583 END;
1584
1585 IF l_regions.count > 0 THEN
1586 l_region_id_tab.EXTEND(l_regions.count);
1587 l_region_type_tab.EXTEND(l_regions.count);
1588 l_zone_level_tab.EXTEND(l_regions.count);
1589
1590 FOR j IN 1..l_regions.COUNT LOOP
1591 l_region_id_tab(j) := l_regions(j).region_id;
1592 IF(l_regions(j).region_type = 10) THEN
1593 l_region_type_tab(j) := (10 * (10 - l_regions(j).zone_level))+ 1;
1594 ELSE
1595 l_region_type_tab(j) := (10 * (10 - l_regions(j).zone_level))+ 0;
1596 END IF;
1597 l_zone_level_tab(j) := l_regions(j).zone_level;
1598 END LOOP;
1599 FORALL k IN 1..l_regions.count
1600 INSERT INTO MRP_REGION_SITES(region_id,vendor_site_id, region_type, zone_level, last_update_date, last_updated_by, creation_date, created_by)
1601 VALUES (l_region_id_tab(k), l_vendor_site_tab(i),l_region_type_tab(k),l_zone_level_tab(k), v_current_date, v_current_user, v_current_date, v_current_user);
1602 END IF;
1603
1604 END LOOP;
1605 COMMIT;
1606 Return(1);
1607
1608
1609 EXCEPTION WHEN OTHERS THEN
1610 MRP_CL_REFRESH_SNAPSHOT.LOG_DEBUG(SQLERRM);
1611 MRP_CL_REFRESH_SNAPSHOT.LOG_DEBUG('There was an error in Mapping Region to Sites');
1612 Return(0);
1613 END MAP_REGION_TO_SITE ;
1614
1615 FUNCTION get_ship_set_name(p_SHIP_SET_ID in number)
1616 RETURN VARCHAR2
1617 IS
1618 l_set_name VARCHAR2(30);
1619 BEGIN
1620
1621 IF (p_SHIP_SET_ID is not null) THEN
1622 select set_name into l_set_name
1623 from oe_sets
1624 where set_id=p_SHIP_SET_ID;
1625
1626 RETURN l_set_name;
1627
1628 ELSE
1629
1630 l_set_name := null;
1631 RETURN l_set_name;
1632
1633 END IF;
1634
1635 EXCEPTION
1636 WHEN OTHERS THEN
1637 l_set_name := null;
1638 RETURN l_set_name;
1639
1640 END get_ship_set_name;
1641
1642 FUNCTION get_arrival_set_name(p_ARRIVAL_SET_ID in number)
1643 RETURN VARCHAR2
1644 IS
1645 l_set_name VARCHAR2(30);
1646 BEGIN
1647
1648 IF (p_ARRIVAL_SET_ID is not null) THEN
1649 select set_name into l_set_name
1650 from oe_sets
1651 where set_id=p_ARRIVAL_SET_ID;
1652
1653 RETURN l_set_name;
1654
1655 ELSE
1656
1657 l_set_name := null;
1658 RETURN l_set_name;
1659
1660 END IF;
1661
1662 EXCEPTION
1663 WHEN OTHERS THEN
1664 l_set_name := null;
1665 RETURN l_set_name;
1666
1667 END get_arrival_set_name;
1668
1669 /* CMRO Collection Impact */
1670 FUNCTION GET_CMRO_CUSTOMER_ID
1671 RETURN NUMBER IS
1672 lv_customer_id NUMBER;
1673 BEGIN
1674
1675 /* Need to make sure that the AHL Customer Name is based of HZ Parties */
1676 /* I am settin other global variables in the function hoping and invoking
1677 * this function once for each row to avoid the hit 3 times?.
1678 * Should not we actually implement this in the Snap Shot?.
1679 */
1680
1681 Begin
1682 lv_customer_id := fnd_profile.value('AHL_APS_CUSTOMER_NAME');
1683 v_cmro_customer_id := lv_customer_id;
1684
1685 Exception
1686 When others then
1687 lv_customer_id := null;
1688 Return lv_customer_id ;
1689 End ;
1690
1691 RETURN lv_customer_id;
1692
1693 END GET_CMRO_CUSTOMER_ID;
1694
1695 FUNCTION GET_CMRO_SHIP_TO return NUMBER IS
1696 lv_customer_id NUMBER;
1697 lv_cmro_ship_to NUMBER;
1698 BEGIN
1699
1700 Begin
1701 lv_customer_id := fnd_profile.value('AHL_APS_CUSTOMER_NAME');
1702
1703 Exception
1704 When others then
1705 lv_customer_id := null;
1706 Return lv_customer_id ;
1707 End ;
1708
1709
1710 Begin
1711 SELECT
1712 SITE_USES_ALL.site_use_id SR_TP_SITE_ID
1713 INTO
1714 lv_cmro_ship_to
1715 FROM
1716 HZ_CUST_ACCT_SITES_ALL ACCT_SITE,
1717 HZ_CUST_SITE_USES_ALL SITE_USES_ALL,
1718 HZ_CUST_ACCOUNTS CUST_ACCT,
1719 HR_ORGANIZATION_INFORMATION O,
1720 HR_ALL_ORGANIZATION_UNITS_TL OTL
1721 WHERE OTL.ORGANIZATION_ID = SITE_USES_ALL.ORG_ID
1722 AND O.ORGANIZATION_ID = OTL.ORGANIZATION_ID
1723 AND O.ORG_INFORMATION_CONTEXT = 'Operating Unit Information'
1724 AND OTL.LANGUAGE = userenv('LANG')
1725 AND SITE_USES_ALL.ORG_ID is NOT NULL
1726 AND SITE_USES_ALL.CUST_ACCT_SITE_ID=ACCT_SITE.CUST_ACCT_SITE_ID
1727 AND ACCT_SITE.CUST_ACCOUNT_ID = CUST_ACCT.CUST_ACCOUNT_ID
1728 AND CUST_ACCT.CUST_ACCOUNT_ID = lv_customer_id;
1729
1730 Exception
1731 When others then
1732 lv_cmro_ship_to := null ;
1733 End ;
1734
1735 RETURN lv_cmro_ship_to;
1736
1737
1738 END GET_CMRO_SHIP_TO ;
1739
1740
1741 FUNCTION GET_CMRO_BILL_TO return NUMBER IS
1742 lv_customer_id NUMBER;
1743 lv_cmro_bill_to NUMBER;
1744 BEGIN
1745
1746
1747 Begin
1748 lv_customer_id := fnd_profile.value('AHL_APS_CUSTOMER_NAME');
1749
1750 Exception
1751 When others then
1752 lv_customer_id := null;
1753 lv_cmro_bill_to := null;
1754 Return lv_cmro_bill_to ;
1755 End ;
1756
1757
1758 Begin
1759 SELECT
1760 SITE_USES_ALL.site_use_id SR_TP_SITE_ID
1761 INTO
1762 lv_cmro_bill_to
1763 FROM
1764 HZ_CUST_ACCT_SITES_ALL ACCT_SITE,
1765 HZ_CUST_SITE_USES_ALL SITE_USES_ALL,
1766 HZ_CUST_ACCOUNTS CUST_ACCT,
1767 HR_ORGANIZATION_INFORMATION O,
1768 HR_ALL_ORGANIZATION_UNITS_TL OTL
1769 WHERE OTL.ORGANIZATION_ID = SITE_USES_ALL.ORG_ID
1770 AND O.ORGANIZATION_ID = OTL.ORGANIZATION_ID
1771 AND O.ORG_INFORMATION_CONTEXT = 'Operating Unit Information'
1772 AND OTL.LANGUAGE = userenv('LANG')
1773 AND SITE_USES_ALL.ORG_ID is NOT NULL
1774 AND SITE_USES_ALL.CUST_ACCT_SITE_ID=ACCT_SITE.CUST_ACCT_SITE_ID
1775 AND ACCT_SITE.CUST_ACCOUNT_ID = CUST_ACCT.CUST_ACCOUNT_ID
1776 AND CUST_ACCT.CUST_ACCOUNT_ID = lv_customer_id;
1777
1778 Exception
1779 When others then
1780 lv_cmro_bill_to := null ;
1781 End ;
1782
1783 RETURN lv_cmro_bill_to;
1784
1785 END GET_CMRO_BILL_TO ;
1786
1787
1788 /* Check whether wsh version is above I. If yes return true else return false.*/
1789 FUNCTION CHECK_WSH_VER
1790 return NUMBER
1791 IS
1792 lv_patch_level VARCHAR2(100);
1793 lv_wsh_ver NUMBER;
1794 lv_family_pack VARCHAR2(10);
1795
1796 BEGIN
1797
1798 select nvl(fpi.patch_level, 'Not Available')
1799 into lv_patch_level
1800 from fnd_application_vl fav, fnd_product_installations fpi
1801 where fav.application_id = fpi.application_id and
1802 fpi.APPLICATION_ID in (665);
1803
1804 If lv_patch_level = 'Not Available' Then
1805 return G_WSH_LESS_THAN_J;
1806 End if;
1807
1808 lv_family_pack := SUBSTR(lv_patch_level,1,3);
1809
1810 IF lv_family_pack = '11i' Then
1811
1812 lv_wsh_ver := ASCII( SUBSTR(lv_patch_level,-1,1) );
1813
1814 if lv_wsh_ver > 73 Then
1815 return G_WSH_GREATER_THAN_EQUAL_J;
1816 else
1817 return G_WSH_LESS_THAN_J;
1818 End if;
1819
1820 ELSE
1821 return G_WSH_GREATER_THAN_EQUAL_J;
1822
1823 END IF;
1824
1825 EXCEPTION
1826 When Others Then return G_WSH_LESS_THAN_J;
1827
1828 END CHECK_WSH_VER;
1829
1830 Procedure SUBMIT_CR
1831 ( p_user_name IN VARCHAR2,
1832 p_resp_name IN VARCHAR2,
1833 p_application_name IN VARCHAR2,
1834 p_application_id IN NUMBER,
1835 p_batch_id IN NUMBER,
1836 p_conc_req_short_name IN varchar2 ,
1837 p_conc_req_desc IN varchar2 ,
1838 p_owning_applshort_name IN varchar2,
1839 p_load_type IN NUMBER,
1840 p_request_id IN OUT NOCOPY Number) IS
1841
1842 l_request number;
1843 l_result BOOLEAN;
1844
1845 l_user_id NUMBER;
1846 lv_log_msg varchar2(500);
1847
1848 BEGIN
1849
1850 BEGIN
1851
1852 SELECT USER_ID
1853 INTO l_user_id
1854 FROM FND_USER
1855 WHERE USER_NAME = p_user_name;
1856
1857 EXCEPTION
1858 WHEN NO_DATA_FOUND THEN
1859 MRP_CL_REFRESH_SNAPSHOT.LOG_DEBUG('Error in launching the concurrent request : NO_USER_DEFINED');
1860 raise_application_error (-20001, 'NO_USER_DEFINED');
1861 END;
1862
1863 IF MRP_CL_FUNCTION.validateUser(l_user_id,MSC_UTIL.TASK_RELEASE,lv_log_msg) THEN
1864 MRP_CL_FUNCTION.MSC_Initialize(MSC_UTIL.TASK_RELEASE,
1865 l_user_id,
1866 -1, --l_resp_id,
1867 -1 --l_application_id
1868 );
1869 ELSE
1870 MSC_UTIL.LOG_MSG(MSC_UTIL.G_D_STATUS, lv_log_msg);
1871 raise_application_error (-20001, lv_log_msg);
1872 END IF;
1873
1874
1875 --=============================================
1876
1877 l_result := fnd_request.set_mode(TRUE);
1878
1879 IF p_load_type >0 THEN
1880 l_request := FND_REQUEST.SUBMIT_REQUEST
1881 (p_owning_applshort_name,
1882 p_conc_req_short_name,
1883 p_conc_req_desc,
1884 null,
1885 FALSE,
1886 p_batch_id);
1887 ELSE
1888 l_request := FND_REQUEST.SUBMIT_REQUEST
1889 (p_owning_applshort_name,
1890 p_conc_req_short_name,
1891 p_conc_req_desc,
1892 null,
1893 FALSE);
1894 END IF ;
1895
1896 IF nvl( l_request,0) = 0 THEN
1897 MRP_CL_REFRESH_SNAPSHOT.LOG_DEBUG('Error in launching the concurrent request ');
1898 ELSE
1899 p_request_id := l_request;
1900 MRP_CL_REFRESH_SNAPSHOT.LOG_DEBUG('Concurrent Request ID ' || p_request_id || ' has been submitted ');
1901 END IF;
1902 EXCEPTION
1903 WHEN OTHERS THEN
1904 RAISE;
1905
1906 END SUBMIT_CR;
1907
1908 FUNCTION validateUser (pUSERID IN NUMBER,
1909 pTASK IN NUMBER,
1910 pMESSAGE IN OUT NOCOPY varchar2)
1911 return BOOLEAN IS
1912 lv_result NUMBER := 0;
1913 BEGIN
1914 IF pTASK = MSC_UTIL.TASK_COLL THEN
1915
1916 select 1
1917 into lv_result
1918 from fnd_responsibility resp
1919 , FND_USER_RESP_GROUPS user_resp
1920 where resp.responsibility_id = user_resp.responsibility_id
1921 and resp.application_id = user_resp.responsibility_application_id
1922 and resp.responsibility_key = 'APS_COLLECTIONS'
1923 and user_resp.user_id = pUSERID
1924 and rownum =1 ;
1925
1926 ELSIF pTASK = MSC_UTIL.TASK_RELEASE THEN
1927
1928 select 1
1929 into lv_result
1930 from fnd_responsibility resp,
1931 FND_USER_RESP_GROUPS user_resp
1932 where resp.responsibility_id = user_resp.responsibility_id
1933 and resp.application_id = user_resp.responsibility_application_id
1934 and resp.responsibility_key = 'APS_RELEASE'
1935 and user_resp.user_id = pUSERID
1936 and rownum =1 ;
1937
1938 END IF;
1939
1940 IF lv_result = 1 THEN
1941 RETURN TRUE;
1942 ELSIF lv_result = 0 THEN
1943 RETURN FALSE;
1944 END IF;
1945
1946 EXCEPTION
1947 WHEN NO_DATA_FOUND THEN
1948 IF pTASK = MSC_UTIL.TASK_COLL THEN
1949 pMESSAGE := 'User not defnied or not assigned to the responsibility - ''APS COLLECTIONS''';
1950 ELSIF pTASK = MSC_UTIL.TASK_RELEASE THEN
1951 pMESSAGE := 'User not defnied or not assigned to the responsibility - ''APS RELEASE''';
1952 END IF;
1953 Return FALSE;
1954 WHEN OTHERS THEN
1955 pMESSAGE := 'Unable to validate user because of unexpected error';
1956 RAISE;
1957 END;
1958
1959
1960 PROCEDURE msc_Initialize(pTASK IN NUMBER,
1961 pUSERID IN NUMBER,
1962 pRESPID IN NUMBER,
1963 pAPPLID IN NUMBER) IS
1964
1965 lv_resp_id NUMBER;
1966 lv_application_id NUMBER;
1967 PRAGMA AUTONOMOUS_TRANSACTION;
1968 BEGIN
1969 IF pTASK = MSC_UTIL.TASK_COLL THEN
1970
1971 select resp.responsibility_id, resp.application_id
1972 into lv_resp_id, lv_application_id
1973 from fnd_responsibility resp,
1974 FND_USER_RESP_GROUPS user_resp
1975 where resp.responsibility_id = user_resp.responsibility_id
1976 and resp.application_id = user_resp.responsibility_application_id
1977 and resp.responsibility_key = 'APS_COLLECTIONS'
1978 and user_resp.user_id = pUSERID
1979 and rownum =1 ;
1980
1981 ELSIF pTASK = MSC_UTIL.TASK_RELEASE THEN
1982
1983 select resp.responsibility_id, resp.application_id
1984 into lv_resp_id, lv_application_id
1985 from fnd_responsibility resp,
1986 FND_USER_RESP_GROUPS user_resp
1987 where resp.responsibility_id = user_resp.responsibility_id
1988 and resp.application_id = user_resp.responsibility_application_id
1989 and resp.responsibility_key = 'APS_RELEASE'
1990 and user_resp.user_id = pUSERID
1991 and rownum =1 ;
1992
1993 ELSIF pTASK = MSC_UTIL.TASK_USER_DEFINED THEN
1994
1995 lv_resp_id := pRESPID;
1996 lv_application_id := pAPPLID;
1997
1998 END IF;
1999
2000 FND_GLOBAL.APPS_INITIALIZE( pUSERID,
2001 lv_resp_id,
2002 lv_application_id);
2003 commit;
2004 EXCEPTION
2005 WHEN NO_DATA_FOUND THEN
2006 IF pTASK = MSC_UTIL.TASK_COLL THEN
2007 raise_application_error (-20001, 'User not defnied or not assigned to the responsibility - ''APS COLLECTIONS''');
2008 ELSIF pTASK = MSC_UTIL.TASK_RELEASE THEN
2009 raise_application_error (-20001, 'User not defnied or not assigned to the responsibility - ''APS RELEASE''');
2010 ELSE
2011 raise_application_error (-20001, 'User not defnied or not assigned to the required responsibility');
2012 END IF;
2013 WHEN OTHERS THEN
2014 MSC_UTIL.LOG_MSG(MSC_UTIL.G_D_STATUS, 'Unable to initialize user because of unexpected error');
2015 RAISE;
2016 END;
2017
2018 END MRP_CL_FUNCTION;