DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGS_EN_GEN_006

Source


1 PACKAGE BODY IGS_EN_GEN_006 AS
2 /* $Header: IGSEN06B.pls 120.4 2006/04/13 01:51:56 smaddali ship $ */
3 
4  -------------------------------------------------------------------------------------------
5   --Change History:
6   --Who         When            What
7   --prchandr    08-Jan-01       Enh Bug No: 2174101, As the Part of Change in IGSEN18B
8   --                            Passing NULL as parameters  to ENRP_CLC_SUA_EFTSU
9   --                            ENRP_CLC_EFTSU_TOTAL for Key course cd and version number
10   --pradhakr   15-Jan-03        Modified the call to the function enrp_get_load_incur to add
11   --                            a parameter no_assessment_ind. Changes wrt Bug# 2743459.
12   --smvk       09-Jul-2004      Bug # 3676145. Modified the cursors c_sua_um and c_suaeh to select active (not closed) unit classes.
13   -- rnirwani   13-Sep-2004    changed cursor c_sci (Enrp_Get_Sca_Elgbl) to not consider logically deleted records and
14   --				also to avoid un-approved intermission records. Bug# 3885804
15   -- ctyagi     20-feb-2005      Removed the function Enrp_Get_Sca_Hist_Am. Bug# 3712531
16   -- smaddali  10-apr-06         Added new column for bug#5091858 BUILD EN324
17   -------------------------------------------------------------------------------------------
18 
19 Function Enrp_Get_Sca_Acad(
20   p_person_id IN NUMBER ,
21   p_course_cd IN VARCHAR2 ,
22   p_cal_type IN VARCHAR2 ,
23   p_ci_sequence_number OUT NOCOPY NUMBER ,
24   p_enrolment_cat OUT NOCOPY VARCHAR2 ,
25   p_message_name OUT NOCOPY VARCHAR2)
26 RETURN BOOLEAN AS
27 
28 BEGIN   -- enrp_get_sca_acad
29     -- Determine the academic calendar type and sequence number for the
30     -- IGS_PS_COURSE offering option calendar type.
31     -- This is required for validation purposes during a IGS_PS_COURSE transfer.
32 DECLARE
33     v_cal_type          IGS_CA_INST.cal_type%TYPE;
34     v_ci_sequence_number        IGS_CA_INST.sequence_number%TYPE;
35     v_acad_cal_type         IGS_CA_INST.cal_type%TYPE;
36     v_acad_ci_sequence_number   IGS_CA_INST.sequence_number%TYPE;
37     v_acad_ci_start_dt      IGS_CA_INST.start_dt%TYPE;
38     v_acad_ci_end_dt        IGS_CA_INST.end_dt%TYPE;
39     v_message_name          VARCHAR2(30);
40     v_alternate_code        IGS_CA_INST.alternate_code%TYPE;
41     v_enrolment_cat         IGS_AS_SC_ATMPT_ENR.enrolment_cat%TYPE;
42     CURSOR  c_scae_ci IS
43         SELECT  scae.cal_type,
44             scae.ci_sequence_number,
45             scae.enrolment_cat
46         FROM    IGS_AS_SC_ATMPT_ENR scae,
47             IGS_CA_INST     ci
48         WHERE   scae.person_id      = p_person_id AND
49             scae.course_cd      = p_course_cd AND
50             scae.cal_type       = ci.cal_type AND
51             scae.ci_sequence_number = ci.sequence_number
52         ORDER BY ci.start_dt DESC;
53 BEGIN
54     p_message_name := null;
55     -- Check parameters
56     IF p_person_id IS NULL OR
57             p_course_cd     IS NULL OR
58             p_cal_type  IS NULL THEN
59         RETURN TRUE;
60     END IF;
61     -- Get the enrolment period from the latest student IGS_PS_COURSE
62     -- attempt enrolment period.
63     OPEN c_scae_ci;
64     FETCH c_scae_ci INTO v_cal_type,
65                 v_ci_sequence_number,
66                 v_enrolment_cat;
67     IF (c_scae_ci%NOTFOUND) THEN
68         CLOSE c_scae_ci;
69         p_ci_sequence_number := NULL;
70         p_enrolment_cat := NULL;
71         p_message_name := 'IGS_EN_NO_SPA_ENR_EXISTS';
72         RETURN FALSE;
73     END IF;
74     CLOSE c_scae_ci;
75     p_enrolment_cat := v_enrolment_cat;
76     -- Check if a link exists for the teaching period to the
77     -- academic calendar of the new IGS_PS_COURSE offering option.
78     v_alternate_code := IGS_EN_GEN_002.ENRP_GET_ACAD_ALT_CD (
79                         v_cal_type,
80                         v_ci_sequence_number,
81                         v_acad_cal_type,
82                         v_acad_ci_sequence_number,
83                         v_acad_ci_start_dt,
84                         v_acad_ci_end_dt,
85                         v_message_name);
86     IF v_acad_cal_type <> p_cal_type THEN
87         p_message_name := 'IGS_EN_NOLINK_EXISTS_STUDENR';
88         RETURN FALSE;
89     END IF;
90     -- complete execution
91     IF v_message_name IS NOT NULL THEN
92         p_ci_sequence_number := v_ci_sequence_number;
93     ELSE
94         p_ci_sequence_number := v_acad_ci_sequence_number;
95     END IF;
96     RETURN TRUE;
97 EXCEPTION
98     WHEN OTHERS THEN
99         IF (c_scae_ci%ISOPEN) THEN
100             CLOSE c_scae_ci;
101         END IF;
102         RAISE;
103 END;
104 EXCEPTION
105     WHEN OTHERS THEN
106     Fnd_Message.Set_name('IGS','IGS_GE_UNHANDLED_EXP');
107     FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_GEN_006.enrp_get_sca_acad');
108     IGS_GE_MSG_STACK.ADD;
109     App_Exception.Raise_Exception;
110 END enrp_get_sca_acad;
111 
112 
113 Function Enrp_Get_Sca_Am(
114   p_person_id IN NUMBER ,
115   p_course_cd IN VARCHAR2 ,
116   p_load_cal_type IN VARCHAR2 ,
117   p_load_sequence_number IN NUMBER )
118 RETURN VARCHAR2 AS
119 
120 BEGIN   --enrp_get_sca_am
121     --This module gets the attendance mode for a nominated
122     --student IGS_PS_COURSE attempt within a load calendar instance.
123     --This routine checks the 'incurred' status of student IGS_PS_UNIT
124     --attempts prior to including them in the calculations.
125     --If the student is not enrolled in any applicable units
126     --the routine will return NULL.
127 DECLARE
128     cst_composite   CONSTANT    VARCHAR2(10)    := 'COMPOSITE';
129     cst_on      CONSTANT    VARCHAR2(2) := 'ON';
130     cst_off     CONSTANT    VARCHAR2(3) := 'OFF';
131     cst_academic    CONSTANT    VARCHAR2(10)    := 'ACADEMIC';
132     cst_active  CONSTANT    VARCHAR2(10)    := 'ACTIVE';
133     cst_enrolled    CONSTANT    VARCHAR2(10)    := 'ENROLLED';
134     cst_completed   CONSTANT    VARCHAR2(10)    := 'COMPLETED';
135     cst_discontin   CONSTANT    VARCHAR2(10)    := 'DISCONTIN';
136     v_on_campus BOOLEAN DEFAULT FALSE;
137     v_off_campus    BOOLEAN DEFAULT FALSE;
138     v_retval    VARCHAR2(10) DEFAULT NULL;
139     CURSOR c_ci1 IS
140         SELECT  ci1.cal_type,
141             ci1.sequence_number
142         FROM    IGS_CA_INST ci1,
143             IGS_CA_TYPE cat,
144             IGS_CA_STAT cs
145         WHERE   cat.cal_type    = ci1.cal_type          AND
146             cat.s_cal_cat   = cst_academic          AND
147             ci1.cal_status  = cs.cal_status         AND
148             cs.s_cal_status = cst_active            AND
149             IGS_EN_GEN_014.ENRS_GET_WITHIN_CI(
150                     ci1.cal_type,
151                     ci1.sequence_number,
152                     p_load_cal_type,
153                     p_load_sequence_number,
154                     'Y') = 'Y';
155     CURSOR c_sua_um (
156         cp_ci_cal_type      IGS_CA_INST.cal_type%TYPE,
157         cp_ci_sequence_number   IGS_CA_INST.sequence_number%TYPE) IS
158         SELECT  um.s_unit_mode
159         FROM    IGS_EN_SU_ATTEMPT   sua,
160                 IGS_AS_UNIT_CLASS       ucl,
161                 IGS_AS_UNIT_MODE        um
162         WHERE   sua.person_id       = p_person_id AND
163                 sua.course_cd       = p_course_cd AND
164                 sua.unit_attempt_status IN (
165                             cst_enrolled,
166                             cst_completed,
167                             cst_discontin) AND
168                 IGS_EN_GEN_014.ENRS_GET_WITHIN_CI(
169                     cp_ci_cal_type,
170                     cp_ci_sequence_number,
171                     sua.cal_type,
172                     sua.ci_sequence_number,
173                     'Y')    = 'Y' AND
174                 IGS_EN_PRC_LOAD.enrp_get_load_incur(
175                             sua.cal_type,
176                             sua.ci_sequence_number,
177                             sua.discontinued_dt,
178                             sua.administrative_unit_status,
179                             sua.unit_attempt_status,
180                             sua.no_assessment_ind,
181                             p_load_cal_type,
182                             p_load_sequence_number,
183                             NULL,
184 			    -- anilk, Audit special fee build
185 			    'N') = 'Y' AND
186                 ucl.unit_class  = sua.unit_class AND
187 		ucl.closed_ind  = 'N' AND
188                 um.unit_mode    = ucl.unit_mode;
189 BEGIN
190     FOR v_ci1_rec IN c_ci1 LOOP
191         FOR v_sua_um_rec IN c_sua_um(
192                         v_ci1_rec.cal_type,
193                         v_ci1_rec.sequence_number) LOOP
194             --Set flags depending on the mode of the IGS_PS_UNIT attempt
195             IF v_sua_um_rec.s_unit_mode = cst_on THEN
196                 v_on_campus := TRUE;
197             ELSIF v_sua_um_rec.s_unit_mode = cst_off THEN
198                 v_off_campus := TRUE;
199             ELSIF v_sua_um_rec.s_unit_mode = cst_composite THEN
200                 v_on_campus := TRUE;
201                 v_off_campus := TRUE;
202             END IF;
203             --If the student is multi modal there is no need to continue
204             IF v_on_campus AND
205                     v_off_campus THEN
206                 EXIT;
207             END IF;
208         END LOOP;   -- v_sua_um_rec
209         IF v_on_campus AND
210                 v_off_campus THEN
211             EXIT;
212         END IF;
213     END LOOP;   -- v_ci1_rec
214     IF v_on_campus AND
215             v_off_campus THEN
216         v_retval := cst_composite;
217     ELSIF v_on_campus THEN
218         v_retval := cst_on;
219     ELSIF v_off_campus THEN
220         v_retval := cst_off;
221     END IF;
222     RETURN v_retval;
223 EXCEPTION
224     WHEN OTHERS THEN
225         IF c_ci1%ISOPEN THEN
226             CLOSE c_ci1;
227         END IF;
228         IF c_sua_um%ISOPEN THEN
229             CLOSE c_sua_um;
230         END IF;
231         RAISE;
232 END;
233 EXCEPTION
234     WHEN OTHERS THEN
235       IF SQLCODE <>-20001 THEN
236     Fnd_Message.Set_name('IGS','IGS_GE_UNHANDLED_EXP');
237     FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_GEN_006.enrp_get_sca_am');
238     IGS_GE_MSG_STACK.ADD;
239     App_Exception.Raise_Exception(NULL,NULL,FND_MESSAGE.GET);
240       ELSE
241      RAISE;
242     END IF;
243 END enrp_get_sca_am;
244 
245 
246 Function Enrp_Get_Sca_Att(
247   p_person_id IN NUMBER ,
248   p_course_cd IN VARCHAR2 ,
249   p_effective_dt IN DATE )
250 RETURN VARCHAR2 AS
251 BEGIN
252 DECLARE
253     NO_SECC_RECORD_FOUND        EXCEPTION;
254     cst_active          CONSTANT VARCHAR2(10) := 'ACTIVE';
255     cst_load            CONSTANT VARCHAR2(10) := 'LOAD';
256     v_daiv_rec_found        BOOLEAN;
257     v_cal_type          IGS_EN_STDNT_PS_ATT.cal_type%TYPE;
258     v_load_effect_dt_alias      IGS_EN_CAL_CONF.load_effect_dt_alias%TYPE;
259     v_attendance_type       IGS_EN_ATD_TYPE.attendance_type%TYPE;
260     v_period_load           IGS_EN_ATD_TYPE_LOAD.lower_enr_load_range%TYPE;
261     v_period_credit_points  NUMBER;
262     v_current_load_cal_type     IGS_CA_INST.cal_type%TYPE;
263     v_current_load_sequence_number  IGS_CA_INST.sequence_number%TYPE;
264     v_current_acad_cal_type     IGS_CA_INST.cal_type%TYPE;
265     v_current_acad_sequence_number  IGS_CA_INST.sequence_number%TYPE;
266     CURSOR  c_stu_crs_atmpt(
267                 cp_person_id IGS_EN_STDNT_PS_ATT.person_id%TYPE,
268                 cp_course_cd IGS_EN_STDNT_PS_ATT.course_cd%TYPE)IS
269         SELECT  SCA.cal_type
270         FROM    IGS_EN_STDNT_PS_ATT SCA
271         WHERE   SCA.person_id = cp_person_id AND
272             SCA.course_cd = cp_course_cd;
273     CURSOR  c_s_enr_cal_conf IS
274         SELECT  SECC.load_effect_dt_alias
275         FROM    IGS_EN_CAL_CONF SECC
276         WHERE   SECC.s_control_num = 1;
277     CURSOR  c_cal_instance(
278                 cp_cal_type IGS_CA_INST.cal_type%TYPE,
279                 cp_effective_dt IGS_CA_INST.start_dt%TYPE)IS
280         SELECT  CI.cal_type,
281             CI.sequence_number
282         FROM    IGS_CA_INST CI,
283             IGS_CA_STAT CS
284         WHERE   CI.cal_type = cp_cal_type AND
285             CI.start_dt <= cp_effective_dt AND
286             CI.end_dt >= cp_effective_dt AND
287             CS.cal_status = CI.cal_status AND
288             CS.s_cal_status = cst_active
289         ORDER BY CI.start_dt desc;
290     CURSOR  c_cal_type_instance(
291                 cp_cal_type IGS_CA_INST.cal_type%TYPE,
292                 cp_sequence_number IGS_CA_INST.sequence_number%TYPE)IS
293         SELECT  CI.cal_type,
294             CI.sequence_number,
295             CI.start_dt,
296             CI.end_dt
297         FROM    IGS_CA_TYPE CT,
298             IGS_CA_INST CI,
299             IGS_CA_STAT CS
300         WHERE   CT.closed_ind = 'N' AND
301             CS.s_cal_status = cst_active AND
302             CI.cal_status = CS.cal_status AND
303             CT.s_cal_cat = cst_load AND
304             CI.cal_type = CT.cal_type AND
305             (IGS_EN_GEN_014.ENRS_GET_WITHIN_CI(cp_cal_type,
306                         cp_sequence_number,
307                         CI.cal_type,
308                         CI.sequence_number,
309                         'N') = 'Y')
310         ORDER BY CI.start_dt asc;
311     CURSOR  c_dai_v(
312             cp_cal_type IGS_CA_DA_INST_V.cal_type%TYPE,
313             cp_ci_sequence_number IGS_CA_DA_INST_V.ci_sequence_number%TYPE,
314             cp_load_effect_dt_alias IGS_EN_CAL_CONF.load_effect_dt_alias%TYPE) IS
315         SELECT  DAIV.alias_val
316         FROM    IGS_CA_DA_INST_V DAIV
317         WHERE   DAIV.cal_type = cp_cal_type AND
318             DAIV.ci_sequence_number = cp_ci_sequence_number AND
319                 DAIV.dt_alias = cp_load_effect_dt_alias;
320     v_other_detail  VARCHAR(255);
321 BEGIN
322     -- Get the current attendance type for a student IGS_PS_COURSE attempt as at the
323     -- effective date. Typically the effective date will be the current date.
324     -- The attendance type is derived based on load calendar instances, using
325     -- the 'load effective' date alias as the reference point for determining
326     -- which calendar is the current load calendar.
327     -- Load the student IGS_PS_COURSE attempt details.
328     OPEN    c_stu_crs_atmpt(
329             p_person_id,
330             p_course_cd);
331     FETCH   c_stu_crs_atmpt INTO v_cal_type;
332     IF(c_stu_crs_atmpt%NOTFOUND) THEN
333         CLOSE c_stu_crs_atmpt;
334         RETURN NULL;
335     END IF;
336     CLOSE c_stu_crs_atmpt;
337     -- Determine the 'current' load calendar instance based on the 'load effective'
338     --  date alias from the enrolment calendar configuration. If this date alias
339     -- can't be located then the latest calendar instance where start_dt/end_dt
340     -- encompass the effective dt is deemed current.
341     OPEN    c_s_enr_cal_conf;
342     FETCH   c_s_enr_cal_conf INTO v_load_effect_dt_alias;
343     IF (c_s_enr_cal_conf%NOTFOUND) THEN
344         CLOSE   c_s_enr_cal_conf;
345         RAISE NO_SECC_RECORD_FOUND;
346     END IF;
347     CLOSE   c_s_enr_cal_conf;
348     v_current_load_cal_type := NULL;
349     v_current_load_sequence_number := NULL;
350     v_current_acad_cal_type := NULL;
351     v_current_acad_sequence_number := NULL;
352     FOR v_cal_instance_rec IN c_cal_instance(
353                         v_cal_type,
354                         p_effective_dt)
355     LOOP
356          FOR v_cal_type_instance_rec IN c_cal_type_instance(
357                 v_cal_instance_rec.cal_type,
358                 v_cal_instance_rec.sequence_number)
359          LOOP
360         -- Attempt to find 'load effective' dt alias against the
361         -- calendar instance.
362         v_daiv_rec_found := FALSE;
363         FOR v_daiv_rec IN c_dai_v(
364                 v_cal_type_instance_rec.cal_type,
365                 v_cal_type_instance_rec.sequence_number,
366                 v_load_effect_dt_alias)
367         LOOP
368           v_daiv_rec_found := TRUE;
369           IF(p_effective_dt >= v_daiv_rec.alias_val) THEN
370             v_current_load_cal_type := v_cal_type_instance_rec.cal_type;
371             v_current_load_sequence_number := v_cal_type_instance_rec.sequence_number;
372             v_current_acad_cal_type := v_cal_instance_rec.cal_type;
373             v_current_acad_sequence_number := v_cal_instance_rec.sequence_number;
374           END IF;
375         END LOOP;
376         IF(v_daiv_rec_found = FALSE) THEN
377           IF(p_effective_dt >= v_cal_type_instance_rec.start_dt AND
378              p_effective_dt <= v_cal_type_instance_rec.end_dt) THEN
379             v_current_load_cal_type := v_cal_type_instance_rec.cal_type;
380             v_current_load_sequence_number := v_cal_type_instance_rec.sequence_number;
381             v_current_acad_cal_type := v_cal_instance_rec.cal_type;
382             v_current_acad_sequence_number := v_cal_instance_rec.sequence_number;
383           END IF;
384         END IF;
385          END LOOP;
386          IF(v_current_load_cal_type IS NOT NULL) THEN
387             EXIT;
388          END IF;
389     END LOOP;
390     IF(v_current_load_cal_type IS NULL) THEN
391         RETURN NULL;
392     END IF;
393     -- Call ENRP_CLC_LOAD_TOTAL routine to get the load incurred within the
394     -- current load period
395     v_period_load := IGS_EN_PRC_LOAD.ENRP_CLC_EFTSU_TOTAL(
396                     p_person_id,
397                     p_course_cd,
398                     v_current_acad_cal_type,
399                     v_current_acad_sequence_number,
400                     v_current_load_cal_type,
401                     v_current_load_sequence_number,
402                     'Y',
403                     'Y',
404                                         NULL,
405                                         NULL,
406                     v_period_credit_points);
407     -- Call routine to determine the attendance type for the calculated load
408     -- figure within the current load calendar
409     v_attendance_type := IGS_EN_PRC_LOAD.ENRP_GET_LOAD_ATT(
410                     v_current_load_cal_type,
411                     v_period_load);
412     RETURN v_attendance_type;
413 EXCEPTION
414     WHEN NO_SECC_RECORD_FOUND THEN
415         Fnd_Message.Set_name('FND','FORM_RECORD_DELETED');
416         IGS_GE_MSG_STACK.ADD;
417         App_Exception.Raise_Exception;
418     WHEN OTHERS THEN
419         Fnd_Message.Set_name('IGS','IGS_GE_UNHANDLED_EXP');
420         FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_GEN_006.enrp_get_sca_att');
421         IGS_GE_MSG_STACK.ADD;
422         App_Exception.Raise_Exception;
423 END;
424 END enrp_get_sca_att;
425 
426 
427 Function Enrp_Get_Sca_Comm(
428   p_person_id IN NUMBER ,
429   p_course_cd IN VARCHAR2 ,
430   p_student_confirmed_ind IN VARCHAR2 DEFAULT 'N',
431   p_effective_date IN DATE )
432 RETURN boolean AS
433 BEGIN
434 DECLARE
435     v_commence_cutoff_dt_alias  IGS_EN_CAL_CONF.commence_cutoff_dt_alias%TYPE;
436     v_cal_type          IGS_CA_INST.cal_type%TYPE;
437     v_sequence_number       IGS_CA_INST.sequence_number%TYPE;
438     v_sua_ci_rec_found      BOOLEAN;
439     v_dai_rec_found         BOOLEAN;
440     CURSOR  c_s_enr_cal_conf IS
441         SELECT  commence_cutoff_dt_alias
442         FROM    IGS_EN_CAL_CONF
443         WHERE   s_control_num = 1;
444     CURSOR  c_sua_ci(
445             cp_person_id IGS_EN_SU_ATTEMPT.person_id%TYPE,
446             cp_course_cd IGS_EN_SU_ATTEMPT.course_cd%TYPE) IS
447         SELECT  IGS_EN_SU_ATTEMPT.cal_type,
448             IGS_EN_SU_ATTEMPT.ci_sequence_number,
449             IGS_CA_INST.start_dt
450         FROM    IGS_EN_SU_ATTEMPT,
451             IGS_CA_INST
452         WHERE   IGS_EN_SU_ATTEMPT.person_id = cp_person_id AND
453             IGS_EN_SU_ATTEMPT.course_cd = cp_course_cd AND
454             IGS_EN_SU_ATTEMPT.cal_type = IGS_CA_INST.cal_type AND
455             IGS_EN_SU_ATTEMPT.ci_sequence_number = IGS_CA_INST.sequence_number
456         ORDER BY IGS_CA_INST.start_dt;
457 
458     CURSOR  c_dai_v(cp_cal_type IGS_CA_DA_INST_V.cal_type%TYPE,
459             cp_ci_sequence_number IGS_CA_DA_INST_V.ci_sequence_number%TYPE,
460             cp_dt_alias IGS_CA_DA_INST_V.dt_alias%TYPE) IS
461         SELECT  IGS_CA_GEN_001.calp_set_alias_value
462                 (
463                  absolute_val,
464                  IGS_CA_GEN_002.cals_clc_dt_from_dai
465                     (
466                      ci_sequence_number,
467                      CAL_TYPE,
468                      DT_ALIAS,
469                      sequence_number
470                     )
471                 ) alias_val
472         FROM    IGS_CA_DA_INST
473         WHERE   cal_type = cp_cal_type AND
474             ci_sequence_number = cp_ci_sequence_number AND
475                 dt_alias = cp_dt_alias
476         ORDER BY alias_val;
477     v_other_detail  VARCHAR(255);
478 BEGIN
479     -- This module gets whether the student is considered commencing in their
480     -- IGS_PS_COURSE  for the purposes of enrolment. IGS_GE_NOTE: There may be other
481     -- commencing calculations in the system which apply for other purposes. Eg.
482     -- Statistics sub-system has a much more complicated definition of a
483     -- commencing student. This calculation will derive whether as at a
484     -- nominated effective date the student should still be considered
485     -- commencing within the nominated IGS_PS_COURSE attempt. A student is considered a
486     -- commencing student until a given date alias within their first teaching
487     -- period has been reached
488     v_sua_ci_rec_found := FALSE;
489     v_dai_rec_found := FALSE;
490     -- if IGS_PS_COURSE isn't confirmed, student is considered commencing.
491     IF   p_student_confirmed_ind = 'N'  THEN
492         RETURN TRUE;
493     END IF;
494     OPEN    c_s_enr_cal_conf;
495     FETCH   c_s_enr_cal_conf INTO v_commence_cutoff_dt_alias;
496     IF(c_s_enr_cal_conf%NOTFOUND) THEN
497         CLOSE   c_s_enr_cal_conf;
498         RAISE NO_DATA_FOUND;
499     END IF;
500     CLOSE   c_s_enr_cal_conf;
501     FOR v_sua_ci_rec IN c_sua_ci(
502                 p_person_id,
503                 p_course_cd)
504     LOOP
505         v_sua_ci_rec_found := TRUE;
506         v_cal_type := v_sua_ci_rec.cal_type;
507         v_sequence_number := v_sua_ci_rec.ci_sequence_number;
508         EXIT;
509     END LOOP;
510     IF(v_sua_ci_rec_found = FALSE) THEN
511         RETURN TRUE;
512     END IF;
513     FOR v_dai_rec IN c_dai_v(
514             v_cal_type,
515             v_sequence_number,
516             v_commence_cutoff_dt_alias)
517     LOOP
518         v_dai_rec_found := TRUE;
519         IF(p_effective_date <= v_dai_rec.alias_val) THEN
520             RETURN TRUE;
521         ELSE
522             RETURN FALSE;
523         END IF;
524     END LOOP;
525     IF(v_dai_rec_found = FALSE) THEN
526         RETURN FALSE;
527     END IF;
528 /*
529 EXCEPTION
530 
531     WHEN OTHERS THEN
532     Fnd_Message.Set_name('IGS','IGS_GE_UNHANDLED_EXP');
533     App_Exception.Raise_Exception;
534 */
535 END;
536 END enrp_get_sca_comm;
537 
538 
539 Function Enrp_Get_Sca_Elgbl(
540   p_person_id IN NUMBER ,
541   p_course_cd IN VARCHAR2 ,
542   p_student_comm_type IN VARCHAR2 ,
543   p_acad_cal_type IN VARCHAR2 ,
544   p_acad_ci_sequence_number IN NUMBER ,
545   p_dflt_confirmed_course_ind IN VARCHAR2 DEFAULT 'N',
546   p_message_name OUT NOCOPY VARCHAR2)
547 RETURN boolean AS
548     /*
549       ||  Created By :
550       ||  Created On :
551       ||  Purpose : This procedure process the Application
552       ||  Known limitations, enhancements or remarks :
553       ||  Change History :
554       ||  Who             When            What
555       ||  pkpatel       09-SEP-2001      Bug no.1960126 :For Academic Record Maintenance
556       ||                                 Modified the defination of Cursor 'c_sci' to include
557       ||                                 the logic for INtermission Type Approval
558       ||  pradhakr      29-Jan-2003      Added a message IGS_EN_CAL_CONF_NOT_SET.
559       ||                                 Changes wrt bug# 2675905
560       ||  (reverse chronological order - newest change first)
561         */
562     gv_other_detail VARCHAR2(255);
563     gv_extra_detail VARCHAR2(255) DEFAULT NULL;
564 BEGIN
565     -- Validate whether the nominated IGS_PE_PERSON is eligible to enrol in the nominated
566     -- IGS_PS_COURSE in an nominated academic period. This routine performs the same
567     -- logic for both new and returning students, due to the requirements of
568     -- re-admission and IGS_PS_COURSE transfer which blur the strict lines between the
569     -- two. The following checks are performed:
570     --  * The deceased_ind for the IGS_PE_PERSON is not set
571     --  * Student has no exclusions/encumbrances preventing them from enrolling.
572     --      The student must be excluded from all teaching periods linked to the
573     --      academic year to be ineligible.
574     --  * Student has an offer in the IGS_PS_COURSE within the nominated academic period,
575     --      or an existing student IGS_PS_COURSE attempt record which is of a status which
576     --      is ongoing (ie. ENROLLED, COMPLETED or INACTIVE).
577     --  * Student has a conditional offer that is satisfactory or waived, or
578     --      pending and it is not a requirement for it to be satisfied on
579     --      confirmation.
580     --  * Student has research IGS_RE_CANDIDATURE details if the IGS_PS_COURSE attempt is
581     --      defined as a research IGS_PS_COURSE.
582     --  * A IGS_EN_STDNT_PS_ATT record exists with a course_attempt_status of
583     --      INTERMIT and student_intermission record exists with an end_dt within the
584     --      academic period.
585     --
586     -- The routine will return TRUE if the student is eligible to enrol/re-enrol,
587     -- and FALSE if not. The message number will be set in the case that they are
588     -- ineligible  and will contain the message number of the reason
589     -- for ineligibility.
590 
591 DECLARE
592     cst_teaching            CONSTANT VARCHAR2(8)    := 'TEACHING';
593     cst_new_student         CONSTANT VARCHAR2(3)    := 'NEW';
594     cst_deleted             CONSTANT VARCHAR2(10)   := 'DELETED';
595     cst_active              CONSTANT VARCHAR2(10)   := 'ACTIVE';
596     cst_lapsed              CONSTANT VARCHAR2(10)   := 'LAPSED';
597     cst_intermit            CONSTANT VARCHAR2(10)   := 'INTERMIT';
598     cst_discontin           CONSTANT VARCHAR2(10)   := 'DISCONTIN';
599     cst_unconfirm           CONSTANT VARCHAR2(10)   := 'UNCONFIRM';
600 
601     v_deceased_ind          IGS_PE_PERSON.deceased_ind%TYPE;
602     v_instance_start_dt     IGS_CA_INST.start_dt%TYPE;
603     v_instance_end_dt       IGS_CA_INST.end_dt%TYPE;
604     v_intrmsn_start_dt      IGS_EN_STDNT_PS_INTM.start_dt%TYPE;
605     v_intrmsn_end_dt        IGS_EN_STDNT_PS_INTM.end_dt%TYPE;
606     v_census_dt_alias       IGS_GE_S_GEN_CAL_CON.census_dt_alias%TYPE;
607     v_course_status
608                     IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE DEFAULT NULL;
609     v_sca_version_number        IGS_EN_STDNT_PS_ATT.version_number%TYPE;
610 
611     v_valid_enrolment       BOOLEAN;
612     v_daiv_rec_found        BOOLEAN;
613     v_valid_pre_sysdate     BOOLEAN;
614     v_valid_post_sysdate        BOOLEAN;
615     v_excluded          BOOLEAN;
616 
617     v_message_name          VARCHAR2(30);
618 
619     v_acaiv_offer_dt        IGS_AD_PS_APPL_INST_APLINST_V.offer_dt%TYPE DEFAULT NULL;
620     v_adm_cndtnl_offer_status   IGS_AD_PS_APPL_INST_APLINST_V.ADM_CNDTNL_OFFER_STATUS%TYPE;
621     v_cndtnl_off_must_be_stsfd_ind  IGS_AD_PS_APPL_INST_APLINST_V.cndtnl_offer_must_be_stsfd_ind%TYPE;
622     v_discontinued_dt       IGS_EN_STDNT_PS_ATT.discontinued_dt%TYPE;
623     v_lapsed_dt         IGS_EN_STDNT_PS_ATT.lapsed_dt%TYPE;
624     v_cop_offered_ind       IGS_PS_OFR_PAT.offered_ind%TYPE;
625     v_s_adm_cndtnl_offer_status IGS_LOOKUPS_view.lookup_code%TYPE DEFAULT NULL;
626 
627 --modified cursor for performance bug 4968380
628     CURSOR c_person IS
629         SELECT  DECODE(Pbv.DATE_OF_DEATH,NULL,NVL(PE.DECEASED_IND,'N'),'Y') DECEASED_IND
630         FROM    IGS_PE_HZ_PARTIES   pe,
631                 IGS_PE_PERSON_BASE_V pbv
632         WHERE   pe.party_id    = p_person_id AND
633                 pbv.person_id = pe.party_id;
634 
635     CURSOR c_ci IS
636         SELECT  ci.start_dt,
637             ci.end_dt
638         FROM    IGS_CA_INST ci
639         WHERE   ci.cal_type     = p_acad_cal_type AND
640             ci.sequence_number  = p_acad_ci_sequence_number;
641 
642     CURSOR c_s_gen_cal_conf IS
643         SELECT  sgcc.census_dt_alias
644         FROM    IGS_GE_S_GEN_CAL_CON    sgcc
645         WHERE   sgcc.s_control_num  = 1;
646 
647     CURSOR c_ct_ci IS
648         SELECT  ci.cal_type,
649             ci.sequence_number
650         FROM    IGS_CA_INST_REL cir,
651             IGS_CA_TYPE         cat,
652             IGS_CA_INST         ci,
653             IGS_CA_STAT         cs
654         WHERE   cir.sup_cal_type        = p_acad_cal_type AND
655             cir.sup_ci_sequence_number  = p_acad_ci_sequence_number AND
656             cat.cal_type            = cir.sub_cal_type AND
657             cat.closed_ind          = 'N' AND
658             cat.s_cal_cat           = cst_teaching AND
659             ci.cal_type         = cir.sub_cal_type AND
660             ci.sequence_number      = cir.sub_ci_sequence_number AND
661             ci.cal_type         = cat.cal_type AND
662             ci.cal_status           = cs.cal_status AND
663             cs.s_cal_status         = cst_active;
664     CURSOR c_daiv(
665         cp_cal_type     IGS_CA_DA_INST_V.cal_type%TYPE,
666         cp_ci_sequence_number   IGS_CA_DA_INST_V.ci_sequence_number%TYPE,
667         cp_dt_alias     IGS_CA_DA_INST_V.dt_alias%TYPE) IS
668 
669         SELECT  IGS_CA_GEN_001.calp_set_alias_value
670                 (
671                  absolute_val,
672                  IGS_CA_GEN_002.cals_clc_dt_from_dai
673                     (
674                      ci_sequence_number,
675                      CAL_TYPE,
676                      DT_ALIAS,
677                      sequence_number
678                     )
679                 ) alias_val
680         FROM    IGS_CA_DA_INST  dai
681         WHERE   dai.cal_type        = cp_cal_type AND
682             dai.ci_sequence_number  = cp_ci_sequence_number AND
683             dai.dt_alias        = cp_dt_alias;
684 
685     CURSOR c_sca IS
686         SELECT  sca.course_attempt_status,
687             sca.discontinued_dt,
688             sca.lapsed_dt,
689             sca.version_number
690         FROM    IGS_EN_STDNT_PS_ATT sca
691         WHERE   sca.person_id       = p_person_id AND
692             sca.course_cd       = p_course_cd;
693 
694     CURSOR c_cop(
695         cp_coo_id       IGS_PS_OFR_PAT.coo_id%TYPE,
696         cp_ci_sequence_number   IGS_PS_OFR_PAT.ci_sequence_number%TYPE) IS
697 
698         SELECT  cop.offered_ind
699         FROM    IGS_PS_OFR_PAT  cop
700         WHERE   cop.coo_id      = cp_coo_id AND
701             cop.ci_sequence_number  = cp_ci_sequence_number;
702 
703     CURSOR c_sci IS
704         SELECT  sci.end_dt
705         FROM    IGS_EN_STDNT_PS_INTM    sci,
706                 IGS_EN_INTM_TYPES  eit
707         WHERE   sci.person_id   = p_person_id AND
708             sci.course_cd   = p_course_cd AND
709             eit.intermission_type(+) = sci.intermission_type AND
710             ((eit.appr_reqd_ind = 'Y' AND sci.approved = 'Y') OR (eit.appr_reqd_ind = 'N'))
711             AND sci.logical_delete_date = TO_DATE('31-12-4712','DD-MM-YYYY')
712         ORDER BY sci.start_dt;
713    -- replaced as pragma solution - view replaced by view query.
714     CURSOR c_acaiv IS
715         SELECT  acaiv.offer_dt,
716             acaiv.ADM_CNDTNL_OFFER_STATUS,
717             acaiv.cndtnl_offer_must_be_stsfd_ind
718         FROM
719              (
720                 SELECT
721                     acai.person_id PERSON_ID,
722                     aa.acad_cal_type ACAD_CAL_TYPE,
723                     DECODE(acai.adm_cal_type, NULL, aa.acad_ci_sequence_number,
724                         IGS_CA_GEN_001.calp_get_sup_inst (
725                             aa.acad_cal_type,
726                             acai.adm_cal_type,
727                             acai.adm_ci_sequence_number))ACAD_CI_SEQUENCE_NUMBER,
728                     acai.course_cd COURSE_CD,
729                     acai.adm_outcome_status ADM_OUTCOME_STATUS,
730                     acai.offer_dt OFFER_DT,
731                 acai.adm_cndtnl_offer_status ADM_CNDTNL_OFFER_STATUS,
732                     acai.cndtnl_offer_must_be_stsfd_ind CNDTNL_OFFER_MUST_BE_STSFD_IND,
733                     acai.adm_offer_resp_status  ADM_OFFER_RESP_STATUS
734                 FROM
735                     IGS_AD_PS_APPL_INST acai,
736                     IGS_AD_APPL aa,
737                     IGS_CA_INST ci,
738                     IGS_AD_PS_APPL aca,
739                     IGS_PS_VER crv
740                 WHERE
741                     aa.person_id = acai.person_id AND
742                     aa.admission_appl_number = acai.admission_appl_number AND
743                     ci.cal_type (+) = acai.deferred_adm_cal_type AND
744                     ci.sequence_number (+) = acai.deferred_adm_ci_sequence_num AND
745                     aca.person_id = acai.person_id AND
746                     aca.admission_appl_number = acai.admission_appl_number AND
747                     aca.nominated_course_cd = acai.nominated_course_cd AND
748                     crv.course_cd = acai.course_cd AND
749                     crv.version_number = acai.crv_version_number
750              ) acaiv
751 
752         WHERE   acaiv.person_id         = p_person_id AND
753             acaiv.course_cd         = p_course_cd AND
754             IGS_EN_GEN_002.enrp_get_acai_offer(acaiv.ADM_OUTCOME_STATUS,
755                     acaiv.ADM_OFFER_RESP_STATUS) = 'Y' AND
756             acaiv.acad_cal_type     = p_acad_cal_type AND
757             acaiv.acad_ci_sequence_number   = p_acad_ci_sequence_number
758         ORDER BY acaiv.offer_dt DESC; -- use latest offer date
759 
760 BEGIN
761     p_message_name := null;
762 
763     -- Check that student is still alive.
764     OPEN c_person;
765     FETCH c_person INTO v_deceased_ind;
766     IF c_person%NOTFOUND THEN
767         CLOSE c_person;
768         p_message_name := 'IGS_GE_VAL_DOES_NOT_XS';
769         RETURN FALSE;
770     END IF;
771     CLOSE c_person;
772 
773     IF v_deceased_ind = 'Y' THEN
774         p_message_name := 'IGS_EN_STUD_INELIGIB_TO_ENROL';
775         RETURN FALSE;
776     END IF;
777 
778     -- Select the start and end date for the nominated calendar
779     -- instance.
780     OPEN c_ci;
781     FETCH c_ci INTO v_instance_start_dt,
782                 v_instance_end_dt;
783 
784     IF c_ci%NOTFOUND THEN
785         CLOSE c_ci;
786         gv_extra_detail := ' -no IGS_CA_INST record was found';
787         p_message_name := 'IGS_EN_CAL_CONF_NOT_SET';
788         RETURN FALSE;
789     END IF;
790     CLOSE c_ci;
791 
792     -- Check that the student is not encumbered for every teaching period
793     -- in the academic period.
794     OPEN c_s_gen_cal_conf;
795     FETCH c_s_gen_cal_conf INTO v_census_dt_alias;
796     IF c_s_gen_cal_conf%NOTFOUND THEN
797         CLOSE c_s_gen_cal_conf;
798         gv_extra_detail := ' -no IGS_GE_S_GEN_CAL_CON record was found';
799         p_message_name := 'IGS_EN_CAL_CONF_NOT_SET';
800         RETURN FALSE;
801     END IF;
802     CLOSE c_s_gen_cal_conf;
803 
804     v_valid_enrolment   := FALSE;
805     v_valid_pre_sysdate := FALSE;
806     v_valid_post_sysdate    := FALSE;
807     v_excluded      := FALSE;
808 
809     FOR v_cal_type_instance_rec IN c_ct_ci LOOP
810 
811         v_daiv_rec_found := FALSE;
812 
813         FOR v_daiv_rec IN c_daiv(
814                     v_cal_type_instance_rec.cal_type,
815                     v_cal_type_instance_rec.sequence_number,
816                     v_census_dt_alias) LOOP
817 
818             v_daiv_rec_found := TRUE;
819 
820             IF v_daiv_rec.alias_val BETWEEN v_instance_start_dt AND
821                             v_instance_end_dt THEN
822 
823                 IF IGS_EN_VAL_ENCMB.enrp_val_excld_crs(
824                                 p_person_id,
825                                 p_course_cd,
826                                 v_daiv_rec.alias_val,
827                                 p_message_name) THEN
828 
829                     IF v_daiv_rec.alias_val >= SYSDATE THEN
830                         v_valid_post_sysdate := TRUE;
831                     ELSE
832                         v_valid_pre_sysdate := TRUE;
833                     END IF;
834                 ELSE
835 
836                 v_excluded := TRUE;
837 
838                 END IF; -- IGS_EN_VAL_ENCMB.enrp_val_excld_crs
839             END IF;-- v_daiv_rec.alias_val
840         END LOOP; -- c_dai_v
841 
842         IF NOT v_daiv_rec_found OR
843                 NOT v_excluded OR
844                 v_valid_post_sysdate THEN
845 
846             v_valid_enrolment := TRUE;
847             EXIT;
848         END IF;
849 
850     END LOOP; -- c_cal_type_instance
851 
852     -- If the student is excluded from all teaching periods in the
853     -- academic period then ineligible.
854     IF NOT v_valid_enrolment THEN
855         p_message_name := 'IGS_EN_STUD_INELIBIBLE';
856         RETURN FALSE;
857     END IF;
858 
859     -- Attempt to select existing student IGS_PS_COURSE attempt details.
860     OPEN c_sca;
861     FETCH c_sca INTO v_course_status,
862             v_discontinued_dt,
863             v_lapsed_dt,
864             v_sca_version_number;
865     CLOSE c_sca;
866 
867     IF v_course_status = cst_unconfirm THEN
868         -- Validate confirmation of research IGS_PS_COURSE attempt
869         IF NOT IGS_EN_VAL_SCA.enrp_val_res_elgbl(
870                         p_person_id,
871                         p_course_cd,
872                         v_sca_version_number,
873                         p_message_name) THEN
874 
875             RETURN FALSE;
876         END IF;
877     END IF;
878 
879     IF v_course_status IS NULL OR
880             v_course_status = cst_unconfirm THEN
881 
882         OPEN c_acaiv;
883         FETCH c_acaiv INTO
884                 v_acaiv_offer_dt,
885                 v_adm_cndtnl_offer_status,
886                 v_cndtnl_off_must_be_stsfd_ind;
887 
888         IF c_acaiv%NOTFOUND THEN
889             CLOSE c_acaiv;
890             p_message_name := 'IGS_EN_STUD_NOT_HAVE_CURR_AFF';
891             RETURN FALSE;
892         ELSE
893             CLOSE c_acaiv;
894 
895             IF p_dflt_confirmed_course_ind = 'Y' THEN
896                 -- Validate conditional offer
897                 IF NOT IGS_EN_VAL_SCA.enrp_val_acai_cndtnl (
898                             v_adm_cndtnl_offer_status,
899                             v_cndtnl_off_must_be_stsfd_ind,
900                             v_s_adm_cndtnl_offer_status,
901                             p_message_name) THEN
902 
903                 RETURN FALSE;
904                 END IF;
905             END IF;
906         END IF; -- c_acaiv%NOTFOUND
907     END IF; -- v_course_status = cst_unconfirm
908 
909     -- Only load the latest offer date for current offers in the IGS_PS_COURSE
910     -- if IGS_PS_COURSE attempt status is 'DISCONTIN', 'LAPSED' or 'DELETED'
911     IF v_course_status IN (
912                 cst_discontin,
913                 cst_lapsed,
914                 cst_deleted)    THEN
915 
916         OPEN c_acaiv;
917         FETCH c_acaiv INTO
918                 v_acaiv_offer_dt,
919                 v_adm_cndtnl_offer_status,
920                 v_cndtnl_off_must_be_stsfd_ind;
921 
922         IF c_acaiv%FOUND THEN
923             CLOSE c_acaiv;
924 
925             -- Validate conditional offer
926             IF p_dflt_confirmed_course_ind = 'Y' AND
927                     NOT IGS_EN_VAL_SCA.enrp_val_acai_cndtnl(
928                                 v_adm_cndtnl_offer_status,
929                                 v_cndtnl_off_must_be_stsfd_ind,
930                                 v_s_adm_cndtnl_offer_status,
931                                 p_message_name)  THEN
932                 RETURN FALSE;
933             END IF;
934         ELSE
935             CLOSE c_acaiv;
936         END IF;
937     END IF;
938 
939     -- If IGS_PS_COURSE attempt is DISCONTIN then the admissions offer must have been
940     -- made after the discontinuation date.
941     IF v_course_status = cst_discontin THEN
942 
943         IF v_acaiv_offer_dt IS NULL OR
944             v_acaiv_offer_dt <= v_discontinued_dt THEN
945             p_message_name := 'IGS_EN_STUD_INELIG_TO_RE_ENR';
946             RETURN FALSE;
947         END IF;
948 
949     -- If IGS_PS_COURSE attempt is lapsed then the admissions offer must have been
950     -- made after the lapsed was placed.
951     ELSIF v_course_status = cst_lapsed THEN
952 
953         IF v_acaiv_offer_dt IS NULL THEN
954             p_message_name := 'IGS_EN_INELIGBLE_DUE_TO_LAPSE';
955             RETURN FALSE;
956         ELSE
957             IF v_acaiv_offer_dt <= v_lapsed_dt THEN
958                 p_message_name := 'IGS_EN_INELIGBLE_DUE_TO_LAPSE';
959                 RETURN FALSE;
960             END IF;
961         END IF;
962 
963     -- If the IGS_PS_COURSE attempt is DELETED then any current admissions offer will
964     -- permit enrolment.
965     ELSIF v_course_status = cst_deleted THEN
966 
967         IF v_acaiv_offer_dt IS NULL THEN
968             p_message_name := 'IGS_EN_STUD_INELIGIBLE_RE_ENR';
969             RETURN FALSE;
970         END IF;
971 
972     -- If IGS_PS_COURSE attempt status is INTERMIT then only eligible if returning within
973     -- the academic period.
974     ELSIF v_course_status = cst_intermit THEN
975         OPEN c_sci;
976         FETCH c_sci INTO v_intrmsn_end_dt;
977 
978         IF c_sci%FOUND THEN
979             IF v_intrmsn_end_dt IS NULL OR
980                     v_intrmsn_end_dt > v_instance_end_dt THEN
981 
982                 CLOSE c_sci;
983                 p_message_name := 'IGS_EN_INTERM_DOES_NOT_END';
984                 RETURN FALSE;
985             END IF;
986         END IF;
987         CLOSE c_sci;
988     END IF;
989 
990     RETURN TRUE;
991 
992 EXCEPTION
993     WHEN OTHERS THEN
994         IF c_acaiv%ISOPEN THEN
995             CLOSE c_acaiv;
996         END IF;
997 
998         IF c_sci%ISOPEN THEN
999             CLOSE c_sci;
1000         END IF;
1001 
1002         IF c_ci%ISOPEN THEN
1003             CLOSE c_ci;
1004         END IF;
1005 
1006         IF c_ct_ci%ISOPEN THEN
1007             CLOSE c_ct_ci;
1008         END IF;
1009 
1010         IF c_sca%ISOPEN THEN
1011             CLOSE c_sca;
1012         END IF;
1013 
1014         IF c_daiv%ISOPEN THEN
1015             CLOSE c_daiv;
1016         END IF;
1017 
1018         IF c_person%ISOPEN THEN
1019             CLOSE c_person;
1020         END IF;
1021 
1022         IF c_s_gen_cal_conf%ISOPEN THEN
1023             CLOSE c_s_gen_cal_conf;
1024         END IF;
1025 
1026         RAISE;
1027 END;
1028 /*
1029 EXCEPTION
1030     WHEN OTHERS THEN
1031     Fnd_Message.Set_name('IGS','IGS_GE_UNHANDLED_EXP');
1032     App_Exception.Raise_Exception;
1033 */
1034 END enrp_get_sca_elgbl;
1035 
1036 
1037 
1038 
1039 Function Enrp_Get_Sca_Latt(
1040   p_person_id IN NUMBER ,
1041   p_course_cd IN VARCHAR2 ,
1042   p_load_cal_type IN VARCHAR2 ,
1043   p_load_sequence_number IN NUMBER )
1044 RETURN VARCHAR2 AS
1045 
1046 BEGIN
1047 DECLARE
1048     v_dummy             VARCHAR2(10);
1049     v_acad_cal_type         VARCHAR2(10);
1050     v_acad_sequence_number      NUMBER;
1051     v_acad_ci_start_dt      DATE;
1052     v_acad_ci_end_dt        DATE;
1053     v_message_name          VARCHAR2(30);
1054     v_period_load           NUMBER;
1055     v_period_credit_points      NUMBER;
1056     v_attendance_type       VARCHAR2(2);
1057 BEGIN
1058     -- Get the current attendance type for a student IGS_PS_COURSE attempt within a
1059     -- nominated load calendar instance.
1060     -- 1. Determine the academic calendar instance that the load calendar
1061     -- instance is within.
1062     v_dummy := IGS_EN_GEN_002.ENRP_GET_ACAD_ALT_CD(
1063                     p_load_cal_type,
1064                     p_load_sequence_number,
1065                     v_acad_cal_type,
1066                     v_acad_sequence_number,
1067                     v_acad_ci_start_dt,
1068                     v_acad_ci_end_dt,
1069                     v_message_name);
1070     IF (v_acad_cal_type IS NULL) THEN
1071         RETURN NULL;
1072     END IF;
1073     -- 2. Call enrp_clc_load_total routine to get the load incurred within
1074     -- the current load period.
1075     v_period_load := IGS_EN_PRC_LOAD.enrp_clc_eftsu_total(
1076                     p_person_id,
1077                     p_course_cd,
1078                     v_acad_cal_type,
1079                     v_acad_sequence_number,
1080                     p_load_cal_type,
1081                     p_load_sequence_number,
1082                     'Y',
1083                     'Y',
1084                                         NULL,
1085                                         NULL,
1086                     v_period_credit_points);
1087     -- 3. Call routine to determine the attendance type for the calculated
1088     -- load figure within the current load calendar.
1089     v_attendance_type := IGS_EN_PRC_LOAD.enrp_get_load_att(
1090                         p_load_cal_type,
1091                         v_period_load);
1092     RETURN v_attendance_type;
1093 END;
1094 /*
1095 EXCEPTION
1096     WHEN OTHERS THEN
1097     Fnd_Message.Set_name('IGS','IGS_GE_UNHANDLED_EXP');
1098     App_Exception.Raise_Exception;
1099 */
1100 END enrp_get_sca_latt;
1101 
1102 
1103 Function Enrp_Get_Sca_Perd(
1104   p_person_id IN NUMBER ,
1105   p_course_cd IN VARCHAR2 )
1106 RETURN VARCHAR2 AS
1107     gv_other_detail         VARCHAR2(255);
1108 BEGIN
1109 DECLARE
1110     v_cal_type          IGS_EN_SU_ATTEMPT.cal_type%TYPE;
1111     v_ci_sequence_number        IGS_EN_SU_ATTEMPT.ci_sequence_number%TYPE;
1112     v_alternate_code        IGS_CA_INST.alternate_code%TYPE;
1113     v_academic_cal_type     IGS_EN_SU_ATTEMPT.cal_type%TYPE;
1114     v_academic_ci_sequence_number   IGS_EN_SU_ATTEMPT.ci_sequence_number%TYPE;
1115     v_academic_ci_start_dt      IGS_EN_SU_ATTEMPT.ci_start_dt%TYPE;
1116     v_academic_ci_end_dt        IGS_EN_SU_ATTEMPT.ci_end_dt%TYPE;
1117     v_message_name          VARCHAR2(30);
1118     CURSOR c_sua_ci (
1119         cp_person_id        IGS_EN_SU_ATTEMPT.person_id%TYPE,
1120         cp_course_cd        IGS_EN_SU_ATTEMPT.course_cd%TYPE)IS
1121         SELECT      sua.cal_type,
1122                 sua.ci_sequence_number,
1123                 ci.alternate_code
1124         FROM        IGS_EN_SU_ATTEMPT   sua,
1125                 IGS_CA_INST     ci
1126         WHERE       sua.person_id = cp_person_id AND
1127                 sua.course_cd = cp_course_cd AND
1128                 sua.cal_type = ci.cal_type AND
1129                 sua.ci_sequence_number = ci.sequence_number AND
1130                 (sua.unit_attempt_status = 'ENROLLED' OR
1131                 sua.unit_attempt_status = 'COMPLETED')
1132         ORDER BY    ci.start_dt;
1133 BEGIN
1134     -- Get the commencement period of a student IGS_PS_COURSE attempt. This is the first
1135     -- teaching period with a ENROLLED or COMPLETED student IGS_PS_UNIT attempt.
1136     -- The routine is expected to be mostly used by reporting as the result
1137     -- is a concatenated string of <teaching alt code>/<academic alternate code>.
1138     -- IGS_GE_NOTE: may need to be expanded to include IGS_PS_UNIT attempts which discontinued
1139     -- late once assessments is on board.
1140     -- 1. Find earliest student IGS_PS_UNIT attempt record matching the criteria.
1141     OPEN    c_sua_ci(
1142             p_person_id,
1143             p_course_cd);
1144     FETCH   c_sua_ci    INTO    v_cal_type,
1145                     v_ci_sequence_number,
1146                     v_alternate_code;
1147     IF (c_sua_ci%NOTFOUND) THEN
1148         CLOSE   c_sua_ci;
1149         RETURN NULL;
1150     END IF;
1151     CLOSE   c_sua_ci;
1152     v_academic_cal_type := IGS_EN_GEN_002.ENRP_GET_ACAD_ALT_CD(
1153                         v_cal_type,
1154                         v_ci_sequence_number,
1155                         v_academic_cal_type,
1156                         v_academic_ci_sequence_number,
1157                         v_academic_ci_start_dt,
1158                         v_academic_ci_end_dt,
1159                         v_message_name);
1160     RETURN (v_alternate_code || ',' || v_academic_cal_type);
1161 END;
1162 EXCEPTION
1163     WHEN OTHERS THEN
1164             Fnd_Message.Set_name('IGS','IGS_GE_UNHANDLED_EXP');
1165             FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_GEN_006.enrp_get_sca_perd');
1166             IGS_GE_MSG_STACK.ADD;
1167     App_Exception.Raise_Exception;
1168 END enrp_get_sca_perd;
1169 
1170 
1171 Function Enrp_Get_Sca_Status(
1172   p_person_id IN NUMBER ,
1173   p_course_cd IN VARCHAR2 ,
1174   p_course_attempt_status IN VARCHAR2 ,
1175   p_student_confirmed_ind IN VARCHAR2 DEFAULT 'N',
1176   p_discontinued_dt IN DATE ,
1177   p_lapsed_dt IN DATE ,
1178   p_course_rqrmnt_complete_ind IN VARCHAR2 DEFAULT 'N',
1179   p_logical_delete_dt IN DATE )
1180 RETURN VARCHAR2 AS
1181     /*
1182       ||  Created By :
1183       ||  Created On :
1184       ||  Purpose : This procedure process the Application
1185       ||  Known limitations, enhancements or remarks :
1186       ||  Change History :
1187       ||  Who             When            What
1188       ||  pkpatel       09-SEP-2001      Bug no.1960126 :For Academic Record Maintenance
1189       ||                                 Modified the defination of Cursor 'c_sci' to include
1190       ||                                 the logic for INtermission Type Approval
1191       ||  (reverse chronological order - newest change first)
1192       -- rnirwani   13-Sep-2004    changed cursor c_intmsn_details  to not consider logically deleted records and
1193       --                           also to avoid un-approved intermission records. Bug# 3885804
1194       -- smaddali   10-mar-06      Modified cursor c_sci for build EN324 - bug#5091858
1195         */
1196 BEGIN   -- enrp_get_sca_status
1197     -- Get the IGS_PS_COURSE attempt status of a nominated student IGS_PS_COURSE attempt.
1198     -- This routine checks attributes of the students enrolment to ascertain
1199     -- what their enrolled student IGS_PS_COURSE attempt status should be.
1200 DECLARE
1201     cst_deleted         CONSTANT VARCHAR2(10) := 'DELETED';
1202     cst_unconfirm       CONSTANT VARCHAR2(10) := 'UNCONFIRM';
1203     cst_discontin       CONSTANT VARCHAR2(10) := 'DISCONTIN';
1204     cst_lapsed      CONSTANT VARCHAR2(10) := 'LAPSED';
1205     cst_enrolled        CONSTANT VARCHAR2(10) := 'ENROLLED';
1206     cst_intermit        CONSTANT VARCHAR2(10) := 'INTERMIT';
1207     cst_completed       CONSTANT VARCHAR2(10) := 'COMPLETED';
1208     cst_inactive        CONSTANT VARCHAR2(10) := 'INACTIVE';
1209     v_course_attempt_status     IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE;
1210     v_student_confirmed_ind     IGS_EN_STDNT_PS_ATT.student_confirmed_ind%TYPE;
1211     v_discontinued_dt       IGS_EN_STDNT_PS_ATT.discontinued_dt%TYPE;
1212     v_lapsed_dt         IGS_EN_STDNT_PS_ATT.lapsed_dt%TYPE;
1213     v_course_rqrmnt_complete_ind    IGS_EN_STDNT_PS_ATT.course_rqrmnt_complete_ind%TYPE;
1214     v_logical_delete_dt     IGS_EN_STDNT_PS_ATT.logical_delete_dt%TYPE;
1215     v_cal_type          IGS_CA_INST.cal_type%TYPE;
1216     v_ci_sequence_number        IGS_CA_INST.sequence_number%TYPE;
1217     v_enr_form_due_dt       IGS_AS_SC_ATMPT_ENR.enr_form_due_dt%TYPE;
1218     v_exists_flag           VARCHAR2(1);
1219     CURSOR c_sca IS
1220         SELECT  sca.course_attempt_status,
1221             sca.student_confirmed_ind,
1222             sca.discontinued_dt,
1223             sca.lapsed_dt,
1224             sca.course_rqrmnt_complete_ind,
1225             sca.logical_delete_dt
1226         FROM    IGS_EN_STDNT_PS_ATT sca
1227         WHERE   sca.person_id   = p_person_id AND
1228             sca.course_cd   = p_course_cd;
1229     CURSOR c_sua IS
1230         SELECT  'x'
1231         FROM    sys.dual
1232         WHERE   EXISTS (
1233             SELECT  'x'
1234             FROM    IGS_EN_SU_ATTEMPT   sua
1235             WHERE   sua.person_id       = p_person_id AND
1236                 sua.course_cd       = p_course_cd AND
1237                 sua.unit_attempt_status = cst_enrolled AND
1238                 sua.ci_start_dt     <= SYSDATE);
1239 
1240     -- smaddali  Modified cursor c_sci for build EN324 - bug#5091858
1241     CURSOR c_sci IS
1242             SELECT  'X'
1243             FROM    IGS_EN_STDNT_PS_INTM    sci,
1244                     IGS_EN_INTM_TYPES   eit
1245             WHERE   sci.person_id   = p_person_id AND
1246                 sci.course_cd   = p_course_cd AND
1247                 sci.logical_delete_date = TO_DATE('31-12-4712','DD-MM-YYYY') AND
1248                 eit.intermission_type = sci.intermission_type AND
1249                 ((eit.appr_reqd_ind = 'Y' AND sci.approved = 'Y')  OR
1250                          (eit.appr_reqd_ind = 'N')) AND
1251                 sci.start_dt    <= trunc(SYSDATE) AND
1252                 ( sci.end_dt      >= trunc(SYSDATE) OR
1253                   ( sci.end_dt     <  trunc(SYSDATE) AND
1254                     sci.cond_return_flag = 'Y' AND
1255                     EXISTS (select 'x' from igs_en_spi_rconds rc
1256                                             where sci.person_id = rc.person_id
1257                                             and  sci.course_cd = rc.course_cd
1258                                             and  sci.start_dt = rc.start_dt
1259                                             and  sci.logical_delete_date = rc.logical_delete_date
1260                                             and  status_code IN ('FAILED','PENDING')
1261                               )
1262                    )
1263                 );
1264     CURSOR c_scae IS
1265         SELECT  ci.cal_type,
1266             scae.ci_sequence_number,
1267             scae.enr_form_due_dt
1268         FROM    IGS_AS_SC_ATMPT_ENR scae,
1269             IGS_CA_INST ci
1270         WHERE   scae.person_id      = p_person_id AND
1271             scae.course_cd      = p_course_cd AND
1272             ci.cal_type         = scae.cal_type AND
1273             ci.sequence_number  = scae.ci_sequence_number
1274         ORDER BY ci.end_dt DESC;
1275     CURSOR c_secc (
1276         cp_cal_type     IGS_CA_INST.cal_type%TYPE,
1277         cp_ci_sequence_number   IGS_CA_INST.sequence_number%TYPE ) IS
1278         SELECT  'x'
1279         FROM    sys.dual
1280         WHERE   EXISTS (
1281             SELECT  'x'
1282             FROM    IGS_EN_CAL_CONF secc,
1283                 IGS_CA_DA_INST_V daiv
1284             WHERE   secc.s_control_num      = 1 AND
1285                 secc.enr_form_due_dt_alias  IS NOT NULL AND
1286                 daiv.cal_type           = cp_cal_type AND
1287                 daiv.ci_sequence_number     = cp_ci_sequence_number AND
1288                 daiv.dt_alias           = secc.enr_form_due_dt_alias AND
1289                 daiv.alias_val          >= SYSDATE);
1290 BEGIN
1291     -- If the values have not been passed in, load them.
1292     IF p_course_attempt_status IS NULL THEN
1293         OPEN c_sca;
1294         FETCH c_sca INTO v_course_attempt_status,
1295                 v_student_confirmed_ind,
1296                 v_discontinued_dt,
1297                 v_lapsed_dt,
1298                 v_course_rqrmnt_complete_ind,
1299                 v_logical_delete_dt;
1300         IF (c_sca%NOTFOUND) THEN
1301             CLOSE c_sca;
1302             RETURN NULL;
1303         END IF;
1304         CLOSE c_sca;
1305     ELSE
1306         -- Use parameters instead of selected student IGS_PS_COURSE attempt
1307         -- information to set v_ values.
1308         v_course_attempt_status := p_course_attempt_status;
1309         v_student_confirmed_ind := p_student_confirmed_ind;
1310         v_discontinued_dt := p_discontinued_dt;
1311         v_lapsed_dt := p_lapsed_dt;
1312         v_course_rqrmnt_complete_ind := p_course_rqrmnt_complete_ind;
1313         v_logical_delete_dt := p_logical_delete_dt;
1314     END IF;
1315     -- If logical delete dt is not null then return deleted
1316     IF v_logical_delete_dt IS NOT NULL THEN
1317         RETURN cst_deleted;
1318     END IF;
1319     -- If IGS_PS_COURSE attempt is unconfirmed then return unconfirm
1320     IF v_student_confirmed_ind = 'N' THEN
1321         RETURN cst_unconfirm;
1322     END IF;
1323     -- If there is a current discontinuation date then return discontin
1324     IF v_discontinued_dt IS NOT NULL AND
1325             v_discontinued_dt <= SYSDATE THEN
1326         RETURN cst_discontin;
1327     END IF;
1328     -- If there is a current student IGS_PS_COURSE lapse then return lapsed
1329     IF (v_lapsed_dt IS NOT NULL) THEN
1330         OPEN c_sua;
1331         FETCH c_sua INTO v_exists_flag;
1332         IF (c_sua%NOTFOUND) THEN
1333             CLOSE c_sua;
1334             RETURN cst_lapsed;
1335         END IF;
1336         CLOSE c_sua;
1337     END IF;
1338     -- If there is a current intermission then return intermit
1339     OPEN c_sci;
1340     FETCH c_sci INTO v_exists_flag;
1341     IF (c_sci%FOUND) THEN
1342         CLOSE c_sci;
1343         RETURN cst_intermit;
1344     END IF;
1345     CLOSE c_sci;
1346     -- If there are any enrolled IGS_PS_UNIT attempts within the IGS_PS_COURSE then return
1347     -- enrolled
1348     OPEN c_sua;
1349     FETCH c_sua INTO v_exists_flag;
1350     IF (c_sua%FOUND) THEN
1351         CLOSE c_sua;
1352         RETURN cst_enrolled;
1353     END IF;
1354     CLOSE c_sua;
1355     -- If the IGS_PS_COURSE requirements are complete then return completed
1356     IF v_course_rqrmnt_complete_ind = 'Y' THEN
1357         RETURN cst_completed;
1358     END IF;
1359     -- If the student has not yet reached their enrolment form due date
1360     -- then return enrolled, else they are inactive. This checks both the student
1361     -- IGS_PS_COURSE attempt enrolment due date (which is an override) and the values
1362     -- in the pre-enrolled enrolment periods.
1363      OPEN c_scae;
1364     FETCH c_scae INTO v_cal_type,
1365             v_ci_sequence_number,
1366             v_enr_form_due_dt;
1367     IF (c_scae%NOTFOUND) THEN
1368         CLOSE c_scae;
1369         RETURN cst_inactive;
1370     END IF;
1371     CLOSE c_scae;
1372     -- If records found, using the last record (ie. The latest record)
1373     IF v_enr_form_due_dt IS NOT NULL THEN
1374         IF v_enr_form_due_dt > SYSDATE THEN
1375 -- commented for bug 1510921
1376         --  RETURN cst_enrolled;
1377         RETURN cst_inactive;
1378         ELSE
1379             RETURN cst_inactive;
1380         END IF;
1381     ELSE
1382         -- IGS_GE_NOTE: This query is designed to return no records if the
1383         -- secc.enr_form_due_dt_alias is set to NULL, which means the functionality
1384         -- is not enabled.
1385         OPEN c_secc( v_cal_type, v_ci_sequence_number );
1386         FETCH c_secc INTO v_exists_flag;
1387         IF (c_secc%NOTFOUND) THEN
1388             CLOSE c_secc;
1389             RETURN cst_inactive;
1390         ELSE
1391             CLOSE c_secc;
1392 -- commented for bug 1510921
1393             --RETURN cst_enrolled;
1394         RETURN cst_inactive;
1395         END IF;
1396     END IF;
1397 
1398 EXCEPTION
1399     WHEN OTHERS THEN
1400         IF (c_sca%ISOPEN) THEN
1401             CLOSE c_sca;
1402         END IF;
1403         IF (c_sua%ISOPEN) THEN
1404             CLOSE c_sua;
1405         END IF;
1406         IF (c_sci%ISOPEN) THEN
1407             CLOSE c_sci;
1408         END IF;
1409         IF (c_scae%ISOPEN) THEN
1410             CLOSE c_scae;
1411         END IF;
1412         IF (c_secc%ISOPEN) THEN
1413             CLOSE c_secc;
1414         END IF;
1415 END;
1416 EXCEPTION
1417     WHEN OTHERS THEN
1418     Fnd_Message.Set_name('IGS','IGS_GE_UNHANDLED_EXP');
1419     FND_MESSAGE.SET_TOKEN('NAME','IGS_EN_GEN_006.enrp_get_sca_status');
1420     IGS_GE_MSG_STACK.ADD;
1421     App_Exception.Raise_Exception;
1422 END enrp_get_sca_status;
1423 
1424 
1425 Function Enrp_Get_Sca_Trnsfr(
1426   p_person_id IN NUMBER ,
1427   p_course_cd IN VARCHAR2 ,
1428   p_message_name OUT NOCOPY VARCHAR2)
1429 RETURN BOOLEAN AS
1430 
1431 BEGIN   -- enrp_get_sca_trnsfr
1432     -- This module determines if the student IGS_PS_COURSE attenmpt has been transferred
1433     --This is determined by the existence of one or nore student IGS_PS_COURSE transfer
1434     -- details where the latest is a transfer 'from' the IGS_PS_COURSE attempt
1435 DECLARE
1436     v_trnsfr_crs_cd         IGS_PS_STDNT_TRN.transfer_course_cd%TYPE;
1437     CURSOR c_sct IS
1438         SELECT  sct.transfer_course_cd
1439         FROM    IGS_PS_STDNT_TRN sct
1440         WHERE   sct.person_id       = p_person_id AND
1441             (sct.course_cd      = p_course_cd OR
1442             sct.transfer_course_cd  = p_course_cd)
1443         ORDER BY transfer_dt desc;
1444 BEGIN
1445     p_message_name := null;
1446     -- Determine  that if student IGS_PS_COURSE transfer details exist, then the last
1447     -- was a transfer  from the IGS_PS_COURSE attempt
1448     OPEN c_sct;
1449     FETCH c_sct INTO v_trnsfr_crs_cd;
1450     IF (c_sct%NOTFOUND) THEN
1451         CLOSE c_sct;
1452         RETURN FALSE;
1453     END IF;
1454     CLOSE c_sct;
1455     IF (v_trnsfr_crs_cd <> p_course_cd) THEN
1456         RETURN FALSE;
1457     END IF;
1458     RETURN TRUE;
1459 EXCEPTION
1460     WHEN OTHERS THEN
1461         IF (c_sct%ISOPEN) THEN
1462             CLOSE c_sct;
1463         END IF;
1464         RAISE;
1465 END;
1466 /*
1467 EXCEPTION
1468     WHEN OTHERS THEN
1469     Fnd_Message.Set_name('IGS','IGS_GE_UNHANDLED_EXP');
1470     App_Exception.Raise_Exception;
1471 */
1472 END enrp_get_sca_trnsfr;
1473 
1474 END IGS_EN_GEN_006;