DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGS_AS_CALC_AWARD_MARK

Source


1 PACKAGE BODY IGS_AS_CALC_AWARD_MARK AS
2 /* $Header: IGSAS57B.pls 120.5 2006/07/31 07:33:11 ijeddy ship $ */
3   /*************************************************************
4   Created By : smanglm
5   Date Created on : 10-Oct-2003
6   Purpose : This package is created as part iof Summary Measurement
7             of attainment build.
8             This will have program unit to calculate
9             unit level marks,
10             award marks and honors level.
11   Change History
12   Who             When            What
13   Nalin Kumar     10-Feb-2004     Modified the fn_calc_unit_lvl_mark function to fix Bug# 3427366
14   Imran Jeddy     15-Apr-2005     Bug 4281818, Created a new function chk_if_excluded_unit.
15                                   It checks if a given uoo_id, unit_cd have the reference_cd_type
16                                   of SUMMEAS attached. It returns FALSE if its not and TRUE if it is.
17                                   This Check is used in the following cursors:
18                                    1. c_avail_cp in the function get_avail_cp.
19                                    2. Cursors c_total_unt_lvl_cp_alt, REF CURSORS l_stmt_cp_based and
20                                       l_stmt_priority_based and in Cursor c_unit_lvl_mark_wo_setup
21                                       in function fn_calc_unit_lvl_mark
22    Jitendra	  15-Jun-2005      Changed function fn_calc_unit_lvl_mark for
23                                    Transfer Evaluation UI Build.
24    swaghmar	  16-Jan-2006	   Bug# 4951054 - Added check for disabling the UI's
25 
26   (reverse chronological order - newest change first)
27   ***************************************************************/
28 
29 
30 -- below are some private utilities program units, which will be
31 -- called by the main public program units
32 
33 -- ===============Utilities Method Section Begins================
34 
35 FUNCTION chk_if_excluded_unit (p_uoo_id           igs_en_su_attempt_all.uoo_id%TYPE,
36                                p_unit_cd          igs_en_su_attempt_all.unit_cd%TYPE,
37                                p_version_number   igs_en_su_attempt_all.version_number%TYPE)
38 RETURN VARCHAR2
39 IS
40 CURSOR C1 (cp_uoo_id           igs_en_su_attempt_all.uoo_id%TYPE,
41            cp_unit_cd          igs_en_su_attempt_all.unit_cd%TYPE,
42            cp_version_number   igs_en_su_attempt_all.version_number%TYPE)
43 IS
44         SELECT 'X'
45           FROM igs_ps_usec_ref_cd refcd,
46                igs_ps_usec_ref usecref,
47                igs_ge_ref_cd_type rct
48          WHERE usecref.uoo_id = cp_uoo_id
49            AND usecref.unit_section_reference_id = refcd.unit_section_reference_id
50            AND refcd.reference_code_type = rct.reference_cd_type
51            AND rct.s_reference_cd_type = 'SUMMEAS'
52         UNION
53         SELECT 'X'
54           FROM igs_ps_unit_ref_cd urc, igs_ge_ref_cd_type rct
55          WHERE urc.unit_cd = cp_unit_cd
56            AND urc.version_number = cp_version_number
57            AND urc.reference_cd_type = rct.reference_cd_type
58            AND rct.s_reference_cd_type = 'SUMMEAS'
59            AND NOT EXISTS ( SELECT refcd.reference_code_type
60                               FROM igs_ps_usec_ref_cd refcd,
61                                    igs_ps_usec_ref usecref,
62                                    igs_ps_unit_ofr_opt_all opt,
63                                    igs_ge_ref_cd_type rct
64                              WHERE usecref.uoo_id = cp_uoo_id
65                                AND usecref.unit_section_reference_id =
66                                                        refcd.unit_section_reference_id
67                                AND refcd.reference_code_type = rct.reference_cd_type
68                                AND rct.s_reference_cd_type = 'SUMMEAS')
69         UNION
70         SELECT 'X'
71           FROM igs_ps_us_req_ref_cd refcd,
72                igs_ps_usec_ref usecref,
73                igs_ps_unit_ofr_opt_all opt,
74                igs_ge_ref_cd_type rct
75          WHERE usecref.uoo_id = cp_uoo_id
76            AND usecref.unit_section_reference_id = refcd.unit_section_reference_id
77            AND refcd.reference_cd_type = rct.reference_cd_type
78            AND rct.s_reference_cd_type = 'SUMMEAS'
79         UNION
80         SELECT 'X'
81           FROM igs_ps_unitreqref_cd urc, igs_ge_ref_cd_type rct
82          WHERE urc.unit_cd = cp_unit_cd
83            AND urc.version_number = cp_version_number
84            AND urc.reference_cd_type = rct.reference_cd_type
85            AND rct.s_reference_cd_type = 'SUMMEAS'
86            AND NOT EXISTS ( SELECT refcd.reference_cd_type
87                             FROM igs_ps_us_req_ref_cd refcd,
88                                      igs_ps_usec_ref usecref,
89                                      igs_ps_unit_ofr_opt_all opt,
90                                      igs_ge_ref_cd_type rct
91                                WHERE usecref.uoo_id = cp_uoo_id
92                                  AND usecref.unit_section_reference_id =
93                                                          refcd.unit_section_reference_id
94                                  AND refcd.reference_cd_type = rct.reference_cd_type
95                                  AND rct.s_reference_cd_type = 'SUMMEAS');
96 
97         temp VARCHAR2(1);
98 BEGIN
99         OPEN c1(p_uoo_id,p_unit_cd,p_version_number);
100         FETCH c1 INTO temp;
101         IF c1%FOUND THEN
102                 RETURN 'FALSE';
103         ELSE
104                 RETURN 'TRUE';
105         END IF;
106         CLOSE c1;
107 END chk_if_excluded_unit;
108 
109 FUNCTION get_mark (p_grading_schema_cd igs_as_su_stmptout.grading_schema_cd%TYPE,
110                    p_gs_version_number igs_as_su_stmptout.version_number%TYPE,
111                    p_grade             igs_as_su_stmptout.grade%TYPE)
112 RETURN NUMBER
113 IS
114 
115   -- cursor to get amrk from outcome table
116      CURSOR c_mark (cp_grading_schema_cd igs_as_su_stmptout.grading_schema_cd%TYPE,
117                     cp_gs_version_number igs_as_su_stmptout.version_number%TYPE,
118                     cp_grade             igs_as_su_stmptout.grade%TYPE) IS
119             SELECT upper_mark_range
120             FROM   igs_as_grd_sch_grade
121             WHERE  grading_schema_cd = cp_grading_schema_cd
122             AND    version_number = cp_gs_version_number
123             AND    grade = cp_grade;
124      l_mark igs_as_grd_sch_grade.upper_mark_range%TYPE;
125 
126 BEGIN
127   l_mark := NULL;
128   -- get the mark
129   OPEN c_mark (p_grading_schema_cd,
130                p_gs_version_number,
131                p_grade);
132   FETCH c_mark INTO l_mark;
133   CLOSE c_mark;
134   RETURN l_mark;
135 END get_mark;
136 
137 
138 FUNCTION get_unit_ver (p_uoo_id igs_ps_unit_ofr_opt.uoo_id%TYPE)
139 RETURN NUMBER
140 IS
141    -- cursor to get the unit version number
142       CURSOR c_unit_ver (cp_uoo_id igs_ps_unit_ofr_opt.uoo_id%TYPE) IS
143              SELECT version_number
144        FROM   igs_ps_unit_ofr_opt
145        WHERE  uoo_id = cp_uoo_id;
146       l_unit_ver igs_ps_unit_ofr_opt.version_number%TYPE := 1;
147 
148 BEGIN
149      OPEN c_unit_ver (p_uoo_id);
150      FETCH c_unit_ver INTO l_unit_ver;
151      CLOSE c_unit_ver;
152      RETURN l_unit_ver;
153 END get_unit_ver;
154 
155 FUNCTION get_earned_cp (p_person_id       igs_as_su_stmptout.person_id%TYPE,
156                         p_course_cd       igs_as_su_stmptout.course_cd%TYPE,
157                         p_unit_cd         igs_as_su_stmptout.unit_cd%TYPE,
158                         p_version_number  igs_ps_unit_ver.version_number%TYPE,
159                         p_unit_attempt_status igs_en_su_attempt.unit_attempt_status%TYPE,
160                         p_teach_cal_type  igs_ca_inst.cal_type%TYPE,
161                         p_teach_ci_sequence_number igs_ca_inst.sequence_number%TYPE,
162                         p_uoo_id          igs_ps_unit_ofr_opt.uoo_id%TYPE,
163                         p_override_achievable_cp NUMBER DEFAULT NULL,
164                         p_override_enrolled_cp   NUMBER DEFAULT NULL)
165 RETURN NUMBER IS
166     -- cursor to get the cp defined at sua
167     CURSOR c_sua_cp (cp_uoo_id igs_ps_unit_ofr_opt.uoo_id%TYPE,
168                      cp_unit_cd igs_ps_unit_ver.unit_cd%TYPE,
169                      cp_version_number igs_ps_unit_ver.version_number%TYPE) IS
170            SELECT NVL(uc.achievable_credit_points,
171                       NVL(uv.achievable_credit_points,
172                           NVL(p_override_enrolled_cp,
173                               NVL(uc.enrolled_credit_points,uv.enrolled_credit_points
174                                  )
175                              )
176                          )
177                      ) sua_cp
178            FROM  igs_ps_unit_ver uv,
179                  igs_ps_unit_ofr_opt uoo,
180                  igs_ps_usec_cps uc
181            WHERE uoo.uoo_id = cp_uoo_id
182            AND   uoo.uoo_id = uc.uoo_id(+)
183            AND   uv.unit_cd = cp_unit_cd
184            AND   uv.version_number = cp_version_number;
185 
186     l_earned_cp   NUMBER;
187     l_result_type VARCHAR2(200);
188 
189 
190     -- OUT variables for the assp_get_sua_outcomes
191     l_outcome_dt           igs_as_su_stmptout.outcome_dt%TYPE;
192     l_grading_schema_cd    igs_as_su_stmptout.grading_schema_cd%TYPE;
193     l_gs_version_number    igs_as_su_stmptout.version_number%TYPE;
194     l_grade                igs_as_su_stmptout.grade%TYPE;
195     l_mark                 igs_as_su_stmptout.mark%TYPE;
196     l_origin_course_cd     igs_ps_ver.course_cd%TYPE;
197 
198 BEGIN
199     IF p_override_achievable_cp IS NULL THEN
200        OPEN c_sua_cp (p_uoo_id,
201                       p_unit_cd,
202                       p_version_number);
203        FETCH c_sua_cp INTO l_earned_cp;
204        CLOSE c_sua_cp;
205      ELSE l_earned_cp := p_override_achievable_cp;
206     END IF;
207 
208     -- Use the repeat functionality to determine whether the
209     -- CP is to be returned or not
210 
211     /*
212 
213  OPEN ISSUE
214 
215     */
216 
217     -- check the outcome for the unit attempt
218     l_result_type := igs_as_gen_003.assp_get_sua_outcome
219                      (
220                         p_person_id            => p_person_id,
221                         p_course_cd            => p_course_cd,
222                         p_unit_cd              => p_unit_cd,
223                         p_cal_type             => p_teach_cal_type,
224                         p_ci_sequence_number   => p_teach_ci_sequence_number,
225                         p_unit_attempt_status  => p_unit_attempt_status,
226                         p_finalised_ind        => 'Y',
227                         p_outcome_dt           => l_outcome_dt,
228                         p_grading_schema_cd    => l_grading_schema_cd,
229                         p_gs_version_number    => l_gs_version_number,
230                         p_grade                => l_grade,
231                         p_mark                 => l_mark,
232                         p_origin_course_cd     => l_origin_course_cd,
233                         p_uoo_id               => p_uoo_id,
234 			p_use_released_ind     => 'N'
235                      );
236     IF l_result_type = 'PASS' THEN
237        RETURN l_earned_cp;
238     ELSE  -- Result type is in WITHDRAWN, FAIL, AUDIT, INCOMP
239        RETURN NULL;
240     END IF;
241 
242 END get_earned_cp;
243 
244 FUNCTION get_avail_cp (p_person_id       igs_as_su_stmptout.person_id%TYPE,
245                        p_course_cd       igs_as_su_stmptout.course_cd%TYPE,
246                        p_core_ind_code   igs_pr_ul_mark_dtl.core_indicator_code%TYPE,
247                        p_unit_level      igs_pr_ul_mark_cnfg.unit_level%TYPE)
248 RETURN NUMBER
249 IS
250   -- cursor to get the sum of available cp
251      CURSOR c_avail_cp (cp_person_id       igs_as_su_stmptout.person_id%TYPE,
252                         cp_course_cd       igs_as_su_stmptout.course_cd%TYPE,
253                         cp_core_ind_code   igs_pr_ul_mark_dtl.core_indicator_code%TYPE,
254                         cp_unit_level      igs_pr_ul_mark_cnfg.unit_level%TYPE) IS
255             SELECT SUM(
256                         get_earned_cp
257                           (
258                             sua.person_id,
259                             sua.course_cd,
260                             sua.unit_cd,
261                             sua.version_number,
262                             sua.unit_attempt_status,
263                             sua.cal_type,
264                             sua.ci_sequence_number,
265                             sua.uoo_id,
266                             sua.override_achievable_cp,
267                             sua.override_enrolled_cp
268                           )
269                        ) avail_cp
270              FROM igs_en_su_attempt_all sua,
271                   igs_ps_unit_lvl_all ul ,
272                   igs_ps_unit_ver_all uv
273             WHERE sua.person_id = cp_person_id
274             AND   sua.course_cd = p_course_cd
275             AND   NVL(sua.core_indicator_code, 'ELECTIVE')  =   cp_core_ind_code  --Core indicator filter
276             AND   sua.unit_cd = uv.unit_cd
277             AND   sua.version_number = uv.version_number
278             AND   sua.course_cd = ul.course_cd(+)
279             AND   sua.unit_cd = ul.unit_cd(+)
280             AND   sua.version_number = ul.version_number(+)
281             AND   NVL(UL.UNIT_LEVEL, UV.UNIT_LEVEL) = cp_unit_level
282             AND   chk_if_excluded_unit (sua.uoo_id,sua.unit_cd,sua.version_number) = 'TRUE';
283 
284     l_avail_cp NUMBER:=0;
285 BEGIN
286     OPEN c_avail_cp (p_person_id     ,
287                      p_course_cd     ,
288                      p_core_ind_code ,
289                      p_unit_level    );
290     FETCH c_avail_cp INTO l_avail_cp;
291     CLOSE c_avail_cp;
292     RETURN l_avail_cp;
293 
294 END get_avail_cp;
295 
296 -- ================Utilities Method Section Ends=================
297 
298 FUNCTION fn_calc_unit_lvl_mark (
299    p_person_id       IN              NUMBER,
300    p_course_cd       IN              VARCHAR2,
301    p_unit_level      IN              VARCHAR2,
302    x_return_status   OUT NOCOPY      VARCHAR2,
303    x_msg_data        OUT NOCOPY      VARCHAR2,
304    x_msg_count       OUT NOCOPY      NUMBER
305 )
306    RETURN NUMBER
307 IS
308    /*************************************************************
309    Created By : smanglm
310    Date Created on : 13-Oct-2003
311    Purpose : This package is created as part iof Summary Measurement
312              of attainment build.
313              This program unit calculate the unit level mark for the
314              given
315              p_person_id  -- name of the student
316              p_course_cd  -- program for which the calculation is to
317                              be done
318              p_unit_level -- unit level for which the mark is being
319                              calcualted
320    Change History
321    Who             When            What
322    Nalin Kumar     10-Feb-2004     Modified the fn_calc_unit_lvl_mark function to fix Bug# 3427366
323 
324    (reverse chronological order - newest change first)
325    ***************************************************************/
326 
327    -- ref type cursor
328    TYPE ref_cur IS REF CURSOR;
329 
330    c_cp_based                   ref_cur;
331    c_priority_based             ref_cur;
332    l_unit_lvl_mark              NUMBER;
333    l_total_unit_lvl_cp          NUMBER;
334    l_total_unit_lvl_cp_config   NUMBER;
335    exlude_cp                    NUMBER;
336 
337    -- CURSOR to get the COURSE CODE version NUMBER
338    CURSOR c_course_version_number (
339       cp_person_id   igs_en_stdnt_ps_att.person_id%TYPE,
340       cp_course_cd   igs_en_stdnt_ps_att.course_cd%TYPE
341    )
342    IS
343       SELECT version_number
344         FROM igs_en_stdnt_ps_att
345        WHERE person_id = cp_person_id AND course_cd = cp_course_cd;
346 
347    l_course_version_number      igs_en_stdnt_ps_att.version_number%TYPE;
348 
349    -- CURSOR to get the total unit level
350    CURSOR c_total_unt_lvl_cp (
351       cp_unit_level       igs_pr_ul_mark_cnfg.unit_level%TYPE,
352       cp_course_cd        igs_pr_ul_mark_cnfg.course_cd%TYPE,
353       cp_version_number   igs_pr_ul_mark_cnfg.version_number%TYPE
354    )
355    IS
356       SELECT total_unit_level_credits, mark_config_id, selection_method_code
357         FROM igs_pr_ul_mark_cnfg umc
358        WHERE umc.unit_level = cp_unit_level
359          AND (   (    umc.course_cd = cp_course_cd
360                   AND umc.version_number = cp_version_number
361                  )
362               OR (    umc.course_cd IS NULL
363                   AND umc.version_number IS NULL
364                   AND NOT EXISTS ( SELECT 1
365                                      FROM igs_pr_ul_mark_cnfg umc_in
366                                     WHERE umc_in.unit_level = cp_unit_level
367                                       AND umc_in.course_cd = cp_course_cd
368                                       AND umc_in.version_number =
369                                                             cp_version_number)
370                  )
371              );
372 
373    l_mark_config_id             igs_pr_ul_mark_cnfg.mark_config_id%TYPE;
374    l_selection_method_code      igs_pr_ul_mark_cnfg.selection_method_code%TYPE;
375 
376    -- CURSOR to get the sum of earned cp in case total unit_level_credits is
377    -- not available from the set up table
378    CURSOR c_total_unt_lvl_cp_alt (
379       cp_unit_level   igs_pr_ul_mark_cnfg.unit_level%TYPE,
380       cp_course_cd    igs_pr_ul_mark_cnfg.course_cd%TYPE,
381       cp_person_id    igs_en_su_attempt.person_id%TYPE,
382       cp_include      VARCHAR2
383    )
384    IS
385       SELECT SUM (
386                 get_earned_cp (
387                    sua.person_id,
388                    sua.course_cd,
389                    sua.unit_cd,
390                    sua.version_number,
391                    sua.unit_attempt_status,
392                    sua.cal_type,
393                    sua.ci_sequence_number,
394                    sua.uoo_id,
395                    sua.override_achievable_cp,
396                    sua.override_enrolled_cp
397                 )
398              ) total_cp
399         FROM igs_en_su_attempt_all sua,
400              igs_ps_unit_lvl_all ul,
401              igs_ps_unit_ver_all uv
402        WHERE sua.person_id = cp_person_id
403          AND sua.course_cd = cp_course_cd
404          AND sua.unit_cd = uv.unit_cd
405          AND sua.version_number = uv.version_number
406          AND sua.course_cd = ul.course_cd(+)
407          AND sua.unit_cd = ul.unit_cd(+)
408          AND sua.version_number = ul.version_number(+)
409          AND NVL (ul.unit_level, uv.unit_level) = cp_unit_level
410          AND chk_if_excluded_unit (
411                 sua.uoo_id,
412                 sua.unit_cd,
413                 sua.version_number
414              ) = cp_include;
415 
416    -- CURSOR to get cnfg details
417    CURSOR c_ul_mark_dtl (
418       cp_mark_config_id   igs_pr_ul_mark_dtl.mark_config_id%TYPE
419    )
420    IS
421       SELECT   core_indicator_code, total_credits, required_flag,
422                priority_num, unit_selection_code
423           FROM igs_pr_ul_mark_dtl
424          WHERE mark_config_id = cp_mark_config_id
425       ORDER BY priority_num ASC;
426 
427    rec_ul_mark_dtl              c_ul_mark_dtl%ROWTYPE;
428    -- define the local variables to store the above values
429    p1_core_indicator_code       igs_pr_ul_mark_dtl.core_indicator_code%TYPE;
430    p1_total_credits             igs_pr_ul_mark_dtl.total_credits%TYPE;
431    p1_required_flag             igs_pr_ul_mark_dtl.required_flag%TYPE;
432    p1_priority_num              igs_pr_ul_mark_dtl.priority_num%TYPE;
433    p1_unit_selection_code       igs_pr_ul_mark_dtl.unit_selection_code%TYPE;
434    p2_core_indicator_code       igs_pr_ul_mark_dtl.core_indicator_code%TYPE;
435    p2_total_credits             igs_pr_ul_mark_dtl.total_credits%TYPE;
436    p2_required_flag             igs_pr_ul_mark_dtl.required_flag%TYPE;
437    p2_priority_num              igs_pr_ul_mark_dtl.priority_num%TYPE;
438    p2_unit_selection_code       igs_pr_ul_mark_dtl.unit_selection_code%TYPE;
439    p3_core_indicator_code       igs_pr_ul_mark_dtl.core_indicator_code%TYPE;
440    p3_total_credits             igs_pr_ul_mark_dtl.total_credits%TYPE;
441    p3_required_flag             igs_pr_ul_mark_dtl.required_flag%TYPE;
442    p3_priority_num              igs_pr_ul_mark_dtl.priority_num%TYPE;
443    p3_unit_selection_code       igs_pr_ul_mark_dtl.unit_selection_code%TYPE;
444    -- following local variable to manipulate the derived cp at each unit level
445    p1_avail_cp                  NUMBER                                      := 0;
446    p1_config_cp                 NUMBER                                      := 0;
447    p1_required_cp               NUMBER                                      := 0;
448    p1_excess_cp                 NUMBER                                      := 0;
449    p1_final_derived_cp          NUMBER                                      := 0;
450    p2_avail_cp                  NUMBER                                      := 0;
451    p2_config_cp                 NUMBER                                      := 0;
452    p2_required_cp               NUMBER                                      := 0;
453    p2_excess_cp                 NUMBER                                      := 0;
454    p2_final_derived_cp          NUMBER                                      := 0;
455    p3_avail_cp                  NUMBER                                      := 0;
456    p3_config_cp                 NUMBER                                      := 0;
457    p3_required_cp               NUMBER                                      := 0;
458    p3_excess_cp                 NUMBER                                      := 0;
459    p3_final_derived_cp          NUMBER                                      := 0;
460 
461    -- cursor to get the config details based on mark_config_id
462    CURSOR c_cnfg_dtls (
463       cp_mark_config_id   igs_pr_ul_mark_dtl.mark_config_id%TYPE
464    )
465    IS
466       SELECT   core_indicator_code, total_credits, required_flag,
467                priority_num, unit_selection_code
468           FROM igs_pr_ul_mark_dtl
469          WHERE mark_config_id = cp_mark_config_id
470       ORDER BY priority_num ASC;
471 
472    /* jhanda */
473    CURSOR c_av_ulvl_marks (
474       cp_person_id    igs_as_su_stmptout_all.person_id%TYPE,
475       cp_course_cd    igs_as_su_stmptout_all.course_cd%TYPE,
476       cp_unit_level   igs_ps_unit_lvl.unit_level%TYPE
477    )
478    IS
479       SELECT NVL(SUM (NVL (ulvl.unit_level_mark, 0)),0) avstdmarks,
480              SUM (NVL (ulvl.credit_points, 0)) avstdcp
481         FROM igs_av_stnd_unit_lvl_all ulvl, igs_av_adv_standing_all advstd
482        WHERE ulvl.person_id = advstd.person_id
483          AND ulvl.as_course_cd = advstd.course_cd
484          AND ulvl.as_version_number = advstd.version_number
485          AND ulvl.exemption_institution_cd = advstd.exemption_institution_cd
486          AND advstd.person_id = cp_person_id
487          AND advstd.course_cd = cp_course_cd
488          AND ulvl.unit_level = cp_unit_level
489          AND ulvl.s_adv_stnd_granting_status = 'GRANTED';
490    l_stmt_cp_based              VARCHAR2 (4000)
491    :=    ' SELECT sua.unit_cd,                                               '
492       || '        sua.uoo_id,                                                '
493       || '        NVL(stmpt.mark,igs_as_calc_award_mark.get_mark             '
494       || '                      (stmpt.grading_schema_cd,                    '
495       || '                       stmpt.version_number,stmpt.grade)) mark,    '
496       || '        stmpt.grade,                                               '
497       || '        igs_as_calc_award_mark.get_earned_cp                       '
498       || '              (stmpt.person_id,stmpt.course_cd,sua.unit_cd,        '
499       || '               sua.version_number,sua.unit_attempt_status,         '
500       || '               sua.cal_type,sua.ci_sequence_number,                '
501       || '               sua.uoo_id,sua.override_achievable_cp,              '
502       || '               sua.override_enrolled_cp ) earned_cp,                '
503       || ' NVL(ul.wam_weighting,NVL( lvl.wam_weighting,1)) wam_weight '
504       || ' FROM   igs_as_su_stmptout stmpt,  igs_en_su_attempt sua ,IGS_PS_UNIT_LVL_ALL UL , IGS_PS_UNIT_VER_ALL UV , IGS_PS_UNIT_LEVEL_ALL LVL           '
505       || ' WHERE  stmpt.person_id =  :1  AND stmpt.course_cd =  :2           '
506       || ' AND    stmpt.person_id = sua.person_id                            '
507       || ' AND    stmpt.course_cd = sua.course_cd                            '
508       || ' AND    stmpt.uoo_id        = sua.uoo_id                           '
509       || ' AND     NVL(sua.core_indicator_code, ''ELECTIVE'') = :3 AND                              '
510       || ' SUA.UNIT_CD = UV.UNIT_CD AND'
511       || ' SUA.VERSION_NUMBER = UV.VERSION_NUMBER AND'
512       || ' SUA.COURSE_CD = UL.COURSE_CD(+) AND'
513       || '  SUA.UNIT_CD = UL.UNIT_CD(+) AND'
514       || '  SUA.VERSION_NUMBER = UL.VERSION_NUMBER(+) AND'
515       || '  NVL(UL.UNIT_LEVEL, UV.UNIT_LEVEL) = :4  AND '
516       || ' LVL.UNIT_LEVEL= UV.UNIT_LEVEL'
517       || '  AND MARK IS NOT NULL '
518       || 'AND   sua.uoo_id        = stmpt.uoo_id'
519       || ' AND    NVL(stmpt.mark,igs_as_calc_award_mark.get_mark             '
520       || '          (stmpt.grading_schema_cd,                                '
521       || '            stmpt.version_number,stmpt.grade)) IS NOT NULL         '
522       || ' AND    stmpt.outcome_dt     = (  SELECT max(outcome_dt)           '
523       || '        FROM igs_as_su_stmptout  suao                              '
524       || '        WHERE suao.person_id = stmpt.person_id                     '
525       || '        AND   suao.course_cd =stmpt.course_cd                      '
526       || '        AND   suao.outcome_dt = stmpt.outcome_dt                   '
527       || '        AND   suao.grading_period_cd = stmpt. grading_period_cd    '
528       || '        AND   suao.uoo_id= stmpt.uoo_id )                          '
529       || ' AND   igs_as_calc_award_mark.chk_if_excluded_unit (sua.uoo_id,sua.unit_cd,sua.version_number) = ''TRUE'' ';
530    l_stmt_cp_based_orig         VARCHAR2 (4000)               := l_stmt_cp_based;
531    l_stmt_priority_based        VARCHAR2 (4000)
532    :=    '   SELECT    sua.unit_cd,                                                       '
533       || '             sua.uoo_id,                                                        '
534       || '             NVL(suao.mark,igs_as_calc_award_mark.get_mark                      '
535       || '              (suao.grading_schema_cd,suao.version_number,suao.grade)) mark,    '
536       || '             suao.grade,                                                        '
537       || '             NVL(ul.wam_weighting,NVL( lvl.wam_weighting,1)) wam_weight,        '
538       || '             igs_as_calc_award_mark.get_earned_cp                               '
539       || '                           (suao.person_id,suao.course_cd,sua.unit_cd,          '
540       || '                            sua.version_number,sua.unit_attempt_status,         '
541       || '                            sua.cal_type,sua.ci_sequence_number,                '
542       || '                            sua.uoo_id,sua.override_achievable_cp,              '
543       || '                            sua.override_enrolled_cp ) earned_cp                '
544       || '   FROM     igs_as_su_stmptout_all suao, igs_en_su_attempt_all sua,             '
545       || '            igs_ps_unit_lvl_all ul, igs_ps_unit_ver_all uv ,                    '
546       || '            igs_ps_unit_level_all lvl                                           '
547       || '   WHERE  suao.person_id = :1           AND suao.course_cd  = :2                '
548       || '   AND    suao.person_id= sua.person_id AND suao.course_cd  = sua.course_cd     '
549       || '   AND    suao.uoo_id   = sua.uoo_id    AND NVL(sua.core_indicator_code, ''ELECTIVE'') = :3        '
550       || '   AND    sua.unit_cd   = uv.unit_cd AND sua.version_number = uv.version_number '
551       || '   AND    sua.course_cd = ul.course_cd(+) AND sua.unit_cd   = ul.unit_cd(+)     '
552       || '   AND    sua.version_number = ul.version_number(+)                             '
553       || '   AND    NVL(ul.unit_level,uv.unit_level) = :4                                 '
554       || '   AND    lvl.unit_level     = uv.unit_level                                    '
555       || '   AND    NVL(suao.mark,igs_as_calc_award_mark.get_mark                         '
556       || '          (suao.grading_schema_cd,suao.version_number,suao.grade)) IS NOT NULL  '
557       || '   AND    suao.outcome_dt     = ( SELECT max(outcome_dt)                        '
558       || '               FROM igs_as_su_stmptout_all suao2                                '
559       || '               WHERE suao2.person_id = suao.person_id                           '
560       || '               AND   suao2.course_cd = suao.course_cd                           '
561       || '               AND   suao2.grading_period_cd = suao.grading_period_cd           '
562       || '               AND   suao2.uoo_id= suao.uoo_id )                                '
563       || ' AND   igs_as_calc_award_mark.chk_if_excluded_unit (sua.uoo_id,sua.unit_cd,sua.version_number) = ''TRUE'' ';
564    l_stmt_priority_based_orig   VARCHAR2 (4000)         := l_stmt_priority_based;
565    -- local variables to store the output of the ref cursor
566    l_unit_cd                    igs_ps_unit_ver.unit_cd%TYPE;
567    l_uoo_id                     igs_ps_unit_ofr_opt.uoo_id%TYPE;
568    l_mark                       NUMBER;
569    l_grade                      igs_as_su_stmptout_all.grade%TYPE;
570    l_earned_cp                  NUMBER;
571    l_wam_weight                 igs_ps_unit_lvl.wam_weighting%TYPE;
572    /*jhanda */
573    l_advstnd_cp                 NUMBER;
574 
575    -- cursor to fetch earned cp, mark and wam when there is no setup available
576    CURSOR c_unit_lvl_mark_wo_setup (
577       cp_person_id    igs_as_su_stmptout_all.person_id%TYPE,
578       cp_course_cd    igs_as_su_stmptout_all.course_cd%TYPE,
579       cp_unit_level   igs_ps_unit_lvl.unit_level%TYPE
580    )
581    IS
582       SELECT sua.unit_cd, sua.uoo_id,
583              NVL (
584                 suao.mark,
585                 igs_as_calc_award_mark.get_mark (
586                    suao.grading_schema_cd,
587                    suao.version_number,
588                    suao.grade
589                 )
590              ) mark,
591              suao.grade,
592              NVL (ul.wam_weighting, NVL (lvl.wam_weighting, 1)) wam_weight,
593              igs_as_calc_award_mark.get_earned_cp (
594                 suao.person_id,
595                 suao.course_cd,
596                 sua.unit_cd,
597                 sua.version_number,
598                 sua.unit_attempt_status,
599                 sua.cal_type,
600                 sua.ci_sequence_number,
601                 sua.uoo_id,
602                 sua.override_achievable_cp,
603                 sua.override_enrolled_cp
604              )
605                    earned_cp
606         FROM igs_as_su_stmptout_all suao,
607              igs_en_su_attempt_all sua,
608              igs_ps_unit_lvl_all ul,
609              igs_ps_unit_ver_all uv,
610              igs_ps_unit_level_all lvl
611        WHERE suao.person_id = cp_person_id
612          AND suao.course_cd = cp_course_cd
613          AND suao.person_id = sua.person_id
614          AND suao.course_cd = sua.course_cd
615          AND suao.uoo_id = sua.uoo_id
616          AND sua.unit_cd = uv.unit_cd
617          AND sua.version_number = uv.version_number
618          AND sua.course_cd = ul.course_cd(+)
619          AND sua.unit_cd = ul.unit_cd(+)
620          AND sua.version_number = ul.version_number(+)
621          AND NVL (ul.unit_level, uv.unit_level) = cp_unit_level
622          AND lvl.unit_level = uv.unit_level
623          AND NVL (
624                 suao.mark,
625                 igs_as_calc_award_mark.get_mark (
626                    suao.grading_schema_cd,
627                    suao.version_number,
628                    suao.grade
629                 )
630              ) IS NOT NULL
631          AND suao.outcome_dt = (SELECT MAX (outcome_dt)
632                                   FROM igs_as_su_stmptout_all suao2
633                                  WHERE suao2.person_id = suao.person_id
634                                    AND suao2.course_cd = suao.course_cd
635                                    AND suao2.grading_period_cd =
636                                                        suao.grading_period_cd
637                                    AND suao2.uoo_id = suao.uoo_id)
638          AND chk_if_excluded_unit (
639                 sua.uoo_id,
640                 sua.unit_cd,
641                 sua.version_number
642              ) = 'TRUE';
643 BEGIN -- main begin
644    --Initialize the variables
645    fnd_msg_pub.initialize;
646    l_total_unit_lvl_cp_config := NULL;
647    l_total_unit_lvl_cp := 0;
648    l_unit_lvl_mark := 0;
649    l_mark_config_id := NULL;
650 
651    -- validate that all the IN parameters are passed
652    IF    p_person_id IS NULL
653       OR p_course_cd IS NULL
654       OR p_unit_level IS NULL
655    THEN
656       fnd_message.set_name ('IGS', 'IGS_PR_CALC_UNIT_LVL_PARAM_REQ');
657       igs_ge_msg_stack.ADD;
658       RAISE fnd_api.g_exc_error;
659    END IF;
660 
661    -- obtain the course version number
662    OPEN c_course_version_number (p_person_id, p_course_cd);
663    FETCH c_course_version_number INTO l_course_version_number;
664    CLOSE c_course_version_number;
665    -- check whether the set up is available or not
666    -- this cursor also serves the puprose of fetching
667    -- toal unit_level_credits,
668    -- mark_config_id, pk for the table
669    -- selection_method_code
670    OPEN c_total_unt_lvl_cp (
671       p_unit_level,
672       p_course_cd,
673       l_course_version_number
674    );
675    FETCH c_total_unt_lvl_cp INTO l_total_unit_lvl_cp_config,
676                                  l_mark_config_id,
677                                  l_selection_method_code;
678    CLOSE c_total_unt_lvl_cp;
679    /* jhanda
680       Fetch unit level advanced standing marks and cp .
681       (ijeddy) and set the adv standing marks to l_unit_lvl_mark.
682    */
683 
684    OPEN c_av_ulvl_marks (p_person_id, p_course_cd, p_unit_level);
685    FETCH c_av_ulvl_marks INTO l_unit_lvl_mark, l_advstnd_cp;
686    CLOSE c_av_ulvl_marks;
687 
688    IF l_mark_config_id IS NOT NULL
689    THEN --setup is available
690       /*
691          If the setup is available, following steps are carried out
692          1. Select the Total Unit Level Credits for a particular unit level
693          2. Select the various core unit indicators setups
694          3. Arrive at the CPs to be selected from each unit level
695          4. Select the student unit attempt outcomes based on the the setups from 1, 2 and 3
696          5. Calculate the unit level mark
697       */
698       -- 1. Select the Total Unit Level Credits for a particular unit level
699       -- this has been done at the time of setup check up
700       IF l_total_unit_lvl_cp_config IS NULL
701       THEN
702          -- obtain the sum of earned cp
703          -- The below cursor query basically tests for CP
704          -- at the sua attempt level. If this is not present,
705          -- then setup is checked for the unit section level.
706          -- If this is also not present then, the unit level
707          -- CP is taken into consideration
708          OPEN c_total_unt_lvl_cp_alt (
709             p_unit_level,
710             p_course_cd,
711             p_person_id,
712             'TRUE'
713          );
714          FETCH c_total_unt_lvl_cp_alt INTO l_total_unit_lvl_cp_config;
715          CLOSE c_total_unt_lvl_cp_alt;
716       ELSE
717          OPEN c_total_unt_lvl_cp_alt (
718             p_unit_level,
719             p_course_cd,
720             p_person_id,
721             'FALSE'
722          );
723          FETCH c_total_unt_lvl_cp_alt INTO exlude_cp;
724          CLOSE c_total_unt_lvl_cp_alt;
725          l_total_unit_lvl_cp_config :=
726                                l_total_unit_lvl_cp_config
727                              - NVL (exlude_cp, 0);
728       END IF;
729 
730       -- 2. Select the various core unit indicators setups
731       OPEN c_ul_mark_dtl (l_mark_config_id);
732 
733       LOOP
734          FETCH c_ul_mark_dtl INTO rec_ul_mark_dtl;
735          EXIT WHEN c_ul_mark_dtl%NOTFOUND;
736 
737          -- below priority_num is assumed to have values 1,2 and 3
738          IF rec_ul_mark_dtl.priority_num = 1
739          THEN
740             p1_core_indicator_code := rec_ul_mark_dtl.core_indicator_code;
741             p1_total_credits := rec_ul_mark_dtl.total_credits;
742             p1_required_flag := rec_ul_mark_dtl.required_flag;
743             p1_priority_num := rec_ul_mark_dtl.priority_num;
744             p1_unit_selection_code := rec_ul_mark_dtl.unit_selection_code;
745          ELSIF rec_ul_mark_dtl.priority_num = 2
746          THEN
747             p2_core_indicator_code := rec_ul_mark_dtl.core_indicator_code;
748             p2_total_credits := rec_ul_mark_dtl.total_credits;
749             p2_required_flag := rec_ul_mark_dtl.required_flag;
750             p2_priority_num := rec_ul_mark_dtl.priority_num;
751             p2_unit_selection_code := rec_ul_mark_dtl.unit_selection_code;
752          ELSIF rec_ul_mark_dtl.priority_num = 3
753          THEN
754             p3_core_indicator_code := rec_ul_mark_dtl.core_indicator_code;
755             p3_total_credits := rec_ul_mark_dtl.total_credits;
756             p3_required_flag := rec_ul_mark_dtl.required_flag;
757             p3_priority_num := rec_ul_mark_dtl.priority_num;
758             p3_unit_selection_code := rec_ul_mark_dtl.unit_selection_code;
759          END IF;
760       END LOOP;
761 
762       CLOSE c_ul_mark_dtl;
763 
764       -- 3. Arrive at the CPs to be selected from each unit level
765 
766       /*
767          This step is required only if the selection method is based on Credit Points.
768          If it is priority based, this step has to be skipped.
769 
770          What is being done in this step?
771 
772          In this step, the following is calculated : How much CP should be taken from
773          the students outcome table at each level. For example, if the setup states
774          that priority 1 should contribute, say, 72 cps , priority two should contribute
775          36 and priority 3 should contribute 12, but due to a shortfall in the students
776          CPs at a priority, the other priorities should compensate for this shortfall.
777          The shortfall in CPs should come from priority 1 if available, if not then it
778          should be compensated by priority 2, priority 3 depending on availibilty. Before
779          the suas are actually selected, how much each core indicator unit attempt should
780          contribute is being calculated here
781       */
782 
783       -- check whether the selection criteria is credit points or priority
784       -- based on selection_method_code as obtained by above cursor c_total_unt_lvl_cp
785 
786       IF l_selection_method_code = 'CREDITS'
787       THEN
788          -- store the sum of earned cp for each priority for the
789          -- given core_indicator code
790          p1_avail_cp := get_avail_cp (
791                            p_person_id,
792                            p_course_cd,
793                            p1_core_indicator_code,
794                            p_unit_level
795                         );
796          p2_avail_cp := get_avail_cp (
797                            p_person_id,
798                            p_course_cd,
799                            p2_core_indicator_code,
800                            p_unit_level
801                         );
802          p3_avail_cp := get_avail_cp (
803                            p_person_id,
804                            p_course_cd,
805                            p3_core_indicator_code,
806                            p_unit_level
807                         );
808          --Add advanced standing credit points to the earned credit points for
809          --each of the priority levels
810          --ijeddy, since l_advstnd_cp may be NULL, added a nvl.
811          p1_avail_cp :=   p1_avail_cp
812                         + NVL(l_advstnd_cp,0);
813          p1_config_cp := NVL (p1_total_credits, 0);
814          p2_config_cp := NVL (p2_total_credits, 0);
815          p3_config_cp := NVL (p3_total_credits, 0);
816          p1_required_cp := p1_config_cp;
817 
818          IF   NVL (p3_avail_cp, 0)
819             - NVL (p3_config_cp, 0) <= 0
820          THEN -- this section deals with shortage
821             IF p3_required_flag = 'N'
822             THEN
823                p1_required_cp :=
824                      p1_required_cp
825                    + NVL ((  p3_config_cp
826                            - p3_avail_cp
827                           ), 0);
828                p3_final_derived_cp := p3_avail_cp;
829             ELSE
830                p3_final_derived_cp := p3_avail_cp;
831             END IF;
832          ELSE -- IF p3_avail_cp - p3_config_cp < 0 THEN  i.e. this section deals with surplus
833             p3_final_derived_cp := p3_config_cp;
834             p3_excess_cp := NVL ((  p3_avail_cp
835                                   - p3_config_cp
836                                  ), 0);
837          END IF;
838 
839          IF   NVL (p2_avail_cp, 0)
840             - NVL (p2_config_cp, 0) <= 0
841          THEN
842             IF p2_required_flag = 'N'
843             THEN
844                p1_required_cp :=
845                      p1_required_cp
846                    + NVL ((  p2_config_cp
847                            - p2_avail_cp
848                           ), 0);
849                p2_final_derived_cp := p2_avail_cp;
850             ELSE
851                p2_final_derived_cp := p2_avail_cp;
852             END IF;
853          ELSE
854             p2_final_derived_cp := p2_config_cp;
855             p2_excess_cp := NVL ((  p2_avail_cp
856                                   - p2_config_cp
857                                  ), 0);
858          END IF;
859 
860          /*
861             The above section basically puts any shortfall in priorities 2 and 3 into 1.
862             The above also checks if the required indicator is checked at the priority
863             level is checked or not. If it is checked, then the compensation or rollover
864             should not occur.
865 
866             The next section tries to compensate any shortfall in priority 1 through 2 and 3.
867          */
868          IF (  p1_avail_cp
869              - p1_required_cp
870             ) < 0
871          THEN
872             IF p2_excess_cp > 0
873             THEN
874                IF (  NVL (p2_excess_cp, 0)
875                    - (NVL ((  p1_required_cp
876                             - p1_avail_cp
877                            ), 0)
878                      )
879                   ) > 0
880                THEN
881                   IF p1_required_flag = 'N'
882                   THEN
883                      p2_final_derived_cp :=
884                               p2_config_cp
885                             + (  p1_required_cp
886                                - p1_avail_cp
887                               );
888                      p1_final_derived_cp := p1_avail_cp;
889                      p3_final_derived_cp := p3_avail_cp;
890                   ELSE -- required = 'Y'
891                      p1_final_derived_cp := p1_config_cp;
892                      p2_final_derived_cp := p2_avail_cp;
893                      p1_final_derived_cp := p3_avail_cp;
894                   END IF; -- IF p1_required_flag = 'N' THEN
895                ELSE -- IF (p2_excess_cp - (p1_required_cp - p1_avail_cp)) >=0 THEN
896                   p2_final_derived_cp :=
897                                   NVL (p2_config_cp, 0)
898                                 + NVL (p2_excess_cp, 0);
899                   p1_required_cp :=
900                                 NVL (p1_required_cp, 0)
901                               - NVL (p2_excess_cp, 0);
902                   p2_final_derived_cp := p1_required_cp;
903 
904                   IF NVL (p3_excess_cp, 0) > 0
905                   THEN
906                      IF p1_required_flag = 'N'
907                      THEN
908                         IF (  NVL (p3_excess_cp, 0)
909                             - NVL ((  p1_required_cp
910                                     - p1_avail_cp
911                                    ), 0)
912                            ) > 0
913                         THEN
914                            p3_final_derived_cp :=
915                                    NVL (p3_config_cp, 0)
916                                  + (  (  NVL (p1_required_cp, 0)
917                                        - NVL (p1_avail_cp, 0)
918                                       )
919                                     - NVL (p3_excess_cp, 0)
920                                    );
921                            p1_final_derived_cp := p1_avail_cp;
922                         ELSE
923                            p1_final_derived_cp := p1_config_cp;
924                            p3_final_derived_cp := p3_config_cp;
925                         END IF;
926                      ELSE
927                         p1_final_derived_cp := p1_config_cp;
928                         p3_final_derived_cp := p3_config_cp;
929                      END IF;
930                   END IF; -- IF p3_excess_cp > 0 THEN
931                END IF; -- IF (p2_excess_cp - (p1_required_cp - p1_avail_cp)) >= THEN
932             ELSE -- IF p2_excess_cp > 0 THEN
933                IF NVL (p3_excess_cp, 0) > 0
934                THEN
935                   IF (  NVL (p3_excess_cp, 0)
936                       - (  NVL (p1_required_cp, 0)
937                          - NVL (p1_avail_cp, 0)
938                         )
939                      ) > 0
940                   THEN
941                      IF p1_required_flag = 'N'
942                      THEN
943                         p3_final_derived_cp :=   NVL (p3_config_cp, 0)
944                                                + (  (  NVL (
945                                                           p1_required_cp,
946                                                           0
947                                                        )
948                                                      - NVL (p1_avail_cp, 0)
949                                                     )
950                                                   - NVL (p3_excess_cp, 0)
951                                                  );
952                         p1_final_derived_cp := p1_avail_cp;
953                      ELSE
954                         p1_final_derived_cp := NVL (p1_config_cp, 0);
955                         p3_final_derived_cp := NVL (p3_config_cp, 0);
956                      END IF;
957                   ELSE -- IF (p3_excess_cp - (p1_required_cp - p1_avail_cp)) > 0 THEN
958                      IF p1_required_flag = 'N'
959                      THEN
960                         p3_final_derived_cp := NVL (p3_avail_cp, 0);
961                         p1_final_derived_cp := p1_avail_cp;
962                      ELSE
963                         p1_final_derived_cp := p1_config_cp;
964                         p3_final_derived_cp := NVL (p3_config_cp, 0);
965                      END IF;
966                   END IF; -- IF (p3_excess_cp - (p1_required_cp - p1_avail_cp)) > 0 THEN
967                ELSE
968                   p1_final_derived_cp := p1_avail_cp;
969                   p2_final_derived_cp := NVL (p2_avail_cp, 0);
970                   p3_final_derived_cp := NVL (p3_avail_cp, 0);
971                END IF; -- IF p3_excess_cp > 0 THEN
972             END IF; -- IF p2_excess_cp > 0 THEN
973          ELSE -- IF (p1_avail_cp - p1_required_cp) < 0 THEN
974             p1_final_derived_cp := p1_required_cp;
975 
976             IF NVL (p2_config_cp, 0) > NVL (p2_avail_cp, 0)
977             THEN
978                p2_final_derived_cp := NVL (p2_avail_cp, 0);
979             ELSE
980                p2_final_derived_cp := p2_config_cp;
981             END IF;
982 
983             IF NVL (p3_config_cp, 0) > NVL (p3_avail_cp, 0)
984             THEN
985                p3_final_derived_cp := NVL (p3_avail_cp, 0);
986             ELSE
987                p3_final_derived_cp := p3_config_cp;
988             END IF;
989          END IF; -- IF (p1_avail_cp - p1_required_cp) < 0 THEN
990       END IF; -- IF l_selection_method_code = 'CREDITS' THEN
991 
992       /*
993          At the end of the above calculation,
994          p1_final_derived_cp, p2_final_derived_cp and p3_final_derived_cp are determined.
995          Thus how much each priority should contribute has been defined.
996       */
997 
998       -- 4. Select the student unit attempt outcomes based on the the setups from 1, 2 and 3
999 
1000       -- check out the selection method code
1001       IF l_selection_method_code = 'PRIORITY'
1002       THEN
1003          FOR rec_cnfg_dtls IN c_cnfg_dtls (l_mark_config_id)
1004          LOOP
1005             -- decide the order by clause
1006             IF rec_cnfg_dtls.unit_selection_code = 'BEST_MARK'
1007             THEN
1008                l_stmt_priority_based :=
1009                            l_stmt_priority_based_orig
1010                         || ' ORDER BY mark desc ';
1011             ELSE
1012                l_stmt_priority_based :=    l_stmt_priority_based_orig
1013                                         || ' ORDER BY suao.creation_date desc';
1014             END IF;
1015 
1016             -- now open the ref cursor
1017             OPEN c_priority_based FOR l_stmt_priority_based
1018                USING   p_person_id,
1019                        p_course_cd,
1020                        rec_cnfg_dtls.core_indicator_code,
1021                        p_unit_level;
1022 
1023             LOOP
1024                FETCH c_priority_based INTO l_unit_cd,
1025                                            l_uoo_id,
1026                                            l_mark,
1027                                            l_grade,
1028                                            l_wam_weight,
1029                                            l_earned_cp;
1030                EXIT WHEN c_priority_based%NOTFOUND;
1031 
1032                IF (  l_total_unit_lvl_cp_config
1033                    - (  l_total_unit_lvl_cp
1034                       + l_earned_cp
1035                      )
1036                   ) >= 0
1037                THEN
1038                   l_total_unit_lvl_cp :=   l_total_unit_lvl_cp
1039                                          + l_earned_cp;
1040                   l_unit_lvl_mark :=   l_unit_lvl_mark
1041                                      + (l_wam_weight * l_earned_cp * l_mark);
1042                END IF;
1043             END LOOP;
1044             CLOSE c_priority_based;
1045          END LOOP; -- FOR rec_cnfg_dtls IN c_cnfg_dtls
1046       ELSE -- else of IF l_selection_method_code = 'PRIORITY' THEN i.e. CREDITS
1047          FOR rec_cnfg_dtls IN c_cnfg_dtls (l_mark_config_id)
1048          LOOP
1049             -- decide the order by clause
1050             IF rec_cnfg_dtls.unit_selection_code = 'BEST_MARK'
1051             THEN
1052                l_stmt_cp_based :=
1053                                  l_stmt_cp_based_orig
1054                               || ' ORDER BY mark desc ';
1055             ELSE
1056                l_stmt_cp_based :=    l_stmt_cp_based_orig
1057                                   || ' ORDER BY stmpt.creation_date desc';
1058             END IF;
1059 
1060             -- now open the ref cursor
1061             OPEN c_cp_based FOR l_stmt_cp_based
1062                USING   p_person_id,
1063                        p_course_cd,
1064                        rec_cnfg_dtls.core_indicator_code,
1065                        p_unit_level;
1066 
1067             LOOP
1068                FETCH c_cp_based INTO l_unit_cd,
1069                                      l_uoo_id,
1070                                      l_mark,
1071                                      l_grade,
1072                                      l_earned_cp,
1073                                      l_wam_weight;
1074                EXIT WHEN c_cp_based%NOTFOUND;
1075 
1076                -- below priority_num is assumed to have values 1,2 and 3
1077                IF rec_cnfg_dtls.priority_num = 1
1078                THEN
1079                   IF   p1_final_derived_cp
1080                      - l_earned_cp >= 0
1081                   THEN
1082                      p1_final_derived_cp :=
1083                                             p1_final_derived_cp
1084                                           - l_earned_cp;
1085                      l_unit_lvl_mark :=   l_unit_lvl_mark
1086                                         + (  NVL (l_wam_weight, 1)
1087                                            * l_earned_cp
1088                                            * l_mark
1089                                           );
1090                   END IF;
1091                ELSIF rec_cnfg_dtls.priority_num = 2
1092                THEN
1093                   IF   p2_final_derived_cp
1094                      - l_earned_cp >= 0
1095                   THEN
1096                      p2_final_derived_cp :=
1097                                             p2_final_derived_cp
1098                                           - l_earned_cp;
1099                      l_unit_lvl_mark :=   l_unit_lvl_mark
1100                                         + (  NVL (l_wam_weight, 1)
1101                                            * l_earned_cp
1102                                            * l_mark
1103                                           );
1104                   END IF;
1105                ELSIF rec_cnfg_dtls.priority_num = 3
1106                THEN
1107                   IF   p3_final_derived_cp
1108                      - l_earned_cp >= 0
1109                   THEN
1110                      p3_final_derived_cp :=
1111                                             p3_final_derived_cp
1112                                           - l_earned_cp;
1113                      l_unit_lvl_mark :=   l_unit_lvl_mark
1114                                         + (  NVL (l_wam_weight, 1)
1115                                            * l_earned_cp
1116                                            * l_mark
1117                                           );
1118                   END IF;
1119                END IF; -- IF rec_cnfg_dtls.priority_num = 1 THEN
1120             END LOOP; -- OPEN c_cp_based FOR l_stmt_cp_based;
1121             CLOSE c_cp_based;
1122          END LOOP; -- FOR rec_cnfg_dtls IN c_cnfg_dtls
1123       END IF; -- end of IF l_selection_method_code = 'CREDITS' THEN
1124 
1125       -- 5. Calculate the unit level mark
1126       l_unit_lvl_mark := l_unit_lvl_mark / NVL (l_total_unit_lvl_cp_config, 1);
1127    ELSE -- IF l_mark_config_id IS NOT NULL THEN i.e. setup is not available
1128       -- Get the total cp that is to be used as denominator for calculation of unit level mark
1129       OPEN c_total_unt_lvl_cp_alt (
1130          p_unit_level,
1131          p_course_cd,
1132          p_person_id,
1133          'TRUE'
1134       );
1135       FETCH c_total_unt_lvl_cp_alt INTO l_total_unit_lvl_cp_config;
1136       CLOSE c_total_unt_lvl_cp_alt;
1137 
1138       FOR rec IN c_unit_lvl_mark_wo_setup (
1139                     p_person_id,
1140                     p_course_cd,
1141                     p_unit_level
1142                  )
1143       LOOP
1144          l_unit_lvl_mark :=
1145                 l_unit_lvl_mark
1146               + (rec.mark * rec.earned_cp * rec.wam_weight);
1147       END LOOP;
1148 
1149       -- jhanda
1150       l_total_unit_lvl_cp_config := NVL (l_total_unit_lvl_cp_config,0) + NVL(l_advstnd_cp,0);
1151       IF (l_total_unit_lvl_cp_config = 0 ) THEN
1152           l_total_unit_lvl_cp_config := 1;
1153       END IF;
1154       l_unit_lvl_mark := l_unit_lvl_mark / l_total_unit_lvl_cp_config;
1155    END IF; -- IF l_mark_config_id IS NOT NULL THEN
1156 
1157    -- Initialize API return status to success.
1158    x_return_status := fnd_api.g_ret_sts_success;
1159    -- Standard call to get message count and if count is 1, get message
1160    -- info.
1161    fnd_msg_pub.count_and_get (p_count => x_msg_count, p_data => x_msg_data);
1162 
1163    IF l_unit_lvl_mark IS NOT NULL
1164    THEN
1165       RETURN TO_NUMBER (TO_CHAR (l_unit_lvl_mark, '999.999'));
1166    ELSE
1167       RETURN l_unit_lvl_mark;
1168    END IF;
1169 EXCEPTION
1170    WHEN fnd_api.g_exc_error
1171    THEN
1172       l_unit_lvl_mark := NULL;
1173       x_return_status := fnd_api.g_ret_sts_error;
1174       fnd_msg_pub.count_and_get (
1175          p_count=> x_msg_count,
1176          p_data=> x_msg_data
1177       );
1178       RETURN TO_NUMBER (NULL);
1179    WHEN fnd_api.g_exc_unexpected_error
1180    THEN
1181       l_unit_lvl_mark := NULL;
1182       x_return_status := fnd_api.g_ret_sts_unexp_error;
1183       fnd_msg_pub.count_and_get (
1184          p_count=> x_msg_count,
1185          p_data=> x_msg_data
1186       );
1187       RETURN TO_NUMBER (NULL);
1188    WHEN OTHERS
1189    THEN
1190       l_unit_lvl_mark := NULL;
1191       x_return_status := fnd_api.g_ret_sts_unexp_error;
1192       fnd_message.set_name ('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
1193       fnd_message.set_token ('NAME',    'pr_calc_unit_lvl_mark : '
1194                                      || SQLERRM);
1195       fnd_msg_pub.ADD;
1196       fnd_msg_pub.count_and_get (
1197          p_count=> x_msg_count,
1198          p_data=> x_msg_data
1199       );
1200       RETURN l_unit_lvl_mark;
1201 END fn_calc_unit_lvl_mark;
1202 
1203 
1204 PROCEDURE get_hnr_grade(
1205   p_award_cd             VARCHAR2,
1206   p_sum                  NUMBER  ,
1207   p_honors_level     OUT NOCOPY VARCHAR2,
1208   p_grad_sch_code    OUT NOCOPY VARCHAR2,
1209   p_grad_Version_num OUT NOCOPY NUMBER) IS
1210   /*
1211     ||==============================================================================||
1212     ||  Created By : Nalin Kumar                                                    ||
1213     ||  Created On : 03-Jun-2004                                                    ||
1214     ||  Purpose    : To find the Grading Schema and version number attached to the Award||
1215     ||  Known limitations, enhancements or remarks :                                ||
1216     ||  Change History :                                                            ||
1217     ||  Who             When            What                                        ||
1218     ||  (reverse chronological order - newest change first)                         ||
1219     ||==============================================================================||
1220   */
1221   -- cursor to derive the grade (honors level)
1222   CURSOR c_honors_level (cp_award_cd igs_ps_awd.award_cd%TYPE,
1223                          cp_sum NUMBER) IS
1224   SELECT gsg.grade, gs.grading_schema_cd, gs.version_number
1225   FROM   igs_as_grd_schema gs,
1226          igs_as_grd_sch_grade gsg,
1227          igs_ps_awd pa
1228   WHERE  gs.grading_schema_cd = gsg.grading_schema_cd
1229   AND gs.version_number    = gsg.version_number
1230   AND gs.grading_schema_type = 'HONORS'
1231   AND pa.award_cd = cp_award_cd
1232   AND pa.grading_schema_cd = gsg.grading_schema_cd
1233   AND  pa.gs_version_number = gsg.version_number
1234   AND NVL(gsg.lower_mark_range, 1) <= NVL((cp_sum), NVL(gsg.lower_mark_range, 1))
1235   AND NVL(gsg.upper_mark_range, 1) >= NVL((cp_sum), NVL(gsg.upper_mark_range, 1));
1236 
1237   CURSOR c_honors_level1 (cp_sum   NUMBER) IS
1238   SELECT gsg.grade, gs.grading_schema_cd, gs.version_number
1239   FROM igs_as_grd_schema gs,
1240        igs_as_grd_sch_grade gsg
1241   WHERE  gs.grading_schema_cd = gsg.grading_schema_cd
1242   AND gs.version_number = gsg.version_number
1243   AND gs.grading_schema_type = 'HONORS'
1244   AND gs.start_dt <= SYSDATE
1245   AND nvl(gs.end_dt,SYSDATE) >= SYSDATE
1246   AND gsg.lower_mark_range <= (cp_sum)
1247   AND gsg.upper_mark_range >= (cp_sum);
1248 
1249   l_grading_schema_cd IGS_AS_GRD_SCH_GRADE.GRADING_SCHEMA_CD%TYPE;
1250   l_gs_version_number IGS_AS_GRD_SCH_GRADE.VERSION_NUMBER%TYPE;
1251   l_honors_level     igs_as_grd_sch_grade.grade%TYPE; -- stores honors level
1252   l_honors_level_not_used VARCHAR2(30);
1253 BEGIN
1254   OPEN c_honors_level (p_award_cd,p_sum);
1255   FETCH c_honors_level INTO l_honors_level, l_grading_schema_cd, l_GS_VERSION_NUMBER;
1256   CLOSE c_honors_level;
1257 
1258   IF l_grading_schema_cd IS NULL THEN
1259     OPEN c_honors_level1 (p_sum);
1260     FETCH c_honors_level1 INTO l_honors_level, l_grading_schema_cd, l_GS_VERSION_NUMBER;
1261     CLOSE c_honors_level1;
1262   END IF;
1263   --Cursor to get the grading schema and version associated with award. So that if none of the
1264   --GS cover the range of mark calculated, return the Grading schema and version
1265   -- so that user can select from the lov in the form.
1266 
1267   IF l_grading_schema_cd IS NULL THEN
1268     OPEN c_honors_level (p_award_cd, TO_NUMBER(NULL));
1269     FETCH c_honors_level INTO l_honors_level_not_used, l_grading_schema_cd, l_GS_VERSION_NUMBER;
1270     CLOSE c_honors_level;
1271   END IF;
1272   p_honors_level := l_honors_level;
1273   p_grad_sch_code := l_grading_schema_cd;
1274   p_grad_Version_num := l_GS_VERSION_NUMBER;
1275 END get_hnr_grade;
1276 
1277 PROCEDURE pr_calc_award_mark (
1278   p_person_id         IN          NUMBER,
1279   p_course_cd         IN          VARCHAR2,
1280   p_award_cd          IN          VARCHAR2,
1281   p_award_mark        OUT NOCOPY NUMBER,
1282   p_honors_level      OUT NOCOPY VARCHAR2,
1283   p_grading_schema_cd OUT NOCOPY VARCHAR2,
1284   p_version_number    OUT NOCOPY NUMBER,
1285   X_RETURN_STATUS     OUT NOCOPY VARCHAR2,
1286   X_MSG_DATA          OUT NOCOPY VARCHAR2,
1287   X_MSG_COUNT         OUT NOCOPY NUMBER) IS
1288 /*
1289   Description of the parameters:
1290   IN PARAMETERS
1291   p_person_id - The ID of the person to calculate an award
1292   p_course_cd - The Program (Course Code) for which the award mark
1293                 has to be calculated
1294   p_award_cd  - Award Code for the which the award nark has to be
1295                 calculated
1296 
1297   OUT PARAMETERS
1298   p_award_mark    - Calculated award mark
1299   p_honors_level  - Derived honours level based on the calculated
1300                     award mark
1301   x_return_status - Stores the success or failure of the program unit
1302   x_msg_data      - Stores the error message
1303   x_msg_count     - stores the count of error
1304 
1305 */
1306 
1307   -- cursor to fetch all associated unit level with the passed award code. Note that if there is no configuration done here for
1308   -- the unit level in table igs_ps_awd_hnr_base and the student has attempted some unit at that level, then the weghted avg mark should be
1309   -- considered as 1.
1310   CURSOR c_unit_levels (cp_award_cd igs_ps_awd.award_cd%TYPE) IS
1311   SELECT unit_level, weighted_average
1312   FROM   igs_ps_awd_hnr_base
1313   WHERE award_cd = cp_award_cd
1314   AND   unit_level IS NOT NULL
1315   UNION
1316   SELECT NVL(ul.unit_level, uv.unit_level) AS unit_level, 1 AS weighted_average
1317   FROM igs_en_su_attempt_all sua ,
1318        igs_ps_unit_ver_all uv, igs_ps_unit_lvl_all ul
1319   WHERE
1320     sua.unit_cd = uv.unit_cd AND
1321     sua.version_number = uv.version_number AND
1322     sua.course_cd = ul.course_cd(+) AND
1323     sua.unit_cd = ul.unit_cd(+) AND
1324     sua.version_number = ul.version_number(+) AND
1325     sua.person_id = p_person_id and sua.course_cd = p_course_cd AND
1326     NOT EXISTS (SELECT 1 FROM igs_ps_awd_hnr_base hb WHERE NVL(ul.unit_level, uv.unit_level) = hb.unit_level);
1327 
1328   -- cursor to get the stat details
1329   CURSOR c_stat_dtls (cp_award_cd igs_ps_awd.award_cd%TYPE) IS
1330   SELECT stat_type,
1331           s_stat_element,
1332           timeframe
1333   FROM   igs_ps_awd_hnr_base
1334   WHERE  award_cd = cp_award_cd
1335   AND    stat_type IS NOT NULL;
1336 
1337   rec_stat_dtls c_stat_dtls%ROWTYPE;
1338 
1339   -- cursor to get the load cal tpe and sequence_number
1340   CURSOR c_load_dtls (cp_person_id igs_en_su_attempt.person_id%TYPE,
1341                       cp_course_cd igs_en_su_attempt.course_cd%TYPE) IS
1342   SELECT load_cal_type,
1343          load_ci_sequence_number
1344   FROM   igs_ca_teach_to_load_v
1345   WHERE  (teach_cal_type,teach_ci_sequence_number)
1346     IN( SELECT cal_type, ci_sequence_number
1347         FROM (SELECT cal_type, ci_sequence_number
1348               FROM igs_en_su_attempt
1349               WHERE course_cd = cp_course_cd
1350               AND   person_id = cp_person_id
1351               AND   unit_attempt_status IN ('COMPLETED','DUPLICATE','ENROLLED')
1352               ORDER BY ci_start_dt DESC)
1353         WHERE rownum = 1)
1354   ORDER BY load_start_dt DESC;
1355   rec_load_dtls   c_load_dtls%ROWTYPE;
1356 
1357   --local variables
1358   l_unit_level_mark    NUMBER; -- stores unit level mark
1359   l_sum                NUMBER; -- sum of l_unit_level_mark*l_unit_level_wam
1360   l_honors_level       igs_as_grd_sch_grade.grade%TYPE; -- stores honors level
1361   l_gpa_value          NUMBER;
1362   l_gpa_cp             NUMBER;
1363   l_gpa_quality_points NUMBER;
1364   l_acad_cal_type      VARCHAR2(30);
1365   l_acad_ci_seq_num    NUMBER;
1366   l_load_cal_type      VARCHAR2(30);
1367   l_load_ci_seq_num    NUMBER;
1368   l_load_ci_alt_code   VARCHAR2(30);
1369   l_load_ci_start_dt   DATE;
1370   l_load_ci_end_dt     DATE;
1371   l_message_name       VARCHAR2(30):=NULL;
1372   l_grading_schema_cd igs_as_grd_sch_grade.grading_schema_cd%TYPE;
1373   l_gs_version_number igs_as_grd_sch_grade.version_number%TYPE;
1374 BEGIN
1375   --Initialize the variables
1376   FND_MSG_PUB.initialize;
1377   l_unit_level_mark :=0;
1378   l_sum             :=0;
1379   -- validate the IN parameters for null values
1380   -- raise error msg IGS_PR_CALC_AWD_MARK_PARAM_REQ
1381   -- in case of violation
1382   IF p_person_id IS NULL OR
1383      p_course_cd IS NULL OR
1384      p_award_cd IS NULL THEN
1385      FND_MESSAGE.SET_NAME('IGS', 'IGS_PR_CALC_AWD_MARK_PARAM_REQ');
1386      IGS_GE_MSG_STACK.ADD;
1387      RAISE FND_API.G_EXC_ERROR;
1388   END IF;
1389 
1390   -- check for the career enabled model
1391   IF NVL(FND_PROFILE.VALUE('CAREER_MODEL_ENABLED'),'N') = 'N' THEN -- i..e Program Centric
1392     -- Loop through the various unit levels fetched by the cursor
1393     -- make the call to calc_unit_level_mark(person_id,program, unit_level)
1394     -- and keep adding to a local variable
1395     FOR rec_unit_levels IN c_unit_levels (p_award_cd)LOOP
1396       l_unit_level_mark := fn_calc_unit_lvl_mark(
1397                              p_person_id     => p_person_id,
1398                              p_course_cd     => p_course_cd,
1399                              p_unit_level    => rec_unit_levels.unit_level,
1400                              X_RETURN_STATUS => X_RETURN_STATUS,
1401                              X_MSG_DATA      => X_MSG_DATA,
1402                              X_MSG_COUNT     => X_MSG_COUNT);
1403       l_sum := l_sum + l_unit_level_mark*nvl(rec_unit_levels.weighted_average,1);
1404     END LOOP; --FOR rec_unit_levels IN c_unit_levels
1405     -- so, l_sum has the calculated award mark
1406     -- now, derive the honors level
1407 
1408     get_hnr_grade(
1409       p_award_cd ,
1410       l_Sum ,
1411       l_honors_level ,
1412       l_grading_schema_cd,
1413       l_GS_VERSION_NUMBER);
1414 
1415      p_grading_schema_cd :=  l_grading_schema_cd ;
1416      p_version_number := l_gs_version_number;
1417 
1418 
1419 
1420 
1421   ELSE  -- i.e. Career Enabled
1422         -- get the stat details
1423     OPEN c_stat_dtls(p_award_cd);
1424     FETCH c_stat_dtls INTO rec_stat_dtls;
1425     CLOSE c_stat_dtls;
1426 
1427    --Get the load cal and load ci sequence number
1428    -- this is to avoid dependency on igs_en_gen_015
1429    OPEN c_load_dtls(p_person_id,p_course_cd);
1430    FETCH c_load_dtls INTO rec_load_dtls;
1431    CLOSE c_load_dtls;
1432 
1433    -- now get the GPA
1434    igs_pr_cp_gpa.get_gpa_stats
1435      ( p_person_id               => p_person_id,
1436        p_course_cd               => p_course_cd,
1437        p_stat_type               => rec_stat_dtls.stat_type,  --Pass NULL if no setup is done...
1438        p_load_cal_type           => rec_load_dtls.load_cal_type,
1439        p_load_ci_sequence_number => rec_load_dtls.load_ci_sequence_number,
1440        p_system_stat             => NULL,
1441        p_cumulative_ind          => 'Y',
1442        p_gpa_value               => l_gpa_value,
1443        p_gpa_cp                  => l_gpa_cp,
1444        p_gpa_quality_points      => l_gpa_quality_points,
1445        p_init_msg_list           => FND_API.G_TRUE,
1446        p_return_status           => X_RETURN_STATUS,
1447        p_msg_count               => X_MSG_COUNT,
1448        p_msg_data                => X_MSG_DATA
1449      );
1450 
1451    IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
1452      FND_MESSAGE.SET_NAME('IGS',X_MSG_DATA);
1453      IGS_GE_MSG_STACK.ADD;
1454      RAISE FND_API.G_EXC_ERROR;
1455    END IF;
1456    -- now derive the honofrs level
1457    l_sum := l_gpa_value;
1458    get_hnr_grade(
1459      p_award_cd,
1460      l_Sum,
1461      l_honors_level,
1462      l_grading_schema_cd,
1463      l_gs_version_number);
1464 
1465      p_grading_schema_cd := l_grading_schema_cd;
1466      p_version_number    := l_gs_version_number;
1467 
1468   END IF;
1469 
1470   --IF NVL(FND_PROFILE.VALUE('CAREER_MODEL_ENABLED'),'N') = 'N' THEN
1471   -- now assign the out parameters
1472     p_award_mark := l_sum;
1473     p_honors_level := l_honors_level;
1474   -- Initialize API return status to success.
1475     X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
1476   -- Standard call to get message count and if count is 1, get message info.
1477   FND_MSG_PUB.Count_And_Get(
1478     p_count => x_MSG_COUNT,
1479     p_data  => X_MSG_DATA);
1480   EXCEPTION
1481     WHEN FND_API.G_EXC_ERROR THEN
1482       X_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
1483       FND_MSG_PUB.Count_And_Get(
1484         p_count => x_MSG_COUNT,
1485         p_data  => X_MSG_DATA);
1486       RETURN;
1487     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1488       X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR;
1489       FND_MSG_PUB.Count_And_Get(
1490         p_count => x_MSG_COUNT,
1491         p_data  => X_MSG_DATA);
1492       RETURN;
1493     WHEN OTHERS THEN
1494       X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR;
1495       FND_MESSAGE.SET_NAME('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
1496       FND_MESSAGE.SET_TOKEN('NAME','pr_calc_award_mark : '||SQLERRM);
1497       FND_MSG_PUB.ADD;
1498       FND_MSG_PUB.Count_And_Get(
1499         p_count => x_MSG_COUNT,
1500         p_data  => X_MSG_DATA);
1501      RETURN;
1502 END pr_calc_award_mark;
1503 
1504 FUNCTION fn_calc_award_mark(
1505   p_person_id     IN         NUMBER,
1506   p_course_cd     IN         VARCHAR2,
1507   p_award_cd      IN         VARCHAR2 ,
1508   X_RETURN_STATUS OUT NOCOPY VARCHAR2,
1509   X_MSG_DATA      OUT NOCOPY VARCHAR2,
1510   X_MSG_COUNT     OUT NOCOPY NUMBER) RETURN NUMBER IS
1511 
1512   -- define variable for OUT params to call pr_calc_award_mark
1513   l_award_mark    NUMBER;
1514   l_honors_level  VARCHAR2(1000);
1515   l_grading_schema_cd VARCHAR2(30);
1516   l_gs_version_number NUMBER(30);
1517 BEGIN
1518   -- call pr_calc_award_mark
1519   pr_calc_award_mark(
1520     p_person_id       => p_person_id,
1521     p_course_cd       => p_course_cd,
1522     p_award_cd        => p_award_cd,
1523     p_award_mark      => l_award_mark,
1524     p_honors_level    => l_honors_level,
1525     p_grading_schema_cd => l_grading_schema_cd,
1526     p_version_number =>  l_gs_version_number,
1527     X_RETURN_STATUS   => X_RETURN_STATUS,
1528     X_MSG_DATA        => X_MSG_DATA,
1529     X_MSG_COUNT       => X_MSG_COUNT);
1530 
1531   IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
1532     FND_MESSAGE.SET_NAME('IGS',X_MSG_DATA);
1533     IGS_GE_MSG_STACK.ADD;
1534     RAISE FND_API.G_EXC_ERROR;
1535   END IF;
1536   --Calculation sucessful hence return properly with value.
1537   RETURN l_award_mark;
1538 
1539   X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
1540   -- Standard call to get message count and if count is 1, get message info.
1541   FND_MSG_PUB.Count_And_Get(
1542     p_count => x_MSG_COUNT,
1543     p_data  => X_MSG_DATA);
1544  EXCEPTION
1545   WHEN FND_API.G_EXC_ERROR THEN
1546     X_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
1547     FND_MSG_PUB.Count_And_Get(
1548       p_count => x_MSG_COUNT,
1549       p_data  => X_MSG_DATA);
1550      RETURN l_award_mark;
1551    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1552      X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR;
1553      FND_MSG_PUB.Count_And_Get(
1554        p_count => x_MSG_COUNT,
1555        p_data  => X_MSG_DATA);
1556      RETURN l_award_mark;
1557    WHEN OTHERS THEN
1558      X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR;
1559      FND_MESSAGE.SET_NAME('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
1560      FND_MESSAGE.SET_TOKEN('NAME','pr_calc_award_mark : '||SQLERRM);
1561      FND_MSG_PUB.ADD;
1562      FND_MSG_PUB.Count_And_Get(
1563        p_count => x_MSG_COUNT,
1564        p_data  => X_MSG_DATA);
1565      RETURN l_award_mark;
1566 END fn_calc_award_mark;
1567 
1568 FUNCTION fn_derive_honors_level (p_person_id IN NUMBER,
1569                                  p_course_cd IN VARCHAR2,
1570                                  p_award_cd  IN VARCHAR2 ) RETURN VARCHAR2 IS
1571   -- define variable for OUT params to call pr_calc_award_mark
1572   l_award_mark    NUMBER;
1573   l_honors_level  VARCHAR2(1000);
1574   l_return_status VARCHAR2(100);
1575   l_msg_data      VARCHAR2(2000);
1576   l_msg_count     NUMBER;
1577   l_grading_schema_cd VARCHAR2(30);
1578   l_gs_version_number NUMBER(30);
1579 BEGIN
1580   -- call pr_calc_award_mark
1581   pr_calc_award_mark(
1582     p_person_id         => p_person_id,
1583     p_course_cd         => p_course_cd,
1584     p_award_cd          => p_award_cd,
1585     p_award_mark        => l_award_mark,
1586     p_honors_level      => l_honors_level,
1587     p_grading_schema_cd => l_grading_schema_cd,
1588     p_version_number    => l_gs_version_number,
1589     X_RETURN_STATUS     => l_return_status,
1590     X_MSG_DATA          => l_msg_data,
1591     X_MSG_COUNT         => l_msg_count);
1592   RETURN l_honors_level;
1593 END fn_derive_honors_level;
1594 
1595 PROCEDURE upgrade_awards (errbuff OUT NOCOPY VARCHAR2,
1596                           retcode OUT NOCOPY NUMBER,
1597                           p_award_cd igs_ps_awd.AWARD_CD%TYPE) IS
1598   -- Cursor to get all the award aims which are to be updated with the award marks and award grades...
1599   CURSOR cur_spaa(cp_awd_cd VARCHAR2) IS
1600   SELECT spaa.rowid row_id, spaa.*
1601   FROM igs_en_spa_awd_aim spaa
1602   WHERE spaa.AWARD_CD = cp_awd_cd AND
1603   spaa.AWARD_MARK IS NULL AND
1604   spaa.AWARD_GRADE IS NULL;
1605 
1606   CURSOR Cur_awd_grd_sch IS
1607   SELECT pa.grading_schema_cd, pa.gs_version_number
1608   FROM igs_ps_awd pa
1609   WHERE pa.award_cd   = p_award_cd;
1610 
1611   CURSOR Cur_Awd_grd(cp_grd_sch VARCHAR2, cp_grd_ver NUMBER, cp_grade VARCHAR2) IS
1612   SELECT gsg.grade, gs.grading_schema_cd, gs.version_number,
1613          gsg.lower_mark_range, gsg.upper_mark_range
1614   FROM igs_as_grd_schema gs, igs_as_grd_sch_grade gsg
1615   WHERE gs.grading_schema_cd = gsg.grading_schema_cd
1616    AND gs.version_number = gsg.version_number
1617    AND gs.grading_schema_type = 'HONORS'
1618    AND gs.grading_schema_cd = cp_grd_sch
1619    AND gs.version_number = cp_grd_ver
1620    AND gsg.GRADE = cp_grade;
1621 
1622   lAwdMark igs_en_spa_awd_aim.AWARD_MARK%TYPE;
1623   lAwadrdGrade IGS_as_grd_sch_grade.Grade%TYPE;
1624   lReturnStatus VARCHAR2(10);
1625   lMsgData VARCHAR2(2000);
1626   l_enc_msg  VARCHAR2(2000);
1627   l_mesg_text VARCHAR2(4000);
1628   l_msg_index NUMBER;
1629   l_msg_count NUMBER;
1630   l_grading_schema_cd VARCHAR2(30);
1631   l_gs_version_number NUMBER(30);
1632   l_total_spa_rec NUMBER := 0;
1633   l_total_spa_updated_rec NUMBER := 0;
1634   lrow_awd_grd_sch   Cur_awd_grd_sch%ROWTYPE;
1635   lrowAwd_grd Cur_Awd_grd%ROWTYPE;
1636 
1637 BEGIN
1638 
1639 
1640   --initialize
1641   retcode:= 0;
1642   errbuff:= NULL;
1643   --start
1644   IGS_GE_GEN_003.SET_ORG_ID(); -- swaghmar, bug# 4951054
1645 
1646   OPEN cur_awd_grd_sch;
1647   FETCH cur_awd_grd_sch INTO lrow_awd_grd_sch;
1648   CLOSE cur_awd_grd_sch;
1649 
1650   FOR spaa_rec IN cur_spaa(p_award_cd) LOOP
1651 
1652     IF lrow_awd_grd_sch.grading_schema_cd IS NOT NULL THEN
1653       OPEN cur_awd_grd(lrow_awd_grd_sch.grading_schema_cd,
1654                        lrow_awd_grd_sch.gs_version_number,spaa_rec.honours_level);
1655      FETCH Cur_Awd_grd INTO lrowAwd_grd;
1656     CLOSE Cur_Awd_grd;
1657 
1658     END IF;
1659 
1660     -- increment the totla spa record selected by 1;
1661     l_total_spa_rec := l_total_spa_rec + 1;
1662     ---- Get the award mark, Honors level, grading schema and grading schem version
1663     --  by making a call to procedure pr_calc_award_mark of package igs_as_calc_award_mark.
1664 
1665     igs_as_calc_award_mark.pr_calc_award_mark(
1666       p_person_id         => spaa_rec.person_id,
1667       p_course_cd         => spaa_rec.course_cd ,
1668       p_award_cd          => spaa_rec.award_cd,
1669       p_award_mark        => lAwdMark,
1670       p_honors_level      => lAwadrdGrade,
1671       p_grading_schema_cd => l_grading_schema_cd,
1672       p_version_number    => l_gs_version_number,
1673       x_return_status     => lReturnStatus,
1674       x_msg_data          => lmsgdata,
1675       x_msg_count         => l_msg_count);
1676 
1677 
1678 
1679     IF ((lReturnStatus  <> FND_API.G_RET_STS_SUCCESS) OR (NVL(lrowawd_grd.grade, lawadrdgrade) IS NULL) )THEN
1680      -- Get the proper message and log it to the file
1681         FOR l_index IN 1..NVL(l_msg_count, 0) LOOP
1682 
1683 			FND_MSG_PUB.GET (
1684 			FND_MSG_PUB.G_FIRST,
1685 			FND_API.G_TRUE,
1686 			l_enc_msg,
1687 			l_msg_index
1688 		);
1689 		FND_MESSAGE.SET_ENCODED(l_enc_msg);
1690 		lmsgdata := FND_MESSAGE.GET;
1691 		l_mesg_text := l_mesg_text ||  lmsgdata || ';' ;
1692 		FND_MSG_PUB.DELETE_MSG(l_msg_index);
1693 	END LOOP;
1694 
1695       fnd_file.put_line (fnd_file.LOG, ' Failed to Update ' ||  spaa_rec.person_id || ' - ' || spaa_rec.course_cd || ' - ' || P_AWARD_CD  );
1696       fnd_file.put_line (fnd_file.LOG, l_mesg_text);
1697 
1698     ELSE -- The mark and honors level were calculated successfully. Now update the SPAA record.
1699 fnd_file.put_line (fnd_file.LOG,'-------------------------***----------------------');
1700       BEGIN
1701         igs_en_spa_awd_aim_pkg.update_row(
1702           x_rowid             => spaa_rec.row_id,
1703           x_person_id         => spaa_rec.person_id,
1704           x_course_cd         => spaa_rec.course_cd,
1705           x_award_cd          => spaa_rec.award_cd,
1706           x_start_dt          => spaa_rec.start_dt,
1707           x_end_dt            => spaa_rec.end_dt,
1708           x_complete_ind      => spaa_rec.complete_ind,
1709           x_honours_level     => spaa_rec.honours_level,
1710           x_conferral_date    => spaa_rec.conferral_date,
1711           x_award_mark        => lawdmark,
1712           x_award_grade       => NVL(lrowawd_grd.grade, lawadrdgrade),
1713           x_grading_schema_cd => NVL(lrowawd_grd.grading_schema_cd, l_grading_schema_cd),
1714           x_gs_version_number => NVL(lrowawd_grd.version_number, l_gs_version_number));
1715 
1716       IF NVL(lrowawd_grd.grade, lawadrdgrade) IS NOT NULL THEN
1717       --Print the success in log...
1718 	fnd_file.put_line (fnd_file.LOG,'Updated  ' ||spaa_rec.person_id || ': ' || spaa_rec.course_cd || ': ' || spaa_rec.award_cd || ': With award grade :' || NVL(lrowawd_grd.grade, lawadrdgrade) );
1719       -- Increment the total updated records by 1
1720 	 l_total_spa_updated_rec := l_total_spa_updated_rec + 1;
1721       END IF;
1722 
1723 
1724       EXCEPTION
1725        WHEN OTHERS THEN
1726         fnd_file.put_line (fnd_file.LOG, 'Error Occured For '||  spaa_rec.PERSON_ID || ' - ' || spaa_rec.COURSE_CD || ' - ' || P_AWARD_CD || SQLERRM  );
1727       END;
1728     END IF;
1729   END LOOP;
1730 
1731   --Print the total statistics in log.
1732   fnd_file.put_line (fnd_file.LOG, 'Total program attempt award records selected : ' || l_total_spa_rec);
1733   fnd_file.put_line (fnd_file.LOG, 'Total program attempt award records updated successfully  : ' || l_total_spa_updated_rec);
1734 
1735  EXCEPTION
1736         WHEN FND_API.G_EXC_ERROR THEN
1737         FOR l_index IN 1..NVL(l_msg_count, 0) LOOP
1738 		FND_MSG_PUB.GET (
1739 		FND_MSG_PUB.G_FIRST,
1740 		FND_API.G_TRUE,
1741 		l_enc_msg,
1742 		l_msg_index );
1743 
1744 		FND_MESSAGE.SET_ENCODED(l_enc_msg);
1745 		lmsgdata := FND_MESSAGE.GET;
1746 		l_mesg_text := l_mesg_text ||  lmsgdata || ';' ;
1747 		FND_MSG_PUB.DELETE_MSG(l_msg_index);
1748 	END LOOP;
1749       fnd_file.put_line (fnd_file.LOG,  'Error Ocuured : ' ||l_mesg_text );
1750 
1751         WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1752         FOR l_index IN 1..NVL(l_msg_count, 0) LOOP
1753 
1754 			FND_MSG_PUB.GET (
1755 			FND_MSG_PUB.G_FIRST,
1756 			FND_API.G_TRUE,
1757 			l_enc_msg,
1758 			l_msg_index
1759 			);
1760 			FND_MESSAGE.SET_ENCODED(l_enc_msg);
1761 			lmsgdata := FND_MESSAGE.GET;
1762 			l_mesg_text := l_mesg_text ||  lmsgdata || ';' ;
1763 			FND_MSG_PUB.DELETE_MSG(l_msg_index);
1764 	END LOOP;
1765       fnd_file.put_line (fnd_file.LOG,  'Error Ocuured : ' ||l_mesg_text );
1766 
1767       WHEN OTHERS THEN
1768       retcode:=2;
1769     fnd_file.put_line (fnd_file.LOG, 'Error encountered : ' || SQLERRM);
1770 END upgrade_awards;
1771 
1772 
1773 
1774 FUNCTION fn_ret_unit_lvl_mark (p_person_id     IN NUMBER,
1775                                  p_course_cd     IN VARCHAR2,
1776                                  p_unit_level    IN VARCHAR2
1777                                  ) RETURN NUMBER
1778 IS
1779  L_RETURN_STATUS     VARCHAR2(1000);
1780  L_MSG_DATA          VARCHAR2(1000);
1781  L_MSG_COUNT         NUMBER;
1782  l_unit_level_mark   NUMBER ;
1783 
1784 Begin
1785 
1786   l_unit_level_mark := fn_calc_unit_lvl_mark (p_person_id     ,
1787                                  p_course_cd     ,
1788                                  p_unit_level    ,
1789                                  L_RETURN_STATUS ,
1790                                  L_MSG_DATA      ,
1791                                  L_MSG_COUNT     );
1792 
1793 
1794   return  l_unit_level_mark;
1795 EXCEPTION
1796   WHEN OTHERS THEN
1797   fnd_file.put_line (fnd_file.LOG, 'Error encountered : ' || SQLERRM);
1798 End fn_ret_unit_lvl_mark;
1799 
1800 END igs_as_calc_award_mark;