DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGS_PS_VAL_POS

Source


1 PACKAGE BODY IGS_PS_VAL_POS AS
2 /* $Header: IGSPS50B.pls 115.7 2003/02/26 05:50:34 sarakshi ship $ */
3   -------------------------------------------------------------------------------------------
4   --Change History:
5   --Who         When            What
6   --sarakshi    23-Feb-2003    Enh#2797116,modified cursor c_coo in the function crsp_val_pos_coo
7   --avenkatr    29-AUG-2001    Bug Id : 1956374. Removed Function "crsp_val_am_closed"
8   -- avenkatr    29-AUG-2001    Bug Id : 1956374. Removed Function "crsp_val_att_closed"
9   -- avenkatr    29-AUG-2001    Bug Id : 1956374. Removed Function "crsp_val_crs_ci"
10   --smaddali 21-oct-2001 modified crsp_val_pos_iu procedure for bug#1838421 .
11   -- changed the select statement .it was selecting attendance_mode twice instead of  attendance_type ,
12   -- so changed the second attendance_mode to attendance_type .Also changed the message name
13   -- to IGS_PS_PAT_MANDATORY for the corresponding cursor code
14   -------------------------------------------------------------------------------------------
15 
16   --
17   -- Validate the admission category is not closed.
18   FUNCTION crsp_val_ac_closed(
19   p_admission_cat IN IGS_AD_CAT.admission_cat%TYPE ,
20   p_message_name OUT NOCOPY VARCHAR2 )
21   RETURN BOOLEAN AS
22   BEGIN	-- crsp_val_ac_closed
23   	-- Validate if IGS_AD_CAT.IGS_AD_CAT is closed
24   DECLARE
25   	v_dummy			VARCHAR2(1);
26   	CURSOR c_ac IS
27   		SELECT 	'X'
28   		FROM 	IGS_AD_CAT		ac
29   		WHERE	ac.admission_cat	= p_admission_cat AND
30   			ac.closed_ind		= 'Y';
31   BEGIN
32   	IF p_admission_cat IS NOT NULL THEN
33   		OPEN c_ac;
34   		FETCH c_ac INTO v_dummy;
35   		IF (c_ac%FOUND) THEN
36   			CLOSE c_ac;
37   			p_message_name := 'IGS_AD_ADM_CATEGORY_CLOSED';
38   			RETURN FALSE;
39   		END IF;
40   		CLOSE c_ac;
41   	END IF;
42   	p_message_name := NULL;
43   	RETURN TRUE;
44   EXCEPTION
45   	WHEN OTHERS THEN
46   		IF (c_ac%ISOPEN) THEN
47   			CLOSE c_ac;
48   		END IF;
49   		App_Exception.Raise_Exception;
50   END;
51   EXCEPTION
52   	WHEN OTHERS THEN
53 		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
54                 Fnd_Message.Set_Token('NAME','IGS_PS_VAL_POS.CRSP_VAL_AC_CLOSED');
55                 IGS_GE_MSG_STACK.ADD;
56 		App_Exception.Raise_Exception;
57   END crsp_val_ac_closed;
58   --
59 
60   -- Validate the calendar type is categorised admission and is not closed.
61   FUNCTION crsp_val_pos_cat(
62   p_cal_type IN IGS_CA_TYPE.cal_type%TYPE ,
63   p_message_name OUT NOCOPY VARCHAR2 )
64   RETURN BOOLEAN AS
65   BEGIN	-- crsp_val_pos_cat
66   	-- Validate the IGS_CA_TYPE is not closed and the SI_CA_S_CA_CAT is set to ADMISSION.
67   DECLARE
68   	v_closed_ind		IGS_CA_TYPE.closed_ind%TYPE;
69   	v_s_cal_cat		IGS_CA_TYPE.s_cal_cat%TYPE;
70   	CURSOR	c_cat IS
71   		SELECT closed_ind,
72   			s_cal_cat
73 		FROM	IGS_CA_TYPE
74   		WHERE	cal_type = p_cal_type;
75   BEGIN
76   	-- check parameters
77   	IF p_cal_type IS NULL THEN
78   		p_message_name := NULL;
79   		RETURN TRUE;
80   	END IF;
81   	-- get the closed indicator and calender category for this cal type
82   	OPEN c_cat;
83   	FETCH c_cat INTO 	v_closed_ind,
84   				v_s_cal_cat;
85   	-- if no records found
86   	IF (c_cat%NOTFOUND) THEN
87   		CLOSE c_cat;
88   		p_message_name := NULL;
89   		RETURN TRUE;
90   	END IF;
91   	CLOSE c_cat;
92   	--check if IGS_CA_TYPE is closed
93   	IF v_closed_ind = 'Y' THEN
94   		p_message_name := 'IGS_CA_CALTYPE_CLOSED';
95   		RETURN FALSE;
96   	END IF;
97   	--check if the IGS_CA_TYPE is of category 'ADMISSION'
98   	IF v_s_cal_cat <> 'ADMISSION' THEN
99   		p_message_name := 'IGS_PS_CALTYPE_ADMISSION_CAL';
100   		RETURN FALSE;
101   	END IF;
102   	-- validated IGS_CA_TYPE is not closed and SI_CA_S_CA_CAT set to ADMISSION
103   	p_message_name := NULL;
104   	RETURN TRUE;
105   EXCEPTION
106   	WHEN OTHERS THEN
107   		IF (c_cat%ISOPEN) THEN
108   			CLOSE c_cat;
109   		END IF;
110   		App_Exception.Raise_Exception;
111   END;
112   EXCEPTION
113   	WHEN OTHERS THEN
114 		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
115                 Fnd_Message.Set_Token('NAME','IGS_PS_VAL_POS.CRSP_VAL_POS_CAT');
116                 IGS_GE_MSG_STACK.ADD;
117 		App_Exception.Raise_Exception;
118   END crsp_val_pos_cat;
119   --
120   -- Warn if no IGS_PS_COURSE offering exists for the specified options.
121   FUNCTION crsp_val_pos_coo(
122   p_course_cd IN VARCHAR2 ,
123   p_version_number IN NUMBER ,
124   p_cal_type IN VARCHAR2 ,
125   p_location_cd IN VARCHAR2 ,
126   p_attendance_mode IN VARCHAR2 ,
127   p_attendance_type IN VARCHAR2 ,
128   p_message_name OUT NOCOPY VARCHAR2 )
129   RETURN BOOLEAN AS
130   BEGIN	-- crsp_val_pos_coo
131   	-- Warn the user if  location_cd, IGS_EN_ATD_MODE or IGS_EN_ATD_TYPE are set
132   	-- that a IGS_PS_OFR_OPT record exists for the specified option.
133   	-- Warning only.
134   DECLARE
135   	v_dummy		VARCHAR2(1);
136   	CURSOR	c_coo IS
137   		SELECT 	'x'
138   		FROM	IGS_PS_OFR_OPT
139   		WHERE	course_cd		= p_course_cd AND
140   				version_number		= p_version_number AND
141   				cal_type 		= p_cal_type AND
142   				(p_location_cd		IS NULL OR
143   			 	location_cd		= p_location_cd) AND
144   				(p_attendance_mode 	IS NULL OR
145   			 	attendance_mode = p_attendance_mode) AND
146   				(p_attendance_type 	IS NULL OR
147   			 	attendance_type	= p_attendance_type) AND
148                                 delete_flag = 'N';
149   BEGIN
150   	-- check parameters
151   	IF p_course_cd IS NULL OR
152   			p_version_number IS NULL OR
153   			p_cal_type IS NULL THEN
154           	p_message_name := NULL;
155   		RETURN TRUE;
156   	END IF;
157   	-- Check for IGS_PS_OFR_OPT records for the IGS_PS_COURSE offering supplied
158   	-- and for  IGS_EN_UNIT_SET versions with the uni_set_cd supplied which have a
159   	--  IGS_EN_UNIT_SET_STAT.s_unit_set_status of ACTIVE:
160   	OPEN c_coo;
161   	FETCH c_coo INTO v_dummy;
162   	IF (c_coo%NOTFOUND) THEN
163   		-- no record found
164   		CLOSE c_coo;
165   		p_message_name := 'IGS_PS_POO_DOES_NOT_EXIST';
166   		RETURN FALSE;
167   	END IF;
168   	-- record found
169   	CLOSE c_coo;
170   	p_message_name := NULL;
171   	RETURN TRUE;
172   EXCEPTION
173   	WHEN OTHERS THEN
174   		IF (c_coo%ISOPEN) THEN
175   			CLOSE c_coo;
176   		END IF;
177   		App_Exception.Raise_Exception;
178   END;
179   EXCEPTION
180   	WHEN OTHERS THEN
181 		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
182                 Fnd_Message.Set_Token('NAME','IGS_PS_VAL_POS.CRSP_VAL_POS_COO');
183                 IGS_GE_MSG_STACK.ADD;
184 		App_Exception.Raise_Exception;
185   END crsp_val_pos_coo;
186   --
187   -- Warn if no IGS_PS_COURSE offering IGS_PS_UNIT set record exists.
188   FUNCTION crsp_val_pos_cous(
189   p_course_cd IN VARCHAR2 ,
190   p_crv_version_number IN NUMBER ,
191   p_cal_type IN VARCHAR2 ,
192   p_unit_set_cd IN VARCHAR2 ,
193   p_message_name OUT NOCOPY VARCHAR2 )
194   RETURN BOOLEAN AS
195   BEGIN	-- crsp_val_pos_cous
196   	-- Warn the user if the IGS_EN_UNIT_SET is not linked to the IGS_PS_OFR.
197   	-- Warning only.
198   DECLARE
199   	cst_active	CONSTANT	IGS_EN_UNIT_SET_STAT.s_unit_set_status%TYPE := 'ACTIVE';
200   	v_dummy			VARCHAR(1);
201   	CURSOR c_cous_us_uss IS
202   		SELECT	'X'
203   		FROM	IGS_PS_OFR_UNIT_SET	cous,
204   			IGS_EN_UNIT_SET			us,
205   			IGS_EN_UNIT_SET_STAT			uss
206   		WHERE	cous.course_cd			= p_course_cd AND
207   			cous.crv_version_number		= p_crv_version_number AND
208   			cous.cal_type			= p_cal_type AND
209   			cous.unit_set_cd		= p_unit_set_cd AND
210   			cous.unit_set_cd		= us.unit_set_cd AND
211   			cous.us_version_number		= us.version_number AND
212   			us.unit_set_status			= uss.unit_set_status AND
213   			uss.s_unit_set_status		= cst_active;
214   BEGIN
215   	IF p_course_cd IS NULL OR
216   			p_crv_version_number IS NULL OR
217   			p_cal_type IS NULL OR
218   			p_unit_set_cd IS NULL THEN
219   		p_message_name := NULL;
220   		RETURN TRUE;
221   	ELSE
222   		OPEN c_cous_us_uss;
223   		FETCH c_cous_us_uss INTO v_dummy;
224   		IF (c_cous_us_uss%NOTFOUND) THEN
225   			CLOSE c_cous_us_uss;
226   			p_message_name := 'IGS_PS_UNITSET_NOT_LINK_PRG';
227   			RETURN FALSE;
228   		END IF;
229   		CLOSE c_cous_us_uss;
230   	END IF;
231   	p_message_name := NULL;
232   	RETURN TRUE;
233   EXCEPTION
234   	WHEN OTHERS THEN
235   		IF (c_cous_us_uss%ISOPEN) THEN
236   			CLOSE c_cous_us_uss;
237   		END IF;
238   		App_Exception.Raise_Exception;
239   END;
240   EXCEPTION
241   	WHEN OTHERS THEN
242 		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
243                 Fnd_Message.Set_Token('NAME','IGS_PS_VAL_POS.CRSP_VAL_POS_COUS');
244                 IGS_GE_MSG_STACK.ADD;
245 		App_Exception.Raise_Exception;
246   END crsp_val_pos_cous;
247   --
248   -- Validate pattern of study record is not ambiguous.
249   FUNCTION crsp_val_pos_iu(
250   p_course_cd IN IGS_PS_PAT_OF_STUDY.course_cd%TYPE ,
251   p_version_number IN IGS_PS_PAT_OF_STUDY.version_number%TYPE ,
252   p_cal_type IN IGS_PS_PAT_OF_STUDY.cal_type%TYPE ,
253   p_sequence_number IN IGS_PS_PAT_OF_STUDY.sequence_number%TYPE ,
254   p_location_cd IN IGS_PS_PAT_OF_STUDY.location_cd%TYPE ,
255   p_attendance_mode IN IGS_PS_PAT_OF_STUDY.attendance_mode%TYPE ,
256   p_attendance_type IN IGS_PS_PAT_OF_STUDY.attendance_type%TYPE ,
257   p_unit_set_cd IN IGS_PS_PAT_OF_STUDY.unit_set_cd%TYPE ,
258   p_admission_cal_type IN IGS_PS_PAT_OF_STUDY.admission_cal_type%TYPE ,
259   p_admission_cat IN IGS_PS_PAT_OF_STUDY.admission_cat%TYPE ,
260   p_message_name OUT NOCOPY VARCHAR2 )
261   RETURN BOOLEAN AS
262   BEGIN	-- crsp_val_pos_iu
263   	-- Validate IGS_PS_PAT_OF_STUDY records are unique for the IGS_PS_OFR
264   	-- specified.  Once a IGS_AD_LOCATION code, attendance mode, attendance type,
265   	-- IGS_PS_UNIT set code, admission calendar type or admission category is set
266   	-- for one IGS_PS_PAT_OF_STUDY record for a IGS_PS_OFR it must be set
267   	-- for all records.  This excludes the single default IGS_PS_PAT_OF_STUDY
268   	-- record which is allowed to exist for each IGS_PS_OFR where IGS_AD_LOCATION
269   	-- code, attendance mode, attendance type, IGS_PS_UNIT set code, admission calendar
270   	-- type and admission category are all not set.
271   DECLARE
272   	v_dummy			VARCHAR2(255);
273   	v_ret_false_flg		BOOLEAN;
274   	v_location_cd		IGS_PS_PAT_OF_STUDY.location_cd%TYPE;
275   	v_attendance_mode  	IGS_PS_PAT_OF_STUDY.attendance_mode%TYPE;
276   	v_attendance_type		IGS_PS_PAT_OF_STUDY.attendance_type%TYPE;
277   	v_unit_set_cd		IGS_PS_PAT_OF_STUDY.unit_set_cd%TYPE;
278   	v_admission_cal_type	IGS_PS_PAT_OF_STUDY.admission_cal_type%TYPE;
279   	v_admission_cat		IGS_PS_PAT_OF_STUDY.admission_cat%TYPE;
280   	CURSOR c_pos IS
281   		SELECT	'X'
282   		FROM	IGS_PS_PAT_OF_STUDY	pos
283   		WHERE	pos.course_cd		= p_course_cd AND
284   			pos.version_number	= p_version_number AND
285   			pos.cal_type		= p_cal_type AND
286   			pos.sequence_number	<> p_sequence_number AND
287   			pos.location_cd		IS NULL AND
288   			pos.attendance_mode	IS NULL AND
289   			pos.attendance_type	IS NULL AND
290   			pos.unit_set_cd		IS NULL AND
291   			pos.admission_cal_type	IS NULL AND
292   			pos.admission_cat	IS NULL;
293 
294   	CURSOR c_pos2 IS
295   		SELECT	'X'
296   		FROM	IGS_PS_PAT_OF_STUDY	pos
297   		WHERE	pos.course_cd		= p_course_cd AND
298   			pos.version_number	= p_version_number AND
299   			pos.cal_type            = p_cal_type AND
300   			pos.sequence_number	<> p_sequence_number AND
301   			((p_location_cd		IS NULL AND
302   			pos.location_cd		IS NULL) OR
303   			pos.location_cd		= p_location_cd) AND
304   			((p_attendance_mode	IS NULL AND
305   			pos.attendance_mode	IS NULL) OR
306   			pos.attendance_mode	= p_attendance_mode) AND
307   			((p_attendance_type	IS NULL AND
308   			pos.attendance_type	IS NULL) OR
309   			pos.attendance_type	= p_attendance_type) AND
310   			((p_unit_set_cd		IS NULL AND
311   			pos.unit_set_cd		IS NULL) OR
312   			pos.unit_set_cd		= p_unit_set_cd) AND
313   			((p_admission_cal_type	IS NULL AND
314   			pos.admission_cal_type	IS NULL) OR
315   			pos.admission_cal_type	= p_admission_cal_type) AND
316   			((p_admission_cat	IS NULL AND
317   			pos.admission_cat	IS NULL) OR
318   			pos.admission_cat	= p_admission_cat);
319   	--smaddali changed the select statement for bug#1838421 . it was selecting attendance_mode twice instead of
320   	-- attendance_type , so changed the second attendance_mode to attendance_type
321   	CURSOR c_pos3 IS
322   		SELECT	pos.location_cd,
323   			pos.attendance_mode,
324   			pos.attendance_type,
325   			pos.unit_set_cd,
326   			pos.admission_cal_type,
327   			pos.admission_cat
328   		FROM	IGS_PS_PAT_OF_STUDY	pos
329   		WHERE	pos.course_cd		= p_course_cd AND
330   			pos.version_number	= p_version_number AND
331   			pos.cal_type		= p_cal_type AND
332   			pos.sequence_number	<> p_sequence_number AND
333   			(pos.location_cd		IS NOT NULL OR
334   			pos.attendance_mode	IS NOT NULL OR
335   			pos.attendance_type	IS NOT NULL OR
336   			pos.unit_set_cd		IS NOT NULL OR
337   			pos.admission_cal_type	IS NOT NULL OR
338   			pos.admission_cat		IS NOT NULL);
339   BEGIN
340   	-- 1. Check parameters
341   	IF (p_course_cd IS NULL OR
342   			p_version_number IS NULL OR
343   			p_cal_type IS NULL OR
344   			p_sequence_number IS NULL) THEN
345   		p_message_name := NULL;
346   		RETURN TRUE;
347   	END IF;
348   	-- 2. If all of the remaining parameters are null check that a
349   	-- default (all null) record does not already exist
350   	IF (p_location_cd IS NULL AND
351   			p_attendance_mode IS NULL AND
352   			p_attendance_type IS NULL AND
353   			p_unit_set_cd IS NULL AND
354   			p_admission_cal_type IS NULL AND
355   			p_admission_cat IS NULL) THEN
356   		OPEN c_pos;
357   		FETCH c_pos INTO v_dummy;
358   		IF (c_pos%FOUND) THEN
359   			CLOSE c_pos;
360   			p_message_name := 'IGS_GE_RECORD_ALREADY_EXISTS';
361   			RETURN FALSE;
362   		END IF;
363   		CLOSE c_pos;
364   		p_message_name := NULL;
365   		RETURN TRUE;
366   	END IF;
367   	-- 3. Check that this record is not the same as an existing record
368   	OPEN c_pos2;
369   	FETCH c_pos2 INTO v_dummy;
370   	IF (c_pos2%FOUND) THEN
371   		CLOSE c_pos2;
372   		p_message_name := 'IGS_GE_RECORD_ALREADY_EXISTS';
373   		RETURN FALSE;
374   	END IF;
375   	CLOSE c_pos2;
376   	-- 4. Check that if location_cd is set ,that other records have it set
377   	--    (except the default all null record) or that if the location_cd
378   	--    is not set that all other records do not have it set.
379   	OPEN c_pos3;
380   	v_ret_false_flg := FALSE;
381   	LOOP
382   		FETCH c_pos3 INTO	v_location_cd,
383   				v_attendance_mode,
384   				v_attendance_type,
385   				v_unit_set_cd,
386   				v_admission_cal_type,
387   				v_admission_cat;
388   		IF (c_pos3%NOTFOUND) THEN
389   			CLOSE c_pos3;
390   			EXIT;
391   		END IF;
392   		-- 4.1 Check IGS_AD_LOCATION code is set or unset for all pattern
393   		-- of study records for this IGS_PS_COURSE offering.
394   		--smaddali for bug#1838421 ,changed the message name from IGS_GE_RECORD_ALREADY_EXISTS
395   	        --  to IGS_PS_PAT_MANDATORY in all the following IF cases
396   		IF (p_location_cd IS NULL AND
397   				v_location_cd IS NOT NULL) THEN
398   			p_message_name := 'IGS_PS_PAT_MANDATORY';
399   			v_ret_false_flg := TRUE;
400   			EXIT;
401   		END IF;
402   		IF (p_location_cd IS NOT NULL AND
403   				v_location_cd IS NULL) THEN
404   			p_message_name := 'IGS_PS_PAT_MANDATORY';
405   			v_ret_false_flg := TRUE;
406   			EXIT;
407   		END IF;
408   		-- 4.2 Check attendance mode is set or unset for all pattern
409   		-- of study records for this IGS_PS_COURSE offering.
410   		IF (p_attendance_mode IS NULL AND
411   				v_attendance_mode IS NOT NULL) THEN
412   			p_message_name := 'IGS_PS_PAT_MANDATORY';
413   			v_ret_false_flg := TRUE;
414   			EXIT;
415   		END IF;
416   		IF (p_attendance_mode IS NOT NULL AND
417   				v_attendance_mode IS NULL) THEN
418   			p_message_name := 'IGS_PS_PAT_MANDATORY';
419   			v_ret_false_flg := TRUE;
420   			EXIT;
421   		END IF;
422   		-- 4.3 Check attendance type is set or unset for all pattern
423   		-- of study records for this IGS_PS_COURSE offering.
424   		IF (p_attendance_type IS NULL AND
425   				v_attendance_type IS NOT NULL) THEN
426   			p_message_name := 'IGS_PS_PAT_MANDATORY';
427   			v_ret_false_flg := TRUE;
428   			EXIT;
429   		END IF;
430   		IF (p_attendance_type IS NOT NULL AND
431   				v_attendance_type IS NULL) THEN
432   			p_message_name := 'IGS_PS_PAT_MANDATORY' ;
433   			v_ret_false_flg := TRUE;
434   			EXIT;
435   		END IF;
436   		-- 4.4 Check IGS_PS_UNIT set code is set or unset for all pattern
437   		-- of study records for this IGS_PS_COURSE offering.
438   		IF (p_unit_set_cd IS NULL AND
439   				v_unit_set_cd IS NOT NULL) THEN
440   			p_message_name := 'IGS_PS_PAT_MANDATORY';
441   			v_ret_false_flg := TRUE;
442   			EXIT;
443   		END IF;
444   		IF (p_unit_set_cd IS NOT NULL AND
445   				v_unit_set_cd IS NULL) THEN
446   			p_message_name := 'IGS_PS_PAT_MANDATORY' ;
447   			v_ret_false_flg := TRUE;
448   			EXIT;
449   		END IF;
450   		-- 4.5 Check admission calendar type is set or unset for all
451   		-- pattern of study records for this IGS_PS_COURSE offering.
452   		IF (p_admission_cal_type IS NULL AND
453   				v_admission_cal_type IS NOT NULL) THEN
454   			p_message_name := 'IGS_PS_PAT_MANDATORY' ;
455   			v_ret_false_flg := TRUE;
456   			EXIT;
457   		END IF;
458   		IF (p_admission_cal_type IS NOT NULL AND
459   				v_admission_cal_type IS NULL) THEN
460   			p_message_name := 'IGS_PS_PAT_MANDATORY' ;
461   			v_ret_false_flg := TRUE;
462   			EXIT;
463   		END IF;
464   		-- 4.6 Check admission category is set or unset for all
465   		-- pattern of study records for this IGS_PS_COURSE offering.
466   		IF (p_admission_cat IS NULL AND
467   				v_admission_cat IS NOT NULL) THEN
468   			p_message_name := 'IGS_PS_PAT_MANDATORY' ;
469   			v_ret_false_flg := TRUE;
470   			EXIT;
471   		END IF;
472   		IF (p_admission_cat IS NOT NULL AND
473   				v_admission_cat IS NULL) THEN
474   			p_message_name := 'IGS_PS_PAT_MANDATORY' ;
475   			v_ret_false_flg := TRUE;
476   			EXIT;
477   		END IF;
478   	END LOOP;
479   	IF (v_ret_false_flg) THEN
480   		RETURN FALSE;
481   	END IF;
482   	p_message_name := NULL;
483   	RETURN TRUE;
484   EXCEPTION
485   	WHEN OTHERS THEN
486   		IF (c_pos%ISOPEN) THEN
487   			CLOSE c_pos;
488   		END IF;
489   		IF (c_pos2%ISOPEN) THEN
490   			CLOSE c_pos2;
491   		END IF;
492   		IF (c_pos3%ISOPEN) THEN
493   			CLOSE c_pos3;
494   		END IF;
495   		App_Exception.Raise_Exception;
496   END;
497   EXCEPTION
498   	WHEN OTHERS THEN
499   		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
500                 Fnd_Message.Set_Token('NAME','IGS_PS_VAL_POS.CRSP_VAL_POS_IU');
501                 IGS_GE_MSG_STACK.ADD;
502 		App_Exception.Raise_Exception;
503   END crsp_val_pos_iu;
504   --
505   -- Validate a least one version of the IGS_PS_UNIT set is active.
506   FUNCTION crsp_val_us_active(
507   p_unit_set_cd IN IGS_EN_UNIT_SET_ALL.unit_set_cd%TYPE ,
508   p_message_name OUT NOCOPY VARCHAR2 )
509   RETURN BOOLEAN AS
510   BEGIN	-- crsp_val_us_active
511   	-- Validate the IGS_EN_UNIT_SET contains at least one version which is ACTIVE.
512   DECLARE
513   	v_dummy		VARCHAR2(1);
514   	CURSOR	c_us_uss IS
515   		SELECT	'X'
516   		FROM	IGS_EN_UNIT_SET us,
517   			IGS_EN_UNIT_SET_STAT uss
518   		WHERE	us.unit_set_cd 		= p_unit_set_cd AND
519   			us.unit_set_status	= uss.unit_set_status AND
520   			uss.s_unit_set_status 	= 'ACTIVE';
521   BEGIN
522   	-- Check parameters:
523   	IF p_unit_set_cd IS NULL THEN
524   		p_message_name := NULL;
525   		RETURN TRUE;
526   	END IF;
527   	-- Check if the IGS_EN_UNIT_SET contains an active version:
528   	OPEN c_us_uss;
529   	FETCH c_us_uss INTO v_dummy;
530   	--If no active record is found return error:
531   	IF (c_us_uss%NOTFOUND) THEN
532   		CLOSE c_us_uss;
533   		p_message_name := 'IGS_PS_UNITSET_NO_ACTIVEVER';
534   		RETURN FALSE;
535   	END IF;
536   	-- record is found
537   	CLOSE c_us_uss;
538   	p_message_name := NULL;
539   	RETURN TRUE;
540   EXCEPTION
541   	WHEN OTHERS THEN
542   		IF (c_us_uss%ISOPEN) THEN
543   			CLOSE c_us_uss;
544   		END IF;
545   		App_Exception.Raise_Exception;
546   END;
547   EXCEPTION
548   	WHEN OTHERS THEN
549 		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
550                 Fnd_Message.Set_Token('NAME','IGS_PS_VAL_POS.CRSP_VAL_US_ACTIVE');
551                 IGS_GE_MSG_STACK.ADD;
552 		App_Exception.Raise_Exception;
553   END crsp_val_us_active;
554 END IGS_PS_VAL_POS;