[Home] [Help]
PACKAGE BODY: APPS.IGS_PR_GEN_004
Source
1 PACKAGE BODY IGS_PR_GEN_004 AS
2 /* $Header: IGSPR25B.pls 120.5 2006/02/08 02:52:18 sepalani ship $ */
3 --------------------------------------------------------------------------------
4 --Change History:
5 --Who When What
6 --sarakshi 16-Nov-2004 Enh#4000939, added column FUTURE_DATED_TRANS_FLAG in the update row call of IGS_EN_STDNT_PS_ATT_PKG
7 --
8 --nalkumar 19-NOV-2002 Bug NO: 2658550
9 -- Modified this object as per the FA110 PR Enh.
10 --svenkata 20-NOV-2002 Modified the call to the function igs_en_val_sua.enrp_val_sua_discont to add value 'N' for the parameter
11 -- p_legacy. Bug#2661533.
12 --amuthu 01-Oct-2002 Added call to drop_all_workflow as part of Drop Transfer Build.
13 -- the calls to the drop_all workflow is done after either dropping or
14 -- discontinuing a unit attempt. created new local procedure invoke_drop_workflow Bug 2599925.
15 --mesriniv 12-sep-2002 Added a new parameter waitlist_manual_ind in TBH call of IGS_EN_SU_ATTEMPT
16 -- for Bug 2554109 MINI Waitlist Build for Jan 03 Release
17 --Nishikant 15-may-2002 Condition in an IF clause in the procedure IGS_PR_upd_out_apply modified as part of the bug#2364216.
18 -- And also the unit attempt was being deleted earlier if any student unit attempt outcome record not found for the person,
19 -- now its modified to be update the unit attempt record to DROPPED status.
20 -- pradhakr 15-Dec-2002 Changed the call to the update_row of igs_en_su_attempt table to igs_en_sua_api.update_unit_attempt.
21 -- Changes wrt ENCR031 build. Bug#2643207
22 --anilk 03-Jan-2003 Removed the message numbers and used the appropriate IGS messages, Bug# 2413841
23 --svanukur 26-jun-2003 Passing discontinued date with a nvl substitution of sysdate in the call to the update_row api of
24 -- ig_en_su_attmept in case of a "dropped" unit attempt status as part of bug 2898213.
25 --rvivekan 3-SEP-2003 Waitlist Enhacements build # 3052426. 2 new columns added to
26 -- IGS_EN_SU_ATTEMPT_PKG procedures and consequently to IGS_EN_SUA_API procedures
27 --rvangala 07-OCT-2003 Value for CORE_INDICATOR_CODE passed to IGS_EN_SUA_API.UPDATE_UNIT_ATTEMPT
28 -- added as part of Prevent Dropping Core Units. Enh Bug# 3052432
29 --------------------------------------------------------------------------------
30 --
31 -- kdande; 23-Apr-2003; Bug# 2829262
32 -- Added p_uoo_id parameter to the PROCEDURE igs_pr_ins_suao_todo
33 --
34 PROCEDURE igs_pr_ins_suao_todo(
35 p_person_id IN NUMBER,
36 p_course_cd IN VARCHAR2,
37 p_version_number IN NUMBER,
38 p_unit_cd IN VARCHAR2,
39 p_cal_type IN VARCHAR2,
40 p_ci_sequence_number IN NUMBER,
41 p_old_grading_schema_cd IN VARCHAR2,
42 p_new_grading_schema_cd IN VARCHAR ,
43 p_old_gs_version_number IN NUMBER,
44 p_new_gs_version_number IN NUMBER,
45 p_old_grade IN VARCHAR2,
46 p_new_grade IN VARCHAR2,
47 p_old_mark IN NUMBER,
48 p_new_mark IN NUMBER,
49 p_old_finalised_outcome_ind IN VARCHAR2,
50 p_new_finalised_outcome_ind IN VARCHAR2,
51 p_uoo_id IN NUMBER)
52 IS
53 gv_other_detail VARCHAR2(255);
54 BEGIN -- IGS_PR_ins_suao_todo
55 -- Insert a IGS_PE_STD_TODO entry for an amendment of grade, providing the
56 -- student has already undergone a progression check in the appropriate
57 -- period.
58 DECLARE
59 cst_progress CONSTANT VARCHAR2(10) := 'PROGRESS';
60 cst_active CONSTANT VARCHAR2(10) := 'ACTIVE';
61 cst_todo CONSTANT VARCHAR2(10) := 'TODO';
62 cst_prg_check CONSTANT VARCHAR2(10) := 'PRG_CHECK';
63 v_version_number IGS_EN_STDNT_PS_ATT.version_number%TYPE;
64 v_sequence_number NUMBER;
65 v_insert_todo BOOLEAN DEFAULT FALSE;
66 v_start_dt DATE;
67 v_cutoff_dt DATE;
68 CURSOR c_sca IS
69 SELECT sca.version_number
70 FROM IGS_EN_STDNT_PS_ATT sca
71 WHERE sca.person_id = p_person_id AND
72 sca.course_cd = p_course_cd;
73 CURSOR c_cir IS
74 SELECT cir.sup_cal_type,
75 cir.sup_ci_sequence_number
76 FROM IGS_CA_INST_REL cir,
77 IGS_CA_INST ci,
78 IGS_CA_TYPE ct,
79 IGS_CA_STAT cs
80 WHERE cir.sub_cal_type = p_cal_type AND
81 cir.sub_ci_sequence_number = p_ci_sequence_number AND
82 ci.cal_type = cir.sup_cal_type AND
83 ci.sequence_number = cir.sup_ci_sequence_number AND
84 ct.cal_type = ci.cal_type AND
85 ct.s_cal_cat = cst_progress AND
86 cs.CAL_STATUS = ci.CAL_STATUS AND
87 cs.s_CAL_STATUS = cst_active AND
88 EXISTS
89 (SELECT 'X'
90 FROM IGS_PR_STDNT_PR_CK spc
91 WHERE spc.person_id = p_person_id AND
92 spc.course_cd = p_course_cd AND
93 spc.prg_cal_type = cir.sup_cal_type AND
94 spc.prg_ci_sequence_number = cir.sup_ci_sequence_number)
95 ORDER BY ci.start_dt DESC;
96 BEGIN
97 IF NVL(p_old_grading_schema_cd, ' ') = NVL(p_new_grading_schema_cd, ' ') AND
98 NVL(p_old_gs_version_number, 0) = NVL(p_new_gs_version_number, 0) AND
99 NVL(p_old_grade, ' ') = NVL(p_new_grade, ' ') AND
100 NVL(p_old_mark, 0) = NVL(p_new_mark, 0) AND
101 NVL(p_old_finalised_outcome_ind, ' ') =
102 NVL(p_new_finalised_outcome_ind, ' ') THEN
103 -- No changes made ; no update required
104 RETURN;
105 END IF;
106 -- If version number not passed then load it from IGS_EN_STDNT_PS_ATT
107 -- record
108 IF p_version_number IS NULL THEN
109 OPEN c_sca;
110 FETCH c_sca INTO v_version_number;
111 IF c_sca%NOTFOUND THEN
112 CLOSE c_sca;
113 RETURN;
114 END IF;
115 CLOSE c_sca;
116 ELSE
117 v_version_number := p_version_number;
118 END IF;
119 -- Determine if the student has had a progression check in the related
120 -- progression periods
121 FOR v_cir_rec IN c_cir LOOP
122 IF IGS_PR_GEN_006.IGS_PR_get_within_appl (
123 v_cir_rec.sup_cal_type,
124 v_cir_rec.sup_ci_sequence_number,
125 p_course_cd,
126 v_version_number,
127 cst_todo,
128 v_start_dt,
129 v_cutoff_dt) = 'Y' THEN
130 v_insert_todo := TRUE;
131 EXIT;
132 END IF;
133 END LOOP;
134 IF v_insert_todo THEN
135 -- Insert todo entry
136 v_sequence_number := IGS_GE_GEN_003.GENP_INS_STDNT_TODO (
137 p_person_id,
138 cst_prg_check,
139 NULL,
140 'Y');
141 --
142 -- kdande; 23-Apr-2003; Bug# 2829262
143 -- Added p_uoo_id param to IGS_GE_GEN_003.GENP_INS_TODO_REF FUNCTION call
144 --
145 igs_ge_gen_003.genp_ins_todo_ref (
146 p_person_id,
147 cst_prg_check,
148 v_sequence_number,
149 p_cal_type,
150 p_ci_sequence_number,
151 p_course_cd,
152 p_unit_cd,
153 NULL,
154 p_uoo_id
155 );
156 END IF;
157 EXCEPTION
158 WHEN OTHERS THEN
159 IF c_sca%ISOPEN THEN
160 CLOSE c_sca;
161 END IF;
162 IF c_cir%ISOPEN THEN
163 CLOSE c_cir;
164 END IF;
165 RAISE;
166 END;
167 EXCEPTION
168 WHEN OTHERS THEN
169 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
170 FND_MESSAGE.SET_TOKEN('NAME','IGS_PR_GEN_004.IGS_PR_INS_SUAO_TODO');
171 IGS_GE_MSG_STACK.ADD;
172 App_Exception.Raise_Exception;
173 END igs_pr_ins_suao_todo;
174
175
176 PROCEDURE invoke_drop_workflow(p_uoo_id IN NUMBER,
177 p_unit_CD IN VARCHAR2,
178 p_teach_cal_type IN VARCHAR2,
179 p_teach_ci_sequence_number IN NUMBER,
180 p_person_id IN NUMBER,
181 p_course_cd IN VARCHAR2,
182 p_message_name IN OUT NOCOPY VARCHAR2)
183 AS
184 /*
185 || Created By :
186 || Created On :
187 || Purpose :
188 || Known limitations, enhancements or remarks :
189 || Change History :
190 || Who When What
191 || kkillams 08-10-2003 Remove the call to drop_all_workflow procedure and setting the
192 || student unit attempt package variables as part of bug#3160856
193 */
194 CURSOR c_tl IS
195 SELECT load_cal_type, load_ci_sequence_number
196 FROM IGS_CA_TEACH_TO_LOAD_V
197 WHERE teach_cal_type = p_teach_cal_type
198 AND teach_ci_sequence_number = p_teach_ci_sequence_number
199 ORDER BY LOAD_START_DT ASC;
200
201 l_load_cal_type IGS_CA_INST.CAL_TYPE%TYPE;
202 l_load_ci_sequence_number IGS_CA_INST.SEQUENCE_NUMBER%TYPE;
203 l_return_status VARCHAR2(10);
204
205 BEGIN
206
207 OPEN c_tl;
208 FETCH c_tl INTO l_load_cal_type, l_load_ci_sequence_number;
209 CLOSE c_tl;
210
211 FND_MESSAGE.SET_NAME('IGS','IGS_EN_REASON_ACA_HOLD');
212 FND_MESSAGE.SET_TOKEN('UNIT',p_unit_cd);
213 igs_ss_en_wrappers.drop_notif_variable(FND_MESSAGE.GET(),'ACADEMIC-HOLDS' );
214
215 END invoke_drop_workflow;
216
217
218
219 PROCEDURE IGS_PR_upd_out_apply(
220 p_prg_cal_type IN VARCHAR2,
221 p_prg_sequence_number IN NUMBER,
222 p_course_type IN VARCHAR2,
223 p_org_unit_cd IN VARCHAR2,
224 p_ou_start_dt IN DATE ,
225 p_course_cd IN VARCHAR2,
226 p_location_cd IN VARCHAR2,
227 p_attendance_mode IN VARCHAR2,
228 p_progression_status IN VARCHAR2,
229 p_enrolment_cat IN VARCHAR2,
230 p_group_id IN NUMBER,
231 p_spo_person_id IN NUMBER,
232 p_spo_course_cd IN VARCHAR2,
233 p_spo_sequence_number IN NUMBER,
234 p_message_text IN OUT NOCOPY VARCHAR2,
235 p_message_level IN OUT NOCOPY VARCHAR2,
236 p_log_creation_dt OUT NOCOPY DATE )
237 IS
238 gv_other_detail VARCHAR2(255);
239
240 BEGIN -- IGS_PR_upd_out_apply
241 -- Apply outcomes to a studentes enrolment via the appropriate method, being
242 -- either encumbrances or through enrolment discontinuations.
243 -- The routine will process outcomes that have been approved but have not yet
244 -- had their applied date set.
245 -- Also processed will be students who have had outcomes applied, but where
246 -- the decision status has been changed to Cancelled or Removed.
247 -- Note: this routine can be called via either the job scheduler (in which
248 -- case a batch of students is processed) or directly from forms. In the case
249 -- of the form call the p_spo_ parameters are set, indicating to process
250 -- only a single progression outcome.
251 DECLARE
252 cst_prg_outcm CONSTANT VARCHAR2(10) := 'PRG-OUTCM';
253 cst_active CONSTANT VARCHAR2(10) := 'ACTIVE';
254 cst_approved CONSTANT VARCHAR2(10) := 'APPROVED';
255 cst_batch CONSTANT VARCHAR2(10) := 'BATCH';
256 cst_cancelled CONSTANT VARCHAR2(10) := 'CANCELLED';
257 cst_current CONSTANT VARCHAR2(10) := 'CURRENT';
258 cst_discontin CONSTANT VARCHAR2(10) := 'DISCONTIN';
259 cst_enrolled CONSTANT VARCHAR2(10) := 'ENROLLED';
260 cst_error CONSTANT VARCHAR2(10) := 'ERROR';
261 cst_warn CONSTANT VARCHAR2(10) := 'WARNING';
262 cst_exclusion CONSTANT VARCHAR2(10) := 'EXCLUSION';
263 cst_AWARD CONSTANT VARCHAR2(10) := 'AWARD';
264 cst_excluded CONSTANT VARCHAR2(10) := 'EXCLUDED';
265 cst_expulsion CONSTANT VARCHAR2(10) := 'EXPULSION';
266 cst_inactive CONSTANT VARCHAR2(10) := 'INACTIVE';
267 cst_intermit CONSTANT VARCHAR2(10) := 'INTERMIT';
268 cst_lapsed CONSTANT VARCHAR2(10) := 'LAPSED';
269 cst_manual CONSTANT VARCHAR2(10) := 'MANUAL';
270 cst_nopenalty CONSTANT VARCHAR2(10) := 'NOPENALTY';
271 cst_no_cal CONSTANT VARCHAR2(10) := 'NO-CAL';
272 cst_open CONSTANT VARCHAR2(10) := 'OPEN';
273 cst_progress CONSTANT VARCHAR2(10) := 'PROGRESS';
274 cst_removed CONSTANT VARCHAR2(10) := 'REMOVED';
275 cst_sca CONSTANT VARCHAR2(10) := 'SCA';
276 cst_spo CONSTANT VARCHAR2(10) := 'SPO';
277 cst_suspension CONSTANT VARCHAR2(10) := 'SUSPENSION';
278 cst_disclift CONSTANT VARCHAR2(10) := 'DISCLIFT';
279 cst_disc_other CONSTANT VARCHAR2(10) := 'DISC-OTHER';
280 cst_encumb CONSTANT VARCHAR2(10) := 'ENCUMB';
281 cst_encumblift CONSTANT VARCHAR2(10) := 'ENCUMBLIFT';
282 cst_disc_err CONSTANT VARCHAR2(10) := 'DISC-ERR';
283 cst_udisc_err CONSTANT VARCHAR2(10) := 'UDISC-ERR';
284 cst_usdisc_err CONSTANT VARCHAR2(10) := 'USDISC-ERR';
285 cst_discl_err CONSTANT VARCHAR2(10) := 'DISCL-ERR';
286 cst_udiscontin CONSTANT VARCHAR2(10) := 'UDISCONTIN';
287 cst_encumb_err CONSTANT VARCHAR2(10) := 'ENCUMB-ERR';
288 cst_encumb_warn CONSTANT VARCHAR2(11) := 'ENCUMB-WARN';
289 cst_warning CONSTANT VARCHAR2(10) := 'WARNING';
290
291 e_record_locked EXCEPTION;
292 PRAGMA EXCEPTION_INIT(e_record_locked, -54);
293 e_application EXCEPTION;
294 PRAGMA EXCEPTION_INIT(e_application, -20000);
295
296 v_apply_start_dt_alias IGS_PR_S_PRG_CONF.apply_start_dt_alias%TYPE;
297 v_apply_end_dt_alias IGS_PR_S_PRG_CONF.apply_end_dt_alias%TYPE;
298 v_end_benefit_dt_alias IGS_PR_S_PRG_CONF.end_benefit_dt_alias%TYPE;
299 v_end_penalty_dt_alias IGS_PR_S_PRG_CONF.end_penalty_dt_alias%TYPE;
300 v_show_cause_cutoff_dt_alias IGS_PR_S_PRG_CONF.show_cause_cutoff_dt_alias%TYPE;
301 v_appeal_cutoff_dt_alias IGS_PR_S_PRG_CONF.appeal_cutoff_dt_alias%TYPE;
302 v_show_cause_ind IGS_PR_S_PRG_CONF.show_cause_ind%TYPE;
303 v_apply_before_show_ind IGS_PR_S_PRG_CONF.apply_before_show_ind%TYPE;
304 v_appeal_ind IGS_PR_S_PRG_CONF.appeal_ind%TYPE;
305 v_apply_before_appeal_ind IGS_PR_S_PRG_CONF.apply_before_appeal_ind%TYPE;
306 v_count_sus_in_time_ind IGS_PR_S_PRG_CONF.count_sus_in_time_ind%TYPE;
307 v_count_exc_in_time_ind IGS_PR_S_PRG_CONF.count_exc_in_time_ind%TYPE;
308 v_calculate_wam_ind IGS_PR_S_PRG_CONF.calculate_wam_ind%TYPE;
309 v_calculate_gpa_ind IGS_PR_S_PRG_CONF.calculate_gpa_ind%TYPE;
310 v_outcome_check_type IGS_PR_S_PRG_CONF.outcome_check_type%TYPE;
311 v_application_type VARCHAR2(10);
312 v_log_creation_dt DATE DEFAULT NULL;
313 v_key IGS_GE_s_log.KEY%TYPE;
314 v_process_next_spo BOOLEAN;
315 v_other_encumbrance BOOLEAN;
316 v_exit_procedure BOOLEAN DEFAULT FALSE;
317 v_discont_reason_cd IGS_EN_DCNT_REASONCD.discontinuation_reason_cd%TYPE;
318 v_s_discont_reason_type IGS_EN_DCNT_REASONCD.s_discontinuation_reason_type%TYPE;
319 v_expiry_status VARCHAR2(10);
320 v_expiry_dt DATE;
321 v_authorising_person_id IGS_PE_person.person_id%TYPE;
322 v_new_pra_sequence_number IGS_PR_RU_APPL.sequence_number%TYPE;
323 v_ci_sequence_number IGS_CA_INST.sequence_number%TYPE;
324 v_message_text VARCHAR2(2000);
325 v_message_level VARCHAR2(10);
326 v_message_name VARCHAR2(30);
327 v_administrative_unit_status IGS_PS_UNIT_DISC_CRT.administrative_unit_status%TYPE;
328 v_admin_unit_status_str VARCHAR2(2000);
329 v_alias_val DATE;
330 v_sua_upd_or_del BOOLEAN;
331 v_dummy VARCHAR2(1);
332 v_spa_award_cd IGS_PS_AWD.AWARD_CD%TYPE;
333
334 CURSOR c_spo IS
335 SELECT spo.person_id,
336 spo.course_cd,
337 spo.sequence_number,
338 spo.pro_pra_sequence_number,
339 spo.prg_cal_type,
340 spo.prg_ci_sequence_number,
341 spo.progression_outcome_type,
342 spo.duration,
343 spo.duration_type,
344 spo.decision_status,
345 spo.decision_dt,
346 spo.show_cause_expiry_dt,
347 spo.show_cause_dt,
348 spo.show_cause_outcome_dt,
349 spo.appeal_expiry_dt,
350 spo.appeal_dt,
351 spo.appeal_outcome_dt,
352 spo.expiry_dt,
353 spo.encmb_course_group_cd,
354 pot.s_progression_outcome_type,
355 sca.version_number,
356 sca.commencement_dt,
357 sca.course_attempt_status,
358 sca.discontinuation_reason_cd
359 FROM IGS_PR_STDNT_PR_OU spo,
360 IGS_PR_OU_TYPE pot,
361 IGS_EN_STDNT_PS_ATT sca,
362 IGS_PS_VER crv
363 WHERE (
364 p_spo_person_id IS NULL
365 AND
366 -- Decision Status is approved and applied_dt is null/'0001/01/01
367 -- or
368 -- Decision Status is removed /cancelled and applied date is not null
369 (
370 (spo.decision_status = cst_approved AND
371 (
372 spo.applied_dt IS NULL OR
373 spo.applied_dt = igs_ge_date.igsdate('0001/01/01')
374 )
375 )
376 OR
377 ( spo.decision_status IN (
378 cst_removed,
379 cst_cancelled
380 )
381 AND
382 spo.applied_dt IS NOT NULL
383 )
384 )
385 AND
386 (
387 p_course_cd IS NULL OR
388 spo.course_cd LIKE p_course_cd
389 )
390 AND
391 (
392 p_progression_status IS NULL OR
393 sca.progression_status = p_progression_status
394 )
395 AND
396 pot.progression_outcome_type = spo.progression_outcome_type
397 AND
398 sca.person_id = spo.person_id
399 AND
400 sca.course_cd = spo.course_cd
401 AND
402 crv.course_cd = sca.course_cd
403 AND
404 crv.version_number = sca.version_number
405 AND
406 -- group_id has not been specified or if specified then take out NOCOPY person_id's for that group_id
407 -- such that the person has a valid student program attempt record as given in table igs_en_stdnt_ps_att
408 (
409 p_group_id IS NULL
410 OR
411 sca.person_id IN (
412 SELECT person_id
413 FROM IGS_PE_PIGM_PIDGRP_MEM_V
414 WHERE group_id = p_group_id AND
415 person_id = sca.person_id
416 )
417 )
418 AND
419 (
420 p_prg_cal_type IS NULL
421 OR
422 (
423 spo.prg_cal_type = p_prg_cal_type
424 AND
425 spo.prg_ci_sequence_number = p_prg_sequence_number
426 )
427 )
428 AND
429 (
430 p_course_type IS NULL OR
431 crv.course_type = p_course_type
432 )
433 AND
434 (
435 p_attendance_mode IS NULL OR
436 sca.attendance_mode = p_attendance_mode
437 )
438 AND
439 (
440 p_org_unit_cd IS NULL
441 OR
442 IGS_PR_GEN_001.PRGP_get_crv_cmt
443 (
444 sca.course_cd,
445 sca.version_number,
446 p_org_unit_cd,
447 p_ou_start_dt
448 ) = 'Y'
449 )
450 AND
451 (
452 p_enrolment_cat IS NULL
453 OR
454 EXISTS
455 (
456 SELECT 'X'
457 FROM IGS_AS_SC_ATMPT_ENR scae,
458 IGS_CA_INST ci1
459 WHERE sca.person_id = scae.person_id AND
460 sca.course_cd = scae.course_cd AND
461 scae.enrolment_cat = p_enrolment_cat AND
462 ci1.cal_type = scae.cal_type AND
463 ci1.sequence_number = scae.ci_sequence_number AND
464 ci1.end_dt =
465 (
466 SELECT MAX(ci2.end_dt)
467 FROM IGS_AS_SC_ATMPT_ENR scae2,
468 IGS_CA_INST ci2
469 WHERE
470 scae2.person_id = scae.person_id AND
471 scae2.course_cd = scae.course_cd AND
472 ci2.cal_type = scae2.cal_type AND
473 ci2.sequence_number = scae2.ci_sequence_number
474 )
475 )
476 )
477 AND
478 (
479 p_location_cd IS NULL OR
480 sca.location_cd = p_location_cd
481 )
482 )
483 OR
484 (
485 p_spo_person_id IS NOT NULL
486 AND
487 spo.person_id = p_spo_person_id
488 AND
489 spo.course_cd = p_spo_course_cd
490 AND
491 spo.sequence_number = p_spo_sequence_number
492 AND
493 pot.progression_outcome_type = spo.progression_outcome_type
494 AND
495 sca.person_id = spo.person_id
496 AND
497 sca.course_cd = spo.course_cd
498 AND
499 crv.course_cd = sca.course_cd
500 AND
501 crv.version_number = sca.version_number
502 )
503 ORDER BY spo.person_id,
504 spo.course_cd,
505 DECODE (spo.decision_status, 'APPROVED', 9,
506 1),
507 spo.prg_cal_type,
508 spo.prg_ci_sequence_number;
509
510 CURSOR c_dr (
511 cp_discontinuation_reason_cd
512 IGS_EN_DCNT_REASONCD.discontinuation_reason_cd%TYPE) IS
513 SELECT s_discontinuation_reason_type
514 FROM IGS_EN_DCNT_REASONCD dr
515 WHERE dr.discontinuation_reason_cd = cp_discontinuation_reason_cd AND
516 dr.s_discontinuation_reason_type = cst_progress;
517 CURSOR c_spo_pot (
518 cp_person_id IGS_PR_STDNT_PR_OU.person_id%TYPE,
519 cp_course_cd IGS_PR_STDNT_PR_OU.course_cd%TYPE,
520 cp_sequence_number IGS_PR_STDNT_PR_OU.sequence_number%TYPE,
521 cp_spo_encmb_course_group_cd
522 IGS_PR_STDNT_PR_OU.encmb_course_group_cd%TYPE,
523 cp_sca_version_number IGS_EN_STDNT_PS_ATT.version_number%TYPE) IS
524 SELECT /*+INDEX(spo spo_pk)*/
525 spo.sequence_number,
526 spo.expiry_dt
527 FROM IGS_PR_STDNT_PR_OU spo,
528 IGS_PR_OU_TYPE pot
529 WHERE
530 (EXISTS (
531 SELECT 'X'
532 FROM IGS_PR_STDNT_PR_PS spc
533 WHERE spc.person_id = cp_person_id AND
534 spc.course_cd = cp_course_cd AND
535 spc.spo_sequence_number = cp_sequence_number AND
536 spc.course_cd = cp_course_cd
537 ) OR
538 (cp_spo_encmb_course_group_cd IS NOT NULL AND
539 EXISTS (
540 SELECT 'X'
541 FROM IGS_PS_GRP_MBR cgm
542 WHERE cgm.course_group_cd = cp_spo_encmb_course_group_cd AND
543 cgm.course_cd = cp_course_cd AND
544 cgm.version_number = cp_sca_version_number))) AND
545 spo.person_id = cp_person_id AND
546 spo.sequence_number <> cp_sequence_number AND
547 pot.progression_outcome_type = spo.progression_outcome_type AND
548 pot.s_progression_outcome_type IN (
549 cst_suspension,
550 cst_exclusion,
551 cst_expulsion) AND
552 spo.applied_dt IS NOT NULL AND
553 (EXISTS (
554 SELECT 'X'
555 FROM IGS_PR_STDNT_PR_PS spc
556 WHERE spc.person_id = spo.person_id AND
557 spc.course_cd = spo.course_cd AND
558 spc.spo_sequence_number = spo.sequence_number AND
559 spc.course_cd = cp_course_cd
560 ) OR
561 (spo.encmb_course_group_cd IS NOT NULL AND
562 EXISTS (
563 SELECT 'X'
564 FROM IGS_PS_GRP_MBR cgm
565 WHERE cgm.course_group_cd = spo.encmb_course_group_cd AND
566 cgm.course_cd = cp_course_cd AND
567 cgm.version_number = cp_sca_version_number)));
568 CURSOR c_sca1 (
569 cp_person_id IGS_EN_STDNT_PS_ATT.person_id%TYPE,
570 cp_course_cd IGS_EN_STDNT_PS_ATT.course_cd%TYPE) IS
571 SELECT sca.*,
572 sca.ROWID
573 FROM IGS_EN_STDNT_PS_ATT sca
574 WHERE sca.person_id = cp_person_id AND
575 sca.course_cd = cp_course_cd
576 FOR UPDATE NOWAIT;
577 CURSOR c_sca2 (
578 cp_spo_person_id IGS_PR_STDNT_PR_OU.person_id%TYPE,
579 cp_spo_course_cd IGS_PR_STDNT_PR_OU.course_cd%TYPE,
580 cp_spo_sequence_number IGS_PR_STDNT_PR_OU.sequence_number%TYPE,
581 cp_spo_encmb_course_group_cd
582 IGS_PR_STDNT_PR_OU.encmb_course_group_cd%TYPE) IS
583 SELECT sca.person_id,
584 sca.course_cd,
585 sca.version_number,
586 sca.course_attempt_status,
587 sca.commencement_dt
588 FROM IGS_EN_STDNT_PS_ATT sca
589 WHERE sca.person_id = cp_spo_person_id AND
590 sca.course_attempt_status IN (
591 cst_enrolled,
592 cst_inactive,
593 cst_lapsed,
594 cst_intermit) AND
595 (EXISTS (
596 SELECT 'X'
597 FROM IGS_PR_STDNT_PR_PS spc
598 WHERE spc.person_id = cp_spo_person_id AND
599 spc.spo_course_cd = cp_spo_course_cd AND
600 spc.spo_sequence_number = cp_spo_sequence_number AND
601 spc.course_cd = sca.course_cd) OR
602 (cp_spo_encmb_course_group_cd IS NOT NULL AND
603 EXISTS (
604 SELECT 'X'
605 FROM IGS_PS_GRP_MBR cgm
606 WHERE cgm.course_group_cd = cp_spo_encmb_course_group_cd AND
607 cgm.course_cd = sca.course_cd AND
608 cgm.version_number = sca.version_number)
609 ));
610 CURSOR c_susa (
611 cp_spo_person_id IGS_PR_STDNT_PR_OU.person_id%TYPE,
612 cp_spo_course_cd IGS_PR_STDNT_PR_OU.course_cd%TYPE,
613 cp_spo_sequence_number IGS_PR_STDNT_PR_OU.sequence_number%TYPE) IS
614 SELECT
615 susa.*,
616 susa.ROWID,
617 DECODE(acai.acai_ind, 'Y', 'Y', 'N') acai_ind
618 FROM
619 IGS_EN_STDNT_PS_ATT sca,
620 IGS_AS_SU_SETATMPT susa,
621 ( SELECT /*+INDEX(sca sca_pk)*/
622 sca.person_id,
623 sca.course_cd,
624 'Y' acai_ind
625 FROM IGS_EN_STDNT_PS_ATT sca,
626 IGS_AD_PS_APPL_INST acai
627 WHERE sca.person_id = acai.person_id AND
628 sca.adm_admission_appl_number = acai.admission_appl_number AND
629 sca.adm_nominated_course_cd = acai.nominated_course_cd AND
630 sca.adm_sequence_number = acai.sequence_number) acai
631 WHERE sca.person_id = cp_spo_person_id AND
632 sca.course_cd = cp_spo_course_cd AND
633 sca.person_id = susa.person_id AND
634 sca.course_cd = susa.course_cd AND
635 susa.student_confirmed_ind = 'Y' AND
636 susa.end_dt IS NULL AND
637 susa.rqrmnts_complete_ind = 'N' AND
638 EXISTS (
639 SELECT 'X'
640 FROM IGS_PR_SDT_PR_UNT_ST spus
641 WHERE spus.person_id = sca.person_id AND
642 spus.course_cd = sca.course_cd AND
643 spus.spo_sequence_number = cp_spo_sequence_number AND
644 spus.unit_set_cd = susa.unit_set_cd) AND
645 acai.person_id (+)= susa.person_id AND
646 acai.course_cd (+)= susa.course_cd ;
647 --FOR UPDATE NOWAIT; -- Commente by Prajeesh
648 CURSOR c_pra (
649 cp_spo_person_id IGS_PR_STDNT_PR_OU.person_id%TYPE,
650 cp_spo_course_cd IGS_PR_STDNT_PR_OU.course_cd%TYPE,
651 cp_spo_sequence_number IGS_PR_STDNT_PR_OU.sequence_number%TYPE) IS
652 SELECT /*+INDEX(pra1 pra_spo_fk_i)*/
653 pra1.progression_rule_cat,
654 pra1.sequence_number
655 FROM IGS_PR_RU_APPL pra1
656 WHERE pra1.spo_person_id = cp_spo_person_id AND
657 pra1.spo_course_cd = cp_spo_course_cd AND
658 pra1.spo_sequence_number = cp_spo_sequence_number AND
659 pra1.s_relation_type = cst_spo AND
660 pra1.logical_delete_dt IS NULL AND
661 NOT EXISTS (
662 SELECT 'X'
663 FROM IGS_PR_RU_APPL pra2
664 WHERE pra2.sca_person_id = cp_spo_person_id AND
665 pra2.sca_course_cd = cp_spo_course_cd AND
666 NVL(pra2.spo_person_id, 0) = cp_spo_person_id AND
667 NVL(pra2.spo_course_cd, 'NULL') = cp_spo_course_cd AND
668 NVL(pra2.spo_sequence_number,0) = cp_spo_sequence_number AND
669 pra2.s_relation_type = cst_sca AND
670 pra2.logical_delete_dt IS NULL AND
671 NVL(pra2.reference_cd, pra2.progression_rule_cd)
672 = NVL(pra1.reference_cd, pra1.progression_rule_cd));
673 CURSOR c_pra_prct (
674 cp_spo_person_id IGS_PR_STDNT_PR_OU.person_id%TYPE,
675 cp_spo_course_cd IGS_PR_STDNT_PR_OU.course_cd%TYPE,
676 cp_spo_sequence_number IGS_PR_STDNT_PR_OU.sequence_number%TYPE) IS
677 SELECT /*+INDEX(pra pra_spo_fk_i)*/
678 prct.*,
679 prct.ROWID
680 FROM IGS_PR_RU_APPL pra,
681 IGS_PR_RU_CA_TYPE prct
682 WHERE pra.progression_rule_cat = prct.progression_rule_cat AND
683 pra.sequence_number = prct.pra_sequence_number AND
684 pra.logical_delete_dt IS NULL AND
685 pra.s_relation_type = cst_sca AND
686 pra.sca_person_id = cp_spo_person_id AND
687 pra.sca_course_cd = cp_spo_course_cd AND
688 pra.spo_person_id = cp_spo_person_id AND
689 pra.spo_course_cd = cp_spo_course_cd AND
690 pra.spo_sequence_number = cp_spo_sequence_number ; -- commented by Prajeesh
691 --FOR UPDATE NOWAIT;
692 CURSOR c_ci (
693 cp_prg_cal_type IGS_CA_INST.cal_type%TYPE,
694 cp_spo_cal_type IGS_CA_INST.cal_type%TYPE,
695 cp_spo_sequence_number IGS_CA_INST.sequence_number%TYPE) IS
696 SELECT ci1.sequence_number
697 FROM IGS_CA_INST ci1,
698 IGS_CA_STAT cs
699 WHERE ci1.cal_type = cp_prg_cal_type AND
700 cs.CAL_STATUS = ci1.CAL_STATUS AND
701 cs.s_CAL_STATUS = cst_active AND
702 ci1.start_dt >
703 (SELECT ci2.start_dt
704 FROM IGS_CA_INST ci2
705 WHERE ci2.cal_type = cp_spo_cal_type AND
706 ci2.sequence_number = cp_spo_sequence_number)
707 ORDER BY ci1.start_dt ASC;
708 CURSOR c_pra_upd1 (
709 cp_spo_person_id IGS_PR_STDNT_PR_OU.person_id%TYPE,
710 cp_spo_course_cd IGS_PR_STDNT_PR_OU.course_cd%TYPE,
711 cp_spo_sequence_number IGS_PR_STDNT_PR_OU.sequence_number%TYPE) IS
712 SELECT pra.*,
713 pra.ROWID
714 FROM IGS_PR_RU_APPL pra
715 WHERE pra.spo_person_id = cp_spo_person_id AND
716 pra.spo_course_cd = cp_spo_course_cd AND
717 pra.spo_sequence_number = cp_spo_sequence_number AND
718 pra.sca_person_id = cp_spo_person_id AND
719 pra.sca_course_cd = cp_spo_course_cd AND
720 pra.logical_delete_dt IS NULL AND
721 pra.s_relation_type = cst_sca ;
722 --FOR UPDATE NOWAIT; -- commented by Prajeesh
723 CURSOR c_pra_upd2 (
724 cp_spo_person_id IGS_PR_STDNT_PR_OU.person_id%TYPE,
725 cp_spo_course_cd IGS_PR_STDNT_PR_OU.course_cd%TYPE,
726 cp_spo_sequence_number IGS_PR_STDNT_PR_OU.sequence_number%TYPE) IS
727 SELECT pra1.*,
728 pra1.ROWID
729 FROM IGS_PR_RU_APPL pra1
730 WHERE pra1.sca_person_id = cp_spo_person_id AND
731 pra1.sca_course_cd = cp_spo_course_cd AND
732 NVL(pra1.spo_person_id, 0) = cp_spo_person_id AND
733 NVL(pra1.spo_course_cd, 'NULL') = cp_spo_course_cd AND
734 NVL(pra1.spo_sequence_number,0) = cp_spo_sequence_number AND
735 pra1.s_relation_type = cst_sca AND
736 pra1.logical_delete_dt IS NULL AND
737 NOT EXISTS (
738 SELECT 'X'
739 FROM IGS_PR_RU_APPL pra2
740 WHERE pra2.spo_person_id = cp_spo_person_id AND
741 pra2.spo_course_cd = cp_spo_course_cd AND
742 pra2.spo_sequence_number = cp_spo_sequence_number AND
743 pra2.s_relation_type = cst_spo AND
744 pra2.progression_rule_cat = pra1.progression_rule_cat AND
745 NVL(pra2.progression_rule_cd, nvl(pra2.reference_cd, 'X')) = NVL(pra1.progression_rule_cd, NVL(pra1.reference_cd, 'X')) AND
746 pra2.logical_delete_dt IS NULL) ;
747 --FOR UPDATE NOWAIT; -- commented by Prajeesh
748
749 CURSOR c_spa(
750 cp_person_id igs_pr_stdnt_pr_awd.person_id%TYPE,
751 cp_course_cd igs_pr_stdnt_pr_awd.course_cd%TYPE,
752 cp_spo_sequence_number igs_pr_stdnt_pr_awd.spo_sequence_number%TYPE) IS
753 SELECT spa.award_cd
754 FROM igs_pr_stdnt_pr_awd spa
755 WHERE person_id = cp_person_id
756 AND course_cd = cp_course_cd
757 AND spa.spo_sequence_number = cp_spo_sequence_number;
758
759 CURSOR c_sua (
760 cp_spo_person_id IGS_PR_STDNT_PR_OU.person_id%TYPE,
761 cp_spo_course_cd IGS_PR_STDNT_PR_OU.course_cd%TYPE,
762 cp_spo_sequence_number IGS_PR_STDNT_PR_OU.sequence_number%TYPE) IS
763 SELECT
764 sua.*, sua.ROWID
765 FROM IGS_EN_SU_ATTEMPT sua
766 WHERE sua.person_id = cp_spo_person_id AND
767 sua.course_cd = cp_spo_course_cd AND
768 sua.unit_attempt_status = cst_enrolled AND
769 sua.unit_cd IN
770 (SELECT spu.unit_cd
771 FROM IGS_PR_STDNT_PR_UNIT spu
772 WHERE spu.person_id = cp_spo_person_id AND
773 spu.course_cd = cp_spo_course_cd AND
774 spu.spo_sequence_number = cp_spo_sequence_number AND
775 spu.s_unit_type = cst_excluded);
776 --FOR UPDATE NOWAIT; -- commented by Prajeesh
777 --
778 -- kdande; 22-Apr-2003; Bug# 2829262
779 -- Added uoo_id field to the WHERE clause of cursor c_suao
780 --
781 CURSOR c_suao (
782 cp_spo_person_id IGS_PR_STDNT_PR_OU.person_id%TYPE,
783 cp_spo_course_cd IGS_PR_STDNT_PR_OU.course_cd%TYPE,
784 cp_sua_unit_cd IGS_EN_SU_ATTEMPT.unit_cd%TYPE,
785 cp_sua_cal_type IGS_EN_SU_ATTEMPT.cal_type%TYPE,
786 cp_sua_ci_seq_number IGS_EN_SU_ATTEMPT.ci_sequence_number%TYPE,
787 cp_sua_uoo_id IGS_EN_SU_ATTEMPT.uoo_id%TYPE) IS
788 SELECT 'X'
789 FROM IGS_AS_SU_STMPTOUT suao
790 WHERE suao.person_id = cp_spo_person_id AND
791 suao.course_cd = cp_spo_course_cd AND
792 suao.uoo_id = cp_sua_uoo_id;
793
794 PROCEDURE prgpl_ins_log_entry (
795 p_log_creation_dt IGS_GE_s_log.creation_dt%TYPE,
796 p_record_type VARCHAR2,
797 p_person_id IGS_EN_STDNT_PS_ATT.person_id%TYPE,
798 p_course_cd IGS_EN_STDNT_PS_ATT.course_cd%TYPE,
799 p_prg_cal_type IGS_CA_INST.cal_type%TYPE,
800 p_prg_sequence_number IGS_CA_INST.sequence_number%TYPE,
801 p_spo_sequence_number IGS_PR_STDNT_PR_OU.sequence_number%TYPE,
802 p_progression_outcome_type IGS_PR_STDNT_PR_OU.progression_outcome_type%TYPE,
803 p_duration_type IGS_PR_STDNT_PR_OU.duration_type%TYPE,
804 p_duration IGS_PR_STDNT_PR_OU.duration%TYPE,
805 p_ci_cal_type IGS_CA_INST.cal_type%TYPE,
806 p_message_name VARCHAR2,
807 p_text IGS_GE_s_log_entry.text%TYPE
808 ) IS
809 --rvangala 07-OCT-2003 Value for CORE_INDICATOR_CODE passed to IGS_EN_SUA_API.UPDATE_UNIT_ATTEMPT
810 --added as part of Prevent Dropping Core Units. Enh Bug# 3052432
811 BEGIN -- prgpl_ins_log_entry
812 -- create a log entry
813 DECLARE
814 v_key IGS_GE_s_log.KEY%TYPE;
815 v_text IGS_GE_s_log_entry.text%TYPE DEFAULT NULL;
816 BEGIN
817 v_key :=
818 p_record_type || '|' ||
819 TO_CHAR(p_person_id) || '|' ||
820 p_course_cd || '|' ||
821 p_prg_cal_type || '|' ||
822 TO_CHAR(p_prg_sequence_number);
823 IF p_record_type = cst_discontin THEN
824 v_text :=
825 TO_CHAR(p_spo_sequence_number)||'|'||
826 p_progression_outcome_type;
827 ELSIF p_record_type = cst_udiscontin THEN
828 v_text :=
829 TO_CHAR(p_spo_sequence_number) || '|' ||
830 p_progression_outcome_type || '|' ||
831 p_duration_type || '|' ||
832 TO_CHAR(p_duration);
833 ELSIF p_record_type = cst_disclift THEN
834 v_text :=
835 TO_CHAR(p_spo_sequence_number) || '|' ||
836 p_progression_outcome_type;
837 ELSIF p_record_type = cst_disc_other THEN
838 v_text :=
839 TO_CHAR(p_spo_sequence_number) || '|' ||
840 p_progression_outcome_type;
841 ELSIF p_record_type = cst_encumb THEN
842 v_text :=
843 TO_CHAR(p_spo_sequence_number) || '|' ||
844 p_progression_outcome_type || '|' ||
845 p_duration_type || '|' ||
846 TO_CHAR(p_duration);
847 ELSIF p_record_type = cst_encumblift THEN
848 v_text :=
849 TO_CHAR(p_spo_sequence_number) || '|' ||
850 p_progression_outcome_type || '|' ||
851 p_duration_type || '|' ||
852 TO_CHAR(p_duration);
853 ELSIF p_record_type = cst_encumb_err THEN
854 v_text :=
855 TO_CHAR(p_spo_sequence_number) || '|' ||
856 p_progression_outcome_type || '|' ||
857 p_duration_type || '|' ||
858 TO_CHAR(p_duration) || '|' ||
859 p_text;
860 ELSIF p_record_type = cst_encumb_warn THEN
861 v_text :=
862 TO_CHAR(p_spo_sequence_number) || '|' ||
863 p_progression_outcome_type || '|' ||
864 p_duration_type || '|' ||
865 TO_CHAR(p_duration) || '|' ||
866 p_text;
867 ELSIF p_record_type = cst_disc_err THEN
868 v_text :=
869 TO_CHAR(p_spo_sequence_number) || '|' ||
870 p_progression_outcome_type;
871 ELSIF p_record_type = cst_discl_err THEN
872 v_text :=
873 TO_CHAR(p_spo_sequence_number) || '|' ||
874 p_progression_outcome_type || '|||' ||
875 p_text;
876 ELSIF p_record_type = cst_udisc_err THEN
877 v_text :=
878 TO_CHAR(p_spo_sequence_number) || '|' ||
879 p_progression_outcome_type || '|' ||
880 p_duration_type || '|' ||
881 TO_CHAR(p_duration);
882 ELSIF p_record_type = cst_usdisc_err THEN
883 v_text :=
884 TO_CHAR(p_spo_sequence_number) || '|' ||
885 p_progression_outcome_type;
886
887 ELSIF p_record_type = cst_award THEN
888 v_text :=
889 TO_CHAR(p_spo_sequence_number) || '|' ||
890 p_progression_outcome_type;
891
892 ELSIF p_record_type = cst_manual THEN
893 v_text :=
894 TO_CHAR(p_spo_sequence_number) || '|' ||
895 p_progression_outcome_type;
896 ELSIF p_record_type = cst_nopenalty THEN
897 v_text :=
898 TO_CHAR(p_spo_sequence_number) || '|' ||
899 p_progression_outcome_type;
900 ELSIF p_record_type = cst_no_cal THEN
901 v_text :=
902 TO_CHAR(p_spo_sequence_number) || '|' ||
903 p_progression_outcome_type || '|||' ||
904 p_text;
905 END IF;
906 IGS_GE_GEN_003.GENP_INS_LOG_ENTRY (
907 cst_prg_outcm,
908 p_log_creation_dt,
909 v_key,
910 p_message_name,
911 v_text);
912 END;
913 EXCEPTION
914 WHEN OTHERS THEN
915 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
916 FND_MESSAGE.SET_TOKEN('NAME','IGS_PR_GEN_004.IGS_PR_UPD_OUT_APPLY.PRGPL_INS_LOG_ENTRY');
917 IGS_GE_MSG_STACK.ADD;
918 App_Exception.Raise_Exception;
919 END prgpl_ins_log_entry;
920
921 FUNCTION prgpl_upd_spo (
922 p_person_id IGS_PR_STDNT_PR_OU.person_id%TYPE,
923 p_course_cd IGS_PR_STDNT_PR_OU.course_cd%TYPE,
924 p_sequence_number IGS_PR_STDNT_PR_OU.sequence_number%TYPE,
925 p_show_cause_ind IGS_PR_S_PRG_CONF.show_cause_ind%TYPE,
926 p_apply_before_show_ind IGS_PR_S_PRG_CONF.apply_before_show_ind%TYPE,
927 p_appeal_ind IGS_PR_S_PRG_CONF.appeal_ind%TYPE,
928 p_apply_before_appeal_ind IGS_PR_S_PRG_CONF.apply_before_appeal_ind%TYPE)
929 RETURN BOOLEAN
930 IS
931 --rvangala 07-OCT-2003 Value for CORE_INDICATOR_CODE passed to IGS_EN_SUA_API.UPDATE_UNIT_ATTEMPT
932 -- added as part of Prevent Dropping Core Units. Enh Bug# 3052432
933 BEGIN -- prgpl_upd_spo
934 DECLARE
935 CURSOR c_spo IS
936 SELECT sca.course_cd sca_course_cd,
937 sca.version_number,
938 spo.*,
939 spo.ROWID
940 FROM IGS_PR_STDNT_PR_OU spo,
941 IGS_EN_STDNT_PS_ATT sca
942 WHERE spo.person_id = p_person_id AND
943 spo.course_cd = p_course_cd AND
944 spo.sequence_number = p_sequence_number AND
945 spo.person_id = sca.person_id AND
946 spo.course_cd = sca.course_cd ;
947 --FOR UPDATE NOWAIT; -- commented by Prajeesh
948 v_spo_rec c_spo%ROWTYPE;
949 v_old_show_cause_expiry_dt DATE;
950 v_orig_appeal_expiry_dt IGS_PR_STDNT_PR_OU.appeal_expiry_dt%TYPE;
951 v_orig_show_cause_expiry_dt IGS_PR_STDNT_PR_OU.show_cause_expiry_dt%TYPE;
952 BEGIN
953 OPEN c_spo;
954 FETCH c_spo INTO v_spo_rec;
955 IF c_spo%FOUND THEN
956
957 v_orig_appeal_expiry_dt := v_spo_rec.appeal_expiry_dt;
958 v_orig_show_cause_expiry_dt := v_spo_rec.show_cause_expiry_dt;
959
960 IF v_spo_rec.decision_status = cst_approved THEN
961
962 IF p_show_cause_ind = 'Y' AND p_apply_before_show_ind = 'Y'
963 AND
964 v_spo_rec.show_cause_expiry_dt IS NULL AND v_spo_rec.show_cause_dt IS NULL
965 AND
966 v_spo_rec.appeal_dt IS NULL THEN
967 v_old_show_cause_expiry_dt := v_spo_rec.show_cause_expiry_dt;
968 -- IGS_PR_GEN_005.IGS_PR_clc_cause_expry calculates the show cause expiry dates for a nominated
969 -- rule within a nominated progression calendar. This routine also considers whether a show cause
970 -- is actually permitted ,if not the date is returned as null.
971 v_spo_rec.show_cause_expiry_dt := IGS_PR_GEN_005.IGS_PR_clc_cause_expry
972 ( p_course_cd,
973 v_spo_rec.version_number,
974 v_spo_rec.prg_cal_type,
975 v_spo_rec.prg_ci_sequence_number,
976 v_spo_rec.progression_rule_cat,
977 v_spo_rec.pra_sequence_number,
978 v_spo_rec.pro_sequence_number
979 );
980 -- Determines whether an appeal is permitted for a nominated outcome.
981 -- If an appeal is permitted then ensure that an appeal expiry date is not earlier than
982 -- the show cause expiry date.
983 -- Else if an appeal is not permitted then set the old show cause expiry date.
984 IF IGS_PR_GEN_005.IGS_PR_get_appeal_alwd
985 ( v_spo_rec.progression_rule_cat,
986 v_spo_rec.pra_sequence_number,
987 v_spo_rec.pro_sequence_number,
988 v_spo_rec.course_cd,
989 v_spo_rec.version_number) = 'Y' THEN
990
991 -- Don't permit the appeal expiry DATE TO be earlier than show cause.
992 IF v_spo_rec.show_cause_expiry_dt IS NOT NULL AND v_spo_rec.appeal_expiry_dt IS NOT NULL AND
993 v_spo_rec.appeal_expiry_dt < v_spo_rec.show_cause_expiry_dt THEN
994 v_spo_rec.appeal_expiry_dt := v_spo_rec.show_cause_expiry_dt;
995 END IF;
996
997 ELSIF v_spo_rec.appeal_expiry_dt IS NOT NULL THEN
998 -- This is an unrecoverable error that will only happen in the
999 -- configuration settings are toyed with after appeals are entered.
1000 v_spo_rec.show_cause_expiry_dt := v_old_show_cause_expiry_dt;
1001 END IF;
1002
1003 END IF;
1004
1005 IF p_appeal_ind = 'Y' AND p_apply_before_appeal_ind = 'Y' AND
1006 v_spo_rec.appeal_expiry_dt IS NULL AND v_spo_rec.appeal_dt IS NULL THEN
1007 v_spo_rec.appeal_expiry_dt := IGS_PR_GEN_005.IGS_PR_clc_apl_expry
1008 ( p_course_cd,
1009 v_spo_rec.version_number,
1010 v_spo_rec.prg_cal_type,
1011 v_spo_rec.prg_ci_sequence_number,
1012 v_spo_rec.progression_rule_cat,
1013 v_spo_rec.pra_sequence_number,
1014 v_spo_rec.pro_sequence_number
1015 );
1016 -- Don't permit the appeal expiry date to be earlier than show cause.
1017 IF v_spo_rec.show_cause_expiry_dt IS NOT NULL AND v_spo_rec.appeal_expiry_dt IS NOT NULL
1018 AND
1019 v_spo_rec.appeal_expiry_dt < v_spo_rec.show_cause_expiry_dt THEN
1020 v_spo_rec.appeal_expiry_dt := v_spo_rec.show_cause_expiry_dt;
1021 END IF;
1022 END IF;
1023
1024 IF v_spo_rec.expiry_dt IS NULL OR v_spo_rec.expiry_dt > TRUNC(SYSDATE) THEN
1025 -- IGS_PR_GEN_006.IGS_PR_get_spo_expiry calculates the expiry date of a student progression outcome record.
1026 -- An open-ended expiry date returns with the value 01/01/4000.An un-determinable expiry date returns NULL.
1027 v_expiry_status := IGS_PR_GEN_006.IGS_PR_get_spo_expiry
1028 ( p_person_id,
1029 p_course_cd,
1030 p_sequence_number,
1031 NULL,
1032 v_expiry_dt
1033 );
1034 /*
1035 UPDATE IGS_PR_STDNT_PR_OU
1036 SET applied_dt = SYSDATE,
1037 expiry_dt = v_expiry_dt,
1038 show_cause_expiry_dt = v_spo_rec.show_cause_expiry_dt,
1039 appeal_expiry_dt = v_spo_rec.appeal_expiry_dt
1040 WHERE CURRENT OF c_spo;
1041 */
1042 IGS_PR_STDNT_PR_OU_PKG.UPDATE_ROW(
1043 X_ROWID => v_spo_rec.ROWID,
1044 X_PERSON_ID => v_spo_rec.PERSON_ID,
1045 X_COURSE_CD => v_spo_rec.COURSE_CD,
1046 X_SEQUENCE_NUMBER => v_spo_rec.SEQUENCE_NUMBER,
1047 X_PRG_CAL_TYPE => v_spo_rec.PRG_CAL_TYPE,
1048 X_PRG_CI_SEQUENCE_NUMBER => v_spo_rec.PRG_CI_SEQUENCE_NUMBER,
1049 X_RULE_CHECK_DT => v_spo_rec.RULE_CHECK_DT,
1050 X_PROGRESSION_RULE_CAT => v_spo_rec.PROGRESSION_RULE_CAT,
1051 X_PRA_SEQUENCE_NUMBER => v_spo_rec.PRA_SEQUENCE_NUMBER,
1052 X_PRO_SEQUENCE_NUMBER => v_spo_rec.PRO_SEQUENCE_NUMBER,
1053 X_PROGRESSION_OUTCOME_TYPE => v_spo_rec.PROGRESSION_OUTCOME_TYPE,
1054 X_DURATION => v_spo_rec.DURATION,
1055 X_DURATION_TYPE => v_spo_rec.DURATION_TYPE,
1056 X_DECISION_STATUS => v_spo_rec.DECISION_STATUS,
1057 X_DECISION_DT => v_spo_rec.DECISION_DT,
1058 X_DECISION_ORG_UNIT_CD => v_spo_rec.DECISION_ORG_UNIT_CD,
1059 X_DECISION_OU_START_DT => v_spo_rec.DECISION_OU_START_DT,
1060 X_APPLIED_DT => SYSDATE,
1061 X_SHOW_CAUSE_EXPIRY_DT => v_spo_rec.SHOW_CAUSE_EXPIRY_DT,
1062 --the record variable above has been updated in the code before the update call
1063 X_SHOW_CAUSE_DT => v_spo_rec.SHOW_CAUSE_DT,
1064 X_SHOW_CAUSE_OUTCOME_DT => v_spo_rec.SHOW_CAUSE_OUTCOME_DT,
1065 X_SHOW_CAUSE_OUTCOME_TYPE => v_spo_rec.SHOW_CAUSE_OUTCOME_TYPE,
1066 X_APPEAL_EXPIRY_DT => v_spo_rec.APPEAL_EXPIRY_DT,
1067 --the record variable above has been updated in the code before the update call
1068 X_APPEAL_DT => v_spo_rec.APPEAL_DT,
1069 X_APPEAL_OUTCOME_DT => v_spo_rec.APPEAL_OUTCOME_DT,
1070 X_APPEAL_OUTCOME_TYPE => v_spo_rec.APPEAL_OUTCOME_TYPE,
1071 X_ENCMB_COURSE_GROUP_CD => v_spo_rec.ENCMB_COURSE_GROUP_CD,
1072 X_RESTRICTED_ENROLMENT_CP => v_spo_rec.RESTRICTED_ENROLMENT_CP,
1073 X_RESTRICTED_ATTENDANCE_TYPE => v_spo_rec.RESTRICTED_ATTENDANCE_TYPE,
1074 X_COMMENTS => v_spo_rec.COMMENTS,
1075 X_SHOW_CAUSE_COMMENTS => v_spo_rec.SHOW_CAUSE_COMMENTS,
1076 X_APPEAL_COMMENTS => v_spo_rec.APPEAL_COMMENTS,
1077 X_EXPIRY_DT => v_expiry_dt,
1078 X_PRO_PRA_SEQUENCE_NUMBER => v_spo_rec.PRO_PRA_SEQUENCE_NUMBER,
1079 X_MODE => 'R'
1080 );
1081
1082
1083 ELSE
1084 /* UPDATE IGS_PR_STDNT_PR_OU
1085 SET applied_dt = SYSDATE,
1086 show_cause_expiry_dt = v_spo_rec.show_cause_expiry_dt,
1087 appeal_expiry_dt = v_spo_rec.appeal_expiry_dt
1088 WHERE CURRENT OF c_spo;
1089 */
1090 IGS_PR_STDNT_PR_OU_PKG.UPDATE_ROW(
1091 X_ROWID => v_spo_rec.ROWID,
1092 X_PERSON_ID => v_spo_rec.PERSON_ID,
1093 X_COURSE_CD => v_spo_rec.COURSE_CD,
1094 X_SEQUENCE_NUMBER => v_spo_rec.SEQUENCE_NUMBER,
1095 X_PRG_CAL_TYPE => v_spo_rec.PRG_CAL_TYPE,
1096 X_PRG_CI_SEQUENCE_NUMBER => v_spo_rec.PRG_CI_SEQUENCE_NUMBER,
1097 X_RULE_CHECK_DT => v_spo_rec.RULE_CHECK_DT,
1098 X_PROGRESSION_RULE_CAT => v_spo_rec.PROGRESSION_RULE_CAT,
1099 X_PRA_SEQUENCE_NUMBER => v_spo_rec.PRA_SEQUENCE_NUMBER,
1100 X_PRO_SEQUENCE_NUMBER => v_spo_rec.PRO_SEQUENCE_NUMBER,
1101 X_PROGRESSION_OUTCOME_TYPE => v_spo_rec.PROGRESSION_OUTCOME_TYPE,
1102 X_DURATION => v_spo_rec.DURATION,
1103 X_DURATION_TYPE => v_spo_rec.DURATION_TYPE,
1104 X_DECISION_STATUS => v_spo_rec.DECISION_STATUS,
1105 X_DECISION_DT => v_spo_rec.DECISION_DT,
1106 X_DECISION_ORG_UNIT_CD => v_spo_rec.DECISION_ORG_UNIT_CD,
1107 X_DECISION_OU_START_DT => v_spo_rec.DECISION_OU_START_DT,
1108 X_APPLIED_DT => SYSDATE,
1109 X_SHOW_CAUSE_EXPIRY_DT => v_spo_rec.SHOW_CAUSE_EXPIRY_DT,
1110 --the record variable above has been updated in the code before the update call
1111 X_SHOW_CAUSE_DT => v_spo_rec.SHOW_CAUSE_DT,
1112 X_SHOW_CAUSE_OUTCOME_DT => v_spo_rec.SHOW_CAUSE_OUTCOME_DT,
1113 X_SHOW_CAUSE_OUTCOME_TYPE => v_spo_rec.SHOW_CAUSE_OUTCOME_TYPE,
1114 X_APPEAL_EXPIRY_DT => v_spo_rec.APPEAL_EXPIRY_DT,
1115 --the record variable above has been updated in the code before the update call
1116 X_APPEAL_DT => v_spo_rec.APPEAL_DT,
1117 X_APPEAL_OUTCOME_DT => v_spo_rec.APPEAL_OUTCOME_DT,
1118 X_APPEAL_OUTCOME_TYPE => v_spo_rec.APPEAL_OUTCOME_TYPE,
1119 X_ENCMB_COURSE_GROUP_CD => v_spo_rec.ENCMB_COURSE_GROUP_CD,
1120 X_RESTRICTED_ENROLMENT_CP => v_spo_rec.RESTRICTED_ENROLMENT_CP,
1121 X_RESTRICTED_ATTENDANCE_TYPE => v_spo_rec.RESTRICTED_ATTENDANCE_TYPE,
1122 X_COMMENTS => v_spo_rec.COMMENTS,
1123 X_SHOW_CAUSE_COMMENTS => v_spo_rec.SHOW_CAUSE_COMMENTS,
1124 X_APPEAL_COMMENTS => v_spo_rec.APPEAL_COMMENTS,
1125 X_EXPIRY_DT => v_spo_rec.expiry_dt,
1126 X_PRO_PRA_SEQUENCE_NUMBER => v_spo_rec.PRO_PRA_SEQUENCE_NUMBER,
1127 X_MODE => 'R'
1128 );
1129 END IF;
1130 ELSE
1131 /*
1132 UPDATE IGS_PR_STDNT_PR_OU
1133 SET applied_dt = NULL,
1134 expiry_dt = NULL
1135 WHERE CURRENT OF c_spo;
1136 */
1137 IGS_PR_STDNT_PR_OU_PKG.UPDATE_ROW(
1138 X_ROWID => v_spo_rec.ROWID,
1139 X_PERSON_ID => v_spo_rec.PERSON_ID,
1140 X_COURSE_CD => v_spo_rec.COURSE_CD,
1141 X_SEQUENCE_NUMBER => v_spo_rec.SEQUENCE_NUMBER,
1142 X_PRG_CAL_TYPE => v_spo_rec.PRG_CAL_TYPE,
1143 X_PRG_CI_SEQUENCE_NUMBER => v_spo_rec.PRG_CI_SEQUENCE_NUMBER,
1144 X_RULE_CHECK_DT => v_spo_rec.RULE_CHECK_DT,
1145 X_PROGRESSION_RULE_CAT => v_spo_rec.PROGRESSION_RULE_CAT,
1146 X_PRA_SEQUENCE_NUMBER => v_spo_rec.PRA_SEQUENCE_NUMBER,
1147 X_PRO_SEQUENCE_NUMBER => v_spo_rec.PRO_SEQUENCE_NUMBER,
1148 X_PROGRESSION_OUTCOME_TYPE => v_spo_rec.PROGRESSION_OUTCOME_TYPE,
1149 X_DURATION => v_spo_rec.DURATION,
1150 X_DURATION_TYPE => v_spo_rec.DURATION_TYPE,
1151 X_DECISION_STATUS => v_spo_rec.DECISION_STATUS,
1152 X_DECISION_DT => v_spo_rec.DECISION_DT,
1153 X_DECISION_ORG_UNIT_CD => v_spo_rec.DECISION_ORG_UNIT_CD,
1154 X_DECISION_OU_START_DT => v_spo_rec.DECISION_OU_START_DT,
1155 X_APPLIED_DT => NULL,
1156 X_SHOW_CAUSE_EXPIRY_DT => v_orig_SHOW_CAUSE_EXPIRY_DT,
1157 X_SHOW_CAUSE_DT => v_spo_rec.SHOW_CAUSE_DT,
1158 X_SHOW_CAUSE_OUTCOME_DT => v_spo_rec.SHOW_CAUSE_OUTCOME_DT,
1159 X_SHOW_CAUSE_OUTCOME_TYPE => v_spo_rec.SHOW_CAUSE_OUTCOME_TYPE,
1160 X_APPEAL_EXPIRY_DT => v_orig_APPEAL_EXPIRY_DT,
1161 X_APPEAL_DT => v_spo_rec.APPEAL_DT,
1162 X_APPEAL_OUTCOME_DT => v_spo_rec.APPEAL_OUTCOME_DT,
1163 X_APPEAL_OUTCOME_TYPE => v_spo_rec.APPEAL_OUTCOME_TYPE,
1164 X_ENCMB_COURSE_GROUP_CD => v_spo_rec.ENCMB_COURSE_GROUP_CD,
1165 X_RESTRICTED_ENROLMENT_CP => v_spo_rec.RESTRICTED_ENROLMENT_CP,
1166 X_RESTRICTED_ATTENDANCE_TYPE => v_spo_rec.RESTRICTED_ATTENDANCE_TYPE,
1167 X_COMMENTS => v_spo_rec.COMMENTS,
1168 X_SHOW_CAUSE_COMMENTS => v_spo_rec.SHOW_CAUSE_COMMENTS,
1169 X_APPEAL_COMMENTS => v_spo_rec.APPEAL_COMMENTS,
1170 X_EXPIRY_DT => NULL,
1171 X_PRO_PRA_SEQUENCE_NUMBER => v_spo_rec.PRO_PRA_SEQUENCE_NUMBER,
1172 X_MODE => 'R'
1173 );
1174 END IF;
1175 END IF;
1176 CLOSE c_spo;
1177 RETURN TRUE;
1178 EXCEPTION
1179 WHEN e_record_locked THEN
1180 IF c_spo%ISOPEN THEN
1181 CLOSE c_spo;
1182 END IF;
1183 RETURN FALSE;
1184 WHEN OTHERS THEN
1185 IF c_spo%ISOPEN THEN
1186 CLOSE c_spo;
1187 END IF;
1188 RAISE;
1189 END;
1190 EXCEPTION
1191 WHEN OTHERS THEN
1192 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
1193 FND_MESSAGE.SET_TOKEN('NAME','IGS_PR_GEN_004.IGS_PR_UPD_OUT_APPLY.PRGPL_UPD_SPO');
1194 IGS_GE_MSG_STACK.ADD;
1195 App_Exception.Raise_Exception;
1196 END prgpl_upd_spo;
1197
1198
1199 BEGIN
1200 -- Set the default out NOCOPY parameters
1201 p_message_text := NULL;
1202 p_message_level := NULL;
1203 IF p_spo_person_id IS NULL THEN
1204 v_application_type := cst_batch;
1205 -- Use the large rollback segment.
1206 -- the set transaction staement has been commented since it was carried over
1207 -- from callista and may not be relavant in the present CONTEXT
1208 -- amuthu 14-Dec-2001
1209 -- SET TRANSACTION USE ROLLBACK SEGMENT bigrbs;
1210 -- Generate a log entry
1211 v_key :=
1212 p_prg_cal_type || '|' ||
1213 TO_CHAR(p_prg_sequence_number) || '|' ||
1214 p_course_type || '|' ||
1215 p_org_unit_cd || '|' ||
1216 igs_ge_date.igschardt(p_ou_start_dt) || '|' ||
1217 p_course_cd || '|' ||
1218 p_location_cd || '|' ||
1219 p_attendance_mode || '|' ||
1220 p_progression_status || '|' ||
1221 p_enrolment_cat || '|' ||
1222 TO_CHAR(p_group_id);
1223 IGS_GE_GEN_003.GENP_INS_LOG (
1224 cst_prg_outcm,
1225 v_key,
1226 v_log_creation_dt);
1227 p_log_creation_dt := v_log_creation_dt;
1228 ELSE
1229 v_application_type := cst_manual;
1230 END IF;
1231
1232 FOR v_spo_rec IN c_spo LOOP
1233 BEGIN --Added to fix Bug# 3103892
1234 SAVEPOINT sp_before_spo_apply;
1235 v_process_next_spo := FALSE;
1236 v_message_name := NULL;
1237 -- Call routine to get configuration options for the course version
1238 IGS_PR_GEN_003.IGS_PR_get_config_parm (
1239 v_spo_rec.course_cd,
1240 v_spo_rec.version_number,
1241 v_apply_start_dt_alias,
1242 v_apply_end_dt_alias,
1243 v_end_benefit_dt_alias,
1244 v_end_penalty_dt_alias,
1245 v_show_cause_cutoff_dt_alias,
1246 v_appeal_cutoff_dt_alias,
1247 v_show_cause_ind,
1248 v_apply_before_show_ind,
1249 v_appeal_ind,
1250 v_apply_before_appeal_ind,
1251 v_count_sus_in_time_ind,
1252 v_count_exc_in_time_ind,
1253 v_calculate_wam_ind,
1254 v_calculate_gpa_ind,
1255 v_outcome_check_type);
1256 IF v_spo_rec.decision_status = cst_approved THEN
1257 -- Check for show cause period ; not applied if still within period or
1258 -- student has shown cause and no outcome entered (assuming applying after
1259 -- show cause processing).
1260 -- Functionality
1261 -- A Show cause outcome cannot be applied to records which satisfy the following conditions :-
1262 -- 1. When a show cause has not been given by a person and the show cause expiry date is set but has not expired.
1263 --
1264
1265 -- 2. If the person has given a show cause (Show cause date is set to then date when the person
1266 -- shows the cause for the progression outcome) and no decision on the show cause has been done yet
1267 -- --> denoted by the Show_cause_outcome_dt).
1268
1269 -- 3. Conditions 1 and 2 are valid only when a show cause expiry date is set and an outcome cannot be applied
1270 -- before the show cause period (denoted by apply_before_show_indicator).
1271
1272 IF v_apply_before_show_ind = 'N' AND v_spo_rec.show_cause_expiry_dt IS NOT NULL THEN
1273 IF (v_spo_rec.show_cause_dt IS NULL AND TRUNC(SYSDATE) < v_spo_rec.show_cause_expiry_dt)
1274 OR
1275 (v_spo_rec.show_cause_dt IS NOT NULL AND v_spo_rec.show_cause_outcome_dt IS NULL)
1276 THEN
1277 -- Show cause is still in effect.. do not apply the outcomes yet
1278 IF p_spo_person_id IS NOT NULL THEN
1279 FND_MESSAGE.SET_NAME ('IGS', 'IGS_PR_UNAB_APLY_OTCM_SC');
1280 p_message_text := FND_MESSAGE.GET;
1281 p_message_level := cst_warn;
1282 EXIT;
1283 END IF;
1284 v_process_next_spo := TRUE;
1285 END IF;
1286 END IF;
1287
1288 -- Check for appeal period ; not applied if still within period or appeal
1289 -- in progress (assuming applying after appeal processing).
1290 -- Functionality for appeal is the same as that for Showcause.
1291 IF NOT v_process_next_spo THEN
1292 IF v_apply_before_appeal_ind = 'N' AND v_spo_rec.appeal_expiry_dt IS NOT NULL THEN
1293 IF (v_spo_rec.appeal_dt IS NULL AND TRUNC(SYSDATE) < v_spo_rec.appeal_expiry_dt)
1294 OR
1295 (v_spo_rec.appeal_dt IS NOT NULL AND v_spo_rec.appeal_outcome_dt IS NULL) THEN
1296 -- Appeal period is still in effect.. do not apply outcomes
1297 IF p_spo_person_id IS NOT NULL THEN
1298 FND_MESSAGE.SET_NAME ('IGS', 'IGS_PR_UNAB_APLY_OTCM_AP');
1299 p_message_text := FND_MESSAGE.GET;
1300 p_message_level := cst_warn;
1301 EXIT;
1302 END IF;
1303 v_process_next_spo := TRUE;
1304 END IF;
1305 END IF;
1306 END IF;
1307
1308
1309 IF NOT v_process_next_spo THEN
1310
1311 -- check for student progression outomces resulting in awards
1312 IF v_spo_rec.s_progression_outcome_type = cst_award THEN
1313 IF NOT prgpl_upd_spo (
1314 v_spo_rec.person_id,
1315 v_spo_rec.course_cd,
1316 v_spo_rec.sequence_number,
1317 v_show_cause_ind,
1318 v_apply_before_show_ind,
1319 v_appeal_ind,
1320 v_apply_before_appeal_ind
1321 ) THEN
1322
1323 -- REcord locked
1324 ROLLBACK TO sp_before_spo_apply;
1325 IF p_spo_person_id IS NULL THEN
1326 v_process_next_spo := TRUE;
1327 ELSE
1328 p_message_level := cst_error;
1329 END IF;
1330 ELSE
1331
1332 OPEN c_spa (v_spo_rec.person_id,
1333 v_spo_rec.course_cd,
1334 v_spo_rec.sequence_number);
1335 FETCH c_spa INTO v_spa_award_cd;
1336
1337 IF c_spa%FOUND THEN
1338 DECLARE
1339 lv_rowid VARCHAR2(25);
1340 lv_org_id IGS_GR_SPECIAL_AWARD_ALL.ORG_ID%TYPE;
1341 BEGIN
1342 lv_org_id := igs_ge_gen_003.get_org_id();
1343 --Insert into special award record
1344 IGS_GR_SPECIAL_AWARD_PKG.INSERT_ROW(
1345 X_ROWID => lv_ROWID,
1346 X_PERSON_ID => v_spo_rec.PERSON_ID,
1347 X_COURSE_CD => v_spo_rec.COURSE_CD,
1348 X_AWARD_CD => v_spa_AWARD_CD,
1349 X_AWARD_DT => SYSDATE,
1350 X_CEREMONY_ANNOUNCED_IND => 'Y',
1351 X_COMMENTS => 'Created from Progression',
1352 X_MODE => 'R',
1353 X_ORG_ID => lv_org_id
1354 );
1355 END;
1356
1357 IF p_spo_person_id IS NULL THEN
1358 prgpl_ins_log_entry(
1359 v_log_creation_dt,
1360 cst_award,
1361 v_spo_rec.person_id,
1362 v_spo_rec.course_cd,
1363 v_spo_rec.prg_cal_type,
1364 v_spo_rec.prg_ci_sequence_number,
1365 v_spo_rec.sequence_number,
1366 v_spo_rec.progression_outcome_type,
1367 NULL,
1368 NULL,
1369 NULL,
1370 NULL,
1371 NULL);
1372 END IF;
1373 END IF;
1374 END IF;
1375 END IF;
1376
1377 IF v_spo_rec.s_progression_outcome_type IN (
1378 cst_manual,
1379 cst_nopenalty) THEN
1380 IF NOT prgpl_upd_spo (
1381 v_spo_rec.person_id,
1382 v_spo_rec.course_cd,
1383 v_spo_rec.sequence_number,
1384 v_show_cause_ind,
1385 v_apply_before_show_ind,
1386 v_appeal_ind,
1387 v_apply_before_appeal_ind) THEN
1388 -- Record locked
1389 ROLLBACK TO sp_before_spo_apply;
1390 IF p_spo_person_id IS NULL THEN
1391 v_process_next_spo := TRUE;
1392 ELSE
1393 FND_MESSAGE.SET_NAME ('IGS', 'IGS_PR_UNLO_DTLS_TA');
1394 p_message_text := FND_MESSAGE.GET;
1395 p_message_level := cst_error;
1396 EXIT;
1397 END IF;
1398 ELSE
1399 IF p_spo_person_id IS NULL THEN
1400 IF v_spo_rec.s_progression_outcome_type = cst_manual THEN
1401 prgpl_ins_log_entry (
1402 v_log_creation_dt,
1403 cst_manual,
1404 v_spo_rec.person_id,
1405 v_spo_rec.course_cd,
1406 v_spo_rec.prg_cal_type,
1407 v_spo_rec.prg_ci_sequence_number,
1408 v_spo_rec.sequence_number,
1409 v_spo_rec.progression_outcome_type,
1410 NULL,
1411 NULL,
1412 NULL,
1413 'IGS_PR_UPD_OUT_APPLY',
1414 NULL);
1415 ELSE
1416 prgpl_ins_log_entry (
1417 v_log_creation_dt,
1418 cst_nopenalty,
1419 v_spo_rec.person_id,
1420 v_spo_rec.course_cd,
1421 v_spo_rec.prg_cal_type,
1422 v_spo_rec.prg_ci_sequence_number,
1423 v_spo_rec.sequence_number,
1424 v_spo_rec.progression_outcome_type,
1425 NULL,
1426 NULL,
1427 NULL,
1428 'IGS_PR_UPD_NOPEN_APPLY',
1429 NULL);
1430 END IF;
1431 END IF;
1432 END IF;
1433 ELSE
1434 IF v_spo_rec.s_progression_outcome_type IN (
1435 cst_suspension,
1436 cst_exclusion,
1437 cst_expulsion) THEN
1438
1439 -- Call routine to determine the prospective expiry date
1440 v_expiry_status := IGS_PR_GEN_006.IGS_PR_get_spo_expiry (
1441 v_spo_rec.person_id,
1442 v_spo_rec.course_cd,
1443 v_spo_rec.sequence_number,
1444 v_spo_rec.expiry_dt,
1445 v_expiry_dt);
1446 IF v_expiry_dt IS NULL OR v_expiry_dt > TRUNC(SYSDATE) THEN
1447
1448 FOR v_sca_rec IN c_sca2 (
1449 v_spo_rec.person_id,
1450 v_spo_rec.course_cd,
1451 v_spo_rec.sequence_number,
1452 v_spo_rec.encmb_course_group_cd) LOOP
1453
1454 -- Get the default discontinuation reason code applicable to progression
1455
1456 v_discont_reason_cd := igs_en_gen_008.enrp_get_dflt_sdrt (cst_progress); -- Modified by Prajeesh Uncommented the code and the new code added to igs_en_gen_008
1457
1458 IF v_discont_reason_cd IS NULL THEN
1459 IF p_spo_person_id IS NULL THEN
1460 prgpl_ins_log_entry (
1461 v_log_creation_dt,
1462 cst_disc_err,
1463 v_spo_rec.person_id,
1464 v_spo_rec.course_cd,
1465 v_spo_rec.prg_cal_type,
1466 v_spo_rec.prg_ci_sequence_number,
1467 v_spo_rec.sequence_number,
1468 v_spo_rec.progression_outcome_type,
1469 NULL,
1470 NULL,
1471 NULL,
1472 'IGS_PR_DISCON_RSN_CD',
1473 NULL);
1474 v_process_next_spo := TRUE;
1475 EXIT;
1476 ELSE
1477 p_message_text := FND_MESSAGE.GET_STRING('IGS','IGS_PR_DISCON_RSN_CD');
1478 p_message_level := cst_error;
1479 v_exit_procedure := TRUE;
1480 EXIT;
1481 END IF;
1482 END IF;
1483
1484 -- Call routine to discontinue the student course attempt
1485
1486 IF NOT IGS_EN_GEN_012.ENRP_UPD_SCA_DISCONT (
1487 v_sca_rec.person_id,
1488 v_sca_rec.course_cd,
1489 v_sca_rec.version_number,
1490 v_sca_rec.course_attempt_status,
1491 v_sca_rec.commencement_dt,
1492 v_spo_rec.decision_dt,
1493 v_discont_reason_cd,
1494 v_message_name,
1495 'PROGRAM_DISCONTINUE' -- new parameter added to this procedure as part of enh bug 2599925
1496 ) THEN
1497 ROLLBACK TO sp_before_spo_apply;
1498 IF v_message_name IN (
1499 'IGS_EN_DISCONT_DT_LT_COMM_DT',
1500 'IGS_EN_UNITVERSION_INACTIVE',
1501 'IGS_EN_ONLY_SPA_ST_ENROLLED',
1502 'IGS_EN_ONLY_SPA_ST_ENROLLED',
1503 'IGS_PS_CP_MAX_DECR_ENR_CP',
1504 'IGS_EN_DISCONT_DT_GE_ENRDT',
1505 'IGS_EN_ENROL_SUA_DISCONT',
1506 'IGS_EN_DISCONT_ADM_UNIT_ST',
1507 'IGS_EN_SPA_NOTDISCONT_PRIOR',
1508 'IGS_EN_SUA_DISCONT_FUTUREDT',
1509 'IGS_EN_SUA_NOT_DISCONT',
1510 'IGS_EN_ONE_SUA_NOTBE_DISCONT',
1511 'IGS_EN_ONE_SUA_NOT_DISCONTINU') THEN
1512 v_message_name := 'IGS_EN_ONE_SUA_NOT_DISCONTINU';
1513 END IF;
1514
1515 IF p_spo_person_id IS NULL THEN
1516 IF v_message_name <> 'IGS_EN_UNABLE_UPD_STUDENR' THEN
1517 prgpl_ins_log_entry (
1518 v_log_creation_dt,
1519 cst_disc_err,
1520 v_spo_rec.person_id,
1521 v_spo_rec.course_cd,
1522 v_spo_rec.prg_cal_type,
1523 v_spo_rec.prg_ci_sequence_number,
1524 v_spo_rec.sequence_number,
1525 v_spo_rec.progression_outcome_type,
1526 NULL,
1527 NULL,
1528 NULL,
1529 v_message_name,
1530 NULL);
1531 END IF;
1532 v_process_next_spo := TRUE;
1533 EXIT;
1534 ELSE
1535 FND_MESSAGE.SET_NAME ('IGS', v_message_name);
1536 p_message_text := FND_MESSAGE.GET;
1537 p_message_level := cst_error;
1538 v_exit_procedure := TRUE;
1539 EXIT;
1540 END IF;
1541 ELSE
1542 IF p_spo_person_id IS NULL THEN
1543 prgpl_ins_log_entry (
1544 v_log_creation_dt,
1545 cst_discontin,
1546 v_spo_rec.person_id,
1547 v_spo_rec.course_cd,
1548 v_spo_rec.prg_cal_type,
1549 v_spo_rec.prg_ci_sequence_number,
1550 v_spo_rec.sequence_number,
1551 v_spo_rec.progression_outcome_type,
1552 NULL,
1553 NULL,
1554 NULL,
1555 'IGS_PR_UPD_PR_ATT_DISCON',
1556 NULL);
1557 END IF;
1558 END IF;
1559 END LOOP; -- c_sca2
1560 IF NOT v_process_next_spo AND NOT v_exit_procedure THEN
1561 BEGIN
1562
1563 FOR v_susa_rec IN c_susa (
1564 v_spo_rec.person_id,
1565 v_spo_rec.course_cd,
1566 v_spo_rec.sequence_number) LOOP
1567
1568 IF v_susa_rec.acai_ind = 'Y' THEN
1569 -- Requires authorisation ; abort.
1570 ROLLBACK TO sp_before_spo_apply;
1571 IF p_spo_person_id IS NULL THEN
1572 prgpl_ins_log_entry (
1573 v_log_creation_dt,
1574 cst_usdisc_err,
1575 v_spo_rec.person_id,
1576 v_spo_rec.course_cd,
1577 v_spo_rec.prg_cal_type,
1578 v_spo_rec.prg_ci_sequence_number,
1579 v_spo_rec.sequence_number,
1580 v_spo_rec.progression_outcome_type,
1581 NULL,
1582 NULL,
1583 NULL,
1584 'IGS_PR_UPD_END_SUA',
1585 NULL);
1586 v_process_next_spo := TRUE;
1587 EXIT;
1588 ELSE
1589 p_message_text := FND_MESSAGE.GET_STRING('IGS','IGS_PR_UPD_END_SUA');
1590 p_message_level := cst_error;
1591 v_exit_procedure := TRUE;
1592 EXIT;
1593 END IF;
1594 ELSE
1595 /*
1596 UPDATE IGS_AS_SU_SETATMPT
1597 SET end_dt = v_spo_rec.decision_dt,
1598 voluntary_end_ind = 'N'
1599 WHERE CURRENT OF c_susa;
1600
1601 */
1602
1603 IGS_AS_SU_SETATMPT_PKG.UPDATE_ROW(
1604 X_ROWID => v_susa_rec.ROWID,
1605 X_PERSON_ID => v_susa_rec.PERSON_ID,
1606 X_COURSE_CD => v_susa_rec.COURSE_CD,
1607 X_UNIT_SET_CD => v_susa_rec.UNIT_SET_CD,
1608 X_SEQUENCE_NUMBER => v_susa_rec.SEQUENCE_NUMBER,
1609 X_US_VERSION_NUMBER => v_susa_rec.US_VERSION_NUMBER,
1610 X_SELECTION_DT => v_susa_rec.SELECTION_DT,
1611 X_STUDENT_CONFIRMED_IND => v_susa_rec.STUDENT_CONFIRMED_IND,
1612 X_END_DT => v_spo_rec.decision_dt,
1613 X_PARENT_UNIT_SET_CD => v_susa_rec.PARENT_UNIT_SET_CD,
1614 X_PARENT_SEQUENCE_NUMBER => v_susa_rec.PARENT_SEQUENCE_NUMBER,
1615 X_PRIMARY_SET_IND => v_susa_rec.PRIMARY_SET_IND,
1616 X_VOLUNTARY_END_IND => 'N',
1617 X_AUTHORISED_PERSON_ID => v_susa_rec.AUTHORISED_PERSON_ID,
1618 X_AUTHORISED_ON => v_susa_rec.AUTHORISED_ON,
1619 X_OVERRIDE_TITLE => v_susa_rec.OVERRIDE_TITLE,
1620 X_RQRMNTS_COMPLETE_IND => v_susa_rec.RQRMNTS_COMPLETE_IND,
1621 X_RQRMNTS_COMPLETE_DT => v_susa_rec.RQRMNTS_COMPLETE_DT,
1622 X_S_COMPLETED_SOURCE_TYPE => v_susa_rec.S_COMPLETED_SOURCE_TYPE,
1623 X_CATALOG_CAL_TYPE => v_susa_rec.CATALOG_CAL_TYPE,
1624 X_CATALOG_SEQ_NUM => v_susa_rec.CATALOG_SEQ_NUM,
1625 X_ATTRIBUTE_CATEGORY => v_susa_rec.ATTRIBUTE_CATEGORY ,
1626 X_ATTRIBUTE1 => v_susa_rec.ATTRIBUTE1 ,
1627 X_ATTRIBUTE2 => v_susa_rec.ATTRIBUTE2 ,
1628 X_ATTRIBUTE3 => v_susa_rec.ATTRIBUTE3 ,
1629 X_ATTRIBUTE4 => v_susa_rec.ATTRIBUTE4 ,
1630 X_ATTRIBUTE5 => v_susa_rec.ATTRIBUTE5 ,
1631 X_ATTRIBUTE6 => v_susa_rec.ATTRIBUTE6 ,
1632 X_ATTRIBUTE7 => v_susa_rec.ATTRIBUTE7 ,
1633 X_ATTRIBUTE8 => v_susa_rec.ATTRIBUTE8 ,
1634 X_ATTRIBUTE9 => v_susa_rec.ATTRIBUTE9 ,
1635 X_ATTRIBUTE10=> v_susa_rec.ATTRIBUTE10,
1636 X_ATTRIBUTE11=> v_susa_rec.ATTRIBUTE11,
1637 X_ATTRIBUTE12=> v_susa_rec.ATTRIBUTE12,
1638 X_ATTRIBUTE13=> v_susa_rec.ATTRIBUTE13,
1639 X_ATTRIBUTE14=> v_susa_rec.ATTRIBUTE14,
1640 X_ATTRIBUTE15=> v_susa_rec.ATTRIBUTE15,
1641 X_ATTRIBUTE16=> v_susa_rec.ATTRIBUTE16,
1642 X_ATTRIBUTE17=> v_susa_rec.ATTRIBUTE17,
1643 X_ATTRIBUTE18=> v_susa_rec.ATTRIBUTE18,
1644 X_ATTRIBUTE19=> v_susa_rec.ATTRIBUTE19,
1645 X_ATTRIBUTE20=> v_susa_rec.ATTRIBUTE20,
1646 X_MODE => 'R'
1647 );
1648
1649 END IF;
1650 END LOOP; -- c_susa
1651 EXCEPTION
1652 WHEN e_record_locked THEN
1653 IF c_susa%ISOPEN THEN
1654 CLOSE c_susa;
1655 END IF;
1656 ROLLBACK TO sp_before_spo_apply;
1657 IF p_spo_person_id IS NOT NULL THEN
1658 FND_MESSAGE.SET_NAME ('IGS', 'IGS_PR_UNLO_SUSA_TA');
1659 p_message_text := FND_MESSAGE.GET;
1660 p_message_level := cst_error;
1661 EXIT;
1662 ELSE
1663 v_process_next_spo := TRUE;
1664 END IF;
1665 WHEN OTHERS THEN
1666 RAISE;
1667 END;
1668 END IF;
1669 IF NOT v_process_next_spo AND
1670 NOT v_exit_procedure THEN
1671 -- Discontinue unit attempts
1672 BEGIN
1673 v_sua_upd_or_del := FALSE;
1674
1675 FOR v_sua_rec IN c_sua (
1676 v_spo_rec.person_id,
1677 v_spo_rec.course_cd,
1678 v_spo_rec.sequence_number) LOOP
1679 -- Check whether delete of unit attempt is permissable
1680 -- Added the OR clause in the below If condtion OR unit_attempt status is WAITLISTED
1681 -- Added by Nishikant - bug#2364216. If the status is WAITLISTED then no need to
1682 -- check whether the unit attempt can be deleted.
1683 IF ( IGS_EN_GEN_008.ENRP_GET_UA_DEL_ALWD (
1684 v_sua_rec.cal_type,
1685 v_sua_rec.ci_sequence_number,
1686 v_spo_rec.decision_dt,
1687 v_sua_rec.uoo_id) = 'Y' OR
1688 v_sua_rec.unit_attempt_status = 'WAITLISTED') THEN
1689 --
1690 -- kdande; 22-Apr-2003; Bug# 2829262
1691 -- Passing uoo_id parameter to the cursor c_suao
1692 --
1693 OPEN c_suao (
1694 v_spo_rec.person_id,
1695 v_spo_rec.course_cd,
1696 v_sua_rec.unit_cd,
1697 v_sua_rec.cal_type,
1698 v_sua_rec.ci_sequence_number,
1699 v_sua_rec.uoo_id);
1700 FETCH c_suao INTO v_dummy;
1701 IF c_suao%FOUND THEN
1702 CLOSE c_suao;
1703 IF p_spo_person_id IS NULL THEN
1704 prgpl_ins_log_entry (
1705 v_log_creation_dt,
1706 cst_udisc_err,
1707 v_spo_rec.person_id,
1708 v_spo_rec.course_cd,
1709 v_spo_rec.prg_cal_type,
1710 v_spo_rec.prg_ci_sequence_number,
1711 v_spo_rec.sequence_number,
1712 v_spo_rec.progression_outcome_type,
1713 v_spo_rec.duration_type,
1714 v_spo_rec.duration,
1715 NULL,
1716 'IGS_PR_DISCON_UNIT',
1717 NULL);
1718 ELSE
1719 IF p_message_level IS NULL THEN
1720 p_message_text := FND_MESSAGE.GET_STRING('IGS','IGS_PR_DISCON_UNIT');
1721 p_message_level := cst_warning;
1722 END IF;
1723 END IF;
1724 ELSE
1725 CLOSE c_suao;
1726 -- Added by Nishikant - 15may2002 - bug#2364216
1727 -- Earlier it was deleting the student unit attempt record here and now its
1728 -- modified to update the record with unit attempt status as DROPPED.
1729 invoke_drop_workflow(
1730 p_uoo_id => v_sua_rec.uoo_id,
1731 p_unit_cd => v_sua_rec.unit_cd,
1732 p_teach_cal_type => v_sua_rec.cal_type,
1733 p_teach_ci_sequence_number => v_sua_rec.ci_sequence_number,
1734 p_person_id => v_sua_rec.person_id,
1735 p_course_cd => v_sua_rec.course_cd,
1736 p_message_name => v_message_name);
1737 igs_en_sua_api.update_unit_attempt (
1738 X_ROWID => v_sua_rec.rowid,
1739 X_PERSON_ID => v_sua_rec.person_id,
1740 X_COURSE_CD => v_sua_rec.course_cd,
1741 X_UNIT_CD => v_sua_rec.unit_cd,
1742 X_CAL_TYPE => v_sua_rec.cal_type,
1743 X_CI_SEQUENCE_NUMBER => v_sua_rec.ci_sequence_number,
1744 X_VERSION_NUMBER => v_sua_rec.version_number,
1745 X_LOCATION_CD => v_sua_rec.location_cd,
1746 X_UNIT_CLASS => v_sua_rec.unit_class,
1747 X_CI_START_DT => v_sua_rec.ci_start_dt,
1748 X_CI_END_DT => v_sua_rec.ci_end_dt,
1749 X_UOO_ID => v_sua_rec.uoo_id,
1750 X_ENROLLED_DT => v_sua_rec.enrolled_dt,
1751 X_UNIT_ATTEMPT_STATUS => 'DROPPED',
1752 X_ADMINISTRATIVE_UNIT_STATUS => v_sua_rec.administrative_unit_status,
1753 X_DISCONTINUED_DT => nvl(trunc(v_sua_rec.discontinued_dt), trunc(SYSDATE)),
1754 X_RULE_WAIVED_DT =>v_sua_rec.rule_waived_dt,
1755 X_RULE_WAIVED_PERSON_ID =>v_sua_rec.rule_waived_person_id,
1756 X_NO_ASSESSMENT_IND => v_sua_rec.no_assessment_ind,
1757 X_SUP_UNIT_CD => v_sua_rec.sup_unit_cd,
1758 X_SUP_VERSION_NUMBER => v_sua_rec.sup_version_number,
1759 X_EXAM_LOCATION_CD => v_sua_rec.exam_location_cd,
1760 X_ALTERNATIVE_TITLE => v_sua_rec.alternative_title,
1761 X_OVERRIDE_ENROLLED_CP => v_sua_rec.override_enrolled_cp,
1762 X_OVERRIDE_EFTSU => v_sua_rec.override_eftsu,
1763 X_OVERRIDE_ACHIEVABLE_CP => v_sua_rec.override_achievable_cp,
1764 X_OVERRIDE_OUTCOME_DUE_DT => v_sua_rec.override_outcome_due_dt,
1765 X_OVERRIDE_CREDIT_REASON => v_sua_rec.override_credit_reason,
1766 X_ADMINISTRATIVE_PRIORITY => v_sua_rec.administrative_priority,
1767 X_WAITLIST_DT => v_sua_rec.waitlist_dt,
1768 X_DCNT_REASON_CD => v_sua_rec.dcnt_reason_cd,
1769 X_MODE => 'R',
1770 X_GS_VERSION_NUMBER => v_sua_rec.gs_version_number,
1771 X_ENR_METHOD_TYPE => v_sua_rec.enr_method_type,
1772 X_FAILED_UNIT_RULE => v_sua_rec.failed_unit_rule,
1773 X_CART => v_sua_rec.cart,
1774 X_RSV_SEAT_EXT_ID => v_sua_rec.rsv_seat_ext_id,
1775 X_ORG_UNIT_CD => v_sua_rec.org_unit_cd,
1776 X_GRADING_SCHEMA_CODE => v_sua_rec.grading_schema_code,
1777 X_SESSION_ID => v_sua_rec.session_id,
1778 X_DEG_AUD_DETAIL_ID => v_sua_rec.deg_aud_detail_id,
1779 X_SUBTITLE => v_sua_rec.subtitle,
1780 X_STUDENT_CAREER_TRANSCRIPT => v_sua_rec.student_career_transcript,
1781 X_STUDENT_CAREER_STATISTICS => v_sua_rec.student_career_statistics,
1782 X_ATTRIBUTE_CATEGORY => v_sua_rec.attribute_category,
1783 X_ATTRIBUTE1 => v_sua_rec.attribute1,
1784 X_ATTRIBUTE2 => v_sua_rec.attribute2,
1785 X_ATTRIBUTE3 => v_sua_rec.attribute3,
1786 X_ATTRIBUTE4 => v_sua_rec.attribute4,
1787 X_ATTRIBUTE5 => v_sua_rec.attribute5,
1788 X_ATTRIBUTE6 => v_sua_rec.attribute6,
1789 X_ATTRIBUTE7 => v_sua_rec.attribute7,
1790 X_ATTRIBUTE8 => v_sua_rec.attribute8,
1791 X_ATTRIBUTE9 => v_sua_rec.attribute9,
1792 X_ATTRIBUTE10 => v_sua_rec.attribute10,
1793 X_ATTRIBUTE11 => v_sua_rec.attribute11,
1794 X_ATTRIBUTE12 => v_sua_rec.attribute12,
1795 X_ATTRIBUTE13 => v_sua_rec.attribute13,
1796 X_ATTRIBUTE14 => v_sua_rec.attribute14,
1797 X_ATTRIBUTE15 => v_sua_rec.attribute15,
1798 X_ATTRIBUTE16 => v_sua_rec.attribute16,
1799 X_ATTRIBUTE17 => v_sua_rec.attribute17,
1800 X_ATTRIBUTE18 => v_sua_rec.attribute18,
1801 X_ATTRIBUTE19 => v_sua_rec.attribute19,
1802 X_ATTRIBUTE20 => v_sua_rec.attribute20,
1803 X_WAITLIST_MANUAL_IND => v_sua_rec.waitlist_manual_ind, --Added by mesriniv for Bug 2554109 Mini Waitlist Build.
1804 X_WLST_PRIORITY_WEIGHT_NUM => v_sua_rec.wlst_priority_weight_num,
1805 X_WLST_PREFERENCE_WEIGHT_NUM=> v_sua_rec.wlst_preference_weight_num,
1806 -- CORE_INDICATOR_CODE added by rvangala 07-OCT-2003. Enh Bug# 3052432
1807 X_CORE_INDICATOR_CODE => v_sua_rec.core_indicator_code
1808 );
1809 v_sua_upd_or_del := TRUE;
1810 END IF;
1811 ELSE -- Discontinue ; not delete
1812 -- Get the appropriate administrative status
1813 v_administrative_unit_status :=
1814 IGS_EN_GEN_008.ENRP_GET_UDDC_AUS (
1815 v_spo_rec.decision_dt,
1816 v_sua_rec.cal_type,
1817 v_sua_rec.ci_sequence_number,
1818 v_admin_unit_status_str,
1819 v_alias_val,
1820 v_sua_rec.uoo_id);
1821 IF v_administrative_unit_status IS NULL THEN
1822 IF p_spo_person_id IS NULL THEN
1823 prgpl_ins_log_entry (
1824 v_log_creation_dt,
1825 cst_udisc_err,
1826 v_spo_rec.person_id,
1827 v_spo_rec.course_cd,
1828 v_spo_rec.prg_cal_type,
1829 v_spo_rec.prg_ci_sequence_number,
1830 v_spo_rec.sequence_number,
1831 v_spo_rec.progression_outcome_type,
1832 v_spo_rec.duration_type,
1833 v_spo_rec.duration,
1834 NULL,
1835 'IGS_PR_DISCON_UNIT',
1836 NULL);
1837 ELSE
1838 IF p_message_level IS NULL THEN
1839 p_message_text := FND_MESSAGE.GET_STRING('IGS','IGS_PR_DISCON_UNIT');
1840 p_message_level := cst_warning;
1841 END IF;
1842 END IF;
1843 ELSE
1844 -- Validate that the discontinuation is OK
1845 IF NOT IGS_EN_VAL_SUA.enrp_val_sua_discont (
1846 v_spo_rec.person_id,
1847 v_spo_rec.course_cd,
1848 v_sua_rec.unit_cd,
1849 v_sua_rec.version_number,
1850 v_sua_rec.ci_start_dt,
1851 v_sua_rec.enrolled_dt,
1852 v_administrative_unit_status,
1853 v_sua_rec.unit_attempt_status,
1854 v_spo_rec.decision_dt,
1855 v_message_name,
1856 'N') THEN
1857 IF p_spo_person_id IS NULL THEN
1858 prgpl_ins_log_entry (
1859 v_log_creation_dt,
1860 cst_udisc_err,
1861 v_spo_rec.person_id,
1862 v_spo_rec.course_cd,
1863 v_spo_rec.prg_cal_type,
1864 v_spo_rec.prg_ci_sequence_number,
1865 v_spo_rec.sequence_number,
1866 v_spo_rec.progression_outcome_type,
1867 v_spo_rec.duration_type,
1868 v_spo_rec.duration,
1869 NULL,
1870 'IGS_PR_DISCON_UNIT',
1871 NULL);
1872 ELSE
1873 IF p_message_level IS NULL THEN
1874 p_message_text := FND_MESSAGE.GET_STRING('IGS','IGS_PR_DISCON_UNIT');
1875 p_message_level := cst_warning;
1876 END IF;
1877 END IF;
1878
1879 ELSE
1880
1881 -- Discontinue unit attempt
1882 /*
1883 UPDATE IGS_EN_SU_ATTEMPT
1884 SET discontinued_dt = v_spo_rec.decision_dt,
1885 administrative_unit_status = v_administrative_unit_status
1886 WHERE CURRENT OF c_sua;
1887 */
1888 invoke_drop_workflow(
1889 p_uoo_id => v_sua_rec.uoo_id,
1890 p_unit_cd => v_sua_rec.unit_cd,
1891 p_teach_cal_type => v_sua_rec.cal_type,
1892 p_teach_ci_sequence_number => v_sua_rec.ci_sequence_number,
1893 p_person_id => v_sua_rec.person_id,
1894 p_course_cd => v_sua_rec.course_cd,
1895 p_message_name => v_message_name );
1896 igs_en_sua_api.update_unit_attempt(
1897 X_ROWID => v_sua_rec.ROWID,
1898 X_PERSON_ID => v_sua_rec.PERSON_ID,
1899 X_COURSE_CD => v_sua_rec.COURSE_CD,
1900 X_UNIT_CD => v_sua_rec.UNIT_CD,
1901 X_CAL_TYPE => v_sua_rec.CAL_TYPE,
1902 X_CI_SEQUENCE_NUMBER => v_sua_rec.CI_SEQUENCE_NUMBER,
1903 X_VERSION_NUMBER => v_sua_rec.VERSION_NUMBER,
1904 X_LOCATION_CD => v_sua_rec.LOCATION_CD,
1905 X_UNIT_CLASS => v_sua_rec.UNIT_CLASS,
1906 X_CI_START_DT => v_sua_rec.CI_START_DT,
1907 X_CI_END_DT => v_sua_rec.CI_END_DT,
1908 X_UOO_ID => v_sua_rec.UOO_ID,
1909 X_ENROLLED_DT => v_sua_rec.ENROLLED_DT,
1910 X_UNIT_ATTEMPT_STATUS => v_sua_rec.UNIT_ATTEMPT_STATUS,
1911 X_ADMINISTRATIVE_UNIT_STATUS => v_administrative_unit_status,
1912 X_DISCONTINUED_DT => v_spo_rec.decision_dt,
1913 X_RULE_WAIVED_DT => v_sua_rec.RULE_WAIVED_DT,
1914 X_RULE_WAIVED_PERSON_ID => v_sua_rec.RULE_WAIVED_PERSON_ID,
1915 X_NO_ASSESSMENT_IND => v_sua_rec.NO_ASSESSMENT_IND,
1916 X_SUP_UNIT_CD => v_sua_rec.SUP_UNIT_CD,
1917 X_SUP_VERSION_NUMBER => v_sua_rec.SUP_VERSION_NUMBER,
1918 X_EXAM_LOCATION_CD => v_sua_rec.EXAM_LOCATION_CD,
1919 X_ALTERNATIVE_TITLE => v_sua_rec.ALTERNATIVE_TITLE,
1920 X_OVERRIDE_ENROLLED_CP => v_sua_rec.OVERRIDE_ENROLLED_CP,
1921 X_OVERRIDE_EFTSU => v_sua_rec.OVERRIDE_EFTSU,
1922 X_OVERRIDE_ACHIEVABLE_CP => v_sua_rec.OVERRIDE_ACHIEVABLE_CP,
1923 X_OVERRIDE_OUTCOME_DUE_DT => v_sua_rec.OVERRIDE_OUTCOME_DUE_DT,
1924 X_OVERRIDE_CREDIT_REASON => v_sua_rec.OVERRIDE_CREDIT_REASON,
1925 X_ADMINISTRATIVE_PRIORITY => v_sua_rec.ADMINISTRATIVE_PRIORITY,
1926 X_WAITLIST_DT => v_sua_rec.WAITLIST_DT,
1927 X_DCNT_REASON_CD => v_sua_rec.DCNT_REASON_CD,
1928 X_MODE => 'R',
1929 X_GS_VERSION_NUMBER => v_sua_rec.GS_VERSION_NUMBER,
1930 X_ENR_METHOD_TYPE => v_sua_rec.ENR_METHOD_TYPE,
1931 X_FAILED_UNIT_RULE => v_sua_rec.FAILED_UNIT_RULE,
1932 X_CART => v_sua_rec.CART,
1933 X_RSV_SEAT_EXT_ID => v_sua_rec.RSV_SEAT_EXT_ID,
1934 X_ORG_UNIT_CD => v_sua_rec.ORG_UNIT_CD,
1935 -- session_id added by Nishikant 28JAN2002 - Enh Bug#2172380.
1936 X_SESSION_ID => v_sua_rec.SESSION_ID,
1937 X_GRADING_SCHEMA_CODE => v_sua_rec.GRADING_SCHEMA_CODE,
1938 X_SUBTITLE => v_sua_rec.SUBTITLE,
1939 X_DEG_AUD_DETAIL_ID => v_sua_rec.DEG_AUD_DETAIL_ID,
1940 X_STUDENT_CAREER_TRANSCRIPT => v_sua_rec.STUDENT_CAREER_TRANSCRIPT,
1941 X_STUDENT_CAREER_STATISTICS => v_sua_rec.STUDENT_CAREER_STATISTICS ,
1942 X_ATTRIBUTE_CATEGORY => v_sua_rec.ATTRIBUTE_CATEGORY,
1943 X_ATTRIBUTE1 => v_sua_rec.ATTRIBUTE1,
1944 X_ATTRIBUTE2 => v_sua_rec.ATTRIBUTE2,
1945 X_ATTRIBUTE3 => v_sua_rec.ATTRIBUTE3,
1946 X_ATTRIBUTE4 => v_sua_rec.ATTRIBUTE4,
1947 X_ATTRIBUTE5 => v_sua_rec.ATTRIBUTE5,
1948 X_ATTRIBUTE6 => v_sua_rec.ATTRIBUTE6,
1949 X_ATTRIBUTE7 => v_sua_rec.ATTRIBUTE7,
1950 X_ATTRIBUTE8 => v_sua_rec.ATTRIBUTE8,
1951 X_ATTRIBUTE9 => v_sua_rec.ATTRIBUTE9,
1952 X_ATTRIBUTE10 => v_sua_rec.ATTRIBUTE10,
1953 X_ATTRIBUTE11 => v_sua_rec.ATTRIBUTE11,
1954 X_ATTRIBUTE12 => v_sua_rec.ATTRIBUTE12,
1955 X_ATTRIBUTE13 => v_sua_rec.ATTRIBUTE13,
1956 X_ATTRIBUTE14 => v_sua_rec.ATTRIBUTE14,
1957 X_ATTRIBUTE15 => v_sua_rec.ATTRIBUTE15,
1958 X_ATTRIBUTE16 => v_sua_rec.ATTRIBUTE16,
1959 X_ATTRIBUTE17 => v_sua_rec.ATTRIBUTE17,
1960 X_ATTRIBUTE18 => v_sua_rec.ATTRIBUTE18,
1961 X_ATTRIBUTE19 => v_sua_rec.ATTRIBUTE19,
1962 X_ATTRIBUTE20 => v_sua_rec.ATTRIBUTE20,
1963 X_WAITLIST_MANUAL_IND => v_sua_rec.waitlist_manual_ind ,--Added by mesriniv for Bug 2554109 Mini Waitlist Build.
1964 X_WLST_PRIORITY_WEIGHT_NUM => v_sua_rec.wlst_priority_weight_num,
1965 X_WLST_PREFERENCE_WEIGHT_NUM => v_sua_rec.wlst_preference_weight_num,
1966 -- CORE_INDICATOR_CODE added by rvangala 07-OCT-2003. Enh Bug# 3052432
1967 X_CORE_INDICATOR_CODE => v_sua_rec.core_indicator_code
1968 );
1969 v_sua_upd_or_del := TRUE;
1970
1971
1972
1973
1974 END IF;
1975 END IF;
1976 END IF;
1977 END LOOP; -- c_sua
1978
1979
1980 IF v_sua_upd_or_del AND
1981 p_spo_person_id IS NULL THEN
1982 prgpl_ins_log_entry (
1983 v_log_creation_dt,
1984 cst_udiscontin,
1985 v_spo_rec.person_id,
1986 v_spo_rec.course_cd,
1987 v_spo_rec.prg_cal_type,
1988 v_spo_rec.prg_ci_sequence_number,
1989 v_spo_rec.sequence_number,
1990 v_spo_rec.progression_outcome_type,
1991 v_spo_rec.duration_type,
1992 v_spo_rec.duration,
1993 NULL,
1994 'IGS_PR_ENR_DISCON',
1995 NULL);
1996 END IF;
1997 EXCEPTION
1998 WHEN e_record_locked THEN
1999 IF c_sua%ISOPEN THEN
2000 CLOSE c_sua;
2001 END IF;
2002 ROLLBACK TO sp_before_spo_apply;
2003 IF p_spo_person_id IS NOT NULL THEN
2004 FND_MESSAGE.SET_NAME ('IGS', 'IGS_PR_UNLO_UA_TA');
2005 p_message_text := FND_MESSAGE.GET;
2006 p_message_level := cst_error;
2007 EXIT;
2008 ELSE
2009 v_process_next_spo := TRUE;
2010 END IF;
2011 WHEN OTHERS THEN
2012 RAISE;
2013 END;
2014 END IF;
2015 END IF;
2016 END IF;
2017
2018 IF NOT v_process_next_spo AND NOT v_exit_procedure THEN
2019
2020 -- Call routine to add the encumbrances to the students enrolment
2021 IF NOT IGS_PR_GEN_006.IGS_PR_upd_spo_pen (
2022 v_spo_rec.person_id,
2023 v_spo_rec.course_cd,
2024 v_spo_rec.sequence_number,
2025 v_authorising_person_id,
2026 v_application_type,
2027 v_message_text,
2028 v_message_level) THEN
2029 ROLLBACK TO sp_before_spo_apply;
2030
2031 IF p_spo_person_id IS NULL THEN
2032 prgpl_ins_log_entry (
2033 v_log_creation_dt,
2034 cst_encumb_err,
2035 v_spo_rec.person_id,
2036 v_spo_rec.course_cd,
2037 v_spo_rec.prg_cal_type,
2038 v_spo_rec.prg_ci_sequence_number,
2039 v_spo_rec.sequence_number,
2040 v_spo_rec.progression_outcome_type,
2041 v_spo_rec.duration_type,
2042 v_spo_rec.duration,
2043 NULL,
2044 'IGS_PR_ERR_LIFT_ENCMB',
2045 v_message_text);
2046 v_process_next_spo := TRUE;
2047
2048 ELSE
2049
2050 p_message_text := v_message_text;
2051 p_message_level := v_message_level;
2052 EXIT;
2053 END IF;
2054 ELSE
2055
2056 IF v_message_level IS NOT NULL THEN
2057 IF p_spo_person_id IS NULL THEN
2058 prgpl_ins_log_entry (
2059 v_log_creation_dt,
2060 cst_encumb_warn,
2061 v_spo_rec.person_id,
2062 v_spo_rec.course_cd,
2063 v_spo_rec.prg_cal_type,
2064 v_spo_rec.prg_ci_sequence_number,
2065 v_spo_rec.sequence_number,
2066 v_spo_rec.progression_outcome_type,
2067 v_spo_rec.duration_type,
2068 v_spo_rec.duration,
2069 NULL,
2070 'IGS_PR_WARN_LIFT_ENCMB',
2071 v_message_text);
2072 ELSE
2073 p_message_text := v_message_text;
2074 p_message_level := v_message_level;
2075 END IF;
2076 END IF;
2077
2078 IF p_spo_person_id IS NULL THEN
2079 prgpl_ins_log_entry (
2080 v_log_creation_dt,
2081 cst_encumb,
2082 v_spo_rec.person_id,
2083 v_spo_rec.course_cd,
2084 v_spo_rec.prg_cal_type,
2085 v_spo_rec.prg_ci_sequence_number,
2086 v_spo_rec.sequence_number,
2087 v_spo_rec.progression_outcome_type,
2088 v_spo_rec.duration_type,
2089 v_spo_rec.duration,
2090 NULL,
2091 'IGS_PR_ACAD_ENCMB_ADDED',
2092 NULL);
2093 END IF;
2094
2095 IF NOT prgpl_upd_spo (
2096 v_spo_rec.person_id,
2097 v_spo_rec.course_cd,
2098 v_spo_rec.sequence_number,
2099 v_show_cause_ind,
2100 v_apply_before_show_ind,
2101 v_appeal_ind,
2102 v_apply_before_appeal_ind) THEN
2103
2104 -- Record locked
2105 ROLLBACK TO sp_before_spo_apply;
2106 IF p_spo_person_id IS NULL THEN
2107 v_process_next_spo := TRUE;
2108 ELSE
2109 FND_MESSAGE.SET_NAME ('IGS', 'IGS_PR_UNLO_DTLS_TA');
2110 p_message_text := FND_MESSAGE.GET;
2111 p_message_level := cst_error;
2112 EXIT;
2113 END IF;
2114 END IF;
2115
2116 END IF;
2117
2118 END IF;
2119
2120 IF NOT v_process_next_spo AND
2121 NOT v_exit_procedure THEN
2122 -- Process rules resulting from the outcome. This logic takes
2123 -- IGS_PR_RU_APPL details (at the SPO level) and creates
2124 -- SCA applications of these rules.
2125 FOR v_pra_rec IN c_pra (
2126 v_spo_rec.person_id,
2127 v_spo_rec.course_cd,
2128 v_spo_rec.sequence_number) LOOP
2129 -- Transfer detail to the sca level
2130 v_new_pra_sequence_number :=
2131 IGS_PR_GEN_006.IGS_PR_ins_copy_pra (
2132 v_pra_rec.progression_rule_cat,
2133 v_pra_rec.sequence_number,
2134 NULL,
2135 NULL,
2136 NULL,
2137 NULL,
2138 v_spo_rec.person_id,
2139 v_spo_rec.course_cd,
2140 v_spo_rec.sequence_number,
2141 v_spo_rec.person_id,
2142 v_spo_rec.course_cd,
2143 v_message_name);
2144 -- Update the start period of records just added
2145
2146 FOR v_pra_prct_rec IN c_pra_prct (
2147 v_spo_rec.person_id,
2148 v_spo_rec.course_cd,
2149 v_spo_rec.sequence_number) LOOP
2150
2151 OPEN c_ci (
2152 v_pra_prct_rec.prg_cal_type,
2153 v_spo_rec.prg_cal_type,
2154 v_spo_rec.prg_ci_sequence_number);
2155 FETCH c_ci INTO v_ci_sequence_number;
2156 IF c_ci%NOTFOUND THEN
2157 CLOSE c_ci;
2158 ROLLBACK TO sp_before_spo_apply;
2159 IF p_spo_person_id IS NULL THEN
2160 prgpl_ins_log_entry (
2161 v_log_creation_dt,
2162 cst_no_cal,
2163 v_spo_rec.person_id,
2164 v_spo_rec.course_cd,
2165 v_spo_rec.prg_cal_type,
2166 v_spo_rec.prg_ci_sequence_number,
2167 v_spo_rec.sequence_number,
2168 v_spo_rec.progression_outcome_type,
2169 NULL,
2170 NULL,
2171 NULL,
2172 NULL,
2173 NULL);/* added because of commenting the following*/
2174 v_process_next_spo := TRUE;
2175 EXIT;
2176 ELSE
2177 FND_MESSAGE.SET_NAME ('IGS', 'IGS_PR_FUT_CAL_INST_NOT_EXST');
2178 p_message_text := FND_MESSAGE.GET;
2179 p_message_level := cst_error;
2180 v_exit_procedure := TRUE;
2181 EXIT;
2182 END IF;
2183 ELSE
2184 -- Set the start period to the next calendar instance
2185 -- to ensure it is not tested before it should be
2186 /*
2187 UPDATE IGS_PR_RU_CA_TYPE
2188 SET start_sequence_number = v_ci_sequence_number
2189 WHERE CURRENT OF c_pra_prct;
2190 CLOSE c_ci;
2191
2192 */
2193
2194 Close c_ci;
2195 IGS_PR_RU_CA_TYPE_PKG.UPDATE_ROW(
2196 X_ROWID => v_pra_prct_rec.ROWID,
2197 X_PROGRESSION_RULE_CAT => v_pra_prct_rec.PROGRESSION_RULE_CAT,
2198 X_PRA_SEQUENCE_NUMBER => v_pra_prct_rec.PRA_SEQUENCE_NUMBER,
2199 X_PRG_CAL_TYPE => v_pra_prct_rec.PRG_CAL_TYPE,
2200 X_START_SEQUENCE_NUMBER => v_ci_sequence_number,
2201 X_END_SEQUENCE_NUMBER => v_pra_prct_rec.END_SEQUENCE_NUMBER,
2202 X_START_EFFECTIVE_PERIOD => v_pra_prct_rec.START_EFFECTIVE_PERIOD,
2203 X_NUM_OF_APPLICATIONS => v_pra_prct_rec.NUM_OF_APPLICATIONS,
2204 X_MODE => 'R'
2205 );
2206
2207 END IF;
2208 END LOOP; -- c_pra_prct
2209 IF v_process_next_spo OR
2210 v_exit_procedure THEN
2211 EXIT;
2212 END IF;
2213 END LOOP; -- c_pra
2214 END IF;
2215 IF NOT v_process_next_spo AND
2216 NOT v_exit_procedure THEN
2217 BEGIN
2218
2219 FOR v_pra_upd_rec IN c_pra_upd2 (
2220 v_spo_rec.person_id,
2221 v_spo_rec.course_cd,
2222 v_spo_rec.sequence_number) LOOP
2223 /*
2224 UPDATE IGS_PR_RU_APPL
2225 SET logical_delete_dt = SYSDATE
2226 WHERE CURRENT OF c_pra_upd2;
2227 */
2228
2229
2230 IGS_PR_RU_APPL_pkg.UPDATE_ROW(
2231 X_ROWID => v_pra_upd_rec.ROWID,
2232 X_PROGRESSION_RULE_CAT => v_pra_upd_rec.PROGRESSION_RULE_CAT,
2233 X_SEQUENCE_NUMBER => v_pra_upd_rec.SEQUENCE_NUMBER,
2234 X_S_RELATION_TYPE => v_pra_upd_rec.S_RELATION_TYPE,
2235 X_PROGRESSION_RULE_CD => v_pra_upd_rec.PROGRESSION_RULE_CD,
2236 X_REFERENCE_CD => v_pra_upd_rec.REFERENCE_CD,
2237 X_RUL_SEQUENCE_NUMBER => v_pra_upd_rec.RUL_SEQUENCE_NUMBER,
2238 X_ATTENDANCE_TYPE => v_pra_upd_rec.ATTENDANCE_TYPE,
2239 X_OU_ORG_UNIT_CD => v_pra_upd_rec.OU_ORG_UNIT_CD,
2240 X_OU_START_DT => v_pra_upd_rec.OU_START_DT,
2241 X_COURSE_TYPE => v_pra_upd_rec.COURSE_TYPE,
2242 X_CRV_COURSE_CD => v_pra_upd_rec.CRV_COURSE_CD,
2243 X_CRV_VERSION_NUMBER => v_pra_upd_rec.CRV_VERSION_NUMBER,
2244 X_SCA_PERSON_ID => v_pra_upd_rec.SCA_PERSON_ID,
2245 X_SCA_COURSE_CD => v_pra_upd_rec.SCA_COURSE_CD,
2246 X_PRO_PROGRESSION_RULE_CAT => v_pra_upd_rec.PRO_PROGRESSION_RULE_CAT,
2247 X_PRO_PRA_SEQUENCE_NUMBER => v_pra_upd_rec.PRO_PRA_SEQUENCE_NUMBER,
2248 X_PRO_SEQUENCE_NUMBER => v_pra_upd_rec.PRO_SEQUENCE_NUMBER,
2249 X_SPO_PERSON_ID => v_pra_upd_rec.SPO_PERSON_ID,
2250 X_SPO_COURSE_CD => v_pra_upd_rec.SPO_COURSE_CD,
2251 X_SPO_SEQUENCE_NUMBER => v_pra_upd_rec.SPO_SEQUENCE_NUMBER,
2252 X_LOGICAL_DELETE_DT => SYSDATE,
2253 X_MESSAGE => v_pra_upd_rec.MESSAGE,
2254 X_MODE => 'R',
2255 X_MIN_CP => v_pra_upd_rec.MIN_CP,
2256 X_MAX_CP => v_pra_upd_rec.MAX_CP,
2257 X_IGS_PR_CLASS_STD_ID => v_pra_upd_rec.IGS_PR_CLASS_STD_ID
2258 );
2259
2260 END LOOP; -- c_pra_upd2
2261 EXCEPTION
2262 WHEN e_record_locked THEN
2263 IF c_pra_upd2%ISOPEN THEN
2264 CLOSE c_pra_upd2;
2265 END IF;
2266 ROLLBACK TO sp_before_spo_apply;
2267 IF p_spo_person_id IS NULL THEN
2268 v_process_next_spo := TRUE;
2269 ELSE
2270 FND_MESSAGE.SET_NAME ('IGS', 'IGS_PR_UNLO_DTLS_TA');
2271 p_message_text := FND_MESSAGE.GET;
2272 p_message_level := cst_error;
2273 EXIT;
2274 END IF;
2275 WHEN OTHERS THEN
2276 RAISE;
2277 END;
2278 END IF;
2279 END IF;
2280 END IF;
2281 ELSE -- decision status of 'REMOVED' or 'CANCELLED'
2282 -- Check that decision status is appropriate.
2283 IF p_spo_person_id IS NOT NULL AND
2284 v_spo_rec.decision_status NOT IN (
2285 cst_removed,
2286 cst_cancelled) THEN
2287 FND_MESSAGE.SET_NAME ('IGS', 'IGS_PR_OTCM_ST_NO_EFFECT');
2288 p_message_text := FND_MESSAGE.GET;
2289 p_message_level := cst_warn;
2290 EXIT;
2291 END IF;
2292 -- Logic to un-apply a previously applied outcome following the decision
2293 -- being reversed to cancelled or removed.
2294 -- Call routine to lift the encumbrances resulting from the outcome. This
2295 -- must be done prior to any discontinuation being lifted, else enrolment
2296 -- validations will prevent the re-instatement.
2297 IF NOT IGS_PR_GEN_006.IGS_PR_upd_spo_pen (
2298 v_spo_rec.person_id,
2299 v_spo_rec.course_cd,
2300 v_spo_rec.sequence_number,
2301 v_authorising_person_id,
2302 v_application_type,
2303 v_message_text,
2304 v_message_level) THEN
2305 ROLLBACK TO sp_before_spo_apply;
2306 IF p_spo_person_id IS NULL THEN
2307 prgpl_ins_log_entry (
2308 v_log_creation_dt,
2309 cst_encumb_err,
2310 v_spo_rec.person_id,
2311 v_spo_rec.course_cd,
2312 v_spo_rec.prg_cal_type,
2313 v_spo_rec.prg_ci_sequence_number,
2314 v_spo_rec.sequence_number,
2315 v_spo_rec.progression_outcome_type,
2316 v_spo_rec.duration_type,
2317 v_spo_rec.duration,
2318 NULL,
2319 'IGS_PR_ERR_LIFT_ENCMB',
2320 v_message_text);
2321 v_process_next_spo := TRUE;
2322 ELSE
2323 p_message_text := v_message_text;
2324 p_message_level := v_message_level;
2325 EXIT;
2326 END IF;
2327 ELSE
2328 IF p_spo_person_id IS NULL THEN
2329 prgpl_ins_log_entry (
2330 v_log_creation_dt,
2331 cst_encumblift,
2332 v_spo_rec.person_id,
2333 v_spo_rec.course_cd,
2334 v_spo_rec.prg_cal_type,
2335 v_spo_rec.prg_ci_sequence_number,
2336 v_spo_rec.sequence_number,
2337 v_spo_rec.progression_outcome_type,
2338 v_spo_rec.duration_type,
2339 v_spo_rec.duration,
2340 NULL,
2341 'IGS_PR_ACAD_ENCMB_LIFTED',
2342 NULL);
2343 END IF;
2344 IF NOT prgpl_upd_spo (
2345 v_spo_rec.person_id,
2346 v_spo_rec.course_cd,
2347 v_spo_rec.sequence_number,
2348 v_show_cause_ind,
2349 v_apply_before_show_ind,
2350 v_appeal_ind,
2351 v_apply_before_appeal_ind) THEN
2352 -- Record locked
2353 ROLLBACK TO sp_before_spo_apply;
2354 IF p_spo_person_id IS NULL THEN
2355 v_process_next_spo := TRUE;
2356 ELSE
2357 FND_MESSAGE.SET_NAME ('IGS', 'IGS_PR_UNLO_DTLS_TA');
2358 p_message_text := FND_MESSAGE.GET;
2359 p_message_level := cst_error;
2360 EXIT;
2361 END IF;
2362 END IF;
2363 END IF;
2364 IF NOT v_process_next_spo THEN
2365 IF v_spo_rec.course_attempt_status = cst_discontin THEN
2366 OPEN c_dr (v_spo_rec.discontinuation_reason_cd);
2367 FETCH c_dr INTO v_s_discont_reason_type;
2368 CLOSE c_dr;
2369 IF v_s_discont_reason_type = cst_progress THEN
2370 -- Providing no other progression outcomes exist that would enforce
2371 -- the discontinuation to remain, lift it. Note: no units or unit sets
2372 -- were re-instated during the making of this transaction.
2373 v_other_encumbrance := FALSE;
2374 FOR v_spo_pot_rec IN c_spo_pot (
2375 v_spo_rec.person_id,
2376 v_spo_rec.course_cd,
2377 v_spo_rec.sequence_number,
2378 v_spo_rec.encmb_course_group_cd,
2379 v_spo_rec.version_number) LOOP
2380 IF IGS_PR_GEN_006.IGS_PR_get_spo_expiry (
2381 v_spo_rec.person_id,
2382 v_spo_rec.course_cd,
2383 v_spo_pot_rec.sequence_number,
2384 v_spo_pot_rec.expiry_dt,
2385 v_expiry_dt) IN (
2386 cst_current,
2387 cst_open) THEN
2388 v_other_encumbrance := TRUE;
2389 EXIT;
2390 END IF;
2391 END LOOP; -- c_spo_pot
2392 IF v_other_encumbrance THEN
2393 IF p_spo_person_id IS NULL THEN
2394 prgpl_ins_log_entry (
2395 v_log_creation_dt,
2396 cst_disc_other,
2397 v_spo_rec.person_id,
2398 v_spo_rec.course_cd,
2399 v_spo_rec.prg_cal_type,
2400 v_spo_rec.prg_ci_sequence_number,
2401 v_spo_rec.sequence_number,
2402 v_spo_rec.progression_outcome_type,
2403 NULL,
2404 NULL,
2405 NULL,
2406 'IGS_PR_SCA_DISCON_NOT_LIFTED',
2407 NULL);
2408 ELSE
2409 p_message_text := FND_MESSAGE.GET_STRING('IGS','IGS_PR_SCA_DISCON_NOT_LIFTED');
2410 p_message_level := cst_error;
2411 END IF;
2412 ELSE
2413 -- Lift the course discontinuation
2414 BEGIN
2415 FOR v_sca_rec IN c_sca1 (
2416 v_spo_rec.person_id,
2417 v_spo_rec.course_cd) LOOP
2418 /*
2419 UPDATE IGS_EN_STDNT_PS_ATT
2420 SET discontinued_dt = NULL,
2421 discontinuation_reason_cd = NULL
2422 WHERE CURRENT OF c_sca1;
2423 */
2424 IGS_EN_STDNT_PS_ATT_PKG.UPDATE_ROW(
2425 X_ROWID => v_sca_rec.ROWID,
2426 X_PERSON_ID => v_sca_rec.PERSON_ID,
2427 X_COURSE_CD => v_sca_rec.COURSE_CD,
2428 X_ADVANCED_STANDING_IND => v_sca_rec.ADVANCED_STANDING_IND,
2429 X_FEE_CAT => v_sca_rec.FEE_CAT,
2430 X_CORRESPONDENCE_CAT => v_sca_rec.CORRESPONDENCE_CAT,
2431 X_SELF_HELP_GROUP_IND => v_sca_rec.SELF_HELP_GROUP_IND,
2432 X_LOGICAL_DELETE_DT => v_sca_rec.LOGICAL_DELETE_DT,
2433 X_ADM_ADMISSION_APPL_NUMBER => v_sca_rec.ADM_ADMISSION_APPL_NUMBER,
2434 X_ADM_NOMINATED_COURSE_CD => v_sca_rec.ADM_NOMINATED_COURSE_CD,
2435 X_ADM_SEQUENCE_NUMBER => v_sca_rec.ADM_SEQUENCE_NUMBER,
2436 X_VERSION_NUMBER => v_sca_rec.VERSION_NUMBER,
2437 X_CAL_TYPE => v_sca_rec.CAL_TYPE,
2438 X_LOCATION_CD => v_sca_rec.LOCATION_CD,
2439 X_ATTENDANCE_MODE => v_sca_rec.ATTENDANCE_MODE,
2440 X_ATTENDANCE_TYPE => v_sca_rec.ATTENDANCE_TYPE,
2441 X_COO_ID => v_sca_rec.COO_ID,
2442 X_STUDENT_CONFIRMED_IND => v_sca_rec.STUDENT_CONFIRMED_IND,
2443 X_COMMENCEMENT_DT => v_sca_rec.COMMENCEMENT_DT,
2444 X_COURSE_ATTEMPT_STATUS => v_sca_rec.COURSE_ATTEMPT_STATUS,
2445 X_PROGRESSION_STATUS => v_sca_rec.PROGRESSION_STATUS,
2446 X_DERIVED_ATT_TYPE => v_sca_rec.DERIVED_ATT_TYPE,
2447 X_DERIVED_ATT_MODE => v_sca_rec.DERIVED_ATT_MODE,
2448 X_PROVISIONAL_IND => v_sca_rec.PROVISIONAL_IND,
2449 X_DISCONTINUED_DT => NULL,
2450 X_DISCONTINUATION_REASON_CD => NULL,
2451 X_LAPSED_DT => v_sca_rec.LAPSED_DT,
2452 X_FUNDING_SOURCE => v_sca_rec.FUNDING_SOURCE,
2453 X_EXAM_LOCATION_CD => v_sca_rec.EXAM_LOCATION_CD,
2454 X_DERIVED_COMPLETION_YR => v_sca_rec.DERIVED_COMPLETION_YR,
2455 X_DERIVED_COMPLETION_PERD => v_sca_rec.DERIVED_COMPLETION_PERD,
2456 X_NOMINATED_COMPLETION_YR => v_sca_rec.NOMINATED_COMPLETION_YR,
2457 X_NOMINATED_COMPLETION_PERD => v_sca_rec.NOMINATED_COMPLETION_PERD,
2458 X_RULE_CHECK_IND => v_sca_rec.RULE_CHECK_IND,
2459 X_WAIVE_OPTION_CHECK_IND => v_sca_rec.WAIVE_OPTION_CHECK_IND,
2460 X_LAST_RULE_CHECK_DT => v_sca_rec.LAST_RULE_CHECK_DT,
2461 X_PUBLISH_OUTCOMES_IND => v_sca_rec.PUBLISH_OUTCOMES_IND,
2462 X_COURSE_RQRMNT_COMPLETE_IND => v_sca_rec.COURSE_RQRMNT_COMPLETE_IND,
2463 X_COURSE_RQRMNTS_COMPLETE_DT => v_sca_rec.COURSE_RQRMNTS_COMPLETE_DT,
2464 X_S_COMPLETED_SOURCE_TYPE => v_sca_rec.S_COMPLETED_SOURCE_TYPE,
2465 X_OVERRIDE_TIME_LIMITATION => v_sca_rec.OVERRIDE_TIME_LIMITATION,
2466 X_MODE => 'R',
2467 X_LAST_DATE_OF_ATTENDANCE => v_sca_rec.LAST_DATE_OF_ATTENDANCE,
2468 X_DROPPED_BY => v_sca_rec.DROPPED_BY,
2469 X_IGS_PR_CLASS_STD_ID => v_sca_rec.IGS_PR_CLASS_STD_ID,
2470 X_PRIMARY_PROGRAM_TYPE => v_sca_rec.PRIMARY_PROGRAM_TYPE,
2471 X_PRIMARY_PROG_TYPE_SOURCE => v_sca_rec.PRIMARY_PROG_TYPE_SOURCE,
2472 X_CATALOG_CAL_TYPE => v_sca_rec.CATALOG_CAL_TYPE,
2473 X_CATALOG_SEQ_NUM => v_sca_rec.CATALOG_SEQ_NUM,
2474 X_KEY_PROGRAM => v_sca_rec.KEY_PROGRAM,
2475 X_MANUAL_OVR_CMPL_DT_IND => v_sca_rec.manual_ovr_cmpl_dt_ind,
2476 X_OVERRIDE_CMPL_DT => v_sca_rec.OVERRIDE_CMPL_DT,
2477 X_ATTRIBUTE_CATEGORY => v_sca_rec.ATTRIBUTE_CATEGORY,
2478 X_ATTRIBUTE1 => v_sca_rec.ATTRIBUTE1,
2479 X_ATTRIBUTE2 => v_sca_rec.ATTRIBUTE2,
2480 X_ATTRIBUTE3 => v_sca_rec.ATTRIBUTE3,
2481 X_ATTRIBUTE4 => v_sca_rec.ATTRIBUTE4,
2482 X_ATTRIBUTE5 => v_sca_rec.ATTRIBUTE5,
2483 X_ATTRIBUTE6 => v_sca_rec.ATTRIBUTE6,
2484 X_ATTRIBUTE7 => v_sca_rec.ATTRIBUTE7,
2485 X_ATTRIBUTE8 => v_sca_rec.ATTRIBUTE8,
2486 X_ATTRIBUTE9 => v_sca_rec.ATTRIBUTE9,
2487 X_ATTRIBUTE10 => v_sca_rec.ATTRIBUTE10,
2488 X_ATTRIBUTE11 => v_sca_rec.ATTRIBUTE11,
2489 X_ATTRIBUTE12 => v_sca_rec.ATTRIBUTE12,
2490 X_ATTRIBUTE13 => v_sca_rec.ATTRIBUTE13,
2491 X_ATTRIBUTE14 => v_sca_rec.ATTRIBUTE14,
2492 X_ATTRIBUTE15 => v_sca_rec.ATTRIBUTE15,
2493 X_ATTRIBUTE16 => v_sca_rec.ATTRIBUTE16,
2494 X_ATTRIBUTE17 => v_sca_rec.ATTRIBUTE17,
2495 X_ATTRIBUTE18 => v_sca_rec.ATTRIBUTE18,
2496 X_ATTRIBUTE19 => v_sca_rec.ATTRIBUTE19,
2497 x_ATTRIBUTE20 => v_sca_rec.ATTRIBUTE20,
2498 X_FUTURE_DATED_TRANS_FLAG => v_sca_rec.future_dated_trans_flag
2499 );
2500
2501
2502 END LOOP;
2503 EXCEPTION
2504 WHEN e_record_locked THEN
2505 IF c_sca1%ISOPEN THEN
2506 CLOSE c_sca1;
2507 END IF;
2508 ROLLBACK TO sp_before_spo_apply;
2509 IF p_spo_person_id IS NULL THEN
2510 v_process_next_spo := TRUE;
2511 ELSE
2512 FND_MESSAGE.SET_NAME ('IGS', 'IGS_PR_UNLO_SCA_TA');
2513 p_message_text := FND_MESSAGE.GET;
2514 p_message_level := cst_error;
2515 EXIT;
2516 END IF;
2517 WHEN e_application THEN
2518 IF c_sca1%ISOPEN THEN
2519 CLOSE c_sca1;
2520 END IF;
2521 IF p_spo_person_id IS NULL THEN
2522 prgpl_ins_log_entry (
2523 v_log_creation_dt,
2524 cst_discl_err,
2525 v_spo_rec.person_id,
2526 v_spo_rec.course_cd,
2527 v_spo_rec.prg_cal_type,
2528 v_spo_rec.prg_ci_sequence_number,
2529 v_spo_rec.sequence_number,
2530 v_spo_rec.progression_outcome_type,
2531 NULL,
2532 NULL,
2533 NULL,
2534 'IGS_PR_ERR_SCA_DISCON_LIFT',
2535 SUBSTR(SQLERRM, 12, LENGTH(SQLERRM)));
2536 ELSE
2537 p_message_text := FND_MESSAGE.GET_STRING('IGS','IGS_PR_ERR_SCA_DISCON_LIFT');
2538 p_message_level := cst_error;
2539 EXIT;
2540 END IF;
2541 WHEN OTHERS THEN
2542 RAISE;
2543 END;
2544 END IF;
2545 END IF;
2546 END IF;
2547 END IF;
2548
2549 IF NOT v_process_next_spo THEN
2550 -- Remove any SCA rules that resulted from the outcome
2551 BEGIN
2552 FOR v_pra_upd_rec IN c_pra_upd1 (
2553 v_spo_rec.person_id,
2554 v_spo_rec.course_cd,
2555 v_spo_rec.sequence_number) LOOP
2556 /*
2557 UPDATE IGS_PR_RU_APPL
2558 SET logical_delete_dt = SYSDATE
2559 WHERE CURRENT OF c_pra_upd1;
2560 */
2561 IGS_PR_RU_APPL_PKG.UPDATE_ROW(
2562 X_ROWID => v_pra_upd_rec.ROWID,
2563 X_PROGRESSION_RULE_CAT => v_pra_upd_rec.PROGRESSION_RULE_CAT,
2564 X_SEQUENCE_NUMBER => v_pra_upd_rec.SEQUENCE_NUMBER,
2565 X_S_RELATION_TYPE => v_pra_upd_rec.S_RELATION_TYPE,
2566 X_PROGRESSION_RULE_CD => v_pra_upd_rec.PROGRESSION_RULE_CD,
2567 X_REFERENCE_CD => v_pra_upd_rec.REFERENCE_CD,
2568 X_RUL_SEQUENCE_NUMBER => v_pra_upd_rec.RUL_SEQUENCE_NUMBER,
2569 X_ATTENDANCE_TYPE => v_pra_upd_rec.ATTENDANCE_TYPE,
2570 X_OU_ORG_UNIT_CD => v_pra_upd_rec.OU_ORG_UNIT_CD,
2571 X_OU_START_DT => v_pra_upd_rec.OU_START_DT,
2572 X_COURSE_TYPE => v_pra_upd_rec.COURSE_TYPE,
2573 X_CRV_COURSE_CD => v_pra_upd_rec.CRV_COURSE_CD,
2574 X_CRV_VERSION_NUMBER => v_pra_upd_rec.CRV_VERSION_NUMBER,
2575 X_SCA_PERSON_ID => v_pra_upd_rec.SCA_PERSON_ID,
2576 X_SCA_COURSE_CD => v_pra_upd_rec.SCA_COURSE_CD,
2577 X_PRO_PROGRESSION_RULE_CAT => v_pra_upd_rec.PRO_PROGRESSION_RULE_CAT,
2578 X_PRO_PRA_SEQUENCE_NUMBER => v_pra_upd_rec.PRO_PRA_SEQUENCE_NUMBER,
2579 X_PRO_SEQUENCE_NUMBER => v_pra_upd_rec.PRO_SEQUENCE_NUMBER,
2580 X_SPO_PERSON_ID => v_pra_upd_rec.SPO_PERSON_ID,
2581 X_SPO_COURSE_CD => v_pra_upd_rec.SPO_COURSE_CD,
2582 X_SPO_SEQUENCE_NUMBER => v_pra_upd_rec.SPO_SEQUENCE_NUMBER,
2583 X_LOGICAL_DELETE_DT => SYSDATE,
2584 X_MESSAGE => v_pra_upd_rec.MESSAGE,
2585 X_MODE => 'R',
2586 X_MIN_CP => v_pra_upd_rec.MIN_CP,
2587 X_MAX_CP => v_pra_upd_rec.MAX_CP,
2588 X_IGS_PR_CLASS_STD_ID => v_pra_upd_rec.IGS_PR_CLASS_STD_ID
2589 );
2590 END LOOP; -- c_pra_upd1
2591 EXCEPTION
2592 WHEN e_record_locked THEN
2593 IF c_pra_upd1%ISOPEN THEN
2594 CLOSE c_pra_upd1;
2595 END IF;
2596 ROLLBACK TO sp_before_spo_apply;
2597 IF p_spo_person_id IS NOT NULL THEN
2598 FND_MESSAGE.SET_NAME ('IGS', 'IGS_PR_UNLO_DTLS_TA');
2599 p_message_text := FND_MESSAGE.GET;
2600 p_message_level := cst_error;
2601 EXIT;
2602 END IF;
2603 WHEN OTHERS THEN
2604 RAISE;
2605 END;
2606 END IF;
2607 END IF;
2608 IF v_exit_procedure THEN
2609 EXIT;
2610 END IF;
2611 --Added next exception part to fix Bug# 3103892
2612 EXCEPTION
2613 WHEN OTHERS THEN
2614 ROLLBACK TO sp_before_spo_apply;
2615 END;
2616 --End of new code added to fix Bug# 3103892
2617 END LOOP; -- c_spo
2618 COMMIT;
2619 RETURN;
2620 EXCEPTION
2621 WHEN OTHERS THEN
2622 IF c_dr%ISOPEN THEN
2623 CLOSE c_dr;
2624 END IF;
2625 IF c_sca1%ISOPEN THEN
2626 CLOSE c_sca1;
2627 END IF;
2628 IF c_sca2%ISOPEN THEN
2629 CLOSE c_sca2;
2630 END IF;
2631 IF c_pra%ISOPEN THEN
2632 CLOSE c_pra;
2633 END IF;
2634 IF c_ci%ISOPEN THEN
2635 CLOSE c_ci;
2636 END IF;
2637 IF c_pra_prct%ISOPEN THEN
2638 CLOSE c_pra_prct;
2639 END IF;
2640 IF c_pra_upd1%ISOPEN THEN
2641 CLOSE c_pra_upd1;
2642 END IF;
2643 IF c_pra_upd2%ISOPEN THEN
2644 CLOSE c_pra_upd2;
2645 END IF;
2646 IF c_spo_pot%ISOPEN THEN
2647 CLOSE c_spo_pot;
2648 END IF;
2649 IF c_suao%ISOPEN THEN
2650 CLOSE c_suao;
2651 END IF;
2652 IF c_sua%ISOPEN THEN
2653 CLOSE c_sua;
2654 END IF;
2655 IF c_spo%ISOPEN THEN
2656 CLOSE c_spo;
2657 END IF;
2658 RAISE;
2659 END;
2660 EXCEPTION
2661 WHEN OTHERS THEN
2662 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
2663 FND_MESSAGE.SET_TOKEN('NAME','IGS_PR_GEN_004.IGS_PR_UPD_OUT_APPLY');
2664 IGS_GE_MSG_STACK.ADD;
2665 App_Exception.Raise_Exception;
2666 END IGS_PR_upd_out_apply;
2667
2668 PROCEDURE igs_pr_upd_rule_apply (
2669 p_prg_cal_type IN VARCHAR2,
2670 p_prg_sequence_number IN NUMBER,
2671 p_course_type IN VARCHAR2,
2672 p_org_unit_cd IN VARCHAR2,
2673 p_ou_start_dt IN DATE,
2674 p_course_cd IN VARCHAR2,
2675 p_location_cd IN VARCHAR2,
2676 p_attendance_mode IN VARCHAR2,
2677 p_progression_status IN VARCHAR2,
2678 p_enrolment_cat IN VARCHAR2,
2679 p_group_id IN NUMBER,
2680 p_processing_type IN VARCHAR2,
2681 p_log_creation_dt OUT NOCOPY DATE
2682 )
2683 IS
2684 gv_other_detail VARCHAR2(255);
2685 BEGIN -- 8/9/01IGS_PR_upd_rule_apply
2686 -- Automatic application of rules ; for detail see associated design
2687 -- documentation.
2688 -- This routine handles the batch selection of students to be processed,
2689 -- and the initiation of exception reporting mechanisms. A second routine
2690 -- IGS_PR_UPD_SCA_APPLY is called to actually process the rules for a select
2691 -- course attempt within a progression period.
2692 DECLARE
2693 cst_prg_appl CONSTANT VARCHAR2(10) := 'PRG-APPL';
2694 cst_enrolled CONSTANT VARCHAR2(10) := 'ENROLLED';
2695 cst_inactive CONSTANT VARCHAR2(10) := 'INACTIVE';
2696 cst_intermit CONSTANT VARCHAR2(10) := 'INTERMIT';
2697 cst_discontin CONSTANT VARCHAR2(10) := 'DISCONTIN';
2698 cst_lapsed CONSTANT VARCHAR2(10) := 'LAPSED';
2699 cst_unconfirm CONSTANT VARCHAR2(10) := 'UNCONFIRM';
2700 cst_invalid CONSTANT VARCHAR2(10) := 'INVALID';
2701 cst_initial CONSTANT VARCHAR2(10) := 'INITIAL';
2702 cst_todo CONSTANT VARCHAR2(10) := 'TODO';
2703 cst_both CONSTANT VARCHAR2(10) := 'BOTH';
2704 cst_active CONSTANT VARCHAR2(10) := 'ACTIVE';
2705 cst_progress CONSTANT VARCHAR2(10) := 'PROGRESS';
2706 v_recommended_outcomes INTEGER DEFAULT 0;
2707 v_approved_outcomes INTEGER DEFAULT 0;
2708 v_removed_outcomes INTEGER DEFAULT 0;
2709 v_last_course_cd IGS_EN_STDNT_PS_ATT.course_cd%TYPE := NULL;
2710 v_last_version_number IGS_EN_STDNT_PS_ATT.version_number%TYPE := NULL;
2711 v_log_creation_dt IGS_GE_s_log.creation_dt%TYPE;
2712 v_key IGS_GE_s_log.KEY%TYPE;
2713 v_message_name VARCHAR2(30);
2714 CURSOR c_ci IS
2715 SELECT ci.cal_type,
2716 ci.sequence_number,
2717 ci.alternate_code,
2718 IGS_EN_GEN_014.ENRS_GET_ACAD_ALT_CD(
2719 ci.cal_type,
2720 ci.sequence_number) acad_alternate_code
2721 FROM IGS_CA_INST ci,
2722 IGS_CA_TYPE cat,
2723 IGS_CA_STAT cs
2724 WHERE (p_prg_cal_type IS NULL OR
2725 (ci.cal_type = p_prg_cal_type AND
2726 ci.sequence_number = p_prg_sequence_number)) AND
2727 cat.cal_type = ci.cal_type AND
2728 cat.s_cal_cat = cst_progress AND
2729 cs.CAL_STATUS = ci.CAL_STATUS AND
2730 cs.s_CAL_STATUS = cst_active AND
2731 EXISTS (
2732 SELECT 'X'
2733 FROM IGS_CA_DA_INST dai1
2734 WHERE ci.cal_type = dai1.cal_type AND
2735 ci.sequence_number = dai1.ci_sequence_number AND
2736 (
2737 EXISTS ( SELECT 1 FROM IGS_PR_S_PRG_CONF spc1
2738 WHERE dai1.dt_alias = spc1.apply_start_dt_alias)
2739 OR
2740 EXISTS (SELECT 1 FROM IGS_PR_S_OU_PRG_CONF sopc1
2741 WHERE dai1.dt_alias = sopc1.apply_start_dt_alias)
2742 OR
2743 EXISTS (SELECT 1 FROM IGS_PR_S_CRV_PRG_CON scpc1
2744 WHERE dai1.dt_alias = scpc1.apply_start_dt_alias)) AND
2745 IGS_CA_GEN_001.CALP_GET_ALIAS_VAL (
2746 dai1.dt_alias,
2747 dai1.sequence_number,
2748 ci.cal_type,
2749 ci.sequence_number
2750 ) <= TRUNC(SYSDATE)) AND
2751 EXISTS (
2752 SELECT 'X'
2753 FROM IGS_CA_DA_INST dai2
2754 WHERE ci.cal_type = dai2.cal_type AND
2755 ci.sequence_number = dai2.ci_sequence_number AND
2756 (
2757 EXISTS ( SELECT 1 FROM IGS_PR_S_PRG_CONF spc2
2758 WHERE dai2.dt_alias = spc2.apply_end_dt_alias)
2759 OR
2760 EXISTS (SELECT 1 FROM IGS_PR_S_OU_PRG_CONF sopc2
2761 WHERE dai2.dt_alias = sopc2.apply_end_dt_alias)
2762 OR
2763 EXISTS (SELECT 1 FROM IGS_PR_S_CRV_PRG_CON scpc2
2764 WHERE dai2.dt_alias = scpc2.apply_end_dt_alias) )
2765 AND
2766 NVL( IGS_CA_GEN_001.CALP_GET_ALIAS_VAL (
2767 dai2.dt_alias,
2768 dai2.sequence_number,
2769 ci.cal_type,
2770 ci.sequence_number
2771 ), SYSDATE) >= TRUNC(SYSDATE)
2772 ) ;
2773 --
2774 --
2775 --
2776 FUNCTION prgpl_upd_check_readiness (
2777 p_sca_person_id IGS_EN_STDNT_PS_ATT.person_id%TYPE,
2778 p_sca_course_cd IGS_EN_STDNT_PS_ATT.course_cd%TYPE,
2779 p_sca_version_number IGS_EN_STDNT_PS_ATT.version_number%TYPE,
2780 p_ci_cal_type IGS_CA_INST.cal_type%TYPE,
2781 p_ci_sequence_number IGS_CA_INST.sequence_number%TYPE,
2782 p_outcome_check_type IGS_PR_S_PRG_CONF.outcome_check_type%TYPE)
2783 RETURN VARCHAR2
2784 IS
2785 BEGIN -- prgpl_upd_check_readiness
2786 DECLARE
2787 cst_none CONSTANT VARCHAR2(10) := 'NONE';
2788 cst_missing CONSTANT VARCHAR2(10) := 'MISSING';
2789 cst_recommend CONSTANT VARCHAR2(10) := 'RECOMMEND';
2790 cst_finalised CONSTANT VARCHAR2(10) := 'FINALISED';
2791 v_start_dt DATE;
2792 v_cutoff_dt DATE;
2793 v_result_status VARCHAR2(10);
2794 BEGIN
2795
2796 -- If course version is not within its first processing cycle then skip
2797 IF IGS_PR_GEN_006.IGS_PR_get_within_appl (
2798 p_ci_cal_type,
2799 p_ci_sequence_number,
2800 p_sca_course_cd,
2801 p_sca_version_number,
2802 cst_initial,
2803 v_start_dt,
2804 v_cutoff_dt) = 'N' THEN
2805
2806 RETURN 'N';
2807 END IF;
2808 -- Check whether student is effectively enrolled in the period
2809 v_result_status := IGS_PR_GEN_005.IGS_PR_get_sca_state (
2810 p_sca_person_id,
2811 p_sca_course_cd,
2812 p_ci_cal_type,
2813 p_ci_sequence_number);
2814 IF v_result_status = cst_none THEN
2815
2816 RETURN 'N';
2817 ELSIF v_result_status = cst_missing THEN
2818 -- If the outcome check type is not missing then exclude from checking
2819 IF p_outcome_check_type <> cst_missing THEN
2820
2821 RETURN 'N';
2822 END IF;
2823 ELSIF v_result_status = cst_recommend THEN
2824 -- If the outcome status is finalised (ie. ignoring recommended) then
2825 -- exclude
2826 IF p_outcome_check_type = cst_finalised THEN
2827
2828 RETURN 'N';
2829 END IF;
2830 END IF;
2831 RETURN 'Y';
2832 END;
2833 EXCEPTION
2834 WHEN OTHERS THEN
2835 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
2836 FND_MESSAGE.SET_TOKEN('NAME','IGS_PR_GEN_004.IGS_PR_UPD_RULE_APPLY.PRGPL_UPD_CHECK_READINESS');
2837 IGS_GE_MSG_STACK.ADD;
2838 App_Exception.Raise_Exception;
2839 END PRGPL_UPD_CHECK_READINESS;
2840 --
2841 --
2842 --
2843 PROCEDURE prgpl_upd_initial_appl (
2844 p_ci_cal_type igs_ca_inst.cal_type%TYPE,
2845 p_ci_sequence_number igs_ca_inst.sequence_number%TYPE
2846 ) IS
2847 BEGIN -- prgpl_upd_initial_appl
2848 DECLARE
2849 v_apply_start_dt_alias igs_pr_s_prg_conf.apply_start_dt_alias%TYPE;
2850 v_apply_end_dt_alias igs_pr_s_prg_conf.apply_end_dt_alias%TYPE;
2851 v_end_benefit_dt_alias igs_pr_s_prg_conf.end_benefit_dt_alias%TYPE;
2852 v_end_penalty_dt_alias igs_pr_s_prg_conf.end_penalty_dt_alias%TYPE;
2853 v_show_cause_cutoff_dt igs_pr_s_prg_conf.show_cause_cutoff_dt_alias%TYPE;
2854 v_appeal_cutoff_dt igs_pr_s_prg_conf.appeal_cutoff_dt_alias%TYPE;
2855 v_show_cause_ind igs_pr_s_prg_conf.show_cause_ind%TYPE;
2856 v_apply_before_show_ind igs_pr_s_prg_conf.apply_before_show_ind%TYPE;
2857 v_appeal_ind igs_pr_s_prg_conf.appeal_ind%TYPE;
2858 v_apply_before_appeal_ind igs_pr_s_prg_conf.apply_before_appeal_ind%TYPE;
2859 v_count_sus_in_time_ind igs_pr_s_prg_conf.count_sus_in_time_ind%TYPE;
2860 v_count_exc_in_time_ind igs_pr_s_prg_conf.count_exc_in_time_ind%TYPE;
2861 v_calculate_wam_ind igs_pr_s_prg_conf.calculate_wam_ind%TYPE;
2862 v_calculate_gpa_ind igs_pr_s_prg_conf.calculate_gpa_ind%TYPE;
2863 v_outcome_check_type igs_pr_s_prg_conf.outcome_check_type%TYPE;
2864 --
2865 TYPE ScaCurTyp IS REF CURSOR;
2866 c_sca ScaCurTyp;
2867 stmt_str VARCHAR2(10000);
2868 from_clause VARCHAR2(200);
2869 --
2870 CURSOR cur_enr_cat (
2871 cp_person_id IN NUMBER,
2872 cp_course_cd IN VARCHAR2
2873 ) IS
2874 SELECT scae.enrolment_cat enrolment_cat
2875 FROM igs_as_sc_atmpt_enr scae,
2876 igs_ca_inst_all ci
2877 WHERE scae.person_id = cp_person_id
2878 AND scae.course_cd = cp_course_cd
2879 AND scae.cal_type = ci.cal_type
2880 AND scae.ci_sequence_number = ci.sequence_number
2881 ORDER BY ci.end_dt DESC;
2882 --
2883 rec_enr_cat cur_enr_cat%ROWTYPE;
2884 n_person_id igs_en_stdnt_ps_att_all.person_id%TYPE;
2885 v_course_cd igs_en_stdnt_ps_att_all.course_cd%TYPE;
2886 n_version_number igs_en_stdnt_ps_att_all.version_number%TYPE;
2887 process_record BOOLEAN := TRUE;
2888 --
2889 BEGIN
2890 --
2891 from_clause := from_clause || 'FROM igs_en_stdnt_ps_att_all sca, igs_en_su_attempt_all sua, igs_ca_inst_rel cir';
2892 --
2893 -- Append Person ID Group filter to the Where clause only when it is passed
2894 --
2895 IF (p_group_id IS NOT NULL) THEN
2896 from_clause := from_clause || ', igs_pe_prsid_grp_mem_all pigm';
2897 END IF;
2898 --
2899 -- Append Program Type filter to the Where clause only when it is passed
2900 --
2901 IF (p_course_type IS NOT NULL) THEN
2902 from_clause := from_clause || ', igs_ps_ver_all crv';
2903 END IF;
2904 --
2905 stmt_str := 'SELECT sca.person_id, sca.course_cd, sca.version_number ';
2906 stmt_str := stmt_str || from_clause;
2907 stmt_str := stmt_str ||
2908 ' WHERE sca.course_attempt_status IN (''ENROLLED'', ''INACTIVE'', ''INTERMIT'', ''DISCONTIN'', ''LAPSED'') ';
2909 --
2910 -- Append Program Code filter to the Where clause only when it is passed
2911 --
2912 IF (p_course_cd IS NOT NULL AND p_course_cd <> '%') THEN
2913 stmt_str := stmt_str || 'AND sca.course_cd = ''' || p_course_cd || ''' ';
2914 END IF;
2915 --
2916 IF (p_group_id IS NOT NULL) THEN
2917 stmt_str := stmt_str ||
2918 'AND pigm.group_id = ' || p_group_id || ' ' ||
2919 'AND pigm.person_id = sca.person_id ';
2920 END IF;
2921 --
2922 IF (p_course_type IS NOT NULL) THEN
2923 stmt_str := stmt_str ||
2924 'AND crv.course_cd = sca.course_cd ' ||
2925 'AND crv.version_number = sca.version_number ' ||
2926 'AND crv.course_type = ''' || p_course_type || ''' ';
2927 END IF;
2928 --
2929 stmt_str := stmt_str ||
2930 'AND NOT EXISTS ( ' ||
2931 'SELECT 1 ' ||
2932 'FROM igs_pr_stdnt_pr_ck spc ' ||
2933 'WHERE sca.person_id = spc.person_id ' ||
2934 'AND sca.course_cd = spc.course_cd ' ||
2935 'AND spc.prg_cal_type = ''' || p_ci_cal_type || ''' ' ||
2936 'AND spc.prg_ci_sequence_number = ' || NVL (p_ci_sequence_number, 0) || ') ' ||
2937 'AND sca.person_id = sua.person_id ' ||
2938 'AND sca.course_cd = sua.course_cd ' ||
2939 'AND sua.unit_attempt_status NOT IN (''UNCONFIRM'', ''INVALID'') ' ||
2940 'AND cir.sup_cal_type = ''' || p_ci_cal_type || ''' ' ||
2941 'AND cir.sup_ci_sequence_number = ' || NVL (p_ci_sequence_number, 0) || ' ' ||
2942 'AND sua.cal_type = cir.sub_cal_type ' ||
2943 'AND sua.ci_sequence_number = cir.sub_ci_sequence_number ';
2944 --
2945 -- Append Location filter to the Where clause only when it is passed
2946 --
2947 IF (p_location_cd IS NOT NULL) THEN
2948 stmt_str := stmt_str || 'AND sca.location_cd = ''' || p_location_cd || ''' ';
2949 END IF;
2950 --
2951 -- Append Organization Unit filter to the Where clause only when it is passed
2952 --
2953 IF (p_org_unit_cd IS NOT NULL AND p_ou_start_dt IS NOT NULL) THEN
2954 stmt_str := stmt_str ||
2955 'AND igs_pr_gen_001.prgp_get_crv_cmt (sca.course_cd, sca.version_number, ' ||
2956 '''' || p_org_unit_cd || ''', TO_DATE (''' || TO_CHAR(p_ou_start_dt, 'YYYY/MM/DD') || ''', ''YYYY/MM/DD'')) = ''Y'' ';
2957 END IF;
2958 --
2959 -- Append Attendance Mode filter to the Where clause only when it is passed
2960 --
2961 IF (p_attendance_mode IS NOT NULL) THEN
2962 stmt_str := stmt_str || 'AND sca.attendance_mode = ''' || p_attendance_mode || ''' ';
2963 END IF;
2964 --
2965 -- Append Progression Status filter to the Where clause only when it is passed
2966 --
2967 IF (p_progression_status IS NOT NULL) THEN
2968 stmt_str := stmt_str || 'AND sca.progression_status = ''' || p_progression_status || ''' ';
2969 END IF;
2970 --
2971 stmt_str := stmt_str || 'ORDER BY sca.course_cd, sca.version_number ';
2972 --
2973 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2974 fnd_log.string (
2975 fnd_log.level_statement,
2976 'igs.plsql.igs_pr_gen_004.prgpl_upd_initial_appl.dynamic_query',
2977 'Query Built => ' || stmt_str
2978 );
2979 END IF;
2980 --
2981 OPEN c_sca FOR stmt_str;
2982 --
2983 LOOP
2984 FETCH c_sca INTO n_person_id, v_course_cd, n_version_number;
2985 EXIT WHEN c_sca%NOTFOUND;
2986 process_record := TRUE;
2987 --
2988 -- Check if Student's Latest Program Attempt's Enrollment Category matches with parameter p_enrolment_cat
2989 --
2990 IF (p_enrolment_cat IS NOT NULL) THEN
2991 OPEN cur_enr_cat (n_person_id, v_course_cd);
2992 FETCH cur_enr_cat INTO rec_enr_cat;
2993 --
2994 IF ((cur_enr_cat%FOUND) AND
2995 (rec_enr_cat.enrolment_cat = p_enrolment_cat))THEN
2996 process_record := TRUE;
2997 ELSE
2998 process_record := FALSE;
2999 END IF;
3000 --
3001 CLOSE cur_enr_cat;
3002 END IF;
3003 --
3004 IF process_record THEN
3005 IF v_last_course_cd IS NULL OR
3006 (v_last_course_cd <> v_course_cd OR
3007 v_last_version_number <> n_version_number) THEN
3008 -- Determine whether considering recommended outcomes in rule checking
3009 igs_pr_gen_003.igs_pr_get_config_parm (
3010 v_course_cd,
3011 n_version_number,
3012 v_apply_start_dt_alias,
3013 v_apply_end_dt_alias,
3014 v_end_benefit_dt_alias,
3015 v_end_penalty_dt_alias,
3016 v_show_cause_cutoff_dt,
3017 v_appeal_cutoff_dt,
3018 v_show_cause_ind,
3019 v_apply_before_show_ind,
3020 v_appeal_ind,
3021 v_apply_before_appeal_ind,
3022 v_count_sus_in_time_ind,
3023 v_count_exc_in_time_ind,
3024 v_calculate_wam_ind,
3025 v_calculate_gpa_ind,
3026 v_outcome_check_type
3027 );
3028 v_last_course_cd := v_course_cd;
3029 v_last_version_number := n_version_number;
3030 END IF;
3031 -- If student is ready to be checked then apply rules, by calling single SCA
3032 -- rule application process.
3033 IF prgpl_upd_check_readiness (
3034 n_person_id,
3035 v_course_cd,
3036 n_version_number,
3037 p_ci_cal_type,
3038 p_ci_sequence_number,
3039 v_outcome_check_type
3040 ) = 'Y' THEN
3041 igs_pr_gen_004.igs_pr_upd_sca_apply (
3042 n_person_id,
3043 v_course_cd,
3044 p_ci_cal_type,
3045 p_ci_sequence_number,
3046 cst_initial,
3047 v_log_creation_dt,
3048 v_recommended_outcomes,
3049 v_approved_outcomes,
3050 v_removed_outcomes,
3051 v_message_name
3052 );
3053 END IF;
3054 END IF;
3055 END LOOP;
3056 --
3057 CLOSE c_sca;
3058 --
3059 EXCEPTION
3060 WHEN OTHERS THEN
3061 IF c_sca%ISOPEN THEN
3062 CLOSE c_sca;
3063 END IF;
3064 RAISE;
3065 END;
3066 EXCEPTION
3067 WHEN OTHERS THEN
3068 IF (fnd_log.level_exception >= fnd_log.g_current_runtime_level) THEN
3069 fnd_log.string (
3070 fnd_log.level_exception,
3071 'igs.plsql.igs_pr_gen_004.prgpl_upd_initial_appl.exit_exception',
3072 'Exception => ' || SQLERRM
3073 );
3074 END IF;
3075 fnd_message.set_name ('IGS', 'IGS_GE_UNHANDLED_EXP');
3076 fnd_message.set_token ('NAME', 'IGS_PR_GEN_004.IGS_PR_UPD_RULE_APPLY.PRGPL_UPD_INITIAL_APPL');
3077 igs_ge_msg_stack.ADD;
3078 app_exception.raise_exception;
3079 END prgpl_upd_initial_appl;
3080
3081 PROCEDURE prgpl_upd_todo_appl
3082 IS
3083 BEGIN -- prgpl_upd_todo_appl
3084 DECLARE
3085 cst_prg_check CONSTANT VARCHAR2(10) := 'PRG_CHECK';
3086 cst_progress CONSTANT VARCHAR2(10) := 'PROGRESS';
3087 cst_active CONSTANT VARCHAR2(10) := 'ACTIVE';
3088 v_course_type IGS_PS_VER.course_type%TYPE;
3089 v_start_dt DATE;
3090 v_cutoff_dt DATE;
3091 v_dummy VARCHAR2(1);
3092 CURSOR c_st IS
3093 SELECT DISTINCT st.person_id,
3094 st.s_student_todo_type,
3095 st.sequence_number,
3096 str.course_cd,
3097 sca.version_number
3098 FROM IGS_PE_STD_TODO st,
3099 IGS_PE_STD_TODO_REF str,
3100 IGS_EN_STDNT_PS_ATT sca
3101 WHERE st.s_student_todo_type = cst_prg_check AND
3102 st.logical_delete_dt IS NULL AND
3103 st.person_id = str.person_id AND
3104 st.s_student_todo_type = str.s_student_todo_type AND
3105 st.sequence_number = str.sequence_number AND
3106 sca.person_id = st.person_id AND
3107 sca.course_cd = str.course_cd AND
3108 str.course_cd LIKE NVL(p_course_cd, str.course_cd) AND
3109 NVL(p_location_cd, sca.location_cd)
3110 = sca.location_cd AND
3111 (p_org_unit_cd IS NULL OR
3112 p_ou_start_dt IS NULL OR
3113 IGS_PR_GEN_001.prgp_get_crv_cmt (
3114 sca.course_cd,
3115 sca.version_number,
3116 p_org_unit_cd,
3117 p_ou_start_dt) = 'Y') AND
3118 (p_group_id IS NULL OR
3119 sca.person_id IN (
3120 SELECT person_id
3121 FROM IGS_PE_PIGM_PIDGRP_MEM_V
3122 WHERE group_id = p_group_id)) AND
3123 (p_attendance_mode IS NULL OR
3124 sca.attendance_mode = p_attendance_mode) AND
3125 (p_progression_status IS NULL OR
3126 sca.progression_status = p_progression_status) AND
3127 (p_enrolment_cat IS NULL OR
3128 EXISTS (
3129 SELECT 'X'
3130 FROM IGS_AS_SC_ATMPT_ENR scae,
3131 IGS_CA_INST ci1
3132 WHERE sca.person_id = scae.person_id AND
3133 sca.course_cd = scae.course_cd AND
3134 scae.enrolment_cat = p_enrolment_cat AND
3135 ci1.cal_type = scae.cal_type AND
3136 ci1.sequence_number = scae.ci_sequence_number AND
3137 ci1.end_dt =
3138 (SELECT MAX(ci2.end_dt)
3139 FROM IGS_AS_SC_ATMPT_ENR scae2,
3140 IGS_CA_INST ci2
3141 WHERE scae2.person_id = scae.person_id AND
3142 scae2.course_cd = scae.course_cd AND
3143 ci2.cal_type = scae2.cal_type AND
3144 ci2.sequence_number = scae2.ci_sequence_number)));
3145 CURSOR c_st_lck (
3146 cp_person_id IGS_PE_STD_TODO.person_id%TYPE,
3147 cp_s_student_todo_type IGS_PE_STD_TODO.s_student_todo_type%TYPE,
3148 cp_sequence_number IGS_PE_STD_TODO.sequence_number%TYPE) IS
3149 SELECT st.*,
3150 st.ROWID
3151 FROM IGS_PE_STD_TODO st
3152 WHERE st.person_id = cp_person_id AND
3153 st.s_student_todo_type = cp_s_student_todo_type AND
3154 st.sequence_number = cp_sequence_number
3155 FOR UPDATE NOWAIT;
3156
3157 v_st_lck_rec c_st_lck%ROWTYPE;
3158
3159 CURSOR c_crv (
3160 cp_course_cd IGS_PS_VER.course_cd%TYPE,
3161 cp_version_number IGS_PS_VER.version_number%TYPE) IS
3162 SELECT crv.course_type
3163 FROM IGS_PS_VER crv
3164 WHERE crv.course_cd = cp_course_cd AND
3165 crv.version_number = cp_version_number;
3166 CURSOR c_str (
3167 cp_person_id IGS_PE_STD_TODO_REF.person_id%TYPE,
3168 cp_s_student_todo_type IGS_PE_STD_TODO_REF.s_student_todo_type%TYPE,
3169 cp_sequence_number IGS_PE_STD_TODO_REF.sequence_number%TYPE,
3170 cp_course_cd IGS_PE_STD_TODO_REF.course_cd%TYPE) IS
3171 SELECT str.*,
3172 str.ROWID
3173 FROM IGS_PE_STD_TODO_REF str
3174 WHERE str.person_id = cp_person_id AND
3175 str.s_student_todo_type = cp_s_student_todo_type AND
3176 str.sequence_number = cp_sequence_number AND
3177 str.course_cd = cp_course_cd AND
3178 str.logical_delete_dt IS NULL
3179 FOR UPDATE NOWAIT;
3180 CURSOR c_str_chk (
3181 cp_person_id IGS_PE_STD_TODO_REF.person_id%TYPE,
3182 cp_s_student_todo_type IGS_PE_STD_TODO_REF.s_student_todo_type%TYPE,
3183 cp_sequence_number IGS_PE_STD_TODO_REF.sequence_number%TYPE) IS
3184 SELECT 'x'
3185 FROM IGS_PE_STD_TODO_REF str
3186 WHERE str.person_id = cp_person_id AND
3187 str.s_student_todo_type = cp_s_student_todo_type AND
3188 str.sequence_number = cp_sequence_number AND
3189 str.logical_delete_dt IS NULL;
3190 CURSOR c_spc1 (
3191 cp_person_id IGS_EN_STDNT_PS_ATT.person_id%TYPE,
3192 cp_course_cd IGS_EN_STDNT_PS_ATT.course_cd%TYPE) IS
3193 SELECT spc.prg_cal_type,
3194 spc.prg_ci_sequence_number
3195 FROM IGS_PR_STDNT_PR_CK spc
3196 WHERE spc.person_id = cp_person_id AND
3197 spc.course_cd = cp_course_cd;
3198 CURSOR c_spc2 (
3199 cp_cal_type IGS_CA_INST.cal_type%TYPE,
3200 cp_ci_sequence_number IGS_CA_INST.sequence_number%TYPE,
3201 cp_person_id IGS_EN_STDNT_PS_ATT.person_id%TYPE,
3202 cp_course_cd IGS_EN_STDNT_PS_ATT.course_cd%TYPE) IS
3203 SELECT spc.prg_cal_type,
3204 spc.prg_ci_sequence_number
3205 FROM IGS_PR_STDNT_PR_CK spc,
3206 IGS_CA_INST ci1
3207 WHERE spc.person_id = cp_person_id AND
3208 spc.course_cd = cp_course_cd AND
3209 ci1.cal_type = spc.prg_cal_type AND
3210 ci1.sequence_number = spc.prg_ci_sequence_number AND
3211 ci1.start_dt >=
3212 -- On or after the first progression period linked to the student unit
3213 -- attempt
3214 (SELECT MIN(ci2.start_dt)
3215 FROM IGS_CA_INST_REL cir,
3216 IGS_CA_INST ci2,
3217 IGS_CA_STAT cs,
3218 IGS_CA_TYPE cat
3219 WHERE cir.sub_cal_type = cp_cal_type AND
3220 cir.sub_ci_sequence_number = cp_ci_sequence_number AND
3221 ci2.cal_type = cir.sup_cal_type AND
3222 ci2.sequence_number = cir.sup_ci_sequence_number AND
3223 cat.cal_type = ci2.cal_type AND
3224 cat.s_cal_cat = cst_progress AND
3225 cs.CAL_STATUS = ci2.CAL_STATUS AND
3226 cs.s_CAL_STATUS = cst_active);
3227 TYPE r_ci_record_type IS RECORD (
3228 cal_type IGS_CA_INST.cal_type%TYPE,
3229 sequence_number IGS_CA_INST.sequence_number%TYPE);
3230 r_ci_record r_ci_record_type;
3231 TYPE t_ci_type IS TABLE OF r_ci_record%TYPE
3232 INDEX BY BINARY_INTEGER;
3233 v_ci_table t_ci_type;
3234 v_ci_index BINARY_INTEGER;
3235 v_index BINARY_INTEGER;
3236 v_ci_found BOOLEAN;
3237 BEGIN
3238 -- Process each todo ref for the person/course combination and determine the
3239 -- set of progression calendars to be processed
3240 FOR v_st_rec IN c_st LOOP
3241 v_ci_index := 0;
3242 IF p_course_type IS NOT NULL THEN
3243 OPEN c_crv (
3244 v_st_rec.course_cd,
3245 v_st_rec.version_number);
3246 FETCH c_crv INTO v_course_type;
3247 CLOSE c_crv;
3248 END IF;
3249
3250 -- If user has not specified a course_type or course type specified is in sink with the
3251 -- the course_cd and version number passed then only do the following checks else do not call
3252 -- the apply Progression rules process.
3253 IF p_course_type IS NULL OR p_course_type = v_course_type THEN
3254 FOR v_str_rec IN c_str (
3255 v_st_rec.person_id,
3256 v_st_rec.s_student_todo_type,
3257 v_st_rec.sequence_number,
3258 v_st_rec.course_cd) LOOP
3259 -- If unit cd is null then take all the progression calendars corresponding to the person_id and course_cd and store them in
3260 -- the plsql tables for processing. else if for a person_id and course_cd the unit_cd is found to be not null then
3261 -- all progression calendars which start on or after the progression period and are linked to the current student unit attempt
3262 --( corresponding to this person id and course code ) should be stored into the plsql table for further processing.
3263
3264 IF v_str_rec.unit_cd IS NULL THEN -- Advanced standing
3265 -- Advanced standing
3266 -- Advanced standing has been altered ; re-test all previously tested
3267 -- progression calendars that are still within the timeframe
3268 -- c_spcl brings all progression calendars for the person id course_cd combination
3269 -- Functionality of this for loop is:-
3270 -- Store all the progression calendar records in the plsql table if the specified
3271 -- course_cd and version numbers fit within the specified
3272 -- bounds of the progression calendars.
3273 FOR v_spc_rec IN c_spc1 (
3274 v_st_rec.person_id,
3275 v_st_rec.course_cd) LOOP
3276 -- igs_pr_get_within_appl validates that the current course_cd version_number lies
3277 -- is in the bounds of the current progression calendar.
3278 -- If they do not qualify then do not update the plsql
3279 -- table with progression calendar for which rules have to be applied
3280 IF IGS_PR_GEN_006.IGS_PR_get_within_appl (
3281 v_spc_rec.prg_cal_type,
3282 v_spc_rec.prg_ci_sequence_number,
3283 v_st_rec.course_cd,
3284 v_st_rec.version_number,
3285 cst_todo,
3286 v_start_dt,
3287 v_cutoff_dt) = 'Y' THEN
3288 -- Check if progression calendar is already in the PL/SQL table
3289 v_ci_found := FALSE;
3290 v_index := 0;
3291 WHILE v_index < v_ci_index AND
3292 NOT v_ci_found LOOP
3293 v_index := v_index + 1;
3294 IF v_ci_table(v_index).cal_type = v_spc_rec.prg_cal_type AND
3295 v_ci_table(v_index).sequence_number =
3296 v_spc_rec.prg_ci_sequence_number THEN
3297 v_ci_found := TRUE;
3298 END IF;
3299 END LOOP;
3300 IF NOT v_ci_found THEN
3301 -- Store the progression calendar in the PL/SQL table
3302 v_ci_index := v_ci_index + 1;
3303 v_ci_table(v_ci_index).cal_type := v_spc_rec.prg_cal_type;
3304 v_ci_table(v_ci_index).sequence_number :=
3305 v_spc_rec.prg_ci_sequence_number;
3306 END IF;
3307 END IF;
3308 END LOOP; -- c_spc1
3309 ELSE
3310 -- Process all progression calendars which start after the calendar start date
3311 -- Unit amendment ; re-check rules within progression calendars that are
3312 -- in any way related to the teaching calendar
3313 FOR v_spc_rec IN c_spc2 (
3314 v_str_rec.cal_type,
3315 v_str_rec.ci_sequence_number,
3316 v_st_rec.person_id,
3317 v_st_rec.course_cd) LOOP
3318
3319 IF IGS_PR_GEN_006.IGS_PR_get_within_appl (
3320 v_spc_rec.prg_cal_type,
3321 v_spc_rec.prg_ci_sequence_number,
3322 v_st_rec.course_cd,
3323 v_st_rec.version_number,
3324 cst_todo,
3325 v_start_dt,
3326 v_cutoff_dt) = 'Y' THEN
3327
3328 -- Check if progression calendar is already in the PL/SQL table
3329 v_ci_found := FALSE;
3330 v_index := 0;
3331 WHILE v_index < v_ci_index AND
3332 NOT v_ci_found LOOP
3333 v_index := v_index + 1;
3334 IF v_ci_table(v_index).cal_type = v_spc_rec.prg_cal_type AND
3335 v_ci_table(v_index).sequence_number =
3336 v_spc_rec.prg_ci_sequence_number THEN
3337 v_ci_found := TRUE;
3338 END IF;
3339 END LOOP;
3340 IF NOT v_ci_found THEN
3341 -- Store the progression calendar in the PL/SQL table
3342 v_ci_index := v_ci_index + 1;
3343 v_ci_table(v_ci_index).cal_type := v_spc_rec.prg_cal_type;
3344 v_ci_table(v_ci_index).sequence_number :=
3345 v_spc_rec.prg_ci_sequence_number;
3346 END IF;
3347 END IF;
3348 END LOOP; -- c_spc2
3349 END IF;
3350 -- Logically delete the str record
3351 /* UPDATE IGS_PE_STD_TODO_REF
3352 SET logical_delete_dt = SYSDATE
3353 WHERE CURRENT OF c_str;
3354 */
3355 --
3356 -- kdande; 23-Apr-2003; Bug# 2829262
3357 -- Added uoo_id parameter to the
3358 -- igs_pe_std_todo_ref_pkg.update_row PROCEDURE call
3359 --
3360 igs_pe_std_todo_ref_pkg.update_row (
3361 x_rowid => v_str_rec.ROWID,
3362 x_person_id => v_str_rec.person_id,
3363 x_s_student_todo_type => v_str_rec.s_student_todo_type,
3364 x_sequence_number => v_str_rec.sequence_number,
3365 x_reference_number => v_str_rec.reference_number,
3366 x_cal_type => v_str_rec.cal_type,
3367 x_ci_sequence_number => v_str_rec.ci_sequence_number,
3368 x_course_cd => v_str_rec.course_cd,
3369 x_unit_cd => v_str_rec.unit_cd,
3370 x_other_reference => v_str_rec.other_reference,
3371 x_logical_delete_dt => SYSDATE,
3372 x_mode => 'R',
3373 x_uoo_id => v_str_rec.uoo_id
3374 );
3375 -- **** NEED TO INSERT CHECK FOR LOCKING ON THIS UPDATE...
3376 END LOOP; -- c_str
3377 END IF;
3378 -- Process the distinct progression calendars in the PL/SQL table
3379 FOR v_index IN 1..v_ci_index LOOP
3380
3381 IGS_PR_GEN_004.IGS_PR_upd_sca_apply (
3382 v_st_rec.person_id,
3383 v_st_rec.course_cd,
3384 v_ci_table(v_index).cal_type,
3385 v_ci_table(v_index).sequence_number,
3386 cst_todo,
3387 v_log_creation_dt,
3388 v_recommended_outcomes,
3389 v_approved_outcomes,
3390 v_removed_outcomes,
3391 v_message_name);
3392 END LOOP; -- PL/SQL table
3393 OPEN c_str_chk( v_st_rec.person_id,
3394 v_st_rec.s_student_todo_type,
3395 v_st_rec.sequence_number);
3396 FETCH c_str_chk INTO v_dummy;
3397 IF c_str_chk%NOTFOUND THEN
3398 OPEN c_st_lck ( v_st_rec.person_id,
3399 v_st_rec.s_student_todo_type,
3400 v_st_rec.sequence_number);
3401 FETCH c_st_lck INTO v_st_lck_rec;
3402 -- Logically delete the st record
3403 /*
3404 UPDATE IGS_PE_STD_TODO
3405 SET logical_delete_dt = SYSDATE
3406 WHERE CURRENT OF c_st_lck;
3407 */
3408 IGS_PE_STD_TODO_PKG.UPDATE_ROW(
3409 X_ROWID => v_st_lck_rec.ROWID,
3410 X_PERSON_ID => v_st_lck_rec.PERSON_ID,
3411 X_S_STUDENT_TODO_TYPE => v_st_lck_rec.S_STUDENT_TODO_TYPE,
3412 X_SEQUENCE_NUMBER => v_st_lck_rec.SEQUENCE_NUMBER,
3413 X_TODO_DT => v_st_lck_rec.TODO_DT,
3414 X_LOGICAL_DELETE_DT => SYSDATE,
3415 X_MODE => 'R'
3416 );
3417
3418 -- **** NEED TO INSERT CHECK FOR LOCKING ON THIS UPDATE...
3419 CLOSE c_st_lck;
3420 END IF;
3421 CLOSE c_str_chk;
3422 END LOOP; -- c_st
3423 EXCEPTION
3424 WHEN OTHERS THEN
3425 IF c_st%ISOPEN THEN
3426 CLOSE c_st;
3427 END IF;
3428 IF c_str%ISOPEN THEN
3429 CLOSE c_str;
3430 END IF;
3431 IF c_crv%ISOPEN THEN
3432 CLOSE c_crv;
3433 END IF;
3434 IF c_spc1%ISOPEN THEN
3435 CLOSE c_spc1;
3436 END IF;
3437 IF c_spc2%ISOPEN THEN
3438 CLOSE c_spc2;
3439 END IF;
3440 IF c_str_chk%ISOPEN THEN
3441 CLOSE c_str_chk;
3442 END IF;
3443 IF c_st_lck%ISOPEN THEN
3444 CLOSE c_st_lck;
3445 END IF;
3446 RAISE;
3447 END;
3448 EXCEPTION
3449 WHEN OTHERS THEN
3450 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
3451 FND_MESSAGE.SET_TOKEN('NAME','IGS_PR_GEN_004.IGS_PR_UPD_RULE_APPLY.PRGPL_UPD_TODO_APPL');
3452 IGS_GE_MSG_STACK.ADD;
3453 App_Exception.Raise_Exception;
3454 END prgpl_upd_todo_appl;
3455 BEGIN
3456 -- Generate a log entry
3457 v_key :=
3458 p_prg_cal_type || '|' || TO_CHAR (p_prg_sequence_number) || '|' ||
3459 p_course_type || '|' || p_org_unit_cd || '|' || igs_ge_date.igschardt (p_ou_start_dt) || '|' ||
3460 p_course_cd || '|' || p_location_cd || '|' || p_attendance_mode || '|' ||
3461 p_progression_status || '|' || p_enrolment_cat || '|' || TO_CHAR (p_group_id) || '|' || p_processing_type;
3462 --
3463 igs_ge_gen_003.genp_ins_log (cst_prg_appl, v_key, v_log_creation_dt);
3464 p_log_creation_dt := v_log_creation_dt;
3465 --
3466 IF p_processing_type IN (cst_initial, cst_both) THEN
3467 -- Select progression calendars to be processed
3468 FOR v_ci_rec IN c_ci LOOP
3469 prgpl_upd_initial_appl (
3470 v_ci_rec.cal_type,
3471 v_ci_rec.sequence_number
3472 );
3473 END LOOP;
3474 END IF;
3475 --
3476 IF p_processing_type IN (cst_todo, cst_both) THEN
3477 IF p_prg_cal_type IS NULL THEN
3478 -- Process Todo Entries - only if progression calendar is not set, as
3479 -- limiting todo processing to a single calendar is non-sensical.
3480 prgpl_upd_todo_appl;
3481 ELSE
3482 NULL;
3483 END IF;
3484 END IF;
3485 -- Details are always committed.
3486 COMMIT;
3487 EXCEPTION
3488 WHEN OTHERS THEN
3489 IF c_ci%ISOPEN THEN
3490 CLOSE c_ci;
3491 END IF;
3492
3493 RAISE;
3494 END;
3495 EXCEPTION
3496 WHEN OTHERS THEN
3497 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
3498 FND_MESSAGE.SET_TOKEN('NAME','IGS_PR_GEN_004.IGS_PR_UPD_RULE_APPLY');
3499 IGS_GE_MSG_STACK.ADD;
3500 App_Exception.Raise_Exception;
3501 END IGS_PR_upd_rule_apply;
3502
3503 PROCEDURE IGS_PR_upd_sca_apply
3504 (
3505 p_person_id IN NUMBER,
3506 p_course_cd IN VARCHAR2,
3507 p_prg_cal_type IN VARCHAR2,
3508 p_prg_sequence_number IN NUMBER,
3509 p_application_type IN VARCHAR2,
3510 p_log_creation_dt IN DATE ,
3511 p_recommended_outcomes IN OUT NOCOPY NUMBER,
3512 p_approved_outcomes IN OUT NOCOPY NUMBER,
3513 p_removed_outcomes IN OUT NOCOPY NUMBER,
3514 p_message_name OUT NOCOPY VARCHAR2
3515 )
3516 IS
3517 gv_other_detail VARCHAR2(255);
3518 BEGIN -- IGS_PR_upd_sca_apply
3519 -- Apply rules for a single course attempt in a nominated progression calendar
3520 DECLARE
3521 cst_eb CONSTANT VARCHAR2(2) := 'EB';
3522 cst_ep CONSTANT VARCHAR2(2) := 'EP';
3523 cst_sa CONSTANT VARCHAR2(2) := 'SA';
3524 cst_initial CONSTANT VARCHAR2(10) := 'INITIAL';
3525 cst_system CONSTANT VARCHAR2(10) := 'SYSTEM';
3526 cst_todo CONSTANT VARCHAR2(10) := 'TODO';
3527 cst_finalised CONSTANT VARCHAR2(10) := 'FINALISED';
3528 cst_manual CONSTANT VARCHAR2(10) := 'MANUAL';
3529 cst_missing CONSTANT VARCHAR2(10) := 'MISSING';
3530 cst_none CONSTANT VARCHAR2(10) := 'NONE';
3531 cst_passed CONSTANT VARCHAR2(10) := 'PASSED';
3532 cst_nochange CONSTANT VARCHAR2(10) := 'NO-CHANGE';
3533 cst_no_load CONSTANT VARCHAR2(10) := 'NO-LOAD';
3534 cst_recommend CONSTANT VARCHAR2(10) := 'RECOMMEND';
3535 cst_rec_outcome CONSTANT VARCHAR2(15) := 'REC-OUTCOME';
3536 cst_apr_outcome CONSTANT VARCHAR2(15) := 'APR-OUTCOME';
3537 cst_del_outcome CONSTANT VARCHAR2(15) := 'DEL-OUTCOME';
3538 cst_past_ben CONSTANT VARCHAR2(10) := 'PAST-BEN';
3539 cst_past_pen CONSTANT VARCHAR2(10) := 'PAST-PEN';
3540 cst_un_noexist CONSTANT VARCHAR2(10) := 'UN-NOEXIST';
3541 cst_completed CONSTANT VARCHAR2(10) := 'COMPLETED';
3542 cst_unconfirm CONSTANT VARCHAR2(10) := 'UNCONFIRM';
3543 v_rule_check_dt DATE DEFAULT SYSDATE;
3544 v_rolled_back BOOLEAN DEFAULT FALSE;
3545 v_sprc_insert_count INTEGER DEFAULT 0;
3546 v_sca_version_number IGS_EN_STDNT_PS_ATT.version_number%TYPE;
3547 v_course_type IGS_PS_VER.course_type%TYPE;
3548 v_message_text IGS_RU_ITEM.value%TYPE;
3549 v_start_dt DATE;
3550 v_result_status VARCHAR2(10);
3551 v_course_attempt_status IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE;
3552 v_dummy VARCHAR2(1);
3553 v_rules_applicable BOOLEAN DEFAULT FALSE;
3554 v_all_rules_passed BOOLEAN DEFAULT TRUE;
3555 v_rec_outcomes_applied BOOLEAN DEFAULT FALSE;
3556 v_auto_outcomes_applied BOOLEAN DEFAULT FALSE;
3557 v_no_applicable_outcomes BOOLEAN DEFAULT TRUE;
3558 v_beyond_penalty BOOLEAN DEFAULT FALSE;
3559 v_beyond_benefit BOOLEAN DEFAULT FALSE;
3560 v_rules_altered BOOLEAN DEFAULT FALSE;
3561 v_outcomes_removed BOOLEAN DEFAULT FALSE;
3562 v_apply_start_dt_alias IGS_PR_S_PRG_CONF.apply_start_dt_alias%TYPE;
3563 v_apply_end_dt_alias IGS_PR_S_PRG_CONF.apply_end_dt_alias%TYPE;
3564 v_end_benefit_dt_alias IGS_PR_S_PRG_CONF.end_benefit_dt_alias%TYPE;
3565 v_end_penalty_dt_alias IGS_PR_S_PRG_CONF.end_penalty_dt_alias%TYPE;
3566 v_show_cause_cutoff_dt_alias IGS_PR_S_PRG_CONF.show_cause_cutoff_dt_alias%TYPE;
3567 v_appeal_cutoff_dt_alias IGS_PR_S_PRG_CONF.appeal_cutoff_dt_alias%TYPE;
3568 v_show_cause_ind IGS_PR_S_PRG_CONF.show_cause_ind%TYPE;
3569 v_apply_before_show_ind IGS_PR_S_PRG_CONF.apply_before_show_ind%TYPE;
3570 v_appeal_ind IGS_PR_S_PRG_CONF.appeal_ind%TYPE;
3571 v_apply_before_appeal_ind IGS_PR_S_PRG_CONF.apply_before_appeal_ind%TYPE;
3572 v_count_sus_in_time_ind IGS_PR_S_PRG_CONF.count_sus_in_time_ind%TYPE;
3573 v_count_exc_in_time_ind IGS_PR_S_PRG_CONF.count_exc_in_time_ind%TYPE;
3574 v_calculate_wam_ind IGS_PR_S_PRG_CONF.calculate_wam_ind%TYPE;
3575 v_calculate_gpa_ind IGS_PR_S_PRG_CONF.calculate_gpa_ind%TYPE;
3576 v_outcome_check_type IGS_PR_S_PRG_CONF.outcome_check_type%TYPE;
3577
3578 CURSOR c_sca_crv IS
3579 SELECT sca.course_attempt_status,
3580 sca.version_number,
3581 crv.course_type
3582 FROM IGS_EN_STDNT_PS_ATT sca,
3583 IGS_PS_VER crv
3584 WHERE sca.person_id = p_person_id AND
3585 sca.course_cd = p_course_cd AND
3586 crv.course_cd = sca.course_cd AND
3587 crv.version_number = sca.version_number;
3588
3589 PROCEDURE prgpl_ins_log_entry (
3590 p_record_type VARCHAR2,
3591 p_progression_rule_cat IGS_PR_RU_APPL.progression_rule_cat%TYPE,
3592 p_pra_sequence_number IGS_PR_RU_APPL.sequence_number%TYPE,
3593 p_spo_sequence_number IGS_PR_STDNT_PR_OU.sequence_number%TYPE,
3594 p_progression_rule_cd IGS_PR_RU_APPL.progression_rule_cd%TYPE,
3595 p_reference_cd IGS_PR_RU_APPL.reference_cd%TYPE,
3596 p_progression_outcome_type
3597 IGS_PR_OU_TYPE.progression_outcome_type%TYPE,
3598 p_unit_cd IGS_PS_UNIT_VER.unit_cd%TYPE)
3599 IS
3600 BEGIN -- prgpl_ins_log_entry
3601 -- create a log entry
3602 DECLARE
3603 cst_prg_appl CONSTANT VARCHAR2(10) := 'PRG-APPL';
3604 v_key IGS_GE_s_log_entry.KEY%TYPE;
3605 v_text IGS_GE_s_log_entry.text%TYPE DEFAULT NULL;
3606 BEGIN
3607 v_key :=
3608 p_record_type || '|' ||
3609 TO_CHAR(p_person_id) || '|' ||
3610 p_course_cd || '|' ||
3611 p_prg_cal_type || '|' ||
3612 TO_CHAR(p_prg_sequence_number) || '|' ||
3613 p_application_type;
3614 IF p_record_type IN (
3615 cst_passed,
3616 cst_no_load) THEN
3617 v_text := NULL;
3618 ELSIF p_record_type IN (
3619 cst_rec_outcome,
3620 cst_apr_outcome,
3621 cst_del_outcome) THEN
3622 v_text :=
3623 p_progression_rule_cat || '|' ||
3624 p_progression_rule_cd || '|' ||
3625 p_reference_cd || '|' ||
3626 TO_CHAR(p_pra_sequence_number) || '|' ||
3627 TO_CHAR(p_spo_sequence_number) || '|' ||
3628 p_progression_outcome_type;
3629 ELSIF p_record_type IN (
3630 cst_past_ben,
3631 cst_past_pen) THEN
3632 v_text :=
3633 p_progression_rule_cat || '|' ||
3634 p_progression_rule_cd || '|' ||
3635 p_reference_cd || '|' ||
3636 TO_CHAR(p_pra_sequence_number) || '|' ||
3637 TO_CHAR(p_spo_sequence_number);
3638 ELSIF p_record_type IN (
3639 cst_un_noexist) THEN
3640 v_text :=
3641 p_progression_rule_cat || '|' ||
3642 p_progression_rule_cd || '|' ||
3643 p_reference_cd || '|' ||
3644 TO_CHAR(p_pra_sequence_number) || '|' ||
3645 TO_CHAR(p_spo_sequence_number) || '|' ||
3646 p_progression_outcome_type || '|' ||
3647 p_unit_cd;
3648 END IF;
3649 IGS_GE_GEN_003.GENP_INS_LOG_ENTRY (
3650 cst_prg_appl,
3651 p_log_creation_dt,
3652 v_key,
3653 NULL,
3654 v_text);
3655 END;
3656 EXCEPTION
3657 WHEN OTHERS THEN
3658 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
3659 FND_MESSAGE.SET_TOKEN('NAME','IGS_PR_GEN_004.IGS_PR_UPD_SCA_APPLY.PRGPL_INS_LOG_ENTRY');
3660 IGS_GE_MSG_STACK.ADD;
3661 App_Exception.Raise_Exception;
3662 END prgpl_ins_log_entry;
3663
3664
3665
3666 PROCEDURE prgpl_add_stdnt_prg_outcomes (
3667 p_progression_rule_cat IGS_PR_RU_APPL.progression_rule_cat%TYPE,
3668 p_pra_sequence_number IGS_PR_RU_APPL.sequence_number%TYPE,
3669 p_original_pra_sequence_number IGS_PR_RU_APPL.sequence_number%TYPE,
3670 p_pro_sequence_number IGS_PR_RU_OU.sequence_number%TYPE,
3671 p_apply_automatically_ind IGS_PR_RU_OU.apply_automatically_ind%TYPE,
3672 p_sca_version_number IGS_EN_STDNT_PS_ATT.version_number%TYPE,
3673 p_rule_check_dt DATE,
3674 p_progression_outcome_type IGS_PR_STDNT_PR_OU.progression_outcome_type%TYPE,
3675 p_duration IGS_PR_STDNT_PR_OU.duration%TYPE,
3676 p_duration_type IGS_PR_STDNT_PR_OU.duration_type%TYPE,
3677 p_encmb_course_group_cd IGS_PR_STDNT_PR_OU.encmb_course_group_cd%TYPE,
3678 p_restricted_enrolment_cp IGS_PR_STDNT_PR_OU.restricted_enrolment_cp%TYPE,
3679 p_restricted_attendance_type IGS_PR_STDNT_PR_OU.restricted_attendance_type%TYPE,
3680 p_progression_rule_cd IGS_PR_RU_APPL.progression_rule_cd%TYPE,
3681 p_reference_cd IGS_PR_RU_APPL.reference_cd%TYPE)
3682 IS
3683 BEGIN -- prgpl_add_stdnt_prg_outcomes
3684 DECLARE
3685 cst_approved CONSTANT VARCHAR2(10) := 'APPROVED';
3686 cst_pending CONSTANT VARCHAR2(10) := 'PENDING';
3687 cst_suspension CONSTANT VARCHAR2(10) := 'SUSPENSION';
3688 cst_exclusion CONSTANT VARCHAR2(10) := 'EXCLUSION';
3689 cst_sus_course CONSTANT VARCHAR2(10) := 'SUS_COURSE';
3690 cst_exc_course CONSTANT VARCHAR2(10) := 'EXC_COURSE';
3691 cst_pro CONSTANT VARCHAR2(10) := 'PRO';
3692 cst_active CONSTANT VARCHAR2(10) := 'ACTIVE';
3693 v_spo_sequence_number INTEGER;
3694 v_new_pra_sequence_number IGS_PR_RU_APPL.sequence_number%TYPE;
3695 v_decision_status IGS_PR_STDNT_PR_OU_ALL.DECISION_STATUS%TYPE;
3696 v_decision_org_unit_cd IGS_OR_unit.org_unit_cd%TYPE;
3697 v_decision_ou_start_dt IGS_OR_unit.start_dt%TYPE;
3698 v_decision_dt IGS_PR_STDNT_PR_OU_ALL.DECISION_DT%TYPE;
3699 v_show_cause_expiry_dt IGS_PR_STDNT_PR_OU_ALL.SHOW_CAUSE_EXPIRY_DT%TYPE;
3700 v_appeal_expiry_dt IGS_PR_STDNT_PR_OU_ALL.APPEAL_EXPIRY_DT%TYPE;
3701 v_poc_rec_found BOOLEAN DEFAULT FALSE;
3702 v_message_name VARCHAR2(30);
3703 v_dummy VARCHAR2(1);
3704
3705 CURSOR c_spo IS
3706 SELECT IGS_PR_SPO_SEQ_NUM_S.NEXTVAL
3707 FROM DUAL;
3708
3709 CURSOR c_crv IS
3710 SELECT crv.responsible_org_unit_cd,
3711 crv.responsible_ou_start_dt
3712 FROM IGS_PS_VER crv
3713 WHERE crv.course_cd = p_course_cd AND
3714 crv.version_number = p_sca_version_number;
3715 CURSOR c_poc IS
3716 SELECT poc.course_cd
3717 FROM IGS_PR_OU_PS poc
3718 WHERE poc.progression_rule_cat = p_progression_rule_cat AND
3719 poc.pra_sequence_number = p_original_pra_sequence_number AND
3720 poc.pro_sequence_number = p_pro_sequence_number;
3721 CURSOR c_pot_etde IS
3722 SELECT 'X'
3723 FROM IGS_PR_OU_TYPE pot,
3724 IGS_FI_ENC_DFLT_EFT etde
3725 WHERE pot.progression_outcome_type = p_progression_outcome_type AND
3726 pot.s_progression_outcome_type IN (
3727 cst_suspension,
3728 cst_exclusion) AND
3729 pot.encumbrance_type = etde.encumbrance_type AND
3730 etde.s_encmb_effect_type IN (
3731 cst_sus_course,
3732 cst_exc_course);
3733 CURSOR c_popu IS
3734 SELECT popu.unit_cd,
3735 popu.s_unit_type
3736 FROM IGS_PR_OU_UNIT popu
3737 WHERE popu.progression_rule_cat = p_progression_rule_cat AND
3738 popu.pra_sequence_number = p_original_pra_sequence_number AND
3739 popu.pro_sequence_number = p_pro_sequence_number;
3740
3741
3742 CURSOR c_pous IS
3743 SELECT pous.unit_set_cd,
3744 pous.us_version_number
3745 FROM IGS_PR_OU_UNIT_SET pous
3746 WHERE pous.progression_rule_cat = p_progression_rule_cat AND
3747 pous.pra_sequence_number = p_original_pra_sequence_number AND
3748 pous.pro_sequence_number = p_pro_sequence_number;
3749
3750 CURSOR c_poa IS
3751 SELECT poa.award_cd
3752 FROM IGS_PR_OU_AWD poa
3753 WHERE poa.progression_rule_cat = p_progression_rule_cat AND
3754 poa.pra_sequence_number = p_original_pra_sequence_number AND
3755 poa.pro_sequence_number = p_pro_sequence_number;
3756
3757 --
3758 -- Start of new code added as per the FA110 PR Enh. Bug# 2658550.
3759 --
3760 CURSOR c_pfnd IS
3761 SELECT pfnd.fund_code
3762 FROM IGS_PR_OU_FND pfnd
3763 WHERE pfnd.progression_rule_cat = p_progression_rule_cat AND
3764 pfnd.pra_sequence_number = p_original_pra_sequence_number AND
3765 pfnd.pro_sequence_number = p_pro_sequence_number;
3766 --
3767 -- End of new code added as per the FA110 PR Enh. Bug# 2658550.
3768 --
3769
3770 CURSOR c_pra IS
3771 SELECT pra.progression_rule_cat,
3772 pra.sequence_number
3773 FROM IGS_PR_RU_APPL pra
3774 WHERE pra.s_relation_type = cst_pro AND
3775 pra.pro_pra_sequence_number = p_original_pra_sequence_number AND
3776 pra.pro_sequence_number = p_pro_sequence_number AND
3777 pra.logical_delete_dt IS NULL;
3778 CURSOR c_uv (
3779 cp_unit_cd IGS_PS_UNIT_VER.unit_cd%TYPE) IS
3780 SELECT 'X'
3781 FROM IGS_PS_UNIT_VER uv,
3782 IGS_PS_UNIT_STAT us
3783 WHERE uv.unit_cd = cp_unit_cd AND
3784 uv.expiry_dt IS NULL AND
3785 us.unit_status = uv.unit_status AND
3786 us.s_unit_status = cst_active;
3787 BEGIN
3788 OPEN c_spo;
3789 FETCH c_spo INTO v_spo_sequence_number;
3790 CLOSE c_spo;
3791 -- If the outcome is applied automatically then derive the necessary fields
3792 IF p_apply_automatically_ind = 'Y' THEN
3793 v_decision_status := cst_approved;
3794 -- Use the responsible OU of the course version for automatic approval.
3795 OPEN c_crv;
3796 FETCH c_crv INTO
3797 v_decision_org_unit_cd,
3798 v_decision_ou_start_dt;
3799 CLOSE c_crv;
3800 v_decision_dt := TRUNC(SYSDATE);
3801 -- Get the show cause expiry date (routine will return NULL if not
3802 -- applicable).
3803 v_show_cause_expiry_dt := IGS_PR_GEN_005.IGS_PR_clc_cause_expry (
3804 p_course_cd,
3805 p_sca_version_number,
3806 p_prg_cal_type,
3807 p_prg_sequence_number,
3808 p_progression_rule_cat,
3809 p_pra_sequence_number,
3810 p_pro_sequence_number);
3811 -- Get the appeal expiry date (routine will return NULL if not applicable).
3812 v_appeal_expiry_dt := IGS_PR_GEN_005.IGS_PR_clc_apl_expry (
3813 p_course_cd,
3814 p_sca_version_number,
3815 p_prg_cal_type,
3816 p_prg_sequence_number,
3817 p_progression_rule_cat,
3818 p_pra_sequence_number,
3819 p_pro_sequence_number);
3820 ELSE
3821 v_decision_status := cst_pending;
3822 v_decision_org_unit_cd := NULL;
3823 v_decision_ou_start_dt := NULL;
3824 v_decision_dt := NULL;
3825 v_show_cause_expiry_dt := NULL;
3826 v_appeal_expiry_dt := NULL;
3827 END IF;
3828 DECLARE
3829 lv_rowid VARCHAR2(25);
3830 lv_org_id NUMBER(15);
3831 BEGIN
3832 lv_org_id := igs_ge_gen_003.get_org_id;
3833 igs_pr_stdnt_pr_ou_pkg.insert_row (
3834 x_rowid => lv_rowid,
3835 x_person_id => p_person_id,
3836 x_course_cd => p_course_cd,
3837 x_sequence_number => v_spo_sequence_number,
3838 x_prg_cal_type => p_prg_cal_type,
3839 x_prg_ci_sequence_number => p_prg_sequence_number,
3840 x_rule_check_dt => p_rule_check_dt,
3841 x_progression_rule_cat => p_progression_rule_cat,
3842 x_pra_sequence_number => p_pra_sequence_number,
3843 x_pro_sequence_number => p_pro_sequence_number,
3844 x_progression_outcome_type => p_progression_outcome_type,
3845 x_duration => p_duration,
3846 x_duration_type => p_duration_type,
3847 x_decision_status => v_decision_status,
3848 x_decision_dt => v_decision_dt,
3849 x_decision_org_unit_cd => v_decision_org_unit_cd,
3850 x_decision_ou_start_dt => v_decision_ou_start_dt,
3851 x_applied_dt => v_appeal_expiry_dt,
3852 x_show_cause_expiry_dt => v_show_cause_expiry_dt,
3853 x_show_cause_dt => NULL,
3854 x_show_cause_outcome_dt => NULL,
3855 x_show_cause_outcome_type => NULL,
3856 x_appeal_expiry_dt => v_appeal_expiry_dt,
3857 x_appeal_dt => NULL,
3858 x_appeal_outcome_dt => NULL,
3859 x_appeal_outcome_type => NULL,
3860 x_encmb_course_group_cd => p_encmb_course_group_cd,
3861 x_restricted_enrolment_cp => p_restricted_enrolment_cp,
3862 x_restricted_attendance_type => p_restricted_attendance_type,
3863 x_comments => NULL,
3864 x_show_cause_comments => NULL,
3865 x_appeal_comments => NULL,
3866 x_expiry_dt => NULL,
3867 x_pro_pra_sequence_number => p_original_pra_sequence_number, --NULL, -- Modified by Prajeesh as no value was passed and primary key violation happening
3868 x_mode => 'R',
3869 x_org_id => lv_org_id
3870 );
3871 END;
3872 -- Copy progression outcome course details from the outcome.
3873 FOR v_poc_rec IN c_poc LOOP
3874 v_poc_rec_found := TRUE;
3875 DECLARE
3876 LV_ROWID VARCHAR2(25);
3877 BEGIN
3878 IGS_PR_STDNT_PR_PS_PKG.INSERT_ROW (
3879 X_ROWID =>LV_ROWID,
3880 X_PERSON_ID =>p_person_id,
3881 X_SPO_COURSE_CD => p_course_cd,
3882 X_SPO_SEQUENCE_NUMBER => v_spo_sequence_number,
3883 X_COURSE_CD =>v_poc_rec.course_cd,
3884 X_MODE =>'R');
3885 END;
3886 END LOOP;
3887
3888
3889 IF NOT v_poc_rec_found THEN
3890 OPEN c_pot_etde;
3891 FETCH c_pot_etde INTO v_dummy;
3892 IF c_pot_etde%FOUND THEN
3893 CLOSE c_pot_etde;
3894 -- If no courses specified then default the exclusion or suspension to
3895 -- the enrolled course
3896 DECLARE
3897 LV_ROWID VARCHAR2(25);
3898 BEGIN
3899 IGS_PR_STDNT_PR_PS_PKG.INSERT_ROW (
3900 X_ROWID =>LV_ROWID,
3901 X_PERSON_ID =>p_person_id,
3902 X_SPO_COURSE_CD => p_course_cd,
3903 X_SPO_SEQUENCE_NUMBER => v_spo_sequence_number,
3904 X_COURSE_CD => p_course_cd,
3905 X_MODE =>'R'
3906 );
3907 END;
3908 ELSE
3909 CLOSE c_pot_etde;
3910 END IF;
3911 END IF;
3912
3913
3914 FOR v_popu_rec IN c_popu LOOP
3915 -- Check that an offered version of the unit exists. If not, skip the unit
3916 -- and report an exception
3917 OPEN c_uv (v_popu_rec.unit_cd);
3918 FETCH c_uv INTO v_dummy;
3919 IF c_uv%FOUND THEN
3920 CLOSE c_uv;
3921 DECLARE
3922 LV_ROWID VARCHAR2(25);
3923 BEGIN
3924 IGS_PR_STDNT_PR_UNIT_PKG.INSERT_ROW (
3925 X_ROWID =>LV_ROWID,
3926 X_PERSON_ID =>p_person_id,
3927 X_COURSE_CD =>p_course_cd,
3928 X_SPO_SEQUENCE_NUMBER =>v_spo_sequence_number,
3929 X_UNIT_CD => v_popu_rec.unit_cd,
3930 X_S_UNIT_TYPE => v_popu_rec.s_unit_type,
3931 X_MODE =>'R'
3932 );
3933 END;
3934 ELSE
3935 CLOSE c_uv;
3936 IF p_log_creation_dt IS NOT NULL THEN
3937 prgpl_ins_log_entry (
3938 cst_un_noexist,
3939 p_progression_rule_cat,
3940 p_pra_sequence_number,
3941 v_spo_sequence_number,
3942 p_progression_rule_cd,
3943 p_reference_cd,
3944 p_progression_outcome_type,
3945 v_popu_rec.unit_cd);
3946 END IF;
3947 END IF;
3948 END LOOP;
3949
3950
3951 -- Copy unit set records down from the outcome.
3952 FOR v_pous_rec IN c_pous LOOP
3953 DECLARE
3954 LV_ROWID VARCHAR2(25);
3955 BEGIN
3956 IGS_PR_SDT_PR_UNT_ST_PKG.INSERT_ROW (
3957 X_ROWID =>lv_rowid,
3958 X_PERSON_ID => p_person_id,
3959 X_COURSE_CD => P_COURSE_CD,
3960 X_SPO_SEQUENCE_NUMBER =>v_spo_sequence_number,
3961 X_UNIT_SET_CD =>v_pous_rec.unit_set_cd,
3962 X_VERSION_NUMBER =>v_pous_rec.us_version_number,
3963 X_MODE => 'R'
3964 );
3965 END;
3966 END LOOP;
3967
3968
3969 -- Copy award records down from the outcome.
3970 FOR v_poa_rec IN c_poa LOOP
3971 DECLARE
3972 LV_ROWID VARCHAR2(25);
3973 BEGIN
3974 IGS_PR_STDNT_PR_AWD_PKG.INSERT_ROW (
3975 X_ROWID =>lv_rowid,
3976 X_PERSON_ID => p_person_id,
3977 X_COURSE_CD => P_COURSE_CD,
3978 X_SPO_SEQUENCE_NUMBER =>v_spo_sequence_number,
3979 X_AWARD_CD =>v_poa_rec.AWARD_cd,
3980 X_MODE => 'R'
3981 );
3982 END;
3983 END LOOP;
3984
3985 -- Copy Fund records down from the outcome.
3986 FOR v_pfnd_rec IN c_pfnd LOOP
3987 DECLARE
3988 lv_rowid VARCHAR2(25);
3989 BEGIN
3990 igs_pr_stdnt_pr_fnd_pkg.insert_row (
3991 X_ROWID =>lv_rowid,
3992 X_PERSON_ID => p_person_id,
3993 X_COURSE_CD => p_course_cd,
3994 X_SPO_SEQUENCE_NUMBER => v_spo_sequence_number,
3995 X_FUND_CODE => v_pfnd_rec.fund_code,
3996 X_MODE => 'R'
3997 );
3998 END;
3999 END LOOP;
4000
4001
4002 -- Copy any PRO level rules to SPO level.
4003 FOR v_pra_rec IN c_pra LOOP
4004 v_new_pra_sequence_number := IGS_PR_GEN_006.IGS_PR_ins_copy_pra (
4005 v_pra_rec.progression_rule_cat,
4006 v_pra_rec.sequence_number,
4007 NULL,
4008 NULL,
4009 NULL,
4010 NULL,
4011 p_person_id,
4012 p_course_cd,
4013 v_spo_sequence_number,
4014 NULL,
4015 NULL,
4016 v_message_name);
4017 END LOOP;
4018
4019
4020
4021 IF v_decision_status = cst_pending THEN
4022 p_recommended_outcomes := p_recommended_outcomes + 1;
4023 v_rec_outcomes_applied := TRUE;
4024 IF p_log_creation_dt IS NOT NULL THEN
4025 prgpl_ins_log_entry (
4026 cst_rec_outcome,
4027 p_progression_rule_cat,
4028 p_pra_sequence_number,
4029 v_spo_sequence_number,
4030 p_progression_rule_cd,
4031 p_reference_cd,
4032 p_progression_outcome_type,
4033 NULL);
4034 END IF;
4035 ELSE
4036 p_approved_outcomes := p_approved_outcomes + 1;
4037 v_auto_outcomes_applied := TRUE;
4038 IF p_log_creation_dt IS NOT NULL THEN
4039 prgpl_ins_log_entry (
4040 cst_apr_outcome,
4041 p_progression_rule_cat,
4042 p_pra_sequence_number,
4043 v_spo_sequence_number,
4044 p_progression_rule_cd,
4045 p_reference_cd,
4046 p_progression_outcome_type,
4047 NULL);
4048 END IF;
4049 END IF;
4050
4051 RETURN;
4052
4053 EXCEPTION
4054 WHEN OTHERS THEN
4055 IF c_spo%ISOPEN THEN
4056 CLOSE c_spo;
4057 END IF;
4058 IF c_crv%ISOPEN THEN
4059 CLOSE c_crv;
4060 END IF;
4061 IF c_poc%ISOPEN THEN
4062 CLOSE c_poc;
4063 END IF;
4064 IF c_pot_etde%ISOPEN THEN
4065 CLOSE c_pot_etde;
4066 END IF;
4067 IF c_popu%ISOPEN THEN
4068 CLOSE c_popu;
4069 END IF;
4070 IF c_pfnd%ISOPEN THEN
4071 CLOSE c_pfnd;
4072 END IF;
4073 IF c_pous%ISOPEN THEN
4074 CLOSE c_pous;
4075 END IF;
4076 IF c_poa%ISOPEN THEN
4077 CLOSE c_poa;
4078 END IF;
4079 IF c_uv%ISOPEN THEN
4080 CLOSE c_uv;
4081 END IF;
4082 RAISE;
4083 END;
4084 EXCEPTION
4085 WHEN OTHERS THEN
4086 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
4087 FND_MESSAGE.SET_TOKEN('NAME','IGS_PR_GEN_004.IGS_PR_UPD_SCA_APPLY.PRGPL_ADD_STDNT_PRG_OUTCOMES');
4088 IGS_GE_MSG_STACK.ADD;
4089 App_Exception.Raise_Exception;
4090 END prgpl_add_stdnt_prg_outcomes;
4091
4092
4093 PROCEDURE prgpl_create_outcomes (
4094 p_sca_version_number IGS_EN_STDNT_PS_ATT.version_number%TYPE,
4095 p_progression_rule_cat IGS_PR_RU_APPL.progression_rule_cat%TYPE,
4096 p_pra_sequence_number IGS_PR_RU_APPL.sequence_number%TYPE,
4097 p_progression_rule_cd IGS_PR_RU_APPL.progression_rule_cd%TYPE,
4098 p_reference_cd IGS_PR_RU_APPL.reference_cd%TYPE,
4099 p_rule_check_dt DATE)
4100 IS
4101 BEGIN -- prgpl_create_outcomes
4102 DECLARE
4103 cst_consecrpt CONSTANT VARCHAR2(10) := 'CONSECRPT';
4104 cst_repeat CONSTANT VARCHAR2(10) := 'REPEAT';
4105 v_consecutive_failures INTEGER;
4106 v_repeat_failures INTEGER;
4107 v_last_failures INTEGER;
4108 v_praov_count INTEGER DEFAULT 0;
4109 v_consecutive_found BOOLEAN DEFAULT FALSE;
4110 v_repeat_found BOOLEAN DEFAULT FALSE;
4111 v_spo_added BOOLEAN DEFAULT FALSE;
4112 CURSOR c_praov (
4113 cp_consecrpt VARCHAR2,
4114 cp_consecutive_failures IGS_PR_RU_OU.number_of_failures%TYPE)
4115 IS
4116 SELECT praov.sequence_number,
4117 praov.number_of_failures,
4118 praov.progression_outcome_type,
4119 praov.apply_automatically_ind,
4120 praov.prg_rule_repeat_fail_type,
4121 praov.duration,
4122 praov.duration_type,
4123 praov.encmb_course_group_cd,
4124 praov.restricted_enrolment_cp,
4125 praov.restricted_attendance_type,
4126 praov.original_pra_sequence_number
4127 FROM IGS_PR_RULE_OUT_V praov
4128 WHERE praov.progression_rule_cat = p_progression_rule_cat AND
4129 praov.pra_sequence_number = p_pra_sequence_number AND
4130 -- anilk, bug#2784198
4131 praov.logical_delete_dt IS NULL AND
4132 -- this condition has been modifed, when the positive outcome ind
4133 -- was added. For a postive outcome category there will be no
4134 -- rule repeat fail type and number of failure values
4135 -- since there are no failures for a positive outcome.
4136 -- Hence addition check has been added for the above case
4137 -- by checking if the repeat fail type is null and outcome ind = 'Y'
4138 -- otherwise if the repeat fail type is not null then the existing
4139 -- check holds good.
4140 (
4141 (praov.prg_rule_repeat_fail_type IS NOT NULL AND
4142 praov.prg_rule_repeat_fail_type = cp_consecrpt)
4143 OR
4144 (praov.prg_rule_repeat_fail_type IS NULL
4145 AND praov.POSITIVE_OUTCOME_IND = 'Y')
4146 ) AND
4147 NVL(praov.number_of_failures, cp_consecutive_failures) <= cp_consecutive_failures
4148 ORDER BY praov.number_of_failures DESC;
4149 BEGIN
4150 -- The logic in this section will use the record equal or closest to the
4151 -- number of failures by a student. Matches with 'consecutive repeat' records
4152 -- will always take priority. It is not expected that ambiguous mixes of
4153 -- repeat and consecutive repeat records will happen too much in 'REAL life'.
4154 v_consecutive_failures := IGS_PR_GEN_005.IGS_PR_get_num_fail (
4155 p_person_id,
4156 p_course_cd,
4157 p_sca_version_number,
4158 p_progression_rule_cat,
4159 p_pra_sequence_number,
4160 p_prg_cal_type,
4161 p_prg_sequence_number,
4162 cst_consecrpt);
4163 IF v_consecutive_failures <> 0 THEN
4164 FOR v_praov_rec_c IN c_praov (
4165 cst_consecrpt,
4166 v_consecutive_failures) LOOP
4167 v_consecutive_found := TRUE;
4168 v_no_applicable_outcomes := FALSE;
4169 IF v_praov_rec_c.number_of_failures = v_consecutive_failures THEN
4170 prgpl_add_stdnt_prg_outcomes (
4171 p_progression_rule_cat,
4172 p_pra_sequence_number,
4173 v_praov_rec_c.original_pra_sequence_number,
4174 v_praov_rec_c.sequence_number,
4175 v_praov_rec_c.apply_automatically_ind,
4176 p_sca_version_number,
4177 p_rule_check_dt,
4178 v_praov_rec_c.progression_outcome_type,
4179 v_praov_rec_c.duration,
4180 v_praov_rec_c.duration_type,
4181 v_praov_rec_c.encmb_course_group_cd,
4182 v_praov_rec_c.restricted_enrolment_cp,
4183 v_praov_rec_c.restricted_attendance_type,
4184 p_progression_rule_cd,
4185 p_reference_cd);
4186 v_spo_added := TRUE;
4187 END IF;
4188 END LOOP;
4189 IF v_spo_added THEN
4190 RETURN;
4191 END IF;
4192 END IF;
4193 v_repeat_failures := IGS_PR_GEN_005.IGS_PR_get_num_fail (
4194 p_person_id,
4195 p_course_cd,
4196 p_sca_version_number,
4197 p_progression_rule_cat,
4198 p_pra_sequence_number,
4199 p_prg_cal_type,
4200 p_prg_sequence_number,
4201 cst_repeat);
4202 FOR v_praov_rec_r IN c_praov (
4203 cst_repeat,
4204 v_repeat_failures) LOOP
4205 v_repeat_found := TRUE;
4206 v_no_applicable_outcomes := FALSE;
4207 IF v_praov_rec_r.number_of_failures = v_repeat_failures THEN
4208 prgpl_add_stdnt_prg_outcomes (
4209 p_progression_rule_cat,
4210 p_pra_sequence_number,
4211 v_praov_rec_r.original_pra_sequence_number,
4212 v_praov_rec_r.sequence_number,
4213 v_praov_rec_r.apply_automatically_ind,
4214 p_sca_version_number,
4215 p_rule_check_dt,
4216 v_praov_rec_r.progression_outcome_type,
4217 v_praov_rec_r.duration,
4218 v_praov_rec_r.duration_type,
4219 v_praov_rec_r.encmb_course_group_cd,
4220 v_praov_rec_r.restricted_enrolment_cp,
4221 v_praov_rec_r.restricted_attendance_type,
4222 p_progression_rule_cd,
4223 p_reference_cd);
4224 v_spo_added := TRUE;
4225 END IF;
4226 END LOOP;
4227 IF v_spo_added THEN
4228 RETURN;
4229 END IF;
4230 -- Use consecutive failure records in preference to straight repeat records.
4231 IF v_consecutive_failures <> 0 AND
4232 v_consecutive_found THEN
4233 FOR v_praov_rec_c IN c_praov (
4234 cst_consecrpt,
4235 v_consecutive_failures) LOOP
4236 v_praov_count := v_praov_count + 1;
4237 IF v_praov_count > 1 THEN
4238 IF v_last_failures <> v_praov_rec_c.number_of_failures THEN
4239 EXIT;
4240 END IF;
4241 END IF;
4242 v_last_failures := v_praov_rec_c.number_of_failures;
4243 prgpl_add_stdnt_prg_outcomes (
4244 p_progression_rule_cat,
4245 p_pra_sequence_number,
4246 v_praov_rec_c.original_pra_sequence_number,
4247 v_praov_rec_c.sequence_number,
4248 v_praov_rec_c.apply_automatically_ind,
4249 p_sca_version_number,
4250 p_rule_check_dt,
4251 v_praov_rec_c.progression_outcome_type,
4252 v_praov_rec_c.duration,
4253 v_praov_rec_c.duration_type,
4254 v_praov_rec_c.encmb_course_group_cd,
4255 v_praov_rec_c.restricted_enrolment_cp,
4256 v_praov_rec_c.restricted_attendance_type,
4257 p_progression_rule_cd,
4258 p_reference_cd);
4259 END LOOP;
4260 ELSIF v_repeat_found THEN
4261 FOR v_praov_rec_r IN c_praov (
4262 cst_repeat,
4263 v_repeat_failures) LOOP
4264 v_praov_count := v_praov_count + 1;
4265 IF v_praov_count > 1 THEN
4266 IF v_last_failures <> v_praov_rec_r.number_of_failures THEN
4267 EXIT;
4268 END IF;
4269 END IF;
4270 v_last_failures := v_praov_rec_r.number_of_failures;
4271 prgpl_add_stdnt_prg_outcomes (
4272 p_progression_rule_cat,
4273 p_pra_sequence_number,
4274 v_praov_rec_r.original_pra_sequence_number,
4275 v_praov_rec_r.sequence_number,
4276 v_praov_rec_r.apply_automatically_ind,
4277 p_sca_version_number,
4278 p_rule_check_dt,
4279 v_praov_rec_r.progression_outcome_type,
4280 v_praov_rec_r.duration,
4281 v_praov_rec_r.duration_type,
4282 v_praov_rec_r.encmb_course_group_cd,
4283 v_praov_rec_r.restricted_enrolment_cp,
4284 v_praov_rec_r.restricted_attendance_type,
4285 p_progression_rule_cd,
4286 p_reference_cd);
4287 END LOOP;
4288 END IF ;
4289 RETURN;
4290 EXCEPTION
4291 WHEN OTHERS THEN
4292 IF c_praov%ISOPEN THEN
4293 CLOSE c_praov;
4294 END IF;
4295 RAISE;
4296 END;
4297 EXCEPTION
4298 WHEN OTHERS THEN
4299 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
4300 FND_MESSAGE.SET_TOKEN('NAME','IGS_PR_GEN_004.IGS_PR_UPD_SCA_APPLY.PRGPL_CREATE_OUTCOMES');
4301 IGS_GE_MSG_STACK.ADD;
4302 App_Exception.Raise_Exception;
4303 END prgpl_create_outcomes;
4304
4305
4306 FUNCTION prgpl_rmv_stdnt_prg_outcomes (
4307 p_progression_rule_cat IGS_PR_RU_APPL.progression_rule_cat%TYPE,
4308 p_pra_sequence_number IGS_PR_RU_APPL.sequence_number%TYPE,
4309 p_progression_rule_cd IGS_PR_RU_APPL.progression_rule_cd%TYPE,
4310 p_reference_cd IGS_PR_RU_APPL.reference_cd%TYPE)
4311 RETURN BOOLEAN
4312 IS
4313 BEGIN -- prgpl_rmv_stdnt_prg_outcomes
4314 DECLARE
4315 e_record_locked EXCEPTION;
4316 PRAGMA EXCEPTION_INIT(e_record_locked, -54);
4317 cst_pending CONSTANT VARCHAR2(10) := 'PENDING';
4318 cst_approved CONSTANT VARCHAR2(10) := 'APPROVED';
4319 cst_removed CONSTANT VARCHAR2(10) := 'REMOVED';
4320 cst_spo CONSTANT VARCHAR2(10) := 'SPO';
4321 v_record_locked BOOLEAN DEFAULT FALSE;
4322 v_progression_outcome_type
4323 IGS_PR_OU_TYPE.progression_outcome_type%TYPE;
4324 CURSOR c_spo IS
4325 SELECT spo.*,
4326 spo.ROWID
4327 FROM IGS_PR_STDNT_PR_OU spo
4328 WHERE spo.person_id = p_person_id AND
4329 spo.course_cd = p_course_cd AND
4330 spo.prg_cal_type = p_prg_cal_type AND
4331 spo.prg_ci_sequence_number = p_prg_sequence_number AND
4332 spo.progression_rule_cat = p_progression_rule_cat AND
4333 spo.pra_sequence_number = p_pra_sequence_number AND
4334 spo.decision_status IN (
4335 cst_pending,
4336 cst_approved) AND
4337 NVL(spo.expiry_dt,igs_ge_date.igsdate('9999/01/01')) > TRUNC(SYSDATE)
4338 FOR UPDATE NOWAIT;
4339 CURSOR c_spc (
4340 cp_sequence_number IGS_PR_STDNT_PR_PS.spo_sequence_number%TYPE) IS
4341 SELECT spc.ROWID
4342 FROM IGS_PR_STDNT_PR_PS spc
4343 WHERE spc.person_id = p_person_id AND
4344 spc.spo_course_cd = p_course_cd AND
4345 spc.spo_sequence_number = cp_sequence_number
4346 FOR UPDATE NOWAIT;
4347 CURSOR c_spus (
4348 cp_sequence_number IGS_PR_SDT_PR_UNT_ST.spo_sequence_number%TYPE) IS
4349 SELECT spus.ROWID
4350 FROM IGS_PR_SDT_PR_UNT_ST spus
4351 WHERE spus.person_id = p_person_id AND
4352 spus.course_cd = p_course_cd AND
4353 spus.spo_sequence_number = cp_sequence_number
4354 FOR UPDATE NOWAIT;
4355
4356
4357 CURSOR c_spaw (
4358 cp_sequence_number IGS_PR_SDT_PR_UNT_ST.spo_sequence_number%TYPE) IS
4359 SELECT spaw.ROWID
4360 FROM IGS_PR_STDNT_PR_AWD spaw
4361 WHERE spaw.person_id = p_person_id AND
4362 spaw.course_cd = p_course_cd AND
4363 spaw.spo_sequence_number = cp_sequence_number
4364 FOR UPDATE NOWAIT;
4365
4366
4367 CURSOR c_spu (
4368 cp_sequence_number IGS_PR_STDNT_PR_UNIT.spo_sequence_number%TYPE) IS
4369 SELECT spu.ROWID
4370 FROM IGS_PR_STDNT_PR_UNIT spu
4371 WHERE spu.person_id = p_person_id AND
4372 spu.course_cd = p_course_cd AND
4373 spu.spo_sequence_number = cp_sequence_number
4374 FOR UPDATE NOWAIT;
4375 CURSOR c_pra (
4376 cp_sequence_number IGS_PR_RU_APPL.spo_sequence_number%TYPE) IS
4377 SELECT pra.progression_rule_cat,
4378 pra.sequence_number, pra.ROWID
4379 FROM IGS_PR_RU_APPL pra
4380 WHERE pra.spo_person_id = p_person_id AND
4381 pra.spo_course_cd = p_course_cd AND
4382 pra.spo_sequence_number = cp_sequence_number AND
4383 pra.s_relation_type = cst_spo
4384 FOR UPDATE NOWAIT;
4385 CURSOR c_prct (
4386 cp_progression_rule_cat IGS_PR_RU_APPL.progression_rule_cat%TYPE,
4387 cp_pra_sequence_number IGS_PR_RU_APPL.sequence_number%TYPE) IS
4388 SELECT prct.ROWID
4389 FROM IGS_PR_RU_CA_TYPE prct
4390 WHERE prct.progression_rule_cat = cp_progression_rule_cat AND
4391 prct.pra_sequence_number = cp_pra_sequence_number
4392 FOR UPDATE NOWAIT;
4393 CURSOR c_pro (
4394 cp_progression_rule_cat IGS_PR_RU_APPL.progression_rule_cat%TYPE,
4395 cp_pra_sequence_number IGS_PR_RU_APPL.sequence_number%TYPE) IS
4396 SELECT pro.*
4397 FROM IGS_PR_RU_OU pro
4398 WHERE pro.progression_rule_cat = cp_progression_rule_cat AND
4399 pro.pra_sequence_number = cp_pra_sequence_number
4400 FOR UPDATE NOWAIT;
4401 CURSOR c_poc (
4402 cp_progression_rule_cat IGS_PR_RU_APPL.progression_rule_cat%TYPE,
4403 cp_pra_sequence_number IGS_PR_RU_APPL.sequence_number%TYPE,
4404 cp_pro_sequence_number IGS_PR_RU_OU.sequence_number%TYPE) IS
4405 SELECT poc.progression_rule_cat, poc.ROWID
4406 FROM IGS_PR_OU_PS poc
4407 WHERE poc.progression_rule_cat = cp_progression_rule_cat AND
4408 poc.pra_sequence_number = cp_pra_sequence_number AND
4409 poc.pro_sequence_number = cp_pro_sequence_number
4410 FOR UPDATE NOWAIT;
4411
4412
4413 CURSOR c_pous (
4414 cp_progression_rule_cat IGS_PR_RU_APPL.progression_rule_cat%TYPE,
4415 cp_pra_sequence_number IGS_PR_RU_APPL.sequence_number%TYPE,
4416 cp_pro_sequence_number IGS_PR_RU_OU.sequence_number%TYPE) IS
4417 SELECT pous.ROWID
4418 FROM IGS_PR_OU_UNIT_SET pous
4419 WHERE pous.progression_rule_cat = cp_progression_rule_cat AND
4420 pous.pra_sequence_number = cp_pra_sequence_number AND
4421 pous.pro_sequence_number = cp_pro_sequence_number
4422 FOR UPDATE NOWAIT;
4423
4424 CURSOR c_poa (
4425 cp_progression_rule_cat IGS_PR_RU_APPL.progression_rule_cat%TYPE,
4426 cp_pra_sequence_number IGS_PR_RU_APPL.sequence_number%TYPE,
4427 cp_pro_sequence_number IGS_PR_RU_OU.sequence_number%TYPE) IS
4428 SELECT poa.ROWID
4429 FROM IGS_PR_OU_AWD poa
4430 WHERE poa.progression_rule_cat = cp_progression_rule_cat AND
4431 poa.pra_sequence_number = cp_pra_sequence_number AND
4432 poa.pro_sequence_number = cp_pro_sequence_number
4433 FOR UPDATE NOWAIT;
4434
4435 CURSOR c_popu (
4436 cp_progression_rule_cat IGS_PR_RU_APPL.progression_rule_cat%TYPE,
4437 cp_pra_sequence_number IGS_PR_RU_APPL.sequence_number%TYPE,
4438 cp_pro_sequence_number IGS_PR_RU_OU.sequence_number%TYPE) IS
4439 SELECT popu.ROWID
4440 FROM IGS_PR_OU_UNIT popu
4441 WHERE popu.progression_rule_cat = cp_progression_rule_cat AND
4442 popu.pra_sequence_number = cp_pra_sequence_number AND
4443 popu.pro_sequence_number = cp_pro_sequence_number
4444 FOR UPDATE NOWAIT;
4445 --
4446 -- Start of new code added as per the FA110 PR Enh. Bug# 2658550.
4447 --
4448 CURSOR c_sfnd (cp_spo_sequence_number igs_pr_stdnt_pr_fnd.spo_sequence_number%TYPE) IS
4449 SELECT sfnd.rowid
4450 FROM igs_pr_stdnt_pr_fnd sfnd
4451 WHERE sfnd.person_id = p_person_id AND
4452 sfnd.course_cd = p_course_cd AND
4453 sfnd.spo_sequence_number = cp_spo_sequence_number
4454 FOR UPDATE NOWAIT;
4455
4456 CURSOR c_pfnd (
4457 cp_progression_rule_cat IGS_PR_RU_APPL.progression_rule_cat%TYPE,
4458 cp_pra_sequence_number IGS_PR_RU_APPL.sequence_number%TYPE,
4459 cp_pro_sequence_number IGS_PR_RU_OU.sequence_number%TYPE) IS
4460 SELECT pfnd.ROWID
4461 FROM IGS_PR_OU_FND pfnd
4462 WHERE pfnd.progression_rule_cat = cp_progression_rule_cat AND
4463 pfnd.pra_sequence_number = cp_pra_sequence_number AND
4464 pfnd.pro_sequence_number = cp_pro_sequence_number
4465 FOR UPDATE NOWAIT;
4466 --
4467 -- End of new code added as per the FA110 PR Enh. Bug# 2658550.
4468 --
4469 BEGIN
4470 FOR v_spo_rec IN c_spo LOOP
4471 v_progression_outcome_type := v_spo_rec.progression_outcome_type;
4472 IF v_spo_rec.decision_status = cst_pending THEN
4473 -- Delete from IGS_PR_STDNT_PR_PS
4474 BEGIN
4475 FOR v_spc_rec IN c_spc (v_spo_rec.sequence_number) LOOP
4476 IGS_PR_STDNT_PR_PS_PKG.DELETE_ROW(
4477 v_spc_rec.ROWID
4478 );
4479 END LOOP;
4480 EXCEPTION
4481 WHEN e_record_locked THEN
4482 IF c_spc%ISOPEN THEN
4483 CLOSE c_spc;
4484 END IF;
4485 p_message_name := 'IGS_PR_UNLO_STPR_CR_ORCNT_TA';
4486 v_record_locked := TRUE;
4487 EXIT;
4488 WHEN OTHERS THEN
4489 RAISE;
4490 END;
4491
4492
4493 -- Delete from IGS_PR_SDT_PR_UNT_ST
4494 BEGIN
4495 FOR v_spus_rec IN c_spus (v_spo_rec.sequence_number) LOOP
4496 IGS_PR_SDT_PR_UNT_ST_PKG.DELETE_ROW(
4497 v_spus_rec.ROWID
4498 );
4499 END LOOP;
4500 EXCEPTION
4501 WHEN e_record_locked THEN
4502 IF c_spus%ISOPEN THEN
4503 CLOSE c_spus;
4504 END IF;
4505 p_message_name := 'IGS_PR_UNLO_STPR_USR_ORNA_TA';
4506 v_record_locked := TRUE;
4507 EXIT;
4508 WHEN OTHERS THEN
4509 RAISE;
4510 END;
4511
4512 -- Delete from IGS_PR_STDNT_PR_AWD
4513 BEGIN
4514 FOR v_spaw_rec IN c_spaw (v_spo_rec.sequence_number) LOOP
4515 IGS_PR_STDNT_PR_AWD_PKG.DELETE_ROW(
4516 v_spaw_rec.ROWID
4517 );
4518 END LOOP;
4519 EXCEPTION
4520 WHEN e_record_locked THEN
4521 IF c_spaw%ISOPEN THEN
4522 CLOSE c_spaw;
4523 END IF;
4524 p_message_name := 'IGS_PR_UNLO_STPR_AWD_ORNA_TA';
4525 v_record_locked := TRUE;
4526 EXIT;
4527 WHEN OTHERS THEN
4528 RAISE;
4529 END;
4530
4531
4532 -- Delete from IGS_PR_STDNT_PR_UNIT
4533 BEGIN
4534 FOR v_spu_rec IN c_spu (v_spo_rec.sequence_number) LOOP
4535 IGS_PR_STDNT_PR_UNIT_PKG.DELETE_ROW(
4536 v_spu_rec.ROWID
4537 );
4538 END LOOP;
4539 EXCEPTION
4540 WHEN e_record_locked THEN
4541 IF c_spu%ISOPEN THEN
4542 CLOSE c_spu;
4543 END IF;
4544 p_message_name := 'IGS_PR_UNLO_STPR_UR_ORNA_TA';
4545 v_record_locked := TRUE;
4546 EXIT;
4547 WHEN OTHERS THEN
4548 RAISE;
4549 END;
4550
4551 --
4552 -- Start of new code added as per the FA110 PR Enh. Bug# 2658550.
4553 --
4554 -- Delete from IGS_PR_STDNT_PR_FND
4555 BEGIN
4556 FOR v_sfnd_rec IN c_sfnd (v_spo_rec.sequence_number) LOOP
4557 igs_pr_stdnt_pr_fnd_pkg.delete_row(v_sfnd_rec.ROWID);
4558 END LOOP;
4559 EXCEPTION
4560 WHEN e_record_locked THEN
4561 IF c_spu%ISOPEN THEN
4562 CLOSE c_spu;
4563 END IF;
4564 p_message_name := 'IGS_PR_UNLO_STPR_FND_ORNA_TA';
4565 /* Unable to lock student progression fund records - outcomes from rule checks not applied. Please try again later. */
4566 v_record_locked := TRUE;
4567 EXIT;
4568 WHEN OTHERS THEN
4569 RAISE;
4570 END;
4571 --
4572 -- End of new code added as per the FA110 PR Enh. Bug# 2658550.
4573 --
4574
4575 -- Delete from IGS_PR_RU_APPL
4576 BEGIN
4577 FOR v_pra_rec IN c_pra (v_spo_rec.sequence_number) LOOP
4578 FOR v_prct_rec IN c_prct (
4579 v_pra_rec.progression_rule_cat,
4580 v_pra_rec.sequence_number) LOOP
4581 IGS_PR_RU_CA_TYPE_PKG.DELETE_ROW(
4582 v_prct_rec.ROWID
4583 );
4584 END LOOP;
4585 -- Delete from IGS_PR_RU_OU
4586 FOR v_pro_rec IN c_pro (
4587 v_pra_rec.progression_rule_cat,
4588 v_pra_rec.sequence_number) LOOP
4589
4590 -- Delete from IGS_PR_OU_PS
4591 FOR v_poc_rec IN c_poc (
4592 v_pra_rec.progression_rule_cat,
4593 v_pra_rec.sequence_number,
4594 v_pro_rec.sequence_number) LOOP
4595 IGS_PR_OU_PS_PKG.DELETE_ROW(
4596 v_poc_rec.ROWID
4597 );
4598 END LOOP;
4599
4600 -- Delete from IGS_PR_OU_UNIT_SET
4601 FOR v_pous_rec IN c_pous (
4602 v_pra_rec.progression_rule_cat,
4603 v_pra_rec.sequence_number,
4604 v_pro_rec.sequence_number) LOOP
4605 IGS_PR_OU_UNIT_SET_PKG.DELETE_ROW(
4606 v_pous_rec.ROWID
4607 );
4608 END LOOP;
4609
4610 -- Delete from IGS_PR_OU_AWD
4611 FOR v_poa_rec IN c_poa (
4612 v_pra_rec.progression_rule_cat,
4613 v_pra_rec.sequence_number,
4614 v_pro_rec.sequence_number) LOOP
4615 IGS_PR_OU_AWD_PKG.DELETE_ROW(v_poa_rec.ROWID);
4616 END LOOP;
4617
4618 -- Delete from IGS_PR_OU_UNIT
4619 FOR v_popu_rec IN c_popu (
4620 v_pra_rec.progression_rule_cat,
4621 v_pra_rec.sequence_number,
4622 v_pro_rec.sequence_number) LOOP
4623 IGS_PR_OU_UNIT_PKG.DELETE_ROW(
4624 v_popu_rec.ROWID
4625 );
4626 END LOOP;
4627 --
4628 -- Start of new code added as per the FA110 PR Enh. Bug# 2658550.
4629 --
4630 -- Delete from IGS_PR_OU_UNIT
4631 FOR v_pfnd_rec IN c_pfnd (v_pra_rec.progression_rule_cat,
4632 v_pra_rec.sequence_number,
4633 v_pro_rec.sequence_number) LOOP
4634 IGS_PR_OU_FND_PKG.DELETE_ROW (v_pfnd_rec.ROWID);
4635 END LOOP;
4636 --
4637 -- End of new code added as per the FA110 PR Enh. Bug# 2658550.
4638 --
4639
4640 -- anilk, bug#2784198
4641 IGS_PR_RU_OU_PKG.UPDATE_ROW(
4642 X_ROWID => v_pro_rec.ROW_ID ,
4643 X_PROGRESSION_RULE_CAT => v_pro_rec.PROGRESSION_RULE_CAT ,
4644 X_PRA_SEQUENCE_NUMBER => v_pro_rec.PRA_SEQUENCE_NUMBER,
4645 X_SEQUENCE_NUMBER => v_pro_rec.SEQUENCE_NUMBER,
4646 X_NUMBER_OF_FAILURES => v_pro_rec.NUMBER_OF_FAILURES ,
4647 X_PROGRESSION_OUTCOME_TYPE => v_pro_rec.PROGRESSION_OUTCOME_TYPE ,
4648 X_APPLY_AUTOMATICALLY_IND => v_pro_rec.APPLY_AUTOMATICALLY_IND ,
4649 X_PRG_RULE_REPEAT_FAIL_TYPE => v_pro_rec.PRG_RULE_REPEAT_FAIL_TYPE ,
4650 X_OVERRIDE_SHOW_CAUSE_IND => v_pro_rec.OVERRIDE_SHOW_CAUSE_IND ,
4651 X_OVERRIDE_APPEAL_IND => v_pro_rec.OVERRIDE_APPEAL_IND ,
4652 X_DURATION => v_pro_rec.DURATION ,
4653 X_DURATION_TYPE => v_pro_rec.DURATION_TYPE ,
4654 X_RANK => v_pro_rec.RANK ,
4655 X_ENCMB_COURSE_GROUP_CD => v_pro_rec.ENCMB_COURSE_GROUP_CD ,
4656 X_RESTRICTED_ENROLMENT_CP => v_pro_rec.RESTRICTED_ENROLMENT_CP ,
4657 X_RESTRICTED_ATTENDANCE_TYPE => v_pro_rec.RESTRICTED_ATTENDANCE_TYPE ,
4658 X_COMMENTS => v_pro_rec.COMMENTS ,
4659 -- anilk, bug#2784198
4660 X_LOGICAL_DELETE_DT => FND_DATE.DATE_TO_CANONICAL(SYSDATE)
4661 );
4662 END LOOP;
4663
4664 IGS_PR_RU_APPL_PKG.DELETE_ROW(v_pra_rec.ROWID);
4665 END LOOP;
4666 EXCEPTION
4667 WHEN e_record_locked THEN
4668 IF c_prct%ISOPEN THEN
4669 CLOSE c_prct;
4670 END IF;
4671 IF c_poc%ISOPEN THEN
4672 CLOSE c_poc;
4673 END IF;
4674 IF c_pous%ISOPEN THEN
4675 CLOSE c_pous;
4676 END IF;
4677 IF c_poa%ISOPEN THEN
4678 CLOSE c_poa;
4679 END IF;
4680 IF c_popu%ISOPEN THEN
4681 CLOSE c_popu;
4682 END IF;
4683 IF c_pro%ISOPEN THEN
4684 CLOSE c_pro;
4685 END IF;
4686 IF c_pra%ISOPEN THEN
4687 CLOSE c_pra;
4688 END IF;
4689 p_message_name := 'IGS_PR_UNLO_PRAP_RE_TA';
4690 v_record_locked := TRUE;
4691 EXIT;
4692 WHEN OTHERS THEN
4693 RAISE;
4694 END;
4695 IGS_PR_STDNT_PR_OU_PKG.DELETE_ROW(
4696 v_spo_rec.ROWID
4697 );
4698 ELSE
4699 -- Outcome has not yet been applied, so it can be removed
4700 /* UPDATE IGS_PR_STDNT_PR_OU spo
4701 SET spo.decision_status = cst_removed
4702 WHERE CURRENT OF c_spo;
4703 */
4704 IGS_PR_STDNT_PR_OU_PKG.UPDATE_ROW(
4705 x_rowid => v_spo_rec.ROWID,
4706 x_person_id => v_spo_rec.person_id,
4707 x_course_cd => v_spo_rec.course_cd,
4708 x_sequence_number => v_spo_rec.sequence_number,
4709 x_prg_cal_type => v_spo_rec.prg_cal_type,
4710 x_prg_ci_sequence_number => v_spo_rec.prg_ci_sequence_number,
4711 x_rule_check_dt => v_spo_rec.rule_check_dt,
4712 x_progression_rule_cat => v_spo_rec.progression_rule_cat,
4713 x_pra_sequence_number => v_spo_rec.pra_sequence_number,
4714 x_pro_sequence_number => v_spo_rec.pro_sequence_number,
4715 x_progression_outcome_type => v_spo_rec.progression_outcome_type,
4716 x_duration => v_spo_rec.duration,
4717 x_duration_type => v_spo_rec.duration_type,
4718 x_decision_status => cst_removed,
4719 x_decision_dt => v_spo_rec.decision_dt,
4720 x_decision_org_unit_cd => v_spo_rec.decision_org_unit_cd,
4721 x_decision_ou_start_dt => v_spo_rec.decision_ou_start_dt,
4722 x_applied_dt => v_spo_rec.applied_dt,
4723 x_show_cause_expiry_dt => v_spo_rec.show_cause_expiry_dt,
4724 x_show_cause_dt => v_spo_rec.show_cause_dt,
4725 x_show_cause_outcome_dt => v_spo_rec.show_cause_outcome_dt,
4726 x_show_cause_outcome_type => v_spo_rec.show_cause_outcome_type,
4727 x_appeal_expiry_dt => v_spo_rec.appeal_expiry_dt,
4728 x_appeal_dt => v_spo_rec.appeal_dt,
4729 x_appeal_outcome_dt => v_spo_rec.appeal_outcome_dt,
4730 x_appeal_outcome_type => v_spo_rec.appeal_outcome_type,
4731 x_encmb_course_group_cd => v_spo_rec.encmb_course_group_cd,
4732 x_restricted_enrolment_cp => v_spo_rec.restricted_enrolment_cp,
4733 x_restricted_attendance_type => v_spo_rec.restricted_attendance_type,
4734 x_comments => v_spo_rec.comments,
4735 x_show_cause_comments => v_spo_rec.show_cause_comments,
4736 x_appeal_comments => v_spo_rec.appeal_comments,
4737 x_expiry_dt => v_spo_rec.expiry_dt,
4738 x_pro_pra_sequence_number => v_spo_rec.pro_pra_sequence_number,
4739 x_mode => 'R'
4740 );
4741
4742 END IF;
4743 p_removed_outcomes := p_removed_outcomes + 1;
4744 IF p_log_creation_dt IS NOT NULL THEN
4745 prgpl_ins_log_entry (
4746 cst_del_outcome,
4747 p_progression_rule_cat,
4748 p_pra_sequence_number,
4749 v_spo_rec.sequence_number,
4750 p_progression_rule_cd,
4751 p_reference_cd,
4752 v_progression_outcome_type,
4753 NULL);
4754 END IF;
4755 END LOOP;
4756 IF v_record_locked THEN
4757 ROLLBACK TO sp_before_rule_apply;
4758 RETURN FALSE;
4759 END IF;
4760 RETURN TRUE;
4761 EXCEPTION
4762 WHEN e_record_locked THEN
4763 IF c_spo%ISOPEN THEN
4764 CLOSE c_spo;
4765 END IF;
4766 p_message_name := 'IGS_PR_UNLO_STPR_ORE_ORCNT_TA';
4767 ROLLBACK TO sp_before_rule_apply;
4768 RETURN FALSE;
4769 WHEN OTHERS THEN
4770 IF c_spc%ISOPEN THEN
4771 CLOSE c_spc;
4772 END IF;
4773 IF c_spus%ISOPEN THEN
4774 CLOSE c_spus;
4775 END IF;
4776 IF c_spaw%ISOPEN THEN
4777 CLOSE c_spaw;
4778 END IF;
4779 IF c_spu%ISOPEN THEN
4780 CLOSE c_spu;
4781 END IF;
4782 IF c_prct%ISOPEN THEN
4783 CLOSE c_prct;
4784 END IF;
4785 IF c_poc%ISOPEN THEN
4786 CLOSE c_poc;
4787 END IF;
4788 IF c_pous%ISOPEN THEN
4789 CLOSE c_pous;
4790 END IF;
4791 IF c_poa%ISOPEN THEN
4792 CLOSE c_poa;
4793 END IF;
4794 IF c_popu%ISOPEN THEN
4795 CLOSE c_popu;
4796 END IF;
4797 IF c_pro%ISOPEN THEN
4798 CLOSE c_pro;
4799 END IF;
4800 IF c_pra%ISOPEN THEN
4801 CLOSE c_pra;
4802 END IF;
4803 IF c_spo%ISOPEN THEN
4804 CLOSE c_spo;
4805 END IF;
4806 RAISE;
4807 END;
4808 EXCEPTION
4809 WHEN OTHERS THEN
4810 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
4811 FND_MESSAGE.SET_TOKEN('NAME','IGS_PR_GEN_004.IGS_PR_UPD_SCA_APPLY.PRGPL_RMV_STDNT_PRG_OUTCOMES');
4812 IGS_GE_MSG_STACK.ADD;
4813 App_Exception.Raise_Exception;
4814 END prgpl_rmv_stdnt_prg_outcomes;
4815
4816
4817 FUNCTION prgpl_match_att_type (
4818 p_person_id IGS_EN_STDNT_PS_ATT.person_id%TYPE,
4819 p_course_cd IGS_EN_STDNT_PS_ATT.course_cd%TYPE,
4820 p_prg_cal_type IGS_CA_INST.cal_type%TYPE,
4821 p_prg_sequence_number IGS_CA_INST.sequence_number%TYPE,
4822 p_attendance_type IGS_EN_STDNT_PS_ATT.attendance_type%TYPE)
4823 RETURN VARCHAR2
4824 IS
4825 BEGIN -- prgpl_match_att_type
4826 -- If the sprav.attendance_type is set, then the student must be enrolled
4827 -- in the appropriate attendance type within the progression period.
4828 -- Relationships to a load calendar are used to determine this.
4829 DECLARE
4830 cst_active CONSTANT VARCHAR2(10) := 'ACTIVE';
4831 cst_load CONSTANT VARCHAR2(10) := 'LOAD';
4832 cst_no_load CONSTANT VARCHAR2(10) := 'NO-LOAD';
4833 v_sub_cal_type IGS_CA_INST.cal_type%TYPE;
4834 v_sub_ci_sequence_number IGS_CA_INST.sequence_number%TYPE;
4835 v_attendance_type IGS_EN_STDNT_PS_ATT.attendance_type%TYPE;
4836 CURSOR c_cir IS
4837 SELECT cir.sub_cal_type,
4838 cir.sub_ci_sequence_number
4839 FROM IGS_CA_INST ci,
4840 IGS_CA_INST_REL cir,
4841 IGS_CA_TYPE cat,
4842 IGS_CA_STAT cs
4843 WHERE cir.sup_cal_type = p_prg_cal_type AND
4844 cir.sup_ci_sequence_number = p_prg_sequence_number AND
4845 ci.cal_type = cir.sub_cal_type AND
4846 ci.sequence_number = cir.sub_ci_sequence_number AND
4847 cat.cal_type = ci.cal_type AND
4848 cat.s_cal_cat = cst_load AND
4849 cs.CAL_STATUS = ci.CAL_STATUS AND
4850 cs.s_CAL_STATUS = cst_active;
4851 BEGIN
4852 OPEN c_cir;
4853 FETCH c_cir INTO
4854 v_sub_cal_type,
4855 v_sub_ci_sequence_number;
4856 IF c_cir%NOTFOUND THEN
4857 CLOSE c_cir;
4858 -- No load calendar exists ; cannot check load so don't apply rule
4859 IF p_log_creation_dt IS NOT NULL THEN
4860 prgpl_ins_log_entry (
4861 cst_no_load,
4862 NULL,
4863 NULL,
4864 NULL,
4865 NULL,
4866 NULL,
4867 NULL,
4868 NULL);
4869 END IF;
4870 RETURN 'N';
4871 END IF;
4872 CLOSE c_cir;
4873 -- Call routine to derive the attendance type within the load calendar.
4874 v_attendance_type := IGS_EN_GEN_006.ENRP_GET_SCA_LATT (
4875 p_person_id,
4876 p_course_cd,
4877 v_sub_cal_type,
4878 v_sub_ci_sequence_number);
4879 IF v_attendance_type = p_attendance_type THEN
4880 RETURN 'Y';
4881 ELSE
4882 RETURN 'N';
4883 END IF;
4884 EXCEPTION
4885 WHEN OTHERS THEN
4886 IF c_cir%ISOPEN THEN
4887 CLOSE c_cir;
4888 END IF;
4889 RAISE;
4890 END;
4891 EXCEPTION
4892 WHEN OTHERS THEN
4893 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
4894 FND_MESSAGE.SET_TOKEN('NAME','IGS_PR_GEN_004.IGS_PR_UPD_SCA_APPLY.PRGPL_MATCH_ATT_TYPE');
4895 IGS_GE_MSG_STACK.ADD;
4896 App_Exception.Raise_Exception;
4897 END prgpl_match_att_type;
4898
4899 --------------------------------------------------------------------------------
4900 FUNCTION prgpl_match_class_standing (
4901 p_person_id IGS_EN_STDNT_PS_ATT.person_id%TYPE,
4902 p_course_cd IGS_EN_STDNT_PS_ATT.course_cd%TYPE,
4903 p_prg_cal_type IGS_CA_INST.cal_type%TYPE,
4904 p_prg_sequence_number IGS_CA_INST.sequence_number%TYPE,
4905 p_igs_pr_class_std_id IGS_PR_CLASS_STD.igs_pr_class_std_id%TYPE)
4906 RETURN VARCHAR2 AS
4907 BEGIN -- prgpl_match_class_standing
4908 -- If the sprav.igs_pr_class_std_id is set, then the student must be of
4909 -- the appropriate Class Standing type within the progression period.
4910 -- Relationships to a load calendar are used to determine this.
4911 DECLARE
4912 cst_active CONSTANT VARCHAR2(10) := 'ACTIVE';
4913 cst_load CONSTANT VARCHAR2(10) := 'LOAD';
4914 cst_no_load CONSTANT VARCHAR2(10) := 'NO-LOAD';
4915 v_sub_cal_type IGS_CA_INST.cal_type%TYPE;
4916
4917 v_sub_ci_sequence_number IGS_CA_INST.sequence_number%TYPE;
4918 v_attendance_type IGS_EN_STDNT_PS_ATT.attendance_type%TYPE;
4919 v_class_standing IGS_PR_CLASS_STD.CLASS_STANDING%TYPE;
4920 v_derived_class_standing IGS_PR_CLASS_STD.CLASS_STANDING%TYPE;
4921 CURSOR c_cir IS
4922 SELECT cir.sub_cal_type,
4923 cir.sub_ci_sequence_number
4924 FROM IGS_CA_INST ci,
4925 IGS_CA_INST_REL cir,
4926 IGS_CA_TYPE cat,
4927 IGS_CA_STAT cs
4928 WHERE cir.sup_cal_type = p_prg_cal_type AND
4929 cir.sup_ci_sequence_number = p_prg_sequence_number AND
4930 ci.cal_type = cir.sub_cal_type AND
4931 ci.sequence_number = cir.sub_ci_sequence_number AND
4932 cat.cal_type = ci.cal_type AND
4933 cat.s_cal_cat = cst_load AND
4934 cs.CAL_STATUS = ci.CAL_STATUS AND
4935 cs.s_CAL_STATUS = cst_active;
4936
4937 CURSOR c_cstd IS
4938 SELECT cstd.class_standing
4939 FROM igs_pr_class_std cstd
4940 WHERE cstd.igs_pr_class_std_id = p_igs_pr_class_std_id;
4941
4942 BEGIN
4943 OPEN c_cir;
4944 FETCH c_cir INTO v_sub_cal_type,
4945 v_sub_ci_sequence_number;
4946 IF c_cir%NOTFOUND THEN
4947 CLOSE c_cir;
4948 -- No load calendar exists ; cannot check load so don't apply rule
4949 IF p_log_creation_dt IS NOT NULL THEN
4950 prgpl_ins_log_entry (
4951 cst_no_load,
4952 NULL,
4953 NULL,
4954 NULL,
4955 NULL,
4956 NULL,
4957 NULL,
4958 NULL);
4959 END IF;
4960 RETURN 'N';
4961 END IF;
4962 CLOSE c_cir;
4963 -- Get Class Standing value
4964
4965 OPEN c_cstd;
4966 FETCH c_cstd INTO v_class_standing;
4967 CLOSE c_cstd;
4968
4969 -- Call routine to derive the class standing.
4970 -- NOTE: IGS_PR_GET_CLASS_STD.Get_Class_Standing is being built as part of
4971 -- DLD Class Standing
4972 v_derived_class_standing := IGS_PR_GET_CLASS_STD.Get_Class_Standing (
4973 p_person_id,
4974 p_course_cd,
4975 'N',
4976 NULL,
4977 v_sub_cal_type,
4978 v_sub_ci_sequence_number);
4979 IF v_class_standing = v_derived_class_standing THEN
4980 RETURN 'Y';
4981 ELSE
4982 RETURN 'N';
4983 END IF;
4984
4985 EXCEPTION
4986 WHEN OTHERS THEN
4987 IF c_cir%ISOPEN THEN
4988 CLOSE c_cir;
4989 END IF;
4990 IF c_cstd%ISOPEN THEN
4991 CLOSE c_cstd;
4992 END IF;
4993 RAISE;
4994 END;
4995
4996 EXCEPTION
4997 WHEN OTHERS THEN
4998 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
4999 FND_MESSAGE.SET_TOKEN('NAME','IGS_PR_GEN_004.IGS_PR_UPD_SCA_APPLY.PRGPL_MATCH_CLASS_STANDING');
5000 IGS_GE_MSG_STACK.ADD;
5001 App_Exception.Raise_Exception;
5002 END prgpl_match_class_standing;
5003
5004
5005 FUNCTION prgpl_match_cp_range (
5006 p_person_id IGS_EN_STDNT_PS_ATT.person_id%TYPE,
5007 p_course_cd IGS_EN_STDNT_PS_ATT.course_cd%TYPE,
5008 p_prg_cal_type IGS_CA_INST.cal_type%TYPE,
5009 p_prg_sequence_number IGS_CA_INST.sequence_number%TYPE,
5010 p_min_cp IGS_PR_RU_APPL.min_cp%TYPE,
5011 p_max_cp IGS_PR_RU_APPL.max_cp%TYPE)
5012 RETURN VARCHAR2 AS
5013 BEGIN -- prgpl_match_cp_range
5014 -- If the sprav.min_cp and sprav.max_cp is set,
5015 -- then the student have an earned credit point figure within the
5016 -- credit point range as at progression period supplied.
5017 -- Relationships to a load calendar are used to determine this.
5018 DECLARE
5019 cst_active CONSTANT VARCHAR2(10) := 'ACTIVE';
5020 cst_load CONSTANT VARCHAR2(10) := 'LOAD';
5021 cst_no_load CONSTANT VARCHAR2(10) := 'NO-LOAD';
5022 v_sub_cal_type IGS_CA_INST.cal_type%TYPE;
5023 v_sub_ci_sequence_number IGS_CA_INST.sequence_number%TYPE;
5024 v_attendance_type IGS_EN_STDNT_PS_ATT.attendance_type%TYPE;
5025 v_earned_cp NUMBER;
5026 v_attempted_cp NUMBER;
5027 v_return_status VARCHAR2(1);
5028 v_msg_count NUMBER(2);
5029 v_msg_data VARCHAR2(2000);
5030
5031 CURSOR c_cir IS
5032 SELECT cir.sub_cal_type,
5033 cir.sub_ci_sequence_number
5034 FROM IGS_CA_INST ci,
5035 IGS_CA_INST_REL cir,
5036 IGS_CA_TYPE cat,
5037 IGS_CA_STAT cs
5038 WHERE cir.sup_cal_type = p_prg_cal_type AND
5039 cir.sup_ci_sequence_number = p_prg_sequence_number AND
5040 ci.cal_type = cir.sub_cal_type AND
5041 ci.sequence_number = cir.sub_ci_sequence_number AND
5042 cat.cal_type = ci.cal_type AND
5043 cat.s_cal_cat = cst_load AND
5044 cs.CAL_STATUS = ci.CAL_STATUS AND
5045 cs.s_CAL_STATUS = cst_active;
5046 BEGIN
5047 OPEN c_cir;
5048 FETCH c_cir INTO v_sub_cal_type,
5049 v_sub_ci_sequence_number;
5050 IF c_cir%NOTFOUND THEN
5051 CLOSE c_cir;
5052 -- No load calendar exists ; cannot check load so don't apply rule
5053 IF p_log_creation_dt IS NOT NULL THEN
5054 prgpl_ins_log_entry (
5055 cst_no_load,
5056 NULL,
5057 NULL,
5058 NULL,
5059 NULL,
5060 NULL,
5061 NULL,
5062 NULL);
5063 END IF;
5064
5065 RETURN 'N';
5066 END IF;
5067
5068 CLOSE c_cir;
5069 -- Call routine to derive the attendance type within the load calendar.
5070 -- NOTE: IGS_PR_GET_CP_STATS is being built as part of
5071 -- DLD Academic Statistics and GPA.
5072 IGS_PR_CP_GPA.GET_CP_STATS (
5073 p_person_id,
5074 p_course_cd,
5075 NULL, --stat_type
5076 v_sub_cal_type,
5077 v_sub_ci_sequence_number,
5078 NULL, -- system stat
5079 'Y', -- cumilative ind
5080 v_earned_cp,
5081 v_attempted_cp,
5082 FND_API.G_TRUE,
5083 v_return_status,
5084 v_msg_count,
5085 v_msg_data);
5086
5087 IF v_earned_cp >= p_min_cp AND v_earned_cp <= p_max_cp THEN
5088 RETURN 'Y';
5089 ELSE
5090 RETURN 'N';
5091 END IF;
5092
5093 EXCEPTION
5094 WHEN OTHERS THEN
5095 IF c_cir%ISOPEN THEN
5096 CLOSE c_cir;
5097 END IF;
5098 RAISE;
5099
5100 END;
5101
5102 EXCEPTION
5103 WHEN OTHERS THEN
5104 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
5105 FND_MESSAGE.SET_TOKEN('NAME','IGS_PR_GEN_004.IGS_PR_UPD_SCA_APPLY.PRGPL_MATCH_CP_RANGE');
5106 IGS_GE_MSG_STACK.ADD;
5107 App_Exception.Raise_Exception;
5108 END prgpl_match_cp_range;
5109 ---------------------------------------------------------------------------------
5110
5111 FUNCTION prgpl_sca_apply_rules (
5112 p_sca_version_number IGS_EN_STDNT_PS_ATT.version_number%TYPE,
5113 p_progression_rule_cat IGS_PR_RU_APPL.progression_rule_cat%TYPE,
5114 p_pra_sequence_number IGS_PR_RU_APPL.sequence_number%TYPE,
5115 p_progression_rule_cd IGS_PR_RU_APPL.progression_rule_cd%TYPE,
5116 p_rul_sequence_number IGS_PR_RU_APPL.rul_sequence_number%TYPE,
5117 p_attendance_type IGS_PR_RU_APPL.attendance_type%TYPE,
5118 p_reference_cd IGS_PR_RU_APPL.reference_cd%TYPE,
5119 p_igs_pr_class_std_id IGS_PR_CLASS_STD.IGS_PR_CLASS_STD_ID%TYPE,
5120 p_min_cp IGS_PR_RU_APPL.min_cp%TYPE,
5121 p_max_cp IGS_PR_RU_APPL.max_cp%TYPE
5122 )
5123 RETURN BOOLEAN
5124 IS
5125 BEGIN -- prgpl_sca_apply_rules
5126 DECLARE
5127 v_rul_sequence_number IGS_PR_RULE.rul_sequence_number%TYPE;
5128 v_alias_val IGS_CA_DA_INST.absolute_val%TYPE;
5129 v_passed_ind VARCHAR2(1);
5130 v_sprc_passed_ind VARCHAR2(1);
5131 CURSOR c_pr (
5132 cp_progression_rule_cat IGS_PR_RULE.progression_rule_cat%TYPE,
5133 cp_progression_rule_cd IGS_PR_RULE.progression_rule_cd%TYPE) IS
5134 SELECT pr.rul_sequence_number
5135 FROM IGS_PR_RULE pr
5136 WHERE pr.progression_rule_cat = cp_progression_rule_cat AND
5137 pr.progression_rule_cd = cp_progression_rule_cd;
5138 CURSOR c_sprc (
5139 cp_progression_rule_cat IGS_PR_SDT_PR_RU_CK.progression_rule_cat%TYPE,
5140 cp_pra_sequence_number IGS_PR_SDT_PR_RU_CK.pra_sequence_number%TYPE) IS
5141 SELECT sprc.passed_ind
5142 FROM IGS_PR_SDT_PR_RU_CK sprc
5143 WHERE sprc.person_id = p_person_id AND
5144 sprc.course_cd = p_course_cd AND
5145 sprc.prg_cal_type = p_prg_cal_type AND
5146 sprc.prg_ci_sequence_number = p_prg_sequence_number AND
5147 sprc.progression_rule_cat = cp_progression_rule_cat AND
5148 sprc.pra_sequence_number = cp_pra_sequence_number
5149 ORDER BY sprc.rule_check_dt DESC; -- For latest record first
5150 v_decode_val1 VARCHAR2(2000);
5151 v_decode_val2 VARCHAR2(30);
5152 BEGIN
5153 v_rules_applicable := TRUE;
5154 -- If rule application specifies attendance type then check for match
5155 IF p_attendance_type IS NOT NULL THEN
5156 IF prgpl_match_att_type (
5157 p_person_id,
5158 p_course_cd,
5159 p_prg_cal_type,
5160 p_prg_sequence_number,
5161 p_attendance_type) = 'N' THEN
5162 RETURN TRUE;
5163 END IF;
5164 END IF;
5165
5166 -- if rule application specifies class standing then check for match
5167 IF p_igs_pr_class_std_id IS NOT NULL THEN
5168 IF prgpl_match_class_standing(
5169 p_person_id,
5170 p_course_cd,
5171 p_prg_cal_type,
5172 p_prg_sequence_number,
5173 p_igs_pr_class_std_id) = 'N' THEN
5174 RETURN TRUE;
5175 END IF;
5176 END IF;
5177
5178 --if the rule application specifies a credit point range then check for match
5179 IF p_min_cp IS NOT NULL AND p_max_cp IS NOT NULL THEN
5180 IF prgpl_match_cp_range (
5181 p_person_id,
5182 p_course_cd,
5183 p_prg_cal_type,
5184 p_prg_sequence_number,
5185 p_min_cp,
5186 p_max_cp) = 'N' THEN
5187 RETURN TRUE;
5188 END IF;
5189 END IF;
5190
5191 -- Determine the rule sequence number from either parameter or by joining to
5192 -- the standard rule
5193 IF p_rul_sequence_number IS NOT NULL THEN
5194 v_rul_sequence_number := p_rul_sequence_number;
5195 ELSE
5196 OPEN c_pr (
5197 p_progression_rule_cat,
5198 p_progression_rule_cd);
5199 FETCH c_pr INTO v_rul_sequence_number;
5200 IF c_pr%NOTFOUND THEN
5201 CLOSE c_pr;
5202 RETURN TRUE;
5203 END IF;
5204 CLOSE c_pr;
5205 END IF;
5206 -- Call rules engine to apply rules to student
5207 IF IGS_RU_GEN_005.rulp_val_sca_prg (
5208 v_rul_sequence_number,
5209 p_person_id,
5210 p_course_cd,
5211 p_sca_version_number,
5212 p_prg_cal_type,
5213 p_prg_sequence_number,
5214 v_message_text) THEN
5215 v_passed_ind := 'Y';
5216 ELSE
5217 v_passed_ind := 'N';
5218 v_all_rules_passed := FALSE;
5219 END IF;
5220 -- Check for change in rule state
5221 OPEN c_sprc (
5222 p_progression_rule_cat,
5223 p_pra_sequence_number);
5224 FETCH c_sprc INTO v_sprc_passed_ind;
5225 IF c_sprc%NOTFOUND THEN
5226 v_sprc_passed_ind := 'X';
5227 END IF;
5228 CLOSE c_sprc;
5229 IF v_sprc_passed_ind <> v_passed_ind THEN
5230 IF v_sprc_passed_ind <> 'X' THEN
5231 v_rules_altered := TRUE;
5232 END IF;
5233 v_sprc_insert_count := v_sprc_insert_count + 1;
5234 IF v_sprc_insert_count = 1 THEN
5235 /*INSERT INTO IGS_PR_STDNT_PR_CK (
5236 person_id,
5237 course_cd,
5238 prg_cal_type,
5239 prg_ci_sequence_number,
5240 rule_check_dt,
5241 s_prg_check_type)
5242 VALUES (
5243 p_person_id,
5244 p_course_cd,
5245 p_prg_cal_type,
5246 p_prg_sequence_number,
5247 v_rule_check_dt,
5248 DECODE(
5249 p_application_type,
5250 cst_initial, cst_system,
5251 cst_todo, cst_todo,
5252 cst_manual, cst_manual));*/
5253 DECLARE
5254 CURSOR c_decode IS
5255 SELECT DECODE(
5256 p_application_type,
5257 cst_initial, cst_system,
5258 cst_todo, cst_todo,
5259 cst_manual, cst_manual)FROM DUAL;
5260
5261 LV_ROWID VARCHAR2(25);
5262 BEGIN
5263 OPEN c_decode;
5264 FETCH c_decode INTO v_decode_val2;
5265 CLOSE c_decode;
5266 IGS_PR_STDNT_PR_CK_PKG.INSERT_ROW (
5267 X_ROWID =>LV_ROWID,
5268 X_PERSON_ID =>p_person_id,
5269 X_COURSE_CD =>p_course_cd,
5270 X_PRG_CAL_TYPE =>p_prg_cal_type,
5271 X_PRG_CI_SEQUENCE_NUMBER =>p_prg_sequence_number,
5272 X_RULE_CHECK_DT =>v_rule_check_dt,
5273 X_S_PRG_CHECK_TYPE =>v_decode_val2,
5274 X_MODE =>'R'
5275 );
5276 END;
5277 END IF;
5278
5279 DECLARE
5280 CURSOR c_decode2 IS
5281 SELECT DECODE (
5282 v_passed_ind,
5283 'N', v_message_text,
5284 'Y', NULL)FROM DUAL;
5285
5286 lv_rowid VARCHAR2(25);
5287 l_org_id NUMBER(15);
5288 BEGIN
5289 OPEN c_decode2;
5290 FETCH c_decode2 INTO v_decode_val1;
5291 CLOSE c_decode2;
5292 l_org_id := igs_ge_gen_003.get_org_id;
5293 IGS_PR_SDT_PR_RU_CK_PKG.INSERT_ROW (
5294 X_ROWID => lv_rowid,
5295 x_PERSON_ID =>p_person_id,
5296 x_COURSE_CD =>p_course_cd,
5297 x_PRG_CAL_TYPE =>p_prg_cal_type,
5298 x_PRG_CI_SEQUENCE_NUMBER =>p_prg_sequence_number,
5299 x_RULE_CHECK_DT =>v_rule_check_dt,
5300 x_PROGRESSION_RULE_CAT =>p_progression_rule_cat,
5301 x_PRA_SEQUENCE_NUMBER =>p_pra_sequence_number,
5302 x_PASSED_IND =>v_passed_ind,
5303 x_rule_message_text => v_decode_val1,
5304 X_MODE => 'R',
5305 X_ORG_ID => l_org_id);
5306 END;
5307
5308 IF p_application_type = cst_todo OR
5309 p_application_type = cst_manual THEN
5310 IF v_sprc_passed_ind <> 'X' THEN
5311 -- Check for timeframes for todo processing
5312 IF v_passed_ind = 'Y' THEN
5313 -- Check if beyond benefit cutoff date
5314 v_alias_val := IGS_PR_GEN_005.IGS_PR_get_prg_dai (
5315 p_course_cd,
5316 p_sca_version_number,
5317 p_prg_cal_type,
5318 p_prg_sequence_number,
5319 cst_eb);
5320 IF v_rule_check_dt > v_alias_val AND
5321 v_sprc_passed_ind <> 'X' THEN
5322 -- Beyond benefit cutoff date
5323 IF p_log_creation_dt IS NOT NULL THEN
5324 prgpl_ins_log_entry (
5325 cst_past_ben,
5326 p_progression_rule_cat,
5327 p_pra_sequence_number,
5328 NULL,
5329 p_progression_rule_cd,
5330 p_reference_cd,
5331 NULL,
5332 NULL);
5333 END IF;
5334 v_beyond_benefit := TRUE;
5335 ELSE
5336 IF NOT prgpl_rmv_stdnt_prg_outcomes (
5337 p_progression_rule_cat,
5338 p_pra_sequence_number,
5339 p_progression_rule_cd,
5340 p_reference_cd) THEN
5341 v_rolled_back := TRUE;
5342 RETURN FALSE;
5343 END IF;
5344 v_outcomes_removed := TRUE;
5345 END IF;
5346 ELSE
5347 -- Check if beyond penalty cutoff date
5348 v_alias_val := IGS_PR_GEN_005.IGS_PR_get_prg_dai (
5349 p_course_cd,
5350 p_sca_version_number,
5351 p_prg_cal_type,
5352 p_prg_sequence_number,
5353 cst_ep);
5354 IF v_rule_check_dt > v_alias_val THEN
5355 -- Beyond penalty cutoff date
5356 IF p_log_creation_dt IS NOT NULL THEN
5357 prgpl_ins_log_entry (
5358 cst_past_pen,
5359 p_progression_rule_cat,
5360 p_pra_sequence_number,
5361 NULL,
5362 p_progression_rule_cd,
5363 p_reference_cd,
5364 NULL,
5365 NULL);
5366 END IF;
5367 v_beyond_penalty := TRUE;
5368 ELSE
5369 prgpl_create_outcomes (
5370 p_sca_version_number,
5371 p_progression_rule_cat,
5372 p_pra_sequence_number,
5373 p_progression_rule_cd,
5374 p_reference_cd,
5375 v_rule_check_dt);
5376 END IF;
5377 END IF;
5378 ELSE
5379 IF v_passed_ind = 'N' THEN
5380 prgpl_create_outcomes (
5381 p_sca_version_number,
5382 p_progression_rule_cat,
5383 p_pra_sequence_number,
5384 p_progression_rule_cd,
5385 p_reference_cd,
5386 v_rule_check_dt);
5387 END IF;
5388 END IF;
5389 ELSE
5390 -- If initial check and rule has been failed then create outcomes
5391 IF v_passed_ind = 'N' THEN
5392 prgpl_create_outcomes (
5393 p_sca_version_number,
5394 p_progression_rule_cat,
5395 p_pra_sequence_number,
5396 p_progression_rule_cd,
5397 p_reference_cd,
5398 v_rule_check_dt);
5399 END IF;
5400 END IF;
5401 END IF;
5402 RETURN TRUE;
5403 EXCEPTION
5404 WHEN OTHERS THEN
5405 IF c_pr%ISOPEN THEN
5406 CLOSE c_pr;
5407 END IF;
5408 IF c_sprc%ISOPEN THEN
5409 CLOSE c_sprc;
5410 END IF;
5411 RAISE;
5412 END;
5413 EXCEPTION
5414 WHEN OTHERS THEN
5415 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
5416 FND_MESSAGE.SET_TOKEN('NAME','IGS_PR_GEN_004.IGS_PR_UPD_SCA_APPLY.PRGPL_SCA_APPLY_RULES');
5417 IGS_GE_MSG_STACK.ADD;
5418 App_Exception.Raise_Exception;
5419 END prgpl_sca_apply_rules;
5420
5421
5422 PROCEDURE prgpl_sca_process_rules (
5423 p_sca_version_number IGS_EN_STDNT_PS_ATT.version_number%TYPE,
5424 p_course_type IGS_PS_VER.course_type%TYPE)
5425 IS
5426 BEGIN -- prgpl_sca_process_rules
5427 DECLARE
5428 cst_sca CONSTANT VARCHAR2(10) := 'SCA';
5429 cst_crv CONSTANT VARCHAR2(10) := 'CRV';
5430 cst_ou CONSTANT VARCHAR2(10) := 'OU';
5431 cst_cty CONSTANT VARCHAR2(10) := 'CTY';
5432 cst_null CONSTANT VARCHAR2(10) := 'NULL';
5433 cst_start CONSTANT VARCHAR2(10) := 'START';
5434 cst_end CONSTANT VARCHAR2(10) := 'END';
5435 v_last_progression_cat VARCHAR2(11);
5436 v_match_relation_type IGS_PR_RU_APPL.s_relation_type%TYPE;
5437 v_process_cat BOOLEAN;
5438 v_still_valid BOOLEAN;
5439 v_dummy VARCHAR2(1);
5440
5441 CURSOR c_ci (cp_prg_cal_type IGS_CA_INST.cal_type%TYPE,
5442 cp_prg_sequence_number IGS_CA_INST.sequence_number%TYPE,
5443 cp_start_sequence_number IGS_CA_INST.sequence_number%TYPE,
5444 cp_check_type VARCHAR2) IS
5445 SELECT 'X'
5446 FROM igs_ca_inst ci, igs_ca_inst ci1
5447 WHERE ci.cal_type = cp_prg_cal_type
5448 AND ci.sequence_number = cp_prg_sequence_number
5449 AND ci1.cal_type = cp_prg_cal_type
5450 AND ci1.sequence_number = cp_start_sequence_number
5451 AND ( (cp_check_type = cst_start AND ci1.start_dt > ci.start_dt)
5452 OR (cp_check_type = cst_end AND ci1.start_dt <= ci.start_dt)
5453 );
5454
5455 CURSOR c_progression_rule_cat(cp_cal_type IGS_CA_INST.cal_type%TYPE) IS
5456 SELECT pra.progression_rule_cat, pra.s_relation_type
5457 FROM igs_pr_ru_appl pra, igs_pr_ru_ca_type_v prctv
5458 WHERE pra.s_relation_type IN (cst_sca, cst_crv, cst_ou, cst_cty)
5459 AND pra.progression_rule_cat = prctv.progression_rule_cat
5460 AND pra.sequence_number = prctv.pra_sequence_number
5461 AND prctv.prg_cal_type = cp_cal_type
5462 AND pra.logical_delete_dt IS NULL
5463 ORDER BY pra.progression_rule_cat,
5464 DECODE (pra.s_relation_type,
5465 cst_sca, 1,
5466 cst_crv, 2,
5467 cst_ou, 3,
5468 cst_cty, 4);
5469
5470
5471
5472 CURSOR c_pra_cst_sca (cp_prg_rule_cat IGS_PR_RU_APPL.progression_rule_cat%TYPE,
5473 cp_person_id IGS_EN_STDNT_PS_ATT.person_id%TYPE,
5474 cp_course_cd IGS_EN_STDNT_PS_ATT.course_cd%TYPE,
5475 cp_cal_type IGS_CA_INST.cal_type%TYPE) IS
5476 SELECT pra.progression_rule_cat, pra.sequence_number, pra.s_relation_type,
5477 pra.progression_rule_cd, pra.rul_sequence_number, pra.attendance_type,
5478 pra.reference_cd, pra.igs_pr_class_std_id, pra.min_cp, pra.max_cp,
5479 prctv.start_sequence_number, prctv.end_sequence_number,
5480 prctv.start_effective_period, prctv.num_of_applications,
5481 pra.sca_person_id, pra.sca_course_cd, pra.crv_course_cd,
5482 pra.crv_version_number, pra.ou_org_unit_cd, pra.ou_start_dt,
5483 pra.course_type
5484 FROM igs_pr_ru_appl pra, igs_pr_ru_ca_type_v prctv
5485 WHERE pra.s_relation_type = cst_sca
5486 AND pra.progression_rule_cat = cp_prg_rule_cat
5487 AND pra.logical_delete_dt IS NULL
5488 AND pra.sca_person_id = cp_person_id
5489 AND pra.sca_course_cd = cp_course_cd
5490 AND pra.progression_rule_cat = prctv.progression_rule_cat
5491 AND pra.sequence_number = prctv.pra_sequence_number
5492 AND prctv.prg_cal_type = cp_cal_type;
5493
5494 CURSOR c_pra_cst_crv (cp_prg_rule_cat IGS_PR_RU_APPL.progression_rule_cat%TYPE,
5495 cp_course_cd IGS_EN_STDNT_PS_ATT.course_cd%TYPE,
5496 cp_version_number IGS_PR_RU_APPL.crv_version_number%TYPE,
5497 cp_cal_type IGS_CA_INST.cal_type%TYPE) IS
5498 SELECT pra.progression_rule_cat, pra.sequence_number, pra.s_relation_type,
5499 pra.progression_rule_cd, pra.rul_sequence_number, pra.attendance_type,
5500 pra.reference_cd, pra.igs_pr_class_std_id, pra.min_cp, pra.max_cp,
5501 prctv.start_sequence_number, prctv.end_sequence_number,
5502 prctv.start_effective_period, prctv.num_of_applications,
5503 pra.sca_person_id, pra.sca_course_cd, pra.crv_course_cd,
5504 pra.crv_version_number, pra.ou_org_unit_cd, pra.ou_start_dt,
5505 pra.course_type
5506 FROM igs_pr_ru_appl pra, igs_pr_ru_ca_type_v prctv
5507 WHERE pra.s_relation_type = cst_crv
5508 AND pra.progression_rule_cat = cp_prg_rule_cat
5509 AND pra.logical_delete_dt IS NULL
5510 AND pra.crv_course_cd = cp_course_cd
5511 AND pra.crv_version_number = cp_version_number
5512 AND pra.progression_rule_cat = prctv.progression_rule_cat
5513 AND pra.sequence_number = prctv.pra_sequence_number
5514 AND prctv.prg_cal_type = cp_cal_type;
5515
5516 CURSOR c_pra_cst_ou (cp_prg_rule_cat IGS_PR_RU_APPL.progression_rule_cat%TYPE,
5517 cp_course_cd IGS_EN_STDNT_PS_ATT.course_cd%TYPE,
5518 cp_version_number IGS_PR_RU_APPL.crv_version_number%TYPE,
5519 cp_cal_type IGS_CA_INST.cal_type%TYPE) IS
5520 SELECT pra.progression_rule_cat, pra.sequence_number, pra.s_relation_type,
5521 pra.progression_rule_cd, pra.rul_sequence_number, pra.attendance_type,
5522 pra.reference_cd, pra.igs_pr_class_std_id, pra.min_cp, pra.max_cp,
5523 prctv.start_sequence_number, prctv.end_sequence_number,
5524 prctv.start_effective_period, prctv.num_of_applications,
5525 pra.sca_person_id, pra.sca_course_cd, pra.crv_course_cd,
5526 pra.crv_version_number, pra.ou_org_unit_cd, pra.ou_start_dt,
5527 pra.course_type
5528 FROM igs_pr_ru_appl pra, igs_pr_ru_ca_type_v prctv
5529 WHERE pra.s_relation_type = cst_ou
5530 AND pra.progression_rule_cat = cp_prg_rule_cat
5531 AND pra.logical_delete_dt IS NULL
5532 AND igs_pr_gen_001.prgp_get_crv_cmt (
5533 cp_course_cd,
5534 cp_version_number,
5535 pra.ou_org_unit_cd,
5536 pra.ou_start_dt
5537 ) = 'Y'
5538 AND pra.progression_rule_cat = prctv.progression_rule_cat
5539 AND pra.sequence_number = prctv.pra_sequence_number
5540 AND prctv.prg_cal_type = cp_cal_type
5541 AND ( EXISTS ( SELECT 'x'
5542 FROM igs_ps_own cow
5543 WHERE cow.course_cd = cp_course_cd
5544 AND cow.version_number = cp_version_number
5545 AND cow.percentage = 100)
5546 OR NOT EXISTS ( SELECT 'x'
5547 FROM igs_pr_ru_appl pra1,
5548 igs_pr_ru_ca_type_v prctv1
5549 WHERE pra1.s_relation_type = 'OU'
5550 AND pra1.logical_delete_dt IS NULL
5551 AND pra1.progression_rule_cat =
5552 pra.progression_rule_cat
5553 AND pra1.sequence_number <>
5554 pra.sequence_number
5555 AND ( pra1.ou_org_unit_cd <>
5556 pra.ou_org_unit_cd
5557 OR pra1.ou_start_dt <> pra.ou_start_dt
5558 )
5559 AND prctv1.progression_rule_cat =
5560 pra1.progression_rule_cat
5561 AND prctv1.pra_sequence_number =
5562 pra1.sequence_number
5563 AND prctv1.prg_cal_type = prctv.prg_cal_type)
5564 OR EXISTS (
5565 SELECT 'x'
5566 FROM igs_ps_ver crv1
5567 WHERE crv1.course_cd = cp_course_cd
5568 AND crv1.version_number = cp_version_number
5569 AND ( ( crv1.responsible_org_unit_cd =
5570 pra.ou_org_unit_cd
5571 AND crv1.responsible_ou_start_dt =
5572 pra.ou_start_dt
5573 )
5574 OR igs_or_gen_001.orgp_get_within_ou (
5575 pra.ou_org_unit_cd,
5576 pra.ou_start_dt,
5577 crv1.responsible_org_unit_cd,
5578 crv1.responsible_ou_start_dt,
5579 'N'
5580 ) = 'Y'
5581 ))
5582 );
5583
5584 CURSOR c_pra_cst_cty (cp_prg_rule_cat IGS_PR_RU_APPL.progression_rule_cat%TYPE,
5585 cp_course_cd IGS_EN_STDNT_PS_ATT.course_cd%TYPE,
5586 cp_version_number IGS_PR_RU_APPL.crv_version_number%TYPE,
5587 cp_cal_type IGS_CA_INST.cal_type%TYPE) IS
5588 SELECT pra.progression_rule_cat, pra.sequence_number, pra.s_relation_type,
5589 pra.progression_rule_cd, pra.rul_sequence_number, pra.attendance_type,
5590 pra.reference_cd, pra.igs_pr_class_std_id, pra.min_cp, pra.max_cp,
5591 prctv.start_sequence_number, prctv.end_sequence_number,
5592 prctv.start_effective_period, prctv.num_of_applications,
5593 pra.sca_person_id, pra.sca_course_cd, pra.crv_course_cd,
5594 pra.crv_version_number, pra.ou_org_unit_cd, pra.ou_start_dt,
5595 pra.course_type
5596 FROM igs_pr_ru_appl pra, igs_pr_ru_ca_type_v prctv, igs_ps_ver crv
5597 WHERE pra.s_relation_type = cst_cty
5598 AND pra.progression_rule_cat = cp_prg_rule_cat
5599 AND pra.logical_delete_dt IS NULL
5600 AND crv.course_type = pra.course_type
5601 AND crv.course_cd = cp_course_cd
5602 AND crv.version_number = cp_version_number
5603 AND pra.progression_rule_cat = prctv.progression_rule_cat
5604 AND pra.sequence_number = prctv.pra_sequence_number
5605 AND prctv.prg_cal_type = cp_cal_type;
5606
5607 v_pra_rec c_pra_cst_cty%ROWTYPE;
5608
5609 BEGIN
5610 v_last_progression_cat := 'ABCDEFGHIJK';
5611 FOR v_progression_rule_cat IN c_progression_rule_cat (p_prg_cal_type) LOOP
5612 /*
5613 The loop will return all the progression_rule_cat and s_relation_type.
5614 If a rule is valid and gets applied then no more processing for that progression_rule_cat.
5615 The hierarchy of application is SCA, CRY, OU and CTY.
5616 */
5617
5618 v_still_valid := TRUE;
5619 /*
5620 v_still_valid is used to check if the v_progression_rule_cat.progression_rule_cat and
5621 v_progression_rule_cat.s_relation_type combination is valid or not.
5622 This flag determines if it shall be applied or not.
5623 */
5624 IF v_progression_rule_cat.progression_rule_cat <> v_last_progression_cat THEN
5625
5626 IF v_progression_rule_cat.s_relation_type = cst_sca THEN
5627 OPEN c_pra_cst_sca (v_progression_rule_cat.progression_rule_cat,
5628 p_person_id,
5629 p_course_cd,
5630 p_prg_cal_type);
5631 FETCH c_pra_cst_sca INTO v_pra_rec;
5632 IF c_pra_cst_sca%NOTFOUND THEN
5633 --No such rule defined at the SCA level for this person+course combination
5634 --so this progression_rule_cat cannot be applied
5635 v_still_valid := FALSE;
5636 END IF;
5637 CLOSE c_pra_cst_sca;
5638 -- Ignore records where haven't yet reached the START calendar.
5639 IF v_still_valid AND
5640 v_pra_rec.start_sequence_number IS NOT NULL THEN
5641 IF p_prg_sequence_number <> v_pra_rec.start_sequence_number THEN
5642 OPEN c_ci (p_prg_cal_type,
5643 p_prg_sequence_number,
5644 v_pra_rec.start_sequence_number,
5645 cst_start);
5646 FETCH c_ci INTO v_dummy;
5647 IF c_ci%NOTFOUND THEN
5648 --Start calender not yet reached, so this progression_rule_cat cannot be applied
5649 v_still_valid := FALSE;
5650 END IF;
5651 CLOSE c_ci;
5652 END IF;
5653 END IF;
5654 -- Ignore records where haven't yet reached the end calendar.
5655 IF v_still_valid AND v_pra_rec.end_sequence_number IS NOT NULL THEN
5656 IF p_prg_sequence_number <> v_pra_rec.end_sequence_number THEN
5657 OPEN c_ci (p_prg_cal_type,
5658 p_prg_sequence_number,
5659 v_pra_rec.end_sequence_number,
5660 cst_end);
5661 FETCH c_ci INTO v_dummy;
5662 IF c_ci%NOTFOUND THEN
5663 --End calender failed, so this progression_rule_cat cannot be applied
5664 v_still_valid := FALSE;
5665 END IF;
5666 CLOSE c_ci;
5667 END IF;
5668 END IF;
5669 -- Check that student complies with effective period and number of
5670 -- applications options where applicable.
5671 IF v_still_valid AND (v_pra_rec.start_effective_period IS NOT NULL
5672 OR v_pra_rec.num_of_applications IS NOT NULL) THEN
5673 IF IGS_PR_GEN_005.igs_pr_get_sca_appl (
5674 p_person_id,
5675 p_course_cd,
5676 p_sca_version_number,
5677 p_course_type,
5678 v_pra_rec.progression_rule_cat,
5679 v_pra_rec.sequence_number,
5680 p_prg_cal_type,
5681 p_prg_sequence_number,
5682 v_pra_rec.start_effective_period,
5683 v_pra_rec.num_of_applications,
5684 v_pra_rec.s_relation_type,
5685 v_pra_rec.sca_person_id,
5686 v_pra_rec.sca_course_cd,
5687 v_pra_rec.crv_course_cd,
5688 v_pra_rec.crv_version_number,
5689 v_pra_rec.ou_org_unit_cd,
5690 v_pra_rec.ou_start_dt,
5691 v_pra_rec.course_type) = 'N' THEN
5692 -- student does not comply with effective period and number of
5693 -- applications options where applicable.
5694 -- so this progression_rule_cat cannot be applied
5695 v_still_valid := FALSE;
5696 END IF;
5697 END IF;
5698 /*IF v_still_valid IS TRUE then this rule is valid and can be applied*/
5699 IF v_still_valid THEN
5700 IF NOT prgpl_sca_apply_rules (p_sca_version_number,
5701 v_pra_rec.progression_rule_cat,
5702 v_pra_rec.sequence_number,
5703 v_pra_rec.progression_rule_cd,
5704 v_pra_rec.rul_sequence_number,
5705 v_pra_rec.attendance_type,
5706 v_pra_rec.reference_cd,
5707 v_pra_rec.igs_pr_class_std_id,
5708 v_pra_rec.min_cp,
5709 v_pra_rec.max_cp) THEN
5710 -- Changes rolled back
5711 EXIT;
5712 ELSE
5713 /*This progression_rule_cat was successfully applied.
5714 By setting v_last_progression_cat, we prevent the application
5715 of this progression_rule_cat in other s_relation_type
5716 */
5717 v_last_progression_cat := v_progression_rule_cat.progression_rule_cat;
5718 END IF;
5719 END IF;
5720
5721 ELSIF v_progression_rule_cat.s_relation_type = cst_crv THEN
5722 OPEN c_pra_cst_crv (v_progression_rule_cat.progression_rule_cat,
5723 p_course_cd,
5724 p_sca_version_number,
5725 p_prg_cal_type);
5726 FETCH c_pra_cst_crv INTO v_pra_rec;
5727 IF c_pra_cst_crv%NOTFOUND THEN
5728 v_still_valid := FALSE;
5729 END IF;
5730 CLOSE c_pra_cst_crv;
5731 -- Ignore records where haven't yet reached the START calendar.
5732 IF v_still_valid AND
5733 v_pra_rec.start_sequence_number IS NOT NULL THEN
5734 IF p_prg_sequence_number <> v_pra_rec.start_sequence_number THEN
5735 OPEN c_ci (p_prg_cal_type,
5736 p_prg_sequence_number,
5737 v_pra_rec.start_sequence_number,
5738 cst_start);
5739 FETCH c_ci INTO v_dummy;
5740 IF c_ci%NOTFOUND THEN
5741 v_still_valid := FALSE;
5742 END IF;
5743 CLOSE c_ci;
5744 END IF;
5745 END IF;
5746 -- Ignore records where haven't yet reached the end calendar.
5747 IF v_still_valid AND v_pra_rec.end_sequence_number IS NOT NULL THEN
5748 IF p_prg_sequence_number <> v_pra_rec.end_sequence_number THEN
5749 OPEN c_ci (p_prg_cal_type,
5750 p_prg_sequence_number,
5751 v_pra_rec.end_sequence_number,
5752 cst_end);
5753 FETCH c_ci INTO v_dummy;
5754 IF c_ci%NOTFOUND THEN
5755 v_still_valid := FALSE;
5756 END IF;
5757 CLOSE c_ci;
5758 END IF;
5759 END IF;
5760 -- Check that student complies with effective period and number of
5761 -- applications options where applicable.
5762 IF v_still_valid AND (v_pra_rec.start_effective_period IS NOT NULL
5763 OR v_pra_rec.num_of_applications IS NOT NULL) THEN
5764 IF IGS_PR_GEN_005.igs_pr_get_sca_appl (
5765 p_person_id,
5766 p_course_cd,
5767 p_sca_version_number,
5768 p_course_type,
5769 v_pra_rec.progression_rule_cat,
5770 v_pra_rec.sequence_number,
5771 p_prg_cal_type,
5772 p_prg_sequence_number,
5773 v_pra_rec.start_effective_period,
5774 v_pra_rec.num_of_applications,
5775 v_pra_rec.s_relation_type,
5776 v_pra_rec.sca_person_id,
5777 v_pra_rec.sca_course_cd,
5778 v_pra_rec.crv_course_cd,
5779 v_pra_rec.crv_version_number,
5780 v_pra_rec.ou_org_unit_cd,
5781 v_pra_rec.ou_start_dt,
5782 v_pra_rec.course_type) = 'N' THEN
5783 v_still_valid := FALSE;
5784 END IF;
5785 END IF;
5786 IF v_still_valid THEN
5787 IF NOT prgpl_sca_apply_rules (p_sca_version_number,
5788 v_pra_rec.progression_rule_cat,
5789 v_pra_rec.sequence_number,
5790 v_pra_rec.progression_rule_cd,
5791 v_pra_rec.rul_sequence_number,
5792 v_pra_rec.attendance_type,
5793 v_pra_rec.reference_cd,
5794 v_pra_rec.igs_pr_class_std_id,
5795 v_pra_rec.min_cp,
5796 v_pra_rec.max_cp) THEN
5797 -- Changes rolled back
5798 EXIT;
5799 ELSE
5800 v_last_progression_cat := v_progression_rule_cat.progression_rule_cat;
5801 END IF;
5802 END IF;
5803
5804 ELSIF v_progression_rule_cat.s_relation_type = cst_ou THEN
5805 OPEN c_pra_cst_ou (v_progression_rule_cat.progression_rule_cat,
5806 p_course_cd,
5807 p_sca_version_number,
5808 p_prg_cal_type);
5809 FETCH c_pra_cst_ou INTO v_pra_rec;
5810 IF c_pra_cst_ou%NOTFOUND THEN
5811 v_still_valid := FALSE;
5812 END IF;
5813 CLOSE c_pra_cst_ou;
5814 -- Ignore records where haven't yet reached the START calendar.
5815 IF v_still_valid AND
5816 v_pra_rec.start_sequence_number IS NOT NULL THEN
5817 IF p_prg_sequence_number <> v_pra_rec.start_sequence_number THEN
5818 OPEN c_ci (p_prg_cal_type,
5819 p_prg_sequence_number,
5820 v_pra_rec.start_sequence_number,
5821 cst_start);
5822 FETCH c_ci INTO v_dummy;
5823 IF c_ci%NOTFOUND THEN
5824 v_still_valid := FALSE;
5825 END IF;
5826 CLOSE c_ci;
5827 END IF;
5828 END IF;
5829 -- Ignore records where haven't yet reached the end calendar.
5830 IF v_still_valid AND v_pra_rec.end_sequence_number IS NOT NULL THEN
5831 IF p_prg_sequence_number <> v_pra_rec.end_sequence_number THEN
5832 OPEN c_ci (p_prg_cal_type,
5833 p_prg_sequence_number,
5834 v_pra_rec.end_sequence_number,
5835 cst_end);
5836 FETCH c_ci INTO v_dummy;
5837 IF c_ci%NOTFOUND THEN
5838 v_still_valid := FALSE;
5839 END IF;
5840 CLOSE c_ci;
5841 END IF;
5842 END IF;
5843 -- Check that student complies with effective period and number of
5844 -- applications options where applicable.
5845 IF v_still_valid AND (v_pra_rec.start_effective_period IS NOT NULL
5846 OR v_pra_rec.num_of_applications IS NOT NULL) THEN
5847 IF IGS_PR_GEN_005.igs_pr_get_sca_appl (
5848 p_person_id,
5849 p_course_cd,
5850 p_sca_version_number,
5851 p_course_type,
5852 v_pra_rec.progression_rule_cat,
5853 v_pra_rec.sequence_number,
5854 p_prg_cal_type,
5855 p_prg_sequence_number,
5856 v_pra_rec.start_effective_period,
5857 v_pra_rec.num_of_applications,
5858 v_pra_rec.s_relation_type,
5859 v_pra_rec.sca_person_id,
5860 v_pra_rec.sca_course_cd,
5861 v_pra_rec.crv_course_cd,
5862 v_pra_rec.crv_version_number,
5863 v_pra_rec.ou_org_unit_cd,
5864 v_pra_rec.ou_start_dt,
5865 v_pra_rec.course_type) = 'N' THEN
5866 v_still_valid := FALSE;
5867 END IF;
5868 END IF;
5869 IF v_still_valid THEN
5870 IF NOT prgpl_sca_apply_rules (p_sca_version_number,
5871 v_pra_rec.progression_rule_cat,
5872 v_pra_rec.sequence_number,
5873 v_pra_rec.progression_rule_cd,
5874 v_pra_rec.rul_sequence_number,
5875 v_pra_rec.attendance_type,
5876 v_pra_rec.reference_cd,
5877 v_pra_rec.igs_pr_class_std_id,
5878 v_pra_rec.min_cp,
5879 v_pra_rec.max_cp) THEN
5880 -- Changes rolled back
5881 EXIT;
5882 ELSE
5883 v_last_progression_cat := v_progression_rule_cat.progression_rule_cat;
5884 END IF;
5885 END IF;
5886
5887 ELSIF v_progression_rule_cat.s_relation_type = cst_cty THEN
5888 OPEN c_pra_cst_cty (v_progression_rule_cat.progression_rule_cat,
5889 p_course_cd,
5890 p_sca_version_number,
5891 p_prg_cal_type);
5892 FETCH c_pra_cst_cty INTO v_pra_rec;
5893 IF c_pra_cst_cty%NOTFOUND THEN
5894 v_still_valid := FALSE;
5895 END IF;
5896 CLOSE c_pra_cst_cty;
5897 -- Ignore records where haven't yet reached the START calendar.
5898 IF v_still_valid AND
5899 v_pra_rec.start_sequence_number IS NOT NULL THEN
5900 IF p_prg_sequence_number <> v_pra_rec.start_sequence_number THEN
5901 OPEN c_ci (p_prg_cal_type,
5902 p_prg_sequence_number,
5903 v_pra_rec.start_sequence_number,
5904 cst_start);
5905 FETCH c_ci INTO v_dummy;
5906 IF c_ci%NOTFOUND THEN
5907 v_still_valid := FALSE;
5908 END IF;
5909 CLOSE c_ci;
5910 END IF;
5911 END IF;
5912 -- Ignore records where haven't yet reached the end calendar.
5913 IF v_still_valid AND v_pra_rec.end_sequence_number IS NOT NULL THEN
5914 IF p_prg_sequence_number <> v_pra_rec.end_sequence_number THEN
5915 OPEN c_ci (p_prg_cal_type,
5916 p_prg_sequence_number,
5917 v_pra_rec.end_sequence_number,
5918 cst_end);
5919 FETCH c_ci INTO v_dummy;
5920 IF c_ci%NOTFOUND THEN
5921 v_still_valid := FALSE;
5922 END IF;
5923 CLOSE c_ci;
5924 END IF;
5925 END IF;
5926 -- Check that student complies with effective period and number of
5927 -- applications options where applicable.
5928 IF v_still_valid AND (v_pra_rec.start_effective_period IS NOT NULL
5929 OR v_pra_rec.num_of_applications IS NOT NULL) THEN
5930 IF IGS_PR_GEN_005.igs_pr_get_sca_appl (
5931 p_person_id,
5932 p_course_cd,
5933 p_sca_version_number,
5934 p_course_type,
5935 v_pra_rec.progression_rule_cat,
5936 v_pra_rec.sequence_number,
5937 p_prg_cal_type,
5938 p_prg_sequence_number,
5939 v_pra_rec.start_effective_period,
5940 v_pra_rec.num_of_applications,
5941 v_pra_rec.s_relation_type,
5942 v_pra_rec.sca_person_id,
5943 v_pra_rec.sca_course_cd,
5944 v_pra_rec.crv_course_cd,
5945 v_pra_rec.crv_version_number,
5946 v_pra_rec.ou_org_unit_cd,
5947 v_pra_rec.ou_start_dt,
5948 v_pra_rec.course_type) = 'N' THEN
5949 v_still_valid := FALSE;
5950 END IF;
5951 END IF;
5952 IF v_still_valid THEN
5953 IF NOT prgpl_sca_apply_rules (p_sca_version_number,
5954 v_pra_rec.progression_rule_cat,
5955 v_pra_rec.sequence_number,
5956 v_pra_rec.progression_rule_cd,
5957 v_pra_rec.rul_sequence_number,
5958 v_pra_rec.attendance_type,
5959 v_pra_rec.reference_cd,
5960 v_pra_rec.igs_pr_class_std_id,
5961 v_pra_rec.min_cp,
5962 v_pra_rec.max_cp) THEN
5963 -- Changes rolled back
5964 EXIT;
5965 ELSE
5966 v_last_progression_cat := v_progression_rule_cat.progression_rule_cat;
5967 END IF;
5968 END IF;
5969
5970 END IF;
5971
5972 END IF;
5973 END LOOP;
5974 RETURN;
5975 EXCEPTION
5976 WHEN OTHERS THEN
5977 IF c_progression_rule_cat%ISOPEN THEN
5978 CLOSE c_progression_rule_cat ;
5979 END IF;
5980 IF c_pra_cst_crv%ISOPEN THEN
5981 CLOSE c_pra_cst_crv ;
5982 END IF;
5983 IF c_pra_cst_cty%ISOPEN THEN
5984 CLOSE c_pra_cst_cty;
5985 END IF;
5986 IF c_pra_cst_ou%ISOPEN THEN
5987 CLOSE c_pra_cst_ou;
5988 END IF;
5989 IF c_pra_cst_sca%ISOPEN THEN
5990 CLOSE c_pra_cst_sca;
5991 END IF;
5992 IF c_ci%ISOPEN THEN
5993 CLOSE c_ci;
5994 END IF;
5995 RAISE;
5996 END;
5997 EXCEPTION
5998 WHEN OTHERS THEN
5999 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
6000 FND_MESSAGE.SET_TOKEN('NAME','IGS_PR_GEN_004.IGS_PR_UPD_SCA_APPLY.PRGPL_SCA_PROCESS_RULES');
6001 IGS_GE_MSG_STACK.ADD;
6002 App_Exception.Raise_Exception;
6003 END prgpl_sca_process_rules;
6004 BEGIN
6005 -- Set the default values for the out NOCOPY parameters
6006 -- these values will be incremented when the outocomes
6007 -- are created in the local procedures
6008 p_recommended_outcomes := 0;
6009 p_approved_outcomes := 0;
6010 p_removed_outcomes := 0;
6011 -- Set the default message number
6012 p_message_name := NULL;
6013
6014 SAVEPOINT sp_before_rule_apply;
6015 -- Load student course attempt version number and course type
6016 OPEN c_sca_crv;
6017 FETCH c_sca_crv INTO
6018 v_course_attempt_status,
6019 v_sca_version_number,
6020 v_course_type;
6021 IF c_sca_crv%NOTFOUND THEN
6022 CLOSE c_sca_crv;
6023 RETURN;
6024 END IF;
6025 CLOSE c_sca_crv;
6026 -- If manual application then ensure that appropriate timelines and state of
6027 -- person are correct. If not, reject the application of the rules.
6028 IF p_application_type = cst_manual THEN
6029 IF v_course_attempt_status = cst_completed THEN
6030 p_message_name := 'IGS_PR_CNT_APRRU_CMCR_ATT';
6031 RETURN;
6032 ELSIF v_course_attempt_status = cst_unconfirm THEN
6033 p_message_name := 'IGS_PR_CNT_AP_PRRU_UCON_CRAT';
6034 RETURN;
6035 END IF;
6036 v_start_dt := IGS_PR_GEN_005.IGS_PR_get_prg_dai (
6037 p_course_cd,
6038 v_sca_version_number,
6039 p_prg_cal_type,
6040 p_prg_sequence_number,
6041 cst_sa);
6042 -- If not reached the application start date then reject manual application.
6043 IF v_start_dt IS NULL OR
6044 v_start_dt > TRUNC(SYSDATE) THEN
6045 p_message_name := 'IGS_PR_UNPE_MRC_STAP_DT_PCAL';
6046 RETURN;
6047 END IF;
6048 IGS_PR_GEN_003.IGS_PR_get_config_parm (
6049 p_course_cd,
6050 v_sca_version_number,
6051 v_apply_start_dt_alias,
6052 v_apply_end_dt_alias,
6053 v_end_benefit_dt_alias,
6054 v_end_penalty_dt_alias,
6055 v_show_cause_cutoff_dt_alias,
6056 v_appeal_cutoff_dt_alias,
6057 v_show_cause_ind,
6058 v_apply_before_show_ind,
6059 v_appeal_ind,
6060 v_apply_before_appeal_ind,
6061 v_count_sus_in_time_ind,
6062 v_count_exc_in_time_ind,
6063 v_calculate_wam_ind,
6064 v_calculate_gpa_ind,
6065 v_outcome_check_type);
6066 -- Check the state of the students enrolment against the configuration
6067 -- options.
6068 v_result_status := IGS_PR_GEN_005.IGS_PR_get_sca_state (
6069 p_person_id,
6070 p_course_cd,
6071 p_prg_cal_type,
6072 p_prg_sequence_number);
6073 IF v_result_status = cst_none THEN
6074 p_message_name := 'IGS_PR_CNTAP_MRCK_NAP_UNEX_PRD';
6075 RETURN;
6076 ELSIF v_result_status = cst_missing THEN
6077 -- If the outcome check type is not missing then exclude from checking.
6078 IF v_outcome_check_type <> cst_missing THEN
6079 p_message_name := 'IGS_PR_CNT_APMAN_RCK_ROH_SUB';
6080 RETURN;
6081 END IF;
6082 ELSIF v_result_status = cst_recommend THEN
6083 -- If the outcome type is finalised (ie. ignoring recommended) then exclude.
6084 IF v_outcome_check_type = cst_finalised THEN
6085 p_message_name := 'IGS_PR_CNT_APMAN_RCK_ROH_SUB';
6086 RETURN;
6087 END IF;
6088 END IF;
6089 END IF;
6090 -- Call routine to insert progression measures (eg. GPA/WAM) into measures
6091 -- table
6092 IGS_PR_GEN_003.IGS_PR_ins_prg_msr (
6093 p_person_id,
6094 p_course_cd,
6095 v_sca_version_number,
6096 p_prg_cal_type,
6097 p_prg_sequence_number);
6098 -- Process student course attempt
6099 prgpl_sca_process_rules (
6100 v_sca_version_number,
6101 v_course_type);
6102 IF p_log_creation_dt IS NOT NULL AND
6103 v_rules_applicable AND
6104 v_all_rules_passed THEN
6105 prgpl_ins_log_entry (
6106 cst_passed,
6107 NULL,
6108 NULL,
6109 NULL,
6110 NULL,
6111 NULL,
6112 NULL,
6113 NULL);
6114 ELSIF p_log_creation_dt IS NOT NULL AND
6115 v_rules_applicable AND
6116 (
6117 NOT v_rec_outcomes_applied AND
6118 NOT v_auto_outcomes_applied AND
6119 NOT v_beyond_penalty AND
6120 NOT v_beyond_benefit AND
6121 NOT v_outcomes_removed
6122 ) THEN
6123 prgpl_ins_log_entry (
6124 cst_nochange,
6125 NULL,
6126 NULL,
6127 NULL,
6128 NULL,
6129 NULL,
6130 NULL,
6131 NULL);
6132 END IF;
6133 -- If procedure is called from a form then set the message number and commit
6134 -- changes
6135 IF p_log_creation_dt IS NULL AND
6136 NOT v_rolled_back THEN
6137 IF NOT v_rules_applicable THEN
6138 -- NO RULES WERE TESTED.
6139 -- 5229: No rules applicable to the student.
6140 p_message_name := 'IGS_PR_NORU_APP_TO_SDTNT';
6141 ELSIF v_all_rules_passed THEN
6142 -- RULE(S) TESTED ; NO FAILURES.
6143 IF v_outcomes_removed THEN
6144 -- Rules now passed. Outcomes have been removed.
6145 p_message_name := 'IGS_PR_RUPA_OUT_HRED';
6146 ELSIF v_beyond_benefit THEN
6147 -- Rules now passed. No outcomes were lifted due to being beyond benefit
6148 -- cutoff date.
6149 p_message_name := 'IGS_PR_RUNPD_NOUT_BECUT_DT';
6150 ELSE
6151 -- Rules were tested. All rules were passed.
6152 p_message_name := 'IGS_PR_RU_TE_ALL_RE_PAS';
6153 END IF;
6154 ELSE
6155 -- RULE(S) TESTED ; AT LEAST ONE FAILURE.
6156 IF v_beyond_penalty THEN
6157 -- Rules were tested. No outcomes were applied due to being beyond penalty
6158 -- cutoff date.
6159 p_message_name := 'IGS_PR_RUTE_NOOU_PECU_DT';
6160 ELSIF v_beyond_benefit THEN
6161 -- Rules were tested. No outcomes were lifted due to being beyond benefit
6162 -- cutoff date.
6163 p_message_name := 'IGS_PR_RUTE_NOLF_BENCT_DT';
6164 ELSIF v_auto_outcomes_applied THEN
6165 -- Rules were tested. Rules(s) were failed and outcomes automatically
6166 -- applied.
6167 p_message_name := 'IGS_PR_RUTE_RUFA_OUT_AUAP';
6168 ELSIF v_rec_outcomes_applied THEN
6169 -- Rules were tested. Rule(s) were failed and recommended outcomes have been
6170 -- added.
6171 p_message_name :='IGS_PR_RU_TE_RFA_OTCM_ADD';
6172 ELSIF v_outcomes_removed THEN
6173 -- Rules now passed. Outcomes have been removed.
6174 p_message_name := 'IGS_PR_RUPA_OUT_HRED';
6175 ELSIF NOT v_rules_altered THEN
6176 -- Rules were tested. No changes made to outcomes as results are the same.
6177 p_message_name := 'IGS_PR_RUTE_NCHMA_REA_SAM';
6178 ELSE
6179 -- Rules were tested. No progression outcomes were added/altered.
6180 p_message_name := 'IGS_PR_RUTE_NOPR_OUTAD_AL';
6181 END IF;
6182 END IF;
6183 COMMIT;
6184 END IF;
6185 RETURN;
6186 EXCEPTION
6187 WHEN OTHERS THEN
6188 IF c_sca_crv%ISOPEN THEN
6189 CLOSE c_sca_crv;
6190 END IF;
6191 RAISE;
6192 END;
6193 EXCEPTION
6194 WHEN OTHERS THEN
6195 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
6196 FND_MESSAGE.SET_TOKEN('NAME','IGS_PR_GEN_004.IGS_PR_UPD_SCA_APPLY');
6197 IGS_GE_MSG_STACK.ADD;
6198 App_Exception.Raise_Exception;
6199 END IGS_PR_upd_sca_apply;
6200
6201
6202 PROCEDURE IGS_PR_upd_spo_aply_dt(
6203 p_person_id IN NUMBER,
6204 p_course_cd IN VARCHAR2,
6205 p_sequence_number IN NUMBER )
6206 IS
6207 gv_other_detail VARCHAR2(255);
6208 BEGIN -- IGS_PR_upd_spo_aply_dt
6209 -- Reset the applied_dt of a student progression outcome record to
6210 -- 01/01/0001 after any related records are changed if the record
6211 -- is approved. This identifies the record for automatic processing.
6212 DECLARE
6213 e_record_locked EXCEPTION;
6214 PRAGMA EXCEPTION_INIT(e_record_locked, -54);
6215 cst_approved CONSTANT VARCHAR2(10) := 'APPROVED';
6216 cst_applied_dt CONSTANT DATE := igs_ge_date.igsdate('0001/01/01');
6217 v_decision_status IGS_PR_STDNT_PR_OU.decision_status%TYPE;
6218 CURSOR c_spo_upd IS
6219 SELECT spo.*, spo.ROWID
6220 FROM IGS_PR_STDNT_PR_OU spo
6221 WHERE person_id = p_person_id AND
6222 course_cd = p_course_cd AND
6223 sequence_number = p_sequence_number
6224 FOR UPDATE NOWAIT;
6225
6226 v_spo_upd_rec c_spo_upd%ROWTYPE;
6227
6228 BEGIN
6229 -- Reset the applied date to 01/01/0001 if the parent
6230 -- student progression outcome record is approved.
6231 BEGIN
6232 OPEN c_spo_upd;
6233 FETCH c_spo_upd INTO v_spo_upd_rec;
6234 IF v_spo_upd_rec.decision_status = cst_approved THEN
6235 /*
6236 UPDATE IGS_PR_STDNT_PR_OU
6237 SET applied_dt = cst_applied_dt
6238 WHERE CURRENT OF c_spo_upd;
6239 */
6240 igs_pr_stdnt_pr_ou_pkg.update_row(
6241 x_rowid => v_spo_upd_rec.ROWID,
6242 x_person_id => v_spo_upd_rec.person_id,
6243 x_course_cd => v_spo_upd_rec.course_cd,
6244 x_sequence_number => v_spo_upd_rec.sequence_number,
6245 x_prg_cal_type => v_spo_upd_rec.prg_cal_type,
6246 x_prg_ci_sequence_number => v_spo_upd_rec.prg_ci_sequence_number,
6247 x_rule_check_dt => v_spo_upd_rec.rule_check_dt,
6248 x_progression_rule_cat => v_spo_upd_rec.progression_rule_cat,
6249 x_pra_sequence_number => v_spo_upd_rec.pra_sequence_number,
6250 x_pro_sequence_number => v_spo_upd_rec.pro_sequence_number,
6251 x_progression_outcome_type => v_spo_upd_rec.progression_outcome_type,
6252 x_duration => v_spo_upd_rec.duration,
6253 x_duration_type => v_spo_upd_rec.duration_type,
6254 x_decision_status => v_spo_upd_rec.decision_status,
6255 x_decision_dt => v_spo_upd_rec.decision_dt,
6256 x_decision_org_unit_cd => v_spo_upd_rec.decision_org_unit_cd,
6257 x_decision_ou_start_dt => v_spo_upd_rec.decision_ou_start_dt,
6258 x_applied_dt => cst_applied_dt,
6259 x_show_cause_expiry_dt => v_spo_upd_rec.show_cause_expiry_dt,
6260 x_show_cause_dt => v_spo_upd_rec.show_cause_dt,
6261 x_show_cause_outcome_dt => v_spo_upd_rec.show_cause_outcome_dt,
6262 x_show_cause_outcome_type => v_spo_upd_rec.show_cause_outcome_type,
6263 x_appeal_expiry_dt => v_spo_upd_rec.appeal_expiry_dt,
6264 x_appeal_dt => v_spo_upd_rec.appeal_dt,
6265 x_appeal_outcome_dt => v_spo_upd_rec.appeal_outcome_dt,
6266 x_appeal_outcome_type => v_spo_upd_rec.appeal_outcome_type,
6267 x_encmb_course_group_cd => v_spo_upd_rec.encmb_course_group_cd,
6268 x_restricted_enrolment_cp => v_spo_upd_rec.restricted_enrolment_cp,
6269 x_restricted_attendance_type => v_spo_upd_rec.restricted_attendance_type,
6270 x_comments => v_spo_upd_rec.comments,
6271 x_show_cause_comments => v_spo_upd_rec.show_cause_comments,
6272 x_appeal_comments => v_spo_upd_rec.appeal_comments,
6273 x_expiry_dt => v_spo_upd_rec.expiry_dt,
6274 x_pro_pra_sequence_number => v_spo_upd_rec.pro_pra_sequence_number,
6275 x_mode => 'R'
6276 );
6277
6278 END IF;
6279 CLOSE c_spo_upd;
6280 EXCEPTION
6281 WHEN e_record_locked THEN
6282 IF c_spo_upd%ISOPEN THEN
6283 CLOSE c_spo_upd;
6284 END IF;
6285 WHEN OTHERS THEN
6286 RAISE;
6287 END;
6288 RETURN;
6289 EXCEPTION
6290 WHEN OTHERS THEN
6291 IF c_spo_upd%ISOPEN THEN
6292 CLOSE c_spo_upd;
6293 END IF;
6294 RAISE;
6295 END;
6296 EXCEPTION
6297 WHEN OTHERS THEN
6298 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
6299 FND_MESSAGE.SET_TOKEN('NAME','IGS_PR_GEN_004.IGS_PR_UPD_SPO_APLY_DT');
6300 IGS_GE_MSG_STACK.ADD;
6301 App_Exception.Raise_Exception;
6302 END IGS_PR_upd_spo_aply_dt;
6303 PROCEDURE IGS_PR_upd_spo_maint
6304 (
6305 errbuf OUT NOCOPY VARCHAR2,
6306 retcode OUT NOCOPY NUMBER
6307 )
6308 IS
6309 gv_other_detail VARCHAR2(255);
6310 BEGIN -- IGS_PR_upd_spo_maint
6311 -- Update the progression status of a IGS_EN_STDNT_PS_ATT when elements of
6312 -- progression no longer reflect the status. eg. A penalty has expired, a
6313 -- show cause period has expired.
6314 DECLARE
6315 cst_approved CONSTANT VARCHAR2(10) := 'APPROVED';
6316 cst_probation CONSTANT VARCHAR2(10) := 'PROBATION';
6317 cst_exclusion CONSTANT VARCHAR2(10) := 'EXCLUSION';
6318 cst_expired CONSTANT VARCHAR2(10) := 'EXPIRED';
6319 cst_expulsion CONSTANT VARCHAR2(10) := 'EXPULSION';
6320 cst_goodstand CONSTANT VARCHAR2(10) := 'GOODSTAND';
6321 cst_manual CONSTANT VARCHAR2(10) := 'MANUAL';
6322 cst_nopenalty CONSTANT VARCHAR2(10) := 'NOPENALTY';
6323 cst_pending CONSTANT VARCHAR2(10) := 'PENDING';
6324 cst_showcause CONSTANT VARCHAR2(10) := 'SHOWCAUSE';
6325 cst_suspension CONSTANT VARCHAR2(10) := 'SUSPENSION';
6326 cst_undconsid CONSTANT VARCHAR2(10) := 'UNDCONSID';
6327 e_record_locked EXCEPTION;
6328 PRAGMA EXCEPTION_INIT(e_record_locked, -54);
6329 v_expiry_type VARCHAR2(10);
6330 v_expiry_dt DATE;
6331 v_sca_status_updated BOOLEAN;
6332 v_message_name VARCHAR2(30);
6333 v_dummy VARCHAR2(1);
6334 CURSOR c_spo IS
6335 SELECT spo.person_id,
6336 spo.course_cd,
6337 spo.sequence_number,
6338 spo.expiry_dt
6339 FROM IGS_PR_STDNT_PR_OU spo,
6340 IGS_PR_OU_TYPE pot
6341 WHERE spo.decision_status = cst_approved AND
6342 spo.applied_dt IS NOT NULL AND
6343 spo.expiry_dt IS NULL AND
6344 spo.duration IS NOT NULL AND
6345 pot.progression_outcome_type = spo.progression_outcome_type AND
6346 pot.s_progression_outcome_type IN
6347 (cst_suspension, cst_probation, cst_manual);
6348 CURSOR c_spo_upd (
6349 cp_person_id IGS_PR_STDNT_PR_OU.person_id%TYPE,
6350 cp_course_cd IGS_PR_STDNT_PR_OU.course_cd%TYPE,
6351 cp_sequence_number IGS_PR_STDNT_PR_OU.sequence_number%TYPE) IS
6352 SELECT spo.*, spo.ROWID
6353 FROM IGS_PR_STDNT_PR_OU spo
6354 WHERE spo.person_id = cp_person_id AND
6355 spo.course_cd = cp_course_cd AND
6356 spo.sequence_number = cp_sequence_number
6357 FOR UPDATE NOWAIT;
6358
6359 v_spo_upd_rec c_spo_upd%ROWTYPE;
6360
6361 CURSOR c_sca1 IS
6362 SELECT sca.person_id,
6363 sca.course_cd,
6364 sca.version_number,
6365 sca.progression_status
6366 FROM IGS_EN_STDNT_PS_ATT sca
6367 WHERE sca.progression_status = cst_goodstand AND
6368 sca.course_attempt_status NOT IN ('UNCONFIRM','DELETED','COMPLETED') AND
6369 EXISTS (
6370 SELECT 'X'
6371 FROM IGS_PR_STDNT_PR_OU spo,
6372 IGS_PR_OU_TYPE pot
6373 WHERE pot.progression_outcome_type = spo.progression_outcome_type AND
6374 spo.person_id = sca.person_id AND
6375 spo.course_cd = sca.course_cd AND
6376 ((spo.decision_status = cst_pending AND
6377 spo.course_cd = sca.course_cd)
6378 OR
6379 (spo.decision_status = cst_approved AND
6380 pot.s_progression_outcome_type <> cst_nopenalty AND
6381 IGS_PR_GEN_006.IGS_PR_GET_SPO_EXPIRY (
6382 spo.person_id,
6383 spo.course_cd,
6384 spo.sequence_number,
6385 spo.expiry_dt) <> cst_expired AND
6386 (
6387 pot.s_progression_outcome_type IN (cst_probation,cst_manual) OR
6388 EXISTS (
6389 SELECT 'X'
6390 FROM IGS_PR_STDNT_PR_PS spc
6391 WHERE spo.person_id = spc.person_id AND
6392 spo.course_cd = spc.spo_course_cd AND
6393 spo.sequence_number = spc.spo_sequence_number AND
6394 spc.course_cd = sca.course_cd) OR
6395 (spo.encmb_course_group_cd IS NOT NULL AND
6396 EXISTS (
6397 SELECT 'X'
6398 FROM IGS_PS_GRP_MBR cgm
6399 WHERE cgm.course_group_cd = spo.encmb_course_group_cd AND
6400 cgm.course_cd = sca.course_cd AND
6401 cgm.version_number = sca.version_number))))));
6402 CURSOR c_sca2 IS
6403 SELECT sca.person_id,
6404 sca.course_cd,
6405 sca.version_number,
6406 sca.progression_status
6407 FROM IGS_EN_STDNT_PS_ATT sca
6408 WHERE sca.progression_status = cst_undconsid AND
6409 sca.course_attempt_status NOT IN ('UNCONFIRM','DELETED','COMPLETED') AND
6410 NOT EXISTS (
6411 SELECT 'X'
6412 FROM IGS_PR_STDNT_PR_OU spo
6413 WHERE sca.person_id = spo.person_id AND
6414 sca.course_cd = spo.course_cd AND
6415 spo.decision_status = cst_pending);
6416 CURSOR c_sca3 IS
6417 SELECT sca.person_id,
6418 sca.course_cd,
6419 sca.version_number,
6420 sca.progression_status
6421 FROM IGS_EN_STDNT_PS_ATT sca
6422 WHERE sca.progression_status = cst_showcause AND
6423 sca.course_attempt_status NOT IN ('UNCONFIRM','DELETED','COMPLETED') AND
6424 NOT EXISTS (
6425 SELECT 'X'
6426 FROM IGS_PR_STDNT_PR_OU spo
6427 WHERE sca.person_id = spo.person_id AND
6428 sca.course_cd = spo.course_cd AND
6429 spo.decision_status = cst_approved AND
6430 spo.show_cause_expiry_dt IS NOT NULL AND
6431 ((spo.show_cause_dt IS NOT NULL AND
6432 spo.show_cause_outcome_dt IS NULL) OR
6433 (spo.show_cause_expiry_dt > TRUNC(SYSDATE))));
6434 CURSOR c_sca4 IS
6435 SELECT sca.person_id,
6436 sca.course_cd,
6437 sca.version_number,
6438 sca.progression_status
6439 FROM IGS_EN_STDNT_PS_ATT sca
6440 WHERE sca.progression_status IN (
6441 cst_probation,
6442 cst_suspension,
6443 cst_exclusion,
6444 cst_expulsion) AND
6445 sca.course_attempt_status NOT IN ('UNCONFIRM','DELETED','COMPLETED') AND
6446 NOT EXISTS (
6447 SELECT 'X'
6448 FROM IGS_PR_STDNT_PR_OU spo,
6449 IGS_PR_OU_TYPE pot
6450 WHERE pot.progression_outcome_type = spo.progression_outcome_type AND
6451 spo.person_id = sca.person_id AND
6452 spo.course_cd = sca.course_cd AND
6453 spo.decision_status = cst_approved AND
6454 (spo.decision_status = cst_approved AND
6455 pot.s_progression_outcome_type <> cst_nopenalty AND
6456 IGS_PR_GEN_006.IGS_PR_GET_SPO_EXPIRY (
6457 spo.person_id,
6458 spo.course_cd,
6459 spo.sequence_number,
6460 spo.expiry_dt) <> cst_expired AND
6461 (
6462 pot.s_progression_outcome_type IN (cst_probation,cst_manual) OR
6463 EXISTS (
6464 SELECT 'X'
6465 FROM IGS_PR_STDNT_PR_PS spc
6466 WHERE spo.person_id = spc.person_id AND
6467 spo.course_cd = spc.spo_course_cd AND
6468 spo.sequence_number = spc.spo_sequence_number AND
6469 spc.course_cd = sca.course_cd) OR
6470 (spo.encmb_course_group_cd IS NOT NULL AND
6471 EXISTS (
6472 SELECT 'X'
6473 FROM IGS_PS_GRP_MBR cgm
6474 WHERE cgm.course_group_cd = spo.encmb_course_group_cd AND
6475 cgm.course_cd = sca.course_cd AND
6476 cgm.version_number = sca.version_number)))));
6477
6478 CURSOR c_person(cp_party_id Number) IS
6479 SELECT PARTY_NUMBER FROM HZ_PARTIES
6480 WHERE PARTY_ID = cp_party_id;
6481
6482 lv_person_number HZ_PARTIES.PARTY_NUMBER%TYPE;
6483 BEGIN
6484 -- Check for students whose expiry date is now available ; set where
6485 -- appropriate
6486 retcode := 0;
6487 IGS_GE_GEN_003.SET_ORG_ID(); -- swaghmar, bug# 4951054
6488 FOR v_spo_rec IN c_spo LOOP
6489
6490 --Get the person number to be displayed in log file..
6491
6492 OPEN c_person(v_spo_rec.person_id);
6493 FETCH c_person INTO lv_person_number;
6494 close c_person;
6495
6496 v_expiry_type := IGS_PR_GEN_006.IGS_PR_get_spo_expiry (
6497 v_spo_rec.person_id,
6498 v_spo_rec.course_cd,
6499 v_spo_rec.sequence_number,
6500 v_spo_rec.expiry_dt,
6501 v_expiry_dt);
6502 IF v_expiry_dt IS NOT NULL THEN
6503 BEGIN
6504 OPEN c_spo_upd (
6505 v_spo_rec.person_id,
6506 v_spo_rec.course_cd,
6507 v_spo_rec.sequence_number);
6508 FETCH c_spo_upd INTO v_spo_upd_rec;
6509 /*
6510 UPDATE IGS_PR_STDNT_PR_OU
6511 SET expiry_dt = v_expiry_dt,
6512 applied_dt = igs_ge_date.igsdate('0001/01/01')
6513 WHERE CURRENT OF c_spo_upd;
6514 */
6515 igs_pr_stdnt_pr_ou_pkg.update_row(
6516 x_rowid => v_spo_upd_rec.ROWID,
6517 x_person_id => v_spo_upd_rec.person_id,
6518 x_course_cd => v_spo_upd_rec.course_cd,
6519 x_sequence_number => v_spo_upd_rec.sequence_number,
6520 x_prg_cal_type => v_spo_upd_rec.prg_cal_type,
6521 x_prg_ci_sequence_number => v_spo_upd_rec.prg_ci_sequence_number,
6522 x_rule_check_dt => v_spo_upd_rec.rule_check_dt,
6523 x_progression_rule_cat => v_spo_upd_rec.progression_rule_cat,
6524 x_pra_sequence_number => v_spo_upd_rec.pra_sequence_number,
6525 x_pro_sequence_number => v_spo_upd_rec.pro_sequence_number,
6526 x_progression_outcome_type => v_spo_upd_rec.progression_outcome_type,
6527 x_duration => v_spo_upd_rec.duration,
6528 x_duration_type => v_spo_upd_rec.duration_type,
6529 x_decision_status => v_spo_upd_rec.decision_status,
6530 x_decision_dt => v_spo_upd_rec.decision_dt,
6531 x_decision_org_unit_cd => v_spo_upd_rec.decision_org_unit_cd,
6532 x_decision_ou_start_dt => v_spo_upd_rec.decision_ou_start_dt,
6533 x_applied_dt => igs_ge_date.igsdate('0001/01/01'),
6534 x_show_cause_expiry_dt => v_spo_upd_rec.show_cause_expiry_dt,
6535 x_show_cause_dt => v_spo_upd_rec.show_cause_dt,
6536 x_show_cause_outcome_dt => v_spo_upd_rec.show_cause_outcome_dt,
6537 x_show_cause_outcome_type => v_spo_upd_rec.show_cause_outcome_type,
6538 x_appeal_expiry_dt => v_spo_upd_rec.appeal_expiry_dt,
6539 x_appeal_dt => v_spo_upd_rec.appeal_dt,
6540 x_appeal_outcome_dt => v_spo_upd_rec.appeal_outcome_dt,
6541 x_appeal_outcome_type => v_spo_upd_rec.appeal_outcome_type,
6542 x_encmb_course_group_cd => v_spo_upd_rec.encmb_course_group_cd,
6543 x_restricted_enrolment_cp => v_spo_upd_rec.restricted_enrolment_cp,
6544 x_restricted_attendance_type => v_spo_upd_rec.restricted_attendance_type,
6545 x_comments => v_spo_upd_rec.comments,
6546 x_show_cause_comments => v_spo_upd_rec.show_cause_comments,
6547 x_appeal_comments => v_spo_upd_rec.appeal_comments,
6548 x_expiry_dt => v_expiry_dt,--v_spo_upd_rec.expiry_dt, -- Modified by Prajeesh as part of the bug
6549 x_pro_pra_sequence_number => v_spo_upd_rec.pro_pra_sequence_number,
6550 x_mode => 'R'
6551 );
6552
6553 CLOSE c_spo_upd;
6554 EXCEPTION
6555 WHEN e_record_locked THEN
6556 IF c_spo_upd%ISOPEN THEN
6557 CLOSE c_spo_upd;
6558 END IF;
6559 WHEN OTHERS THEN
6560 RAISE;
6561 END;
6562 ELSE
6563 FND_FILE.PUT_LINE(FND_FILE.LOG,'The Person := '||lv_person_number ||
6564 ' With the Course := '||v_spo_upd_rec.COURSE_CD||' Has no Expiry date');
6565 END IF;
6566 END LOOP; -- c_spo
6567 --Functionality for the part of the code that follows:-
6568 -- Check the decision status for record in IGS_PR_STDNT_PR_OU table and check the corresponding
6569 -- progresssion statuses in the table IGS_EN_STDNT_PS_ATT and update these progression statuses suitably
6570
6571 -- Good Standing : Select records marked as good standing where either Pending
6572 -- record relates directly to the course attempt, or an approved record
6573 -- affects the course (either directly or via course of course group effects).
6574 FOR v_sca_rec IN c_sca1 LOOP
6575
6576 OPEN c_person(v_sca_rec.person_id);
6577 FETCH c_person INTO lv_person_number;
6578 close c_person;
6579
6580 v_sca_status_updated := IGS_PR_GEN_006.IGS_PR_upd_sca_status (
6581 v_sca_rec.person_id,
6582 v_sca_rec.course_cd,
6583 v_sca_rec.progression_status,
6584 v_sca_rec.version_number,
6585 v_message_name);
6586
6587 IF v_message_name = 'IGS_PR_LOCK_DETECTED' THEN
6588 FND_MESSAGE.SET_NAME('IGS', v_message_name);
6589 fnd_message.set_token('RECORD', 'Student program Attempt for ' || lv_person_number || ' and course ' || v_sca_rec.course_cd);
6590 FND_FILE.PUT_LINE(FND_FILE.LOG,fnd_message.get);
6591 end if;
6592 END LOOP; -- c_sca1
6593
6594 -- Corresponding to all records where decision status is still 'PENDING'
6595 -- set the progression status in the table 'IGS_EN_STDNT_PS_ATT' to 'UNCONSID'.
6596 -- Under Consideration : Selects records with status of under consideration
6597 -- where there are no longer any directly related progression outcomes being
6598 -- considered.
6599 FOR v_sca_rec IN c_sca2 LOOP
6600
6601 OPEN c_person(v_sca_rec.person_id);
6602 FETCH c_person INTO lv_person_number;
6603 close c_person;
6604
6605 v_sca_status_updated := IGS_PR_GEN_006.IGS_PR_upd_sca_status (
6606 v_sca_rec.person_id,
6607 v_sca_rec.course_cd,
6608 v_sca_rec.progression_status,
6609 v_sca_rec.version_number,
6610 v_message_name);
6611 IF v_message_name = 'IGS_PR_LOCK_DETECTED' THEN
6612 FND_MESSAGE.SET_NAME('IGS', v_message_name);
6613 fnd_message.set_token('RECORD', 'Student program Attempt for ' || lv_person_number || ' and course ' || v_sca_rec.course_cd);
6614 FND_FILE.PUT_LINE(FND_FILE.LOG,fnd_message.get);
6615 end if;
6616
6617 END LOOP; -- c_sca2
6618 -- Show Cause ; Selects records with a status of show cause where there is no
6619 -- longer any show cause processing in progress.
6620 FOR v_sca_rec IN c_sca3 LOOP
6621
6622 OPEN c_person(v_sca_rec.person_id);
6623 FETCH c_person INTO lv_person_number;
6624 close c_person;
6625
6626 v_sca_status_updated := IGS_PR_GEN_006.IGS_PR_upd_sca_status (
6627 v_sca_rec.person_id,
6628 v_sca_rec.course_cd,
6629 v_sca_rec.progression_status,
6630 v_sca_rec.version_number,
6631 v_message_name);
6632 IF v_message_name = 'IGS_PR_LOCK_DETECTED' THEN
6633 FND_MESSAGE.SET_NAME('IGS', v_message_name);
6634 fnd_message.set_token('RECORD', 'Student program Attempt for ' || lv_person_number || ' and course ' || v_sca_rec.course_cd);
6635 FND_FILE.PUT_LINE(FND_FILE.LOG,fnd_message.get);
6636 end if;
6637
6638 END LOOP; -- c_sca3
6639 -- Probation, Suspension, Exclusion, Expulsion : Selects records were effects
6640 -- of the associated progression outcome types are no longer effective
6641 -- (ie. typically have reached their expiry date).
6642 FOR v_sca_rec IN c_sca4 LOOP
6643
6644 OPEN c_person(v_sca_rec.person_id);
6645 FETCH c_person INTO lv_person_number;
6646 close c_person;
6647
6648 v_sca_status_updated := IGS_PR_GEN_006.IGS_PR_upd_sca_status (
6649 v_sca_rec.person_id,
6650 v_sca_rec.course_cd,
6651 v_sca_rec.progression_status,
6652 v_sca_rec.version_number,
6653 v_message_name);
6654 IF v_message_name = 'IGS_PR_LOCK_DETECTED' THEN
6655 FND_MESSAGE.SET_NAME('IGS', v_message_name);
6656 fnd_message.set_token('RECORD', 'Student program Attempt for ' || lv_person_number || ' and course ' || v_sca_rec.course_cd);
6657 FND_FILE.PUT_LINE(FND_FILE.LOG,fnd_message.get);
6658 end if;
6659
6660 END LOOP; -- c_sca4
6661 COMMIT;
6662 EXCEPTION
6663 WHEN OTHERS THEN
6664 IF c_spo%ISOPEN THEN
6665 CLOSE c_spo;
6666 END IF;
6667 IF c_spo%ISOPEN THEN
6668 CLOSE c_spo_upd;
6669 END IF;
6670 IF c_sca1%ISOPEN THEN
6671 CLOSE c_sca1;
6672 END IF;
6673 IF c_sca2%ISOPEN THEN
6674 CLOSE c_sca2;
6675 END IF;
6676 IF c_sca3%ISOPEN THEN
6677 CLOSE c_sca3;
6678 END IF;
6679 IF c_sca4%ISOPEN THEN
6680 CLOSE c_sca4;
6681 END IF;
6682 RAISE;
6683 END;
6684 EXCEPTION
6685 WHEN OTHERS THEN
6686 Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXP');
6687 FND_MESSAGE.SET_TOKEN('NAME','IGS_PR_GEN_004.IGS_PR_UPD_SPO_MAINT');
6688 IGS_GE_MSG_STACK.ADD;
6689 retcode := 2;
6690 errbuf := fnd_message.get_string('IGS','IGS_GE_UNHANDLED_EXP');
6691 IGS_GE_MSG_STACK.CONC_EXCEPTION_HNDL;
6692
6693 END IGS_PR_upd_spo_maint;
6694
6695 END IGS_PR_GEN_004;