DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGS_AS_GEN_003

Source


1 PACKAGE BODY IGS_AS_GEN_003   AS
2 /* $Header: IGSAS03B.pls 120.1 2006/01/31 01:50:14 smaddali noship $ */
3 
4 /* Change History
5  who       when         what
6  smvk      09-Jul-2004  Bug # 3676145. Modified cursors c_usa to use Active (not closed) unit classes.
7  lkaki     20-Aug-2004  Bug # 3842511. Added additional parameter for including the grade and mark
8                                        for the students whose outcomes are released.
9   smaddali 20-dec-2005  Bug#4666657 : modified procedure assp_get_sua_outcome to loop thru chain transfers
10  */
11   --
12   FUNCTION assp_get_sua_exam_tp(
13     p_person_id IN NUMBER ,
14     p_course_cd IN VARCHAR2 ,
15     p_unit_cd IN VARCHAR2 ,
16     p_cal_type IN VARCHAR2 ,
17     p_ci_sequence_number IN NUMBER ,
18     p_unit_attempt_status IN VARCHAR2 ,
19     -- anilk, 22-Apr-2003, Bug# 2829262
20     p_uoo_id IN NUMBER )
21   RETURN VARCHAR2 IS
22     gv_other_detail   VARCHAR2(255);
23   BEGIN -- assp_get_sua_exam_tp
24     -- Get the examination type for a student unit attempt attempt assessment item.
25     -- This routine will ascertain if the student is sitting a NORMAL exam,
26     -- or whether they are doing a SUPPLEMENTARY or SPECIAL examination.
27     -- The supp/special attribute is ascertained from the students grade.
28     -- The grading schema grade table has a field indicating whether the grade
29     -- signifies the granting of a supp/special examination.
30           --ijeddy, Bug 3201661, Grade Book.
31   DECLARE
32     CURSOR c_gsg IS
33       SELECT  gsg.s_special_grade_type
34       FROM  IGS_AS_SU_STMPTOUT  suao,
35         IGS_AS_GRD_SCH_GRADE  gsg
36       WHERE suao.person_id    = p_person_id  AND
37         suao.course_cd    = p_course_cd  AND
38                           -- anilk, 22-Apr-2003, Bug# 2829262
39         suao.uoo_id             = p_uoo_id     AND
40         suao.finalised_outcome_ind = 'Y' AND
41         suao.grading_schema_cd  = gsg.grading_schema_cd AND
42         suao.version_number   = gsg.version_number AND
43         suao.grade    = gsg.grade AND
44         suao.outcome_dt IN (SELECT  MAX(outcome_dt)
45                  FROM IGS_AS_SU_STMPTOUT
46                  WHERE  person_id = suao.person_id AND
47                         course_cd = suao.course_cd AND
48                                                             -- anilk, 22-Apr-2003, Bug# 2829262
49                         uoo_id    = suao.uoo_id);
50 
51     cst_normal  CONSTANT VARCHAR2(15) := 'NORMAL';
52     cst_special CONSTANT VARCHAR2(15) := 'SPECIAL';
53     cst_supp    CONSTANT VARCHAR2(15) := 'SUPP';
54     v_s_special_grade_type    IGS_AS_GRD_SCH_GRADE.s_special_grade_type%TYPE;
55   BEGIN
56     -- If the IGS_PS_UNIT attempt status is not completed then it must be a normal
57     -- examination.
58     IF p_unit_attempt_status <> 'COMPLETED' THEN
59       RETURN cst_normal;
60     END IF;
61     -- Select the latest grade from the view
62     OPEN c_gsg;
63     FETCH c_gsg INTO v_s_special_grade_type;
64     IF c_gsg%NOTFOUND THEN
65       CLOSE c_gsg;
66       RETURN cst_normal;
67     END IF;
68     CLOSE c_gsg;
69     IF v_s_special_grade_type = 'SUPP-EXAM' THEN
70       RETURN cst_supp;
71     ELSIF v_s_special_grade_type = 'SPECIAL-EXAM' THEN
72       RETURN cst_special;
73     ELSE
74       RETURN cst_normal;
75     END IF;
76   END;
77   EXCEPTION
78     WHEN OTHERS THEN
79       RAISE;
80   END assp_get_sua_exam_tp;
81   FUNCTION assp_get_sua_exloc(
82     p_person_id IN NUMBER ,
83     p_course_cd IN VARCHAR2 ,
84     p_unit_cd IN VARCHAR2 ,
85     p_cal_type IN VARCHAR2 ,
86     p_ci_sequence_number IN NUMBER ,
87     p_ass_id IN NUMBER ,
88     -- anilk, 22-Apr-2003, Bug# 2829262
89     p_uoo_id IN NUMBER )
90   RETURN VARCHAR2 IS
91   BEGIN
92     -- assp_get_sua_exloc
93     -- Get the applicable examination IGS_AD_LOCATION for a nominated student
94     -- IGS_PS_UNIT attempt record.
95     -- The routine will search for (in order of preference):
96     -- 0. Non-central examination (see below)
97     -- 1. A IGS_EN_SU_ATTEMPT.exam_location_cd value
98     -- 2. A IGS_EN_STDNT_PS_ATT.exam_location_cd value
99     -- 3. The default exam IGS_AD_LOCATION for the enrolled IGS_PS_UNIT attempt
100     -- If the assessment id is passed as a parameter, the routine will determine
101     -- whether the examination is a non-central examination, in which case all
102     -- students are grouped under a single examination IGS_AD_LOCATION. This IGS_AD_LOCATION
103     -- is defined in the IGS_AS_SASSESS_TYPE table.
104     DECLARE
105       v_nonc_exam_loc_cd  IGS_AS_SASSESS_TYPE.non_cntrl_exam_loc_cd%TYPE;
106       v_sua_location    IGS_AD_LOCATION.location_cd%TYPE;
107       v_sca_location    IGS_AD_LOCATION.location_cd%TYPE;
108       CURSOR c_sat IS
109         SELECT  sat.non_cntrl_exam_loc_cd
110         FROM  IGS_AS_ASSESSMNT_ITM    ai,
111           IGS_AS_ASSESSMNT_TYP    atyp,
112           IGS_AS_SASSESS_TYPE sat
113         WHERE ai.ass_id   = p_ass_id    AND
114           atyp.assessment_type  = ai.assessment_type  AND
115           atyp.s_assessment_type  = 'NONCENTRAL'    AND
116           sat.s_assessment_type= atyp.s_assessment_type;
117       CURSOR c_sua IS
118         SELECT  sua.location_cd,
119           sua.exam_location_cd,
120           um.s_unit_mode
121         FROM  IGS_EN_SU_ATTEMPT sua,
122           IGS_AS_UNIT_CLASS ucl,
123           IGS_AS_UNIT_MODE um
124         WHERE sua.person_id = p_person_id   AND
125           sua.course_cd = p_course_cd   AND
126                             -- anilk, 22-Apr-2003, Bug# 2829262
127           sua.uoo_id      = p_uoo_id        AND
128           ucl.unit_class  = sua.unit_class  AND
129           um.unit_mode  = ucl.unit_mode   AND
130           ucl.closed_ind  = 'N';
131       v_sua_rec c_sua%ROWTYPE;
132       CURSOR c_sca IS
133         SELECT  exam_location_cd,
134           location_cd
135         FROM  IGS_EN_STDNT_PS_ATT
136         WHERE person_id = p_person_id AND
137           course_cd = p_course_cd;
138       v_sca_rec c_sca%ROWTYPE;
139     BEGIN
140       -- 0. If assessment ID is set, then check for non-central examination IGS_AD_LOCATION.
141       IF (p_ass_id IS NOT NULL) THEN
142         OPEN c_sat;
143         FETCH c_sat INTO v_nonc_exam_loc_cd;
144         IF (c_sat%FOUND AND
145             v_nonc_exam_loc_cd IS NOT NULL) THEN
146           CLOSE c_sat;
147           RETURN v_nonc_exam_loc_cd;
148         END IF;
149         CLOSE c_sat;
150       END IF;
151       -- 1. If any of the parameters are null return null
152       IF (
153         p_person_id IS NULL OR
154         p_course_cd IS NULL OR
155         p_unit_cd IS NULL OR
156         p_cal_type  IS NULL OR
157         p_ci_sequence_number IS NULL OR
158         p_uoo_id        IS NULL ) THEN
159         RETURN NULL;
160       END IF;
161       -- 2. Get details from the student IGS_PS_UNIT attempt record
162       OPEN c_sua;
163       FETCH c_sua INTO v_sua_rec;
164       IF (c_sua%NOTFOUND) THEN
165         CLOSE c_sua;
166         RETURN NULL;
167       END IF;
168       CLOSE c_sua;
169       -- 3. If the sua exam IGS_AD_LOCATION is set then return it
170       IF (V_sua_rec.exam_location_cd IS NOT NULL) THEN
171         RETURN v_sua_rec.exam_location_cd;
172       END IF;
173       -- 3.1 If On-Campus IGS_PS_UNIT use the default IGS_AD_LOCATION.
174       IF (v_sua_rec.s_unit_mode = 'ON') THEN
175         v_sua_location :=  IGS_AS_GEN_002.ASSP_GET_DFLT_EXLOC(v_sua_rec.location_cd);
176         IF (v_sua_location IS NOT NULL) THEN
177           RETURN v_sua_location;
178         END IF;
179       END IF;
180       -- 4. Search for exam IGS_AD_LOCATION code in the student IGS_PS_COURSE attempt record
181       OPEN c_sca;
182       FETCH c_sca INTO v_sca_rec;
183       CLOSE c_sca;
184       IF (v_sca_rec.exam_location_cd IS NOT NULL) THEN
185         RETURN v_sca_rec.exam_location_cd;
186       END IF;
187       --  5. Search for the default exam IGS_AD_LOCATION for the enrolled IGS_PS_UNIT campus
188       v_sua_location :=  IGS_AS_GEN_002.ASSP_GET_DFLT_EXLOC(v_sua_rec.location_cd);
189       IF (v_sua_location IS NOT NULL) THEN
190         RETURN v_sua_location;
191       END IF;
192       -- 6. Search for the default exam IGS_AD_LOCATION for the enrolled IGS_PS_COURSE
193       v_sca_location := IGS_AS_GEN_002.ASSP_GET_DFLT_EXLOC(v_sca_rec.location_cd);
194       IF (v_sca_location IS NOT NULL) THEN
195         RETURN v_sca_location;
196       END IF;
197       RETURN NULL;
198     END;
199   END assp_get_sua_exloc;
200   FUNCTION assp_get_sua_grade(
201     p_person_id IN NUMBER ,
202     p_course_cd IN VARCHAR2 ,
203     p_unit_cd IN VARCHAR2 ,
204     p_cal_type IN VARCHAR2 ,
205     p_ci_sequence_number IN NUMBER ,
206     p_unit_attempt_status IN VARCHAR2 ,
207     p_finalised_ind IN VARCHAR2 ,
208     p_grading_schema_cd OUT NOCOPY VARCHAR2 ,
209     p_gs_version_number OUT NOCOPY NUMBER ,
210     p_grade OUT NOCOPY VARCHAR2 ,
211     -- anilk, 22-Apr-2003, Bug# 2829262
212     p_uoo_id IN  NUMBER )
213   RETURN VARCHAR2 IS
214       gv_other_detail   VARCHAR2(255);
215   BEGIN -- assp_get_sua_grade
216     -- This is an enrolments module.
217     -- It gets the grade of a student IGS_PS_UNIT attempt within a IGS_PS_COURSE code.
218     -- This routine will determine the appropriate grade (and its matching
219     -- result type) and return them. If no grade is found NULL will be
220     -- returned (and output parameters will be NULL).
221     -- IGS_GE_NOTE: This routine handles DUPLICATE IGS_PS_UNIT attempts by searching for
222     -- the 'source' IGS_PS_UNIT attempt and retrieving its grade.
223     -- Note2: If the p_finalised_ind is set then only finalised grades will
224     -- be returned.
225     DECLARE
226       cst_completed CONSTANT  VARCHAR2(10) := 'COMPLETED';
227       cst_discontin CONSTANT  VARCHAR2(10) := 'DISCONTIN';
228       cst_duplicate CONSTANT  VARCHAR2(10) := 'DUPLICATE';
229       cst_enrolled  CONSTANT  VARCHAR2(10) := 'ENROLLED';
230       v_course_cd     IGS_EN_SU_ATTEMPT.course_cd%TYPE;
231       v_finalised_ind     VARCHAR2(1);
232       v_sua_course_cd     IGS_EN_SU_ATTEMPT.course_cd%TYPE;
233       v_gsg_grading_schema_cd   IGS_AS_GRD_SCH_GRADE.grading_schema_cd%TYPE;
234       v_gsg_version_number    IGS_AS_GRD_SCH_GRADE.version_number%TYPE;
235       v_gsg_grade     IGS_AS_GRD_SCH_GRADE.grade%TYPE;
236       v_gsg_s_result_type   IGS_AS_GRD_SCH_GRADE.s_result_type%TYPE;
237       v_suao_trans_grading_schema_cd
238               IGS_AS_SU_STMPTOUT.translated_grading_schema_cd%TYPE;
239       v_suao_trans_version_number
240               IGS_AS_SU_STMPTOUT.translated_version_number%TYPE;
241       v_suao_trans_grade    IGS_AS_SU_STMPTOUT.translated_grade%TYPE;
242       v_gsg2_s_result_type    IGS_AS_GRD_SCH_GRADE.s_result_type%TYPE;
243       CURSOR c_sua (
244         cp_person_id    IGS_EN_SU_ATTEMPT.person_id%TYPE,
245         cp_unit_cd    IGS_EN_SU_ATTEMPT.unit_cd%TYPE,
246         cp_cal_type   IGS_EN_SU_ATTEMPT.cal_type%TYPE,
247         cp_ci_sequence_number IGS_EN_SU_ATTEMPT.ci_sequence_number%TYPE,
248                     -- anilk, 22-Apr-2003, Bug# 2829262
249         cp_uoo_id               IGS_EN_SU_ATTEMPT.uoo_id%TYPE
250         ) IS
251         SELECT  sut.transfer_course_cd
252         FROM  IGS_PS_STDNT_UNT_TRN  sut,
253           IGS_EN_SU_ATTEMPT sua
254         WHERE sut.person_id     = cp_person_id AND
255           sua.person_id     = sut.person_id AND
256                             -- anilk, 22-Apr-2003, Bug# 2829262
257           sut.uoo_id    = cp_uoo_id AND
258           sua.uoo_id    = sut.uoo_id AND
259           sua.course_cd = sut.transfer_course_cd AND
260           sua.unit_attempt_status IN (cst_completed, cst_discontin)
261           ORDER BY sua.unit_attempt_status;
262       CURSOR c_suao_gsg (
263         cp_person_id    IGS_EN_SU_ATTEMPT.person_id%TYPE,
264         c_v_course_cd   IGS_EN_SU_ATTEMPT.course_cd%TYPE,
265         cp_unit_cd    IGS_EN_SU_ATTEMPT.unit_cd%TYPE,
266         cp_cal_type   IGS_EN_SU_ATTEMPT.cal_type%TYPE,
267         cp_ci_sequence_number IGS_EN_SU_ATTEMPT.ci_sequence_number%TYPE,
268         c_v_finalised_ind VARCHAR2,
269                     -- anilk, 22-Apr-2003, Bug# 2829262
270         cp_uoo_id               IGS_EN_SU_ATTEMPT.uoo_id%TYPE
271         ) IS
272         SELECT    gsg.grading_schema_cd,
273             gsg.version_number,
274             gsg.grade,
275             gsg.s_result_type,
276             suao.translated_grading_schema_cd,
277             suao.translated_version_number,
278             suao.translated_grade
279         FROM    IGS_AS_SU_STMPTOUT  suao,
280             IGS_AS_GRD_SCH_GRADE  gsg
281         WHERE   suao.person_id      = cp_person_id AND
282             suao.course_cd      = c_v_course_cd AND
283                                     -- anilk, 22-Apr-2003, Bug# 2829262
284             suao.uoo_id                     = cp_uoo_id AND
285             suao.finalised_outcome_ind
286                     LIKE DECODE(c_v_finalised_ind, 'Y', 'Y', '%') AND
287             suao.grading_schema_cd    = gsg.grading_schema_cd AND
288             suao.version_number     = gsg.version_number AND
289             suao.grade      = gsg.grade
290         ORDER BY  outcome_dt DESC;    -- will put the newest date first.
291       CURSOR c_gsg2 IS
292         SELECT  gsg2.s_result_type
293         FROM  IGS_AS_GRD_SCH_GRADE gsg2
294         WHERE gsg2.grading_schema_cd  = v_suao_trans_grading_schema_cd AND
295           gsg2.version_number = v_suao_trans_version_number AND
296           gsg2.grade    = v_suao_trans_grade;
297     BEGIN
298       p_grading_schema_cd := NULL;
299       p_gs_version_number := NULL;
300       p_grade := NULL;
301       -- Depending on the status of the IGS_PS_UNIT attempt, set the grade search criteria.
302       IF (p_unit_attempt_status = cst_duplicate) THEN
303         -- Locate the original IGS_PS_UNIT attempt from which the grade was sourced.
304         -- This will use IGS_PS_STDNT_UNT_TRN details created as a result of
305         -- a IGS_PS_COURSE transfer
306         OPEN  c_sua(
307             p_person_id,
308             p_unit_cd,
309             p_cal_type,
310             p_ci_sequence_number,
311                                     -- anilk, 22-Apr-2003, Bug# 2829262
312             p_uoo_id );
313         FETCH c_sua INTO  v_sua_course_cd;
314         IF (c_sua%NOTFOUND) THEN
315           CLOSE c_sua;
316           RETURN NULL;
317         ELSE
318           v_course_cd := v_sua_course_cd;
319         END IF;
320         CLOSE c_sua;
321       ELSIF (p_unit_attempt_status = cst_completed OR
322           p_unit_attempt_status = cst_discontin OR
323           (p_finalised_ind = 'N' and p_unit_attempt_status = cst_enrolled)) THEN
324         -- Use the parameter IGS_PS_COURSE code
325         v_course_cd := p_course_cd;
326       ELSE
327         -- Only COMPLETED or DUPLICATED statuses have grades, so return NULL
328         RETURN NULL;
329       END IF;
330       -- Search for the latest grade against the student IGS_PS_UNIT attempt
331       OPEN  c_suao_gsg(
332           p_person_id,
333           v_course_cd,
334           p_unit_cd,
335           p_cal_type,
336           p_ci_sequence_number,
337           p_finalised_ind,
338                             -- anilk, 22-Apr-2003, Bug# 2829262
339                             p_uoo_id );
340       FETCH c_suao_gsg  INTO  v_gsg_grading_schema_cd,
341               v_gsg_version_number,
342               v_gsg_grade,
343               v_gsg_s_result_type,
344               v_suao_trans_grading_schema_cd,
345               v_suao_trans_version_number,
346               v_suao_trans_grade;
347       IF (c_suao_gsg%NOTFOUND) THEN
348         CLOSE c_suao_gsg;
349         RETURN NULL;
350       ELSE
351         -- Determine if the translated grade exists and is to be returned.
352         IF v_suao_trans_grading_schema_cd IS NULL OR
353             v_suao_trans_version_number IS NULL OR
354             v_suao_trans_grade IS NULL THEN
355           p_grading_schema_cd := v_gsg_grading_schema_cd;
356           p_gs_version_number := v_gsg_version_number;
357           p_grade := v_gsg_grade;
358           CLOSE c_suao_gsg;
359           RETURN  v_gsg_s_result_type;
360         ELSE
361           OPEN c_gsg2;
362           FETCH c_gsg2 INTO v_gsg2_s_result_type;
363           IF c_gsg2%NOTFOUND THEN
364             p_grading_schema_cd := NULL;
365             p_gs_version_number := NULL;
366             p_grade := NULL;
367             CLOSE c_suao_gsg;
368             CLOSE c_gsg2;
369             RETURN NULL;
370           ELSE
371             p_grading_schema_cd := v_suao_trans_grading_schema_cd;
372             p_gs_version_number := v_suao_trans_version_number;
373             p_grade := v_suao_trans_grade;
374             CLOSE c_suao_gsg;
375             CLOSE c_gsg2;
376             RETURN v_gsg2_s_result_type;
377           END IF;
378         END IF;
379       END IF;
380     EXCEPTION
381       WHEN OTHERS THEN
382         IF (c_sua%ISOPEN) THEN
383           CLOSE c_sua;
384         END IF;
385         IF (c_suao_gsg%ISOPEN) THEN
386           CLOSE c_suao_gsg;
387         END IF;
388         IF (c_gsg2%ISOPEN) THEN
389           CLOSE c_gsg2;
390         END IF;
391         RAISE;
392     END;
393   END assp_get_sua_grade;
394   FUNCTION assp_get_sua_gs(
395     p_person_id IN NUMBER ,
396     p_course_cd IN VARCHAR2 ,
397     p_unit_cd IN VARCHAR2 ,
398     p_version_number IN NUMBER ,
399     p_cal_type IN VARCHAR2 ,
400     p_ci_sequence_number IN NUMBER ,
401     p_location_cd IN VARCHAR2 ,
402     p_unit_class IN VARCHAR2 ,
403     p_grading_schema OUT NOCOPY VARCHAR2 ,
404     p_gs_version_number OUT NOCOPY NUMBER
405    ) RETURN boolean IS
406   gv_other_detail   VARCHAR2(255);
407     BEGIN -- assp_get_sua_gs
408   -- Get the applicable grading schema for a
409   -- nominated student IGS_PS_UNIT attempt
410     -- Bug 2064285. The fix returns the default grading schema set at Unit Section level if defined or
411     --  returns the default grading schema set at Unit level. -- Kalyan Dande
412     DECLARE
413       CURSOR c_usec_gs IS
414         SELECT   gs.grading_schema_code grading_schema_code,
415                  gs.grd_schm_version_number grd_schm_version_number
416         FROM     igs_ps_usec_grd_schm_v gs,
417                  igs_ps_unit_ofr_opt uoo
418         WHERE    uoo.unit_cd = p_unit_cd
419         AND      uoo.version_number = p_version_number
420         AND      uoo.cal_type = p_cal_type
421         AND      uoo.ci_sequence_number = p_ci_sequence_number
422         AND      uoo.location_cd = p_location_cd
423         AND      uoo.unit_class = p_unit_class
424         AND      uoo.uoo_id = gs.uoo_id
425         AND      gs.default_flag = 'Y';
426       CURSOR c_unit_gs IS
427         SELECT   gs.grading_schema_code grading_schema_code,
428                  gs.grd_schm_version_number grd_schm_version_number
429         FROM     igs_ps_unit_grd_schm_v gs
430         WHERE    gs.unit_code = p_unit_cd
431         AND      gs.unit_version_number = p_version_number
432         AND      gs.default_flag = 'Y';
433       v_grading_schema igs_as_grd_schema.grading_schema_cd%TYPE;
434       v_gs_version_number igs_as_grd_schema.version_number%TYPE;
435       v_ret BOOLEAN  DEFAULT FALSE;
436     BEGIN
437       --
438       -- This cursor used in this code was earlier referring to igs_ps_unit_ofr_opt
439       -- which is now changed to igs_ps_usec_grd_schm_v since the concept of having
440       -- multiple grading schemas was introduced by some enhancements.
441       --
442       -- This routine is built to select the grading schema from the link
443       -- to the igs_ps_usec_grd_schm_v table, however in future there will
444       -- also be links to igs_ps_ofr_pat and igs_en_stdnt_ps_att
445       --
446       OPEN c_usec_gs;
447       FETCH c_usec_gs INTO v_grading_schema, v_gs_version_number;
448       IF (c_usec_gs%FOUND) THEN
449         p_grading_schema := v_grading_schema;
450         p_gs_version_number := v_gs_version_number;
451         v_ret := TRUE;
452       ELSE
453         OPEN c_unit_gs;
454         FETCH c_unit_gs INTO v_grading_schema, v_gs_version_number;
455         IF (c_unit_gs%FOUND) THEN
456           p_grading_schema := v_grading_schema;
457           p_gs_version_number := v_gs_version_number;
458           v_ret := TRUE;
459         END IF;
460         CLOSE c_unit_gs;
461       END IF;
462       CLOSE c_usec_gs;
463       RETURN v_ret;
464     END;
465   EXCEPTION
466   WHEN OTHERS THEN
467        Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXP');
468        FND_MESSAGE.SET_TOKEN('NAME','IGS_AS_GEN_003.assp_get_sua_gs');
469      -- IGS_GE_MSG_STACK.ADD;
470        -- App_Exception.Raise_Exception;
471   END assp_get_sua_gs;
472 
473  FUNCTION assp_get_sua_outcome(
474   p_person_id IN NUMBER ,
475   p_course_cd IN VARCHAR2 ,
476   p_unit_cd IN VARCHAR2 ,
477   p_cal_type IN VARCHAR2 ,
478   p_ci_sequence_number IN NUMBER ,
479   p_unit_attempt_status IN VARCHAR2 ,
480   p_finalised_ind IN VARCHAR2 ,
481   p_outcome_dt OUT NOCOPY DATE ,
482   p_grading_schema_cd OUT NOCOPY VARCHAR2 ,
483   p_gs_version_number OUT NOCOPY NUMBER ,
484   p_grade OUT NOCOPY VARCHAR2 ,
485   p_mark OUT NOCOPY NUMBER ,
486   p_origin_course_cd OUT NOCOPY VARCHAR2 ,
487   -- anilk, 22-Apr-2003, Bug# 2829262
488   p_uoo_id IN NUMBER,
489   p_use_released_ind IN VARCHAR2)
490 RETURN VARCHAR2 IS
491     gv_other_detail   VARCHAR2(255);
492 BEGIN -- assp_get_sua_outcome
493   -- This is an enrolments module.
494   -- It gets the grade of a student IGS_PS_UNIT attempt within a IGS_PS_COURSE code.
495   -- This routine will determine the appropriate grade (and its matching
496   -- result type) and return them. If no grade is found NULL will be
497   -- returned (and output parameters will be NULL).
498   -- IGS_GE_NOTE: This routine handles DUPLICATE IGS_PS_UNIT attempts by searching for
499   -- the 'source' IGS_PS_UNIT attempt and retrieving its grade.
500   -- Note2: If the p_finalised_ind is set then only finalised grades will
501   -- be returned.
502 DECLARE
503   cst_completed CONSTANT  VARCHAR2(10) := 'COMPLETED';
504   cst_discontin CONSTANT  VARCHAR2(10) := 'DISCONTIN';
505   cst_duplicate CONSTANT  VARCHAR2(10) := 'DUPLICATE';
506   cst_enrolled  CONSTANT  VARCHAR2(10) := 'ENROLLED';
507   v_course_cd     IGS_EN_SU_ATTEMPT.course_cd%TYPE;
508   v_finalised_ind     VARCHAR2(1);
509   v_sua_course_cd     IGS_EN_SU_ATTEMPT.course_cd%TYPE;
510   v_outcome_dt      IGS_AS_SU_STMPTOUT.outcome_dt%TYPE;
511   v_gsg_grading_schema_cd   IGS_AS_GRD_SCH_GRADE.grading_schema_cd%TYPE;
512   v_gsg_version_number    IGS_AS_GRD_SCH_GRADE.version_number%TYPE;
513   v_gsg_grade     IGS_AS_GRD_SCH_GRADE.grade%TYPE;
514   v_gsg_s_result_type   IGS_AS_GRD_SCH_GRADE.s_result_type%TYPE;
515   v_mark        IGS_AS_SU_STMPTOUT.mark%TYPE;
516   v_suao_trans_grading_schema_cd
517           IGS_AS_SU_STMPTOUT.translated_grading_schema_cd%TYPE;
518   v_suao_trans_version_number
519           IGS_AS_SU_STMPTOUT.translated_version_number%TYPE;
520   v_suao_trans_grade    IGS_AS_SU_STMPTOUT.translated_grade%TYPE;
521   v_gsg2_s_result_type    IGS_AS_GRD_SCH_GRADE.s_result_type%TYPE;
522         v_released_date                 IGS_AS_SU_STMPTOUT.release_date%TYPE;
523    l_course_cd  igs_en_su_attempt_all.course_cd%TYPE;
524 
525    -- smaddali modified cursor for bug#4666657
526    CURSOR c_sua (cp_course_cd igs_en_su_attempt_all.course_Cd%TYPE ) IS
527     SELECT  sut.transfer_course_cd , sua.unit_attempt_status
528     FROM  IGS_PS_STDNT_UNT_TRN  sut,
529       IGS_EN_SU_ATTEMPT sua
530     WHERE sut.person_id     = p_person_id   AND
531       sua.person_id     = sut.person_id AND
532       -- anilk, 22-Apr-2003, Bug# 2829262
533       sut.uoo_id          = p_uoo_id      AND
534       sua.uoo_id              = sut.uoo_id    AND
535       sua.course_cd = sut.transfer_course_cd AND
536       sut.course_cd = cp_course_cd;
537      c_sua_rec c_sua%ROWTYPE;
538 
539   CURSOR c_suao_gsg (
540     cp_course_cd    IGS_EN_SU_ATTEMPT.course_cd%TYPE,
541     cp_finalised_ind  VARCHAR2) IS
542     SELECT    suao.outcome_dt,
543         suao.mark,
544         gsg.grading_schema_cd,
545         gsg.version_number,
546         gsg.grade,
547         gsg.s_result_type,
548         suao.translated_grading_schema_cd,
549         suao.translated_version_number,
550         suao.translated_grade,
551         suao.release_date
552     FROM    IGS_AS_SU_STMPTOUT  suao,
553         IGS_AS_GRD_SCH_GRADE    gsg
554     WHERE   suao.person_id      = p_person_id AND
555         suao.course_cd      = cp_course_cd AND
556                                 -- anilk, 22-Apr-2003, Bug# 2829262
557         suao.uoo_id                     = p_uoo_id AND
558         suao.finalised_outcome_ind  LIKE cp_finalised_ind AND
559         suao.grading_schema_cd    = gsg.grading_schema_cd AND
560         suao.version_number     = gsg.version_number AND
561         suao.grade      = gsg.grade
562     ORDER BY  suao.outcome_dt DESC;     -- will put the newest date first.
563   CURSOR c_gsg2 IS
564     SELECT  gsg2.s_result_type
565     FROM  IGS_AS_GRD_SCH_GRADE gsg2
566     WHERE gsg2.grading_schema_cd  = v_suao_trans_grading_schema_cd AND
567       gsg2.version_number = v_suao_trans_version_number AND
568       gsg2.grade    = v_suao_trans_grade;
569 BEGIN
570   p_outcome_dt := NULL;
571   p_grading_schema_cd := NULL;
572   p_gs_version_number := NULL;
573   p_grade := NULL;
574   p_mark := NULL;
575   p_origin_course_cd := NULL;
576   -- Depending on the status of the IGS_PS_UNIT attempt, set the grade search criteria.
577   IF (p_unit_attempt_status = cst_duplicate) THEN
578     -- Locate the original IGS_PS_UNIT attempt from which the grade was sourced.
579     -- This will use IGS_PS_STDNT_UNT_TRN details created as a result of
580     -- a IGS_PS_COURSE transfer
581     -- smaddali modified logic for bug#4666657, to loop thru chain transfers
582     l_course_cd := p_course_cd;
583     LOOP
584         OPEN c_sua ( l_course_cd) ;
585         FETCH c_sua INTO c_sua_rec ;
586         IF (c_sua%NOTFOUND) THEN
587           CLOSE c_sua;
588           RETURN NULL;
589         ELSE
590            IF c_sua_rec.unit_attempt_status IN (cst_completed,cst_discontin) THEN
591              v_course_cd := c_sua_rec.transfer_course_cd;
592              EXIT;
593            ELSE
594              l_course_cd := c_sua_rec.transfer_course_cd;
595            END IF;
596         END IF;
597         CLOSE c_sua;
598      END LOOP;
599 
600   ELSIF (p_unit_attempt_status = cst_completed OR
601       p_unit_attempt_status = cst_discontin OR
602       (p_finalised_ind = 'N' and p_unit_attempt_status = cst_enrolled)) THEN
603     -- Use the parameter IGS_PS_COURSE code
604     v_course_cd := p_course_cd;
605   ELSE
606     -- Only COMPLETED or DUPLICATED statuses have grades, so return NULL
607     RETURN NULL;
608   END If;
609   -- Search for the latest grade against the student IGS_PS_UNIT attempt
610   IF p_finalised_ind = 'Y' THEN
611     v_finalised_ind := 'Y';
612   ELSE
613     v_finalised_ind := '%';
614   END IF;
615   OPEN c_suao_gsg(
616       v_course_cd,
617       v_finalised_ind);
618   FETCH c_suao_gsg INTO v_outcome_dt,
619           v_mark,
620           v_gsg_grading_schema_cd,
621           v_gsg_version_number,
622           v_gsg_grade,
623           v_gsg_s_result_type,
624           v_suao_trans_grading_schema_cd,
625           v_suao_trans_version_number,
626           v_suao_trans_grade,
627           v_released_date;
628   IF (c_suao_gsg%FOUND) THEN
629     -- Determine if the translated grade exists and is to be returned.
630     IF v_suao_trans_grading_schema_cd IS NULL OR
631         v_suao_trans_version_number IS NULL OR
632         v_suao_trans_grade IS NULL THEN
633       p_outcome_dt := v_outcome_dt;
634       p_origin_course_cd := v_course_cd;
635       p_grading_schema_cd := v_gsg_grading_schema_cd;
636       p_gs_version_number := v_gsg_version_number;
637 -- IF condition added by LKAKI for bug #3842511
638                 IF ((p_use_released_ind IS NULL OR p_use_released_ind = 'N') OR
639                     (p_use_released_ind = 'Y' AND v_released_date <= SYSDATE)) THEN
640           p_grade := v_gsg_grade;
641       p_mark := v_mark;
642       END IF;
643 
644       CLOSE c_suao_gsg;
645       RETURN v_gsg_s_result_type;
646     ELSE
647       OPEN c_gsg2;
648       FETCH c_gsg2 INTO v_gsg2_s_result_type;
649       IF c_gsg2%NOTFOUND THEN
650         p_outcome_dt := NULL;
651         p_grading_schema_cd := NULL;
652         p_gs_version_number := NULL;
653         p_grade := NULL;
654         p_mark := NULL;
655         p_origin_course_cd := NULL;
656         CLOSE c_suao_gsg;
657         CLOSE c_gsg2;
658         RETURN NULL;
659       ELSE
660         p_outcome_dt := v_outcome_dt;
661         p_grading_schema_cd := v_suao_trans_grading_schema_cd;
662         p_gs_version_number := v_suao_trans_version_number;
663         p_origin_course_cd := v_course_cd;
664 --IF condition added by LKAKI for bug #3842511
665                            IF ((p_use_released_ind IS NULL OR p_use_released_ind = 'N') OR
666                                (p_use_released_ind = 'Y' AND v_released_date <= SYSDATE)) THEN
667         p_grade := v_suao_trans_grade;
668         p_mark := v_mark;
669         END IF;
670         CLOSE c_suao_gsg;
671         CLOSE c_gsg2;
672         RETURN v_gsg2_s_result_type;
673       END IF;
674     END IF;
675   END IF;
676   CLOSE c_suao_gsg;
677   RETURN NULL;
678 EXCEPTION
679   WHEN OTHERS THEN
680     IF (c_sua%ISOPEN) THEN
681       CLOSE c_sua;
682     END IF;
683     IF (c_suao_gsg%ISOPEN) THEN
684       CLOSE c_suao_gsg;
685     END IF;
686     IF (c_gsg2%ISOPEN) THEN
687       CLOSE c_gsg2;
688     END IF;
689     RAISE;
690 END;
691 END assp_get_sua_outcome;
692  FUNCTION assp_get_supp_cal(
693   p_exam_cal_type IN IGS_CA_INST_ALL.cal_type%TYPE ,
694   p_exam_ci_sequence_number IN IGS_CA_INST_ALL.sequence_number%TYPE ,
695   p_person_id IN IGS_EN_SU_ATTEMPT_ALL.person_id%TYPE ,
696   p_course_cd IN IGS_EN_SU_ATTEMPT_ALL.course_cd%TYPE ,
697   p_unit_cd IN IGS_EN_SU_ATTEMPT_ALL.unit_cd%TYPE ,
698   p_version_number IN IGS_EN_SU_ATTEMPT_ALL.version_number%TYPE ,
699   p_cal_type IN IGS_EN_SU_ATTEMPT_ALL.cal_type%TYPE ,
700   p_ci_sequence_number IN IGS_EN_SU_ATTEMPT_ALL.ci_sequence_number%TYPE ,
701   p_unit_attempt_status IN IGS_EN_SU_ATTEMPT_ALL.unit_attempt_status%TYPE ,
702   p_location_cd IN IGS_EN_SU_ATTEMPT_ALL.location_cd%TYPE ,
703   p_unit_mode IN IGS_AS_UNIT_CLASS_ALL.unit_mode%TYPE ,
704   p_unit_class IN IGS_EN_SU_ATTEMPT_ALL.unit_class%TYPE ,
705   p_ass_id IN IGS_AS_UNITASS_ITEM_ALL.ass_id%TYPE )
706 RETURN VARCHAR2 IS
707   gv_other_detail VARCHAR2(1000);
708   -- anilk, 22-Apr-2003, Bug# 2829262
709   CURSOR cur_uoo_id IS
710     SELECT   uoo_id
711     FROM     igs_ps_unit_ofr_opt
712     WHERE    unit_cd = p_unit_cd
713     AND      version_number = p_version_number
714     AND      cal_type = p_cal_type
715     AND      ci_sequence_number = p_ci_sequence_number
716     AND      location_cd = p_location_cd
717     AND      unit_class = p_unit_class;
718 
719         CURSOR c_ci IS
720   SELECT  uai.cal_type
721   FROM  IGS_AS_UNITASS_ITEM UAI,
722               IGS_AS_ASSESSMNT_ITM AI,
723               IGS_AS_ASSESSMNT_TYP ATP,
724               IGS_CA_INST CI,
725               IGS_CA_TYPE CAT,
726               IGS_CA_STAT CS
727   WHERE uai.unit_cd = p_unit_cd AND
728     uai.version_number = p_version_number AND
729     uai.cal_type  = p_cal_type AND
730     uai.ci_sequence_number = p_ci_sequence_number AND
731     uai.ass_id = p_ass_id AND
732     IGS_EN_GEN_014.ENRS_GET_WITHIN_CI(
733           p_exam_cal_type,p_exam_ci_sequence_number,
734           ci.cal_type, ci.sequence_number,
735           'N') = 'Y'
736         and UAI.LOGICAL_DELETE_DT IS NULL AND
737         AI.ASS_ID = UAI.ASS_ID AND
738         AI.EXAM_SCHEDULED_IND = 'Y' AND
739         ATP.ASSESSMENT_TYPE = AI.ASSESSMENT_TYPE AND
740         ATP.EXAMINABLE_IND = 'Y' AND
741         CAT.CAL_TYPE = CI.CAL_TYPE AND
742         CAT.S_CAL_CAT = 'EXAM' AND
743         CS.CAL_STATUS = CI.CAL_STATUS AND
744         CS.S_CAL_STATUS = 'ACTIVE' AND
745         (UAI.EXAM_CAL_TYPE IS NULL OR
746          CI.CAL_TYPE = UAI.EXAM_CAL_TYPE) AND
747         (UAI.EXAM_CI_SEQUENCE_NUMBER IS NULL OR
748          CI.SEQUENCE_NUMBER = UAI.EXAM_CI_SEQUENCE_NUMBER) AND
749         IGS_EN_GEN_014.ENRS_GET_WITHIN_CI(CI.CAL_TYPE,CI.SEQUENCE_NUMBER,
750                 UAI.CAL_TYPE, UAI.CI_SEQUENCE_NUMBER, 'N') = 'Y';
751    v_unit_cd IGS_CA_INST_REL.sup_cal_type%TYPE;
752   CURSOR  c_uv IS
753   SELECT  supp_exam_permitted_ind
754   FROM  IGS_PS_UNIT_VER
755   WHERE unit_cd = p_unit_cd AND
756     version_number = p_version_number;
757   v_supp_exam_permitted_ind IGS_PS_UNIT_VER.supp_exam_permitted_ind%TYPE;
758   rec_uoo_id cur_uoo_id%ROWTYPE;
759 BEGIN
760   -- anilk, 22-Apr-2003, Bug# 2829262
761   OPEN cur_uoo_id;
762   FETCH cur_uoo_id INTO rec_uoo_id;
763   CLOSE cur_uoo_id;
764   -- Call routine to determine whether the student is eligible for a supp/special
765   -- exam.
766    IF ASSP_GET_SUA_EXAM_TP(p_person_id,
767         p_course_cd,
768         p_unit_cd,
769         p_cal_type,
770         p_ci_sequence_number,
771         p_unit_attempt_status,
772                     -- anilk, 22-Apr-2003, Bug# 2829262
773         rec_uoo_id.uoo_id) NOT IN ('SUPP','SPECIAL') THEN
774     RETURN 'NA';
775   END IF;
776   -- If supps are not permitted for the IGS_PS_UNIT version then return 'N', indicating
777   -- the exam is not permitted.
778   OPEN  c_uv;
779   FETCH c_uv INTO v_supp_exam_permitted_ind;
780   CLOSE c_uv;
781   IF v_supp_exam_permitted_ind = 'N' THEN
782     Return 'N';
783   END IF;
784   -- Determine if the exists a relationship between the exam calendar and the
785   --  original calendar in which the item was examined.
786   OPEN c_ci;
787   FETCH c_ci INTO v_unit_cd;
788   IF c_ci%NOTFOUND THEN
789     CLOSE c_ci;
790     RETURN 'N';
791   ELSE
792     CLOSE c_ci;
793     RETURN 'Y';
794   END IF;
795 
796 END;
797  FUNCTION assp_get_trn_sua_out(
798   p_person_id IN NUMBER ,
799   p_course_cd IN VARCHAR2 ,
800   p_unit_cd IN VARCHAR2 ,
801   p_cal_type IN VARCHAR2 ,
802   p_ci_sequence_number IN NUMBER ,
803   p_unit_attempt_status IN VARCHAR2 ,
804   p_final_outcome IN VARCHAR2,
805   -- anilk, 22-Apr-2003, Bug# 2829262
806   p_uoo_id IN NUMBER )
807 RETURN VARCHAR2 IS
808   gv_other_detail   VARCHAR2(255);
809 BEGIN -- assp_get_trn_sua_out
810   -- Module which is primarily used by the local function inside
811   -- assp_get_trn_sca_dtl.
812 DECLARE
813   v_ret_val   VARCHAR2(10);
814   v_outcome_dt    DATE;
815   v_grading_schema_cd IGS_AS_GRD_SCH_GRADE.grading_schema_cd%TYPE;
816   v_gs_version_number IGS_AS_GRD_SCH_GRADE.version_number%TYPE;
817   v_grade     IGS_AS_GRD_SCH_GRADE.grade%TYPE;
818   v_mark      IGS_AS_GRD_SCH_GRADE.lower_mark_range%TYPE;
819   v_origin_course_cd  IGS_PS_VER.course_cd%TYPE;
820 BEGIN
821   v_ret_val := assp_get_sua_outcome(
822       p_person_id,
823       p_course_cd,
824       p_unit_cd,
825       p_cal_type,
826       p_ci_sequence_number,
827       p_unit_attempt_status,
828       p_final_outcome,
829       v_outcome_dt,  -- output
830       v_grading_schema_cd, -- output
831       v_gs_version_number, -- output
832       v_grade, -- output
833       v_mark, -- output
834       v_origin_course_cd,
835                         -- anilk, 22-Apr-2003, Bug# 2829262
836       p_uoo_id,
837       'N');
838   RETURN v_ret_val;
839 END;
840 EXCEPTION
841   WHEN OTHERS THEN
842        Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXP');
843        FND_MESSAGE.SET_TOKEN('NAME','IGS_AS_GEN_003.assp_get_trn_sua_out');
844   IGS_GE_MSG_STACK.ADD;
845        App_Exception.Raise_Exception;
846 END assp_get_trn_sua_out;
847 FUNCTION assp_get_uai_due_dt(
848   p_person_id IN NUMBER ,
849   p_course_cd IN VARCHAR2 ,
850   p_unit_cd IN VARCHAR2 ,
851   p_cal_type IN VARCHAR2 ,
852   p_ci_sequence_number IN NUMBER ,
853   p_ass_id IN NUMBER ,
854   -- anilk, 22-Apr-2003, Bug# 2829262
855   p_uoo_id IN NUMBER )
856 RETURN DATE IS
857         gv_other_detail   VARCHAR2(255);
858 BEGIN -- assp_get_uai_due_dt
859         -- This function will return the due date of an assessment item.
860         -- It will use a view that will contain the assessment items that
861         -- apply to the student IGS_PS_UNIT attempt's IGS_AD_LOCATION, class and mode.
862         --
863         -- This function is modified by Nishikant - 08JAN2001 - Enh Bug#2162831.
864         -- Its modified to return the due date for the assessment item if available at
865         -- Unit section level first. If it does not find then it checks at unit offering level.
866 DECLARE
867         v_uai_due_dt      IGS_AS_UNITASS_ITEM.due_dt%TYPE;
868 
869 -- This cursor selects the due date of the assessment item at unit section level for
870 -- the student where logical date is null.
871         CURSOR  c_sus  IS
872         SELECT  usai.due_dt
873         FROM    igs_en_su_attempt sua,
874                 igs_ps_unitass_item usai
875         WHERE   sua.person_id = p_person_id AND
876                 sua.course_cd = p_course_cd AND
877                 -- anilk, 22-Apr-2003, Bug# 2829262
878                 sua.uoo_id = p_uoo_id  AND
879                 usai.ass_id = p_ass_id AND
880                 usai.logical_delete_dt IS NULL AND
881                 sua.uoo_id = usai.uoo_id AND
882                 IGS_AS_VAL_UAI.assp_val_sua_ai_acot(usai.ass_id,
883                                     sua.person_id,
884                                     sua.course_cd) = 'TRUE';
885 
886 -- This cursor selects the due date of the assessment item at unit section level for
887 -- the student where the item is logically deleted ,ie.,logical date is not null.
888 -- In this case it picks up the due date of the assessment item whose logical delete date is
889 -- maximum.
890         CURSOR  c_sus_del IS
891         SELECT  usai.due_dt
892         FROM    igs_en_su_attempt sua,
893                 igs_ps_unitass_item usai
894         WHERE   sua.person_id = p_person_id AND
895                 sua.course_cd = p_course_cd AND
896                 -- anilk, 22-Apr-2003, Bug# 2829262
897                 sua.uoo_id = p_uoo_id  AND
898                 usai.ass_id = p_ass_id AND
899                 sua.uoo_id = usai.uoo_id AND
900                 usai.logical_delete_dt = (
901                      SELECT  MAX(usai1.logical_delete_dt)
902                      FROM    igs_ps_unitass_item usai1
903                      WHERE   usai1.uoo_id = sua.uoo_id and
904                              usai1.ass_id = usai.ass_id) AND
905                 IGS_AS_VAL_UAI.assp_val_sua_ai_acot(usai.ass_id,
906                              sua.person_id,
907                              sua.course_cd) = 'TRUE';
908 
909         CURSOR  c_suv IS
910                 SELECT  uai.due_dt
911                 FROM    IGS_EN_SU_ATTEMPT  sua,
912                         IGS_AS_UNITASS_ITEM  uai
913                 WHERE   sua.person_id = p_person_id AND
914                         sua.course_cd = p_course_cd AND
915                         -- anilk, 22-Apr-2003, Bug# 2829262
916                         sua.uoo_id = p_uoo_id  AND
917                         uai.ass_id = p_ass_id AND
918                         uai.logical_delete_dt IS NULL AND
919                         sua.unit_cd = uai.unit_cd AND
920                                 sua.version_number = uai.version_number AND
921                                 sua.cal_type = uai.cal_type AND
922                                 sua.ci_sequence_number = uai.ci_sequence_number AND
923                                 IGS_AS_VAL_UAI.assp_val_sua_ai_acot(uai.ass_id,
924                                                  sua.person_id,
925                                                  sua.course_cd) = 'TRUE';
926 
927   CURSOR  c_suv_del IS
928     SELECT  uai.due_dt
929     FROM  IGS_EN_SU_ATTEMPT  sua,
930                         IGS_AS_UNITASS_ITEM  uai
931     WHERE sua.person_id = p_person_id AND
932       sua.course_cd = p_course_cd AND
933                         -- anilk, 22-Apr-2003, Bug# 2829262
934                         sua.uoo_id = p_uoo_id  AND
935       uai.ass_id = p_ass_id AND
936       uai.logical_delete_dt = (
937         SELECT  MAX(uai1.logical_delete_dt)
938         FROM  IGS_EN_SU_ATTEMPT  sua1,
939                                         IGS_AS_UNITASS_ITEM  uai1
940         WHERE sua1.person_id = sua.person_id AND
941           sua1.course_cd = sua.course_cd AND
942                                         -- anilk, 22-Apr-2003, Bug# 2829262
943                                         sua1.uoo_id = sua.uoo_id  AND
944           uai1.ass_id = uai.ass_id AND
945           sua.unit_cd = uai.unit_cd AND
946           sua.version_number = uai.version_number AND
947           sua.cal_type = uai.cal_type AND
948           sua.ci_sequence_number = uai.ci_sequence_number AND
949           IGS_AS_VAL_UAI.assp_val_sua_ai_acot(uai.ass_id,
950                              sua.person_id,
951                                    sua.course_cd) = 'TRUE'
952           );
953 BEGIN
954 -- Here it returns the due date of the assessment item for the student which is not
955 -- logically deleted.
956         OPEN c_sus;
957         FETCH c_sus INTO v_uai_due_dt;
958         IF c_sus%FOUND THEN
959                 CLOSE c_sus;
960                 RETURN v_uai_due_dt;
961         END IF;
962         CLOSE c_sus;
963 
964 -- Here it returns the due date of the assessment item for the student which is logically
965 -- deleted but the most recently deleted one.
966         OPEN c_sus_del;
967         FETCH c_sus_del INTO v_uai_due_dt;
968          IF c_sus_del%FOUND THEN
969                 CLOSE c_sus_del;
970                 RETURN v_uai_due_dt;
971         END IF;
972         CLOSE c_sus_del;
973 
974         OPEN c_suv ;
975         FETCH c_suv INTO v_uai_due_dt;
976         IF c_suv%FOUND THEN
977                 CLOSE c_suv;
978                 RETURN v_uai_due_dt;
979         END IF;
980         CLOSE c_suv;
981 
982         OPEN c_suv_del ;
983         FETCH c_suv_del INTO v_uai_due_dt;
984         IF c_suv_del%FOUND THEN
985                 CLOSE c_suv_del;
986                 RETURN v_uai_due_dt;
987         END IF;
988         CLOSE c_suv_del;
989 
990         RETURN NULL;
991 END;
992 END assp_get_uai_due_dt;
993 
994 FUNCTION assp_get_uai_ref(
995   p_person_id IN NUMBER ,
996   p_course_cd IN VARCHAR2 ,
997   p_unit_cd IN VARCHAR2 ,
998   p_cal_type IN VARCHAR2 ,
999   p_ci_sequence_number IN NUMBER ,
1000   p_ass_id IN NUMBER ,
1001   -- anilk, 22-Apr-2003, Bug# 2829262
1002   p_uoo_id IN NUMBER )
1003 RETURN VARCHAR2 IS
1004         gv_other_detail   VARCHAR2(255);
1005 BEGIN
1006         -- assp_get_uai_ref
1007         -- This function will return the reference of an assessment item.
1008         -- It will use a view that will contain the assessment items that
1009         -- apply to the student IGS_PS_UNIT attempt's IGS_AD_LOCATION, class and mode.
1010         --
1011         -- This function is modified by Nishikant - 08JAN2001 - Enh Bug#2162831.
1012         -- Its modified to return the reference of the assessment item if available at
1013         -- Unit section level first. If it does not find then it checks at unit offering level.
1014 DECLARE
1015         v_uai_reference       IGS_AS_UNITASS_ITEM.reference%TYPE;
1016 
1017 -- This cursor selects the reference of the assessment item at unit section level for
1018 -- the student where logical date is null.
1019         CURSOR  c_sus IS
1020         SELECT  usai.reference
1021         FROM    igs_en_su_attempt sua,
1022                 igs_ps_unitass_item usai
1023         WHERE   sua.person_id = p_person_id AND
1024                 sua.course_cd = p_course_cd AND
1025                 -- anilk, 22-Apr-2003, Bug# 2829262
1026                 sua.uoo_id    = p_uoo_id    AND
1027                 usai.ass_id = p_ass_id AND
1028                 usai.logical_delete_dt IS NULL AND
1029                 sua.uoo_id = usai.uoo_id  AND
1030                 IGS_AS_VAL_UAI.assp_val_sua_ai_acot(usai.ass_id,
1031                                     sua.person_id,
1032                                     sua.course_cd) = 'TRUE';
1033 
1034 -- This cursor selects the reference of the assessment item at unit section level for
1035 -- the student where the item is logically deleted ,ie.,logical date is not null.
1036 -- In this case it picks up the reference of the assessment item whose logical delete date is
1037 -- maximum.
1038         CURSOR c_sus_del IS
1039         SELECT  usai.reference
1040         FROM    igs_en_su_attempt sua,
1041                 igs_ps_unitass_item usai
1042         WHERE   sua.person_id = p_person_id AND
1043                 sua.course_cd = p_course_cd AND
1044                 -- anilk, 22-Apr-2003, Bug# 2829262
1045                 sua.uoo_id    = p_uoo_id    AND
1046                 usai.ass_id = p_ass_id AND
1047                 sua.uoo_id = usai.uoo_id AND
1048                 usai.logical_delete_dt = (
1049                 SELECT  MAX(usai1.logical_delete_dt)
1050                 FROM    igs_ps_unitass_item usai1
1051                 WHERE   usai1.uoo_id = sua.uoo_id and
1052                         usai1.ass_id = usai.ass_id) AND
1053                 IGS_AS_VAL_UAI.assp_val_sua_ai_acot(usai.ass_id,
1054                                     sua.person_id,
1055                                     sua.course_cd) = 'TRUE';
1056 
1057   CURSOR  c_suv IS
1058           SELECT  uai.reference
1059             FROM    IGS_EN_SU_ATTEMPT  sua,
1060                                 IGS_AS_UNITASS_ITEM  uai
1061       WHERE sua.person_id = p_person_id AND
1062         sua.course_cd = p_course_cd AND
1063                                 -- anilk, 22-Apr-2003, Bug# 2829262
1064                                 sua.uoo_id    = p_uoo_id    AND
1065         uai.ass_id = p_ass_id AND
1066               uai.logical_delete_dt IS NULL AND
1067         sua.unit_cd = uai.unit_cd AND
1068               sua.version_number = uai.version_number AND
1069           sua.cal_type = uai.cal_type AND
1070         sua.ci_sequence_number = uai.ci_sequence_number AND
1071         IGS_AS_VAL_UAI.assp_val_sua_ai_acot(uai.ass_id,
1072           sua.person_id,
1073           sua.course_cd) = 'TRUE';
1074 
1075 
1076   CURSOR  c_suv_del IS
1077     SELECT  uai.reference
1078     FROM  IGS_EN_SU_ATTEMPT  sua,
1079                 IGS_AS_UNITASS_ITEM  uai
1080     WHERE sua.person_id = p_person_id AND
1081       sua.course_cd = p_course_cd AND
1082                         -- anilk, 22-Apr-2003, Bug# 2829262
1083                         sua.uoo_id    = p_uoo_id      AND
1084       uai.ass_id = p_ass_id AND
1085       uai.logical_delete_dt = (
1086         SELECT  MAX(uai1.logical_delete_dt)
1087         FROM  IGS_EN_SU_ATTEMPT  sua1,
1088                                         IGS_AS_UNITASS_ITEM  uai1
1089         WHERE sua1.person_id = sua.person_id AND
1090           sua1.course_cd = sua.course_cd AND
1091                                         -- anilk, 22-Apr-2003, Bug# 2829262
1092                                         sua1.uoo_id    = sua.uoo_id      AND
1093           uai1.ass_id = uai.ass_id AND
1094           sua.unit_cd = uai.unit_cd AND
1095             sua.version_number = uai.version_number AND
1096               sua.cal_type = uai.cal_type AND
1097             sua.ci_sequence_number = uai.ci_sequence_number AND
1098             IGS_AS_VAL_UAI.assp_val_sua_ai_acot(uai.ass_id,
1099                     sua.person_id,
1100           sua.course_cd) = 'TRUE'
1101           );
1102 BEGIN
1103 -- Here it returns the reference of the assessment item for the student which is not
1104 -- logically deleted.
1105         OPEN c_sus;
1106         FETCH c_sus INTO v_uai_reference;
1107         IF c_sus%FOUND THEN
1108                 CLOSE c_sus;
1109                 RETURN v_uai_reference;
1110         END IF;
1111         CLOSE c_sus;
1112 
1113 -- Here it returns the reference of the assessment item for the student which is logically
1114 -- deleted but the most recently deleted one.
1115         OPEN c_sus_del;
1116         FETCH c_sus_del INTO v_uai_reference;
1117         IF c_sus_del%FOUND THEN
1118                 CLOSE c_sus_del;
1119                 RETURN v_uai_reference;
1120         END IF;
1121         CLOSE c_sus_del;
1122 
1123   OPEN c_suv ;
1124   FETCH c_suv INTO v_uai_reference;
1125   IF c_suv%FOUND THEN
1126     CLOSE c_suv;
1127     RETURN v_uai_reference;
1128   END IF;
1129   CLOSE c_suv;
1130   OPEN c_suv_del ;
1131   FETCH c_suv_del INTO v_uai_reference;
1132   IF c_suv_del%FOUND THEN
1133     CLOSE c_suv_del;
1134     RETURN v_uai_reference;
1135   END IF;
1136   CLOSE c_suv_del;
1137   RETURN NULL;
1138 
1139 END;
1140 END assp_get_uai_ref;
1141  FUNCTION assp_get_spcl_needs(
1142   p_person_id IN NUMBER )
1143 RETURN VARCHAR2 IS
1144   gv_other_detail   VARCHAR2(255);
1145   v_exists      VARCHAR2(1);
1146 BEGIN -- ASSP_GET_SPCL_NEEDS
1147   -- Purpose: Get whether IGS_PE_PERSON is within the special needs group.
1148   -- The type of IGS_PE_PERSON ID group is currently passed in , although this
1149   -- may be replaced by a system table in the future.
1150 DECLARE
1151   CURSOR c_pig_pigm IS
1152     SELECT  'x'
1153     FROM  IGS_PE_PERSID_GROUP   pig,
1154       IGS_PE_PRSID_GRP_MEM  pigm
1155     WHERE pig.group_cd = 'SPCL-NEEDS' AND
1156       pig.closed_ind  = 'N' AND
1157       pig.group_id = pigm.group_id AND
1158       pigm.person_id = p_person_id;
1159 BEGIN
1160   -- Cursor handling
1161   OPEN c_pig_pigm;
1162   FETCH c_pig_pigm INTO v_exists;
1163   IF c_pig_pigm%FOUND THEN
1164     CLOSE c_pig_pigm;
1165     RETURN 'Y';
1166   ELSE
1167     CLOSE c_pig_pigm;
1168     RETURN 'N';
1169   END IF;
1170 EXCEPTION
1171   WHEN OTHERS THEN
1172     IF c_pig_pigm%ISOPEN THEN
1173       CLOSE c_pig_pigm;
1174     END IF;
1175     RAISE;
1176 END;
1177 EXCEPTION
1178   WHEN OTHERS THEN
1179          NULL;
1180 END ASSP_GET_SPCL_NEEDS;
1181 
1182   PROCEDURE get_default_grds (
1183     x_unit_cd                      IN  VARCHAR2,
1184     x_version_number               IN  NUMBER,
1185     x_assessment_type              IN  VARCHAR2,
1186     x_grading_schema_cd      OUT NOCOPY VARCHAR2,
1187     x_gs_version_number      OUT NOCOPY NUMBER,
1188     x_description      OUT NOCOPY VARCHAR2,
1189     x_approved               OUT NOCOPY VARCHAR2
1190   ) AS
1191   /*
1192   ||  Created By : [email protected]
1193   ||  Created On : 31-Dec-2001
1194   ||  Purpose : To get the default Grading Schema for the given
1195   ||            Unit Code, Version Number and Assessment Type.
1196   ||  Known limitations, enhancements or remarks :
1197   ||  Change History :
1198   ||  Who             When            What
1199   ||  (reverse chronological order - newest change first)
1200   */
1201     CURSOR cur_get_def (p_unit_cd         VARCHAR2,
1202                         p_version_number  NUMBER,
1203                         p_assessment_type VARCHAR2)IS
1204       SELECT grading_schema_cd,
1205              gs_version_number
1206       FROM   igs_as_appr_grd_sch
1207       WHERE  unit_cd         = p_unit_cd AND
1208              version_number  = p_version_number AND
1209              assessment_type = p_assessment_type AND
1210              default_ind     =  'Y' AND
1211              closed_ind      =  'N' ;
1212     l_cur_get_def        cur_get_def%ROWTYPE;
1213 
1214     CURSOR cur_get_appr (p_unit_cd         VARCHAR2,
1215                          p_version_number  NUMBER,
1216                          p_assessment_type VARCHAR2)IS
1217       SELECT 'X'
1218       FROM   igs_as_appr_grd_sch
1219       WHERE  unit_cd         = p_unit_cd AND
1220              version_number  = p_version_number AND
1221              assessment_type = p_assessment_type AND
1222              closed_ind      =  'N';
1223     l_cur_get_appr        cur_get_appr%ROWTYPE;
1224 
1225     CURSOR cur_desc (p_grading_schema_cd  VARCHAR2,
1226                      p_gs_version_number  NUMBER )IS
1227     SELECT description
1228     FROM igs_as_grd_schema
1229     WHERE grading_schema_cd = p_grading_schema_cd AND
1230           version_number    = p_gs_version_number;
1231     l_cur_desc           cur_desc%ROWTYPE;
1232 
1233 
1234   BEGIN
1235     OPEN cur_get_def(x_unit_cd, x_version_number, x_assessment_type);
1236     FETCH cur_get_def INTO l_cur_get_def;
1237     IF cur_get_def%FOUND THEN
1238       x_grading_schema_cd := l_cur_get_def.grading_schema_cd;
1239       x_gs_version_number := l_cur_get_def.gs_version_number;
1240       OPEN cur_desc(x_grading_schema_cd, x_gs_version_number);
1241       FETCH cur_desc INTO l_cur_desc;
1242         IF cur_desc%FOUND THEN
1243           x_description := l_cur_desc.description;
1244         END IF;
1245       CLOSE cur_desc;
1246     END IF;
1247     CLOSE cur_get_def;
1248 
1249     OPEN cur_get_appr(x_unit_cd, x_version_number, x_assessment_type);
1250     FETCH cur_get_appr INTO l_cur_get_appr;
1251       x_approved := 'N';
1252       IF cur_get_appr%FOUND THEN
1253         x_approved := 'Y';
1254       END IF;
1255     CLOSE cur_get_appr;
1256 
1257   END get_default_grds;
1258 
1259   PROCEDURE assp_get_suaai_gs(
1260     p_person_id                 IN  NUMBER,
1261     p_course_cd                 IN  VARCHAR2,
1262     p_unit_cd                   IN  VARCHAR2,
1263     p_cal_type                  IN  VARCHAR2,
1264     p_ci_sequence_number        IN  NUMBER,
1265     p_ass_id                    IN  VARCHAR2,
1266     p_grading_schema_cd         OUT NOCOPY VARCHAR2,
1267     p_gs_version_number         OUT NOCOPY NUMBER,
1268     -- anilk, 22-Apr-2003, Bug# 2829262
1269     p_uoo_id                    IN  NUMBER ) IS
1270    /*
1271   ||  Created By : Nishikant
1272   ||  Created On : 25jan2002
1273   ||  Purpose : To get the Grading Schema and Version Number
1274   ||            for an Assessment Item available at unit
1275   ||            section level or unit offering level
1276   ||  Known limitations, enhancements or remarks :
1277   ||  Change History :
1278   ||  Who             When            What
1279   ||  (reverse chronological order - newest change first)
1280   */
1281 
1282   CURSOR c_uoo_id IS
1283   SELECT uoo_id, version_number
1284   FROM   igs_en_su_attempt
1285   WHERE  person_id = p_person_id AND
1286          course_cd = p_course_cd AND
1287          -- anilk, 22-Apr-2003, Bug# 2829262
1288          uoo_id    = p_uoo_id;
1289   CURSOR c_us_grad_ver( l_uoo_id igs_en_su_attempt.uoo_id%TYPE) IS
1290   SELECT grading_schema_cd, gs_version_number
1291   FROM   igs_ps_unitass_item
1292   WHERE  uoo_id = l_uoo_id AND
1293          ass_id = p_ass_id AND
1294          logical_delete_dt IS NULL;
1295   CURSOR c_u_grad_ver ( l_version_number igs_en_su_attempt.version_number%TYPE) IS
1296   SELECT grading_schema_cd, gs_version_number
1297   FROM   igs_as_unitass_item
1298   WHERE  unit_cd = p_unit_cd AND
1299          version_number = l_version_number AND
1300          cal_type = p_cal_type AND
1301          ci_sequence_number = p_ci_sequence_number AND
1302          ass_id = p_ass_id AND
1303          logical_delete_dt IS NULL;
1304   l_c_uoo_id   igs_en_su_attempt.uoo_id%TYPE;
1305   l_c_version_number  igs_en_su_attempt.version_number%TYPE;
1306 
1307   BEGIN
1308 
1309   OPEN c_uoo_id;
1310   FETCH c_uoo_id INTO l_c_uoo_id, l_c_version_number;
1311   CLOSE c_uoo_id;
1312   -- Here it checks whether grading schema code and version is avilable
1313   -- for the Assessment item at Unit Offering level.
1314   OPEN c_us_grad_ver(l_c_uoo_id);
1315   FETCH c_us_grad_ver INTO p_grading_schema_cd,p_gs_version_number;
1316   IF c_us_grad_ver%FOUND THEN
1317         CLOSE c_us_grad_ver;
1318         RETURN;
1319   ELSE
1320   -- Here it checks whether grading schema code and version is avilable
1321   -- for the Assessment item at Unit Offering level.
1322         OPEN c_u_grad_ver(l_c_version_number);
1323         FETCH c_u_grad_ver INTO p_grading_schema_cd,p_gs_version_number;
1324         IF c_u_grad_ver%FOUND THEN
1325            CLOSE c_u_grad_ver;
1326            RETURN;
1327         ELSE
1328            CLOSE c_us_grad_ver;
1329            CLOSE c_u_grad_ver;
1330            RETURN;
1331         END IF;
1332   END IF;
1333   END assp_get_suaai_gs;
1334 
1335 FUNCTION getStdntCareerPrograms(
1336    P_PERSON_ID IN IGS_EN_STDNT_PS_ATT.person_id%TYPE ,
1337    P_PROGRAM_TYPE IN IGS_PS_VER_ALL.course_type%TYPE ) RETURN VARCHAR2 IS
1338 
1339   CURSOR c_stud_careers IS
1340    SELECT a.Course_cd, b.Title
1341    FROM   IGS_EN_STDNT_PS_ATT_ALL a, IGS_PS_VER_ALL b
1342    WHERE  a.course_cd     =  b.course_cd         AND
1343        a.version_number = b.version_number    AND
1344        a.course_attempt_status <> 'UNCONFIRM' AND
1345        b.COURSE_TYPE   =  P_program_type      AND
1346        a.person_id     =  P_PERSON_ID        /* AND
1347        trunc(a.CREATION_DATE) <= (
1348                             SELECT min(trunc(innerpsatt.CREATION_DATE))
1349                     FROM   IGS_EN_STDNT_PS_ATT_ALL innerpsatt, IGS_PS_VER_ALL innerpsver
1350                     WHERE  innerpsatt.course_cd     =  innerpsver.course_cd         AND
1351                      innerpsatt.version_number = innerpsver.version_number    AND
1352                      innerpsatt.person_id     =   P_PERSON_ID        AND
1353                              innerpsatt.course_attempt_status <> 'UNCONFIRM' AND
1354                              innerpsver.COURSE_TYPE   =  P_program_type
1355                             )  */
1356     ORDER BY COURSE_TYPE,primary_program_type ;
1357   v_stud_careers    c_stud_careers%ROWTYPE;
1358   v_programs VARCHAR2(3000) ;
1359   v_seperator VARCHAR2(3);
1360 BEGIN
1361         FOR v_stud_careers IN  c_stud_careers
1362         LOOP
1363             IF v_seperator IS NULL THEN
1364               v_seperator:=' ';
1365             ELSE
1366               v_seperator:=', ';
1367             END IF;
1368             v_programs := v_programs || v_seperator || trim(v_stud_careers.title) ;
1369         end loop;
1370   return(v_programs);
1371 END getStdntCareerPrograms;
1372 
1373 
1374 FUNCTION getStdntCareerProgsBetween(
1375    P_PERSON_ID IN igs_en_stdnt_ps_att.person_id%TYPE ,
1376    P_COURSE_CD IN igs_en_stdnt_ps_att.course_cd%TYPE ,
1377    P_TERM_START_DATE IN DATE ,
1378    P_TERM_END_DATE IN DATE ) RETURN VARCHAR2 IS
1379 
1380 CURSOR c_stud_careers IS
1381 SELECT a.Course_cd, b.Title
1382 FROM   IGS_EN_STDNT_PS_ATT_ALL a, IGS_PS_VER_ALL b
1383 WHERE  a.course_cd     =  b.course_cd         AND
1384        a.version_number = b.version_number    AND
1385        a.course_attempt_status <> 'UNCONFIRM' AND
1386        a.COMMENCEMENT_DT <=  p_term_end_date   AND
1387        nvl(a.DISCONTINUED_DT , SYSDATE  + 100000 ) >= p_term_start_date AND
1388        b.COURSE_TYPE   =  (SELECT b.course_type
1389         FROM   IGS_EN_STDNT_PS_ATT_ALL innerpsatt, IGS_PS_VER_ALL innerpsver
1390         WHERE  innerpsatt.course_cd     =  innerpsver.course_cd         AND
1391          innerpsatt.version_number = innerpsver.version_number    AND
1392          innerpsatt.person_id     =   P_PERSON_ID        AND
1393          innerpsatt.course_cd     =   P_COURSE_CD)     AND
1394       a.person_id     =   P_PERSON_ID
1395       ORDER BY primary_program_type ;
1396 
1397 v_stud_careers    c_stud_careers%rowtype;
1398 v_programs varchar2(3000) ;
1399 v_seperator varchar2(1);
1400 BEGIN
1401         FOR v_stud_careers IN  c_stud_careers
1402         LOOP
1403             IF v_seperator IS NULL THEN
1404               v_seperator:=' ';
1405             ELSE
1406               v_seperator:=', ';
1407             END IF;
1408             v_programs := v_programs || v_seperator || v_stud_careers.title ;
1409         END LOOP;
1410   RETURN(v_programs);
1411 END getStdntCareerProgsBetween;
1412 
1413 FUNCTION getStdntPrograms(
1414    P_PERSON_ID IGS_EN_STDNT_PS_ATT.PERSON_ID%TYPE ,
1415    P_PROGRAM_CD IGS_PS_VER_ALL.COURSE_CD%TYPE ) RETURN VARCHAR2 IS
1416 
1417 CURSOR c_stud_programs IS
1418 SELECT a.person_id ,a.Course_cd, c.Title
1419 FROM   IGS_PS_STDNT_TRN a, IGS_EN_STDNT_PS_ATT_ALL b , IGS_PS_VER c
1420 WHERE  a.COURSE_CD     =  b.course_cd         AND
1421        a.person_id = b.person_id              AND
1422        b.course_cd =  c.course_cd             AND
1423        b.version_number = c.version_number    AND
1424        a.TRANSFER_COURSE_CD   =  P_program_cd        AND
1425        a.person_id     =    P_PERSON_ID;
1426 
1427 v_stud_programs    c_stud_programs%rowtype;
1428 v_programs varchar2(3000) ;
1429 BEGIN
1430         FOR v_stud_programs IN  c_stud_programs
1431         LOOP
1432             v_programs :=  v_stud_programs.title ;
1433         END LOOP;
1434   return(v_programs);
1435 END getStdntPrograms;
1436 
1437 
1438 
1439 Function getStdntProgsBetween(
1440         P_PERSON_ID igs_en_stdnt_ps_att.person_id%type ,
1441         P_program_cd igs_ps_ver_all.course_type%type ,
1442         p_term_start_date DATE ,
1443         p_term_end_date DATE ) return VARCHAR2 is
1444 
1445 CURSOR c_stud_programs IS
1446 SELECT a.course_cd, b.title
1447   FROM igs_ps_stdnt_trn a, igs_ps_ver_all b , IGS_EN_STDNT_PS_ATT_ALL c
1448  WHERE a.TRANSFER_COURSE_CD = c.course_cd
1449    AND a.person_id = c.person_id
1450    AND c.course_cd = b.course_cd
1451    AND c.version_number = b.version_number
1452    AND a.transfer_dt < p_term_end_date
1453    AND a.transfer_dt > p_term_start_date
1454    AND a.course_cd = p_program_cd
1455    AND a.person_id = p_person_id;
1456 
1457 v_stud_programs    c_stud_programs%rowtype;
1458 v_programs varchar2(3000) ;
1459 v_seperator varchar2(1);
1460 begin
1461         for v_stud_programs in  c_stud_programs
1462         loop
1463             IF v_seperator IS NULL THEN
1464               v_seperator:=' ';
1465             ELSE
1466               v_seperator:=',';
1467             END IF;
1468             v_programs := v_programs || v_seperator || v_stud_programs.title ;
1469         end loop;
1470   return(v_programs);
1471 end getStdntProgsBetween;
1472 
1473 
1474 /******************************************************
1475 * Procedure to be created
1476 * For selecting the current valid term
1477 * Jitendra Handa
1478 * Term Based Location display for VAH
1479 ******************************************************/
1480 
1481 PROCEDURE get_current_term (
1482    p_person_id   IN              NUMBER,
1483    p_course_cd   IN              VARCHAR2,
1484    p_cal_type    OUT NOCOPY      VARCHAR2,
1485    p_seq_num     OUT NOCOPY      NUMBER
1486 )
1487 AS
1488    CURSOR c_terms
1489    IS
1490       SELECT   ci.cal_type, ci.sequence_number, ci.start_dt, ci.end_dt,
1491                spa.person_id, spa.course_cd
1492           FROM igs_en_stdnt_ps_att_all spa, igs_ca_inst ci,
1493                igs_ps_ver_all pv
1494          WHERE spa.course_attempt_status <> 'UNCONFIRM'
1495            AND pv.course_cd = spa.course_cd
1496            AND ci.start_dt <= SYSDATE
1497            AND spa.person_id = p_person_id
1498            AND spa.course_cd = p_course_cd
1499            AND (   EXISTS (
1500                       SELECT 1
1501                         FROM igs_en_su_attempt_all sua,
1502                              igs_ca_teach_to_load_v ttl
1503                        WHERE sua.person_id = spa.person_id
1504                          AND sua.course_cd = spa.course_cd
1505                          AND sua.cal_type = ttl.teach_cal_type
1506                          AND sua.ci_sequence_number =
1507                                                   ttl.teach_ci_sequence_number
1508                          AND ttl.load_cal_type = ci.cal_type
1509                          AND ttl.load_ci_sequence_number = ci.sequence_number
1510                          AND sua.unit_attempt_status IN
1511                                 ('ENROLLED',
1512                                  'COMPLETED',
1513                                  'DISCONTIN',
1514                                  'DUPLICATE'
1515                                 ))
1516                 OR EXISTS (
1517                       SELECT 1
1518                         FROM igs_av_stnd_unit asu
1519                        WHERE spa.person_id = asu.person_id
1520                          AND spa.course_cd = asu.as_course_cd
1521                          AND ci.cal_type = asu.cal_type
1522                          AND ci.sequence_number = asu.ci_sequence_number
1523                          AND asu.s_adv_stnd_granting_status = 'GRANTED')
1524                 OR EXISTS (
1525                       SELECT 1
1526                         FROM igs_av_stnd_unit_lvl asul
1527                        WHERE spa.person_id = asul.person_id
1528                          AND spa.course_cd = asul.as_course_cd
1529                          AND ci.cal_type = asul.cal_type
1530                          AND ci.sequence_number = asul.ci_sequence_number
1531                          AND asul.s_adv_stnd_granting_status = 'GRANTED')
1532                )
1533       ORDER BY ci.start_dt DESC;
1534 
1535    v_terms   c_terms%ROWTYPE;
1536 BEGIN
1537    OPEN c_terms;
1538    FETCH c_terms INTO v_terms;
1539    p_cal_type := v_terms.cal_type;
1540    p_seq_num := v_terms.sequence_number;
1541    CLOSE c_terms;
1542 END get_current_term;
1543 
1544 FUNCTION get_spat_att_type_desc (
1545             p_person_id IN NUMBER,
1546             p_program_cd IN VARCHAR2
1547       ) RETURN VARCHAR2 AS
1548 
1549 v_term_cal_type IGS_EN_SU_ATTEMPT.cal_type%TYPE;
1550 v_term_sequence_NUMBER IGS_EN_SU_ATTEMPT.ci_sequence_number%TYPE;
1551 BEGIN
1552 get_current_term(p_person_id,
1553      p_program_cd,
1554      v_term_cal_type,
1555     v_term_sequence_NUMBER);
1556 
1557 return igs_en_spa_terms_api.get_spat_att_type_desc(p_person_id,p_program_cd,v_term_cal_type,v_term_sequence_NUMBER);
1558 END get_spat_att_type_desc;
1559 
1560 FUNCTION get_spat_att_mode_desc(
1561   p_person_id IN NUMBER,
1562   p_program_cd IN VARCHAR2
1563   ) RETURN VARCHAR2 AS
1564 
1565 v_term_cal_type IGS_EN_SU_ATTEMPT.cal_type%TYPE;
1566 v_term_sequence_NUMBER IGS_EN_SU_ATTEMPT.ci_sequence_number%TYPE;
1567 BEGIN
1568 
1569 get_current_term(p_person_id,
1570      p_program_cd,
1571      v_term_cal_type,
1572      v_term_sequence_NUMBER);
1573 
1574 return igs_en_spa_terms_api.get_spat_att_mode_desc(p_person_id,p_program_cd,v_term_cal_type,v_term_sequence_NUMBER);
1575 END get_spat_att_mode_desc;
1576 
1577 
1578 FUNCTION get_spat_location_desc(
1579   p_person_id IN NUMBER,
1580   p_program_cd IN VARCHAR2
1581   ) RETURN VARCHAR2 AS
1582 v_term_cal_type IGS_EN_SU_ATTEMPT.cal_type%TYPE;
1583 v_term_sequence_NUMBER IGS_EN_SU_ATTEMPT.ci_sequence_number%TYPE;
1584 BEGIN
1585 
1586 get_current_term(p_person_id,
1587      p_program_cd,
1588      v_term_cal_type,
1589     v_term_sequence_NUMBER);
1590 
1591 return igs_en_spa_terms_api.get_spat_location_desc(p_person_id,p_program_cd,v_term_cal_type,v_term_sequence_NUMBER);
1592 END get_spat_location_desc;
1593 FUNCTION assp_get_sua_rel_grade(
1594   p_person_id IN NUMBER ,
1595   p_course_cd IN VARCHAR2 ,
1596   p_unit_cd IN VARCHAR2 ,
1597   p_cal_type IN VARCHAR2 ,
1598   p_ci_sequence_number IN NUMBER ,
1599   p_unit_attempt_status IN VARCHAR2 ,
1600   p_finalised_ind IN VARCHAR2 ,
1601   p_grading_schema_cd OUT NOCOPY VARCHAR2 ,
1602   p_gs_version_number OUT NOCOPY NUMBER ,
1603   p_grade OUT NOCOPY VARCHAR2 ,
1604   p_uoo_id IN  NUMBER )
1605 RETURN VARCHAR2 IS
1606     gv_other_detail   VARCHAR2(255);
1607 BEGIN -- assp_get_sua_grade
1608   -- This is an enrolments module.
1609   -- It gets the grade of a student IGS_PS_UNIT attempt within a IGS_PS_COURSE code.
1610   -- This routine will determine the appropriate grade (and its matching
1611   -- result type) and return them. If no grade is found NULL will be
1612   -- returned (and output parameters will be NULL).
1613   -- IGS_GE_NOTE: This routine handles DUPLICATE IGS_PS_UNIT attempts by searching for
1614   -- the 'source' IGS_PS_UNIT attempt and retrieving its grade.
1615   -- Note2: If the p_finalised_ind is set then only finalised grades will
1616   -- be returned.
1617 DECLARE
1618   cst_completed CONSTANT  VARCHAR2(10) := 'COMPLETED';
1619   cst_discontin CONSTANT  VARCHAR2(10) := 'DISCONTIN';
1620   cst_duplicate CONSTANT  VARCHAR2(10) := 'DUPLICATE';
1621   cst_enrolled  CONSTANT  VARCHAR2(10) := 'ENROLLED';
1622   v_course_cd     IGS_EN_SU_ATTEMPT.course_cd%TYPE;
1623   v_finalised_ind     VARCHAR2(1);
1624   v_sua_course_cd     IGS_EN_SU_ATTEMPT.course_cd%TYPE;
1625   v_gsg_grading_schema_cd   IGS_AS_GRD_SCH_GRADE.grading_schema_cd%TYPE;
1626   v_gsg_version_number    IGS_AS_GRD_SCH_GRADE.version_number%TYPE;
1627   v_gsg_grade     IGS_AS_GRD_SCH_GRADE.grade%TYPE;
1628   v_gsg_s_result_type   IGS_AS_GRD_SCH_GRADE.s_result_type%TYPE;
1629   v_suao_trans_grading_schema_cd
1630           IGS_AS_SU_STMPTOUT.translated_grading_schema_cd%TYPE;
1631   v_suao_trans_version_number
1632           IGS_AS_SU_STMPTOUT.translated_version_number%TYPE;
1633   v_suao_trans_grade    IGS_AS_SU_STMPTOUT.translated_grade%TYPE;
1634   v_gsg2_s_result_type    IGS_AS_GRD_SCH_GRADE.s_result_type%TYPE;
1635   CURSOR c_sua (
1636     cp_person_id    IGS_EN_SU_ATTEMPT.person_id%TYPE,
1637     cp_unit_cd    IGS_EN_SU_ATTEMPT.unit_cd%TYPE,
1638     cp_cal_type   IGS_EN_SU_ATTEMPT.cal_type%TYPE,
1639     cp_ci_sequence_number IGS_EN_SU_ATTEMPT.ci_sequence_number%TYPE,
1640     cp_uoo_id               IGS_EN_SU_ATTEMPT.uoo_id%TYPE
1641     ) IS
1642     SELECT  sut.transfer_course_cd
1643     FROM  IGS_PS_STDNT_UNT_TRN  sut,
1644       IGS_EN_SU_ATTEMPT sua
1645     WHERE sut.person_id     = cp_person_id AND
1646       sua.person_id     = sut.person_id AND
1647       sut.uoo_id    = cp_uoo_id AND
1648       sua.uoo_id    = sut.uoo_id AND
1649       sua.course_cd = sut.transfer_course_cd AND
1650       sua.unit_attempt_status IN (cst_completed, cst_discontin)
1651     ORDER BY sua.unit_attempt_status;
1652   CURSOR c_suao_gsg (
1653     cp_person_id    IGS_EN_SU_ATTEMPT.person_id%TYPE,
1654     c_v_course_cd   IGS_EN_SU_ATTEMPT.course_cd%TYPE,
1655     cp_unit_cd    IGS_EN_SU_ATTEMPT.unit_cd%TYPE,
1656     cp_cal_type   IGS_EN_SU_ATTEMPT.cal_type%TYPE,
1657     cp_ci_sequence_number IGS_EN_SU_ATTEMPT.ci_sequence_number%TYPE,
1658     c_v_finalised_ind VARCHAR2,
1659     cp_uoo_id               IGS_EN_SU_ATTEMPT.uoo_id%TYPE
1660     ) IS
1661     SELECT    gsg.grading_schema_cd,
1662         gsg.version_number,
1663         gsg.grade,
1664         gsg.s_result_type,
1665         suao.translated_grading_schema_cd,
1666         suao.translated_version_number,
1667         suao.translated_grade
1668     FROM    IGS_AS_SU_STMPTOUT  suao,
1669         IGS_AS_GRD_SCH_GRADE  gsg
1670     WHERE suao.person_id      = cp_person_id AND
1671         suao.course_cd      = c_v_course_cd AND
1672         suao.uoo_id             = cp_uoo_id AND
1673         suao.finalised_outcome_ind
1674                 LIKE DECODE(c_v_finalised_ind, 'Y', 'Y', '%') AND
1675         suao.grading_schema_cd    = gsg.grading_schema_cd AND
1676         suao.version_number     = gsg.version_number AND
1677         suao.grade      = gsg.grade AND
1678                 nvl(suao.RELEASE_DATE ,sysdate+10) <=sysdate
1679     ORDER BY  outcome_dt DESC;    -- will put the newest date first.
1680   CURSOR c_gsg2 IS
1681     SELECT  gsg2.s_result_type
1682     FROM  IGS_AS_GRD_SCH_GRADE gsg2
1683     WHERE gsg2.grading_schema_cd  = v_suao_trans_grading_schema_cd AND
1684       gsg2.version_number = v_suao_trans_version_number AND
1685       gsg2.grade    = v_suao_trans_grade;
1686 BEGIN
1687   p_grading_schema_cd := NULL;
1688   p_gs_version_number := NULL;
1689   p_grade := NULL;
1690   -- Depending on the status of the IGS_PS_UNIT attempt, set the grade search criteria.
1691   IF (p_unit_attempt_status = cst_duplicate) THEN
1692     -- Locate the original IGS_PS_UNIT attempt from which the grade was sourced.
1693     -- This will use IGS_PS_STDNT_UNT_TRN details created as a result of
1694     -- a IGS_PS_COURSE transfer
1695     OPEN  c_sua(
1696         p_person_id,
1697         p_unit_cd,
1698         p_cal_type,
1699         p_ci_sequence_number,
1700                                 -- anilk, 22-Apr-2003, Bug# 2829262
1701         p_uoo_id );
1702     FETCH c_sua INTO  v_sua_course_cd;
1703     IF (c_sua%NOTFOUND) THEN
1704       CLOSE c_sua;
1705       RETURN NULL;
1706     ELSE
1707       v_course_cd := v_sua_course_cd;
1708     END IF;
1709     CLOSE c_sua;
1710   ELSIF (p_unit_attempt_status = cst_completed OR
1711       p_unit_attempt_status = cst_discontin OR
1712       (p_finalised_ind = 'N' and p_unit_attempt_status = cst_enrolled)) THEN
1713     -- Use the parameter IGS_PS_COURSE code
1714     v_course_cd := p_course_cd;
1715   ELSE
1716     -- Only COMPLETED or DUPLICATED statuses have grades, so return NULL
1717     RETURN NULL;
1718   END IF;
1719   -- Search for the latest grade against the student IGS_PS_UNIT attempt
1720   OPEN  c_suao_gsg(
1721       p_person_id,
1722       v_course_cd,
1723       p_unit_cd,
1724       p_cal_type,
1725       p_ci_sequence_number,
1726       p_finalised_ind,
1727                         -- anilk, 22-Apr-2003, Bug# 2829262
1728                         p_uoo_id );
1729   FETCH c_suao_gsg  INTO  v_gsg_grading_schema_cd,
1730           v_gsg_version_number,
1731           v_gsg_grade,
1732           v_gsg_s_result_type,
1733           v_suao_trans_grading_schema_cd,
1734           v_suao_trans_version_number,
1735           v_suao_trans_grade;
1736   IF (c_suao_gsg%NOTFOUND) THEN
1737     CLOSE c_suao_gsg;
1738     RETURN NULL;
1739   ELSE
1740     -- Determine if the translated grade exists and is to be returned.
1741     IF v_suao_trans_grading_schema_cd IS NULL OR
1742         v_suao_trans_version_number IS NULL OR
1743         v_suao_trans_grade IS NULL THEN
1744       p_grading_schema_cd := v_gsg_grading_schema_cd;
1745       p_gs_version_number := v_gsg_version_number;
1746       p_grade := v_gsg_grade;
1747       CLOSE c_suao_gsg;
1748       RETURN  v_gsg_s_result_type;
1749     ELSE
1750       OPEN c_gsg2;
1751       FETCH c_gsg2 INTO v_gsg2_s_result_type;
1752       IF c_gsg2%NOTFOUND THEN
1753         p_grading_schema_cd := NULL;
1754         p_gs_version_number := NULL;
1755         p_grade := NULL;
1756         CLOSE c_suao_gsg;
1757         CLOSE c_gsg2;
1758         RETURN NULL;
1759       ELSE
1760         p_grading_schema_cd := v_suao_trans_grading_schema_cd;
1761         p_gs_version_number := v_suao_trans_version_number;
1762         p_grade := v_suao_trans_grade;
1763         CLOSE c_suao_gsg;
1764         CLOSE c_gsg2;
1765         RETURN v_gsg2_s_result_type;
1766       END IF;
1767     END IF;
1768   END IF;
1769 EXCEPTION
1770   WHEN OTHERS THEN
1771     IF (c_sua%ISOPEN) THEN
1772       CLOSE c_sua;
1773     END IF;
1774     IF (c_suao_gsg%ISOPEN) THEN
1775       CLOSE c_suao_gsg;
1776     END IF;
1777     IF (c_gsg2%ISOPEN) THEN
1778       CLOSE c_gsg2;
1779     END IF;
1780     RAISE;
1781 END;
1782 END assp_get_sua_rel_grade;
1783 
1784 
1785 FUNCTION assp_get_sua_rel_marks(
1786   p_person_id IN NUMBER ,
1787   p_course_cd IN VARCHAR2 ,
1788   p_unit_cd IN VARCHAR2 ,
1789   p_cal_type IN VARCHAR2 ,
1790   p_ci_sequence_number IN NUMBER ,
1791   p_unit_attempt_status IN VARCHAR2 ,
1792   p_finalised_ind IN VARCHAR2 ,
1793   p_grading_schema_cd OUT NOCOPY VARCHAR2 ,
1794   p_gs_version_number OUT NOCOPY NUMBER ,
1795   p_grade OUT NOCOPY VARCHAR2 ,
1796   p_uoo_id IN  NUMBER )
1797 RETURN NUMBER IS
1798     gv_other_detail   VARCHAR2(255);
1799 BEGIN -- assp_get_sua_grade
1800   -- This is an enrolments module.
1801   -- It gets the grade of a student IGS_PS_UNIT attempt within a IGS_PS_COURSE code.
1802   -- This routine will determine the appropriate grade (and its matching
1803   -- result type) and return them. If no grade is found NULL will be
1804   -- returned (and output parameters will be NULL).
1805   -- IGS_GE_NOTE: This routine handles DUPLICATE IGS_PS_UNIT attempts by searching for
1806   -- the 'source' IGS_PS_UNIT attempt and retrieving its grade.
1807   -- Note2: If the p_finalised_ind is set then only finalised grades will
1808   -- be returned.
1809 DECLARE
1810   cst_completed CONSTANT  VARCHAR2(10) := 'COMPLETED';
1811   cst_discontin CONSTANT  VARCHAR2(10) := 'DISCONTIN';
1812   cst_duplicate CONSTANT  VARCHAR2(10) := 'DUPLICATE';
1813   cst_enrolled  CONSTANT  VARCHAR2(10) := 'ENROLLED';
1814   v_course_cd     IGS_EN_SU_ATTEMPT.course_cd%TYPE;
1815   v_finalised_ind     VARCHAR2(1);
1816   v_sua_course_cd     IGS_EN_SU_ATTEMPT.course_cd%TYPE;
1817   v_gsg_grading_schema_cd   IGS_AS_GRD_SCH_GRADE.grading_schema_cd%TYPE;
1818   v_gsg_version_number    IGS_AS_GRD_SCH_GRADE.version_number%TYPE;
1819   v_gsg_grade     IGS_AS_GRD_SCH_GRADE.grade%TYPE;
1820   v_gsg_s_result_type   IGS_AS_GRD_SCH_GRADE.s_result_type%TYPE;
1821   v_suao_trans_grading_schema_cd
1822           IGS_AS_SU_STMPTOUT.translated_grading_schema_cd%TYPE;
1823   v_suao_trans_version_number
1824           IGS_AS_SU_STMPTOUT.translated_version_number%TYPE;
1825   v_suao_trans_grade    IGS_AS_SU_STMPTOUT.translated_grade%TYPE;
1826   v_gsg2_s_result_type    IGS_AS_GRD_SCH_GRADE.s_result_type%TYPE;
1827   v_marks       IGS_AS_SU_STMPTOUT.mark%TYPE;
1828   CURSOR c_sua (
1829     cp_person_id    IGS_EN_SU_ATTEMPT.person_id%TYPE,
1830     cp_unit_cd    IGS_EN_SU_ATTEMPT.unit_cd%TYPE,
1831     cp_cal_type   IGS_EN_SU_ATTEMPT.cal_type%TYPE,
1832     cp_ci_sequence_number IGS_EN_SU_ATTEMPT.ci_sequence_number%TYPE,
1833     cp_uoo_id               IGS_EN_SU_ATTEMPT.uoo_id%TYPE
1834     ) IS
1835     SELECT  sut.transfer_course_cd
1836     FROM  IGS_PS_STDNT_UNT_TRN  sut,
1837       IGS_EN_SU_ATTEMPT sua
1838     WHERE sut.person_id     = cp_person_id AND
1839       sua.person_id     = sut.person_id AND
1840       sut.uoo_id    = cp_uoo_id AND
1841       sua.uoo_id    = sut.uoo_id AND
1842       sua.course_cd = sut.transfer_course_cd AND
1843       sua.unit_attempt_status IN (cst_completed, cst_discontin)
1844     ORDER BY sua.unit_attempt_status;
1845   CURSOR c_suao_gsg (
1846     cp_person_id    IGS_EN_SU_ATTEMPT.person_id%TYPE,
1847     c_v_course_cd   IGS_EN_SU_ATTEMPT.course_cd%TYPE,
1848     cp_unit_cd    IGS_EN_SU_ATTEMPT.unit_cd%TYPE,
1849     cp_cal_type   IGS_EN_SU_ATTEMPT.cal_type%TYPE,
1850     cp_ci_sequence_number IGS_EN_SU_ATTEMPT.ci_sequence_number%TYPE,
1851     c_v_finalised_ind VARCHAR2,
1852     cp_uoo_id               IGS_EN_SU_ATTEMPT.uoo_id%TYPE
1853     ) IS
1854     SELECT    gsg.grading_schema_cd,
1855         gsg.version_number,
1856         gsg.grade,
1857         gsg.s_result_type,
1858         suao.translated_grading_schema_cd,
1859         suao.translated_version_number,
1860         suao.translated_grade ,
1861         suao.mark
1862     FROM    IGS_AS_SU_STMPTOUT  suao,
1863         IGS_AS_GRD_SCH_GRADE  gsg
1864     WHERE suao.person_id      = cp_person_id AND
1865         suao.course_cd      = c_v_course_cd AND
1866         suao.uoo_id             = cp_uoo_id AND
1867         suao.finalised_outcome_ind
1868                 LIKE DECODE(c_v_finalised_ind, 'Y', 'Y', '%') AND
1869         suao.grading_schema_cd    = gsg.grading_schema_cd AND
1870         suao.version_number     = gsg.version_number AND
1871         suao.grade      = gsg.grade AND
1872                 nvl(suao.RELEASE_DATE ,sysdate+10) <=sysdate
1873     ORDER BY  outcome_dt DESC;    -- will put the newest date first.
1874   CURSOR c_gsg2 IS
1875     SELECT  gsg2.s_result_type
1876     FROM  IGS_AS_GRD_SCH_GRADE gsg2
1877     WHERE gsg2.grading_schema_cd  = v_suao_trans_grading_schema_cd AND
1878       gsg2.version_number = v_suao_trans_version_number AND
1879       gsg2.grade    = v_suao_trans_grade;
1880 BEGIN
1881   p_grading_schema_cd := NULL;
1882   p_gs_version_number := NULL;
1883   p_grade := NULL;
1884   -- Depending on the status of the IGS_PS_UNIT attempt, set the grade search criteria.
1885   IF (p_unit_attempt_status = cst_duplicate) THEN
1886     -- Locate the original IGS_PS_UNIT attempt from which the grade was sourced.
1887     -- This will use IGS_PS_STDNT_UNT_TRN details created as a result of
1888     -- a IGS_PS_COURSE transfer
1889     OPEN  c_sua(
1890         p_person_id,
1891         p_unit_cd,
1892         p_cal_type,
1893         p_ci_sequence_number,
1894         p_uoo_id );
1895     FETCH c_sua INTO  v_sua_course_cd;
1896     IF (c_sua%NOTFOUND) THEN
1897       CLOSE c_sua;
1898       RETURN NULL;
1899     ELSE
1900       v_course_cd := v_sua_course_cd;
1901     END IF;
1902     CLOSE c_sua;
1903   ELSIF (p_unit_attempt_status = cst_completed OR
1904       p_unit_attempt_status = cst_discontin OR
1905       (p_finalised_ind = 'N' and p_unit_attempt_status = cst_enrolled)) THEN
1906     -- Use the parameter IGS_PS_COURSE code
1907     v_course_cd := p_course_cd;
1908   END IF;
1909   -- Search for the latest grade against the student IGS_PS_UNIT attempt
1910   OPEN  c_suao_gsg(
1911       p_person_id,
1912       v_course_cd,
1913       p_unit_cd,
1914       p_cal_type,
1915       p_ci_sequence_number,
1916       p_finalised_ind,
1917                         p_uoo_id );
1918   FETCH c_suao_gsg  INTO  v_gsg_grading_schema_cd,
1919           v_gsg_version_number,
1920           v_gsg_grade,
1921           v_gsg_s_result_type,
1922           v_suao_trans_grading_schema_cd,
1923           v_suao_trans_version_number,
1924           v_suao_trans_grade,
1925           v_marks;
1926   IF (c_suao_gsg%NOTFOUND) THEN
1927     CLOSE c_suao_gsg;
1928     RETURN NULL;
1929   ELSE
1930     RETURN v_marks;
1931   END IF;
1932 EXCEPTION
1933   WHEN OTHERS THEN
1934     IF (c_sua%ISOPEN) THEN
1935       CLOSE c_sua;
1936     END IF;
1937     IF (c_suao_gsg%ISOPEN) THEN
1938       CLOSE c_suao_gsg;
1939     END IF;
1940     IF (c_gsg2%ISOPEN) THEN
1941       CLOSE c_gsg2;
1942     END IF;
1943     RAISE;
1944 END;
1945 END assp_get_sua_rel_marks;
1946 
1947  FUNCTION assp_get_ai_ref(
1948             usaii in igs_ps_unitass_item.unit_section_ass_item_id%type,
1949             uaii in igs_as_unitass_item.unit_ass_item_id%type
1950  )
1951  RETURN VARCHAR2 IS
1952  BEGIN
1953      DECLARE
1954       CURSOR c_ref_ps (usaid igs_ps_unitass_item.unit_section_ass_item_id%TYPE)IS
1955       SELECT reference, release_date
1956       FROM   igs_ps_unitass_item
1957       WHERE  unit_section_ass_item_id = usaid;
1958       CURSOR c_ref_as (uaid igs_as_unitass_item.unit_ass_item_id%TYPE)IS
1959       SELECT reference, release_date
1960       FROM   igs_as_unitass_item
1961       WHERE  unit_ass_item_id = uaid;
1962       v_ref c_ref_as%ROWTYPE;
1963 
1964   BEGIN
1965     IF usaii IS NOT NULL  THEN
1966             OPEN c_ref_ps(usaii);
1967             FETCH c_ref_ps INTO v_ref;
1968             CLOSE c_ref_ps;
1969     ELSIF uaii IS NOT NULL THEN
1970             OPEN c_ref_as(uaii);
1971             FETCH c_ref_as INTO v_ref;
1972             CLOSE c_ref_as;
1973     END IF;
1974     RETURN v_ref.reference;
1975   END;
1976   EXCEPTION
1977     WHEN OTHERS THEN
1978       RAISE;
1979   END assp_get_ai_ref;
1980 
1981    FUNCTION assp_get_ai_reldate(
1982             usaii in igs_ps_unitass_item.unit_section_ass_item_id%type,
1983             uaii in igs_as_unitass_item.unit_ass_item_id%type
1984  )
1985  RETURN DATE IS
1986  BEGIN
1987      DECLARE
1988       CURSOR c_ref_ps (usaid igs_ps_unitass_item.unit_section_ass_item_id%TYPE)IS
1989       SELECT reference, release_date
1990       FROM   igs_ps_unitass_item
1991       WHERE  unit_section_ass_item_id = usaid;
1992       CURSOR c_ref_as (uaid igs_as_unitass_item.unit_ass_item_id%TYPE)IS
1993       SELECT reference, release_date
1994       FROM   igs_as_unitass_item
1995       WHERE  unit_ass_item_id = uaid;
1996       v_ref c_ref_as%ROWTYPE;
1997 
1998   BEGIN
1999     IF usaii IS NOT NULL  THEN
2000             OPEN c_ref_ps(usaii);
2001             FETCH c_ref_ps INTO v_ref;
2002             CLOSE c_ref_ps;
2003     ELSIF uaii IS NOT NULL THEN
2004             OPEN c_ref_as(uaii);
2005             FETCH c_ref_as INTO v_ref;
2006             CLOSE c_ref_as;
2007     END IF;
2008     RETURN v_ref.release_date;
2009   END;
2010   EXCEPTION
2011     WHEN OTHERS THEN
2012       RAISE;
2013   END assp_get_ai_reldate;
2014 
2015 END IGS_AS_GEN_003 ;