DBA Data[Home] [Help]

PACKAGE BODY: APPS.BOM_VALIDATE_REF_DESIGNATOR

Source


1 PACKAGE BODY BOM_Validate_Ref_Designator AS
2 /* $Header: BOMLRFDB.pls 120.3.12000000.2 2007/02/27 11:15:35 arudresh ship $ */
3 /**********************************************************************
4 --  Copyright (c) 1996 Oracle Corporation, Redwood Shores, CA, USA
5 --  All rights reserved.
6 --
7 --  FILENAME
8 --
9 --      BOMLRFDB.pls
10 --
11 --  DESCRIPTION
12 --
13 --      Body of package BOM_Validate_Ref_designators
14 --
15 --  NOTES
16 --
17 --  HISTORY
18 --
19 --  19-JUL-1999	Rahul Chitko	Initial Creation
20 --
21 --  08-MAY-2001 Refai Farook    EAM related changes
22 --
23 --  05-JUL-2004 Hari Gelli    Added Check_Quantity procedure
24 **************************************************************************/
25 G_PKG_NAME	CONSTANT VARCHAR2(30) := 'BOM_Validate_Ref_Designator';
26 ret_code		 NUMBER;
27 l_dummy			 VARCHAR2(80);
28 
29 
30 /*************************************************************************
31 * Local Procedure: Calculate_both_totals
32 * Parameter IN	 : old_component_sequenc_id
33 * Parameters OUT : Total Quantity of Designators
34 * Purpose	 : Procedure calculate_both_totals will take the component
35 *		   sequence_id and calculate the number of designators that
36 *		   already exist for it and the how many exist on the same
37 *		   component on the ECO with an acd_type of add or disable
38 *		   Then by making use of the set operater it will eliminate
39 *		   the disable one's from the list. This is the quantity
40 *		   of designator that will remain on the component after
41 *		   implementation and is returned by the procedure as
42 *		   Total Quantity.
43 **************************************************************************/
44 Procedure Calculate_Both_Totals( p_old_component_sequence_id	IN 	NUMBER,
45 				 x_TotalQuantity		IN OUT NOCOPY 	NUMBER
46 				)
47 IS
48 
49   X_OldComp number;
50   X_Add constant number := 1;
51   X_Delete constant number := 3;
52   l_Implemented_Count	NUMBER;
53   l_dummy		varchar2(80);
54 
55   Cursor GetTotalQty is
56     Select brd.component_reference_designator
57     From bom_reference_designators brd
58     Where brd.component_sequence_id = p_old_component_sequence_id
59     And nvl(brd.acd_type, X_Add) = X_Add
60     Union
61     Select brd.component_reference_designator
62     From bom_reference_designators brd,
63          bom_inventory_components bic
64     Where DECODE(bic.old_component_sequence_id, NULL,
65 		 bic.component_sequence_id,
66 		 bic.old_component_sequence_id) = p_old_component_sequence_id
67     And   bic.component_sequence_id = brd.component_sequence_id
68     And   bic.implementation_date is null
69     And   brd.acd_type = X_Add
70     Minus
71     Select brd.component_reference_designator
72     From bom_reference_designators brd,
73          bom_inventory_components bic
74     Where DECODE(bic.old_component_sequence_id, NULL,
75 		 bic.component_sequence_id,
76 		 bic.old_component_sequence_id) = p_old_component_sequence_id
77     And   bic.component_sequence_id = brd.component_sequence_id
78     And   bic.implementation_date is null
79     And   brd.acd_type = X_Delete;
80 
81 BEGIN
82   IF (Bom_Globals.Get_Bo_Identifier = Bom_Globals.G_BOM_BO) THEN
83 	BEGIN
84 		Select count(*)
85 		Into   X_TotalQuantity
86 		From   bom_reference_designators brd ,
87          	       bom_inventory_components bic
88     		Where  brd.component_sequence_id = p_old_component_sequence_id
89     		And    bic.component_sequence_id = brd.component_sequence_id
90     		And    bic.implementation_date is NOT NULL
91     		And    nvl(brd.acd_type, 1) = 1 ;
92 
93 		RETURN;
94 	EXCEPTION
95 		WHEN OTHERS THEN
96                         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
97 	END;
98 
99   ELSE
100     X_TotalQuantity :=0;
101   	For X_Designators in GetTotalQty loop
102   	  X_TotalQuantity := X_TotalQuantity + 1;
103   	End loop;
104     RETURN;
105   END IF;
106 
107   -- Else return 0
108   X_TotalQuantity := 0;
109 
110 END Calculate_Both_Totals;
111 
112 /*************************************************************************
113 * Local Procedure: Check_Quantity
114 * Parameter IN	 : component_sequenc_id
115 *                : component_item_name
116 * Parameters OUT : Error_Status
117 * Purpose	 : Procedure Check_Quantity will take the component
118 *		   sequence_id and checks if the quantity related is set to yes for
119 *      the component and if it is yes then calculates the number of designators
120 *      by calling the Calculate_both_totals and valiadtes the totals and
121 *      send back the error status or success.
122 **************************************************************************/
123 PROCEDURE Check_Quantity
124 (   x_return_status             IN OUT NOCOPY VARCHAR2
125 ,   x_Mesg_Token_Tbl            IN OUT NOCOPY Error_Handler.Mesg_Token_Tbl_Type
126 ,   p_component_sequence_id	    IN 	NUMBER
127 ,   p_component_item_name       IN  VARCHAR2
128 )
129 IS
130 l_ref_qty		      NUMBER := 0;
131 l_quantity		      NUMBER;
132 l_return_status       VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
133 
134 l_token_tbl		      Error_Handler.Token_Tbl_Type;
135 l_Mesg_Token_Tbl	  Error_Handler.Mesg_Token_Tbl_Type;
136 
137 CURSOR c_QuantityRelated IS
138 	SELECT component_quantity
139           FROM bom_inventory_components
140          WHERE component_sequence_id = p_component_sequence_id
141            AND quantity_related      = 1;
142 
143 CURSOR c_acdtype IS
144 	SELECT acd_type, old_component_sequence_id
145 	  FROM bom_inventory_components bic
146          WHERE bic.component_sequence_id = p_component_sequence_id;
147 BEGIN
148     /*****************************************************************
149       --
150     -- If no exception is raised then validate the actual quantity of
151     -- ref. designators with respect to the component quantity
152     -- If the designators are not equal, then set error status.
153     ******************************************************************/
154 
155     OPEN c_QuantityRelated;
156     FETCH c_QuantityRelated INTO l_Quantity;
157 
158     IF c_QuantityRelated%FOUND THEN
159 
160       FOR acd IN c_acdtype LOOP
161         IF acd.acd_type = 2 /* CHANGE */
162         THEN
163           Calculate_Both_Totals
164           (  p_old_component_sequence_id => acd.old_component_sequence_id
165              , x_TotalQuantity           => l_ref_qty
166              );
167         ELSE
168             Calculate_Both_Totals
169             ( p_old_component_sequence_id => p_component_sequence_id
170               , x_TotalQuantity             => l_ref_qty);
171         END IF;
172       END LOOP;
173 
174       IF l_quantity <> l_ref_qty  THEN
175         l_return_status := FND_API.G_RET_STS_ERROR;
176 
177         l_token_tbl.delete ;
178         l_token_tbl(1).token_name  := 'REVISED_COMPONENT_NAME';
179         l_token_tbl(1).token_value := p_component_item_name;
180         Error_Handler.Add_Error_Token
181         (  x_Mesg_Token_Tbl	=> l_Mesg_Token_tbl
182          , p_Mesg_Token_Tbl	=> l_Mesg_Token_Tbl
183          , p_message_name  	=> 'BOM_QUANTITY_RELATED_INVALID'
184          , p_token_tbl		  => l_token_tbl
185          , p_message_type   => 'W'
186         );
187       END IF;
188     END IF;
189     CLOSE c_QuantityRelated;
190 
191     x_Mesg_Token_Tbl := l_Mesg_Token_Tbl;
192     x_return_status := l_return_status;
193 
194 END Check_Quantity;
195 
196 /********************************************************************
197 *
198 * Procedure     : Check_Entity
199 * Parameters IN : Reference Designator Record as given by the User
200 *                 Reference Designator Unexposed Record
201 * Parameters OUT: Return_Status - Indicating success or faliure
202 *                 Mesg_Token_Tbl - Filled with any errors or warnings
203 * Purpose       : Entity validate procedure will execute the business
204 *		  validations for the referenced designator entity
205 *		  Any errors are loaded in the Mesg_Token_Tbl and
206 *		  a return status value is set.
207 ********************************************************************/
208 
209 PROCEDURE Check_Entity
210 (   x_return_status             IN OUT NOCOPY VARCHAR2
211 ,   x_Mesg_Token_Tbl            IN OUT NOCOPY Error_Handler.Mesg_Token_Tbl_Type
212 ,   p_ref_designator_rec        IN  Bom_Bo_Pub.Ref_Designator_Rec_Type
213 ,   p_Ref_Desg_Unexp_Rec        IN  Bom_Bo_Pub.Ref_Desg_Unexposed_Rec_Type
214 )
215 IS
216 l_return_status               VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
217 l_temp_var 		      NUMBER := 0;
218 l_ref_qty		      NUMBER := 0;
219 l_component_qty		      NUMBER;
220 l_dummy			      VARCHAR(80);
221 l_processed		      BOOLEAN;
222 l_quantity		      NUMBER;
223 l_change		      NUMBER := 0;
224 l_component_seq_id	      NUMBER := 0;
225 l_token_tbl		      Error_Handler.Token_Tbl_Type;
226 l_Mesg_Token_Tbl	      Error_Handler.Mesg_Token_Tbl_Type;
227 l_Err_text		      VARCHAR2(2000);
228 l_basis_type		      NUMBER;
229 l_assy_bom_enabled  VARCHAR2(1);
230 
231 CURSOR c_acdtype IS
232 	SELECT acd_type, old_component_sequence_id
233 	  FROM bom_inventory_components bic
234          WHERE bic.component_sequence_id =
235 	       p_Ref_Desg_Unexp_Rec.component_sequence_id;
236 
237 CURSOR c_QuantityRelated IS
238 	SELECT component_quantity
239           FROM bom_inventory_components
240          WHERE component_sequence_id =
241 	       p_Ref_Desg_Unexp_rec.component_sequence_id
242            AND quantity_related      = 1;
243 BEGIN
244 
245 IF Bom_Globals.Get_Debug = 'Y' THEN Error_Handler.Write_Debug('Entity Validation for Ref. Desgs begins . . .'); END IF;
246 If bom_globals.get_debug = 'Y' then Error_Handler.write_debug('Ref Desg:  Checking for editable common bill...'); END IF;
247 BEGIN
248   SELECT 1
249   INTO l_dummy
250   FROM bom_bill_of_materials
251   WHERE bill_sequence_id = source_bill_sequence_id
252   AND bill_sequence_id = p_ref_desg_unexp_rec.bill_sequence_id;
253 EXCEPTION
254   WHEN NO_DATA_FOUND THEN
255     Error_Handler.Add_Error_Token
256     (  p_Message_Name       => 'BOM_COMMON_REF_DESG'
257     , p_Mesg_Token_Tbl     => l_Mesg_Token_Tbl
258     , x_Mesg_Token_Tbl     => l_Mesg_Token_Tbl
259     , p_Token_Tbl          => l_Token_Tbl
260     );
261     l_Return_Status := FND_API.G_RET_STS_ERROR;
262 
263 END;
264 /*  4870173  */
265   select basis_type into l_basis_type from bom_components_b where component_sequence_id = p_Ref_Desg_Unexp_Rec.component_sequence_id;
266         If(l_Basis_type = 2) THEN
267           	l_Token_Tbl(1).Token_Name := 'REVISED_COMPONENT_NAME';
268             l_Token_Tbl(1).Token_Value := p_Ref_Designator_Rec.component_item_name;
269          	Error_Handler.Add_Error_Token
270           (  x_Mesg_Token_Tbl     => l_Mesg_Token_Tbl
271             , p_Mesg_Token_Tbl     => l_Mesg_Token_Tbl
272             , p_message_name       => 'BOM_LOT_BASED_RDS'
273             , p_Token_Tbl          => l_Token_Tbl
274           );
275           l_return_status := FND_API.G_RET_STS_ERROR;
276       End if;
277 
278 /*Check BOM enabled flag of the assembly*/
279 SELECT msi.bom_enabled_flag
280 INTO l_assy_bom_enabled
281 FROM mtl_system_items_b msi,
282 bom_bill_of_materials bbom
283 WHERE bbom.bill_sequence_id = p_Ref_Desg_Unexp_Rec.bill_sequence_id
284 AND bbom.assembly_item_id = msi.inventory_item_id
285 AND bbom.organization_id = msi.organization_id;
286 
287 IF Bom_Globals.Get_Debug = 'Y' THEN Error_Handler.Write_Debug('Assy Bom Enabled flag : ' || l_assy_bom_enabled); END IF;
288 
289 IF l_assy_bom_enabled <> 'Y'
290 THEN
291       IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
292 			l_token_tbl(1).token_name  := 'REVISED_ITEM_NAME';
293 			l_token_tbl(1).token_value :=
294 				p_ref_designator_rec.Revised_Item_Name;
295                         Error_Handler.Add_Error_Token
296                         (  x_Mesg_Token_tbl => l_Mesg_Token_Tbl
297                          , p_Mesg_Token_Tbl => l_Mesg_Token_Tbl
298                          , p_message_name   => 'BOM_REV_ITEM_BOM_NOT_ENABLED'
299 			 , p_token_tbl	    => l_token_tbl
300                          );
301                 END IF;
302 		l_return_status := FND_API.G_RET_STS_ERROR;
303 END IF;
304 
305     -- The ECO can be updated but a warning needs to be generated and
306     -- scheduled revised items need to be update to Open
307     -- and the ECO status need to be changed to Not Submitted for Approval
308 
309     IF Bom_Globals.Get_Bo_Identifier = Bom_Globals.G_ECO_BO
310     THEN
311     Bom_GLOBALS.Check_Approved_For_Process
312 	( p_change_notice    => p_ref_designator_rec.Eco_Name,
313           p_organization_id  => p_ref_desg_Unexp_rec.organization_id,
314           x_processed        => l_processed,
315           x_err_text         => l_err_text
316         );
317 
318     IF l_processed = TRUE THEN
319           -- If the above process returns true then set the ECO approval.
320 
321     	BEGIN
322           Bom_GLOBALS.Set_Request_For_Approval
323 	  ( p_change_notice     => p_ref_designator_rec.Eco_Name,
324             p_organization_id   => p_ref_desg_Unexp_rec.organization_id,
325             x_err_text          => l_err_text
326            );
327 
328           EXCEPTION
329                     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
330                           l_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
331         END;
332 
333      END IF;
334    END IF;
335 
336 IF Bom_Globals.Get_Debug = 'Y' THEN Error_Handler.Write_Debug('Verified if process exists . . .'); END IF;
337 
338      /**********************************************************************
339      *
340      * If the Transaction Type is CREATE and the ACD_Type = Disable, then
341      * the reference designator should already exist for the revised
342      * component.
343      * This piece of code will not be executed by BOM BO since the acd_type is
344      * is not going to be 3 when the procedure is invoked from BOM BO.
345      ***********************************************************************/
346      IF p_ref_designator_rec.acd_type = 3 THEN
347 	BEGIN
348 
349                    SELECT component_reference_designator
350                      INTO l_dummy
351                      FROM bom_reference_designators brd,
352                           bom_inventory_components bic
353                     WHERE bic.component_sequence_id =
354                                 p_ref_desg_unexp_rec.component_sequence_id
355                       AND brd.component_sequence_id = bic.old_component_sequence_id
356                       AND brd.component_reference_designator =
357                           p_ref_designator_rec.reference_designator_name ;
358 
359 IF Bom_Globals.Get_Debug = 'Y' THEN Error_Handler.Write_Debug('Ref Desigantor: ' || l_dummy); END IF;
360 
361 		EXCEPTION
362 		WHEN NO_DATA_FOUND THEN
363 			-- It means that the reference designator does not
364 			-- exist on the revised component or it is probably
365 			-- not implemented yet.
366 
367 			l_Token_Tbl(1).Token_Name := 'REVISED_COMPONENT_NAME';
368                 	l_Token_Tbl(1).Token_Value :=
369                 		p_Ref_Designator_Rec.component_item_name;
370 
371 			l_token_tbl(2).token_name  :=
372 				'REFERENCE_DESIGNATOR_NAME';
373 			l_token_tbl(2).token_value :=
374 				p_ref_designator_rec.reference_designator_name;
375 
376                 	Error_Handler.Add_Error_Token
377                 	(  x_Mesg_Token_Tbl     => l_Mesg_Token_Tbl
378                  	 , p_Mesg_Token_Tbl     => l_Mesg_Token_Tbl
379                  	 , p_message_name       => 'BOM_DISABLE_DESG_NOT_FOUND'
380                  	 , p_Token_Tbl          => l_Token_Tbl
381                  	 );
382 
383 			l_return_status := FND_API.G_RET_STS_ERROR;
384 	END;
385 
386      END IF;
387 
388      /************************************************************************
389      * Check if ACD_Type of component is ADD then ref. desg is also add.
390      * no need for a exception as validity of component_sequence_id is already
391      * checked for.
392      *************************************************************************/
393 
394     FOR acd IN c_acdtype LOOP
395     	--
396     	-- If the component has an ACD_Type of ADD then ref. Desg must also
397 	-- be ADD
398     	--
399     	IF acd.acd_type = 1 /* ADD */ AND
400        	   p_ref_designator_rec.acd_type <> 1
401     	THEN
402  		l_return_status := FND_API.G_RET_STS_ERROR;
403 
404 
405                 l_token_tbl.delete;   -- Added by MK on 11/14/00
406 		l_Token_Tbl(1).Token_Name := 'REVISED_COMPONENT_NAME';
407 		l_Token_Tbl(1).Token_Value :=
408 	          	p_Ref_Designator_Rec.component_item_name;
409 
410         	Error_Handler.Add_Error_Token
411 		(  x_Mesg_Token_Tbl	=> l_Mesg_Token_Tbl
412 		 , p_Mesg_Token_Tbl	=> l_Mesg_Token_Tbl
413                  , p_message_name	=> 'BOM_RFD_ACD_NOT_COMPATIBLE'
414 		 , p_Token_Tbl		=> l_Token_Tbl
415                  );
416     	END IF;
417     END LOOP;
418 
419 IF Bom_Globals.Get_Debug = 'Y' THEN Error_Handler.Write_Debug('Verified Compatible ACD Types . . .'); END IF;
420 
421     /************************************************************************
422     * If the Transaction Type is CREATE and the ACD_type is ADD then check the
423     * type of item to which a ref. designator is being added. Planning bills
424     * cannot have ref. desgs and also  components which are not Standard cannot
425     * have ref. desgs. This OR so even if either exists Ref. Designators cannot
426     * be added.
427     *************************************************************************/
428 
429     BEGIN
430     	SELECT 'Non-Standard Comp'
431       	  INTO l_dummy
432       	  FROM bom_inventory_Components bic
433          WHERE bic.component_sequence_id  =
434 	       p_Ref_Desg_Unexp_Rec.component_sequence_id
435        	   AND bic.bom_item_type in (1, 2, 3); /*MODEL,OPTION CLASS,PLANNING*/
436 
437 	   -- If no exception is raised then
438 	   -- Generate an error saying that the component is non-standard.
439 
440         l_return_status := FND_API.G_RET_STS_ERROR;
441 
442         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
443         THEN
444             Error_Handler.Add_Error_Token
445             (  x_Mesg_Token_tbl => l_Mesg_Token_Tbl
446              , p_Mesg_Token_Tbl => l_Mesg_Token_Tbl
447              , p_message_name   => 'BOM_RFD_NON_STD_PARENT'
448              );
449         END IF;
450 
451 	EXCEPTION
452 		WHEN NO_DATA_FOUND THEN
453 			-- do nothing
454 			NULL;
455 		WHEN OTHERS THEN
456 --	        	dbms_output.put_line
457 --			('Unexpected error in Checking Planning Item ' ||
458 --                        SQLERRM
459 --                       );
460 
461                        Error_Handler.Add_Error_Token
462                         (  x_Mesg_Token_tbl => l_Mesg_Token_tbl
463                          , p_Mesg_Token_Tbl => l_Mesg_Token_Tbl
464                          , p_message_text   => 'ERROR in Entity validation '
465                                                || SUBSTR(SQLERRM, 1, 30) ||
466                                                ' ' || to_char(SQLCODE)
467                          , p_message_name   => NULL
468                          );
469 
470                         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
471 
472      END;  /* End Checking for non-standard component */
473 
474      BEGIN
475 	  SELECT 'Planning Bill'
476 	    INTO l_dummy
477 	    FROM sys.dual
478        	   WHERE EXISTS (SELECT 'Planning Item'
479 		     	     FROM bom_bill_of_materials bom,
480 			      	  mtl_system_items msi,
481 				  bom_inventory_components bic
482 		    	    WHERE msi.bom_item_type	= 3 /* PLANNING */
483 			      AND msi.inventory_item_id = bom.assembly_item_id
484 		      	      AND msi.organization_id   = bom.organization_id
485 			      AND bom.bill_sequence_id = bic.bill_sequence_id
486 			      AND bic.component_sequence_id =
487 				  p_Ref_Desg_Unexp_Rec.Component_sequence_id
488 			  );
489 
490 	-- If a record is found, then log an error because of the above
491 	-- mentioned comment.
492 	l_return_status := FND_API.G_RET_STS_ERROR;
493 
494         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
495         THEN
496             Error_Handler.Add_Error_Token
497 	    (  x_Mesg_Token_tbl	=> l_Mesg_Token_Tbl
498 	     , p_Mesg_Token_Tbl	=> l_Mesg_Token_Tbl
499              , p_message_name  	=> 'BOM_RFD_PLANNING_BILL'
500              );
501 	END IF;
502 
503 	EXCEPTION
504 		WHEN NO_DATA_FOUND THEN
505 			NULL; -- Do nothing
506 		WHEN OTHERS THEN
507 --		      dbms_output.put_line
508 --			('Unexpected error in Checking Planning Item ' ||
509 --			SQLERRM
510 --			);
511 
512 		       Error_Handler.Add_Error_Token
513 			(  x_Mesg_Token_tbl => l_Mesg_Token_tbl
514 			 , p_Mesg_Token_Tbl => l_Mesg_Token_Tbl
515 			 , p_message_text   => 'ERROR in Entity validation '
516 					       || SUBSTR(SQLERRM, 1, 30) ||
517 					       ' ' || to_char(SQLCODE)
518 			 , p_message_name   => NULL
519                          );
520 
521 			RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
522     END;  /* End Checking for Planning Parent */
523 
524 
525 IF Bom_Globals.Get_Debug = 'Y' THEN Error_Handler.Write_Debug('Verified Component not planning . . .'); END IF;
526 
527     /************************************************************************
528     * If a ref. designator is being added or deleted, and if the Quantity
529     * Related is 1 then their must be a check that the number of designators
530     * is equal to the component_quantity.
531     *************************************************************************/
532     IF (p_ref_designator_rec.Transaction_Type = Bom_GLOBALS.G_OPR_CREATE) THEN
533     BEGIN
534 
535        OPEN c_QuantityRelated;
536        FETCH c_QuantityRelated INTO l_Quantity;
537 
538        --IF c_QuantityRelated%FOUND THEN
539        -- Bug No:3522842. For BOM BO Quantity Related validation will be done from Bom_Bo_Pvt.
540        IF c_QuantityRelated%FOUND  AND Bom_Globals.Get_Bo_Identifier <> Bom_Globals.G_BOM_BO THEN
541 
542 	  /*****************************************************************
543           --
544 	  -- If no exception is raised then validate the actual quantity of
545 	  -- ref. designators with respect to the component quantity
546 	  -- If the designators are not equal, then generate a WARNING.
547 	  --
548 	  -- If the component to which the reference designator is added is a
549 	  -- CREATE/ADD then the reference designator must all have CREATE/ADD,
550 	  -- in this only the reference designators on the current component
551 	  -- need to be considered, therefore the old component sequence_id is
552 	  -- same as component sequence id. But, if the parent component is
553 	  -- CREATE/CHANGE, then ref. designators to the old and new
554 	  -- component should be considered
555 	  ******************************************************************/
556 
557 	 FOR acd IN c_acdtype LOOP
558 		IF acd.acd_type = 2 /* CHANGE */
559 		THEN
560 	  	    Calculate_Both_Totals
561 		    (  p_old_component_sequence_id =>
562 		       acd.old_component_sequence_id
563 		     , x_TotalQuantity             => l_ref_qty
564 		     );
565 		ELSE
566 		    Calculate_Both_Totals
567 		    (  p_old_component_sequence_id =>
568 		       p_ref_desg_Unexp_rec.component_sequence_id
569                      , x_TotalQuantity             => l_ref_qty);
570 		END IF;
571 	 END LOOP;
572 
573 --	dbms_output.put_line('Ref. Desg Qty: ' || to_char(l_ref_qty));
574 --	dbms_output.put_line('Quantity: ' || to_char(l_quantity));
575 
576 
577 	  /***************************************************************
578 	  -- Since the Component Quantity is Mandatory is must have been
579 	  -- validated prior to this call or it must have been defaulted
580 	  -- to 1 if the user has not supplied a value.
581 	  ****************************************************************/
582 
583 	  IF (p_ref_designator_rec.acd_type  = 1) THEN
584    	     l_change := 1;
585 	  ELSIF (p_ref_designator_rec.acd_type  = 3) THEN
586 	     l_change := -1;
587 	  END IF;
588 
589 	  IF l_quantity <> l_ref_qty + l_change THEN
590 		-- Log a warning but do not set the error status
591                 l_token_tbl.delete ; -- Added by MK on 11/14/00
592 		l_token_tbl(1).token_name  := 'REVISED_COMPONENT_NAME';
593 		l_token_tbl(1).token_value :=
594 			p_ref_designator_rec.component_item_name;
595                 Error_Handler.Add_Error_Token
596 		(  x_Mesg_Token_Tbl	=> l_Mesg_Token_tbl
597 		 , p_Mesg_Token_Tbl	=> l_Mesg_Token_Tbl
598                  , p_message_name  	=> 'BOM_QUANTITY_RELATED_INVALID'
599 		 , p_token_tbl		=> l_token_tbl
600                  , p_message_type       => 'W' -- Added by MK on 11/14/00
601                  );
602 	  END IF;
603 
604        END IF;
605        CLOSE c_QuantityRelated;
606     END;     /* operation = CREATE ENDS */
607     END IF;  /* If Operation = CREATE ENDS */
608 
609 IF Bom_Globals.Get_Debug = 'Y' THEN Error_Handler.Write_Debug('Verified Quantity Related . . .'); END IF;
610 
611     --  Done validating entity
612 
613     x_return_status := l_return_status;
614     x_Mesg_Token_Tbl := l_Mesg_Token_Tbl;
615 
616 
617 /* When the Designator name is updated with New_designator, It should be checked that the new_desinator
618 does not exists already */
619 
620      IF ( p_ref_designator_rec.new_reference_designator is not null
621           and p_ref_designator_rec.new_reference_designator <> FND_API.G_MISS_CHAR
622             and p_ref_designator_rec.transaction_type = Bom_Globals.G_OPR_UPDATE) THEN
623 
624         select count(*) into l_temp_var
625           FROM    BOM_REFERENCE_DESIGNATORS
626       	  WHERE   COMPONENT_REFERENCE_DESIGNATOR =  p_ref_designator_rec.new_reference_designator
627     	  AND     COMPONENT_SEQUENCE_ID = p_Ref_Desg_Unexp_Rec.component_sequence_id
628     	  AND     NVL(DECODE(ACD_TYPE, FND_API.G_MISS_NUM, null, acd_type), 0) =
629           NVL(DECODE(p_ref_designator_rec.acd_type, FND_API.G_MISS_NUM, null, p_ref_designator_rec.acd_type), 0) ;
630 
631         IF (l_temp_var <>0) then
632 
633         	l_Token_Tbl(1).Token_Name  := 'REFERENCE_DESIGNATOR_NAME';
634         	l_Token_Tbl(1).Token_Value :=
635                         p_ref_designator_rec.new_reference_designator;
636         	l_token_tbl(2).token_name  := 'REVISED_COMPONENT_NAME';
637         	l_token_tbl(2).token_value := p_ref_designator_rec.component_item_name;
638 
639                 Error_Handler.Add_Error_Token
640                 (  x_Mesg_token_tbl => l_Mesg_Token_Tbl
641                  , p_Mesg_Token_Tbl => l_Mesg_Token_Tbl
642                  , p_message_name  => 'BOM_REF_DESG_ALREADY_EXISTS'
643                  , p_token_tbl     => l_token_tbl
644                  );
645           RAISE FND_API.G_EXC_ERROR;
646         END IF;
647     END IF;
648 
649 IF Bom_Globals.Get_Debug = 'Y' THEN Error_Handler.Write_Debug('Verified New_designator ...'); END IF;
650 
651 EXCEPTION
652 
653     WHEN FND_API.G_EXC_ERROR THEN
654 
655 IF Bom_Globals.Get_Debug = 'Y' THEN Error_Handler.Write_Debug('Expected Error in Ref Desgs. Entity Validation '); END IF;
656 
657 	x_Mesg_Token_Tbl := l_Mesg_Token_Tbl;
658         x_return_status := FND_API.G_RET_STS_ERROR;
659 
660     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
661 
662 IF Bom_Globals.Get_Debug = 'Y' THEN Error_Handler.Write_Debug('UNExpected Error in Ref. Desgs Entity Validation '); END IF;
663 	x_Mesg_Token_Tbl := l_Mesg_Token_Tbl;
664         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
665 
666     WHEN OTHERS THEN
667 	x_Mesg_Token_Tbl := l_Mesg_Token_Tbl;
668         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
669 
670 END Check_Entity;
671 
672 /********************************************************************
673 *
674 * Procedure     : Check_Attributes
675 * Parameters IN : Reference Designator Record as given by the User
676 * Parameters OUT: Return_Status - Indicating success or faliure
677 *                 Mesg_Token_Tbl - Filled with any errors or warnings
678 * Purpose       : Attribute validation will validate individual attributes
679 *		  and any errors will be populated in the Mesg_Token_Tbl
680 *		  and returned with a return_status.
681 ********************************************************************/
682 
683 PROCEDURE Check_Attributes
684 (   x_return_status             IN OUT NOCOPY VARCHAR2
685 ,   x_Mesg_Token_Tbl		IN OUT NOCOPY Error_Handler.Mesg_Token_Tbl_Type
686 ,   p_ref_designator_rec	IN  Bom_Bo_Pub.Ref_Designator_Rec_Type
687 )
688 IS
689 l_token_tbl		Error_Handler.Token_tbl_Type;
690 l_Mesg_token_Tbl	Error_Handler.Mesg_Token_Tbl_Type;
691 BEGIN
692 
693     x_return_status := FND_API.G_RET_STS_SUCCESS;
694 
695     --  Validate ref_designator attributes
696 
697 IF Bom_Globals.Get_Debug = 'Y' THEN Error_Handler.Write_Debug('Attribute Validation Starts . . . '); END IF;
698 
699     IF p_ref_designator_rec.acd_type IS NOT NULL AND
700        ( ( Bom_Globals.Get_Bo_Identifier = Bom_Globals.G_ECO_BO AND
701            p_ref_designator_rec.acd_type NOT IN(1, 3)
702 	  ) OR
703 	 ( Bom_Globals.Get_Bo_Identifier = Bom_Globals.G_BOM_BO AND
704 	   p_ref_designator_rec.acd_type IS NOT NULL OR
705 	   p_ref_designator_rec.acd_type <> FND_API.G_MISS_NUM
706 	 )
707 	)
708     THEN
709         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
710         THEN
711 		l_token_tbl(1).token_name := 'REF_DESG';
712 		l_token_tbl(1).token_value := 'BOM_REF_DESG_CAP';
713 		l_token_tbl(1).translate   := TRUE;
714 
715 		Error_Handler.Add_Error_Token
716 		(  x_Mesg_Token_tbl	=> l_Mesg_Token_tbl
717 		 , p_Mesg_Token_Tbl	=> l_Mesg_Token_Tbl
718                  , p_message_name	=> 'BOM_RFD_SBC_ACD_TYPE_INVALID'
719                  , p_token_tbl		=> l_token_tbl
720 		 );
721         END IF;
722         x_return_status := FND_API.G_RET_STS_ERROR;
723     END IF;
724 
725 IF Bom_Globals.Get_Debug = 'Y' THEN Error_Handler.Write_Debug('After ACD_TYPE . . .'); END IF;
726 
727     --  Done validating attributes
728     x_Mesg_Token_Tbl := l_Mesg_Token_Tbl;
729 
730 EXCEPTION
731 
732     WHEN FND_API.G_EXC_ERROR THEN
733 
734 IF Bom_Globals.Get_Debug = 'Y' THEN Error_Handler.Write_Debug('Expected Error in Ref. Desgs Attr Validation . . .'); END IF;
735 	x_Mesg_token_Tbl := l_Mesg_token_Tbl;
736         x_return_status := FND_API.G_RET_STS_ERROR;
737 
738     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
739 
740 IF Bom_Globals.Get_Debug = 'Y' THEN Error_Handler.Write_Debug('UNExpected Error in Ref. Desgs Attr Validation . . .'); END IF;
741 	x_Mesg_Token_Tbl := l_Mesg_Token_Tbl;
742         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
743 
744     WHEN OTHERS THEN
745 	x_Mesg_Token_Tbl := l_Mesg_Token_Tbl;
746         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
747 
748 END Check_Attributes;
749 
750 /********************************************************************
751 *
752 * Procedure     : Check_Entity_Delete
753 * Parameters IN : Reference Designator Record as given by the User
754 *                 Reference Designator Unexposed Record
755 * Parameters OUT: Return_Status - Indicating success or faliure
756 *                 Mesg_Token_Tbl - Filled with any errors or warnings
757 * Purpose       : Entity Delete procedure will verify if the entity can
758 *		  can be deleted without violating any business rules.
759 *		  In case of errors the Mesg_token_Tbl is populated and
760 *		  process return with a status other than 'S'
761 *		  Warning will not prevent the entity from being deleted.
762 ********************************************************************/
763 
764 PROCEDURE Check_Entity_Delete
765 (   x_return_status             IN OUT NOCOPY VARCHAR2
766 ,   x_Mesg_Token_Tbl		IN OUT NOCOPY Error_Handler.Mesg_Token_Tbl_Type
767 ,   p_ref_designator_rec        IN  Bom_Bo_Pub.Ref_Designator_Rec_Type
768 ,   p_Ref_Desg_Unexp_Rec	IN  Bom_Bo_Pub.Ref_Desg_Unexposed_Rec_Type
769 )
770 IS
771 l_return_status               VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
772 l_Mesg_Token_Tbl	      Error_Handler.Mesg_Token_Tbl_Type;
773 l_token_tbl		      Error_Handler.Token_Tbl_Type;
774 
775 BEGIN
776 
777     /***********************************************************************
778     -- If a Ref, Designator is being deleted and the Quantity Related for the
779     -- Component is 1 then a warning must be given if the the deletion is
780     -- going to make the number or designators <> Component Quantity.
781     ************************************************************************/
782     BEGIN
783  	SELECT 'Related'
784 	  INTO l_dummy
785 	  FROM bom_inventory_components
786 	 WHERE quantity_related = 1
787 	   AND component_sequence_id =
788 	       p_ref_desg_Unexp_rec.component_sequence_id;
789 
790 
791 	-- But the Quantity Related is 1 so log a warning
792         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR)
793 			-- This ideally should be a warning
794         THEN
795                 -- Added token by MK on 12/06/00
796                 l_token_tbl(1).token_name  := 'REVISED_COMPONENT_NAME';
797                 l_token_tbl(1).token_value :=
798                         p_ref_designator_rec.component_item_name;
799 
800      		Error_Handler.Add_Error_Token
801 		(  x_Mesg_Token_tbl	=> l_Mesg_Token_tbl
802 		 , p_Mesg_Token_Tbl	=> l_Mesg_Token_Tbl
803                  , p_message_name	=> 'BOM_QUANTITY_RELATED_INVALID'
804                  , p_message_type       => 'W'
805 
806                  );
807 	END IF;
808 
809      EXCEPTION
810 		WHEN NO_DATA_FOUND THEN
811 			NULL;
812      END ;
813 
814      -- Added by MK on 11/14/00
815      x_return_status :=  l_return_status ;
816      x_Mesg_Token_Tbl := l_Mesg_Token_Tbl;
817 
818 END Check_Entity_Delete;
819 
820 /*****************************************************************************
821 * Procedure     : Check_Existence
822 * Parameters IN : Refernce Designator exposed column record
823 *                 Refernce Designator unexposed column record
824 * Parameters OUT: Old Reference Designator exposed column record
825 *                 Old Reference Designator unexposed column record
826 *                 Mesg Token Table
827 *                 Return Status
828 * Purpose       : Check_Existence will poerform a query using the primary key
829 *                 information and will return a success if the operation is
830 *                 CREATE and the record EXISTS or will return an
831 *                 error if the operation is UPDATE and the record DOES NOT
832 *                 EXIST.
833 *                 In case of UPDATE if the record exists then the procedure
834 *                 will return the old record in the old entity parameters
835 *                 with a success status.
836 ****************************************************************************/
837 PROCEDURE Check_Existence
838 (  p_ref_designator_rec         IN  Bom_Bo_Pub.Ref_Designator_Rec_Type
839  , p_ref_desg_unexp_rec         IN  Bom_Bo_Pub.Ref_Desg_Unexposed_Rec_Type
840  , x_old_ref_designator_rec     IN OUT NOCOPY Bom_Bo_Pub.Ref_Designator_Rec_Type
841  , x_old_ref_desg_unexp_rec     IN OUT NOCOPY Bom_Bo_Pub.Ref_Desg_Unexposed_Rec_Type
842  , x_Mesg_Token_Tbl             IN OUT NOCOPY Error_Handler.Mesg_Token_Tbl_Type
843  , x_Return_Status              IN OUT NOCOPY VARCHAR2
844 )
845 IS
846 	l_Mesg_Token_Tbl	Error_Handler.Mesg_Token_Tbl_Type;
847 	l_Return_Status		VARCHAR2(1);
848 	l_Token_Tbl		Error_Handler.Token_Tbl_Type;
849 BEGIN
850         l_Token_Tbl(1).Token_Name  := 'REFERENCE_DESIGNATOR_NAME';
851         l_Token_Tbl(1).Token_Value :=
852 			p_ref_designator_rec.reference_designator_name;
853 	l_token_tbl(2).token_name  := 'REVISED_COMPONENT_NAME';
854 	l_token_tbl(2).token_value := p_ref_designator_rec.component_item_name;
855 
856         BOM_Ref_Designator_Util.Query_Row
857 	(   p_ref_designator		=>
858 				p_ref_designator_rec.reference_designator_name
859 	,   p_component_sequence_id	=>
860 				p_ref_desg_unexp_rec.component_sequence_id
861 	,   p_acd_type			=> p_ref_designator_rec.acd_type
862 	,   x_Ref_Designator_Rec	=> x_old_ref_designator_rec
863 	,   x_Ref_Desg_Unexp_Rec	=> x_old_ref_desg_unexp_rec
864 	,   x_Return_Status		=> l_return_status
865 	);
866 
867         IF l_return_status = Bom_Globals.G_RECORD_FOUND AND
868            p_ref_designator_rec.transaction_type = Bom_Globals.G_OPR_CREATE
869         THEN
870                 Error_Handler.Add_Error_Token
871                 (  x_Mesg_token_tbl => l_Mesg_Token_Tbl
872                  , p_Mesg_Token_Tbl => l_Mesg_Token_Tbl
873                  , p_message_name  => 'BOM_REF_DESG_ALREADY_EXISTS'
874                  , p_token_tbl     => l_token_tbl
875                  );
876                  l_return_status := FND_API.G_RET_STS_ERROR;
877         ELSIF l_return_status = Bom_Globals.G_RECORD_NOT_FOUND AND
878               p_ref_designator_rec.transaction_type IN
879                  (Bom_Globals.G_OPR_UPDATE, Bom_Globals.G_OPR_DELETE)
880         THEN
881                 Error_Handler.Add_Error_Token
882                 (  x_Mesg_token_tbl => l_Mesg_Token_Tbl
883                  , p_Mesg_Token_Tbl => l_Mesg_Token_Tbl
884                  , p_message_name  => 'BOM_REF_DESG_DOESNOT_EXIST'
885                  , p_token_tbl     => l_token_tbl
886                  );
887                  l_return_status := FND_API.G_RET_STS_ERROR;
888         ELSIF l_Return_status = FND_API.G_RET_STS_UNEXP_ERROR
889         THEN
890                 Error_Handler.Add_Error_Token
891                 (  x_Mesg_token_tbl     => l_Mesg_Token_Tbl
892                  , p_Mesg_Token_Tbl     => l_Mesg_Token_Tbl
893                  , p_message_name       => NULL
894                  , p_message_text       =>
895                    'Unexpected error while existence verification of ' ||
896                    'Reference Designator '||
897                    p_ref_designator_rec.reference_designator_name
898                  , p_token_tbl          => l_token_tbl
899                  );
900         ELSE
901 
902                  /* Assign the relevant transaction type for SYNC operations */
903 
904                  IF p_ref_designator_rec.transaction_type = 'SYNC' THEN
905                    IF l_return_status = Bom_Globals.G_RECORD_FOUND THEN
906                      x_old_ref_designator_rec.transaction_type :=
907                                                    Bom_Globals.G_OPR_UPDATE;
908                    ELSE
909                      x_old_ref_designator_rec.transaction_type :=
910                                                    Bom_Globals.G_OPR_CREATE;
911                    END IF;
912                  END IF;
913                  l_return_status := FND_API.G_RET_STS_SUCCESS;
914 
915         END IF;
916 
917         x_return_status := l_return_status;
918         x_Mesg_Token_Tbl := l_Mesg_Token_Tbl;
919 
920 END Check_Existence;
921 
922 PROCEDURE Check_Lineage
923 (  p_ref_designator_rec         IN  Bom_Bo_Pub.Ref_Designator_Rec_Type
924  , p_ref_desg_unexp_rec         IN  Bom_Bo_Pub.Ref_Desg_Unexposed_Rec_Type
925  , x_Mesg_Token_Tbl             IN OUT NOCOPY Error_Handler.Mesg_Token_Tbl_Type
926  , x_Return_Status              IN OUT NOCOPY VARCHAR2
927 )
928 IS
929 	l_token_tbl 		Error_Handler.Token_Tbl_Type;
930 	l_Mesg_Token_Tbl	Error_Handler.Mesg_Token_Tbl_Type;
931 
932 	CURSOR c_GetComponent IS
933 	SELECT revised_item_sequence_id
934 	  FROM bom_inventory_components
935 	 WHERE component_item_id= p_ref_desg_unexp_rec.component_item_id
936 	   AND operation_seq_num=p_ref_designator_rec.operation_sequence_number
937 	   AND effectivity_date = p_ref_designator_rec.start_effective_date
938 	   AND bill_sequence_id = p_ref_desg_unexp_rec.bill_sequence_id;
939 BEGIN
940 	x_return_status := FND_API.G_RET_STS_SUCCESS;
941 
942 	FOR Component IN c_GetComponent LOOP
943 		IF Component.revised_item_sequence_id <>
944 			p_ref_desg_unexp_rec.revised_item_sequence_id
945 		THEN
946                                 l_Token_Tbl(1).token_name  :=
947 					'REVISED_COMPONENT_NAME';
948                                 l_Token_Tbl(1).token_value :=
949                                      p_ref_designator_rec.component_item_name;
950                                 l_Token_Tbl(2).token_name  :=
951 					'REFERENCE_DESIGNATOR_NAME';
952                                 l_Token_Tbl(2).token_value :=
953                                  p_ref_designator_rec.reference_designator_name;
954 				 l_Token_Tbl(3).token_name  :=
955                                         'REVISED_ITEM_NAME';
956                                 l_Token_Tbl(3).token_value :=
957                                  p_ref_designator_rec.revised_item_name;
958 
959                                 Error_Handler.Add_Error_Token
960                                 (  p_Message_Name => 'BOM_REF_REV_ITEM_MISMATCH'
961                                  , p_Mesg_Token_Tbl => l_Mesg_Token_Tbl
962                                  , x_Mesg_Token_Tbl => l_Mesg_Token_Tbl
963                                  , p_Token_Tbl      => l_Token_Tbl
964                                  );
965                                 x_return_status := FND_API.G_RET_STS_ERROR;
966 		END IF;
967 	END LOOP;
968 
969 	x_Mesg_Token_Tbl := l_Mesg_Token_Tbl;
970 
971 END CHECK_LINEAGE;
972 
973 PROCEDURE CHECK_ACCESS
974 (  p_ref_designator_rec	IN  Bom_Bo_Pub.Ref_Designator_Rec_Type
975  , p_ref_desg_unexp_rec	IN  Bom_Bo_Pub.Ref_Desg_Unexposed_Rec_Type
976  , x_Mesg_Token_Tbl	IN OUT NOCOPY Error_Handler.Mesg_Token_Tbl_Type
977  , x_Return_Status	IN OUT NOCOPY VARCHAR2
978 )
979 IS
980 	l_return_status		VARCHAR2(1);
981 	l_mesg_token_tbl	Error_Handler.Mesg_Token_Tbl_Type;
982 	l_dummy			VARCHAR2(80);
983 	l_token_tbl		Error_Handler.Token_Tbl_Type;
984 BEGIN
985 	l_return_status := FND_API.G_RET_STS_SUCCESS;
986 
987     /************************************************************************
988      *
989      * If the parent component is having an ACD_type of Disable then cannot
990      * perform any operations on the reference designator.
991      *
992      ************************************************************************/
993     BEGIN
994         SELECT 'parent not disabled'
995           INTO l_dummy
996           FROM bom_inventory_components bic
997          WHERE bic.component_sequence_id =
998                p_Ref_Desg_Unexp_Rec.component_sequence_id
999            AND NVL(bic.acd_type, 0)  <> 3;
1000         EXCEPTION
1001                 WHEN NO_DATA_FOUND THEN
1002                         -- This means that the parent is disabled as
1003                         -- the record search was fired to get a parent
1004                         -- which is not disabled
1005 
1006                         l_token_Tbl(1).Token_Name := 'REF_DESG';
1007                         l_token_Tbl(1).Token_Value :=
1008                         p_Ref_Designator_Rec.Reference_Designator_Name;
1009 
1010                         Error_Handler.Add_Error_Token
1011                         (  x_Mesg_Token_tbl   => l_Mesg_token_tbl
1012                          , p_Mesg_Token_Tbl   => l_Mesg_Token_Tbl
1013                          , p_message_name     => 'BOM_RFD_COMP_ACD_TYPE_DISABLE'
1014                          , p_Token_Tbl        => l_Token_Tbl
1015                          );
1016                         l_return_status := FND_API.G_RET_STS_ERROR;
1017                 WHEN OTHERS THEN
1018                         --This means that an unexpected error has occured
1019                        Error_Handler.Add_Error_Token
1020                         (  x_Mesg_Token_tbl     => l_Mesg_Token_tbl
1021                          , p_Mesg_token_Tbl     => l_Mesg_Token_Tbl
1022                          , p_message_name       => NULL
1023                          , p_message_text       => 'ERROR in Entity validation '
1024                                                    || SUBSTR(SQLERRM, 1, 240)
1025                                                    || ' ' || to_char(SQLCODE)
1026                          );
1027 
1028                         l_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1029     END;
1030     x_return_status  := l_return_status;
1031     x_Mesg_Token_Tbl := l_Mesg_Token_Tbl;
1032 
1033 END CHECK_ACCESS;
1034 
1035 /*
1036 ** BOM Business Object procedure calls
1037 */
1038 PROCEDURE Check_Entity
1039 (   x_return_status             IN OUT NOCOPY VARCHAR2
1040 ,   x_Mesg_Token_Tbl            IN OUT NOCOPY Error_Handler.Mesg_Token_Tbl_Type
1041 ,   p_bom_ref_designator_rec        IN  Bom_Bo_Pub.Bom_Ref_Designator_Rec_Type
1042 ,   p_bom_Ref_Desg_Unexp_Rec        IN  Bom_Bo_Pub.Bom_Ref_Desg_Unexp_Rec_Type
1043 )
1044 IS
1045 	l_ref_designator_rec	Bom_Bo_Pub.Ref_Designator_rec_Type;
1046 	l_ref_desg_unexp_rec	Bom_Bo_Pub.Ref_Desg_Unexposed_Rec_Type;
1047 BEGIN
1048 	--Convert the BOM Record to ECO
1049 
1050 	Bom_Bo_Pub.Convert_Bomdesg_To_EcoDesg
1051 	(  p_bom_ref_designator_rec	=> p_bom_ref_designator_rec
1052 	 , p_bom_ref_desg_unexp_rec	=> p_bom_ref_desg_unexp_rec
1053 	 , x_ref_designator_rec		=> l_Ref_designator_rec
1054 	 , x_ref_Desg_unexp_rec		=> l_ref_desg_unexp_rec
1055 	);
1056 
1057 	-- Call Check Entity
1058 	Bom_Validate_Ref_Designator.Check_Entity
1059 	(  p_ref_designator_rec		=> l_ref_designator_rec
1060 	 , p_ref_desg_unexp_rec		=> l_Ref_Desg_unexp_rec
1061 	 , x_return_status		=> x_return_status
1062 	 , x_mesg_token_tbl		=> x_mesg_token_tbl
1063 	);
1064 
1065 END Check_Entity;
1066 
1067 --  Procedure Attributes
1068 
1069 PROCEDURE Check_Attributes
1070 (   x_return_status             IN OUT NOCOPY VARCHAR2
1071 ,   x_Mesg_Token_Tbl            IN OUT NOCOPY Error_Handler.Mesg_Token_Tbl_Type
1072 ,   p_Bom_ref_designator_rec        IN  Bom_Bo_Pub.Bom_Ref_Designator_Rec_Type
1073 )
1074 IS
1075         l_ref_designator_rec    Bom_Bo_Pub.Ref_Designator_rec_Type;
1076         l_ref_desg_unexp_rec    Bom_Bo_Pub.Ref_Desg_Unexposed_Rec_Type;
1077 BEGIN
1078         --Convert the BOM Record to ECO
1079 
1080         Bom_Bo_Pub.Convert_Bomdesg_To_EcoDesg
1081         (  p_bom_ref_designator_rec     => p_bom_ref_designator_rec
1082          , x_ref_designator_rec         => l_Ref_designator_rec
1083          , x_ref_Desg_unexp_rec         => l_ref_desg_unexp_rec
1084         );
1085 
1086         -- Call Check Entity
1087         Bom_Validate_Ref_Designator.Check_Attributes
1088         (  p_ref_designator_rec         => l_ref_designator_rec
1089          , x_return_status              => x_return_status
1090          , x_mesg_token_tbl             => x_mesg_token_tbl
1091         );
1092 
1093 END Check_Attributes;
1094 
1095 --  Procedure Entity_Delete
1096 
1097 PROCEDURE Check_Entity_Delete
1098 (   x_return_status             IN OUT NOCOPY VARCHAR2
1099 ,   x_Mesg_Token_Tbl            IN OUT NOCOPY Error_Handler.Mesg_Token_Tbl_Type
1100 ,   p_bom_ref_designator_rec        IN  Bom_Bo_Pub.Bom_Ref_Designator_Rec_Type
1101 ,   p_bom_Ref_Desg_Unexp_Rec        IN  Bom_Bo_Pub.Bom_Ref_Desg_Unexp_Rec_Type
1102 )
1103 IS
1104         l_ref_designator_rec    Bom_Bo_Pub.Ref_Designator_rec_Type;
1105         l_ref_desg_unexp_rec    Bom_Bo_Pub.Ref_Desg_Unexposed_Rec_Type;
1106 BEGIN
1107         --Convert the BOM Record to ECO
1108 
1109         Bom_Bo_Pub.Convert_Bomdesg_To_EcoDesg
1110         (  p_bom_ref_designator_rec     => p_bom_ref_designator_rec
1111          , p_bom_ref_desg_unexp_rec     => p_bom_ref_desg_unexp_rec
1112          , x_ref_designator_rec         => l_Ref_designator_rec
1113          , x_ref_Desg_unexp_rec         => l_ref_desg_unexp_rec
1114         );
1115 
1116         -- Call Check Entity
1117         Bom_Validate_Ref_Designator.Check_Entity_Delete
1118         (  p_ref_designator_rec         => l_ref_designator_rec
1119          , p_ref_desg_unexp_rec         => l_Ref_Desg_unexp_rec
1120          , x_return_status              => x_return_status
1121          , x_mesg_token_tbl             => x_mesg_token_tbl
1122         );
1123 
1124 
1125 END Check_Entity_Delete;
1126 
1127 PROCEDURE Check_Existence
1128 (  p_bom_ref_designator_rec         IN  Bom_Bo_Pub.Bom_Ref_Designator_Rec_Type
1129  , p_bom_ref_desg_unexp_rec         IN  Bom_Bo_Pub.Bom_Ref_Desg_Unexp_Rec_Type
1130  , x_old_bom_ref_designator_rec     IN OUT NOCOPY Bom_Bo_Pub.Bom_Ref_Designator_Rec_Type
1131  , x_old_bom_ref_desg_unexp_rec     IN OUT NOCOPY Bom_Bo_Pub.Bom_Ref_Desg_Unexp_Rec_Type
1132  , x_Mesg_Token_Tbl             IN OUT NOCOPY Error_Handler.Mesg_Token_Tbl_Type
1133  , x_Return_Status              IN OUT NOCOPY VARCHAR2
1134 )
1135 IS
1136         l_ref_designator_rec    Bom_Bo_Pub.Ref_Designator_rec_Type;
1137         l_ref_desg_unexp_rec    Bom_Bo_Pub.Ref_Desg_Unexposed_Rec_Type;
1138 	l_old_ref_designator_rec Bom_Bo_Pub.Ref_Designator_Rec_Type;
1139 	l_old_ref_desg_unexp_rec Bom_Bo_Pub.Ref_Desg_Unexposed_Rec_Type;
1140 
1141 BEGIN
1142         --Convert the BOM Record to ECO
1143 
1144         Bom_Bo_Pub.Convert_Bomdesg_To_EcoDesg
1145         (  p_bom_ref_designator_rec     => p_bom_ref_designator_rec
1146          , p_bom_ref_desg_unexp_rec     => p_bom_ref_desg_unexp_rec
1147          , x_ref_designator_rec         => l_Ref_designator_rec
1148          , x_ref_Desg_unexp_rec         => l_ref_desg_unexp_rec
1149         );
1150 
1151 -- dbms_output.put_line('Before Check Existence . . . ');
1152 -- dbms_output.put_line('Component Sequence: ' || l_ref_desg_unexp_rec.component_sequence_id);
1153 -- dbms_output.put_line('Reference Designator ' || l_Ref_designator_rec.reference_designator_name);
1154 
1155         -- Call Check Entity
1156         Bom_Validate_Ref_Designator.Check_Existence
1157         (  p_ref_designator_rec         => l_ref_designator_rec
1158          , p_ref_desg_unexp_rec         => l_Ref_Desg_unexp_rec
1159 	 , x_old_ref_designator_rec	=> l_old_ref_designator_rec
1160 	 , x_old_ref_desg_unexp_rec	=> l_old_ref_desg_unexp_rec
1161          , x_return_status              => x_return_status
1162          , x_mesg_token_tbl             => x_mesg_token_tbl
1163         );
1164 
1165 	-- Convert ECO Record to BOM before returning
1166 	Bom_Bo_Pub.Convert_EcoDesg_To_BomDesg
1167 	(  p_ref_designator_rec		=> l_old_ref_designator_rec
1168 	 , p_ref_desg_unexp_rec		=> l_old_ref_desg_unexp_rec
1169 	 , x_bom_ref_designator_rec	=> x_old_bom_ref_designator_rec
1170 	 , x_bom_ref_desg_unexp_rec	=> x_old_bom_ref_desg_unexp_rec
1171 	);
1172 
1173 END Check_Existence;
1174 
1175 PROCEDURE Check_Lineage
1176 (  p_bom_ref_designator_rec         IN  Bom_Bo_Pub.bom_Ref_Designator_Rec_Type
1177  , p_bom_ref_desg_unexp_rec         IN  Bom_Bo_Pub.bom_Ref_Desg_Unexp_Rec_Type
1178  , x_Mesg_Token_Tbl             IN OUT NOCOPY Error_Handler.Mesg_Token_Tbl_Type
1179  , x_Return_Status              IN OUT NOCOPY VARCHAR2
1180 )
1181 IS
1182         l_ref_designator_rec    Bom_Bo_Pub.Ref_Designator_rec_Type;
1183         l_ref_desg_unexp_rec    Bom_Bo_Pub.Ref_Desg_Unexposed_Rec_Type;
1184 BEGIN
1185         --Convert the BOM Record to ECO
1186 
1187         Bom_Bo_Pub.Convert_Bomdesg_To_EcoDesg
1188         (  p_bom_ref_designator_rec     => p_bom_ref_designator_rec
1189          , p_bom_ref_desg_unexp_rec     => p_bom_ref_desg_unexp_rec
1190          , x_ref_designator_rec         => l_Ref_designator_rec
1191          , x_ref_Desg_unexp_rec         => l_ref_desg_unexp_rec
1192         );
1193 
1194         -- Call Check Entity
1195         Bom_Validate_Ref_Designator.Check_Lineage
1196         (  p_ref_designator_rec         => l_ref_designator_rec
1197          , p_ref_desg_unexp_rec         => l_Ref_Desg_unexp_rec
1198          , x_return_status              => x_return_status
1199          , x_mesg_token_tbl             => x_mesg_token_tbl
1200         );
1201 
1202 END Check_Lineage;
1203 
1204 PROCEDURE CHECK_ACCESS
1205 (  p_bom_ref_designator_rec IN  Bom_Bo_Pub.Bom_Ref_Designator_Rec_Type
1206  , p_bom_ref_desg_unexp_rec IN  Bom_Bo_Pub.Bom_Ref_Desg_Unexp_Rec_Type
1207  , x_Mesg_Token_Tbl     IN OUT NOCOPY Error_Handler.Mesg_Token_Tbl_Type
1208  , x_Return_Status      IN OUT NOCOPY VARCHAR2
1209 )
1210 IS
1211         l_ref_designator_rec    Bom_Bo_Pub.Ref_Designator_rec_Type;
1212         l_ref_desg_unexp_rec    Bom_Bo_Pub.Ref_Desg_Unexposed_Rec_Type;
1213 BEGIN
1214         --Convert the BOM Record to ECO
1215 
1216         Bom_Bo_Pub.Convert_Bomdesg_To_EcoDesg
1217         (  p_bom_ref_designator_rec     => p_bom_ref_designator_rec
1218          , p_bom_ref_desg_unexp_rec     => p_bom_ref_desg_unexp_rec
1219          , x_ref_designator_rec         => l_Ref_designator_rec
1220          , x_ref_Desg_unexp_rec         => l_ref_desg_unexp_rec
1221         );
1222 
1223         -- Call Check Access
1224         Bom_Validate_Ref_Designator.Check_Access
1225         (  p_ref_designator_rec         => l_ref_designator_rec
1226          , p_ref_desg_unexp_rec         => l_Ref_Desg_unexp_rec
1227          , x_return_status              => x_return_status
1228          , x_mesg_token_tbl             => x_mesg_token_tbl
1229         );
1230 
1231 END Check_Access;
1232 
1233 
1234 END BOM_Validate_Ref_Designator;