DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGS_RE_GEN_001

Source


1 PACKAGE BODY IGS_RE_GEN_001 AS
2 /* $Header: IGSRE01B.pls 120.1 2005/11/24 04:36:30 appldev ship $ */
3 
4 -------------------------------------------------------------------------------------------
5   --Change History:
6   --Who         When            What
7   --Nishikant   11DEC2002       ENCR027 Build (Program Length Integration) . In the function RESP_CLC_MAX_SBMSN and
8   --                            RESP_CLC_MIN_SBMSN the signature of the function call igs_ps_gen_002.crsp_get_crv_eftd got
9   --                            modified, which used to get the value for the variable v_crv_eftd.
10   --vvutukur    19_oct-2002     Enh#2608227.Modified functions resp_clc_max_sbmsn,resp_clc_min_sbmsn.
11   --prchandr    08-Jan-01       Enh Bug No: 2174101, As the Part of Change in IGSEN18B
12   --                            Passing NULL as parameters  to ENRP_CLC_SUA_EFTSU
13   --                            ENRP_CLC_EFTSU_TOTAL for Key course cd and version number
14   -------------------------------------------------------------------------------------------
15 FUNCTION RESP_CLC_EFTSU_TRUNC(
16   p_person_id IN NUMBER ,
17   p_ca_sequence_number IN NUMBER ,
18   p_unit_cd IN VARCHAR2 ,
19   p_version_number IN NUMBER ,
20   p_uoo_id IN NUMBER ,
21   p_census_dt IN DATE ,
22   p_eftsu IN NUMBER )
23 RETURN NUMBER AS
24         gv_other_detail         VARCHAR2(255);
25 BEGIN   -- resp_clc_eftsu_trunc
26         -- Routine to perform the necessary truncation on the DEETYA reported EFTSU
27         -- for research units - this is in accordance with the DEETYA guidelines, and
28         -- is required to be able to reconcile EFTSU figures calculated on a day to
29         -- day basis with those reported in the DEETYA submissions.
30         -- This routine will ?roll down? the EFTSU to the lowest common denominator,
31         -- truncate the value and then ?roll up? to the required level.
32         -- Research IGS_PS_UNIT AOU?s are defined by the links with their supervisors (or
33         -- if not specified, by the standards means).
34 DECLARE
35         CURSOR c_rsup (
36                 cp_census_dt    IGS_CA_DA_INST.absolute_val%TYPE)
37         IS
38                 SELECT  rsup.org_unit_cd,
39                         rsup.ou_start_dt,
40                         sum(rsup.funding_percentage) sum_fund_perc
41                 FROM    IGS_RE_SPRVSR   rsup
42                 WHERE   rsup.ca_person_id       = p_person_id AND
43                         rsup.ca_sequence_number = p_ca_sequence_number AND
44                         rsup.funding_percentage IS NOT NULL AND
45                         rsup.funding_percentage > 0 AND
46                         rsup.start_dt           <= cp_census_dt AND
47                         (rsup.end_dt            IS NULL OR
48                          rsup.end_dt            >= cp_census_dt)
49                 GROUP BY
50                         rsup.org_unit_cd,
51                         rsup.ou_start_dt;
52         CURSOR c_udis IS
53                 SELECT  udis.percentage
54                 FROM    IGS_PS_UNIT_DSCP udis
55                 WHERE   udis.unit_cd            = p_unit_cd AND
56                         udis.version_number     = p_version_number;
57         CURSOR c_sgcc_dai IS
58                 SELECT  NVL(dai.absolute_val, IGS_CA_GEN_001.calp_get_alias_val(
59                                                 dai.dt_alias,
60                                                 dai.sequence_number,
61                                                 dai.cal_type,
62                                                 dai.ci_sequence_number)) census_dt
63                 FROM    IGS_PS_UNIT_OFR_OPT uoo,
64                         IGS_GE_S_GEN_CAL_CON            sgcc,
65                         IGS_CA_DA_INST  dai
66                 WHERE   uoo.uoo_id              = p_uoo_id AND
67                         sgcc.s_control_num      = 1 and
68                         dai.dt_alias            = sgcc.census_dt_alias AND
69                         dai.cal_type            = uoo.cal_type AND
70                         dai.ci_sequence_number  = uoo.ci_sequence_number
71                 ORDER BY census_dt;
72         v_census_dt     IGS_CA_DA_INST.absolute_val%TYPE;
73         v_eftsu_total   NUMBER;
74         -- So I can test whether any records were found for statement 2
75         v_records_found BOOLEAN := FALSE;
76 BEGIN
77         v_eftsu_total := 0.000;
78         IF p_census_dt IS NULL THEN
79                 OPEN c_sgcc_dai;
80                 FETCH c_sgcc_dai INTO v_census_dt;
81                 IF c_sgcc_dai%NOTFOUND THEN
82                         CLOSE c_sgcc_dai;
83                         -- Bad parameters - return zero
84                         RETURN 0;
85                 END IF;
86                 CLOSE c_sgcc_dai;
87         ELSE -- p_census_dt IS NOT NULL
88                 v_census_dt := p_census_dt;
89         END IF;
90         FOR v_rsup_rec IN c_rsup (
91                                 v_census_dt) LOOP
92                 FOR v_udis_rec IN c_udis LOOP
93                         -- No reason to reenter this IF - when v_records_found is already true
94                         IF NOT v_records_found THEN
95                                 -- A supervision percentage record found!
96                                 v_records_found := TRUE;
97                         END IF;
98                         v_eftsu_total :=
99                                         v_eftsu_total +
100                                                 TRUNC(
101                                                         (p_eftsu * (v_rsup_rec.sum_fund_perc / 100)
102                                                                         * (v_udis_rec.percentage / 100)),
103                                                         3);
104                 END LOOP;
105         END LOOP;
106         IF NOT v_records_found THEN
107                 -- If no supervision percentage found then use the IGS_PS_UNIT values
108                 v_eftsu_total := IGS_EN_PRC_LOAD.enrp_clc_eftsu_trunc(
109                                                                 p_unit_cd,
110                                                                 p_version_number,
111                                                                 p_uoo_id,
112                                                                 p_eftsu);
113         END IF;
114         RETURN v_eftsu_total;
115 EXCEPTION
116         WHEN OTHERS THEN
117                 IF c_rsup %ISOPEN THEN
118                         CLOSE c_rsup;
119                 END IF;
120                 IF c_udis %ISOPEN THEN
121                         CLOSE c_udis;
122                 END IF;
123                 IF c_sgcc_dai%ISOPEN THEN
124                         CLOSE c_sgcc_dai;
125                 END IF;
126                 RAISE;
127 END;
128 END resp_clc_eftsu_trunc;
129 
130 
131 FUNCTION RESP_CLC_LOAD_EFTSU(
132   p_acad_cal_type IN VARCHAR2 ,
133   p_acad_ci_sequence_number IN NUMBER ,
134   p_load_cal_type IN VARCHAR2 ,
135   p_load_ci_sequence_number IN NUMBER )
136 RETURN NUMBER AS
137         gv_other_detail         VARCHAR2(255);
138 BEGIN   -- resp_clc_load_eftsu
139         -- Calculate the maximum EFTSU applicable in a load calendar according to the
140         -- percentage field held in the IGS_CA_INST_REL table for the
141         -- relationship between the academic and load calendar instances.
142 DECLARE
143         v_load_research_percentage
144         IGS_CA_INST_REL.load_research_percentage%TYPE;
145         CURSOR  c_cir IS
146                 SELECT  cir.load_research_percentage
147                 FROM    IGS_CA_INST_REL cir
148                 WHERE   sup_cal_type            = p_acad_cal_type               AND
149                         sup_ci_sequence_number  = p_acad_ci_sequence_number     AND
150                         sub_cal_type            = p_load_cal_type               AND
151                         sub_ci_sequence_number  = p_load_ci_sequence_number;
152 BEGIN
153         OPEN c_cir;
154         FETCH c_cir INTO v_load_research_percentage;
155         IF v_load_research_percentage IS NULL THEN
156                 CLOSE c_cir;
157                 RETURN 0;
158         END IF;
159         CLOSE c_cir;
160         RETURN v_load_research_percentage/100;
161 EXCEPTION
162         WHEN OTHERS THEN
163                 IF (c_cir%ISOPEN) THEN
164                         CLOSE c_cir;
165                 END IF;
166                 RAISE;
167 END;
168 END resp_clc_load_eftsu;
169 
170 
171 FUNCTION RESP_CLC_MAX_SBMSN(
172   p_person_id IN NUMBER ,
173   p_ca_sequence_number IN NUMBER ,
174   p_sca_course_cd IN VARCHAR2 ,
175   p_acai_admission_appl_number IN NUMBER ,
176   p_acai_nominated_course_cd IN VARCHAR2 ,
177   p_acai_sequence_number IN NUMBER ,
178   p_attendance_percentage IN NUMBER ,
179   p_commencement_dt IN DATE )
180 RETURN DATE AS
181  /*----------------------------------------------------------------------------
182   ||  Created By :
183   ||  Created On :
184   ||  Purpose :
185   ||  Known limitations, enhancements or remarks :
186   ||  Change History :
187   ||  Who             When            What
188   ||  (reverse chronological order - newest change first)
189   ||  Nishikant   11DEC2002    The signature of the function call igs_ps_gen_002.crsp_get_crv_eftd got
190   ||                           modified, which used to get the value for the variable v_crv_eftd
191   ||  vvutukur    19-Oct-2002  Enh#2608227.Added cursor cur_coo_id to fetch coo_id of course and modified
192   ||                           call to igs_ps_gen_002.crsp_get_crv_eftd.
193   || svanukur     28-jul-2004  implemented an nvl check to pass p_acai_nominated_course_cd in the call to
194   ||                            igs_ps_gen_002.crsp_get_crv_eftd bug 3487851
195   ----------------------------------------------------------------------------*/
196         gv_other_detail         VARCHAR2(255);
197 BEGIN   -- resp_clc_max_sbmsn
198         -- Calculate the minimum submission date of a student IGS_PS_COURSE attempt
199         -- IGS_RE_CANDIDATURE. This is calculated as the remaining EFTD (Effective
200         -- Full Time Days) remaining in the IGS_PS_COURSE multiplied by the minimum
201         -- submission percentage (stored against the students IGS_PS_COURSE version)
202         -- factored with the students current attendance percentage.
203 DECLARE
204         cst_unconfirm           CONSTANT        VARCHAR2(10) := 'UNCONFIRM';
205         v_ca_acai_adm_appl_number               IGS_RE_CANDIDATURE.acai_admission_appl_number%TYPE;
206         v_ca_acai_nominated_course_cd           IGS_RE_CANDIDATURE.acai_nominated_course_cd%TYPE;
207         v_ca_acai_sequence_number               IGS_RE_CANDIDATURE.acai_sequence_number%TYPE;
208         v_ca_sca_course_cd                      IGS_RE_CANDIDATURE.sca_course_cd%TYPE;
209         v_ca_attendance_percentage              IGS_RE_CANDIDATURE.attendance_percentage%TYPE;
210         v_candidature_exists_ind                        VARCHAR2(1);
211         v_sca_course_cd                         IGS_EN_STDNT_PS_ATT.course_cd%TYPE;
212         v_sca_version_number                    IGS_EN_STDNT_PS_ATT.version_number%TYPE;
213         v_sca_attendance_type                   IGS_EN_STDNT_PS_ATT.attendance_type%TYPE;
214         v_sca_course_attempt_status
215                                                 IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE;
216         v_sca_commencement_dt                   IGS_EN_STDNT_PS_ATT.commencement_dt%TYPE;
217         v_acai_course_cd                        IGS_PS_VER.course_cd%TYPE;
218         v_acai_version_number                   IGS_PS_VER.version_number%TYPE;
219         v_acai_attendance_type                  IGS_EN_ATD_TYPE.attendance_type%TYPE;
220         v_attendance_percentage                 IGS_EN_ATD_TYPE.research_percentage%TYPE;
221         v_att_attendance_percentage                     IGS_EN_ATD_TYPE.research_percentage%TYPE;
222         v_crv_eftd                              NUMBER;
223         v_used_eftd_days                        NUMBER;
224         v_eftd_remaining                        NUMBER;
225         v_remaining_days                        NUMBER;
226         v_commencement_dt                       DATE;
227 
228         CURSOR c_ca IS
229                 SELECT  ca.acai_admission_appl_number,
230                         ca.acai_nominated_course_cd,
231                         ca.acai_sequence_number,
232                         ca.sca_course_cd,
233                         ca.attendance_percentage
234                 FROM    IGS_RE_CANDIDATURE                      ca
235                 WHERE   ca.person_id                    = p_person_id AND
236                         ca.sequence_number              = p_ca_sequence_number;
237         CURSOR c_sca IS
238                 SELECT  sca.course_cd,
239                         sca.version_number,
240                         sca.attendance_type,
241                         sca.commencement_dt,
242                         sca.course_attempt_status
243                 FROM    IGS_EN_STDNT_PS_ATT             sca
244                 WHERE   sca.person_id                   = p_person_id AND
245                         sca.course_cd                   = v_ca_sca_course_cd;
246 
247         CURSOR c_acaiv IS
248                 SELECT  acai.course_cd,
249                     acai.crv_version_number,
250                     acai.attendance_type
251              FROM
252                     IGS_AD_PS_APPL_INST acai,
253                         IGS_AD_APPL aa,
254                     IGS_CA_INST ci,
255                     IGS_AD_PS_APPL aca,
256                     IGS_PS_VER crv
257              WHERE  acai.person_id  = p_person_id AND
258                     acai.admission_appl_number = v_ca_acai_adm_appl_number AND
259                     acai.nominated_course_cd =  v_ca_acai_nominated_course_cd AND
260                     acai.sequence_number = v_ca_acai_sequence_number AND
261                     aa.person_id = acai.person_id AND
262                       aa.admission_appl_number = acai.admission_appl_number AND
263                       ci.cal_type (+) = acai.deferred_adm_cal_type AND
264                       ci.sequence_number (+) = acai.deferred_adm_ci_sequence_num AND
265                       aca.person_id = acai.person_id AND
266                       aca.admission_appl_number = acai.admission_appl_number AND
267                       aca.nominated_course_cd = acai.nominated_course_cd AND
268                       crv.course_cd = acai.course_cd AND
269                       crv.version_number = acai.crv_version_number;
270 
271     CURSOR c_att IS
272                 SELECT  att.research_percentage
273                 FROM    IGS_EN_ATD_TYPE att
274                 WHERE   att.attendance_type = NVL(v_sca_attendance_type,v_acai_attendance_type);
275 
276   l_dummy_bool   BOOLEAN;
277         l_message_name fnd_new_messages.message_name%TYPE;
278 
279 BEGIN
280         v_ca_acai_adm_appl_number := NULL;
281         v_ca_acai_nominated_course_cd := NULL;
282         v_ca_acai_sequence_number := NULL;
283         v_ca_sca_course_cd := NULL;
284         v_ca_attendance_percentage := NULL;
285         IF p_ca_sequence_number IS NOT NULL THEN
286                 -- Select details from IGS_RE_CANDIDATURE
287                 OPEN c_ca;
288                 FETCH c_ca INTO v_ca_acai_adm_appl_number,
289                                 v_ca_acai_nominated_course_cd,
290                                 v_ca_acai_sequence_number,
291                                 v_ca_sca_course_cd,
292                                 v_ca_attendance_percentage;
293                 IF c_ca%NOTFOUND THEN
294                         CLOSE c_ca;
295                         RETURN NULL;
296                 END IF;
297                 CLOSE c_ca;
298         ELSE
299                 IF p_sca_course_cd IS NULL AND
300                                 (p_acai_admission_appl_number IS NULL OR
301                                 p_acai_nominated_course_cd IS NULL OR
302                                 p_acai_sequence_number IS NULL) THEN
303                         RETURN NULL;
304                 END IF;
305                 v_ca_acai_adm_appl_number := p_acai_admission_appl_number;
306                 v_ca_acai_nominated_course_cd := p_acai_nominated_course_cd;
307                 v_ca_acai_sequence_number := p_acai_sequence_number;
308                 v_ca_sca_course_cd := p_sca_course_cd;
309         END IF;
310         -- Either select details from the admission application or the student
311         -- IGS_PS_COURSE attempt depending on the IGS_RE_CANDIDATURE fields which are set.
312         IF v_ca_sca_course_cd IS NOT NULL THEN
313                 OPEN c_sca;
314                 FETCH c_sca INTO v_sca_course_cd,
315                                 v_sca_version_number,
316                                 v_sca_attendance_type,
317                                 v_sca_commencement_dt,
318                                 v_sca_course_attempt_status;
319                 IF c_sca%NOTFOUND THEN
320                         CLOSE c_sca;
321                         RETURN NULL;
322                 END IF;
323                 CLOSE c_sca;
324         ELSE
325                 v_sca_course_cd := NULL;
326                 v_sca_version_number := NULL;
327                 v_sca_attendance_type := NULL;
328                 v_sca_course_attempt_status := NULL;
329         END IF;
330         -- If the admission details have been passed then use these.
331         IF v_ca_acai_adm_appl_number IS NOT NULL THEN
332 
333                 OPEN c_acaiv;
334                 FETCH c_acaiv INTO v_acai_course_cd,
335                                         v_acai_version_number,
336                                         v_acai_attendance_type;
337                 IF c_acaiv%NOTFOUND THEN
338                         CLOSE c_acaiv;
339                         RETURN NULL;
340                 END IF;
341                 CLOSE c_acaiv;
342 
343         ELSE
344                 v_acai_course_cd := NULL;
345                 v_acai_version_number := NULL;
346                 v_acai_attendance_type := NULL;
347         END IF;
348 
349         --Call routine to get the program length.
350         --v_crv_eftd will have a valid value if the EFTD calculated properly in the
351         --below function otherwise it will have a value zero
352         --passing p_acai_nominated_course_cd since sca_course_cd will be null when called
353         -- from admissions before prenerolment is triggered
354         v_crv_eftd := igs_ps_gen_002.crsp_get_crv_eftd( p_person_id,
355                                                         nvl(p_sca_course_cd,p_acai_nominated_course_cd));
356 
357         IF v_crv_eftd <= 0 THEN
358                 -- Cannot calculate date if the IGS_PS_COURSE version has no EFTD
359                 RETURN NULL;
360         END IF;
361         if v_crv_eftd is NULL then
362                 v_crv_eftd := 0 ;
363         END IF;
364         OPEN c_att;
365         FETCH c_att INTO v_att_attendance_percentage;
366         CLOSE c_att;
367         -- Determine attendance percentage
368         IF NVL(p_attendance_percentage, v_ca_attendance_percentage) IS NULL THEN
369                 v_attendance_percentage := v_att_attendance_percentage;
370         ELSE
371                 v_attendance_percentage := NVL(
372                                                 p_attendance_percentage,
373                                                 v_ca_attendance_percentage);
374         END IF;
375         --added this condition since the research percentage can be set to 0
376         -- this will raise an unhandled exception since it will result in
377         -- a divide by 0
378 
379         IF (v_attendance_percentage = 0 ) OR (v_att_attendance_percentage = 0) THEN
380         RETURN NULL;
381         END IF;
382         IF v_ca_sca_course_cd IS NOT NULL THEN
383                 -- Call routine to determine the effective full time days already used
384                 v_used_eftd_days := resp_clc_used_eftd(
385                                                         p_person_id,
386                                                         v_ca_sca_course_cd,
387                                                         'Y',
388                                                         p_ca_sequence_number,
389                                                         v_attendance_percentage);
390         ELSE
391                 -- Only enrolled students could have used EFTD
392                 v_used_eftd_days := 0;
393         END IF;
394         v_eftd_remaining := v_crv_eftd - v_used_eftd_days;
395         IF v_eftd_remaining <= 0 THEN
396                 -- No days left - return the current date
397                 RETURN TRUNC(SYSDATE);
398         END IF;
399         -- Multiply the number of remaining EFTD by the students current attendance
400         -- to determine the maximum submission date
401         IF v_attendance_percentage <> 0 THEN
402                 v_remaining_days := v_eftd_remaining / (v_attendance_percentage / 100);
403         ELSE
404                 v_remaining_days := v_eftd_remaining / (v_att_attendance_percentage / 100);
405         END IF;
406         -- Determine if the students commencement date is a future date - if so,
407         -- the remaining days are added to their prospective commencement date
408         -- rather than the current date
409         IF p_commencement_dt IS NULL THEN
410                 IF v_ca_acai_adm_appl_number IS NULL OR
411                         NVL(v_sca_course_attempt_status, cst_unconfirm) <> cst_unconfirm THEN
412                         v_commencement_dt := NVL(v_sca_commencement_dt, TRUNC(SYSDATE));
413                 ELSE
414                         v_commencement_dt := resp_get_ca_comm(
415                                                 p_person_id,
416                                                 v_ca_sca_course_cd,
417                                                 v_ca_acai_adm_appl_number,
418                                                 v_ca_acai_nominated_course_cd,
419                                                 v_ca_acai_sequence_number);
420                 END IF;
421         ELSE
422                 v_commencement_dt := p_commencement_dt;
423         END IF;
424         IF v_commencement_dt >= TRUNC(SYSDATE) THEN
425                 RETURN (v_commencement_dt + v_remaining_days);
426         ELSE
427                 RETURN (TRUNC(SYSDATE) + NVL(v_remaining_days,0));
428         END IF;
429 EXCEPTION
430         WHEN OTHERS THEN
431                 IF c_ca%ISOPEN THEN
432                         CLOSE c_ca;
433                 END IF;
434                 IF c_sca%ISOPEN THEN
435                         CLOSE c_sca;
436                 END IF;
437 
438                 IF c_acaiv%ISOPEN THEN
439                         CLOSE c_acaiv;
440                 END IF;
441 
442                 IF c_att%ISOPEN THEN
443                         CLOSE c_att;
444                 END IF;
445                 RAISE;
446 END;
447 END resp_clc_max_sbmsn;
448 
449 
450 FUNCTION RESP_CLC_MIN_SBMSN(
451   P_PERSON_ID IN NUMBER ,
452   p_ca_sequence_number IN NUMBER ,
453   p_sca_course_cd IN VARCHAR2 ,
454   p_acai_admission_appl_number IN NUMBER ,
455   p_acai_nominated_course_cd IN VARCHAR2 ,
456   p_acai_sequence_number IN NUMBER ,
457   p_attendance_percentage IN NUMBER ,
458   p_commencement_dt IN DATE )
459 RETURN DATE AS
460  /*----------------------------------------------------------------------------
461   ||  Created By :
462   ||  Created On :
463   ||  Purpose :
464   ||  Known limitations, enhancements or remarks :
465   ||  Change History :
466   ||  Who             When            What
467   ||  (reverse chronological order - newest change first)
468   ||  Nishikant   11DEC2002    The signature of the function call igs_ps_gen_002.crsp_get_crv_eftd got
469   ||                           modified, which used to get the value for the variable v_crv_eftd
470   ||  vvutukur    19-Oct-2002  Enh#2608227.Added cursor cur_coo_id to fetch coo_id of course and modified
471   ||                           call to igs_ps_gen_002.crsp_get_crv_eftd.
472   || svanukur     28-jul-2004  implemented an nvl check to pass p_acai_nominated_course_cd in the call to
473   ||                            igs_ps_gen_002.crsp_get_crv_eftd bug 3487851
474   ----------------------------------------------------------------------------*/
475         gv_other_detail         VARCHAR2(255);
476 BEGIN   -- resp_clc_min_sbmsn
477         -- Calculate the minimum submission date of a student IGS_PS_COURSE attempt
478         -- IGS_RE_CANDIDATURE. This is calculated as the remaining EFTD (Effective
479         -- Full Time Days) remaining in the IGS_PS_COURSE multiplied by the minimum
480         -- submission percentage (stored against the students IGS_PS_COURSE version)
481         -- factored with the students current attendance percentage.
482 DECLARE
483         cst_unconfirm           CONSTANT        VARCHAR2(10) := 'UNCONFIRM';
484         v_ca_acai_adm_appl_number               IGS_RE_CANDIDATURE.acai_admission_appl_number%TYPE;
485         v_ca_acai_nominated_course_cd           IGS_RE_CANDIDATURE.acai_nominated_course_cd%TYPE;
486         v_ca_acai_sequence_number               IGS_RE_CANDIDATURE.acai_sequence_number%TYPE;
487         v_ca_sca_course_cd                      IGS_RE_CANDIDATURE.sca_course_cd%TYPE;
488         v_ca_attendance_percentage              IGS_RE_CANDIDATURE.attendance_percentage%TYPE;
489         v_candidature_exists_ind                        VARCHAR2(1);
490         v_sca_course_cd                         IGS_EN_STDNT_PS_ATT.course_cd%TYPE;
491         v_sca_version_number                    IGS_EN_STDNT_PS_ATT.version_number%TYPE;
492         v_sca_attendance_type                   IGS_EN_STDNT_PS_ATT.attendance_type%TYPE;
493         v_sca_course_attempt_status
494                                                 IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE;
495         v_sca_commencement_dt                   IGS_EN_STDNT_PS_ATT.commencement_dt%TYPE;
496         v_acai_course_cd                        IGS_PS_VER.course_cd%TYPE;
497         v_acai_version_number                   IGS_PS_VER.version_number%TYPE;
498         v_acai_attendance_type                  IGS_EN_ATD_TYPE.attendance_type%TYPE;
499         v_crv_min_sbmsn_percentage              IGS_PS_VER.min_sbmsn_percentage%TYPE;
500         v_attendance_percentage                 IGS_EN_ATD_TYPE.research_percentage%TYPE;
501         v_att_attendance_percentage             IGS_EN_ATD_TYPE.research_percentage%TYPE;
502         v_crv_eftd                              NUMBER;
503         v_used_eftd_days                        NUMBER;
504         v_minimum_eftd                          NUMBER;
505         v_eftd_remaining                        NUMBER;
506         v_remaining_days                        NUMBER;
507         v_commencement_dt                       DATE;
508         CURSOR c_ca IS
509                 SELECT  ca.acai_admission_appl_number,
510                         ca.acai_nominated_course_cd,
511                         ca.acai_sequence_number,
512                         ca.sca_course_cd,
513                         ca.attendance_percentage
514                 FROM    IGS_RE_CANDIDATURE                      ca
515                 WHERE   ca.person_id                    = p_person_id AND
516                         ca.sequence_number              = p_ca_sequence_number;
517         CURSOR c_sca IS
518                 SELECT  sca.course_cd,
519                         sca.version_number,
520                         sca.attendance_type,
521                         sca.commencement_dt,
522                         sca.course_attempt_status
523                 FROM    IGS_EN_STDNT_PS_ATT             sca
524                 WHERE   sca.person_id                   = p_person_id AND
525                         sca.course_cd                   = v_ca_sca_course_cd;
526 
527       CURSOR c_acaiv IS
528                 SELECT  acai.course_cd,
529                     acai.crv_version_number,
530                     acai.attendance_type
531              FROM
532                     IGS_AD_PS_APPL_INST acai,
533                         IGS_AD_APPL aa,
534                     IGS_CA_INST ci,
535                     IGS_AD_PS_APPL aca,
536                     IGS_PS_VER crv
537              WHERE  acai.person_id  = p_person_id AND
538                     acai.admission_appl_number = v_ca_acai_adm_appl_number AND
539                     acai.nominated_course_cd =  v_ca_acai_nominated_course_cd AND
540                     acai.sequence_number = v_ca_acai_sequence_number AND
541                     aa.person_id = acai.person_id AND
542                       aa.admission_appl_number = acai.admission_appl_number AND
543                       ci.cal_type (+) = acai.deferred_adm_cal_type AND
544                       ci.sequence_number (+) = acai.deferred_adm_ci_sequence_num AND
545                       aca.person_id = acai.person_id AND
546                       aca.admission_appl_number = acai.admission_appl_number AND
547                       aca.nominated_course_cd = acai.nominated_course_cd AND
548                       crv.course_cd = acai.course_cd AND
549                       crv.version_number = acai.crv_version_number;
550 
551 
552         CURSOR c_crv IS
553                 SELECT  crv.min_sbmsn_percentage
554                 FROM    IGS_PS_VER                      crv
555                 WHERE   crv.course_cd                   = NVL(
556                                                                 v_sca_course_cd,
557                                                                 v_acai_course_cd) AND
558                         crv.version_number              = NVL(
559                                                                 v_sca_version_number,
560                                                                 v_acai_version_number);
561         CURSOR c_att IS
562                 SELECT  att.research_percentage
563                 FROM    IGS_EN_ATD_TYPE                 att
564                 WHERE   att.attendance_type             = NVL(
565                                                                 v_sca_attendance_type,
566                                                                 v_acai_attendance_type);
567 
568         l_dummy_bool   BOOLEAN;
569         l_message_name fnd_new_messages.message_name%TYPE;
570 
571   BEGIN
572         v_ca_acai_adm_appl_number := NULL;
573         v_ca_acai_nominated_course_cd := NULL;
574         v_ca_acai_sequence_number := NULL;
575         v_ca_sca_course_cd := NULL;
576         v_ca_attendance_percentage := NULL;
577         IF p_ca_sequence_number IS NOT NULL THEN
578                 -- Select details from IGS_RE_CANDIDATURE
579                 OPEN c_ca;
580                 FETCH c_ca INTO v_ca_acai_adm_appl_number,
581                                 v_ca_acai_nominated_course_cd,
582                                 v_ca_acai_sequence_number,
583                                 v_ca_sca_course_cd,
584                                 v_ca_attendance_percentage;
585                 IF c_ca%NOTFOUND THEN
586                         CLOSE c_ca;
587                         RETURN NULL;
588                 END IF;
589                 CLOSE c_ca;
590         ELSE
591                 IF p_sca_course_cd IS NULL AND
592                                 (p_acai_admission_appl_number IS NULL OR
593                                 p_acai_nominated_course_cd IS NULL OR
594                                 p_acai_sequence_number IS NULL) THEN
595                         RETURN NULL;
596                 END IF;
597                 v_ca_acai_adm_appl_number := p_acai_admission_appl_number;
598                 v_ca_acai_nominated_course_cd := p_acai_nominated_course_cd;
599                 v_ca_acai_sequence_number := p_acai_sequence_number;
600                 v_ca_sca_course_cd := p_sca_course_cd;
601         END IF;
602         -- Either select details from the admission application or the student
603         -- IGS_PS_COURSE attempt depending on the IGS_RE_CANDIDATURE fields which are set.
604         IF v_ca_sca_course_cd IS NOT NULL THEN
605                 OPEN c_sca;
606                 FETCH c_sca INTO v_sca_course_cd,
607                                 v_sca_version_number,
608                                 v_sca_attendance_type,
609                                 v_sca_commencement_dt,
610                                 v_sca_course_attempt_status;
611                 IF c_sca%NOTFOUND THEN
612                         CLOSE c_sca;
613                         RETURN NULL;
614                 END IF;
615                 CLOSE c_sca;
616         ELSE
617                 v_sca_course_cd := NULL;
618                 v_sca_version_number := NULL;
619                 v_sca_attendance_type := NULL;
620                 v_sca_course_attempt_status := NULL;
621         END IF;
622         -- If the admission details have been passed then use these.
623         IF v_ca_acai_adm_appl_number IS NOT NULL THEN
624 
625                 OPEN c_acaiv;
626                 FETCH c_acaiv INTO v_acai_course_cd,
627                                         v_acai_version_number,
628                                         v_acai_attendance_type;
629                 IF c_acaiv%NOTFOUND THEN
630                         CLOSE c_acaiv;
631                         RETURN NULL;
632                 END IF;
633                 CLOSE c_acaiv;
634         ELSE
635                 v_acai_course_cd := NULL;
636                 v_acai_version_number := NULL;
637                 v_acai_attendance_type := NULL;
638         END IF;
639         -- Select details from the IGS_PS_COURSE version table
640         OPEN c_crv;
641         FETCH c_crv INTO v_crv_min_sbmsn_percentage;
642         CLOSE c_crv;
643 
644         -- Call routine to get the program length.
645         --v_crv_eftd will have a valid value if the EFTD calculated properly in the
646         --below function otherwise it will have a value zero
647         --passing p_acai_nominated_course_cd since sca_course_cd will be null when called
648         -- from admissions before prenerolment is triggered.
649         v_crv_eftd := igs_ps_gen_002.crsp_get_crv_eftd( p_person_id,
650                                                         nvl(p_sca_course_cd,p_acai_nominated_course_cd));
651 
652         IF v_crv_eftd <= 0 THEN
653                 -- Cannot calculate date if the IGS_PS_COURSE version has no EFTD
654                 RETURN NULL;
655         END IF;
656         IF v_crv_eftd is NULL then
657                 v_crv_eftd := 0;
658         END IF;
659         OPEN c_att;
660         FETCH c_att INTO v_att_attendance_percentage;
661         CLOSE c_att;
662         -- Determine attendance percentage
663         IF NVL(p_attendance_percentage, v_ca_attendance_percentage) IS NULL THEN
664                 v_attendance_percentage := v_att_attendance_percentage;
665         ELSE
666                 v_attendance_percentage := NVL(
667                                                 p_attendance_percentage,
668                                                 v_ca_attendance_percentage);
669         END IF;
670 
671         --added this condition since the research percentage can be set to 0
672         -- this will raise an unhandled exception since it will result in
673         -- a divide by 0
674         IF (v_attendance_percentage = 0 ) OR (v_att_attendance_percentage = 0) THEN
675         RETURN NULL;
676         END IF;
677 
678         IF v_ca_sca_course_cd IS NOT NULL THEN
679                 -- Call routine to determine the effective full time days already used
680                 v_used_eftd_days := resp_clc_used_eftd(
681                                                         p_person_id,
682                                                         v_ca_sca_course_cd,
683                                                         'Y',
684                                                         p_ca_sequence_number,
685                                                         v_attendance_percentage);
686         ELSE
687                 -- Only enrolled students could have used days
688                 v_used_eftd_days := 0;
689         END IF;
690         v_minimum_eftd := v_crv_eftd * (v_crv_min_sbmsn_percentage / 100);
691         IF v_used_eftd_days > v_minimum_eftd THEN
692                 -- Student has already consumed more days than the IGS_PS_COURSE permitted
693                 -- * return the current date as the minimum submission date
694                 RETURN TRUNC(SYSDATE);
695         END IF;
696         v_eftd_remaining := v_minimum_eftd - v_used_eftd_days;
697         -- Multiply the number of remaining EFTD by the students current attendance
698         -- to determine the maximum submission date
699         IF v_attendance_percentage <> 0 THEN
700                 v_remaining_days := v_eftd_remaining / (v_attendance_percentage / 100);
701         ELSE
702                 v_remaining_days := v_eftd_remaining / (v_att_attendance_percentage / 100);
703         END IF;
704         -- Determine if the students commencement date is a future date - if so,
705         -- the remaining days are added to their prospective commencement date
706         -- rather than the current date
707         IF p_commencement_dt IS NULL THEN
708                 IF v_ca_acai_adm_appl_number IS NULL OR
709                         NVL(v_sca_course_attempt_status, cst_unconfirm) <> cst_unconfirm THEN
710                         v_commencement_dt := NVL(v_sca_commencement_dt, TRUNC(SYSDATE));
711                 ELSE
712                         v_commencement_dt := resp_get_ca_comm(
713                                                 p_person_id,
714                                                 v_ca_sca_course_cd,
715                                                 v_ca_acai_adm_appl_number,
716                                                 v_ca_acai_nominated_course_cd,
717                                                 v_ca_acai_sequence_number);
718                 END IF;
719         ELSE
720                 v_commencement_dt := p_commencement_dt;
721         END IF;
722         IF v_commencement_dt >= TRUNC(SYSDATE) THEN
723                 RETURN (v_commencement_dt + v_remaining_days);
724         ELSE
725                 RETURN (TRUNC(SYSDATE) + NVL(v_remaining_days,0));
726         END IF;
727   EXCEPTION
728         WHEN OTHERS THEN
729                 IF c_ca%ISOPEN THEN
730                         CLOSE c_ca;
731                 END IF;
732                 IF c_sca%ISOPEN THEN
733                         CLOSE c_sca;
734                 END IF;
735 
736                 IF c_acaiv%ISOPEN THEN
737                         CLOSE c_acaiv;
738                 END IF;
739 
740                 IF c_crv%ISOPEN THEN
741                         CLOSE c_crv;
742                 END IF;
743                 IF c_att%ISOPEN THEN
744                         CLOSE c_att;
745                 END IF;
746                 RAISE;
747   END;
748 END resp_clc_min_sbmsn;
749 
750 
751 FUNCTION RESP_CLC_SUA_EFTSU(
752   p_person_id IN NUMBER ,
753   p_course_cd IN VARCHAR2 ,
754   p_unit_cd IN VARCHAR2 ,
755   p_cal_type IN VARCHAR2 ,
756   p_ci_sequence_number IN NUMBER ,
757   p_load_cal_type IN VARCHAR2 ,
758   p_load_ci_sequence_number IN NUMBER ,
759   p_truncate_ind IN VARCHAR2,
760   p_uoo_id igs_en_su_attempt.uoo_id%TYPE )
761 RETURN NUMBER AS
762 /*
763 | Who         When            What
764 | knaraset  09-May-03   modified function to add parameter uoo_id which is used in cursor c_sua, as part of MUS build bug 2829262
765 |
766 |
767 */
768         gv_other_detail                 VARCHAR2(255);
769 BEGIN   -- resp_clc_sua_eftsu
770         -- Calculate the EFTSU figure for a research load IGS_PS_UNIT attempt. This routine
771         -- will,
772         -- . Determine the base EFTSU figure for the SUA as either the override value
773         --   or the value from the research EFTD.
774         -- . Calculates the coursework load within the same teaching period and
775         --   adjusts the research IGS_PS_UNIT accordingly.
776         -- . Truncates the EFTSU (if the parameter requires it).
777         -- Assumptions (highlighted by the calendar quality check):
778         -- ? The EFTSU within research teaching periods only contributes to a single
779         --   load calendar (ie. is never split across multiple load calendars).
780         -- ? A student is only ever enrolled in a single research IGS_PS_UNIT within a load
781         --   calendar (ie. multiple units are not taken into consideration when
782         --   comparing the research load with the coursework load).
783 DECLARE
784         v_census_dt                     IGS_CA_DA_INST.absolute_val%TYPE;
785         v_ca_person_id                  IGS_RE_CANDIDATURE.person_id%TYPE;
786         v_ca_sequence_number            IGS_RE_CANDIDATURE.sequence_number%TYPE;
787         v_sua_override_eftsu            IGS_EN_SU_ATTEMPT.override_eftsu%TYPE;
788         v_sua_cal_type                  IGS_EN_SU_ATTEMPT.cal_type%TYPE;
789         v_sua_ci_sequence_number        IGS_EN_SU_ATTEMPT.ci_sequence_number%TYPE;
790         v_sua_uoo_id                    IGS_EN_SU_ATTEMPT.uoo_id%TYPE;
791         v_sua_version_number            IGS_EN_SU_ATTEMPT.version_number%TYPE;
792         v_acad_cal_type                 IGS_CA_INST.cal_type%TYPE;
793         v_acad_ci_sequence_number       IGS_CA_INST.sequence_number%TYPE;
794         v_acad_ci_start_dt              IGS_CA_INST.start_dt%TYPE;
795         v_acad_ci_end_dt                IGS_CA_INST.end_dt%TYPE;
796         v_message_name                  VARCHAR2(30);
797         v_credit_points                 NUMBER;
798         v_load_eftsu                    NUMBER;
799         v_sua_eftd                      NUMBER;
800         v_cal_type_eftd                 NUMBER;
801         v_sua_eftsu                     NUMBER;
802         v_coursework_eftsu              NUMBER;
803         v_dummy_string                  VARCHAR2(10);
804         v_final_eftsu                   NUMBER;
805         v_census_att_perc                       NUMBER;
806         CURSOR c_ca IS
807                 SELECT  ca.person_id,
808                         ca.sequence_number
809                 FROM    IGS_RE_CANDIDATURE ca
810                 WHERE   ca.person_id                    = p_person_id AND
811                         NVL(ca.sca_course_cd, 'NULL')   = NVL(p_course_cd, 'NULL');
812         CURSOR c_sua(cp_person_id igs_en_su_attempt.person_id%TYPE,
813                  cp_course_cd  igs_en_su_attempt.course_cd%TYPE,
814                  cp_uoo_id  igs_en_su_attempt.uoo_id%TYPE) IS
815                 SELECT  sua.override_eftsu,
816                         sua.cal_type,
817                         sua.ci_sequence_number,
818                         sua.uoo_id,
819                         sua.version_number
820                 FROM    IGS_EN_SU_ATTEMPT       sua,
821                         IGS_EN_STDNT_PS_ATT     sca,
822                         IGS_PS_UNIT_VER                 uv
823                 WHERE   sua.person_id           = cp_person_id AND
824                         sua.course_cd           = cp_course_cd AND
825                         sua.uoo_id              = cp_uoo_id AND
826                         sca.person_id           = sua.person_id AND
827                         sca.course_cd           = sua.course_cd AND
828                         uv.unit_cd              = sua.unit_cd AND
829                         uv.version_number       = sua.version_number AND
830                         uv.research_unit_ind    = 'Y';
831         CURSOR c_sgcc (
832                 cp_cal_type             IGS_EN_SU_ATTEMPT.cal_type%TYPE,
833                 cp_ci_sequence_number   IGS_EN_SU_ATTEMPT.ci_sequence_number%TYPE)
834         IS
835                 SELECT  NVL(
836                                 dai.absolute_val,
837                                 IGS_CA_GEN_001.calp_get_alias_val(
838                                                 dai.dt_alias,
839                                                 dai.sequence_number,
840                                                 dai.cal_type,
841                                                 dai.ci_sequence_number)) v_census_dt
842                 FROM    IGS_GE_S_GEN_CAL_CON sgcc,
843                         IGS_CA_DA_INST dai
844                 WHERE   sgcc.s_control_num      = 1 AND
845                         dai.cal_type            = cp_cal_type AND
846                         dai.ci_sequence_number  = cp_ci_sequence_number AND
847                         dai.dt_alias            = sgcc.census_dt_alias
848                 ORDER BY 1;
849 BEGIN
850         -- 1. Select detail from research IGS_RE_CANDIDATURE
851         OPEN c_ca;
852         FETCH c_ca INTO
853                         v_ca_person_id,
854                         v_ca_sequence_number;
855         IF c_ca%NOTFOUND THEN
856                 -- No research IGS_PS_UNIT load for non-research students.
857                 CLOSE c_ca;
858                 RETURN NULL;
859         END IF;
860         CLOSE c_ca;
861         -- 2. Select detail from IGS_PS_UNIT attempt and IGS_PS_UNIT version tables
862         OPEN c_sua(p_person_id,p_course_cd,p_uoo_id);
863         FETCH c_sua INTO
864                         v_sua_override_eftsu,
865                         v_sua_cal_type,
866                         v_sua_ci_sequence_number,
867                         v_sua_uoo_id,
868                         v_sua_version_number;
869         IF c_sua%NOTFOUND THEN
870                 -- Only existing IGS_PS_UNIT attempts in research 'Load' units can have EFTSU
871                 -- calculated through this method ; return zero.
872                 CLOSE c_sua;
873                 RETURN 0;
874         END IF;
875         CLOSE c_sua;
876         -- 3. Calculate the EFTSU figure for the load calendar instance
877         v_dummy_string := IGS_EN_GEN_002.enrp_get_acad_alt_cd (
878                                                 v_sua_cal_type,
879                                                 v_sua_ci_sequence_number,
880                                                 v_acad_cal_type,
881                                                 v_acad_ci_sequence_number,
882                                                 v_acad_ci_start_dt,
883                                                 v_acad_ci_end_dt,
884                                                 v_message_name);
885         v_load_eftsu := resp_clc_load_eftsu (
886                                                 v_acad_cal_type,
887                                                 v_acad_ci_sequence_number,
888                                                 p_load_cal_type,
889                                                 p_load_ci_sequence_number);
890         IF v_load_eftsu = 0 THEN
891                 -- No load EFTSU will lead to 0 SUA EFTSU, so exit at this point
892                 -- to enable standard EFTSU calculation ***JES
893                 RETURN NULL;
894         END IF;
895         -- 4. Retrieve the census date from the teaching period.
896         -- Because I am ordering by 1 desc, if there are multiple records the
897         -- earliest census date will be selected automatically.
898         OPEN c_sgcc (
899                 v_sua_cal_type,
900                 v_sua_ci_sequence_number);
901         FETCH c_sgcc INTO v_census_dt;
902         IF c_sgcc%NOTFOUND THEN
903                 -- No census date - invalid calendar set-up - return zero
904                 CLOSE c_sgcc;
905                 RETURN 0;
906         END IF;
907         CLOSE c_sgcc;
908         IF v_sua_override_eftsu IS NULL THEN
909                 -- 5. Call routine to determine the EFTD figure for the teaching period
910                 --    within the nominated load calendar instance.
911                 v_sua_eftd := IGS_RE_GEN_002.resp_get_sua_eftd (
912                                         p_person_id,
913                                         p_course_cd,
914                                         p_unit_cd,
915                                         v_sua_version_number,
916                                         p_cal_type,
917                                         p_ci_sequence_number,
918                                         v_census_dt,
919                                         p_load_cal_type,
920                                         p_load_ci_sequence_number,
921                                         v_cal_type_eftd);
922                 IF v_cal_type_eftd = 0 THEN
923                         RETURN NULL;
924                 END IF;
925                 IF v_sua_eftd = 0 THEN
926                         RETURN 0;
927                 END IF;
928                 -- 6. Calculate the EFTSU figure for the IGS_PS_UNIT attempt; this is as a
929                 --    proportion of the SUA EFTD against the teaching period EFTD multiplied
930                 --    by the load calendar EFTSU.
931                 v_sua_eftsu := (v_sua_eftd / v_cal_type_eftd )
932                                 * v_load_eftsu;
933         ELSE    -- override EFTSU has been specified.
934                 IF v_sua_override_eftsu = 0 THEN
935                         -- Override of zero - no further processing.
936                         RETURN 0;
937                 ELSE
938                         v_sua_eftsu := v_sua_override_eftsu;
939                 END IF;
940         END IF;
941         IF v_sua_override_eftsu IS NULL THEN
942                 -- 7. Call routine to determine the total of the coursework EFTSU in the load
943                 --    calendar instance. First get the academic parent of the parameter load
944                 --    calendar.
945                 v_dummy_string := IGS_EN_GEN_002.enrp_get_acad_alt_cd(
946                                                 p_load_cal_type,
947                                                 p_load_ci_sequence_number,
948                                                 v_acad_cal_type,
949                                                 v_acad_ci_sequence_number,
950                                                 v_acad_ci_start_dt,
951                                                 v_acad_ci_end_dt,
952                                                 v_message_name);
953                 v_coursework_eftsu := IGS_EN_PRC_LOAD.enrp_clc_eftsu_total(
954                                                 p_person_id,
955                                                 p_course_cd,
956                                                 v_acad_cal_type,
957                                                 v_acad_ci_sequence_number,
958                                                 p_load_cal_type,
959                                                 p_load_ci_sequence_number,
960                                                 p_truncate_ind,
961                                                 'N',    -- Don't include research units
962                                                 NULL,
963                                                NULL,
964                                                 v_credit_points);
965                 -- Calculate the final figure factoring in the coursework component.
966                 IF v_coursework_eftsu = 0 THEN
967                         v_final_eftsu := v_sua_eftsu;
968                 ELSIF v_coursework_eftsu >= v_sua_eftsu THEN
969                         RETURN 0;
970                 ELSE
971                         v_final_eftsu := v_sua_eftsu - v_coursework_eftsu;
972                 END IF;
973         END IF;
974         -- 9. If truncation is required then call the appropriate routine.
975         IF p_truncate_ind = 'Y' THEN
976                 RETURN resp_clc_eftsu_trunc (
977                                 v_ca_person_id,
978                                 v_ca_sequence_number,
979                                 p_unit_cd,
980                                 v_sua_version_number,
981                                 v_sua_uoo_id,
982                                 v_census_dt,
983                                 v_final_eftsu);
984         ELSE
985                 RETURN v_final_eftsu;
986         END IF;
987 EXCEPTION
988         WHEN OTHERS THEN
989                 IF c_ca %ISOPEN THEN
990                         CLOSE c_ca;
991                 END IF;
992                 IF c_sua %ISOPEN THEN
993                         CLOSE c_sua;
994                 END IF;
995                 IF c_sgcc %ISOPEN THEN
996                         CLOSE c_sgcc;
997                 END IF;
998         RAISE;
999 END;
1000 
1001 END resp_clc_sua_eftsu;
1002 
1003 
1004 FUNCTION RESP_CLC_USED_EFTD(
1005   p_person_id IN NUMBER ,
1006   p_course_cd IN VARCHAR2 ,
1007   p_candidature_identified_ind IN VARCHAR2,
1008   p_ca_sequence_number IN NUMBER ,
1009   p_attendance_percentage IN NUMBER )
1010 RETURN NUMBER AS
1011         gv_other_detail         VARCHAR2(255);
1012 BEGIN   -- resp_clc_used_eftd
1013         -- Calculates the effective full time days used
1014         -- by a student within a research IGS_PS_COURSE.
1015   -------------------------------------------------------------------------------------------
1016   --Change History:
1017   --Who         When            What
1018   -- svanukur   01-APR-2004    Changed cursor c_cah  to consider all history records for calcultation
1019   --                           of used EFTD instead of the using only those history records that
1020   --                           start after the commencement date. bug  3544986
1021   -- rnirwani   13-Sep-2004    changed cursor c_sci to not consider logically deleted records and
1022   --				also to avoid un-approved intermission records. Bug# 3885804
1023   -------------------------------------------------------------------------------------------
1024 DECLARE
1025         cst_unconfirm   CONSTANT
1026                                         IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE := 'UNCONFIRM';
1027         v_ca_sequence_number            IGS_RE_CANDIDATURE.sequence_number%TYPE;
1028         v_ca_attendance_percentage      IGS_RE_CANDIDATURE.attendance_percentage%TYPE;
1029         v_course_attempt_status         IGS_EN_STDNT_PS_ATT.course_attempt_status%TYPE;
1030         v_commencement_dt               IGS_EN_STDNT_PS_ATT.commencement_dt%TYPE;
1031         v_attendance_type               IGS_EN_STDNT_PS_ATT.attendance_type%TYPE;
1032         v_version_number                IGS_EN_STDNT_PS_ATT.version_number%TYPE;
1033         v_last_hist_end_dt              IGS_RE_CDT_ATT_HIST.hist_end_dt%TYPE;
1034         v_last_attendance_percentage    IGS_RE_CDT_ATT_HIST.attendance_percentage%TYPE;
1035         v_cah_hist_start_dt             IGS_RE_CDT_ATT_HIST.hist_start_dt%TYPE;
1036         v_cah_hist_end_dt               IGS_RE_CDT_ATT_HIST.hist_end_dt%TYPE;
1037         v_cah_attendance_percentage     IGS_RE_CDT_ATT_HIST.attendance_percentage%TYPE;
1038         v_research_percentage           IGS_EN_ATD_TYPE.research_percentage%TYPE;
1039         v_count_intrmsn_in_time_ind     IGS_PS_VER.count_intrmsn_in_time_ind%TYPE;
1040         v_start_dt                      IGS_RE_CDT_ATT_HIST.hist_start_dt%TYPE;
1041         v_last_end_dt                   IGS_EN_STDNT_PS_ATT.commencement_dt%TYPE;
1042         v_cah_last_end_dt                       IGS_EN_STDNT_PS_ATT.commencement_dt%TYPE;
1043         v_attendance_percentage         IGS_RE_CANDIDATURE.attendance_percentage%TYPE;
1044         v_today_dt                      DATE;
1045         v_EFTD_total                    NUMBER;
1046         v_next_rec_flg                  BOOLEAN;
1047         v_sci_end_dt                    IGS_EN_STDNT_PS_INTM.end_dt%TYPE;
1048         v_end_dt                        IGS_EN_STDNT_PS_INTM.end_dt%TYPE;
1049         CURSOR c_ca IS
1050                 SELECT  ca.sequence_number,
1051                         ca.attendance_percentage
1052                 FROM    IGS_RE_CANDIDATURE      ca
1053                 WHERE   ca.person_id            = p_person_id AND
1054                         (ca.sca_course_cd       IS NULL OR
1055                         ca.sca_course_cd        = p_course_cd);
1056         CURSOR c_sca IS
1057                 SELECT  sca.course_attempt_status,
1058                         sca.commencement_dt,
1059                         sca.attendance_type,
1060                         sca.version_number
1061                 FROM    IGS_EN_STDNT_PS_ATT     sca
1062                 WHERE   sca.person_id = p_person_id AND
1063                         sca.course_cd = p_course_cd;
1064         CURSOR c_cah (
1065                 cp_sequence_number      IGS_RE_CANDIDATURE.sequence_number%TYPE
1066                 ) IS
1067                 SELECT  cah.hist_start_dt,
1068                         cah.hist_end_dt,
1069                         cah.attendance_percentage
1070                 FROM    IGS_RE_CDT_ATT_HIST     cah
1071                 WHERE   cah.person_id           = p_person_id AND
1072                         cah.ca_sequence_number  = cp_sequence_number
1073                         ORDER BY cah.hist_start_dt ASC;
1074 
1075 
1076         CURSOR c_att (
1077                 cp_attendance_type      IGS_EN_STDNT_PS_ATT.attendance_type%TYPE) IS
1078                 SELECT  att.research_percentage
1079                 FROM    IGS_EN_ATD_TYPE att
1080                 WHERE   att.attendance_type     = cp_attendance_type AND
1081                         att.closed_ind          = 'N';
1082         CURSOR c_crv (
1083                 cp_version_number       IGS_EN_STDNT_PS_ATT.version_number%TYPE) IS
1084                 SELECT  crv.count_intrmsn_in_time_ind
1085                 FROM    IGS_PS_VER      crv
1086                 WHERE   crv.course_cd           = p_course_cd AND
1087                         crv.version_number      = cp_version_number;
1088         CURSOR c_sci IS
1089                 SELECT  sci.start_dt,
1090                         sci.end_dt
1091                 FROM    IGS_EN_STDNT_PS_INTM    sci,
1092                         IGS_EN_INTM_TYPES eit
1093                 WHERE   sci.person_id = p_person_id AND
1094 			sci.course_cd = p_course_cd AND
1095 			sci.approved  = eit.appr_reqd_ind AND
1096                         eit.intermission_type = sci.intermission_type AND
1097                         sci.logical_delete_date = TO_DATE('31-12-4712','DD-MM-YYYY')
1098                 ORDER BY sci.start_dt;
1099         CURSOR c_cah2 (
1100                 cp_sequence_number      IGS_RE_CANDIDATURE.sequence_number%TYPE,
1101                 cp_sci_end_dt           IGS_EN_STDNT_PS_INTM.end_dt%TYPE,
1102                 cp_sci_start_dt         IGS_EN_STDNT_PS_INTM.start_dt%TYPE) IS
1103                 SELECT  cah.hist_start_dt,
1104                         cah.hist_end_dt,
1105                         cah.attendance_percentage
1106                 FROM    IGS_RE_CDT_ATT_HIST     cah
1107                 WHERE   cah.person_id           = p_person_id AND
1108                         cah.ca_sequence_number  = cp_sequence_number AND
1109                         cah.hist_start_dt       <= cp_sci_end_dt AND
1110                         cah.hist_end_dt         >= cp_sci_start_dt
1111                 ORDER BY        cah.hist_start_dt ASC;
1112 BEGIN
1113         -- 1. Determine whether IGS_PE_PERSON has a research
1114         --    IGS_RE_CANDIDATURE for the IGS_PS_COURSE attempt.
1115         IF (p_candidature_identified_ind = 'Y') THEN
1116                 v_attendance_percentage := p_attendance_percentage;
1117                 v_ca_sequence_number := p_ca_sequence_number;
1118         ELSE
1119                 OPEN c_ca;
1120                 FETCH c_ca INTO v_ca_sequence_number,
1121                                 v_ca_attendance_percentage;
1122                 IF (c_ca%NOTFOUND) THEN
1123                         -- Not a research student in the IGS_PS_COURSE - return zero
1124                         CLOSE c_ca;
1125                         RETURN 0;
1126                 END IF;
1127                 CLOSE c_ca;
1128                 v_attendance_percentage := v_ca_attendance_percentage;
1129         END IF;
1130         -- 2. Select details from student IGS_PS_COURSE attempt record
1131         --    to be used further in routine.
1132         OPEN c_sca;
1133         FETCH c_sca INTO        v_course_attempt_status,
1134                                 v_commencement_dt,
1135                                 v_attendance_type,
1136                                 v_version_number;
1137         CLOSE c_sca;
1138         IF (v_course_attempt_status = cst_unconfirm) THEN
1139                 -- Unconfirmed IGS_PS_COURSE attempts can't have used any days
1140                 RETURN 0;
1141         END IF;
1142         v_today_dt := TRUNC(SYSDATE);
1143         -- 3. Loop though IGS_RE_CANDIDATURE history totalling effective attendance periods
1144         v_EFTD_total := 0;
1145 
1146         FOR v_cah_rec IN c_cah( v_ca_sequence_number) LOOP
1147                 v_start_dt := v_cah_rec.hist_start_dt;
1148                 -- If the history starts after the commencement date then assume
1149                 -- the first record applies from the commencement date onwards.
1150                 IF (c_cah%ROWCOUNT = 1) THEN
1151                         IF (v_cah_rec.hist_start_dt > v_commencement_dt) THEN
1152                                 v_start_dt := v_commencement_dt;
1153                         END IF;
1154                 ELSE
1155                         IF ((v_cah_rec.hist_start_dt - v_last_hist_end_dt) > 1) THEN
1156 
1157                                 v_EFTD_total := v_EFTD_total +
1158                                                 ((v_cah_rec.hist_start_dt - v_last_hist_end_dt - 1) *
1159                                                 (v_last_attendance_percentage / 100));
1160                         END IF;
1161                 END IF;
1162                 -- Add the EFTD figure for the effective period of time
1163                 v_EFTD_total := v_EFTD_total +
1164                                 ((v_cah_rec.hist_end_dt - v_start_dt + 1 ) *
1165                                 (v_cah_rec.attendance_percentage / 100));
1166                 v_last_hist_end_dt := v_cah_rec.hist_end_dt;
1167                 v_last_attendance_percentage := v_cah_rec.attendance_percentage;
1168         END LOOP;
1169         OPEN c_cah(
1170                 v_ca_sequence_number
1171                 );
1172         FETCH c_cah INTO        v_cah_hist_start_dt,
1173                                 v_cah_hist_end_dt,
1174                                 v_cah_attendance_percentage;
1175         IF (c_cah%NOTFOUND) THEN
1176                 v_last_end_dt := v_commencement_dt - 1 ;   -- Allow for inclusive commence dt
1177         ELSE
1178                 v_last_end_dt := v_last_hist_end_dt;
1179         END IF;
1180         CLOSE c_cah;
1181         IF (v_last_end_dt < v_today_dt - 1) THEN
1182                 -- If the current (IGS_RE_CANDIDATURE) attendance percentage is set then use it,
1183                 -- otherwise load the default from the attendance type
1184                 IF (v_attendance_percentage IS NULL) THEN
1185                         OPEN c_att(v_attendance_type);
1186                         FETCH c_att INTO v_research_percentage;
1187                         CLOSE c_att;
1188                         v_attendance_percentage := v_research_percentage;
1189                 END IF;
1190                 v_EFTD_total := v_EFTD_total +
1191                                 ((v_today_dt - v_last_end_dt - 1) *
1192                                 (v_attendance_percentage / 100));
1193         END IF;
1194         -- Retain last end date for intermission processing
1195         v_cah_last_end_dt := v_last_end_dt;
1196         -- 4. If intermission is not counted in time, Subtract any
1197         --    applicable periods of intermission from the total.
1198         OPEN c_crv(v_version_number);
1199         FETCH c_crv INTO v_count_intrmsn_in_time_ind;
1200         CLOSE c_crv;
1201         IF (v_count_intrmsn_in_time_ind = 'N') THEN
1202                 FOR v_sci_rec IN c_sci LOOP
1203                         v_next_rec_flg := FALSE;
1204                         -- If period of intermission doesn't overlap then exclude.
1205                         --i.e if intermission is in future then exclude
1206                         IF v_sci_rec.start_dt >= v_today_dt THEN
1207                                 -- Set flag to loop to next record
1208                                 v_next_rec_flg := TRUE;
1209                         END IF;
1210                         IF (v_next_rec_flg = FALSE) THEN
1211 
1212 
1213                                 -- added the end day to  include intermission end date.
1214 				v_sci_end_dt := (v_sci_rec.end_dt );
1215                                 -- Loop though periods of attendance history
1216                                 -- and remove appropriate EFTD figures.
1217                                 v_last_hist_end_dt := NULL;
1218 
1219                                 --EFTD calculation has been changed as part of the bug 3453123
1220                                 --All history records are to be taken into account even if they are
1221                                 --prior to the commencement date of the student.
1222 
1223                                 FOR v_cah2_rec IN c_cah2(
1224                                                         v_ca_sequence_number,
1225                                                         v_sci_end_dt,
1226                                                          v_sci_rec.start_dt) LOOP
1227                                         -- If first history doesn't go back as far as the intermission start
1228                                         -- then assume it applies during that period (as no other history exists)
1229                                         v_start_dt := v_cah2_rec.hist_start_dt;
1230                                         IF (c_cah2%ROWCOUNT = 1) THEN
1231                                                 IF (v_cah2_rec.hist_start_dt <v_sci_rec.start_dt) THEN
1232                                                         v_start_dt :=  v_sci_rec.start_dt;
1233                                                 END IF;
1234                                         ELSE
1235                                                 IF ((v_cah2_rec.hist_start_dt - v_last_hist_end_dt) > 1) THEN
1236                                                         -- Use the same details as the previous
1237                                                         -- history to fill any gap in history
1238                                                         v_EFTD_total := v_EFTD_total +
1239                                                                         ((v_cah2_rec.hist_start_dt -
1240                                                                         v_last_hist_end_dt - 1) *
1241                                                                         (v_last_attendance_percentage / 100));
1242                                                 END IF;
1243                                         END IF;
1244                                         v_end_dt := LEAST(
1245                                                         v_sci_end_dt,
1246                                                         v_cah2_rec.hist_end_dt);
1247                                         -- Remove EFTD figure from total
1248                                         v_EFTD_total := v_EFTD_total -
1249                                                         ((v_end_dt - v_start_dt + 1) *
1250                                                         (v_cah2_rec.attendance_percentage / 100));
1251 
1252                                         v_last_hist_end_dt := v_cah2_rec.hist_end_dt;
1253                                         v_last_attendance_percentage := v_cah2_rec.attendance_percentage;
1254                                 END LOOP;
1255                                 -- Determine intermission current attendance
1256                                 IF v_sci_end_dt > v_cah_last_end_dt THEN
1257                                         IF v_last_hist_end_dt IS NULL THEN
1258                                                 v_last_end_dt :=  v_sci_rec.start_dt - 1;
1259                                         ELSE
1260                                                 v_last_end_dt := v_last_hist_end_dt;
1261                                         END IF;
1262                                         -- If the current (IGS_RE_CANDIDATURE) attendance percentage is set then
1263                                         -- use it, otherwise load the default from the attendance type
1264                                         IF (v_attendance_percentage IS NULL) THEN
1265                                                 OPEN c_att(v_attendance_type);
1266                                                 FETCH c_att INTO v_research_percentage;
1267                                                 CLOSE c_att;
1268                                                 v_attendance_percentage := v_research_percentage;
1269                                         END IF;
1270                                         v_sci_end_dt := LEAST(
1271                                                         v_today_dt - 1,
1272                                                         v_sci_end_dt);
1273                                         -- Subtract the last portion between the last history and the current date
1274                                         v_EFTD_total := v_EFTD_total -
1275                                                 ((v_sci_end_dt - v_last_end_dt) *
1276                                                 (v_attendance_percentage / 100));
1277 
1278                                 END IF;
1279                         END IF;
1280                 END LOOP;
1281         END IF;
1282         RETURN v_EFTD_total;
1283 EXCEPTION
1284         WHEN OTHERS THEN
1285                 IF (c_ca%ISOPEN) THEN
1286                         CLOSE c_ca;
1287                 END IF;
1288                 IF (c_sca%ISOPEN) THEN
1289                         CLOSE c_sca;
1290                 END IF;
1291                 IF (c_cah%ISOPEN) THEN
1292                         CLOSE c_cah;
1293                 END IF;
1294                 IF (c_att%ISOPEN) THEN
1295                         CLOSE c_att;
1296                 END IF;
1297                 IF (c_crv%ISOPEN) THEN
1298                         CLOSE c_crv;
1299                 END IF;
1300                 IF (c_sci%ISOPEN) THEN
1301                         CLOSE c_sci;
1302                 END IF;
1303                 IF (c_cah2%ISOPEN) THEN
1304                         CLOSE c_cah2;
1305                 END IF;
1306                 RAISE;
1307 END;
1308 END resp_clc_used_eftd;
1309 
1310 
1311 FUNCTION RESP_GET_CA_ATT(
1312   p_person_id IN NUMBER ,
1313   p_course_cd IN VARCHAR2 ,
1314   p_effective_dt IN DATE ,
1315   p_ca_sequence_number IN NUMBER ,
1316   p_attendance_type IN VARCHAR2 ,
1317   p_attendance_percentage IN NUMBER )
1318 RETURN NUMBER AS
1319         gv_other_detail         VARCHAR2(255);
1320 BEGIN   -- resp_get_ca_att
1321         -- Get the attendance percentage of a IGS_RE_CANDIDATURE as at a given date.
1322         -- This is determined by looking through attendance history for the persons
1323         -- IGS_RE_CANDIDATURE.
1324         -- IGS_GE_NOTE: A returned value of NULL indicates that the value could not be
1325         -- determined.
1326 DECLARE
1327         v_ca_sequence_number            IGS_RE_CANDIDATURE.sequence_number%TYPE;
1328         v_attendance_percentage         IGS_RE_CANDIDATURE.attendance_percentage%TYPE;
1329         v_attendance_type               IGS_EN_STDNT_PS_ATT.attendance_type%TYPE;
1330         CURSOR c_ca_sca IS
1331                 SELECT  ca.sequence_number,
1332                         ca.attendance_percentage,
1333                         sca.attendance_type
1334                 FROM    IGS_RE_CANDIDATURE              ca,
1335                         IGS_EN_STDNT_PS_ATT     sca
1336                 WHERE   ca.person_id            = p_person_id AND
1337                         ca.sca_course_cd        = p_course_cd AND
1338                         sca.course_cd           = ca.sca_course_cd AND
1339                         sca.person_id           = ca.person_id;
1340         CURSOR c_cah (
1341                         cp_person_id            IGS_RE_CANDIDATURE.person_id%TYPE,
1342                         cp_ca_sequence_number   IGS_RE_CANDIDATURE.sequence_number%TYPE,
1343                         cp_effective_dt         DATE) IS
1344                 SELECT  cah.attendance_type,
1345                         cah.attendance_percentage
1346                 FROM    IGS_RE_CDT_ATT_HIST     cah
1347                 WHERE   cah.person_id           = cp_person_id AND
1348                         cah.ca_sequence_number  = cp_ca_sequence_number AND
1349                         cah.hist_end_dt         >= cp_effective_dt
1350                 ORDER BY cah.hist_start_dt ASC;
1351         v_cah_rec               c_cah%ROWTYPE;
1352         CURSOR c_att (
1353                         cp_attendance_type      IGS_EN_STDNT_PS_ATT.attendance_type%TYPE) IS
1354                 SELECT  att.research_percentage
1355                 FROM    IGS_EN_ATD_TYPE         att
1356                 WHERE   att.attendance_type     = cp_attendance_type;
1357 BEGIN
1358         -- If IGS_RE_CANDIDATURE details have not been passed then load the record
1359         IF p_ca_sequence_number IS NULL OR
1360                         p_attendance_type IS NULL THEN
1361                 OPEN c_ca_sca;
1362                 FETCH c_ca_sca INTO     v_ca_sequence_number,
1363                                         v_attendance_percentage,
1364                                         v_attendance_type;
1365                 IF c_ca_sca%NOTFOUND THEN
1366                         CLOSE c_ca_sca;
1367                         RETURN NULL;
1368                 END IF;
1369                 CLOSE c_ca_sca;
1370         ELSE
1371                 v_ca_sequence_number := p_ca_sequence_number;
1372                 v_attendance_percentage := p_attendance_percentage;
1373                 v_attendance_type := p_attendance_type;
1374         END IF;
1375         OPEN c_cah(
1376                 p_person_id,
1377                 v_ca_sequence_number,
1378                 p_effective_dt);
1379         FETCH c_cah INTO v_cah_rec;
1380         IF c_cah%FOUND THEN
1381                 CLOSE c_cah;
1382                 v_attendance_type := v_cah_rec.attendance_type;
1383                 v_attendance_percentage := v_cah_rec.attendance_percentage;
1384         ELSE
1385                 CLOSE c_cah;
1386         END IF;
1387         IF v_attendance_percentage IS NULL THEN
1388                 -- If no percentage then get the default for the attendance type.
1389                 OPEN c_att(v_attendance_type);
1390                 FETCH c_att INTO v_attendance_percentage;
1391                 CLOSE c_att;
1392         END IF;
1393         RETURN v_attendance_percentage;
1394 EXCEPTION
1395         WHEN OTHERS THEN
1396                 IF c_ca_sca%ISOPEN THEN
1397                         CLOSE c_ca_sca;
1398                 END IF;
1399                 IF c_cah%ISOPEN THEN
1400                         CLOSE c_cah;
1401                 END IF;
1402                 IF c_att%ISOPEN THEN
1403                         CLOSE c_att;
1404                 END IF;
1405                 RAISE;
1406 END;
1407 END resp_get_ca_att;
1408 
1409 
1410 FUNCTION resp_get_ca_comm(
1411   p_person_id IN NUMBER ,
1412   p_sca_course_cd IN VARCHAR2 ,
1413   p_acai_admission_appl_number IN NUMBER ,
1414   p_acai_nominated_course_cd IN VARCHAR2 ,
1415   p_acai_sequence_number IN NUMBER )
1416 RETURN DATE AS
1417         gv_other_detail         VARCHAR2(255);
1418 BEGIN   -- resp_get_ca_comm
1419         -- Set to IGS_EN_STDNT_PS_ATT.commencement_dt if it exists.
1420         -- Set to derived commencement date if IGS_EN_STDNT_PS_ATT.commencement_dt
1421         -- doesn't exist.
1422 DECLARE
1423         CURSOR  c_sca IS
1424                 SELECT  sca.commencement_dt
1425                 FROM    IGS_EN_STDNT_PS_ATT sca
1426                 WHERE   sca.person_id = p_person_id AND
1427                         sca.course_cd = p_sca_course_cd;
1428         v_sca_rec       c_sca%ROWTYPE;
1429 BEGIN
1430         IF p_sca_course_cd IS NOT NULL THEN
1431                 OPEN c_sca;
1432                 FETCH c_sca INTO v_sca_rec;
1433                 IF (c_sca%NOTFOUND) THEN
1434                         CLOSE c_sca;
1435                         RETURN SYSDATE;
1436                 END IF;
1437                 CLOSE c_sca;
1438                 IF v_sca_rec.commencement_dt IS NOT NULL THEN
1439                         RETURN v_sca_rec.commencement_dt;
1440                 END IF;
1441         END IF;
1442         RETURN IGS_EN_GEN_002.enrp_get_acad_comm(
1443                                 NULL,
1444                                 NULL,
1445                                 p_person_id,
1446                                 p_sca_course_cd,
1447                                 p_acai_admission_appl_number,
1448                                 p_acai_nominated_course_cd,
1449                                 p_acai_sequence_number,
1450                                 'Y');
1451 END;
1452 END resp_get_ca_comm;
1453 
1454 END IGS_RE_GEN_001 ;