DBA Data[Home] [Help]

PACKAGE BODY: APPS.GMD_SPEC_GRP

Source


1 PACKAGE BODY GMD_SPEC_GRP AS
2 --$Header: GMDGSPCB.pls 120.3 2006/05/31 14:50:07 ragsriva noship $ */
3 
4 -- Global variables
5 G_PKG_NAME      CONSTANT VARCHAR2(30) := 'GMD_Spec_GRP';
6    --Bug 3222090, magupta removed call to FND_PROFILE.VALUE('AFLOG_ENABLED')
7    --forward decl.
8    function set_debug_flag return varchar2;
9    --l_debug VARCHAR2(1) := NVL(FND_PROFILE.VALUE('AFLOG_ENABLED'),'N');
10    l_debug VARCHAR2(1) := set_debug_flag;
11 
12    FUNCTION set_debug_flag RETURN VARCHAR2 IS
13    l_debug VARCHAR2(1):= 'N';
14    BEGIN
15     IF( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
16       l_debug := 'Y';
17     END IF;
18     RETURN l_debug;
19    END set_debug_flag;
20 -- Start of comments
21 --+==========================================================================+
22 --|                   Copyright (c) 1998 Oracle Corporation                  |
23 --|                          Redwood Shores, CA, USA                         |
24 --|                            All rights reserved.                          |
25 --+==========================================================================+
26 --| File Name          : GMDGSPCB.pls                                        |
27 --| Package Name       : GMD_Spec_GRP                                        |
28 --| Type               : Group                                               |
29 --|                                                                          |
30 --| Notes                                                                    |
31 --|    This package contains group layer APIs for Specification Entity       |
32 --|                                                                          |
33 --| HISTORY                                                                  |
34 --|    Chetan Nagar	26-Jul-2002	Created.                             |
35 --|    Rameshwar        13-APR-2004     BUG#3545701                          |
36 --|                     Commented the code for non-validated test            |
37 --|                     in the check_for_null_and_fks_in_stst procedure      |
38 --+==========================================================================+
39 -- End of comments
40 
41 
42 
43 --Start of comments
44 --+========================================================================+
45 --| API Name    : check_for_null_and_fks_in_spec                           |
46 --| TYPE        : Group                                                    |
47 --| Notes       : This procedure checks for NULL and Foreign Key           |
48 --|               constraints for the required filed in the Spec           |
49 --|               Header record.                                           |
50 --|                                                                        |
51 --|               If everything is fine then 'S' is returned in the        |
52 --|               parameter - x_return_status otherwise error message      |
53 --|               is logged and error status - E or U returned             |
54 --|                                                                        |
55 --| HISTORY                                                                |
56 --|    Chetan Nagar	26-Jul-2002	Created.                                   |
57 --|                                                                        |
58 --| Saikiran Vankadari 07-Feb-2005  Changed as part of Convergence         |
59 --| RLNAGARA           10-Oct-2005  Bug # 4546546 - Included revision in the inbound criteria |
60 --|                                                                        |
61 --+========================================================================+
62 -- End of comments
63 
64 PROCEDURE check_for_null_and_fks_in_spec
65 ( p_spec_header   IN  gmd_specifications%ROWTYPE
66 , x_item_number       OUT NOCOPY VARCHAR2
67 , x_owner         OUT NOCOPY VARCHAR2
68 , x_return_status OUT NOCOPY VARCHAR2
69 ) IS
70 
71   -- Bug# 5251612
72   -- Added additional where clause to check process_quality_enabled_flag
73   CURSOR c_item(p_inventory_item_id NUMBER, p_organization_id NUMBER) IS
74   SELECT concatenated_segments,grade_control_flag
75   FROM   mtl_system_items_kfv
76   WHERE  inventory_item_id = p_inventory_item_id
77   AND    organization_id   = p_organization_id
78   AND    process_quality_enabled_flag = 'Y';
79 
80 --RLNAGARA Bug # 4548546 For Revision
81   CURSOR c_rev_ctrl(p_inventory_item_id NUMBER, p_organization_id NUMBER) IS
82   SELECT revision_qty_control_code
83   FROM mtl_system_items_b
84   WHERE inventory_item_id = p_inventory_item_id
85   AND organization_id = p_organization_id;
86 
87   CURSOR c_revision(p_inventory_item_id NUMBER, p_organization_id NUMBER,p_revision VARCHAR2) IS
88   SELECT 1
89   FROM mtl_item_revisions
90   WHERE inventory_item_id = p_inventory_item_id
91   AND organization_id = p_organization_id
92   AND revision = p_revision;
93 --RLNAGARA Bug # 4548546 For Revision
94 
95   CURSOR c_grade(p_grade VARCHAR2) IS
96   SELECT 1
97   FROM   mtl_grades_b
98   WHERE  grade_code = p_grade
99   AND disable_flag = 'N';
100 
101 
102   CURSOR c_status (p_spec_status NUMBER) IS
103   SELECT 1
104   FROM   gmd_qc_status
105   WHERE  status_code = p_spec_status
106   AND    delete_mark = 0
107   and    entity_type = 'S';
108 
109   CURSOR c_orgn (p_organization_id NUMBER) IS
110   SELECT 1
111   FROM   mtl_parameters
112   WHERE  organization_id = p_Organization_id;
113 
114 
115   CURSOR c_owner(p_owner_id NUMBER) IS
116   SELECT user_name
117   FROM   fnd_user
118   WHERE  user_id                 = p_owner_id
119   AND    start_date             <= SYSDATE
120   AND    nvl(end_date, SYSDATE + 1) >= SYSDATE;
121 
122 
123   -- Check for Approved Base Spec (Bug 3401368)
124   CURSOR c_spec (p_spec_id NUMBER) IS
125   SELECT 1
126   FROM   gmd_specifications_b
127   WHERE  spec_id = p_spec_id
128   AND    spec_status = 700 ;
129 
130 
131   dummy               NUMBER;
132   l_grade_ctl	      VARCHAR2(1);
133 
134 BEGIN
135 
136   --  Initialize API return status to success
137   x_return_status := FND_API.G_RET_STS_SUCCESS;
138 
139   -- Spec Name
140   IF (ltrim(rtrim(p_spec_header.spec_name)) IS NULL) THEN
141     GMD_API_PUB.Log_Message('GMD_SPEC_NAME_REQD');
142     RAISE FND_API.G_EXC_ERROR;
143   END IF;
144 
145   -- Spec Vers
146   IF (p_spec_header.spec_vers IS NULL) THEN
147     GMD_API_PUB.Log_Message('GMD_SPEC_VERS_REQD');
148     RAISE FND_API.G_EXC_ERROR;
149   ELSIF (p_spec_header.spec_vers < 0) THEN
150     GMD_API_PUB.Log_Message('GMD_SPEC_VERS_INVALID');
151     RAISE FND_API.G_EXC_ERROR;
152   END IF;
153 
154   --Spec Type (Bug 3451973)
155   IF (p_spec_header.spec_type in ('M', 'I')) THEN
156 	null ;
157   else
158     GMD_API_PUB.Log_Message('GMD_SPEC_TYPE_NOT_FOUND');
159     RAISE FND_API.G_EXC_ERROR;
160   end if;
161 
162   -- Item ID
163   IF (p_spec_header.inventory_item_id IS NULL)
164     and (p_spec_header.spec_type = 'I')   -- Bug 3401368: this is only for item specs
165     THEN
166      GMD_API_PUB.Log_Message('GMD_SPEC_ITEM_REQD');
167      RAISE FND_API.G_EXC_ERROR;
168   ELSE
169     -- Get the Item No
170     OPEN c_item(p_spec_header.inventory_item_id, p_spec_header.owner_organization_id);
171     FETCH c_item INTO x_item_number,l_grade_ctl;
172     IF (c_item%NOTFOUND)  and (p_spec_header.spec_type = 'I')  -- Bug 3401368: this is only for item specs
173      THEN
174       CLOSE c_item;
175       GMD_API_PUB.Log_Message('GMD_SPEC_ITEM_NOT_FOUND');
176       RAISE FND_API.G_EXC_ERROR;
177     END IF;
178     CLOSE c_item;
179   END IF;
180 
181 -- Start RLNAGARA  Bug # 4548546
182 --For Revision
183  IF (p_spec_header.revision IS NOT NULL) THEN
184    --Check whether it is a revision controlled item in MTL_SYSTEM_ITEMS_B
185    OPEN c_rev_ctrl(p_spec_header.inventory_item_id, p_spec_header.owner_organization_id);
186    FETCH c_rev_ctrl into dummy;
187    IF dummy = 2 THEN  --The item is a revision controlled item
188      -- Check that Revision exist in MTL_ITEM_REVISIONS
189      OPEN c_revision(p_spec_header.inventory_item_id, p_spec_header.owner_organization_id,p_spec_header.revision);
190      FETCH c_revision INTO dummy;
191      IF c_revision%NOTFOUND THEN
192        CLOSE c_revision;
193        CLOSE c_rev_ctrl;
194        GMD_API_PUB.Log_Message('GMD_SPEC_REVISION_NOT_FOUND',
195                                'REVISION', p_spec_header.revision);
196        RAISE FND_API.G_EXC_ERROR;
197      END IF; --c_revision%NOTFOUND
198      CLOSE c_revision;
199    ELSIF dummy = 1 THEN  --The item is not a revision controlled item
200      CLOSE c_rev_ctrl;
201      GMD_API_PUB.Log_Message('GMD_SPEC_NOT_REVISION_CTRL');
202      RAISE FND_API.G_EXC_ERROR;
203    END IF; --dummy = 2
204    CLOSE c_rev_ctrl;
205  END IF; --(p_spec_header.revision IS NOT NULL)
206 -- End RLNAGARA Bug # 4548546
207 
208   -- Grade
209   IF l_grade_ctl = 'N' and p_spec_header.grade_code IS NOT NULL THEN
210       GMD_API_PUB.Log_Message('GMD_GRADE_NOT_REQD');
211       RAISE FND_API.G_EXC_ERROR;
212   END IF;
213 
214   IF (p_spec_header.grade_code IS NOT NULL) THEN
215     -- Check that Grade exist in QC_GRAD_MST
216     OPEN c_grade(p_spec_header.grade_code);
217     FETCH c_grade INTO dummy;
218     IF c_grade%NOTFOUND THEN
219       CLOSE c_grade;
220       GMD_API_PUB.Log_Message('GMD_SPEC_GRADE_NOT_FOUND',
221                               'GRADE', p_spec_header.grade_code);
222       RAISE FND_API.G_EXC_ERROR;
223     END IF;
224     CLOSE c_grade;
225   END IF;
226 
227   -- Spec Status
228   IF (p_spec_header.spec_status IS NULL) THEN
229     GMD_API_PUB.Log_Message('GMD_SPEC_STATUS_REQD');
230     RAISE FND_API.G_EXC_ERROR;
231   ELSE
232     -- Check that Status exist in GMD_QM_STATUS
233     OPEN c_status(p_spec_header.spec_status);
234     FETCH c_status INTO dummy;
235     IF c_status%NOTFOUND THEN
236       CLOSE c_status;
237       GMD_API_PUB.Log_Message('GMD_SPEC_STATUS_NOT_FOUND',
238                               'STATUS', p_spec_header.spec_status);
239       RAISE FND_API.G_EXC_ERROR;
240     END IF;
241     CLOSE c_status;
242   END IF;
243 
244   -- Owner Orgn Code
245   IF (p_spec_header.owner_organization_id IS NULL) THEN
246     GMD_API_PUB.Log_Message('GMD_SPEC_ORGN_REQD');
247     RAISE FND_API.G_EXC_ERROR;
248   ELSE
249     -- Check that Owner Organization id exist in MTL_PARAMETERS
250     OPEN c_orgn(p_spec_header.owner_organization_id);
251     FETCH c_orgn INTO dummy;
252     IF c_orgn%NOTFOUND THEN
253       CLOSE c_orgn;
254       GMD_API_PUB.Log_Message('GMD_SPEC_ORGN_ID_NOT_FOUND',
255                               'ORGNID', p_spec_header.owner_organization_id);
256       RAISE FND_API.G_EXC_ERROR;
257     END IF;
258     CLOSE c_orgn;
259   END IF;
260 
261   -- Owner ID
262   IF (p_spec_header.owner_id IS NULL) THEN
263     GMD_API_PUB.Log_Message('GMD_SPEC_OWNER_REQD');
264     RAISE FND_API.G_EXC_ERROR;
265   ELSE
266     -- Get the Owner Name
267     OPEN c_owner(p_spec_header.owner_id);
268     FETCH c_owner INTO x_owner;
269     IF c_owner%NOTFOUND THEN
270       CLOSE c_owner;
271       GMD_API_PUB.Log_Message('GMD_SPEC_OWNER_NOT_FOUND');
272       RAISE FND_API.G_EXC_ERROR;
273     END IF;
274     CLOSE c_owner;
275   END IF;
276 
277 
278   -- Overlay Ind (Bug 3452015)
279   if (nvl(p_spec_header.OVERLAY_IND,'Y') <>  'Y') then
280 	      GMD_API_PUB.Log_Message('GMD_OVERLAY_NOT_VALID');
281 	      RAISE FND_API.G_EXC_ERROR;
282   end if ;
283 
284   IF (p_spec_header.OVERLAY_IND is NULL) THEN
285       IF (p_spec_header.BASE_SPEC_ID IS NOT NULL) THEN
286 	      GMD_API_PUB.Log_Message('GMD_OVERLAY_NOT_VALID');
287 	      RAISE FND_API.G_EXC_ERROR;
288       end if;
289   end if;
290 
291   IF (p_spec_header.OVERLAY_IND = 'Y') THEN
292       IF (p_spec_header.BASE_SPEC_ID IS NULL) THEN
293 	      GMD_API_PUB.Log_Message('GMD_BASE_SPEC_NOT_FOUND',
294                               'BASE_SPEC_ID', p_spec_header.base_spec_id);
295 	      RAISE FND_API.G_EXC_ERROR;
296       end if;
297   end if;
298 
299 
300   -- Base Spec ID (Bug 3401368)
301   IF (p_spec_header.BASE_SPEC_ID IS NOT NULL) THEN
302    -- Check to make sure that the base spec is valid
303     OPEN c_spec(p_spec_header.base_spec_id);
304     FETCH c_spec INTO dummy;
305     IF c_spec%NOTFOUND THEN
306       CLOSE c_spec;
307       GMD_API_PUB.Log_Message('GMD_BASE_SPEC_NOT_FOUND',
308                               'BASE_SPEC_ID', p_spec_header.base_spec_id);
309       RAISE FND_API.G_EXC_ERROR;
310     END IF;
311     CLOSE c_spec;
312   END IF;
313 
314 EXCEPTION
315   WHEN FND_API.G_EXC_ERROR THEN
316     x_return_status := FND_API.G_RET_STS_ERROR ;
317   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
318     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
319   WHEN OTHERS THEN
320     GMD_API_PUB.Log_Message('GMD_API_ERROR','PACKAGE','gmd_spec_grp.check_for_null_and_fks_in_spec',
321     	'ERROR',substr(sqlerrm,1,100),'POSITION','010');
322     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
323 
324 END check_for_null_and_fks_in_spec;
325 
326 
327 --Start of comments
328 --+========================================================================+
329 --| API Name    : check_for_null_and_fks_in_stst                           |
330 --| TYPE        : Group                                                    |
331 --| Notes       : This procedure checks for NULL and Foreign Key           |
332 --|               constraints for the required filed in the Spec           |
333 --|               Test record.                                             |
334 --|                                                                        |
335 --|               If everything is fine then 'S' is returned in the        |
336 --|               parameter - x_return_status otherwise error message      |
337 --|               is logged and error status - E or U returned             |
338 --|                                                                        |
339 --| HISTORY                                                                |
340 --|    Mahesh Chandak	14-Nov-2002	Created.                           |
341 --|    Rameshwar        12-APR-2004     BUG#3545701                        |
342 --|                 Commented the code for non-validated tests             |
343 --|                                                                        |
344 --| Saikiran Vankadari 07-Feb-2005  Changed as part of Convergence         |
345 --|                                                                        |
346 --+========================================================================+
347 -- End of comments
348 
349 PROCEDURE check_for_null_and_fks_in_stst
350 (
351   p_spec_tests    IN  gmd_spec_tests%ROWTYPE
352 , x_spec_tests    OUT NOCOPY gmd_spec_tests%ROWTYPE
353 , x_return_status OUT NOCOPY VARCHAR2
354 ) IS
355 
356 
357   CURSOR cr_test(p_test_id NUMBER) IS
358   SELECT test_code,test_method_id,test_type,min_value_num,max_value_num,priority
359   FROM   gmd_qc_tests_b
360   WHERE  test_id = p_test_id
361   AND    delete_mark = 0 ;
362 
363   CURSOR cr_test_method_valid(p_test_method_id NUMBER) IS
364   SELECT test_method_id,test_replicate
365   FROM   gmd_test_methods_b
366   WHERE  test_method_id = p_test_method_id
367   AND    delete_mark = 0 ;
368 
369   CURSOR cr_action_code(p_action_code VARCHAR2) IS
370   SELECT 'x' FROM MTL_ACTIONS_B
371   WHERE action_code = p_action_code
372   AND   disable_flag = 'N';
373 
374 
375   l_temp              VARCHAR2(1);
376   l_grade_ctl	      NUMBER(1);
377   l_test_type	      VARCHAR2(1);
378   l_test_code	      GMD_QC_TESTS_B.TEST_CODE%TYPE;
379   l_test_min_value_num     NUMBER;
380   l_test_max_value_num     NUMBER;
381   l_test_method_id    NUMBER;
382   l_test_priority     GMD_SPEC_TESTS_B.TEST_PRIORITY%TYPE;
383   l_test_method_replicate   NUMBER;
384 
385 BEGIN
386 
387   --  Initialize API return status to success
388   x_return_status := FND_API.G_RET_STS_SUCCESS;
389 
390   x_spec_tests := p_spec_tests;
391   -- Test
392   IF x_spec_tests.test_id IS NULL  THEN
393      GMD_API_PUB.Log_Message('GMD_TEST_ID_CODE_NULL');
394      RAISE FND_API.G_EXC_ERROR;
395   ELSE
396       OPEN  cr_test(x_spec_tests.test_id);
397       FETCH cr_test INTO l_test_code,l_test_method_id,l_test_type,l_test_min_value_num,
398       	l_test_max_value_num,l_test_priority;
399       IF cr_test%NOTFOUND THEN
400     	 CLOSE cr_test;
401     	 GMD_API_PUB.Log_Message('GMD_INVALID_TEST','TEST',x_spec_tests.test_id);
402          RAISE FND_API.G_EXC_ERROR;
403       END IF;
404       CLOSE cr_test ;
405   END IF;
406 
407   -- test method
408   IF x_spec_tests.test_method_id IS NULL THEN
409      x_spec_tests.test_method_id := l_test_method_id;
410   ELSIF x_spec_tests.test_method_id <> l_test_method_id THEN
411      GMD_API_PUB.Log_Message('GMD_SPEC_TST_MTHD_INVALID');
412      RAISE FND_API.G_EXC_ERROR;
413   END IF;
414 
415   OPEN  cr_test_method_valid(l_test_method_id);
416   FETCH cr_test_method_valid INTO l_test_method_id,l_test_method_replicate;
417   IF cr_test_method_valid%NOTFOUND THEN
418      CLOSE cr_test_method_valid;
419      GMD_API_PUB.Log_Message('GMD_TEST_METHOD_DELETED');
420      RAISE FND_API.G_EXC_ERROR;
421   END IF;
422   CLOSE cr_test_method_valid ;
423 
424   -- test sequence
425   IF x_spec_tests.seq IS NULL THEN
426      GMD_API_PUB.Log_Message('GMD_SPEC_TEST_SEQ_REQD');
427      RAISE FND_API.G_EXC_ERROR;
428   ELSE
429      IF x_spec_tests.seq <> trunc(x_spec_tests.seq) THEN
430         GMD_API_PUB.Log_Message('GMD_SPEC_TEST_SEQ_NO');
431         RAISE FND_API.G_EXC_ERROR;
432      END IF;
433   END IF;
434 
435   IF l_test_type IN ('U','T','V') THEN
436 
437        IF (x_spec_tests.display_precision IS NOT NULL OR x_spec_tests.report_precision IS NOT NULL) THEN
438            FND_MESSAGE.SET_NAME('GMD','GMD_PRECISION_NOT_REQD');
439            FND_MSG_PUB.ADD;
440            RAISE FND_API.G_EXC_ERROR;
441        END IF;
442 
443        IF (x_spec_tests.min_value_num IS NOT NULL OR x_spec_tests.max_value_num IS NOT NULL) THEN
444            FND_MESSAGE.SET_NAME('GMD','GMD_TEST_NUM_RANGE_NOT_REQD');
445            FND_MSG_PUB.ADD;
446            RAISE FND_API.G_EXC_ERROR;
447        END IF;
448 
449        IF x_spec_tests.target_value_num IS NOT NULL THEN
450            FND_MESSAGE.SET_NAME('GMD','GMD_TEST_NUM_TARGET_NOT_REQD');
451            FND_MSG_PUB.ADD;
452            RAISE FND_API.G_EXC_ERROR;
453        END IF;
454        --BEGIN BUG#3545701
455        --Commented the code for Non-validated tests.
456        /* IF l_test_type = 'U' and x_spec_tests.target_value_char IS NOT NULL THEN
457            FND_MESSAGE.SET_NAME('GMD','GMD_TEST_CHAR_TARGET_NOT_REQD');
458            FND_MSG_PUB.ADD;
459            RAISE FND_API.G_EXC_ERROR; */
460        --END BUG#3545701
461        IF l_test_type = 'V' and x_spec_tests.target_value_char IS NULL THEN
462            FND_MESSAGE.SET_NAME('GMD','GMD_TEST_CHAR_TARGET_REQD');
463            FND_MSG_PUB.ADD;
464            RAISE FND_API.G_EXC_ERROR;
465        END IF;
466 
467        IF (l_test_type = 'T') THEN
468            IF (x_spec_tests.min_value_char IS NULL OR x_spec_tests.max_value_char IS NULL) THEN
469                FND_MESSAGE.SET_NAME('GMD','GMD_TEST_RANGE_REQ');
470                FND_MSG_PUB.ADD;
471                RAISE FND_API.G_EXC_ERROR;
472            END IF;
473        ELSE
474           IF (x_spec_tests.min_value_char IS NOT NULL OR x_spec_tests.max_value_char IS NOT NULL) THEN
475              FND_MESSAGE.SET_NAME('GMD','GMD_TEST_CHAR_RANGE_NOT_REQD');
476              FND_MSG_PUB.ADD;
477              RAISE FND_API.G_EXC_ERROR;
478           END IF;
479        END IF;
480 
481       --BEGIN BUG#3545701
482       --Commented the code for Non-validated tests.
483       /*  IF l_test_type = 'U' and x_spec_tests.out_of_spec_action IS NOT NULL THEN
484            FND_MESSAGE.SET_NAME('GMD','GMD_ACTION_CODE_NOT_REQD');
485            FND_MSG_PUB.ADD;
486            RAISE FND_API.G_EXC_ERROR;
487        END IF; */
488       --END BUG#3545701
489 
490        IF x_spec_tests.exp_error_type IS NOT NULL THEN
491             FND_MESSAGE.SET_NAME('GMD','GMD_INVALID_EXP_ERROR_TYPE');
492             FND_MSG_PUB.ADD;
493             RAISE FND_API.G_EXC_ERROR;
494        END IF;
495 
496        IF (x_spec_tests.below_spec_min IS NOT NULL OR  x_spec_tests.below_min_action_code IS NOT NULL )
497         OR (x_spec_tests.above_spec_min IS NOT NULL OR  x_spec_tests.above_min_action_code IS NOT NULL )
498         OR (x_spec_tests.below_spec_max IS NOT NULL OR  x_spec_tests.below_max_action_code IS NOT NULL )
499         OR (x_spec_tests.above_spec_max IS NOT NULL OR  x_spec_tests.above_max_action_code IS NOT NULL ) THEN
500            FND_MESSAGE.SET_NAME('GMD', 'GMD_EXP_ERROR_NOT_REQD');
501            FND_MSG_PUB.ADD;
502            RAISE FND_API.G_EXC_ERROR;
503        END IF;
504    ELSE
505        IF (x_spec_tests.display_precision IS NULL OR x_spec_tests.report_precision IS NULL ) THEN
506            GMD_API_PUB.Log_Message('GMD_PRECISION_REQD','TEST',l_test_code);
507            RAISE FND_API.G_EXC_ERROR;
508        END IF;
509 
510        IF (x_spec_tests.display_precision not between 0 and 9) THEN
511            GMD_API_PUB.Log_Message('GMD_INVALID_PRECISION','PRECISION',x_spec_tests.display_precision);
512 	   RAISE FND_API.G_EXC_ERROR;
513        END IF;
514 
515        IF (x_spec_tests.report_precision not between 0 and 9) THEN
516            GMD_API_PUB.Log_Message('GMD_INVALID_PRECISION','PRECISION',x_spec_tests.report_precision);
517 	   RAISE FND_API.G_EXC_ERROR;
518        END IF;
519 
520        IF (x_spec_tests.min_value_num IS NULL AND x_spec_tests.max_value_num IS NULL) THEN
521            FND_MESSAGE.SET_NAME('GMD','GMD_MIN_MAX_REQ');
522            FND_MSG_PUB.ADD;
523            RAISE FND_API.G_EXC_ERROR;
524        END IF;
525 
526        IF ((x_spec_tests.min_value_num IS NULL AND l_test_min_value_num IS NOT NULL)
527           OR (x_spec_tests.max_value_num IS NULL AND l_test_max_value_num IS NOT NULL)) THEN
528            FND_MESSAGE.SET_NAME('GMD','GMD_TEST_RANGE_REQ');
529            FND_MSG_PUB.ADD;
530            RAISE FND_API.G_EXC_ERROR;
531        END IF;
532 
533        IF (x_spec_tests.min_value_char IS NOT NULL OR x_spec_tests.max_value_char IS NOT NULL) THEN
534            FND_MESSAGE.SET_NAME('GMD','GMD_TEST_CHAR_RANGE_NOT_REQD');
535            FND_MSG_PUB.ADD;
536            RAISE FND_API.G_EXC_ERROR;
537        END IF;
538 
539        IF x_spec_tests.target_value_char IS NOT NULL THEN
540            FND_MESSAGE.SET_NAME('GMD','GMD_TEST_CHAR_TARGET_NOT_REQD');
541            FND_MSG_PUB.ADD;
542            RAISE FND_API.G_EXC_ERROR;
543        END IF;
544 
545        IF ((x_spec_tests.exp_error_type IN ('N','P')) OR (x_spec_tests.exp_error_type IS NULL)) THEN
546     	   NULL ;
547        ELSE
548            FND_MESSAGE.SET_NAME('GMD','GMD_INVALID_EXP_ERROR_TYPE');
549            FND_MSG_PUB.ADD;
550            RAISE FND_API.G_EXC_ERROR;
551        END IF;
552 
553        IF x_spec_tests.exp_error_type IS NULL AND
554         (x_spec_tests.below_spec_min IS NOT NULL OR x_spec_tests.above_spec_min IS NOT NULL
555         OR x_spec_tests.below_spec_max IS NOT NULL OR x_spec_tests.above_spec_max IS NOT NULL)
556        THEN
557        	   FND_MESSAGE.SET_NAME('GMD', 'GMD_EXP_ERROR_TYPE_REQ');
558            FND_MSG_PUB.ADD;
559            RAISE FND_API.G_EXC_ERROR;
560        END IF;
561 
562        IF x_spec_tests.exp_error_type IS NOT NULL AND
563         (x_spec_tests.below_spec_min IS NULL AND x_spec_tests.above_spec_min IS NULL
564         AND x_spec_tests.below_spec_max IS NULL AND x_spec_tests.above_spec_max IS NULL)
565        THEN
566           FND_MESSAGE.SET_NAME('GMD', 'GMD_EXP_ERR_TYPE_NULL');
567           FND_MSG_PUB.ADD;
568           RAISE FND_API.G_EXC_ERROR;
569        END IF;
570 
571     END IF;
572 
573     -- test UOM and Quantity.
574     IF (l_test_type = 'E') THEN
575        IF (x_spec_tests.test_qty_uom IS NOT NULL OR x_spec_tests.test_qty IS NOT NULL) THEN
576            GMD_API_PUB.Log_Message('GMD_TEST_UOM_QTY_NOT_REQD');
577            RAISE FND_API.G_EXC_ERROR;
578        END IF;
579     ELSE
580        IF x_spec_tests.test_qty <= 0 THEN
581           GMD_API_PUB.Log_Message('GMD_TEST_QTY_NEG');
582           RAISE FND_API.G_EXC_ERROR;
583        END IF;
584 
585        IF (x_spec_tests.test_qty_uom IS NOT NULL AND x_spec_tests.test_qty IS NULL) OR
586           (x_spec_tests.test_qty_uom IS NULL AND x_spec_tests.test_qty IS NOT NULL) THEN
587            GMD_API_PUB.Log_Message('GMD_TEST_UOM_QTY_REQD');
588            RAISE FND_API.G_EXC_ERROR;
589        END IF;
590     END IF;
591 
592     IF x_spec_tests.test_priority IS NULL THEN
593         x_spec_tests.test_priority := l_test_priority;
594 
595     ELSIF (NOT GMD_QC_TESTS_GRP.validate_test_priority(p_test_priority => x_spec_tests.test_priority)) THEN
596         GMD_API_PUB.Log_Message('GMD_INVALID_TEST_PRIORITY');
597         RAISE FND_API.G_EXC_ERROR;
598     END IF;
599 
600     -- Replicate Validation
601     IF x_spec_tests.test_replicate IS NULL THEN
602        GMD_API_PUB.Log_Message('GMD_TEST_REP_REQD');
603        RAISE FND_API.G_EXC_ERROR;
604     ELSIF (l_test_type = 'E' and x_spec_tests.test_replicate <> 1) THEN
605         GMD_API_PUB.Log_Message('SPEC_TEST_REPLICATE_ONE');
606         RAISE FND_API.G_EXC_ERROR;
607     ELSIF (x_spec_tests.test_replicate < l_test_method_replicate) THEN
608         GMD_API_PUB.Log_Message('SPEC_TEST_REPLICATE_ERROR',
609                             'SPEC_TEST', l_test_code);
610         RAISE FND_API.G_EXC_ERROR;
611     END IF;
612 
613 
614     -- Bug 3437091
615     -- Check on CALC_UOM_CONV_IND
616     IF (x_spec_tests.CALC_UOM_CONV_IND IS NULL) or
617 	(x_spec_tests.CALC_UOM_CONV_IND = 'Y')     then
618 	null;
619     else
620         GMD_API_PUB.Log_Message('GMD_UOM_CONV_IND');
621         RAISE FND_API.G_EXC_ERROR;
622     END IF;
623 
624 
625     -- action code foreign key validation.
626     IF x_spec_tests.BELOW_MIN_ACTION_CODE IS NOT NULL THEN
627         OPEN  cr_action_code(x_spec_tests.below_min_action_code);
628     	FETCH cr_action_code INTO l_temp;
629     	IF cr_action_code%NOTFOUND THEN
630     	    CLOSE cr_action_code;
631     	    GMD_API_PUB.Log_Message('GMD_INVALID_ACTION_CODE','ACTION',x_spec_tests.below_min_action_code);
632     	    RAISE FND_API.G_EXC_ERROR;
633     	END IF;
634     	CLOSE cr_action_code ;
635     END IF;
636 
637     IF x_spec_tests.ABOVE_MIN_ACTION_CODE IS NOT NULL THEN
638         OPEN  cr_action_code(x_spec_tests.above_min_action_code);
639     	FETCH cr_action_code INTO l_temp;
640     	IF cr_action_code%NOTFOUND THEN
641     	    CLOSE cr_action_code;
642     	    GMD_API_PUB.Log_Message('GMD_INVALID_ACTION_CODE','ACTION',x_spec_tests.above_min_action_code);
643             RAISE FND_API.G_EXC_ERROR;
644     	END IF;
645     	CLOSE cr_action_code ;
646     END IF;
647 
648     IF x_spec_tests.BELOW_MAX_ACTION_CODE IS NOT NULL THEN
649         OPEN  cr_action_code(x_spec_tests.below_max_action_code);
650     	FETCH cr_action_code INTO l_temp;
651     	IF cr_action_code%NOTFOUND THEN
652     	    CLOSE cr_action_code;
653     	    GMD_API_PUB.Log_Message('GMD_INVALID_ACTION_CODE','ACTION',x_spec_tests.below_max_action_code);
654             RAISE FND_API.G_EXC_ERROR;
655     	END IF;
656     	CLOSE cr_action_code ;
657     END IF;
658 
659     IF x_spec_tests.ABOVE_MAX_ACTION_CODE IS NOT NULL THEN
660         OPEN  cr_action_code(x_spec_tests.above_max_action_code);
661     	FETCH cr_action_code INTO l_temp;
662     	IF cr_action_code%NOTFOUND THEN
663     	    CLOSE cr_action_code;
664     	    GMD_API_PUB.Log_Message('GMD_INVALID_ACTION_CODE','ACTION',x_spec_tests.above_max_action_code);
665             RAISE FND_API.G_EXC_ERROR;
666     	END IF;
667     	CLOSE cr_action_code ;
668     END IF;
669 
670     IF x_spec_tests.out_of_spec_action IS NOT NULL THEN
671         OPEN  cr_action_code(x_spec_tests.out_of_spec_action);
672     	FETCH cr_action_code INTO l_temp;
673     	IF cr_action_code%NOTFOUND THEN
674     	    CLOSE cr_action_code;
675     	    GMD_API_PUB.Log_Message('GMD_INVALID_ACTION_CODE','ACTION',x_spec_tests.out_of_spec_action);
676             RAISE FND_API.G_EXC_ERROR;
677     	END IF;
678     	CLOSE cr_action_code ;
679     END IF;
680 
681     IF x_spec_tests.use_to_control_step IS NULL OR x_spec_tests.use_to_control_step IN ('N','Y') THEN
682     	NULL ;
683     ELSE
684         GMD_API_PUB.Log_Message('GMD_SPEC_INVALID_IND','COLUMN','USE_TO_CONTROL_STEP');
685         RAISE FND_API.G_EXC_ERROR;
686     END IF;
687     IF x_spec_tests.use_to_control_step = 'N' THEN
688        x_spec_tests.use_to_control_step:=  NULL;
689     END IF;
690 
691     IF x_spec_tests.optional_ind IS NULL OR x_spec_tests.optional_ind IN ('N','Y') THEN
692     	NULL ;
693     ELSE
694         GMD_API_PUB.Log_Message('GMD_SPEC_INVALID_IND','COLUMN','OPTIONAL_IND');
695         RAISE FND_API.G_EXC_ERROR;
696     END IF;
697     IF x_spec_tests.optional_ind = 'N' THEN
698        x_spec_tests.optional_ind:=  NULL;
699     END IF;
700 
701     IF x_spec_tests.print_spec_ind IS NULL OR x_spec_tests.print_spec_ind IN ('N','Y') THEN
702     	NULL ;
703     ELSE
704         GMD_API_PUB.Log_Message('GMD_SPEC_INVALID_IND','COLUMN','PRINT_SPEC_IND');
705         RAISE FND_API.G_EXC_ERROR;
706     END IF;
707     IF x_spec_tests.print_spec_ind = 'N' THEN
708        x_spec_tests.print_spec_ind:=  NULL;
709     END IF;
710 
711     IF x_spec_tests.print_result_ind IS NULL OR x_spec_tests.print_result_ind IN ('N','Y') THEN
712     	NULL ;
713     ELSE
714         GMD_API_PUB.Log_Message('GMD_SPEC_INVALID_IND','COLUMN','PRINT_RESULT_IND');
715         RAISE FND_API.G_EXC_ERROR;
716     END IF;
717     IF x_spec_tests.print_result_ind = 'N' THEN
718        x_spec_tests.print_result_ind:=  NULL;
719     END IF;
720 
721     IF x_spec_tests.retest_lot_expiry_ind IS NULL OR x_spec_tests.retest_lot_expiry_ind IN ('N','Y') THEN
722     	NULL ;
723     ELSE
724         GMD_API_PUB.Log_Message('GMD_SPEC_INVALID_IND','COLUMN','RETEST_LOT_EXPIRY_IND');
725         RAISE FND_API.G_EXC_ERROR;
726     END IF;
727     IF x_spec_tests.retest_lot_expiry_ind = 'N' THEN
728        x_spec_tests.retest_lot_expiry_ind:=  NULL;
729     END IF;
730 
731 
732 EXCEPTION
733   WHEN FND_API.G_EXC_ERROR THEN
734     x_return_status := FND_API.G_RET_STS_ERROR ;
735   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
736     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
737   WHEN OTHERS THEN
738     GMD_API_PUB.Log_Message('GMD_API_ERROR','PACKAGE','gmd_spec_grp.check_for_null_and_fks_in_stst',
739     	'ERROR',substr(sqlerrm,1,100),'POSITION','010');
740     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
741 
742 END check_for_null_and_fks_in_stst;
743 
744 --Start of comments
745 --+========================================================================+
746 --| API Name    : validate_spec_header                                     |
747 --| TYPE        : Group                                                    |
748 --| Notes       : This procedure validates all the fields of               |
749 --|               specification header. This procedure can be              |
750 --|               called from FORM or API and the caller need              |
751 --|               to specify this in p_called_from parameter               |
752 --|               while calling this procedure. Based on where             |
753 --|               it is called from certain validations will               |
754 --|               either be performed or skipped.                          |
755 --|                                                                        |
756 --|               If everything is fine then OUT parameter                 |
757 --|               x_return_status is set to 'S' else appropriate           |
758 --|               error message is put on the stack and error              |
759 --|               is returned.                                             |
760 --|                                                                        |
761 --| HISTORY                                                                |
762 --|    Chetan Nagar	26-Jul-2002	Created.                                   |
763 --|                                                                        |
764 --|                                                                        |
765 --| Saikiran Vankadari 07-Feb-2005  Changed as part of Convergence         |
766 --|                                                                        |                                                            |
767 --+========================================================================+
768 -- End of comments
769 
770 PROCEDURE validate_spec_header
771 (
772   p_spec_header   IN  gmd_specifications%ROWTYPE
773 , p_called_from   IN  VARCHAR2
774 , p_operation     IN  VARCHAR2
775 , x_return_status OUT NOCOPY VARCHAR2
776 ) IS
777 
778   -- Local Variables
779   l_item_number                  VARCHAR2(80);
780   l_owner                        VARCHAR2(30);
781   l_return_status                VARCHAR2(1);
782   l_owner_organization_code      VARCHAR2(3);
783 
784 BEGIN
785   --  Initialize API return status to success
786   x_return_status := FND_API.G_RET_STS_SUCCESS;
787 
788   IF (p_called_from = 'API') THEN
789     -- Check for NULLs and Valid Foreign Keys in the input parameter
790     GMD_Spec_GRP.check_for_null_and_fks_in_spec
791       (
792         p_spec_header   => p_spec_header
793       , x_item_number   => l_item_number
794       , x_owner         => l_owner
795       , x_return_status => l_return_status
796       );
797     -- No need if called from FORM since it is already
798     -- done in the form
799 
800     IF l_return_status = FND_API.G_RET_STS_ERROR THEN
801       -- Message is alrady logged by check_for_null procedure
802       RAISE FND_API.G_EXC_ERROR;
803     ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
804       -- Message is alrady logged by check_for_null procedure
805       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
806     END IF;
807   END IF;
808 
809   -- Verify that spec_name and spec_vers are unique
810   IF (p_operation = 'INSERT' AND spec_vers_exist(p_spec_header.spec_name, p_spec_header.spec_vers)) THEN
811     -- Ah...Ha, Spec and Version combination is already used
812     GMD_API_PUB.Log_Message('GMD_SPEC_VERS_EXIST',
813                             'SPEC', p_spec_header.spec_name,
814                             'VERS', p_spec_header.spec_vers);
815     RAISE FND_API.G_EXC_ERROR;
816   END IF;
817 
818   -- Verify that owner_id has access to owner_orgn_code
819   IF NOT spec_owner_orgn_valid(fnd_global.resp_id,
820                                p_spec_header.owner_organization_id) THEN
821     -- Peep...Peep...Security Alert. User does not have access to Owner Organization
822     SELECT organization_code INTO l_owner_organization_code
823     FROM mtl_parameters
824     WHERE organization_id = p_spec_header.owner_organization_id;
825     GMD_API_PUB.Log_Message('GMD_USER_ORGN_NO_ACCESS',
826                             'OWNER', l_owner,
827                             'ORGN', l_owner_organization_code);
828     RAISE FND_API.G_EXC_ERROR;
829   END IF;
830 
831   -- All systems GO...
832 
833 EXCEPTION
834   WHEN FND_API.G_EXC_ERROR THEN
835     x_return_status := FND_API.G_RET_STS_ERROR ;
836   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
837     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
838   WHEN OTHERS THEN
839      GMD_API_PUB.Log_Message('GMD_API_ERROR','PACKAGE','gmd_spec_grp.validate_spec_header',
840     	'ERROR',substr(sqlerrm,1,100),'POSITION','010');
841     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
842 
843 
844 END validate_spec_header;
845 
846 
847 --Start of comments
848 --+========================================================================+
849 --| API Name    : spec_vers_exist                                          |
850 --| TYPE        : Group                                                    |
851 --| Notes       : This function returns TRUE if the Spec and Spec Version  |
852 --|               combination already exist in the database, FALSE         |
853 --|               otherwise.                                               |
854 --|                                                                        |
855 --| HISTORY                                                                |
856 --|    Chetan Nagar	26-Jul-2002	Created.                           |
857 --|                                                                        |
858 --+========================================================================+
859 -- End of comments
860 
861 FUNCTION spec_vers_exist(p_spec_name VARCHAR2, p_spec_vers NUMBER)
862 RETURN BOOLEAN IS
863 
864   CURSOR c_spec (p_spec_name VARCHAR2, p_spec_vers NUMBER) IS
865   SELECT 1
866   FROM   gmd_specifications_b
867   WHERE  spec_name = p_spec_name
868   AND    spec_vers  = p_spec_vers;
869 
870   dummy PLS_INTEGER;
871 
872 BEGIN
873 
874   OPEN c_spec(p_spec_name, p_spec_vers);
875   FETCH c_spec INTO dummy;
876   IF c_spec%FOUND THEN
877     CLOSE c_spec;
878     RETURN TRUE;
879   ELSE
880     CLOSE c_spec;
881     RETURN FALSE;
882   END IF;
883 
884 EXCEPTION
885   -- Though there is no reason the program can reach
886   -- here, this is coded just for the reasons we can
887   -- not think of!
888   WHEN OTHERS THEN
889     RETURN TRUE;
890 
891 END spec_vers_exist;
892 
893 
894 
895 
896 --Start of comments
897 --+========================================================================+
898 --| API Name    : spec_owner_orgn_valid                                    |
899 --| TYPE        : Group                                                    |
900 --| Notes       : This function returns TRUE if the Owner has access       |
901 --|               to the Organization specified, FALSE otherwise.          |
902 --|                                                                        |
903 --|                                                                        |
904 --| HISTORY                                                                |
905 --|    Chetan Nagar	26-Jul-2002	Created.                                   |
906 --|                                                                        |
907 --| Saikiran Vankadari  07-Feb-2005     Changed as part of Convergence.    |
908 --|                 Taking responsibility_id as input parameter instead of |
909 --|		    Owner id and also changed the validation logic	               |
910 --|                                                                        |
911 --+========================================================================+
912 -- End of comments
913 
914 FUNCTION spec_owner_orgn_valid(p_responsibility_id NUMBER,
915                                p_owner_organization_id NUMBER)
916 RETURN BOOLEAN IS
917 
918 
919   CURSOR c_user_orgn (p_responsibility_id NUMBER,
920                       p_owner_organization_id NUMBER) IS
921   SELECT 1
922   FROM   org_access_view
923   WHERE  responsibility_id   = p_responsibility_id
924   AND    organization_id =     p_owner_organization_id;
925 
926   dummy PLS_INTEGER;
927 
928 BEGIN
929 
930   OPEN c_user_orgn(p_responsibility_id, p_owner_organization_id);
931   FETCH c_user_orgn INTO dummy;
932   IF c_user_orgn%FOUND THEN
933     CLOSE c_user_orgn;
934     RETURN TRUE;
935   ELSE
936     CLOSE c_user_orgn;
937     RETURN FALSE;
938   END IF;
939 
940 EXCEPTION
941   -- Though there is no reason the program can reach
942   -- here, this is coded just for the reasons we can
943   -- not think of!
944   WHEN OTHERS THEN
945     RETURN FALSE;
946 
947 END spec_owner_orgn_valid;
948 
949 -- KYH BUG 2904004 BEGIN
950 --Start of comments
951 --+========================================================================+
952 --| API Name    : uom_class_combo_exist                                    |
953 --| TYPE        : Group                                                    |
954 --| Notes       : This function returns TRUE if the                        |
955 --|               to UOM class already exists on another                   |
956 --|               test line belonging to the spec                          |
957 --|               Otherwise returns FALSE                                  |
958 --|                                                                        |
959 --| HISTORY                                                                |
960 --|    KYH       16-APR-200       KYH Created for BUG 2904004              |
961 --|                                                                        |
962 --+========================================================================+
963 -- End of comments
964 
965 FUNCTION uom_class_combo_exist(p_spec_id NUMBER, p_test_id NUMBER, p_to_uom VARCHAR2)
966 RETURN BOOLEAN IS
967 
968   CURSOR c_class_combo (p_spec_name VARCHAR2, p_spec_vers NUMBER, p_to_uom VARCHAR2) IS
969   SELECT 1
970   FROM   gmd_spec_tests_b st, mtl_units_of_measure um
971   WHERE  st.spec_id =  p_spec_id
972   AND    st.test_id <> p_test_id
973   AND    st.to_qty_uom  =  um.uom_code
974   AND    um.uom_class =
975          (select uom_class from mtl_units_of_measure where uom_code = p_to_uom);
976 
977   dummy PLS_INTEGER;
978 
979 BEGIN
980 
981   OPEN c_class_combo(p_spec_id, p_test_id, p_to_uom);
982   FETCH c_class_combo INTO dummy;
983   IF c_class_combo%FOUND THEN
984     CLOSE c_class_combo;
985     RETURN TRUE;
986   ELSE
987     CLOSE c_class_combo;
988     RETURN FALSE;
989   END IF;
990 
991 EXCEPTION
992   WHEN OTHERS THEN
993     RETURN TRUE;
994 
995 END uom_class_combo_exist;
996 -- KYH BUG 2904004 END
997 
998 --Start of comments
999 --+========================================================================+
1000 --| API Name    : validate_spec_test                                       |
1001 --| TYPE        : Group                                                    |
1002 --| Notes       : This procedure validates all the fields of               |
1003 --|               Specification Test. This procedure can be                |
1004 --|               called from FORM or API and the caller need              |
1005 --|               to specify this in p_called_from parameter               |
1006 --|               while calling this procedure. Based on where             |
1007 --|               it is called from certain validations will               |
1008 --|               either be performed or skipped.                          |
1009 --|                                                                        |
1010 --|               If everything is fine then OUT parameter                 |
1011 --|               x_return_status is set to 'S' else appropriate           |
1012 --|               error message is put on the stack and error              |
1013 --|               is returned.                                             |
1014 --|                                                                        |
1015 --| HISTORY                                                                |
1016 --|    Chetan Nagar	26-Jul-2002	Created.                           |
1017 --|                                                                        |
1018 --+========================================================================+
1019 -- End of comments
1020 PROCEDURE validate_spec_test
1021 (
1022   p_spec_test     IN  gmd_spec_tests%ROWTYPE
1023 , p_called_from   IN  VARCHAR2
1024 , p_operation     IN  VARCHAR2
1025 , x_spec_test     OUT NOCOPY gmd_spec_tests%ROWTYPE
1026 , x_return_status OUT NOCOPY VARCHAR2
1027 ) IS
1028 
1029   CURSOR c_spec (p_spec_name VARCHAR2, p_spec_vers NUMBER) IS
1030   SELECT 1
1031   FROM   gmd_specifications_b
1032   WHERE  spec_name = p_spec_name
1033   AND    spec_vers  = p_spec_vers;
1034 
1035   CURSOR c_test_value (p_test_id NUMBER, p_value_char VARCHAR2) IS
1036   SELECT text_range_seq
1037   FROM   gmd_qc_test_values_b
1038   WHERE  test_id    = p_test_id
1039   AND    value_char = p_value_char  ;
1040 
1041   CURSOR c_spec_type (p_spec_id NUMBER) IS
1042   SELECT spec_type
1043   FROM   gmd_specifications_b
1044   WHERE  spec_id = p_spec_id ;
1045 
1046   -- Local Variables
1047   l_dummy                          NUMBER;
1048   l_item_number                  VARCHAR2(80);
1049   l_owner                        VARCHAR2(30);
1050   l_return_status                VARCHAR2(1);
1051 
1052   l_st_min                       NUMBER;
1053   l_st_target                    NUMBER;
1054   l_st_max                       NUMBER;
1055 
1056 
1057   l_specification                GMD_SPECIFICATIONS%ROWTYPE;
1058   l_specification_out            GMD_SPECIFICATIONS%ROWTYPE;
1059   l_test                         GMD_QC_TESTS%ROWTYPE;
1060   l_test_out                     GMD_QC_TESTS%ROWTYPE;
1061   l_item                         MTL_SYSTEM_ITEMS_KFV%ROWTYPE;
1062   -- Bug 3401368
1063   x_viability_time               NUMBER;
1064   x_viability_status             varchar2(100);
1065 
1066   -- Exceptions
1067   e_spec_fetch_error             EXCEPTION;
1068   e_test_fetch_error             EXCEPTION;
1069   e_test_method_fetch_error      EXCEPTION;
1070   error_fetch_item               EXCEPTION;
1071   x_spec_type varchar2(10);
1072 
1073 BEGIN
1074   --  Initialize API return status to success
1075   x_return_status := FND_API.G_RET_STS_SUCCESS;
1076 
1077   -- Fetch Specification Record. Spec must exists for Spec Test.
1078   l_specification.spec_id := p_spec_test.spec_id;
1079   -- Introduce l_specification_out as part of NOCOPY changes.
1080   IF NOT ( GMD_Specifications_PVT.Fetch_Row(
1081                     p_specifications => l_specification,
1082                     x_specifications => l_specification_out)
1083          ) THEN
1084     -- Fetch Error
1085     RAISE e_spec_fetch_error;
1086   END IF;
1087   l_specification := l_specification_out ;
1088 
1089   IF (p_called_from = 'API') THEN
1090     -- Check for NULLs and Valid Foreign Keys in the input parameter
1091     -- No need if called from FORM since it is already
1092     -- done in the form
1093 
1094     GMD_Spec_GRP.check_for_null_and_fks_in_stst
1095       (
1096         p_spec_tests     => p_spec_test
1097       , x_spec_tests     => x_spec_test
1098       , x_return_status => l_return_status
1099       );
1100 
1101     IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1102       -- Message is alrady logged by check_for_null procedure
1103       RAISE FND_API.G_EXC_ERROR;
1104     ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1105       -- Message is alrady logged by check_for_null procedure
1106       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1107     END IF;
1108   END IF;
1109 
1110 
1111   -- Fetch Test Record.
1112   l_test.test_id := x_spec_test.test_id;
1113   IF NOT ( GMD_QC_TESTS_PVT.Fetch_Row(
1114                     p_gmd_qc_tests => l_test,
1115                     x_gmd_qc_tests => l_test_out)
1116          ) THEN
1117     -- Fetch Error
1118     RAISE e_test_fetch_error;
1119   END IF;
1120 
1121   l_test := l_test_out ;
1122 
1123 
1124     -- Verify that Seq is unique
1125   IF (spec_test_seq_exist(x_spec_test.spec_id,x_spec_test.seq) )
1126    THEN
1127     -- Seq is already used
1128     GMD_API_PUB.Log_Message('GMD_SPEC_TEST_SEQ_EXIST', 'SEQ', x_spec_test.seq);
1129     RAISE FND_API.G_EXC_ERROR;
1130   end if ;
1131 
1132 
1133   -- Verify that Test is unique  (added by KYH 01/OCT/02)
1134   IF spec_test_exist(x_spec_test.spec_id,x_spec_test.test_id) THEN
1135     -- Test is already used
1136     GMD_API_PUB.Log_Message('GMD_SPEC_TEST_EXIST', 'TEST_ID', x_spec_test.test_id);
1137     RAISE FND_API.G_EXC_ERROR;
1138   END IF;
1139 
1140    open c_spec_type(x_spec_test.spec_id);
1141    fetch c_spec_type into x_spec_type ;
1142    close c_spec_type ;
1143 
1144   -- Test UOM must be convertible to Item's UOM
1145   IF (x_spec_test.test_qty_uom IS NOT NULL)  and
1146      (x_spec_type = 'I') THEN
1147       BEGIN
1148 
1149       -- bug 4924529 sql id 14686748
1150       -- fields needed from mtl_system_items_kfv
1151       -- are l_item.primary_uom_code, l_item.lot_control_code and l_item.concatenated_segments.
1152       -- 155714 memory reduced
1153       -- cost is 3
1154 
1155   --   SELECT * INTO l_item
1156   --      FROM mtl_system_items_kfv
1157   --      WHERE organization_id = l_specification.owner_organization_id
1158   --      AND inventory_item_id = l_specification.inventory_item_id;
1159 
1160          SELECT primary_uom_code,
1161                 lot_control_code,
1162                 concatenated_segments
1163          INTO l_item.primary_uom_code,
1164               l_item.lot_control_code,
1165               l_item.concatenated_segments
1166         FROM mtl_system_items_kfv
1167         WHERE organization_id = l_specification.owner_organization_id
1168         AND inventory_item_id = l_specification.inventory_item_id;
1169       EXCEPTION WHEN OTHERS
1170       THEN
1171         RAISE error_fetch_item;
1172       END;
1173 
1174     -- GMD_API_PUB.Log_Message('GMD_SPEC_TEST_EXIST', 'TEST_ID', x_spec_test.test_id);
1175      --RAISE FND_API.G_EXC_ERROR;
1176 
1177 
1178       BEGIN
1179           /*GMICUOM.icuomcv(pitem_id => l_item_mst.item_id,
1180                   plot_id  => 0,
1181                   pcur_qty => 1,
1182                   pcur_uom => x_spec_test.test_uom,
1183                   pnew_uom => l_item_mst.item_um,
1184                   onew_qty => dummy);*/
1185        --As part of Convergence, call to GMICUOM.icuomcv() is replaced with call to inv_convert.inv_um_conversion()
1186           inv_convert.inv_um_conversion (
1187 	          from_unit    =>  x_spec_test.test_qty_uom,
1188        	      to_unit      =>  l_item.primary_uom_code,
1189     	      item_id      =>  l_specification.inventory_item_id,
1190 	          lot_number   =>  NULL,
1191     	      organization_id  => l_specification.owner_organization_id,
1192     	      uom_rate    => l_dummy );
1193 
1194       EXCEPTION WHEN OTHERS
1195       THEN
1196           FND_MSG_PUB.ADD;
1197           RAISE FND_API.G_EXC_ERROR;
1198       END ;
1199   END IF;
1200 
1201 
1202   -- Target, Min and Max validation
1203   IF (l_test.test_type NOT IN ('U')) THEN
1204 
1205     -- Validate min,target and max for character based tests.
1206 
1207    IF x_spec_test.min_value_char IS NOT NULL THEN
1208       OPEN c_test_value(l_test.test_id, x_spec_test.min_value_char);
1209       FETCH c_test_value INTO  x_spec_test.min_value_num;
1210       IF c_test_value%NOTFOUND THEN
1211         CLOSE c_test_value;
1212         GMD_API_PUB.Log_Message('TEST_VALUES_NOT_FOUND');
1213         RAISE FND_API.G_EXC_ERROR;
1214       END IF;
1215       CLOSE c_test_value;
1216    END IF;
1217 
1218    IF x_spec_test.target_value_char IS NOT NULL THEN
1219 
1220       OPEN c_test_value(l_test.test_id, x_spec_test.target_value_char);
1221       FETCH c_test_value INTO  x_spec_test.target_value_num;
1222       IF c_test_value%NOTFOUND THEN
1223         CLOSE c_test_value;
1224         GMD_API_PUB.Log_Message('TEST_VALUES_NOT_FOUND');
1225         RAISE FND_API.G_EXC_ERROR;
1226       END IF;
1227       CLOSE c_test_value;
1228    END IF;
1229 
1230    IF x_spec_test.max_value_char IS NOT NULL THEN
1231       OPEN c_test_value(l_test.test_id, x_spec_test.max_value_char);
1232       FETCH c_test_value INTO  x_spec_test.max_value_num;
1233       IF c_test_value%NOTFOUND THEN
1234         CLOSE c_test_value;
1235         GMD_API_PUB.Log_Message('TEST_VALUES_NOT_FOUND');
1236         RAISE FND_API.G_EXC_ERROR;
1237       END IF;
1238       CLOSE c_test_value;
1239    END IF;
1240 
1241 
1242    IF (l_test.test_type NOT IN ('V')) THEN
1243 
1244       IF l_test.test_type IN ('L','E','N') THEN
1245 
1246          x_spec_test.min_value_num := ROUND(x_spec_test.min_value_num,x_spec_test.display_precision);
1247          x_spec_test.max_value_num := ROUND(x_spec_test.max_value_num,x_spec_test.display_precision);
1248          x_spec_test.target_value_num := ROUND(x_spec_test.target_value_num,x_spec_test.display_precision);
1249       END IF;
1250 
1251       l_st_min    := x_spec_test.min_value_num;
1252       l_st_target := x_spec_test.target_value_num;
1253       l_st_max    := x_spec_test.max_value_num;
1254 
1255     -- Now we all the min, max,and target values in NUMERIC format.
1256       IF NOT (spec_test_min_target_max_valid
1257               (p_validation_level => 'FULL'
1258               ,p_test_id   => l_test.test_id
1259               ,p_test_type => l_test.test_type
1260               ,p_st_min    => l_st_min
1261               ,p_st_target => l_st_target
1262               ,p_st_max    => l_st_max
1263               ,p_t_min     => l_test.min_value_num
1264               ,p_t_max     => l_test.max_value_num)
1265            ) THEN
1266          RAISE FND_API.G_EXC_ERROR ;
1267       END IF;
1268    END IF; -- l_test.test_type NOT IN ('V')
1269 
1270  END IF; -- l_test.test_type NOT IN ('U')
1271 
1272 
1273   -- Lot Retest Indicator
1274   IF ( x_spec_test.retest_lot_expiry_ind = 'Y' and l_item.lot_control_code = 1) THEN
1275     GMD_API_PUB.Log_Message('SPEC_TEST_RETEST_IND_ERROR',
1276                             'SPEC_TEST', l_test.test_code,
1277                             'SPEC_TEST', l_item.concatenated_segments);
1278     RAISE FND_API.G_EXC_ERROR;
1279   END IF;
1280 
1281   -- Experimental Error Min and Max validation
1282   IF (l_test.test_type IN ('N', 'L', 'E') AND x_spec_test.exp_error_type IS NOT NULL ) THEN
1283     IF x_spec_test.exp_error_type = 'N' THEN
1284          x_spec_test.below_spec_min := ROUND(x_spec_test.below_spec_min,x_spec_test.display_precision);
1285          x_spec_test.above_spec_min := ROUND(x_spec_test.above_spec_min,x_spec_test.display_precision);
1286          x_spec_test.below_spec_max := ROUND(x_spec_test.below_spec_max,x_spec_test.display_precision);
1287          x_spec_test.above_spec_max := ROUND(x_spec_test.above_spec_max,x_spec_test.display_precision);
1288     END IF;
1289     IF NOT spec_test_exp_error_region_val
1290                (p_validation_level => 'FULL',
1291                 p_exp_error_type   => x_spec_test.exp_error_type,
1292                 p_test_min         => l_test.min_value_num,
1293                 p_below_spec_min   => x_spec_test.below_spec_min,
1294                 p_spec_test_min    => x_spec_test.min_value_num,
1295                 p_above_spec_min   => x_spec_test.above_spec_min,
1296                 p_spec_test_target => x_spec_test.target_value_num,
1297                 p_below_spec_max   => p_spec_test.below_spec_max,
1298                 p_spec_test_max    => x_spec_test.max_value_num,
1299                 p_above_spec_max   => x_spec_test.above_spec_max,
1300                 p_test_max         => l_test.max_value_num) THEN
1301       RAISE FND_API.G_EXC_ERROR;
1302     END IF;
1303 
1304     IF x_spec_test.below_min_action_code IS NOT NULL and x_spec_test.below_spec_min IS NULL THEN
1305         GMD_API_PUB.Log_Message('GMD_EXP_ERR_VAL_REQ_ACTION');
1306        	RAISE FND_API.G_EXC_ERROR;
1307     END IF;
1308 
1309     IF x_spec_test.above_min_action_code IS NOT NULL and x_spec_test.above_spec_min IS NULL THEN
1310         GMD_API_PUB.Log_Message('GMD_EXP_ERR_VAL_REQ_ACTION');
1311        	RAISE FND_API.G_EXC_ERROR;
1312     END IF;
1313 
1314     IF x_spec_test.below_max_action_code IS NOT NULL and x_spec_test.below_spec_max IS NULL THEN
1315         GMD_API_PUB.Log_Message('GMD_EXP_ERR_VAL_REQ_ACTION');
1316        	RAISE FND_API.G_EXC_ERROR;
1317     END IF;
1318 
1319     IF x_spec_test.above_max_action_code IS NOT NULL and x_spec_test.above_spec_max IS NULL THEN
1320         GMD_API_PUB.Log_Message('GMD_EXP_ERR_VAL_REQ_ACTION');
1321        	RAISE FND_API.G_EXC_ERROR;
1322     END IF;
1323 
1324   END IF;
1325 
1326   IF NOT spec_test_precisions_valid(
1327   	 	 p_spec_display_precision => x_spec_test.display_precision,
1328 		 p_spec_report_precision => x_spec_test.report_precision,
1329 		 p_test_display_precision => l_test.display_precision,
1330 		 p_test_report_precision  => l_test.display_precision ) THEN
1331     -- Messages are already logged.
1332     RAISE FND_API.G_EXC_ERROR;
1333   END IF;
1334 
1335  --Update the Viability Period ( Bug 3401368)
1336   if (x_spec_test.days is not null) OR
1337 	(x_spec_test.hours is not null) OR
1338 	(x_spec_test.minutes is not null) OR
1339 	(x_spec_test.seconds is not null) THEN
1340 
1341 	GMD_TEST_METHODS_GRP.GET_TEST_DURATION(
1342 		P_DAYS => x_spec_test.DAYS,
1343 		P_HOURS => x_spec_test.HOURS,
1344 		P_MINS =>  x_spec_test.MINUTES,
1345 		P_SECS => x_spec_test.SECONDS,
1346 		X_DURATION_SECS => x_viability_time,
1347 		X_RETURN_STATUS => x_viability_status );
1348 
1349 	if (x_viability_status = 'S') then
1350 		x_spec_test.VIABILITY_DURATION := x_viability_time;
1351         end if ;
1352 
1353   end if ;
1354 
1355 
1356   -- All systems GO...
1357 
1358 EXCEPTION
1359   WHEN FND_API.G_EXC_ERROR THEN
1360     x_return_status := FND_API.G_RET_STS_ERROR ;
1361   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1362     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1363   WHEN OTHERS THEN
1364     GMD_API_PUB.Log_Message('GMD_API_ERROR','PACKAGE','gmd_spec_grp.validate_spec_test',
1365     	'ERROR',substr(sqlerrm,1,100),'POSITION','010');
1366     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1367 
1368 
1369 END validate_spec_test;
1370 
1371 /*===========================================================================
1372 
1373   PROCEDURE NAME:	validate_after_insert_all
1374   DESCRIPTION:		This procedure validates that atleast one test
1375   			should be attached to the spec.
1376   			It
1377 
1378 ===========================================================================*/
1379 
1380 PROCEDURE validate_after_insert_all(
1381 	p_spec_id   	   IN  NUMBER,
1382 	x_return_status    OUT NOCOPY VARCHAR2) IS
1383 
1384 CURSOR cr_expression_tests IS
1385   SELECT a.test_id,a.seq
1386   FROM   GMD_SPEC_TESTS_B a , GMD_QC_TESTS_B b
1387   WHERE
1388  	a.spec_id = p_spec_id
1389    AND  a.test_id = b.test_id
1390    AND  b.test_type = 'E' ;
1391 
1392 l_test_count  BINARY_INTEGER;
1393 l_test_id	NUMBER;
1394 l_test_seq	BINARY_INTEGER;
1395 
1396 
1397 BEGIN
1398 	x_return_status := FND_API.G_RET_STS_SUCCESS ;
1399 
1400 	IF p_spec_id IS NULL THEN
1401 	     GMD_API_PUB.Log_Message('GMD_SPEC_ID_REQUIRED');
1402 	     RAISE FND_API.G_EXC_ERROR;
1403 	END IF;
1404 
1405 -- atleast one test should be present in the spec.
1406 	SELECT NVL(COUNT(1),0) INTO l_test_count
1407         FROM GMD_SPEC_TESTS_B
1408         WHERE spec_id = p_spec_id ;
1409 
1410         IF l_test_count = 0 THEN
1411 	    FND_MESSAGE.SET_NAME('GMD','GMD_SPEC_NO_TEST');
1412             FND_MSG_PUB.ADD;
1413 	    RAISE FND_API.G_EXC_ERROR;
1414         END IF;
1415 
1416 -- validate expression based tests.
1417 -- all the reference tests must be present.
1418 
1419         OPEN  cr_expression_tests;
1420 	LOOP
1421    	   FETCH cr_expression_tests INTO l_test_id,l_test_seq;
1422 	   IF cr_expression_tests%NOTFOUND THEN
1423 	       EXIT;
1424 	   END IF;
1425 	   IF NOT GMD_SPEC_GRP.spec_reference_tests_exist(
1426 			p_spec_id => p_spec_id,
1427 			p_exp_test_seq => l_test_seq,
1428 			p_exp_test_id => l_test_id ) THEN
1429 		CLOSE cr_expression_tests ;
1430 		GMD_API_PUB.Log_Message('GMD_SOME_REF_TESTS_MISSING');
1431 		RAISE FND_API.G_EXC_ERROR;
1432 	   END IF;
1433 	END LOOP;
1434 
1435 EXCEPTION
1436 WHEN FND_API.G_EXC_ERROR THEN
1437       x_return_status := FND_API.G_RET_STS_ERROR ;
1438 
1439 WHEN OTHERS THEN
1440       GMD_API_PUB.Log_Message('GMD_API_ERROR','PACKAGE','gmd_spec_grp.validate_after_insert_all',
1441     	 'ERROR',substr(sqlerrm,1,100),'POSITION','010');
1442       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1443 
1444 END validate_after_insert_all;
1445 
1446 /*===========================================================================
1447   PROCEDURE  NAME:	validate_before_delete
1448 
1449   DESCRIPTION:		This procedure validates GMD_SPECIFICATIONS:
1450                         a) Primary key supplied
1451                         b) Spec is not already delete_marked
1452                         c) Status permits update
1453 
1454   PARAMETERS:
1455 
1456   CHANGE HISTORY:	Created		09-JUL-02	KYH
1457 ===========================================================================*/
1458 
1459 PROCEDURE VALIDATE_BEFORE_DELETE(
1460 	p_spec_id          IN NUMBER,
1461 	x_return_status    OUT NOCOPY VARCHAR2,
1462         x_message_data     OUT NOCOPY VARCHAR2) IS
1463 
1464 l_progress   VARCHAR2(3);
1465 l_temp       VARCHAR2(1);
1466 l_spec       GMD_SPECIFICATIONS%ROWTYPE;
1467 l_spec_out   GMD_SPECIFICATIONS%ROWTYPE;
1468 
1469 BEGIN
1470 	l_progress := '010';
1471 	x_return_status := FND_API.G_RET_STS_SUCCESS ;
1472 
1473         -- validate for primary key
1474         -- ========================
1475 	IF p_spec_id IS NULL THEN
1476 	     FND_MESSAGE.SET_NAME('GMD','GMD_SPEC_ID_REQUIRED'); -- New Message
1477 	     FND_MSG_PUB.ADD;
1478 	     RAISE FND_API.G_EXC_ERROR;
1479         ELSE
1480              l_spec.spec_id := p_spec_id;
1481 	END IF;
1482 
1483         -- Fetch the row
1484         -- =============
1485         IF  NOT GMD_Specifications_PVT.Fetch_Row(l_spec,l_spec_out)
1486         THEN
1487           fnd_message.set_name('GMD','GMD_FAILED_TO_FETCH_ROW');
1488           fnd_message.set_token('L_TABLE_NAME','GMD_SPECIFICATIONS');
1489           fnd_message.set_token('L_COLUMN_NAME','SPEC_ID');
1490           fnd_message.set_token('L_KEY_VALUE',l_spec.spec_id);
1491           fnd_msg_pub.ADD;
1492           RAISE FND_API.G_EXC_ERROR;
1493         END IF;
1494 
1495         l_spec := l_spec_out ;
1496 
1497         -- Terminate if the row is already delete marked
1498         -- =============================================
1499         IF l_spec.delete_mark <> 0
1500         THEN
1501           fnd_message.set_name('GMD','GMD_RECORD_DELETE_MARKED');
1502           fnd_message.set_token('L_TABLE_NAME','GMD_SPECIFICATIONS');
1503           fnd_message.set_token('L_COLUMN_NAME','SPEC_ID');
1504           fnd_message.set_token('L_KEY_VALUE',l_spec.spec_id);
1505           fnd_msg_pub.ADD;
1506           RAISE FND_API.G_EXC_ERROR;
1507         END IF;
1508 
1509         -- BUG 2698311
1510         -- Block deletes if the status is 400 (Approved for Lab Use) or
1511         -- ============================== 700 (Approved for General Use)
1512         -- ============================================================
1513         IF l_spec.spec_status in (400,700)
1514         THEN
1515           fnd_message.set_name('GMD','GMD_SPEC_STATUS_BLOCKS_DELETE');
1516           fnd_msg_pub.ADD;
1517           RAISE FND_API.G_EXC_ERROR;
1518         END IF;
1519 
1520         -- Ensure that the status permits updates
1521         -- ======================================
1522         IF  NOT GMD_SPEC_GRP.Record_Updateable_With_Status(l_spec.spec_status)
1523         THEN
1524           fnd_message.set_name('GMD','GMD_SPEC_STATUS_BLOCKS_UPDATE');
1525           fnd_msg_pub.ADD;
1526           RAISE FND_API.G_EXC_ERROR;
1527         END IF;
1528 
1529 EXCEPTION
1530 WHEN FND_API.G_EXC_ERROR THEN
1531       x_return_status := FND_API.G_RET_STS_ERROR ;
1532       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
1533 
1534 WHEN OTHERS THEN
1535       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
1536       FND_MESSAGE.Set_Token('PACKAGE','GMD_SPEC_GRP.VALIDATE_BEFORE_DELETE');
1537       FND_MESSAGE.Set_Token('ERROR', substr(sqlerrm,1,100));
1538       FND_MESSAGE.Set_Token('POSITION',l_progress );
1539       FND_MSG_PUB.ADD;
1540       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
1541       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1542 
1543 END VALIDATE_BEFORE_DELETE ;
1544 
1545 /*===========================================================================
1546   PROCEDURE  NAME:	validate_before_delete
1547 
1548   DESCRIPTION:		This procedure validates GMD_SPEC_TEST:
1549                         a) Primary key supplied
1550                         b) Spec is not already delete_marked
1551 
1552   PARAMETERS:
1553 
1554   CHANGE HISTORY:	Created		09-JUL-02	KYH
1555 ===========================================================================*/
1556 
1557 PROCEDURE VALIDATE_BEFORE_DELETE(
1558 	p_spec_id          IN NUMBER,
1559 	p_test_id          IN NUMBER,
1560 	x_return_status    OUT NOCOPY VARCHAR2,
1561         x_message_data     OUT NOCOPY VARCHAR2) IS
1562 
1563 l_progress   		VARCHAR2(3);
1564 l_temp       		VARCHAR2(1);
1565 l_spec_tests 		GMD_SPEC_TESTS%ROWTYPE;
1566 l_spec_tests_out	GMD_SPEC_TESTS%ROWTYPE;
1567 l_spec_delete_mark	BINARY_INTEGER;
1568 
1569 BEGIN
1570 	l_progress := '010';
1571 	x_return_status := FND_API.G_RET_STS_SUCCESS ;
1572 
1573 	-- validate for primary key
1574         -- ========================
1575 	IF p_spec_id IS NULL THEN
1576 	     FND_MESSAGE.SET_NAME('GMD','GMD_SPEC_ID_REQUIRED');
1577 	     FND_MSG_PUB.ADD;
1578 	     RAISE FND_API.G_EXC_ERROR;
1579         ELSE
1580              l_spec_tests.spec_id := p_spec_id;
1581 	END IF;
1582 
1583 	IF p_test_id IS NULL THEN
1584 	     FND_MESSAGE.SET_NAME('GMD','GMD_TEST_ID_CODE_NULL');
1585 	     FND_MSG_PUB.ADD;
1586 	     RAISE FND_API.G_EXC_ERROR;
1587         ELSE
1588              l_spec_tests.test_id := p_test_id;
1589 	END IF;
1590 
1591         -- Fetch the row
1592         -- =============
1593         IF  NOT GMD_Spec_Tests_PVT.Fetch_Row(l_spec_tests,l_spec_tests_out)
1594         THEN
1595           fnd_message.set_name('GMD','GMD_FAILED_TO_FETCH_ROW');
1596           fnd_message.set_token('L_TABLE_NAME','GMD_SPEC_TESTS');
1597           fnd_message.set_token('L_COLUMN_NAME','TEST_ID');
1598           fnd_message.set_token('L_KEY_VALUE',l_spec_tests.test_id);
1599           fnd_msg_pub.ADD;
1600           RAISE FND_API.G_EXC_ERROR;
1601         END IF;
1602 
1603         l_spec_tests := l_spec_tests_out ;
1604 
1605         SELECT delete_mark into l_spec_delete_mark
1606         FROM GMD_SPECIFICATIONS_B
1607         WHERE spec_id = p_spec_id ;
1608 
1609         IF l_spec_delete_mark <> 0
1610         THEN
1611           fnd_message.set_name('GMD','GMD_RECORD_DELETE_MARKED');
1612           fnd_message.set_token('L_TABLE_NAME','GMD_SPECIFICATIONS');
1613           fnd_message.set_token('L_COLUMN_NAME','SPEC_ID');
1614           fnd_message.set_token('L_KEY_VALUE',p_spec_id);
1615           fnd_msg_pub.ADD;
1616           RAISE FND_API.G_EXC_ERROR;
1617         END IF;
1618 
1619 EXCEPTION
1620 WHEN FND_API.G_EXC_ERROR THEN
1621       x_return_status := FND_API.G_RET_STS_ERROR ;
1622       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
1623 
1624 WHEN OTHERS THEN
1625       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
1626       FND_MESSAGE.Set_Token('PACKAGE','GMD_SPEC_GRP.VALIDATE_BEFORE_DELETE');
1627       FND_MESSAGE.Set_Token('ERROR', substr(sqlerrm,1,100));
1628       FND_MESSAGE.Set_Token('POSITION',l_progress );
1629       FND_MSG_PUB.ADD;
1630       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
1631       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1632 
1633 END VALIDATE_BEFORE_DELETE ;
1634 
1635 PROCEDURE validate_after_delete_test(
1636 	p_spec_id   	   IN  NUMBER,
1637 	x_return_status    OUT NOCOPY VARCHAR2) IS
1638 
1639 BEGIN
1640      x_return_status := FND_API.G_RET_STS_SUCCESS ;
1641 
1642      validate_after_insert_all(
1643      	p_spec_id   	   => p_spec_id,
1644 	x_return_status    => x_return_status) ;
1645 
1646 END validate_after_delete_test;
1647 
1648 --Start of comments
1649 --+========================================================================+
1650 --| API Name    : spec_test_seq_exist                                      |
1651 --| TYPE        : Group                                                    |
1652 --| Notes       : This function returns TRUE if the Spec Test Seq          |
1653 --|               already exist in the database, FALSE                     |
1654 --|               otherwise.                                               |
1655 --|                                                                        |
1656 --| HISTORY                                                                |
1657 --|    Chetan Nagar	26-Jul-2002	Created.                           |
1658 --|                                                                        |
1659 --+========================================================================+
1660 -- End of comments
1661 
1662 FUNCTION spec_test_seq_exist(p_spec_id 		IN NUMBER ,
1663 	 	             p_seq     		IN NUMBER ,
1664 	 	             p_exclude_test_id  IN NUMBER )
1665 RETURN BOOLEAN IS
1666 
1667 dummy PLS_INTEGER;
1668 
1669 BEGIN
1670 
1671   IF p_exclude_test_id IS NULL THEN
1672      SELECT 1 INTO dummy
1673      FROM GMD_SPEC_TESTS_B
1674      WHERE  spec_id = p_spec_id
1675      AND    seq = p_seq ;
1676   ELSE
1677      SELECT 1 INTO dummy
1678      FROM GMD_SPEC_TESTS_B
1679      WHERE  spec_id = p_spec_id
1680      AND    seq = p_seq
1681      AND    test_id <> p_exclude_test_id ;
1682   END IF;
1683   RETURN TRUE;
1684 
1685 EXCEPTION
1686   WHEN NO_DATA_FOUND THEN
1687      RETURN FALSE;
1688 
1689   -- Though there is no reason the program can reach
1690   -- here, this is coded just for the reasons we can
1691   -- not think of!
1692   WHEN OTHERS THEN
1693     RETURN TRUE;
1694 
1695 END spec_test_seq_exist;
1696 
1697 --Start of comments
1698 --+========================================================================+
1699 --| API Name    : spec_test_exist                                          |
1700 --| TYPE        : Group                                                    |
1701 --| Notes       : This function returns TRUE if the test_id already        |
1702 --|               exists against the owning spec, otherwise it returns     |
1703 --|               FALSE.                                                   |
1704 --|                                                                        |
1705 --| HISTORY                                                                |
1706 --|    Karen Y. Hunt 01-OCT-2002	Created.                           |
1707 --|                                                                        |
1708 --+========================================================================+
1709 -- End of comments
1710 
1711 FUNCTION spec_test_exist(p_spec_id 		IN NUMBER ,
1712 	 	         p_test_id 		IN NUMBER )
1713 RETURN BOOLEAN IS
1714 
1715 dummy PLS_INTEGER;
1716 
1717 BEGIN
1718 
1719   SELECT 1 INTO dummy
1720     FROM GMD_SPEC_TESTS_B
1721     WHERE  spec_id = p_spec_id
1722     AND    test_id = p_test_id;
1723 
1724   RETURN TRUE;
1725 
1726 EXCEPTION
1727   WHEN NO_DATA_FOUND THEN
1728      RETURN FALSE;
1729 
1730   -- Though there is no reason the program can reach
1731   -- here, this is coded just for the reasons we can
1732   -- not think of!
1733   WHEN OTHERS THEN
1734     RETURN TRUE;
1735 
1736 END spec_test_exist;
1737 
1738 
1739 --Start of comments
1740 --+========================================================================+
1741 --| API Name    : spec_reference_tests_exist                               |
1742 --| TYPE        : Group                                                    |
1743 --| Notes       : This function returns TRUE if all the reference tests    |
1744 --|               which are part of the current expression are already     |
1745 --|               entered on the specification, FALSE otherwise.           |
1746 --|                                                                        |
1747 --| HISTORY                                                                |
1748 --|    Chetan Nagar	26-Jul-2002	Created.                           |
1749 --|                                                                        |
1750 --+========================================================================+
1751 -- End of comments
1752 
1753 FUNCTION spec_reference_tests_exist(p_spec_id NUMBER, p_exp_test_seq NUMBER, p_exp_test_id NUMBER)
1754 RETURN BOOLEAN IS
1755 
1756   CURSOR c_test_values (p_exp_test_id NUMBER) IS
1757   SELECT EXPRESSION_REF_TEST_ID
1758   FROM   gmd_qc_test_values_b
1759   WHERE  test_id = p_exp_test_id;
1760 
1761   CURSOR c_spec_test (p_spec_id NUMBER, p_exp_test_seq NUMBER, p_ref_test_id NUMBER) IS
1762   SELECT 1
1763   FROM   GMD_SPEC_TESTS_B
1764   WHERE  spec_id = p_spec_id
1765   AND    test_id = p_ref_test_id
1766   AND    seq < p_exp_test_seq;
1767 
1768   -- Local Variables
1769   dummy PLS_INTEGER;
1770 
1771   -- Exceptions
1772   e_ref_test_missing            EXCEPTION;
1773 
1774 BEGIN
1775 
1776   -- Get all the reference tests for the expression test
1777   FOR i in c_test_values(p_exp_test_id)
1778   LOOP
1779     -- See if the reference test is part of the spec
1780     -- with sequence lower then that of expression test.
1781     OPEN c_spec_test(p_spec_id, p_exp_test_seq, i.EXPRESSION_REF_TEST_ID);
1782     FETCH c_spec_test INTO dummy;
1783     IF c_spec_test%NOTFOUND THEN
1784       RAISE e_ref_test_missing;
1785     END IF;
1786     CLOSE c_spec_test;
1787   END LOOP;
1788 
1789   RETURN TRUE;
1790 
1791 EXCEPTION
1792   WHEN e_ref_test_missing THEN
1793     IF c_spec_test%ISOPEN THEN CLOSE c_spec_test; END IF;
1794     IF c_test_values%ISOPEN THEN CLOSE c_test_values; END IF;
1795     RETURN FALSE;
1796 
1797   -- Though there is no reason the program can reach
1798   -- here, this is coded just for the reasons we can
1799   -- not think of!
1800   WHEN OTHERS THEN
1801     RETURN FALSE;
1802 
1803 END spec_reference_tests_exist;
1804 
1805 --Start of comments
1806 --+========================================================================+
1807 --| API Name    : value_in_num_range_display                               |
1808 --| TYPE        : Group                                                    |
1809 --| Notes       : This function checks if the given value                  |
1810 --|               is between the test range or not.If the value is between |
1811 --|               the test range ,it returns TRUE else it returns FALSE    |
1812 --|                                                                        |
1813 --| HISTORY                                                                |
1814 --|    Mahesh Chandak	09-Oct-2002	Created.                           |
1815 --|                                                                        |
1816 --+========================================================================+
1817 -- End of comments
1818 
1819 FUNCTION value_in_num_range_display(p_test_id  		IN NUMBER,
1820 				    p_value   		IN NUMBER,
1821 				    x_return_status	OUT NOCOPY VARCHAR2 )
1822 RETURN BOOLEAN IS
1823 
1824 CURSOR cr_test_values IS
1825 SELECT '1'
1826 FROM   gmd_qc_test_values_b
1827 WHERE  test_id = p_test_id
1828 AND    p_value >= nvl(min_num,p_value)
1829 AND    p_value <= nvl(max_num,p_value);
1830 
1831 l_position		VARCHAR2(3);
1832 l_temp			VARCHAR2(1);
1833 REQ_FIELDS_MISSING 	EXCEPTION;
1834 
1835 BEGIN
1836 
1837    x_return_status := FND_API.G_RET_STS_SUCCESS;
1838    FND_MSG_PUB.initialize;
1839    l_position := '010';
1840 
1841    IF p_test_id IS NULL OR p_value IS NULL THEN
1842       RAISE REQ_FIELDS_MISSING;
1843    END IF;
1844 
1845    OPEN   cr_test_values;
1846    FETCH  cr_test_values INTO l_temp;
1847    IF  cr_test_values%FOUND THEN
1848        CLOSE cr_test_values;
1849        RETURN TRUE;
1850    END IF;
1851    CLOSE cr_test_values;
1852    gmd_api_pub.log_message('GMD_VAL_MISSING_NUM_LABEL_TEST','VALUE',p_value);
1853    RETURN FALSE;
1854 
1855 EXCEPTION
1856 WHEN REQ_FIELDS_MISSING THEN
1857    gmd_api_pub.log_message('GMD_REQ_FIELD_MIS','PACKAGE','GMD_SPEC_GRP.VALUE_IN_NUM_RANGE_DISPLAY');
1858    x_return_status := FND_API.G_RET_STS_ERROR ;
1859    RETURN FALSE;
1860 WHEN OTHERS THEN
1861    gmd_api_pub.log_message('GMD_API_ERROR','PACKAGE','GMD_SPEC_GRP.VALUE_IN_NUM_RANGE_DISPLAY','ERROR', SUBSTR(SQLERRM,1,100),'POSITION',l_position);
1862    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1863    RETURN FALSE;
1864 END value_in_num_range_display ;
1865 
1866 --Start of comments
1867 --+========================================================================+
1868 --| API Name    : spec_test_min_target_max_valid                           |
1869 --| TYPE        : Group                                                    |
1870 --| Notes       : This function returns TRUE if the Spec Test Min, Target, |
1871 --|               and Max values are alphanumrecically in correct order,   |
1872 --|               FALSE otherwise.                                         |
1873 --|                                                                        |
1874 --| HISTORY                                                                |
1875 --|    Chetan Nagar	26-Jul-2002	Created.                           |
1876 --+========================================================================+
1877 -- End of comments
1878 
1879 FUNCTION spec_test_min_target_max_valid(p_test_id	   IN   NUMBER,
1880 					p_test_type 	   IN	VARCHAR2,
1881 					p_validation_level IN	VARCHAR2,
1882 					p_st_min    	   IN	NUMBER,
1883                                         p_st_target 	   IN 	NUMBER,
1884                                         p_st_max    	   IN	NUMBER,
1885                                         p_t_min     	   IN	NUMBER,
1886                                         p_t_max     	   IN	NUMBER)
1887 RETURN BOOLEAN IS
1888 
1889 e_min_error 		EXCEPTION;
1890 e_max_error 		EXCEPTION;
1891 e_target_error 		EXCEPTION;
1892 l_position		VARCHAR2(3);
1893 l_return_status 	VARCHAR2(1);
1894 e_num_range_label_hole	EXCEPTION;
1895 REQ_FIELDS_MISSING 	EXCEPTION;
1896 l_val_missing		NUMBER;
1897 
1898 BEGIN
1899 
1900    FND_MSG_PUB.initialize;
1901    l_position := '010';
1902 
1903 
1904    IF p_test_id IS NULL OR p_test_type IS NULL OR p_test_type IN ('U','V') THEN
1905       RAISE REQ_FIELDS_MISSING;
1906    END IF;
1907 
1908   -- check spec min is >= target and <= spec max. Also spec min is between test min and test max.
1909   IF p_validation_level IN ('ST_MIN','FULL') THEN
1910      IF p_st_min IS NOT NULL THEN
1911        	IF (p_st_min > p_st_target OR p_st_min > p_st_max OR p_st_min < p_t_min OR p_st_min > p_t_max) THEN
1912         	RAISE e_min_error;
1913      	END IF;
1914 
1915     --  num range with display can have holes in the subranges
1916     --  check that the value does not fall into one of those holes
1917      	IF p_test_type = 'L' THEN
1918            IF NOT value_in_num_range_display(p_test_id  	=> p_test_id,
1919 					    p_value   		=> p_st_min,
1920 					    x_return_status	=> l_return_status) THEN
1921 	       RETURN FALSE;
1922 	   END IF;
1923         END IF;
1924      END IF; -- IF p_st_min IS NOT NULL
1925   END IF;
1926 
1927   l_position := '020';
1928 
1929   IF p_validation_level IN ('ST_TARGET','FULL') THEN
1930      IF p_st_target IS NOT NULL THEN
1931      	IF (p_st_min > p_st_target OR p_st_target > p_st_max OR p_st_target < p_t_min OR p_st_target > p_t_max) THEN
1932              RAISE e_target_error;
1933      	END IF;
1934 
1935      	IF p_test_type = 'L' THEN
1936            IF NOT value_in_num_range_display(p_test_id  	=> p_test_id,
1937 					    p_value   		=> p_st_target,
1938 					    x_return_status	=> l_return_status) THEN
1939 	  	RETURN FALSE;
1940 	   END IF;
1941         END IF;
1942      END IF; -- IF p_st_target IS NOT NULL THEN
1943   END IF;
1944 
1945   l_position := '030';
1946 
1947   IF p_validation_level IN ('ST_MAX','FULL') THEN
1948      IF p_st_max IS NOT NULL THEN
1949      	IF (p_st_min > p_st_max OR p_st_target > p_st_max OR p_st_max < p_t_min OR p_st_max > p_t_max) THEN
1950         	RAISE e_max_error;
1951      	END IF;
1952         IF p_test_type = 'L' THEN
1953            IF NOT value_in_num_range_display(p_test_id  	=> p_test_id,
1954 					    p_value   		=> p_st_max,
1955 					    x_return_status	=> l_return_status) THEN
1956 	  	RETURN FALSE;
1957 	   END IF;
1958         END IF;
1959      END IF; -- IF p_st_max IS NOT NULL THEN
1960   END IF;
1961 
1962   RETURN TRUE;
1963 
1964 EXCEPTION
1965 WHEN REQ_FIELDS_MISSING THEN
1966    gmd_api_pub.log_message('GMD_REQ_FIELD_MIS','PACKAGE','GMD_SPEC_GRP.SPEC_TEST_MIN_TARGET_MAX_VALID');
1967    RETURN FALSE;
1968 WHEN e_min_error THEN
1969    gmd_api_pub.log_message('GMD_SPEC_TEST_MIN_ERROR','SPEC_TEST_MIN',to_char(p_st_min),'SPEC_TEST_MAX',
1970    	to_char(p_st_max),'SPEC_TEST_TARGET',to_char(p_st_target),'TEST_MIN',to_char(p_t_min),'TEST_MAX',to_char(p_t_max));
1971    RETURN FALSE;
1972 WHEN e_max_error THEN
1973    gmd_api_pub.log_message('GMD_SPEC_TEST_MAX_ERROR','SPEC_TEST_MIN',to_char(p_st_min),'SPEC_TEST_MAX',
1974    	to_char(p_st_max),'SPEC_TEST_TARGET',to_char(p_st_target),'TEST_MIN',to_char(p_t_min),'TEST_MAX',to_char(p_t_max));
1975    RETURN FALSE;
1976 WHEN e_target_error THEN
1977    gmd_api_pub.log_message('GMD_SPEC_TEST_TARGET_ERROR','SPEC_TEST_MIN',to_char(p_st_min),'SPEC_TEST_MAX',
1978    	to_char(p_st_max),'SPEC_TEST_TARGET',to_char(p_st_target),'TEST_MIN',to_char(p_t_min),'TEST_MAX',to_char(p_t_max));
1979    RETURN FALSE;
1980 WHEN OTHERS THEN
1981    gmd_api_pub.log_message('GMD_API_ERROR','PACKAGE','GMD_SPEC_GRP.SPEC_TEST_MIN_TARGET_MAX_VALID','ERROR', SUBSTR(SQLERRM,1,100),'POSITION',l_position);
1982    RETURN FALSE;
1983 END spec_test_min_target_max_valid;
1984 
1985 
1986 --Start of comments
1987 --+========================================================================+
1988 --| API Name    : SPEC_TEST_EXP_ERROR_REGION_VAL                           |
1989 --| TYPE        : Group                                                    |
1990 --| Notes       : This function returns TRUE if the Spec Test experimental |
1991 --|               errors values for  Below Min, Above Min, Below Max, and  |
1992 --|               Above Max are alphanumrecically in correct order,        |
1993 --|               FALSE otherwise.                                         |
1994 --|                                                                        |
1995 --|                                                                        |
1996 --|                                                                        |
1997 --| HISTORY                                                                |
1998 --|    Chetan Nagar	26-Jul-2002	Created.                           |
1999 --|                                                                        |
2000 --+========================================================================+
2001 -- End of comments
2002 
2003 
2004 FUNCTION SPEC_TEST_EXP_ERROR_REGION_VAL(   p_validation_level VARCHAR2,
2005 				       p_exp_error_type VARCHAR2,
2006 				       p_test_min NUMBER,
2007                                        p_below_spec_min NUMBER,
2008                                        p_spec_test_min NUMBER,
2009                                        p_above_spec_min NUMBER,
2010                                        p_spec_test_target NUMBER,
2011                                        p_below_spec_max NUMBER,
2012                                        p_spec_test_max NUMBER,
2013                                        p_above_spec_max NUMBER,
2014                                        p_test_max NUMBER)
2015 RETURN BOOLEAN IS
2016 
2017 e_range_error 	EXCEPTION;
2018 l_spec_num	NUMBER;
2019 l_max_value     NUMBER;
2020 l_position      NUMBER;
2021 BEGIN
2022   FND_MSG_PUB.initialize;
2023   l_position := '010';
2024 
2025   IF p_exp_error_type IS NULL THEN
2026      RETURN TRUE;
2027   END IF;
2028 
2029   IF p_exp_error_type NOT IN ( 'N','P') THEN
2030       GMD_API_PUB.Log_Message('GMD_INVALID_EXP_ERROR_TYPE');
2031       RETURN FALSE;
2032   END IF;
2033 
2034   IF p_validation_level IN ('FULL','BELOW_SPEC_MIN') THEN
2035 
2036      IF p_below_spec_min = 0 OR p_below_spec_min IS NULL THEN
2037         RETURN TRUE;
2038      END IF;
2039 
2040      IF p_below_spec_min IS NOT NULL AND (p_spec_test_min = p_test_min OR p_test_max = p_test_min) THEN
2041         GMD_API_PUB.Log_Message('GMD_SPEC_ERROR_REG_NOT_APPL');
2042         RETURN FALSE;
2043      END IF;
2044 
2045      IF (p_below_spec_min IS NOT NULL AND p_spec_test_min IS NOT NULL and p_test_min IS NOT NULL ) THEN
2046         IF p_exp_error_type = 'N' THEN
2047            l_spec_num := p_below_spec_min ;
2048         ELSE
2049            l_spec_num := ( p_below_spec_min * ( p_test_max - p_test_min )) /100 ;
2050         END IF;
2051 
2052         IF ABS(l_spec_num) > ( p_spec_test_min - p_test_min) THEN
2053            IF p_exp_error_type = 'N' THEN
2054               l_max_value := ABS(p_spec_test_min - p_test_min);
2055            ELSE
2056               l_max_value := (ABS(p_spec_test_min - p_test_min) * 100)/(p_test_max - p_test_min);
2057            END IF;
2058            GMD_API_PUB.Log_Message('GMD_INVALID_SPEC_VAL_NUM','MAX_VAL',to_char(l_max_value));
2059       	   RETURN FALSE;
2060         END IF;
2061      END IF;
2062   END IF;
2063 
2064   l_position := '020';
2065 
2066   IF p_validation_level IN ('FULL','ABOVE_SPEC_MAX') THEN
2067 
2068      IF p_above_spec_max = 0 OR p_above_spec_max IS NULL THEN
2069         RETURN TRUE;
2070      END IF;
2071 
2072      IF p_above_spec_max IS NOT NULL AND (p_spec_test_max = p_test_max OR p_test_max = p_test_min) THEN
2073         GMD_API_PUB.Log_Message('GMD_SPEC_ERROR_REG_NOT_APPL');
2074         RETURN FALSE;
2075      END IF;
2076 
2077      IF (p_above_spec_max IS NOT NULL AND p_spec_test_max IS NOT NULL and p_test_max IS NOT NULL ) THEN
2078         IF p_exp_error_type = 'N' THEN
2079            l_spec_num := p_above_spec_max ;
2080         ELSE
2081            l_spec_num := ( p_above_spec_max * ( p_test_max - p_test_min )) /100 ;
2082         END IF;
2083 
2084         IF ABS(l_spec_num) > ( p_test_max - p_spec_test_max) THEN
2085            IF p_exp_error_type = 'N' THEN
2086               l_max_value := ABS(p_test_max - p_spec_test_max);
2087            ELSE
2088               l_max_value := (ABS(p_test_max - p_spec_test_max) * 100)/(p_test_max - p_test_min);
2089            END IF;
2090            GMD_API_PUB.Log_Message('GMD_INVALID_SPEC_VAL_NUM','MAX_VAL',to_char(l_max_value));
2091       	   RETURN FALSE;
2092         END IF;
2093      END IF;
2094   END IF;
2095 
2096   l_position := '030';
2097 
2098   IF p_validation_level IN ('FULL','ABOVE_SPEC_MIN') THEN
2099 
2100      IF p_above_spec_min = 0 OR p_above_spec_min IS NULL THEN
2101         RETURN TRUE;
2102      END IF;
2103 
2104      IF p_above_spec_min IS NOT NULL AND (p_spec_test_target = p_test_min OR p_test_max = p_test_min) THEN
2105         GMD_API_PUB.Log_Message('GMD_SPEC_ERROR_REG_NOT_APPL');
2106         RETURN FALSE;
2107      END IF;
2108 
2109      IF (p_above_spec_min IS NOT NULL AND p_spec_test_min IS NOT NULL and p_spec_test_target IS NOT NULL ) THEN
2110         IF p_exp_error_type = 'N' THEN
2111            l_spec_num := p_above_spec_min ;
2112         ELSE
2113            l_spec_num := ( p_above_spec_min * ( p_test_max - p_test_min )) /100 ;
2114         END IF;
2115 
2116         IF ABS(l_spec_num) > ( p_spec_test_target - p_spec_test_min) THEN
2117            IF p_exp_error_type = 'N' THEN
2118               l_max_value := ABS(p_spec_test_target - p_spec_test_min);
2119            ELSE
2120               l_max_value := (ABS(p_spec_test_target - p_spec_test_min) * 100)/(p_test_max - p_test_min);
2121            END IF;
2122            GMD_API_PUB.Log_Message('GMD_INVALID_SPEC_VAL_NUM','MAX_VAL',to_char(l_max_value));
2123       	   RETURN FALSE;
2124         END IF;
2125      END IF;
2126   END IF;
2127 
2128   l_position := '040';
2129 
2130   IF p_validation_level IN ('FULL','BELOW_SPEC_MAX') THEN
2131 
2132      IF p_below_spec_max = 0 OR p_below_spec_max IS NULL THEN
2133         RETURN TRUE;
2134      END IF;
2135 
2136      IF p_below_spec_max IS NOT NULL AND (p_spec_test_max = p_spec_test_target OR p_test_max = p_test_min) THEN
2137         GMD_API_PUB.Log_Message('GMD_SPEC_ERROR_REG_NOT_APPL');
2138         RETURN FALSE;
2139      END IF;
2140 
2141      IF (p_below_spec_max IS NOT NULL AND p_spec_test_max IS NOT NULL and p_spec_test_target IS NOT NULL ) THEN
2142         IF p_exp_error_type = 'N' THEN
2143            l_spec_num := p_below_spec_max ;
2144         ELSE
2145            l_spec_num := ( p_below_spec_max * ( p_test_max - p_test_min )) /100 ;
2146         END IF;
2147 
2148         IF ABS(l_spec_num) > (p_spec_test_max - p_spec_test_target ) THEN
2149            IF p_exp_error_type = 'N' THEN
2150               l_max_value := ABS(p_spec_test_max - p_spec_test_target);
2151            ELSE
2152               l_max_value := (ABS(p_spec_test_max - p_spec_test_target) * 100)/(p_test_max - p_test_min);
2153            END IF;
2154            GMD_API_PUB.Log_Message('GMD_INVALID_SPEC_VAL_NUM','MAX_VAL',to_char(l_max_value));
2155       	   RETURN FALSE;
2156         END IF;
2157      END IF;
2158   END IF;
2159 
2160   RETURN TRUE;
2161 
2162 EXCEPTION
2163 WHEN OTHERS THEN
2164     gmd_api_pub.log_message('GMD_API_ERROR','PACKAGE','GMD_SPEC_GRP.SPEC_TEST_EXP_ERROR_REGION_VAL','ERROR', SUBSTR(SQLERRM,1,100),'POSITION',l_position);
2165     RETURN FALSE;
2166 END SPEC_TEST_EXP_ERROR_REGION_VAL;
2167 
2168 
2169 
2170 --Start of comments
2171 --+========================================================================+
2172 --| API Name    : spec_test_precisions_valid                               |
2173 --| TYPE        : Group                                                    |
2174 --| Notes       : This function returns TRUE if the Spec Test Display and  |
2175 --|               Report precisions are valid, FALSE otherwise.            |
2176 --|                                                                        |
2177 --|                                                                        |
2178 --|                                                                        |
2179 --| HISTORY                                                                |
2180 --|    Chetan Nagar	26-Jul-2002	Created.                           |
2181 --|                                                                        |
2182 --+========================================================================+
2183 -- End of comments
2184 
2185 FUNCTION spec_test_precisions_valid(p_spec_display_precision IN NUMBER,
2186 		 		    p_spec_report_precision  IN NUMBER,
2187 				    p_test_display_precision  IN NUMBER,
2188 				    p_test_report_precision  IN NUMBER)
2189 RETURN BOOLEAN IS
2190 
2191   e_range_error EXCEPTION;
2192 
2193 BEGIN
2194 
2195   IF (p_spec_report_precision  > p_spec_display_precision) THEN
2196     GMD_API_PUB.Log_Message('GMD_REP_GRTR_DIS_PRCSN');
2197 
2198     RETURN FALSE;
2199   ELSIF (p_spec_display_precision > p_test_display_precision) THEN
2200     GMD_API_PUB.Log_Message('SPEC_TEST_DISPLAY_PREC_ERROR');
2201 
2202     RETURN FALSE;
2203   ELSIF (p_spec_report_precision  > p_test_report_precision) THEN
2204     GMD_API_PUB.Log_Message('SPEC_TEST_REPORT_PREC_ERROR');
2205 
2206     RETURN FALSE;
2207   END IF;
2208 
2209   RETURN TRUE;
2210 
2211 EXCEPTION
2212   -- Though there is no reason the program can reach
2213   -- here, this is coded just for the reasons we can
2214   -- not think of!
2215   WHEN OTHERS THEN
2216     RETURN FALSE;
2217 
2218 END spec_test_precisions_valid;
2219 
2220 
2221 
2222 --Start of comments
2223 --+========================================================================+
2224 --| API Name    : status_record_updateable                                 |
2225 --| TYPE        : Group                                                    |
2226 --| Notes       : This function returns FALSE if the transaction record    |
2227 --|               with the supplied status can not be updated, else TRUE.   |
2228 --|                                                                        |
2229 --|                                                                        |
2230 --|                                                                        |
2231 --| HISTORY                                                                |
2232 --|    Chetan Nagar	26-Jul-2002	Created.                           |
2233 --|                                                                        |
2234 --+========================================================================+
2235 -- End of comments
2236 
2237 FUNCTION record_updateable_with_status(p_status NUMBER)
2238 RETURN BOOLEAN IS
2239 
2240   CURSOR c_status (p_status_code NUMBER) IS
2241     SELECT a.updateable
2242     FROM   gmd_qc_status a
2243     WHERE  a.status_type =
2244       (SELECT status_type
2245        FROM   gmd_qc_status b
2246        WHERE  b.status_code = p_status_code
2247        and    b.entity_type = 'S')
2248     and    a.entity_type = 'S'
2249     ;
2250 
2251   -- Local Variables
2252   upd_flag                 VARCHAR2(1);
2253 
2254 BEGIN
2255   OPEN c_status(p_status);
2256   FETCH c_status INTO upd_flag;
2257   IF c_status%NOTFOUND THEN
2258      upd_flag:= 'N';
2259   END IF;
2260   CLOSE c_status ;
2261   IF upd_flag = 'N' THEN
2262     RETURN FALSE;
2263   ELSE
2264     RETURN TRUE;
2265   END IF;
2266 
2267 EXCEPTION
2268   WHEN OTHERS THEN
2269     RETURN FALSE;
2270 
2271 END record_updateable_with_status;
2272 
2273 --Start of comments
2274 --+========================================================================+
2275 --| API Name    : spec_used_in_sample                                      |
2276 --| TYPE        : Group                                                    |
2277 --| Notes       : This function returns TRUE if the specification is used  |
2278 --|               in any sample else FALSE                                           |
2279 --|                                                                        |
2280 --|                                                                        |
2281 --| HISTORY                                                                |
2282 --|    Chetan Nagar	26-Jul-2002	Created.                           |
2283 --|                                                                        |
2284 --+========================================================================+
2285 -- End of comments
2286 
2287 FUNCTION spec_used_in_sample(p_spec_id NUMBER) RETURN BOOLEAN IS
2288 
2289 -- perf  bug 4924529  sql id 14687024  (FTS and MJC)
2290 
2291 CURSOR cr_spec_exist_in_sample IS
2292 /*
2293  SELECT '1' FROM GMD_SAMPLING_EVENTS a , GMD_ALL_SPEC_VRS b
2294  WHERE
2295      b.spec_id = p_spec_id
2296  AND b.SPEC_VR_ID = a.ORIGINAL_SPEC_VR_ID ; */
2297 
2298 SELECT '1' FROM GMD_SAMPLING_EVENTS a , GMD_INVENTORY_SPEC_VRS b,
2299 gmd_qc_status_tl t
2300  WHERE
2301      b.spec_id = p_spec_id
2302  AND b.SPEC_VR_ID = a.ORIGINAL_SPEC_VR_ID
2303  AND b.spec_vr_status = t.status_code AND t.entity_type = 'S'
2304 UNION
2305 SELECT '1' FROM GMD_SAMPLING_EVENTS a , GMD_WIP_SPEC_VRS b,
2306 gmd_qc_status_tl t
2307  WHERE
2308      b.spec_id = p_spec_id
2309  AND b.SPEC_VR_ID = a.ORIGINAL_SPEC_VR_ID
2310  AND b.spec_vr_status = t.status_code AND t.entity_type = 'S'
2311 UNION
2312 SELECT '1' FROM GMD_SAMPLING_EVENTS a , GMD_CUSTOMER_SPEC_VRS b,
2313 gmd_qc_status_tl t
2314  WHERE
2315      b.spec_id = p_spec_id
2316  AND b.SPEC_VR_ID = a.ORIGINAL_SPEC_VR_ID
2317  AND b.spec_vr_status = t.status_code AND t.entity_type = 'S'
2318 UNION
2319 SELECT '1' FROM GMD_SAMPLING_EVENTS a , GMD_SUPPLIER_SPEC_VRS b,
2320 gmd_qc_status_tl t
2321  WHERE
2322      b.spec_id = p_spec_id
2323  AND b.SPEC_VR_ID = a.ORIGINAL_SPEC_VR_ID
2324  AND b.spec_vr_status = t.status_code AND t.entity_type = 'S'
2325 UNION
2326 SELECT '1' FROM GMD_SAMPLING_EVENTS a , GMD_MONITORING_SPEC_VRS b,
2327 gmd_qc_status_tl t
2328  WHERE
2329      b.spec_id = p_spec_id
2330  AND b.SPEC_VR_ID = a.ORIGINAL_SPEC_VR_ID
2331  AND b.spec_vr_status = t.status_code AND t.entity_type = 'S'
2332 UNION
2333 SELECT '1' FROM GMD_SAMPLING_EVENTS a , GMD_STABILITY_SPEC_VRS b,
2334 gmd_qc_status_tl t
2335  WHERE
2336      b.spec_id = p_spec_id
2337  AND b.SPEC_VR_ID = a.ORIGINAL_SPEC_VR_ID
2338  AND b.spec_vr_status = t.status_code AND t.entity_type = 'S';
2339 
2340 /*SELECT '1' FROM GMD_SAMPLING_EVENTS a , GMD_COM_SPEC_VRS_VL b,
2341 gmd_qc_status_tl t
2342  WHERE
2343      b.spec_id = p_spec_id
2344  AND b.SPEC_VR_ID = a.ORIGINAL_SPEC_VR_ID
2345  AND b.spec_vr_status = t.status_code AND t.entity_type = 'S'; */
2346 
2347 
2348  dummy VARCHAR2(1);
2349 BEGIN
2350     IF p_spec_id IS NULL THEN
2351         RETURN FALSE;
2352     END IF;
2353 
2354     OPEN  cr_spec_exist_in_sample;
2355     FETCH cr_spec_exist_in_sample INTO dummy;
2356     IF cr_spec_exist_in_sample%FOUND THEN
2357     	CLOSE cr_spec_exist_in_sample ;
2358     	RETURN TRUE;
2359     END IF;
2360     CLOSE cr_spec_exist_in_sample;
2361     RETURN FALSE;
2362 
2363 EXCEPTION
2364   WHEN OTHERS THEN
2365     RETURN TRUE;
2366 
2367 END spec_used_in_sample ;
2368 
2369 FUNCTION VERSION_CONTROL_STATE(p_entity VARCHAR2, p_entity_id NUMBER)
2370 RETURN VARCHAR2 IS
2371    l_state            VARCHAR2(32) := 'N';
2372    l_version_enabled  VARCHAR2(1) := 'N';
2373 
2374    TYPE Status_ref_cur IS REF CURSOR;
2375    Status_cur   Status_ref_cur;
2376 
2377 BEGIN
2378 
2379     -- Check for status that allow the version control
2380     -- e.g normally version control is set beyond
2381     -- status = 'Approved for gen use'
2382     -- p_entity = FND_PROFILE.VALUE('GMD_SPEC_VERSION_CONTROL')
2383 
2384     IF (p_entity IS NULL OR p_entity = 'N') THEN
2385         return 'N';
2386     END IF;
2387 
2388     OPEN Status_cur FOR
2389          Select     b.version_enabled
2390          From       gmd_specifications_b a, gmd_qc_status b
2391          Where      a.spec_id = p_entity_id
2392          And        a.spec_status = b.status_code
2393          and        b.entity_type = 'S';
2394     FETCH Status_cur INTO l_version_enabled;
2395     ClOSE Status_cur;
2396 
2397     IF ((p_entity = 'Y') AND (l_version_enabled = 'Y')) THEN
2398         l_state := 'Y';
2399     ELSIF ((p_entity = 'O') AND (l_version_enabled = 'Y')) THEN
2400         l_state := 'O';
2401     ELSE
2402         l_state := 'N';
2403     END IF;
2404 
2405     return l_state;
2406 
2407 EXCEPTION WHEN OTHERS THEN
2408     return 'N';
2409 END VERSION_CONTROL_STATE;
2410 
2411 /*======================================================================
2412 --  PROCEDURE :
2413 --   create_specification
2414 --
2415 --  DESCRIPTION:
2416 --    This PL/SQL procedure  is responsible for saving the
2417 --    new specification while versioning.
2418 --
2419 --  REQUIREMENTS
2420 --
2421 --  SYNOPSIS:
2422 --    create_specification(P_spec_id, X_spec_id);
2423 --
2424 -- HVERDDIN - Added References to new columns in SPEC HDR and SPEC TESTS
2425 --
2426 -- Saikiran Vankadari 07-Feb-2005  Pvt API calls changed as part of Convergence
2427 --
2428 --===================================================================== */
2429 
2430 PROCEDURE create_specification(p_spec_id IN  NUMBER,
2431 			       x_spec_id OUT NOCOPY NUMBER,
2432 			       x_return_status OUT NOCOPY VARCHAR2) IS
2433   X_spec_vers	NUMBER;
2434   X_row      	NUMBER := 0;
2435   l_rowid	ROWID;
2436 
2437 
2438   CURSOR Cur_get_hdr IS
2439     SELECT *
2440     FROM   gmd_specifications
2441     WHERE  spec_id = p_spec_id ;
2442   X_hdr_rec       Cur_get_hdr%ROWTYPE;
2443 
2444   CURSOR Cur_get_dtl IS
2445     SELECT *
2446     FROM   gmd_spec_tests
2447     WHERE  spec_id = p_spec_id;
2448   TYPE detail_tab IS TABLE OF Cur_get_dtl%ROWTYPE INDEX BY BINARY_INTEGER;
2449   X_dtl_tbl detail_tab;
2450 
2451 
2452 -- perf  bug 4924529  sql id 14686617
2453   CURSOR Cur_spec_id IS
2454    -- SELECT GMD_QC_SPEC_ID_S.NEXTVAL FROM   FND_DUAL;
2455    SELECT GMD_QC_SPEC_ID_S.NEXTVAL FROM sys.dual;
2456 
2457 
2458   CURSOR Cur_spec_vers IS
2459     SELECT MAX(spec_vers) + 1
2460     FROM   gmd_specifications_b
2461     WHERE  spec_name = X_hdr_rec.spec_name;
2462 
2463     l_progress   VARCHAR2(3);
2464 
2465 BEGIN
2466 
2467 
2468 --  Initialize API return status to success
2469   x_return_status := FND_API.G_RET_STS_SUCCESS;
2470 
2471   FND_MSG_PUB.initialize;    -- clear the message stack.
2472 
2473   l_progress := '010';
2474 
2475   OPEN Cur_get_hdr;
2476   FETCH Cur_get_hdr INTO X_hdr_rec;
2477   CLOSE Cur_get_hdr;
2478 
2479   FOR get_rec IN Cur_get_dtl LOOP
2480     X_row := X_row + 1;
2481     X_dtl_tbl(X_row) := get_rec;
2482   END LOOP;
2483 
2484 
2485 -- this will rollback the update made in the form for the current spec
2486 -- ( for which we are creating a new version)
2487   ROLLBACK;
2488 
2489   l_progress := '015';
2490 
2491   OPEN Cur_spec_vers;
2492   FETCH Cur_spec_vers INTO X_spec_vers;
2493   CLOSE Cur_spec_vers;
2494 
2495   OPEN Cur_spec_id;
2496   FETCH Cur_spec_id INTO x_spec_id;
2497   CLOSE Cur_spec_id;
2498 
2499   l_progress := '020';
2500   /* Insert spec header record */
2501 
2502       GMD_SPECIFICATIONS_PVT.INSERT_ROW(
2503     X_ROWID => l_rowid,
2504     X_SPEC_ID => x_spec_id,
2505     X_SPEC_NAME => X_hdr_rec.SPEC_NAME,
2506     X_SPEC_VERS => x_spec_vers,
2507     X_SPEC_TYPE => x_hdr_rec.SPEC_TYPE,
2508     X_OVERLAY_IND => x_hdr_rec.OVERLAY_IND,
2509     X_BASE_SPEC_ID => x_hdr_rec.base_spec_id,
2510     X_INVENTORY_ITEM_ID => X_hdr_rec.INVENTORY_ITEM_ID,
2511     X_REVISION => X_hdr_rec.REVISION,
2512     X_GRADE_CODE => X_hdr_rec.GRADE_CODE,
2513     X_SPEC_STATUS => 100,
2514     X_OWNER_ORGANIZATION_ID => X_hdr_rec.OWNER_ORGANIZATION_ID,
2515     X_OWNER_ID => X_hdr_rec.OWNER_ID,
2516     X_SAMPLE_INV_TRANS_IND => X_hdr_rec.SAMPLE_INV_TRANS_IND,
2517     X_DELETE_MARK => X_hdr_rec.DELETE_MARK,
2518     X_TEXT_CODE => X_hdr_rec.TEXT_CODE,
2519     X_ATTRIBUTE_CATEGORY => X_hdr_rec.ATTRIBUTE_CATEGORY,
2520     X_ATTRIBUTE1 => X_hdr_rec.ATTRIBUTE1,
2521     X_ATTRIBUTE2 => X_hdr_rec.ATTRIBUTE2,
2522     X_ATTRIBUTE3 => X_hdr_rec.ATTRIBUTE3,
2523     X_ATTRIBUTE4 => X_hdr_rec.ATTRIBUTE4,
2524     X_ATTRIBUTE5 => X_hdr_rec.ATTRIBUTE5,
2525     X_ATTRIBUTE6 => X_hdr_rec.ATTRIBUTE6,
2526     X_ATTRIBUTE7 => X_hdr_rec.ATTRIBUTE7,
2527     X_ATTRIBUTE8 => X_hdr_rec.ATTRIBUTE8,
2528     X_ATTRIBUTE9 => X_hdr_rec.ATTRIBUTE9,
2529     X_ATTRIBUTE10 => X_hdr_rec.ATTRIBUTE10,
2530     X_ATTRIBUTE11 => X_hdr_rec.ATTRIBUTE11,
2531     X_ATTRIBUTE12 => X_hdr_rec.ATTRIBUTE12,
2532     X_ATTRIBUTE13 => X_hdr_rec.ATTRIBUTE13,
2533     X_ATTRIBUTE14 => X_hdr_rec.ATTRIBUTE14,
2534     X_ATTRIBUTE15 => X_hdr_rec.ATTRIBUTE15,
2535     X_ATTRIBUTE16 => X_hdr_rec.ATTRIBUTE16,
2536     X_ATTRIBUTE17 => X_hdr_rec.ATTRIBUTE17,
2537     X_ATTRIBUTE18 => X_hdr_rec.ATTRIBUTE18,
2538     X_ATTRIBUTE19 => X_hdr_rec.ATTRIBUTE19,
2539     X_ATTRIBUTE20 => X_hdr_rec.ATTRIBUTE20,
2540     X_ATTRIBUTE21 => X_hdr_rec.ATTRIBUTE21,
2541     X_ATTRIBUTE22 => X_hdr_rec.ATTRIBUTE22,
2542     X_ATTRIBUTE23 => X_hdr_rec.ATTRIBUTE23,
2543     X_ATTRIBUTE24 => X_hdr_rec.ATTRIBUTE24,
2544     X_ATTRIBUTE25 => X_hdr_rec.ATTRIBUTE25,
2545     X_ATTRIBUTE26 => X_hdr_rec.ATTRIBUTE26,
2546     X_ATTRIBUTE27 => X_hdr_rec.ATTRIBUTE27,
2547     X_ATTRIBUTE28 => X_hdr_rec.ATTRIBUTE28,
2548     X_ATTRIBUTE29 => X_hdr_rec.ATTRIBUTE29,
2549     X_ATTRIBUTE30 => X_hdr_rec.ATTRIBUTE30,
2550     X_SPEC_DESC => X_hdr_rec.SPEC_DESC,
2551     X_CREATION_DATE => SYSDATE,
2552     X_CREATED_BY => FND_GLOBAL.USER_ID,
2553     X_LAST_UPDATE_DATE => SYSDATE,
2554     X_LAST_UPDATED_BY => FND_GLOBAL.USER_ID,
2555     X_LAST_UPDATE_LOGIN => FND_GLOBAL.LOGIN_ID);
2556 
2557    l_progress := '030';
2558 
2559   FOR i IN 1..X_dtl_tbl.count LOOP
2560    GMD_SPEC_TESTS_PVT.INSERT_ROW(
2561     X_ROWID => l_rowid,
2562     X_SPEC_ID => x_spec_id,
2563     X_FROM_BASE_IND => x_dtl_tbl(i).FROM_BASE_IND,
2564     X_EXCLUDE_IND => x_dtl_tbl(i).EXCLUDE_IND,
2565     X_MODIFIED_IND => x_dtl_tbl(i).MODIFIED_IND,
2566     X_TEST_ID => X_dtl_tbl(i).TEST_ID,
2567     X_ATTRIBUTE1 => X_dtl_tbl(i).ATTRIBUTE1,
2568     X_ATTRIBUTE2 => X_dtl_tbl(i).ATTRIBUTE2,
2569     X_MIN_VALUE_CHAR => X_dtl_tbl(i).MIN_VALUE_CHAR,
2570     X_TEST_METHOD_ID => X_dtl_tbl(i).TEST_METHOD_ID,
2571     X_SEQ => X_dtl_tbl(i).SEQ,
2572     X_TEST_QTY => X_dtl_tbl(i).TEST_QTY,
2573     X_TEST_QTY_UOM => X_dtl_tbl(i).TEST_QTY_UOM,
2574     X_MIN_VALUE_NUM => X_dtl_tbl(i).MIN_VALUE_NUM,
2575     X_TARGET_VALUE_NUM => X_dtl_tbl(i).TARGET_VALUE_NUM,
2576     X_MAX_VALUE_NUM => X_dtl_tbl(i).MAX_VALUE_NUM,
2577     X_ATTRIBUTE5 => X_dtl_tbl(i).ATTRIBUTE5,
2578     X_ATTRIBUTE6 => X_dtl_tbl(i).ATTRIBUTE6,
2579     X_ATTRIBUTE7 => X_dtl_tbl(i).ATTRIBUTE7,
2580     X_ATTRIBUTE8 => X_dtl_tbl(i).ATTRIBUTE8,
2581     X_ATTRIBUTE9 => X_dtl_tbl(i).ATTRIBUTE9,
2582     X_ATTRIBUTE10 => X_dtl_tbl(i).ATTRIBUTE10,
2583     X_ATTRIBUTE11 => X_dtl_tbl(i).ATTRIBUTE11,
2584     X_ATTRIBUTE12 => X_dtl_tbl(i).ATTRIBUTE12,
2585     X_ATTRIBUTE13 => X_dtl_tbl(i).ATTRIBUTE13,
2586     X_ATTRIBUTE14 => X_dtl_tbl(i).ATTRIBUTE14,
2587     X_ATTRIBUTE15 => X_dtl_tbl(i).ATTRIBUTE15,
2588     X_ATTRIBUTE16 => X_dtl_tbl(i).ATTRIBUTE16,
2589     X_ATTRIBUTE17 => X_dtl_tbl(i).ATTRIBUTE17,
2590     X_ATTRIBUTE18 => X_dtl_tbl(i).ATTRIBUTE18,
2591     X_USE_TO_CONTROL_STEP => X_dtl_tbl(i).USE_TO_CONTROL_STEP,
2592     X_PRINT_SPEC_IND => X_dtl_tbl(i).PRINT_SPEC_IND,
2593     X_PRINT_RESULT_IND => X_dtl_tbl(i).PRINT_RESULT_IND,
2594     X_TEXT_CODE => X_dtl_tbl(i).TEXT_CODE,
2595     X_ATTRIBUTE_CATEGORY => X_dtl_tbl(i).ATTRIBUTE_CATEGORY,
2596     X_ATTRIBUTE3 => X_dtl_tbl(i).ATTRIBUTE3,
2597     X_RETEST_LOT_EXPIRY_IND => X_dtl_tbl(i).RETEST_LOT_EXPIRY_IND,
2598     X_ATTRIBUTE19 => X_dtl_tbl(i).ATTRIBUTE19,
2599     X_ATTRIBUTE20 => X_dtl_tbl(i).ATTRIBUTE20,
2600     X_MAX_VALUE_CHAR => X_dtl_tbl(i).MAX_VALUE_CHAR,
2601     X_TEST_REPLICATE => X_dtl_tbl(i).TEST_REPLICATE,
2602     X_CHECK_RESULT_INTERVAL => X_dtl_tbl(i).CHECK_RESULT_INTERVAL,
2603     X_OUT_OF_SPEC_ACTION => X_dtl_tbl(i).OUT_OF_SPEC_ACTION,
2604     X_EXP_ERROR_TYPE => X_dtl_tbl(i).EXP_ERROR_TYPE,
2605     X_BELOW_SPEC_MIN => X_dtl_tbl(i).BELOW_SPEC_MIN,
2606     X_ABOVE_SPEC_MIN => X_dtl_tbl(i).ABOVE_SPEC_MIN,
2607     X_BELOW_SPEC_MAX => X_dtl_tbl(i).BELOW_SPEC_MAX,
2608     X_ABOVE_SPEC_MAX => X_dtl_tbl(i).ABOVE_SPEC_MAX,
2609     X_BELOW_MIN_ACTION_CODE => X_dtl_tbl(i).BELOW_MIN_ACTION_CODE,
2610     X_ABOVE_MIN_ACTION_CODE => X_dtl_tbl(i).ABOVE_MIN_ACTION_CODE,
2611     X_BELOW_MAX_ACTION_CODE => X_dtl_tbl(i).BELOW_MAX_ACTION_CODE,
2612     X_ABOVE_MAX_ACTION_CODE => X_dtl_tbl(i).ABOVE_MAX_ACTION_CODE,
2613     X_OPTIONAL_IND => X_dtl_tbl(i).OPTIONAL_IND,
2614     X_DISPLAY_PRECISION => X_dtl_tbl(i).DISPLAY_PRECISION,
2615     X_REPORT_PRECISION => X_dtl_tbl(i).REPORT_PRECISION,
2616     X_TEST_PRIORITY => X_dtl_tbl(i).TEST_PRIORITY,
2617     X_PRINT_ON_COA_IND => X_dtl_tbl(i).PRINT_ON_COA_IND,
2618     X_TARGET_VALUE_CHAR => X_dtl_tbl(i).TARGET_VALUE_CHAR,
2619     X_ATTRIBUTE4 => X_dtl_tbl(i).ATTRIBUTE4,
2620     X_ATTRIBUTE21 => X_dtl_tbl(i).ATTRIBUTE21,
2621     X_ATTRIBUTE22 => X_dtl_tbl(i).ATTRIBUTE22,
2622     X_ATTRIBUTE23 => X_dtl_tbl(i).ATTRIBUTE23,
2623     X_ATTRIBUTE24 => X_dtl_tbl(i).ATTRIBUTE24,
2624     X_ATTRIBUTE25 => X_dtl_tbl(i).ATTRIBUTE25,
2625     X_ATTRIBUTE26 => X_dtl_tbl(i).ATTRIBUTE26,
2626     X_ATTRIBUTE27 => X_dtl_tbl(i).ATTRIBUTE27,
2627     X_ATTRIBUTE28 => X_dtl_tbl(i).ATTRIBUTE28,
2628     X_ATTRIBUTE29 => X_dtl_tbl(i).ATTRIBUTE29,
2629     X_ATTRIBUTE30 => X_dtl_tbl(i).ATTRIBUTE30,
2630     X_TEST_DISPLAY => X_dtl_tbl(i).TEST_DISPLAY,
2631     X_CREATION_DATE => SYSDATE,
2632     X_CREATED_BY => FND_GLOBAL.USER_ID,
2633     X_LAST_UPDATE_DATE => SYSDATE,
2634     X_LAST_UPDATED_BY => FND_GLOBAL.USER_ID,
2635     X_LAST_UPDATE_LOGIN => FND_GLOBAL.LOGIN_ID,
2636     X_VIABILITY_DURATION => X_dtl_tbl(i).VIABILITY_DURATION,
2637     X_TEST_EXPIRATION_DAYS => X_dtl_tbl(i).DAYS,
2638     X_TEST_EXPIRATION_HOURS => X_dtl_tbl(i).HOURS,
2639     X_TEST_EXPIRATION_MINUTES => X_dtl_tbl(i).MINUTES,
2640     X_TEST_EXPIRATION_SECONDS => X_dtl_tbl(i).SECONDS,
2641     X_CALC_UOM_CONV_IND       => X_dtl_tbl(i).CALC_UOM_CONV_IND,
2642     X_TO_QTY_UOM                  => X_dtl_tbl(i).TO_QTY_UOM
2643 );
2644 
2645   END LOOP ;
2646 
2647 l_progress := '040';
2648 
2649 EXCEPTION
2650 WHEN OTHERS THEN
2651    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2652    FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
2653    FND_MESSAGE.Set_Token('PACKAGE','GMD_SPEC_GRP.CREATE_SPECIFICATION');
2654    FND_MESSAGE.Set_Token('ERROR', substr(sqlerrm,1,100));
2655    FND_MESSAGE.Set_Token('POSITION',l_progress );
2656    FND_MSG_PUB.ADD;
2657 END create_specification ;
2658 
2659 
2660 
2661 
2662 
2663 --Start of comments
2664 --+========================================================================+
2665 --| API Name    : change_status                                            |
2666 --| TYPE        : Group                                                    |
2667 --| Notes       :                                                          |
2668 --|                                                                        |
2669 --| HISTORY                                                                |
2670 --|    Chetan Nagar	05-Oct-2002	Created.                           |
2671 --|    Mahesh Chandak   16-apr-2003     Modified to support stability study|
2672 --|    Chetan Nagar     06-May-2003     B2943737 SQL Bind Variable Project.|
2673 --+========================================================================+
2674 -- End of comments
2675 
2676 PROCEDURE change_status
2677 (
2678   p_table_name    IN  VARCHAR2
2679 , p_id            IN  NUMBER
2680 , p_source_status IN  NUMBER
2681 , p_target_status IN  NUMBER
2682 , p_mode          IN  VARCHAR2
2683 , p_entity_type   IN  VARCHAR2 DEFAULT 'S'
2684 , x_return_status OUT NOCOPY VARCHAR2
2685 , x_message       OUT NOCOPY VARCHAR2
2686 ) IS
2687 
2688   -- Cursors
2689   CURSOR c_all_status (p_mode VARCHAR2,
2690                        p_current_status NUMBER,
2691                        p_target_status NUMBER) IS
2692   SELECT decode(p_mode, 'S', current_status,
2693                         'P', pending_status,
2694                         'R', rework_status,
2695                         'A', target_status)
2696   FROM   gmd_qc_status_next
2697   WHERE  current_status = p_current_status
2698   AND    target_status = p_target_status
2699   AND    entity_type = p_entity_type
2700   ;
2701 
2702   -- Local Variables
2703   l_status              NUMBER;
2704   l_sql_stmt            VARCHAR2(1000);
2705 
2706 BEGIN
2707 
2708 
2709   IF (l_debug = 'Y') THEN
2710     NULL;
2711 --Commented because of GSCC violation
2712  /*     dbms_output.put_line('Entering Procedure CHANGE_STATUS');
2713      dbms_output.put_line('Input Parameters.');
2714      dbms_output.put_line('p_table_name: '|| p_table_name ||
2715                      'p_id: '|| p_id ||
2716                      'p_source_status: '|| p_source_status ||
2717                      'p_target_status: '|| p_target_status ||
2718                      'p_mode: '|| p_mode); */
2719   END IF;
2720 
2721   -- Set Success status
2722   x_return_status := 'S';
2723 
2724   -- Validate Input Parameters for NULLs
2725   IF (p_table_name IS NULL OR p_id IS NULL OR p_source_status IS NULL OR
2726       p_target_status IS NULL OR p_mode IS NULL) THEN
2727     x_return_status := 'E';
2728     FND_MESSAGE.SET_NAME('GMD', 'GMD_INVALID_PARAMETERS');
2729     x_message := FND_MESSAGE.GET;
2730     RETURN;
2731   END IF;
2732 
2733 
2734   IF NOT (p_mode in ('P', 'R', 'A', 'S')) THEN
2735     x_return_status := 'E';
2736     FND_MESSAGE.SET_NAME('GMD', 'GMD_INVALID_PARAMETERS');
2737     x_message := FND_MESSAGE.GET;
2738     RETURN;
2739   END IF;
2740 
2741   IF (l_debug = 'Y') THEN
2742     NULL;
2743 --Commented because of GSCC violation
2744  /*      dbms_output.put_line('Input parameters are valid.'); */
2745   END IF;
2746 
2747 
2748   -- Get the status to be updated
2749   OPEN c_all_status(p_mode, p_source_status, p_target_status);
2750   FETCH c_all_status INTO l_status;
2751   IF c_all_status%NOTFOUND THEN
2752     CLOSE c_all_status;
2753     x_return_status := 'E';
2754     FND_MESSAGE.SET_NAME('GMD', 'GMD_STATUS_NOT_FOUND');
2755     x_message := FND_MESSAGE.GET;
2756     RETURN;
2757   END IF;
2758   CLOSE c_all_status;
2759 
2760   IF (l_debug = 'Y') THEN
2761     NULL;
2762 --Commented because of GSCC violation
2763  /*      dbms_output.put_line('Set the status to: '|| l_status); */
2764   END IF;
2765 
2766   -- Now construct the SQL Stmt.
2767   -- B2943737 SQL Bind Variable Project.
2768   IF (upper(p_table_name) = 'GMD_SPECIFICATIONS_B' ) THEN
2769     l_sql_stmt := 'UPDATE GMD_SPECIFICATIONS_B' ||
2770                   ' SET    spec_status = :l_status' ||
2771                   ' WHERE  spec_id = :p_id';
2772   -- added by mahesh to support stability study
2773   ELSIF (upper(p_table_name) = 'GMD_STABILITY_STUDIES_B' ) THEN
2774     l_sql_stmt := 'UPDATE GMD_STABILITY_STUDIES_B' ||
2775                   ' SET    status = :l_status' ||
2776                   ' WHERE  ss_id = :p_id';
2777   ELSE
2778     l_sql_stmt := 'UPDATE ' || p_table_name ||
2779                   ' SET    spec_vr_status = :l_status' ||
2780                   ' WHERE  spec_vr_id = :p_id';
2781   END IF;
2782 
2783   IF (l_debug = 'Y') THEN
2784     NULL;
2785 --Commented because of GSCC violation
2786  /*      dbms_output.put_line('SQL Statement: ' || l_sql_stmt); */
2787   END IF;
2788 
2789 
2790   EXECUTE IMMEDIATE l_sql_stmt USING l_status, p_id;
2791 
2792 
2793   IF (l_debug = 'Y') THEN
2794     NULL;
2795 --Commented because of GSCC violation
2796  /*  dbms_output.put_line('SQL Statement executed.');
2797      dbms_output.put_line('Leaving Procedure CHANGE_STATUS'); */
2798   END IF;
2799 
2800   RETURN;
2801 
2802 EXCEPTION
2803   WHEN OTHERS THEN
2804     FND_MESSAGE.SET_NAME('GMD', 'GMD_API_ERROR');
2805     FND_MESSAGE.SET_TOKEN('PACKAGE','GMD_SPEC_GRP.change_status');
2806     FND_MESSAGE.SET_TOKEN('ERROR', SUBSTR(SQLERRM,1,100));
2807     x_message := FND_MESSAGE.GET;
2808     x_return_status := 'E';
2809     RETURN;
2810 
2811 END change_status;
2812 
2813 --+=========================================================================+
2814 --| PROCEDURE NAME                                                          |
2815 --|    Get_Who                                                              |
2816 --|                                                                         |
2817 --| USAGE                                                                   |
2818 --|    Used to retrieve WHO information                                     |
2819 --|                                                                         |
2820 --| DESCRIPTION                                                             |
2821 --|    This procedure is used to retrieve the who field information         |
2822 --|                                                                         |
2823 --| PARAMETERS                                                              |
2824 --|    p_user_name   IN  VARCHAR2     - User name                           |
2825 --|    x_user_id     OUT NUMBER       - user id of the user                 |
2826 --|                                                                         |
2827 --| HISTORY                                                                 |
2828 --|  Saikiran Vankadari   02-May-2005 Created as part of Convergence changes
2829 --+=========================================================================+
2830 PROCEDURE Get_Who
2831 ( p_user_name    IN  fnd_user.user_name%TYPE
2832 , x_user_id      OUT NOCOPY fnd_user.user_id%TYPE
2833 )
2834 IS
2835 CURSOR fnd_user_c1 IS
2836 SELECT
2837   user_id
2838 FROM
2839   fnd_user
2840 WHERE
2841 user_name = p_user_name;
2842 
2843 BEGIN
2844 
2845   OPEN fnd_user_c1;
2846 
2847   FETCH fnd_user_c1 INTO x_user_id;
2848 
2849   -- TKW B2476518 7/23/2002
2850   -- If user not found, return -1 instead of 0.
2851   IF (fnd_user_c1%NOTFOUND)
2852   THEN
2853     x_user_id := -1;
2854   END IF;
2855 
2856   CLOSE fnd_user_c1;
2857 
2858 EXCEPTION
2859   WHEN OTHERS THEN
2860     RAISE;
2861 
2862 END Get_Who;
2863 
2864 END GMD_SPEC_GRP;