DBA Data[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;