DBA Data[Home] [Help]

PACKAGE BODY: APPS.ENG_VALIDATE

Source


1 PACKAGE BODY ENG_Validate AS
2 /* $Header: ENGSVATB.pls 120.3 2006/06/06 12:40:09 vkeerthi noship $ */
3 
4 --  Global constant holding the package name
5 
6 G_PKG_NAME      CONSTANT VARCHAR2(30) := 'ENG_Validate';
7 ret_code                 NUMBER;
8 
9 --  Procedure Get_Attr_Tbl.
10 --
11 --  Used by generator to avoid overriding or duplicating existing
12 --  validation functions.
13 --
14 --  DO NOT REMOVE
15 
16 PROCEDURE Get_Attr_Tbl
17 IS
18 I                             NUMBER:=0;
19 BEGIN
20 
21     FND_API.g_attr_tbl.DELETE;
22 
23 --  START GEN attributes
24 
25 --  Generator will append new attributes before end generate comment.
26 
27     I := I + 1;
28     FND_API.g_attr_tbl(I).name     := 'Desc_Flex';
29     I := I + 1;
30     FND_API.g_attr_tbl(I).name     := 'request';
31     I := I + 1;
32     FND_API.g_attr_tbl(I).name     := 'program_application';
33     I := I + 1;
34     FND_API.g_attr_tbl(I).name     := 'program';
35     I := I + 1;
36     FND_API.g_attr_tbl(I).name     := 'program_update_date';
37     I := I + 1;
38     FND_API.g_attr_tbl(I).name     := 'approval_status_type';
39     I := I + 1;
40     FND_API.g_attr_tbl(I).name     := 'approval_date';
41     I := I + 1;
42     FND_API.g_attr_tbl(I).name     := 'approval_list';
43     I := I + 1;
44     FND_API.g_attr_tbl(I).name     := 'change_order_type';
45     I := I + 1;
46     FND_API.g_attr_tbl(I).name     := 'responsible_org';
47     I := I + 1;
48     FND_API.g_attr_tbl(I).name     := 'approval_request_date';
49     I := I + 1;
50     FND_API.g_attr_tbl(I).name     := 'change_notice';
51     I := I + 1;
52     FND_API.g_attr_tbl(I).name     := 'organization';
53     I := I + 1;
54     FND_API.g_attr_tbl(I).name     := 'last_update_date';
55     I := I + 1;
56     FND_API.g_attr_tbl(I).name     := 'last_updated_by';
57     I := I + 1;
58     FND_API.g_attr_tbl(I).name     := 'creation_date';
59     I := I + 1;
60     FND_API.g_attr_tbl(I).name     := 'created_by';
61     I := I + 1;
62     FND_API.g_attr_tbl(I).name     := 'last_update_login';
63     I := I + 1;
64     FND_API.g_attr_tbl(I).name     := 'description';
65     I := I + 1;
66     FND_API.g_attr_tbl(I).name     := 'status_type';
67     I := I + 1;
68     FND_API.g_attr_tbl(I).name     := 'initiation_date';
69     I := I + 1;
70     FND_API.g_attr_tbl(I).name     := 'implementation_date';
71     I := I + 1;
72     FND_API.g_attr_tbl(I).name     := 'cancellation_date';
73     I := I + 1;
74     FND_API.g_attr_tbl(I).name     := 'cancellation_comments';
75     I := I + 1;
76     FND_API.g_attr_tbl(I).name     := 'priority';
77     I := I + 1;
78     FND_API.g_attr_tbl(I).name     := 'reason';
79     I := I + 1;
80     FND_API.g_attr_tbl(I).name     := 'estimated_eng_cost';
81     I := I + 1;
82     FND_API.g_attr_tbl(I).name     := 'estimated_mfg_cost';
83     I := I + 1;
84     FND_API.g_attr_tbl(I).name     := 'requestor';
85 
86     I := I + 1;
87     FND_API.g_attr_tbl(I).name     := 'revision';
88     I := I + 1;
89     FND_API.g_attr_tbl(I).name     := 'rev';
90     I := I + 1;
91     FND_API.g_attr_tbl(I).name     := 'comments';
92 
93     I := I + 1;
94     FND_API.g_attr_tbl(I).name     := 'using_assembly';
95     I := I + 1;
96     FND_API.g_attr_tbl(I).name     := 'revised_item';
97     I := I + 1;
98     FND_API.g_attr_tbl(I).name     := 'cancel_comments';
99     I := I + 1;
100     FND_API.g_attr_tbl(I).name     := 'disposition_type';
101     I := I + 1;
102     FND_API.g_attr_tbl(I).name     := 'new_item_revision';
103     I := I + 1;
104     FND_API.g_attr_tbl(I).name     := 'early_schedule_date';
105     I := I + 1;
106     FND_API.g_attr_tbl(I).name     := 'scheduled_date';
107     I := I + 1;
108     FND_API.g_attr_tbl(I).name     := 'bill_sequence';
109     I := I + 1;
110     FND_API.g_attr_tbl(I).name     := 'mrp_active';
111     I := I + 1;
112     FND_API.g_attr_tbl(I).name     := 'update_wip';
113     I := I + 1;
114     FND_API.g_attr_tbl(I).name     := 'use_up';
115     I := I + 1;
116     FND_API.g_attr_tbl(I).name     := 'use_up_item';
117     I := I + 1;
118     FND_API.g_attr_tbl(I).name     := 'revised_item_sequence';
119     I := I + 1;
120     FND_API.g_attr_tbl(I).name     := 'use_up_plan_name';
121     I := I + 1;
122     FND_API.g_attr_tbl(I).name     := 'descriptive_text';
123     I := I + 1;
124     FND_API.g_attr_tbl(I).name     := 'auto_implement_date';
125 
126     I := I + 1;
127     FND_API.g_attr_tbl(I).name     := 'supply_subinventory';
128     I := I + 1;
129     FND_API.g_attr_tbl(I).name     := 'op_lead_time_percent';
130     I := I + 1;
131     FND_API.g_attr_tbl(I).name     := 'cost_factor';
132     I := I + 1;
133     FND_API.g_attr_tbl(I).name     := 'required_for_revenue';
134     I := I + 1;
135     FND_API.g_attr_tbl(I).name     := 'high_quantity';
136     I := I + 1;
137     FND_API.g_attr_tbl(I).name     := 'component_sequence';
138     I := I + 1;
139     FND_API.g_attr_tbl(I).name     := 'wip_supply_type';
140     I := I + 1;
141     FND_API.g_attr_tbl(I).name     := 'supply_locator';
142     I := I + 1;
143     FND_API.g_attr_tbl(I).name     := 'bom_item_type';
144     I := I + 1;
145     FND_API.g_attr_tbl(I).name     := 'operation_seq_num';
146     I := I + 1;
147     FND_API.g_attr_tbl(I).name     := 'component_item';
148     I := I + 1;
149     FND_API.g_attr_tbl(I).name     := 'item_num';
150     I := I + 1;
151     FND_API.g_attr_tbl(I).name     := 'component_quantity';
152     I := I + 1;
153     FND_API.g_attr_tbl(I).name     := 'component_yield_factor';
154     I := I + 1;
155     FND_API.g_attr_tbl(I).name     := 'component_remarks';
156     I := I + 1;
157     FND_API.g_attr_tbl(I).name     := 'effectivity_date';
158     I := I + 1;
159     FND_API.g_attr_tbl(I).name     := 'disable_date';
160     I := I + 1;
161     FND_API.g_attr_tbl(I).name     := 'planning_factor';
162     I := I + 1;
163     FND_API.g_attr_tbl(I).name     := 'quantity_related';
164     I := I + 1;
165     FND_API.g_attr_tbl(I).name     := 'so_basis';
166     I := I + 1;
167     FND_API.g_attr_tbl(I).name     := 'optional';
168     I := I + 1;
169     FND_API.g_attr_tbl(I).name     := 'mutually_exclusive_opt';
170     I := I + 1;
171     FND_API.g_attr_tbl(I).name     := 'include_in_cost_rollup';
172     I := I + 1;
173     FND_API.g_attr_tbl(I).name     := 'check_atp';
174     I := I + 1;
175     FND_API.g_attr_tbl(I).name     := 'shipping_allowed';
176     I := I + 1;
177     FND_API.g_attr_tbl(I).name     := 'required_to_ship';
178     I := I + 1;
179     FND_API.g_attr_tbl(I).name     := 'include_on_ship_docs';
180     I := I + 1;
181     FND_API.g_attr_tbl(I).name     := 'include_on_bill_docs';
182     I := I + 1;
183     FND_API.g_attr_tbl(I).name     := 'low_quantity';
184     I := I + 1;
185     FND_API.g_attr_tbl(I).name     := 'acd_type';
186     I := I + 1;
187     FND_API.g_attr_tbl(I).name     := 'old_component_sequence';
188     I := I + 1;
189     FND_API.g_attr_tbl(I).name     := 'pick_components';
190 
191     I := I + 1;
192     FND_API.g_attr_tbl(I).name     := 'ref_designator';
193     I := I + 1;
194     FND_API.g_attr_tbl(I).name     := 'ref_designator_comment';
195 
196     I := I + 1;
197     FND_API.g_attr_tbl(I).name     := 'substitute_component';
198     I := I + 1;
199     FND_API.g_attr_tbl(I).name     := 'substitute_item_quantity';
200 
201 
202 --  END GEN attributes
203 
204 END Get_Attr_Tbl;
205 
206 --  Prototypes for validate functions.
207 
208 --  START GEN validate
209 
210 --  Generator will append new prototypes before end generate
211 --  comment.
212 
213 
214 FUNCTION Desc_Flex ( p_flex_name IN VARCHAR2 )
215 RETURN BOOLEAN
216 IS
217 BEGIN
218 
219     RETURN TRUE;
220 
221 END Desc_Flex;
222 
223 /***************************************************************************
224 *
225 *
226 *
227 *
228 *
229 *
230 ***************************************************************************/
231 FUNCTION Approval_Status_Type (  p_approval_status_type IN  NUMBER
232                                , x_err_text             OUT NOCOPY VARCHAR2
233                                )
234 RETURN BOOLEAN
235 IS
236 l_dummy        VARCHAR2(10);
237 BEGIN
238 
239     IF p_approval_status_type IS NULL OR
240         p_approval_status_type = FND_API.G_MISS_NUM
241     THEN
242         RETURN TRUE;
243     END IF;
244 
245     SELECT 'VALID'
246       INTO l_dummy
247       FROM mfg_lookups
248      WHERE lookup_type = 'ENG_ECN_APPROVAL_STATUS'
249        AND lookup_code = p_approval_status_type;
250 
251     RETURN TRUE;
252 
253 EXCEPTION
254 
255     WHEN NO_DATA_FOUND THEN
256         --  Should log error message ENG_APPROVAL_STATUS_INVALID
257         RETURN FALSE;
258 
259     WHEN OTHERS THEN
260         x_err_text := 'An unexpected error occured in ' || G_PKG_NAME ||
261                       ' and procedure Approval_Status_Type ' || SQLERRM;
262         RETURN FALSE;
263 
264 END Approval_Status_Type;
265 
266 /***************************************************************************
267 *
268 *
269 *
270 *
271 *
272 *
273 ***************************************************************************/
274 FUNCTION Approval_Date (  p_approval_date       IN  DATE
275                         , x_err_text            OUT NOCOPY VARCHAR2
276                         )
277 RETURN BOOLEAN
278 IS
279 l_dummy                       VARCHAR2(10);
280 BEGIN
281 
282     IF p_approval_date IS NULL OR
283         p_approval_date = FND_API.G_MISS_DATE
284     THEN
285         RETURN TRUE;
286     END IF;
287 
288     IF p_approval_date > SYSDATE
289     THEN
290      RETURN FALSE;
291     END IF;
292 
293     RETURN TRUE;
294 
295 END Approval_Date;
296 
297 /***************************************************************************
298 *
299 *
300 *
301 *
302 *
303 *
304 ***************************************************************************/
305 FUNCTION Approval_List (  p_approval_list_id    IN  NUMBER
306                         , x_err_text            OUT NOCOPY VARCHAR2
307                         )
308 RETURN BOOLEAN
309 IS
310 l_dummy                       VARCHAR2(10);
311 BEGIN
312 
313     IF p_approval_list_id IS NULL OR
314         p_approval_list_id = FND_API.G_MISS_NUM
315     THEN
316         RETURN TRUE;
317     END IF;
318 
319     SELECT  'VALID'
320     INTO     l_dummy
321     FROM     eng_ecn_approval_lists
322     WHERE    approval_list_id = p_approval_list_id;
323 
324     RETURN TRUE;
325 
326 EXCEPTION
327 
328     WHEN NO_DATA_FOUND THEN
329 
330         -- Should log error ENG_APPROVAL_LIST_INVALID
331         RETURN FALSE;
332 
333     WHEN OTHERS THEN
334         x_err_text := 'An unexpected error occured in ' || G_PKG_NAME ||
335                       ' and procedure Approval_List ' || SQLERRM;
336 
337         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
338 
339 END Approval_List;
340 
341 /***************************************************************************
342 *
343 *
344 *
345 *
346 *
347 *
348 ***************************************************************************/
349 FUNCTION Change_Order_Type (  p_change_order_type_id IN  NUMBER
350                             , x_err_text             OUT NOCOPY VARCHAR2
351                            )
352 RETURN BOOLEAN
353 IS
354 l_dummy                       VARCHAR2(10);
355 BEGIN
356 
357     IF p_change_order_type_id IS NULL OR
358         p_change_order_type_id = FND_API.G_MISS_NUM
359     THEN
360         RETURN TRUE;
361     END IF;
362 
363     SELECT  'VALID'
364     INTO     l_dummy
365     FROM     eng_change_order_types
366     WHERE    change_order_type_id = p_change_order_type_id
367              AND NVL(disable_date, SYSDATE + 1) > SYSDATE;
368 
369     RETURN TRUE;
370 
371 EXCEPTION
372 
373     WHEN NO_DATA_FOUND THEN
374 
375         -- Should log error message ENG_CHANGE_ORDER_TYPE_INVALID
376         RETURN FALSE;
377 
378     WHEN OTHERS THEN
379         x_err_text := 'An unexpected error occured in ' || G_PKG_NAME ||
380                       ' and procedure Change_Order_Type ' || SQLERRM;
381         RETURN FALSE;
382 
383 END Change_Order_Type;
384 
385 /***************************************************************************
386 *
387 *
388 *
389 *
390 *
391 *
392 ***************************************************************************/
393 FUNCTION Responsible_Org (  p_responsible_org_id        IN  NUMBER
394                           , p_current_org_id            IN  NUMBER
395                           , x_err_text                  OUT NOCOPY VARCHAR2
396                           )
397 RETURN BOOLEAN
398 IS
399 l_dummy                       VARCHAR2(10);
400 BEGIN
401 
402     IF p_responsible_org_id IS NULL OR
403         p_responsible_org_id = FND_API.G_MISS_NUM
404     THEN
405         RETURN TRUE;
406     END IF;
407     -- Bug 4947849
408     -- The following query has been fixed to fetch valid departments immaterial of the business group in context.
409     -- The view hr_organization_units in iteself is restricted based on the profile HR: Cross Business group
410     -- Value and per_business_group_id in context if the prior value is N.
411     -- Also , it is being assumed here that the user will login to Oracle Appliction for doing an import from
412     -- 11.5.10 onwards because Change Import concurrent pogram is used. Otherwise the query should return all
413     -- departments
414     SELECT  'VALID'
415     INTO     l_dummy
416     FROM     hr_organization_units hou
417 	  --   ,org_organization_definitions org_def
418     WHERE    hou.organization_id = p_responsible_org_id
419    --   AND    org_def.organization_id =   p_current_org_id
420    --   AND    org_def.business_group_id = hou.business_group_id
421     AND      EXISTS
422                 (select null
423                  from   hr_organization_information hoi
424                  where  hoi.organization_id = hou.organization_id
425                  and    hoi.org_information_context = 'CLASS'
426                  and    hoi.org_information1 = 'BOM_ECOD'
427                  and    hoi.org_information2 = 'Y');
428     RETURN TRUE;
429 
430 EXCEPTION
431 
432     WHEN NO_DATA_FOUND THEN
433 
434         -- Should log an error ENG_RESP_ORG_ID_INVALID
435         RETURN FALSE;
436 
437     WHEN OTHERS THEN
438         x_err_text := 'An unexpected error occured in ' || G_PKG_NAME ||
439                       ' and procedure Responsible_Org ' || SQLERRM;
440 
441         RETURN FALSE;
442 
443 END Responsible_Org;
444 
445 /***************************************************************************
446 *
447 *
448 *
449 *
450 *
451 *
452 ***************************************************************************/
453 FUNCTION Approval_Request_Date (  p_approval_request_date IN  DATE
454                                 , x_err_text              OUT NOCOPY VARCHAR2
455                                 )
456 RETURN BOOLEAN
457 IS
458 l_dummy                       VARCHAR2(10);
459 BEGIN
460 
461     IF p_approval_request_date IS NULL OR
462         p_approval_request_date = FND_API.G_MISS_DATE
463     THEN
464         RETURN TRUE;
465     END IF;
466 
467     IF p_approval_request_date > SYSDATE
468     THEN
469      RETURN FALSE;
470     END IF;
471 
472     RETURN TRUE;
473 
474 END Approval_Request_Date;
475 
476 /*****************************************************************************
477 *
478 *
479 *
480 *
481 *
482 *
483 *****************************************************************************/
484 FUNCTION Status_Type (  p_status_type IN  NUMBER
485                       , x_err_text    OUT NOCOPY VARCHAR2 )
486 RETURN BOOLEAN
487 IS
488 l_dummy                       VARCHAR2(10);
489 l_err_text      VARCHAR2(2000) := NULL;
490 BEGIN
491 
492     IF p_status_type IS NULL OR
493         p_status_type = FND_API.G_MISS_NUM
494     THEN
495         RETURN TRUE;
496     END IF;
497 
498     --SELECT  'VALID'
499     --INTO     l_dummy
500     --FROM     mfg_lookups
501     --WHERE    lookup_type = 'ECG_ECN_STATUS'
502     --      and lookup_code = p_status_type;
503 
504     SELECT  'VALID'
505     INTO     l_dummy
506     FROM     eng_change_statuses
507     WHERE    status_code = p_status_type;
508 
509     RETURN TRUE;
510 
511 EXCEPTION
512 
513     WHEN NO_DATA_FOUND THEN
514 
515         RETURN FALSE;
516 
517     WHEN OTHERS THEN
518         x_err_text := 'An unexpected error occured in ' || G_PKG_NAME ||
519                       ' and procedure Status_Type ' || SQLERRM ;
520 
521         RETURN FALSE;
522 
523 END Status_Type;
524 
525 /****************************************************************************
526 * Function      : End_Item_Unit_Number
527 * Parameters IN : p_From_End_Item_Unit_Number
528 * Parameters OUT: Error Text which will be pouplated in case of an
529 *                 unexpected error.
530 *
531 * Return        : True if the from end item unit number is valid else False
532 * Purpose       : Verify that the from end item unit number exists
533 *                 in the table PJM_MODEL_UNIT_NUMBERS.
534 ****************************************************************************/
535 FUNCTION End_Item_Unit_Number
536 ( p_from_end_item_unit_number IN  VARCHAR2
537 , p_revised_item_id           IN  NUMBER
538 , x_err_text                  OUT NOCOPY VARCHAR2 )
539 RETURN BOOLEAN
540 IS
541 l_dummy         VARCHAR2(10);
542 l_err_text      VARCHAR2(2000) := NULL;
543 BEGIN
544 
545     IF p_from_end_item_unit_number IS NULL OR
546         p_from_end_item_unit_number = FND_API.G_MISS_CHAR
547     THEN
548         RETURN TRUE;
549     END IF;
550 
551     --Commented out on Oct 3, 1002 by ragreenw to match bom
552     -- equivalent package code
553     SELECT  'VALID'
554     INTO     l_dummy
555     FROM     pjm_unit_numbers
556     --WHERE    end_item_id = p_revised_item_id
557     WHERE    unit_number = p_from_end_item_unit_number;
558 
559     RETURN TRUE;
560 
561 EXCEPTION
562 
563     WHEN NO_DATA_FOUND THEN
564 
565         RETURN FALSE;
566 
567     WHEN OTHERS THEN
568         x_err_text := 'An unexpected error occured in ' || G_PKG_NAME ||
569                       ' and procedure From End Item Unit Number'
570                       || SQLERRM ;
571 
572         RETURN FALSE;
573 
574 END End_Item_Unit_Number;
575 
576 /****************************************************************************
577 *
578 *
579 *
580 *
581 *
582 *
583 ****************************************************************************/
584 FUNCTION Initiation_Date (  p_initiation_date   IN  DATE
585                           , x_err_text          OUT NOCOPY VARCHAR2
586                           )
587 RETURN BOOLEAN
588 IS
589 l_dummy                       VARCHAR2(10);
590 BEGIN
591 
592     IF p_initiation_date IS NULL OR
593         p_initiation_date = FND_API.G_MISS_DATE
594     THEN
595         RETURN TRUE;
596     END IF;
597 
598     IF p_initiation_date > SYSDATE
599     THEN
600      RETURN FALSE;
601     END IF;
602 
603     RETURN TRUE;
604 
605 END Initiation_Date;
606 
607 /*****************************************************************************
608 *
609 *
610 *
611 *
612 *
613 *
614 *****************************************************************************/
615 FUNCTION Implementation_Date (  p_implementation_date   IN  DATE
616                               , x_err_text              OUT NOCOPY VARCHAR2
617                               )
618 RETURN BOOLEAN
619 IS
620 l_dummy                       VARCHAR2(10);
621 l_err_text      VARCHAR2(2000) := NULL;
622 BEGIN
623 
624     IF p_implementation_date IS NULL OR
625         p_implementation_date = FND_API.G_MISS_DATE
626     THEN
627         RETURN TRUE;
628     END IF;
629 
630     IF p_implementation_date IS NOT NULL
631     THEN
632      RETURN FALSE;
633     END IF;
634 
635     RETURN TRUE;
636 
637 END Implementation_Date;
638 
639 /****************************************************************************
640 *
641 *
642 *
643 *
644 *
645 *
646 *****************************************************************************/
647 FUNCTION Cancellation_Date (  p_cancellation_date       IN  DATE
648                             , x_err_text                OUT NOCOPY VARCHAR2
649                             )
650 RETURN BOOLEAN
651 IS
652 l_dummy                       VARCHAR2(10);
653 BEGIN
654 
655     IF p_cancellation_date IS NULL OR
656         p_cancellation_date = FND_API.G_MISS_DATE
657     THEN
658         RETURN TRUE;
659     END IF;
660 
661     IF p_cancellation_date > SYSDATE
662     THEN
663      RETURN FALSE;
664     END IF;
665 
666     RETURN TRUE;
667 
668 END Cancellation_Date;
669 
670 /****************************************************************************
671 *
672 *
673 *
674 *
675 *
676 *
677 *****************************************************************************/
678 FUNCTION Priority (  p_priority_code IN VARCHAR2
679                    , p_organization_id IN NUMBER
680                    , x_disable_date OUT NOCOPY DATE
681                    , x_err_text OUT NOCOPY VARCHAR2
682                    )
683 RETURN BOOLEAN
684 IS
685 l_dummy                       VARCHAR2(10);
686 BEGIN
687 
688     IF p_priority_code IS NULL OR
689         p_priority_code = FND_API.G_MISS_CHAR
690     THEN
691         RETURN TRUE;
692     END IF;
693 
694     SELECT  'VALID', disable_date
695     INTO     l_dummy, x_disable_date
696     FROM     eng_change_priorities
697     WHERE    eng_change_priority_code = p_priority_code
698              AND organization_id = -1;   --p_organization_id;
699 
700     RETURN TRUE;
701 
702 EXCEPTION
703 
704     WHEN NO_DATA_FOUND THEN
705 
706         -- Should log error message 'ENG_PRIORITY_CODE_INVALID'
707 
708         RETURN FALSE;
709 
710     WHEN OTHERS THEN
711         x_err_text := 'An unexpected error occured in ' || G_PKG_NAME ||
712                       ' and procedure Priority' || SQLERRM ;
713 
714         RETURN FALSE;
715 
716 END Priority;
717 
718 FUNCTION Reason (  p_reason_code        IN VARCHAR2
719                  , p_organization_id    IN NUMBER
720                  , x_disable_date       OUT NOCOPY DATE
721                  , x_err_text           OUT NOCOPY VARCHAR2
722                  )
723 RETURN BOOLEAN
724 IS
725 l_dummy                       VARCHAR2(10);
726 BEGIN
727 
728     IF p_reason_code IS NULL OR
729         p_reason_code = FND_API.G_MISS_CHAR
730     THEN
731         RETURN TRUE;
732     END IF;
733 
734     SELECT  'VALID', disable_date
735     INTO     l_dummy, x_disable_date
736     FROM     eng_change_reasons
737     WHERE    eng_change_reason_code = p_reason_code
738              AND organization_id = -1;   --p_organization_id;
739 
740     RETURN TRUE;
741 
742 EXCEPTION
743 
744     WHEN NO_DATA_FOUND THEN
745 
746         RETURN FALSE;
747 
748     WHEN OTHERS THEN
749         x_err_text := 'An unexpected error occured in ' || G_PKG_NAME ||
750                       ' and procedure Priority' || SQLERRM ;
751 
752         RETURN FALSE;
753 
754 
755 END Reason;
756 
757 FUNCTION Disposition_Type (  p_disposition_type IN  NUMBER
758                            , x_err_text         OUT NOCOPY VARCHAR2
759                            )
760 RETURN BOOLEAN
761 IS
762 l_dummy                       VARCHAR2(10);
763 l_err_text                    VARCHAR2(2000) := NULL;
764 BEGIN
765 
766     IF p_disposition_type IS NULL OR
767         p_disposition_type = FND_API.G_MISS_NUM
768     THEN
769         RETURN TRUE;
770     END IF;
771 
772     SELECT  'VALID'
773     INTO     l_dummy
774     FROM     mfg_lookups
775     WHERE    lookup_type = 'ECG_MATERIAL_DISPOSITION'
776           and lookup_code = p_disposition_type;
777 
778     RETURN TRUE;
779 
780 EXCEPTION
781 
782     WHEN NO_DATA_FOUND THEN
783 
784         RETURN FALSE;
785 
786     WHEN OTHERS THEN
787         x_err_text := 'An unexpected error occured in ' || G_PKG_NAME ||
788                       ' and procedure Disposition_Type' || SQLERRM ;
789 
790         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
791 
792 
793 END Disposition_Type;
794 
795 /**************************************************************************
796 *
797 *
798 *
799 *
800 *
801 *
802 **************************************************************************/
803 FUNCTION Mrp_Active (  p_mrp_active     IN  NUMBER
804                      , x_err_text OUT NOCOPY VARCHAR2 )
805 RETURN BOOLEAN
806 IS
807 l_dummy                       VARCHAR2(10);
808 l_err_text                    VARCHAR2(2000) := NULL;
809 BEGIN
810 
811     IF p_mrp_active IS NULL OR
812         p_mrp_active = FND_API.G_MISS_NUM
813     THEN
814         RETURN TRUE;
815     END IF;
816 
817     IF p_mrp_active IN (1, 2)
818     THEN
819         RETURN TRUE;
820     ELSE
821         RETURN FALSE;
822     END IF;
823 
824 END Mrp_Active;
825 
826 /****************************************************************************
827 *
828 *
829 *
830 *
831 *
832 ****************************************************************************/
833 FUNCTION Update_Wip (  p_update_wip     IN  NUMBER
834                      , x_err_text       OUT NOCOPY VARCHAR2
835                     )
836 RETURN BOOLEAN
837 IS
838 l_dummy                       VARCHAR2(10);
839 BEGIN
840 
841     IF p_update_wip IS NULL OR
842         p_update_wip = FND_API.G_MISS_NUM
843     THEN
844         RETURN TRUE;
845     END IF;
846 
847     IF p_update_wip IN (1, 2)
848     THEN
849         RETURN TRUE;
850     ELSE
851         RETURN FALSE;
852     END IF;
853 
854 END Update_Wip;
855 
856 /*****************************************************************************
857 *
858 *
859 *
860 *
861 *
862 *****************************************************************************/
863 FUNCTION Use_Up (  p_use_up     IN  NUMBER
864                  , x_err_text   OUT NOCOPY VARCHAR2 )
865 RETURN BOOLEAN
866 IS
867 l_dummy                       VARCHAR2(10);
868 BEGIN
869 
870     IF p_use_up IS NULL OR
871         p_use_up = FND_API.G_MISS_NUM
872     THEN
873         RETURN TRUE;
874     END IF;
875 
876     IF p_use_up IN (1, 2)
877     THEN
878         RETURN TRUE;
879     ELSE
880         RETURN FALSE;
881     END IF;
882 
883 END Use_Up;
884 
885 
886 /*****************************************************************************
887 * Function      : Use_Up_Plan_Name
888 * Parameters IN : Plan Name
889 *                 Organization Id
890 * Parameters OUT: Error_Text
891 * Returns       : True if plan is valid, otherwise False.
892 * Purpose       : Function will validate the plan name against mrp_plans and
893 *                 verify if it exists. If it does then the function will check
894 *                 1. If Data_completion date < Explosion_completion_date
895 *                 2. If Plan completion_date < Data_completion_date
896 *                 If any of these conditions are violated, then the function
897 *                 returns with a False and the message name that should be used
898 *                 to get the message from the dictionary.
899 ******************************************************************************/
900 FUNCTION Use_Up_Plan_Name (  p_use_up_plan_name IN  VARCHAR2
901                            , p_organization_id  IN  NUMBER
902                            , x_err_text         OUT NOCOPY VARCHAR2 )
903 RETURN BOOLEAN
904 IS
905         l_explosion_completion_date     DATE;
906         l_data_completion_date          DATE;
907         l_plan_completion_date          DATE;
908 BEGIN
909     IF p_use_up_plan_name IS NULL OR
910         p_use_up_plan_name = FND_API.G_MISS_CHAR
911     THEN
912         RETURN TRUE;
913     END IF;
914 
915    Begin
916     SELECT explosion_completion_date, data_completion_date,
917            plan_completion_date
918       INTO l_explosion_completion_date,
919            l_data_completion_date,
920            l_plan_completion_date
921       FROM mrp_plans
922      WHERE compile_designator = p_use_up_plan_name
923        AND organization_id = p_organization_id;
924 
925         IF l_data_completion_date < l_explosion_completion_date
926         THEN
927                 x_err_text := 'ENG_DATA_COMPL_DATE_INVALID';
928                 RETURN FALSE;
929 
930         END IF;
931         IF l_data_completion_date > l_plan_completion_date
932         THEN
933                 x_err_text := 'ENG_PLAN_COMPL_DATE_INVALID';
934                 RETURN FALSE;
935         END IF;
936 
937 /* Aded following for Bug 3240315 */
938    Exception
939     WHEN NO_DATA_FOUND THEN
940 
941       SELECT plan_completion_date
942       INTO l_plan_completion_date
943       FROM mrp_plan_organizations_v
944       WHERE compile_designator = p_use_up_plan_name
945        AND planned_organization = p_organization_id;
946 
947    End;
948     RETURN TRUE;
949 
950 EXCEPTION
951 
952     WHEN NO_DATA_FOUND THEN
953         x_err_text := 'ENG_USE_UP_PLAN_INVALID';
954         RETURN FALSE;
955 
956     WHEN OTHERS THEN
957         x_err_text := 'An unexpected error occured in ' || G_PKG_NAME ||
958                       ' and procedure Use_Up_Plan_Name' || SQLERRM ;
959 
960         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
961 
962 END Use_Up_Plan_Name;
963 
964 
965 /****************************************************************************
966 * Function      : Supply_Subinventory
967 * Parameters IN : Subinventory Name
968 *                 Organization Id
969 * Parameters OUT: Error Text which will be pouplated in case of an
970 *                 unexpected error.
971 *
972 * Return        : True if the subinventory is valid else False
973 * Purpose       : Verify that the supply subinventory is exist for the given
974 *                 organization in the table MTL_SECONDARY_SUBINVENTORIES.
975 ****************************************************************************/
976 FUNCTION Supply_Subinventory (  p_supply_subinventory   IN  VARCHAR2
977                               , p_organization_id       IN  NUMBER
978                               , x_err_text              OUT NOCOPY VARCHAR2
979                               )
980 RETURN BOOLEAN
981 IS
982 l_dummy                       VARCHAR2(10);
983 BEGIN
984 
985     IF p_supply_subinventory IS NULL OR
986         p_supply_subinventory = FND_API.G_MISS_CHAR
987     THEN
988         RETURN TRUE;
989     END IF;
990 
991     SELECT 'VALID'
992       INTO l_dummy
993       FROM mtl_secondary_inventories
994      WHERE secondary_inventory_name = p_supply_subinventory
995        AND organization_id          = p_organization_id;
996 
997     RETURN TRUE;
998 
999     EXCEPTION
1000         WHEN NO_DATA_FOUND THEN
1001                 RETURN FALSE;
1002 
1003         WHEN OTHERS THEN
1004         x_err_text := 'An unexpected error occured in ' || G_PKG_NAME ||
1005                       ' and procedure Supply_Subinventory' || SQLERRM ;
1006                 RETURN FALSE;
1007 
1008 END Supply_Subinventory;
1009 
1010 /****************************************************************************
1011 *
1012 *
1013 *
1014 *
1015 *
1016 *
1017 ****************************************************************************/
1018 FUNCTION Required_For_Revenue (  p_required_for_revenue IN  NUMBER
1019                                , x_err_text             OUT NOCOPY VARCHAR2
1020                                )
1021 RETURN BOOLEAN
1022 IS
1023 l_dummy                       VARCHAR2(10);
1024 BEGIN
1025 
1026     IF p_required_for_revenue IS NULL OR
1027         p_required_for_revenue = FND_API.G_MISS_NUM
1028     THEN
1029         RETURN TRUE;
1030     END IF;
1031 
1032     IF p_required_for_revenue NOT IN(1, 2) THEN
1033         RETURN FALSE;
1034     ELSE
1035         RETURN TRUE;
1036     END IF;
1037 
1038 END Required_For_Revenue;
1039 
1040 /****************************************************************************
1041 * Function      : Wip_Supply_Type
1042 * Parameters IN : Wip_Supply_Type value
1043 * Parameters OUT: Error Text which will be populated in case of an
1044 *                 unexpected error.
1045 * Returns       : True if the Wip_supply_Type exist in the Lookup else False
1046 * Purpose       : Verify that the value of Wip_Supply_Type is valid, by looking
1047 *                 in the Table MFG_LOOKUPS with a Lookup Type of 'WIP_SUPPLY'
1048 *****************************************************************************/
1049 FUNCTION Wip_Supply_Type (  p_wip_supply_type   IN  NUMBER
1050                           , x_err_text          OUT NOCOPY VARCHAR2 )
1051 RETURN BOOLEAN
1052 IS
1053 l_dummy                       VARCHAR2(10);
1054 BEGIN
1055 
1056     IF p_wip_supply_type IS NULL OR
1057         p_wip_supply_type = FND_API.G_MISS_NUM
1058     THEN
1059         RETURN TRUE;
1060     END IF;
1061 
1062     SELECT 'VALID'
1063       INTO l_dummy
1064       FROM mfg_lookups
1065      WHERE lookup_code = p_wip_supply_type
1066        AND lookup_type = 'WIP_SUPPLY' ;
1067 
1068     RETURN TRUE;
1069 
1070 EXCEPTION
1071 
1072     WHEN NO_DATA_FOUND THEN
1073         RETURN FALSE;
1074 
1075     WHEN OTHERS THEN
1076         x_err_text := 'An unexpected error occured in ' || G_PKG_NAME ||
1077                       ' and function Wip_Supply_Type' || SQLERRM ;
1078 
1079         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1080 
1081 END Wip_Supply_Type;
1082 
1083 /*****************************************************************************
1084 *
1085 *
1086 *
1087 *
1088 *
1089 *
1090 *****************************************************************************/
1091 FUNCTION Item_Num ( p_item_num  IN  NUMBER
1092                    , x_err_text OUT NOCOPY VARCHAR2)
1093 RETURN BOOLEAN
1094 IS
1095 l_dummy                       VARCHAR2(10);
1096 BEGIN
1097 
1098 IF Bom_Globals.Get_Debug = 'Y' THEN Error_Handler.Write_Debug('Attribute validating Item_num . . . ' ||
1099     to_char(p_item_num));
1100 END IF;
1101 
1102     IF p_item_num IS NULL OR
1103         p_item_num = FND_API.G_MISS_NUM
1104     THEN
1105         RETURN TRUE;
1106     ELSIF p_item_num < 0 OR
1107           p_item_num > 9999 THEN
1108         RETURN FALSE;
1109     ELSE
1110         RETURN TRUE;
1111     END IF;
1112 
1113 END Item_Num;
1114 
1115 FUNCTION Component_Yield_Factor (  p_component_yield_factor     IN  NUMBER
1116                                  , x_err_text                   OUT NOCOPY VARCHAR2
1117                                 )
1118 RETURN BOOLEAN
1119 IS
1120 l_dummy                       VARCHAR2(10);
1121 BEGIN
1122 
1123     IF p_component_yield_factor IS NULL OR
1124        p_component_yield_factor = FND_API.G_MISS_NUM
1125     THEN
1126         RETURN TRUE;
1127     ELSIF p_component_yield_factor < 0 THEN
1128         RETURN FALSE;
1129     ELSE
1130         RETURN TRUE;
1131     END IF;
1132 
1133 END Component_Yield_Factor;
1134 
1135 /*****************************************************************************
1136 * Function      : Effectivity_Date
1137 * Parmeters IN  : Effectivity Date of the component
1138 *                 Revised item sequence id
1139 * Parmeters OUT : Error Text which will be populated in case of an unexpected
1140 *                 error.
1141 * Returns       : True if the effectivity date is valid else False.
1142 * Purpose       : Verify that the effectivity date of the component is equal
1143 *                 to the schedule date of the revised item.
1144 ******************************************************************************/
1145 FUNCTION Effectivity_Date (  p_effectivity_date         IN  DATE
1146                            , p_revised_item_sequence_id IN  NUMBER
1147                            , x_err_text                 OUT NOCOPY VARCHAR2
1148                            )
1149 RETURN BOOLEAN
1150 IS
1151 l_dummy                       VARCHAR2(10);
1152 CURSOR c_EffectiveDate IS
1153         SELECT scheduled_date
1154           FROM eng_revised_items
1155          WHERE revised_item_sequence_id = p_revised_item_sequence_id;
1156 
1157 BEGIN
1158 
1159     IF p_effectivity_date IS NULL OR
1160            p_effectivity_date = FND_API.G_MISS_DATE
1161     THEN
1162         RETURN TRUE;
1163     END IF;
1164 
1165     FOR l_Effective IN c_EffectiveDate LOOP
1166 
1167 IF Bom_Globals.Get_Debug = 'Y' THEN Error_Handler.Write_Debug('Schedule Date : ' ||
1168                      to_Char(l_effective.scheduled_date) || ' ' ||
1169                      'Effective Date : ' || to_Char(p_effectivity_date));
1170 END IF;
1171 
1172         IF p_effectivity_date = l_effective.scheduled_date
1173         THEN
1174                 RETURN TRUE;
1175         ELSE
1176                  -- Date's should be = Scheduled date
1177                 RETURN FALSE;
1178 
1179         END IF;
1180      END LOOP;
1181 
1182 END Effectivity_Date;
1183 
1184 /****************************************************************************
1185 *
1186 *
1187 *
1188 *
1189 *
1190 *****************************************************************************/
1191 FUNCTION Disable_Date (  p_disable_date         IN  DATE
1192                        , p_effectivity_date     IN  DATE
1193                        , x_err_text             OUT NOCOPY VARCHAR2
1194                        )
1195 RETURN BOOLEAN
1196 IS
1197 l_dummy                       VARCHAR2(10);
1198 BEGIN
1199 
1200     IF p_disable_date IS NULL OR
1201         p_disable_date = FND_API.G_MISS_DATE OR
1202         (p_disable_date >= SYSDATE AND
1203          p_disable_date >= p_effectivity_date
1204         )
1205     THEN
1206         RETURN TRUE;
1207     ELSE
1208         RETURN FALSE;
1209     END IF;
1210 
1211 END Disable_Date;
1212 
1213 FUNCTION Quantity_Related ( p_quantity_related IN NUMBER ,
1214                             x_err_text         OUT NOCOPY VARCHAR2 )
1215 RETURN BOOLEAN
1216 IS
1217 l_dummy                       VARCHAR2(10);
1218 BEGIN
1219 
1220     IF p_quantity_related IS NULL OR
1221         p_quantity_related = FND_API.G_MISS_NUM
1222     THEN
1223         RETURN TRUE;
1224     END IF;
1225 
1226     IF p_quantity_related in (1, 2) THEN
1227         RETURN TRUE;
1228     ELSE
1229         RETURN FALSE;
1230     END IF;
1231 END Quantity_Related;
1232 
1233 FUNCTION So_Basis ( p_so_basis  IN  NUMBER
1234                   , x_err_text  OUT NOCOPY VARCHAR2
1235                   )
1236 RETURN BOOLEAN
1237 IS
1238 l_dummy                       VARCHAR2(10);
1239 BEGIN
1240 
1241     IF p_so_basis IS NULL OR
1242         p_so_basis = FND_API.G_MISS_NUM
1243     THEN
1244         RETURN TRUE;
1245     END IF;
1246         IF p_so_basis in (1, 2) THEN
1247                 RETURN TRUE;
1248         ELSE
1249                 RETURN FALSE;
1250         END IF;
1251 
1252 END So_Basis;
1253 
1254 /****************************************************************************
1255 *
1256 *
1257 *
1258 *
1259 *****************************************************************************/
1260 FUNCTION Optional ( p_optional IN NUMBER ,
1261                     x_err_text OUT NOCOPY VARCHAR2 )
1262 RETURN BOOLEAN
1263 IS
1264 l_dummy                       VARCHAR2(10);
1265 BEGIN
1266 
1267     IF p_optional IS NULL OR
1268         p_optional = FND_API.G_MISS_NUM
1269     THEN
1270         RETURN TRUE;
1271     END IF;
1272 
1273     IF p_optional IN (1, 2) THEN
1274         RETURN TRUE;
1275     ELSE
1276         RETURN FALSE;
1277     END IF;
1278 END Optional;
1279 
1280 /****************************************************************************
1281 *
1282 *
1283 *
1284 *
1285 *****************************************************************************/
1286 FUNCTION Mutually_Exclusive_Opt ( p_mutually_exclusive_opt IN NUMBER ,
1287                                   x_err_text               OUT NOCOPY VARCHAR2 )
1288 RETURN BOOLEAN
1289 IS
1290 l_dummy                       VARCHAR2(10);
1291 BEGIN
1292 
1293     IF p_mutually_exclusive_opt IS NULL OR
1294         p_mutually_exclusive_opt = FND_API.G_MISS_NUM
1295     THEN
1296         RETURN TRUE;
1297     END IF;
1298 
1299     IF p_mutually_exclusive_opt IN (1, 2)
1300     THEN
1301         RETURN TRUE;
1302     ELSE
1303         RETURN FALSE;
1304     END IF;
1305 
1306 END Mutually_Exclusive_Opt;
1307 
1308 /****************************************************************************
1309 *
1310 *
1311 *
1312 *
1313 *****************************************************************************/
1314 FUNCTION Include_In_Cost_Rollup ( p_include_in_cost_rollup IN NUMBER ,
1315                                   x_err_text               OUT NOCOPY VARCHAR2)
1316 RETURN BOOLEAN
1317 IS
1318 l_dummy                       VARCHAR2(10);
1319 BEGIN
1320 
1321     IF p_include_in_cost_rollup IS NULL OR
1322         p_include_in_cost_rollup = FND_API.G_MISS_NUM
1323     THEN
1324         RETURN TRUE;
1325     END IF;
1326 
1327     IF p_include_in_cost_rollup IN (1, 2)
1328     THEN
1329         RETURN TRUE;
1330     ELSE
1331         RETURN FALSE;
1332     END IF;
1333 
1334 END Include_In_Cost_Rollup;
1335 
1336 /****************************************************************************
1337 *
1338 *
1339 *
1340 *
1341 *****************************************************************************/
1342 FUNCTION Check_Atp ( p_check_atp IN  NUMBER
1343                    , x_err_text  OUT NOCOPY VARCHAR2)
1344 RETURN BOOLEAN
1345 IS
1346 l_dummy                       VARCHAR2(10);
1347 BEGIN
1348 
1349         -- Validate ATP at the Entity level as it
1350         -- requires lot of additional information.
1351 
1352         IF p_check_atp IS NULL OR
1353            p_check_atp = FND_API.G_MISS_NUM
1354         THEN
1355                 RETURN TRUE;
1356         ELSIF p_check_atp NOT IN (1, 2, 3) THEN
1357                 RETURN FALSE;
1358         ELSE
1359                 RETURN TRUE;
1360         END IF;
1361 
1362 END Check_Atp;
1363 
1364 /****************************************************************************
1365 *
1366 *
1367 *
1368 *
1369 *****************************************************************************/
1370 FUNCTION Shipping_Allowed ( p_shipping_allowed IN NUMBER ,
1371                             x_err_text         OUT NOCOPY VARCHAR2 )
1372 RETURN BOOLEAN
1373 IS
1374 l_dummy                       VARCHAR2(10);
1375 BEGIN
1376 
1377     IF p_shipping_allowed IS NULL OR
1378         p_shipping_allowed = FND_API.G_MISS_NUM
1379     THEN
1380         RETURN TRUE;
1381     END IF;
1382 
1383     IF p_shipping_Allowed IN (1, 2)
1384     THEN
1385         RETURN TRUE;
1386     ELSE
1387         RETURN FALSE;
1388     END IF;
1389 
1390 END Shipping_Allowed;
1391 
1392 /****************************************************************************
1393 *
1394 *
1395 *
1396 *
1397 *****************************************************************************/
1398 FUNCTION Required_To_Ship ( p_required_to_ship IN NUMBER ,
1399                             x_err_text         OUT NOCOPY VARCHAR2 )
1400 RETURN BOOLEAN
1401 IS
1402 l_dummy                       VARCHAR2(10);
1403 BEGIN
1404 
1405     IF p_required_to_ship IS NULL OR
1406         p_required_to_ship = FND_API.G_MISS_NUM
1407     THEN
1408         RETURN TRUE;
1409     END IF;
1410 
1411     IF p_required_to_ship IN (1, 2)
1412     THEN
1413         RETURN TRUE;
1414     ELSE
1415         RETURN FALSE;
1416     END IF;
1417 
1418 END Required_To_Ship;
1419 
1420 /****************************************************************************
1421 *
1422 *
1423 *
1424 *
1425 *****************************************************************************/
1426 FUNCTION Include_On_Ship_Docs ( p_include_on_ship_docs IN NUMBER ,
1427                                 x_err_text             OUT NOCOPY VARCHAR2 )
1428 RETURN BOOLEAN
1429 IS
1430 l_dummy                       VARCHAR2(10);
1431 BEGIN
1432 
1433     IF p_include_on_ship_docs IS NULL OR
1434         p_include_on_ship_docs = FND_API.G_MISS_NUM
1435     THEN
1436         RETURN TRUE;
1437     END IF;
1438 
1439     IF p_include_on_ship_docs IN (1, 2)
1440     THEN
1441         RETURN TRUE;
1442     ELSE
1443         RETURN FALSE;
1444     END IF;
1445 
1446 END Include_On_Ship_Docs;
1447 
1448 /****************************************************************************
1449 *
1450 *
1451 *
1452 *
1453 *****************************************************************************/
1454 FUNCTION Acd_Type ( p_acd_type IN NUMBER ,
1455                     x_err_text OUT NOCOPY VARCHAR2 )
1456 RETURN BOOLEAN
1457 IS
1458 l_dummy                       VARCHAR2(10);
1459 BEGIN
1460 
1461     IF p_acd_type IS NULL OR
1462         p_acd_type NOT IN (1,2,3)
1463     THEN
1464         RETURN FALSE;
1465     ELSE
1466         RETURN TRUE;
1467     END IF;
1468 END Acd_Type;
1469 
1470 
1471 
1472 /****************************************************************************
1473 * Added by MK on 09/01/2000 for ECO New Effectivities
1474 *
1475 *
1476 * Function      : Check_RevCmp_In_ECO_By_WO
1477 * Parameters IN : Revised Item Sequence Id, Component Item Id and Operation Seq Num
1478 * Parameters OUT: Error Text which will be populated in case of an
1479 *                 unexpected error.
1480 * Returns       : True if All Jobs in ECO by Lot, WO, Cum Qty have the
1481 *                  Rev Component and Op Seq Number else False.
1482 * Purpose       : Check if Component Item, Op Seq Num exists in material requirements
1483 *                 info of jobs and schedules Verify the user can create a revised
1484 *                 component record in ECO by WO
1485 *****************************************************************************/
1486 FUNCTION Check_RevCmp_In_ECO_By_WO
1487              ( p_revised_item_sequence_id IN  NUMBER
1488              , p_rev_comp_item_id         IN  NUMBER
1489              , p_operation_seq_num        IN  NUMBER)
1490 
1491 RETURN BOOLEAN
1492 IS
1493        l_ret_status BOOLEAN := TRUE ;
1494 
1495        CURSOR l_check_rit_effectivity_csr (p_revised_item_sequence_id NUMBER)
1496        IS
1497           SELECT   lot_number
1498                  , from_wip_entity_id
1499                  , to_wip_entity_id
1500                  , from_cum_qty
1501                  , organization_id
1502           FROM    ENG_REVISED_ITEMS
1503           WHERE  (lot_number         IS NOT NULL  OR
1504                   from_wip_entity_id IS NOT NULL)
1505           AND    revised_item_sequence_id = p_revised_item_sequence_id ;
1506 
1507 
1508        CURSOR  l_check_lot_num_csr ( p_lot_number        NUMBER
1509                                    , p_rev_comp_item_id  NUMBER
1510                                    , p_operation_seq_num NUMBER
1511                                    , p_organization_id   NUMBER)
1512        IS
1513           SELECT 'Cmp does not exist'
1514           FROM   SYS.DUAL
1515           WHERE  EXISTS (SELECT  NULL
1516                          FROM    WIP_DISCRETE_JOBS  wdj
1517                          WHERE  (wdj.status_type <> 1
1518                                   OR
1519                                   NOT EXISTS(SELECT NULL
1520                                              FROM   WIP_REQUIREMENT_OPERATIONS wro
1521                                              WHERE  wro.operation_seq_num = p_operation_seq_num
1522                                              AND    wro.inventory_item_id = p_rev_comp_item_id
1523                                              AND    wro.wip_entity_id     = wdj.wip_entity_id)
1524                                   )
1525                          AND      wdj.lot_number = p_lot_number
1526                          AND      wdj.organization_id = p_organization_id
1527                         ) ;
1528 
1529        CURSOR  l_check_wo_csr (  p_from_wip_entity_id NUMBER
1530                                , p_to_wip_entity_id   NUMBER
1531                                , p_rev_comp_item_id   NUMBER
1532                                , p_operation_seq_num  NUMBER )
1533        IS
1534           SELECT 'Cmp does not exist'
1535           FROM   SYS.DUAL
1536           WHERE  EXISTS (SELECT  NULL
1537                          FROM    WIP_DISCRETE_JOBS  wdj
1538                                , WIP_ENTITIES       we
1539                                , WIP_ENTITIES       we1
1540                                , WIP_ENTITIES       we2
1541                          WHERE   (wdj.status_type <> 1
1542                                   OR
1543                                   NOT EXISTS (SELECT NULL
1544                                               FROM   WIP_REQUIREMENT_OPERATIONS wro
1545                                               WHERE  wro.operation_seq_num = p_operation_seq_num
1546                                               AND    wro.inventory_item_id = p_rev_comp_item_id
1547                                               AND    wro.wip_entity_id     = wdj.wip_entity_id)
1548                                  )
1549                          AND     wdj.wip_entity_id = we.wip_entity_id
1550                          AND     we.wip_entity_name >= we1.wip_entity_name
1551                          AND     we.wip_entity_name <= we2.wip_entity_name
1552                          AND     we1.wip_entity_id = p_from_wip_entity_id
1553                          AND     we2.wip_entity_id = p_to_wip_entity_id
1554                          ) ;
1555 
1556       CURSOR  l_check_cum_csr (  p_from_wip_entity_id NUMBER
1557                                , p_rev_comp_item_id   NUMBER
1558                                , p_operation_seq_num  NUMBER)
1559        IS
1560           SELECT 'Cmp does not exist'
1561           FROM   SYS.DUAL
1562           WHERE  EXISTS (SELECT  NULL
1563                          FROM    WIP_DISCRETE_JOBS  wdj
1564                          WHERE   (wdj.status_type <> 1
1565                                   OR
1566                                   NOT EXISTS(SELECT NULL
1567                                              FROM   WIP_REQUIREMENT_OPERATIONS wro
1568                                              WHERE  wro.operation_seq_num = p_operation_seq_num
1569                                              AND    wro.inventory_item_id = p_rev_comp_item_id
1570                                              AND    wro.wip_entity_id     = wdj.wip_entity_id)
1571                                  )
1572                          AND     wdj.wip_entity_id = p_from_wip_entity_id
1573                          ) ;
1574 
1575     BEGIN
1576 
1577 
1578        FOR l_eco_effect_rec IN l_check_rit_effectivity_csr
1579                                            (p_revised_item_sequence_id)
1580        LOOP
1581 
1582 
1583           -- Check if Op Seq Num is exist in ECO by Lot
1584           IF    l_eco_effect_rec.lot_number         IS NOT NULL
1585            AND  l_eco_effect_rec.from_wip_entity_id IS NULL
1586            AND  l_eco_effect_rec.to_wip_entity_id   IS NULL
1587            AND  l_eco_effect_rec.from_cum_qty       IS NULL
1588           THEN
1589 
1590              FOR l_lot_num_rec IN l_check_lot_num_csr
1591                                ( p_lot_number        => l_eco_effect_rec.lot_number
1592                                , p_rev_comp_item_id  => p_rev_comp_item_id
1593                                , p_operation_seq_num => p_operation_seq_num
1594                                , p_organization_id   => l_eco_effect_rec.organization_id)
1595 
1596              LOOP
1597                  l_ret_status  := FALSE ;
1598              END LOOP ;
1599 
1600           -- Check if Op Seq Num is exist  in ECO by Cum
1601           ELSIF   l_eco_effect_rec.lot_number         IS NULL
1602            AND    l_eco_effect_rec.from_wip_entity_id IS NOT NULL
1603            AND    l_eco_effect_rec.to_wip_entity_id   IS NULL
1604            AND    l_eco_effect_rec.from_cum_qty       IS NOT NULL
1605           THEN
1606 
1607              FOR l_lot_num_rec IN l_check_cum_csr
1608                                ( p_from_wip_entity_id => l_eco_effect_rec.from_wip_entity_id
1609                                , p_rev_comp_item_id   => p_rev_comp_item_id
1610                                , p_operation_seq_num  => p_operation_seq_num )
1611              LOOP
1612                  l_ret_status  := FALSE ;
1613              END LOOP ;
1614 
1615           -- Check if Op Seq Num is exist  in ECO by WO
1616           ELSIF   l_eco_effect_rec.lot_number         IS NULL
1617            AND    l_eco_effect_rec.from_wip_entity_id IS NOT NULL
1618            AND    l_eco_effect_rec.to_wip_entity_id IS NOT NULL
1619            AND    l_eco_effect_rec.from_cum_qty       IS NULL
1620           THEN
1621 
1622              FOR l_lot_num_rec IN l_check_wo_csr
1623                                ( p_from_wip_entity_id => l_eco_effect_rec.from_wip_entity_id
1624                                , p_to_wip_entity_id   => l_eco_effect_rec.to_wip_entity_id
1625                                , p_rev_comp_item_id   => p_rev_comp_item_id
1626                                , p_operation_seq_num  => p_operation_seq_num )
1627              LOOP
1628                  l_ret_status  := FALSE ;
1629              END LOOP ;
1630 
1631           ELSIF   l_eco_effect_rec.lot_number         IS NULL
1632            AND    l_eco_effect_rec.from_wip_entity_id IS NULL
1633            AND    l_eco_effect_rec.to_wip_entity_id   IS NULL
1634            AND    l_eco_effect_rec.from_cum_qty       IS NULL
1635           THEN
1636              NULL ;
1637 
1638           --  ELSE
1639           --     l_ret_status  := FALSE ;
1640           --
1641 
1642           END IF ;
1643        END LOOP ;
1644 
1645        RETURN l_ret_status ;
1646 
1647 END Check_RevCmp_In_ECO_By_WO ;
1648 
1649 
1650 -- Function Check_Reference_Common
1651 -- Cannot delete revised item if another bill references it as a common bill
1652 
1653 FUNCTION Check_Reference_Common
1654 ( p_change_notice       VARCHAR2
1655 , p_bill_sequence_id    NUMBER
1656 )RETURN NUMBER
1657 IS
1658   l_count1                      NUMBER := 0;
1659   l_count2                      NUMBER := 0;
1660   cursor pending_on_eco is
1661                 select 1
1662                   from BOM_BILL_OF_MATERIALS
1663                  where bill_sequence_id = p_bill_sequence_id
1664                    and pending_from_ecn is not null
1665                    and pending_from_ecn = p_change_notice;
1666   cursor reference_common is
1667                 select 1
1668                   from BOM_BILL_OF_MATERIALS
1669                  where source_bill_sequence_id = p_bill_sequence_id
1670                    and source_bill_sequence_id <> bill_sequence_id;
1671 BEGIN
1672 
1673   l_count1 := 0;
1674 
1675   for l_pending_on_eco in pending_on_eco loop
1676     l_count1 := 1;
1677   end loop;
1678 
1679   if l_count1 = 1
1680   then
1681     l_count2 := 0;
1682 
1683     for l_reference_common in reference_common loop
1684       l_count2 := 1;
1685     end loop;
1686   end if;
1687 
1688   return (l_count2);
1689 END Check_Reference_Common;
1690 
1691 
1692 -- Function Check_Reference_Rtg_Common
1693 -- Cannot delete revised item if another Routing references it as a common routing
1694 
1695 FUNCTION Check_Reference_Rtg_Common
1696 ( p_change_notice          VARCHAR2
1697 , p_routing_sequence_id    NUMBER
1698 )RETURN NUMBER
1699 IS
1700   l_count1                      NUMBER := 0;
1701   l_count2                      NUMBER := 0;
1702   cursor pending_on_eco is
1703                 select 1
1704                   from BOM_OPERATIONAL_ROUTINGS
1705                  where routing_sequence_id = p_routing_sequence_id
1706                    and pending_from_ecn is not null
1707                    and pending_from_ecn = p_change_notice;
1708   cursor reference_common is
1709                 select 1
1710                   from BOM_OPERATIONAL_ROUTINGS
1711                  where common_routing_sequence_id = p_routing_sequence_id
1712                    and common_routing_sequence_id <> routing_sequence_id;
1713 BEGIN
1714 
1715   l_count1 := 0;
1716 
1717   for l_pending_on_eco in pending_on_eco loop
1718     l_count1 := 1;
1719   end loop;
1720 
1721   if l_count1 = 1
1722   then
1723     l_count2 := 0;
1724 
1725     for l_reference_common in reference_common loop
1726       l_count2 := 1;
1727     end loop;
1728   end if;
1729 
1730   return (l_count2);
1731 END Check_Reference_Rtg_Common;
1732 
1733 
1734 -- Added by MK on 08/26/2000
1735 /*****************************************************************************
1736 * Procedure     : Entity_Delete
1737 * Parameters IN : Revised item exposed column record
1738 *                 Revised item unexposed column record
1739 * Parameters OUT: Mesg Token Table
1740 *                 Return Status
1741 * Purpose       : Entity Delete procedure will check if the given revised item
1742 *                 can be deleted without violating any business rules or
1743 *                 constraints. Revised item's cannot be deleted if there are
1744 *                 components on the bill or it revised item's bill is being
1745 *                 referenced as common by any other bills in the same org or
1746 *                 any other org.
1747 *                 (Check of revised item being implemented or cancelled is done
1748 *                  in the previous steps of the process flow)
1749 ******************************************************************************/
1750 PROCEDURE Check_Entity_Delete
1751 (  x_return_status              OUT NOCOPY VARCHAR2
1752  , x_Mesg_Token_Tbl             OUT NOCOPY Error_Handler.Mesg_Token_Tbl_Type
1753  , p_revised_item_rec           IN  ENG_Eco_PUB.Revised_Item_Rec_Type
1754  , p_rev_item_unexp_rec         IN  Eng_Eco_Pub.Rev_Item_Unexposed_Rec_Type
1755 )
1756 IS
1757   l_err_text                  VARCHAR2(2000) := NULL;
1758   l_return_status       VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
1759   check_delete          NUMBER := 0;
1760   l_count1              NUMBER := 0;
1761   CURSOR rev_comps IS
1762                 SELECT 1
1763                   FROM BOM_INVENTORY_COMPONENTS
1764                  WHERE revised_item_sequence_id =
1765                        p_rev_item_unexp_rec.revised_item_sequence_id;
1766 
1767 
1768   /******************************************************************
1769   -- Added by MK on 08/26/2000
1770   -- Enhancement for ECO Routing
1771   ******************************************************************/
1772   CURSOR rev_op_seq IS
1773   SELECT 'Rev Op Exist'
1774   FROM    SYS.DUAL
1775   WHERE EXISTS  ( SELECT NULL
1776                   FROM BOM_OPERATION_SEQUENCES
1777                   WHERE revised_item_sequence_id =
1778                        p_rev_item_unexp_rec.revised_item_sequence_id) ;
1779   -- Added by MK on 08/26/2000
1780 
1781         l_Mesg_Token_Tbl        Error_Handler.Mesg_Token_Tbl_Type;
1782         l_Token_Tbl             Error_Handler.Token_Tbl_Type;
1783 BEGIN
1784 
1785 
1786         --
1787         -- Set the revised item token name and value
1788         --
1789         l_Token_Tbl(1).Token_Name  := 'REVISED_ITEM_NAME';
1790         l_Token_Tbl(1).Token_Value := p_revised_item_rec.revised_item_name;
1791 
1792         FOR l_rev_comps IN rev_comps
1793         LOOP
1794                 --
1795                 -- if loop executes, then component exist on that bill
1796                 -- so it cannot be deleted.
1797                 --
1798                 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
1799                 THEN
1800                         Error_Handler.Add_Error_Token
1801                         (  p_Message_Name       => 'ENG_CANNOT_DEL_COMP_EXIST'
1802                          , p_Mesg_Token_Tbl     => l_Mesg_Token_Tbl
1803                          , x_Mesg_Token_Tbl     => l_Mesg_Token_Tbl
1804                          , p_Token_Tbl          => l_Token_Tbl
1805                          );
1806                 END IF;
1807                 l_return_status := FND_API.G_RET_STS_ERROR;
1808         END LOOP;
1809 
1810 
1811 
1812         /******************************************************************
1813         -- Added by MK on 08/26/2000
1814         -- Enhancement for ECO Routing
1815         ******************************************************************/
1816         FOR l_rev_op_seq IN rev_op_seq
1817         LOOP
1818                 --
1819                 -- if loop executes, then revised operation exist on that
1820                 -- routing so it cannot be deleted.
1821                 --
1822                 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
1823                 THEN
1824                         Error_Handler.Add_Error_Token
1825                         (  p_Message_Name       => 'ENG_CANNOT_DEL_OP_EXIST'
1826                          , p_Mesg_Token_Tbl     => l_Mesg_Token_Tbl
1827                          , x_Mesg_Token_Tbl     => l_Mesg_Token_Tbl
1828                          , p_Token_Tbl          => l_Token_Tbl
1829                          );
1830                 END IF;
1831                 l_return_status := FND_API.G_RET_STS_ERROR;
1832         END LOOP;
1833         -- Added by MK on 08/26/2000
1834 
1835 
1836 
1837         /*********************************************************************
1838         --
1839         -- Check if the revised item's bill is being referenced as common
1840         --
1841         **********************************************************************/
1842         check_delete := Check_Reference_Common
1843                   ( p_change_notice     => p_revised_item_rec.eco_name
1844                   , p_bill_sequence_id  => p_rev_item_unexp_rec.bill_sequence_id
1845                   );
1846 
1847         IF check_delete <> 0
1848         THEN
1849                 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
1850                 THEN
1851                         Error_Handler.Add_Error_Token
1852                         (  p_Message_Name       => 'ENG_CANNOT_DEL_COMMON_EXIST'
1853                          , p_Mesg_Token_Tbl     => l_Mesg_Token_Tbl
1854                          , x_Mesg_Token_Tbl     => l_Mesg_Token_Tbl
1855                          , p_Token_Tbl          => l_Token_Tbl
1856                          );
1857                 END IF;
1858                 l_return_status := FND_API.G_RET_STS_ERROR;
1859         END IF;
1860 
1861         /*********************************************************************
1862         -- Added by MK on 08/26/2000
1863         -- Check if the revised item's routing is being referenced as common
1864         **********************************************************************/
1865         check_delete := 0 ;
1866         check_delete :=  Check_Reference_Rtg_Common
1867                   ( p_change_notice     => p_revised_item_rec.eco_name
1868                   , p_routing_sequence_id  => p_rev_item_unexp_rec.routing_sequence_id
1869                   );
1870 
1871         IF check_delete <> 0
1872         THEN
1873                 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
1874                 THEN
1875                         Error_Handler.Add_Error_Token
1876                         (  p_Message_Name       => 'ENG_CANNOT_DEL_RTG_COMMON_EXIST'
1877                          , p_Mesg_Token_Tbl     => l_Mesg_Token_Tbl
1878                          , x_Mesg_Token_Tbl     => l_Mesg_Token_Tbl
1879                          , p_Token_Tbl          => l_Token_Tbl
1880                          );
1881                 END IF;
1882                 l_return_status := FND_API.G_RET_STS_ERROR;
1883         END IF;
1884         -- Added by MK on 08/26/2000
1885 
1886         -- Done with the validations
1887         x_return_status := l_return_status;
1888         x_Mesg_Token_Tbl := l_Mesg_Token_Tbl;
1889 
1890 EXCEPTION
1891 
1892     WHEN FND_API.G_EXC_ERROR THEN
1893 
1894         x_return_status := FND_API.G_RET_STS_ERROR;
1895 
1896     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1897 
1898         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1899 
1900     WHEN OTHERS THEN
1901 
1902         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1903 
1904         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1905         THEN
1906             l_err_text := G_PKG_NAME || ' : (Entity Delete Validation) ' ||
1907                           substrb(SQLERRM,1,200);
1908             Error_Handler.Add_Error_Token
1909             (  p_Message_Name   => NULL
1910              , p_Message_Text   => l_Err_Text
1911              , p_Mesg_Token_Tbl => l_Mesg_Token_Tbl
1912              , x_Mesg_Token_Tbl => l_Mesg_Token_Tbl
1913              );
1914         END IF;
1915 
1916 END Check_Entity_Delete;
1917 
1918 END ENG_Validate;