1 PACKAGE BODY Igs_En_Val_Susa AS
2 /* $Header: IGSEN69B.pls 120.3 2006/05/03 23:59:19 smaddali noship $ */
3
4 -------------------------------------------------------------------------------------------
5 --Change History:
6 --Who When What
7 --smadathi 28-AUG-2001 Bug No. 1956374 .The function genp_val_staff_prsn removed
8 -- Also the call to function igs_en_val_susa.genp_val_staff_prsn is
9 -- is replaced by igs_ad_val_acai.genp_val_staff_prsn
10 --smadathi 24-AUG-2001 Bug No. 1956374 .The call to igs_en_val_susa.genp_val_sdtt_sess
11 -- is changed to igs_as_val_suaap.genp_val_sdtt_sess.Also
12 -- Function genp_val_sdtt_sess Removed
13 --msrinivi 27-Aug-2001 Function genp_val_prsn_id removed
14 --prraj 15-Nov-2002 Added p_legacy parameter to functions enrp_val_susa_ins, enrp_val_susa_auth,
15 -- enrp_val_susa_cmplt, enrp_val_susa_sci_sd, enrp_val_susa_cousr, enrp_val_susa_parent,
16 -- enrp_val_susa_end_dt, enrp_val_susa_sci, enrp_val_susa_prmry as part of Legacy
17 -- build Bug# 2661533
18 -------------------------------------------------------------------------------------------
19 --
20 -- Routine to process susa rowids in PL/SQL TABLE for current commit.
21 --
22 -- Routine to clear rowids saved in a PL/SQL TABLE from a prior commit.
23
24 --
25 -- Validate the authorisation fields.
26 FUNCTION enrp_val_susa_auth(
27 p_unit_set_cd IN VARCHAR2 ,
28 p_us_version_number IN NUMBER ,
29 p_end_dt IN IGS_AS_SU_SETATMPT.end_dt%TYPE ,
30 p_authorised_person_id IN NUMBER ,
31 p_authorised_on IN DATE ,
32 p_message_name OUT NOCOPY VARCHAR2,
33 p_legacy IN VARCHAR2)
34 RETURN BOOLEAN AS
35
36 v_message_name VARCHAR2(30);
37 BEGIN -- enrp_val_susa_auth
38 -- This module validates the authorisation fields associated with the
39 -- IGS_AS_SU_SETATMPT:
40 -- - If the authorised_person_id is set, then the authorised_on must also be
41
42 -- set and visa versa.
43 -- - authorised_person_id and authorised_on fields can only be set if the
44 -- end_dt is also set or the IGS_EN_UNIT_SET.authorisation_ind = 'Y'.
45 -- Validate that the person is a staff member.
46 DECLARE
47 v_authorisation_rqrd_ind IGS_EN_UNIT_SET.authorisation_rqrd_ind%TYPE;
48 CURSOR c_us IS
49 SELECT us.authorisation_rqrd_ind
50 FROM IGS_EN_UNIT_SET us
51 WHERE us.unit_set_cd = p_unit_set_cd AND
52 us.version_number = p_us_version_number;
53 BEGIN
54 p_message_name := NULL;
55
56 -- If the authorised_person_id is set, then the authorised_on must also be
57 -- set and visa versa.
58 IF (p_authorised_person_id IS NOT NULL AND
59 p_authorised_on IS NULL) THEN
60 p_message_name := 'IGS_EN_AUTHDT_MUSTBE_SET';
61
62 IF (p_legacy = 'Y') THEN
63 -- Add excep to stack
64 FND_MESSAGE.Set_Name('IGS',p_message_name);
65 FND_MSG_PUB.Add;
66 ELSE
67 RETURN FALSE;
68 END IF;
69
70 END IF;
71
72 IF (p_authorised_person_id IS NULL AND
73 p_authorised_on IS NOT NULL) THEN
74 p_message_name := 'IGS_EN_AUTHDT_NOTBE_AUTHPRSN';
75
76 IF (p_legacy = 'Y') THEN
77 -- Add excep to stack
78 FND_MESSAGE.Set_Name('IGS',p_message_name);
79 FND_MSG_PUB.Add;
80 ELSE
81 RETURN FALSE;
82 END IF;
83
84 END IF;
85
86 -- authorised_person_id and authorised_on fields can only be set if the
87 -- end_dt is also set or the IGS_EN_UNIT_SET.authorisation_ind = 'Y'.
88 IF (p_authorised_person_id IS NOT NULL AND
89 p_end_dt IS NULL) THEN
90 OPEN c_us;
91 FETCH c_us INTO v_authorisation_rqrd_ind;
92 CLOSE c_us;
93 IF (v_authorisation_rqrd_ind = 'N') THEN
94 p_message_name := 'IGS_EN_AUTHDT_AUTHPRSN_SET';
95
96 IF (p_legacy = 'Y') THEN
97 -- Add excep to stack
98 FND_MESSAGE.Set_Name('IGS',p_message_name);
99 FND_MSG_PUB.Add;
100 ELSE
101 RETURN FALSE;
102 END IF;
103
104 END IF;
105 END IF;
106
107 -- Validate that the authorising person is a staff member.
108 IF p_authorised_person_id IS NOT NULL THEN
109 IF igs_ad_val_acai.genp_val_staff_prsn(p_authorised_person_id,
110 v_message_name) = FALSE THEN
111 p_message_name := 'IGS_EN_AUTHORISED_PRSN_NOT';
112
113 IF (p_legacy = 'Y') THEN
114 -- Add excep to stack
115 FND_MESSAGE.Set_Name('IGS',p_message_name);
116 FND_MSG_PUB.Add;
117 ELSE
118 RETURN FALSE;
119 END IF;
120
121 END IF;
122 END IF;
123
124 RETURN TRUE;
125
126 END;
127 EXCEPTION
128 WHEN OTHERS THEN
129 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
130 FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_VAL_SUSA.enrp_val_susa_auth');
131 IGS_GE_MSG_STACK.ADD;
132 App_Exception.Raise_Exception;
133
134 END enrp_val_susa_auth;
135
136
137 --
138 -- Validate the requirement complete fields for IGS_AS_SU_SETATMPT.
139 FUNCTION enrp_val_susa_cmplt(
140 p_rqrmnts_complete_dt IN DATE ,
141 p_rqrmnts_complete_ind IN VARCHAR2,
142 p_student_confirmed_ind IN VARCHAR2,
143 p_message_name OUT NOCOPY VARCHAR2,
144 p_legacy IN VARCHAR2)
145 RETURN BOOLEAN AS
146
147 BEGIN -- enrp_val_susa_cmplt
148 -- This module validates the requirements complete fields
149 -- associated with the IGS_AS_SU_SETATMPT:
150 -- - If the rqrmnts_complete_ind is set, then the rqrmnts_complete_dt
151 -- must also be set and visa versa.
152 -- - rqrmnts_complete_dt and rqrmnts_complete_ind fields can only be
153
154 -- set if the student_confirmed_ind is also set.
155 DECLARE
156 BEGIN
157 p_message_name := NULL;
158
159 -- If the rqrmnts_complete_ind is set, then the rqrmnts_complete_dt
160 -- must also be set and visa versa.
161 IF (p_rqrmnts_complete_ind = 'Y' AND
162 p_rqrmnts_complete_dt IS NULL) THEN
163 p_message_name := 'IGS_EN_COMPL_DT_SET_COMPL_IND';
164
165 IF (p_legacy = 'Y') THEN
166 -- Add excep to stack
167 FND_MESSAGE.Set_Name('IGS',p_message_name);
168 FND_MSG_PUB.Add;
169 ELSE
170 RETURN FALSE;
171 END IF;
172
173 END IF;
174
175 IF (p_rqrmnts_complete_ind = 'N' AND
176 p_rqrmnts_complete_dt IS NOT NULL) THEN
177 p_message_name := 'IGS_EN_COMPLDT_NOTBE_SET_COMP';
178
179 IF (p_legacy = 'Y') THEN
180 -- Add excep to stack
181 FND_MESSAGE.Set_Name('IGS',p_message_name);
182 FND_MSG_PUB.Add;
183 ELSE
184 RETURN FALSE;
185 END IF;
186
187 END IF;
188
189 -- rqrmnts_complete_dt and rqrmnts_complete_ind fields can only be
190 -- set if the student_confirmed_ind is also set.
191 IF (p_rqrmnts_complete_ind = 'Y' AND
192 p_student_confirmed_ind = 'N') THEN
193 p_message_name := 'IGS_EN_SU_SET_MUSTBE_CONFIRME';
194
195 IF (p_legacy = 'Y') THEN
196 -- Add excep to stack
197 FND_MESSAGE.Set_Name('IGS',p_message_name);
198 FND_MSG_PUB.Add;
199 ELSE
200 RETURN FALSE;
201 END IF;
202
203 END IF;
204
205 RETURN TRUE;
206
207 END;
208 EXCEPTION
209 WHEN OTHERS THEN
210 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
211 FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_VAL_SUSA.enrp_val_susa_cmplt');
212 IGS_GE_MSG_STACK.ADD;
213 App_Exception.Raise_Exception;
214
215 END enrp_val_susa_cmplt;
216
217
218
219 FUNCTION ENRP_VAL_SUSA_COUSR(
220 p_person_id IN NUMBER ,
221 p_course_cd IN VARCHAR2 ,
222 p_unit_set_cd IN VARCHAR2 ,
223 p_us_version_number IN NUMBER ,
224 p_parent_unit_set_cd IN VARCHAR2 ,
225 p_parent_sequence_number IN NUMBER ,
226 p_message_type IN VARCHAR2 ,
227 p_message_name OUT NOCOPY VARCHAR2,
228 p_legacy IN VARCHAR2)
229 RETURN BOOLEAN AS
230 gv_other_detail VARCHAR2(255);
231 BEGIN -- enrp_val_susa_cousr
232 -- Validates that the IGS_EN_UNIT_SET being allocated to the IGS_AS_SU_SETATMPT
233 -- is:
234
235 -- * If the unit set is a subordinate within the IGS_PS_OF_UNT_SET_RL
236 -- table, then it must be specified as a child of one of the superior
237 -- units.
238 -- * If the unit set is being specified as a child of another
239 -- IGS_AS_SU_SETATMPT, then then parent unit set version must be
240 -- permitted within the course_off_unit_set_relationship entries
241 DECLARE
242 v_ver_no IGS_EN_STDNT_PS_ATT.version_number%TYPE;
243 v_susa_us_version_no IGS_AS_SU_SETATMPT.us_version_number%TYPE;
244 v_cal_type IGS_EN_STDNT_PS_ATT.cal_type%TYPE;
245 v_only_as_sub_ind IGS_PS_OFR_UNIT_SET.only_as_sub_ind%TYPE;
246 v_check VARCHAR2(1) := NULL;
247 -- Determine if the student's course offering and the course version
248 CURSOR c_sca IS
249 SELECT sca.version_number,
250 sca.cal_type
251 FROM IGS_EN_STDNT_PS_ATT sca
252 WHERE sca.person_id = p_person_id AND
253 sca.course_cd = p_course_cd;
254 CURSOR c_susa IS
255 SELECT susa.us_version_number
256 FROM IGS_AS_SU_SETATMPT susa
257 WHERE susa.person_id = p_person_id AND
258
259 susa.course_cd = p_course_cd AND
260 susa.unit_set_cd = p_parent_unit_set_cd AND
261 susa.sequence_number = p_parent_sequence_number;
262 CURSOR c_cousr(
263 cp_version_number IGS_EN_STDNT_PS_ATT.version_number%TYPE,
264 cp_cal_type IGS_EN_STDNT_PS_ATT.cal_type%TYPE,
265 cp_susa_us_version_number IGS_AS_SU_SETATMPT.us_version_number%TYPE) IS
266 SELECT 'x'
267 FROM IGS_PS_OF_UNT_SET_RL cousr
268 WHERE cousr.course_cd = p_course_cd AND
269 cousr.crv_version_number = cp_version_number AND
270 cousr.cal_type = cp_cal_type AND
271 cousr.sub_unit_set_cd = p_unit_set_cd AND
272 cousr.sub_us_version_number =p_us_version_number AND
273 cousr.sup_unit_set_cd = p_parent_unit_set_cd AND
274 cousr.sup_us_version_number = cp_susa_us_version_number;
275 CURSOR c_cousr2(
276 cp_us_version_number IGS_EN_STDNT_PS_ATT.version_number%TYPE,
277 cp_cal_type IGS_EN_STDNT_PS_ATT.cal_type%TYPE) IS
278 SELECT 'x'
279 FROM IGS_PS_OF_UNT_SET_RL cousr
280 WHERE cousr.course_cd = p_course_cd AND
281 cousr.crv_version_number = cp_us_version_number AND
282
283 cousr.cal_type = cp_cal_type AND
284 cousr.sub_unit_set_cd = p_unit_set_cd AND
285 cousr.sub_us_version_number = p_us_version_number;
286 BEGIN
287 p_message_name := NULL;
288
289 OPEN c_sca;
290 FETCH c_sca INTO v_ver_no,
291 v_cal_type;
292 IF (c_sca%NOTFOUND) THEN
293 CLOSE c_sca;
294 RAISE NO_DATA_FOUND;
295 END IF;
296 CLOSE c_sca;
297
298 -- Validate that if the unit set is being specified as a child of another unit
299 -- set, then the parent unit set version must be permitted within the
300 -- IGS_PS_OF_UNT_SET_RL entries
301 IF (p_parent_unit_set_cd IS NOT NULL OR
302 p_parent_sequence_number IS NOT NULL) THEN
303 OPEN c_susa;
304
305 FETCH c_susa INTO v_susa_us_version_no;
306 IF (c_susa%NOTFOUND) THEN
307 p_message_name := 'IGS_EN_UNIT_SET_NOT_PARENT_EX';
308
309 IF (p_legacy = 'Y') THEN
310 -- Add excep to stack
311 FND_MESSAGE.Set_Name('IGS',p_message_name);
312 FND_MSG_PUB.Add;
313 ELSE
314 CLOSE c_susa;
315 RETURN FALSE;
316 END IF;
317 END IF;
318 CLOSE c_susa;
319
320 OPEN c_cousr (
321 v_ver_no,
322 v_cal_type,
323 v_susa_us_version_no);
324 FETCH c_cousr INTO v_check;
325 IF (c_cousr%NOTFOUND) THEN
326 p_message_name := 'IGS_EN_UNIT_SET_RELATIONSHIP';
327
328 IF (p_legacy = 'Y') THEN
329 -- Add excep to stack
330 FND_MESSAGE.Set_Name('IGS',p_message_name);
331 FND_MSG_PUB.Add;
332 ELSE
333 CLOSE c_cousr;
334 RETURN FALSE;
335 END IF;
336 END IF;
337 CLOSE c_cousr;
338
339 ELSE
340 -- (p_parent_unit_set_cd IS NULL OR p_parent_sequence_number IS NULL)
341 -- Validate that if the IGS_EN_UNIT_SET is defined as a subordinate within
342 -- the IGS_PS_OF_UNT_SET_RL table, then the parent details must be
343
344 -- specified.
345 OPEN c_cousr2(
346 v_ver_no,
347 v_cal_type);
348 FETCH c_cousr2 INTO v_check;
349 IF (c_cousr2%NOTFOUND) THEN
350 CLOSE c_cousr2;
351 p_message_name := NULL;
352 RETURN TRUE;
353 ELSE
354 IF p_message_type = 'W' THEN
355 -- Return the warning message.
356 p_message_name := 'IGS_EN_UNITSET_HAVE_ONE_PAREN';
357
358 IF (p_legacy = 'Y') THEN
359 -- Add excep to stack
360 FND_MESSAGE.Set_Name('IGS',p_message_name);
361 FND_MSG_PUB.Add;
362 END IF;
363 ELSE
364 -- Return the error message.
365 p_message_name := 'IGS_EN_UNIT_SET_PARENT_UNITSE';
366
367 IF (p_legacy = 'Y') THEN
368 -- Add excep to stack
369 FND_MESSAGE.Set_Name('IGS',p_message_name);
370 FND_MSG_PUB.Add;
371 END IF;
372 END IF;
373 CLOSE c_cousr2;
374
375 RETURN FALSE;
376 END IF;
377 CLOSE c_cousr2;
378 END IF;
379 -- If processing successful then
380
381 RETURN TRUE;
382 EXCEPTION
383 WHEN OTHERS THEN
384 IF (c_sca%ISOPEN) THEN
385 CLOSE c_sca;
386 END IF;
387 IF (c_susa%ISOPEN) THEN
388 CLOSE c_susa;
389 END IF;
390 IF (c_cousr2%ISOPEN) THEN
391 CLOSE c_cousr2;
392 END IF;
393 IF (c_cousr%ISOPEN) THEN
394 CLOSE c_cousr;
395 END IF;
396 RAISE;
397 END;
398 EXCEPTION
399 WHEN OTHERS THEN
400 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
401 FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_VAL_SUSA.enrp_val_susa_cousr');
402 IGS_GE_MSG_STACK.ADD;
403 App_Exception.Raise_Exception;
404
405 END enrp_val_susa_cousr;
406
407
408 --
409 -- Validate the student unit set attempt is able to be deleted.
410 FUNCTION ENRP_VAL_SUSA_DEL(
411 p_person_id IN NUMBER ,
412 p_course_cd IN VARCHAR2 ,
413 p_unit_set_cd IN VARCHAR2 ,
414 p_sequence_number IN NUMBER ,
415 p_us_version_number IN NUMBER ,
416 p_end_dt IN DATE ,
417 p_rqrmnts_complete_ind IN VARCHAR2,
418 p_db_trg_call IN VARCHAR2 ,
419 p_message_name OUT NOCOPY VARCHAR2 )
420 RETURN BOOLEAN AS
421 gv_other_detail VARCHAR2(255);
422 BEGIN -- enrp_val_susa_del
423 -- This module validates that the IGS_AS_SU_SETATMPT record being
424 -- deleted meets the following conditions:
425 -- - Cannot be deleted if the unit set has been completed.
426 -- - Cannot be deleted if the unit set has been ended.
427
428 -- - Cannot be deleted if it is the parent of another unit set.
429 -- - Cannot be deleted if it is part of the terms and conditions
430 -- of the admissions offer for the student.
431 DECLARE
432 v_dummy VARCHAR2(1);
433 CURSOR c_susa IS
434 SELECT 'X'
435 FROM IGS_AS_SU_SETATMPT susa
436 WHERE susa.person_id = p_person_id AND
437 susa.course_cd = p_course_cd AND
438 susa.parent_unit_set_cd = p_unit_set_cd AND
439 susa.parent_sequence_number = p_sequence_number;
440 CURSOR c_acai_sca IS
441 SELECT acai.unit_set_cd,
442 acai.us_version_number
443 FROM IGS_AD_PS_APPL_INST acai,
444 IGS_EN_STDNT_PS_ATT sca
445 WHERE sca.person_id = p_person_id AND
446 sca.course_cd = p_course_cd AND
447 acai.person_id = sca.person_id AND
448 acai.admission_appl_number = sca.adm_admission_appl_number AND
449 acai.nominated_course_cd = sca.adm_nominated_course_cd AND
450 acai.sequence_number = sca.adm_sequence_number;
451
452 BEGIN
453 -- Cannot be deleted if the unit set has been completed.
454 IF (p_rqrmnts_complete_ind = 'Y') THEN
455 p_message_name := 'IGS_EN_NOTDEL_UNITSET_COMPL';
456 RETURN FALSE;
457 END IF;
458 -- Cannot be deleted if the unit set has been ended.
459 IF (p_end_dt IS NOT NULL) THEN
460 p_message_name := 'IGS_EN_NOTDEL_UNITSET_ENDED';
461 RETURN FALSE;
462 END IF;
463 -- Check if validation called from the database trigger. If yes, then
464 -- do not execute this query as will cause mutating trigger. The error
465 -- will be trapped by the RI constraints anyway.
466 IF p_db_trg_call = 'N' THEN
467 -- Cannot be deleted if it is the parent of another IGS_EN_UNIT_SET.
468 OPEN c_susa; -- Althogh handled by RI constraints, required for enrp_val_susa.
469 FETCH c_susa INTO v_dummy;
470 IF (c_susa%FOUND) THEN
471 CLOSE c_susa;
472 p_message_name := 'IGS_EN_NOTDEL_UNITSET_PARENT';
473 RETURN FALSE;
474 END IF;
475
476 CLOSE c_susa;
477 END IF;
478 -- Cannot be deleted if it is part of the terms and conditions
479 -- of the admissions offer for the student.
480 -- Determine if unit set is part of the admissions offer
481 IF igs_as_val_suaap.genp_val_sdtt_sess('ADMP_DEL_SCA_UNCONF') THEN
482 FOR v_acai_sca_rec IN c_acai_sca LOOP
483 IF (v_acai_sca_rec.unit_set_cd = p_unit_set_cd AND
484 v_acai_sca_rec.us_version_number = p_us_version_number) THEN
485 p_message_name := 'IGS_EN_NOTDEL_UNITSET_COND';
486 RETURN FALSE;
487 END IF;
488 END LOOP;
489 END IF;
490 p_message_name := NULL;
491 RETURN TRUE;
492 END;
493 EXCEPTION
494 WHEN OTHERS THEN
495 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
496 FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_VAL_SUSA.enrp_val_susa_del');
497 IGS_GE_MSG_STACK.ADD;
498 App_Exception.Raise_Exception;
499
500
501 END enrp_val_susa_del;
502 --
503 -- Validate the date fields associated with a student unit set attempt.
504 FUNCTION ENRP_VAL_SUSA_DTS(
505 p_selection_dt IN DATE ,
506 p_end_dt IN DATE ,
507 p_rqrmnts_complete_dt IN DATE ,
508 p_message_name OUT NOCOPY VARCHAR2 )
509 /* -------------------------------------------------------------------------------------------
510 --Change History:
511 --Who When What
512 --svanukur 12-sep-03 Removed the validation of selection date being greater than
513 -- sysdate as perbug 3106879 to allow selection date to be future dated.
514 -------------------------------------------------------------------------------------------*/
515
516 RETURN BOOLEAN AS
517 gv_other_detail VARCHAR2(255);
518 BEGIN -- enrp_val_susa_dts
519 -- This module validates the date fields associated with the
520 -- IGS_AS_SU_SETATMPT:
521 -- . If end_dt and selection_dt set, then end_dt >= selection_dt.
522 -- . end_dt and rqrmnts_complete_dt cannot both be set.
523 -- . Selection_dt, end_dt, rqrmnts_complete_dt cannot be future dated.
524 -- . If rqrmnts_complete_dt and selection_dt set,
525 -- then rqrmnts_complete_dt >= selection_dt.
526 DECLARE
527 v_sysdate DATE;
528 BEGIN
529 -- If end_dt and selection_dt set, then end_dt >= selection_dt.
530
531 IF p_end_dt IS NOT NULL AND
532 p_selection_dt IS NOT NULL THEN
533 IF p_end_dt < p_selection_dt THEN
534 p_message_name := 'IGS_EN_ENDDT_NOTBE_EARLIER_DT';
535 RETURN FALSE;
536 END IF;
537 END IF;
538 -- Validate that end_dt and rqrmnts_complete_dt cannot both be set.
539 IF p_end_dt IS NOT NULL AND
540 p_rqrmnts_complete_dt IS NOT NULL THEN
541 p_message_name := 'IGS_EN_ENDDT_COMPLDT_NOTSET';
542 RETURN FALSE;
543 END IF;
544 -- end_dt, rqrmnts_complete_dt cannot be future dated.
545 v_sysdate := TRUNC(SYSDATE);
546
547 IF p_end_dt IS NOT NULL THEN
548 IF TRUNC(p_end_dt) > v_sysdate THEN
549
550 p_message_name := 'IGS_EN_ENDDT_LE_CURR_DT';
551 RETURN FALSE;
552 END IF;
553 END IF;
554 IF p_rqrmnts_complete_dt IS NOT NULL THEN
555 IF TRUNC(p_rqrmnts_complete_dt) > v_sysdate THEN
556 p_message_name := 'IGS_EN_COMPLDT_LE_CURR_DT';
557 RETURN FALSE;
558 END IF;
559 END IF;
560 -- If rqrmnts_complete_dt and selection_dt set,
561 -- then rqrmnts_complete_dt >= selection_dt.
562 IF p_rqrmnts_complete_dt IS NOT NULL AND
563 p_selection_dt IS NOT NULL THEN
564 IF p_rqrmnts_complete_dt < p_selection_dt THEN
565 p_message_name := 'IGS_EN_COMPLDT_GE_CURR_DT';
566 RETURN FALSE;
567 END IF;
568 END IF;
569 -- If processing successful then
570 p_message_name := NULL;
571 RETURN TRUE;
572 END;
573
574 EXCEPTION
575 WHEN OTHERS THEN
576 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
577 FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_VAL_SUSA.enrp_val_susa_dts');
578 IGS_GE_MSG_STACK.ADD;
579 App_Exception.Raise_Exception;
580
581 END enrp_val_susa_dts;
582
583
584 --
585 -- Validate the student unit set attempt end date.
586 FUNCTION ENRP_VAL_SUSA_END_DT(
587 p_person_id IN NUMBER ,
588 p_course_cd IN VARCHAR2 ,
589 p_unit_set_cd IN VARCHAR2 ,
590 p_sequence_number IN NUMBER ,
591 p_us_version_number IN NUMBER ,
592 p_end_dt IN DATE ,
593 p_authorised_person_id IN NUMBER ,
594 p_authorised_on IN DATE ,
595 p_parent_unit_set_cd IN VARCHAR2 ,
596 p_parent_sequence_number IN NUMBER ,
597 p_message_type IN VARCHAR2 ,
598 p_message_name OUT NOCOPY VARCHAR2,
599 p_legacy IN VARCHAR2)
600 RETURN BOOLEAN AS
601
602 BEGIN -- enrp_val_susa_end_dt
603 -- This module validates that the end date being altered for the
604 -- IGS_AS_SU_SETATMPT meets the following conditions:
605 -- . If the end date is being set and was specified as part of the students
606 -- offer (the admissions offer relating to the course attempt contains the
607 -- unit set), then the authorise person and authorise on fields must be
608 -- set. (If fields already set, then return a warning message.)
609 -- . Only one record within the student course attempt unit set can have an
610 -- open end date.
611 -- . Cannot be unset if the parent record is ended.
612 DECLARE
613 v_dummy VARCHAR2(1);
614 v_found BOOLEAN;
615 CURSOR c_susa IS
616 SELECT 'x'
617 FROM IGS_AS_SU_SETATMPT susa
618 WHERE susa.person_id = p_person_id AND
619 susa.course_cd = p_course_cd AND
620 susa.unit_set_cd = p_unit_set_cd AND
621 susa.end_dt IS NULL AND
622 susa.sequence_number <> NVL(p_sequence_number, 0);
623
624 CURSOR c_susa_parent IS
625 SELECT 'x'
626 FROM IGS_AS_SU_SETATMPT susa
627 WHERE susa.person_id = p_person_id AND
628 susa.course_cd = p_course_cd AND
629 susa.unit_set_cd = p_parent_unit_set_cd AND
630 susa.sequence_number = p_parent_sequence_number AND
631 susa.end_dt IS NOT NULL;
632 CURSOR c_chk_us IS
633 SELECT acai.unit_set_cd,
634 acai.us_version_number
635 FROM IGS_AD_PS_APPL_INST acai,
636 IGS_EN_STDNT_PS_ATT sca
637 WHERE sca.person_id = p_person_id AND
638 sca.course_cd = p_course_cd AND
639 sca.person_id = acai.person_id AND
640 sca.adm_admission_appl_number = acai.admission_appl_number AND
641 sca.adm_nominated_course_cd = acai.nominated_course_cd AND
642 sca.adm_sequence_number = acai.sequence_number;
643 BEGIN
644
645 v_found := FALSE;
646
647 -- set default value
648 p_message_name := NULL;
649 IF p_end_dt IS NULL THEN
650
651 -- Only one record within the student course attempt unit set can have an
652 -- open end date irrespective of version number.
653 OPEN c_susa;
654 FETCH c_susa INTO v_dummy;
655 IF c_susa%FOUND THEN
656 p_message_name := 'IGS_EN_UNIT_SET_EXISTS';
657
658 IF (p_legacy = 'Y') THEN
659 -- Add excep to stack
660 FND_MESSAGE.Set_Name('IGS',p_message_name);
661 FND_MSG_PUB.Add;
662 ELSE
663 CLOSE c_susa;
664 RETURN FALSE;
665 END IF;
666 END IF;
667 CLOSE c_susa;
668
669 -- If end date cleared, validate parent is not ended.
670 IF p_parent_unit_set_cd IS NOT NULL AND
671 p_parent_sequence_number IS NOT NULL THEN
672 OPEN c_susa_parent;
673 FETCH c_susa_parent INTO v_dummy;
674 IF c_susa_parent%FOUND THEN
675 p_message_name := 'IGS_EN_UNIT_SET_NO_OPEN';
676
677 IF (p_legacy = 'Y') THEN
678 -- Add excep to stack
679 FND_MESSAGE.Set_Name('IGS',p_message_name);
680 FND_MSG_PUB.Add;
681 ELSE
682 CLOSE c_susa_parent;
683 RETURN FALSE;
684 END IF;
685 END IF;
686 CLOSE c_susa_parent;
687
688 END IF;
689 ELSE -- p_end_dt IS NOT NULL
690
691 -- Validate that if the end date is being set and was specified as part of
692 -- the students offer (the admissions offer relating to the course attempt
693 -- contains the unit set), then the authorise person and authorise on fields
694 -- must be set. (If fields already set, then return a warning message.)
695 -- Determine if unit set is part of the admissions offer.
696 FOR v_chk_us_rec IN c_chk_us LOOP
697 IF v_chk_us_rec.unit_set_cd = p_unit_set_cd AND
698 v_chk_us_rec.us_version_number = p_us_version_number THEN
699 v_found := TRUE;
700 EXIT;
701 END IF;
702 END LOOP;
703 IF v_found = TRUE THEN
704 -- If authorise details not set then return an error/warning.
705 -- otherwise if set, then return warning.
706 IF p_authorised_person_id IS NULL AND
707 p_authorised_on IS NULL THEN
708 IF p_message_type = 'W' THEN
709 -- Return warning.
710 p_message_name := 'IGS_EN_UNITSET_REQ_AUTHORISAT';
711 RETURN FALSE;
712 ELSE
713 p_message_name := 'IGS_EN_UNITSET_REQ_ENDED';
714
715 IF (p_legacy = 'Y') THEN
716 FND_MESSAGE.Set_Name('IGS',p_message_name);
717 FND_MSG_PUB.Add;
718 ELSE
719 RETURN FALSE;
720 END IF;
721 END IF;
722 ELSE
723 -- Execute only in non-legacy mode
724 IF (p_legacy <> 'Y') THEN
725 -- Return warning.
726 p_message_name := 'IGS_EN_UNITSET_REQ_AUTHORISAT';
727 RETURN FALSE;
728 END IF;
729
730 END IF;
731 END IF;
732 END IF; -- if p_end_dt is null
733 -- If processing successful then
734 RETURN TRUE;
735
736 EXCEPTION
737 WHEN OTHERS THEN
738 IF c_susa%ISOPEN THEN
739 CLOSE c_susa;
740 END IF;
741 RAISE;
742 END;
743 EXCEPTION
744 WHEN OTHERS THEN
745 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
746 FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_VAL_SUSA.enrp_val_susa_end_dt');
747 IGS_GE_MSG_STACK.ADD;
748 App_Exception.Raise_Exception;
749
750 END enrp_val_susa_end_dt;
751
752
753 --
754 -- Validate student unit set atmpt voluntary end indicator and end date.
755 FUNCTION ENRP_VAL_SUSA_END_VI(
756 p_voluntary_end_ind IN VARCHAR2,
757 p_end_dt IN DATE ,
758 p_message_name OUT NOCOPY VARCHAR2 )
759 RETURN BOOLEAN AS
760
761 BEGIN -- enrp_val_susa_end_vi
762 -- This module validates the voluntary_end_ind against the end_dt for a
763 -- IGS_AS_SU_SETATMPT record. The voluntary end indicator can only
764 -- be set if the end date is set, although it is not mandatory that it is set.
765 DECLARE
766 BEGIN
767 -- Validate the end date must be set if the voluntary end indicator is set
768 IF (p_voluntary_end_ind = 'Y' AND
769 p_end_dt IS NULL) THEN
770 p_message_name := 'IGS_EN_VOLUNTARY_END_INDICATO';
771 RETURN FALSE;
772 END IF;
773 -- If processing successful then
774
775 p_message_name := NULL;
776 RETURN TRUE;
777 END;
778 EXCEPTION
779 WHEN OTHERS THEN
780 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
781 FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_VAL_SUSA.enrp_val_susa_end_vi');
782 IGS_GE_MSG_STACK.ADD;
783 App_Exception.Raise_Exception;
784 END enrp_val_susa_end_vi;
785 --
786 -- Validate the student unit set attempt is able to be created.
787 FUNCTION ENRP_VAL_SUSA_INS(
788 p_person_id IN NUMBER ,
789 p_course_cd IN VARCHAR2 ,
790 p_unit_set_cd IN VARCHAR2 ,
791 p_sequence_number IN NUMBER ,
792 p_us_version_number IN NUMBER ,
793 p_message_name OUT NOCOPY VARCHAR2,
794 p_legacy IN VARCHAR2)
795 RETURN BOOLEAN AS
796 -------------------------------------------------------------------------------------------
797 --Change History:
798 --Who When What
799 --stutta 06-Mar-2006 Split cursor c_susv to 3 cursors cur_susa, c_uso,c_usoo for
800 -- perf bug #3696127
801 BEGIN -- enrp_val_susa_ins
802 -- This module validates that the IGS_AS_SU_SETATMPT record being
803
804 -- created meets the following conditions:
805 -- . unit set version must be applicable to the course offering or the student
806 -- must have had it previously selected.
807 -- . Cannot be created against a unit set that has previously been completed
808 -- by the student (irrespective of version).
809 DECLARE
810 v_dummy VARCHAR2(1);
811 v_msg_num NUMBER(5);
812
813
814 CURSOR c_uso IS
815 SELECT 'X'
816 FROM IGS_PS_OFR_UNIT_SET cous,
817 igs_en_unit_set_stat uss1,
818 IGS_EN_UNIT_SET_ALL US,
819 IGS_EN_STDNT_PS_ATT spa
820 WHERE spa.person_id = p_person_id
821 AND spa.course_cd = p_course_cd
822 AND us.version_number = p_us_version_number
823 AND us.unit_set_cd = p_unit_set_cd
824 AND spa.course_cd = cous.course_cd
825 AND spa.version_number = cous.crv_version_number
826 AND spa.CAL_TYPE = cous.CAL_TYPE
827 AND us.unit_set_cd = cous.unit_set_cd
828 AND us.version_number = cous.us_version_number
829 AND us.unit_set_status = uss1.unit_set_status
830 AND uss1.s_unit_set_status ='ACTIVE'
831 AND NOT EXISTS (SELECT 1
832 FROM IGS_PS_OF_OPT_UNT_ST coous
833 WHERE coous.coo_id= spa.coo_id
834 );
835
836
837 CURSOR c_usoo IS
838 SELECT 'X'
839 FROM IGS_PS_OF_OPT_UNT_ST coous,
840 IGS_EN_UNIT_SET_ALL US,
841 igs_en_unit_set_stat uss1,
842 IGS_EN_STDNT_PS_ATT spa
843 WHERE spa.person_id = p_person_id
844 AND spa.course_cd = p_course_cd
845 AND coous.coo_id = spa.coo_id
846 AND us.version_number = p_us_version_number
847 AND us.unit_set_cd = p_unit_set_cd
848 AND us.unit_set_cd = coous.unit_set_cd
849 AND us.version_number = coous.us_version_number
850 AND us.unit_set_status = uss1.unit_set_status
851 AND uss1.s_unit_set_status = 'ACTIVE';
852
853 CURSOR c_susa IS
854 SELECT 'X'
855 FROM IGS_AS_SU_SETATMPT susa
856 WHERE susa.person_id = p_person_id AND
857 susa.course_cd = p_course_cd AND
858 susa.unit_set_cd = p_unit_set_cd AND
859 susa.sequence_number<> NVL(p_sequence_number, 0) AND
860 susa.rqrmnts_complete_ind = 'Y';
861
862 BEGIN
863 p_message_name := NULL;
864
865 -- Validate that the unit set version must be applicable to the course
866 -- offering option
867 v_dummy := NULL;
868 OPEN c_usoo;
869 FETCH c_usoo INTO v_dummy;
870 CLOSE c_usoo;
871 IF v_dummy IS NULL THEN -- c_usoo not found
872 --
873 v_dummy := NULL;
874 OPEN c_uso;
875 FETCH c_uso INTO v_dummy;
876 CLOSE c_uso;
877 IF v_dummy IS NULL THEN -- c_uso is not found
878 p_message_name := 'IGS_EN_UNIT_SETNOT_PERMITTED';
879 IF (p_legacy = 'Y') THEN
880 -- Add excep to stack
881 FND_MESSAGE.Set_Name('IGS',p_message_name);
882 FND_MSG_PUB.Add;
883 ELSE
884 RETURN FALSE;
885 END IF;
886 END IF;
887
888 END IF;
889
890 -- The student cannot create another attempt at a unit set if a record within
891 -- the student course attempt exists as completed.
892 v_dummy := NULL;
893 OPEN c_susa;
894 FETCH c_susa INTO v_dummy;
895 IF c_susa%FOUND THEN
896 p_message_name := 'IGS_EN_STUD_COMPL_UNITSET';
897
898 IF (p_legacy = 'Y') THEN
899 -- Add excep to stack
900 FND_MESSAGE.Set_Name('IGS',p_message_name);
901 FND_MSG_PUB.Add;
902 ELSE
903 CLOSE c_susa;
904 RETURN FALSE;
905 END IF;
906
907 END IF;
908 CLOSE c_susa;
909 -- If processing successful then
910
911 RETURN TRUE;
912 EXCEPTION
913 WHEN OTHERS THEN
914 IF c_uso%ISOPEN THEN
915 CLOSE c_uso;
916 END IF;
917 IF c_usoo%ISOPEN THEN
918 CLOSE c_usoo;
919 END IF;
920 IF c_susa%ISOPEN THEN
921 CLOSE c_susa;
922 END IF;
923 RAISE;
924 END;
925 EXCEPTION
926 WHEN OTHERS THEN
927 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
928 FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_VAL_SUSA.enrp_val_susa_ins');
929 IGS_GE_MSG_STACK.ADD;
930 App_Exception.Raise_Exception;
931 END enrp_val_susa_ins;
932
933
934 --
935 -- Validate the linking of parent unit set to student unit set attempt .
936 FUNCTION ENRP_VAL_SUSA_PARENT(
937 p_person_id IN NUMBER ,
938 p_course_cd IN VARCHAR2 ,
939 p_unit_set_cd IN VARCHAR2 ,
940 p_sequence_number IN NUMBER ,
941 p_parent_unit_set_cd IN VARCHAR2 ,
942 p_parent_sequence_number IN NUMBER ,
943 p_student_confirmed_ind IN VARCHAR2,
944 p_message_name OUT NOCOPY VARCHAR2,
945 p_legacy IN VARCHAR2)
946 RETURN BOOLEAN AS
947
948 BEGIN -- enrp_val_susa_parent
949 -- This module validates the IGS_EN_UNIT_SET being allocated to the
950 -- IGS_AS_SU_SETATMPT as a parent:
951 -- - Cannot be a parent unit set attempt of itself.
952 -- - Can only be linked to a IGS_AS_SU_SETATMPT record for
953 -- the same person and course where the end date is null.
954 -- - Cannot be linked to itself via the parent student unit set
955 -- attempt relationship.
956 -- - Cannot be linked to a confirmed parent if the unit set is
957 -- unconfirmed.
958 DECLARE
959 v_end_dt IGS_AS_SU_SETATMPT.end_dt%TYPE;
960 v_student_confirmed_ind IGS_AS_SU_SETATMPT.student_confirmed_ind%TYPE;
961 v_unit_set_cd IGS_AS_SU_SETATMPT.unit_set_cd%TYPE;
962
963 CURSOR c_susa IS
964 SELECT susa.end_dt,
965 susa.student_confirmed_ind
966 FROM IGS_AS_SU_SETATMPT susa
967 WHERE susa.person_id = p_person_id AND
968 susa.course_cd = p_course_cd AND
969 susa.unit_set_cd = p_parent_unit_set_cd AND
970 susa.sequence_number = p_parent_sequence_number;
971 CURSOR c_susa_ancestor IS
972 SELECT susa1.unit_set_cd
973 FROM IGS_AS_SU_SETATMPT susa1
974 START WITH susa1.person_id = p_person_id AND
975 susa1.course_cd = p_course_cd AND
976 susa1.unit_set_cd = p_parent_unit_set_cd AND
977 susa1.sequence_number = p_parent_sequence_number
978 CONNECT BY PRIOR susa1.person_id = susa1.person_id AND
979 PRIOR susa1.course_cd = susa1.course_cd AND
980 PRIOR susa1.parent_unit_set_cd = susa1.unit_set_cd AND
981 PRIOR susa1.parent_sequence_number = susa1.sequence_number;
982 CURSOR c_susa_descendant IS
983 SELECT susa1.unit_set_cd
984 FROM IGS_AS_SU_SETATMPT susa1
985 START WITH susa1.person_id = p_person_id AND
986
987 susa1.course_cd = p_course_cd AND
988 susa1.unit_set_cd = p_unit_set_cd AND
989 susa1.sequence_number = NVL(p_sequence_number, 0)
990 CONNECT BY PRIOR susa1.person_id = susa1.person_id AND
991 PRIOR susa1.course_cd = susa1.course_cd AND
992 PRIOR susa1.unit_set_cd = susa1.parent_unit_set_cd AND
993 PRIOR susa1.sequence_number = susa1.parent_sequence_number;
994
995 BEGIN
996 p_message_name := NULL;
997
998 -- Check that a parent is being defined
999 IF (p_parent_unit_set_cd IS NULL OR
1000 p_parent_sequence_number IS NULL) THEN
1001 p_message_name := NULL;
1002 RETURN TRUE;
1003 END IF;
1004
1005 -- Validate the unit set is not being specified as a
1006 -- parent of itself irrespective of version.
1007 IF (p_unit_set_cd = p_parent_unit_set_cd) THEN
1008 p_message_name := 'IGS_EN_UNIT_SET_NOTBE_PARENT';
1009
1010 IF (p_legacy = 'Y') THEN
1011 -- Add excep to stack
1012 FND_MESSAGE.Set_Name('IGS',p_message_name);
1013 FND_MSG_PUB.Add;
1014 ELSE
1015 RETURN FALSE;
1016 END IF;
1017 END IF;
1018
1019 -- Validate can only be linked to a IGS_AS_SU_SETATMPT record for the
1020 -- same person and course where the end date is null.
1021 OPEN c_susa;
1022 FETCH c_susa INTO v_end_dt, v_student_confirmed_ind;
1023 IF (c_susa%NOTFOUND) THEN
1024 CLOSE c_susa;
1025 p_message_name := 'IGS_EN_UNIT_SET_NOT_PARENT_EX';
1026
1027 IF (p_legacy = 'Y') THEN
1028 -- Add excep to stack
1029 FND_MESSAGE.Set_Name('IGS',p_message_name);
1030 FND_MSG_PUB.Add;
1031 ELSE
1032 RETURN FALSE;
1033 END IF;
1034 ELSE
1035 CLOSE c_susa;
1036 -- Check if the end date is set
1037 IF (v_end_dt IS NOT NULL) THEN
1038 p_message_name := 'IGS_EN_UNIT_SET_NOT_ENDDT';
1039
1040 IF (p_legacy = 'Y') THEN
1041 -- Add excep to stack
1042 FND_MESSAGE.Set_Name('IGS',p_message_name);
1043 FND_MSG_PUB.Add;
1044 ELSE
1045 RETURN FALSE;
1046 END IF;
1047 END IF;
1048
1049 -- Validate that if the unit set is confirmed,
1050 -- then the parent must also be confirmed.
1051 IF (v_student_confirmed_ind = 'N' AND -- parent student confirmed ind
1052 p_student_confirmed_ind = 'Y') THEN -- child student confirmed ind
1053 p_message_name := 'IGS_EN_UNIT_SET_PARENTSET_CON';
1054
1055 IF (p_legacy = 'Y') THEN
1056 -- Add excep to stack
1057 FND_MESSAGE.Set_Name('IGS',p_message_name);
1058 FND_MSG_PUB.Add;
1059 ELSE
1060 RETURN FALSE;
1061 END IF;
1062 END IF;
1063 END IF;
1064 -- Validate that the unit set cannot be linked to itself via the
1065 -- parent relationship.
1066
1067 -- Check that the unit set does not already exist as an ancestor.
1068 OPEN c_susa_ancestor;
1069 FETCH c_susa_ancestor INTO v_unit_set_cd;
1070 LOOP
1071 IF (c_susa_ancestor%NOTFOUND) THEN
1072 EXIT;
1073 END IF;
1074 IF v_unit_set_cd = p_unit_set_cd THEN
1075 p_message_name := 'IGS_EN_INVALID_RELATIONSHIP';
1076
1077 IF (p_legacy = 'Y') THEN
1078 -- Add excep to stack
1079 FND_MESSAGE.Set_Name('IGS',p_message_name);
1080 FND_MSG_PUB.Add;
1081 EXIT;
1082 ELSE
1083 CLOSE c_susa_ancestor;
1084 RETURN FALSE;
1085 END IF;
1086 END IF;
1087 FETCH c_susa_ancestor INTO v_unit_set_cd;
1088 END LOOP;
1089 CLOSE c_susa_ancestor;
1090
1091 -- Check that the unit set does not already exist as a descendant
1092 OPEN c_susa_descendant;
1093 FETCH c_susa_descendant INTO v_unit_set_cd;
1094 LOOP
1095 IF (c_susa_descendant%NOTFOUND) THEN
1096 EXIT;
1097 END IF;
1098 IF v_unit_set_cd = p_parent_unit_set_cd THEN
1099 p_message_name := 'IGS_EN_INVALID_RELATIONSHIP';
1100
1101 IF (p_legacy = 'Y') THEN
1102 -- Add excep to stack
1103 FND_MESSAGE.Set_Name('IGS',p_message_name);
1104 FND_MSG_PUB.Add;
1105 EXIT;
1106 ELSE
1107 CLOSE c_susa_descendant;
1108 RETURN FALSE;
1109 END IF;
1110 END IF;
1111 FETCH c_susa_descendant INTO v_unit_set_cd;
1112 END LOOP;
1113 CLOSE c_susa_descendant;
1114
1115 RETURN TRUE;
1116 EXCEPTION
1117 WHEN OTHERS THEN
1118 IF (c_susa%ISOPEN) THEN
1119 CLOSE c_susa;
1120 END IF;
1121 IF (c_susa_ancestor%ISOPEN) THEN
1122 CLOSE c_susa_ancestor;
1123 END IF;
1124 IF (c_susa_descendant%ISOPEN) THEN
1125 CLOSE c_susa_descendant;
1126 END IF;
1127 RAISE;
1128 END;
1129 EXCEPTION
1130 WHEN OTHERS THEN
1131 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
1132 FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_VAL_SUSA.enrp_val_susa_parent');
1133 IGS_GE_MSG_STACK.ADD;
1134 App_Exception.Raise_Exception;
1135
1136 END enrp_val_susa_parent;
1137
1138 --
1139 -- Validate the IGS_AS_SU_SETATMPT.primary_set_ind field.
1140 FUNCTION ENRP_VAL_SUSA_PRMRY(
1141 p_person_id IN NUMBER ,
1142 p_course_cd IN VARCHAR2 ,
1143 p_unit_set_cd IN VARCHAR2 ,
1144 p_us_version_number IN NUMBER ,
1145 p_primary_set_ind IN VARCHAR2,
1146 p_message_name OUT NOCOPY VARCHAR2,
1147 p_legacy IN VARCHAR2)
1148 RETURN BOOLEAN AS
1149
1150 BEGIN -- enrp_val_susa_prmry
1151 -- This module validates the IGS_AS_SU_SETATMPT.primary_set_ind cannot
1152 -- be set if there exists a unit set of a higher rank within the students
1153 -- unit set. Also, check that the primary indicator is only set for
1154 -- non-administrative files.
1155 DECLARE
1156
1157 v_rank IGS_EN_UNIT_SET_CAT.rank%TYPE;
1158 v_administrative_ind IGS_EN_UNIT_SET.administrative_ind%TYPE;
1159 v_dummy VARCHAR2(1);
1160
1161 CURSOR c_us_usc IS
1162 SELECT us.administrative_ind,
1163 usc.rank
1164 FROM IGS_EN_UNIT_SET us,
1165 IGS_EN_UNIT_SET_CAT usc
1166 WHERE us.unit_set_cd = p_unit_set_cd AND
1167 us.version_number = p_us_version_number AND
1168 us.unit_set_cat = usc.unit_set_cat;
1169 CURSOR c_susa_us_usc (
1170 cp_rank IGS_EN_UNIT_SET_CAT.rank%TYPE) IS
1171 SELECT 'x'
1172 FROM IGS_AS_SU_SETATMPT susa,
1173 IGS_EN_UNIT_SET us,
1174 IGS_EN_UNIT_SET_CAT usc
1175 WHERE susa.person_id = p_person_id AND
1176 susa.course_cd = p_course_cd AND
1177 susa.unit_set_cd = us.unit_set_cd AND
1178 susa.us_version_number = us.version_number AND
1179 us.administrative_ind = 'N' AND
1180 us.unit_set_cat = usc.unit_set_cat AND
1181 usc.rank < cp_rank;
1182 BEGIN
1183 p_message_name := NULL;
1184
1185 -- If primary set indicator not set, return successful
1186 -- as no validation required.
1187 IF NVL(p_primary_set_ind, 'N') = 'N' THEN
1188 p_message_name := NULL;
1189 RETURN TRUE;
1190 END IF;
1191
1192 -- Check if the unit set is administrative.
1193 OPEN c_us_usc;
1194 FETCH c_us_usc INTO v_administrative_ind,
1195 v_rank;
1196 IF (c_us_usc%NOTFOUND) THEN
1197 CLOSE c_us_usc;
1198 RAISE NO_DATA_FOUND;
1199 ELSE
1200 IF (v_administrative_ind = 'Y') THEN
1201 p_message_name := 'IGS_EN_PRIMARY_INDICATOR_NOT';
1202
1203 IF (p_legacy = 'Y') THEN
1204 -- Add excep to stack
1205 FND_MESSAGE.Set_Name('IGS',p_message_name);
1206 FND_MSG_PUB.Add;
1207 ELSE
1208 CLOSE c_us_usc;
1209 RETURN FALSE;
1210 END IF;
1211 END IF;
1212 END IF;
1213 CLOSE c_us_usc;
1214
1215 -- The below validation need not
1216 -- be checked when running in legacy mode
1217 IF (p_legacy <> 'Y') THEN
1218 -- Check if there exists a non-administrative unit which has a higher rank.
1219 OPEN c_susa_us_usc(v_rank);
1220 FETCH c_susa_us_usc INTO v_dummy;
1221 IF (c_susa_us_usc%FOUND) THEN
1222 CLOSE c_susa_us_usc;
1223 p_message_name := 'IGS_EN_PRIMARY_IND_NOT_SET';
1224 RETURN FALSE;
1225 END IF;
1226 -- If processing successful then
1227 CLOSE c_susa_us_usc;
1228 END IF;
1229
1230 RETURN TRUE;
1231 END;
1232 EXCEPTION
1233 WHEN OTHERS THEN
1234 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
1235 FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_VAL_SUSA.enrp_val_susa_prmry');
1236 IGS_GE_MSG_STACK.ADD;
1237 App_Exception.Raise_Exception;
1238
1239 END enrp_val_susa_prmry;
1240
1241
1242 --
1243 -- Validate the student unit set attempt against for the stdnt crs atmpt.
1244 FUNCTION ENRP_VAL_SUSA_SCA(
1245 p_person_id IN NUMBER ,
1246 p_course_cd IN VARCHAR2 ,
1247 p_message_name OUT NOCOPY VARCHAR2 )
1248 RETURN BOOLEAN AS
1249
1250 BEGIN -- enrp_val_susa_sca
1251 -- This module validates the IGS_AS_SU_SETATMPT is created against
1252 -- a valid IGS_EN_STDNT_PS_ATT status.
1253 DECLARE
1254 cst_discontin CONSTANT VARCHAR2(10) := 'DISCONTIN';
1255 cst_lapsed CONSTANT VARCHAR2(10) := 'LAPSED';
1256 cst_deleted CONSTANT VARCHAR2(10) := 'DELETED';
1257 v_dummy VARCHAR2(1);
1258 CURSOR c_sca IS
1259 SELECT 'x'
1260 FROM IGS_EN_STDNT_PS_ATT sca
1261 WHERE sca.person_id = p_person_id AND
1262 sca.course_cd = p_course_cd AND
1263 sca.course_attempt_status IN ( cst_discontin,
1264 cst_lapsed,
1265 cst_deleted);
1266 BEGIN
1267
1268 -- set default value
1269 p_message_name := NULL;
1270 OPEN c_sca;
1271 FETCH c_sca INTO v_dummy;
1272 IF c_sca%FOUND THEN
1273 CLOSE c_sca;
1274 p_message_name := 'IGS_EN_SUA_NOT_CREATED';
1275 RETURN FALSE;
1276 END IF;
1277 CLOSE c_sca;
1278 RETURN TRUE;
1279 EXCEPTION
1280 WHEN OTHERS THEN
1281 IF c_sca%ISOPEN THEN
1282 CLOSE c_sca;
1283 END IF;
1284 RAISE;
1285 END;
1286 EXCEPTION
1287 WHEN OTHERS THEN
1288 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
1289 FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_VAL_SUSA.enrp_val_susa_sca');
1290 IGS_GE_MSG_STACK.ADD;
1291
1292 App_Exception.Raise_Exception;
1293 END enrp_val_susa_sca;
1294
1295
1296 --
1297 -- Validate the student unit set attempt confirmation indicator.
1298 FUNCTION ENRP_VAL_SUSA_SCI(
1299 p_person_id IN NUMBER ,
1300 p_course_cd IN VARCHAR2 ,
1301 p_unit_set_cd IN VARCHAR2 ,
1302 p_sequence_number IN NUMBER ,
1303 p_us_version_number IN NUMBER ,
1304 p_parent_unit_set_cd IN VARCHAR2 ,
1305 p_parent_sequence_number IN NUMBER ,
1306 p_student_confirmed_ind IN VARCHAR2,
1307 p_selection_dt IN DATE ,
1308 p_end_dt IN DATE ,
1309 p_rqrmnts_complete_ind IN VARCHAR2,
1310 p_message_name OUT NOCOPY VARCHAR2,
1311 p_legacy IN VARCHAR2)
1312 RETURN BOOLEAN AS
1313
1314 BEGIN -- enrp_val_susa_sci
1315 -- This module validates the confirmation of a IGS_EN_UNIT_SET for a
1316 -- IGS_AS_SU_SETATMPT record. The validations are:
1317 -- - The student confirmed indicator cannot be unset once the
1318
1319 -- end date has been set.
1320 -- - The student confirmed indicator cannot be unset once the
1321 -- requirements complete indicator has been set.
1322 -- - The student confirmed indicator can only be set if the
1323 -- student course attempt status is 'ENROLLED' or 'INACTIVE'.
1324 -- - The student confirmed indicator cannot be set when a parent
1325 -- unit set exists that is unconfirmed.
1326 -- - The student confirmed indicator cannot be set if the student
1327 -- is excluded from the unit set via encumbrances.
1328 DECLARE
1329 cst_enrolled CONSTANT
1330 IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE := 'ENROLLED';
1331 cst_inactive CONSTANT
1332 IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE := 'INACTIVE';
1333 v_dummy VARCHAR2(1);
1334 v_sca_version_number IGS_EN_STDNT_PS_ATT.version_number%TYPE;
1335 v_message_name VARCHAR2(30);
1336 CURSOR c_sca IS
1337 SELECT sca.version_number
1338 FROM IGS_EN_STDNT_PS_ATT sca
1339 WHERE sca.person_id = p_person_id AND
1340 sca.course_cd = p_course_cd AND
1341 sca.course_attempt_status IN (
1342
1343 cst_enrolled,
1344 cst_inactive);
1345 CURSOR c_susa IS
1346 SELECT 'X'
1347 FROM IGS_AS_SU_SETATMPT susa
1348 WHERE susa.person_id = p_person_id AND
1349 susa.course_cd = p_course_cd AND
1350 susa.unit_set_cd = p_parent_unit_set_cd AND
1351 susa.sequence_number = p_parent_sequence_number AND
1352 susa.student_confirmed_ind = 'N';
1353
1354
1355 CURSOR c_sca_legacy IS
1356 SELECT sca.version_number
1357 FROM IGS_EN_STDNT_PS_ATT sca
1358 WHERE sca.person_id = p_person_id AND
1359 sca.course_cd = p_course_cd AND
1360 sca.course_attempt_status = 'UNCONFIRM';
1361
1362 BEGIN
1363 p_message_name := NULL;
1364
1365 IF (p_student_confirmed_ind = 'Y') THEN
1366 -- Validate the confirmed indicator can only be set when the
1367 -- student course attempt is enrolled or inactive
1368
1369 IF (p_legacy = 'Y') THEN
1370 OPEN c_sca_legacy;
1371 FETCH c_sca_legacy INTO v_sca_version_number;
1372 IF (c_sca_legacy%FOUND) THEN
1373 p_message_name := 'IGS_EN_CANT_SET_CONF_IND';
1374 FND_MESSAGE.Set_Name('IGS',p_message_name);
1375 FND_MSG_PUB.Add;
1376 END IF;
1377 CLOSE c_sca_legacy;
1378 ELSE
1379 OPEN c_sca;
1380 FETCH c_sca INTO v_sca_version_number;
1381 IF (c_sca%NOTFOUND) THEN
1382 CLOSE c_sca;
1383 p_message_name := 'IGS_EN_UNIT_SET_SPA_ENR_INACT';
1384 RETURN FALSE;
1385 END IF;
1386 CLOSE c_sca;
1387 END IF;
1388
1389 -- Validate the confirmed indicator cannot be set when a parent
1390
1391 -- unit set exists that is unconfirmed.
1392 IF (p_parent_unit_set_cd IS NOT NULL AND
1393 p_parent_sequence_number IS NOT NULL) THEN
1394 OPEN c_susa;
1395 FETCH c_susa INTO v_dummy;
1396 IF (c_susa%FOUND) THEN
1397 p_message_name := 'IGS_EN_UNIT_SET_PARENTSET_CON';
1398
1399 IF (p_legacy = 'Y') THEN
1400 -- Add excep to stack
1401 FND_MESSAGE.Set_Name('IGS',p_message_name);
1402 FND_MSG_PUB.Add;
1403 ELSE
1404 CLOSE c_susa;
1405 RETURN FALSE;
1406 END IF;
1407 END IF;
1408 CLOSE c_susa;
1409
1410 -- Check that the relationship is still valid within the course offering
1411 IF (Igs_En_Val_Susa.enrp_val_susa_cousr(
1412 p_person_id,
1413 p_course_cd,
1414 p_unit_set_cd,
1415 p_us_version_number,
1416 p_parent_unit_set_cd,
1417 p_parent_sequence_number,
1418 'E',
1419 v_message_name,
1420 p_legacy) = FALSE) THEN
1421 p_message_name := v_message_name;
1422
1423 IF (p_legacy <> 'Y') THEN
1424 RETURN FALSE;
1425 END IF;
1426 END IF;
1427 END IF;
1428
1429 -- The below validations need not be
1430 -- done when operating in legacy mode
1431 IF (p_legacy <> 'Y') THEN
1432
1433 -- Check that the unit set is still active
1434 IF (Igs_En_Val_Susa.enrp_val_susa_us_act(
1435 p_person_id,
1436 p_course_cd,
1437 p_unit_set_cd,
1438 p_sequence_number,
1439 p_us_version_number,
1440 v_message_name) = FALSE) THEN
1441 p_message_name := v_message_name;
1442 RETURN FALSE;
1443 END IF;
1444 -- Validate the confirmed indicator cannot be set if the student is
1445 -- excluded from the unit set via encumbrances
1446 IF (IGS_EN_VAL_ENCMB.enrp_val_excld_us(
1447 p_person_id,
1448 p_course_cd,
1449 p_unit_set_cd,
1450 p_us_version_number,
1451 SYSDATE,
1452 v_message_name) = FALSE) THEN
1453 p_message_name := v_message_name;
1454
1455 RETURN FALSE;
1456 END IF;
1457 END IF;
1458 -- unit set rules for enrolment are validated in separate module
1459 -- (enrp_val_susa_sci_rl) because rules system contains savepoints and
1460 -- rollbacks whick limit the routine from being called from database triggers.
1461 ELSE
1462 -- Validate the confirmed indicator being unset
1463 -- Cannot be unset if the end date has been set
1464 IF (p_end_dt IS NOT NULL) THEN
1465 p_message_name := 'IGS_EN_UNIT_SET_UNCONF_ENDDT';
1466
1467 IF (p_legacy = 'Y') THEN
1468 -- Add excep to stack
1469 FND_MESSAGE.Set_Name('IGS',p_message_name);
1470 FND_MSG_PUB.Add;
1471 ELSE
1472 RETURN FALSE;
1473 END IF;
1474 END IF;
1475
1476 -- Cannot be unset if the requirements complete indicator has been set
1477 IF (p_rqrmnts_complete_ind = 'Y') THEN
1478 p_message_name := 'IGS_EN_UNIT_SET_UNCONF_REQ';
1479
1480 IF (p_legacy = 'Y') THEN
1481 -- Add excep to stack
1482 FND_MESSAGE.Set_Name('IGS',p_message_name);
1483 FND_MSG_PUB.Add;
1484 ELSE
1485 RETURN FALSE;
1486 END IF;
1487 END IF;
1488 END IF;
1489
1490 RETURN TRUE;
1491
1492 EXCEPTION
1493 WHEN OTHERS THEN
1494 IF (c_sca%ISOPEN) THEN
1495
1496 CLOSE c_sca;
1497 END IF;
1498 IF (c_susa%ISOPEN) THEN
1499 CLOSE c_susa;
1500 END IF;
1501 RAISE;
1502 END;
1503 EXCEPTION
1504 WHEN OTHERS THEN
1505 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
1506 FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_VAL_SUSA.enrp_val_susa_sci');
1507 IGS_GE_MSG_STACK.ADD;
1508 App_Exception.Raise_Exception;
1509
1510 END enrp_val_susa_sci;
1511 --
1512 -- Validate the student unit set attempt confirmation rules.
1513 FUNCTION ENRP_VAL_SUSA_SCI_RL(
1514 p_person_id IN NUMBER ,
1515 p_course_cd IN VARCHAR2 ,
1516 p_unit_set_cd IN VARCHAR2 ,
1517 p_us_version_number IN NUMBER ,
1518 p_new_student_confirmed_ind IN VARCHAR2,
1519 p_old_student_confirmed_ind IN VARCHAR2,
1520 p_message_name OUT NOCOPY VARCHAR2 ,
1521 p_message_text OUT NOCOPY VARCHAR2 )
1522 RETURN BOOLEAN AS
1523 BEGIN -- enrp_val_susa_sci_rl
1524 -- - The student confirmed indicator cannot be set if
1525 -- rules exist preventing this.
1526 DECLARE
1527 cst_enrolled CONSTANT
1528 IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE := 'ENROLLED';
1529 cst_inactive CONSTANT
1530 IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE := 'INACTIVE';
1531 v_sca_version_number IGS_EN_STDNT_PS_ATT.version_number%TYPE;
1532 v_message_name VARCHAR2(30);
1533 CURSOR c_sca IS
1534 SELECT sca.version_number
1535 FROM IGS_EN_STDNT_PS_ATT sca
1536 WHERE sca.person_id = p_person_id AND
1537 sca.course_cd = p_course_cd AND
1538 sca.course_attempt_status IN (
1539 cst_enrolled,
1540 cst_inactive);
1541 BEGIN
1542 p_message_text := NULL;
1543
1544 IF (p_new_student_confirmed_ind = 'Y') AND
1545 (NVL(p_old_student_confirmed_ind, 'N') = 'N') THEN
1546 -- Validate the confirmed indicator can only be set when the
1547 -- student course attempt is enrolled or inactive
1548 OPEN c_sca;
1549 FETCH c_sca INTO v_sca_version_number;
1550 IF (c_sca%NOTFOUND) THEN
1551 CLOSE c_sca;
1552 p_message_name := 'IGS_EN_UNIT_SET_SPA_ENR_INACT';
1553 RETURN FALSE;
1554 END IF;
1555 CLOSE c_sca;
1556 -- Validate unit set rules for enrolment
1557 IF (IGS_RU_VAL_USET_RULE.rulp_val_enrol_uset(
1558 p_person_id,
1559 p_course_cd,
1560 v_sca_version_number,
1561 p_unit_set_cd,
1562 p_us_version_number,
1563 p_message_text) = FALSE) THEN
1564 p_message_name := NULL;
1565 RETURN FALSE;
1566 END IF;
1567
1568 END IF;
1569 p_message_name := NULL;
1570 RETURN TRUE;
1571 EXCEPTION
1572 WHEN OTHERS THEN
1573 IF (c_sca%ISOPEN) THEN
1574 CLOSE c_sca;
1575 END IF;
1576 RAISE;
1577 END;
1578 EXCEPTION
1579 WHEN OTHERS THEN
1580 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
1581 FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_VAL_SUSA.enrp_val_susa_sci_rl');
1582 IGS_GE_MSG_STACK.ADD;
1583 App_Exception.Raise_Exception;
1584
1585 END enrp_val_susa_sci_rl;
1586
1587
1588 --
1589 -- Validate student unit set atmpt confirm indicator and selection date.
1590 FUNCTION ENRP_VAL_SUSA_SCI_SD(
1591 p_student_confirmed_ind IN VARCHAR2,
1592 p_selection_dt IN DATE,
1593 p_message_name OUT NOCOPY VARCHAR2,
1594 p_legacy IN VARCHAR2)
1595 RETURN BOOLEAN AS
1596 BEGIN -- enrp_val_susa_sci_sd
1597 -- This module validates the student_confirmed_ind against the selection_dt
1598 -- for a IGS_AS_SU_SETATMPT record. The validations are:
1599 -- - The selection date must be set if the confirmed indicator is set
1600 -- (and visa versa).
1601 -- - The selection date being unset, then the confirmed indicator must be
1602 -- unset (and visa versa).
1603 DECLARE
1604 BEGIN
1605 p_message_name := NULL;
1606
1607 -- Validate the selection date must be set if the confirmed
1608 -- indicator is set and visa versa.
1609 IF (p_student_confirmed_ind = 'Y' AND
1610 p_selection_dt IS NULL) THEN
1611 p_message_name := 'IGS_EN_UNIT_SET_UNCONF_SETDT';
1612
1613 IF (p_legacy = 'Y') THEN
1614 -- Add excep to stack
1615 FND_MESSAGE.Set_Name('IGS',p_message_name);
1616 FND_MSG_PUB.Add;
1617 ELSE
1618 RETURN FALSE;
1619 END IF;
1620 END IF;
1621
1622 -- Validate the selection date must be unset if the
1623 -- confirmed indicator is set and visa versa.
1624 IF (p_student_confirmed_ind = 'N' AND
1625 p_selection_dt IS NOT NULL) THEN
1626 p_message_name := 'IGS_EN_UNIT_SET_UNCONF_NOTSET';
1627
1628 IF (p_legacy = 'Y') THEN
1629 -- Add excep to stack
1630 FND_MESSAGE.Set_Name('IGS',p_message_name);
1631 FND_MSG_PUB.Add;
1632 ELSE
1633 RETURN FALSE;
1634 END IF;
1635 END IF;
1636
1637 RETURN TRUE;
1638
1639 END;
1640 EXCEPTION
1641 WHEN OTHERS THEN
1642 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
1643 FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_VAL_SUSA.enrp_val_susa_sci_sd');
1644 IGS_GE_MSG_STACK.ADD;
1645 App_Exception.Raise_Exception;
1646
1647 END enrp_val_susa_sci_sd;
1648
1649
1650 --
1651 -- Validate the unit set is active for student unit set attempt.
1652 FUNCTION ENRP_VAL_SUSA_US_ACT(
1653 p_person_id IN NUMBER ,
1654 p_course_cd IN VARCHAR2 ,
1655 p_unit_set_cd IN VARCHAR2 ,
1656 p_sequence_number IN NUMBER ,
1657 p_version_number IN NUMBER ,
1658 p_message_name OUT NOCOPY VARCHAR2 )
1659 RETURN BOOLEAN AS
1660
1661
1662 BEGIN -- enrp_val_susa_us_act
1663 -- This module validates that the IGS_EN_UNIT_SET being allocated to the
1664 -- IGS_AS_SU_SETATMPT is active with a null expiry date or active with
1665 -- expiry date set and the student has previously selected in within the same
1666 -- course attempt.
1667 DECLARE
1668 cst_active CONSTANT VARCHAR2(6) := 'ACTIVE';
1669 v_s_unit_set_status IGS_EN_UNIT_SET_STAT.s_unit_set_status%TYPE;
1670 v_expiry_dt IGS_EN_UNIT_SET.expiry_dt%TYPE;
1671 v_dummy VARCHAR2(1);
1672 CURSOR c_us_uss IS
1673 SELECT uss.s_unit_set_status,
1674 us.expiry_dt
1675 FROM IGS_EN_UNIT_SET us,
1676 IGS_EN_UNIT_SET_STAT uss
1677 WHERE us.unit_set_status = uss.unit_set_status AND
1678 us.unit_set_cd = p_unit_set_cd AND
1679 us.version_number = p_version_number;
1680 CURSOR c_susa IS
1681 SELECT 'x'
1682 FROM IGS_AS_SU_SETATMPT susa
1683 WHERE susa.person_id = p_person_id AND
1684
1685 susa.course_cd = p_course_cd AND
1686 susa.unit_set_cd = p_unit_set_cd AND
1687 susa.us_version_number = p_version_number AND
1688 susa.sequence_number <> NVL(p_sequence_number, 0);
1689 BEGIN
1690 -- Validate that the unit set status is active and null expiry date.
1691 OPEN c_us_uss;
1692 FETCH c_us_uss INTO v_s_unit_set_status,
1693 v_expiry_dt;
1694 IF v_s_unit_set_status <> cst_active THEN
1695 CLOSE c_us_uss;
1696 p_message_name := 'IGS_EN_UNIT_SETST_ACTIVE';
1697 RETURN FALSE;
1698 ELSE
1699 IF v_expiry_dt IS NOT NULL THEN
1700 -- Determine if the student has previously had the version selected
1701 -- within the specified course
1702 -- NOTE: sequence number comparison is used as this validation is called
1703 -- from an after statement databae trigger in which case, want to ignore the
1704 -- newly created record.
1705 OPEN c_susa;
1706 FETCH c_susa INTO v_dummy;
1707 IF (c_susa%NOTFOUND) THEN
1708
1709 CLOSE c_susa;
1710 p_message_name := 'IGS_EN_UNIT_SET_EXPDT_NOTSET';
1711 RETURN FALSE;
1712 END IF;
1713 CLOSE c_susa;
1714 END IF;
1715 END IF;
1716 -- If processing successful then
1717 p_message_name := NULL;
1718 RETURN TRUE;
1719 END;
1720 EXCEPTION
1721 WHEN OTHERS THEN
1722 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
1723 FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_VAL_SUSA.enrp_val_susa_us_act');
1724 IGS_GE_MSG_STACK.ADD;
1725 App_Exception.Raise_Exception;
1726 END enrp_val_susa_us_act;
1727 --
1728 -- Validate the student unit set attempt requires authorisation.
1729 FUNCTION ENRP_VAL_SUSA_US_ATH(
1730 p_unit_set_cd IN VARCHAR2 ,
1731 p_version_number IN NUMBER ,
1732 p_authorised_person_id IN NUMBER ,
1733 p_authorised_on IN DATE ,
1734 p_message_name OUT NOCOPY VARCHAR2 )
1735 RETURN BOOLEAN AS
1736
1737 BEGIN -- enrp_val_susa_us_ath
1738 -- This module validates that the IGS_EN_UNIT_SET being allocated to the
1739 -- IGS_AS_SU_SETATMPT requires authorisation.
1740 DECLARE
1741 v_auth_rqrd_ind IGS_EN_UNIT_SET.authorisation_rqrd_ind%TYPE;
1742 CURSOR c_us IS
1743 SELECT us.authorisation_rqrd_ind
1744 FROM IGS_EN_UNIT_SET us
1745 WHERE unit_set_cd = p_unit_set_cd AND
1746 version_number = p_version_number;
1747 BEGIN
1748 -- Set the default message number
1749 p_message_name := NULL;
1750 -- Validate that the is active and null expiry dt.
1751 OPEN c_us;
1752 FETCH c_us INTO v_auth_rqrd_ind;
1753 -- Validate that if the authorised indicator is set, then the
1754 -- authorised_person_id and authorised_on fields must be set.
1755
1756 IF c_us%FOUND THEN
1757 IF (v_auth_rqrd_ind = 'Y') AND
1758 (p_authorised_person_id IS NULL OR
1759 p_authorised_on IS NULL) THEN
1760 CLOSE c_us;
1761 p_message_name := 'IGS_EN_UNIT_SET_REQ_AUTHORISA';
1762 RETURN FALSE;
1763 END IF;
1764 END IF;
1765 CLOSE c_us;
1766 -- If processing successful then
1767 RETURN TRUE;
1768 EXCEPTION
1769 WHEN OTHERS THEN
1770 IF (c_us%NOTFOUND) THEN
1771 CLOSE c_us;
1772 END IF;
1773 END;
1774 EXCEPTION
1775 WHEN OTHERS THEN
1776 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
1777 FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_VAL_SUSA.enrp_val_susa_us_ath');
1778 IGS_GE_MSG_STACK.ADD;
1779
1780 App_Exception.Raise_Exception;
1781 END enrp_val_susa_us_ath;
1782 --
1783 -- Validation routines for student unit set attempt.
1784 FUNCTION ENRP_VAL_SUSA(
1785 p_person_id IN NUMBER ,
1786 p_course_cd IN VARCHAR2 ,
1787 p_unit_set_cd IN VARCHAR2 ,
1788 p_sequence_number IN NUMBER ,
1789 p_us_version_number IN NUMBER ,
1790 p_selection_dt IN DATE ,
1791 p_student_confirmed_ind IN VARCHAR2,
1792 p_end_dt IN DATE ,
1793 p_parent_unit_set_cd IN VARCHAR2 ,
1794 p_parent_sequence_number IN NUMBER ,
1795 p_primary_set_ind IN VARCHAR2,
1796 p_voluntary_end_ind IN VARCHAR2,
1797 p_authorised_person_id IN NUMBER ,
1798 p_authorised_on IN DATE ,
1799 p_override_title IN VARCHAR2 ,
1800 p_rqrmnts_complete_ind IN VARCHAR2,
1801 p_rqrmnts_complete_dt IN DATE ,
1802 p_s_completed_source_type IN VARCHAR2 ,
1803 p_action IN VARCHAR2 ,
1804 p_message_name OUT NOCOPY VARCHAR2 ,
1805 p_message_text OUT NOCOPY VARCHAR2 )
1806 RETURN BOOLEAN AS
1807
1808 BEGIN -- enrp_val_susa
1809 -- This module validates
1810 DECLARE
1811 v_message_name VARCHAR2(30);
1812 v_old_student_confirmed_ind
1813 IGS_AS_SU_SETATMPT.student_confirmed_ind%TYPE;
1814 CURSOR c_old_susa IS
1815 SELECT *
1816 FROM IGS_AS_SU_SETATMPT susa
1817 WHERE susa.person_id = p_person_id AND
1818 susa.course_cd = p_course_cd AND
1819 susa.unit_set_cd = p_unit_set_cd AND
1820 susa.sequence_number = p_sequence_number;
1821 v_old_susa_rec c_old_susa%ROWTYPE;
1822 cst_insert CONSTANT VARCHAR2 (6) := 'INSERT';
1823 cst_update CONSTANT VARCHAR2 (6) := 'UPDATE';
1824 cst_delete CONSTANT VARCHAR2 (6) := 'DELETE';
1825 cst_error CONSTANT VARCHAR2(1) := 'E';
1826
1827 v_inserting BOOLEAN := FALSE;
1828 v_updating BOOLEAN := FALSE;
1829 v_deleting BOOLEAN := FALSE;
1830 BEGIN
1831 IF p_action = cst_insert THEN
1832 v_inserting := TRUE;
1833 ELSIF p_action = cst_update THEN
1834 v_updating := TRUE;
1835 ELSIF p_action = cst_delete THEN
1836 v_deleting := TRUE;
1837 ELSE
1838 -- Invalid value for p_action.
1839 p_message_name := 'IGS_GE_INVALID_VALUE';
1840 RETURN FALSE;
1841 END IF;
1842 -- If updating, select the values of the record prior to update.
1843 IF v_updating THEN
1844 OPEN c_old_susa;
1845 FETCH c_old_susa INTO v_old_susa_rec;
1846 IF c_old_susa%NOTFOUND THEN
1847 CLOSE c_old_susa;
1848 Fnd_Message.Set_Name('IGS','IGS_EN_SU_SETATT_NOT_EXIST');
1849 IGS_GE_MSG_STACK.ADD;
1850
1851 App_Exception.Raise_Exception;
1852
1853 END IF;
1854 CLOSE c_old_susa;
1855 END IF;
1856 IF v_inserting THEN
1857 -- Validate the the unit set is able to be created.
1858 -- against the student course attempt.
1859 IF Igs_En_Val_Susa.enrp_val_susa_sca(
1860 p_person_id,
1861 p_course_cd,
1862 v_message_name) = FALSE THEN
1863 p_message_name := v_message_name;
1864 RETURN FALSE;
1865 END IF;
1866 -- Validate the the unit set is able to be created.
1867 -- The student cannot have completed it previously,
1868 -- no encumbrances must exist and it must be applicable
1869 -- to the course offering.
1870 IF Igs_En_Val_Susa.enrp_val_susa_ins(
1871 p_person_id,
1872 p_course_cd,
1873 p_unit_set_cd,
1874 p_sequence_number,
1875 p_us_version_number,
1876 v_message_name,
1877 'N') = FALSE THEN
1878 p_message_name := v_message_name;
1879 RETURN FALSE;
1880 END IF;
1881 END IF;
1882 -- Validate that the authorisation fields can only be set when end date is set
1883 -- or the unit set cd requires authorisation (IGS_EN_UNIT_SET.authorisation_ind = 'Y')
1884 IF v_inserting OR
1885 (v_updating AND
1886 ((NVL(p_authorised_person_id, 0) <>
1887 NVL(v_old_susa_rec.authorised_person_id, 0)) OR
1888 (NVL(p_authorised_on,IGS_GE_DATE.IGSDATE('1900/01/01'))
1889 <> NVL(v_old_susa_rec.authorised_on,
1890 IGS_GE_DATE.IGSDATE('1900/01/01'))))) THEN
1891 IF Igs_En_Val_Susa.enrp_val_susa_auth(
1892 p_unit_set_cd,
1893 p_us_version_number,
1894 p_end_dt,
1895 p_authorised_person_id,
1896 p_authorised_on,
1897 v_message_name,
1898 'N') = FALSE THEN
1899 p_message_name := v_message_name;
1900 RETURN FALSE;
1901 END IF;
1902 END IF;
1903 IF v_inserting OR
1904 (v_updating AND
1905 ((NVL(p_authorised_person_id, 0) <>
1906 NVL(v_old_susa_rec.authorised_person_id, 0)) OR
1907 (p_student_confirmed_ind <> v_old_susa_rec.student_confirmed_ind) OR
1908 (NVL(p_authorised_on,IGS_GE_DATE.IGSDATE('1900/01/01'))
1909 <> NVL(v_old_susa_rec.authorised_on,
1910 IGS_GE_DATE.IGSDATE('1900/01/01'))))) THEN
1911 -- Validate that the authorisation fields must be set when
1912 -- the unit set cd requires authorisation (IGS_EN_UNIT_SET.authorisation_ind = 'Y')
1913 -- Check required only when the unit set is confirmed.
1914 IF (p_student_confirmed_ind = 'Y') THEN
1915 IF Igs_En_Val_Susa.enrp_val_susa_us_ath(
1916 p_unit_set_cd,
1917 p_us_version_number,
1918 p_authorised_person_id,
1919
1920 p_authorised_on,
1921 v_message_name) = FALSE THEN
1922 p_message_name := v_message_name;
1923 RETURN FALSE;
1924 END IF;
1925 END IF;
1926 END IF;
1927 -- Validate that the completion fields can only be set when unit set is
1928 -- confirmed
1929 IF v_inserting OR
1930 (v_updating AND
1931 ((NVL(p_rqrmnts_complete_ind, 'x')
1932 <> NVL(v_old_susa_rec.rqrmnts_complete_ind, 'x')) OR
1933 (NVL(p_rqrmnts_complete_dt,IGS_GE_DATE.IGSDATE('1900/01/01'))
1934 <> NVL(v_old_susa_rec.rqrmnts_complete_dt,
1935 IGS_GE_DATE.IGSDATE('1900/01/01')))))THEN
1936 IF Igs_En_Val_Susa.enrp_val_susa_cmplt(
1937 p_rqrmnts_complete_dt,
1938 p_rqrmnts_complete_ind,
1939 p_student_confirmed_ind,
1940 v_message_name,
1941 'N') = FALSE THEN
1942 p_message_name := v_message_name;
1943 RETURN FALSE;
1944
1945 END IF;
1946 END IF;
1947 -- Validate that the system competed source type field can only be
1948 -- set when completion fields are set.
1949 IF v_inserting OR
1950 (v_updating AND
1951 ((NVL(p_rqrmnts_complete_ind, 'x')
1952 <> NVL(v_old_susa_rec.rqrmnts_complete_ind, 'x')) OR
1953 (NVL(p_s_completed_source_type, 'x')
1954 <> NVL(v_old_susa_rec.s_completed_source_type, 'x')) OR
1955 (NVL(p_rqrmnts_complete_dt,IGS_GE_DATE.IGSDATE('1900/01/01'))
1956 <> NVL(v_old_susa_rec.rqrmnts_complete_dt,
1957 IGS_GE_DATE.IGSDATE('1900/01/01')))))THEN
1958 IF Igs_En_Val_Susa.enrp_val_susa_scst(
1959 p_rqrmnts_complete_dt,
1960 p_rqrmnts_complete_ind,
1961 p_s_completed_source_type,
1962 v_message_name) = FALSE THEN
1963 p_message_name := v_message_name;
1964 RETURN FALSE;
1965 END IF;
1966 END IF;
1967 -- Validate the date fields.
1968
1969 IF v_inserting OR
1970 (v_updating AND
1971 ((NVL(p_selection_dt,IGS_GE_DATE.IGSDATE('1900/01/01'))
1972 <> NVL(v_old_susa_rec.selection_dt,
1973 IGS_GE_DATE.IGSDATE('1900/01/01'))) OR
1974 (NVL(p_end_dt,IGS_GE_DATE.IGSDATE('1900/01/01'))
1975 <> NVL(v_old_susa_rec.end_dt, IGS_GE_DATE.IGSDATE('1900/01/01'))) OR
1976 (NVL(p_rqrmnts_complete_dt,IGS_GE_DATE.IGSDATE('1900/01/01'))
1977 <> NVL(v_old_susa_rec.rqrmnts_complete_dt,
1978 IGS_GE_DATE.IGSDATE('1900/01/01'))))) THEN
1979 IF Igs_En_Val_Susa.enrp_val_susa_dts(
1980 p_selection_dt,
1981 p_end_dt,
1982 p_rqrmnts_complete_dt,
1983 v_message_name) = FALSE THEN
1984 p_message_name := v_message_name;
1985 RETURN FALSE;
1986 END IF;
1987 END IF;
1988 -- Validate that the selection date can only be set/unset when unit set is
1989 -- confirmed/unconfirmed
1990 IF v_inserting OR
1991 (v_updating AND
1992
1993 ((p_student_confirmed_ind <> v_old_susa_rec.student_confirmed_ind) OR
1994 (NVL(p_selection_dt,IGS_GE_DATE.IGSDATE('1900/01/01'))
1995 <> NVL(v_old_susa_rec.selection_dt,
1996 IGS_GE_DATE.IGSDATE('1900/01/01'))))) THEN
1997 IF Igs_En_Val_Susa.enrp_val_susa_sci_sd(
1998 p_student_confirmed_ind,
1999 p_selection_dt,
2000 v_message_name,
2001 'N') = FALSE THEN
2002 p_message_name := v_message_name;
2003 RETURN FALSE;
2004 END IF;
2005 END IF;
2006 -- Validate that the voluntary_end_ind can only be set when the end date is
2007 -- set.
2008 IF v_inserting OR
2009 (v_updating AND
2010 ((p_voluntary_end_ind <> v_old_susa_rec.voluntary_end_ind) OR
2011 (NVL(p_end_dt,IGS_GE_DATE.IGSDATE('1900/01/01'))
2012 <> NVL(v_old_susa_rec.end_dt, IGS_GE_DATE.IGSDATE('1900/01/01'))))) THEN
2013 IF Igs_En_Val_Susa.enrp_val_susa_end_vi(
2014 p_voluntary_end_ind,
2015 p_end_dt,
2016 v_message_name) = FALSE THEN
2017
2018 p_message_name := v_message_name;
2019 RETURN FALSE;
2020 END IF;
2021 END IF;
2022 -- Validate that the unit set version number cannot be updated.
2023 IF (v_updating AND
2024 (p_us_version_number <> v_old_susa_rec.us_version_number)) THEN
2025 p_message_name := 'IGS_EN_UNIT_SET_VERNUM_NOTUPD';
2026 RETURN FALSE;
2027 END IF;
2028 IF v_deleting THEN
2029 -- Validate that the records can be deleted.
2030 IF Igs_En_Val_Susa.enrp_val_susa_del(
2031 p_person_id,
2032 p_course_cd,
2033 p_unit_set_cd,
2034 p_sequence_number,
2035 p_us_version_number,
2036 p_end_dt,
2037 p_rqrmnts_complete_ind,
2038 'N', -- Indicating not called from trigger.
2039 v_message_name) = FALSE THEN
2040
2041 p_message_name := v_message_name;
2042 RETURN FALSE;
2043 END IF;
2044 END IF;
2045 IF v_inserting THEN
2046 -- Validate the the unit set is able to be created
2047 -- with the unit set status being valid and the
2048 -- expiry date not set. If set then person must have
2049 -- previously selected it.
2050 IF Igs_En_Val_Susa.enrp_val_susa_us_act(
2051 p_person_id,
2052 p_course_cd,
2053 p_unit_set_cd,
2054 p_sequence_number,
2055 p_us_version_number,
2056 v_message_name) = FALSE THEN
2057 p_message_name := v_message_name;
2058 RETURN FALSE;
2059 END IF;
2060 END IF;
2061 -- Validate the unit set parent relationship.
2062 IF v_inserting OR
2063
2064 (v_updating AND
2065 ((NVL(p_parent_unit_set_cd, 'NULL')
2066 <> NVL(v_old_susa_rec.parent_unit_set_cd, 'NULL')) OR
2067 (NVL(p_parent_sequence_number, 0)
2068 <> NVL(v_old_susa_rec.parent_sequence_number, 0)))) THEN
2069 -- Validate if the unit set is to be defined as a subordinate or if
2070 -- relationship specified, that it is valid within the course offering.
2071 IF Igs_En_Val_Susa.enrp_val_susa_cousr(
2072 p_person_id,
2073 p_course_cd,
2074 p_unit_set_cd,
2075 p_us_version_number,
2076 p_parent_unit_set_cd,
2077 p_parent_sequence_number,
2078 cst_error,
2079 v_message_name,
2080 'N') = FALSE THEN
2081 p_message_name := v_message_name;
2082 RETURN FALSE;
2083 END IF;
2084 -- Validate if the parent unit set has a null end date, unit set is
2085 -- not being linked to itself (directly or indirectly). Cannot be
2086 -- confirmed if parent is unconfirmed.
2087
2088 IF Igs_En_Val_Susa.enrp_val_susa_parent(
2089 p_person_id,
2090 p_course_cd,
2091 p_unit_set_cd,
2092 p_sequence_number,
2093 p_parent_unit_set_cd,
2094 p_parent_sequence_number,
2095 p_student_confirmed_ind,
2096 v_message_name,
2097 'N') = FALSE THEN
2098 p_message_name := v_message_name;
2099 RETURN FALSE;
2100 END IF;
2101 END IF;
2102 IF v_inserting OR
2103 (NVL(p_end_dt,IGS_GE_DATE.IGSDATE('1900/01/01'))
2104 <> NVL(v_old_susa_rec.end_dt, IGS_GE_DATE.IGSDATE('1900/01/01'))) THEN
2105 -- Validate the end date, check if the authorisation details
2106 -- need to be set or if more than one open end dated instance
2107 -- of the unit set exists. Also cannot be cleared if parent ended.
2108 -- If part of the admissions offer, authorisation required to end
2109 -- the unit set.
2110 IF Igs_En_Val_Susa.enrp_val_susa_end_dt(
2111 p_person_id,
2112 p_course_cd,
2113 p_unit_set_cd,
2114 p_sequence_number,
2115 p_us_version_number,
2116 p_end_dt,
2117 p_authorised_person_id,
2118 p_authorised_on,
2119 p_parent_unit_set_cd,
2120 p_parent_sequence_number,
2121 cst_error,
2122 v_message_name,
2123 'N') = FALSE THEN
2124 -- Check if warning message returned.
2125 IF v_message_name <> 'IGS_EN_UNITSET_REQ_AUTHORISAT' THEN
2126 p_message_name := v_message_name;
2127 RETURN FALSE;
2128 END IF;
2129 END IF;
2130 -- If updating and the end date has been set, validate that it is
2131 -- possible to cascade the end date through to any descendant unit sets
2132 -- (Inserted records cannot have children at that point).
2133 IF v_updating AND
2134
2135 p_end_dt IS NOT NULL THEN
2136
2137 IF Igs_En_Val_Susa.enrp_val_susa_ed_upd(
2138 p_person_id,
2139 p_course_cd,
2140 p_unit_set_cd,
2141 p_sequence_number,
2142 p_end_dt,
2143 p_voluntary_end_ind,
2144 p_authorised_person_id,
2145 p_authorised_on,
2146 v_message_name) = FALSE THEN
2147 p_message_name := v_message_name;
2148 RETURN FALSE;
2149 END IF;
2150 END IF;
2151 END IF;
2152 IF (v_inserting AND p_student_confirmed_ind = 'Y') OR
2153 (v_updating AND
2154 (p_student_confirmed_ind <> v_old_susa_rec.student_confirmed_ind)) THEN
2155 -- Validate that the unit set is not confirmed when the student course
2156 -- attempt is unconfirmed.
2157 -- Also check that not unset one end date or complete date set. Cannot be
2158
2159 -- confirmed and linked to a parent that is unconfirmed. Cannot be
2160 -- confirmed if encumbrances exist.
2161 IF Igs_En_Val_Susa.enrp_val_susa_sci(
2162 p_person_id,
2163 p_course_cd,
2164 p_unit_set_cd,
2165 p_sequence_number,
2166 p_us_version_number,
2167 p_parent_unit_set_cd,
2168 p_parent_sequence_number,
2169 p_student_confirmed_ind,
2170 p_selection_dt,
2171 p_end_dt,
2172 p_rqrmnts_complete_ind,
2173 v_message_name,
2174 'N') = FALSE THEN
2175 p_message_name := v_message_name;
2176 RETURN FALSE;
2177 END IF;
2178 -- Validate that if student confirmation indicator set, check if passes
2179 -- any associated rules.
2180 IF v_inserting THEN
2181 v_old_student_confirmed_ind := NULL;
2182
2183 ELSE
2184 v_old_student_confirmed_ind := v_old_susa_rec.student_confirmed_ind;
2185 END IF;
2186 IF Igs_En_Val_Susa.enrp_val_susa_sci_rl(
2187 p_person_id,
2188 p_course_cd,
2189 p_unit_set_cd,
2190 p_us_version_number,
2191 p_student_confirmed_ind,
2192 v_old_student_confirmed_ind,
2193 v_message_name,
2194 p_message_text) = FALSE THEN
2195 p_message_name := v_message_name;
2196 RETURN FALSE;
2197 END IF;
2198 -- If updating and the student confirmed indicator is being unset,
2199 -- then validate that able to unset any descendant unit sets. (Only concerned
2200 -- with update as unit set cannot have descendant at the point of
2201 -- creation).
2202 IF v_updating AND
2203 p_student_confirmed_ind = 'N' THEN
2204
2205 IF Igs_En_Val_Susa.enrp_val_susa_sci_up(
2206 p_person_id,
2207 p_course_cd,
2208 p_unit_set_cd,
2209 p_sequence_number,
2210 p_student_confirmed_ind,
2211 v_message_name) = FALSE THEN
2212 p_message_name := v_message_name;
2213 RETURN FALSE;
2214 END IF;
2215 END IF;
2216 END IF;
2217 -- Validate if the primary set indicator.
2218 IF v_inserting OR
2219 (v_updating AND
2220 (p_primary_set_ind <> v_old_susa_rec.primary_set_ind)) THEN
2221 -- Validate the primary set indicator is only set for
2222 -- non-administrative sets and that there does not already
2223 -- exist a unit set that has a higher rank.
2224 IF Igs_En_Val_Susa.enrp_val_susa_prmry(
2225 p_person_id,
2226 p_course_cd,
2227
2228 p_unit_set_cd,
2229 p_us_version_number,
2230 p_primary_set_ind,
2231 v_message_name,
2232 'N') = FALSE THEN
2233 p_message_name := v_message_name;
2234 RETURN FALSE;
2235 END IF;
2236 END IF;
2237 p_message_name := NULL;
2238 RETURN TRUE;
2239 END;
2240 EXCEPTION
2241 WHEN OTHERS THEN
2242 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
2243 FND_MESSAGE.SET_TOKEN('NAME','Igs_En_Val_Susa.enrp_val_susa');
2244 IGS_GE_MSG_STACK.ADD;
2245 App_Exception.Raise_Exception;
2246
2247 END enrp_val_susa;
2248 --
2249 -- Validate the cascading setting of the end date of an susa record.
2250 FUNCTION ENRP_VAL_SUSA_ED_UPD(
2251 p_person_id IN NUMBER ,
2252 p_course_cd IN VARCHAR2 ,
2253 p_unit_set_cd IN VARCHAR2 ,
2254 p_sequence_number IN NUMBER ,
2255 p_end_dt IN DATE ,
2256 p_voluntary_end_ind IN VARCHAR2,
2257 p_authorised_person_id IN NUMBER ,
2258 p_authorised_on IN DATE ,
2259 p_message_name OUT NOCOPY VARCHAR2 )
2260 RETURN BOOLEAN AS
2261
2262 BEGIN -- enrp_val_susa_ed_upd
2263 -- This module is called when a IGS_AS_SU_SETATMPT is ended (end_dt set).
2264 -- This module will check if the unit set has any child unit sets and
2265 -- validate if able to set the end_dt and associated authorisation details
2266 -- for all children
2267 DECLARE
2268 v_unit_set_cd IGS_AS_SU_SETATMPT.unit_set_cd%TYPE;
2269 v_us_version_number IGS_AS_SU_SETATMPT.us_version_number%TYPE;
2270 v_sequence_number IGS_AS_SU_SETATMPT.sequence_number%TYPE;
2271 v_authorised_person_id IGS_AS_SU_SETATMPT.authorised_person_id%TYPE;
2272 v_authorised_on IGS_AS_SU_SETATMPT.authorised_on%TYPE;
2273 v_selection_dt IGS_AS_SU_SETATMPT.selection_dt%TYPE;
2274
2275 v_end_dt IGS_AS_SU_SETATMPT.end_dt%TYPE;
2276 v_rqrmnts_complete_dt IGS_AS_SU_SETATMPT.rqrmnts_complete_dt%TYPE;
2277 v_parent_unit_set_cd IGS_AS_SU_SETATMPT.parent_unit_set_cd%TYPE;
2278 v_parent_sequence_number IGS_AS_SU_SETATMPT.parent_sequence_number%TYPE;
2279 v_student_confirmed_ind IGS_AS_SU_SETATMPT.student_confirmed_ind%TYPE;
2280 v_primary_set_ind IGS_AS_SU_SETATMPT.primary_set_ind%TYPE;
2281 v_voluntary_end_ind IGS_AS_SU_SETATMPT.voluntary_end_ind%TYPE;
2282 v_override_title IGS_AS_SU_SETATMPT.override_title%TYPE;
2283 v_rqrmnts_complete_ind IGS_AS_SU_SETATMPT.rqrmnts_complete_ind%TYPE;
2284 v_s_completed_source_type
2285 IGS_AS_SU_SETATMPT.s_completed_source_type%TYPE;
2286 v_message_name VARCHAR2(30);
2287 v_message_text VARCHAR2 (2000) := NULL;
2288 CURSOR c_susa IS
2289 SELECT susa.unit_set_cd,
2290 susa.us_version_number,
2291 susa.sequence_number,
2292 susa.authorised_person_id,
2293 susa.authorised_on,
2294 susa.selection_dt,
2295 susa.end_dt,
2296 susa.rqrmnts_complete_dt,
2297 susa.parent_unit_set_cd,
2298
2299 susa.parent_sequence_number,
2300 susa.student_confirmed_ind,
2301 susa.primary_set_ind,
2302 susa.voluntary_end_ind,
2303 susa.override_title,
2304 susa.rqrmnts_complete_ind,
2305 susa.s_completed_source_type
2306 FROM IGS_AS_SU_SETATMPT susa
2307 START WITH susa.person_id = p_person_id AND
2308 susa.course_cd = p_course_cd AND
2309 susa.parent_unit_set_cd = p_unit_set_cd AND
2310 susa.parent_sequence_number = p_sequence_number
2311 CONNECT BY
2312 PRIOR susa.person_id = susa.person_id AND
2313 PRIOR susa.course_cd = susa.course_cd AND
2314 PRIOR susa.unit_set_cd = susa.parent_unit_set_cd AND
2315 PRIOR susa.sequence_number = susa.parent_sequence_number;
2316 BEGIN
2317 -- Set the default message number
2318 p_message_name := NULL;
2319 OPEN c_susa;
2320 FETCH c_susa INTO v_unit_set_cd,
2321 v_us_version_number,
2322
2323 v_sequence_number,
2324 v_authorised_person_id,
2325 v_authorised_on,
2326 v_selection_dt,
2327 v_end_dt,
2328 v_rqrmnts_complete_dt,
2329 v_parent_unit_set_cd,
2330 v_parent_sequence_number,
2331 v_student_confirmed_ind,
2332 v_primary_set_ind,
2333 v_voluntary_end_ind,
2334 v_override_title,
2335 v_rqrmnts_complete_ind,
2336 v_s_completed_source_type;
2337 LOOP
2338 EXIT WHEN (c_susa%NOTFOUND);
2339 -- For each descendant record found, validate if able to then end the unit
2340 -- set.
2341 IF (v_end_dt IS NULL AND
2342 v_rqrmnts_complete_dt IS NULL) THEN
2343 -- Determine if authorised person id required to be updated (That is, if
2344 -- authorise parameter fields null then do not alter fields.)
2345 IF (p_authorised_person_id IS NOT NULL OR
2346
2347 p_authorised_on IS NOT NULL) THEN
2348 v_authorised_person_id := p_authorised_person_id;
2349 v_authorised_on := p_authorised_on;
2350 END IF;
2351 -- Validate that able to update the record.
2352 IF Igs_En_Val_Susa.enrp_val_susa(
2353 p_person_id,
2354 p_course_cd,
2355 v_unit_set_cd,
2356 v_sequence_number,
2357 v_us_version_number,
2358 v_selection_dt,
2359 v_student_confirmed_ind,
2360 p_end_dt,
2361 v_parent_unit_set_cd,
2362 v_parent_sequence_number,
2363 v_primary_set_ind,
2364 p_voluntary_end_ind,
2365 v_authorised_person_id,
2366 v_authorised_on,
2367 v_override_title,
2368 v_rqrmnts_complete_ind,
2369 v_rqrmnts_complete_dt,
2370
2371 v_s_completed_source_type,
2372 'UPDATE',
2373 v_message_name,
2374 v_message_text) = FALSE THEN
2375 -- Ignore v_message_text as rules are not used here in any validation.
2376 CLOSE c_susa;
2377 p_message_name := v_message_name;
2378 RETURN FALSE;
2379 END IF;
2380 END IF;
2381 FETCH c_susa INTO v_unit_set_cd,
2382 v_us_version_number,
2383 v_sequence_number,
2384 v_authorised_person_id,
2385 v_authorised_on,
2386 v_selection_dt,
2387 v_end_dt,
2388 v_rqrmnts_complete_dt,
2389 v_parent_unit_set_cd,
2390 v_parent_sequence_number,
2391 v_student_confirmed_ind,
2392 v_primary_set_ind,
2393 v_voluntary_end_ind,
2394
2395 v_override_title,
2396 v_rqrmnts_complete_ind,
2397 v_s_completed_source_type;
2398 END LOOP;
2399 CLOSE c_susa;
2400 -- If processing successful then
2401 RETURN TRUE;
2402 EXCEPTION
2403 WHEN OTHERS THEN
2404 IF c_susa%ISOPEN THEN
2405 CLOSE c_susa;
2406 END IF;
2407 RAISE;
2408 END;
2409 EXCEPTION
2410 WHEN OTHERS THEN
2411 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
2412 FND_MESSAGE.SET_TOKEN('NAME','Igs_En_Val_Susa.enrp_val_susa_ed_upd');
2413 IGS_GE_MSG_STACK.ADD;
2414 App_Exception.Raise_Exception;
2415 END enrp_val_susa_ed_upd;
2416 --
2417 -- Validate cascade unsetting of stdnt unit set atmpt confirmation ind.
2418
2419 FUNCTION ENRP_VAL_SUSA_SCI_UP(
2420 p_person_id IN NUMBER ,
2421 p_course_cd IN VARCHAR2 ,
2422 p_unit_set_cd IN VARCHAR2 ,
2423 p_sequence_number IN NUMBER ,
2424 p_student_confirmed_ind IN VARCHAR2,
2425 p_message_name OUT NOCOPY VARCHAR2 )
2426 RETURN BOOLEAN AS
2427
2428 BEGIN -- enrp_val_susa_sci_up
2429 -- This module is called when the student_confimed_ind is unset.
2430 -- This module will check if the unit set has any child unit sets and
2431 -- validate if able unset the the student_confirmed_ind for all children.
2432 DECLARE
2433 v_enrp_val_susa_sci BOOLEAN;
2434 v_susa_rec_found BOOLEAN;
2435 v_message_name VARCHAR2(30);
2436 v_message_text VARCHAR2 (2000) := NULL;
2437 CURSOR c_susa IS
2438 SELECT susa.unit_set_cd,
2439 susa.us_version_number,
2440 susa.sequence_number,
2441 susa.authorised_person_id,
2442
2443 susa.authorised_on,
2444 susa.selection_dt,
2445 susa.end_dt,
2446 susa.rqrmnts_complete_dt,
2447 susa.parent_unit_set_cd,
2448 susa.parent_sequence_number,
2449 susa.student_confirmed_ind,
2450 susa.primary_set_ind,
2451 susa.voluntary_end_ind,
2452 susa.override_title,
2453 susa.rqrmnts_complete_ind,
2454 susa.s_completed_source_type
2455 FROM IGS_AS_SU_SETATMPT susa
2456 START WITH susa.person_id = p_person_id AND
2457 susa.course_cd = p_course_cd AND
2458 susa.parent_unit_set_cd = p_unit_set_cd AND
2459 susa.parent_sequence_number = p_sequence_number
2460 CONNECT BY
2461 PRIOR susa.person_id = susa.person_id AND
2462 PRIOR susa.course_cd = susa.course_cd AND
2463 PRIOR susa.unit_set_cd = susa.parent_unit_set_cd AND
2464 PRIOR susa.sequence_number = susa.parent_sequence_number;
2465 BEGIN
2466
2467 v_enrp_val_susa_sci := TRUE;
2468 v_susa_rec_found := FALSE;
2469
2470 -- Set the default message number
2471 p_message_name := NULL;
2472 -- If student confirmed indicator is NULL or 'Y' then
2473 -- not concerned with updating children
2474 IF p_student_confirmed_ind = 'Y' OR
2475 p_student_confirmed_ind IS NULL THEN
2476 p_message_name := NULL;
2477 RETURN TRUE;
2478 END IF;
2479 -- Process all descendants of the unit set and to validate if able
2480 -- to unset the student confirmed indicator.
2481 -- For each descendant record found, validate unsetting of the student
2482 -- confirmed indicator.
2483 FOR v_susa_rec IN c_susa LOOP
2484 v_susa_rec_found := TRUE;
2485 IF v_susa_rec.student_confirmed_ind = 'Y' THEN
2486 -- Validate that able to update the record.
2487 IF Igs_En_Val_Susa.enrp_val_susa(
2488 p_person_id,
2489 p_course_cd,
2490 v_susa_rec.unit_set_cd,
2491 v_susa_rec.sequence_number,
2492 v_susa_rec.us_version_number,
2493
2494 NULL, -- selection_dt
2495 'N', -- student_confirmed_ind
2496 v_susa_rec.end_dt,
2497 v_susa_rec.parent_unit_set_cd,
2498 v_susa_rec.parent_sequence_number,
2499 v_susa_rec.primary_set_ind,
2500 v_susa_rec.voluntary_end_ind,
2501 v_susa_rec.authorised_person_id,
2502 v_susa_rec.authorised_on,
2503 v_susa_rec.override_title,
2504 v_susa_rec.rqrmnts_complete_ind,
2505 v_susa_rec.rqrmnts_complete_dt,
2506 v_susa_rec.s_completed_source_type,
2507 'UPDATE',
2508 v_message_name,
2509 v_message_text) = FALSE THEN
2510 -- Ignore v_message_text as rules are not used here in any validation.
2511 p_message_name := v_message_name;
2512 v_enrp_val_susa_sci := FALSE;
2513 EXIT;
2514 END IF;
2515 END IF;
2516 END LOOP;
2517
2518 IF (v_susa_rec_found = TRUE AND
2519 v_enrp_val_susa_sci = FALSE) THEN
2520 RETURN FALSE;
2521 END IF;
2522 RETURN TRUE;
2523 EXCEPTION
2524 WHEN OTHERS THEN
2525 IF c_susa%ISOPEN THEN
2526 CLOSE c_susa;
2527 END IF;
2528 RAISE;
2529 END;
2530 EXCEPTION
2531 WHEN NO_DATA_FOUND THEN
2532 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
2533 FND_MESSAGE.SET_TOKEN('NAME','Igs_En_Val_Susa.enrp_val_susa_sci_up');
2534 IGS_GE_MSG_STACK.ADD;
2535 App_Exception.Raise_Exception;
2536 END enrp_val_susa_sci_up;
2537 --
2538 -- Validate the requirement complete fields for IGS_AS_SU_SETATMPT.
2539 FUNCTION enrp_val_susa_scst(
2540 p_rqrmnts_complete_dt IN DATE ,
2541 p_rqrmnts_complete_ind IN VARCHAR2,
2542 p_s_completed_source_type IN VARCHAR2,
2543 p_message_name OUT NOCOPY VARCHAR2 )
2544 RETURN BOOLEAN AS
2545
2546 BEGIN -- enrp_val_susa_scst
2547 -- This module validates the system completed source type
2548 -- field associated with the IGS_AS_SU_SETATMPT:
2549 -- - s_completed_source_type can only be set if rqrmnts_complete_dt
2550 -- and rqrmnts_complete_ind fields are set.
2551 DECLARE
2552 BEGIN
2553 -- s_completed_source_type can only be set if rqrmnts_complete_dt and
2554 -- rqrmnts_complete_ind fields are set.
2555 IF (p_rqrmnts_complete_ind = 'N' AND
2556 p_rqrmnts_complete_dt IS NULL AND
2557 p_s_completed_source_type IS NOT NULL) THEN
2558 p_message_name := 'IGS_EN_SYS_COMPL_SRCTYPE_SET';
2559 RETURN FALSE;
2560 END IF;
2561 p_message_name := NULL;
2562 RETURN TRUE;
2563 END;
2564
2565 EXCEPTION
2566 WHEN OTHERS THEN
2567 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
2568 FND_MESSAGE.SET_TOKEN('NAME','Igs_En_Val_Susa.enrp_val_susa_scst');
2569 IGS_GE_MSG_STACK.ADD;
2570 App_Exception.Raise_Exception;
2571 END enrp_val_susa_scst;
2572 --
2573 -- Validate a person id.
2574 --
2575
2576 END Igs_En_Val_Susa;