DBA Data[Home] [Help]

PACKAGE BODY: APPS.BOM_REVISIONS

Source


1 PACKAGE BODY BOM_REVISIONS AS
2 /* $Header: BOMREVSB.pls 120.7 2011/02/09 23:56:31 vbrobbey ship $ */
3 
4 /* --------------------------- RAISE_REVISION_ERROR ------------------------
5    NAME
6     RAISE_REVISION_ERROR - raises generic error message
7  DESCRIPTION
8     for sql error failures, places the SQLERRM error on the message stack
9 
10  REQUIRES
11     func_name   PROCEDURE_name
12     stmt_num	statement number
13 
14  OUTPUT
15 
16  NOTES
17  ---------------------------------------------------------------------------*/
18 PROCEDURE RAISE_REVISION_ERROR (
19     func_name   VARCHAR2,
20     stmt_num	NUMBER
21 )
22 IS
23     err_text	VARCHAR2(2000);
24 BEGIN
25     err_text := func_name || '(' || stmt_num || ')' || SQLERRM;
26     FND_MESSAGE.SET_NAME('BOM', 'BOM_SQL_ERR');
27     FND_MESSAGE.SET_TOKEN('ENTITY', err_text);
28     APP_EXCEPTION.RAISE_EXCEPTION;
29 /*EXCEPTION
30     WHEN OTHERS THEN
31 	NULL;*/		-- BUG 4919190
32 END RAISE_REVISION_ERROR;
33 
34 /* --------------------------- RAISE_NO_REV_ERROR ------------------------
35    NAME
36     RAISE_NO_REV_ERROR - raises generic error message
37  DESCRIPTION
38     for sql error failures, places the SQLERRM error on the message stack
39 
40  REQUIRES
41     org_id	organization_id
42     part_id	item id
43     rev_date	revision date
44 
45  OUTPUT
46 
47  NOTES
48  ---------------------------------------------------------------------------*/
49 PROCEDURE RAISE_NO_REV_ERROR (
50     org_id	NUMBER,
51     part_id	NUMBER,
52     rev_date	DATE
53 ) IS
54     part_number	VARCHAR2(40);
55 BEGIN
56 	SELECT substrb(ITEM_NUMBER, 1, 40)
57 	INTO   part_number
58 	FROM   MTL_ITEM_FLEXFIELDS
59 	WHERE  ORGANIZATION_ID = org_id
60 	AND    INVENTORY_ITEM_ID = part_id;
61 
62 /*
63 ** return message that is no valid rev for item
64 ** Name: BOM_GET_REV
65 ** EFF_DATE: rev_date
66 ** ITEM_NUMBER: select from mtl_item_flexfields
67 */
68 
69 	FND_MESSAGE.SET_NAME('BOM', 'BOM_GET_REV');
70 	FND_MESSAGE.SET_TOKEN('ITEM_NUMBER', part_number);
71   --line below changed for calendar internationalization project
72   --value 2 for calendar_aware parameter means FND_DATE.calendar_aware_alt
73 	FND_MESSAGE.SET_TOKEN('EFF_DATE', fnd_date.date_to_displaydt(rev_date, 2));
74 	APP_EXCEPTION.RAISE_EXCEPTION;
75 
76 EXCEPTION
77     WHEN NO_DATA_FOUND THEN
78 	RAISE_REVISION_ERROR (func_name => 'RAISE_NO_REV_ERROR',
79 			      stmt_num => 1);
80 
81 END RAISE_NO_REV_ERROR;
82 
83 /* ------------------------------ GET_REVISION_DETAILS --------------------------
84    NAME
85     GET_REVISION_DETAILS - retrieve item revision,revision label,revision id for a date
86  DESCRIPTION
87     retrieve teh current revision for teh given date
88 
89  REQUIRES
90     type	"PART" - item revision
91 		"PROCESS" - routing revision
92     eco_status  "ALL" - all ECOs
93 		"EXCLUDE_HOLD" - exclude pending revisions from ECOs
94 				 with HOLD status
95 		"EXCLUDE_OPEN_HOLD" - exclude pending revisions from ECOs
96 				 with HOLD or OPEN status
97                 "EXCLUDE_ALL"   -  Exclude all revisions except the Implemented
98     examine_type "ALL" - all revisions
99 		"IMPL_ONLY" - only implemented revisions
100 		"PEND_ONLY" - only unimplemented revisions
101     org_id	organization id
102     item_id     item id
103     rev_date    date for which revision desired
104  OUTPUT
105     itm_rev		revision
106     itm_rev_label	revision label
107     itm_rev_id		revision id
108  RETURNS
109 
110  NOTES
111  ---------------------------------------------------------------------------*/
112 PROCEDURE GET_REVISION_DETAILS(
113 	eco_status		IN VARCHAR2 DEFAULT 'ALL',
114 	examine_type		IN VARCHAR2 DEFAULT 'ALL',
115 	org_id			IN NUMBER,
116 	item_id			IN NUMBER,
117 	rev_date		IN DATE,
118 	itm_rev			 IN OUT NOCOPY  VARCHAR2,
119 	itm_rev_label		 IN OUT NOCOPY  VARCHAR2,
120 	itm_rev_id		 IN OUT NOCOPY  NUMBER
121 )
122 IS
123     stmt_num    NUMBER;
124 
125     CURSOR ECO_STATUS_ITEM_REV IS
126 	SELECT REVISION,REVISION_LABEL,REVISION_ID
127         FROM   MTL_ITEM_REVISIONS_B MIR, ENG_REVISED_ITEMS ERI
128         WHERE  MIR.INVENTORY_ITEM_ID = item_id
129         AND    MIR.ORGANIZATION_ID = org_id
130         AND    MIR.EFFECTIVITY_DATE  <= rev_date  --Bug 3020310
131         AND    MIR.REVISED_ITEM_SEQUENCE_ID = ERI.REVISED_ITEM_SEQUENCE_ID(+)
132         AND   (
133                  (eco_status = 'EXCLUDE_HOLD'
134                  AND  NVL(ERI.STATUS_TYPE,0) NOT IN (2)
135                  )
136                  OR
137                  (eco_status = 'EXCLUDE_OPEN_HOLD'
138                  AND  NVL(ERI.STATUS_TYPE,0) NOT IN (1,2)
139                  )
140                   OR
141                 (eco_status = 'EXCLUDE_ALL'
142                  AND  NVL(ERI.STATUS_TYPE,0) IN (0,6)
143                 )
144               )
145          ORDER BY MIR.EFFECTIVITY_DATE DESC, MIR.REVISION DESC;
146 
147     CURSOR NO_ECO_ITEM_REV IS
148        SELECT REVISION,REVISION_LABEL,REVISION_ID
149        FROM   MTL_ITEM_REVISIONS_B MIR
150        WHERE  INVENTORY_ITEM_ID = item_id
151        AND    ORGANIZATION_ID = org_id
152        AND    MIR.EFFECTIVITY_DATE  <= rev_date  --Bug 3020310
153        AND    ( (examine_type = 'ALL')
154                  OR
155 		(examine_type = 'IMPL_ONLY'
156                      AND IMPLEMENTATION_DATE IS NOT NULL
157                 )
158                  OR
159 		(examine_type = 'PEND_ONLY'
160                      AND IMPLEMENTATION_DATE IS NULL
161                 )
162               )
163         ORDER BY EFFECTIVITY_DATE DESC, REVISION DESC;
164 
165 BEGIN
166     IF (eco_status = 'EXCLUDE_HOLD' OR eco_status = 'EXCLUDE_OPEN_HOLD'
167 		OR eco_status = 'EXCLUDE_ALL' ) THEN   -- Bug #4038025
168     	OPEN ECO_STATUS_ITEM_REV;
169 	stmt_num := 1;
170 
171     	FETCH ECO_STATUS_ITEM_REV INTO itm_rev,itm_rev_label,itm_rev_id;
172 
173     	CLOSE ECO_STATUS_ITEM_REV;
174 
175     ELSE
176 	OPEN NO_ECO_ITEM_REV;
177 	stmt_num := 2;
178 
179 	FETCH NO_ECO_ITEM_REV INTO itm_rev,itm_rev_label,itm_rev_id;
180 
181     	CLOSE NO_ECO_ITEM_REV;
182 
183     END IF;
184    EXCEPTION
185      WHEN OTHERS THEN
186      NULL;
187 
188 END GET_REVISION_DETAILS;
189 
190 /* ------------------------------ GET_ITEM_REVISION_LABEL_FN --------------------------
191    NAME
192     GET_ITEM_REVISION_LABEL_FN - retrieve item revision for a date
193  DESCRIPTION
194     retrieve teh current revision for teh given date
195 
196  REQUIRES
197     type	"PART" - item revision
198 		"PROCESS" - routing revision
199     eco_status  "ALL" - all ECOs
200 		"EXCLUDE_HOLD" - exclude pending revisions from ECOs
201 				 with HOLD status
202 		"EXCLUDE_OPEN_HOLD" - exclude pending revisions from ECOs
203 				 with HOLD or OPEN status
204                 "EXCLUDE_ALL"   -  Exclude all revisions except the Implemented
205     examine_type "ALL" - all revisions
206 		"IMPL_ONLY" - only implemented revisions
207 		"PEND_ONLY" - only unimplemented revisions
208     org_id	organization id
209     item_id     item id
210     rev_date    date for which revision desired
211  OUTPUT
212     itm_rev_label	revision label
213  RETURNS
214 
215  NOTES
216  ---------------------------------------------------------------------------*/
217 
218 
219 FUNCTION GET_ITEM_REVISION_LABEL_FN(
220 	eco_status		IN VARCHAR2 DEFAULT 'ALL',
221 	examine_type		IN VARCHAR2 DEFAULT 'ALL',
222 	org_id			IN NUMBER,
223 	item_id			IN NUMBER,
224 	rev_date		IN DATE
225 )
226 RETURN VARCHAR2 IS
227 	itm_rev 	VARCHAR2(3);
228 	itm_rev_label	VARCHAR2(80);
229 	itm_rev_id	NUMBER;
230 BEGIN
231 	GET_REVISION_DETAILS(
232 		eco_status => eco_status,
233 		examine_type => examine_type,
234 		org_id => org_id,
235 		item_id => item_id,
236 		rev_date => rev_date,
237 		itm_rev	=> itm_rev,
238 		itm_rev_label => itm_rev_label ,
239 		itm_rev_id => itm_rev_id
240 		);
241 
242 RETURN 	itm_rev_label;
243 
244 EXCEPTION
245      WHEN OTHERS THEN
246      RETURN NULL;
247 
248 END GET_ITEM_REVISION_LABEL_FN;
249 
250 
251 
252 /* ------------------------------ GET_ITEM_REVISION --------------------------
253    NAME
254     GET_ITEM_REVISION - retrieve item revision for a date
255  DESCRIPTION
256     retrieve teh current revision for teh given date
257 
258  REQUIRES
259     type	"PART" - item revision
260 		"PROCESS" - routing revision
261     eco_status  "ALL" - all ECOs
262 		"EXCLUDE_HOLD" - exclude pending revisions from ECOs
263 				 with HOLD status
264 		"EXCLUDE_OPEN_HOLD" - exclude pending revisions from ECOs
265 				 with HOLD or OPEN status
266                 "EXCLUDE_ALL"   -  Exclude all revisions except the Implemented
267     examine_type "ALL" - all revisions
268 		"IMPL_ONLY" - only implemented revisions
269 		"PEND_ONLY" - only unimplemented revisions
270     org_id	organization id
271     item_id     item id
272     rev_date    date for which revision desired
273  OUTPUT
274     itm_rev		revision
275  RETURNS
276 
277  NOTES
278  ---------------------------------------------------------------------------*/
279 PROCEDURE GET_ITEM_REVISION(
280 	eco_status		IN VARCHAR2 DEFAULT 'ALL',
281 	examine_type		IN VARCHAR2 DEFAULT 'ALL',
282 	org_id			IN NUMBER,
283 	item_id			IN NUMBER,
284 	rev_date		IN DATE,
285 	itm_rev			 IN OUT NOCOPY  VARCHAR2
286 )
287 IS
288     stmt_num    NUMBER;
289 
290     CURSOR ECO_STATUS_ITEM_REV IS
291 	SELECT REVISION
292         FROM   MTL_ITEM_REVISIONS_B MIR, ENG_REVISED_ITEMS ERI
293         WHERE  MIR.INVENTORY_ITEM_ID = item_id
294         AND    MIR.ORGANIZATION_ID = org_id
295         AND    MIR.EFFECTIVITY_DATE  <= rev_date  --Bug 3020310
296         AND    MIR.REVISED_ITEM_SEQUENCE_ID = ERI.REVISED_ITEM_SEQUENCE_ID(+)
297         AND   (
298                  (eco_status = 'EXCLUDE_HOLD'
299                  AND  NVL(ERI.STATUS_TYPE,0) NOT IN (2)
300                  )
301                  OR
302                  (eco_status = 'EXCLUDE_OPEN_HOLD'
303                  AND  NVL(ERI.STATUS_TYPE,0) NOT IN (1,2)
304                  )
305                   OR
306                 (eco_status = 'EXCLUDE_ALL'
307                  AND  NVL(ERI.STATUS_TYPE,0) IN (0,6)
308                 )
309               )
310          ORDER BY MIR.EFFECTIVITY_DATE DESC, MIR.REVISION DESC;
311 
312     CURSOR NO_ECO_ITEM_REV IS
313        SELECT REVISION
314        FROM   MTL_ITEM_REVISIONS_B MIR
315        WHERE  INVENTORY_ITEM_ID = item_id
316        AND    ORGANIZATION_ID = org_id
317        AND    MIR.EFFECTIVITY_DATE  <= rev_date  --Bug 3020310
318        AND    ( (examine_type = 'ALL')
319                  OR
320 		(examine_type = 'IMPL_ONLY'
321                      AND IMPLEMENTATION_DATE IS NOT NULL
322                 )
323                  OR
324 		(examine_type = 'PEND_ONLY'
325                      AND IMPLEMENTATION_DATE IS NULL
326                 )
327               )
328         ORDER BY EFFECTIVITY_DATE DESC, REVISION DESC;
329 
330 BEGIN
331 /*Bug 7692735: Changed below if condition to add last condition for EXCLUDE_ALL*/
332     IF (eco_status = 'EXCLUDE_HOLD' OR eco_status = 'EXCLUDE_OPEN_HOLD' OR eco_status = 'EXCLUDE_ALL') THEN
333     	OPEN ECO_STATUS_ITEM_REV;
334 	stmt_num := 1;
335 
336     	FETCH ECO_STATUS_ITEM_REV INTO itm_rev;
337 
338     	IF ECO_STATUS_ITEM_REV%NOTFOUND THEN
339     	    CLOSE ECO_STATUS_ITEM_REV;
340 	    RAISE_NO_REV_ERROR (
341 			org_id => org_id,
342 			part_id => item_id,
343 			rev_date => rev_date);
344     	END IF;
345     	CLOSE ECO_STATUS_ITEM_REV;
346 
347     ELSE
348 	OPEN NO_ECO_ITEM_REV;
349 	stmt_num := 2;
350     	FETCH NO_ECO_ITEM_REV INTO itm_rev;
351 
352     	IF NO_ECO_ITEM_REV%NOTFOUND THEN
353     	    CLOSE NO_ECO_ITEM_REV;
354 	    RAISE_NO_REV_ERROR (
355 			org_id => org_id,
356 			part_id => item_id,
357 			rev_date => rev_date);
358     	END IF;
359     	CLOSE NO_ECO_ITEM_REV;
360 
361     END IF;
362 
363 END GET_ITEM_REVISION;
364 
365 /* ------------------------------ GET_ITEM_REVISION_FN --------------------------
366    NAME
367     GET_ITEM_REVISION_FN - retrieve item revision for a date , if no revision defined, return null instead
368  DESCRIPTION
369     retrieve teh current revision for teh given date
370 
371  REQUIRES
372     type	"PART" - item revision
373 		"PROCESS" - routing revision
374     eco_status  "ALL" - all ECOs
375 		"EXCLUDE_HOLD" - exclude pending revisions from ECOs
376 				 with HOLD status
377 		"EXCLUDE_OPEN_HOLD" - exclude pending revisions from ECOs
378 				 with HOLD or OPEN status
379     examine_type "ALL" - all revisions
380 		"IMPL_ONLY" - only implemented revisions
381 		"PEND_ONLY" - only unimplemented revisions
382     org_id	organization id
383     item_id     item id
384     rev_date    date for which revision desired
385  OUTPUT
386     itm_rev		revision
387  RETURNS
388 
389  NOTES
390  ---------------------------------------------------------------------------*/
391 FUNCTION GET_ITEM_REVISION_FN(
392 	eco_status		IN VARCHAR2 DEFAULT 'ALL',
393 	examine_type		IN VARCHAR2 DEFAULT 'ALL',
394 	org_id			IN NUMBER,
395 	item_id			IN NUMBER,
396 	rev_date		IN DATE
397 )
398 RETURN VARCHAR2 IS
399     stmt_num    NUMBER;
400     itm_rev     VARCHAR2(3);
401 
402     CURSOR ECO_STATUS_ITEM_REV IS
403 	SELECT REVISION
404         FROM   MTL_ITEM_REVISIONS_B MIR, ENG_REVISED_ITEMS ERI
405         WHERE  MIR.INVENTORY_ITEM_ID = item_id
406         AND    MIR.ORGANIZATION_ID = org_id
407         AND    MIR.EFFECTIVITY_DATE <= rev_date
408         AND    MIR.REVISED_ITEM_SEQUENCE_ID = ERI.REVISED_ITEM_SEQUENCE_ID(+)
409         AND   (
410                  (eco_status = 'EXCLUDE_HOLD'
411                  AND  NVL(ERI.STATUS_TYPE,0) NOT IN (2)
412                  )
413                  OR
414                  (eco_status = 'EXCLUDE_OPEN_HOLD'
415                  AND  NVL(ERI.STATUS_TYPE,0) NOT IN (1,2)
416                  )
417                  /*BUG 9214280 Added the or condition*/
418  	         OR
419  	         (eco_status = 'EXCLUDE_ALL'
420  	          AND  NVL(ERI.STATUS_TYPE,0) IN (0,6)
421  	         )
422  	         /*End of BUG 9214280*/
423               )
424          ORDER BY MIR.EFFECTIVITY_DATE DESC, MIR.REVISION DESC;
425 
426     CURSOR NO_ECO_ITEM_REV IS
427        SELECT REVISION
428        FROM   MTL_ITEM_REVISIONS_B MIR
429        WHERE  INVENTORY_ITEM_ID = item_id
430        AND    ORGANIZATION_ID = org_id
431        AND    MIR.EFFECTIVITY_DATE <= rev_date
432        AND    ( (examine_type = 'ALL')
433                  OR
434 		(examine_type = 'IMPL_ONLY'
435                      AND IMPLEMENTATION_DATE IS NOT NULL
436                 )
437                  OR
438 		(examine_type = 'PEND_ONLY'
439                      AND IMPLEMENTATION_DATE IS NULL
440                 )
441               )
442         ORDER BY EFFECTIVITY_DATE DESC, REVISION DESC;
443 
444 BEGIN
445     IF (eco_status = 'EXCLUDE_HOLD' OR eco_status = 'EXCLUDE_OPEN_HOLD'
446          OR eco_status = 'EXCLUDE_ALL') THEN
447     	OPEN ECO_STATUS_ITEM_REV;
448 	stmt_num := 1;
449 
450     	FETCH ECO_STATUS_ITEM_REV INTO itm_rev;
451     	IF ECO_STATUS_ITEM_REV%NOTFOUND THEN
452     	    CLOSE ECO_STATUS_ITEM_REV;
453 	    RETURN NULL;
454     	END IF;
455     	CLOSE ECO_STATUS_ITEM_REV;
456         RETURN itm_rev;
457     ELSE
458 	OPEN NO_ECO_ITEM_REV;
459 	stmt_num := 2;
460     	FETCH NO_ECO_ITEM_REV INTO itm_rev;
461 
462     	IF NO_ECO_ITEM_REV%NOTFOUND THEN
463     	    CLOSE NO_ECO_ITEM_REV;
464 	    RETURN NULL;
465     	END IF;
466     	CLOSE NO_ECO_ITEM_REV;
467         RETURN itm_rev;
468     END IF;
469 
470 END GET_ITEM_REVISION_FN;
471 
472 /* ------------------------------ GET_ITEM_REVISION_ID_FN --------------------------
473    NAME
474     GET_ITEM_REVISION_FN - retrieve item revision for a date , if no revision defined, return null instead
475  DESCRIPTION
476     retrieve teh current revision for teh given date
477 
478  REQUIRES
479     type	"PART" - item revision
480 		"PROCESS" - routing revision
481     eco_status  "ALL" - all ECOs
482 		"EXCLUDE_HOLD" - exclude pending revisions from ECOs
483 				 with HOLD status
484 		"EXCLUDE_OPEN_HOLD" - exclude pending revisions from ECOs
485 				 with HOLD or OPEN status
486     examine_type "ALL" - all revisions
487 		"IMPL_ONLY" - only implemented revisions
488 		"PEND_ONLY" - only unimplemented revisions
489     org_id	organization id
490     item_id     item id
491     rev_date    date for which revision desired
492  OUTPUT
493     itm_rev		revision_id
494  RETURNS
495 
496  NOTES
497  ---------------------------------------------------------------------------*/
498 FUNCTION GET_ITEM_REVISION_ID_FN(
499 	eco_status		IN VARCHAR2 DEFAULT 'ALL',
500 	examine_type		IN VARCHAR2 DEFAULT 'ALL',
501 	org_id			IN NUMBER,
502 	item_id			IN NUMBER,
503 	rev_date		IN DATE
504 )
505 RETURN NUMBER IS
506     stmt_num    NUMBER;
507     itm_rev     VARCHAR2(3);
508     revision_id NUMBER;
509 
510     CURSOR ECO_STATUS_ITEM_REV IS
511 	SELECT REVISION_ID
512         FROM   MTL_ITEM_REVISIONS_B MIR, ENG_REVISED_ITEMS ERI
513         WHERE  MIR.INVENTORY_ITEM_ID = item_id
514         AND    MIR.ORGANIZATION_ID = org_id
515         AND    MIR.EFFECTIVITY_DATE <= rev_date
516         AND    MIR.REVISED_ITEM_SEQUENCE_ID = ERI.REVISED_ITEM_SEQUENCE_ID(+)
517         AND   (
518                  (eco_status = 'EXCLUDE_HOLD'
519                  AND  NVL(ERI.STATUS_TYPE,0) NOT IN (2)
520                  )
521                  OR
522                  (eco_status = 'EXCLUDE_OPEN_HOLD'
523                  AND  NVL(ERI.STATUS_TYPE,0) NOT IN (1,2)
524                  )
525               )
526          ORDER BY MIR.EFFECTIVITY_DATE DESC, MIR.REVISION DESC;
527 
528     CURSOR NO_ECO_ITEM_REV IS
529        SELECT REVISION_ID
530        FROM   MTL_ITEM_REVISIONS_B MIR
531        WHERE  INVENTORY_ITEM_ID = item_id
532        AND    ORGANIZATION_ID = org_id
533        AND    MIR.EFFECTIVITY_DATE <= rev_date
534        AND    ( (examine_type = 'ALL')
535                  OR
536 		(examine_type = 'IMPL_ONLY'
537                      AND IMPLEMENTATION_DATE IS NOT NULL
538                 )
539                  OR
540 		(examine_type = 'PEND_ONLY'
541                      AND IMPLEMENTATION_DATE IS NULL
542                 )
543               )
544         ORDER BY EFFECTIVITY_DATE DESC, REVISION DESC;
545 
546 BEGIN
547     IF (eco_status = 'EXCLUDE_HOLD' OR eco_status = 'EXCLUDE_OPEN_HOLD') THEN
548     	OPEN ECO_STATUS_ITEM_REV;
549 	stmt_num := 1;
550 
551     	FETCH ECO_STATUS_ITEM_REV INTO revision_id;
552     	IF ECO_STATUS_ITEM_REV%NOTFOUND THEN
553     	    CLOSE ECO_STATUS_ITEM_REV;
554 	    RETURN NULL;
555     	END IF;
556     	CLOSE ECO_STATUS_ITEM_REV;
557         RETURN revision_id;
558     ELSE
559 	OPEN NO_ECO_ITEM_REV;
560 	stmt_num := 2;
561     	FETCH NO_ECO_ITEM_REV INTO revision_id;
562 
563     	IF NO_ECO_ITEM_REV%NOTFOUND THEN
564     	    CLOSE NO_ECO_ITEM_REV;
565 	    RETURN NULL;
566     	END IF;
567     	CLOSE NO_ECO_ITEM_REV;
568         RETURN revision_id;
569     END IF;
570 
571 END GET_ITEM_REVISION_ID_FN;
572 
573 /* --------------------------- GET_ROUTING_REVISION ------------------------
574    NAME
575     GET_ROUTING_REVISION - retrieve routing revision for a date
576  DESCRIPTION
577     retrieve teh current revision for teh given date
578 
579  REQUIRES
580     org_id	organization id
581     item_id     item id
582     rev_date    date for which revision desired
583  OUTPUT
584     itm_rev		revision
585  RETURNS
586 
587  NOTES
588  ---------------------------------------------------------------------------*/
589 PROCEDURE GET_ROUTING_REVISION(
590 	eco_status		IN VARCHAR2 DEFAULT 'ALL',  -- BUG 3940863
591 	org_id			IN NUMBER,
592 	item_id			IN NUMBER,
593 	rev_date		IN DATE,
594 	itm_rev			 IN OUT NOCOPY  VARCHAR2,
595         examine_type            IN VARCHAR2 DEFAULT 'ALL'  -- BUG 3779027
596 )
597 IS
598 
599     stmt_num    NUMBER;
600 
601     -- Added Cursor for  BUG 3940863
602     CURSOR ECO_STATUS_RTG_REV IS
603 	SELECT PROCESS_REVISION
604         FROM   MTL_RTG_ITEM_REVISIONS MIR, ENG_REVISED_ITEMS ERI
605         WHERE  MIR.INVENTORY_ITEM_ID = item_id
606         AND    MIR.ORGANIZATION_ID = org_id
607         AND    MIR.EFFECTIVITY_DATE  <= rev_date  --Bug 3020310
608         AND    MIR.REVISED_ITEM_SEQUENCE_ID = ERI.REVISED_ITEM_SEQUENCE_ID(+)
609         AND   (
610                  (eco_status = 'EXCLUDE_HOLD'
611                  AND  NVL(ERI.STATUS_TYPE,0) NOT IN (2)
612                  )
613                  OR
614                  (eco_status = 'EXCLUDE_OPEN_HOLD'
615                  AND  NVL(ERI.STATUS_TYPE,0) NOT IN (1,2)
616                  )
617                  OR					-- BUG 4127493
618                 (eco_status = 'EXCLUDE_ALL'
619                  AND  NVL(ERI.STATUS_TYPE,0) IN (0,6)
620 		)
621               )
622          ORDER BY MIR.EFFECTIVITY_DATE DESC, MIR.PROCESS_REVISION DESC;
623 
624 
625     CURSOR RTG_REV IS
626 	SELECT PROCESS_REVISION
627 	FROM   MTL_RTG_ITEM_REVISIONS
628 	WHERE  INVENTORY_ITEM_ID = item_id
629 	AND    ORGANIZATION_ID = org_id
630 --	AND    trunc(EFFECTIVITY_DATE) <= trunc(rev_date)  -- changed for bug 2631052
631 	AND    EFFECTIVITY_DATE <= rev_date
632         AND    ( (examine_type = 'ALL')                    -- BUG 3779027
633                  OR
634                  (examine_type = 'IMPL_ONLY'
635                     AND IMPLEMENTATION_DATE IS NOT NULL
636                  )
637                  OR
638                  (examine_type = 'PEND_ONLY'
639                     AND IMPLEMENTATION_DATE IS NULL
640                  )
641                )
642 	ORDER BY EFFECTIVITY_DATE DESC, PROCESS_REVISION DESC;
643 
644 BEGIN
645 
646     -- Added IF conditions for BUG 3940863
647     IF (eco_status = 'EXCLUDE_HOLD' OR eco_status = 'EXCLUDE_OPEN_HOLD'
648            OR eco_status = 'EXCLUDE_ALL') THEN		-- BUG 4127493
649     	OPEN ECO_STATUS_RTG_REV;
650 	stmt_num := 1;
651     	FETCH ECO_STATUS_RTG_REV INTO itm_rev;
652     	  IF ECO_STATUS_RTG_REV%NOTFOUND THEN
653     	    CLOSE ECO_STATUS_RTG_REV;
654 	    RAISE_NO_REV_ERROR (
655 			org_id => org_id,
656 			part_id => item_id,
657 			rev_date => rev_date);
658     	  END IF;
659     	CLOSE ECO_STATUS_RTG_REV;
660     ELSE
661         OPEN RTG_REV;
662 	stmt_num := 2;
663         FETCH RTG_REV INTO itm_rev;
664           IF RTG_REV%NOTFOUND THEN
665     	    CLOSE RTG_REV;
666 	    RAISE_NO_REV_ERROR (
667 			org_id => org_id,
668 			part_id => item_id,
669 			rev_date => rev_date);
670           END IF;
671         CLOSE RTG_REV;
672     END IF;
673 
674 
675 END GET_ROUTING_REVISION;
676 
677 /* ------------------------------- GET_REVISION ---- ------------------------
678    NAME
679     GET_REVISION - retrieve item/routing revision for a date
680  DESCRIPTION
681     retrieve teh current revision for teh given date
682 
683  REQUIRES
684     type	"PART" - item revision
685 		"PROCESS" - routing revision
686     eco_status  "ALL" - all ECOs
687 		"EXCLUDE_HOLD" - exclude pending revisions from ECOs
688 				 with HOLD status
689 		"EXCLUDE_OPEN_HOLD" - exclude pending revisions from ECOs
690 				 with HOLD or OPEN status
691                 "EXCLUDE_ALL"   -  Exclude all revisions except the Implemented
692     examine_type "ALL" - all revisions
693 		"IMPL_ONLY" - only implemented revisions
694 		"PEND_ONLY" - only unimplemented revisions
695     org_id	organization id
696     item_id     item id
697     rev_date    date for which revision desired
698  OUTPUT
699     itm_rev		revision
700  RETURNS
701 
702  NOTES
703  ---------------------------------------------------------------------------*/
704 PROCEDURE GET_REVISION(
705 	type			IN VARCHAR2 DEFAULT 'PART',
706 	eco_status		IN VARCHAR2 DEFAULT 'ALL',
707 	examine_type		IN VARCHAR2 DEFAULT 'ALL',
708 	org_id			IN NUMBER,
709 	item_id			IN NUMBER,
710 	rev_date		IN DATE,
711 	itm_rev			 IN OUT NOCOPY  VARCHAR2
712 )
713 IS
714 BEGIN
715     IF (type = 'PART') THEN
716 	GET_ITEM_REVISION (
717 		eco_status,
718 		examine_type,
719 		org_id,
720 		item_id,
721 		rev_date,
722 		itm_rev);
723     ELSE
724 	GET_ROUTING_REVISION (
725 		eco_status,    -- BUG 3940863
726 		org_id,
727 		item_id,
728 		rev_date,
729 		itm_rev,
730                 examine_type            -- BUG 3779027
731                 );
732     END IF;
733 END GET_REVISION;
734 
735 
736 /* ------------------------------- COMPARE_REVISION ---------------------------
737    NAME
738     COMPARE_REVISION - compare 2 revisions
739  DESCRIPTION
740     compare 2 revisions
741 
742  REQUIRES
743     rev1	revision 1
744     rev2	revision 2
745  OUTPUT
746  RETURNS
747     0 if rev1 = rev2
748     1 if rev1 > rev2
749     2 if rev1 < rev2
750  NOTES
751  ---------------------------------------------------------------------------*/
752 FUNCTION COMPARE_REVISION(
753 	rev1			IN  VARCHAR2,
754 	rev2			IN  VARCHAR2
755 ) RETURN INTEGER
756 IS
757 BEGIN
758     IF ((rev1 is NULL OR rev1 = '') and
759         (rev2 is NULL OR rev2 = '')) THEN
760 	return(0);
761     END IF;
762 
763     IF rev1 = rev2 THEN
764 	RETURN (0);
765     END IF;
766 
767     IF (rev1 IS NULL OR rev1 = FND_API.G_MISS_CHAR) THEN
768 	RETURN(2);
769     ELSIF (rev2 IS NULL OR rev2 = FND_API.G_MISS_CHAR) THEN
770 	RETURN(1);
771     ELSIF (rev1 > rev2) THEN
772 	RETURN(2);
773     ELSE
774 	RETURN(1);
775     END IF;
776 
777 END COMPARE_REVISION;
778 
779 /* ------------------------------- GET_REV_DATE ---- ------------------------
780    NAME
781     GET_REV_DATE - retrieve date for given revision
782  DESCRIPTION
783     retrieve revision start date for given revision
784 
785  REQUIRES
786     type	"PART" - item revision
787 		"PROCESS" - routing revision
788     org_id	organization id
789     item_id     item id
790     itm_rev		revision
791  OUTPUT
792     rev_date    effecitive date of revision
793  RETURNS
794 
795  NOTES
796  ---------------------------------------------------------------------------*/
797 PROCEDURE GET_REV_DATE (
798 	type			IN VARCHAR2 DEFAULT 'PART',
799 	org_id			IN NUMBER,
800 	item_id			IN NUMBER,
801 	itm_rev			IN VARCHAR2,
802 	rev_date		 IN OUT NOCOPY  DATE
803 )
804 IS
805     CURSOR ITEM_REV IS
806         SELECT  EFFECTIVITY_DATE
807         FROM    MTL_ITEM_REVISIONS_B
808         WHERE   INVENTORY_ITEM_ID = item_id
809         AND     REVISION = itm_rev
810         AND     ORGANIZATION_ID = org_id;
811 
812     CURSOR RTG_REV IS
813         SELECT  EFFECTIVITY_DATE
814         FROM    MTL_RTG_ITEM_REVISIONS
815         WHERE   INVENTORY_ITEM_ID = item_id
816         AND     PROCESS_REVISION = itm_rev
817         AND     ORGANIZATION_ID = org_id;
818 
819 BEGIN
820     IF (type = 'PART') THEN
821 	OPEN ITEM_REV;
822 	FETCH ITEM_REV INTO rev_date;
823 	IF (ITEM_REV%NOTFOUND) THEN
824 	    CLOSE ITEM_REV;
825 	    FND_MESSAGE.SET_NAME('BOM', 'BOM_GET_REVDATE');
826 	    FND_MESSAGE.SET_TOKEN('REVISION', itm_rev);
827 	    APP_EXCEPTION.RAISE_EXCEPTION;
828 	END IF;
829 	CLOSE ITEM_REV;
830     ELSE /* IF (type = PROCESS) THEN */
831 	OPEN RTG_REV;
832 	FETCH RTG_REV INTO rev_date;
833 	IF (ITEM_REV%NOTFOUND) THEN
834 	    CLOSE RTG_REV;
835 	    FND_MESSAGE.SET_NAME('BOM', 'BOM_GET_REVDATE');
836 	    FND_MESSAGE.SET_TOKEN('REVISION', itm_rev);
837 	    APP_EXCEPTION.RAISE_EXCEPTION;
838 	END IF;
839 	CLOSE RTG_REV;
840     END IF;
841 
842 EXCEPTION
843     WHEN OTHERS THEN
844 	RAISE_REVISION_ERROR (
845 		func_name => 'GET_REV_DATE',
846 		stmt_num  => 1);
847 END GET_REV_DATE;
848 
849 /* ------------------------------- GET_HIGH_DATE ---- ------------------------
850    NAME
851     GET_HIGH_DATE - retreive the high date of the revision
852  DESCRIPTION
853     retrieve the high date of the revision.  For the greatest rev, high
854     date is greater of sysdate, effective_date for the revision
855 
856  REQUIRES
857     type	"PART" - item revision
858 		"PROCESS" - routing revision
859     org_id	organization id
860     item_id     item id
861     eco_status  "ALL" - all ECOs
862 		"EXCLUDE_HOLD" - exclude pending revisions from ECOs
863 				 with HOLD status
864 		"EXCLUDE_OPEN_HOLD" - exclude pending revisions from ECOs
865 				 with HOLD or OPEN status
866                 "EXCLUDE_ALL"   -  Exclude all revisions except the Implemented
867  OUTPUT
868     itm_rev		revision
869     rev_date    high date
870  RETURNS
871 
872  NOTES
873  ---------------------------------------------------------------------------*/
874 PROCEDURE GET_HIGH_DATE (
875 	type			IN VARCHAR2 DEFAULT 'PART',
876 	org_id			IN NUMBER,
877 	item_id			IN NUMBER,
878 	eco_status		IN VARCHAR2,
879 	itm_rev			IN VARCHAR2,
880 	rev_date	        IN OUT NOCOPY DATE
881 )
882 IS
883     stmt_num	INTEGER;
884     l_rev_date  DATE;
885     l_item_name MTL_SYSTEM_ITEMS_VL.CONCATENATED_SEGMENTS%TYPE;
886 
887 BEGIN
888     IF (type = 'PART') THEN
889         IF (eco_status = 'EXCLUDE_HOLD' OR
890                  eco_status = 'EXCLUDE_OPEN_HOLD' OR
891                   eco_status  = 'EXCLUDE_ALL') THEN
892 	    stmt_num := 1;
893             SELECT MIN(A.EFFECTIVITY_DATE - 60/(60*60*24))
894                  INTO   l_rev_date
895                  FROM   MTL_ITEM_REVISIONS_B A
896                  WHERE  A.INVENTORY_ITEM_ID = item_id
897                  AND    A.ORGANIZATION_ID = org_id
898                  AND    A.EFFECTIVITY_DATE >
899                            (SELECT EFFECTIVITY_DATE
900                             FROM   MTL_ITEM_REVISIONS_B
901                             WHERE  INVENTORY_ITEM_ID = item_id
902                             AND    ORGANIZATION_ID = org_id
903                             AND    REVISION = itm_rev
904                            )
905                  AND    NOT EXISTS
906                           ( SELECT 'X'
907                             FROM   ENG_REVISED_ITEMS B
908                             WHERE  A.REVISED_ITEM_SEQUENCE_ID =
909                                        B.REVISED_ITEM_SEQUENCE_ID
910                             AND
911                             (
912                                (eco_status = 'EXCLUDE_HOLD'
913                                   AND  B.STATUS_TYPE = 2
914                                )
915                                OR
916                                (eco_status = 'EXCLUDE_OPEN_HOLD'
917                                   AND  B.STATUS_TYPE IN (1,2)
918                                )
919                                OR
920                               (eco_status = 'EXCLUDE_ALL'
921                                   AND  B.STATUS_TYPE = 6
922                                )
923                             )
924                           );
925             ELSE
926 		stmt_num := 2;
927                  SELECT MIN(EFFECTIVITY_DATE - 60/(60*60*24))
928                  INTO   l_rev_date
929                  FROM   MTL_ITEM_REVISIONS_B
930                  WHERE  INVENTORY_ITEM_ID = item_id
931                  AND    ORGANIZATION_ID = org_id
932                  AND    EFFECTIVITY_DATE >
933                            (SELECT EFFECTIVITY_DATE
934                             FROM   MTL_ITEM_REVISIONS_B
935                             WHERE  INVENTORY_ITEM_ID = item_id
936                             AND    ORGANIZATION_ID = org_id
937                             AND    REVISION = itm_rev
938                            );
939 	    END IF;
940     ELSE
941 	stmt_num := 3;
942 	SELECT MIN(EFFECTIVITY_DATE - 1/(60*60*24))
943         INTO   l_rev_date
944         FROM   MTL_RTG_ITEM_REVISIONS
945         WHERE  INVENTORY_ITEM_ID = item_id
946         AND    ORGANIZATION_ID = org_id
947         AND    EFFECTIVITY_DATE >
948                (SELECT EFFECTIVITY_DATE
949                 FROM   MTL_RTG_ITEM_REVISIONS
950                 WHERE  INVENTORY_ITEM_ID = item_id
951                 AND    ORGANIZATION_ID = org_id
952                 AND    PROCESS_REVISION = itm_rev);
953 /*
954 	SELECT MIN(EFFECTIVITY_DATE - 60/(60*60*24))  -- changed for bug 2631052
955         INTO   l_rev_date
956         FROM   MTL_RTG_ITEM_REVISIONS
957         WHERE  INVENTORY_ITEM_ID = item_id
958         AND    ORGANIZATION_ID = org_id
959         AND    trunc(EFFECTIVITY_DATE) >
960                (SELECT trunc(EFFECTIVITY_DATE)
961                 FROM   MTL_RTG_ITEM_REVISIONS
962                 WHERE  INVENTORY_ITEM_ID = item_id
963                 AND    ORGANIZATION_ID = org_id
964                 AND    PROCESS_REVISION = itm_rev);
965 */
966     END IF;
967 
968     IF l_rev_date is NULL THEN
969 /*
970 ** implies that rev is the last rev.  So, if today < eff_date, then
971 ** return eff_date, else return today
972 */
973 
974  	IF (type = 'PART') THEN
975 	    stmt_num := 4;
976             SELECT GREATEST(EFFECTIVITY_DATE,SYSDATE)
977             INTO   l_rev_date
978             FROM   MTL_ITEM_REVISIONS_B
979             WHERE  INVENTORY_ITEM_ID = item_id
980             AND    ORGANIZATION_ID = org_id
981             AND    REVISION = itm_rev;
982 	ELSE
983 	    stmt_num := 5;
984             SELECT GREATEST(EFFECTIVITY_DATE,SYSDATE)
985             INTO   l_rev_date
986             FROM   MTL_RTG_ITEM_REVISIONS
987             WHERE  INVENTORY_ITEM_ID = item_id
988             AND    ORGANIZATION_ID = org_id
989             AND    PROCESS_REVISION = itm_rev;
990 	END IF;
991     END IF;
992 
993     rev_date := l_rev_date;
994 
995 EXCEPTION
996     WHEN NO_DATA_FOUND THEN
997 /*
998 ** display message to say item rev not valid
999 ** Name: MFG_NOT_VALID
1000 ** ENTITY: itm_rev
1001 	FND_MESSAGE.SET_NAME('INV', 'INV_NOT_VALID');
1002 	FND_MESSAGE.SET_TOKEN('ENTITY', itm_rev);
1003 	APP_EXCEPTION.RAISE_EXCEPTION;
1004 */
1005     -- bug:2120090 Raise meaningful error as Revision does not exist.
1006     -- Get the Item Name from Id
1007     SELECT  msivl.CONCATENATED_SEGMENTS
1008     INTO    l_item_name
1009     FROM    MTL_SYSTEM_ITEMS_VL msivl
1010     WHERE   msivl.INVENTORY_ITEM_ID = item_id
1011     AND     msivl.ORGANIZATION_ID   = org_id;
1012 
1013     FND_MESSAGE.SET_NAME('BOM', 'BOM_REVISION_DOESNOT_EXIST');
1014     FND_MESSAGE.SET_TOKEN('REVISION', itm_rev);
1015     FND_MESSAGE.SET_TOKEN('ASSEMBLY_ITEM_NAME', l_item_name);
1016 
1017     APP_EXCEPTION.RAISE_EXCEPTION;
1018 
1019     WHEN OTHERS THEN
1020 	RAISE_REVISION_ERROR (
1021 		func_name => 'GET_HIGH_DATE',
1022 		stmt_num  => stmt_num);
1023 END GET_HIGH_DATE;
1024 
1025 /* ---------------------------- GET_HIGH_REV_DATE ---- ------------------------
1026    NAME
1027     GET_HIGH_REV_DATE - retrieve highest rev and its high date
1028  DESCRIPTION
1029     retrievehighest revsion adn its high date
1030 
1031  REQUIRES
1032     type	"PART" - item revision
1033 		"PROCESS" - routing revision
1034     examine_type "ALL" - all revisions
1035 		"IMPL_ONLY" - only implemented revisions
1036 		"PEND_ONLY" - only unimplemented revisions
1037     org_id	organization id
1038     item_id     item id
1039  OUTPUT
1040     rev_date    high date for revision
1041     itm_rev		highest revision
1042  RETURNS
1043 
1044  NOTES
1045  ---------------------------------------------------------------------------*/
1046 PROCEDURE GET_HIGH_REV_DATE(
1047 	type			IN VARCHAR2 DEFAULT 'PART',
1048 	examine_type		IN VARCHAR2 DEFAULT 'ALL',
1049 	org_id			IN NUMBER,
1050 	item_id			IN NUMBER,
1051 	rev_date		 IN OUT NOCOPY  DATE,
1052 	itm_rev			 IN OUT NOCOPY  VARCHAR2
1053 )
1054 IS
1055     l_rev	MTL_ITEM_REVISIONS_B.REVISION%TYPE;
1056 
1057     CURSOR ITEM_REV IS
1058        SELECT REVISION
1059        FROM   MTL_ITEM_REVISIONS_B
1060        WHERE  INVENTORY_ITEM_ID = item_id
1061        AND    ORGANIZATION_ID = org_id
1062        AND    (
1063                 (examine_type = 'ALL')
1064                 OR
1065 		(examine_type = 'IMPL_ONLY'
1066                    AND IMPLEMENTATION_DATE IS NOT NULL
1067                 )
1068                 OR
1069 	 	(examine_type = 'PEND_ONLY'
1070                    AND IMPLEMENTATION_DATE IS NULL
1071                 )
1072               )
1073        ORDER BY EFFECTIVITY_DATE DESC, REVISION DESC;
1074 
1075     CURSOR RTG_REV IS
1076        SELECT PROCESS_REVISION
1077        FROM   MTL_RTG_ITEM_REVISIONS
1078        WHERE  INVENTORY_ITEM_ID = item_id
1079        AND    ORGANIZATION_ID = org_id
1080        AND    (
1081                 (examine_type = 'ALL')
1082                 OR
1083 		(examine_type = 'IMPL_ONLY'
1084                    AND IMPLEMENTATION_DATE IS NOT NULL
1085                 )
1086                 OR
1087 	 	(examine_type = 'IMPL_AND_PEND'
1088                    AND IMPLEMENTATION_DATE IS NULL
1089                 )
1090               )
1091        ORDER BY EFFECTIVITY_DATE DESC, PROCESS_REVISION DESC;
1092 
1093 BEGIN
1094     IF (type = 'PART') THEN
1095 	OPEN ITEM_REV;
1096 	FETCH ITEM_REV INTO l_rev;
1097 	IF ITEM_REV%NOTFOUND THEN
1098 	    CLOSE ITEM_REV;
1099 	    FND_MESSAGE.SET_NAME('BOM', 'BOM_GET_REV_DATE');
1100 	    APP_EXCEPTION.RAISE_EXCEPTION;
1101 	END IF;
1102 	CLOSE ITEM_REV;
1103     ELSE
1104 	OPEN RTG_REV;
1105 	FETCH RTG_REV INTO l_rev;
1106 	IF RTG_REV%NOTFOUND THEN
1107 	    CLOSE RTG_REV;
1108 	    FND_MESSAGE.SET_NAME('BOM', 'BOM_GET_REV_DATE');
1109 	    APP_EXCEPTION.RAISE_EXCEPTION;
1110 	END IF;
1111 	CLOSE RTG_REV;
1112 
1113     END IF;
1114 
1115     itm_rev	:= l_rev;
1116 
1117     GET_HIGH_DATE(
1118 	type		=> type,
1119 	org_id		=> org_id,
1120 	item_id		=> item_id,
1121 	eco_status	=> 'ALL',
1122 	itm_rev		=> l_rev,
1123 	rev_date	=> rev_date);
1124 
1125 EXCEPTION
1126     WHEN OTHERS THEN
1127 	RAISE_REVISION_ERROR (
1128 		func_name => 'GET_HIGH_REV_DATE',
1129 		stmt_num  => 1);
1130 END GET_HIGH_REV_DATE;
1131 
1132 FUNCTION GET_ITEM_REV_HIGHDATE(
1133         p_revision_id  IN NUMBER) RETURN DATE
1134 IS
1135   l_date DATE;
1136 BEGIN
1137 
1138   SELECT high_date INTO l_date FROM mtl_item_rev_highdate_v WHERE revision_id = p_revision_id;
1139   return l_date;
1140 
1141   EXCEPTION WHEN OTHERS THEN
1142     return null;
1143 END;
1144 
1145 
1146 END BOM_REVISIONS;