DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGS_PR_GEN_001

Source


1 PACKAGE BODY IGS_PR_GEN_001 AS
2 /* $Header: IGSPR01B.pls 115.7 2003/05/30 07:19:17 kdande ship $ */
3 FUNCTION PRGP_GET_CAL_STREAM(
4   P_COURSE_CD IN VARCHAR2 ,
5   P_VERSION_NUMBER IN NUMBER ,
6   P_PRG_CAL_TYPE IN VARCHAR2 ,
7   p_comparison_prg_cal_type IN VARCHAR2 )
8 RETURN VARCHAR2 AS
9   gv_other_detail   VARCHAR2(255);
10 BEGIN   -- prgp_get_cal_stream
11   -- Get whether a progression calendar instance is within the same stream as
12   -- another. This refers to the stream concepts held within the progression
13   -- configuration structure.
14 DECLARE
15   v_stream_num          IGS_PR_S_CRV_PRG_CAL.stream_num%TYPE;
16   v_dummy           VARCHAR2(1);
17   CURSOR c_scpc1 IS
18     SELECT  scpc.stream_num
19     FROM  IGS_PR_S_CRV_PRG_CAL      scpc
20     WHERE scpc.course_cd      = p_course_cd AND
21       scpc.version_number     = p_version_number AND
22       scpc.prg_cal_type     = p_prg_cal_type;
23   CURSOR c_scpc2 (
24     cp_stream_num       IGS_PR_S_CRV_PRG_CAL.stream_num%TYPE) IS
25     SELECT  'X'
26     FROM  IGS_PR_S_CRV_PRG_CAL      scpc
27     WHERE scpc.course_cd      = p_course_cd AND
28       scpc.version_number     = p_version_number AND
29       scpc.prg_cal_type     = p_comparison_prg_cal_type AND
30       scpc.stream_num     = cp_stream_num;
31   CURSOR c_sopc1 IS
32     SELECT  sopc.org_unit_cd,
33       sopc.ou_start_dt,
34       sopc.stream_num
35     FROM  IGS_PR_S_OU_PRG_CAL       sopc
36     WHERE prgp_get_crv_cmt(
37         p_course_cd,
38         p_version_number,
39         sopc.org_unit_cd,
40         sopc.ou_start_dt)   = 'Y' AND
41       sopc.prg_cal_type     = p_prg_cal_type;
42   v_sopc_rec          c_sopc1%ROWTYPE;
43   CURSOR c_sopc2 (
44     cp_org_unit_cd        IGS_PR_S_OU_PRG_CAL.org_unit_cd%TYPE,
45     cp_ou_start_dt        IGS_PR_S_OU_PRG_CAL.ou_start_dt%TYPE,
46     cp_stream_num       IGS_PR_S_OU_PRG_CAL.stream_num%TYPE) IS
47     SELECT  'X'
48     FROM  IGS_PR_S_OU_PRG_CAL       sopc
49     WHERE sopc.org_unit_cd    = cp_org_unit_cd AND
50       sopc.ou_start_dt    = cp_ou_start_dt AND
51       sopc.prg_cal_type     = p_comparison_prg_cal_type AND
52       sopc.stream_num     = cp_stream_num;
53   CURSOR c_spc1 IS
54     SELECT  spc.stream_num
55     FROM  IGS_PR_S_PRG_CAL      spc
56     WHERE spc.s_control_num     = 1 AND
57       spc.prg_cal_type    = p_prg_cal_type;
58   CURSOR c_spc2 (
59     cp_stream_num       IGS_PR_S_PRG_CAL.stream_num%TYPE) IS
60     SELECT  'X'
61     FROM  IGS_PR_S_PRG_CAL      spc
62     WHERE spc.s_control_num     = 1 AND
63       spc.prg_cal_type    = p_comparison_prg_cal_type AND
64       spc.stream_num      = cp_stream_num;
65 BEGIN
66   -- Select from within IGS_PS_COURSE override structure
67   OPEN c_scpc1;
68   FETCH c_scpc1 INTO v_stream_num;
69   IF c_scpc1%FOUND THEN
70     CLOSE c_scpc1;
71     OPEN c_scpc2 (
72         v_stream_num);
73     FETCH c_scpc2 INTO v_dummy;
74     IF c_scpc2%FOUND THEN
75       CLOSE c_scpc2;
76       RETURN 'Y';
77     ELSE
78       CLOSE c_scpc2;
79       RETURN 'N';
80     END IF;
81   END IF;
82   CLOSE c_scpc1;
83   -- Select from within organisation IGS_PS_UNIT structure
84   OPEN c_sopc1;
85   FETCH c_sopc1 INTO v_sopc_rec;
86   IF c_sopc1%FOUND THEN
87     CLOSE c_sopc1;
88     OPEN c_sopc2 (
89         v_sopc_rec.org_unit_cd,
90         v_sopc_rec.ou_start_dt,
91         v_sopc_rec.stream_num);
92     FETCH c_sopc2 INTO v_dummy;
93     IF c_sopc2%FOUND THEN
94       CLOSE c_sopc2;
95       RETURN 'Y';
96     ELSE
97       CLOSE c_sopc2;
98       RETURN 'N';
99     END IF;
100   END IF;
101   CLOSE c_sopc1;
102   -- Select from within system default structure
103   OPEN c_spc1;
104   FETCH c_spc1 INTO v_stream_num;
105   IF c_spc1%FOUND THEN
106     CLOSE c_spc1;
107     OPEN c_spc2 (
108         v_stream_num);
109     FETCH c_spc2 INTO v_dummy;
110     IF c_spc2%FOUND THEN
111       CLOSE c_spc2;
112       RETURN 'Y';
113     ELSE
114       CLOSE c_spc2;
115       RETURN 'N';
116     END IF;
117   END IF;
118   CLOSE c_spc1;
119   RETURN 'N';
120 EXCEPTION
121   WHEN OTHERS THEN
122     IF c_scpc1%ISOPEN THEN
123       CLOSE c_scpc1;
124     END IF;
125     IF c_scpc2%ISOPEN THEN
126       CLOSE c_scpc2;
127     END IF;
128     IF c_sopc1%ISOPEN THEN
129       CLOSE c_sopc1;
130     END IF;
131     IF c_sopc2%ISOPEN THEN
132       CLOSE c_sopc2;
133     END IF;
134     IF c_spc1%ISOPEN THEN
135       CLOSE c_spc1;
136     END IF;
137     IF c_spc2%ISOPEN THEN
138       CLOSE c_spc2;
139     END IF;
140     RAISE;
141 END;
142 EXCEPTION
143   WHEN OTHERS THEN
144     Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXCEPTION');
145                 FND_MESSAGE.SET_TOKEN ('NAME', 'IGS_PR_GEN_001.PRGP_GET_CAL_STREAM');
146                 --IGS_GE_MSG_STACK.ADD;
147 
148 END prgp_get_cal_stream;
149 
150 FUNCTION PRGP_GET_CRV_CMT(
151   p_course_cd IN VARCHAR2 ,
152   p_version_number IN NUMBER ,
153   p_org_unit_cd IN VARCHAR2 ,
154   p_ou_start_dt IN DATE )
155 RETURN VARCHAR2 AS
156   gv_other_detail   VARCHAR2(255);
157 BEGIN   -- prgp_get_crv_cmt
158   -- Get whether IGS_PS_COURSE version is covered by the nominated committee structure
159 DECLARE
160   v_ou_rel_found    BOOLEAN DEFAULT FALSE;
161   v_dummy     VARCHAR2(1);
162   CURSOR c_crv_cow IS
163     SELECT  crv.course_type,
164       cow.org_unit_cd,
165       cow.ou_start_dt
166     FROM  IGS_PS_VER    crv,
167       IGS_PS_OWN  cow
168     WHERE crv.course_cd   = p_course_cd AND
169       crv.version_number  = p_version_number AND
170       crv.course_cd   = cow.course_cd AND
171       crv.version_number  = cow.version_number;
172   CURSOR c_our (
173     cp_cow_org_unit_cd  IGS_OR_UNIT.org_unit_cd%TYPE,
174     cp_cow_ou_start_dt  IGS_OR_UNIT.start_dt%TYPE,
175     cp_course_type    IGS_PS_VER.course_type%TYPE) IS
176     SELECT  'X'
177     FROM  IGS_OR_UNIT_REL our
178     WHERE our.parent_org_unit_cd  = p_org_unit_cd AND
179       our.parent_start_dt = p_ou_start_dt AND
180       our.child_org_unit_cd = cp_cow_org_unit_cd AND
181       our.child_start_dt  = cp_cow_ou_start_dt AND
182       our.logical_delete_dt IS NULL AND
183       EXISTS  (
184       SELECT  'X'
185       FROM  IGS_OR_REL_PS_TYPE  ourct
186       WHERE our.parent_org_unit_cd  = ourct.parent_org_unit_cd AND
187         our.parent_start_dt = ourct.parent_start_dt AND
188         our.child_org_unit_cd = ourct.child_org_unit_cd AND
189         our.child_start_dt  = ourct.child_start_dt AND
190         our.create_dt   = ourct.our_create_dt AND
191         ourct.course_type = cp_course_type);
192 BEGIN
193   FOR v_crv_cow_rec IN c_crv_cow LOOP
194 
195 --gjha Added the following missing code. This will return true if the direct match is found.
196     IF v_crv_cow_rec.org_unit_cd = p_org_unit_cd  AND
197         v_crv_cow_rec.ou_start_dt = p_ou_start_dt THEN
198       RETURN 'Y';
199     END IF;
200 
201                 OPEN c_our (
202       v_crv_cow_rec.org_unit_cd,
203       v_crv_cow_rec.ou_start_dt,
204       v_crv_cow_rec.course_type);
205     FETCH c_our INTO v_dummy;
206     IF c_our%FOUND THEN
207       CLOSE c_our;
208       v_ou_rel_found := TRUE;
209       EXIT;
210     ELSE
211       CLOSE c_our;
212       IF IGS_OR_GEN_001.orgp_get_within_ou (
213             p_org_unit_cd,
214             p_ou_start_dt,
215             v_crv_cow_rec.org_unit_cd,
216             v_crv_cow_rec.ou_start_dt,
217             'N') = 'Y' THEN
218         v_ou_rel_found := TRUE;
219         EXIT;
220       END IF;
221     END IF;
222   END LOOP;
223   IF v_ou_rel_found THEN
224     RETURN 'Y';
225   END IF;
226   RETURN 'N';
227 EXCEPTION
228   WHEN OTHERS THEN
229     IF c_crv_cow%ISOPEN THEN
230       CLOSE c_crv_cow;
231     END IF;
232     IF c_our%ISOPEN THEN
233       CLOSE c_our;
234     END IF;
235                 RETURN 'N';
236           /* RAISE replaced by return 'N' if any error occurs in the main code block
237                    Outer exception will not return N or Y if any error occurs in
238                    declaration section
239                 */
240 END;
241 EXCEPTION
242   WHEN OTHERS THEN
243     Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXCEPTION');
244                 FND_MESSAGE.SET_TOKEN ('NAME', 'IGS_PR_GEN_001.PRGP_GET_CRV_CMT');
245                 --IGS_GE_MSG_STACK.ADD;
246 
247 END prgp_get_crv_cmt;
248 
249 FUNCTION prgp_get_drtn_efctv(
250   p_prg_cal_type IN VARCHAR2 ,
251   p_prg_sequence_number IN NUMBER ,
252   p_person_id IN NUMBER ,
253   p_course_cd IN VARCHAR2 )
254 RETURN VARCHAR2 AS
255   gv_other_detail   VARCHAR2(255);
256 BEGIN   -- prgp_get_drtn_efctv
257   -- Get whether the student is effectively enrolled in a progression period
258   -- for the purposes of calculating a duration figure ; this is different
259   -- from 'effective for the purposes of IGS_GE_MEASUREMENT' as this only counts
260   -- progression periods within which the student ends enrolment.
261 DECLARE
262   cst_active  CONSTANT    VARCHAR2(10) := 'ACTIVE';
263   cst_teaching  CONSTANT    VARCHAR2(10) := 'TEACHING';
264   cst_progress  CONSTANT    VARCHAR2(10) := 'PROGRESS';
265   cst_enrolled  CONSTANT    VARCHAR2(10) := 'ENROLLED';
266   cst_completed CONSTANT    VARCHAR2(10) := 'COMPLETED';
267   cst_discontin CONSTANT    VARCHAR2(10) := 'DISCONTIN';
268   v_sua_enrolled        BOOLEAN DEFAULT FALSE;
269   v_cir2_rec_not_found      BOOLEAN DEFAULT FALSE;
270   v_match_not_found     BOOLEAN DEFAULT FALSE;
271   CURSOR c_cat_ci_cir_cs1 IS
272     SELECT  cir.sub_cal_type,
273       cir.sub_ci_sequence_number
274     FROM  IGS_CA_TYPE       cat,
275       IGS_CA_INST     ci,
276       IGS_CA_INST_REL     cir,
277       IGS_CA_STAT     cs
278     WHERE cir.sup_cal_type      = p_prg_cal_type AND
279       cir.sup_ci_sequence_number  = p_prg_sequence_number AND
280       ci.cal_type     = cir.sub_cal_type AND
281       ci.sequence_number    = cir.sub_ci_sequence_number AND
282       cs.cal_status     = ci.cal_status AND
283       cs.s_cal_status     = cst_active AND
284       cat.cal_type      = ci.cal_type AND
285       cat.s_cal_cat     = cst_teaching;
286   --
287   -- kdande; 22-Apr-2003; Bug# 2829262
288   -- Added uoo_id field to the SELECT clause of cursor c_sua_sca.
289   --
290   CURSOR c_sua_sca (
291     cp_sub_cal_type     IGS_CA_INST_REL.sub_cal_type%TYPE,
292     cp_sub_ci_sequence_number IGS_CA_INST_REL.sub_ci_sequence_number%TYPE) IS
293     SELECT  sua.unit_cd,
294       sua.cal_type,
295       sua.ci_sequence_number,
296       sua.unit_attempt_status,
297       sua.discontinued_dt,
298       sca.version_number,
299       sua.uoo_id
300     FROM  IGS_EN_SU_ATTEMPT     sua,
301       IGS_EN_STDNT_PS_ATT   sca
302     WHERE sua.person_id     = p_person_id AND
303       sua.course_cd     = p_course_cd AND
304       sca.person_id     = sua.person_id AND
305       sca.course_cd     = sua.course_cd AND
306       sua.cal_type      = cp_sub_cal_type AND
307       sua.ci_sequence_number    = cp_sub_ci_sequence_number AND
308       sua.unit_attempt_status IN (
309               cst_enrolled,
310               cst_completed,
311               cst_discontin);
312   CURSOR c_cat_ci_cir_cs2 (
313     cp_sua_cal_type     IGS_EN_SU_ATTEMPT.cal_type%TYPE,
314     cp_sua_ci_sequence_number IGS_EN_SU_ATTEMPT.ci_sequence_number%TYPE,
315     cp_sca_version_number   IGS_EN_STDNT_PS_ATT.version_number%TYPE) IS
316     SELECT  cir.sup_cal_type,
317       cir.sup_ci_sequence_number
318     FROM  IGS_CA_TYPE       cat,
319       IGS_CA_INST     ci1,
320       IGS_CA_INST_REL     cir,
321       IGS_CA_STAT     cs
322     WHERE cir.sub_cal_type      = cp_sua_cal_type AND
323       cir.sub_ci_sequence_number  = cp_sua_ci_sequence_number AND
324       ci1.cal_type      = cir.sup_cal_type AND
325       ci1.sequence_number   = cir.sup_ci_sequence_number AND
326       cs.cal_status     = ci1.cal_status AND
327       cs.s_cal_status     = cst_active AND
328       cat.cal_type      = ci1.cal_type AND
329       cat.s_cal_cat     = cst_progress AND
330       prgp_get_cal_stream (
331         p_course_cd,
332         cp_sca_version_number,
333         p_prg_cal_type,
334         cir.sup_cal_type)   = 'Y' AND
335       ci1.start_dt <
336       (SELECT ci2.start_dt
337       FROM  IGS_CA_INST   ci2
338       WHERE ci2.cal_type    = p_prg_cal_type AND
339         ci2.sequence_number = p_prg_sequence_number);
340 BEGIN
341   FOR v_cir1_rec IN c_cat_ci_cir_cs1 LOOP
342     FOR v_sua_rec IN c_sua_sca (
343           v_cir1_rec.sub_cal_type,
344           v_cir1_rec.sub_ci_sequence_number) LOOP
345       IF v_sua_rec.unit_attempt_status = cst_enrolled THEN
346         v_sua_enrolled := TRUE;
347         EXIT;
348       END IF;
349       -- Call routine to determine to which period it applies
350       v_cir2_rec_not_found := TRUE;
351       v_match_not_found := TRUE;
352       FOR v_cir2_rec IN c_cat_ci_cir_cs2 (
353               v_sua_rec.cal_type,
354               v_sua_rec.ci_sequence_number,
355               v_sua_rec.version_number) LOOP
356         v_cir2_rec_not_found := FALSE;
357         --
358         -- kdande; 22-Apr-2003; Bug# 2829262
359         -- Added uoo_id parameter to the IGS_PR_GEN_002.prgp_get_sua_prg_prd FUNCTION call.
360         --
361         IF IGS_PR_GEN_002.prgp_get_sua_prg_prd (
362               v_cir2_rec.sup_cal_type,
363               v_cir2_rec.sup_ci_sequence_number,
364               p_person_id,
365               p_course_cd,
366               v_sua_rec.unit_cd,
367               v_sua_rec.cal_type,
368               v_sua_rec.ci_sequence_number,
369               'Y',
370               v_sua_rec.unit_attempt_status,
371               v_sua_rec.discontinued_dt,
372               v_sua_rec.uoo_id) = 'Y' THEN
373           v_match_not_found := FALSE;
374           EXIT;
375         END IF;
376       END LOOP;
377       IF v_cir2_rec_not_found OR
378           v_match_not_found THEN
379         EXIT;
380       END IF;
381     END LOOP;
382     IF v_sua_enrolled THEN
383       EXIT;
384     END IF;
385     IF v_cir2_rec_not_found OR
386         v_match_not_found THEN
387       EXIT;
388     END IF;
389   END LOOP;
390   IF v_sua_enrolled THEN
391     RETURN 'Y';
392   END IF;
393   IF v_cir2_rec_not_found OR
394       v_match_not_found THEN
395     RETURN 'Y';
396   END IF;
397   RETURN 'N';
398 EXCEPTION
399   WHEN OTHERS THEN
400     IF c_cat_ci_cir_cs1%ISOPEN THEN
401       CLOSE c_cat_ci_cir_cs1;
402     END IF;
403       IF c_sua_sca%ISOPEN THEN
404       CLOSE c_sua_sca;
405     END IF;
406     IF c_cat_ci_cir_cs2%ISOPEN THEN
407       CLOSE c_cat_ci_cir_cs2;
408     END IF;
409     RETURN 'N';
410 END;
411 EXCEPTION
412   WHEN OTHERS THEN
413     Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXCEPTION');
414                 FND_MESSAGE.SET_TOKEN ('NAME', 'IGS_PR_GEN_001.PRGP_GET_DRTN_EFCTV');
415                 --IGS_GE_MSG_STACK.ADD;
416 
417 END prgp_get_drtn_efctv;
418 
419 
420 
421 FUNCTION prgp_get_msr_efctv(
422   p_prg_cal_type IN VARCHAR2 ,
423   p_prg_sequence_number IN NUMBER ,
424   p_person_id IN NUMBER ,
425   p_course_cd IN VARCHAR2 )
426 RETURN VARCHAR2 AS
430   -- for the purposes of progression IGS_GE_MEASUREMENT.
427   gv_other_detail   VARCHAR2(255);
428 BEGIN   -- prgp_get_msr_efctv
429   -- Get whether the student is effectively enrolled in a progression period
431   -- Routine returns 'Y', 'N' or 'P' - indicating that IGS_PS_UNIT is currently
432   -- enrolled and is potentially contributing to the period.
433 DECLARE
434   cst_active    CONSTANT  VARCHAR2(10) := 'ACTIVE';
435   cst_teaching    CONSTANT  VARCHAR2(10) := 'TEACHING';
436   cst_enrolled    CONSTANT  VARCHAR2(10) := 'ENROLLED';
437   cst_completed   CONSTANT  VARCHAR2(10) := 'COMPLETED';
438   cst_discontin   CONSTANT  VARCHAR2(10) := 'DISCONTIN';
439   v_potential       VARCHAR2(1) DEFAULT 'N';
440   v_effective_dt        DATE;
441   v_period_found        BOOLEAN DEFAULT FALSE;
442   CURSOR c_cat_ci_cir_cs IS
443     SELECT  cir.sub_cal_type,
444       cir.sub_ci_sequence_number
445     FROM  IGS_CA_TYPE       cat,
446       IGS_CA_INST     ci,
447       IGS_CA_INST_REL     cir,
448       IGS_CA_STAT     cs
449     WHERE cir.sup_cal_type      = p_prg_cal_type AND
450       cir.sup_ci_sequence_number  = p_prg_sequence_number AND
451       ci.cal_type     = cir.sub_cal_type AND
452       ci.sequence_number    = cir.sub_ci_sequence_number AND
453       ci.cal_status     = cs.cal_status AND
454       cs.s_cal_status     = cst_active AND
455       cat.cal_type      = ci.cal_type AND
456       cat.s_cal_cat     = cst_teaching;
457   --
458   -- kdande; 22-Apr-2003; Bug# 2829262
459   -- Added uoo_id field to the SELECT clause of the cursor c_sua_sca.
460   --
461   CURSOR c_sua_sca (
462     cp_sub_cal_type     IGS_CA_INST_REL.sub_cal_type%TYPE,
463     cp_sub_ci_sequence_number
464             IGS_CA_INST_REL.sub_ci_sequence_number%TYPE) IS
465     SELECT  sua.unit_cd,
466       sua.cal_type,
467       sua.ci_sequence_number,
468       sua.unit_attempt_status,
469       sua.discontinued_dt,
470       sua.uoo_id
471     FROM  IGS_EN_SU_ATTEMPT     sua
472     WHERE sua.person_id     = p_person_id AND
473       sua.course_cd     = p_course_cd AND
474       sua.cal_type      = cp_sub_cal_type AND
475       sua.ci_sequence_number    = cp_sub_ci_sequence_number AND
476       sua.unit_attempt_status IN (
477               cst_enrolled,
478               cst_completed,
479               cst_discontin);
480 BEGIN
481   FOR v_cir_rec IN c_cat_ci_cir_cs LOOP
482     FOR v_sua_rec IN c_sua_sca (
483           v_cir_rec.sub_cal_type,
484           v_cir_rec.sub_ci_sequence_number) LOOP
485       IF v_sua_rec.unit_attempt_status = cst_enrolled THEN
486         -- Determine if already beyond the period
487         v_effective_dt := prgp_get_prg_efctv(
488                 p_prg_cal_type,
489                 p_prg_sequence_number);
490         IF v_effective_dt IS NULL OR
491             v_effective_dt > SYSDATE THEN
492           v_potential := 'Y';
493         END IF;
494       ELSE
495         -- Call routine to determine which period it applies
496         v_period_found := FALSE;
497         --
498         -- kdande; 22-Apr-2003; Bug# 2829262
499         -- Added uoo_id parameter to the IGS_PR_GEN_002.prgp_get_sua_prg_prd FUNCTION call.
500         --
501         IF IGS_PR_GEN_002.prgp_get_sua_prg_prd (
502               p_prg_cal_type,
503               p_prg_sequence_number,
504               p_person_id,
505               p_course_cd,
506               v_sua_rec.unit_cd,
507               v_sua_rec.cal_type,
508               v_sua_rec.ci_sequence_number,
509               'Y',
510               v_sua_rec.unit_attempt_status,
511               v_sua_rec.discontinued_dt,
512               v_sua_rec.uoo_id) = 'Y' THEN
513           v_period_found := TRUE;
514           EXIT;
515         END IF;
516       END IF;
517     END LOOP;
518     IF v_period_found THEN
519       EXIT;
520     END IF;
521   END LOOP;
522   IF v_period_found THEN
523     RETURN 'Y';
524   END IF;
525   IF v_potential = 'Y' THEN
526     RETURN 'P';
527   ELSE
528     RETURN 'N';
529   END IF;
530 EXCEPTION
531   WHEN OTHERS THEN
532     IF c_cat_ci_cir_cs%ISOPEN THEN
533       CLOSE c_cat_ci_cir_cs;
534     END IF;
535     IF c_sua_sca%ISOPEN THEN
536       CLOSE c_sua_sca;
537     END IF;
538     RAISE;
539 END;
540 EXCEPTION
541   WHEN OTHERS THEN
542     Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXCEPTION');
543                 FND_MESSAGE.SET_TOKEN ('NAME', 'IGS_PR_GEN_001.PRGP_GET_MSR_EFCTV');
544                 --IGS_GE_MSG_STACK.ADD;
545 
546 END prgp_get_msr_efctv;
547 
548 FUNCTION prgp_get_prg_efctv(
549   p_prg_cal_type IN IGS_CA_INST_ALL.cal_type%TYPE ,
550   p_prg_sequence_number IN IGS_CA_INST_ALL.sequence_number%TYPE )
551 RETURN DATE AS
552 BEGIN   -- prgp_get_prg_efctv
553   -- Get the effective date of a nominated progression period.
554   -- This is retrieved from the IGS_CA_DA_INST table matching the value
555   -- stored in the progression configuration table. If no date alias is found,
556   -- then the end date of the progression period is returned
557 DECLARE
558   v_alias_val     IGS_CA_DA_INST.absolute_val%TYPE;
559   CURSOR c_dai IS
560     SELECT  IGS_CA_GEN_001.calp_get_alias_val(
561           dai.dt_alias,
562           dai.sequence_number,
563           dai.cal_type,
564           dai.ci_sequence_number)
565     FROM  IGS_CA_DA_INST  dai
566     WHERE dai.cal_type    = p_prg_cal_type AND
567       dai.ci_sequence_number  = p_prg_sequence_number AND
568       dt_alias    =
569       (SELECT sprgcc.effective_end_dt_alias
570       FROM  IGS_PR_S_PRG_CONF   sprgcc
571       WHERE sprgcc.s_control_num  = 1)
572     ORDER BY 1 DESC;  -- for latest if multiple dates exist
573   CURSOR c_ci IS
574     SELECT  ci.end_dt
575     FROM  IGS_CA_INST   ci
576     WHERE ci.cal_type   = p_prg_cal_type AND
577       ci.sequence_number  = p_prg_sequence_number;
578 BEGIN
579   -- Search for alias value within the calendar
580   OPEN c_dai;
581   FETCH c_dai INTO v_alias_val;
582   IF c_dai%NOTFOUND THEN
583     CLOSE c_dai;
584     -- Search for the calendar instance end_dt
585     OPEN c_ci;
586     FETCH c_ci INTO v_alias_val;
587     CLOSE c_ci;
588   ELSE
589     CLOSE c_dai;
590   END IF;
591   RETURN v_alias_val;
592 EXCEPTION
593   WHEN OTHERS THEN
594     IF c_dai%ISOPEN THEN
595       CLOSE c_dai;
596     END IF;
597     IF c_ci%ISOPEN THEN
598       CLOSE c_ci;
599     END IF;
600     RAISE;
601 END;
602 END prgp_get_prg_efctv;
603 
604 FUNCTION prgp_get_sca_elps_tm(
605   p_person_id IN NUMBER ,
606   p_course_cd IN VARCHAR2 ,
607   p_version_number IN NUMBER ,
608   p_commencement_dt IN DATE ,
609   p_effective_dt IN DATE DEFAULT SYSDATE)
610 RETURN NUMBER AS
611   gv_other_detail   VARCHAR2(255);
612 BEGIN
613 DECLARE
614   v_commencement_dt IGS_EN_STDNT_PS_ATT.commencement_dt%TYPE;
615   v_time_elapsed    NUMBER;
616   v_yrs_elapsed   NUMBER;
617   CURSOR c_sca IS
618     SELECT  sca.commencement_dt
619     FROM  IGS_EN_STDNT_PS_ATT sca
620     WHERE sca.person_id = p_person_id AND
621       sca.course_cd = p_course_cd;
622 BEGIN
623   --Routine to calculate the elapsed time taken by a student for a
624   -- student IGS_PS_COURSE attempt.  The routine will return the elapsed time
625   -- as a number (in years or fractions of years).
626   IF p_commencement_dt IS NULL THEN
627     OPEN c_sca;
628     FETCH c_sca INTO v_commencement_dt;
629     IF ((c_sca%NOTFOUND) OR v_commencement_dt IS NULL) THEN
630       CLOSE c_sca;
631       RETURN 0;
632     END IF;
633     CLOSE c_sca;
634   ELSE
635     v_commencement_dt := p_commencement_dt;
636   END IF;
637   v_time_elapsed := MONTHS_BETWEEN(p_effective_dt, v_commencement_dt);
638   v_yrs_elapsed := v_time_elapsed/12;
639   RETURN ROUND(v_yrs_elapsed, 2);
640 END;
641 EXCEPTION
642   WHEN OTHERS THEN
643     Fnd_Message.Set_Name('IGS','IGS_GE_UNHANDLED_EXCEPTION');
644                 FND_MESSAGE.SET_TOKEN ('NAME', 'IGS_PR_GEN_001.PRGP_GET_SCA_ELPS_TM');
645                 --IGS_GE_MSG_STACK.ADD;
646 
647 END prgp_get_sca_elps_tm;
648 
649 FUNCTION PRGP_GET_SCA_GPA(
650   p_person_id IN NUMBER ,
651   p_course_cd IN VARCHAR2 ,
652   p_unit_set_cd IN VARCHAR2 ,
653   p_course_stage_type IN VARCHAR2 ,
654   p_prg_cal_type IN VARCHAR2 ,
655   p_prg_sequence_number IN NUMBER ,
656   p_best_worst IN VARCHAR2 ,
657   p_use_recommended_ind IN VARCHAR2 ,
658   p_use_first_attempt_ind IN VARCHAR2 ,
659   p_use_entered_grade_ind IN VARCHAR2 )
660 RETURN NUMBER AS
661 BEGIN
662 DECLARE
663   v_gpa_value NUMBER;
664 BEGIN
665   v_gpa_value := TO_NUMBER( IGS_RU_GEN_004.rulp_val_gpa (
666       p_person_id,
667       p_course_cd,
668       p_prg_cal_type,
669       p_prg_sequence_number,
670       p_best_worst,
671       p_use_recommended_ind) );
672   RETURN v_gpa_value;
673 EXCEPTION
674   WHEN VALUE_ERROR THEN
675     RETURN 0;
676 END;
677 END prgp_get_sca_gpa;
678 END IGS_PR_GEN_001;