DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGS_EN_VAL_BULKRULE

Source


1 PACKAGE BODY IGS_EN_VAL_BULKRULE AS
2 /* $Header: IGSEN28B.pls 120.2 2006/05/02 23:54:29 ckasu noship $ */
3 /* smaddali modified all the procedures , added new parameters during
4    nov 2001 build of enrollment processes dld , bug#1832130 */
5 --Added refernces to column ORG_UNIT_CD incall to IGS_EN_SU_ATTEMPT TBH call as a part of bug 1964697
6   --
7   -- To process bulk unit Rule checks for students with todo entries
8   --added 3 new parameters for enrollment processes dld bug#1832130
9 --Who         When            What
10 --Aiyer     10-Oct-2001     Added the column grading schema in all Tbh calls of IGS_EN_SU_ATTEMPT_PKG as a part of the bug 2037897.
11 -- pradhakr  10-Dec-2001    Added the column deg_Aud_Detail_Id as part of Degree Audit Interface build.
12 --                          Bug# 2033208
13 -- svenkata   20-Dec-2001   Added columns student_career_transcript and Student_career_statistics as part of build Career
14 --                          Impact Part2 . Bug #2158626
15 -- svenkata   7-JAN-2002    Bug No. 2172405  Standard Flex Field columns have been added
16 --                          to table handler procedure calls as part of CCR - ENCR022.
17 --Nishikant  29-jan-2002     Added the column session_id  in the Tbh calls of IGS_EN_SU_ATTEMPT_PKG
18 --                           as a part of the bug 2172380.
19 --mesriniv    12-sep-2002     Added a new parameter waitlist_manual_ind in TBH call of IGS_EN_SU_ATTEMPT
20 --                            for  Bug 2554109 MINI Waitlist Build for Jan 03 Release
21 --svenkata   20-NOV-2002   Modified the call to the function igs_en_val_sua.enrp_val_sua_advstnd to add value 'N' for the parameter
22 --                         p_legacy. Bug#2661533.
23 -- pradhakr  04-Dec-2002   Changed the parameter sequence in the procedure ENRP_VAL_SCA_RULTODO.
24 --                         As per standard the parameter errbuf and retcode are made as the
25 --                         first two paramters. Changes as per bug# 2683629
26 -- pradhakr  15-Dec-2002   Changed the call to the update_row of igs_en_su_attempt
27 --                         table to igs_en_sua_api.update_unit_attempt.
28 --                         Changes wrt ENCR031 build. Bug# 2643207
29 -- svenkata   3-Jun-2003   The function ENRP_VAL_COO_CROSS has been removed. All references to this API is removed. Bug# 2829272
30 --rvivekan    3-SEP-2003     Waitlist Enhacements build # 3052426. 2 new columns added to
31 --                           IGS_EN_SU_ATTEMPT_PKG procedures and consequently to IGS_EN_SUA_API procedures
32 --rvangala    07-OCT-2003    Value for CORE_INDICATOR_CODE passed to IGS_EN_SUA_API.UPDATE_UNIT_ATTEMPT
33 --                           added as part of Prevent Dropping Core Units. Enh Bug# 3052432
34 --ptandon     25-Feb-2004    Modified procedure ENRP_VAL_SCA_RULTODO to log parameters in the log file of the
35 --                           job. Modified procedure enrpl_enrolled_to_invalid to rollback per unit attempt
36 --                           in case of exception and process the Subordinate unit attempts before Superior
37 --                           unit attempts. Modified procedure enrpl_invalid_to_enrolled to rollback per unit
38 --                           attempt in case of exception and process the Superior unit attempts before
39 --                           Subordinate unit attempts. Removed the exception handling block of enrp_val_sca_urule
40 --                           Bug# 3451409.
41 --svanukur    04-MAY-2004    Added the check to filter the programs based on the academic calendar type passed as
42 --                            parameter .
43 -- smaddali  15-oct-04      Modified for bug#3954071 - load calendar being passed to rules engine instead of teaching calendar
44   --ckasu      02-May-2006     Modified as a part of bug#5191592
45 
46   PROCEDURE ENRP_VAL_SCA_RULTODO(
47     errbuf OUT NOCOPY VARCHAR2 ,
48     retcode OUT NOCOPY NUMBER ,
49     p_acad_calander IN VARCHAR2,
50     p_crs_cd IN VARCHAR2 ,
51     p_org_id IN NUMBER,
52     -- added new parameters for enrollment processes build bug#1832130
53     p_load_teach_calendar IN VARCHAR2 ,
54     p_org_unit_cd IN VARCHAR2  ,
55     p_rule_to_be_validated IN VARCHAR2  )
56   AS
57     p_course_cd               igs_ps_course.course_cd%type;
58     p_acad_cal_type             igs_ca_inst.cal_type%TYPE ;
59     p_acad_sequence_number      igs_ca_inst.sequence_number%TYPE;
60     --added for enrollment processes dld bug#1832130
61     p_load_cal_type    igs_ca_inst.cal_type%TYPE ;
62     p_load_sequence_number   igs_ca_inst.sequence_number%TYPE;
63   BEGIN
64     retcode:=0;
65 
66      IGS_GE_GEN_003.SET_ORG_ID(p_org_id);
67 
68     p_course_cd :=      nvl(p_crs_cd,'%');
69     BEGIN
70      IF p_acad_calander IS NOT NULL THEN
71       p_acad_cal_type := RTRIM(SUBSTR(p_acad_calander,1,10));
72       p_acad_sequence_number := (SUBSTR(p_acad_calander,75,10));
73      ELSE
74       p_acad_cal_type := '%';
75      END IF;
76 
77       -- added for enrollment processes dld bug#1832130
78       p_load_cal_type  := RTRIM(SUBSTR(p_load_teach_calendar,101,10));
79       p_load_sequence_number  := SUBSTR(p_load_teach_calendar,111,10);
80     END ;
81     DECLARE
82       CURSOR c_st IS
83       SELECT    rowid,cst.*
84       FROM      IGS_PE_STD_TODO cst
85       WHERE     s_student_todo_type = 'UNIT-RULES' AND
86                 logical_delete_dt IS NULL AND
87                 NVL(todo_dt,TO_DATE('01/01/1980','DD/MM/YYYY')) <= SYSDATE
88       ORDER BY person_id asc
89       FOR UPDATE  NOWAIT;
90       CURSOR c_sca (cp_person_id IGS_EN_STDNT_PS_ATT.person_id%TYPE,
91                 cp_course_cd IGS_EN_STDNT_PS_ATT.course_cd%TYPE) IS
92       SELECT    course_cd
93       FROM      IGS_EN_STDNT_PS_ATT
94       WHERE     person_id = cp_person_id AND
95                 (course_cd = cp_course_cd OR
96                  course_cd like cp_course_cd) AND
97                 (cal_type = p_acad_cal_type OR
98                  cal_type like p_acad_cal_type) AND
99                 course_attempt_status IN ('ENROLLED','INACTIVE','INTERMIT');
100       v_creation_dt     DATE;
101       v_last_person_id  IGS_PE_PERSON.person_id%TYPE;
102 
103     BEGIN
104       -- Call routine to create a new IGS_GE_S_LOG entry under which the log
105       -- entries will be placed.
106       IGS_GE_GEN_003.GENP_INS_LOG(p_rule_to_be_validated,
107         p_acad_cal_type||','||TO_CHAR(p_acad_sequence_number)||','||p_course_cd,
108         v_creation_dt);
109 
110       -- Logging parameters in the Log File.
111       FND_FILE.PUT_LINE(FND_FILE.LOG,'================================================================================');
112       FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
113       FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET_STRING('IGS','IGS_EN_ACAD_CAL') || ': ' || RTRIM(SUBSTR(p_acad_calander,1,74)));
114       FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET_STRING('IGS','IGS_AD_CRS_CD') || ': ' || p_crs_cd);
115       FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET_STRING('IGS','IGS_EN_TERM_TEACH_CAL') || ': ' || RTRIM(SUBSTR(p_load_teach_calendar,1,100)));
116       FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET_STRING('IGS','IGS_PR_ORG_UNIT') || ': ' || p_org_unit_cd);
117       FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET_STRING('IGS','IGS_EN_RULE_TO_VAL') || ': ' || p_rule_to_be_validated);
118       FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
119       FND_FILE.PUT_LINE(FND_FILE.LOG,'================================================================================');
120 
121       v_last_person_id := 0;
122       BEGIN
123         FOR v_st_rec IN c_st
124         LOOP
125 
126           -- Only process each PERSON once (NOTE : a distinct could
127           -- not be used in the query due to the FOR UPDATE clause.
128           IF v_st_rec.person_id <> v_last_person_id THEN
129             v_last_person_id := v_st_rec.person_id;
130 
131             FOR v_sca_rec IN c_sca(v_st_rec.person_id,p_course_cd)
132             LOOP
133               -- Call routine to process individual student Course
134               -- attempt.
135               --added 4 new parameters to this call for enrollment processes dld
136 
137               IGS_EN_VAL_BULKRULE.enrp_val_sca_urule(
138                 p_acad_cal_type,
139                 p_acad_sequence_number,
140                 v_st_rec.person_id,
141                 v_sca_rec.course_cd,
142                 p_rule_to_be_validated,
143                 v_creation_dt,
144                 p_load_cal_type,
145                 p_load_sequence_number,
146                 p_org_unit_cd,
147                 p_rule_to_be_validated);
148             END LOOP;
149             -- Logically remove the todo entries as they have been processed.
150             /* For the coloumn to be updated,modify the record variable value fetched */
151             v_st_rec.logical_delete_dt := SYSDATE;
152             /* Call server side TBH package procedure */
153             IGS_PE_STD_TODO_pkg.update_row(
154               X_ROWID => v_st_rec.ROWID,
155               X_PERSON_ID => v_st_rec.PERSON_ID,
156               X_S_STUDENT_TODO_TYPE => v_st_rec.S_STUDENT_TODO_TYPE,
157               X_SEQUENCE_NUMBER => v_st_rec.SEQUENCE_NUMBER,
158               X_TODO_DT => v_st_rec.TODO_DT,
159               X_LOGICAL_DELETE_DT => v_st_rec.LOGICAL_DELETE_DT,
160               X_MODE => 'R');
161           END IF;
162         END LOOP;
163       END;
164       COMMIT;
165     END;
166 
167   EXCEPTION
168     WHEN OTHERS THEN
169       retcode:=2;
170       Fnd_File.PUT_LINE(Fnd_File.LOG,SQLERRM);
171       IF FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
172          FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,'igs.plsql.igs_en_val_bulkrule.enrp_val_sca_rultodo.UNH_EXP','Unhandled Exception raised with code '||SQLCODE||' and error '||SQLERRM);
173       END IF;
174       ERRBUF := FND_MESSAGE.GET_STRING('IGS','IGS_GE_UNHANDLED_EXCEPTION');
175       IGS_GE_MSG_STACK.CONC_EXCEPTION_HNDL;
176 
177   END enrp_val_sca_rultodo;
178 
179     --
180     -- Validate the unit rules for a student Course attempt (in bulk)
181   /* smaddali modified this procedure to add 3 new parameters and their use in code */
182   PROCEDURE ENRP_VAL_SCA_URULE(
183     p_acad_cal_type IN VARCHAR2 ,
184     p_acad_sequence_number IN NUMBER ,
185     p_person_id IN NUMBER ,
186     p_course_cd IN VARCHAR2 ,
187     p_s_log_type IN VARCHAR2 ,
188     p_creation_dt IN DATE ,
189     -- added new parameters for bug#1832130
190     p_cal_type IN VARCHAR2  ,
191     p_ci_sequence_number IN NUMBER  ,
192     p_org_unit_cd IN VARCHAR2  ,
193     p_rule_to_be_validated IN VARCHAR2 )
194   -------------------------------------------------------------------------------------------
195   --Change History:
196   --Who         When            What
197   --kkillams    28-04-2003      Modified the r_unit_attempt_typ record type definition in the
198   --                            enrpl_enrolled_to_invalid and enrpl_invalid_to_enrolled procedures
199   --                            w.r.t. bug number 2829262
200   -- svenkata   3-Jun-2003      The function ENRP_VAL_COO_CROSS has been removed. All references to this API is removed. Bug# 2829272
201   --rvangala    07-OCT-2003     Value for CORE_INDICATOR_CODE passed to IGS_EN_SUA_API.UPDATE_UNIT_ATTEMPT
202   --                            added as part of Prevent Dropping Core Units. Enh Bug# 3052432
203   --ptandon     25-Feb-2004     Modified procedure enrpl_enrolled_to_invalid to rollback per unit attempt
204   --                            in case of exception and process the Subordinate unit attempts before Superior
205   --                            unit attempts. Modified procedure enrpl_invalid_to_enrolled to rollback per unit
206   --                            attempt in case of exception and process the Superior unit attempts before
207   --                            Subordinate unit attempts. Removed the exception handling block of
208   --                            enrp_val_sca_urule. Bug# 3451409.
209   --svanukur    04-MAY-2004     Modified procedures enrpl_enrolled_to_invalid and enrpl_invalid_to_enrolled to pass
210   --                            the Term calendar as parameter to the rule checking procedures in IGS_RU_VAL_UNIT_RULE
211   --                             to fix bug 3606629
212   -- smaddali 15-oct-04         Modified for bug#3954071, reverted earlier fix bug 3606629 of passing load calendar to rules engine
213   -------------------------------------------------------------------------------------------
214   AS
215   BEGIN
216     DECLARE
217       cst_s_control_num CONSTANT        IGS_EN_CAL_CONF.s_control_num%TYPE := 1;
218       e_no_records_found        EXCEPTION;
219       v_enrolled_rule_cutoff_dt         IGS_EN_CAL_CONF.enrolled_rule_cutoff_dt_alias%TYPE;
220       v_invalid_rule_cutoff_dt          IGS_EN_CAL_CONF.invalid_rule_cutoff_dt_alias%TYPE;
221       v_message_name                            varchar2(30);
222       CURSOR c_secc IS
223       SELECT    secc.enrolled_rule_cutoff_dt_alias,
224                 secc.invalid_rule_cutoff_dt_alias
225       FROM      IGS_EN_CAL_CONF secc
226       WHERE     secc.s_control_num = cst_s_control_num;
227 
228         /* smaddali modified this procedure to add 4 new parameters and their use in code
229         --stutta      08-SEP-2004   Modified c_sua as part of performance tuning bug #3869677*/
230         -------------------------------------
231         PROCEDURE enrpl_enrolled_to_invalid (
232           p_acad_cal_type                       IN      IGS_CA_INST.cal_type%TYPE,
233           p_acad_sequence_number                IN      IGS_CA_INST.sequence_number%TYPE,
234           p_person_id                           IN      IGS_EN_STDNT_PS_ATT.person_id%TYPE,
235           p_course_cd                           IN      IGS_EN_STDNT_PS_ATT.course_cd%TYPE,
236           p_s_log_type                          IN      IGS_GE_S_LOG.s_log_type%TYPE,
237           p_creation_dt                         IN      IGS_GE_S_LOG.creation_dt%TYPE,
238           p_invalid_rule_cutoff_dt              IN      IGS_EN_CAL_CONF.invalid_rule_cutoff_dt_alias%TYPE,
239           --added for enrollment processes dld by smaddali bug#1832130
240           p_cal_type                            IN  IGS_CA_INST.cal_type%TYPE,
241           p_ci_sequence_number                  IN  IGS_CA_INST.sequence_number%TYPE ,
242           p_org_unit_cd                         IN  IGS_OR_UNIT.org_unit_cd%TYPE ,
243           p_rule_to_be_validated                IN  IGS_EN_SU_ATTEMPT_ALL.failed_unit_rule%TYPE  )
244         IS
245         BEGIN
246           DECLARE
247             cst_enrolled   CONSTANT  IGS_EN_SU_ATTEMPT.unit_attempt_status%TYPE := 'ENROLLED';
248             cst_active CONSTANT IGS_CA_INST.cal_status%TYPE := 'ACTIVE';
249 
250             v_counter   NUMBER; -- keeps record of the number of records in the PL/SQL table
251             v_next_rec  BOOLEAN; -- used to determine if the next record should be found
252             v_do_cursor_again_ind       BOOLEAN;
253             v_last_date_to_invalid      IGS_CA_DA_INST_V.alias_val%TYPE;
254             v_message_text              VARCHAR2(2000);
255             -- Add the following one line of code.       From Callista 2.0  18-May-2000
256             v_sca_version_number              IGS_EN_STDNT_PS_ATT.version_number%TYPE;
257             -- Initialise PL/SQL table to hold UNIT attempt records which
258             -- cannot be set to INVALID.
259             TYPE r_unit_attempt_typ IS RECORD (rv_uoo_id   igs_en_su_attempt.uoo_id%TYPE);
260             r_unit_attempt_rec          r_unit_attempt_typ;
261             TYPE t_unit_attempt_typ IS TABLE OF r_unit_attempt_rec%TYPE
262                         INDEX BY BINARY_INTEGER;
263             t_unit_attempt_tab          t_unit_attempt_typ;
264 
265             t_unit_att_failure t_unit_attempt_typ;
266             r_unit_att_failure_rec r_unit_attempt_typ;
267             l_counter_failure NUMBER;
268             l_log_msg BOOLEAN;
269 
270             -- modified for enrollment processes build bug#1832130 by smaddali
271             -- to consider the new parameters added.this cursor selects all the
272             -- student unit attempts for the passed program attempt.
273             --The two selects are mutually exclusive ie at any time the calendar passed is
274             --either 'LOAD' or 'TEACHING' so this cursor selects the unit attempts
275             -- for that particular calendar passed as parameter
276             CURSOR c_sua(cp_cal_cat igs_ca_type.s_cal_cat%TYPE) IS
277             -- selects the unit attempt when a teaching calendar is passed
278             SELECT
279              sua.unit_cd,
280              sua.cal_type,
281              sua.ci_sequence_number,
282              sua.version_number,
283              sua.location_cd,
284              sua.unit_class,
285              ci.alternate_code,
286              uoo.uoo_id,
287              sua.sup_unit_cd
288             FROM  IGS_EN_SU_ATTEMPT    sua,
289              IGS_CA_INST  ci,
290              IGS_PS_UNIT_OFR_OPT uoo
291             WHERE
292              sua.person_id = p_person_id
293              AND sua.course_cd = p_course_cd
294              AND sua.unit_attempt_status = 'ENROLLED'
295              AND sua.rule_waived_dt IS NULL
296              AND ci.cal_type    = sua.cal_type
297              AND ci.sequence_number = sua.ci_sequence_number
298              AND uoo.uoo_id  = sua.uoo_id
299              AND uoo.owner_org_unit_cd LIKE NVL(p_org_unit_cd,'%')
300              AND (
301                 ( cp_cal_cat = 'TEACHING'
302                   AND sua.cal_type LIKE NVL(p_cal_type,'%')
303                   AND sua.ci_sequence_number = nvl(p_ci_sequence_number,sua.ci_sequence_number)
304                 ) OR
305                 ( cp_cal_cat = 'LOAD' AND
306                   (sua.cal_type,sua.ci_sequence_number) IN
307                    ( SELECT teach_cal_type,teach_ci_sequence_number
308                      FROM IGS_CA_LOAD_TO_TEACH_V
309                      WHERE load_cal_type LIKE NVL(p_cal_type,'%')
310                      AND load_ci_sequence_number = nvl(p_ci_sequence_number,load_ci_sequence_number)
311                    )
312                 )
313                   )
314             ORDER BY  sup_unit_cd;
315 
316             -- gets the invalid cutoff date alias value
317             CURSOR c_daiv (
318                         cp_sua_cal_type         IGS_EN_SU_ATTEMPT.cal_type%TYPE,
319                         cp_sua_sequence_number  IGS_EN_SU_ATTEMPT.ci_sequence_number%TYPE) IS
320             SELECT      MAX(daiv.alias_val)
321             FROM        IGS_CA_DA_INST_V        daiv
322             WHERE       daiv.cal_type = cp_sua_cal_type AND
323                         daiv.ci_sequence_number  = cp_sua_sequence_number AND
324                         daiv.dt_alias = p_invalid_rule_cutoff_dt;
325 
326             -- Add the following five lines of code.       From Callista 2.0  18-May-2000
327             --gets the course varsion number for the student program attempt
328             CURSOR c_sca IS
329             SELECT      sca.version_number
330             FROM        IGS_EN_STDNT_PS_ATT     sca
331             WHERE       sca.person_id = p_person_id AND
332                         sca.course_cd = p_course_cd;
333 
334             --smaddali modified this cursor to select only one unit section attempt
335             --instead of all the unit sections of a given unit cd during enrollment processes dld
336             CURSOR cur_IGS_EN_SU_ATTEMPT(cp_unit_cd VARCHAR2,
337                                          cp_uoo_id igs_en_su_attempt_all.uoo_id%TYPE) IS
338             SELECT sua.*
339             FROM   IGS_EN_SU_ATTEMPT sua,
340                    IGS_CA_INST  ci
341             WHERE     sua.person_id = p_person_id AND
342                       sua.course_cd = p_course_cd AND
343                       sua.unit_attempt_status = cst_enrolled AND
344                       sua.rule_waived_dt IS NULL        AND
345                       ci.cal_type       = sua.cal_type  AND
346                       ci.sequence_number = sua.ci_sequence_number AND
347                       sua.unit_cd = cp_unit_cd AND
348                       --added for enrollment processes dld by smaddali
349                       sua.uoo_id = cp_uoo_id;
350 
351             /* smaddali bug#1832130 enrollment processes build nov 2001 release
352               added declarations for workflow events */
353            CURSOR cur_cal_cat IS
354            SELECT s_cal_cat
355            FROM IGS_CA_TYPE
356            WHERE  cal_type = p_cal_type ;
357             l_cal_cat igs_ca_type.s_cal_cat%TYPE ;
358             l_failed_rule igs_en_su_attempt_all.failed_unit_rule%TYPE ;
359             l_retval  BOOLEAN ;
360             sua_rec cur_IGS_EN_SU_ATTEMPT%ROWTYPE ;
361 
362 
363           BEGIN
364             -- 3. Check all ENROLLED UNIT attempt IGS_PS_UNIT rules. If a RULE is failed the
365             -- status is set to  INVALID and the select is repeated. This process
366             -- repeats until no further units fail rules.
367             --------------------------------------------------------
368 
369             v_counter := 0;
370             l_counter_failure :=0;
371             -- Add the following nine lines of code.       From Callista 2.0  18-May-2000
372             -- Determine the version number of the course to be used in the call to
373             -- rulp_val_enrol_unit.
374 
375             OPEN c_sca;
376             FETCH c_sca INTO v_sca_version_number;
377             IF c_sca%NOTFOUND THEN
378                 CLOSE c_sca;
379                 RAISE NO_DATA_FOUND;
380             END IF;
381             CLOSE c_sca;
382 
383             IF p_cal_type IS NULL THEN
384                   l_cal_cat := 'TEACHING' ;
385             ELSE
386                 OPEN cur_cal_cat ;
387                 FETCH cur_cal_cat INTO l_cal_cat ;
388                 CLOSE cur_cal_cat ;
389             END IF;
390 
391             LOOP
392               v_do_cursor_again_ind := FALSE;
393               -- get the calendar category of the calendar passed
394 
395               FOR v_sua_rec IN c_sua(l_cal_cat)
396               LOOP
397 
398               DECLARE
399                 l_message_text VARCHAR2(1000);
400               BEGIN
401                 SAVEPOINT sp_sua;
402                 v_next_rec := FALSE;
403 
404                 -- unit attempts which can't be set to invalid shouldn't be
405                 -- processed again - would result in a never ending recursive loop
406                 FOR i IN 1..v_counter
407                 LOOP
408                   r_unit_attempt_rec := t_unit_attempt_tab(i);
409                   IF (r_unit_attempt_rec.rv_uoo_id = v_sua_rec.uoo_id) THEN
410                     v_next_rec := TRUE;
411                     EXIT;
412                   END IF;
413                 END LOOP;
414 
415                 IF (v_next_rec = FALSE) THEN
416 
417                   -- sua record is not in the PL/SQL table
418                   -- Select the last date to switch to ENROLLED from the teaching period.
419                   IF (p_invalid_rule_cutoff_dt IS NOT NULL) THEN
420                     OPEN c_daiv(
421                         v_sua_rec.cal_type,
422                         v_sua_rec.ci_sequence_number);
423                     FETCH c_daiv INTO v_last_date_to_invalid;
424                     IF (c_daiv%NOTFOUND) THEN
425                       v_last_date_to_invalid := NULL;
426                     END IF;
427                     CLOSE c_daiv;
428                   ELSE
429                     v_last_date_to_invalid := NULL;
430                   END IF;
431 
432                   -- Check whether the unit attempt fails the unit rule passed as parameter
433                   -- If so, it should be set to INVALID.
434                   IF (p_rule_to_be_validated = 'PRE-REQ') THEN
435 
436                   --if rule to validate is prerequisite then call the corresponding
437                     l_retval := IGS_RU_VAL_UNIT_RULE.rulp_val_prereq(
438                                 p_person_id,
439                                 p_course_cd,
440                                 v_sua_rec.unit_cd,
441                                 v_sua_rec.cal_type,
442                                 v_sua_rec.ci_sequence_number,
443                                 v_message_text ,
444                                 v_sca_version_number,
445                                 v_sua_rec.version_number,
446                                 v_sua_rec.uoo_id,
447                                 l_failed_rule );
448 
449                   ELSIF (p_rule_to_be_validated = 'CO-REQ') THEN
450 
451                     l_retval := IGS_RU_VAL_UNIT_RULE.rulp_val_coreq(
452                                 p_person_id,
453                                 p_course_cd,
454                                 v_sua_rec.unit_cd,
455                                 v_sua_rec.cal_type,
456                                 v_sua_rec.ci_sequence_number,
457                                 v_message_text ,
458                                 v_sca_version_number,
459                                 v_sua_rec.version_number,
460                                 v_sua_rec.uoo_id,
461                                 l_failed_rule );
462                  ELSIF (p_rule_to_be_validated = 'INCOMP') THEN
463 
464                     l_retval := IGS_RU_VAL_UNIT_RULE.rulp_val_incomp(
465                                 p_person_id,
466                                 p_course_cd,
467                                 v_sua_rec.unit_cd,
468                                 v_sua_rec.cal_type,
469                                 v_sua_rec.ci_sequence_number,
470                                 v_message_text ,
471                                 v_sca_version_number,
472                                 v_sua_rec.version_number,
473                                 v_sua_rec.uoo_id,
474                                 l_failed_rule );
475 
476                   ELSIF (p_rule_to_be_validated = 'ALL') THEN
477 
478                     l_retval := IGS_RU_VAL_UNIT_RULE.rulp_val_enrol_unit(
479                                 p_person_id,
480                                 p_course_cd,
481                                 -- Add the following one lines of code.From Callista 2.0  18-May-2000
482                                 v_sca_version_number,
483                                 v_sua_rec.unit_cd,
484                                 v_sua_rec.version_number,
485                                 v_sua_rec.cal_type,
486                                 v_sua_rec.ci_sequence_number,
487                                 v_message_text ,
488                                 v_sua_rec.uoo_id,
489                                 l_failed_rule );
490 
491                   END IF ;
492                   IF NOT l_retval THEN
493 
494                    -- if the rule has failed then log an entry and try to change to invalid
495                     IF (v_last_date_to_invalid IS NOT NULL AND
496                         SYSDATE > v_last_date_to_invalid) THEN
497                       --the invalid cutoff date has passed so cannot make invalid
498                       -- If logging is required, then log the change to the passed log
499 
500                       IF (p_s_log_type IS NOT NULL AND
501                         p_creation_dt IS NOT NULL) THEN
502                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
503                           p_s_log_type,
504                           p_creation_dt,
505                           'WARNING,' || p_person_id || ',' ||
506                           p_course_cd ||',' ||
507                           v_sua_rec.unit_cd || ',' ||
508                           v_sua_rec.version_number || ',' ||
509                           'ENROLLED,' || v_sua_rec.alternate_code || ',' ||
510                           v_sua_rec.location_cd || ',' ||
511                           v_sua_rec.unit_class,
512                           'IGS_EN_UA_FAILS_ST_INVALID',
513                           NULL);
514                       END IF;
515                       -- Store unit_cd, cal_type and ci_sequence_number in PL/SQL table
516                       r_unit_attempt_rec.rv_uoo_id := v_sua_rec.uoo_id;
517                       v_counter := v_counter + 1;
518                       t_unit_attempt_tab(v_counter) := r_unit_attempt_rec;
519                     ELSE
520                       -- Set the student unit attempt to invalid
521                       -- as rules are being breached.
522 
523                       OPEN cur_IGS_EN_SU_ATTEMPT(v_sua_rec.unit_cd,v_sua_rec.uoo_id)  ;
524                       FETCH cur_IGS_EN_SU_ATTEMPT INTO sua_rec  ;
525                       CLOSE cur_IGS_EN_SU_ATTEMPT ;
526                       /* For the coloumn to be updated,modify the record variable value fetched */
527                       sua_rec.unit_attempt_status := 'INVALID' ;
528                       -- Call the API to update the student unit attempt. This API is a
529                       -- wrapper to the update row of the TBH.
530                       igs_en_sua_api.update_unit_attempt(
531                             X_ROWID => sua_rec.ROW_ID,
532                             X_PERSON_ID => sua_rec.PERSON_ID,
533                             X_COURSE_CD => sua_rec.COURSE_CD,
534                             X_UNIT_CD => sua_rec.UNIT_CD,
535                             X_CAL_TYPE => sua_rec.CAL_TYPE,
536                             X_CI_SEQUENCE_NUMBER => sua_rec.CI_SEQUENCE_NUMBER,
537                             X_VERSION_NUMBER => sua_rec.VERSION_NUMBER,
538                             X_LOCATION_CD => sua_rec.LOCATION_CD,
539                             X_UNIT_CLASS => sua_rec.UNIT_CLASS,
540                             X_CI_START_DT => sua_rec.CI_START_DT,
541                             X_CI_END_DT => sua_rec.CI_END_DT,
542                             X_UOO_ID => sua_rec.UOO_ID,
543                             X_ENROLLED_DT => sua_rec.ENROLLED_DT,
544                             X_UNIT_ATTEMPT_STATUS => sua_rec.UNIT_ATTEMPT_STATUS,
545                             X_ADMINISTRATIVE_UNIT_STATUS => sua_rec.ADMINISTRATIVE_UNIT_STATUS,
546                             X_ADMINISTRATIVE_PRIORITY => sua_rec.ADMINISTRATIVE_PRIORITY,
547                             X_DISCONTINUED_DT => sua_rec.DISCONTINUED_DT,
548                             X_DCNT_REASON_CD  => sua_rec.DCNT_REASON_CD ,
549                             X_RULE_WAIVED_DT => sua_rec.RULE_WAIVED_DT,
550                             X_RULE_WAIVED_PERSON_ID => sua_rec.RULE_WAIVED_PERSON_ID,
551                             X_NO_ASSESSMENT_IND => sua_rec.NO_ASSESSMENT_IND,
552                             X_SUP_UNIT_CD => sua_rec.SUP_UNIT_CD,
553                             X_SUP_VERSION_NUMBER => sua_rec.SUP_VERSION_NUMBER,
554                             X_EXAM_LOCATION_CD => sua_rec.EXAM_LOCATION_CD,
555                             X_ALTERNATIVE_TITLE => sua_rec.ALTERNATIVE_TITLE,
556                             X_OVERRIDE_ENROLLED_CP => sua_rec.OVERRIDE_ENROLLED_CP,
557                             X_OVERRIDE_EFTSU => sua_rec.OVERRIDE_EFTSU,
558                             X_OVERRIDE_ACHIEVABLE_CP => sua_rec.OVERRIDE_ACHIEVABLE_CP,
559                             X_OVERRIDE_OUTCOME_DUE_DT => sua_rec.OVERRIDE_OUTCOME_DUE_DT,
560                             X_OVERRIDE_CREDIT_REASON => sua_rec.OVERRIDE_CREDIT_REASON,
561                             X_WAITLIST_DT => sua_rec.WAITLIST_DT,
562                             X_MODE  => 'R' ,
563                             -- added for enrollment processes dld nov2001 by smaddali
564                             X_GS_VERSION_NUMBER => sua_rec.gs_version_number,
565                             X_ENR_METHOD_TYPE  => sua_rec.enr_method_type,
566                             X_FAILED_UNIT_RULE  => l_failed_rule,
567                             X_CART => sua_rec.CART,
568                             X_RSV_SEAT_EXT_ID => sua_rec.RSV_SEAT_EXT_ID,
569                             X_ORG_UNIT_CD => sua_rec.ORG_UNIT_CD ,
570                             -- session_id added by Nishikant 28JAN2002 - Enh Bug#2172380.
571                             X_SESSION_ID          => sua_rec.session_id,
572                             -- Added the column grading schema as a part pf the bug 2037897. - aiyer
573                             X_GRADING_SCHEMA_CODE => sua_rec.GRADING_SCHEMA_CODE,
574                             -- Added the column deg_aud_detail_id as part of Degree Audit Interface build (Bug# 2033208)
575                             -- by pradhakr
576                             X_DEG_AUD_DETAIL_ID   => sua_rec.DEG_AUD_DETAIL_ID,
577                             X_SUBTITLE       =>  sua_rec.subtitle,
578                             X_STUDENT_CAREER_TRANSCRIPT =>  sua_rec.student_career_transcript,
579                             X_STUDENT_CAREER_STATISTICS =>  sua_rec.student_career_statistics,
580                             X_ATTRIBUTE_CATEGORY        =>  sua_rec.attribute_category,
581                             X_ATTRIBUTE1                =>  sua_rec.attribute1,
582                             X_ATTRIBUTE2                =>  sua_rec.attribute2,
583                             X_ATTRIBUTE3                =>  sua_rec.attribute3,
584                             X_ATTRIBUTE4                =>  sua_rec.attribute4,
585                             X_ATTRIBUTE5                =>  sua_rec.attribute5,
586                             X_ATTRIBUTE6                =>  sua_rec.attribute6,
587                             X_ATTRIBUTE7                =>  sua_rec.attribute7,
588                             X_ATTRIBUTE8                =>  sua_rec.attribute8,
589                             X_ATTRIBUTE9                =>  sua_rec.attribute9,
590                             X_ATTRIBUTE10               =>  sua_rec.attribute10,
591                             X_ATTRIBUTE11               =>  sua_rec.attribute11,
592                             X_ATTRIBUTE12               =>  sua_rec.attribute12,
593                             X_ATTRIBUTE13               =>  sua_rec.attribute13,
594                             X_ATTRIBUTE14               =>  sua_rec.attribute14,
595                             X_ATTRIBUTE15               =>  sua_rec.attribute15,
596                             X_ATTRIBUTE16               =>  sua_rec.attribute16,
597                             X_ATTRIBUTE17               =>  sua_rec.attribute17,
598                             X_ATTRIBUTE18               =>  sua_rec.attribute18,
599                             X_ATTRIBUTE19               =>  sua_rec.attribute19,
600                             X_ATTRIBUTE20               =>  sua_rec.attribute20,
601                             X_WAITLIST_MANUAL_IND       =>  sua_rec.waitlist_manual_ind, --Added by mesriniv for Bug 2554109 Mini Waitlist Build.
602                             X_WLST_PRIORITY_WEIGHT_NUM  =>  sua_rec.wlst_priority_weight_num,
603                             X_WLST_PREFERENCE_WEIGHT_NUM=>  sua_rec.wlst_preference_weight_num,
604                             -- CORE_INDICATOR_CODE added by rvangala 07-OCT-2003. Enh Bug# 3052432
605                             X_CORE_INDICATOR_CODE       =>  sua_rec.core_indicator_code
606                             );
607 
608                       -- added for bug#1832130 enrollment processes dld
609                       -- raise the workflow event  to send a mail to the student when the
610                       --student unit attempt status has changed from enrolled to invalid
611                      IGS_EN_WORKFLOW.SUA_STATUS_CHANGE_MAIL(sua_rec.UNIT_ATTEMPT_STATUS,
612                                       sua_rec.PERSON_ID,sua_rec.UOO_ID);
613 
614                       -- If logging is required, then log the change to the passed log
615                       IF (p_s_log_type IS NOT NULL AND
616                         p_creation_dt IS NOT NULL) THEN
617                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
618                           p_s_log_type,
619                           p_creation_dt,
620                           'INFO,' || p_person_id || ',' ||
621                           p_course_cd ||',' ||
622                           v_sua_rec.unit_cd || ',' ||
623                           v_sua_rec.version_number || ',' ||
624                           'INVALID,' || v_sua_rec.alternate_code || ',' ||
625                           v_sua_rec.location_cd || ',' ||
626                           v_sua_rec.unit_class,
627                           'IGS_EN_UA_FAILES_STATUS_INVAL',
628                           NULL);
629                       END IF;
630                     END IF;
631                     -- Exit from loop and repeat entire select
632                     v_do_cursor_again_ind := TRUE;
633                     EXIT;
634                   END IF;
635                 END IF;
636               EXCEPTION
637                WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
638 
639                 ROLLBACK TO sp_sua;
640                 IF FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
641                    FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,'igs.plsql.igs_en_val_bulkrule.enrp_val_sca_urule.enrpl_enrolled_to_invalid.APP_EXP','Application Exception raised with code '||SQLCODE||' and error '||SQLERRM);
642                 END IF;
643                 l_message_text := FND_MESSAGE.GET;
644 
645                 IF l_message_text IS NULL THEN
646                    l_message_text := FND_MESSAGE.GET_STRING('IGS','IGS_GE_UNEXPECTED_ERR');
647                 END IF;
648                 IF (p_s_log_type IS NOT NULL AND
649                     p_creation_dt IS NOT NULL) THEN
650 
651                     l_log_msg := TRUE;
652 
653                     FOR i IN 1..l_counter_failure
654                     LOOP
655                        r_unit_att_failure_rec := t_unit_att_failure(i);
656                        IF (r_unit_att_failure_rec.rv_uoo_id = v_sua_rec.uoo_id) THEN
657                           l_log_msg := FALSE;
658                        EXIT;
659                      END IF;
660                     END LOOP;
661 
662                     IF l_log_msg = TRUE THEN
663 
664                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
665                           p_s_log_type,
666                           p_creation_dt,
667                           'ERROR,' || p_person_id || ',' ||
668                           p_course_cd ||',' ||
669                           v_sua_rec.unit_cd || ',' ||
670                           v_sua_rec.version_number || ',' ||
671                           'ENROLLED,' || v_sua_rec.alternate_code || ',' ||
672                           v_sua_rec.location_cd || ',' ||
673                           v_sua_rec.unit_class,
674                           NULL,
675                           l_message_text);
676 
677                           r_unit_att_failure_rec.rv_uoo_id := v_sua_rec.uoo_id;
678                           l_counter_failure := l_counter_failure + 1;
679                           t_unit_att_failure(l_counter_failure) := r_unit_att_failure_rec;
680 
681                     END IF;
682                 END IF;
683 
684                WHEN OTHERS THEN
685 
686                 ROLLBACK TO sp_sua;
687                 IF FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
688                    FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,'igs.plsql.igs_en_val_bulkrule.enrp_val_sca_urule.enrpl_enrolled_to_invalid.UNH_EXP','Unhandled Exception raised with code '||SQLCODE||' and error '||SQLERRM);
689                 END IF;
690                 l_message_text := FND_MESSAGE.GET;
691                 IF l_message_text IS NULL THEN
692                    l_message_text := FND_MESSAGE.GET_STRING('IGS','IGS_GE_UNEXPECTED_ERR');
693                 END IF;
694                 IF (p_s_log_type IS NOT NULL AND
695                     p_creation_dt IS NOT NULL) THEN
696 
697                     l_log_msg := TRUE;
698 
699                     FOR i IN 1..l_counter_failure
700                     LOOP
701                        r_unit_att_failure_rec := t_unit_att_failure(i);
702                        IF (r_unit_att_failure_rec.rv_uoo_id = v_sua_rec.uoo_id) THEN
703                           l_log_msg := FALSE;
704                        EXIT;
705                      END IF;
706                     END LOOP;
707 
708                     IF l_log_msg = TRUE THEN
709 
710                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
711                           p_s_log_type,
712                           p_creation_dt,
713                           'ERROR,' || p_person_id || ',' ||
714                           p_course_cd ||',' ||
715                           v_sua_rec.unit_cd || ',' ||
716                           v_sua_rec.version_number || ',' ||
717                           'ENROLLED,' || v_sua_rec.alternate_code || ',' ||
718                           v_sua_rec.location_cd || ',' ||
719                           v_sua_rec.unit_class,
720                           NULL,
721                           l_message_text);
722 
723                           r_unit_att_failure_rec.rv_uoo_id := v_sua_rec.uoo_id;
724                           l_counter_failure := l_counter_failure + 1;
725                           t_unit_att_failure(l_counter_failure) := r_unit_att_failure_rec;
726 
727                     END IF;
728                 END IF;
729 
730               END;
731               END LOOP;
732               IF (v_do_cursor_again_ind = FALSE) THEN
733                 EXIT;
734               END IF;
735             END LOOP;
736 
737           END;
738         END enrpl_enrolled_to_invalid;
739 
740      /* --smaddali modified this procedure to add 3 new parameters and their use in code
741         --rvangala    07-OCT-2003    Value for CORE_INDICATOR_CODE passed to IGS_EN_SUA_API.UPDATE_UNIT_ATTEMPT
742         --                   added as part of Prevent Dropping Core Units. Enh Bug# 3052432
743         --stutta      08-SEP-2004   Modified c_sua_sca as part of performance tuning bug #3869677
744         --stutta      21-FEB-2006   Modified c_sua_sca and added pl/sql logic as part of bug #5051047
745         --ckasu       25-APR-2006    Modfied as a part of bug#5191592.
746         */
747       -----------------------------------
748       PROCEDURE enrpl_invalid_to_enrolled (
749                 p_acad_cal_type            IN      IGS_CA_INST.cal_type%TYPE,
750                 p_acad_sequence_number     IN      IGS_CA_INST.sequence_number%TYPE,
751                 p_person_id                IN      IGS_EN_STDNT_PS_ATT.person_id%TYPE,
752                 p_course_cd                IN      IGS_EN_STDNT_PS_ATT.course_cd%TYPE,
753                 p_s_log_type               IN      IGS_GE_S_LOG.s_log_type%TYPE,
754                 p_creation_dt              IN      IGS_GE_S_LOG.creation_dt%TYPE,
755                 p_enrolled_rule_cutoff_dt  IN      IGS_EN_CAL_CONF.enrolled_rule_cutoff_dt_alias%TYPE,
756                 --added for enrollment processes dld by smaddali bug#1832130
757                 p_cal_type                 IN      IGS_CA_INST.cal_type%TYPE ,
758                 p_ci_sequence_number       IN      IGS_CA_INST.sequence_number%TYPE ,
759                 p_org_unit_cd              IN      IGS_OR_UNIT.org_unit_cd%TYPE )
760       IS
761       BEGIN
762         DECLARE
763             v_counter    NUMBER;  -- keeps record of the number of records in the PL/SQL table
764             v_next_rec  BOOLEAN; -- used to determine if the next record should be found
765             v_do_cursor_again_ind               BOOLEAN;
766             v_last_date_to_enrolled             IGS_CA_DA_INST_V.alias_val%TYPE;
767             v_validation_error          BOOLEAN;
768             v_message_text                      VARCHAR2(2000);
769             v_validation_message_name   VARCHAR2(30);
770             v_attendance_types          VARCHAR2(100);
771              cst_active CONSTANT IGS_CA_INST.cal_status%TYPE := 'ACTIVE';
772             -- Initialise PL/SQL table to hold UNIT attempt records which
773             -- cannot be set to ENROLLED.
774             TYPE r_unit_attempt_typ IS RECORD (rv_uoo_id   IGS_EN_SU_ATTEMPT.uoo_id%TYPE);
775             r_unit_attempt_rec          r_unit_attempt_typ;
776             TYPE t_unit_attempt_typ IS TABLE OF r_unit_attempt_rec%TYPE
777                 INDEX BY BINARY_INTEGER;
778             t_unit_attempt_tab          t_unit_attempt_typ;
779 
780             t_unit_att_failure t_unit_attempt_typ;
781             r_unit_att_failure_rec r_unit_attempt_typ;
782             l_counter_failure NUMBER;
783             l_log_msg BOOLEAN;
784 
785             -- exception declaration - used when updating sua.unit_attempt_status
786             e_resource_busy_exception           EXCEPTION;
787             PRAGMA EXCEPTION_INIT(e_resource_busy_exception, -54);
788 
789             -- modified for enrollment processes build bug#1832130 by smaddali
790             -- to consider the new parameters added .
791             --The two selects are mutually exclusive ie at any time the calendar passed is
792             --either 'LOAD' or 'TEACHING' so this cursor selects the unit attempts
793             -- for that particular calendar passed as parameter
794 
795             CURSOR c_sua_sca(cp_cal_cat igs_ca_type.s_cal_cat%TYPE, cp_cal_type igs_ca_inst.cal_type%TYPE, cp_ci_sequence_number igs_ca_inst.sequence_number%TYPE) IS
796             --selects unit attempts when a teaching calendar is passed
797             SELECT sua.unit_cd,
798              sua.version_number      sua_version_number,
799              sua.cal_type,
800              sua.ci_sequence_number,
801              sua.unit_class,
802              sua.location_cd,
803              sca.version_number      sca_version_number,
804              sca.coo_id,
805              ci.alternate_code ,
806              uoo.uoo_id,
807              sua.sup_unit_cd
808             FROM IGS_EN_SU_ATTEMPT      sua,
809              IGS_EN_STDNT_PS_ATT    sca,
810              IGS_CA_INST            ci ,
811              IGS_PS_UNIT_OFR_OPT uoo
812             WHERE    sua.person_id = p_person_id
813             AND sua.course_cd = p_course_cd
814             AND sua.unit_attempt_status = 'INVALID'
815             AND sca.person_id = sua.person_id
816             AND sca.course_cd = sua.course_cd
817             AND ci.sequence_number = sua.ci_sequence_number
818             AND ci.cal_type = sua.cal_type
819             AND uoo.uoo_id  = sua.uoo_id
820             AND uoo.owner_org_unit_cd LIKE NVL(p_org_unit_cd,'%')
821             AND sua.cal_type LIKE NVL(cp_cal_type ,'%')
822             AND sua.ci_sequence_number = nvl( cp_ci_sequence_number ,sua.ci_sequence_number)
823             ORDER BY sup_unit_cd DESC;
824 
825             --smaddali modified this cursor to select only one unit section attempt
826             --instead of all the unit sections of a given unit cd during enrollment processes dld
827             CURSOR cur_IGS_EN_SU_ATTEMPT(cp_unit_cd varchar2,
828                                          cp_uoo_id igs_en_su_attempt_all.uoo_id%TYPE) IS
829             SELECT sua.*
830             FROM     IGS_EN_SU_ATTEMPT sua,
831                      IGS_EN_STDNT_PS_ATT        sca,
832                      IGS_CA_INST        ci
833             WHERE       sua.person_id = p_person_id AND
834                         sua.course_cd = p_course_cd AND
835                         sua.unit_attempt_status = 'INVALID' AND
836                         sca.person_id = sua.person_id AND
837                         sca.course_cd = sua.course_cd AND
838                         ci.cal_type = sua.cal_type      AND
839                         ci.sequence_number = sua.ci_sequence_number AND
840                         sua.unit_cd = cp_unit_cd AND
841                         --added for enrollment processes dld by smaddali
842                         sua.uoo_id = cp_uoo_id;
843 
844             CURSOR c_daiv (
845                    cp_sua_cal_type              IGS_EN_SU_ATTEMPT.cal_type%TYPE,
846                    cp_sua_sequence_number       IGS_EN_SU_ATTEMPT.ci_sequence_number%TYPE) IS
847             SELECT      MAX(daiv.alias_val)
848             FROM        IGS_CA_DA_INST_V        daiv
849             WHERE       daiv.cal_type = cp_sua_cal_type AND
850                         daiv.ci_sequence_number  = cp_sua_sequence_number AND
851                         daiv.dt_alias = p_enrolled_rule_cutoff_dt;
852 
853             /* smaddali bug#1832130 enrollment processes build nov 2001 release
854             added declarations for workflow events and new parameters added to this procedure */
855            CURSOR cur_cal_cat IS
856            SELECT s_cal_cat
857            FROM IGS_CA_TYPE
858            WHERE  cal_type = p_cal_type ;
859 
860            CURSOR c_load_to_teach IS
861            SELECT teach_cal_type,teach_ci_sequence_number
862            FROM   IGS_CA_LOAD_TO_TEACH_V
863            WHERE  load_cal_type = p_cal_type
864            AND    load_ci_sequence_number = nvl( p_ci_sequence_number ,load_ci_sequence_number);
865 
866            rec_teach c_load_to_teach%ROWTYPE;
867             l_cal_cat igs_ca_type.s_cal_cat%TYPE ;
868             l_failed_rule igs_en_su_attempt_all.failed_unit_rule%TYPE;
869             sua_rec cur_IGS_EN_SU_ATTEMPT%ROWTYPE ;
870             l_loop_ended BOOLEAN := FALSE;
871 
872         BEGIN
873           -- 2. Re-check all INVALID UNIT attempts and switch to ENROLLED if the
874           -- rules are now passed. If an invalid unit passes all rules the status is
875           -- set to ENROLLED and the select is repeated. This repeats until no more
876           -- invalid unit attempts pass the unit rules.
877           --------------------------------------------------------------------------
878           v_counter := 0;
879           l_counter_failure := 0;
880 
881           IF p_cal_type IS NULL THEN
882                   l_cal_cat := 'TEACHING' ;
883           ELSE
884                 OPEN cur_cal_cat ;
885                 FETCH cur_cal_cat INTO l_cal_cat ;
886                 CLOSE cur_cal_cat ;
887           END IF;
888 
889           l_loop_ended := FALSE;
890 
891           IF l_cal_cat = 'TEACHING' THEN
892              --
893             rec_teach.teach_cal_type := p_cal_type;
894             rec_teach.teach_ci_sequence_number := p_ci_sequence_number;
895           ELSIF l_cal_cat = 'LOAD' THEN
896             OPEN c_load_to_teach;
897           END IF;
898           LOOP -- loop to find each teach calendar associated with the load.
899 
900             IF l_cal_cat = 'LOAD' THEN
901               --
902 
903               FETCH c_load_to_teach INTO rec_teach;
904               IF c_load_to_teach%NOTFOUND THEN
905                 --
906                 l_loop_ended :=TRUE;
907               END IF;
908 
909             END IF;
910             EXIT WHEN l_loop_ended = TRUE;
911     --
912 
913           LOOP
914             v_do_cursor_again_ind := FALSE;
915             -- for eachof the unit attempts of the student program attempt
916             --validate the rule
917             -- get the calendar category of the calendar passed
918 
919 		    FOR v_sua_sca_rec IN c_sua_sca(l_cal_cat, rec_teach.teach_cal_type, rec_teach.teach_ci_sequence_number)
920               LOOP
921              DECLARE
922               l_message_text VARCHAR2(1000);
923              BEGIN
924               SAVEPOINT sp_sua;
925               v_next_rec := FALSE;
926               -- unit attempts which can't be set to enrolled shouldn't be processed
927               -- again - would result in a never ending recursive loop.
928               FOR i IN 1..v_counter
929               LOOP
930                 r_unit_attempt_rec := t_unit_attempt_tab(i);
931                 IF (r_unit_attempt_rec.rv_uoo_id = v_sua_sca_rec.uoo_id) THEN
932                     v_next_rec := TRUE;
933                     EXIT;
934                 END IF;
935               END LOOP;
936               --if unit attempt hasn't been processed before then only validate for rules
937               IF (v_next_rec = FALSE) THEN
938                   -- sua record is not in the PL/SQL table
939                   -- Select the last date to switch to ENROLLED from the teaching period
940                   IF (p_enrolled_rule_cutoff_dt IS NOT NULL) THEN
941                        OPEN c_daiv(v_sua_sca_rec.cal_type,v_sua_sca_rec.ci_sequence_number);
942                        FETCH c_daiv INTO v_last_date_to_enrolled;
943                        IF (c_daiv%NOTFOUND) THEN
944                              v_last_date_to_enrolled := NULL;
945                        END IF;
946                        CLOSE c_daiv;
947                   ELSE
948                        v_last_date_to_enrolled := NULL;
949                   END IF;
950 
951                   -- Check that there is still a unit Rule being failed for the UNIT
952                   -- attempt.  If not, it should be switched back to ENROLLED.
953                   -- smaddali added two new parameters to this function bug#1832130
954 
955                   IF IGS_RU_VAL_UNIT_RULE.rulp_val_enrol_unit(
956                             p_person_id,
957                             p_course_cd,
958                             -- Add the following one line of code.  From Callista 2.0  18-May-2000
959                             v_sua_sca_rec.sca_version_number,
960                             v_sua_sca_rec.unit_cd,
961                             v_sua_sca_rec.sua_version_number,
962                             v_sua_sca_rec.cal_type,
963                             v_sua_sca_rec.ci_sequence_number,
964                             v_message_text ,
965                             --added for enrollment processes dld by smaddali
966                             v_sua_sca_rec.uoo_id,
967                            l_failed_rule) = TRUE THEN
968                        v_validation_error := FALSE;
969                        IF (v_last_date_to_enrolled IS NOT NULL AND
970                                 SYSDATE > v_last_date_to_enrolled) THEN
971                          -- if the enrollment cutoff date has passed then cannot
972                          --change the unit to enrolled , so mark as validation error
973                             v_validation_error := TRUE;
974                             v_validation_message_name := 'IGS_EN_UA_CHGST_ENROLLED';
975 
976                        ELSE
977                            --update the unit attempt status to enrolled and set failed unit rule to NULL
978                            OPEN cur_IGS_EN_SU_ATTEMPT(v_sua_sca_rec.unit_cd, v_sua_sca_rec.uoo_id);
979                            FETCH cur_IGS_EN_SU_ATTEMPT INTO sua_rec ;
980                            CLOSE cur_IGS_EN_SU_ATTEMPT  ;
981                            /* For the column to be updated,modify the record variable value fetched */
982 
983                            sua_rec.unit_attempt_status := 'ENROLLED' ;
984                            -- Call the API to update the student unit attempt. This API is a
985                            -- wrapper to the update row of the TBH.
986                            igs_en_sua_api.update_unit_attempt(
987                                  X_ROWID => sua_rec.ROW_ID,
988                                  X_PERSON_ID => sua_rec.PERSON_ID,
989                                  X_COURSE_CD => sua_rec.COURSE_CD,
990                                  X_UNIT_CD => sua_rec.UNIT_CD,
991                                  X_CAL_TYPE => sua_rec.CAL_TYPE,
992                                  X_CI_SEQUENCE_NUMBER => sua_rec.CI_SEQUENCE_NUMBER,
993                                  X_VERSION_NUMBER => sua_rec.VERSION_NUMBER,
994                                  X_LOCATION_CD => sua_rec.LOCATION_CD,
995                                  X_UNIT_CLASS => sua_rec.UNIT_CLASS,
996                                  X_CI_START_DT => sua_rec.CI_START_DT,
997                                  X_CI_END_DT => sua_rec.CI_END_DT,
998                                  X_UOO_ID => sua_rec.UOO_ID,
999                                  X_ENROLLED_DT => sua_rec.ENROLLED_DT,
1000                                  X_UNIT_ATTEMPT_STATUS => sua_rec.UNIT_ATTEMPT_STATUS,
1001                                  X_ADMINISTRATIVE_UNIT_STATUS => sua_rec.ADMINISTRATIVE_UNIT_STATUS,
1002                                  X_ADMINISTRATIVE_PRIORITY => sua_rec.ADMINISTRATIVE_PRIORITY,
1003                                  X_DISCONTINUED_DT => sua_rec.DISCONTINUED_DT,
1004                                  X_DCNT_REASON_CD  => sua_rec.DCNT_REASON_CD ,
1005                                  X_RULE_WAIVED_DT => sua_rec.RULE_WAIVED_DT,
1006                                  X_RULE_WAIVED_PERSON_ID => sua_rec.RULE_WAIVED_PERSON_ID,
1007                                  X_NO_ASSESSMENT_IND => sua_rec.NO_ASSESSMENT_IND,
1008                                  X_SUP_UNIT_CD => sua_rec.SUP_UNIT_CD,
1009                                  X_SUP_VERSION_NUMBER => sua_rec.SUP_VERSION_NUMBER,
1010                                  X_EXAM_LOCATION_CD => sua_rec.EXAM_LOCATION_CD,
1011                                  X_ALTERNATIVE_TITLE => sua_rec.ALTERNATIVE_TITLE,
1012                                  X_OVERRIDE_ENROLLED_CP => sua_rec.OVERRIDE_ENROLLED_CP,
1013                                  X_OVERRIDE_EFTSU => sua_rec.OVERRIDE_EFTSU,
1014                                  X_OVERRIDE_ACHIEVABLE_CP => sua_rec.OVERRIDE_ACHIEVABLE_CP,
1015                                  X_OVERRIDE_OUTCOME_DUE_DT => sua_rec.OVERRIDE_OUTCOME_DUE_DT,
1016                                  X_OVERRIDE_CREDIT_REASON => sua_rec.OVERRIDE_CREDIT_REASON,
1017                                  X_WAITLIST_DT => sua_rec.waitlist_dt,
1018                                  X_MODE  => 'R' ,
1019                                  X_GS_VERSION_NUMBER => sua_rec.gs_version_number,
1020                                  X_ENR_METHOD_TYPE  => sua_rec.enr_method_type,
1021                                  X_FAILED_UNIT_RULE  => l_failed_rule ,
1022                                  X_CART => sua_rec.CART,
1023                                  X_RSV_SEAT_EXT_ID => sua_rec.RSV_SEAT_EXT_ID,
1024                                  X_ORG_UNIT_CD  =>  sua_rec.ORG_UNIT_CD,
1025                                  -- session_id added by Nishikant 28JAN2002 - Enh Bug#2172380.
1026                                  X_SESSION_ID   =>  sua_rec.session_id,
1027                                  -- Added the column grading schema as a part pf the bug 2037897. - aiyer
1028                                  X_GRADING_SCHEMA_CODE => sua_rec.GRADING_SCHEMA_CODE,
1029                                  -- Added the column deg_aud_detail_id as part of Degree Audit Interface build (Bug# 2033208)
1030                                  -- by pradhakr
1031                                  X_DEG_AUD_DETAIL_ID      => sua_rec.DEG_AUD_DETAIL_ID,
1032                                  X_SUBTITLE               =>  sua_rec.subtitle,
1033                                  X_STUDENT_CAREER_TRANSCRIPT =>  sua_rec.student_career_transcript,
1034                                  X_STUDENT_CAREER_STATISTICS =>  sua_rec.student_career_statistics,
1035                                  X_ATTRIBUTE_CATEGORY        =>  sua_rec.attribute_category,
1036                                  X_ATTRIBUTE1                =>  sua_rec.attribute1,
1037                                  X_ATTRIBUTE2                =>  sua_rec.attribute2,
1038                                  X_ATTRIBUTE3                =>  sua_rec.attribute3,
1039                                  X_ATTRIBUTE4                =>  sua_rec.attribute4,
1040                                  X_ATTRIBUTE5                =>  sua_rec.attribute5,
1041                                  X_ATTRIBUTE6                =>  sua_rec.attribute6,
1042                                  X_ATTRIBUTE7                =>  sua_rec.attribute7,
1043                                  X_ATTRIBUTE8                =>  sua_rec.attribute8,
1044                                  X_ATTRIBUTE9                =>  sua_rec.attribute9,
1045                                  X_ATTRIBUTE10               =>  sua_rec.attribute10,
1046                                  X_ATTRIBUTE11               =>  sua_rec.attribute11,
1047                                  X_ATTRIBUTE12               =>  sua_rec.attribute12,
1048                                  X_ATTRIBUTE13               =>  sua_rec.attribute13,
1049                                  X_ATTRIBUTE14               =>  sua_rec.attribute14,
1050                                  X_ATTRIBUTE15               =>  sua_rec.attribute15,
1051                                  X_ATTRIBUTE16               =>  sua_rec.attribute16,
1052                                  X_ATTRIBUTE17               =>  sua_rec.attribute17,
1053                                  X_ATTRIBUTE18               =>  sua_rec.attribute18,
1054                                  X_ATTRIBUTE19               =>  sua_rec.attribute19,
1055                                  X_ATTRIBUTE20               =>  sua_rec.attribute20,
1056                                  X_WAITLIST_MANUAL_IND       =>  sua_rec.waitlist_manual_ind, --Added by mesriniv for Bug 2554109 Mini Waitlist Build.
1057                                  X_WLST_PRIORITY_WEIGHT_NUM  =>  sua_rec.wlst_priority_weight_num,
1058                                  X_WLST_PREFERENCE_WEIGHT_NUM=>  sua_rec.wlst_preference_weight_num,
1059                                   -- CORE_INDICATOR_CODE added by rvangala 07-OCT-2003. Enh Bug# 3052432
1060                                  X_CORE_INDICATOR_CODE       =>  sua_rec.core_indicator_code
1061                                  );
1062 
1063                        END IF;
1064                       IF (v_validation_error = FALSE) THEN
1065 
1066                           -- ie unt attempt has passed rules so changed to enrolled
1067                           -- so check for other validations
1068                           IF (IGS_EN_VAL_ENCMB.enrp_val_excld_unit(
1069                                   p_person_id,p_course_cd,v_sua_sca_rec.unit_cd,
1070                                   SYSDATE,v_message_name) = FALSE) THEN
1071                              v_validation_error := TRUE;
1072                              v_validation_message_name := 'IGS_EN_UA_NOFAIL_STUD_EXCL';
1073 
1074                           ELSIF (IGS_EN_VAL_SUA.enrp_val_sua_intrmt(
1075                                 p_person_id,p_course_cd,v_sua_sca_rec.cal_type,
1076                                 v_sua_sca_rec.ci_sequence_number,v_message_name) = FALSE) THEN
1077                              v_validation_error := TRUE;
1078                              v_validation_message_name := 'IGS_EN_UA_NOFAIL_UNIT_ATT';
1079 
1080                           ELSIF (IGS_EN_VAL_SUA.enrp_val_sua_advstnd( p_person_id,p_course_cd,
1081                                  v_sua_sca_rec.sca_version_number, v_sua_sca_rec.unit_cd,
1082                                  v_sua_sca_rec.sua_version_number,
1083                                  v_message_name , 'N') = FALSE AND  v_message_name <> 'IGS_EN_STUD_APPROVED_ADVSTD') THEN
1084                              v_validation_error := TRUE;
1085                              v_validation_message_name := 'IGS_EN_UA_NOFAIL_UNIT_EXISTS';
1086 
1087                           ELSIF (IGS_EN_VAL_SUA.enrp_val_coo_mode( v_sua_sca_rec.coo_id,
1088                                    v_sua_sca_rec.unit_class,v_message_name) = FALSE OR
1089                                IGS_EN_VAL_SUA.enrp_val_coo_loc( v_sua_sca_rec.coo_id,
1090                                    v_sua_sca_rec.location_cd,v_message_name) = FALSE OR
1091                                IGS_EN_VAL_SCA.enrp_val_coo_att(
1092                                   p_person_id,v_sua_sca_rec.coo_id,v_sua_sca_rec.cal_type,
1093                                   v_sua_sca_rec.ci_sequence_number,v_message_name,
1094                                   v_attendance_types,
1095                                   nvl(p_cal_type,v_sua_sca_rec.cal_type),
1096                                   nvl(p_ci_sequence_number,v_sua_sca_rec.ci_sequence_number)) = FALSE) THEN
1097                              v_validation_error := TRUE;
1098                              v_validation_message_name := 'IGS_EN_UA_NOFAIL_BREACHES_FND';
1099 
1100                           END IF;
1101                       END IF;
1102 
1103                       IF (v_validation_error) THEN
1104 
1105                           -- if any of the above validations failed or the cutoff date has failed
1106                           -- then revert to the invalid state of the unit attempt and enter into log
1107                           OPEN cur_IGS_EN_SU_ATTEMPT(v_sua_sca_rec.unit_cd,v_sua_sca_rec.uoo_id);
1108                           FETCH cur_IGS_EN_SU_ATTEMPT INTO sua_rec ;
1109                           CLOSE cur_IGS_EN_SU_ATTEMPT  ;
1110                           -- Set the status back to invalid
1111                           /* For the coloumn to be updated,modify the record variable value fetched */
1112                           sua_rec.unit_attempt_status := 'INVALID';
1113                           -- Call the API to update the student unit attempt. This API is a
1114                           -- wrapper to the update row of the TBH.
1115                           igs_en_sua_api.update_unit_attempt(
1116                             X_ROWID => sua_rec.ROW_ID,
1117                             X_PERSON_ID => sua_rec.PERSON_ID,
1118                             X_COURSE_CD => sua_rec.COURSE_CD,
1119                             X_UNIT_CD => sua_rec.UNIT_CD,
1120                             X_CAL_TYPE => sua_rec.CAL_TYPE,
1121                             X_CI_SEQUENCE_NUMBER => sua_rec.CI_SEQUENCE_NUMBER,
1122                             X_VERSION_NUMBER => sua_rec.VERSION_NUMBER,
1123                             X_LOCATION_CD => sua_rec.LOCATION_CD,
1124                             X_UNIT_CLASS => sua_rec.UNIT_CLASS,
1125                             X_CI_START_DT => sua_rec.CI_START_DT,
1126                             X_CI_END_DT => sua_rec.CI_END_DT,
1127                             X_UOO_ID => sua_rec.UOO_ID,
1128                             X_ENROLLED_DT => sua_rec.ENROLLED_DT,
1129                             X_UNIT_ATTEMPT_STATUS => sua_rec.UNIT_ATTEMPT_STATUS,
1130                             X_ADMINISTRATIVE_UNIT_STATUS => sua_rec.ADMINISTRATIVE_UNIT_STATUS,
1131                             X_ADMINISTRATIVE_PRIORITY => sua_rec.ADMINISTRATIVE_PRIORITY,
1132                             X_DISCONTINUED_DT => sua_rec.DISCONTINUED_DT,
1133                             X_DCNT_REASON_CD  => sua_rec.DCNT_REASON_CD ,
1134                             X_RULE_WAIVED_DT => sua_rec.RULE_WAIVED_DT,
1135                             X_RULE_WAIVED_PERSON_ID => sua_rec.RULE_WAIVED_PERSON_ID,
1136                             X_NO_ASSESSMENT_IND => sua_rec.NO_ASSESSMENT_IND,
1137                             X_SUP_UNIT_CD => sua_rec.SUP_UNIT_CD,
1138                             X_SUP_VERSION_NUMBER => sua_rec.SUP_VERSION_NUMBER,
1139                             X_EXAM_LOCATION_CD => sua_rec.EXAM_LOCATION_CD,
1140                             X_ALTERNATIVE_TITLE => sua_rec.ALTERNATIVE_TITLE,
1141                             X_OVERRIDE_ENROLLED_CP => sua_rec.OVERRIDE_ENROLLED_CP,
1142                             X_OVERRIDE_EFTSU => sua_rec.OVERRIDE_EFTSU,
1143                             X_OVERRIDE_ACHIEVABLE_CP => sua_rec.OVERRIDE_ACHIEVABLE_CP,
1144                             X_OVERRIDE_OUTCOME_DUE_DT => sua_rec.OVERRIDE_OUTCOME_DUE_DT,
1145                             X_OVERRIDE_CREDIT_REASON => sua_rec.OVERRIDE_CREDIT_REASON,
1146                             X_WAITLIST_DT => sua_rec.waitlist_dt,
1147                             X_MODE  => 'R' ,
1148                             --added the new fields for enrollment processes dld
1149                             X_GS_VERSION_NUMBER => sua_rec.gs_version_number,
1150                             X_ENR_METHOD_TYPE  => sua_rec.enr_method_type,
1151                             X_FAILED_UNIT_RULE  => sua_rec.failed_unit_rule,
1152                             X_CART => sua_rec.CART,
1153                             X_RSV_SEAT_EXT_ID => sua_rec.RSV_SEAT_EXT_ID ,
1154                             X_ORG_UNIT_CD => sua_rec.ORG_UNIT_CD,
1155                             -- session_id added by Nishikant 28JAN2002 - Enh Bug#2172380.
1156                             X_SESSION_ID   => sua_rec.session_id,
1157                             -- Added the column grading schema as a part pf the bug 2037897. - aiyer
1158                             X_GRADING_SCHEMA_CODE => sua_rec.GRADING_SCHEMA_CODE,
1159                             -- Added the column deg_aud_detail_id as part of Degree Audit Interface build (Bug# 2033208)
1160                             -- by pradhakr
1161                             X_DEG_AUD_DETAIL_ID   => sua_rec.DEG_AUD_DETAIL_ID,
1162                             X_SUBTITLE       =>  sua_rec.subtitle,
1163                             X_STUDENT_CAREER_TRANSCRIPT =>  sua_rec.student_career_transcript,
1164                             X_STUDENT_CAREER_STATISTICS =>  sua_rec.student_career_statistics,
1165                             X_ATTRIBUTE_CATEGORY        =>  sua_rec.attribute_category,
1166                             X_ATTRIBUTE1                =>  sua_rec.attribute1,
1167                             X_ATTRIBUTE2                =>  sua_rec.attribute2,
1168                             X_ATTRIBUTE3                =>  sua_rec.attribute3,
1169                             X_ATTRIBUTE4                =>  sua_rec.attribute4,
1170                             X_ATTRIBUTE5                =>  sua_rec.attribute5,
1171                             X_ATTRIBUTE6                =>  sua_rec.attribute6,
1172                             X_ATTRIBUTE7                =>  sua_rec.attribute7,
1173                             X_ATTRIBUTE8                =>  sua_rec.attribute8,
1174                             X_ATTRIBUTE9                =>  sua_rec.attribute9,
1175                             X_ATTRIBUTE10               =>  sua_rec.attribute10,
1176                             X_ATTRIBUTE11               =>  sua_rec.attribute11,
1177                             X_ATTRIBUTE12               =>  sua_rec.attribute12,
1178                             X_ATTRIBUTE13               =>  sua_rec.attribute13,
1179                             X_ATTRIBUTE14               =>  sua_rec.attribute14,
1180                             X_ATTRIBUTE15               =>  sua_rec.attribute15,
1181                             X_ATTRIBUTE16               =>  sua_rec.attribute16,
1182                             X_ATTRIBUTE17               =>  sua_rec.attribute17,
1183                             X_ATTRIBUTE18               =>  sua_rec.attribute18,
1184                             X_ATTRIBUTE19               =>  sua_rec.attribute19,
1185                             X_ATTRIBUTE20               =>  sua_rec.attribute20,
1186                             X_WAITLIST_MANUAL_IND       =>  sua_rec.waitlist_manual_ind ,--Added by mesriniv for Bug 2554109 Mini Waitlist Build.
1187                             X_WLST_PRIORITY_WEIGHT_NUM  =>  sua_rec.wlst_priority_weight_num,
1188                             X_WLST_PREFERENCE_WEIGHT_NUM=>  sua_rec.wlst_preference_weight_num,
1189                              -- CORE_INDICATOR_CODE added by rvangala 07-OCT-2003. Enh Bug# 3052432
1190                             X_CORE_INDICATOR_CODE       =>  sua_rec.core_indicator_code
1191                             ) ;
1192                           -- If logging is required, then log the change to the passed log
1193                           IF (p_s_log_type IS NOT NULL AND
1194                                   p_creation_dt IS NOT NULL) THEN
1195                              IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1196                                 p_s_log_type,
1197                                 p_creation_dt,
1198                                 'WARNING,' || p_person_id || ',' ||
1199                                 p_course_cd ||',' ||
1200                                  v_sua_sca_rec.unit_cd || ',' ||
1201                                 v_sua_sca_rec.sua_version_number || ',' ||
1202                                 'INVALID,' || v_sua_sca_rec.alternate_code || ',' ||
1203                                 v_sua_sca_rec.location_cd || ',' ||
1204                                 v_sua_sca_rec.unit_class,
1205                                 v_validation_message_name,
1206                                 NULL);
1207 
1208                           END IF;
1209                           -- the unit attempt has been validated to invalid
1210                           -- Store unit_cd, cal_type, ci_sequence_number in PL/SQL table
1211                           r_unit_attempt_rec.rv_uoo_id := v_sua_sca_rec.uoo_id;
1212                           v_counter := v_counter + 1;
1213                           t_unit_attempt_tab(v_counter) := r_unit_attempt_rec;
1214                       ELSE
1215 
1216                       --ie the rules have been passed and no other validation errors
1217                       --then log an entry that the unit attempt has successfully changed to enrolled
1218                           IF (p_s_log_type IS NOT NULL AND
1219                                  p_creation_dt IS NOT NULL) THEN
1220 
1221                              IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1222                                  p_s_log_type,
1223                                  p_creation_dt,
1224                                  'INFO,' || p_person_id || ',' ||
1225                                  p_course_cd ||',' ||
1226                                  v_sua_sca_rec.unit_cd || ',' ||
1227                                  v_sua_sca_rec.sua_version_number || ',' ||
1228                                  'ENROLLED,' || v_sua_sca_rec.alternate_code || ',' ||
1229                                  v_sua_sca_rec.location_cd || ',' ||
1230                                  v_sua_sca_rec.unit_class,
1231                                  'IGS_EN_UA_NOFAIL_CHG_ENROLL',
1232                                  NULL);
1233 
1234                           END IF;
1235                           -- added for bug#1832130 enrollment processes dld
1236                           --since the student unit attempt status has changed from invalid to enrolled
1237                           --we have to raise a workflow event to send a mail to the student about the status
1238                           IGS_EN_WORKFLOW.SUA_STATUS_CHANGE_MAIL(sua_rec.UNIT_ATTEMPT_STATUS,
1239                                       sua_rec.PERSON_ID,sua_rec.UOO_ID);
1240                       END IF;
1241                       -- Exit from loop and repeat entire select
1242                       v_do_cursor_again_ind := TRUE;
1243                       EXIT;
1244                   END IF;
1245               END IF;
1246 
1247               EXCEPTION
1248                WHEN APP_EXCEPTION.APPLICATION_EXCEPTION THEN
1249                 ROLLBACK TO sp_sua;
1250                 IF FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1251                    FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,'igs.plsql.igs_en_val_bulkrule.enrp_val_sca_urule.enrpl_invalid_to_enrolled.APP_EXP','Application Exception raised with code '||SQLCODE||' and error '||SQLERRM);
1252                 END IF;
1253                 l_message_text := FND_MESSAGE.GET;
1254 
1255                 IF l_message_text IS NULL THEN
1256                    l_message_text := FND_MESSAGE.GET_STRING('IGS','IGS_GE_UNEXPECTED_ERR');
1257                 END IF;
1258                 IF (p_s_log_type IS NOT NULL AND
1259                     p_creation_dt IS NOT NULL) THEN
1260 
1261                     l_log_msg := TRUE;
1262 
1263                     FOR i IN 1..l_counter_failure
1264                     LOOP
1265                        r_unit_att_failure_rec := t_unit_att_failure(i);
1266                        IF (r_unit_att_failure_rec.rv_uoo_id = v_sua_sca_rec.uoo_id) THEN
1267                           l_log_msg := FALSE;
1268                        EXIT;
1269                      END IF;
1270                     END LOOP;
1271 
1272                     IF l_log_msg = TRUE THEN
1273 
1274                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1275                           p_s_log_type,
1276                           p_creation_dt,
1277                           'ERROR,' || p_person_id || ',' ||
1278                           p_course_cd ||',' ||
1279                           v_sua_sca_rec.unit_cd || ',' ||
1280                           v_sua_sca_rec.sua_version_number || ',' ||
1281                           'INVALID,' || v_sua_sca_rec.alternate_code || ',' ||
1282                           v_sua_sca_rec.location_cd || ',' ||
1283                           v_sua_sca_rec.unit_class,
1284                           NULL,
1285                           l_message_text);
1286 
1287                           r_unit_att_failure_rec.rv_uoo_id := v_sua_sca_rec.uoo_id;
1288                           l_counter_failure := l_counter_failure + 1;
1289                           t_unit_att_failure(l_counter_failure) := r_unit_att_failure_rec;
1290 
1291                     END IF;
1292                 END IF;
1293 
1294                WHEN OTHERS THEN
1295                 ROLLBACK TO sp_sua;
1296                 IF FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL THEN
1297                    FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED,'igs.plsql.igs_en_val_bulkrule.enrp_val_sca_urule.enrpl_invalid_to_enrolled.UNH_EXP','Unhandled Exception raised with code '||SQLCODE||' and error '||SQLERRM);
1298                 END IF;
1299                 l_message_text := FND_MESSAGE.GET;
1300                 IF l_message_text IS NULL THEN
1301                    l_message_text := FND_MESSAGE.GET_STRING('IGS','IGS_GE_UNEXPECTED_ERR');
1302                 END IF;
1303                 IF (p_s_log_type IS NOT NULL AND
1304                     p_creation_dt IS NOT NULL) THEN
1305 
1306                     l_log_msg := TRUE;
1307 
1308                     FOR i IN 1..l_counter_failure
1309                     LOOP
1310                        r_unit_att_failure_rec := t_unit_att_failure(i);
1311                        IF (r_unit_att_failure_rec.rv_uoo_id = v_sua_sca_rec.uoo_id) THEN
1312                           l_log_msg := FALSE;
1313                        EXIT;
1314                      END IF;
1315                     END LOOP;
1316 
1317                     IF l_log_msg = TRUE THEN
1318 
1319                         IGS_GE_GEN_003.GENP_INS_LOG_ENTRY(
1320                           p_s_log_type,
1321                           p_creation_dt,
1322                           'ERROR,' || p_person_id || ',' ||
1323                           p_course_cd ||',' ||
1324                           v_sua_sca_rec.unit_cd || ',' ||
1325                           v_sua_sca_rec.sua_version_number || ',' ||
1326                           'INVALID,' || v_sua_sca_rec.alternate_code || ',' ||
1327                           v_sua_sca_rec.location_cd || ',' ||
1328                           v_sua_sca_rec.unit_class,
1329                           NULL,
1330                           l_message_text);
1331 
1332                           r_unit_att_failure_rec.rv_uoo_id := v_sua_sca_rec.uoo_id;
1333                           l_counter_failure := l_counter_failure + 1;
1334                           t_unit_att_failure(l_counter_failure) := r_unit_att_failure_rec;
1335                     END IF;
1336 
1337                 END IF;
1338              END;
1339 
1340             END LOOP;
1341             IF (v_do_cursor_again_ind = FALSE) THEN
1342                 EXIT;
1343             END IF;
1344           END LOOP;
1345 
1346           IF l_cal_cat = 'TEACHING' THEN
1347             l_loop_ended := TRUE;
1348           END IF;
1349          END LOOP; -- loop for each teach cal of a load.
1350          IF c_load_to_teach%ISOPEN THEN
1351            CLOSE c_load_to_teach;
1352          END IF;
1353 
1354         END;
1355       END enrpl_invalid_to_enrolled;
1356         ------------------------------
1357     BEGIN
1358         -------------------------------------------------------------------------------
1359         -- This procedure validates the unit rules for all unit attempts within a
1360         -- nominated student Course attempt for a nominated academic calendar instance.
1361         -- It has been designed to accept S_LOG type and creation_dt to enable any
1362         -- output to be inserted into these. If null, nothing will be logged.
1363         -------------------------------------------------------------------------------
1364         -- 1. Select the date fields representing the date after which units cannot be
1365         -- set to ENROLLED, and the date after which units can not be set to INVALID.
1366         ------------------------------------------------------------------------------
1367 
1368         OPEN c_secc;
1369         FETCH c_secc INTO       v_enrolled_rule_cutoff_dt,
1370                                 v_invalid_rule_cutoff_dt;
1371         IF (c_secc%NOTFOUND) THEN
1372                 CLOSE c_secc;
1373                 RAISE   e_no_records_found;
1374         END IF;
1375         CLOSE c_secc;
1376         -- added this if condition for enrollment processes dld bug#1832130
1377         --can enroll an invalid unit attempt only when the user passes all rules
1378 
1379         IF (p_rule_to_be_validated= 'ALL' ) THEN
1380           enrpl_invalid_to_enrolled(
1381                                 p_acad_cal_type,
1382                                 p_acad_sequence_number,
1383                                 p_person_id,
1384                                 p_course_cd,
1385                                 p_s_log_type,
1386                                 p_creation_dt,
1387                                 v_enrolled_rule_cutoff_dt,
1388                                 --added 3 parameters for enrollment processes dld bug#1832130
1389                                 p_cal_type,
1390                                 p_ci_sequence_number,
1391                                 p_org_unit_cd  );
1392         END IF;
1393         --validate the passed rule for all enrolled unit attempts and make them
1394         --invalid if the rule fails
1395         enrpl_enrolled_to_invalid(
1396                                 p_acad_cal_type,
1397                                 p_acad_sequence_number,
1398                                 p_person_id,
1399                                 p_course_cd,
1400                                 p_s_log_type,
1401                                 p_creation_dt,
1402                                 v_invalid_rule_cutoff_dt,
1403                                 --added 4 parameters for enrollment processes dld bug#1832130
1404                                 p_cal_type ,
1405                                 p_ci_sequence_number,
1406                                 p_org_unit_cd,
1407                                 p_rule_to_be_validated);
1408    EXCEPTION
1409         WHEN e_no_records_found THEN
1410                 Fnd_Message.Set_Name('FND','FORM_RECORD_DELETED');
1411                 IGS_GE_MSG_STACK.ADD;
1412                 App_Exception.Raise_Exception;
1413    END;
1414   END enrp_val_sca_urule;
1415 END IGS_EN_VAL_BULKRULE;