DBA Data[Home] [Help]

PACKAGE BODY: APPS.GMD_QC_TESTS_GRP

Source


1 PACKAGE BODY GMD_QC_TESTS_GRP as
2 /* $Header: GMDGTSTB.pls 120.1 2006/03/22 23:07:10 rlnagara noship $*/
3 
4 /*===========================================================================
5   FUNCTION  NAME:	check_test_exist
6 
7   DESCRIPTION:		This procedure checks whether the test_code/test_id
8   			already exists or not.
9 
10   PARAMETERS:		In : p_init_msg_list - Valid values are 'T' and 'F'
11 			     p_test_code/p_test_id to validate
12 
13 			Out: x_test_exist returns TRUE if test exist else FALSE.
14 
15   CHANGE HISTORY:	Created		09-JUL-02	MCHANDAK
16              Ravi Boddu 29-APR-2004 Added the function test_group_order_exist Bug: 3447472
17 ===========================================================================*/
18 FUNCTION CHECK_TEST_EXIST(
19 		    p_init_msg_list      IN   VARCHAR2 ,
20 		    p_test_code          IN   VARCHAR2 ,
21          	    p_test_id		 IN   NUMBER   )
22 RETURN BOOLEAN IS
23 
24 l_progress  VARCHAR2(3);
25 l_exists    VARCHAR2(1);
26 BEGIN
27 	l_progress := '010';
28 
29      	IF FND_API.to_Boolean( p_init_msg_list ) THEN
30             FND_MSG_PUB.initialize;    -- clear the message stack.
31 	END IF;
32 
33 	IF p_test_id IS NULL AND p_test_code IS NULL THEN
34 	    FND_MESSAGE.SET_NAME('GMD','GMD_TEST_ID_CODE_NULL');
35             FND_MSG_PUB.ADD;
36             RETURN FALSE;
37 	END IF;
38 
39 	l_progress := '020';
40 
41 	BEGIN
42 	     IF p_test_id IS NOT NULL THEN
43 	        SELECT 'X' INTO l_exists
44              	FROM GMD_QC_TESTS_B
45              	WHERE  test_id = p_test_id ;
46              ELSE
47                 SELECT 'X' INTO l_exists
48 	        FROM GMD_QC_TESTS_B
49                 WHERE  test_code = p_test_code ;
50              END IF;
51 
52              RETURN TRUE;
53 
54         EXCEPTION
55         WHEN NO_DATA_FOUND THEN
56            RETURN FALSE;
57         END;
58 
59 EXCEPTION WHEN OTHERS
60 THEN
61       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
62       FND_MESSAGE.Set_Token('PACKAGE','GMD_QC_TESTS_GRP.CHECK_TEST_EXIST' );
63       FND_MESSAGE.Set_Token('ERROR', SUBSTR(SQLERRM,1,100));
64       FND_MESSAGE.Set_Token('POSITION',l_progress );
65       FND_MSG_PUB.ADD;
66       RETURN FALSE;
67 END CHECK_TEST_EXIST;
68 
69 
70 /*===========================================================================
71 
72   FUNCTION NAME:	test_exist_in_spec
73 
74 ===========================================================================*/
75 
76 FUNCTION test_exist_in_spec(
77 		    p_init_msg_list   IN   VARCHAR2 ,
78 		    p_test_id	      IN   NUMBER)  RETURN BOOLEAN IS
79 
80 CURSOR cr_test_exist IS
81   SELECT  'Y' FROM GMD_SPEC_TESTS_B gst ,GMD_SPECIFICATIONS_B gs
82   WHERE  gst.test_id = p_test_id
83   AND gst.spec_id = gs.spec_id
84   AND gs.delete_mark = 0 ;
85 
86 l_progress  VARCHAR2(3);
87 l_temp	VARCHAR2(1);
88 
89 BEGIN
90 	l_progress := '010';
91 
92      	IF FND_API.to_Boolean( p_init_msg_list ) THEN
93             FND_MSG_PUB.initialize;    -- clear the message stack.
94 	END IF;
95 
96 	IF p_test_id IS NULL THEN
97 	   FND_MESSAGE.Set_Name('GMD','GMD_TEST_ID_CODE_NULL');
98            FND_MSG_PUB.ADD;
99            RETURN FALSE;
100         END IF;
101 
102         l_progress := '020';
103 
104 	OPEN  cr_test_exist;
105 	FETCH cr_test_exist into l_temp;
106 	IF cr_test_exist%FOUND THEN
107 	   CLOSE cr_test_exist;
108 	   RETURN TRUE;
109 	ELSE
110 	   CLOSE cr_test_exist;
111 	   RETURN FALSE;
112         END IF;
113 
114 
115 EXCEPTION WHEN OTHERS
116 THEN
117       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
118       FND_MESSAGE.Set_Token('PACKAGE','GMD_QC_TESTS_GRP.TEST_EXIST_IN_SPEC' );
119       FND_MESSAGE.Set_Token('ERROR', substr(sqlerrm,1,100));
120       FND_MESSAGE.Set_Token('POSITION',l_progress );
121       FND_MSG_PUB.ADD;
122       RETURN FALSE;
123 END TEST_EXIST_IN_SPEC;
124 
125 /*===========================================================================
126   FUNCTION  NAME:	get_test_id_tab
127 
128   DESCRIPTION:		This procedure returns table of type EXP_TEST_ID_TAB_TYPE
129 
130   PARAMETERS:
131 
132   CHANGE HISTORY:	Created		09-JUL-02	MCHANDAK
133 ===========================================================================*/
134 
135 FUNCTION GET_TEST_ID_TAB RETURN exp_test_id_tab_type IS
136 l_test_id_tab  EXP_TEST_ID_TAB_TYPE;
137 BEGIN
138     return(l_test_id_tab);
139 END;
140 
141 /*===========================================================================
142 
143   PROCEDURE NAME:	validate_expression
144 
145 ===========================================================================*/
146 PROCEDURE validate_expression(
147 		    p_init_msg_list   IN   VARCHAR2 ,
148          	    p_expression      IN   VARCHAR2,
149          	    x_test_tab        OUT  NOCOPY exp_test_id_tab_type,
150          	    x_return_status   OUT  NOCOPY VARCHAR2,
151          	    x_message_data    OUT NOCOPY VARCHAR2)  IS
152 
153 l_progress     VARCHAR2(3);
154 l_exptab       GMD_UTILITY_PKG.exptab ;
155 l_test_in_rec  GMD_QC_TESTS%ROWTYPE ;
156 l_test_rec     GMD_QC_TESTS%ROWTYPE ;
157 BEGIN
158 	l_progress := '010';
159 
160      	x_return_status := FND_API.G_RET_STS_SUCCESS ;
161 	IF FND_API.to_Boolean( p_init_msg_list ) THEN
162             FND_MSG_PUB.initialize;    -- clear the message stack.
163 	END IF;
164 
165 	IF p_expression IS NULL THEN
166 	   FND_MESSAGE.Set_Name('GMD','GMD_NO_EXPRESSION');
167            FND_MSG_PUB.ADD;
168            RAISE FND_API.G_EXC_ERROR ;
169         END IF;
170 
171         l_progress := '020';
172 
173         GMD_UTILITY_PKG.parse(x_exp   		=> p_expression,
174                    	      x_exptab 		=> l_exptab,
175                    	      x_return_status   => x_return_status);
176 
177         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
178            x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
179            RETURN;
180         END IF;
181 
182         l_progress := '030';
183 
184         FOR i IN 1..l_exptab.COUNT
185         LOOP
186              IF l_exptab(i).pvalue_type = 'O' THEN
187              	  l_test_in_rec.test_code := l_exptab(i).poperand ;
188              	  l_test_in_rec.test_id   := NULL;
189 
190              	  IF NOT ( GMD_QC_TESTS_PVT.Fetch_Row(
191                     p_gmd_qc_tests => l_test_in_rec,
192                     x_gmd_qc_tests => l_test_rec)) THEN
193                       FND_MESSAGE.SET_NAME('GMD','GMD_INVALID_TEST_EXP');
194 		      FND_MESSAGE.SET_TOKEN('TEST',l_exptab(i).poperand);
195                       FND_MSG_PUB.ADD;
196  	              RAISE FND_API.G_EXC_ERROR ;
197                   ELSIF l_test_rec.delete_mark = 1 OR l_test_rec.test_type IN ('U','V','T','E') THEN
198 		      FND_MESSAGE.SET_NAME('GMD','GMD_INVALID_TEST_EXP');
199 		      FND_MESSAGE.SET_TOKEN('TEST',l_exptab(i).poperand);
200                       FND_MSG_PUB.ADD;
201  	              RAISE FND_API.G_EXC_ERROR ;
202                   END IF;
203 
204                   -- valid test
205 
206                   IF x_test_tab.EXISTS(l_test_rec.test_id) THEN
207                       NULL; -- if test already exist don't add again
208                   ELSE
209                       x_test_tab(l_test_rec.test_id):= l_test_rec.test_id ;
210                   END IF;
211               END IF;
212         END LOOP ;
213 
214 EXCEPTION
215 WHEN FND_API.G_EXC_ERROR THEN
216       x_return_status := FND_API.G_RET_STS_ERROR ;
217       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
218 
219 WHEN OTHERS THEN
220       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
221       FND_MESSAGE.Set_Token('PACKAGE','GMD_QC_TESTS_GRP.VALIDATE_EXPRESSION' );
222       FND_MESSAGE.Set_Token('ERROR', substr(sqlerrm,1,100));
223       FND_MESSAGE.Set_Token('POSITION',l_progress );
224       FND_MSG_PUB.ADD;
225       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
226       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
227 END VALIDATE_EXPRESSION;
228 
229 
230 
231 /*===========================================================================
232 
233   PROCEDURE NAME:	insert_exp_test_values
234 
235 ===========================================================================*/
236 PROCEDURE insert_exp_test_values(
237 		    p_init_msg_list   IN   VARCHAR2 ,
238 		    p_test_id	      IN   NUMBER,
239          	    p_test_id_tab     IN   exp_test_id_tab_type,
240          	    x_return_status   OUT  NOCOPY VARCHAR2,
241          	    x_message_data    OUT NOCOPY VARCHAR2)  IS
242 
243 l_progress      VARCHAR2(3);
244 i		BINARY_INTEGER;
245 l_rowid		ROWID;
246 l_test_value_id NUMBER;
247 
248 BEGIN
249 	l_progress := '010';
250 
251      	x_return_status := FND_API.G_RET_STS_SUCCESS ;
252 	IF FND_API.to_Boolean( p_init_msg_list ) THEN
253             FND_MSG_PUB.initialize;    -- clear the message stack.
254 	END IF;
255 
256 	IF p_test_id IS NULL THEN
257 	   FND_MESSAGE.Set_Name('GMD','GMD_TEST_ID_CODE_NULL');
258            FND_MSG_PUB.ADD;
259            RAISE FND_API.G_EXC_ERROR ;
260         END IF;
261 
262 	l_progress := '020';
263 
264 	DELETE from GMD_QC_TEST_VALUES_TL
265 	WHERE test_value_id IN
266 	  (SELECT test_value_id FROM gmd_qc_test_values_b
267 	   WHERE test_id = p_test_id );
268 
269 	DELETE from GMD_QC_TEST_VALUES_B
270 	WHERE test_id = p_test_id;
271 
272 	l_progress := '030';
273 
274 	IF p_test_id_tab.COUNT > 0 THEN
275 	   i := p_test_id_tab.FIRST;
276 	   WHILE i IS NOT NULL
277 	   LOOP
278 	        l_test_value_id := NULL;
279 		GMD_QC_TEST_VALUES_PVT.INSERT_ROW(
280     			X_ROWID => l_rowid,
281     			X_TEST_ID => p_test_id,
282     			X_TEST_VALUE_ID => l_test_value_id,
283     			X_EXPRESSION_REF_TEST_ID => p_test_id_tab(i),
284     			X_DISPLAY_LABEL_NUMERIC_RANGE => 'EXPRESSION');
285 
286 		i := p_test_id_tab.NEXT(i);
287 	   END LOOP ;
288 	END IF;
289 
290 
291 EXCEPTION
292 WHEN FND_API.G_EXC_ERROR THEN
293       x_return_status := FND_API.G_RET_STS_ERROR ;
294       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
295 WHEN OTHERS THEN
296       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
297       FND_MESSAGE.Set_Token('PACKAGE','GMD_QC_TESTS_GRP.INSERT_EXP_TEST_VALUES' );
298       FND_MESSAGE.Set_Token('ERROR', substr(sqlerrm,1,100));
299       FND_MESSAGE.Set_Token('POSITION',l_progress );
300       FND_MSG_PUB.ADD;
301       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
302       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
303 END insert_exp_test_values;
304 
305 
306 /*===========================================================================
307 
308   PROCEDURE NAME:	DISPLAY_REPORT_PRECISION
309   Parameters
310   p_validation_level - DISPLAY_PRECISION to validate DISPLAY_PRECISION from FORM only
311                      - REPORT_PRECISION to validate REPORT_PRECISION from FORM only
312                      - FULL to validate both display and test precision columns
313   p_test_method_id   - Test method associated with the Test.
314   p_test_id	     - Test id
315 
316 ===========================================================================*/
317 
318 PROCEDURE DISPLAY_REPORT_PRECISION
319 		   (p_validation_level       IN   VARCHAR2,
320 		    p_init_msg_list          IN   VARCHAR2 ,
321 		    p_test_method_id         IN NUMBER,
322 		    p_test_id		     IN NUMBER,
323 		    p_new_display_precision  IN OUT NOCOPY NUMBER,
324        	    	    p_new_report_precision   IN OUT NOCOPY NUMBER,
325        	    	    x_return_status          OUT  NOCOPY VARCHAR2,
326        	    	    x_message_data           OUT  NOCOPY VARCHAR2)  IS
327 
328 l_progress  	   	VARCHAR2(3);
329 l_test_method_precision NUMBER(2);
330 l_test_in_rec 		GMD_QC_TESTS%ROWTYPE ;
331 l_test_rec   		GMD_QC_TESTS%ROWTYPE ;
332 l_old_display_precision NUMBER(2);
333 l_old_report_precision  NUMBER(2);
334 
335 BEGIN
336 	l_progress := '010';
337 
338    	x_return_status := FND_API.G_RET_STS_SUCCESS ;
339 	IF FND_API.to_Boolean( p_init_msg_list ) THEN
340             FND_MSG_PUB.initialize;    -- clear the message stack.
341 	END IF;
342 
343 	IF  (p_new_report_precision IS NOT NULL AND p_new_report_precision not between 0 and 9)
344 	THEN
345 	   FND_MESSAGE.Set_Name('GMD','GMD_INVALID_PRECISION');
346 	   FND_MESSAGE.Set_Token('PRECISION',p_new_report_precision);
347            FND_MSG_PUB.ADD;
348 	   RAISE FND_API.G_EXC_ERROR;
349         END IF;
350 
351         IF  (p_new_display_precision IS NOT NULL AND p_new_display_precision not between 0 and 9)
352 	THEN
353 	   FND_MESSAGE.Set_Name('GMD','GMD_INVALID_PRECISION');
354 	   FND_MESSAGE.Set_Token('PRECISION',p_new_display_precision);
355            FND_MSG_PUB.ADD;
356 	   RAISE FND_API.G_EXC_ERROR;
357         END IF;
358 
359         IF (p_validation_level = 'DISPLAY_PRECISION') AND (p_new_display_precision IS NULL) THEN
360 	    RETURN;
361 	END IF;
362 
363 	IF (p_validation_level = 'REPORT_PRECISION')  AND (p_new_report_precision IS NULL)  THEN
364 	    RETURN;
365 	END IF;
366 
367 
368 	l_progress := '020';
369 
370 	IF p_test_method_id IS NOT NULL THEN
371 	BEGIN
372 	   SELECT display_precision INTO l_test_method_precision
373 	   FROM  GMD_TEST_METHODS_B
374 	   WHERE test_method_id = p_test_method_id ;
375 
376 	EXCEPTION
377 	WHEN NO_DATA_FOUND THEN
378 	   FND_MESSAGE.Set_Name('GMD','GMD_INVALID_TEST_METHOD');
379            FND_MESSAGE.Set_Token('TEST_METHOD',to_char(p_test_method_id));
380            FND_MSG_PUB.ADD;
381            RAISE FND_API.G_EXC_ERROR;
382         END ;
383         END IF;
384 
385         l_progress := '030';
386 
387         IF p_test_id IS NOT NULL THEN
388            l_test_in_rec.test_id := p_test_id ;
389 
390            IF (GMD_QC_TESTS_PVT.Fetch_Row(p_gmd_qc_tests => l_test_in_rec,
391                                           x_gmd_qc_tests => l_test_rec)) THEN
392                 l_old_display_precision := l_test_rec.display_precision;
393                 l_old_report_precision  := l_test_rec.report_precision;
394 
395                 IF l_old_display_precision IS NULL OR l_old_report_precision IS NULL THEN
396                     FND_MESSAGE.Set_Name('GMD','GMD_INVALID_PRECISION');
397             	    FND_MSG_PUB.ADD;
398            	    RAISE FND_API.G_EXC_ERROR;
399                 END IF;
400            ELSE
404  	       RAISE FND_API.G_EXC_ERROR;
401                FND_MESSAGE.SET_NAME('GMD','GMD_INVALID_TEST');
402 	       FND_MESSAGE.SET_TOKEN('TEST',to_char(p_test_id));
403                FND_MSG_PUB.ADD;
405            END IF;
406 	END IF;
407 
408 	l_progress := '040';
409 
410 	IF (p_validation_level = 'FULL') AND (p_new_display_precision IS NULL) AND (p_new_report_precision IS NULL) THEN
411 	    p_new_display_precision := NVL(l_test_method_precision,9);
412 	    p_new_report_precision  := p_new_display_precision;
413 	    RETURN;
414 	END IF ;
415 
416 	l_progress := '050';
417 
418 	IF p_validation_level IN ('FULL','DISPLAY_PRECISION') THEN
419 	   IF l_test_method_precision IS NOT NULL AND p_new_display_precision > l_test_method_precision THEN
420 	       FND_MESSAGE.Set_Name('GMD','GMD_TST_PRCSN_GRTR_TSTMTHD');
421                FND_MESSAGE.Set_Token('TEST_METHOD_PRECISION',TO_CHAR(l_test_method_precision));
422                FND_MSG_PUB.ADD;
423                RAISE FND_API.G_EXC_ERROR;
424            END IF;
425 
426            IF p_new_report_precision > p_new_display_precision THEN
427               FND_MESSAGE.Set_Name('GMD','GMD_REP_GRTR_DIS_PRCSN');
428               FND_MSG_PUB.ADD;
429               RAISE FND_API.G_EXC_ERROR;
430            END IF;
431 
432         END IF;
433 
434         l_progress := '060';
435 
436        IF p_test_id IS NOT NULL THEN
437 	   IF gmd_qc_tests_grp.test_exist_in_spec(p_test_id	=> p_test_id) THEN
438 	        IF p_validation_level IN ('FULL','REPORT_PRECISION') THEN
439 	              IF p_new_report_precision < l_old_report_precision THEN
440 	                   FND_MESSAGE.Set_Name('GMD','GMD_NEW_PRCSN_LESS_OLD');
441 	                   FND_MESSAGE.Set_Token('OLD_PRECISION',to_char(l_old_report_precision));
442 	                   FND_MSG_PUB.ADD;
443 	                   RAISE FND_API.G_EXC_ERROR;
444 	              END IF;
445 	        END IF;
446 
447 	        IF p_validation_level IN ('FULL','DISPLAY_PRECISION') THEN
448 	              IF p_new_display_precision < l_old_display_precision THEN
449 	                  FND_MESSAGE.Set_Name('GMD','GMD_NEW_PRCSN_LESS_OLD');
450 	                  FND_MESSAGE.Set_Token('OLD_PRECISION',to_char(l_old_display_precision));
451 	                  FND_MSG_PUB.ADD;
452 	                  RAISE FND_API.G_EXC_ERROR;
453 	              END IF;
454 	       END IF;
455 	   END IF;
456        END IF;
457 
458 EXCEPTION
459 WHEN FND_API.G_EXC_ERROR THEN
460    x_return_status := FND_API.G_RET_STS_ERROR ;
461    x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
462 WHEN OTHERS THEN
463    FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
464    FND_MESSAGE.Set_Token('PACKAGE','GMD_QC_TESTS_GRP.DISPLAY_REPORT_PRECISION' );
465    FND_MESSAGE.Set_Token('ERROR', SUBSTR(SQLERRM,1,100));
466    FND_MESSAGE.Set_Token('POSITION',l_progress );
467    FND_MSG_PUB.ADD;
468    x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
469    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
470 END DISPLAY_REPORT_PRECISION;
471 
472 
473 PROCEDURE MIN_MAX_VALUE_NUM(
474 		    p_init_msg_list       IN   VARCHAR2 ,
475 		    p_test_type		  IN   VARCHAR2,
476 		    p_min_value_num       IN   NUMBER,
477          	    p_max_value_num       IN   NUMBER,
478          	    x_return_status       OUT  NOCOPY VARCHAR2,
479          	    x_message_data        OUT  NOCOPY VARCHAR2)  IS
480 
481 l_progress  	   VARCHAR2(3);
482 
483 BEGIN
484         l_progress := '010';
485 
486         IF p_test_type NOT IN ('N','E') THEN
487 		RETURN;
488 	END IF;
489 
490      	x_return_status := FND_API.G_RET_STS_SUCCESS ;
491 	IF FND_API.to_Boolean( p_init_msg_list ) THEN
492             FND_MSG_PUB.initialize;    -- clear the message stack.
493 	END IF;
494 
495 	l_progress := '020';
496 
497 	IF p_min_value_num IS NOT NULL AND p_max_value_num IS NOT NULL THEN
498            IF p_min_value_num > p_max_value_num THEN
499 	       FND_MESSAGE.Set_Name('GMD','QC_MIN_MAX_SPEC');
500                FND_MSG_PUB.ADD;
501                RAISE FND_API.G_EXC_ERROR;
502            END IF;
503         END IF;
504 
505 EXCEPTION
506 WHEN FND_API.G_EXC_ERROR THEN
507    x_return_status := FND_API.G_RET_STS_ERROR ;
508    x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
509 WHEN OTHERS THEN
510       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
511       FND_MESSAGE.Set_Token('PACKAGE','GMD_QC_TESTS_GRP.MIN_MAX_VALUE_NUM');
512       FND_MESSAGE.Set_Token('ERROR', SUBSTR(SQLERRM,1,100));
513       FND_MESSAGE.Set_Token('POSITION',l_progress );
514       FND_MSG_PUB.ADD;
515       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
516       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
517 END MIN_MAX_VALUE_NUM ;
518 
519 /*===========================================================================
520 
521   PROCEDURE NAME:	validate_experimental_error
522 
523 ===========================================================================*/
524 PROCEDURE validate_experimental_error(
525 		    p_validation_level      IN VARCHAR2 ,
526 		    p_init_msg_list         IN VARCHAR2 ,
527 	      	    p_exp_error_type        IN VARCHAR2,
528 		    p_spec_value            IN NUMBER ,
529 		    p_action_code 	    IN VARCHAR2 ,
530 		    p_test_min              IN NUMBER,
534 
531 		    p_test_max              IN NUMBER,
532          	    x_return_status         OUT NOCOPY VARCHAR2,
533          	    x_message_data          OUT NOCOPY VARCHAR2)  IS
535 l_progress  VARCHAR2(3);
536 
537 BEGIN
538 	l_progress := '010';
539 
540 	x_return_status := FND_API.G_RET_STS_SUCCESS ;
541 	IF (p_test_min IS NULL OR p_test_max IS NULL ) AND (p_validation_level = 'SPEC')
542 	 AND (p_exp_error_type = 'N') THEN
543 	   RETURN;
544 	END IF;
545 
546      	IF FND_API.to_Boolean( p_init_msg_list ) THEN
547             FND_MSG_PUB.initialize;    -- clear the message stack.
548 	END IF;
549 
550 	IF p_exp_error_type IS NOT NULL AND p_exp_error_type NOT IN ('N','P') THEN
551            FND_MESSAGE.Set_Name('GMD','GMD_EXP_ERROR_TYPE_REQ');
552            FND_MSG_PUB.ADD;
553            RAISE FND_API.G_EXC_ERROR;
554         END IF;
555 
556 	l_progress := '020';
557 
558 	IF p_exp_error_type IS NOT NULL AND p_spec_value is NOT NULL AND p_validation_level IN ('SPEC','FULL') THEN
559 	   IF p_exp_error_type = 'N' AND p_test_min IS NOT NULL AND p_test_max IS NOT NULL THEN
560               IF ABS(p_spec_value) > ABS(p_test_max - p_test_min) THEN
561                  FND_MESSAGE.SET_NAME('GMD','GMD_INVALID_SPEC_VAL_NUM');
562                  FND_MESSAGE.SET_TOKEN('MAX_VAL',to_char(ABS(p_test_max - p_test_min)));
563                  FND_MSG_PUB.ADD;
564                  RAISE FND_API.G_EXC_ERROR;
565               END IF;
566            ELSE
567               IF ABS(p_spec_value) > 100 THEN
568                  FND_MESSAGE.Set_Name('GMD','GMD_INVALID_SPEC_VAL_NUM');
569                  FND_MESSAGE.SET_TOKEN('MAX_VAL',100);
570                  FND_MSG_PUB.ADD;
571                  RAISE FND_API.G_EXC_ERROR;
572               END IF;
573            END IF;
574         END IF;
575 
576         IF p_action_code IS NOT NULL and p_spec_value IS NULL AND
577 	 p_validation_level IN ('ACTION','FULL') THEN
578 	    FND_MESSAGE.Set_Name('GMD','GMD_EXP_ERR_VAL_REQ_ACTION');
579             FND_MSG_PUB.ADD;
580             RAISE FND_API.G_EXC_ERROR;
581         END IF;
582 
583 
584 EXCEPTION WHEN FND_API.G_EXC_ERROR THEN
585    x_return_status := FND_API.G_RET_STS_ERROR ;
586    x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
587 WHEN OTHERS THEN
588       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
589       FND_MESSAGE.Set_Token('PACKAGE','GMD_QC_TESTS_GRP.validate_experimental_error');
590       FND_MESSAGE.Set_Token('ERROR', substr(sqlerrm,1,100));
591       FND_MESSAGE.Set_Token('POSITION',l_progress );
592       FND_MSG_PUB.ADD;
593       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
594       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
595 END validate_experimental_error;
596 
597 --+========================================================================+
598 --| API Name    : validate_all_exp_error				   |
599 --| TYPE        : Group                                                    |
600 --| Notes       : This procedure checks for experimental error region      |
601 --|               for all the four action codes and spec value             |
602 --| HISTORY                                                                |
603 --|                                                                        |
604 --+========================================================================+
605 
606 PROCEDURE validate_all_exp_error(
607 		    p_validation_level      IN VARCHAR2 ,
608 		    p_init_msg_list         IN VARCHAR2 ,
609 	      	    p_exp_error_type        IN VARCHAR2,
610 		    p_below_spec_min        IN NUMBER ,
611 		    p_below_min_action_code IN VARCHAR2,
612 		    p_above_spec_min        IN NUMBER ,
613 		    p_above_min_action_code IN VARCHAR2 ,
614 		    p_below_spec_max        IN NUMBER ,
615 		    p_below_max_action_code IN VARCHAR2 ,
616 		    p_above_spec_max        IN NUMBER ,
617 		    p_above_max_action_code IN VARCHAR2 ,
618 		    p_test_min              IN NUMBER,
619 		    p_test_max              IN NUMBER,
620          	    x_return_status         OUT NOCOPY VARCHAR2,
621          	    x_message_data          OUT NOCOPY VARCHAR2)  IS
622 
623 l_progress  VARCHAR2(3);
624 
625 BEGIN
626 	l_progress := '010';
627 
628 	x_return_status := FND_API.G_RET_STS_SUCCESS ;
629 
630      	IF FND_API.to_Boolean( p_init_msg_list ) THEN
631             FND_MSG_PUB.initialize;    -- clear the message stack.
632 	END IF;
633 
634 	IF p_exp_error_type IS NOT NULL AND p_exp_error_type NOT IN ('N','P') THEN
635            FND_MESSAGE.Set_Name('GMD','GMD_EXP_ERROR_TYPE_REQ');
636            FND_MSG_PUB.ADD;
637            RAISE FND_API.G_EXC_ERROR;
638         END IF;
639 
640 	l_progress := '020';
641 
642         validate_experimental_error(
643         	    p_validation_level => p_validation_level,
644 		    p_exp_error_type   => p_exp_error_type,
645 		    p_spec_value       => p_below_spec_min,
646 		    p_action_code      => p_below_min_action_code,
647 		    p_test_min         => p_test_min,
648 		    p_test_max         => p_test_max,
649          	    x_return_status    => x_return_status,
650         	    x_message_data     => x_message_data );
651 
652         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
653              RETURN;
654         END IF;
658         validate_experimental_error(
655 
656         l_progress := '030';
657 
659         	    p_validation_level => p_validation_level,
660 		    p_exp_error_type   => p_exp_error_type,
661 		    p_spec_value       => p_above_spec_min,
662 		    p_action_code      => p_above_min_action_code,
663 		    p_test_min         => p_test_min,
664 		    p_test_max         => p_test_max,
665          	    x_return_status    => x_return_status,
666         	    x_message_data     => x_message_data );
667 
668          IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
669              RETURN;
670          END IF;
671 
672          l_progress := '030';
673 
674          validate_experimental_error(
675         	    p_validation_level => p_validation_level,
676 		    p_exp_error_type   => p_exp_error_type,
677 		    p_spec_value       => p_below_spec_max,
678 		    p_action_code      => p_below_max_action_code,
679 		    p_test_min         => p_test_min,
680 		    p_test_max         => p_test_max,
681          	    x_return_status    => x_return_status,
682         	    x_message_data     => x_message_data );
683 
684          IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
685              RETURN;
686          END IF;
687 
688          l_progress := '040';
689 
690          validate_experimental_error(
691         	    p_validation_level => p_validation_level,
692 		    p_exp_error_type   => p_exp_error_type,
693 		    p_spec_value       => p_above_spec_max,
694 		    p_action_code      => p_above_max_action_code,
695 		    p_test_min         => p_test_min,
696 		    p_test_max         => p_test_max,
697          	    x_return_status    => x_return_status,
698         	    x_message_data     => x_message_data );
699 
700          IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
701              RETURN;
702          END IF;
703 
704 EXCEPTION WHEN FND_API.G_EXC_ERROR THEN
705    x_return_status := FND_API.G_RET_STS_ERROR ;
706    x_message_data  := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
707 WHEN OTHERS THEN
708       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
709       FND_MESSAGE.Set_Token('PACKAGE','GMD_QC_TESTS_GRP.validate_all_exp_error');
710       FND_MESSAGE.Set_Token('ERROR', substr(sqlerrm,1,100));
711       FND_MESSAGE.Set_Token('POSITION',l_progress );
712       FND_MSG_PUB.ADD;
713       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
714       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
715 END validate_all_exp_error;
716 
717 
718 /*===========================================================================
719 
720   FUNCTION NAME:	validate_test_priority
721   DESCRIPTION:		This function returns TRUE if test priority is VALID
722   			else it returns FALSE.
723 ===========================================================================*/
724 
725 FUNCTION validate_test_priority(p_test_priority	IN VARCHAR2) RETURN BOOLEAN
726 IS
727 l_temp	VARCHAR2(1);
728 BEGIN
729     IF p_test_priority IS NULL THEN
730     	RETURN FALSE;
731     END IF;
732 
733     SELECT 'X' INTO l_temp
734     FROM  fnd_lookup_values
735     WHERE lookup_type = 'GMD_QC_TEST_PRIORITY'
736     AND	  lookup_code = p_test_priority
737     AND	  language = userenv('LANG') ;
738 
739     RETURN TRUE;
740 
741 EXCEPTION WHEN OTHERS THEN
742    RETURN FALSE;
743 
744 END validate_test_priority;
745 
746 
747 
748 --+========================================================================+
749 --| API Name    : check_for_null_and_fks				   |
750 --| TYPE        : Group                                                    |
751 --| Notes       : This procedure checks for NULL and Foreign Key           |
752 --|               constraints for the required filed in the Test           |
753 --|               Header record.                                           |
754 --|                                                                        |
755 --|               If everything is fine then 'S' is returned in the        |
756 --|               parameter - x_return_status otherwise return  error      |
757 --|                                                                        |
758 --| HISTORY                                                                |
759 --|      Rameshwar  14-APR-2004   BUG#3545701                                |
760 --|                 Commented the code for non-validated tests             |
761 --+========================================================================+
762 
763 
764 PROCEDURE CHECK_FOR_NULL_AND_FKS(
765 	p_gmd_qc_tests_rec IN  GMD_QC_TESTS%ROWTYPE,
766         x_gmd_qc_tests_rec OUT NOCOPY GMD_QC_TESTS%ROWTYPE,
767 	x_return_status    OUT NOCOPY VARCHAR2,
768         x_message_data     OUT NOCOPY VARCHAR2) IS
769 
770 CURSOR cr_check_valid_test_method(p_test_method_id NUMBER) IS
771 SELECT 'x' FROM GMD_TEST_METHODS_B
772     	WHERE test_method_id = p_test_method_id
773     	AND   delete_mark = 0;
774 
775 CURSOR cr_check_valid_test_class(p_test_class VARCHAR2) IS
776 SELECT 'x' FROM GMD_TEST_CLASSES_B
777     	WHERE test_class = p_test_class
778     	AND   delete_mark = 0;
779 
780 
781 CURSOR cr_check_valid_test_unit(p_qcunit_code VARCHAR2) IS
782 SELECT 'x' FROM GMD_UNITS_B
783     	WHERE qcunit_code = p_qcunit_code
784     	AND   delete_mark = 0;
785 
789     	AND   delete_mark = 0;
786 CURSOR cr_check_valid_action_code(p_action_code VARCHAR2) IS
787 SELECT 'x' FROM GMD_ACTIONS_B
788     	WHERE action_code = p_action_code
790 
791 
792 l_progress  VARCHAR2(3);
793 l_temp	    VARCHAR2(1);
794 BEGIN
795 
796     l_progress := '010';
797 
798     x_return_status := FND_API.G_RET_STS_SUCCESS ;
799 
800     x_gmd_qc_tests_rec := p_gmd_qc_tests_rec ;
801 
802 -- Test Code
803 
804     IF (LTRIM(RTRIM(x_gmd_qc_tests_rec.test_code)) IS NULL) THEN
805         FND_MESSAGE.SET_NAME('GMD', 'GMD_TEST_ID_CODE_NULL');
806         FND_MSG_PUB.ADD;
807         RAISE FND_API.G_EXC_ERROR;
808     END IF;
809 
810     -- Test Description
811 
812     IF (LTRIM(RTRIM(x_gmd_qc_tests_rec.test_desc)) IS NULL) THEN
813         FND_MESSAGE.SET_NAME('GMD', 'GMD_TEST_DESC_REQD');
814         FND_MSG_PUB.ADD;
815         RAISE FND_API.G_EXC_ERROR;
816     END IF;
817 
818     -- Test Method
819 
820     IF x_gmd_qc_tests_rec.test_method_id IS NULL THEN
821         FND_MESSAGE.SET_NAME('GMD', 'GMD_TEST_METHOD_REQD');
822         FND_MSG_PUB.ADD;
823         RAISE FND_API.G_EXC_ERROR;
824     ELSE
825     	OPEN  cr_check_valid_test_method(x_gmd_qc_tests_rec.test_method_id);
826     	FETCH cr_check_valid_test_method INTO l_temp;
827     	IF cr_check_valid_test_method%NOTFOUND THEN
828     	    CLOSE cr_check_valid_test_method;
829     	    FND_MESSAGE.SET_NAME('GMD', 'GMD_INVALID_TEST_METHOD');
830             FND_MESSAGE.SET_TOKEN('TEST_METHOD', TO_CHAR(x_gmd_qc_tests_rec.test_method_id));
831             FND_MSG_PUB.ADD;
832             RAISE FND_API.G_EXC_ERROR;
833     	END IF;
834     	CLOSE cr_check_valid_test_method ;
835 
836     END IF;
837 
838         l_progress := '020';
839     -- Test Data Type
840 
841     IF x_gmd_qc_tests_rec.test_type IS NULL THEN
842         FND_MESSAGE.SET_NAME('GMD', 'GMD_TEST_TYPE_REQD');
843         FND_MSG_PUB.ADD;
844         RAISE FND_API.G_EXC_ERROR;
845     ELSIF x_gmd_qc_tests_rec.test_type NOT IN ('U','N','E','L','V','T') THEN
846         FND_MESSAGE.SET_NAME('GMD', 'GMD_INVALID_TEST_TYPE');
847         FND_MSG_PUB.ADD;
848         RAISE FND_API.G_EXC_ERROR;
849     END IF;
850 
851     -- Test Priority
852     IF x_gmd_qc_tests_rec.priority IS NULL THEN
853         x_gmd_qc_tests_rec.priority := '5N';
854 
855     ELSIF (NOT validate_test_priority(p_test_priority => x_gmd_qc_tests_rec.priority)) THEN
856         FND_MESSAGE.SET_NAME('GMD', 'GMD_INVALID_TEST_PRIORITY');
857         FND_MSG_PUB.ADD;
858         RAISE FND_API.G_EXC_ERROR;
859     END IF;
860 
861     x_gmd_qc_tests_rec.delete_mark := 0;
862 
863     IF x_gmd_qc_tests_rec.test_type NOT IN ('N','E') THEN
864     	IF (x_gmd_qc_tests_rec.min_value_num IS NOT NULL OR x_gmd_qc_tests_rec.max_value_num IS NOT NULL) THEN
865     		FND_MESSAGE.SET_NAME('GMD','GMD_TEST_RANGE_NOT_REQD');
866         	FND_MSG_PUB.ADD;
867         	RAISE FND_API.G_EXC_ERROR;
868     	END IF;
869 
870     ELSE
871         IF (x_gmd_qc_tests_rec.min_value_num IS NULL OR x_gmd_qc_tests_rec.max_value_num IS NULL) THEN
872             FND_MESSAGE.SET_NAME('GMD', 'GMD_TEST_RANGE_REQ');
873             FND_MSG_PUB.ADD;
874             RAISE FND_API.G_EXC_ERROR;
875         END IF;
876     END IF;
877 
878     IF x_gmd_qc_tests_rec.test_type = 'E' THEN
879         IF x_gmd_qc_tests_rec.expression IS NULL THEN
880             FND_MESSAGE.SET_NAME('GMD', 'GMD_EXPRESSION_REQD');
881             FND_MSG_PUB.ADD;
882             RAISE FND_API.G_EXC_ERROR;
883         END IF;
884     ELSIF x_gmd_qc_tests_rec.expression IS NOT NULL THEN
885         FND_MESSAGE.SET_NAME('GMD','GMD_EXPRESSION_NOT_REQD');
886         FND_MSG_PUB.ADD;
887         RAISE FND_API.G_EXC_ERROR;
888     END IF;
889 
890     IF x_gmd_qc_tests_rec.test_type IN ('U','T','V') THEN
891       --BEGIN BUG#3545701
892       --Commented the code for Non-validated tests.
893       /* IF x_gmd_qc_tests_rec.test_type = 'U' and x_gmd_qc_tests_rec.test_unit IS NOT NULL THEN
894            FND_MESSAGE.SET_NAME('GMD','GMD_TEST_UNIT_NOT_REQD');
895            FND_MSG_PUB.ADD;
896            RAISE FND_API.G_EXC_ERROR;
897        END IF; */
898       --END BUG#3545701
899        IF (x_gmd_qc_tests_rec.display_precision IS NOT NULL OR x_gmd_qc_tests_rec.report_precision IS NOT NULL) THEN
900            FND_MESSAGE.SET_NAME('GMD','GMD_PRECISION_NOT_REQD');
901            FND_MSG_PUB.ADD;
902            RAISE FND_API.G_EXC_ERROR;
903        END IF;
904 
905        IF x_gmd_qc_tests_rec.exp_error_type IS NOT NULL THEN
906             FND_MESSAGE.SET_NAME('GMD','GMD_INVALID_EXP_ERROR_TYPE');
907             FND_MSG_PUB.ADD;
908             RAISE FND_API.G_EXC_ERROR;
909        END IF;
910 
911        IF (x_gmd_qc_tests_rec.below_spec_min IS NOT NULL OR  x_gmd_qc_tests_rec.below_min_action_code IS NOT NULL )
912         OR (x_gmd_qc_tests_rec.above_spec_min IS NOT NULL OR  x_gmd_qc_tests_rec.above_min_action_code IS NOT NULL )
913         OR (x_gmd_qc_tests_rec.below_spec_max IS NOT NULL OR  x_gmd_qc_tests_rec.below_max_action_code IS NOT NULL )
914         OR (x_gmd_qc_tests_rec.above_spec_max IS NOT NULL OR  x_gmd_qc_tests_rec.above_max_action_code IS NOT NULL ) THEN
915            FND_MESSAGE.SET_NAME('GMD', 'GMD_EXP_ERROR_NOT_REQD');
916            FND_MSG_PUB.ADD;
920        IF x_gmd_qc_tests_rec.test_unit IS NULL THEN
917            RAISE FND_API.G_EXC_ERROR;
918        END IF;
919     ELSE
921            FND_MESSAGE.SET_NAME('GMD','GMD_TEST_UNIT_REQD');
922            FND_MESSAGE.SET_TOKEN('TEST',x_gmd_qc_tests_rec.test_code);
923            FND_MSG_PUB.ADD;
924            RAISE FND_API.G_EXC_ERROR;
925        END IF;
926 
927        IF (x_gmd_qc_tests_rec.display_precision IS NULL OR x_gmd_qc_tests_rec.report_precision IS NULL ) THEN
928            FND_MESSAGE.SET_NAME('GMD', 'GMD_PRECISION_REQD');
929            FND_MESSAGE.SET_TOKEN('TEST',x_gmd_qc_tests_rec.test_code);
930            FND_MSG_PUB.ADD;
931            RAISE FND_API.G_EXC_ERROR;
932        END IF;
933 
934        IF ((x_gmd_qc_tests_rec.exp_error_type IN ('N','P')) OR (x_gmd_qc_tests_rec.exp_error_type IS NULL)) THEN
935     	   NULL ;
936         ELSE
937            FND_MESSAGE.SET_NAME('GMD','GMD_INVALID_EXP_ERROR_TYPE');
938            FND_MSG_PUB.ADD;
939            RAISE FND_API.G_EXC_ERROR;
940         END IF;
941 
942     END IF;
943 
944     l_progress := '030';
945 
946     IF x_gmd_qc_tests_rec.exp_error_type IS NULL AND
947       (x_gmd_qc_tests_rec.below_spec_min IS NOT NULL OR x_gmd_qc_tests_rec.above_spec_min IS NOT NULL
948        OR x_gmd_qc_tests_rec.below_spec_max IS NOT NULL OR x_gmd_qc_tests_rec.above_spec_max IS NOT NULL)
949     THEN
950         FND_MESSAGE.SET_NAME('GMD', 'GMD_EXP_ERROR_TYPE_REQ');
951         FND_MSG_PUB.ADD;
952         RAISE FND_API.G_EXC_ERROR;
953     END IF;
954 
955     IF x_gmd_qc_tests_rec.exp_error_type IS NOT NULL AND
956       (x_gmd_qc_tests_rec.below_spec_min IS NULL AND x_gmd_qc_tests_rec.above_spec_min IS NULL
957        AND x_gmd_qc_tests_rec.below_spec_max IS NULL AND x_gmd_qc_tests_rec.above_spec_max IS NULL)
958     THEN
959         FND_MESSAGE.SET_NAME('GMD', 'GMD_EXP_ERR_TYPE_NULL');
960         FND_MSG_PUB.ADD;
961         RAISE FND_API.G_EXC_ERROR;
962     END IF;
963 
964     IF x_gmd_qc_tests_rec.TEST_UNIT IS NOT NULL THEN
965         OPEN  cr_check_valid_test_unit(x_gmd_qc_tests_rec.test_unit);
966     	FETCH cr_check_valid_test_unit INTO l_temp;
967     	IF cr_check_valid_test_unit%NOTFOUND THEN
968     	    CLOSE cr_check_valid_test_unit;
969     	    FND_MESSAGE.SET_NAME('GMD', 'GMD_INVALID_TEST_UNIT');
970             FND_MESSAGE.SET_TOKEN('TEST_UNIT',x_gmd_qc_tests_rec.test_unit);
971             FND_MSG_PUB.ADD;
972             RAISE FND_API.G_EXC_ERROR;
973     	END IF;
974     	CLOSE cr_check_valid_test_unit ;
975     END IF;
976 
977     IF x_gmd_qc_tests_rec.TEST_CLASS IS NOT NULL THEN
978         OPEN  cr_check_valid_test_class(x_gmd_qc_tests_rec.test_class);
979     	FETCH cr_check_valid_test_class INTO l_temp;
980     	IF cr_check_valid_test_class%NOTFOUND THEN
981     	    CLOSE cr_check_valid_test_class;
982     	    FND_MESSAGE.SET_NAME('GMD', 'GMD_INVALID_TEST_CLASS');
983             FND_MESSAGE.SET_TOKEN('TEST_CLASS', x_gmd_qc_tests_rec.test_class);
984             FND_MSG_PUB.ADD;
985             RAISE FND_API.G_EXC_ERROR;
986     	END IF;
987     	CLOSE cr_check_valid_test_class ;
988     END IF;
989 
990     l_progress := '040';
991 
992     IF x_gmd_qc_tests_rec.BELOW_MIN_ACTION_CODE IS NOT NULL THEN
993         OPEN  cr_check_valid_action_code(x_gmd_qc_tests_rec.below_min_action_code);
994     	FETCH cr_check_valid_action_code INTO l_temp;
995     	IF cr_check_valid_action_code%NOTFOUND THEN
996     	    CLOSE cr_check_valid_action_code;
997     	    FND_MESSAGE.SET_NAME('GMD', 'GMD_INVALID_ACTION_CODE');
998             FND_MESSAGE.SET_TOKEN('ACTION', x_gmd_qc_tests_rec.below_min_action_code);
999             FND_MSG_PUB.ADD;
1000             RAISE FND_API.G_EXC_ERROR;
1001     	END IF;
1002     	CLOSE cr_check_valid_action_code ;
1003     END IF;
1004 
1005     IF x_gmd_qc_tests_rec.ABOVE_MIN_ACTION_CODE IS NOT NULL THEN
1006         OPEN  cr_check_valid_action_code(x_gmd_qc_tests_rec.above_min_action_code);
1007     	FETCH cr_check_valid_action_code INTO l_temp;
1008     	IF cr_check_valid_action_code%NOTFOUND THEN
1009     	    CLOSE cr_check_valid_action_code;
1010     	    FND_MESSAGE.SET_NAME('GMD', 'GMD_INVALID_ACTION_CODE');
1011             FND_MESSAGE.SET_TOKEN('ACTION', x_gmd_qc_tests_rec.above_min_action_code);
1012             FND_MSG_PUB.ADD;
1013             RAISE FND_API.G_EXC_ERROR;
1014     	END IF;
1015     	CLOSE cr_check_valid_action_code ;
1016     END IF;
1017 
1018     IF x_gmd_qc_tests_rec.BELOW_MAX_ACTION_CODE IS NOT NULL THEN
1019         OPEN  cr_check_valid_action_code(x_gmd_qc_tests_rec.below_max_action_code);
1020     	FETCH cr_check_valid_action_code INTO l_temp;
1021     	IF cr_check_valid_action_code%NOTFOUND THEN
1022     	    CLOSE cr_check_valid_action_code;
1023     	    FND_MESSAGE.SET_NAME('GMD', 'GMD_INVALID_ACTION_CODE');
1024             FND_MESSAGE.SET_TOKEN('ACTION', x_gmd_qc_tests_rec.below_max_action_code);
1025             FND_MSG_PUB.ADD;
1026             RAISE FND_API.G_EXC_ERROR;
1027     	END IF;
1028     	CLOSE cr_check_valid_action_code ;
1029     END IF;
1030 
1031     IF x_gmd_qc_tests_rec.ABOVE_MAX_ACTION_CODE IS NOT NULL THEN
1032         OPEN  cr_check_valid_action_code(x_gmd_qc_tests_rec.above_max_action_code);
1033     	FETCH cr_check_valid_action_code INTO l_temp;
1034     	IF cr_check_valid_action_code%NOTFOUND THEN
1035     	    CLOSE cr_check_valid_action_code;
1039             RAISE FND_API.G_EXC_ERROR;
1036     	    FND_MESSAGE.SET_NAME('GMD', 'GMD_INVALID_ACTION_CODE');
1037             FND_MESSAGE.SET_TOKEN('ACTION', x_gmd_qc_tests_rec.above_max_action_code);
1038             FND_MSG_PUB.ADD;
1040     	END IF;
1041     	CLOSE cr_check_valid_action_code ;
1042     END IF;
1043 
1044     -- make test_id null. generate test id with sequence.
1045     x_gmd_qc_tests_rec.test_id := NULL;
1046 
1047 EXCEPTION
1048   WHEN FND_API.G_EXC_ERROR THEN
1049       x_return_status := FND_API.G_RET_STS_ERROR ;
1050       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
1051 
1052   WHEN OTHERS THEN
1053       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
1054       FND_MESSAGE.Set_Token('PACKAGE','GMD_QC_TESTS_GRP.check_for_null_and_fks');
1055       FND_MESSAGE.Set_Token('ERROR', substr(sqlerrm,1,100));
1056       FND_MESSAGE.Set_Token('POSITION',l_progress );
1057       FND_MSG_PUB.ADD;
1058       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
1059       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1060 
1061 END check_for_null_and_fks;
1062 
1063 
1064 PROCEDURE VALIDATE_BEFORE_INSERT(
1065 	p_gmd_qc_tests_rec IN 	GMD_QC_TESTS%ROWTYPE,
1066         x_gmd_qc_tests_rec OUT 	NOCOPY GMD_QC_TESTS%ROWTYPE,
1067 	x_return_status    OUT  NOCOPY VARCHAR2,
1068         x_message_data     OUT 	NOCOPY VARCHAR2) IS
1069 
1070 l_progress  VARCHAR2(3);
1071 l_exp_test_id_tab  exp_test_id_tab_type;
1072 
1073 BEGIN
1074 	l_progress := '010';
1075 
1076 	x_return_status := FND_API.G_RET_STS_SUCCESS ;
1077 
1078 	CHECK_FOR_NULL_AND_FKS(
1079 		p_gmd_qc_tests_rec => p_gmd_qc_tests_rec,
1080         	x_gmd_qc_tests_rec => x_gmd_qc_tests_rec,
1081 		x_return_status => x_return_status,
1082         	x_message_data  => x_message_data );
1083 
1084         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1085             RETURN;
1086         END IF;
1087 
1088         -- check for duplicate test_code.
1089         IF CHECK_TEST_EXIST(p_test_code => x_gmd_qc_tests_rec.test_code) THEN
1090             FND_MESSAGE.SET_NAME('GMD','SY_WFDUPLICATE');
1091             FND_MSG_PUB.ADD;
1092 	    RAISE FND_API.G_EXC_ERROR;
1093         END IF;
1094 
1095         IF x_gmd_qc_tests_rec.test_type = 'E' THEN
1096             validate_expression(
1097             	  p_expression => x_gmd_qc_tests_rec.expression,
1098          	  x_test_tab   => l_exp_test_id_tab,
1099          	  x_return_status => x_return_status,
1100         	  x_message_data  => x_message_data );
1101 
1102              IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1103                  RETURN;
1104              END IF;
1105         END IF;
1106 
1107         IF x_gmd_qc_tests_rec.test_type in ('N','L','E') THEN
1108             DISPLAY_REPORT_PRECISION
1109 		   (p_validation_level => 'FULL',
1110 		    p_test_method_id   => x_gmd_qc_tests_rec.test_method_id,
1111 		    p_test_id	       => null,
1112 		    p_new_display_precision => x_gmd_qc_tests_rec.display_precision,
1113        	    	    p_new_report_precision  => x_gmd_qc_tests_rec.report_precision,
1114        	    	    x_return_status => x_return_status,
1115         	    x_message_data  => x_message_data );
1116 
1117             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1118                 RETURN;
1119             END IF;
1120          END IF;
1121 
1122          -- In case of numeric range with label,min_value_num and max_value_num is derived
1123          -- after test values are insert. so do this validation after insertion of test values.
1124 
1125          IF x_gmd_qc_tests_rec.test_type in ('N','L','E') THEN
1126 
1127              x_gmd_qc_tests_rec.min_value_num := ROUND(x_gmd_qc_tests_rec.min_value_num,x_gmd_qc_tests_rec.display_precision);
1128              x_gmd_qc_tests_rec.max_value_num := ROUND(x_gmd_qc_tests_rec.max_value_num,x_gmd_qc_tests_rec.display_precision);
1129 
1130 
1131              MIN_MAX_VALUE_NUM(
1132 		    p_test_type	     => x_gmd_qc_tests_rec.test_type,
1133 		    p_min_value_num  => x_gmd_qc_tests_rec.min_value_num,
1134          	    p_max_value_num  => x_gmd_qc_tests_rec.max_value_num,
1135          	    x_return_status => x_return_status,
1136         	    x_message_data  => x_message_data );
1137 
1138              IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1139                    RETURN;
1140              END IF;
1141 
1142              IF x_gmd_qc_tests_rec.exp_error_type IS NOT NULL THEN
1143                 IF x_gmd_qc_tests_rec.exp_error_type = 'N' THEN
1144              	    x_gmd_qc_tests_rec.below_spec_min := ROUND(x_gmd_qc_tests_rec.below_spec_min,x_gmd_qc_tests_rec.display_precision);
1145              	    x_gmd_qc_tests_rec.above_spec_min := ROUND(x_gmd_qc_tests_rec.above_spec_min,x_gmd_qc_tests_rec.display_precision);
1146              	    x_gmd_qc_tests_rec.below_spec_max := ROUND(x_gmd_qc_tests_rec.below_spec_max,x_gmd_qc_tests_rec.display_precision);
1147              	    x_gmd_qc_tests_rec.above_spec_max := ROUND(x_gmd_qc_tests_rec.above_spec_max,x_gmd_qc_tests_rec.display_precision);
1148              	END IF;
1149 
1150                 validate_all_exp_error(
1151 		    p_exp_error_type  		=> x_gmd_qc_tests_rec.exp_error_type,
1152 		    p_below_spec_min            => x_gmd_qc_tests_rec.below_spec_min,
1153 		    p_below_min_action_code     => x_gmd_qc_tests_rec.below_min_action_code,
1157 		    p_below_max_action_code     => x_gmd_qc_tests_rec.below_max_action_code,
1154 		    p_above_spec_min            => x_gmd_qc_tests_rec.above_spec_min,
1155 		    p_above_min_action_code     => x_gmd_qc_tests_rec.above_min_action_code,
1156 		    p_below_spec_max            => x_gmd_qc_tests_rec.below_spec_max,
1158 		    p_above_spec_max            => x_gmd_qc_tests_rec.above_spec_max,
1159 		    p_above_max_action_code     => x_gmd_qc_tests_rec.above_max_action_code,
1160 		    p_test_min        		=> x_gmd_qc_tests_rec.min_value_num,
1161 		    p_test_max        		=> x_gmd_qc_tests_rec.max_value_num,
1162          	    x_return_status 		=> x_return_status,
1163         	    x_message_data  		=> x_message_data );
1164 
1165                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1166                     RETURN;
1167                 END IF;
1168 
1169              END IF;
1170 
1171           END IF; -- IF x_gmd_qc_tests_rec.test_type in ('N','L','E') THEN
1172 
1173 EXCEPTION
1174 WHEN FND_API.G_EXC_ERROR THEN
1175       x_return_status := FND_API.G_RET_STS_ERROR ;
1176       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
1177 
1178 WHEN OTHERS THEN
1179       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
1180       FND_MESSAGE.Set_Token('PACKAGE','GMD_QC_TESTS_GRP.validate_before_insert');
1181       FND_MESSAGE.Set_Token('ERROR', substr(sqlerrm,1,100));
1182       FND_MESSAGE.Set_Token('POSITION',l_progress );
1183       FND_MSG_PUB.ADD;
1184       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
1185       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1186 END validate_before_insert ;
1187 
1188 /*===========================================================================
1189 
1190   PROCEDURE NAME:	process_after_insert
1191   DESCRIPTION:		This procedure inserts records into test values for expression
1192                         test data type.
1193 ===========================================================================*/
1194 
1195 PROCEDURE PROCESS_AFTER_INSERT (
1196 	p_init_msg_list    IN  VARCHAR2 ,
1197         p_gmd_qc_tests_rec IN  GMD_QC_TESTS%ROWTYPE,
1198 	x_return_status    OUT NOCOPY VARCHAR2,
1199         x_message_data     OUT NOCOPY VARCHAR2) IS
1200 
1201 l_progress  VARCHAR2(3);
1202 l_exp_test_id_tab  exp_test_id_tab_type;
1203 
1204 BEGIN
1205 	l_progress := '010';
1206 
1207 	x_return_status := FND_API.G_RET_STS_SUCCESS ;
1208 
1209 	IF FND_API.to_Boolean( p_init_msg_list ) THEN
1210             FND_MSG_PUB.initialize;    -- clear the message stack.
1211 	END IF;
1212 
1213 	IF p_gmd_qc_tests_rec.test_id IS NULL THEN
1214 	     FND_MESSAGE.SET_NAME('GMD','GMD_TEST_ID_CODE_NULL');
1215 	     FND_MSG_PUB.ADD;
1216 	     RAISE FND_API.G_EXC_ERROR;
1217 	END IF;
1218 
1219 	IF p_gmd_qc_tests_rec.test_type = 'E' THEN
1220 	    validate_expression(
1221             	  p_expression => p_gmd_qc_tests_rec.expression,
1222          	  x_test_tab   => l_exp_test_id_tab,
1223          	  x_return_status => x_return_status,
1224         	  x_message_data  => x_message_data );
1225 
1226              IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1227                  RETURN;
1228              END IF;
1229 
1230              IF l_exp_test_id_tab.COUNT > 0 THEN
1231                 GMD_QC_TESTS_GRP.INSERT_EXP_TEST_VALUES(
1232 			p_test_id => p_gmd_qc_tests_rec.test_id,
1233  		        p_test_id_tab => l_exp_test_id_tab,
1234   		        x_return_status => x_return_status,
1235 		        x_message_data  => x_message_data);
1236 		IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1237                     RETURN;
1238                 END IF;
1239              END IF;
1240 
1241 	 END IF;  -- IF p_gmd_qc_tests_rec.test_type = 'E' THEN
1242 
1243 EXCEPTION
1244 WHEN FND_API.G_EXC_ERROR THEN
1245       x_return_status := FND_API.G_RET_STS_ERROR ;
1246       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
1247 
1248 WHEN OTHERS THEN
1249       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
1250       FND_MESSAGE.Set_Token('PACKAGE','GMD_QC_TESTS_GRP.process_after_insert');
1251       FND_MESSAGE.Set_Token('ERROR', substr(sqlerrm,1,100));
1252       FND_MESSAGE.Set_Token('POSITION',l_progress );
1253       FND_MSG_PUB.ADD;
1254       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
1255       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1256 END process_after_insert ;
1257 
1258 /*===========================================================================
1259   FUNCTION NAME:	test_group_order_exist
1260   DESCRIPTION:		This function checks if there is already an existing test group order
1261           present, matching the given test group order, for a given test class.
1262           Added as part of Test Groups Enh Bug: 3447472
1263 ===========================================================================*/
1264 FUNCTION test_group_order_exist(
1265                     p_init_msg_list      IN   VARCHAR2 ,
1266                     p_test_class         IN   VARCHAR2 ,
1267                     p_test_group_order     IN   NUMBER   )
1268 RETURN BOOLEAN IS
1269 l_progress  VARCHAR2(3);
1270 l_exists    VARCHAR2(1);
1271 BEGIN
1272         l_progress := '010';
1273 
1274         IF FND_API.to_Boolean( p_init_msg_list ) THEN
1275             FND_MSG_PUB.initialize;    -- clear the message stack.
1276         END IF;
1277 
1278 
1279         l_progress := '020';
1280 
1281         BEGIN
1282           IF p_test_class IS NOT NULL AND
1283              p_test_group_order IS NOT NULL THEN
1284              SELECT 'X' INTO l_exists
1285              FROM GMD_QC_TESTS_B
1286              WHERE  test_class = p_test_class
1287              AND    test_group_order = p_test_group_order
1288              AND rownum =1 ;
1289                RETURN TRUE;
1290           END IF;
1291             RETURN FALSE;
1292         EXCEPTION
1293         WHEN NO_DATA_FOUND THEN
1294            RETURN FALSE;
1295         END;
1296 EXCEPTION WHEN OTHERS
1297 THEN
1298       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
1299       FND_MESSAGE.Set_Token('PACKAGE','GMD_QC_TESTS_GRP.test_group_order_exist' );
1300       FND_MESSAGE.Set_Token('ERROR', SUBSTR(SQLERRM,1,100));
1301       FND_MESSAGE.Set_Token('POSITION',l_progress );
1302       FND_MSG_PUB.ADD;
1303       RETURN FALSE;
1304 END test_group_order_exist;
1305 
1306 /*===========================================================================
1307   FUNCTION NAME:        POPULATE_TEST_GRP_GT
1308   Change History
1309   Manish Gupta Created 05-04-2004
1310           Added as part of Test Groups Enh Bug: 3447472
1311   RLNAGARA B5099998 23-Mar-2006 Added the order by clause in the insert statement so that the
1312                                 tests are inserted in the table according to the given order.
1313 ===========================================================================*/
1314 PROCEDURE POPULATE_TEST_GRP_GT(p_test_class IN varchar2,
1315                                p_spec_id    IN NUMBER default NULL,
1316                                p_sample_id  IN NUMBER default NULL,
1317                                x_return_status OUT NOCOPY VARCHAR2) IS
1318 
1319 CURSOR c_get_spec_id(p_sample_id NUMBER) IS
1320 select c.spec_id
1321 from   gmd_samples a,
1322        gmd_sampling_events b,
1323        gmd_event_spec_disp c
1324 where  a.sample_id = p_sample_id
1325 and    a.sampling_event_id = b.sampling_event_id
1326 and    a.sampling_event_id = c.sampling_event_id
1327 and    nvl(c.spec_used_for_lot_attrib_ind,'N') ='Y';
1328 
1329 CURSOR c_get_test_id IS
1330 select test_id
1331 from   gmd_test_group_gt;
1332 
1333 
1334 l_spec_id  NUMBER;
1335 l_test_qty_uom VARCHAR2(80);
1336 l_test_qty NUMBER;
1337 
1338 BEGIN
1339 
1340     x_return_status := FND_API.G_RET_STS_SUCCESS ;
1341 
1342    delete gmd_test_group_gt;
1343    INSERT INTO GMD_TEST_GROUP_GT
1344      (TEST_GROUP_ORDER,
1345       TEST_CODE,
1346       TEST_ID,
1347       TEST_DESC,
1348       TEST_TYPE,
1349       TEST_QTY,
1350       TEST_QTY_UOM, --rconv
1351       USED_IN_SPEC,
1352       INCLUDE)
1353     SELECT a.TEST_GROUP_ORDER test_group_order,
1354          a.TEST_CODE test_code,
1355           a.TEST_ID,
1356           a.TEST_DESC test_desc,
1357           b.meaning test_type,
1358           c.test_qty,
1359           c.test_qty_uom,  --rconv
1360           'N',
1361           'Y'
1362    FROM GMD_QC_TESTS a, gem_lookups b , gmd_test_methods c
1363 where a.test_class = p_test_class
1364    AND  b.lookup_type = 'GMD_QC_TEST_TYPE'
1365    AND  a.test_type = b.lookup_code
1366    AND a.test_method_id = c.test_method_id
1367    ORDER BY test_group_order;                      --RLNAGARA B5099998 Added this ORDER BY Clause.
1368 
1369   IF (p_spec_id IS NOT NULL) THEN
1370      UPDATE gmd_test_group_gt
1371      SET    used_in_spec = 'Y', include = 'N'
1372      WHERE  test_id IN (SELECT test_id
1373                        FROM gmd_spec_tests
1374                        WHERE spec_id = p_spec_id);
1375     ELSIF (p_sample_id IS NOT NULL) THEN
1376       OPEN c_get_spec_id(p_sample_id);
1377       FETCH c_get_spec_id INTO l_spec_id;
1378       CLOSE c_get_spec_id;
1379 
1380         FOR l_test_id IN c_get_test_id LOOP
1381         BEGIN
1382            SELECT nvl(a.test_qty_uom, c.test_qty_uom) test_qty_uom,
1383                   nvl(a.test_qty, c.test_qty) test_qty
1384            INTO   l_test_qty_uom, l_test_qty
1385            FROM   gmd_spec_tests a,
1386                   gmd_qc_tests b,
1387                   gmd_test_methods_b c
1388            WHERE  a.spec_id = l_spec_id
1389            AND    a.test_id = b.test_id
1390            AND    b.test_id = l_test_id.test_id
1391            AND    b.test_method_id = c.test_method_id;
1392          EXCEPTION
1393            WHEN NO_DATA_FOUND THEN
1394              SELECT a.test_qty_uom, a.test_qty
1395              INTO   l_test_qty_uom, l_test_qty
1396              FROM   gmd_test_methods_b a, gmd_qc_tests b
1397              WHERE  b.test_id = l_test_id.test_id
1398              AND    a.test_method_id = b.test_method_id;
1399           END;
1400 
1401 
1402 
1403            IF (l_test_qty_uom is NOT NULL) THEN
1404              UPDATE gmd_test_group_gt
1405              SET    test_qty = l_test_qty,
1406                     test_qty_uom = l_test_qty_uom
1407              WHERE  test_id = l_test_id.test_id;
1408            END IF;
1409       END LOOP; --for all the test in temp table
1410     END IF; --If sample id is not null
1411     COMMIT;
1412 EXCEPTION
1413      WHEN OTHERS THEN
1414       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
1415       FND_MESSAGE.Set_Token('PACKAGE','GMD_QC_TESTS_GRP.POPULATE_TEST_GRP_GT' );
1416       FND_MESSAGE.Set_Token('ERROR', substr(sqlerrm,1,100));
1417       FND_MSG_PUB.ADD;
1418       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1419 END POPULATE_TEST_GRP_GT;
1420 
1421 /*===========================================================================
1422   FUNCTION  NAME:       update_test_grp
1423   DESCRIPTION:          This procedure updates the Include flag in the Global
1424                         temporary table for a given test_id
1425   PARAMETERS:           In : p_test_id, p_include
1426   CHANGE HISTORY:       Created         24-MAY-04       RBODDU
1427 ===========================================================================*/
1428 
1429 PROCEDURE update_test_grp(
1430                           p_test_id IN NUMBER ,
1431                           p_include IN VARCHAR2,
1432                           p_test_qty IN NUMBER,
1433                           p_test_uom IN VARCHAR2) IS
1434 BEGIN
1435   UPDATE gmd_test_group_gt SET
1436    include = p_include,
1437    test_qty = p_test_qty,
1438    test_qty_uom = p_test_uom
1439   WHERE  test_id = p_test_id;
1440   COMMIT;
1441 END update_test_grp;
1442 
1443 END gmd_qc_tests_grp ;