DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGS_RE_VAL_MIL

Source


1 PACKAGE BODY IGS_RE_VAL_MIL AS
2 /* $Header: IGSRE09B.pls 120.0 2005/06/01 16:27:42 appldev noship $ */
3   -------------------------------------------------------------------------------------------
4   --Change History:
5   --Who         When            What
6   --smadathi    25-AUG-2001     Bug No. 1956374 .The function GENP_VAL_SDTT_SESS removed
7   --vkarthik    23-Apr-2004     Removed validations that checks for the milestone due date to be greater than sysdate
8   --                            in RESP_VAL_MIL_DUE
9   -------------------------------------------------------------------------------------------
10   -- To validate the logical uniqueness of IGS_PR_MILESTONEs
11   FUNCTION RESP_VAL_MIL_UNIQ(
12   p_person_id IN NUMBER ,
13   p_ca_sequence_number IN NUMBER ,
14   p_message_name OUT NOCOPY VARCHAR2 )
15   RETURN BOOLEAN AS
16   BEGIN	-- resp_val_mil_uniq
17   	-- Validate that there are no ?logically? duplicate IGS_PR_MILESTONE records
18   	-- for a candidate, where the IGS_PR_MILESTONE type and due date are the same.
19   DECLARE
20   	v_return_false	BOOLEAN;
21   	CURSOR c_mil IS
22   	SELECT	count('x') duplicate_cnt
23   	FROM	IGS_PR_MILESTONE	mil
24   	WHERE	mil.person_id		= p_person_id and
25   		mil.ca_sequence_number	= p_ca_sequence_number
26   	GROUP BY
27   		mil.milestone_type,
28   		mil.due_dt;
29   BEGIN
30   	-- Set the default message number
31   	p_message_name := null;
32   	-- To quit out NOCOPY of the for loop
33   	v_return_false := FALSE;
34   	FOR v_mil_rec IN c_mil LOOP
35   		IF v_mil_rec.duplicate_cnt > 1 THEN
36   			p_message_name := 'IGS_RE_2_MILSTON_HAV_SAMEDUE';
37   			v_return_false := TRUE;
38   			EXIT;
39   		END IF;
40   	END LOOP;
41   	IF v_return_false THEN
42   		RETURN FALSE;
43   	END IF;
44   	RETURN TRUE;
45   EXCEPTION
46   	WHEN OTHERS THEN
47   		IF c_mil%ISOPEN THEN
48   			CLOSE c_mil;
49   		END IF;
50   		RAISE;
51   END;
52   EXCEPTION
53 	WHEN OTHERS THEN
54 		Fnd_Message.Set_Name ('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
55 		IGS_GE_MSG_STACK.ADD;
56 		App_Exception.Raise_Exception;
57   END resp_val_mil_uniq;
58   --
59   -- To validate the delete of IGS_PR_MILESTONE details
60   FUNCTION RESP_VAL_MIL_DEL(
61   p_person_id IN NUMBER ,
62   p_ca_sequence_number IN NUMBER ,
63   p_sequence_number IN NUMBER ,
64   p_milestone_status IN VARCHAR2 ,
65   p_message_name OUT NOCOPY VARCHAR2 )
66   RETURN BOOLEAN AS
67   BEGIN 	-- resp_val_mil_del
68   	-- Validate deletion of IGS_PR_MILESTONE record, checking for:
69   	-- * Cannot delete IGS_PR_MILESTONE if status <> 'PLANNED'
70   	-- * Cannot delete IGS_PR_MILESTONE which has had a status other than planned
71   DECLARE
72   	cst_planned	CONSTANT	IGS_PR_MILESTONE.milestone_status%TYPE := 'PLANNED';
73   	cst_replanned	CONSTANT	IGS_PR_MILESTONE.milestone_status%TYPE := 'RE-PLANNED';
74   	cst_achieved	CONSTANT	IGS_PR_MILESTONE.milestone_status%TYPE := 'ACHIEVED';
75   	v_s_milestone_status		IGS_PR_MS_STAT.s_milestone_status%TYPE;
76   	v_milh_mst_exists		VARCHAR2(1);
77   	CURSOR c_mst IS
78   		SELECT	mst.s_milestone_status
79   		FROM	IGS_PR_MS_STAT	mst
80   		WHERE	mst.milestone_status	= p_milestone_status;
81   	CURSOR c_milh_mst IS
82   		SELECT	'x'
83   		FROM	IGS_PR_MILESTONE_HST	milh,
84   			IGS_PR_MS_STAT	mst
85   		WHERE	milh.person_id		= p_person_id AND
86   			milh.ca_sequence_number	= p_ca_sequence_number AND
87   			milh.sequence_number	= p_sequence_number AND
88   			milh.milestone_status	IS NOT NULL AND
89   			mst.milestone_status	= milh.milestone_status AND
90   			mst.s_milestone_status	IN (
91   						cst_planned,
92   						cst_replanned,
93   						cst_achieved);
94   BEGIN
95   	-- Set the default message number
96   	p_message_name := null;
97   	-- Select detail from IGS_PR_MILESTONE status
98   	OPEN c_mst;
99   	FETCH c_mst INTO v_s_milestone_status;
100   	IF c_mst%FOUND THEN
101   		CLOSE c_mst;
102   		-- If not planned then reject
103   		IF v_s_milestone_status <> cst_planned THEN
104   			p_message_name := 'IGS_RE_PLAN_MILESTON_CAN_DEL';
105   			RETURN FALSE;
106   		END IF;
107   		-- if ever been other than planned then reject
108   		OPEN c_milh_mst;
109   		FETCH c_milh_mst INTO v_milh_mst_exists;
110   		IF c_milh_mst%FOUND THEN
111   			CLOSE c_milh_mst;
112   			p_message_name := 'IGS_RE_CANT_DEL_MILESTONE';
113   			RETURN FALSE;
114   		END IF;
115   		CLOSE c_milh_mst;
116   	ELSE
117   		CLOSE c_mst;
118   	END IF;
119   	RETURN TRUE ;
120   EXCEPTION
121   	WHEN OTHERS THEN
122   		IF c_mst%ISOPEN THEN
123   			CLOSE c_mst;
124   		END IF;
125   		IF c_milh_mst%ISOPEN THEN
126   			CLOSE c_milh_mst;
127   		END IF;
128   		RAISE;
129   END;
130   EXCEPTION
131 	WHEN OTHERS THEN
132 		Fnd_Message.Set_Name ('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
133 		IGS_GE_MSG_STACK.ADD;
134 		App_Exception.Raise_Exception;
135   END resp_val_mil_del;
136   --
137   -- To  validate IGS_PR_MILESTONE actual date reached
138   FUNCTION RESP_VAL_MIL_ACTUAL(
139   p_milestone_status IN VARCHAR2 ,
140   p_actual_reached_dt IN DATE ,
141   p_message_name OUT NOCOPY VARCHAR2 )
142   RETURN BOOLEAN AS
143   BEGIN	-- resp_val_mil_actual
144   	-- Purpose: Briefly explain the functionality of the function
145   	-- Validate the IGS_PR_MILESTONE.actual_dt_reached, checking for:
146   	--	- Cannot be a future date
147   	--	- Can only be set when IGS_PR_MILESTONE status is ACHIEVED or FAILED
148   	--	- Must be set when IGS_PR_MILESTONE status is ACHIEVED or FAILED
149   DECLARE
150   	CURSOR c_mst IS
151   		SELECT	mst.s_milestone_status
152   		FROM	IGS_PR_MS_STAT	mst
153   		WHERE	mst.milestone_status	= p_milestone_status;
154   	v_mst_status	IGS_PR_MS_STAT.s_milestone_status%TYPE;
155   	cst_achieved	CONSTANT IGS_PR_MS_STAT.s_milestone_status%TYPE := 'ACHIEVED';
156   	cst_failed	CONSTANT IGS_PR_MS_STAT.s_milestone_status%TYPE := 'FAILED';
157   BEGIN
158   	-- Set the default message number
159   	p_message_name := null;
160   	-- Cursor handling
161   	OPEN c_mst;
162   	FETCH c_mst INTO v_mst_status;
163   	IF c_mst%NOTFOUND THEN
164   		CLOSE c_mst;
165   		RETURN TRUE;
166   	END IF;
167   	CLOSE c_mst;
168   	IF p_actual_reached_dt IS NOT NULL THEN
169   		IF v_mst_status NOT IN (
170   					cst_achieved,
171   					cst_failed) THEN
172   			p_message_name := 'IGS_RE_CANT_SET_MILESTONE';
173   			RETURN FALSE;
174   		END IF;
175   		IF p_actual_reached_dt > TRUNC(SYSDATE) THEN
176   			p_message_name := 'IGS_RE_ACTUAL_DT_CANT_FUT_DT';
177   			RETURN FALSE;
178   		END IF;
179   	ELSE -- p_actual_reached_dt IS NULL
180   		IF v_mst_status IN (
181   				cst_achieved,
182   				cst_failed) THEN
183   			p_message_name := 'IGS_RE_SET_ACTUAL_DATE';
184   			RETURN FALSE;
185   		END IF;
186   	END IF;
187   	-- Return the default value
188   	RETURN TRUE;
189   EXCEPTION
190   	WHEN OTHERS THEN
191   		IF c_mst%ISOPEN THEN
192   			CLOSE c_mst;
193   		END IF;
194   		RAISE;
195   END;
196   EXCEPTION
197 	WHEN OTHERS THEN
198 		Fnd_Message.Set_Name ('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
199 		IGS_GE_MSG_STACK.ADD;
200 		App_Exception.Raise_Exception;
201   END resp_val_mil_actual;
202   --
203   -- To validate IGS_PR_MILESTONE notification days
204   FUNCTION RESP_VAL_MIL_DAYS(
205   p_milestone_type IN VARCHAR2 ,
206   p_milestone_status IN VARCHAR2 ,
207   p_due_dt IN DATE ,
208   p_old_imminent_days IN NUMBER ,
209   p_new_imminent_days IN NUMBER ,
210   p_old_reminder_days IN NUMBER ,
211   p_new_reminder_days IN NUMBER ,
212   p_old_re_reminder_days IN NUMBER ,
213   p_new_re_reminder_days IN NUMBER ,
214   p_message_name OUT NOCOPY VARCHAR2 )
215   RETURN BOOLEAN AS
216   BEGIN	-- resp_val_mil_days
217   	-- Validate the IGS_PR_MILESTONE.{ovrd_ntfctn_imminent_days,
218   	--	ovrd_ntfctn_reminder_days, ovrd_ntfctn_re_reminder_days}
219   	--	fields, checking,
220   	-- Can only be changed if s_milestone_status is ?PLANNED? or ?RE-PLANNED?.
221   	-- The imminent_days cannot be changed to bring the notification days
222   	--	prior to the current date.
223   	-- The re_reminder_days can only be set if the reminder_days are set.
224   DECLARE
225   	cst_planned	CONSTANT	IGS_PR_MS_STAT.s_milestone_status%TYPE := 'PLANNED';
226   	cst_replanned	CONSTANT
227   					IGS_PR_MS_STAT.s_milestone_status%TYPE := 'RE-PLANNED';
228   	v_mst_status	IGS_PR_MS_STAT.s_milestone_status%TYPE;
229   	CURSOR c_mst IS
230   		SELECT	mst.s_milestone_status
231   		FROM	IGS_PR_MS_STAT	mst
232   		WHERE	mst.milestone_status	= p_milestone_status;
233   	v_mty_nrd	IGS_PR_MILESTONE.ovrd_ntfctn_reminder_days%TYPE;
234   	v_mty_nrrd	IGS_PR_MILESTONE.ovrd_ntfctn_re_reminder_days%TYPE;
235   	CURSOR c_mty IS
236   		SELECT	mty.ntfctn_re_reminder_days,
237   			mty.ntfctn_reminder_days
238   		FROM	IGS_PR_MILESTONE_TYP		mty
239   		WHERE	mty.milestone_type	= p_milestone_type;
240   BEGIN
241   	-- Set the default message number
242   	p_message_name := null;
243   	-- Cursor handling
244   	OPEN c_mst ;
245   	FETCH c_mst INTO v_mst_status;
246   	IF c_mst%NOTFOUND THEN
247   		CLOSE c_mst;
248   		-- invalid data
249   		RETURN TRUE;
250   	END IF;
251   	CLOSE c_mst;
252   	IF v_mst_status NOT IN (cst_planned,
253   				cst_replanned) AND
254   			(NVL(p_old_imminent_days,0) <> NVL(p_new_imminent_days,0) OR
255   			NVL(p_old_reminder_days,0) <> NVL(p_new_reminder_days,0) OR
256   			NVL(p_old_re_reminder_days,0) <> NVL(p_new_re_reminder_days,0)) THEN
257   		p_message_name := 'IGS_RE_CANT_CHANGE_NOTIF_DAYS';
258   		RETURN FALSE;
259   	END IF;
260   	IF NVL(p_old_imminent_days,0) <> NVL(p_new_imminent_days,0) THEN
261   		IF (p_due_dt - p_new_imminent_days) < TRUNC(SYSDATE) THEN
262   			p_message_name := 'IGS_RE_CANT_CHANG_IMMINENT_DY';
263   			RETURN FALSE;
264   		END IF;
265   	END IF;
266   	IF NVL(p_old_reminder_days,0) <> NVL(p_new_reminder_days,0) OR
267   			NVL(p_old_re_reminder_days,0) <> NVL(p_new_re_reminder_days,0) THEN
268   		OPEN c_mty;
269   		FETCH c_mty INTO v_mty_nrrd, v_mty_nrd;
270   		IF c_mty%NOTFOUND THEN
271   			CLOSE c_mty;
272   			-- invalid parameters
273   			RETURN TRUE;
274   		END IF;
275   		CLOSE c_mty;
276   		IF NVL(p_new_re_reminder_days,v_mty_nrrd) IS NOT NULL AND
277   				NVL(p_new_reminder_days,v_mty_nrd) IS NULL THEN
278   			p_message_name := 'IGS_RE_CANT_ENTER_REMINDER_DY';
279   			RETURN FALSE;
280   		END IF;
281   	END IF;
282   	-- Return the default value
283   	RETURN TRUE;
284   EXCEPTION
285   	WHEN OTHERS THEN
286   		IF c_mst %ISOPEN THEN
287   			CLOSE c_mst;
288   		END IF;
289   		RAISE;
290   END;
291   EXCEPTION
292 	WHEN OTHERS THEN
293 		Fnd_Message.Set_Name ('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
294 		IGS_GE_MSG_STACK.ADD;
295 		App_Exception.Raise_Exception;
296   END resp_val_mil_days;
297   --
298   -- To validate IGS_PR_MILESTONE due date
299   FUNCTION RESP_VAL_MIL_DUE(
300   p_person_id IN NUMBER ,
301   p_ca_sequence_number IN NUMBER ,
302   p_sequence_number IN NUMBER ,
303   p_old_milestone_status IN VARCHAR2 ,
304   p_new_milestone_status IN VARCHAR2 ,
305   p_old_due_dt IN DATE ,
306   p_new_due_dt IN DATE ,
307   p_message_name OUT NOCOPY VARCHAR2 )
308   RETURN BOOLEAN AS
309   BEGIN	-- resp_val_mil_due
310   	-- Validate IGS_PR_MILESTONE.due_dt checking for,
311   	--	If the IGS_PR_MILESTONE status has been changed to RE-PLANNED then
312   	--		the due_dt must have been changed.
313   DECLARE
314   	cst_planned	CONSTANT	IGS_PR_MS_STAT.s_milestone_status%TYPE := 'PLANNED';
315   	cst_replanned	CONSTANT	IGS_PR_MS_STAT.s_milestone_status%TYPE := 'RE-PLANNED';
316   	CURSOR c_mil IS
317   		SELECT	mil.due_dt
318   		FROM	IGS_PR_MILESTONE mil
319   		WHERE	mil.person_id	= p_person_id	AND
320   			mil.ca_sequence_number	= p_ca_sequence_number	AND
321   			NVL(mil.preced_sequence_number,0)	= p_sequence_number;
322   BEGIN
323   	-- Set the default message number
324   	p_message_name := null;
325   	IF NVL(p_old_due_dt, IGS_GE_DATE.IGSDATE('1900/01/01')) <>
326   					p_new_due_dt THEN
327   		FOR v_mil_rec IN c_mil
328   		LOOP
329   			IF p_new_due_dt > v_mil_rec.due_dt THEN
330   				p_message_name := 'IGS_RE_DUE_DT_GT_ANOT_MILSTON';
331   				RETURN TRUE;
332   			END IF;
333   		END LOOP;
334   	END IF;
335   	-- Return the default value
336   	RETURN TRUE;
337   END;
338   EXCEPTION
339 	WHEN OTHERS THEN
340 		Fnd_Message.Set_Name ('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
341 		IGS_GE_MSG_STACK.ADD;
342 		App_Exception.Raise_Exception;
343   END resp_val_mil_due;
344   --
345   -- To validate IGS_PR_MILESTONE status
346   FUNCTION RESP_VAL_MIL_MST(
347   p_person_id IN NUMBER ,
348   p_ca_sequence_number IN NUMBER ,
349   p_preced_sequence_number IN NUMBER ,
350   p_old_milestone_status IN VARCHAR2 ,
351   p_new_milestone_status IN VARCHAR2 ,
352   p_old_due_dt IN DATE ,
353   p_new_due_dt IN DATE ,
354   p_validation_level IN VARCHAR2 ,
355   p_message_name OUT NOCOPY VARCHAR2 )
356   RETURN BOOLEAN AS
357   BEGIN	-- resp_val_mil_mst
358   	-- Validate IGS_PR_MILESTONE.IGS_PR_MS_STAT, checking for :
359   	--	Closed IGS_PR_MILESTONE status.
360   DECLARE
361   	cst_planned		CONSTANT	VARCHAR2(10) := 'PLANNED';
362   	cst_replanned	CONSTANT	VARCHAR2(10) := 'RE-PLANNED';
363   	cst_failed		CONSTANT	VARCHAR2(10) := 'FAILED';
364   	cst_achieved	CONSTANT	VARCHAR2(10) := 'ACHIEVED';
365   	CURSOR c_mst (
366   		cp_milestone_status		IGS_PR_MILESTONE.milestone_status%TYPE) IS
367   		SELECT	s_milestone_status,
368   			closed_ind
369   		FROM	IGS_PR_MS_STAT	mst
370   		WHERE	mst.milestone_status	= cp_milestone_status;
371   	CURSOR	c_mil IS
372   		SELECT	mst.s_milestone_status
373   		FROM	IGS_PR_MILESTONE mil,
374   			IGS_PR_MS_STAT mst
375   		WHERE	mil.person_id	= p_person_id	AND
376   			mil.ca_sequence_number	= p_ca_sequence_number	AND
377   			mil.sequence_number	= p_preced_sequence_number AND
378   			mst.milestone_status	= mil.milestone_status;
379   	v_old_mst_rec	c_mst%ROWTYPE;
380   	v_new_mst_rec	c_mst%ROWTYPE;
381   	v_s_milestone_status	IGS_PR_MS_STAT.s_milestone_status%TYPE;
382   BEGIN
383     	-- Set the default message number
384     	p_message_name := null;
385     	OPEN c_mst (p_new_milestone_status);
386     	FETCH c_mst INTO v_new_mst_rec;
387   	IF c_mst%NOTFOUND THEN
388   		CLOSE c_mst;
389   		RETURN TRUE;
390   	END IF;
391   	CLOSE c_mst;
392   	IF p_validation_level in ('ITEM','TRIGGER') THEN
393   		-- 2. Check for close IGS_PR_MILESTONE status
394     		IF v_new_mst_rec.closed_ind = 'Y' THEN
395   	  		CLOSE c_mst;
396     			p_message_name := 'IGS_RE_MILSTN_STAT_CLOSED';
397     			RETURN FALSE;
398   		END IF;
399     	END IF;
400   	IF p_old_milestone_status IS NOT NULL THEN
401   		OPEN c_mst (p_old_milestone_status);
402   		FETCH c_mst INTO v_old_mst_rec;
403   		IF c_mst%NOTFOUND THEN
404   			CLOSE c_mst;
405   			RETURN TRUE;
406   		END IF;
407   		CLOSE c_mst;
408   	END IF;
409   	IF p_validation_level in ('RECORD','TRIGGER') THEN
410   		-- 3. Check whether being re-planned and date has changed.
411   		If v_new_mst_rec.s_milestone_status = cst_replanned AND
412   			v_old_mst_rec.s_milestone_status <> cst_replanned AND
413   			NVL(p_old_due_dt,IGS_GE_DATE.IGSDATE('1900/01/01')) = p_new_due_dt THEN
414   				p_message_name := 'IGS_RE_DUE_DT_MUST_BE_CHANGED';
415   				RETURN FALSE;
416   		END IF;
417   	END IF;
418   	IF p_validation_level in ('ITEM','TRIGGER') THEN
419   		-- 4. Check status of preceding IGS_PR_MILESTONE.
420   		If NVL(p_old_milestone_status, ' ') <> p_new_milestone_status AND
421   			p_preced_sequence_number IS NOT NULL AND
422   			v_new_mst_rec.s_milestone_status IN (cst_achieved,cst_failed) THEN
423   				OPEN	c_mil;
424   				FETCH	c_mil INTO v_s_milestone_status;
425   				IF c_mil%FOUND THEN
426   					CLOSE c_mil;
427   					IF v_s_milestone_status IN (cst_planned,cst_replanned) THEN
428   						p_message_name := 'IGS_RE_CUR_MILST_SET_ACH/FAIL';
429   						RETURN TRUE;			-- Warning Only
430   					END IF;
431   				ELSE
432   					CLOSE c_mil;
433   				END IF;
434   		END IF;
435   	END IF;
436     	RETURN TRUE;
437     EXCEPTION
438     	WHEN OTHERS THEN
439     		IF c_mst%ISOPEN THEN
440     			CLOSE c_mst;
441     		END IF;
442     		IF c_mil%ISOPEN THEN
443     			CLOSE c_mil;
444     		END IF;
445     		RAISE;
446    END;
447    EXCEPTION
448 	WHEN OTHERS THEN
449 		Fnd_Message.Set_Name ('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
450 		IGS_GE_MSG_STACK.ADD;
451 		App_Exception.Raise_Exception;
452    END resp_val_mil_mst;
453   --
454   -- To validate IGS_PR_MILESTONE type
455   FUNCTION RESP_VAL_MIL_MTY(
456   p_milestone_type IN VARCHAR2 ,
457   p_message_name OUT NOCOPY VARCHAR2 )
458   RETURN BOOLEAN AS
459   BEGIN	-- resp_val_mil_mty
460   	-- Validate the IGS_PR_MILESTONE type, checking for :
461   	-- 	That the IGS_PR_MILESTONE type is not closed.
462   DECLARE
463   	CURSOR c_mty IS
464   		SELECT 'x'
465   		FROM	IGS_PR_MILESTONE_TYP	mty
466   		WHERE	mty.milestone_type	= p_milestone_type AND
467   			mty.closed_ind		= 'Y';
468   	v_mty_exists	VARCHAR2(1);
469   BEGIN
470   	-- Set the default message number
471   	p_message_name := null;
472   	-- check for closed IGS_PR_MILESTONE type
473   	OPEN c_mty;
474   	FETCH c_mty INTO v_mty_exists;
475   	IF c_mty%FOUND THEN
476   		CLOSE c_mty;
477   		p_message_name := 'IGS_RE_MILSTN_TYPE_CLOSED';
478   		RETURN FALSE;
479   	END IF;
480   	CLOSE c_mty;
481   	RETURN TRUE;
482   EXCEPTION
483   	WHEN OTHERS THEN
484   		IF c_mty%ISOPEN THEN
485   			CLOSE c_mty;
486   		END IF;
487   		RAISE;
488   END;
489   EXCEPTION
490 	WHEN OTHERS THEN
491 		Fnd_Message.Set_Name ('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
492 		IGS_GE_MSG_STACK.ADD;
493 		App_Exception.Raise_Exception;
494   END resp_val_mil_mty;
495   --
496   -- To validate IGS_PR_MILESTONE preceding sequence number
497   FUNCTION RESP_VAL_MIL_PRCD(
498   p_person_id IN NUMBER ,
499   p_ca_sequence_number IN NUMBER ,
500   p_sequence_number IN NUMBER ,
501   p_due_dt IN DATE ,
502   p_preced_sequence_number IN NUMBER ,
503   p_message_name OUT NOCOPY VARCHAR2 )
504   RETURN BOOLEAN AS
505   BEGIN	-- resp_val_mil_prcd
506   	-- Validate the preceeding IGS_PR_MILESTONE details, checking for:
507   	--	Cannot link a IGS_PR_MILESTONE to itself.
508   	--	Cannot link a IGS_PR_MILESTONE to a IGS_PR_MILESTONE with due_dt
509   	--		less than the current record.
510   DECLARE
511   	v_mil_due_dt	IGS_PR_MILESTONE.due_dt%TYPE;
512   	CURSOR c_mil IS
513   		SELECT	mil.due_dt
514   		FROM	IGS_PR_MILESTONE	mil
515   		WHERE	mil.person_id		= p_person_id AND
516   			mil.ca_sequence_number	= p_ca_sequence_number AND
517   			mil.sequence_number	= p_preced_sequence_number;
518   BEGIN
519   	-- Set the default message number
520   	p_message_name := null;
521   	IF p_sequence_number = p_preced_sequence_number THEN
522   		p_message_name := 'IGS_RE_MILSTN_CANT_PRECED';
523   		RETURN FALSE;
524   	END IF;
525   	-- check that not linked to another IGS_PR_MILESTONE of a lesser date
526   	OPEN c_mil;
527   	FETCH c_mil INTO v_mil_due_dt;
528   	IF c_mil%NOTFOUND THEN
529   		CLOSE c_mil;
530   		-- invalid parameters
531   		RETURN TRUE;
532   	ELSE
533   		CLOSE c_mil;
534   		IF v_mil_due_dt > p_due_dt THEN
535   			p_message_name :='IGS_RE_CANT_PRECED_LATER_DATE';
536   			RETURN FALSE;
537   		END IF;
538   	END IF;
539   	-- Return the default value
540   	RETURN TRUE;
541   EXCEPTION
542   	WHEN OTHERS THEN
543   		IF c_mil %ISOPEN THEN
544   			CLOSE c_mil;
545   		END IF;
546   		RAISE;
547   END;
548   EXCEPTION
549 	WHEN OTHERS THEN
550 		Fnd_Message.Set_Name ('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
551 		IGS_GE_MSG_STACK.ADD;
552 		App_Exception.Raise_Exception;
553   END resp_val_mil_prcd;
554 END IGS_RE_VAL_MIL;