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;