1 PACKAGE BODY IGS_EN_VAL_SUA AS
2 /* $Header: IGSEN68B.pls 120.19 2006/06/05 10:12:58 smaddali ship $ */
3 -------------------------------------------------------------------------------------------
4 --Change History:
5 --Who When What
6 --smadathi 29-AUG-2001 Bug No. 1956374 .The Function genp_val_sdtt_sess removed
7 --smadathi 29-AUG-2001 Bug No. 1956374 .The Function genp_val_staff_prsn removed
8 --nalkumar 04-May-2002 Modified the enrp_val_sua_delete procedure as per the Bug# 2356997.
9 --Nishikant 13-may-2002 Bug#2364216. A small modification in the function enrp_val_sua_enr_dt got.
10 --prraj 16-May-2002 Changed condition that checks for credit points not syncing with
11 -- credit point min/max/increment in FUNCTION enrp_val_sua_ovrd_cp as part of (Bug# 2375757)
12 --Sudhir 23-MAY-2002 Changed the message from IGS_EN_ADMIN_UNITST_NOTVALID to IGS_SS_EN_INVLD_ADMIN_UNITST
13 -- and the req. logic for procedure enrp_val_discont_aus.Also Added out NOCOPY parameter for
14 -- procedure enrp_val_discont_aus.
15 --svenkata 20-Nov-2002 Added a new parameter p_legacy to selectively carry out NOCOPY validations for legacy.
16 -- The following routines have been modified : enrp_val_sua_uoo , enrp_val_sua_enr_dt,
17 -- enrp_val_sua_advstnd,resp_val_sua_cnfrm,enrp_val_sua_discont,enrp_val_discont_aus
18 -- amuthu 20-JAn-2003 Added the no_assessment_ind column to the function enrp_val_sua_ovrd_cp
19 -- if the value of this column is 'Y' and the Acheivable CP is zero then
20 -- do not validate the acheivalbe CP.
21 -- amuthu 04-FEB-2003 Modified the function enrp_get_sua_ausg to consider only audit grades
22 -- for audit units and only non-audit grades for non-audit unit attempts
23 -- sarakshi 24-Feb-2003 Enh#2797116,modified cursor c_coo in function's enrp_val_coo_loc and enrp_val_coo_mode
24 -- to add delete_flag check in the where clause
25 -- myoganat 23-MAY-2003 Modified the cursor C_SUA_UV in procedure ENRP_VAL_COO_CROSS
26 -- as part of Bug #2855870
27 -- svenkata 3-Jun-2003 The function ENRP_VAL_COO_CROSS has been removed. The same functionality has been implemented as
28 -- cross-element restrictions of Validations. Bug# 2829272
29 --svanukur 26-jun-2003 checking if discontinued date is set for dropped unit attempt status , then the validations
30 -- for discotinued unit attempts return true from functions enrp_val_discont_aus and
31 -- enrp_val_sua_discont as part of bug 2898213.
32 -- ptandon 04-Jul-2003 Modified the function enrp_val_discont_aus to return list of valid administrative unit statuses
33 -- for discontinuation which was initially returning NULL as part of Bug# 3036433
34 -- amuthu 07-JUL-2003 Added logic to check if the program attempt status is not Unconfirm/discontin
35 -- when the unit attempt status is enrolled or invalid.
36 -- amuthu 04-AUG-2003 Bypassed the discontinuation validation for a dropped unit attempt in enrp_val_sua_discont
37 -- rvivekan 09-sep-2003 Modified the behaviour of repeatable_ind column in igs_ps_unit_ver table. PSP integration build #3052433
38 --svanukur 18-oct-2003 created procedures enr_sub_units and drop_sub_units as part of placements build 3052438
39 --rvivekan 17-nov-2003 Bug3264064. Changed the datatype of variables holding the concatenated administrative unit status list
40 -- to varchar(2000) in enrp_val_discont_aus
41 --ptandon 29-Dec-2003 Removed the exception handling sections of enrp_val_sua_cnfrm, enrp_val_sua_insert,
42 -- enrp_val_sua_intrmt, resp_val_sua_cnfrm, enrp_val_sua_excld, enrp_val_sua_advstnd,
43 -- enrp_val_coo_loc, enrp_val_coo_mode, enrp_val_sua_enr_dt, enrp_val_sua_ci and enrp_val_sua_dupl
44 -- so that the correct error message is displayed instead of the unhandled exception message.
45 -- Bug# 3328268.
46 --smvk 09-Jul-2004 Bug # 3676145. Modified the cursors c_unit_class to select active (not closed) unit classes.
47 -- rnirwani 13-Sep-2004 changed cursor c_sci_details (ENRP_VAL_SUA_INTRMT) to not consider logically deleted records and
48 -- also to avoid un-approved intermission records. Bug# 3885804
49 -- ckasu 17-Nov-2004 modfied the ENRP_VAL_SUA_CNFRM_P procedure inorder to consider enrollment Category setup
50 -- for checking the Forced location, attendance mode as apart of Program
51 -- Transfer Build#4000939
52 -- amuthu 26-NOV-2004 modified logic in two methods to allow the insertion of completed and dicontinued unit attempts
53 -- amuthu 03-DEC-2004 On enrolling user was getting invalid cursor, fixed the issue
54 -- ckasu 21-Dec-2004 modified enrp_val_sua_update procedure inorder to Transfer Unit outcomes in ABA Transfer as a part
55 -- of bug# 4080883
56 -- sgurusam 17-Jun-2005 Modified to pass aditional parameter p_calling_obj = 'JOB' in the calls to
57 -- igs_ss_en_wrappers.insert_into_enr_worksheet, igs_en_elgbl_unit.eval_unit_forced_location,
58 -- and igs_en_elgbl_unit.eval_unit_forced_mode.
59 -- bdeviset 24-Nov_2005 Added proc validate_mus for bug#4676023
60 -- ckasu 28-NOV-2005 modified v_message_name <> NULL to v_message_name IS NOT NULL in enrp_val_sua_dupl Function
61 -- as a part of bug #4666102
62 -- smaddali 10-apr-06 Modified ENRP_VAL_SUA_INTRMT for bug#5091858 BUILD EN324
63 --ckasu 02-May-2006 Modified as a part of bug#5191592
64 -------------------------------------------------------------------------------------------
65 -- To validate the confirmation of a research unit attempt.
66 FUNCTION RESP_VAL_SUA_CNFRM(
67 p_person_id IN NUMBER ,
68 p_course_cd IN VARCHAR2 ,
69 p_unit_cd IN VARCHAR2 ,
70 p_version_number IN NUMBER ,
71 p_cal_type IN VARCHAR2 ,
72 p_ci_sequence_number IN NUMBER ,
73 p_message_name OUT NOCOPY VARCHAR2 ,
74 p_legacy IN VARCHAR2 )
75 RETURN boolean AS
76
77 BEGIN -- resp_val_sua_cnfrm
78 -- Validate a research student unit attempt being added to a research student
79 --(note: this routine is checking confirmation point ?
80 -- there is another routine to check commit point processing),
81 -- checking for :
82 -- * That the student has a candidature record
83 -- * That the student has supervisors to cover the entire duration
84 -- of the teaching period
85 DECLARE
86 v_rsup_record_not_found BOOLEAN;
87 v_teach_days NUMBER;
88 v_teach_end_dt DATE;
89 v_teach_start_dt DATE;
90 v_check_dt DATE;
91 CURSOR c_uv IS
92 SELECT 'x'
93 FROM IGS_PS_UNIT_VER uv
94 WHERE uv.unit_cd = p_unit_cd AND
95 uv.version_number = p_version_number AND
96 uv.research_unit_ind <> 'N';
97 v_uv_exists VARCHAR2(1);
98 CURSOR c_ca IS
99 SELECT ca.sequence_number
100 FROM IGS_RE_CANDIDATURE ca
101 WHERE ca.person_id = p_person_id AND
102 (ca.sca_course_cd IS NOT NULL AND
103 ca.sca_course_cd = p_course_cd);
104 v_ca_sequence_number IGS_RE_CANDIDATURE.sequence_number%TYPE;
105 CURSOR c_rsup(
106 cp_ca_sequence_number IGS_RE_CANDIDATURE.sequence_number%TYPE) IS
107 SELECT rsup.start_dt
108 FROM IGS_RE_SPRVSR rsup
109 WHERE rsup.ca_person_id = p_person_id AND
110 rsup.ca_sequence_number = cp_ca_sequence_number AND
111 rsup.start_dt <= v_teach_end_dt AND
112 (rsup.end_dt IS NULL OR
113 rsup.end_dt >= v_teach_start_dt)
114 ORDER BY rsup.start_dt ASC;
115
116 --tray
117 CURSOR c_com_dt(p_person_id IGS_EN_STDNT_PS_ATT_ALL.Person_id%TYPE,
118 p_course_cd IGS_EN_STDNT_PS_ATT_ALL.Course_cd%TYPE)IS
119 SELECT commencement_dt from igs_en_stdnt_ps_att_all
120 WHERE person_id = p_person_id
121 AND course_cd = p_course_cd;
122 v_commencement_dt igs_en_stdnt_ps_att_all.commencement_dt%TYPE;
123
124 FUNCTION respl_check_percentage(
125 pl_ca_sequence_number IGS_RE_CANDIDATURE.sequence_number%TYPE,
126 pl_check_dt IGS_RE_SPRVSR.start_dt%TYPE)
127 RETURN BOOLEAN AS
128
129 BEGIN
130 -- This is a local function to check the total percentages of
131 -- funding and supervision for the research_supervior
132 DECLARE
133 vl_total_supervision NUMBER;
134 vl_total_funding NUMBER;
135 CURSOR c_rsup_chk_pct IS
136 SELECT SUM(NVL(rsup.supervision_percentage, 0)),
137 SUM(NVL(rsup.funding_percentage, 0))
138 FROM IGS_RE_SPRVSR rsup
139 WHERE rsup.ca_person_id = p_person_id AND
140 rsup.ca_sequence_number = pl_ca_sequence_number AND
141 rsup.start_dt <= pl_check_dt AND
142 (rsup.end_dt IS NULL OR
143 rsup.end_dt >= pl_check_dt);
144 CURSOR c_rsup_per_type IS
145 SELECT IGS_EN_GEN_003.Get_Staff_Ind( rsup.person_id) person_type
146 FROM IGS_RE_SPRVSR rsup
147 WHERE rsup.ca_person_id = p_person_id AND
148 rsup.ca_sequence_number = pl_ca_sequence_number AND
149 rsup.start_dt <= pl_check_dt AND
150 (rsup.end_dt IS NULL OR
151 rsup.end_dt >= pl_check_dt);
152 l_person_type c_rsup_per_type%ROWTYPE ;
153 BEGIN
154 OPEN c_rsup_chk_pct;
155 FETCH c_rsup_chk_pct INTO vl_total_supervision,
156 vl_total_funding;
157 IF c_rsup_chk_pct%NOTFOUND OR
158 vl_total_supervision < 100 THEN
159 CLOSE c_rsup_chk_pct;
160 p_message_name := 'IGS_RE_CAND_DOES_NOT_HAVE_SUP';
161 RETURN FALSE;
162 END IF;
163 IF NVL(vl_total_funding,0) < 100 THEN
164 FOR l_person_type IN c_rsup_per_type LOOP
165 IF l_person_type.person_type = 'Y' THEN
166 p_message_name := 'IGS_RE_CAND_DOES_NOT_HAVE_SUP';
167 RETURN FALSE;
168 END IF;
169 END LOOP;
170 END IF;
171 CLOSE c_rsup_chk_pct;
172 RETURN TRUE;
173 EXCEPTION
174 WHEN OTHERS THEN
175 IF c_rsup_chk_pct%ISOPEN THEN
176 CLOSE c_rsup_chk_pct;
177 END IF;
178 RAISE;
179 END;
180 END respl_check_percentage;
181 BEGIN
182 -- Set the default message number
183 p_message_name := null;
184 OPEN c_uv;
185 FETCH c_uv INTO v_uv_exists;
186 IF c_uv%NOTFOUND THEN
187 CLOSE c_uv;
188 -- invalid parameters
189 RETURN TRUE;
190 END IF;
191 CLOSE c_uv;
192 --1. Check that student has a candidature matching the course attempt.
193 OPEN c_ca;
194 FETCH c_ca INTO v_ca_sequence_number;
195 IF c_ca%NOTFOUND THEN
196
197 CLOSE c_ca;
198 p_message_name := 'IGS_RE_MUST_HAVE_RES_CANDIDAT';
199 IF p_legacy <> 'Y' THEN
200 RETURN FALSE;
201 ELSE
202 Fnd_Message.Set_Name('IGS', p_message_name );
203 FND_MSG_PUB.ADD;
204 END IF;
205 ELSE
206 CLOSE c_ca;
207 END IF;
208
209 IF p_cal_type IS NULL OR p_ci_sequence_number IS NULL THEN
210 -- Remaining validations don't apply without calendar details.
211 RETURN TRUE;
212 END IF;
213 v_teach_days := IGS_RE_GEN_002.RESP_GET_TEACH_DAYS(
214 p_cal_type,
215 p_ci_sequence_number,
216 v_teach_start_dt,
217 v_teach_end_dt );
218 IF ( v_teach_days = 0 AND p_legacy <> 'Y' )THEN
219 p_message_name := 'IGS_RE_TEACH_PER_NOT_SETUP';
220 RETURN TRUE; -- Warning Only
221 END IF;
222
223
224 --2. Check that student has 100% supervision to cover the teaching period.
225 OPEN c_com_dt (p_person_id,p_course_cd);
226 FETCH c_com_dt INTO v_commencement_dt;
227 v_rsup_record_not_found := TRUE;
228 FOR v_rsup_rec IN c_rsup(
229 v_ca_sequence_number) LOOP
230 --IF first record
231 IF c_rsup%ROWCOUNT = 1 THEN
232 v_rsup_record_not_found := FALSE;
233
234 IF c_com_dt%NOTFOUND THEN
235 IF p_legacy <> 'Y' THEN
236 p_message_name := 'IGS_RE_COM_DT_UNAVAIL';
237 CLOSE c_com_dt;
238 RETURN FALSE;
239 END IF;
240 ELSE
241 CLOSE c_com_dt;
242 IF v_commencement_dt BETWEEN v_teach_start_dt AND v_teach_end_dt THEN
243 IF v_commencement_dt < v_rsup_rec.start_dt THEN
244 p_message_name := 'IGS_RE_COM_DT_LESS_SUP_ST_DT';
245 IF p_legacy <> 'Y' THEN
246 RETURN FALSE;
247 ELSE
248 Fnd_Message.Set_Name('IGS', p_message_name );
249 FND_MSG_PUB.ADD;
250 END IF ;
251 END IF;
252 ELSE
253 IF v_rsup_rec.start_dt > v_teach_start_dt THEN
254 p_message_name := 'IGS_RE_CAND_DOES_NOT_HAVE_SUP';
255 IF p_legacy <> 'Y' THEN
256 RETURN FALSE;
257 ELSE
258 Fnd_Message.Set_Name('IGS', p_message_name );
259 FND_MSG_PUB.ADD;
260 END IF ;
261 ELSE
262 v_check_dt := v_rsup_rec.start_dt;
263 --Execute <Check Percentages>
264 IF respl_check_percentage(
265 v_ca_sequence_number,
266 v_check_dt) = FALSE THEN
267 IF p_legacy <> 'Y' THEN
268 RETURN FALSE;
269 ELSE
270 Fnd_Message.Set_Name('IGS', p_message_name );
271 FND_MSG_PUB.ADD;
272 END IF ;
273 END IF;
274 END IF;
275
276 END IF;
277
278 END IF;
279 ELSE --if multiple records
280 v_check_dt := v_rsup_rec.start_dt;
281 --Execute <Check Percentages>
282 IF respl_check_percentage(
283 v_ca_sequence_number,
284 v_check_dt) = FALSE THEN
285 IF p_legacy <> 'Y' THEN
286 RETURN FALSE;
287 ELSE
288 Fnd_Message.Set_Name('IGS', p_message_name );
289 FND_MSG_PUB.ADD;
290 END IF ;
291 END IF;
292 END IF;
293 END LOOP;
294 IF v_rsup_record_not_found THEN
295 --No supervisors found - error
296 p_message_name := 'IGS_RE_CAND_DOES_NOT_HAVE_SUP';
297 IF p_legacy <> 'Y' THEN
298 RETURN FALSE;
299 ELSE
300 Fnd_Message.Set_Name('IGS', p_message_name );
301 FND_MSG_PUB.ADD;
302 END IF ;
303 END IF;
304 v_check_dt := v_teach_end_dt;
305 --Execute <Check Percentages>
306 IF respl_check_percentage(
307 v_ca_sequence_number,
308 v_check_dt) = FALSE THEN
309 IF p_legacy <> 'Y' THEN
310 RETURN FALSE;
311 ELSE
312 Fnd_Message.Set_Name('IGS', p_message_name );
313 FND_MSG_PUB.ADD;
314 END IF ;
315 END IF;
316 RETURN TRUE;
317 EXCEPTION
318 WHEN OTHERS THEN
319 IF c_uv%ISOPEN THEN
320 CLOSE c_uv;
321 END IF;
322 IF c_ca%ISOPEN THEN
323 CLOSE c_ca;
324 END IF;
325 RAISE;
326 END;
327 END RESP_VAL_SUA_CNFRM ;
328
329 --
330 -- To validate all research units in an academic period
331 FUNCTION RESP_VAL_SUA_ALL(
332 p_person_id IN NUMBER ,
333 p_course_cd IN VARCHAR2 ,
334 p_acad_cal_type IN VARCHAR2 ,
335 p_acad_ci_sequence_number IN NUMBER ,
336 p_message_name OUT NOCOPY varchar2 )
337 RETURN boolean AS
338 -------------------------------------------------------------------------------------------
339 -- resp_val_sua_all
340 -- Validate research unit attempts for a research student course attempt,
341 -- checking for:
342 -- * That a student doesn't have multiple research units enrolled in a
343 -- single teaching period.
344 --Change History:
345 --Who When What
346 --kkillams 28-04-2003 Modified the c_sua cursor where clause due to change in the pk of
347 -- student unit attempt w.r.t. bug number 2829262
348 --stutta 06-Mar-2006 Modified cursor c_sua and added c_acad for perf bug #5025850
349 -------------------------------------------------------------------------------------------
350 BEGIN
351 DECLARE
352 cst_enrolled CONSTANT VARCHAR2(10) := 'ENROLLED';
353 cst_academic CONSTANT VARCHAR2(10) := 'ACADEMIC';
354 cst_active CONSTANT VARCHAR2(10) := 'ACTIVE';
355 cst_completed CONSTANT VARCHAR2(10) := 'COMPLETED';
356 cst_discontin CONSTANT VARCHAR2(10) := 'DISCONTIN';
357 cst_load CONSTANT VARCHAR2(10) := 'LOAD';
358
359 CURSOR c_ca IS
360 SELECT 'x'
361 FROM IGS_RE_CANDIDATURE ca
362 WHERE ca.person_id = p_person_id AND
363 (ca.sca_course_cd IS NULL OR
364 ca.sca_course_cd = p_course_cd);
365 v_ca_exists VARCHAR2(1);
366
367
368 CURSOR c_acad IS
369 SELECT DISTINCT cir.sup_cal_type acad_cal_type, cir.sup_ci_sequence_number acad_ci_sequence_number
370 FROM igs_ca_inst_rel cir, igs_en_su_attempt_all sua
371 WHERE sua.cal_type = cir.sub_cal_type
372 AND sua.ci_sequence_number = cir.sub_ci_sequence_number
373 AND sua.person_id = p_person_id
374 AND sua.course_cd = p_course_cd
375 AND cir.sup_cal_type = NVL(p_acad_cal_type,cir.sup_cal_type)
376 AND cir.sup_ci_sequence_number = NVL(p_acad_ci_sequence_number,cir.sup_ci_sequence_number);
377
378
379 CURSOR c_sua(cp_acad_cal_type igs_ca_inst.cal_type%TYPE,cp_acad_seq_num igs_ca_inst.sequence_number%TYPE) IS
380 SELECT
381 sua2.cal_type sua_cal_type,
382 sua2.ci_sequence_number sua_ci_sequence_number,
383 sua2.discontinued_dt,
384 sua2.administrative_unit_status,
385 sua2.unit_attempt_status,
386 sua2.no_assessment_ind,
387 loadcal.cal_type ci_cal_type,
388 loadcal.sequence_number ci_sequence_number
389 FROM
390 IGS_EN_SU_ATTEMPT_all sua1,
391 IGS_EN_SU_ATTEMPT_all sua2 ,
392 IGS_PS_UNIT_VER_ALL uv1,
393 IGS_PS_UNIT_VER_ALL uv2,
394 IGS_CA_INST_ALL loadcal,
395 IGS_CA_INST_REL acadterm,
396 IGS_CA_TYPE cat2,
397 IGS_CA_STAT cs2 ,
398 IGS_ST_DFT_LOAD_APPO l2t,
399 IGS_ST_DFT_LOAD_APPO l2tsua2
400
401 WHERE sua1.person_id = p_person_id
402 AND sua1.course_cd = p_course_cd
403 AND sua1.unit_attempt_status = cst_enrolled
404 AND sua2.uoo_id <> sua1.uoo_id
405 AND sua1.person_id = sua2.person_id
406 AND sua1.course_cd = sua2.course_cd
407 AND sua2.unit_attempt_status IN (cst_enrolled,cst_completed,cst_discontin)
408 AND uv1.unit_cd = sua1.unit_cd
409 AND uv1.version_number = sua1.version_number
410 AND uv2.unit_cd = sua2.unit_cd
411 AND uv2.version_number =sua2.version_number
412 AND uv1.research_unit_ind = 'Y'
413 AND uv2.research_unit_ind = 'Y'
414 AND EXISTS (SELECT 'x' FROM IGS_CA_INST_REL acadteach
415 WHERE acadteach.sup_cal_type = cp_acad_cal_type
416 AND acadteach.sup_ci_sequence_number = cp_acad_seq_num
417 AND acadteach.sub_cal_type = sua1.cal_type
418 AND acadteach.sub_ci_sequence_number = sua1.ci_sequence_number)
419 AND EXISTS (SELECT 'x' FROM IGS_CA_INST_REL acadteach
420 WHERE acadteach.sup_cal_type = cp_acad_cal_type
421 AND acadteach.sup_ci_sequence_number = cp_acad_seq_num
422 AND acadteach.sub_cal_type = sua2.cal_type
423 AND acadteach.sub_ci_sequence_number = sua2.ci_sequence_number)
424 AND acadterm.sup_cal_type = cp_acad_cal_type
425 AND acadterm.sup_ci_sequence_number = cp_acad_seq_num
426 AND loadcal.cal_type = acadterm.sub_cal_type
427 AND loadcal.sequence_number = acadterm.sub_ci_sequence_number
428 AND cat2.cal_type = loadcal.cal_type
429 AND cat2.s_cal_cat = cst_load
430 -- Check they are active
431 AND cs2.cal_status = loadcal.cal_status
432 AND cs2.s_cal_status = cst_active
433 AND l2t.cal_type = loadcal.cal_type
434 AND l2t.ci_sequence_number = loadcal.sequence_number
435 AND l2t.teach_cal_type = sua1.cal_type
436 AND l2tsua2.cal_type = l2t.cal_type
437 AND l2tsua2.ci_sequence_number = l2t.ci_sequence_number
438 AND l2tsua2.teach_cal_type = sua2.cal_type;
439
440
441
442
443 v_return_false BOOLEAN := FALSE;
444 BEGIN
445 -- Set the default message number
446 p_message_name := null;
447 -- 1. Check if the person is a candidate.
448 OPEN c_ca;
449 FETCH c_ca INTO v_ca_exists;
450 IF c_ca%NOTFOUND THEN
451 CLOSE c_ca;
452 -- Not a research student - not applicable.
453 RETURN TRUE;
454 END IF;
455 CLOSE c_ca;
456 -- 2. Select all enrolled research units (in the academic year if specified)
457 -- Determine the load calendar to which the teaching calendar contributes.
458 -- Find any other research unit attempts which are
459 -- incurring load within the same load calendar.
460
461 FOR rec_acad IN c_acad LOOP
462 FOR v_sua_rec IN c_sua(rec_acad.acad_cal_type, rec_acad.acad_ci_sequence_number) LOOP
463 IF IGS_EN_PRC_LOAD.ENRP_GET_LOAD_INCUR(
464 v_sua_rec.sua_cal_type,
465 v_sua_rec.sua_ci_sequence_number,
466 v_sua_rec.discontinued_dt,
467 v_sua_rec.administrative_unit_status,
468 v_sua_rec.unit_attempt_status,
469 v_sua_rec.no_assessment_ind,
470 v_sua_rec.ci_cal_type,
471 v_sua_rec.ci_sequence_number,
472 -- anilk, Audit special fee build
473 NULL, -- for p_uoo_id
474 'N') = 'Y' THEN
475 v_return_false := TRUE;
476 EXIT;
477 END IF;
478 END LOOP;
479 END LOOP;
480 IF v_return_false THEN
481 p_message_name := 'IGS_RE_CAND_ENROL_IN_SING_RES';
482 RETURN FALSE;
483 END IF;
484 -- Return the default value
485 RETURN TRUE;
486 EXCEPTION
487 WHEN OTHERS THEN
488 IF c_sua%ISOPEN THEN
489 CLOSE c_sua;
490 END IF;
491 RAISE;
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_SUA.resp_val_sua_all');
497 IGS_GE_MSG_STACK.ADD;
498 App_Exception.Raise_Exception;
499 END resp_val_sua_all;
500 --
501 -- To validate for student unit attempt being excluded
502 FUNCTION enrp_val_sua_excld(
503 p_person_id IN NUMBER ,
504 p_course_cd IN VARCHAR2 ,
505 p_unit_cd IN VARCHAR2 ,
506 p_cal_type IN VARCHAR2 ,
507 p_ci_sequence_number IN NUMBER ,
508 p_message_name OUT NOCOPY varchar2 )
509 RETURN BOOLEAN AS
510
511 BEGIN -- enrp_val_sua_excld
512 -- This module validates if a student unit attempt is excluded from
513 -- enrolment / re-enrolment because of person, course, course group
514 -- or course unit exclusions that are effective on the census date
515 -- of the teaching period of the unit attempt.
516 DECLARE
517 v_message_name varchar2(30);
518 v_ret BOOLEAN;
519 CURSOR c_sua IS
520 SELECT daiv.alias_val,
521 ci.start_dt,
522 ci.end_dt
523 FROM IGS_CA_DA_INST_V daiv,
524 IGS_CA_INST ci,
525 IGS_GE_S_GEN_CAL_CON sgcc
526 WHERE daiv.cal_type = p_cal_type AND
527 daiv.ci_sequence_number = p_ci_sequence_number AND
528 daiv.dt_alias = sgcc.census_dt_alias AND
529 sgcc.s_control_num = 1 AND
530 daiv.cal_type = ci.cal_type AND
531 daiv.ci_sequence_number = ci.sequence_number;
532 BEGIN
533 p_message_name := null;
534 -- Validate parameters passed.
535 IF p_person_id IS NULL OR
536 p_course_cd IS NULL OR
537 p_unit_cd IS NULL OR
538 p_cal_type IS NULL OR
539 p_ci_sequence_number IS NULL THEN
540 p_message_name := 'IGS_EN_PARAM_ROUTINE_SPECIFY';
541 RETURN FALSE;
542 END IF;
543 -- Validate records
544 FOR v_sua_rec IN c_sua LOOP
545 -- Only validate if census date is between ci.start_dt and ci.end_dt.
546 IF (v_sua_rec.alias_val >= v_sua_rec.start_dt) AND
547 (v_sua_rec.alias_val <= v_sua_rec.end_dt) THEN
548 -- Validate against person, course and course group exclusions.
549 IF IGS_EN_VAL_ENCMB.enrp_val_excld_crs (
550 p_person_id,
551 p_course_cd,
552 v_sua_rec.alias_val,
553 v_message_name) = FALSE THEN
554 p_message_name := v_message_name;
555 v_ret := FALSE;
556 EXIT;
557 END IF;
558 -- Validate against course and unit exclusions.
559 IF IGS_EN_VAL_ENCMB.enrp_val_excld_unit (
560 p_person_id,
561 p_course_cd,
562 p_unit_cd,
563 v_sua_rec.alias_val,
564 v_message_name) = FALSE THEN
565 v_ret := FALSE;
566 p_message_name := v_message_name;
567 EXIT;
568 END IF;
569 END IF;
570 END LOOP;
571 IF v_ret = FALSE THEN
572 RETURN FALSE;
573 END IF;
574 RETURN TRUE;
575 EXCEPTION
576 WHEN OTHERS THEN
577 IF (c_sua%ISOPEN) THEN
578 CLOSE c_sua;
579 END IF;
580 RAISE;
581 END;
582 END enrp_val_sua_excld;
583 --
584 -- To validate update of SUA.
585 FUNCTION enrp_val_sua_update(
586 p_person_id IN NUMBER ,
587 p_course_cd IN VARCHAR2 ,
588 p_unit_cd IN VARCHAR2 ,
589 p_cal_type IN VARCHAR2 ,
590 p_ci_sequence_number IN NUMBER ,
591 p_unit_attempt_status IN VARCHAR2 ,
592 p_new_version_number IN NUMBER ,
593 p_new_location_cd IN VARCHAR2 ,
594 p_new_unit_class IN VARCHAR2 ,
595 p_new_enrolled_dt IN DATE ,
596 p_new_discontinued_dt IN DATE ,
597 p_new_admin_unit_status IN VARCHAR2 ,
598 p_new_rule_waived_dt IN DATE ,
599 p_new_rule_waived_person_id IN NUMBER ,
600 p_new_no_assessment_ind IN VARCHAR2 ,
601 p_new_sup_unit_cd IN VARCHAR2 ,
602 p_new_sup_version_number IN NUMBER ,
603 p_new_exam_location_cd IN VARCHAR2 ,
604 p_old_version_number IN NUMBER ,
605 p_old_location_cd IN VARCHAR2 ,
606 p_old_unit_class IN VARCHAR2 ,
607 p_old_enrolled_dt IN DATE ,
608 p_old_discontinued_dt IN DATE ,
609 p_old_admin_unit_status IN VARCHAR2 ,
610 p_old_rule_waived_dt IN DATE ,
611 p_old_rule_waived_person_id IN NUMBER ,
612 p_old_no_assessment_ind IN VARCHAR2 ,
613 p_old_sup_unit_cd IN VARCHAR2 ,
614 p_old_sup_version_number IN NUMBER ,
615 p_old_exam_location_cd IN VARCHAR2 ,
616 p_message_name OUT NOCOPY VARCHAR2,
617 p_uoo_id IN NUMBER)
618 RETURN BOOLEAN AS
619 -------------------------------------------------------------------------------------------
620 --Change History:
621 --Who When What
622 --kkillams 28-04-2003 Added new parameter p_uoo_id to the function
623 -- Modified the c_sut cursor where clause due to change in pk
624 -- of student unit attempt table w.r.t. bug number 2829262
625 -- ckasu 21-Dec-2004 modified procedure inorder to as a part of bug# 4080883
626 -- ctyagi 29-Sept-2005 modified cursor c_sut for bug# 4524765
627 -------------------------------------------------------------------------------------------
628 BEGIN -- enrp_val_sua_update
629 -- This modules validates the update of IGS_EN_SU_ATTEMPT in relation to
630 -- unit_attempt_status.
631 DECLARE
632 CURSOR c_sut IS
633 SELECT 'X'
634 FROM IGS_PS_STDNT_UNT_TRN sut1
635 WHERE
636 sut1.person_id = p_person_id AND
637 sut1.transfer_course_cd = p_course_cd AND
638 sut1.uoo_id = p_uoo_id and
639 sut1.transfer_dt = ( SELECT max(sut2.transfer_dt)
640 FROM IGS_PS_STDNT_UNT_TRN sut2
641 where sut2.person_id = sut1.person_id
642 and sut2.transfer_course_cd = sut1.transfer_course_cd
643 and sut2.uoo_id = sut1.uoo_id)
644 and sut1.transfer_dt > (SELECT NVL(max(sut3.transfer_dt),(sut1.transfer_dt-1))
645 FROM IGS_PS_STDNT_UNT_TRN sut3
646 where sut3.person_id = sut1.person_id
647 and sut3.course_cd = sut1.transfer_course_cd
648 and sut3.uoo_id = sut1.uoo_id);
649 CURSOR c_sca IS
650 SELECT sca.course_attempt_status
651 FROM IGS_EN_STDNT_PS_ATT sca
652 WHERE sca.person_id = p_person_id AND
653 sca.course_cd = p_course_cd;
654 CURSOR c_old_sua_attr IS
655 SELECT sua.unit_attempt_status
656 FROM igs_en_su_attempt sua
657 WHERE sua.person_id = p_person_id AND
658 sua.course_cd = p_course_cd AND
659 sua.uoo_id = p_uoo_id;
660 l_old_unit_status igs_en_su_attempt.unit_attempt_status%TYPE;
661
662 v_course_attempt_status IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE;
663 v_sut_found VARCHAR2(1) := NULL;
664 cst_duplicate CONSTANT VARCHAR2(10) := 'DUPLICATE';
665 cst_completed CONSTANT VARCHAR2(10) := 'COMPLETED';
666 cst_discontin CONSTANT VARCHAR2(10) := 'DISCONTIN';
667 cst_lapsed CONSTANT VARCHAR2(7) := 'LAPSED';
668 cst_unconfirm CONSTANT VARCHAR2(10) := 'UNCONFIRM';
669 cst_invalid CONSTANT VARCHAR2(10) := 'INVALID';
670 cst_enrolled CONSTANT VARCHAR2(10) := 'ENROLLED';
671 cst_dropped CONSTANT VARCHAR2(10) := 'DROPPED';
672 BEGIN
673 -- Set p_message_name
674 p_message_name := null;
675 OPEN c_sca;
676 FETCH c_sca INTO v_course_attempt_status;
677 IF (c_sca%NOTFOUND) THEN
678 CLOSE c_sca;
679 RETURN TRUE;
680 ELSE
681 CLOSE c_sca;
682 IF v_course_attempt_status = cst_lapsed THEN
683 p_message_name := 'IGS_EN_SUA_NOTUPD_PRGATT_LAPS';
684 RETURN FALSE;
685 ELSIF v_course_attempt_status = cst_discontin THEN
686 IF p_unit_attempt_status = cst_unconfirm THEN
687 p_message_name := 'IGS_EN_UNCONFIRM_SUA';
688 RETURN FALSE;
689 ELSIF p_unit_attempt_status = cst_invalid THEN
690 p_message_name := 'IGS_EN_INVALID_SUA_NOTUPD';
691 RETURN FALSE;
692 END IF;
693 END IF;
694
695 IF p_unit_attempt_status IN (cst_enrolled,cst_invalid) THEN
696 IF v_course_attempt_status = cst_unconfirm THEN
697 p_message_name := 'IGS_EN_SUA_NOTCONFIRM_SPA';
698 RETURN FALSE;
699 ELSIF v_course_attempt_status = cst_discontin THEN
700 p_message_name := 'IGS_EN_SUA_NOT_ENROL';
701 RETURN FALSE;
702 END IF;
703 END IF;
704
705 END IF;
706
707 -- get the old unit attempt status. This will be available because this procedure is called from before_dml
708 -- code added by ckasu as a part of bug# 4080883
709 OPEN c_old_sua_attr ;
710 FETCH c_old_sua_attr INTO l_old_unit_status;
711 CLOSE c_old_sua_attr;
712
713 IF p_unit_attempt_status = cst_duplicate AND l_old_unit_status <> cst_dropped THEN
714 p_message_name := 'IGS_EN_SUPL_SUA_NOTUPD';
715 RETURN FALSE;
716 END IF;
717
718
719 IF p_unit_attempt_status = cst_completed AND l_old_unit_status NOT IN (cst_dropped,cst_completed) THEN
720 -- Check that completed unit is not a duplicate
721 OPEN c_sut;
722 FETCH c_sut INTO v_sut_found;
723 IF (c_sut%FOUND) THEN
724 CLOSE c_sut;
725 p_message_name := 'IGS_EN_COMPL_UA_NOTUPD';
726 RETURN FALSE;
727 END IF;
728 CLOSE c_sut;
729 END IF;
730
731 IF p_unit_attempt_status = cst_completed AND l_old_unit_status <> cst_dropped THEN
732 IF p_old_version_number <> p_new_version_number OR
733 p_old_location_cd <> p_new_location_cd OR
734 p_old_unit_class <> p_new_unit_class OR
735 TRUNC(p_old_enrolled_dt) <> TRUNC(p_new_enrolled_dt) OR
736 p_old_admin_unit_status <> p_new_admin_unit_status OR
737 TRUNC(p_old_discontinued_dt) <> TRUNC(p_new_discontinued_dt) OR
738 p_old_rule_waived_dt <> p_new_rule_waived_dt OR
739 p_old_rule_waived_person_id <> p_new_rule_waived_person_id OR
740 p_old_no_assessment_ind <> p_new_no_assessment_ind OR
741 p_old_sup_unit_cd <> p_new_sup_unit_cd OR
742 p_old_sup_version_number <> p_new_sup_version_number OR
743 p_old_exam_location_cd <> p_new_exam_location_cd THEN
744 p_message_name := 'IGS_EN_COMPL_SUA_NOTUPD';
745 RETURN FALSE;
746 END IF;
747 END IF;
748 IF p_unit_attempt_status = cst_discontin AND l_old_unit_status <> cst_dropped THEN
749 OPEN c_sut;
750 FETCH c_sut INTO v_sut_found;
751 IF (c_sut%FOUND) THEN
752 CLOSE c_sut;
753 p_message_name := 'IGS_EN_DISCONT_UA_NOTUPD_DUPL';
754 RETURN FALSE;
755 END IF;
756 CLOSE c_sut;
757 IF p_old_version_number <> p_new_version_number OR
758 p_old_location_cd <> p_new_location_cd OR
759 p_old_unit_class <> p_new_unit_class OR
760 TRUNC(p_old_enrolled_dt) <> TRUNC(p_new_enrolled_dt) OR
761 p_old_no_assessment_ind <> p_new_no_assessment_ind OR
762 p_old_sup_unit_cd <> p_new_sup_unit_cd OR
763 p_old_sup_version_number <> p_new_sup_version_number OR
764 p_old_exam_location_cd <> p_new_exam_location_cd THEN
765 p_message_name := 'IGS_EN_DISCONT_DET_SUA';
766 RETURN FALSE;
767 END IF;
768 END IF;
769 RETURN TRUE;
770 EXCEPTION
771 WHEN OTHERS THEN
772 IF (c_sut%ISOPEN) THEN
773 CLOSE c_sut;
774 END IF;
775 IF (c_sca%ISOPEN) THEN
776 CLOSE c_sca;
777 END IF;
778 RAISE;
779 END;
780 EXCEPTION
781 WHEN OTHERS THEN
782 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
783 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_SUA.enrp_val_sua_update');
784 IGS_GE_MSG_STACK.ADD;
785 App_Exception.Raise_Exception;
786 END enrp_val_sua_update;
787 --
788 -- To validate SUA override credit reason
789 FUNCTION enrp_val_sua_cp_rsn(
790 p_override_enrolled_cp IN NUMBER ,
791 p_override_achievable_cp IN NUMBER ,
792 p_override_credit_reason IN VARCHAR2 ,
793 p_message_name OUT NOCOPY varchar2 )
794 RETURN BOOLEAN AS
795
796 BEGIN -- enrp_val_sua_cp_rsn
797 -- This module validates that IGS_EN_SU_ATTEMPT.override_credit_reason
798 -- only exists if one of IGS_EN_STDNT_PS_ATT.override_enrolled_cp or
799 -- IGS_EN_STDNT_PS_ATT.override_achievalble_cp exists.
800 BEGIN
801 p_message_name := null;
802 IF (p_override_credit_reason IS NOT NULL) AND
803 (p_override_enrolled_cp IS NULL) AND
804 (p_override_achievable_cp IS NULL) THEN
805 p_message_name := 'IGS_EN_OVERRIDE_CRD_REASON';
806 RETURN FALSE;
807 END IF;
808 RETURN TRUE;
809 END;
810 EXCEPTION
811 WHEN OTHERS THEN
812 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
813 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_SUA.enrp_val_sua_cp_rsn');
814 IGS_GE_MSG_STACK.ADD;
815 App_Exception.Raise_Exception;
816 END enrp_val_sua_cp_rsn;
817 --
818 -- Routine to clear records saved in a PL/SQL RECORD from a prior commit.
819 PROCEDURE enrp_clear_sua_exist
820 AS
821 BEGIN
822 -- initialise
823 gt_sua_exists_table := gt_sua_exists_empty_table;
824 gv_sua_exists_table_index := 1;
825 END enrp_clear_sua_exist;
826
827 --
828 -- To validate enrolled date of SUA.
829 FUNCTION enrp_val_sua_ci(
830 p_person_id IN NUMBER ,
831 p_course_cd IN VARCHAR2 ,
832 p_cal_type IN VARCHAR2 ,
833 p_ci_sequence_number IN NUMBER ,
834 p_unit_attempt_status IN VARCHAR2 ,
835 p_commencement_dt IN DATE ,
836 p_form_trigger_ind IN VARCHAR2 ,
837 p_message_name OUT NOCOPY varchar2 )
838 RETURN BOOLEAN AS
839
840 BEGIN -- enrp_val_sua_ci
841 -- This module validates that the teaching period is valid for the
842 -- IGS_EN_SU_ATTEMPT.
843 -- * Teaching period must start after the commencement date of the
844 -- IGS_EN_STDNT_PS_ATT.
845 DECLARE
846 CURSOR c_ci IS
847 SELECT ci.end_dt
848 FROM IGS_CA_INST ci
849 WHERE ci.cal_type = p_cal_type AND
850 ci.sequence_number = p_ci_sequence_number;
851 v_ci_rec c_ci%ROWTYPE;
852 CURSOR c_sca IS
853 SELECT sca.commencement_dt
854 FROM IGS_EN_STDNT_PS_ATT sca
855 WHERE sca.person_id = p_person_id AND
856 sca.course_cd = p_course_cd;
857 v_sca_rec c_sca%ROWTYPE;
858 cst_duplicate CONSTANT VARCHAR2(9) := 'DUPLICATE';
859 cst_discontin CONSTANT VARCHAR2(9) := 'DISCONTIN';
860 cst_completed CONSTANT VARCHAR2(9) := 'COMPLETED';
861 v_commencement_dt IGS_EN_STDNT_PS_ATT.commencement_dt%TYPE;
862 BEGIN
863 -- Set the default message number
864 p_message_name := null;
865 IF p_unit_attempt_status NOT IN (cst_duplicate,cst_discontin,cst_completed) THEN
866 IF p_form_trigger_ind = 'F' THEN
867 IF p_commencement_dt IS NULL THEN
868 RETURN TRUE;
869 ELSE
870 v_commencement_dt := p_commencement_dt;
871 END IF;
872 ELSE
873 -- We need to get the commencement date from
874 -- the student course attempt
875 OPEN c_sca;
876 FETCH c_sca INTO v_sca_rec;
877 IF c_sca%NOTFOUND THEN
878 -- This should not occur, return from function
879 CLOSE c_sca;
880 RETURN TRUE;
881 END IF;
882 CLOSE c_sca;
883 IF v_sca_rec.commencement_dt IS NULL THEN
884 RETURN TRUE;
885 ELSE
886 v_commencement_dt := v_sca_rec.commencement_dt;
887 END IF;
888 END IF;
889 -- Determine end date of calendar instance
890 -- (student unit attempt teaching period)
891 OPEN c_ci;
892 FETCH c_ci INTO v_ci_rec;
893 IF c_ci%NOTFOUND THEN
894 -- This should not occur, return from function
895 CLOSE c_ci;
896 RETURN TRUE;
897 END IF;
898 CLOSE c_ci;
899 -- Check that end date of teaching period is
900 -- not less than the commencement date
901 IF v_ci_rec.end_dt < v_commencement_dt THEN
902 p_message_name := 'IGS_EN_TEACHPRD_UA_NOT_PRIOR';
903 RETURN FALSE;
904 END IF;
905 END IF;
906 RETURN TRUE;
907 EXCEPTION
908 WHEN OTHERS THEN
909 IF c_sca%ISOPEN THEN
910 CLOSE c_sca;
911 END IF;
912 IF c_ci%ISOPEN THEN
913 CLOSE c_ci;
914 END IF;
915 RAISE;
916 END;
917 END enrp_val_sua_ci;
918 --
919 -- To validate SUA alternative title.
920 FUNCTION enrp_val_sua_alt_ttl(
921 p_unit_cd IN VARCHAR2 ,
922 p_version_number IN NUMBER ,
923 p_alternative_title IN VARCHAR2 ,
924 p_message_name OUT NOCOPY varchar2 )
925 RETURN BOOLEAN AS
926
927 BEGIN -- enrp_val_sua_alt_ttl
928 -- validate the student unit attempt alternative title.
929 DECLARE
930 v_title_override_ind IGS_PS_UNIT_VER.title_override_ind%TYPE;
931 CURSOR c_uv IS
932 SELECT title_override_ind
933 FROM IGS_PS_UNIT_VER uv
934 WHERE uv.unit_cd = p_unit_cd AND
935 uv.version_number = p_version_number;
936 BEGIN
937 p_message_name := null;
938 IF p_alternative_title IS NULL THEN
939 RETURN TRUE;
940 END IF;
941 OPEN c_uv;
942 FETCH c_uv INTO v_title_override_ind;
943 IF (c_uv%FOUND) THEN
944 IF (v_title_override_ind = 'N') THEN
945 CLOSE c_uv;
946 p_message_name := 'IGS_EN_ALT_TITLE_NOTPERMITTED';
947 RETURN FALSE;
948 END IF;
949 END IF;
950 CLOSE c_uv;
951 RETURN TRUE ;
952 EXCEPTION
953 WHEN OTHERS THEN
954 IF(c_uv%ISOPEN) THEN
955 CLOSE c_uv;
956 END IF;
957 RAISE;
958 END;
959 EXCEPTION
960 WHEN OTHERS THEN
961 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
962 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_SUA.enrp_val_sua_alt_ttl');
963 IGS_GE_MSG_STACK.ADD;
964 App_Exception.Raise_Exception;
965 END enrp_val_sua_alt_ttl;
966 --
967 -- Routine to clear records saved in a PL/SQL RECORD from a prior commit.
968 PROCEDURE enrp_clear_sua_dupl
969 AS
970 BEGIN
971 -- initialise
972 gt_sua_duplicate_table := gt_sua_duplicate_empty_table;
973 gv_sua_duplicate_table_index := 1;
974 END enrp_clear_sua_dupl;
975
976 --
977 -- Validate whether unit attempt can be pre-enrolled
978 FUNCTION enrp_val_sua_pre(
979 p_person_id IN NUMBER ,
980 p_course_cd IN VARCHAR2 ,
981 p_unit_cd IN VARCHAR2 ,
982 p_log_creation_dt IN DATE ,
983 p_warn_level OUT NOCOPY VARCHAR2 ,
984 p_message_name OUT NOCOPY varchar2 )
985 RETURN boolean AS
986
987 BEGIN -- enrp_val_sua_pre
988 -- To check for advanced standing or encumbrances which would prevent
989 -- the unit attempt being added as part of a pre-enrolment of units.
990 DECLARE
991 cst_pre_enrol CONSTANT VARCHAR2(10) := 'PRE-ENROL';
992 cst_minor CONSTANT VARCHAR2(10) := 'MINOR';
993 cst_granted CONSTANT VARCHAR2(10) := 'GRANTED';
994 cst_approved CONSTANT VARCHAR2(10) := 'APPROVED';
995 cst_credit CONSTANT VARCHAR2(10) := 'CREDIT';
996 cst_preclusion CONSTANT VARCHAR2(10) := 'PRECLUSION';
997 CURSOR c_adv IS
998 SELECT 'x'
999 FROM IGS_AV_STND_UNIT asu
1000 WHERE asu.person_id = p_person_id AND
1001 asu.as_course_cd = p_course_cd AND
1002 asu.unit_cd = p_unit_cd AND
1003 ((asu.s_adv_stnd_recognition_type = cst_credit AND
1004 igs_av_val_asu.granted_adv_standing(p_person_id,p_course_cd,NULL,
1005 p_unit_cd,NULL,'BOTH',NULL) ='TRUE')
1006 OR
1007 (asu.s_adv_stnd_granting_status IN (cst_approved,cst_granted) AND
1008 asu.s_adv_stnd_recognition_type = cst_preclusion));
1009 v_adv_exists VARCHAR2(1);
1010 v_message_name varchar2(30);
1011 BEGIN
1012 -- Set the default message number
1013 p_message_name := null;
1014 -- Check for advanced standing which is either Approved or Granted,
1015 -- and which is either a 100% credit or a preclusion from the nominated unit.
1016 OPEN c_adv;
1017 FETCH c_adv INTO v_adv_exists;
1018 IF c_adv%FOUND THEN
1019 CLOSE c_adv;
1020 IF p_log_creation_dt IS NOT NULL THEN
1021 -- Write to the exception log
1022 IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1023 cst_pre_enrol,
1024 p_log_creation_dt,
1025 cst_minor || ',' ||
1026 TO_CHAR(p_person_id) || ',' ||
1027 p_course_cd,
1028 'IGS_EN_STUD_INELG_ADV_STANDIN',
1029 p_unit_cd);
1030 END IF;
1031 p_warn_level := cst_minor;
1032 p_message_name := 'IGS_EN_STUD_INELG_ADV_STANDIN';
1033 RETURN FALSE;
1034 ELSE
1035 CLOSE c_adv;
1036 END IF;
1037 -- Check for an encumbrance on the unit which would prevent it
1038 -- being enrolled. This checks for a current encumbrance, irrespective
1039 -- of whether it may be lifted sometime during the academic year.
1040 IF NOT IGS_EN_VAL_ENCMB.enrp_val_excld_unit(
1041 p_person_id,
1042 p_course_cd,
1043 p_unit_cd,
1044 SYSDATE,
1045 v_message_name) THEN
1046 IF p_log_creation_dt IS NOT NULL THEN
1047 -- Write to the exception log
1048 IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1049 cst_pre_enrol,
1050 p_log_creation_dt,
1051 cst_minor || ',' ||
1052 TO_CHAR(p_person_id) || ',' ||
1053 p_course_cd,
1054 'IGS_EN_STUD_INELG_UNIT_EXCLUS',
1055 p_unit_cd);
1056 END IF;
1057 p_warn_level := cst_minor;
1058 p_message_name := 'IGS_EN_STUD_INELG_UNIT_EXCLUS';
1059 RETURN FALSE;
1060 END IF;
1061 -- Return the default value
1062 RETURN TRUE;
1063 EXCEPTION
1064 WHEN OTHERS THEN
1065 IF c_adv%ISOPEN THEN
1066 CLOSE c_adv;
1067 END IF;
1068 RAISE;
1069 END;
1070 EXCEPTION
1071 WHEN OTHERS THEN
1072 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
1073 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_SUA.enrp_val_sua_pre');
1074 IGS_GE_MSG_STACK.ADD;
1075 App_Exception.Raise_Exception;
1076 END enrp_val_sua_pre;
1077 --
1078
1079 --
1080 -- To validate SUA advanced standing unit.
1081 FUNCTION enrp_val_sua_advstnd(
1082 p_person_id IN NUMBER ,
1083 p_course_cd IN VARCHAR2 ,
1084 p_crs_version_number IN NUMBER ,
1085 p_unit_cd IN VARCHAR2 ,
1086 p_un_version_number IN NUMBER ,
1087 p_message_name OUT NOCOPY VARCHAR2 ,
1088 p_legacy IN VARCHAR2)
1089 -------------------------------------------------------------------------------------------
1090 --Change History:
1091 --Who When What
1092 --kkillams 10-JUL-2003 Returning error message only if repeatable_ind is 'N' w.r.t. 3036367
1093 --rvivekan 09-sep-2003 Modified the behaviour of repeatable_ind column in igs_ps_unit_ver table. PSP integration build #3052433
1094 --rvivekan 24-SEP-2006 Removed p_legacy check for the granted advanced standing validation Bug#3132543
1095 -------------------------------------------------------------------------------------------
1096 RETURN BOOLEAN AS
1097 BEGIN
1098 DECLARE
1099 cst_approved CONSTANT VARCHAR2(10) := 'APPROVED';
1100 cst_granted CONSTANT VARCHAR2(10) := 'GRANTED';
1101 cst_credit CONSTANT VARCHAR2(10) := 'CREDIT';
1102 cst_preclusion CONSTANT VARCHAR2(10) := 'PRECLUSION';
1103 v_other_detail VARCHAR2(255);
1104 v_total_exmptn_approved IGS_AV_ADV_STANDING.total_exmptn_approved%TYPE;
1105 v_total_exmptn_granted IGS_AV_ADV_STANDING.total_exmptn_granted%TYPE;
1106 v_total_exmptn_perc_grntd IGS_AV_ADV_STANDING.total_exmptn_perc_grntd%TYPE;
1107 v_message_name varchar2(30);
1108 v_crs_version_number IGS_EN_STDNT_PS_ATT.version_number%TYPE;
1109 v_repeatable_ind IGS_PS_UNIT_VER.repeatable_ind%TYPE;
1110 CURSOR c_sca(
1111 cp_person_id IGS_EN_STDNT_PS_ATT.person_id%TYPE,
1112 cp_course_cd IGS_EN_STDNT_PS_ATT.course_cd%TYPE) IS
1113 SELECT sca.version_number
1114 FROM IGS_EN_STDNT_PS_ATT sca
1115 WHERE sca.person_id = cp_person_id AND
1116 sca.course_cd = cp_course_cd;
1117 CURSOR c_adv_stnd_unit_details (
1118 cp_person_id IGS_AV_STND_UNIT.person_id%TYPE,
1119 cp_course_cd IGS_AV_STND_UNIT.as_course_cd%TYPE,
1120 cp_crs_vers_num IGS_AV_STND_UNIT.as_version_number%TYPE,
1121 cp_unit_cd IGS_AV_STND_UNIT.unit_cd%TYPE,
1122 cp_un_vers_num IGS_AV_STND_UNIT.version_number%TYPE) IS
1123 SELECT unit_cd,version_number,s_adv_stnd_recognition_type
1124 FROM IGS_AV_STND_UNIT asu
1125 WHERE asu.person_id = cp_person_id AND
1126 asu.as_course_cd = cp_course_cd AND
1127 asu.as_version_number = cp_crs_vers_num AND
1128 asu.unit_cd = cp_unit_cd AND
1129 asu.version_number = cp_un_vers_num AND
1130 asu.s_adv_stnd_recognition_type IN (cst_credit,
1131 cst_preclusion) AND
1132 asu.s_adv_stnd_granting_status IN (cst_approved, cst_granted)
1133 GROUP BY unit_cd,version_number,s_adv_stnd_recognition_type;
1134 CURSOR c_unit_version(
1135 cp_unit_cd IGS_PS_UNIT_VER.unit_cd%TYPE,
1136 cp_version_number IGS_PS_UNIT_VER.version_number%TYPE) IS
1137 SELECT repeatable_ind
1138 FROM IGS_PS_UNIT_VER uv
1139 WHERE uv.unit_cd = cp_unit_cd AND
1140 uv.version_number = cp_version_number;
1141 l_credits NUMBER;
1142 l_s_adv_atnd_granting_status igs_av_stnd_unit_all.s_adv_stnd_granting_status%TYPE;
1143 BEGIN
1144 -- This function validates a IGS_EN_SU_ATTEMPT in
1145 -- relation to advanced standing units.
1146 p_message_name := null;
1147 -- validate the input parameters
1148 IF (p_person_id IS NULL OR
1149 p_course_cd IS NULL OR
1150 p_unit_cd IS NULL OR
1151 p_un_version_number IS NULL) THEN
1152 p_message_name := 'IGS_EN_NOTVALIDATE_ADVSTD';
1153 RETURN FALSE;
1154 END IF;
1155 -- get course version number if it isn't passed
1156 IF p_crs_version_number IS NULL THEN
1157 OPEN c_sca(
1158 p_person_id,
1159 p_course_cd);
1160 FETCH c_sca INTO v_crs_version_number;
1161 IF c_sca%NOTFOUND THEN
1162 CLOSE c_sca;
1163 p_message_name := 'IGS_EN_NOTVALIDATE_ADVSTD';
1164 RETURN FALSE;
1165 ELSE
1166 CLOSE c_sca;
1167 END IF;
1168 ELSE
1169 v_crs_version_number := p_crs_version_number;
1170 END IF;
1171 -- get unit version repeatable indicator
1172 v_repeatable_ind := 'N';
1173 OPEN c_unit_version(
1174 p_unit_cd,
1175 p_un_version_number);
1176 FETCH c_unit_version INTO v_repeatable_ind;
1177 CLOSE c_unit_version;
1178 -- check for the existace of IGS_AV_STND_UNIT
1179 FOR v_adv_stnd IN c_adv_stnd_unit_details(
1180 p_person_id,
1181 p_course_cd,
1182 v_crs_version_number,
1183 p_unit_cd,
1184 p_un_version_number) LOOP
1185 -- Changed after academic records maitenance dld
1186 IF v_Adv_stnd.s_adv_stnd_recognition_type = cst_credit THEN
1187 IF NOT igs_av_val_asu.adv_Credit_pts(p_person_id,p_course_cd,v_crs_version_number,
1188 v_adv_stnd.unit_cd,v_adv_stnd.version_number,'BOTH',NULL,
1189 l_credits,l_s_adv_atnd_granting_status,p_message_name) THEN
1190
1191 -- unit will still need to be studied if credit is less than 100
1192 p_message_name := null;
1193 RETURN TRUE;
1194 ELSE
1195 IF (l_s_adv_atnd_granting_status= cst_granted) THEN
1196 -- unit doens't need to be attempted by
1197 -- student because advanced standing has been
1198 -- granted
1199 IF v_repeatable_ind <> 'X' THEN
1200 -- Warning only
1201 p_message_name := 'IGS_AV_STUD_GRANTED_ADV';
1202 RETURN TRUE;
1203 ELSE
1204 p_message_name := 'IGS_EN_STUD_GRANTED_ADVSTD';
1205 RETURN FALSE;
1206 END IF;
1207 ELSIF (l_s_adv_atnd_granting_status <> cst_granted AND p_legacy <> 'Y' ) THEN
1208 -- check that course version advanced
1209 -- standing limits are not exceeded by
1210 -- approved and granted advanced standing
1211 IF (IGS_AV_VAL_ASU.advp_val_as_totals (
1212 p_person_id,
1213 p_course_cd,
1214 v_crs_version_number,
1215 TRUE, -- include approved advanced standing
1216 '', -- IGS_AV_STND_UNIT.unit_cd
1217 '', -- IGS_AV_STND_UNIT.version_number
1218 '', -- IGS_AV_STND_UNIT.s_adv_stnd_granting_status
1219 '', -- IGS_AV_STND_UNIT_LVL.unit_LEVEL
1220 '', -- IGS_AV_STND_UNIT_LVL.exemption_institution_cd
1221 '', -- IGS_AV_STND_UNIT_LVL.s_adv_stnd_granting_status
1222 v_total_exmptn_approved,
1223 v_total_exmptn_granted,
1224 v_total_exmptn_perc_grntd,
1225 v_message_name) = FALSE) THEN
1226 -- check for invalid parameters error
1227 IF (v_message_name <> 'IGS_AV_INSUFFICIENT_INFO_VER') THEN
1228 -- warn that approved advanced standing exists
1229 p_message_name := 'IGS_EN_STUD_APPROVED_ADVSTD';
1230 RETURN TRUE;
1231 END IF;
1232 ELSE
1233 -- unit doesn't need to be attempted by student
1234 -- because approved advanced standing exists and is
1235 -- liekly to be granted with nightly process
1236 IF v_repeatable_ind <> 'X' THEN
1237 -- Warning only
1238 p_message_name := 'IGS_EN_STUD_APPROVED_ADVSTD';
1239 RETURN TRUE;
1240 ELSE
1241 p_message_name := 'IGS_EN_STUD_APPR_ADVSTD';
1242 RETURN FALSE;
1243 END IF;
1244 END IF;
1245
1246 END IF;
1247 END IF;
1248 END IF;
1249 END LOOP;
1250 -- return the default message number and type
1251 p_message_name := null;
1252 RETURN TRUE;
1253 END;
1254 END enrp_val_sua_advstnd;
1255 --
1256 -- To validate the insertion of an sua against any intermissions
1257 FUNCTION ENRP_VAL_SUA_INTRMT(
1258 p_person_id IN NUMBER ,
1259 p_course_cd IN VARCHAR2 ,
1260 p_cal_type IN VARCHAR2 ,
1261 p_ci_sequence_number IN NUMBER ,
1262 p_message_name OUT NOCOPY varchar2 )
1263 RETURN boolean AS
1264 BEGIN
1265 DECLARE
1266 NO_SGCC_RECORDS_FOUND EXCEPTION;
1267 v_census_dt_alias IGS_GE_S_GEN_CAL_CON.census_dt_alias%TYPE;
1268 v_start_dt IGS_EN_STDNT_PS_INTM.start_dt%TYPE;
1269 v_end_dt IGS_EN_STDNT_PS_INTM.end_dt%TYPE;
1270 v_rec_found BOOLEAN := FALSE;
1271
1272 CURSOR c_census_dt IS
1273 SELECT sgcc.census_dt_alias
1274 FROM IGS_GE_S_GEN_CAL_CON sgcc
1275 WHERE sgcc.s_control_num = 1;
1276 CURSOR c_sci_details
1277 (cp_person_id IGS_EN_SU_ATTEMPT.person_id%TYPE,
1278 cp_course_cd IGS_EN_SU_ATTEMPT.course_cd%TYPE) IS
1279 SELECT sci.start_dt,
1280 sci.end_dt,
1281 sci.cond_return_flag , sci.logical_delete_date
1282 FROM IGS_EN_STDNT_PS_INTM sci,
1283 IGS_EN_INTM_TYPES eit
1284 WHERE sci.person_id = cp_person_id AND
1285 sci.course_cd = cp_course_cd AND
1286 sci.approved = eit.appr_reqd_ind AND
1287 eit.intermission_type = sci.intermission_type AND
1288 sci.logical_delete_date = TO_DATE('31-12-4712','DD-MM-YYYY');
1289
1290 CURSOR c_daiv_details
1291 (cp_person_id IGS_EN_SU_ATTEMPT.person_id%TYPE,
1292 cp_course_cd IGS_EN_SU_ATTEMPT.course_cd%TYPE,
1293 cp_cal_type IGS_EN_SU_ATTEMPT.cal_type%TYPE,
1294 cp_ci_seq_num IGS_EN_SU_ATTEMPT.ci_sequence_number%TYPE,
1295 cp_cond_ret_ind IGS_EN_STDNT_PS_INTM.cond_return_flag%TYPE,
1296 cp_census_dt IGS_GE_S_GEN_CAL_CON.census_dt_alias%TYPE,
1297 cp_start_dt IGS_EN_STDNT_PS_INTM.start_dt%TYPE,
1298 cp_end_dt IGS_EN_STDNT_PS_INTM.end_dt%TYPE,
1299 cp_logical_del_dt IGS_EN_STDNT_PS_INTM.logical_delete_date%TYPE) IS
1300 SELECT daiv.dt_alias
1301 FROM IGS_CA_DA_INST_V daiv
1302 WHERE daiv.cal_type = cp_cal_type AND
1303 daiv.ci_sequence_number = cp_ci_seq_num AND
1304 daiv.dt_alias = cp_census_dt AND
1305 daiv.alias_val >= cp_start_dt AND
1306 (daiv.alias_val <= cp_end_dt OR
1307 (daiv.alias_val > cp_end_dt AND
1308 cp_cond_ret_ind = 'Y' AND
1309 EXISTS ( SELECT 'x'
1310 FROM IGS_EN_SPI_RCONDS
1311 WHERE person_id =p_person_id
1312 AND course_cd =p_course_cd
1313 AND start_dt =cp_start_dt
1314 AND logical_delete_date =cp_logical_del_dt
1315 AND status_code IN('FAILED','PENDING')
1316 )
1317 )
1318 );
1319
1320 BEGIN
1321 -- this module validates that the teaching perion of
1322 -- UA being added is permitted according to any
1323 -- intermission details which exist.
1324 -- The validation will fail if the census date (or any
1325 -- of the census dates if there are multiple) fall
1326 -- within the intermission person.
1327 -- note : this is not inclusive of the end date.
1328 -- set the default message number
1329 p_message_name := null;
1330 -- select the census date alias from the general
1331 -- calendar confiration table
1332 OPEN c_census_dt;
1333 FETCH c_census_dt INTO v_census_dt_alias;
1334 -- raise an exception if no IGS_GE_S_GEN_CAL_CON
1335 -- records are found
1336 IF (c_census_dt%NOTFOUND) THEN
1337 CLOSE c_census_dt;
1338 RAISE NO_SGCC_RECORDS_FOUND;
1339 END IF;
1340 CLOSE c_census_dt;
1341 -- select the student course intermission records
1342 -- for the relevant course
1343 FOR v_sci_details IN c_sci_details(
1344 p_person_id,
1345 p_course_cd) LOOP
1346 -- looping through dt_alias_INST_V records
1347 FOR v_daiv_details IN c_daiv_details(
1348 p_person_id,
1349 p_course_cd,
1350 p_cal_type,
1351 p_ci_sequence_number,
1352 v_sci_details.cond_return_flag,
1353 v_census_dt_alias,
1354 v_sci_details.start_dt,
1355 v_sci_details.end_dt,
1356 v_sci_details.logical_delete_date) LOOP
1357 -- set that a record was found
1358 v_rec_found := TRUE;
1359 END LOOP;
1360 END LOOP;
1361 -- checking if record(s) were found
1362 -- if so, set the message number and return
1363 -- FALSE
1364 IF (v_rec_found = TRUE) THEN
1365 p_message_name := 'IGS_EN_CANT_ADD_UNT_ATMPTS';
1366 RETURN FALSE;
1367 END IF;
1368 -- the default return type
1369 RETURN TRUE;
1370 EXCEPTION
1371 WHEN NO_SGCC_RECORDS_FOUND THEN
1372 Fnd_Message.Set_Name('FND','FORM_RECORD_DELETED');
1373
1374 IGS_GE_MSG_STACK.ADD;
1375 App_Exception.Raise_Exception;
1376 END;
1377 END enrp_val_sua_intrmt;
1378
1379 -- Routine to clear records saved in a PL/SQL RECORD from a prior commit.
1380 PROCEDURE enrp_clear_sua_disc
1381 AS
1382 BEGIN
1383 -- initialise
1384 gt_sua_discont_table := gt_sua_discont_empty_table;
1385 gv_sua_discont_table_index := 1;
1386 END enrp_clear_sua_disc;
1387
1388 --
1389 -- Validate the discontinued administrative unit status.
1390 FUNCTION enrp_val_discont_aus(
1391 p_administrative_unit_status IN VARCHAR2 ,
1392 p_discontinued_dt IN DATE ,
1393 p_cal_type IN VARCHAR2 ,
1394 p_ci_sequence_number IN NUMBER ,
1395 p_message_name OUT NOCOPY varchar2,
1396 p_uoo_id IN NUMBER ,
1397 p_message_token OUT NOCOPY VARCHAR2 ,
1398 p_legacy IN VARCHAR2)
1399 RETURN BOOLEAN AS
1400
1401 BEGIN
1402 DECLARE
1403 v_other_detail VARCHAR2(255);
1404 v_closed_ind IGS_AD_ADM_UNIT_STAT.closed_ind%TYPE;
1405 v_unit_attempt_status IGS_AD_ADM_UNIT_STAT.unit_attempt_status%TYPE;
1406 v_alias_val DATE;
1407 v_admin_unit_status_str VARCHAR2(2000);
1408 v_first_char NUMBER;
1409 v_grading_schema_cd IGS_AS_GRD_SCHEMA.grading_schema_cd%TYPE;
1410 v_version_number IGS_AS_GRD_SCHEMA.version_number%TYPE;
1411 v_message_name varchar2(30);
1412 v_string_found BOOLEAN := FALSE;
1413 v_current_string IGS_AD_ADM_UNIT_STAT.administrative_unit_status%TYPE;
1414 v_administrative_unit_status VARCHAR2(2000);
1415 v_admin_entered IGS_AD_ADM_UNIT_STAT.administrative_unit_status%TYPE;
1416 CURSOR c_aus IS
1417 SELECT closed_ind,
1418 unit_attempt_status
1419 FROM IGS_AD_ADM_UNIT_STAT
1420 WHERE administrative_unit_status = p_administrative_unit_status;
1421 BEGIN
1422 -- This module validates the
1423 -- IGS_EN_SU_ATTEMPT.administrative_unit_status
1424 p_message_name := null;
1425 -- Validate no administrative unit status
1426 OPEN c_aus;
1427 FETCH c_aus INTO v_closed_ind, v_unit_attempt_status;
1428 -- check if a record has been found
1429 IF (c_aus%NOTFOUND) AND p_legacy <> 'Y' THEN
1430 CLOSE c_aus;
1431 RETURN TRUE;
1432 END IF;
1433 CLOSE c_aus;
1434
1435 IF p_administrative_unit_status IS NULL THEN
1436 IF v_unit_attempt_status = 'DROPPED' THEN
1437 RETURN TRUE;
1438 END IF;
1439 IF p_discontinued_dt IS NULL THEN
1440 -- return with no errors
1441 RETURN TRUE;
1442 ELSE
1443 -- return the message number if discontinued date exists
1444 p_message_name := 'IGS_EN_ADMIN_UNIT_ST_SPECIFY';
1445 IF p_legacy <> 'Y' THEN
1446 RETURN FALSE;
1447 ELSE
1448 Fnd_Message.Set_Name('IGS', p_message_name );
1449 FND_MSG_PUB.ADD;
1450 END IF;
1451 END IF;
1452 END IF;
1453
1454 IF (v_closed_ind = 'Y' AND p_legacy <> 'Y' ) THEN
1455 -- return the message number if the closed_ind = 'Y'
1456 p_message_name := 'IGS_EN_ADM_UNT_STAT_CLOSED';
1457 RETURN FALSE;
1458 END IF;
1459
1460 IF (v_unit_attempt_status <> 'DISCONTIN' AND p_legacy <> 'Y' ) THEN
1461 -- must be for DISCONTIN unit attempt status
1462 p_message_name := 'IGS_EN_SPECIFY_ADM_UNT_STATUS';
1463 RETURN FALSE;
1464 END IF;
1465
1466 -- validate that if the discontinued date is not set,
1467 -- then the related administrative status is not set
1468 IF (p_discontinued_dt IS NULL) AND
1469 (v_unit_attempt_status = 'DISCONTIN') THEN
1470 p_message_name := 'IGS_EN_DISCONT_ADM_UNIT_ST';
1471 IF p_legacy <> 'Y' THEN
1472 RETURN FALSE;
1473 ELSE
1474 Fnd_Message.Set_Name('IGS', p_message_name );
1475 FND_MSG_PUB.ADD;
1476 END IF;
1477 END IF;
1478
1479 -- Validate that administrative unit status applies at discontinuation
1480 -- as determined by unit discontinuation date criteria
1481 --Modified as a part of Enrollment Process build bug no:1832130
1482 -- Sarakshi , 27-07-2001, uoo_id is passed to IGS_EN_GEN_008.ENRP_GET_UDDC_AUS
1483 IF p_legacy <> 'Y' THEN
1484 v_administrative_unit_status := IGS_EN_GEN_008.ENRP_GET_UDDC_AUS(
1485 p_discontinued_dt,
1486 p_cal_type,
1487 p_ci_sequence_number,
1488 v_admin_unit_status_str,
1489 v_alias_val,
1490 p_uoo_id);
1491
1492 IF v_admin_unit_status_str IS NULL THEN
1493 p_message_name := 'IGS_EN_ADMIN_UNITST_NOTVALID';
1494 RETURN FALSE;
1495 ELSE
1496 -- set the parameter passed in to a variable
1497 v_admin_entered := p_administrative_unit_status;
1498 IF (v_administrative_unit_status IS NULL) OR
1499 ((v_administrative_unit_status IS NOT NULL) AND
1500 (v_admin_entered <> v_administrative_unit_status)) THEN
1501 -- Administrative unit status is not equal to the defaults
1502 -- so check against string returned which contains list of
1503 -- valid administrative unit status delimited by ',' eg
1504 -- EARLY WDRW, LATE WDRW,
1505 -- set the current position in the string to 1
1506 v_first_char := 1;
1507 v_administrative_unit_status := NULL;
1508 LOOP
1509 -- exit when the end of the string is reached
1510 EXIT WHEN v_first_char >= LENGTH(v_admin_unit_status_str);
1511 -- put 10 characters at a a time into a string for comparison
1512 v_current_string := (SUBSTR(v_admin_unit_status_str, v_first_char, 10));
1513 -- don't do anything if the string is null
1514 IF (v_current_string IS NULL) THEN
1515 EXIT;
1516 ELSE
1517 -- if the parameter string entered is part of string
1518 -- passed in, then exit - it's been found
1519 IF (RPAD(v_admin_entered,10,' ') = RPAD(v_current_string,10,' ')) THEN
1520 v_string_found := TRUE;
1521 EXIT;
1522 ELSE
1523 -- continue seaching the next 11 characters
1524 -- along in the string passed in (as we have
1525 -- to account for the fact that the string
1526 -- is delimited by ','
1527 IF v_administrative_unit_status IS NULL THEN
1528 v_administrative_unit_status := RTRIM(RPAD(v_current_string,10,' '));
1529 ELSE
1530 v_administrative_unit_status := v_administrative_unit_status||','||RTRIM(RPAD(v_current_string,10,' '));
1531 END IF;
1532 v_first_char := v_first_char + 11;
1533 END IF;
1534 END IF;
1535 END LOOP;
1536 -- return an error if the parameter string entered
1537 -- wasn't part of the string passed in
1538 IF (v_string_found = FALSE) THEN
1539 --p_message_name := 'IGS_EN_ADMIN_UNITST_NOTVALID';
1540 p_message_name := 'IGS_SS_EN_INVLD_ADMIN_UNITST';
1541 p_message_token := v_administrative_unit_status;
1542 RETURN FALSE;
1543 END IF;
1544 END IF;
1545 END IF; --end for v_admin_unit_status_str IS NULL
1546 -- Both the administrative unit status and administrative unit status (out parameter) string are both null return false.
1547 IF v_administrative_unit_status IS NULL AND v_admin_unit_status_str IS NULL THEN
1548 p_message_name := 'IGS_SS_EN_INVLD_ADMIN_UNITST';
1549 p_message_token := v_administrative_unit_status;
1550 RETURN FALSE;
1551 END IF;
1552 END IF;
1553
1554 -- validate administrative unit status grade
1555 IF (IGS_EN_VAL_SUA.enrp_get_sua_gs(
1556 p_discontinued_dt,
1557 p_administrative_unit_status,
1558 v_grading_schema_cd,
1559 v_version_number,
1560 v_message_name) = FALSE) THEN
1561 p_message_name := v_message_name;
1562 IF p_legacy <> 'Y' THEN
1563 RETURN FALSE;
1564 ELSE
1565 Fnd_Message.Set_Name('IGS', p_message_name );
1566 FND_MSG_PUB.ADD;
1567 END IF;
1568 END IF;
1569 RETURN TRUE;
1570 EXCEPTION
1571 WHEN OTHERS THEN
1572 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
1573 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_SUA.enrp_val_discont_aus');
1574 IGS_GE_MSG_STACK.ADD;
1575 App_Exception.Raise_Exception;
1576 END;
1577 END enrp_val_discont_aus;
1578 --
1579 -- Get SUA grading schema.
1580 FUNCTION enrp_get_sua_gs(
1581 p_effective_dt IN DATE ,
1582 p_administrative_unit_status IN VARCHAR2 ,
1583 p_grading_schema_cd OUT NOCOPY VARCHAR2 ,
1584 p_version_number OUT NOCOPY NUMBER ,
1585 p_message_name OUT NOCOPY varchar2 )
1586 RETURN BOOLEAN AS
1587
1588 BEGIN
1589 DECLARE
1590 TYPE t_schema_dtls IS RECORD (
1591 grading_schema_cd IGS_AS_GRD_SCHEMA.grading_schema_cd%TYPE,
1592 version_number IGS_AS_GRD_SCHEMA.version_number%TYPE );
1593 CURSOR c_get_schema_dtls IS
1594 SELECT DISTINCT gs.grading_schema_cd,
1595 gs.version_number
1596 FROM IGS_AS_GRD_SCHEMA gs,
1597 IGS_AS_GRD_SCH_GRADE gsg,
1598 IGS_AD_ADM_UT_STA_GD ausg
1599 WHERE gs.start_dt <= TRUNC(p_effective_dt) AND
1600 (gs.end_dt IS NULL OR
1601 gs.end_dt >= TRUNC(p_effective_dt)) AND
1602 gsg.grading_schema_cd = gs.grading_schema_cd AND
1603 gsg.version_number = gs.version_number AND
1604 ausg.grade = gsg.grade AND
1605 ausg.administrative_unit_status = p_administrative_unit_status;
1606 v_grading_schema_dtls t_schema_dtls;
1607 CURSOR c_aus IS
1608 SELECT unit_attempt_status
1609 FROM IGS_AD_ADM_UNIT_STAT
1610 WHERE administrative_unit_status = p_administrative_unit_status;
1611 l_status VARCHAR2(10);
1612 BEGIN
1613 --- Set the default message number
1614 p_message_name := null;
1615 OPEN c_aus;
1616 FETCH c_aus INTO l_status;
1617 close c_aus;
1618
1619 --- Select the effective grading schema.
1620 OPEN c_get_schema_dtls;
1621 FETCH c_get_schema_dtls INTO v_grading_schema_dtls;
1622 --- No match
1623 IF c_get_schema_dtls%NOTFOUND THEN
1624 IF l_status <> 'DROPPED' THEN
1625 p_grading_schema_cd := NULL;
1626 p_version_number := NULL;
1627 p_message_name := 'IGS_EN_CHK_ADM_UNT_STATUS';
1628 CLOSE c_get_schema_dtls;
1629 RETURN FALSE;
1630 END IF;
1631 END IF;
1632 --- One or more matches were found
1633 --- then return first one found
1634 p_grading_schema_cd := v_grading_schema_dtls.grading_schema_cd;
1635 p_version_number := v_grading_schema_dtls.version_number;
1636 p_message_name := null;
1637 CLOSE c_get_schema_dtls;
1638 RETURN TRUE;
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_SUA.enrp_get_sua_gs');
1644 IGS_GE_MSG_STACK.ADD;
1645 App_Exception.Raise_Exception;
1646 END enrp_get_sua_gs;
1647 --
1648 -- Get SUA administrative unit status grade.
1649 FUNCTION enrp_get_sua_ausg(
1650 p_administrative_unit_status IN VARCHAR2 ,
1651 p_person_id IN NUMBER ,
1652 p_course_cd IN VARCHAR2 ,
1653 p_unit_cd IN VARCHAR2 ,
1654 p_cal_type IN VARCHAR2 ,
1655 p_ci_sequence_number IN NUMBER ,
1656 p_effective_dt IN DATE ,
1657 p_grading_schema_cd OUT NOCOPY VARCHAR2 ,
1658 p_version_number OUT NOCOPY NUMBER ,
1659 p_grade OUT NOCOPY VARCHAR2 ,
1660 p_message_name OUT NOCOPY VARCHAR2,
1661 p_uoo_id IN NUMBER)
1662 RETURN BOOLEAN AS
1663 -------------------------------------------------------------------------------------------
1664 --Change History:
1665 --Who When What
1666 --kkillams 28-04-2003 Added new parameter p_uoo_id to the function
1667 -- Modified the c_no_ass_ind and c_sua_ausg cursors where clause due
1668 -- to change in pk of student unit attempt table
1669 -- w.r.t. bug number 2829262
1670 -------------------------------------------------------------------------------------------
1671 BEGIN
1672 DECLARE
1673
1674 v_ausg_count NUMBER;
1675 v_dummy VARCHAR2 (1);
1676 l_no_assessment_ind IGS_EN_SU_ATTEMPT.NO_ASSESSMENT_IND%TYPE;
1677
1678 CURSOR c_no_ass_ind IS
1679 SELECT no_assessment_ind
1680 FROM igs_en_su_attempt
1681 WHERE person_id = p_person_id
1682 AND course_cd = p_course_cd
1683 AND uoo_id = p_uoo_id;
1684
1685 CURSOR c_ausg_exists
1686 (cp_admin_unit_status
1687 IGS_EN_SU_ATTEMPT.administrative_unit_status%TYPE) IS
1688 SELECT 'X'
1689 FROM IGS_AD_ADM_UT_STA_GD ausg
1690 WHERE ausg.administrative_unit_status = cp_admin_unit_status;
1691
1692 CURSOR c_ausg_count
1693 (cp_admin_unit_status IGS_EN_SU_ATTEMPT.administrative_unit_status%TYPE,
1694 cp_effective_dt IGS_AS_GRD_SCHEMA.start_dt%TYPE,
1695 cp_no_assessment_ind IGS_EN_SU_ATTEMPT.NO_ASSESSMENT_IND%TYPE) IS
1696 SELECT COUNT(*)
1697 FROM igs_ad_adm_ut_sta_gd ausg,
1698 igs_as_grd_schema gs,
1699 igs_as_grd_sch_grade gsg
1700 WHERE ausg.administrative_unit_status = cp_admin_unit_status AND
1701 gs.grading_schema_cd = ausg.grading_schema_cd AND
1702 gs.version_number = ausg.version_number AND
1703 TRUNC(gs.start_dt) <= TRUNC(cp_effective_dt) AND
1704 TRUNC(NVL(gs.end_dt, cp_effective_dt)) >= TRUNC(cp_effective_dt) AND
1705 ausg.grading_schema_cd = gsg.grading_schema_cd AND
1706 ausg.version_number = gsg.version_number AND
1707 ausg.GRADE = gsg.grade AND
1708 (
1709 ( gsg.s_result_type = 'AUDIT' AND cp_no_assessment_ind ='Y')
1710 OR
1711 ( gsg.s_result_type <> 'AUDIT' AND cp_no_assessment_ind <> 'Y')
1712 );
1713
1714 CURSOR c_ausg
1715 (cp_admin_unit_status IGS_EN_SU_ATTEMPT.administrative_unit_status%TYPE,
1716 cp_effective_dt IGS_AS_GRD_SCHEMA.start_dt%TYPE,
1717 cp_no_assessment_ind IGS_EN_SU_ATTEMPT.NO_ASSESSMENT_IND%TYPE) IS
1718 SELECT ausg.grading_schema_cd,
1719 ausg.version_number,
1720 ausg.grade
1721 FROM igs_ad_adm_ut_sta_gd ausg,
1722 igs_as_grd_schema gs,
1723 igs_as_grd_sch_grade gsg
1724 WHERE ausg.administrative_unit_status = cp_admin_unit_status AND
1725 gs.grading_schema_cd = ausg.grading_schema_cd AND
1726 gs.version_number = ausg.version_number AND
1727 gs.start_dt <= TRUNC(cp_effective_dt) AND
1728 NVL(gs.end_dt, TRUNC(cp_effective_dt)) >= TRUNC(cp_effective_dt) AND
1729 ausg.grading_schema_cd = gsg.grading_schema_cd AND
1730 ausg.version_number = gsg.version_number AND
1731 ausg.GRADE = gsg.grade AND
1732 (
1733 ( gsg.s_result_type = 'AUDIT' AND cp_no_assessment_ind ='Y')
1734 OR
1735 ( gsg.s_result_type <> 'AUDIT' AND cp_no_assessment_ind <> 'Y')
1736 );
1737
1738 CURSOR c_sua_ausg
1739 (cp_admin_unit_status
1740 IGS_EN_SU_ATTEMPT.administrative_unit_status%TYPE,
1741 cp_effective_dt IGS_AS_GRD_SCHEMA.start_dt%TYPE) IS
1742 SELECT ausg.grading_schema_cd,
1743 ausg.version_number,
1744 ausg.grade
1745 FROM IGS_EN_SU_ATTEMPT sua,
1746 IGS_PS_UNIT_OFR_OPT uoo,
1747 IGS_AD_ADM_UT_STA_GD ausg,
1748 IGS_AS_GRD_SCHEMA gs,
1749 igs_as_grd_sch_grade gsg
1750 WHERE sua.person_id = p_person_id AND
1751 sua.course_cd = p_course_cd AND
1752 sua.uoo_id = p_uoo_id AND
1753 sua.unit_cd = uoo.unit_cd AND
1754 sua.version_number = uoo.version_number AND
1755 sua.cal_type = uoo.cal_type AND
1756 sua.ci_sequence_number = uoo.ci_sequence_number AND
1757 sua.location_cd = uoo.location_cd AND
1758 sua.unit_class = uoo.unit_class AND
1759 uoo.grading_schema_cd = ausg.grading_schema_cd AND
1760 ausg.administrative_unit_status = cp_admin_unit_status AND
1761 gs.grading_schema_cd = ausg.grading_schema_cd AND
1762 gs.version_number = ausg.version_number AND
1763 gs.start_dt <= cp_effective_dt AND
1764 NVL(gs.end_dt, cp_effective_dt) >= cp_effective_dt AND
1765 ausg.grading_schema_cd = gsg.grading_schema_cd AND
1766 ausg.version_number = gsg.version_number AND
1767 ausg.GRADE = gsg.grade AND
1768 (
1769 ( gsg.s_result_type = 'AUDIT' AND sua.no_assessment_ind ='Y')
1770 OR
1771 ( gsg.s_result_type <> 'AUDIT' AND sua.no_assessment_ind <> 'Y')
1772 );
1773 BEGIN
1774 -- This module gets the administrative unit status
1775 -- grading schema grade.
1776 -- If only one current grading schema grade mapped to the
1777 -- administrative_unit_status then use this grade which can be
1778 -- apply to all students. If multiple mappings exist, then determine
1779 -- the appropriate grade for the student's unit.
1780 -- Initialise out NOCOPY parameters.
1781 p_grading_schema_cd := NULL;
1782 p_version_number := NULL;
1783 p_grade := NULL;
1784 p_message_name := null;
1785
1786 OPEN c_no_ass_ind;
1787 FETCH c_no_ass_ind INTO l_no_assessment_ind;
1788 CLOSE c_no_ass_ind;
1789
1790 -- Determine how many current grades are mapped against the administrative
1791 -- unit status.
1792 OPEN c_ausg_count(
1793 p_administrative_unit_status,
1794 p_effective_dt,
1795 l_no_assessment_ind);
1796 FETCH c_ausg_count INTO v_ausg_count;
1797 IF c_ausg_count%NOTFOUND THEN
1798 v_ausg_count := 0;
1799 END IF;
1800 CLOSE c_ausg_count;
1801 IF v_ausg_count = 1 THEN
1802 OPEN c_ausg(p_administrative_unit_status,
1803 p_effective_dt,
1804 l_no_assessment_ind);
1805 FETCH c_ausg INTO p_grading_schema_cd,
1806 p_version_number,
1807 p_grade;
1808 IF c_ausg%FOUND THEN
1809 -- Return the retrieved values.
1810 CLOSE c_ausg;
1811 p_message_name := null;
1812 RETURN TRUE;
1813 END IF;
1814 CLOSE c_ausg;
1815 ELSIF v_ausg_count > 1 THEN
1816 OPEN c_sua_ausg(p_administrative_unit_status,
1817 p_effective_dt);
1818 FETCH c_sua_ausg INTO p_grading_schema_cd,
1819 p_version_number,
1820 p_grade;
1821 IF c_sua_ausg%FOUND THEN
1822 -- Return the retrieved values.
1823 CLOSE c_sua_ausg;
1824 p_message_name := null;
1825 RETURN TRUE;
1826 END IF;
1827 CLOSE c_sua_ausg;
1828 END IF;
1829
1830 -- If processing reaches here, check if any grades exist for the
1831 -- administrative unit status. It is valid as some do not have associated
1832 -- grades (eg. When discontinuing early and no student unit attempt
1833 -- outcome is record because the student unit attempt is deleted).
1834 OPEN c_ausg_exists(p_administrative_unit_status);
1835 FETCH c_ausg_exists INTO v_dummy;
1836 IF c_ausg_exists%FOUND THEN
1837 -- Error as the grading schema is not available
1838 -- for the effective date
1839 CLOSE c_ausg_exists;
1840 p_grading_schema_cd := NULL;
1841 p_version_number := NULL;
1842 p_grade := NULL;
1843 p_message_name := 'IGS_EN_CANT_DETR_UNIT_STATUS';
1844 RETURN FALSE;
1845 ELSE
1846 -- no records were found, so set the grade
1847 -- to NULL (this is acceptable, as some
1848 -- administrative unit statuses don't have
1849 -- associated grades)
1850 CLOSE c_ausg_exists;
1851 p_grading_schema_cd := NULL;
1852 p_version_number := NULL;
1853 p_grade := NULL;
1854 p_message_name := null;
1855 RETURN TRUE;
1856 END IF;
1857 EXCEPTION
1858 WHEN OTHERS THEN
1859 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
1860 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_SUA.enrp_get_sua_ausg');
1861 IGS_GE_MSG_STACK.ADD;
1862 App_Exception.Raise_Exception;
1863 END;
1864 END enrp_get_sua_ausg;
1865 --
1866 -- To validate the discontinuation date
1867 FUNCTION enrp_val_sua_discont(
1868 p_person_id IN NUMBER ,
1869 p_course_cd IN VARCHAR2 ,
1870 p_unit_cd IN VARCHAR2 ,
1871 p_version_number IN NUMBER ,
1872 p_ci_start_dt IN DATE ,
1873 p_enrolled_dt IN DATE ,
1874 p_administrative_unit_status IN VARCHAR2 ,
1875 p_unit_attempt_status IN VARCHAR2 ,
1876 p_discontinued_dt IN DATE ,
1877 p_message_name OUT NOCOPY VARCHAR2 ,
1878 p_legacy IN VARCHAR2)
1879 RETURN BOOLEAN AS
1880 BEGIN
1881 DECLARE
1882
1883 v_unit_attempt_status IGS_AD_ADM_UNIT_STAT.unit_attempt_status%TYPE;
1884 v_s_unit_status IGS_AD_ADM_UNIT_STAT.unit_attempt_status%TYPE;
1885 v_course_attempt_status IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE;
1886 CURSOR c_uas IS
1887 SELECT unit_attempt_status
1888 FROM IGS_AD_ADM_UNIT_STAT
1889 WHERE administrative_unit_status = p_administrative_unit_status;
1890 CURSOR c_uvus IS
1891 SELECT us.s_unit_status
1892 FROM IGS_PS_UNIT_VER uv,
1893 IGS_PS_UNIT_STAT us
1894 WHERE uv.unit_cd = p_unit_cd AND
1895 uv.version_number = p_version_number AND
1896 us.unit_status = uv.unit_status;
1897 CURSOR c_cas IS
1898 SELECT course_attempt_status
1899 FROM IGS_EN_STDNT_PS_ATT
1900 WHERE person_id = p_person_id AND
1901 course_cd = p_course_cd;
1902 BEGIN
1903 -- This module validates the discontinued_dt from
1904 -- the IGS_EN_SU_ATTEMPT
1905 p_message_name := null;
1906
1907 -- This validation should not be done for dropped unit attempts
1908 -- which are being enrolled again. The administrative status
1909 -- will be null only for a dropped unit attempt. If the unit
1910 -- attempt was discontinued then the administrative unit status
1911 -- cannot be null.
1912 IF p_administrative_unit_status IS NULL AND p_legacy <> 'Y' THEN
1913 RETURN TRUE;
1914 END IF;
1915
1916 IF (p_discontinued_dt IS NOT NULL) THEN
1917 -- validate that the discontinued_dt is
1918 -- less than or equal to today's date
1919 IF (TRUNC(p_discontinued_dt) > TRUNC(SYSDATE)) THEN
1920 p_message_name := 'IGS_EN_SUA_DISCONT_FUTUREDT';
1921 IF p_legacy <> 'Y' THEN
1922 RETURN FALSE;
1923 ELSE
1924 Fnd_Message.Set_Name('IGS', p_message_name );
1925 FND_MSG_PUB.ADD;
1926 END IF;
1927 END IF;
1928 -- validate that the discontinued_dt is
1929 -- greater than or equal to the enrolled date
1930 IF (p_enrolled_dt IS NOT NULL AND
1931 (TRUNC(p_discontinued_dt) < TRUNC(p_enrolled_dt))) THEN
1932 p_message_name := 'IGS_EN_DISCONT_DT_GE_ENRDT';
1933 IF p_legacy <> 'Y' THEN
1934 RETURN FALSE;
1935 ELSE
1936 Fnd_Message.Set_Name('IGS', p_message_name );
1937 FND_MSG_PUB.ADD;
1938 END IF;
1939 END IF;
1940 END IF;
1941 -- validate that if the discontinued date is set,
1942 -- then the unit attempt status must be enrolled
1943 IF (p_discontinued_dt IS NOT NULL AND
1944 p_unit_attempt_status NOT IN ('ENROLLED', 'DISCONTIN' , 'DUPLICATE', 'DROPPED') AND
1945 p_legacy <> 'Y' ) THEN
1946 p_message_name := 'IGS_EN_ENROL_SUA_DISCONT';
1947 RETURN FALSE;
1948 END IF;
1949 -- validate that if the discontinued date is not set,
1950 -- then the related administrative status is not set
1951 IF (p_discontinued_dt IS NULL AND
1952 p_administrative_unit_status IS NOT NULL AND p_legacy <> 'Y' ) THEN
1953 OPEN c_uas;
1954 FETCH c_uas INTO v_unit_attempt_status;
1955 CLOSE c_uas;
1956 IF (v_unit_attempt_status = 'DISCONTIN') THEN
1957 p_message_name := 'IGS_EN_DISCONT_ADM_UNIT_ST';
1958 RETURN FALSE;
1959 END IF;
1960 END IF;
1961 IF (p_discontinued_dt IS NULL and p_legacy <> 'Y') THEN
1962 -- validate that if the discontinued date is not set,
1963 -- then the unit version is active
1964 OPEN c_uvus;
1965 FETCH c_uvus INTO v_s_unit_status;
1966 CLOSE c_uvus;
1967 IF (v_s_unit_status <> 'ACTIVE') THEN
1968 p_message_name := 'IGS_EN_UNITVERSION_INACTIVE';
1969 RETURN FALSE;
1970 END IF;
1971 -- validate that the course attempt status
1972 -- is enrolled, inactive or completed
1973 OPEN c_cas;
1974 FETCH c_cas INTO v_course_attempt_status;
1975 CLOSE c_cas;
1976 IF (v_course_attempt_status NOT IN ('ENROLLED', 'INACTIVE', 'COMPLETED')) THEN
1977 p_message_name := 'IGS_EN_SUA_NOT_DISCONT';
1978 RETURN FALSE;
1979 END IF;
1980 END IF;
1981 RETURN TRUE;
1982 EXCEPTION
1983 WHEN OTHERS THEN
1984 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
1985 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_SUA.enrp_val_sua_discont');
1986 IGS_GE_MSG_STACK.ADD;
1987 App_Exception.Raise_Exception;
1988 END;
1989 END enrp_val_sua_discont;
1990 --
1991 -- To validate enrolled date of SUA.
1992 FUNCTION enrp_val_sua_enr_dt(
1993 p_person_id IN NUMBER ,
1994 p_course_cd IN VARCHAR2 ,
1995 p_enrolled_dt IN DATE ,
1996 p_unit_attempt_status IN VARCHAR2 ,
1997 p_ci_end_dt IN DATE ,
1998 p_commencement_dt IN DATE ,
1999 p_message_name OUT NOCOPY VARCHAR2 ,
2000 p_legacy IN VARCHAR2)
2001 RETURN BOOLEAN AS
2002 -------------------------------------------------------------------------------------------
2003 --Change History:
2004 --Who When What
2005 --amuthu 02-APR-2002 defined the constant cst_waitlisted.
2006 -- the validation was presently being bypassed for unconfirmed units
2007 -- alone. Now waitlist status is also being added to it. bug 2335455
2008 --Nishikant 13-may-2002 Bug#2364216 Dropped case is also removed in the condition while checking for the Enrolled date
2009 -- is null or not. If the status is DROPPED then no need to check the Enrolled date is null or not.
2010 -- bdeviset 13-JUL-2005 if the status is PLANNED then no need to check the Enrolled date is null or not.
2011 -- for bug# 4377985 BUILD FOR EN317 SELF SERVICE ENHANCEMENTS
2012 -------------------------------------------------------------------------------------------
2013
2014 BEGIN
2015 DECLARE
2016 cst_unconfirm CONSTANT VARCHAR2(10) := 'UNCONFIRM';
2017 cst_discontin CONSTANT VARCHAR2(10) := 'DISCONTIN';
2018 cst_waitlisted CONSTANT VARCHAR2(10) := 'WAITLISTED';
2019 cst_dropped CONSTANT VARCHAR2(10) := 'DROPPED'; -- Added by Nishikant - bug#2364216
2020 cst_planned CONSTANT VARCHAR2(10) := 'PLANNED';
2021 v_sca_details IGS_EN_STDNT_PS_ATT%ROWTYPE;
2022
2023 CURSOR c_sca_details (
2024 cp_person_id IGS_EN_SU_ATTEMPT.person_id%TYPE,
2025 cp_course_cd IGS_EN_SU_ATTEMPT.course_cd%TYPE) IS
2026 SELECT *
2027 FROM IGS_EN_STDNT_PS_ATT
2028 WHERE person_id = cp_person_id AND
2029 course_cd = cp_course_cd;
2030 BEGIN
2031 -- Validate that the IGS_EN_SU_ATTEMPT.enrolled_dt must be set
2032 -- for all unit attempt statuses with the exception of UNCONFIRM
2033 -- Validate that IGS_EN_SU_ATTEMPT.enrolled_dt >=
2034 -- IGS_EN_STDNT_PS_ATT.commencement_dt.
2035 -- Validate that the student unit attempt enrolled date must
2036 -- be set for all unit attempt statuses, with the exception
2037 -- of UNCONFIRM.
2038 -- amuthu 02-APR-2002, Now adding the WAITLISED status also
2039 -- to the exceptions, since for a waitlist status also the
2040 -- the enrolled date will not be set. see bug 2335455
2041
2042 -- Nishikant - Bug#bug#2364216 -- Dropped case is also removed in the condition
2043 -- If the status is DROPPED then no need to check the Enrolled date is null or not.
2044 -- if the status is PLANNED then no need to check the Enrolled date is null or not
2045 IF (p_enrolled_dt IS NULL
2046 AND p_unit_attempt_status <> cst_unconfirm
2047 AND p_unit_attempt_status <> cst_waitlisted
2048 AND p_unit_attempt_status <> cst_dropped
2049 AND p_unit_attempt_status <> cst_planned
2050 AND p_legacy <> 'Y' ) THEN
2051 p_message_name := 'IGS_GE_MANDATORY_FLD';
2052 RETURN FALSE;
2053 END IF;
2054 IF (p_enrolled_dt IS NOT NULL) THEN
2055 OPEN c_sca_details (p_person_id,
2056 p_course_cd);
2057 FETCH c_sca_details INTO v_sca_details;
2058 -- check if a record was found
2059 IF (c_sca_details%NOTFOUND) THEN
2060 p_message_name := null;
2061 CLOSE c_sca_details;
2062 RETURN TRUE;
2063 ELSE
2064 CLOSE c_sca_details;
2065 -- check the status of the student_confirmed_ind
2066 IF (v_sca_details.student_confirmed_ind = 'N') THEN
2067 p_message_name := 'IGS_EN_SUA_NOTENR_SPA';
2068 RETURN FALSE;
2069 ELSE
2070 -- check that not enrolling when course attempt is discontinued
2071 IF (v_sca_details.course_attempt_status = cst_discontin) THEN
2072 IF p_unit_attempt_status = cst_unconfirm AND p_legacy <> 'Y' THEN
2073 p_message_name := 'IGS_EN_SUA_NOT_ENROL';
2074 RETURN FALSE;
2075 END IF;
2076 END IF;
2077 -- Do not perform the following validation
2078 -- for now
2079 -- if p_commencement_dt is null, then
2080 -- retrieve the value from the database
2081 --IF (p_commencement_dt IS NULL) THEN
2082 -- IF (v_sca_details.commencement_dt > p_enrolled_dt) THEN
2083 -- p_message_name := 'IGS_EN_ENRDT_GE_SPA_COMMDT';
2084 -- RETURN FALSE;
2085 -- END IF;
2086 --ELSE
2087 -- IF (p_commencement_dt > p_enrolled_dt) THEN
2088 -- p_message_name := 'IGS_EN_ENRDT_GE_SPA_COMMDT';
2089 -- RETURN FALSE;
2090 -- END IF;
2091 --END IF;
2092 END IF;
2093 END IF;
2094 END IF;
2095 /* comment for bug 2344075 as per ray's suggestion
2096 IF (p_enrolled_dt IS NOT NULL AND p_enrolled_dt > p_ci_end_dt) THEN
2097 p_message_name := 'IGS_EN_ENRDT_LE_UOO_TEACHPRD';
2098 RETURN FALSE;
2099 END IF;
2100 */
2101 -- set the default message number and return type
2102 p_message_name := null;
2103 RETURN TRUE;
2104 END;
2105 END enrp_val_sua_enr_dt;
2106 --
2107 -- To validate SCA sub-units.
2108
2109 --
2110 -- To validate deletion of the student unit attempt
2111 FUNCTION enrp_val_sua_delete(
2112 p_person_id IN NUMBER ,
2113 p_course_cd IN VARCHAR2 ,
2114 p_unit_cd IN VARCHAR2 ,
2115 p_form_trigger_ind IN VARCHAR2 ,
2116 p_unit_attempt_status IN VARCHAR2 ,
2117 p_cal_type IN VARCHAR2 ,
2118 p_ci_sequence_number IN NUMBER ,
2119 p_discontinued_dt IN DATE ,
2120 p_effective_dt IN DATE ,
2121 p_message_name OUT NOCOPY VARCHAR2,
2122 p_uoo_id IN NUMBER)
2123 -------------------------------------------------------------------------------------------
2124 --Change History:
2125 --Who When What
2126 --kkillams 28-04-2003 Removed the cur_uoo_IGS_EN_SU_ATTEMPT cursor and it's references
2127 -- and modified the c_sut cursor where clause w.r.t. bug number 2829262
2128 -------------------------------------------------------------------------------------------
2129 RETURN BOOLEAN AS
2130 gv_other_details VARCHAR2(255);
2131 BEGIN -- enrp_val_sua_delete
2132 -- Validate the deletion of a IGS_EN_SU_ATTEMPT
2133 DECLARE
2134 cst_duplicate IGS_EN_SU_ATTEMPT.unit_attempt_status%TYPE := 'DUPLICATE';
2135 cst_discontinued IGS_EN_SU_ATTEMPT.unit_attempt_status%TYPE := 'DISCONTIN';
2136 cst_completed IGS_EN_SU_ATTEMPT.unit_attempt_status%TYPE := 'COMPLETED';
2137 cst_unconfirmed IGS_EN_SU_ATTEMPT.unit_attempt_status%TYPE := 'UNCONFIRM';
2138 cst_enrolled IGS_EN_SU_ATTEMPT.unit_attempt_status%TYPE := 'ENROLLED';
2139 cst_invalid IGS_EN_SU_ATTEMPT.unit_attempt_status%TYPE := 'INVALID';
2140 v_del_alwd_dt DATE := NULL;
2141 CURSOR c_sca IS
2142 SELECT course_rqrmnt_complete_ind
2143 FROM IGS_EN_STDNT_PS_ATT
2144 WHERE person_id = p_person_id AND
2145 course_cd = p_course_cd;
2146 v_course_rqrmnt_complete_ind
2147 IGS_EN_STDNT_PS_ATT.course_rqrmnt_complete_ind%TYPE := NULL;
2148 CURSOR c_sut IS
2149 SELECT 'x'
2150 FROM IGS_PS_STDNT_UNT_TRN
2151 WHERE person_id = p_person_id AND
2152 transfer_course_cd = p_course_cd AND
2153 uoo_id = p_uoo_id;
2154 v_sut_found VARCHAR2(1) := NULL;
2155 BEGIN
2156 -- Set the default message number
2157 p_message_name := null;
2158 -- Unconfirmed unit attempts can be deleted at any stage.
2159 IF p_unit_attempt_status = cst_unconfirmed OR
2160 p_unit_attempt_status = cst_invalid THEN
2161 RETURN TRUE;
2162 END IF;
2163 -- Duplicate unit attempts cannot be deleted when the
2164 -- course requirements are completed
2165 IF p_unit_attempt_status = cst_duplicate THEN
2166 OPEN c_sca;
2167 FETCH c_sca INTO v_course_rqrmnt_complete_ind;
2168 IF (c_sca%FOUND) THEN
2169 CLOSE c_sca;
2170 IF (v_course_rqrmnt_complete_ind = 'Y') THEN
2171 p_message_name := 'IGS_EN_DUPL_SUA_NOTDEL';
2172 RETURN FALSE;
2173 END IF;
2174 ELSE
2175 CLOSE c_sca;
2176 END IF;
2177 -- Validate that the duplicate student unit attempt is
2178 -- not a duplicate in another course.
2179 OPEN c_sut;
2180 FETCH c_sut INTO v_sut_found;
2181 IF (c_sut%FOUND) THEN
2182 CLOSE c_sut;
2183 p_message_name := 'IGS_EN_DUPL_STUD_UNIT_ATTEMPT';
2184 RETURN FALSE;
2185 END IF;
2186 CLOSE c_sut;
2187 END IF;
2188 -- Completed or discontinued unit attempts cannot be deleted
2189 IF p_unit_attempt_status = cst_completed OR
2190 p_unit_attempt_status = cst_discontinued THEN
2191 p_message_name := 'IGS_EN_CANT_DEL_DISCONT_ATMPT';
2192 RETURN FALSE;
2193 END IF;
2194
2195 -- Validate that delete is allowed as per unit
2196 -- unit discontinuation date criteria
2197 -- This validation cannot be performed in the trigger
2198 -- to cater before backdating of discontinuation date
2199 -- resulting in a delete (the discontinuation date is
2200 -- not available in delete trigger).
2201 IF p_unit_attempt_status = cst_enrolled THEN
2202 IF p_form_trigger_ind = 'F' THEN
2203 IF p_discontinued_dt IS NOT NULL THEN
2204 v_del_alwd_dt := p_discontinued_dt;
2205 ELSE
2206 v_del_alwd_dt := p_effective_dt;
2207 END IF;
2208 --Modified as a part of Enrollment Process build bug no:1832130
2209 -- Sarakshi , 27-07-2001,one cursor is opened to fetch the uoo_id corresponding
2210 -- to the pk of igs_en_su_attempt and passed to IGS_EN_GEN_008.ENRP_GET_UA_DEL_ALWD
2211 IF IGS_EN_GEN_008.ENRP_GET_UA_DEL_ALWD(
2212 p_cal_type,
2213 p_ci_sequence_number,
2214 v_del_alwd_dt,
2215 p_uoo_id) = 'N' THEN
2216 p_message_name := 'IGS_EN_CANT_DEL_STUD_UNIT';
2217 RETURN FALSE;
2218 END IF;
2219 END IF;
2220 END IF;
2221 --- Validate that for enrolled student_unit_attempts, the
2222 --- record can only be deleted in the record enrolments time frame.
2223 IF p_unit_attempt_status = cst_enrolled THEN
2224 --Modified as a part of Enrollment Process build bug no:1832130
2225 -- Sarakshi , 27-07-2001,one cursor is opened to fetch the uoo_id corresponding
2226 -- to the pk of igs_en_su_attempt and passed to igs_en_gen_008.enrp_get_var_window
2227
2228 -- Modified the Next IF logic as per the Bug# 2356997. Made the
2229 -- call to the igs_en_gen_008.enrp_get_var_window instead of IGS_EN_GEN_004.ENRP_GET_REC_WINDOW
2230 IF igs_en_gen_008.enrp_get_var_window(
2231 p_cal_type,
2232 p_ci_sequence_number,
2233 p_effective_dt,
2234 p_uoo_id) = FALSE THEN
2235 p_message_name := 'IGS_EN_CANT_DEL_ENRL_STUD_UNT';
2236 RETURN FALSE;
2237 END IF;
2238 END IF;
2239 --- Return the default return value
2240 RETURN TRUE;
2241 EXCEPTION
2242 WHEN OTHERS THEN
2243 IF (c_sca%ISOPEN) THEN
2244 CLOSE c_sca;
2245 END IF;
2246 IF (c_sut%ISOPEN) THEN
2247 CLOSE c_sut;
2248 END IF;
2249 RAISE;
2250 END;
2251 EXCEPTION
2252 WHEN OTHERS THEN
2253 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
2254 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_SUA.enrp_val_sua_delete');
2255 IGS_GE_MSG_STACK.ADD;
2256 App_Exception.Raise_Exception;
2257 END enrp_val_sua_delete;
2258 --
2259 -- To validate insert of SUA.
2260 FUNCTION enrp_val_sua_insert(
2261 p_person_id IN NUMBER ,
2262 p_course_cd IN VARCHAR2 ,
2263 p_unit_attempt_status IN VARCHAR2 ,
2264 p_message_name OUT NOCOPY varchar2 )
2265 RETURN BOOLEAN AS
2266 gv_other_details VARCHAR2(255);
2267 BEGIN
2268 DECLARE
2269 cst_discontin CONSTANT
2270 IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE:= 'DISCONTIN';
2271 cst_lapsed CONSTANT
2272 IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE := 'LAPSED';
2273 cst_unconfirm CONSTANT
2274 IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE := 'UNCONFIRM';
2275 cst_completed CONSTANT
2276 IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE := 'COMPLETED';
2277 cst_duplicate CONSTANT
2278 IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE := 'DUPLICATE';
2279 CURSOR c_sca IS
2280 SELECT sca.course_attempt_status
2281 FROM IGS_EN_STDNT_PS_ATT sca
2282 WHERE sca.person_id = p_person_id AND
2283 sca.course_cd = p_course_cd;
2284 v_course_attempt_status IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE;
2285 BEGIN
2286 --- Set the default message number
2287 p_message_name := null;
2288 --- Get the course attempt status
2289 OPEN c_sca;
2290 FETCH c_sca INTO v_course_attempt_status;
2291 IF c_sca%NOTFOUND THEN
2292 CLOSE c_sca;
2293 RETURN TRUE;
2294 END IF;
2295 CLOSE c_sca;
2296 -- Validate against status of IGS_EN_STDNT_PS_ATT
2297 IF (v_course_attempt_status = cst_discontin) THEN
2298 IF (p_unit_attempt_status <> cst_duplicate) THEN
2299 p_message_name := 'IGS_EN_CANT_INS_STUD_UNT_ATMP';
2300 RETURN FALSE;
2301 END IF;
2302 END IF;
2303 IF (v_course_attempt_status = cst_lapsed) THEN
2304 p_message_name := 'IGS_EN_CANT_INS_STUD_UNT_ATMP';
2305 RETURN FALSE;
2306 END IF;
2307 IF (v_course_attempt_status = cst_unconfirm) THEN
2308 IF (p_unit_attempt_status <> cst_unconfirm) THEN
2309 p_message_name := 'IGS_EN_UNCONF_SUA_INSERTED';
2310 RETURN FALSE;
2311 END IF;
2312 END IF;
2313 IF (v_course_attempt_status = cst_completed) THEN
2314 IF (p_unit_attempt_status = cst_duplicate) THEN
2315 p_message_name := 'IGS_EN_DUPL_SUA_NOTINS';
2316 RETURN FALSE;
2317 END IF;
2318 END IF;
2319 -- Return the default value
2320 RETURN TRUE;
2321 EXCEPTION
2322 WHEN OTHERS THEN
2323 IF (c_sca%ISOPEN) THEN
2324 CLOSE c_sca;
2325 END IF;
2326 RAISE;
2327 END;
2328 END enrp_val_sua_insert;
2329 --
2330 -- Validate the confirmation of a student unit attempt.
2331 FUNCTION ENRP_VAL_SUA_CNFRM(
2332 p_person_id IN NUMBER ,
2333 p_course_cd IN VARCHAR2 ,
2334 p_unit_cd IN VARCHAR2 ,
2335 p_uv_version_number NUMBER ,
2336 p_cal_type IN VARCHAR2 ,
2337 p_ci_sequence_number IN NUMBER ,
2338 p_ci_end_dt IN DATE ,
2339 p_location_cd IN VARCHAR2 ,
2340 p_unit_class IN VARCHAR2 ,
2341 p_enrolled_dt IN DATE ,
2342 p_fail_type OUT NOCOPY VARCHAR2 ,
2343 p_message_name OUT NOCOPY varchar2 )
2344 RETURN BOOLEAN AS
2345 -------------------------------------------------------------------------------------------
2346 --Change History:
2347 --Who When What
2348 --kkillams 28-04-2003 Impacted object, due to change in the signature of igs_en_val_sua.enrp_val_sua_dupl
2349 -- of the function w.r.t. bug number 2829262
2350 -------------------------------------------------------------------------------------------
2351
2352 BEGIN -- enrp_val_sua_cnfrm
2353 -- Perform all validations associated with the confirmation of a unit
2354 -- attempt for a student. This module is a grouping of existing
2355 -- validation modules.
2356 -- Performs the following modules:
2357 -- Call IGS_EN_VAL_SUA.enrp_val_sua_insert;
2358 -- determine if the student is of the correct status to have
2359 -- a unit attempt added.
2360 -- Call IGS_EN_VAL_ENCMB.enrp_val_excld_unit;
2361 -- determine if the student is currently excluded from the unit.
2362 -- Call IGS_EN_VAL_SUA.enrp_val_sua_advstnd;
2363 -- determine if the student has already satisfied the unit
2364 -- through advanced standing.
2365 -- Call IGS_EN_VAL_SUA.enrp_val_sua_intrmt;
2366 -- determine if the attempt overlaps an existing period of
2367 -- intermission.
2368 -- Call IGS_EN_VAL_SUA.enrp_val_coo_loc;
2369 -- determine if the attempt is in line with students forced
2370 -- location (if applicable).
2371 -- Call IGS_EN_VAL_SUA.enrp_val_coo_mode;
2372 -- determine if the attemt is in line with students forced
2373 -- mode (if applicable).
2374 -- Call IGS_EN_VAL_SUA.enrp_val_sua_enr_dt;
2375 -- validate the enrolled date.
2376 -- Call IGS_EN_VAL_SUA.enrp_val_sua_ci;
2377 -- validate that the teaching period of the unit is not prior to
2378 -- the commencement date of the student course attempt.
2379 -- Call IGS_EN_VAL_SUA.enrp_val_sua_dupl;
2380 -- determine if the student is already enrolled concurrently in the
2381 -- unit or has completed the unit with a pass or incomplete result type.
2382 -- Call IGS_EN_VAL_SUA.resp_val_sua_cnfrm;
2383 -- validate if attempting to confirm a research unit attempt.
2384 -- The current set of fail types are:
2385 -- course The course isn?t in a correct state. ie.
2386 -- Discontinued or intermitted for the teaching period.
2387 -- ENCUMB Excluded from the unit by either course/unit or person encumbrances
2388 -- ADVSTAND Already granted in advanced standing
2389 -- CROSS Breaches a cross-element restriction
2390 -- ENROLDT Enrolment date invalid
2391 -- TEACHING Teaching Period invalid
2392 -- DUPLICATE Already enrolled or completed unit attempt
2393 DECLARE
2394 cst_enrolled CONSTANT VARCHAR2(10) := 'ENROLLED';
2395 cst_course CONSTANT VARCHAR2(10) := 'course';
2396 cst_encumb CONSTANT VARCHAR2(10) := 'ENCUMB';
2397 cst_advstand CONSTANT VARCHAR2(10) := 'ADVSTAND';
2398 cst_cross CONSTANT VARCHAR2(10) := 'CROSS';
2399 cst_enroldt CONSTANT VARCHAR2(10) := 'ENROLDT';
2400 cst_teaching CONSTANT VARCHAR2(10) := 'TEACHING';
2401 cst_duplicate CONSTANT VARCHAR2(10) := 'DUPLICATE';
2402 CURSOR c_sca IS
2403 SELECT sca.version_number,
2404 sca.coo_id,
2405 sca.commencement_dt
2406 FROM IGS_EN_STDNT_PS_ATT sca
2407 WHERE person_id = p_person_id AND
2408 course_cd = p_course_cd;
2409 CURSOR c_sua IS
2410 SELECT uoo_id
2411 FROM igs_ps_unit_ofr_opt
2412 WHERE unit_cd = p_unit_cd
2413 AND version_number = p_uv_version_number
2414 AND cal_type = p_cal_type
2415 AND ci_sequence_number = p_ci_sequence_number
2416 AND location_cd = p_location_cd
2417 AND unit_class = p_unit_class;
2418
2419 l_uoo_id igs_en_su_attempt.uoo_id%TYPE;
2420 v_sca_rec c_sca%ROWTYPE;
2421 v_return_val BOOLEAN := FALSE;
2422 v_message_name varchar2(30);
2423 v_duplicate_course_cd VARCHAR2(6);
2424 BEGIN
2425 -- Set the := message number
2426 p_message_name := null;
2427 p_fail_type := NULL;
2428 OPEN c_sua;
2429 FETCH c_sua INTO l_uoo_id;
2430 CLOSE c_sua;
2431 -- Determine if the student is of the correct status to have a unit attempt
2432 -- added.
2433 IF NOT IGS_EN_VAL_SUA.enrp_val_sua_insert(
2434 p_person_id,
2435 p_course_cd,
2436 cst_enrolled,
2437 v_message_name) THEN
2438 p_fail_type := cst_course;
2439 p_message_name := v_message_name;
2440 RETURN FALSE;
2441 END IF;
2442 IF v_message_name <> NULL THEN
2443 p_fail_type := cst_course;
2444 p_message_name := v_message_name;
2445 END IF;
2446 -- Determine if the attempt overlaps an existing period of intermission.
2447 IF NOT IGS_EN_VAL_SUA.enrp_val_sua_intrmt(
2448 p_person_id,
2449 p_course_cd,
2450 p_cal_type,
2451 p_ci_sequence_number,
2452 v_message_name) THEN
2453 p_fail_type := cst_course;
2454 p_message_name := v_message_name;
2455 RETURN FALSE;
2456 END IF;
2457 IF v_message_name <> NULL THEN
2458 p_fail_type := cst_course;
2459 p_message_name := v_message_name;
2460 END IF;
2461 -- Validate research unit attempt
2462 IF NOT IGS_EN_VAL_SUA.resp_val_sua_cnfrm(
2463 p_person_id,
2464 p_course_cd,
2465 p_unit_cd,
2466 p_uv_version_number,
2467 p_cal_type,
2468 p_ci_sequence_number,
2469 v_message_name ,
2470 'N' ) THEN
2471 p_fail_type := cst_course;
2472 p_message_name := v_message_name;
2473 RETURN FALSE;
2474 END IF;
2475 IF v_message_name <> NULL THEN
2476 p_fail_type := cst_course;
2477 p_message_name := v_message_name;
2478 END IF;
2479 -- Determine if the student is currently excluded from the unit
2480 IF NOT IGS_EN_VAL_SUA.enrp_val_sua_excld(
2481 p_person_id,
2482 p_course_cd,
2483 p_unit_cd,
2484 p_cal_type,
2485 p_ci_sequence_number,
2486 v_message_name) THEN
2487 p_fail_type := cst_encumb;
2488 p_message_name := v_message_name;
2489 RETURN FALSE;
2490 END IF;
2491 IF v_message_name <> NULL THEN
2492 p_fail_type := cst_encumb;
2493 p_message_name := v_message_name;
2494 END IF;
2495 -- Fetch student course attempt details
2496 OPEN c_sca;
2497 FETCH c_sca INTO v_sca_rec;
2498 CLOSE c_sca;
2499 -- Determine if the student has already satisfied the unit through advanced
2500 -- standing.
2501 IF NOT IGS_EN_VAL_SUA.enrp_val_sua_advstnd(
2502 p_person_id,
2503 p_course_cd,
2504 v_sca_rec.version_number,
2505 p_unit_cd,
2506 p_uv_version_number,
2507 v_message_name ,
2508 'N' ) THEN
2509 p_fail_type := cst_advstand;
2510 p_message_name := v_message_name;
2511 RETURN FALSE;
2512 END IF;
2513 IF v_message_name <> NULL THEN
2514 p_fail_type := cst_advstand;
2515 p_message_name := v_message_name;
2516 END IF;
2517 -- Determine if the attempt is in line with students
2518 -- forced location (if applicable).
2519 IF NOT IGS_EN_VAL_SUA.enrp_val_coo_loc(
2520 v_sca_rec.coo_id,
2521 p_location_cd,
2522 v_message_name) THEN
2523 p_fail_type := cst_cross;
2524 p_message_name := v_message_name;
2525 RETURN FALSE;
2526 END IF;
2527 IF v_message_name <> NULL THEN
2528 p_fail_type := cst_cross;
2529 p_message_name := v_message_name;
2530 END IF;
2531 -- Determine if the attempt is in line with students forced mode (if
2532 -- applicable).
2533 IF NOT IGS_EN_VAL_SUA.enrp_val_coo_mode(
2534 v_sca_rec.coo_id,
2535 p_unit_class,
2536 v_message_name) THEN
2537 p_fail_type := cst_cross;
2538 p_message_name := v_message_name;
2539 RETURN FALSE;
2540 END IF;
2541 IF v_message_name <> NULL THEN
2542 p_fail_type := cst_cross;
2543 p_message_name := v_message_name;
2544 END IF;
2545 -- Validate the enrolled date.
2546 IF NOT IGS_EN_VAL_SUA.enrp_val_sua_enr_dt(
2547 p_person_id,
2548 p_course_cd,
2549 p_enrolled_dt,
2550 cst_enrolled,
2551 p_ci_end_dt,
2552 v_sca_rec.commencement_dt,
2553 v_message_name ,
2554 'N' ) THEN
2555 p_fail_type := cst_enroldt;
2556 p_message_name := v_message_name;
2557 RETURN FALSE;
2558 END IF;
2559 IF v_message_name <> NULL THEN
2560 p_fail_type := cst_enroldt;
2561 p_message_name := v_message_name;
2562 END IF;
2563 -- Determine if the student unit attempt has a teaching period
2564 -- which is prior to the commencement date of the student course attempt
2565 IF NOT IGS_EN_VAL_SUA.enrp_val_sua_ci(
2566 p_person_id,
2567 p_course_cd,
2568 p_cal_type,
2569 p_ci_sequence_number,
2570 'ENROLLED',
2571 v_sca_rec.commencement_dt,
2572 'F', -- commencement date is known
2573 v_message_name) THEN
2574 p_fail_type := cst_teaching;
2575 p_message_name := v_message_name;
2576 RETURN FALSE;
2577 END IF;
2578 IF v_message_name <> NULL THEN
2579 p_fail_type := cst_teaching;
2580 p_message_name := v_message_name;
2581 END IF;
2582 -- Determine if the student unit attempt already exists as
2583 -- enrolled or completed with pass or incomplete result
2584 IF NOT IGS_EN_VAL_SUA.enrp_val_sua_dupl(
2585 p_person_id,
2586 p_course_cd,
2587 p_unit_cd,
2588 p_uv_version_number,
2589 p_cal_type,
2590 p_ci_sequence_number,
2591 cst_enrolled, -- unit_attempt_status when confirming
2592 v_duplicate_course_cd,
2593 v_message_name,
2594 l_uoo_id) THEN
2595 p_fail_type := cst_duplicate;
2596 p_message_name := v_message_name;
2597 RETURN FALSE;
2598 END IF;
2599 IF v_message_name <> NULL THEN
2600 p_fail_type := cst_duplicate;
2601 p_message_name := v_message_name;
2602 END IF;
2603 -- Return the default value
2604 RETURN TRUE;
2605 EXCEPTION
2606 WHEN OTHERS THEN
2607 IF c_sca%ISOPEN THEN
2608 CLOSE c_sca;
2609 END IF;
2610 RAISE;
2611 END;
2612 END enrp_val_sua_cnfrm;
2613 --
2614 -- Validate the course against a posted change to student unit attempt.
2615 FUNCTION ENRP_VAL_SUA_CNFRM_P(
2616 p_person_id IN NUMBER ,
2617 p_course_cd IN VARCHAR2,
2618 p_course_version IN NUMBER,
2619 p_coo_id IN NUMBER ,
2620 p_cal_type IN VARCHAR2 ,
2621 p_ci_sequence_number IN NUMBER ,
2622 p_uoo_id IN NUMBER,
2623 p_fail_type OUT NOCOPY VARCHAR2 ,
2624 p_message_name OUT NOCOPY varchar2 ,
2625 p_message_name2 OUT NOCOPY varchar2 )
2626 RETURN BOOLEAN AS
2627 -------------------------------------------------------------------------------------------
2628 --Change History:
2629 --Who When What
2630 --svanukur 04-dec-2003 as part of the holds bug the procedure that checks student ecumbrances
2631 -- IGS_EN_VAL_ENCMB.enrp_val_enr_encmb is being modified to consider only term calendar.
2632 -- Hence modifying the call to this procedure to pass the load calendars under the
2633 -- superior acad calendar in reference.
2634 --ckasu 17-Nov-2004 modfied the procedure inorder to consider enrollment Category setup
2635 -- for checking the Forced location, attendance mode as apart of Program
2636 -- Transfer Build#4000939
2637 --amuthu 18-May-2006 Removed the holds validation call from here. The logic for the same has been
2638 -- moved to IGS_EN_TRANSFER_APIS.check_for_holds.
2639 -------------------------------------------------------------------------------------------
2640
2641 BEGIN -- enrp_val_sua_cnfrm_p
2642 -- Perform all post-commit (or post) validations to a given student unit
2643 -- attempt. This module is a grouping of existing validation modules.
2644 -- Performs the following modules:
2645 -- Call IGS_EN_VAL_SUA.resp_val_sua_all to check any research unit related
2646 -- issues.
2647 -- Call IGS_EN_VAL_ENCMB.enrp_val_enr_encmb to check that the student hasn't
2648 -- breached any encumbrance restrictions (eg. max cp).
2649 -- Call IGS_EN_VAL_SCA.enrp_val_coo_att to ensure that the student is in line
2650 -- with their forced attendance mode.
2651 -- -- Call enrp_val_unit_rule.{rulp_val_coreq,rulp_val_incomp,rulp_val_prereq}
2652 -- to check all unit rules - these unit attempts should be rejected
2653 -- outright, and not set to Invalid.
2654 -- as part of the holds bug the procedure that checks student ecumbrances IGS_EN_VAL_ENCMB.enrp_val_enr_encmb
2655 -- is being modified to consider only term calendar. Hence modifying the call to this procedure
2656 -- to pass the load calendars under the superior calendars in reference.
2657 DECLARE
2658 cst_research CONSTANT VARCHAR2(10) := 'RESEARCH';
2659 cst_cross CONSTANT VARCHAR2(10) := 'CROSS';
2660 cst_superior CONSTANT VARCHAR2(10) := 'SUPERIOR';
2661 v_message_name varchar2(30);
2662
2663 CURSOR c_get_teach_cal_dtls(cp_person_id IGS_EN_SU_ATTEMPT.person_id%TYPE,
2664 cp_course_cd IGS_EN_SU_ATTEMPT.course_cd%TYPE,
2665 cp_uoo_id IGS_EN_SU_ATTEMPT.uoo_id%TYPE) IS
2666 SELECT cal_type,ci_sequence_number
2667 FROM IGS_EN_SU_ATTEMPT
2668 WHERE person_id = cp_person_id AND
2669 course_cd = cp_course_cd AND
2670 uoo_id = cp_uoo_id;
2671
2672 CURSOR c_get_load_cal_dtls(cp_teach_cal_type IGS_CA_INST.cal_type%TYPE,
2673 cp_teach_cal_seq_num IGS_CA_INST.sequence_number%TYPE) IS
2674 SELECT load_cal_type,load_ci_sequence_number
2675 FROM IGS_CA_TEACH_TO_LOAD_V
2676 WHERE teach_cal_type = cp_teach_cal_type AND
2677 teach_ci_sequence_number = cp_teach_cal_seq_num ;
2678
2679
2680 l_person_type igs_pe_person_types.person_type_code%TYPE;
2681 l_enr_meth_type igs_en_method_type.enr_method_type%TYPE;
2682 l_enr_category VARCHAR2(20);
2683 l_enr_comm_type VARCHAR2(2000);
2684 l_enrolment_cat IGS_AS_SC_ATMPT_ENR.enrolment_cat%TYPE;
2685 l_enr_cal_type IGS_AS_SC_ATMPT_ENR.cal_type%TYPE;
2686 l_enr_cal_seq_num IGS_AS_SC_ATMPT_ENR.ci_sequence_number%TYPE;
2687 l_enr_method_type IGS_EN_METHOD_TYPE.enr_method_type%TYPE;
2688 l_dummy VARCHAR2(255);
2689 l_notification_flag IGS_EN_CPD_EXT.notification_flag%TYPE;
2690 l_teach_cal_type IGS_CA_INST.cal_type%TYPE;
2691 l_teach_cal_seq_num IGS_CA_INST.sequence_number%TYPE;
2692 l_load_cal_type IGS_CA_INST.cal_type%TYPE;
2693 l_load_cal_seq_num IGS_CA_INST.sequence_number%TYPE;
2694 l_message_name FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
2695 l_message_name1 FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
2696 l_message_name2 FND_NEW_MESSAGES.MESSAGE_NAME%TYPE;
2697 l_return_status VARCHAR2(10);
2698 l_status BOOLEAN;
2699
2700 BEGIN
2701 p_fail_type := NULL;
2702 p_message_name := null;
2703 p_message_name2 := null;
2704 -- Check research unit related issues
2705 IF IGS_EN_VAL_SUA.resp_val_sua_all(
2706 p_person_id,
2707 p_course_cd,
2708 p_cal_type,
2709 p_ci_sequence_number,
2710 v_message_name) = FALSE THEN
2711 p_fail_type := cst_research;
2712 p_message_name := v_message_name;
2713 RETURN FALSE;
2714 ELSE
2715 IF v_message_name <> NULL THEN
2716 p_fail_type := cst_research;
2717 p_message_name := v_message_name;
2718 END IF;
2719 END IF;
2720 -- Determine if the student is of the correct status to have a unit attempt
2721 -- added.
2722
2723
2724 -- code added by ckasu as a part of Program transfer build bug#4000939
2725
2726 l_person_type := IGS_EN_GEN_008.enrp_get_person_type(NULL);
2727
2728 --get enrolment method type
2729
2730 igs_en_gen_017.enrp_get_enr_method(p_enr_method_type => l_enr_method_type,
2731 p_error_message => l_message_name,
2732 p_ret_status => l_return_status);
2733
2734 -- getting enrolment category , commencement type
2735
2736 l_enr_category := IGS_EN_GEN_003.enrp_get_enr_cat( p_person_id => p_person_id,
2737 p_course_cd => p_course_cd,
2738 p_cal_type => p_cal_type,
2739 p_ci_sequence_number => p_ci_sequence_number ,
2740 p_session_enrolment_cat =>NULL,
2741 p_enrol_cal_type => l_enr_cal_type ,
2742 p_enrol_ci_sequence_number => l_enr_cal_seq_num,
2743 p_commencement_type => l_enr_comm_type,
2744 p_enr_categories => l_dummy );
2745
2746 l_notification_flag := igs_ss_enr_details.get_notification(
2747 p_person_type => l_person_type,
2748 p_enrollment_category => l_enr_category,
2749 p_comm_type => l_enr_comm_type,
2750 p_enr_method_type => l_enr_method_type,
2751 p_step_group_type => 'UNIT',
2752 p_step_type => 'FLOC_CHK',
2753 p_person_id => p_person_id,
2754 p_message => l_message_name);
2755
2756 OPEN c_get_teach_cal_dtls(p_person_id,p_course_cd,p_uoo_id);
2757 FETCH c_get_teach_cal_dtls INTO l_teach_cal_type,l_teach_cal_seq_num;
2758 IF c_get_teach_cal_dtls%FOUND THEN
2759 CLOSE c_get_teach_cal_dtls;
2760 OPEN c_get_load_cal_dtls(l_teach_cal_type,l_teach_cal_seq_num);
2761 FETCH c_get_load_cal_dtls INTO l_load_cal_type,l_load_cal_seq_num;
2762 CLOSE c_get_load_cal_dtls;
2763 ELSE
2764 CLOSE c_get_teach_cal_dtls;
2765 END IF; -- end of c_get_teach_cal_dtls%FOUND IF THEN
2766
2767 IF l_notification_flag IS NOT NULL THEN
2768
2769 l_status := IGS_EN_ELGBL_UNIT.eval_unit_forced_location(p_person_id,
2770 l_load_cal_type,
2771 l_load_cal_seq_num,
2772 p_uoo_id,
2773 p_course_cd,
2774 p_course_version,
2775 l_message_name1,
2776 l_notification_flag,
2777 'JOB' -- parameter for calling_obj column
2778 );
2779 IF l_notification_flag = 'DENY' AND l_message_name1 IS NOT NULL THEN
2780 p_message_name := l_message_name1;
2781 RETURN FALSE;
2782 END IF;
2783
2784 END IF;
2785
2786 l_notification_flag := igs_ss_enr_details.get_notification(
2787 p_person_type => l_person_type,
2788 p_enrollment_category => l_enr_category,
2789 p_comm_type => l_enr_comm_type,
2790 p_enr_method_type => l_enr_method_type,
2791 p_step_group_type => 'UNIT',
2792 p_step_type => 'FATD_MODE',
2793 p_person_id => p_person_id,
2794 p_message => l_message_name);
2795
2796
2797
2798 IF l_notification_flag IS NOT NULL THEN
2799
2800 l_status := IGS_EN_ELGBL_UNIT.eval_unit_forced_mode (p_person_id,
2801 l_load_cal_type,
2802 l_load_cal_seq_num,
2803 p_uoo_id,
2804 p_course_cd,
2805 p_course_version,
2806 l_message_name2,
2807 l_notification_flag,
2808 'JOB' -- parameter for calling_obj column
2809 );
2810 IF l_notification_flag = 'DENY' AND l_message_name2 IS NOT NULL THEN
2811 p_message_name := l_message_name2;
2812 RETURN FALSE;
2813 END IF;
2814
2815 END IF;
2816
2817
2818 -- end of code added by ckasu as a part of Program transfer build bug#4000939
2819
2820 RETURN TRUE;
2821
2822 END;
2823 EXCEPTION
2824 WHEN OTHERS THEN
2825 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
2826 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_SUA.enrp_val_sua_cnfrm_p');
2827 IGS_GE_MSG_STACK.ADD;
2828 App_Exception.Raise_Exception;
2829 END enrp_val_sua_cnfrm_p;
2830 --
2831 -- To validate SUA override credit point values
2832 -- New parameter p_uoo_id is added w.r.t. bug num: 2375757 by kkillams
2833 FUNCTION enrp_val_sua_ovrd_cp(
2834 p_unit_cd IN VARCHAR2 ,
2835 p_version_number IN NUMBER ,
2836 p_override_enrolled_cp IN NUMBER ,
2837 p_override_achievable_cp IN NUMBER ,
2838 p_override_eftsu IN NUMBER ,
2839 p_message_name OUT NOCOPY varchar2,
2840 p_uoo_id IN NUMBER,
2841 p_no_assessment_ind IN VARCHAR2)
2842 RETURN BOOLEAN AS
2843
2844 BEGIN -- enrp_val_sua_ovrd_cp
2845 -- Validate the override credit point and EFTSU values against the
2846 -- constraints set in the IGS_PS_UNIT_VER table.
2847 DECLARE
2848 v_points_override_ind IGS_PS_UNIT_VER.points_override_ind%TYPE;
2849 v_points_min IGS_PS_UNIT_VER.points_min%TYPE;
2850 v_points_max IGS_PS_UNIT_VER.points_max%TYPE;
2851 v_points_increment IGS_PS_UNIT_VER.points_increment%TYPE;
2852 CURSOR c_uv IS
2853 SELECT uv.points_override_ind,
2854 uv.points_min,
2855 uv.points_max,
2856 uv.points_increment
2857 FROM IGS_PS_UNIT_VER uv
2858 WHERE unit_cd = p_unit_cd AND
2859 version_number = p_version_number;
2860 --New cursor is added w.r.t. bug 2375757 by kkillams
2861 --To get the details override credit points at unit section level
2862 CURSOR c_usv IS
2863 SELECT usv.minimum_credit_points,
2864 usv.maximum_credit_points,
2865 usv.variable_increment
2866 FROM IGS_PS_USEC_CPS usv
2867 WHERE usv.uoo_id = p_uoo_id;
2868
2869 BEGIN
2870 p_message_name := NULL;
2871 -- If none of the override values are set then there is no validation to occur.
2872 IF p_override_enrolled_cp IS NULL AND
2873 p_override_achievable_cp IS NULL AND
2874 p_override_eftsu IS NULL THEN
2875 RETURN TRUE;
2876 END IF;
2877 -- Select details from unit version.
2878 OPEN c_uv;
2879 FETCH c_uv INTO v_points_override_ind,
2880 v_points_min,
2881 v_points_max,
2882 v_points_increment;
2883 IF (c_uv%NOTFOUND) THEN
2884 CLOSE c_uv;
2885 RETURN TRUE;
2886 END IF;
2887 CLOSE c_uv;
2888 -- If override points not allowed return error.
2889 IF v_points_override_ind = 'N' THEN
2890 p_message_name := 'IGS_EN_OVERRIDE_EFTSU_VALUES';
2891 RETURN FALSE;
2892 ELSE
2893 --If min and max credit points defined at unit section level
2894 --than override the values w.r.t bug no# 2375757 by kkillams
2895 IF p_uoo_id IS NOT NULL THEN
2896 OPEN c_usv;
2897 FETCH c_usv INTO v_points_min,
2898 v_points_max,
2899 v_points_increment;
2900 CLOSE c_usv;
2901 END IF;
2902 END IF;
2903
2904 -- If override cp is set and not in accordance with unit version ranges.
2905 IF p_override_enrolled_cp IS NOT NULL THEN
2906 IF p_override_enrolled_cp < v_points_min OR
2907 p_override_enrolled_cp > v_points_max OR
2908 ( MOD(p_override_enrolled_cp, v_points_increment) <> MOD(v_points_min, v_points_increment) ) THEN
2909 p_message_name := 'IGS_EN_OVERRIDE_ENR_CREDITPNT';
2910 RETURN FALSE;
2911 END IF;
2912 END IF;
2913 -- If override achievable cp is set and not in accordance with unit version
2914 -- ranges.
2915 IF p_override_achievable_cp IS NOT NULL THEN
2916 -- added as part of ENCR026 if the unit is an audit unit and the achievable CP is zero
2917 -- then should the acheivable CP should not be validated.
2918 IF NOT (NVL(p_no_assessment_ind,'N') = 'Y' AND p_override_achievable_cp = 0) THEN
2919 IF p_override_achievable_cp < v_points_min OR
2920 p_override_achievable_cp > v_points_max OR
2921 MOD (p_override_achievable_cp, v_points_increment) <> 0 THEN
2922 p_message_name := 'IGS_EN_OVERRIDE_ACHCRD_POINT';
2923 RETURN FALSE;
2924 END IF;
2925 END IF;
2926 END IF;
2927 RETURN TRUE;
2928 EXCEPTION
2929 WHEN OTHERS THEN
2930 IF (c_uv%ISOPEN) THEN
2931 CLOSE c_uv;
2932 END IF;
2933 RAISE;
2934 END;
2935 EXCEPTION
2936 WHEN OTHERS THEN
2937 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
2938 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_SUA.enrp_val_sua_ovrd_cp');
2939 IGS_GE_MSG_STACK.ADD;
2940 App_Exception.Raise_Exception;
2941 END enrp_val_sua_ovrd_cp;
2942 --
2943 -- To validate SUA rule waived date.
2944 FUNCTION enrp_val_sua_rule_wv(
2945 p_rule_waived_dt IN DATE ,
2946 p_enrolled_dt IN DATE ,
2947 p_rule_waived_person_id IN OUT NOCOPY NUMBER ,
2948 p_message_name OUT NOCOPY varchar2 )
2949 RETURN BOOLEAN AS
2950
2951
2952 BEGIN
2953 BEGIN
2954 --- Set the default message number
2955 p_message_name := null;
2956
2957
2958 --- Check that rule waived date is greater than the enrolled date if it exists
2959 IF p_enrolled_dt IS NOT NULL AND p_rule_waived_dt < TRUNC(p_enrolled_dt) THEN
2960 p_message_name := 'IGS_EN_RULE_WAV_DT_GE_ENRL_DT';
2961 RETURN FALSE;
2962 END IF;
2963 --- Return the default value
2964 RETURN TRUE;
2965 END;
2966 EXCEPTION
2967 WHEN OTHERS THEN
2968 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
2969 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_SUA.enrp_val_sua_rule_wv');
2970 IGS_GE_MSG_STACK.ADD;
2971 App_Exception.Raise_Exception;
2972 END enrp_val_sua_rule_wv;
2973
2974 --
2975 -- To validate SUA unit offering option.
2976 FUNCTION enrp_val_sua_uoo(
2977 p_unit_cd IN VARCHAR2 ,
2978 p_version_number IN NUMBER ,
2979 p_cal_type IN VARCHAR2 ,
2980 p_ci_sequence_number IN NUMBER ,
2981 p_location_cd IN VARCHAR2 ,
2982 p_unit_class IN VARCHAR2 ,
2983 p_message_name OUT NOCOPY VARCHAR2 ,
2984 p_legacy IN VARCHAR2)
2985 RETURN BOOLEAN AS
2986 gv_other_details VARCHAR2(255);
2987 BEGIN
2988 DECLARE
2989 CURSOR c_get_uv_status IS
2990 SELECT IGS_PS_UNIT_STAT.s_unit_status
2991 FROM IGS_PS_UNIT_VER,
2992 IGS_PS_UNIT_STAT
2993 WHERE IGS_PS_UNIT_VER.unit_cd = p_unit_cd AND
2994 IGS_PS_UNIT_VER.version_number = p_version_number AND
2995 IGS_PS_UNIT_STAT.unit_status = IGS_PS_UNIT_VER.unit_status;
2996 CURSOR c_val_uoo IS
2997 SELECT offered_ind
2998 FROM IGS_PS_UNIT_OFR_OPT
2999 WHERE unit_cd = p_unit_cd AND
3000 version_number = p_version_number AND
3001 cal_type = p_cal_type AND
3002 ci_sequence_number = p_ci_sequence_number AND
3003 location_cd = p_location_cd AND
3004 unit_class = p_unit_class;
3005 cst_no IGS_PS_UNIT_OFR_OPT.offered_ind%TYPE := 'N';
3006 cst_active IGS_PS_UNIT_STAT.s_unit_status%TYPE := 'ACTIVE';
3007 cst_inactive IGS_PS_UNIT_STAT.s_unit_status%TYPE := 'INACTIVE';
3008 v_uv_status IGS_PS_UNIT_STAT.s_unit_status%TYPE;
3009 v_offered_ind IGS_PS_UNIT_OFR_OPT.offered_ind%TYPE;
3010 BEGIN
3011 --- Set the default message number
3012 p_message_name := null;
3013 --- Validate that the unit version is ACTIVE.
3014 OPEN c_get_uv_status;
3015 FETCH c_get_uv_status INTO v_uv_status;
3016 IF c_get_uv_status%NOTFOUND THEN
3017 IF p_legacy <> 'Y' THEN
3018 CLOSE c_get_uv_status;
3019 RETURN TRUE;
3020 END IF ;
3021 END IF;
3022 CLOSE c_get_uv_status;
3023 IF v_uv_status <> cst_active THEN
3024 IF p_legacy <> 'Y' THEN
3025 p_message_name := 'IGS_EN_UNITVERSION_INACTIVE';
3026 RETURN FALSE;
3027 ELSIF v_uv_status <> cst_inactive AND p_legacy = 'Y' THEN
3028 p_message_name := 'IGS_EN_UNITVERSION_INACTIVE';
3029 Fnd_Message.Set_name('IGS','IGS_EN_UNITVERSION_INACTIVE');
3030 FND_MSG_PUB.ADD;
3031 END IF ;
3032 END IF;
3033 --- Validate that the unit offering option is offered.
3034 OPEN c_val_uoo;
3035 FETCH c_val_uoo INTO v_offered_ind;
3036 IF c_val_uoo%NOTFOUND THEN
3037 CLOSE c_val_uoo;
3038 RETURN TRUE;
3039 END IF;
3040 CLOSE c_val_uoo;
3041 IF v_offered_ind = cst_no THEN
3042 p_message_name := 'IGS_EN_STUD_UNT_OFF_NOT_AVALA';
3043 IF p_legacy <> 'Y' THEN
3044 RETURN FALSE;
3045 ELSE
3046 Fnd_Message.Set_name('IGS',p_message_name );
3047 FND_MSG_PUB.ADD;
3048 END IF;
3049 END IF;
3050 --- Set the default return value
3051 RETURN TRUE;
3052 END;
3053 EXCEPTION
3054 WHEN OTHERS THEN
3055 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
3056 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_SUA.enrp_val_sua_uoo');
3057 IGS_GE_MSG_STACK.ADD;
3058 App_Exception.Raise_Exception;
3059 END enrp_val_sua_uoo;
3060 --
3061 -- To validate sca location code against coo restriction
3062 FUNCTION ENRP_VAL_COO_LOC(
3063 p_coo_id IN NUMBER ,
3064 p_unit_location_cd IN VARCHAR2 ,
3065 p_message_name OUT NOCOPY varchar2 )
3066 RETURN boolean AS
3067 BEGIN
3068 DECLARE
3069 v_coo_rec_found BOOLEAN;
3070 v_unit_mode IGS_AS_UNIT_CLASS.unit_mode%TYPE;
3071 v_s_unit_mode IGS_AS_UNIT_MODE.s_unit_mode%TYPE;
3072 v_govt_attend_mode IGS_EN_ATD_MODE.govt_attendance_mode%TYPE;
3073 v_other_detail VARCHAR(255);
3074 CURSOR c_coo(
3075 cp_coo_id IGS_EN_STDNT_PS_ATT.coo_id%TYPE) IS
3076 SELECT *
3077 FROM IGS_PS_OFR_OPT
3078 WHERE IGS_PS_OFR_OPT.coo_id = cp_coo_id
3079 AND IGS_PS_OFR_OPT.delete_flag = 'N';
3080 BEGIN
3081 -- This module validates the nominated unit location code against
3082 -- course_offering_option location code for the enrolled course
3083 p_message_name := null;
3084 v_coo_rec_found := FALSE;
3085 FOR v_coo_rec IN c_coo(p_coo_id) LOOP
3086 v_coo_rec_found := TRUE;
3087 IF v_coo_rec.forced_location_ind = 'Y' THEN
3088 IF (p_unit_location_cd<> v_coo_rec.location_cd) THEN
3089 p_message_name := 'IGS_EN_UNT_LOC_CONFLICTS';
3090 RETURN FALSE;
3091 END IF;
3092 END IF;
3093 END LOOP;
3094 IF(NOT v_coo_rec_found) THEN
3095 RETURN TRUE;
3096 END IF;
3097 RETURN TRUE;
3098 END;
3099 END enrp_val_coo_loc;
3100 --
3101 -- To validate the sca att mode against coo restriction
3102 FUNCTION ENRP_VAL_COO_MODE(
3103 p_coo_id IN NUMBER ,
3104 p_unit_class IN VARCHAR2 ,
3105 p_message_name OUT NOCOPY varchar2 )
3106 RETURN boolean AS
3107 BEGIN
3108 DECLARE
3109 v_coo_rec_found BOOLEAN;
3110 v_unit_mode IGS_AS_UNIT_CLASS.unit_mode%TYPE;
3111 v_s_unit_mode IGS_AS_UNIT_MODE.s_unit_mode%TYPE;
3112 v_govt_attend_mode IGS_EN_ATD_MODE.govt_attendance_mode%TYPE;
3113 v_other_detail VARCHAR(255);
3114 CURSOR c_coo(
3115 cp_coo_id IGS_EN_STDNT_PS_ATT.coo_id%TYPE) IS
3116 SELECT *
3117 FROM IGS_PS_OFR_OPT
3118 WHERE IGS_PS_OFR_OPT.coo_id = cp_coo_id
3119 AND IGS_PS_OFR_OPT.delete_flag = 'N';
3120 CURSOR c_unit_class(
3121 cp_unit_class IGS_EN_SU_ATTEMPT.unit_class%TYPE) IS
3122 SELECT unit_mode
3123 FROM IGS_AS_UNIT_CLASS
3124 WHERE IGS_AS_UNIT_CLASS.unit_class = cp_unit_class AND IGS_AS_UNIT_CLASS.closed_ind = 'N';
3125 CURSOR c_unit_mode(
3126 cp_unit_mode IGS_AS_UNIT_CLASS.unit_mode%TYPE) IS
3127 SELECT s_unit_mode
3128 FROM IGS_AS_UNIT_MODE
3129 WHERE IGS_AS_UNIT_MODE.unit_mode = cp_unit_mode;
3130 CURSOR c_attend_mode(
3131 cp_attend_mode IGS_EN_ATD_MODE.attendance_mode%TYPE) IS
3132 SELECT govt_attendance_mode
3133 FROM IGS_EN_ATD_MODE
3134 WHERE IGS_EN_ATD_MODE.attendance_mode = cp_attend_mode;
3135 BEGIN
3136 -- This module validates the nominated unit class against
3137 -- course_offering_option attandance mode for the enrolled course
3138 p_message_name := null;
3139 v_coo_rec_found := FALSE;
3140 FOR v_coo_rec IN c_coo(p_coo_id) LOOP
3141 v_coo_rec_found := TRUE;
3142 IF v_coo_rec.forced_att_mode_ind = 'Y' THEN
3143 OPEN c_unit_class(
3144 p_unit_class);
3145 FETCH c_unit_class INTO v_unit_mode;
3146 CLOSE c_unit_class;
3147 OPEN c_unit_mode(
3148 v_unit_mode);
3149 FETCH c_unit_mode INTO v_s_unit_mode;
3150 CLOSE c_unit_mode;
3151 OPEN c_attend_mode(
3152 v_coo_rec.attendance_mode);
3153 FETCH c_attend_mode INTO v_govt_attend_mode;
3154 CLOSE c_attend_mode;
3155 IF v_s_unit_mode = 'ON' THEN
3156 IF (v_govt_attend_mode <> '1' AND
3157 v_govt_attend_mode <> '3') THEN
3158 p_message_name := 'IGS_EN_UNIT_CD_CONFLICTS';
3159 RETURN FALSE;
3160 END IF;
3161 ELSIF v_s_unit_mode = 'OFF' THEN
3162 IF (v_govt_attend_mode <> '2' AND
3163 v_govt_attend_mode <> '3') THEN
3164 p_message_name := 'IGS_EN_UNIT_CD_CONFLICTS';
3165 RETURN FALSE;
3166 END IF;
3167 END IF;
3168 END IF;
3169 END LOOP;
3170 IF(NOT v_coo_rec_found) THEN
3171 RETURN TRUE;
3172 END IF;
3173 RETURN TRUE;
3174 END;
3175 END enrp_val_coo_mode;
3176 --
3177
3178 --
3179 -- To validate for student unit attempt being duplicated
3180 FUNCTION enrp_val_sua_dupl(
3181 p_person_id IN NUMBER ,
3182 p_course_cd IN VARCHAR2 ,
3183 p_unit_cd IN VARCHAR2 ,
3184 p_uv_version_number IN NUMBER ,
3185 p_cal_type IN VARCHAR2 ,
3186 p_ci_sequence_number IN NUMBER ,
3187 p_unit_attempt_status IN VARCHAR2 ,
3188 p_duplicate_course_cd OUT NOCOPY VARCHAR2 ,
3189 p_message_name OUT NOCOPY VARCHAR2,
3190 p_uoo_id IN NUMBER)
3191 RETURN BOOLEAN AS
3192 -------------------------------------------------------------------------------------------
3193 -- enrp_val_sua_dupl
3194 -- This module validates that enrolled student unit attempt:
3195 -- * does not already exist for the student in any of their course attempts,
3196 -- is enrolled and being studied concurrently. note: Allow for duplicate if
3197 -- student_course_transfer between the two course attempts.
3198 -- This module warns if:
3199 -- * the unit attempt has already been completed in any of the course
3200 -- attempts of the student with a s_result_type of ?PASS? or ?INCOMPLETE?.
3201 --Change History:
3202 --Who When What
3203 --kkillams 28-04-2003 Added new parameter p_uoo_id to the function
3204 -- Modified the c_sua cursor where clause due
3205 -- to change in pk of student unit attempt table
3206 -- w.r.t. bug number 2829262
3207 -- rvivekan 09-sep-2003 Modified the behaviour of repeatable_ind column
3208 -- in igs_ps_unit_ver table. PSP integration build #3052433
3209 -- ckasu 28-NOV-2005 modified v_message_name <> NULL to v_message_name IS NOT NULL
3210 -- as a partof bug #4666102
3211 -------------------------------------------------------------------------------------------
3212
3213 BEGIN
3214 DECLARE
3215 cst_enrolled CONSTANT VARCHAR2(10) := 'ENROLLED';
3216 cst_completed CONSTANT VARCHAR2(10) := 'COMPLETED';
3217 cst_discontin CONSTANT VARCHAR2(10) := 'DISCONTIN';
3218 cst_pass CONSTANT VARCHAR2(10) := 'PASS';
3219 cst_incomp CONSTANT VARCHAR2(10) := 'INCOMP';
3220 CURSOR c_daiv (
3221 cp_cal_type IGS_CA_DA_INST_V.cal_type%TYPE,
3222 cp_ci_sequence_number IGS_CA_DA_INST_V.ci_sequence_number%TYPE) IS
3223 SELECT UNIQUE(daiv.alias_val) alias_val
3224 FROM IGS_CA_DA_INST_V daiv,
3225 IGS_GE_S_GEN_CAL_CON sgcc
3226 WHERE daiv.cal_type = cp_cal_type AND
3227 daiv.ci_sequence_number = cp_ci_sequence_number AND
3228 daiv.dt_alias = sgcc.census_dt_alias AND
3229 sgcc.s_control_num = 1;
3230 CURSOR c_sua(cp_location_cd IGS_EN_SU_ATTEMPT.LOCATION_CD%TYPE,
3231 cp_unit_class IGS_EN_SU_ATTEMPT.UNIT_CLASS%TYPE)IS
3232 SELECT sua.course_cd,
3233 sua.cal_type,
3234 sua.ci_sequence_number,
3235 sua.unit_attempt_status,
3236 sua.uoo_id
3237 FROM IGS_EN_SU_ATTEMPT sua
3238 WHERE sua.person_id = p_person_id AND
3239 sua.unit_cd = p_unit_cd AND
3240 sua.version_number = p_uv_version_number AND
3241 sua.location_cd = cp_location_cd AND
3242 sua.unit_class = cp_unit_class AND
3243 (sua.course_cd <> p_course_cd OR
3244 sua.cal_type <> p_cal_type OR
3245 sua.ci_sequence_number <> p_ci_sequence_number) AND
3246 sua.unit_attempt_status IN (cst_enrolled,
3247 cst_completed,
3248 cst_discontin);
3249 CURSOR c_sua_d IS
3250 SELECT sua.location_cd,
3251 sua.unit_class
3252 FROM IGS_EN_SU_ATTEMPT sua
3253 WHERE sua.person_id = p_person_id AND
3254 sua.course_cd = p_course_cd AND
3255 sua.uoo_id = p_uoo_id;
3256 CURSOR c_sct (
3257 cp_course_cd IGS_PS_STDNT_TRN.transfer_course_cd%TYPE) IS
3258 SELECT 'x'
3259 FROM IGS_PS_STDNT_TRN sct
3260 WHERE sct.person_id = p_person_id AND
3261 sct.course_cd = p_course_cd AND
3262 sct.transfer_course_cd = cp_course_cd;
3263 CURSOR c_uv IS
3264 SELECT uv.repeatable_ind
3265 FROM IGS_PS_UNIT_VER uv
3266 WHERE uv.unit_cd = p_unit_cd AND
3267 uv.version_number = p_uv_version_number;
3268 v_sct_exists VARCHAR2(1);
3269 TYPE r_alias_val_record_type IS RECORD(
3270 alias_val IGS_CA_DA_INST_V.alias_val%TYPE);
3271 r_alias_val_record r_alias_val_record_type;
3272 TYPE t_alias_val_type IS TABLE OF r_alias_val_record%TYPE
3273 INDEX BY BINARY_INTEGER;
3274 v_alias_val_table t_alias_val_type;
3275 v_alias_val_index BINARY_INTEGER := 0;
3276 v_index BINARY_INTEGER := 0;
3277 v_av_found BOOLEAN := FALSE;
3278 v_message_name VARCHAR2(30);
3279 rec_sua_d c_sua_d%ROWTYPE;
3280 v_s_result_type IGS_LOOKUPS_VIEW.lookup_code%TYPE := NULL;
3281 v_outcome_dt IGS_AS_SU_STMPTOUT.outcome_dt%TYPE;
3282 v_grading_schema_cd IGS_AS_GRD_SCH_GRADE.grading_schema_cd%TYPE;
3283 v_gs_version_number IGS_AS_GRD_SCH_GRADE.version_number%TYPE;
3284 v_grade IGS_AS_GRD_SCH_GRADE.grade%TYPE;
3285 v_mark IGS_AS_SU_STMPTOUT.mark%TYPE;
3286 v_origin_course_cd IGS_AS_SU_STMPTOUT.course_cd%TYPE;
3287 v_repeatable_ind IGS_PS_UNIT_VER.repeatable_ind%TYPE;
3288 v_duplicate_course_cd IGS_EN_SU_ATTEMPT.course_cd%TYPE;
3289 BEGIN
3290 -- Set the default message number and duplicate course code
3291 p_message_name := null;
3292 p_duplicate_course_cd := NULL;
3293 IF p_unit_attempt_status = cst_enrolled THEN
3294 -- Determine if the unit version is not repeatable
3295 OPEN c_uv;
3296 FETCH c_uv INTO v_repeatable_ind;
3297 IF (c_uv%NOTFOUND) THEN
3298 CLOSE c_uv;
3299 RETURN TRUE;
3300 END IF;
3301 CLOSE c_uv;
3302 -- Determine census date(s) in unit teaching period
3303 FOR v_daiv_rec IN c_daiv(
3304 p_cal_type,
3305 p_ci_sequence_number) LOOP
3306 -- add a new record to the exceptions table
3307 v_alias_val_index := v_alias_val_index + 1;
3308 v_alias_val_table(v_alias_val_index).alias_val := v_daiv_rec.alias_val;
3309 END LOOP; -- v_daiv_rec IN c_daiv
3310
3311 OPEN c_sua_d;
3312 FETCH c_sua_d INTO rec_sua_d;
3313 CLOSE c_sua_d;
3314 FOR v_sua_rec IN c_sua(rec_sua_d.location_cd,
3315 rec_sua_d.unit_class)
3316 LOOP
3317 IF v_sua_rec.unit_attempt_status = cst_enrolled THEN
3318 -- Determine if another enrolled attempt exists
3319 -- for this unit across all course attempts for the student
3320 IF v_sua_rec.cal_type = p_cal_type AND
3321 v_sua_rec.ci_sequence_number = p_ci_sequence_number THEN
3322 -- Check that this isn't a result of a course Transfer,
3323 -- and is therefore valid
3324 OPEN c_sct(
3325 v_sua_rec.course_cd);
3326 FETCH c_sct INTO v_sct_exists;
3327 IF c_sct%NOTFOUND THEN
3328 -- unit is currently being studied against another course
3329 CLOSE c_sct;
3330 v_duplicate_course_cd := v_sua_rec.course_cd;
3331 v_message_name := 'IGS_EN_UNITVER_CURR_ATTEMPTED';
3332 EXIT;
3333 END IF;
3334 CLOSE c_sct;
3335 -- Continue processing
3336 ELSE
3337 -- Determine if the matched unit is being studied concurrently
3338 -- Determine census date(s) in matched teaching period
3339 -- and check if same date value exists for the matched unit
3340 FOR v_daiv_rec IN c_daiv(
3341 v_sua_rec.cal_type, v_sua_rec.ci_sequence_number) LOOP
3342 v_index := 0;
3343 v_av_found := FALSE;
3344 WHILE v_index < v_alias_val_index AND
3345 NOT v_av_found LOOP
3346 v_index := v_index + 1;
3347 IF v_alias_val_table(v_index).alias_val =
3348 v_daiv_rec.alias_val THEN
3349 v_av_found := TRUE;
3350 END IF;
3351 END LOOP;
3352 IF v_av_found THEN
3353 v_duplicate_course_cd := v_sua_rec.course_cd;
3354 v_message_name := 'IGS_EN_UNITVER_CURR_ATTEMPTED';
3355 EXIT;
3356 END IF;
3357 END LOOP; -- v_daiv_rec IN c_daiv2
3358 END IF;
3359 END IF;
3360 IF v_message_name IS NOT NULL THEN
3361 EXIT;
3362 END IF;
3363 IF v_sua_rec.unit_attempt_status IN (cst_completed,
3364 cst_discontin) THEN
3365 IF v_repeatable_ind = 'X' THEN
3366 OPEN c_sct(v_sua_rec.course_cd);
3367 FETCH c_sct INTO v_sct_exists;
3368 IF c_sct%NOTFOUND THEN
3369 CLOSE c_sct;
3370 -- Continue processing
3371 -- Warn if the unit version is not repeatable
3372 -- and the unit has already been completed with
3373 -- a result type of pass or incomplete
3374 v_s_result_type := IGS_AS_GEN_003.ASSP_GET_SUA_OUTCOME(p_person_id,
3375 v_sua_rec.course_cd,
3376 p_unit_cd,
3377 v_sua_rec.cal_type,
3378 v_sua_rec.ci_sequence_number,
3379 v_sua_rec.unit_attempt_status,
3380 'N', -- finalised indicator
3381 v_outcome_dt,
3382 v_grading_schema_cd,
3383 v_gs_version_number,
3384 v_grade,
3385 v_mark,
3386 v_origin_course_cd,
3387 v_sua_rec.uoo_id,
3388 --added by LKAKI---
3389 'N');
3390 IF v_s_result_type = cst_pass THEN
3391 v_duplicate_course_cd := v_sua_rec.course_cd;
3392 v_message_name := 'IGS_EN_UNITVER_STUD_PASSED';
3393 EXIT;
3394 ELSIF v_s_result_type = cst_incomp THEN
3395 v_duplicate_course_cd := v_sua_rec.course_cd;
3396 v_message_name := 'IGS_EN_UNITVER_INCOMPL_RESULT';
3397 EXIT;
3398 END IF;
3399 ELSE
3400 CLOSE c_sct;
3401 END IF;
3402
3403
3404 END IF;
3405 END IF;
3406 END LOOP; -- v_sua_rec IN c_sua
3407 END IF;
3408 IF v_message_name IS NOT NULL THEN
3409 p_duplicate_course_cd := v_duplicate_course_cd;
3410 p_message_name := v_message_name;
3411 IF v_message_name IN ('IGS_EN_UNITVER_INCOMPL_RESULT',
3412 'IGS_EN_UNITVER_STUD_PASSED') THEN
3413 RETURN TRUE;
3414 END IF;
3415 RETURN FALSE;
3416 END IF;
3417 RETURN TRUE;
3418 EXCEPTION
3419 WHEN OTHERS THEN
3420 IF c_uv%ISOPEN THEN
3421 CLOSE c_uv;
3422 END IF;
3423 IF c_daiv%ISOPEN THEN
3424 CLOSE c_daiv;
3425 END IF;
3426 IF c_sua%ISOPEN THEN
3427 CLOSE c_sua;
3428 END IF;
3429 IF c_sct%ISOPEN THEN
3430 CLOSE c_sct;
3431 END IF;
3432 RAISE;
3433 END;
3434 END enrp_val_sua_dupl;
3435
3436 PROCEDURE enr_sub_units(
3437 p_person_id IN NUMBER ,
3438 p_course_cd IN VARCHAR2 ,
3439 p_uoo_id IN NUMBER,
3440 p_waitlist_flag IN VARCHAR2,
3441 p_load_cal_type IN VARCHAR2,
3442 p_load_seq_num IN NUMBER,
3443 p_enrollment_date IN DATE ,
3444 p_enrollment_method IN VARCHAR2,
3445 p_enr_uoo_ids IN VARCHAR2,
3446 p_uoo_ids OUT NOCOPY VARCHAR2,
3447 p_waitlist_uoo_ids OUT NOCOPY VARCHAR2,
3448 p_failed_uoo_ids OUT NOCOPY VARCHAR2) AS
3449 -------------------------------------------------------------------------------------------
3450 --Created by : Satya Vanukuri, Oracle IDC
3451 --Date created: 13-oct-2003
3452 -- Purpose : Created as part of placements build .
3453 --procedure enrolls subordinate unit sections that are marked as default enroll
3454 --if the student is attempting superior unit section
3455 --if a subordinate units section is explicitly selected by the user along with the superior units
3456 --then no other sub units are enrolled
3457 -------------------------------------------------------------------------------------------
3458 CURSOR cur_sup is
3459 SELECT 1 FROM IGS_PS_UNIT_OFR_OPT
3460 WHERE uoo_id = p_uoo_id
3461 AND relation_type = 'SUPERIOR' ;
3462
3463 l_check_sup NUMBER(1);
3464
3465 TYPE sub_ref_cur IS REF CURSOR;
3466 cur_sub sub_ref_cur;
3467 cur_sub1 sub_ref_cur;
3468 sub_stmt VARCHAR2(1000);
3469
3470 sub_stmt1 VARCHAR2(1000);
3471
3472 CURSOR get_sub_usecs IS
3473 SELECT * FROM IGS_PS_UNIT_OFR_OPT
3474 WHERE sup_uoo_id = p_uoo_id AND
3475 default_enroll_flag = 'Y' AND
3476 relation_type = 'SUBORDINATE';
3477
3478 CURSOR cur_person_number IS
3479 SELECT party_number from hz_parties
3480 WHERE party_id = p_person_id;
3481
3482 l_sub_id igs_ps_unit_ofr_opt.uoo_id%TYPE;
3483 l_uoo_id igs_ps_unit_ofr_opt.uoo_id%TYPE;
3484 l_unit_section_status igs_ps_unit_ofr_opt.unit_section_status%TYPE;
3485 l_waitlist_ind VARCHAR2(1);
3486 l_return_status VARCHAR2(1);
3487 l_err_message VARCHAR2(1000);
3488 l_message_name VARCHAR2(1000);
3489 l_person_number IGS_PE_PERSON.person_number%TYPE;
3490 l_enroll BOOLEAN;
3491 BEGIN
3492 sub_stmt := 'SELECT uoo_id FROM IGS_PS_UNIT_OFR_OPT WHERE sup_uoo_id = :p_uoo_id AND
3493 relation_type = ''SUBORDINATE'' AND uoo_id in ('||p_enr_uoo_ids||')';
3494
3495 sub_stmt1 := 'SELECT uoo_id FROM IGS_PS_UNIT_OFR_OPT WHERE sup_uoo_id = :p_uoo_id AND
3496 relation_type = ''SUBORDINATE'' AND uoo_id = :1';
3497
3498 p_uoo_ids := NULL;
3499 p_waitlist_uoo_ids := NULL;
3500 p_failed_uoo_ids := NULL;
3501 l_check_sup := NULL;
3502
3503
3504 --Check whether context unit section is a superior unit attempt
3505 OPEN cur_sup;
3506 FETCH cur_sup INTO l_check_sup;
3507 CLOSE cur_sup;
3508
3509
3510 IF l_check_sup IS NULL THEN
3511 RETURN;
3512
3513 ELSE
3514 IF p_enr_uoo_ids IS NOT NULL THEN
3515 --then check whether anyone of uoo_ids in the list p_enr_uoo_ids is subordinate to the context uoo_id
3516 IF(INSTR(p_enr_uoo_ids,',',1) = 0) THEN
3517 l_uoo_id := TO_NUMBER(p_enr_uoo_ids);
3518 OPEN cur_sub1 for sub_stmt1 using p_uoo_id,l_uoo_id;
3519 FETCH cur_sub1 INTO l_sub_id;
3520 CLOSE cur_sub1;
3521 ELSE
3522
3523 OPEN cur_sub FOR sub_stmt using p_uoo_id;
3524 FETCH cur_sub INTO l_sub_id;
3525 CLOSE cur_sub;
3526 END IF;
3527
3528 IF l_sub_id IS NOT NULL THEN
3529 RETURN;
3530 END IF;
3531 END IF;
3532 END IF;
3533 --none of the sub units have been chosen, hence select all the sub units that have default enroll set
3534
3535
3536 FOR sub_usecs_rec IN get_sub_usecs LOOP
3537 l_enroll := TRUE;
3538 l_message_name := NULL;
3539 --call api to validate enrollment window
3540 IF NOT IGS_EN_GEN_004.ENRP_GET_REC_WINDOW(
3541 sub_usecs_rec.cal_type,
3542 sub_usecs_rec.ci_sequence_number,
3543 nvl(p_enrollment_date,SYSDATE),
3544 sub_usecs_rec.uoo_id,
3545 l_message_name) THEN
3546
3547 IF p_failed_uoo_ids IS NOT NULL THEN
3548 p_failed_uoo_ids := p_failed_uoo_ids ||','||sub_usecs_rec.uoo_id;
3549 ELSE
3550 p_failed_uoo_ids := sub_usecs_rec.uoo_id;
3551 END IF;
3552
3553
3554 ELSE
3555 --call api to validate variation window
3556 IF NOT IGS_EN_GEN_008.ENRP_GET_VAR_WINDOW(
3557 sub_usecs_rec.cal_type,
3558 sub_usecs_rec.ci_sequence_number,
3559 nvl(p_enrollment_date,SYSDATE),
3560 sub_usecs_rec.uoo_id) THEN
3561
3562 IF p_failed_uoo_ids IS NOT NULL THEN
3563 p_failed_uoo_ids := p_failed_uoo_ids ||','||sub_usecs_rec.uoo_id;
3564 ELSE
3565 p_failed_uoo_ids := sub_usecs_rec.uoo_id;
3566 END IF;
3567
3568 ELSE
3569 l_unit_section_status := NULL;
3570 l_waitlist_ind := NULL;
3571 --check seat availibility for sub unit
3572 igs_en_gen_015.get_usec_status(
3573 p_uoo_id => sub_usecs_rec.uoo_id,
3574 p_person_id => p_person_id,
3575 p_unit_section_status => l_unit_section_status,
3576 p_waitlist_ind => l_waitlist_ind,
3577 p_load_cal_type => p_load_cal_type,
3578 p_load_ci_sequence_number => p_load_seq_num,
3579 p_course_cd => p_course_cd) ;
3580
3581 IF l_waitlist_ind IS NULL THEN
3582 IF p_failed_uoo_ids IS NOT NULL THEN
3583 p_failed_uoo_ids := p_failed_uoo_ids ||','||sub_usecs_rec.uoo_id;
3584 ELSE
3585 p_failed_uoo_ids := sub_usecs_rec.uoo_id;
3586 END IF;
3587
3588 ELSE
3589 IF l_waitlist_ind = 'Y' AND p_waitlist_flag = 'Y' THEN
3590 l_enroll := FALSE;
3591 IF p_failed_uoo_ids IS NOT NULL THEN
3592 p_failed_uoo_ids := p_failed_uoo_ids ||','||sub_usecs_rec.uoo_id;
3593 ELSE
3594 p_failed_uoo_ids := sub_usecs_rec.uoo_id;
3595 END IF;
3596 END IF;
3597 IF l_enroll THEN
3598 l_return_status := NULL;
3599 l_err_message := NULL;
3600
3601 OPEN cur_person_number;
3602 FETCH cur_person_number INTO l_person_number;
3603 CLOSE cur_person_number;
3604 SAVEPOINT enrwksht;
3605 --create unconfirm/waitlist sub unit attmepts
3606 BEGIN
3607 igs_ss_en_wrappers.insert_into_enr_worksheet(
3608 p_person_number =>l_person_number,
3609 p_course_cd => p_course_cd,
3610 p_uoo_id => sub_usecs_rec.uoo_id,
3611 p_waitlist_ind => l_waitlist_ind,
3612 p_session_id => NULL,
3613 p_return_status => l_return_status,
3614 p_message => l_err_message,
3615 p_cal_type => p_load_cal_type,
3616 p_ci_sequence_number => p_load_seq_num,
3617 p_audit_requested => 'N',
3618 p_enr_method => p_enrollment_method,
3619 p_override_cp => null,
3620 p_subtitle => null,
3621 p_gradsch_cd => null,
3622 p_gs_version_num => null,
3623 p_calling_obj =>'JOB'
3624 );
3625 EXCEPTION WHEN OTHERS THEN
3626 l_return_status := 'D';
3627 END;
3628
3629
3630 IF l_return_status <> 'D' THEN --implies success
3631
3632 IF l_waitlist_ind = 'Y' THEN --implies unit was waitlisted.
3633
3634 IF p_waitlist_uoo_ids IS NOT NULL THEN
3635 p_waitlist_uoo_ids := p_waitlist_uoo_ids ||','||sub_usecs_rec.uoo_id;
3636 ELSE
3637 p_waitlist_uoo_ids := sub_usecs_rec.uoo_id;
3638 END IF;
3639 ELSIF l_waitlist_ind = 'N' THEN --implies unit was preenrolled
3640
3641 IF p_uoo_ids IS NOT NULL THEN
3642 p_uoo_ids := p_uoo_ids||','||sub_usecs_rec.uoo_id;
3643 ELSE
3644 p_uoo_ids := sub_usecs_rec.uoo_id;
3645 END IF;
3646 END IF;
3647 ELSE --implies unit was not preenrolled or waitlisted.
3648 ROLLBACK to enrwksht;
3649 IF p_failed_uoo_ids IS NOT NULL THEN
3650 p_failed_uoo_ids := p_failed_uoo_ids ||','||sub_usecs_rec.uoo_id;
3651 ELSE
3652 p_failed_uoo_ids := sub_usecs_rec.uoo_id;
3653 END IF;
3654 END IF;
3655 END IF; -- l_enroll
3656 END IF; --l_waitlst_ind NULL
3657
3658 END IF; --IGS_EN_GEN_008.ENRP_GET_VAR_WINDOW
3659 END IF; --IF IGS_EN_GEN_004.ENRP_GET_REC_WINDOW
3660 END LOOP;
3661 EXCEPTION
3662 WHEN OTHERS THEN
3663 IF cur_sup%ISOPEN THEN
3664 CLOSE cur_sup;
3665 END IF;
3666 IF cur_sub%ISOPEN THEN
3667 CLOSE cur_sub;
3668 END IF;
3669 IF cur_sub1%ISOPEN THEN
3670 CLOSE cur_sub1;
3671 END IF;
3672 IF get_sub_usecs%ISOPEN THEN
3673 CLOSE get_sub_usecs;
3674 END IF;
3675 IF cur_person_number%ISOPEN THEN
3676 CLOSE cur_person_number;
3677 END IF;
3678 RAISE;
3679
3680
3681 END enr_sub_units;
3682
3683 PROCEDURE drop_sub_units(
3684 p_person_id IN NUMBER,
3685 p_course_cd IN VARCHAR2,
3686 p_uoo_id IN NUMBER,
3687 p_load_cal_type IN VARCHAR2,
3688 p_load_seq_num IN NUMBER,
3689 p_acad_cal_type IN VARCHAR2,
3690 p_acad_seq_num IN NUMBER,
3691 p_enrollment_method IN VARCHAR2,
3692 p_confirmed_ind IN VARCHAR2,
3693 p_person_type IN VARCHAR2,
3694 p_effective_date IN DATE,
3695 p_course_ver_num IN NUMBER,
3696 p_dcnt_reason_cd IN VARCHAR2,
3697 p_admin_unit_status IN VARCHAR2,
3698 p_uoo_ids OUT NOCOPY VARCHAR2,
3699 p_error_message OUT NOCOPY VARCHAR2) As
3700
3701 -------------------------------------------------------------------------------------------
3702 --Created by : Satya Vanukuri, Oracle IDC
3703 --Date created: 13-oct-2003
3704 -- Purpose : Created as part of placements build .
3705 -- procedure drops subordinate unit sections if the student is dropping superior unit section
3706 -- who when what
3707 -- ckasu 25-APR-2006 Modfied as a part of bug#5191592.
3708 -------------------------------------------------------------------------------------------
3709 CURSOR cur_sup is
3710 SELECT 1 FROM IGS_PS_UNIT_OFR_OPT
3711 WHERE uoo_id = p_uoo_id
3712 AND relation_type = 'SUPERIOR' ;
3713
3714 l_check_sup NUMBER(1);
3715
3716 CURSOR cur_sub_sua IS
3717 SELECT sua.uoo_id sub_uoo_id
3718 FROM IGS_EN_SU_ATTEMPT sua, IGS_PS_UNIT_OFR_OPT uoo
3719 WHERE sua.person_id = p_person_id AND
3720 sua.course_cd = p_course_cd AND
3721 sua.uoo_id = uoo.uoo_id AND
3722 uoo.sup_uoo_id = p_uoo_id AND
3723 uoo.relation_type = 'SUBORDINATE' ;
3724
3725 CURSOR cur_coo_id is
3726 SELECT sca.coo_id
3727 FROM igs_en_stdnt_ps_att sca
3728 WHERE sca.person_id = p_person_id
3729 AND sca.course_cd = p_course_cd;
3730
3731 l_coo_id igs_en_stdnt_ps_att.coo_id%TYPE;
3732
3733 l_sub_sua IGS_PS_UNIT_OFR_OPT.uoo_id%TYPE;
3734 l_ovrrd_chk VARCHAR2(1);
3735 l_ovrrd_drop VARCHAR2(1);
3736 l_enrolment_cat IGS_PS_TYPE.enrolment_cat%TYPE;
3737 l_en_cal_type igs_ca_inst.cal_type%TYPE;
3738 l_en_ci_seq_num igs_ca_inst.sequence_number%TYPE;
3739 l_commencement_type VARCHAR2(10);
3740 l_dummy VARCHAR2(255);
3741 l_total_credit_points NUMBER;
3742 l_att_type VARCHAR2(100);
3743 l_attendance_types VARCHAR2(2000);
3744 l_message_name VARCHAR2(2000);
3745 l_eftsu_total NUMBER;
3746 l_ret_status BOOLEAN;
3747 l_err_message VARCHAR2(2000);
3748 BEGIN
3749 OPEN cur_sup;
3750 FETCH cur_sup INTO l_check_sup;
3751 CLOSE cur_sup;
3752
3753 IF l_check_sup IS NULL THEN
3754 RETURN;
3755 END IF;
3756
3757 IF p_confirmed_ind = 'Y' THEN
3758 l_ovrrd_chk := 'Y';
3759 l_ovrrd_drop := 'N';
3760
3761 ELSIF p_confirmed_ind = 'N' THEN
3762 l_ovrrd_chk := 'N';
3763 l_ovrrd_drop := 'N';
3764
3765 ELSE
3766 l_ovrrd_chk := 'N';
3767 l_ovrrd_drop := 'Y';
3768 END IF;
3769
3770 OPEN cur_sub_sua ;
3771 LOOP
3772 FETCH cur_sub_sua INTO l_sub_sua;
3773 EXIT WHEN cur_sub_sua%NOTFOUND;
3774
3775 -- Determine the Enrollment method , Enrollment Commencement type.
3776 l_dummy := NULL;
3777 l_enrolment_cat:=IGS_EN_GEN_003.Enrp_Get_Enr_Cat(p_person_id =>p_person_id,
3778 p_course_cd =>p_course_cd,
3779 p_cal_type =>p_acad_cal_type,
3780 p_ci_sequence_number =>p_acad_seq_num,
3781 p_session_enrolment_cat =>NULL,
3782 p_enrol_cal_type =>l_en_cal_type,
3783 p_enrol_ci_sequence_number =>l_en_ci_seq_num,
3784 p_commencement_type =>l_commencement_type,
3785 p_enr_categories =>l_dummy);
3786
3787 -- A call to igs_en_prc_load.enrp_clc_eftsu_total
3788 -- The Total enrolled CP of the student has to be determined before the unit is dropped(l_total_credit_points) .
3789 -- The unit is then dropped , and eval_min_cp is called with the value of l_total_enrolled_cp.
3790 -- The value of l_total_enrolled_cp is essential to determine if the Min Credit Points is already reached
3791 -- by the student before that Unit is dropped.
3792 l_eftsu_total := igs_en_prc_load.enrp_clc_eftsu_total(p_person_id => p_person_id,
3793 p_course_cd => p_course_cd,
3794 p_acad_cal_type => p_acad_cal_type,
3795 p_acad_sequence_number => p_acad_seq_num,
3796 p_load_cal_type => p_load_cal_type,
3797 p_load_sequence_number => p_load_seq_num,
3798 p_truncate_ind => 'N',
3799 p_include_research_ind => 'Y' ,
3800 p_key_course_cd => NULL ,
3801 p_key_version_number => NULL ,
3802 p_credit_points => l_total_credit_points );
3803
3804 -- Check if the Forced Attendance Type has already been reached for the Student before transferring .
3805 OPEN cur_coo_id;
3806 FETCH cur_coo_id INTO l_coo_Id;
3807 CLOSE cur_coo_id;
3808 l_message_name :=NULL;
3809
3810 IF igs_en_val_sca.enrp_val_coo_att(p_person_id => p_person_id,
3811 p_coo_id => l_coo_id,
3812 p_cal_type => p_acad_cal_type,
3813 p_ci_sequence_number => p_acad_seq_num,
3814 p_message_name => l_message_name,
3815 p_attendance_types => l_attendance_types,
3816 p_load_or_teach_cal_type => p_load_cal_type,
3817 p_load_or_teach_seq_number => p_load_seq_num) THEN
3818 -- Assign values to the parameter p_deny_warn_att based on if Attendance Type has not been already reached or not.
3819 l_att_type := 'AttTypReached' ;
3820
3821 ELSE
3822 l_att_type := 'AttTypNotReached' ;
3823
3824 END IF ;
3825
3826 igs_ss_en_wrappers.blk_drop_units(
3827 p_uoo_id => l_sub_sua,
3828 p_person_id => p_person_id,
3829 p_person_type => p_person_type,
3830 p_load_cal_type => p_load_cal_type,
3831 p_load_sequence_number => p_load_seq_num,
3832 p_acad_cal_type => p_acad_cal_type,
3833 p_acad_sequence_number => p_acad_seq_num,
3834 p_program_cd => p_course_cd,
3835 p_program_version => p_course_ver_num,
3836 p_dcnt_reason_cd => p_dcnt_reason_cd ,
3837 p_admin_unit_status => p_admin_unit_status,
3838 p_effective_date => p_effective_date,
3839 p_enrolment_cat => l_enrolment_Cat,
3840 p_comm_type => l_commencement_type,
3841 p_enr_meth_type => p_enrollment_method,
3842 p_total_credit_points => l_total_credit_points,
3843 p_force_att_type => l_att_type,
3844 p_val_ovrrd_chk => l_ovrrd_chk,
3845 p_ovrrd_drop => l_ovrrd_drop,
3846 p_return_status =>l_ret_status,
3847 p_message =>l_err_message,
3848 P_sub_unit =>'Y' );
3849
3850 IF NOT l_ret_status THEN
3851 p_error_message := l_err_message;
3852 RETURN;
3853
3854 ELSE
3855
3856 IF p_confirmed_ind IS NOT NULL THEN
3857 IF p_uoo_ids IS NOT NULL THEN
3858 p_uoo_ids := p_uoo_ids||','||l_sub_sua;
3859 ELSE
3860 p_uoo_ids := l_sub_sua;
3861 END IF;
3862 END IF;
3863 END IF;
3864
3865 END LOOP;
3866 EXCEPTION
3867 WHEN OTHERS THEN
3868
3869 IF cur_coo_id%ISOPEN THEN
3870 CLOSE cur_coo_id;
3871 END IF;
3872 IF cur_Sup%ISOPEN THEN
3873 CLOSE cur_sup;
3874 END IF;
3875 RAISE;
3876
3877 END drop_sub_units;
3878
3879 PROCEDURE validate_mus( p_person_id IN NUMBER,
3880 p_course_cd IN VARCHAR2,
3881 p_uoo_id IN NUMBER
3882 ) AS
3883
3884
3885 CURSOR c_same_section(cp_unit_cd VARCHAR2,cp_version_number NUMBER) IS
3886 SELECT same_teaching_period
3887 FROM igs_ps_unit_ver uv
3888 WHERE unit_cd = cp_unit_cd AND
3889 uv.version_number =cp_version_number;
3890
3891 CURSOR c_mus_allowed (cp_person_id NUMBER, cp_course_cd VARCHAR2, cp_unit_cd VARCHAR2,
3892 cp_cal_type VARCHAR2, cp_ci_sequence_number NUMBER, cp_uoo_id NUMBER) IS
3893 SELECT 'x'
3894 FROM igs_en_su_attempt
3895 WHERE person_id=cp_person_id AND
3896 course_cd=cp_course_cd AND
3897 unit_cd=cp_unit_cd AND
3898 cal_type=cp_cal_type AND
3899 ci_sequence_number=cp_ci_sequence_number AND
3900 unit_attempt_status NOT IN ('DROPPED','DISCONTIN') AND
3901 uoo_id<> cp_uoo_id;
3902
3903 CURSOR c_usec_exclude_mus_flag (cp_uoo_id NUMBER) IS
3904 SELECT unit_cd,version_number,cal_type,ci_sequence_number,not_multiple_section_flag
3905 FROM igs_ps_unit_ofr_opt
3906 WHERE uoo_id=cp_uoo_id;
3907
3908 CURSOR c_mus_participate (cp_not_multiple_section_flag igs_ps_unit_ofr_opt.not_multiple_section_flag%TYPE,
3909 cp_person_id NUMBER, cp_course_cd VARCHAR2, cp_unit_cd VARCHAR2,
3910 cp_cal_type VARCHAR2, cp_ci_sequence_number NUMBER, cp_uoo_id NUMBER) IS
3911 SELECT 'x'
3912 FROM igs_en_su_attempt sua,
3913 igs_ps_unit_ofr_opt opt
3914 WHERE sua.person_id=cp_person_id AND
3915 sua.course_cd=cp_course_cd AND
3916 sua.unit_cd=cp_unit_cd AND
3917 sua.cal_type=cp_cal_type AND
3918 sua.ci_sequence_number = cp_ci_sequence_number AND
3919 unit_attempt_status NOT IN ('DROPPED','DISCONTIN') AND
3920 sua.uoo_id<> cp_uoo_id AND
3921 sua.uoo_id=opt.uoo_id AND
3922 opt.not_multiple_section_flag=cp_not_multiple_section_flag;
3923
3924 l_unit_cd igs_en_su_attempt.unit_cd%TYPE;
3925 l_unit_ver igs_en_su_attempt.version_number%TYPE;
3926 l_cal_type igs_en_su_attempt.cal_type%TYPE;
3927 l_ci_sequence_number igs_en_su_attempt.ci_sequence_number%TYPE;
3928 l_same_teaching_period igs_ps_unit_ver.same_teaching_period%TYPE;
3929 l_usec_exclude_mus_flag igs_ps_unit_ofr_opt.not_multiple_section_flag%TYPE;
3930 l_notused VARCHAR2(1);
3931
3932
3933
3934 BEGIN
3935
3936 /*checking for multiple versions of same unit section, if exists raise an exception*/
3937 --processing for same_teaching_period at unit section level added as a part of Repeat and Reeenrollment build
3938 OPEN c_usec_exclude_mus_flag (p_uoo_id);
3939 FETCH c_usec_exclude_mus_flag INTO l_unit_cd,l_unit_ver,l_cal_type,l_ci_sequence_number,l_usec_exclude_mus_flag;
3940 CLOSE c_usec_exclude_mus_flag;
3941
3942 OPEN c_same_section (l_unit_cd, l_unit_ver);
3943 FETCH c_same_section INTO l_same_teaching_period;
3944 CLOSE c_same_section;
3945
3946 IF NVL(l_same_teaching_period,'N')='N' OR NVL(l_usec_exclude_mus_flag,'Y')='Y' THEN
3947 --unit does not allow MUS..if any other attempts exist..raise error
3948 OPEN c_mus_allowed (p_person_id,p_course_cd,l_unit_cd,l_cal_type,l_ci_sequence_number, p_uoo_id);
3949 FETCH c_mus_allowed INTO l_notused;
3950 IF c_mus_allowed%FOUND THEN
3951 CLOSE c_mus_allowed;
3952 FND_MESSAGE.SET_NAME('IGS','IGS_EN_MUS_NOT_ALLOWED');
3953 IGS_GE_MSG_STACK.ADD;
3954 APP_EXCEPTION.RAISE_EXCEPTION;
3955 END IF;
3956 CLOSE c_mus_allowed;
3957 ELSE
3958 --unit allows MUS..IF unit section allows MUS..check if any existing attempts do not allow MUS
3959 --if exits, raise error
3960 OPEN c_mus_participate ('Y',p_person_id,p_course_cd,l_unit_cd,l_cal_type,l_ci_sequence_number, p_uoo_id);
3961 FETCH c_mus_participate INTO l_notused;
3962 IF c_mus_participate%FOUND THEN
3963 CLOSE c_mus_participate;
3964 FND_MESSAGE.SET_NAME('IGS','IGS_EN_MUS_NOT_ALLOWED');
3965 IGS_GE_MSG_STACK.ADD;
3966 APP_EXCEPTION.RAISE_EXCEPTION;
3967 END IF;
3968 CLOSE c_mus_participate;
3969 END IF; -- IF NVL(l_same_teaching_period,'N')='N'
3970
3971 EXCEPTION
3972
3973 WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
3974 RAISE;
3975
3976 WHEN OTHERS THEN
3977 FND_MESSAGE.SET_NAME('IGS','IGS_GE_UNHANDLED_EXP');
3978 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_SUA.validate_mus');
3979 IGS_GE_MSG_STACK.ADD;
3980 RAISE;
3981
3982 END validate_mus;
3983
3984 END IGS_EN_VAL_SUA;