DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGS_GR_VAL_GR

Source


1 PACKAGE BODY IGS_GR_VAL_GR AS
2 /* $Header: IGSGR10B.pls 120.2 2006/02/21 00:54:09 sepalani noship $ */
3   -------------------------------------------------------------------------------------------
4   --Change History:
5   --Who         When            What
6   --smadathi    27-AUG-2001     Bug No. 1956374 .The function GRDP_VAL_AWARD_TYPE removed
7   --avenkatr    29-AUG-2001     Bug Id : 1956374. Removed procedure "crsp_val_aw_closed"
8   --Nalin Kumar 25-Oct-2002     Bug# 2640799- Modified the grdp_val_gr_rqrd and grdp_val_gr_type procedure
9   --				to remove the 'Graduand Type' check - as per the Conferral Date Build.
10   --ijeddy      06-Oct-2003    Build  3129913, Program completion Validation.
11   -------------------------------------------------------------------------------------------
12   -- Check if a specifc encumbrance effect applies to a person encumbrance
13   FUNCTION enrp_val_encmb_efct(
14   p_person_id  HZ_PARTIES.party_id%TYPE ,
15   p_course_cd  IGS_PS_COURSE.course_cd%TYPE ,
16   p_effective_dt  DATE ,
17   p_encmb_effect_type  IGS_EN_ENCMB_EFCTTYP.s_encmb_effect_type%TYPE ,
18   p_message_name OUT NOCOPY VARCHAR2 )
19   RETURN BOOLEAN AS
20   BEGIN	-- enrp_val_encmb_efct
21   	-- This routines checks if an encumbrance effect applies to a person.
22   DECLARE
23   	v_pen_found	BOOLEAN;
24   	v_effect_exists	BOOLEAN;
25   	CURSOR c_pen IS
26   		SELECT	pen.encumbrance_type,
27   			pen.start_dt
28   		FROM	IGS_PE_PERS_ENCUMB	pen
29   		WHERE	pen.person_id		= p_person_id AND
30   			TRUNC(p_effective_dt)	BETWEEN TRUNC(pen.start_dt) AND
31   						TRUNC(NVL(pen.expiry_dt, p_effective_dt));
32   	CURSOR c_pee_seet(
33   		cp_pen_encumbrance_type	IGS_PE_PERS_ENCUMB.encumbrance_type%TYPE,
34   		cp_pen_start_dt		IGS_PE_PERS_ENCUMB.start_dt%TYPE) IS
35   		SELECT	'x'
36   		FROM	IGS_PE_PERSENC_EFFCT	pee,
37   			IGS_EN_ENCMB_EFCTTYP_V	seet
38   		WHERE	pee.person_id			= p_person_id AND
39   			pee.encumbrance_type		= cp_pen_encumbrance_type AND
40   			TRUNC(pee.pen_start_dt)		= TRUNC(cp_pen_start_dt) AND
41   			pee.s_encmb_effect_type		= p_encmb_effect_type AND
42   			TRUNC(p_effective_dt)		BETWEEN TRUNC(pee.pee_start_dt) AND
43   							TRUNC(NVL(expiry_dt, p_effective_dt)) AND
44   			seet.s_encmb_effect_type	= pee.s_encmb_effect_type AND
45   			((seet.apply_to_course_ind	= 'Y' AND
46   			 pee.course_cd			= NVL(p_course_cd, pee.course_cd)) OR
47   			 seet.apply_to_course_ind	= 'N');
48   	v_pee_seet_exists	VARCHAR2(1);
49   BEGIN
50   	-- Set the default message number
51   	p_message_name := NULL;
52   	--1. Check parameters
53   	IF p_person_id IS NULL OR
54   			p_effective_dt IS NULL OR
55   			p_encmb_effect_type IS NULL THEN
56     				Fnd_Message.Set_Name('IGS', 'IGS_GE_INVALID_VALUE');
57 		    		App_Exception.Raise_Exception;
58 
59   	END IF;
60   	--2. Look for an encumbrance with a matching encumbrance type effect.
61   	v_pen_found := FALSE;
62   	v_effect_exists := FALSE;
63   	FOR v_pen_rec IN c_pen LOOP
64   		v_pen_found := TRUE;
65   		OPEN c_pee_seet(
66   				v_pen_rec.encumbrance_type,
67   				v_pen_rec.start_dt);
68   		FETCH c_pee_seet INTO v_pee_seet_exists;
69   		IF c_pee_seet%FOUND THEN
70   			CLOSE c_pee_seet;
71   			--encumbrance effect type exists
72   			v_effect_exists := TRUE;
73   			Exit; -- quit from for loop
74   		END IF;
75   		CLOSE c_pee_seet;
76   	END LOOP; -- c_pen
77   	IF NOT v_pen_found
78   			THEN
79   		RETURN FALSE;
80   	END IF;
81   	IF v_effect_exists THEN
82   		RETURN TRUE;
83   	END IF;
84   	--No person_encumbrance_effect's match the effect type
85   	p_message_name := 'IGS_EN_PRSN_ENCUMB_EFFECTTYPE';
86   	RETURN FALSE;
87   EXCEPTION
88   	WHEN OTHERS THEN
89   		IF c_pen%ISOPEN THEN
90   			CLOSE c_pen;
91   		END IF;
92   		IF c_pee_seet%ISOPEN THEN
93   			CLOSE c_pee_seet;
94   		END IF;
95   		RAISE;
96   END;
97   EXCEPTION
98   	WHEN OTHERS THEN
99        		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
100        		IGS_GE_MSG_STACK.ADD;
101        		App_Exception.Raise_Exception;
102   END enrp_val_encmb_efct;
103   --
104   -- Validate graduand student course attempt is a graduating course.
105   FUNCTION grdp_val_gr_sca(
106   p_person_id  IGS_GR_GRADUAND_ALL.person_id%TYPE ,
107   p_course_cd  IGS_GR_GRADUAND_ALL.course_cd%TYPE ,
108   p_message_name OUT NOCOPY VARCHAR2 )
109   RETURN BOOLEAN AS
110   BEGIN	-- grdp_val_gr_sca
111   	-- Validate the graduand record student course attempt is for a
112   	-- course version that graduates students.
113   DECLARE
114   	v_sca_version_number	IGS_EN_STDNT_PS_ATT.version_number%TYPE;
115   	v_crv_exists		VARCHAR2(1);
116   	CURSOR c_sca IS
117   		SELECT	sca.version_number
118   		FROM	IGS_EN_STDNT_PS_ATT	sca
119   		WHERE	sca.person_id	= p_person_id AND
120   			course_cd	= p_course_cd;
121   	CURSOR c_crv(
122   		cp_version_number	IGS_PS_VER.version_number%TYPE) IS
123   		SELECT	'x'
124   		FROM	IGS_PS_VER	crv
125   		WHERE	crv.course_cd = p_course_cd AND
126   			crv.version_number = cp_version_number AND
127   			crv.graduate_students_ind = 'Y';
128   BEGIN
129   	-- Set the default message number
130   	p_message_name := NULL;
131   	IF p_person_id IS NULL OR p_course_cd IS NULL THEN
132   		RETURN TRUE;
133   	END IF;
134   	-- Get the student course attempt course version number
135   	OPEN c_sca;
136   	FETCH c_sca INTO v_sca_version_number;
137   	IF c_sca%NOTFOUND THEN
138   		CLOSE c_sca;
139   		RAISE NO_DATA_FOUND;
140   	END IF;
141   	CLOSE c_sca;
142   	-- check course version graduates students
143   	OPEN c_crv(v_sca_version_number);
144   	FETCH c_crv INTO v_crv_exists;
145   	IF c_crv%NOTFOUND THEN
146   		CLOSE c_crv;
147   		p_message_name := 'IGS_GR_DOES_NOT_GRAD_STUDENTS';
148   		RETURN FALSE;
149   	END IF;
150   	CLOSE c_crv;
151   	-- Return the default value
152   	RETURN TRUE;
153   EXCEPTION
154   	WHEN OTHERS THEN
155   		IF c_sca%ISOPEN THEN
156   			CLOSE c_sca;
157   		END IF;
158   		IF c_crv%ISOPEN THEN
159   			CLOSE c_crv;
160   		END IF;
161   		RAISE;
162   END;
163   EXCEPTION
164   	WHEN OTHERS THEN
165        		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
166        		IGS_GE_MSG_STACK.ADD;
167        		App_Exception.Raise_Exception;
168   END grdp_val_gr_sca;
169   --
170   -- Validate Graduand Ceremony Round calendar instance.
171   FUNCTION grdp_val_gr_crd_ci(
172   p_grd_cal_type  IGS_GR_AWD_CRMN.grd_cal_type%TYPE ,
173   p_grd_ci_sequence_number  IGS_GR_AWD_CRMN.grd_ci_sequence_number%TYPE ,
174   p_message_name OUT NOCOPY VARCHAR2 )
175   RETURN BOOLEAN AS
176   BEGIN	-- grdp_val_gr_crd_ci
177   	-- Validate that the graduand is linked
178   	-- to a ceremony_round that has an ACTIVE or PLANNED calendar instance.
179   DECLARE
180   	CURSOR c_ci_cs IS
181   		SELECT	'x'
182   		FROM	IGS_CA_INST	ci,
183   			IGS_CA_STAT	cs
184   		WHERE	ci.cal_type		= p_grd_cal_type AND
185   			ci.sequence_number	= p_grd_ci_sequence_number AND
186   			cs.cal_status		= ci.cal_status AND
187   			cs.s_cal_status		IN ('ACTIVE', 'PLANNED');
188   	v_ci_cs_exists	VARCHAR2(1);
189   BEGIN
190   	-- Set the default message number
191   	p_message_name := NULL;
192   	IF p_grd_cal_type IS NULL OR p_grd_ci_sequence_number IS NULL THEN
193   		RETURN TRUE;
194   	END IF;
195   	OPEN c_ci_cs;
196   	FETCH c_ci_cs INTO v_ci_cs_exists;
197   	IF c_ci_cs %NOTFOUND THEN
198   		CLOSE c_ci_cs;
199   		p_message_name :='IGS_GR_INSTANC_ACTIVE_PLANNED';
200   		RETURN FALSE;
201   	END IF;
202   	CLOSE c_ci_cs;
203   	-- Return the default value
204   	RETURN TRUE;
205   EXCEPTION
206   	WHEN OTHERS THEN
207   		IF c_ci_cs %ISOPEN THEN
208   			CLOSE c_ci_cs;
209   		END IF;
210   		RAISE;
211   END;
212   EXCEPTION
213   	WHEN OTHERS THEN
214        		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
215        		IGS_GE_MSG_STACK.ADD;
216        		App_Exception.Raise_Exception;
217   END grdp_val_gr_crd_ci;
218   --
219   -- Validate GRADUAND required details.
220   FUNCTION grdp_val_gr_rqrd(
221   p_course_cd  IGS_GR_GRADUAND_ALL.course_cd%TYPE ,
222   p_graduand_status  IGS_GR_GRADUAND_ALL.graduand_status%TYPE ,
223   p_s_graduand_type  IGS_GR_GRADUAND_ALL.s_graduand_type%TYPE ,
224   p_award_course_cd  IGS_GR_GRADUAND_ALL.award_course_cd%TYPE ,
225   p_award_crs_version_number  IGS_GR_GRADUAND_ALL.award_crs_version_number%TYPE ,
226   p_award_cd  IGS_GR_GRADUAND_ALL.award_cd%TYPE ,
227   p_honours_level  VARCHAR2 DEFAULT NULL,
228   p_sur_for_course_cd  IGS_GR_GRADUAND_ALL.sur_for_course_cd%TYPE ,
229   p_sur_for_crs_version_number  IGS_GR_GRADUAND_ALL.sur_for_crs_version_number%TYPE ,
230   p_sur_for_award_cd  IGS_GR_GRADUAND_ALL.sur_for_award_cd%TYPE ,
231   p_conferral_dt  IGS_GR_GRADUAND_V.conferral_dt%TYPE DEFAULT NULL,
232   p_message_name OUT NOCOPY VARCHAR2 )
233   RETURN BOOLEAN AS
234   BEGIN 	-- grdp_val_gr_rqrd
235   	-- Validate the graduand record details:
236   	-- * When s_graduand_status = 'GRADUATED' or 'SURRENDER', s_graduand_type
237   	--   cannot be 'UNKNOWN'and conferral_dt must be set.
238   	-- * When graduand is linked to a student_course_attempt a course_award must
239   	--   be specified else an honorary award.
240   	-- * An honorary award cannot be surrendered.
241   	-- * When s_graduand_status = 'SURRENDER' or s_graduand_type = 'ARTICULATE'
242   	--   surrendering course award is required.
243   	-- * Honour level can only be specified when a course award is being conferred
244   DECLARE
245   	cst_graduated		CONSTANT	VARCHAR2(10) := 'GRADUATED';
246   	cst_surrender		CONSTANT	VARCHAR2(10) := 'SURRENDER';
247   	cst_unknown		CONSTANT	VARCHAR2(10) := 'UNKNOWN';
248   	cst_deferred		CONSTANT	VARCHAR2(10) := 'DEFERRED';
249   	cst_articulate		CONSTANT	VARCHAR2(10) := 'ARTICULATE';
250   	cst_honorary		CONSTANT	VARCHAR2(10) := 'HONORARY';
251   	v_s_graduand_status	IGS_GR_STAT.s_graduand_status%TYPE;
252   	CURSOR c_gst IS
253   		SELECT	gst.s_graduand_status
254   		FROM	IGS_GR_STAT	gst
255   		WHERE	gst.graduand_status	= p_graduand_status;
256   BEGIN
257   	-- Set the default message number
258   	p_message_name := NULL;
259   	-- Check parameters
260   	IF p_graduand_status IS NULL OR
261   			p_s_graduand_type IS NULL OR
262   			p_award_cd IS NULL THEN
263   		RETURN TRUE;
264   	END IF;
265   	-- Get the system graduand status
266   	BEGIN
267   		OPEN c_gst;
268   		FETCH c_gst INTO v_s_graduand_status;
269   		IF c_gst%NOTFOUND THEN
270   			CLOSE c_gst;
271   			RAISE NO_DATA_FOUND;
272   		ELSE
273   			CLOSE c_gst;
274   		END IF;
275   	EXCEPTION
276   		WHEN NO_DATA_FOUND THEN
277 	       		Fnd_Message.Set_Name('IGS', 'IGS_GE_INVALID_VALUE');
278 	       		IGS_GE_MSG_STACK.ADD;
279        			App_Exception.Raise_Exception;
280   	END;
281   	-- Check if course award details are required
282   	IF p_course_cd IS NULL THEN
283   		-- Honorary award
284   		IF p_award_course_cd IS NOT NULL OR
285   				p_award_crs_version_number IS NOT NULL THEN
286   			p_message_name := 'IGS_GR_ONLY_HNRY_AWD';
287   			RETURN FALSE;
288   		END IF;
289   	ELSE
290   		-- Course award
291   		IF p_award_course_cd IS NULL OR
292   				p_award_crs_version_number IS NULL THEN
293   			p_message_name := 'IGS_GR_SPECIFY_COURSE_AWD';
294   			RETURN FALSE;
295   		END IF;
296   	END IF;
297   	-- Check if surrendering course details are required
298   	IF p_course_cd IS NULL THEN
299   		-- Honorary award
300   		IF p_sur_for_course_cd IS NOT NULL OR
301   				p_sur_for_crs_version_number IS NOT NULL OR
302   				p_sur_for_award_cd IS NOT NULL THEN
303   			p_message_name := 'IGS_GR_INVALID_HNRY_AWD';
304   			RETURN FALSE;
305   		END IF;
306   	END IF;
307   	IF v_s_graduand_status = cst_surrender OR
308   			p_s_graduand_type = cst_articulate THEN
309   		IF p_sur_for_course_cd IS NULL OR
310   				p_sur_for_crs_version_number IS NULL OR
311   				p_sur_for_award_cd IS NULL THEN
312   			p_message_name := 'IGS_GR_COURS_AWD_MUST_BE_SPEC';
313   			RETURN FALSE;
314   		END IF;
315   	ELSE
316   		IF p_sur_for_course_cd IS NOT NULL OR
317   				p_sur_for_crs_version_number IS NOT NULL OR
318   				p_sur_for_award_cd IS NOT NULL THEN
319   			p_message_name := 'IGS_GR_CHECK_SURR_COURS_AWD';
320   			RETURN FALSE;
321   		END IF;
322   	END IF;
323   	RETURN TRUE;
324   EXCEPTION
325   	WHEN OTHERS THEN
326   		IF c_gst%ISOPEN THEN
327   			CLOSE c_gst;
328   		END IF;
329   		RAISE;
330   END;
331   EXCEPTION
332   	WHEN OTHERS THEN
333        		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
334        		IGS_GE_MSG_STACK.ADD;
335        		App_Exception.Raise_Exception;
336   END grdp_val_gr_rqrd;
337   --
338   -- Validate graduand status.
339   FUNCTION grdp_val_gr_gst(
340   p_person_id  IGS_GR_GRADUAND_ALL.person_id%TYPE ,
341   p_create_dt  IGS_GR_GRADUAND_ALL.create_dt%TYPE ,
342   p_course_cd  IGS_GR_GRADUAND_ALL.course_cd%TYPE ,
343   p_graduand_appr_status  IGS_GR_GRADUAND_ALL.graduand_appr_status%TYPE ,
344   p_s_graduand_type  IGS_GR_GRADUAND_ALL.s_graduand_type%TYPE ,
345   p_award_course_cd  IGS_GR_GRADUAND_ALL.award_course_cd%TYPE ,
346   p_award_crs_version_number  IGS_GR_GRADUAND_ALL.award_crs_version_number%TYPE ,
347   p_award_cd  IGS_GR_GRADUAND_ALL.award_cd%TYPE ,
348   p_new_graduand_status  IGS_GR_GRADUAND_ALL.graduand_status%TYPE ,
349   p_old_graduand_status  IGS_GR_GRADUAND_ALL.graduand_status%TYPE ,
350   p_message_name OUT NOCOPY VARCHAR2 )
351   RETURN BOOLEAN AS
352   BEGIN	-- grdp_val_gr_gst
353   	-- This routine validates the setting of graduand.graduand_status
354   DECLARE
355   	v_s_graduand_appr_status	IGS_GR_APRV_STAT.s_graduand_appr_status%TYPE;
356   	v_new_s_graduand_status		IGS_GR_GRADUAND.graduand_status%TYPE;
357   	v_old_s_graduand_status		IGS_GR_GRADUAND.graduand_status%TYPE;
358   	cst_potential			CONSTANT VARCHAR2(12) := 'POTENTIAL';
359   	cst_graduated			CONSTANT VARCHAR2(12) := 'GRADUATED';
360   	cst_eligible 			CONSTANT VARCHAR2(12) := 'ELIGIBLE';
361   	cst_approved 			CONSTANT VARCHAR2(12) := 'APPROVED';
362   	cst_surrender			CONSTANT VARCHAR2(12) := 'SURRENDER';
363   	cst_attending			CONSTANT VARCHAR2(12) := 'ATTENDING';
364   	v_exit_loop			BOOLEAN;
365   	CURSOR c_gas IS
366   		SELECT	gas.s_graduand_appr_status
367   		FROM	IGS_GR_APRV_STAT		gas
368   		WHERE	gas.graduand_appr_status 	= p_graduand_appr_status;
369   	CURSOR c_gst (
370   		cp_graduand_status	IGS_GR_GRADUAND.graduand_status%TYPE)
371   	IS
372   		SELECT	gst.s_graduand_status
373   		FROM	IGS_GR_STAT		gst
374   		WHERE	gst.graduand_status	= cp_graduand_status;
375   	CURSOR	c_gac IS
376   		SELECT	gac.grd_cal_type,
377   			gac.grd_ci_sequence_number,
378   			gac.ceremony_number,
379   			gac.us_group_number
380   		FROM	IGS_GR_AWD_CRMN	gac
381   		WHERE	gac.person_id		= p_person_id AND
382   			gac.create_dt		= p_create_dt AND
383   			gac.award_course_cd	= p_award_course_cd AND
384   			gac.award_crs_version_number
385   						= p_award_crs_version_number AND
386   			gac.award_cd		= p_award_cd;
387   BEGIN
388   	p_message_name := NULL;
389   	v_exit_loop := FALSE;
390   	-- Check parameters
391   	IF p_person_id IS NULL OR
392   			p_create_dt IS NULL OR
393   			p_course_cd IS NULL OR
394   			p_graduand_appr_status IS NULL OR
395   			p_s_graduand_type IS NULL OR
396   			p_award_cd IS NULL OR
397   			p_new_graduand_status IS NULL THEN
398   		RETURN TRUE;
399   	END IF;
400   	-- validate change of graduand status
401   	IF p_new_graduand_status = NVL(p_old_graduand_status,'NULL') THEN
402   		RETURN TRUE;
403   	END IF;
404   	-- get the system status values.
405   	OPEN c_gas;
406   	FETCH c_gas INTO v_s_graduand_appr_status;
407   	CLOSE c_gas;
408   	OPEN c_gst(p_new_graduand_status);
409   	FETCH c_gst INTO v_new_s_graduand_status;
410   	CLOSE c_gst;
411   	IF p_old_graduand_status IS NOT NULL THEN
412   		OPEN c_gst(p_old_graduand_status);
413   		FETCH c_gst INTO v_old_s_graduand_status;
414   		CLOSE c_gst;
415   	END IF;
416   	-- validate the graduand status
417   	IF v_new_s_graduand_status = cst_potential THEN
418   		IF p_old_graduand_status IS NULL THEN
419   			RETURN TRUE;
420   		END IF;
421   		IF v_old_s_graduand_status IN (cst_graduated,
422   						cst_surrender) THEN
423   			p_message_name := 'IGS_GR_STATUS_CANNOT_BE_CHANG';
424   			RETURN FALSE;
425   		END IF;
426   	END IF;
427   	IF v_new_s_graduand_status = cst_eligible THEN
428   		IF p_old_graduand_status IS NOT NULL THEN
429   			IF v_old_s_graduand_status IN (cst_graduated,
430   						cst_surrender) THEN
431   				p_message_name := 'IGS_GR_STATUS_CANNOT_BE_CHANG';
432   				RETURN FALSE;
433   			END IF;
434   		END IF;
435   		-- check eligibility
436   		IF NOT IGS_GR_VAL_GR.grdp_val_aw_eligible(
437   					p_person_id,
438   					p_course_cd,
439   					p_award_course_cd,
440   					p_award_crs_version_number,
441   					p_award_cd,
442   					p_message_name) THEN
443   			RETURN FALSE;
444   		END IF;
445   		IF p_s_graduand_type = cst_attending THEN
446   			-- check primary unit sets are complete
447   			-- when a determinant for attendance at
448   			-- a ceremony.
449   			FOR v_gac_rec IN c_gac LOOP
450   				IF NOT IGS_GR_VAL_GAC.grdp_val_gac_susa(
451   						p_person_id,
452   						p_create_dt,
453   						v_gac_rec.grd_cal_type,
454   						v_gac_rec.grd_ci_sequence_number,
455   						p_course_cd,
456   						p_new_graduand_status,
457   						v_gac_rec.ceremony_number,
458   						p_award_course_cd,
459   						p_award_crs_version_number,
460   						p_award_cd,
461   						v_gac_rec.us_group_number,
462   						p_message_name) THEN
463   					v_exit_loop := TRUE;
464   					Exit;
465   				END IF;
466   			END LOOP;
467   			IF v_exit_loop THEN
468   				RETURN FALSE;
469   			END IF;
470   		END IF;
471   	END IF;
472   	IF v_new_s_graduand_status = cst_graduated THEN
473   		IF v_s_graduand_appr_status <> cst_approved THEN
474   			p_message_name := 'IGS_GR_SYSTEM_VAL_MUST_BE_APP';
475   			RETURN FALSE;
476   		END IF;
477   		IF p_old_graduand_status IS NULL OR
478   				v_old_s_graduand_status NOT IN (cst_eligible,
479   								cst_surrender) THEN
480   			IF NOT IGS_GR_VAL_GR.grdp_val_aw_eligible(
481   					p_person_id,
482   					p_course_cd,
483   					p_award_course_cd,
484   					p_award_crs_version_number,
485   					p_award_cd,
486   					p_message_name) THEN
487   				RETURN FALSE;
488   			END IF;
489   			IF p_s_graduand_type = cst_attending THEN
490   				-- check primary unit sets are complete
491   				-- when a determinant for attendance at
492   				-- a ceremony.
493   				FOR v_gac_rec IN c_gac LOOP
494   					IF NOT IGS_GR_VAL_GAC.grdp_val_gac_susa(
495   							p_person_id,
496   							p_create_dt,
497   							v_gac_rec.grd_cal_type,
498   							v_gac_rec.grd_ci_sequence_number,
499   							p_course_cd,
500   							p_new_graduand_status,
501   							v_gac_rec.ceremony_number,
502   							p_award_course_cd,
503   							p_award_crs_version_number,
504   							p_award_cd,
505   							v_gac_rec.us_group_number,
506   							p_message_name) THEN
507   						v_exit_loop := TRUE;
508   						Exit;
509   					END IF;
510   				END LOOP;
511   				IF v_exit_loop THEN
512   					RETURN FALSE;
513   				END IF;
514   			END IF;
515   		END IF;
516   	END IF;
517   	IF v_new_s_graduand_status = cst_surrender THEN
518   		IF p_old_graduand_status IS NULL OR
519   				v_old_s_graduand_status <> cst_graduated THEN
520   			p_message_name := 'IGS_GR_AWD_NOT_GIVEN_PRIOR';
521   			RETURN FALSE;
522   		END IF;
523   	END IF;
524   	RETURN TRUE;
525   EXCEPTION
526   	WHEN OTHERS THEN
527   		IF c_gas%ISOPEN THEN
528   			CLOSE c_gas;
529   		END IF;
530   		IF c_gac%iSOPEN THEN
531   			CLOSE c_gac;
532   		END IF;
533   		IF c_gst%ISOPEN THEN
534   			CLOSE c_gst;
535   		END IF;
536   		RAISE;
537   END;
538   EXCEPTION
539   	WHEN OTHERS THEN
540        		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
541        		IGS_GE_MSG_STACK.ADD;
542        		App_Exception.Raise_Exception;
543   END grdp_val_gr_gst;
544   --
545   -- Validate graduand approval status.
546   FUNCTION grdp_val_gr_gas(
547   p_person_id IN HZ_PARTIES.party_id%TYPE ,
548   p_course_cd IN IGS_PS_COURSE.course_cd%TYPE ,
549   p_graduand_status  IGS_GR_GRADUAND_ALL.graduand_status%TYPE ,
550   p_new_graduand_appr_status  IGS_GR_GRADUAND_ALL.graduand_appr_status%TYPE ,
551   p_old_graduand_appr_status  IGS_GR_GRADUAND_ALL.graduand_appr_status%TYPE ,
552   p_message_name OUT NOCOPY VARCHAR2 )
553   RETURN BOOLEAN AS
554   BEGIN	-- grdp_val_gr_gas
555   DECLARE
556   	v_gst_s_graduand_status		IGS_GR_STAT.s_graduand_status%TYPE;
557   	v_gas_s_graduand_appr_status	IGS_GR_APRV_STAT.s_graduand_appr_status%TYPE;
558   	cst_graduated					CONSTANT VARCHAR2(9) := 'GRADUATED';
559   	cst_surrender					CONSTANT VARCHAR2(9) := 'SURRENDER';
560   	cst_approved					CONSTANT VARCHAR2(8) := 'APPROVED';
561   	CURSOR c_gst IS
562   		SELECT	gst.s_graduand_status
563   		FROM	IGS_GR_STAT gst
564   		WHERE	gst.graduand_status = p_graduand_status;
565   	CURSOR c_gas IS
566   		SELECT	gas.s_graduand_appr_status
567   		FROM	IGS_GR_APRV_STAT gas
568   		WHERE	gas.graduand_appr_status = p_new_graduand_appr_status;
569   BEGIN
570   	-- Set the default message number
571   	p_message_name := NULL;
572   	--1. Check parameters :
573   	IF p_graduand_status IS NULL OR
574      		p_new_graduand_appr_status IS NULL THEN
575   		RETURN TRUE;
576   	END IF;
577   	-- 2.Validate change of graduand approval status
578   	IF p_new_graduand_appr_status = NVL(p_old_graduand_appr_status, 'NULL') THEN
579   		RETURN TRUE;
580   	END IF;
581   	--check the graduand hasn't already graduated
582   	OPEN c_gst;
583   	FETCH c_gst INTO v_gst_s_graduand_status;
584   	IF c_gst%NOTFOUND THEN
585   		CLOSE c_gst;
586   		RAISE NO_DATA_FOUND;
587   	END IF;
588   	CLOSE c_gst;
589   	OPEN c_gas;
590   	FETCH c_gas INTO v_gas_s_graduand_appr_status;
591   	IF c_gas%NOTFOUND THEN
592   		CLOSE c_gas;
593   		RAISE NO_DATA_FOUND;
594   	END IF;
595   	CLOSE c_gas;
596   	IF v_gst_s_graduand_status IN (	cst_graduated,
597   					cst_surrender) THEN
598   		IF v_gas_s_graduand_appr_status <> cst_approved THEN
599   			p_message_name := 'IGS_GR_MUST_HAVE_VALUE_APPROV';
600   			RETURN FALSE;
601   		END IF;
602   	END IF;
603   	-- check no encumbrances restrict approval
604   	IF v_gas_s_graduand_appr_status = cst_approved THEN
605   		IF IGS_GR_VAL_GR.enrp_val_encmb_efct(
606   						p_person_id,
607   						p_course_cd,
608   						SYSDATE,
609   						'GRAD_BLK',
610   						p_message_name) = TRUE THEN
611   			p_message_name := 'IGS_GR_CANNOT_BE_APPROVED';
612   			RETURN FALSE;
613   		END IF;
614   	END IF;
615   	--3.	Return no error:
616   	RETURN TRUE;
617   EXCEPTION
618   	WHEN OTHERS THEN
619   		IF c_gst %ISOPEN THEN
620   			CLOSE c_gst;
621   		END IF;
622   		IF c_gas %ISOPEN THEN
623   			CLOSE c_gas;
624   		END IF;
625   		RAISE;
626   END;
627   EXCEPTION
628   	WHEN OTHERS THEN
629        		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
630        		IGS_GE_MSG_STACK.ADD;
631        		App_Exception.Raise_Exception;
632   END grdp_val_gr_gas;
633   --
634   -- Validate system graduand type.
635   FUNCTION GRDP_VAL_GR_TYPE(
636   p_person_id  IGS_GR_GRADUAND_ALL.person_id%TYPE ,
637   p_create_dt  IGS_GR_GRADUAND_ALL.create_dt%TYPE ,
638   p_course_cd  IGS_GR_GRADUAND_ALL.course_cd%TYPE ,
639   p_graduand_status  IGS_GR_GRADUAND_ALL.graduand_status%TYPE ,
640   p_new_s_graduand_type  IGS_GR_GRADUAND_ALL.s_graduand_type%TYPE ,
641   p_old_s_graduand_type  IGS_GR_GRADUAND_ALL.s_graduand_type%TYPE ,
642   p_message_name OUT NOCOPY VARCHAR2 )
643   RETURN BOOLEAN AS
644   BEGIN	-- grdp_val_gr_type
645   DECLARE
646   	v_gst_s_graduand_status		IGS_GR_STAT.s_graduand_status%TYPE;
647   	cst_graduated			CONSTANT IGS_GR_STAT.graduand_status%TYPE
648   					:= 'GRADUATED';
649   	cst_surrender			CONSTANT IGS_GR_STAT.graduand_status%TYPE
650   					:= 'SURRENDER';
651   	cst_unknown			CONSTANT IGS_GR_STAT.graduand_status%TYPE
652   					:= 'UNKNOWN';
653   	cst_deferred			CONSTANT IGS_GR_STAT.graduand_status%TYPE
654   					:= 'DEFERRED';
655   	cst_attending			CONSTANT IGS_GR_STAT.graduand_status%TYPE
656   					:= 'ATTENDING';
657   	cst_inabsentia			CONSTANT IGS_GR_STAT.graduand_status%TYPE
658   					:= 'INABSENTIA';
659   	cst_eligible			CONSTANT IGS_GR_STAT.graduand_status%TYPE
660   					:= 'ELIGIBLE';
661   	v_should_return_false		BOOLEAN;
662   	CURSOR c_gst IS
663   		SELECT	gst.s_graduand_status
664   		FROM	IGS_GR_STAT gst
665   		WHERE	gst.graduand_status = p_graduand_status;
666   	CURSOR c_gac IS
667   		SELECT	'x'
668   		FROM	IGS_GR_AWD_CRMN	gac
669   		WHERE	gac.person_id = p_person_id AND
670   			gac.create_dt = p_create_dt;
671   	CURSOR c_gac2 IS
672   		SELECT	gac.grd_cal_type,
673   			gac.grd_ci_sequence_number,
674   			gac.ceremony_number,
675   			gac.award_course_cd,
676   			gac.award_crs_version_number,
677   			gac.award_cd,
678   			gac.us_group_number
679   		FROM	IGS_GR_AWD_CRMN gac
680   		WHERE	gac.person_id = p_person_id AND
681   			gac.create_dt = p_create_dt;
682   	v_gac_exists			VARCHAR2(1);
683   BEGIN
684   	-- Set the default message number
685   	p_message_name := NULL;
686   	--1. Check parameters :
687   	IF p_person_id IS NULL OR
688      		p_create_dt IS NULL OR
689      		p_graduand_status IS NULL OR
690      		p_new_s_graduand_type IS NULL THEN
691   			RETURN TRUE;
692   	END IF;
693   	--2. Validate change of graduand type
694   	IF p_new_s_graduand_type = NVL(p_old_s_graduand_type, 'NULL') THEN
695   		RETURN TRUE;
696   	END IF;
697   	--check the graduand hasn't already graduated
698   	OPEN c_gst;
699   	FETCH c_gst INTO v_gst_s_graduand_status;
700   	IF c_gst%NOTFOUND THEN
701   		CLOSE c_gst;
702   		RAISE NO_DATA_FOUND;
703   	END IF;
704   	CLOSE c_gst;
705  --ijeddy, Bug 2996721, 9 June 2003, commented the following If block
706 /*	IF v_gst_s_graduand_status IN(
707   				cst_graduated,
708   				cst_surrender) THEN
709   		IF p_old_s_graduand_type IS NOT NULL THEN
710   			--not setting the value FOR the first time
711   			p_message_name := 'IGS_GR_GRAD_CANNOT_BE_CHANGED';
712   			RETURN FALSE;
713   		END IF;
714   	ELSE
715 */
716   		IF p_new_s_graduand_type NOT IN(
717   					cst_attending,
718   					cst_inabsentia,
719   					cst_unknown) THEN
720   			--check no related graduand award ceremonies exist
721   			OPEN c_gac;
722   			FETCH c_gac INTO v_gac_exists;
723   			IF c_gac%FOUND THEN
724   				CLOSE c_gac;
725   				p_message_name := 'IGS_GR_CHECK_GRAD_TYPE';
726   				RETURN FALSE;
727   			END IF;
728   			CLOSE c_gac;
729   		ELSE
730   			IF p_new_s_graduand_type = cst_attending AND
731   					v_gst_s_graduand_status = cst_eligible THEN
732   				--check primary unit sets are complete when a determinant
733   				-- for attendance at a ceremony
734   				v_should_return_false :=FALSE;
735   				FOR v_gac2_rec IN c_gac2 LOOP
736   					IF IGS_GR_VAL_GAC.grdp_val_gac_susa(
737   								p_person_id,
738   								p_create_dt,
739   								v_gac2_rec.grd_cal_type,
740   								v_gac2_rec.grd_ci_sequence_number,
741   								p_course_cd,
742   								p_graduand_status,
743   								v_gac2_rec.ceremony_number,
744   								v_gac2_rec.award_course_cd,
745   								v_gac2_rec.award_crs_version_number,
746   								v_gac2_rec.award_cd,
747   								v_gac2_rec.us_group_number,
748   								p_message_name) = FALSE THEN
749   						v_should_return_false :=TRUE;
750   						Exit;
751   					END IF;
752   				END LOOP;
753   				IF v_should_return_false THEN
754   					RETURN FALSE;
755   				END IF;
756   			END IF;
757   		END IF;
758 --ijeddy, Bug 2996721, 9 June 2003, commented the following End If
759 --  	END IF;
760   	--3.	Return no error:
761   	RETURN TRUE;
762   EXCEPTION
763   	WHEN OTHERS THEN
764   		IF c_gst %ISOPEN THEN
765   			CLOSE c_gst;
766   		END IF;
767   		IF c_gac %ISOPEN THEN
768   			CLOSE c_gac;
769   		END IF;
770   		IF c_gac2 %ISOPEN THEN
771   			CLOSE c_gac2;
772   		END IF;
773   		RAISE;
774   END;
775   EXCEPTION
776   	WHEN OTHERS THEN
777        		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
778        		IGS_GE_MSG_STACK.ADD;
779        		App_Exception.Raise_Exception;
780   END grdp_val_gr_type;
781   --
782   -- Validate proxy details.
783   FUNCTION grdp_val_gr_proxy(
784   p_person_id  IGS_GR_GRADUAND_ALL.person_id%TYPE ,
785   p_s_graduand_type  IGS_GR_GRADUAND_ALL.s_graduand_type%TYPE ,
786   p_proxy_award_ind  IGS_GR_GRADUAND_ALL.proxy_award_ind%TYPE ,
787   p_proxy_award_person_id  IGS_GR_GRADUAND_ALL.proxy_award_person_id%TYPE ,
788   p_message_name OUT NOCOPY VARCHAR2 )
789   RETURN BOOLEAN AS
790   BEGIN	-- grdp_val_gr_proxy
791   	-- Validate the graduand record proxy details.
792   DECLARE
793   	cst_attending	CONSTANT IGS_GR_GRADUAND.s_graduand_type%TYPE := 'ATTENDING';
794   	v_pe_exists	VARCHAR2(1);
795   	CURSOR c_pe(
796   		cp_id	IGS_PE_PERSON_BASE_V.person_id%TYPE) IS
797   		SELECT	'x'
798   		FROM	IGS_PE_PERSON_BASE_V	pe
799   		WHERE	pe.person_id	= cp_id AND
800   			pe.date_of_death is not NULL;
801   BEGIN
802   	-- Set the default message number
803   	p_message_name := NULL;
804   	-- Check Parameters
805   	IF p_person_id IS NULL OR
806   			p_s_graduand_type IS NULL OR
807   			p_proxy_award_ind IS NULL THEN
808   		RETURN TRUE;
809   	END IF;
810   	IF p_proxy_award_ind = 'Y' THEN
811   		IF p_proxy_award_person_id IS NULL THEN
812   			p_message_name := 'IGS_GR_SPECIFY_PRXY_AWD_PERS';
813   			RETURN FALSE;
814   		ELSE
815   			-- Check the proxy person is not the graduand.
816   			IF p_proxy_award_person_id = p_person_id THEN
817   				p_message_name := 'IGS_GR_PRXY_AWD_MUST_BE_DIFF';
818   				RETURN FALSE;
819   			ELSE
820   			-- Check the proxy person is not deceased.
821   				OPEN c_pe(p_proxy_award_person_id);
822   				FETCH c_pe INTO v_pe_exists;
823   				IF c_pe%FOUND THEN
824                           		CLOSE c_pe;
825   					p_message_name := 'IGS_GR_PRXY_PERS_DECEASED';
826                           		RETURN FALSE;
827                           	END IF;
828                           	CLOSE c_pe;
829   			END IF;
830   			-- Check the graduand type is ATTENDING
831   			IF p_s_graduand_type <> cst_attending THEN
832   				p_message_name := 'IGS_GR_TYPE_MUST_BE_ATTENDING';
833   				RETURN TRUE;	-- Warning only
834   			END IF;
835   		END IF;
836   	ELSE -- p_proxy_award_ind = 'N'
837   		-- no proxy
838   		IF p_proxy_award_person_id IS NOT NULL THEN
839   			p_message_name := 'IGS_GR_PRXY_AWD_NOT_NEEDED';
840   			RETURN FALSE;
841   		ELSE
842   			OPEN c_pe(p_person_id);
843   			FETCH c_pe INTO v_pe_exists;
844   			IF c_pe%FOUND AND p_s_graduand_type = cst_attending THEN
845                  			CLOSE c_pe;
846   				p_message_name := 'IGS_GR_REQUIRES_PRXY_FOR_CERM';
847                   		RETURN FALSE;
848                   	END IF;
849                          	CLOSE c_pe;
850   		END IF;
851   	END IF;
852   	-- Return the default value
853   	RETURN TRUE;
854   EXCEPTION
855   	WHEN OTHERS THEN
856   		IF c_pe%ISOPEN THEN
857   			CLOSE c_pe;
858   		END IF;
859   		RAISE;
860   END;
861   EXCEPTION
862   	WHEN OTHERS THEN
863        		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
864        		IGS_GE_MSG_STACK.ADD;
865        		App_Exception.Raise_Exception;
866   END grdp_val_gr_proxy;
867   --
868   -- Check for multiple instances of the same award for the person.
869   FUNCTION grdp_val_gr_unique(
870   p_person_id IN IGS_GR_GRADUAND_ALL.person_id%TYPE ,
871   p_create_dt IN IGS_GR_GRADUAND_ALL.create_dt%TYPE ,
872   p_grd_cal_type IN IGS_CA_TYPE.cal_type%TYPE ,
873   p_grd_ci_sequence_num IN NUMBER ,
874   p_award_course_cd IN IGS_GR_GRADUAND_ALL.award_course_cd%TYPE ,
875   p_award_crs_version_number IN IGS_GR_GRADUAND_ALL.award_crs_version_number%TYPE ,
876   p_award_cd IN IGS_GR_GRADUAND_ALL.award_cd%TYPE ,
877   p_message_name OUT NOCOPY VARCHAR2 )
878   RETURN BOOLEAN AS
879   BEGIN	-- grdp_val_gr_unique
880   	-- Validate that the graduand record is unique.
881   	-- 	Note, both warnings and errors may result
882   	--	from this routine.
883   DECLARE
884   	cst_graduated		CONSTANT VARCHAR2(12) := 'GRADUATED';
885   	cst_surrender		CONSTANT VARCHAR2(12) := 'SURRENDER';
886   	v_gst_found		VARCHAR2(1);
887   	CURSOR c_gr IS
888   		SELECT	gr.grd_cal_type,
889   			gr.grd_ci_sequence_number,
890   			gr.graduand_status
891   		FROM	IGS_GR_GRADUAND	gr
892   		WHERE	gr.person_id				= p_person_id AND
893   			gr.create_dt				<> p_create_dt AND
894   			gr.award_cd				= p_award_cd  AND
895   			NVL(gr.award_course_cd, 'NULL')		= NVL(p_award_course_cd,'NULL') AND
896   			NVL(gr.award_crs_version_number,0)	= NVL(p_award_crs_version_number,0);
897   	CURSOR c_gst (
898   		cp_graduand_status	IGS_GR_GRADUAND.graduand_status%TYPE)
899   	IS
900   		SELECT	'x'
901   		FROM	IGS_GR_STAT		gst
902   		WHERE	gst.graduand_status	= cp_graduand_status AND
903   			gst.s_graduand_status	IN (cst_graduated,
904   							cst_surrender);
905   BEGIN
906   	-- Set the default message number
907   	p_message_name := NULL;
908   	-- NULL parameter check
909   	IF p_person_id	IS NULL OR
910   		p_create_dt IS NULL OR
911   		p_grd_cal_type IS NULL OR
912   		p_grd_ci_sequence_num IS NULL OR
913   		p_award_cd IS NULL THEN
914   		RETURN TRUE;
915   	END IF;
916   	-- Test for equivalent graduand records
917   	FOR v_gr_rec IN c_gr LOOP
918   		OPEN c_gst(v_gr_rec.graduand_status);
919   		FETCH c_gst INTO v_gst_found;
920   		IF c_gst%FOUND THEN
921   			CLOSE c_gst;
922   			p_message_name := 'IGS_GE_DUPLICATE_VALUE';
923   			RETURN FALSE;
924   		ELSE
925   			CLOSE c_gst;
926   			IF v_gr_rec.grd_cal_type = p_grd_cal_type AND
927   				v_gr_rec.grd_ci_sequence_number = p_grd_ci_sequence_num THEN
928   				p_message_name := 'IGS_GR_GRAD_DETAIL_EXISTS';
929   				RETURN FALSE;
930   			ELSE
931   				-- warning only
932   				p_message_name := 'IGS_GR_GRD_AWD_EXISTS';
933   			END IF;
934   		END IF;
935   	END LOOP;
936   	-- Return the default value
937   	RETURN TRUE;
938   EXCEPTION
939   	WHEN OTHERS THEN
940   		IF c_gr%ISOPEN THEN
941   			CLOSE c_gr;
942   		END IF;
943   		IF c_gst%ISOPEN THEN
944   			CLOSE c_gst;
945   		END IF;
946   		RAISE;
947   END;
948   EXCEPTION
949   	WHEN OTHERS THEN
950        		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
951        		IGS_GE_MSG_STACK.ADD;
952        		App_Exception.Raise_Exception;
953   END grdp_val_gr_unique;
954   --
955   -- Validate the update of a graduand with graduand awards ceremonies.
956   FUNCTION grdp_val_gr_upd(
957   p_person_id  IGS_GR_GRADUAND_ALL.person_id%TYPE ,
958   p_create_dt  IGS_GR_GRADUAND_ALL.create_dt%TYPE ,
959   p_award_course_cd  IGS_GR_GRADUAND_ALL.award_course_cd%TYPE ,
960   p_award_crs_version_number  IGS_GR_GRADUAND_ALL.award_crs_version_number%TYPE ,
961   p_award_cd  IGS_GR_GRADUAND_ALL.award_cd%TYPE ,
962   p_message_name OUT NOCOPY VARCHAR2 )
963   RETURN BOOLEAN AS
964   BEGIN	-- grdp_val_gr_upd
965   	-- Validate that the update of a graduand record does not occur
966   	--	 after the graduation_ceremony ceremony or closing date.
967   	-- Note, warnings only result from failure of the validations.
968   DECLARE
969   	CURSOR c_gac IS
970   		SELECT	gac.grd_cal_type,
971   			gac.grd_ci_sequence_number,
972   			gac.ceremony_number
973   		FROM	IGS_GR_AWD_CRMN	gac
974   		WHERE	gac.person_id		= p_person_id AND
975   			gac.create_dt		= p_create_dt AND
976   			gac.award_cd		= p_award_cd  AND
977   			NVL(gac.award_course_cd, 'NULL')	= NVL(p_award_course_cd,'NULL') AND
978   			NVL(gac.award_crs_version_number,0)	= NVL(p_award_crs_version_number,0);
979   	v_gac_rec	c_gac%ROWTYPE;
980   	CURSOR c_gc(
981   		cp_grd_cal_type 		IGS_GR_AWD_CRMN.grd_cal_type%TYPE,
982   		cp_grd_ci_sequence_number
983   	IGS_GR_AWD_CRMN.grd_ci_sequence_number%TYPE,
984   		cp_ceremony_number 		IGS_GR_AWD_CRMN.ceremony_number%TYPE) IS
985   		SELECT	gc.ceremony_dt_alias,
986   			gc.ceremony_dai_sequence_number,
987   			gc.closing_dt_alias,
988   			gc.closing_dai_sequence_number
989   		FROM	IGS_GR_CRMN		gc
990   		WHERE	gc.grd_cal_type			= cp_grd_cal_type AND
991   			gc.grd_ci_sequence_number	= cp_grd_ci_sequence_number AND
992   			gc.ceremony_number 		= cp_ceremony_number;
993   	v_gc_rec	c_gc%ROWTYPE;
994   	v_ceremony_dt	DATE DEFAULT NULL;
995   	v_closing_dt	DATE DEFAULT NULL;
996   BEGIN
997   	-- Set the default message number
998   	p_message_name := NULL;
999   	-- NULL parameter check
1000   	IF p_person_id IS NULL OR
1001   			p_create_dt IS NULL OR
1002   			p_award_cd IS NULL THEN
1003   		RETURN TRUE;
1004   	END IF;
1005   	-- NOTE the date checks below are warnings only, hence the return of TRUE
1006           FOR v_gac_rec IN c_gac LOOP
1007   		OPEN c_gc(
1008   			v_gac_rec.grd_cal_type,
1009   			v_gac_rec.grd_ci_sequence_number,
1010   			v_gac_rec.ceremony_number);
1011   		FETCH c_gc INTO v_gc_rec;
1012       		CLOSE c_gc;
1013   		v_ceremony_dt := IGS_CA_GEN_001.CALP_GET_ALIAS_VAL(
1014   						v_gc_rec.ceremony_dt_alias,
1015   						v_gc_rec.ceremony_dai_sequence_number,
1016   						v_gac_rec.grd_cal_type,
1017   						v_gac_rec.grd_ci_sequence_number);
1018   		IF TRUNC(SYSDATE) > TRUNC(v_ceremony_dt) THEN
1019   			p_message_name := 'IGS_GR_INV_DT_GRAD_CERM';
1020   			RETURN TRUE;
1021   		END IF;
1022   		v_closing_dt := IGS_CA_GEN_001.CALP_GET_ALIAS_VAL(
1023   						v_gc_rec.closing_dt_alias,
1024   						v_gc_rec.closing_dai_sequence_number,
1025   						v_gac_rec.grd_cal_type,
1026   						v_gac_rec.grd_ci_sequence_number);
1027   		IF TRUNC(SYSDATE) > TRUNC(v_closing_dt) THEN
1028   			p_message_name := 'IGS_GR_CLOSING_DT_REACHED';
1029   			RETURN TRUE;
1030   		END IF;
1031           END LOOP;
1032   	-- Return the default value
1033   	RETURN TRUE;
1034   EXCEPTION
1035   	WHEN OTHERS THEN
1036   		IF c_gac %ISOPEN THEN
1037   			CLOSE c_gac;
1038   		END IF;
1039   		IF c_gc %ISOPEN THEN
1040   			CLOSE c_gc;
1041   		END IF;
1042   		RAISE;
1043   END;
1044   EXCEPTION
1045   	WHEN OTHERS THEN
1046        		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
1047        		IGS_GE_MSG_STACK.ADD;
1048        		App_Exception.Raise_Exception;
1049   END grdp_val_gr_upd;
1050   --
1051   -- Validate inserting or updating a graduand.
1052   FUNCTION grdp_val_gr_iu(
1053   p_grd_cal_type  IGS_GR_AWD_CRMN.grd_cal_type%TYPE ,
1054   p_grd_ci_sequence_number  IGS_GR_AWD_CRMN.grd_ci_sequence_number%TYPE ,
1055   p_message_name OUT NOCOPY VARCHAR2 )
1056   RETURN BOOLEAN AS
1057   BEGIN	-- grdp_val_gac_iu
1058   	-- Validate that the insert or update of a graduand record
1059   	-- does not fall outside the ceremony round processing period.
1060   DECLARE
1061   	CURSOR c_crd IS
1062   		SELECT	crd.start_dt_alias,
1063   			crd.start_dai_sequence_number,
1064   			crd.end_dt_alias,
1065   			crd.end_dai_sequence_number
1066   		FROM	IGS_GR_CRMN_ROUND		crd
1067   		WHERE	crd.grd_cal_type		= p_grd_cal_type AND
1068   			crd.grd_ci_sequence_number	= p_grd_ci_sequence_number;
1069   	v_crd_rec	c_crd%ROWTYPE;
1070   	v_start_dt	DATE DEFAULT NULL;
1071   	v_end_dt	DATE DEFAULT NULL;
1072   BEGIN
1073   	-- Set the default message number
1074   	p_message_name := NULL;
1075   	IF p_grd_cal_type IS NULL OR p_grd_ci_sequence_number IS NULL THEN
1076   		RETURN TRUE;
1077   	END IF;
1078   	OPEN c_crd;
1079   	FETCH c_crd INTO v_crd_rec;
1080   	IF c_crd%FOUND THEN
1081   		CLOSE c_crd;
1082   		v_start_dt := IGS_CA_GEN_001.CALP_GET_ALIAS_VAL(
1083   						v_crd_rec.start_dt_alias,
1084   						v_crd_rec.start_dai_sequence_number,
1085   						p_grd_cal_type,
1086   						p_grd_ci_sequence_number);
1087   		v_end_dt := IGS_CA_GEN_001.CALP_GET_ALIAS_VAL(
1088   						v_crd_rec.end_dt_alias,
1089   						v_crd_rec.end_dai_sequence_number,
1090   						p_grd_cal_type,
1091   						p_grd_ci_sequence_number);
1092   		IF v_start_dt IS NULL OR v_end_dt IS NULL THEN
1093   			p_message_name := NULL;
1094   			RETURN TRUE;
1095   		END IF;
1096   		IF TRUNC(SYSDATE) < TRUNC(v_start_dt) OR
1097   				TRUNC(SYSDATE) > TRUNC(v_end_dt) THEN
1098   			p_message_name := 'IGS_GR_CUR_DT_OUTSIDE_CERROUN';
1099   			RETURN TRUE;
1100   		END IF;
1101   	ELSE
1102   		CLOSE c_crd;
1103   	END IF;
1104   	-- Return the default value
1105   	RETURN TRUE;
1106   EXCEPTION
1107   	WHEN OTHERS THEN
1108   		IF c_crd %ISOPEN THEN
1109   			CLOSE c_crd;
1110   		END IF;
1111   		RAISE;
1112   END;
1113   EXCEPTION
1114   	WHEN OTHERS THEN
1115        		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
1116        		IGS_GE_MSG_STACK.ADD;
1117        		App_Exception.Raise_Exception;
1118   END grdp_val_gr_iu;
1119   --
1120   -- Validate the graduand has satisfied academic requirements for an award
1121   FUNCTION grdp_val_aw_eligible(
1122   p_person_id  IGS_GR_GRADUAND_ALL.person_id%TYPE ,
1123   p_course_cd  IGS_GR_GRADUAND_ALL.course_cd%TYPE ,
1124   p_award_course_cd  IGS_GR_GRADUAND_ALL.award_course_cd%TYPE ,
1125   p_award_crs_version_number  IGS_GR_GRADUAND_ALL.award_crs_version_number%TYPE ,
1126   p_award_cd  IGS_GR_GRADUAND_ALL.award_cd%TYPE ,
1127   p_message_name OUT NOCOPY VARCHAR2 )
1128   RETURN BOOLEAN AS
1129   BEGIN	-- grdp_val_aw_eligible
1130   	-- Validate the graduand is academically eligible for the award.
1131   DECLARE
1132   	v_sca_version_number	IGS_EN_STDNT_PS_ATT.version_number%TYPE;
1133   	v_sca_crs_rqrmnt_ind	IGS_EN_STDNT_PS_ATT.course_rqrmnt_complete_ind%TYPE;
1134   	CURSOR c_sca IS
1135   		SELECT	sca.version_number,
1136   			sca.course_rqrmnt_complete_ind
1137   		FROM	IGS_EN_STDNT_PS_ATT	sca
1138   		WHERE	sca.person_id	= p_person_id AND
1139   			sca.course_cd	= p_course_cd;
1140   	v_scaae_exists	VARCHAR2(1);
1141   	CURSOR	c_scaae
1142   		(cp_sca_version_number		IGS_EN_STDNT_PS_ATT.version_number%TYPE) IS
1143   		SELECT	'x'
1144   		FROM	IGS_PS_STDNT_APV_ALT	scaae
1145   		WHERE	scaae.person_id			= p_person_id AND
1146   			scaae.course_cd			= p_course_cd AND
1147   			scaae.version_number		= cp_sca_version_number AND
1148   			scaae.exit_course_cd		= p_award_course_cd AND
1149   			scaae.exit_version_number	= p_award_crs_version_number AND
1150   			scaae.rqrmnts_complete_ind	= 'Y';
1151   BEGIN
1152   	-- Set the default message number
1153   	p_message_name := NULL;
1154   	--1. Check parameters :
1155   	IF p_person_id IS NULL OR
1156   			p_award_cd IS NULL OR
1157   			(p_course_cd IS NOT NULL AND
1158   			(p_award_course_cd IS NULL OR
1159   			p_award_crs_version_number IS NULL)) THEN
1160     				Fnd_Message.Set_Name('IGS', 'IGS_GE_INVALID_VALUE');
1161     				IGS_GE_MSG_STACK.ADD;
1162 		    		App_Exception.Raise_Exception;
1163   	END IF;
1164   	--2. Check if an honorary award rather than a course award is being given
1165   	IF p_course_cd IS NULL THEN
1166   		RETURN TRUE;
1167   	END IF;
1168   	--3. Match award to student course attempt
1169   	OPEN c_sca;
1170   	FETCH c_sca INTO
1171   			v_sca_version_number,
1172   			v_sca_crs_rqrmnt_ind;
1173   	IF c_sca%NOTFOUND THEN
1174   		CLOSE c_sca;
1175   		RAISE NO_DATA_FOUND;
1176   	END IF;
1177   	CLOSE c_sca;
1178   	IF p_award_course_cd = p_course_cd AND
1179   			p_award_crs_version_number = v_sca_version_number THEN
1180   		IF v_sca_crs_rqrmnt_ind = 'Y' THEN
1181   			RETURN TRUE;
1182   		ELSE
1183   			p_message_name := 'IGS_GR_COURSE_REQIR_NOT_COMPL';
1184   			RETURN FALSE;
1185   		END IF;
1186   	ELSE
1187   		--check for a match with an approved alternative exit
1188   		OPEN c_scaae(v_sca_version_number);
1189   		FETCH c_scaae INTO v_scaae_exists;
1190   		IF c_scaae%NOTFOUND THEN
1191   			CLOSE c_scaae;
1192   			p_message_name := 'IGS_GR_NOT_APPRV_EXIT';
1193   			RETURN FALSE;
1194   		ELSE
1195   			CLOSE c_scaae;
1196   			RETURN TRUE;
1197   		END IF;
1198   	END IF;
1199   EXCEPTION
1200   	WHEN OTHERS THEN
1201   		IF c_sca %ISOPEN THEN
1202   			CLOSE c_sca;
1203   		END IF;
1204   		IF c_scaae %ISOPEN THEN
1205   			CLOSE c_scaae;
1206   		END IF;
1207   		RAISE;
1208   END;
1209   EXCEPTION
1210   	WHEN OTHERS THEN
1211        		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
1212        		IGS_GE_MSG_STACK.ADD;
1213        		App_Exception.Raise_Exception;
1214   END grdp_val_aw_eligible;
1215   --
1216   -- Validate graduand course award.
1217   FUNCTION grdp_val_gr_caw(
1218   p_person_id  IGS_GR_GRADUAND_ALL.person_id%TYPE ,
1219   p_course_cd  IGS_GR_GRADUAND_ALL.course_cd%TYPE ,
1220   p_award_course_cd  IGS_GR_GRADUAND_ALL.award_course_cd%TYPE ,
1221   p_award_crs_version_number  IGS_GR_GRADUAND_ALL.award_crs_version_number%TYPE ,
1222   p_award_cd  IGS_GR_GRADUAND_ALL.award_cd%TYPE ,
1223   p_message_name OUT NOCOPY VARCHAR2 )
1224   RETURN BOOLEAN AS
1225   BEGIN	-- grdp_val_gr_caw
1226   	-- Validate the graduand record course award is an award for the
1227   	-- student course attempt or an alternative exit.
1228   DECLARE
1229   	v_sca_version_number	IGS_EN_STDNT_PS_ATT.version_number%TYPE;
1230   	v_ae_exists		VARCHAR2(1);
1231   	CURSOR c_sca IS
1232   		SELECT	sca.version_number
1233   		FROM	IGS_EN_STDNT_PS_ATT	sca
1234   		WHERE	sca.person_id	= p_person_id AND
1235   			course_cd	= p_course_cd;
1236   	CURSOR c_ae(
1237   		cp_version_number	IGS_PE_ALTERNATV_EXT.version_number%TYPE) IS
1238   		SELECT	'x'
1239   		FROM	IGS_PE_ALTERNATV_EXT	ae
1240   		WHERE	ae.course_cd		= p_course_cd AND
1241   			ae.version_number	= cp_version_number AND
1242   			ae.exit_course_cd	= p_award_course_cd;
1243   BEGIN
1244   	-- Set the default message number
1245   	p_message_name := NULL;
1246   	IF p_person_id IS NULL OR
1247   			p_course_cd IS NULL OR
1248   			p_award_cd IS NULL THEN
1249   		RETURN TRUE;
1250   	END IF;
1251   	-- Get the student course attempt course version number
1252   	OPEN c_sca;
1253   	FETCH c_sca INTO v_sca_version_number;
1254   	IF c_sca%NOTFOUND THEN
1255   		CLOSE c_sca;
1256   		RAISE NO_DATA_FOUND;
1257   	END IF;
1258   	CLOSE c_sca;
1259   	IF p_award_course_cd <> p_course_cd OR
1260   			p_award_crs_version_number <> v_sca_version_number THEN
1261   		-- check for a match with an alternative exit
1262   		OPEN c_ae(v_sca_version_number);
1263   		FETCH c_ae INTO v_ae_exists;
1264   		IF c_ae%NOTFOUND THEN
1265   			CLOSE c_ae;
1266   			p_message_name := 'IGS_GR_NOT_A_VALID_AWARD';
1267   			RETURN FALSE;
1268   		END IF;
1269   		CLOSE c_ae;
1270   	END IF;
1271   	-- Return the default value
1272   	RETURN TRUE;
1273   EXCEPTION
1274   	WHEN OTHERS THEN
1275   		IF c_sca%ISOPEN THEN
1276   			CLOSE c_sca;
1277   		END IF;
1278   		IF c_ae%ISOPEN THEN
1279   			CLOSE c_ae;
1280   		END IF;
1281   		RAISE;
1282   END;
1283   EXCEPTION
1284   	WHEN OTHERS THEN
1285        		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
1286        		IGS_GE_MSG_STACK.ADD;
1287        		App_Exception.Raise_Exception;
1288   END grdp_val_gr_caw;
1289   --
1290   -- Validate if graduand approval status is closed.
1291   FUNCTION grdp_val_gas_closed(
1292   p_graduand_appr_status  IGS_GR_APRV_STAT.graduand_appr_status%TYPE ,
1293   p_message_name OUT NOCOPY VARCHAR2 )
1294   RETURN BOOLEAN AS
1295   BEGIN	-- grdp_val_gas_closed
1296   	-- Validate if the graduand approval status is closed
1297   DECLARE
1298   	v_gas_found	VARCHAR2(1);
1299   	CURSOR	c_gas IS
1300   		SELECT	'x'
1301   		FROM	IGS_GR_APRV_STAT	gas
1302   		WHERE	gas.graduand_appr_status	= p_graduand_appr_status AND
1303   			gas.closed_ind			= 'Y';
1304   BEGIN
1305   	p_message_name := NULL;
1306   	OPEN c_gas;
1307   	FETCH c_gas INTO v_gas_found;
1308   	IF (c_gas%FOUND) THEN
1309   		CLOSE c_gas;
1310   		p_message_name := 'IGS_GR_GRAD_APPR_STATUS_CLOSE';
1311   		RETURN FALSE;
1312   	END IF;
1313   	CLOSE c_gas;
1314   	RETURN TRUE;
1315   EXCEPTION
1316   	WHEN OTHERS THEN
1317   		IF c_gas%ISOPEN THEN
1318   			CLOSE c_gas;
1319   		END IF;
1320   	RAISE;
1321   END;
1322   EXCEPTION
1323   	WHEN OTHERS THEN
1324        		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
1325        		IGS_GE_MSG_STACK.ADD;
1326        		App_Exception.Raise_Exception;
1327   END grdp_val_gas_closed;
1328   --
1329   -- Validate if graduand status is closed.
1330   FUNCTION grdp_val_gst_closed(
1331   p_graduand_status  IGS_GR_STAT.graduand_status%TYPE ,
1332   p_message_name OUT NOCOPY VARCHAR2 )
1333   RETURN BOOLEAN AS
1334   BEGIN	-- grdp_val_gst_closed
1335   	-- Validate if the graduand status is closed
1336   DECLARE
1337   	v_gst_found	VARCHAR2(1);
1338   	CURSOR	c_gst IS
1339   		SELECT	'x'
1340   		FROM	IGS_GR_STAT	gst
1341   		WHERE	gst.graduand_status	= p_graduand_status AND
1342   			gst.closed_ind		= 'Y';
1343   BEGIN
1344   	p_message_name := NULL;
1345   	OPEN c_gst;
1346   	FETCH c_gst INTO v_gst_found;
1347   	IF (c_gst%FOUND) THEN
1348   		CLOSE c_gst;
1349   		p_message_name := 'IGS_GR_GRAD_STATUS_CLOSED';
1350   		RETURN FALSE;
1351   	END IF;
1352   	CLOSE c_gst;
1353   	RETURN TRUE;
1354   EXCEPTION
1355   	WHEN OTHERS THEN
1356   		IF c_gst%ISOPEN THEN
1357   			CLOSE c_gst;
1358   		END IF;
1359   		RAISE;
1360   END;
1361   EXCEPTION
1362   	WHEN OTHERS THEN
1363        		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
1364        		IGS_GE_MSG_STACK.ADD;
1365        		App_Exception.Raise_Exception;
1366   END grdp_val_gst_closed;
1367   --
1368   --validate if IGS_GR_HONOURS_LEVEL.honours_level is closed
1369   FUNCTION grdp_val_hl_closed(
1370   p_honours_level IN VARCHAR2 DEFAULT NULL,
1371   p_message_name OUT NOCOPY VARCHAR2 )
1372   RETURN BOOLEAN AS
1373   BEGIN
1374           RETURN FALSE;
1375   END grdp_val_hl_closed;
1376   --
1377   -- Validate graduand surrender for award.
1378   FUNCTION GRDP_VAL_GR_SUR_CAW(
1379   p_person_id  IGS_GR_GRADUAND_ALL.person_id%TYPE ,
1380   p_course_cd  IGS_GR_GRADUAND_ALL.course_cd%TYPE ,
1381   p_graduand_status  IGS_GR_GRADUAND_ALL.graduand_status%TYPE ,
1382   p_sur_for_course_cd  IGS_GR_GRADUAND_ALL.sur_for_course_cd%TYPE ,
1383   p_sur_for_crs_version_num  IGS_GR_GRADUAND_ALL.sur_for_crs_version_number%TYPE ,
1384   p_sur_for_award_cd  IGS_GR_GRADUAND_ALL.sur_for_award_cd%TYPE ,
1385   p_message_name OUT NOCOPY VARCHAR2 )
1386   RETURN BOOLEAN AS
1387   BEGIN	-- grdp_val_gr_sur_caw
1388   DECLARE
1389   	v_gst_s_graduand_status		IGS_GR_STAT.s_graduand_status%TYPE;
1390   	cst_graduated			CONSTANT VARCHAR2(9) := 'GRADUATED';
1391   	cst_surrender			CONSTANT VARCHAR2(9) := 'SURRENDER';
1392   	v_sca_exists			CHAR(1);
1393   	CURSOR c_gst IS
1394   		SELECT	gst.s_graduand_status
1395   		FROM	IGS_GR_STAT gst
1396   		WHERE	gst.graduand_status = p_graduand_status;
1397   	CURSOR c_sca IS
1398   		SELECT	'x'
1399   		FROM	IGS_EN_STDNT_PS_ATT	sca
1400   		WHERE	sca.person_id = p_person_id AND
1401   			sca.course_cd = p_sur_for_course_cd AND
1402   			sca.version_number = p_sur_for_crs_version_num;
1403   BEGIN
1404   	-- Set the default message number
1405   	p_message_name := NULL;
1406   	--1. Check parameters
1407   	IF p_person_id IS NULL OR
1408      		p_course_cd IS NULL OR
1409      		p_graduand_status IS NULL OR
1410      		p_sur_for_course_cd IS NULL OR
1411   		p_sur_for_crs_version_num IS NULL OR
1412   		p_sur_for_award_cd IS NULL THEN
1413   		RETURN TRUE;
1414   	END IF;
1415   	--2. Validate surrending for course is not the same as the
1416   	--   surrendering course
1417   	IF p_sur_for_course_cd = p_course_cd THEN
1418   		p_message_name := 'IGS_GR_CANNOT_SUBMIT_SAME_COU';
1419   		RETURN FALSE;
1420   	END IF;
1421   	--3. When surrendering check the 'surrender for' course matches a
1422   	--   student course attempt belonging to the graduand
1423   	OPEN c_gst;
1424   	FETCH c_gst INTO v_gst_s_graduand_status;
1425   	IF c_gst%NOTFOUND THEN
1426   		CLOSE c_gst;
1427   		RAISE NO_DATA_FOUND;
1428   	END IF;
1429   	CLOSE c_gst;
1430   	IF v_gst_s_graduand_status IN(
1431   				cst_graduated,
1432   				cst_surrender) THEN
1433   		-- check a related student course attempt exist
1434   		OPEN c_sca;
1435   		FETCH c_sca INTO v_sca_exists;
1436   		IF c_sca%NOTFOUND THEN
1437   			CLOSE c_sca;
1438   			p_message_name := 'IGS_GR_INVALID_COURSE_ATTEMPT';
1439   			RETURN FALSE;
1440   		END IF;
1441   		CLOSE c_sca;
1442   	END IF;
1443   	--4.	Return no error
1444   	RETURN TRUE;
1445   EXCEPTION
1446   	WHEN OTHERS THEN
1447   		IF c_gst %ISOPEN THEN
1448   			CLOSE c_gst;
1449   		END IF;
1450   		IF c_sca %ISOPEN THEN
1451   			CLOSE c_sca;
1452   		END IF;
1453   		RAISE;
1454   END;
1455   EXCEPTION
1456   	WHEN OTHERS THEN
1457        		Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
1458        		IGS_GE_MSG_STACK.ADD;
1459        		App_Exception.Raise_Exception;
1460   END grdp_val_gr_sur_caw;
1461 END IGS_GR_VAL_GR;