DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGS_AS_GEN_001

Source


1 PACKAGE BODY IGS_AS_GEN_001 AS
2 /* $Header: IGSAS01B.pls 120.0 2005/07/05 11:41:04 appldev noship $ */
3 /*======================================================================+
4  |                                                                      |
5  | DESCRIPTION                                                          |
6  |      PL/SQL boby for package: igs_as_gen_001                         |
7  |                                                                      |
8  | NOTES                                                                |
9  |                                                                      |
10  | CHANGE HISTORY                                                       |
11  +======================================================================+
12  | WHO         WHEN            WHAT                                     |
13  +======================================================================+
14  | Nalin Kumar 24-May-2003     Modified the call to the igs_as_su_atmpt_itm_pkg;
15  |                             Added two new parameters x_unit_section_ass_item_id and x_unit_ass_item_id in the call;
16  |                             This is as per 'Assessment Item description Build'; Bug# 2829291;
17  +======================================================================+*/
18   --
19   --
20   --
21   FUNCTION assp_clc_esu_ese_num (
22     p_person_id                    IN NUMBER,
23     p_exam_cal_type                IN VARCHAR2,
24     p_exam_ci_sequence_number      IN NUMBER
25   ) RETURN NUMBER IS
26     gv_other_detail VARCHAR2 (255);
27   BEGIN -- assp_clc_esu_ese_num
28     -- Calculate the number of  distinct sessions for which a IGS_PE_PERSON has been a
29     -- supervisor.
30     -- If the exam period is specified (cal_type, ci_sequence_number), then
31     -- determine the count for that period, otherwise count the number of
32     -- sessions supervised prior to the current date.
33     DECLARE
34       v_sysdate         DATE;
35       v_session_count   NUMBER                                              := 0;
36       v_exam_cal_type   igs_as_exm_ins_spvsr.exam_cal_type%TYPE;
37       v_exam_ci_seq_num igs_as_exm_ins_spvsr.exam_ci_sequence_number%TYPE;
38       v_dt_alias        igs_as_exm_ins_spvsr.dt_alias%TYPE;
39       v_dai_seq_num     igs_as_exm_ins_spvsr.dai_sequence_number%TYPE;
40       v_start_time      igs_as_exm_ins_spvsr.start_time%TYPE;
41       v_end_time        igs_as_exm_ins_spvsr.end_time%TYPE;
42       --
43       CURSOR c_ese IS
44         SELECT DISTINCT eis.exam_cal_type,
45                         eis.exam_ci_sequence_number,
46                         eis.dt_alias,
47                         eis.dai_sequence_number,
48                         eis.start_time,
49                         eis.end_time
50         FROM            igs_as_exm_ins_spvsr eis,
51                         igs_as_exam_session_v esev
52         WHERE           eis.person_id = p_person_id
53         AND             eis.exam_cal_type = esev.exam_cal_type
54         AND             eis.exam_ci_sequence_number = esev.exam_ci_sequence_number
55         AND             eis.dt_alias = esev.dt_alias
56         AND             eis.dai_sequence_number = esev.dai_sequence_number
57         AND             eis.start_time = esev.start_time
58         AND             ((NVL (p_exam_cal_type, 'NULL') = 'NULL')
59                          OR (eis.exam_cal_type = p_exam_cal_type)
60                         )
61         AND             ((NVL (p_exam_ci_sequence_number, 0) = 0)
62                          OR (eis.exam_ci_sequence_number = p_exam_ci_sequence_number)
63                         )
64         AND             esev.alias_val < v_sysdate
65         UNION
66         SELECT DISTINCT esvs.exam_cal_type,
67                         esvs.exam_ci_sequence_number,
68                         esvs.dt_alias,
69                         esvs.dai_sequence_number,
70                         esvs.start_time,
71                         esvs.end_time
72         FROM            igs_as_exm_ses_vn_sp esvs,
73                         igs_as_exam_session_v esev
74         WHERE           esvs.person_id = p_person_id
75         AND             esvs.exam_cal_type = esev.exam_cal_type
76         AND             esvs.exam_ci_sequence_number = esev.exam_ci_sequence_number
77         AND             esvs.dt_alias = esev.dt_alias
78         AND             esvs.dai_sequence_number = esev.dai_sequence_number
79         AND             esvs.start_time = esev.start_time
80         AND             ((NVL (p_exam_cal_type, 'NULL') = 'NULL')
81                          OR (esvs.exam_cal_type = p_exam_cal_type)
82                         )
83         AND             ((NVL (p_exam_ci_sequence_number, 0) = 0)
84                          OR (esvs.exam_ci_sequence_number = p_exam_ci_sequence_number)
85                         )
86         AND             esev.alias_val < v_sysdate;
87     BEGIN
88       IF  p_exam_cal_type IS NULL
89           AND p_exam_ci_sequence_number IS NULL THEN
90         v_sysdate := SYSDATE;
91       ELSE
92         v_sysdate := igs_ge_date.igsdate ('3000/12/31');
93       END IF;
94       OPEN c_ese;
95       LOOP
96         FETCH c_ese INTO v_exam_cal_type,
97                          v_exam_ci_seq_num,
98                          v_dt_alias,
99                          v_dai_seq_num,
100                          v_start_time,
101                          v_end_time;
102         IF (c_ese%NOTFOUND) THEN
103           EXIT;
104         END IF;
105         v_session_count := v_session_count + 1;
106       END LOOP;
107       CLOSE c_ese;
108       RETURN v_session_count;
109     END;
110   END assp_clc_esu_ese_num;
111   --
112   --
113   --
114   FUNCTION assp_clc_suaai_valid (
115     p_person_id                    IN     NUMBER,
116     p_unit_cd                      IN     VARCHAR2,
117     p_course_cd                    IN     VARCHAR2,
118     p_cal_type                     IN     VARCHAR2,
119     p_ci_sequence_number           IN     NUMBER,
120     p_ass_pattern_id               IN     NUMBER,
121     p_ass_id                       IN     NUMBER,
122     p_logical_delete_dt            IN     DATE,
123     p_uoo_id                       IN     NUMBER
124   ) RETURN VARCHAR2 IS
125     gv_other_detail VARCHAR2 (255);
126     p_message_name  VARCHAR2 (30);
127   BEGIN
128     IF igs_as_val_suaai.assp_val_suaai_valid (
129          p_person_id,
130          p_unit_cd,
131          p_course_cd,
132          p_cal_type,
133          p_ci_sequence_number,
134          NULL,
135          p_ass_id,
136          p_logical_delete_dt,
137          p_message_name,
138          p_uoo_id
139        ) = TRUE THEN
140       RETURN NULL;
141     ELSE
142       RETURN 'INVALID';
143     END IF;
144   EXCEPTION
145     WHEN OTHERS THEN
146       RAISE;
147   END assp_clc_suaai_valid;
148   --
149   --
150   --
151   FUNCTION assp_clc_week_extnsn (p_week_ending_due_dt IN DATE, p_override_due_dt IN DATE, p_num_week_extnsn IN NUMBER)
152     RETURN NUMBER IS
153     gv_other_detail VARCHAR2 (255);
154   BEGIN -- assp_clc_week_extnsn
155     -- This module will determine if the dates that are passed in indicate that
156     -- there is the specified number of weeks different. It will return 0
157     -- (zero) or 1 depending if an override due date matches the parameter
158     -- indicating the number of weeks extension.
159     -- This module is called from a view suaai_extension_v which is used in the
160     -- report "Assignment Due Date Summary Report".
161     DECLARE
162       v_days_difference NUMBER (5);
163     BEGIN
164       -- Parameters validation
165       IF p_week_ending_due_dt IS NULL
166          OR p_override_due_dt IS NULL
167          OR p_num_week_extnsn IS NULL THEN
168         RETURN 0;
169       END IF;
170       IF (p_override_due_dt <= p_week_ending_due_dt) THEN
171         RETURN 0;
172       END IF;
173       v_days_difference := TRUNC (p_override_due_dt) - TRUNC (p_week_ending_due_dt);
174       IF  p_num_week_extnsn = 1
175           AND v_days_difference <= 7 THEN
176         RETURN 1;
177       ELSIF  p_num_week_extnsn = 2
178              AND v_days_difference > 7
179              AND v_days_difference <= 14 THEN
180         RETURN 1;
181       ELSIF  p_num_week_extnsn = 3
182              AND v_days_difference > 14 THEN
183         -- Want to consider everything >= 3 weeks.
184         RETURN 1;
185       ELSE
186         RETURN 0;
187       END IF;
188     END;
189   EXCEPTION
190     WHEN OTHERS THEN
191       fnd_message.set_name ('IGS', 'IGS_GE_UNHANDLED_EXP');
192       fnd_message.set_token ('NAME', 'IGS_AS_GEN_001.assp_clc_week_extnsn');
193       igs_ge_msg_stack.ADD;
194       app_exception.raise_exception;
195   END assp_clc_week_extnsn;
196   --
197   --
198   --
199   FUNCTION assp_del_suaai (
200     p_person_id                    IN     NUMBER,
201     p_course_cd                    IN     VARCHAR2,
202     p_unit_cd                      IN     VARCHAR2,
203     p_cal_type                     IN     VARCHAR2,
204     p_ci_sequence_number           IN     NUMBER,
205     p_message_name                 OUT NOCOPY VARCHAR2,
206     p_uoo_id                       IN     NUMBER
207   ) RETURN BOOLEAN IS
208     gv_other_detail VARCHAR2 (255);
209   BEGIN -- assp_del_suaai
210     -- Delete a student IGS_PS_UNIT attempt item records,
211     -- Called when a student has withdrawn from a IGS_PS_UNIT and due to the early
212     -- withdrawal, the student IGS_PS_UNIT attempt is deleted.
213     DECLARE
214       e_resource_busy EXCEPTION;
215       PRAGMA EXCEPTION_INIT (e_resource_busy,  -54);
216       v_message_name  VARCHAR2 (30);
217 
218       CURSOR c_str IS
219         SELECT s_student_todo_type,
220                sequence_number,
221                reference_number
222         FROM   igs_pe_std_todo_ref
223         WHERE  person_id = p_person_id
224         AND    s_student_todo_type IN ('ASS_INSERT', 'ASS_STATUS', 'ASS_CHANGE')
225         AND    logical_delete_dt IS NULL
226         AND    course_cd = p_course_cd
227         AND    uoo_id = p_uoo_id;
228       ------------------------------------------------------------------------------
229       -- Delete all assessment items assigned to the student.
230       ------------------------------------------------------------------------------
231       FUNCTION asspl_del_suaai
232         RETURN BOOLEAN IS
233       BEGIN
234         DECLARE
235           CURSOR c_del_suaai IS
236             SELECT        ROWID,
237                           tracking_id
238             FROM          igs_as_su_atmpt_itm
239             WHERE         person_id = p_person_id
240             AND           course_cd = p_course_cd
241             AND           uoo_id = p_uoo_id
242             FOR UPDATE OF tracking_id NOWAIT;
243           c_del_suaai_rec c_del_suaai%ROWTYPE;
244         BEGIN
245           igs_as_su_atmpt_itm_pkg.delete_row (c_del_suaai_rec.ROWID);
246           FOR v_suaai_rec IN c_del_suaai LOOP
247             IF (v_suaai_rec.tracking_id IS NOT NULL) THEN
248               IF igs_tr_gen_002.trkp_del_tri (v_suaai_rec.tracking_id, v_message_name) = FALSE THEN
249                 p_message_name := v_message_name;
250                 EXIT;
251               END IF;
252             END IF;
253           END LOOP;
254           IF (v_message_name IS NOT NULL) THEN
255             RETURN FALSE;
256           END IF;
257           RETURN TRUE;
258         END;
259       EXCEPTION
260         WHEN e_resource_busy THEN
261           p_message_name := 'IGS_AS_UNABLE_PERFORM_SUAA';
262           RETURN FALSE;
263         WHEN OTHERS THEN
264           fnd_message.set_name ('IGS', 'IGS_GE_UNHANDLED_EXP');
265           fnd_message.set_token ('NAME', 'IGS_AS_GEN_001.ASSPL_DEL_SUAAI');
266           igs_ge_msg_stack.ADD;
267           app_exception.raise_exception;
268       END asspl_del_suaai;
269     BEGIN
270       p_message_name := NULL;
271       SAVEPOINT sp_del_suaai;
272       --
273       -- Delete all assessment items assigned to the student.
274       --
275       IF (asspl_del_suaai = FALSE) THEN
276         ROLLBACK TO sp_del_suaai;
277         RETURN FALSE;
278       END IF;
279       --
280       -- Remove any student todo records associated with the student and this IGS_PS_UNIT.
281       --
282       FOR v_str_rec IN c_str LOOP
283         IF igs_ge_gen_003.genp_upd_str_lgc_del (
284              p_person_id,
285              v_str_rec.s_student_todo_type,
286              v_str_rec.sequence_number,
287              v_str_rec.reference_number,
288              v_message_name
289            ) = FALSE THEN
290           --
291           -- Do nothing, this is just a tidy up routine,
292           -- if the todo record remains, it will never be activated.
293           --
294           NULL;
295         END IF;
296       END LOOP;
297       RETURN TRUE;
298     END;
299   EXCEPTION
300     WHEN OTHERS THEN
301       fnd_message.set_name ('IGS', 'IGS_GE_UNHANDLED_EXP');
302       fnd_message.set_token ('NAME', 'IGS_AS_GEN_001.assp_del_suaai');
303       igs_ge_msg_stack.ADD;
304       app_exception.raise_exception;
305   END assp_del_suaai;
306   --
307   --
308   --
309   FUNCTION assp_del_suaai_dflt (
310     p_person_id                    IN     NUMBER,
311     p_cal_type                     IN     VARCHAR2,
312     p_ci_sequence_number           IN     NUMBER,
313     p_course_cd                    IN     VARCHAR2,
314     p_unit_cd                      IN     VARCHAR2,
315     p_ass_id                       IN     NUMBER,
316     p_s_log_type                   IN     VARCHAR2,
317     p_key                          IN     VARCHAR2,
318     p_sle_key                      IN     VARCHAR2,
319     p_error_count                  IN OUT NOCOPY NUMBER,
320     p_warning_count                IN OUT NOCOPY NUMBER,
321     p_message_name                 OUT NOCOPY VARCHAR2,
322     p_uoo_id                       IN     NUMBER ,
323     p_unit_ass_id                   IN NUMBER
324   ) RETURN BOOLEAN IS
325     gv_other_details VARCHAR2 (255);
326   BEGIN --assp_del_suaai_dflt
327     --
328     -- This routine will logically delete stdnt_unit_atmpt_ass_items for the
329     -- students IGS_PS_UNIT. If p_ass_id is NULL then logically delete all system
330     -- maintained items, otherwise logically delete the student assessment item
331     -- regardless of whether it is system assigned.
332     --
333     DECLARE
334       e_resource_busy_exception EXCEPTION;
335       PRAGMA EXCEPTION_INIT (e_resource_busy_exception,  -54);
336       CURSOR c_suaai IS
337         SELECT        suaai.ROWID row_id,
338                       suaai.*
339         FROM          igs_as_su_atmpt_itm suaai,
340                       igs_en_su_attempt_all sua
341         WHERE         suaai.person_id = p_person_id
342         AND           suaai.course_cd = p_course_cd
343         AND           suaai.uoo_id = p_uoo_id
344         AND           (((NVL (p_ass_id, 0) = 0)
345                         AND suaai.s_default_ind = 'Y'
346                        )
347                        OR (suaai.ass_id = p_ass_id
348 		       AND (suaai.unit_section_ass_item_id = p_unit_ass_id
349 		       OR suaai.unit_ass_item_id = p_unit_ass_id))
350                       )
351         AND    suaai.logical_delete_dt IS NULL
352         AND    sua.person_id = suaai.person_id
353         AND    sua.course_cd = suaai.course_cd
354         AND    sua.uoo_id = suaai.uoo_id
355         AND    sua.unit_attempt_status IN ('ENROLLED', 'UNCONFIRM', 'WAITLISTED');
356       c_suaai_rec               c_suaai%ROWTYPE;
357     BEGIN
358       -- initialise IN OUT NOCOPY parameters if NULL
359       p_error_count := NVL (p_error_count, 0);
360       p_warning_count := NVL (p_warning_count, 0);
361       -- Issue a save point for the module so that if locks
362       -- exist, a rollback can be performed.
363       SAVEPOINT sp_save_point;
364       -- Perform a logical delete of the system defaulted items. If the p_ass_id is
368         igs_as_su_atmpt_itm_pkg.update_row (
365       -- set then update only that item regardless of whether it is a default item,
366       -- otherwise update all default items for the student's IGS_PS_UNIT.
367       FOR c_suaai_rec IN c_suaai LOOP
369           x_mode                         => 'R',
370           x_rowid                        => c_suaai_rec.row_id,
371           x_person_id                    => c_suaai_rec.person_id,
372           x_course_cd                    => c_suaai_rec.course_cd,
373           x_unit_cd                      => c_suaai_rec.unit_cd,
374           x_cal_type                     => c_suaai_rec.cal_type,
375           x_ci_sequence_number           => c_suaai_rec.ci_sequence_number,
376           x_ass_id                       => c_suaai_rec.ass_id,
377           x_creation_dt                  => c_suaai_rec.creation_dt,
378           x_attempt_number               => c_suaai_rec.attempt_number,
379           x_outcome_dt                   => c_suaai_rec.outcome_dt,
380           x_override_due_dt              => c_suaai_rec.override_due_dt,
381           x_tracking_id                  => c_suaai_rec.tracking_id,
382           x_logical_delete_dt            => SYSDATE,
383           x_s_default_ind                => c_suaai_rec.s_default_ind,
384           x_ass_pattern_id               => c_suaai_rec.ass_pattern_id,
385           x_grading_schema_cd            => c_suaai_rec.grading_schema_cd,
386           x_gs_version_number            => c_suaai_rec.gs_version_number,
387           x_grade                        => c_suaai_rec.grade,
388           x_outcome_comment_code         => c_suaai_rec.outcome_comment_code,
389           x_mark                         => c_suaai_rec.mark,
390           x_attribute_category           => c_suaai_rec.attribute_category,
391           x_attribute1                   => c_suaai_rec.attribute1,
392           x_attribute2                   => c_suaai_rec.attribute2,
393           x_attribute3                   => c_suaai_rec.attribute3,
394           x_attribute4                   => c_suaai_rec.attribute4,
395           x_attribute5                   => c_suaai_rec.attribute5,
396           x_attribute6                   => c_suaai_rec.attribute6,
397           x_attribute7                   => c_suaai_rec.attribute7,
398           x_attribute8                   => c_suaai_rec.attribute8,
399           x_attribute9                   => c_suaai_rec.attribute9,
400           x_attribute10                  => c_suaai_rec.attribute10,
401           x_attribute11                  => c_suaai_rec.attribute11,
402           x_attribute12                  => c_suaai_rec.attribute12,
403           x_attribute13                  => c_suaai_rec.attribute13,
404           x_attribute14                  => c_suaai_rec.attribute14,
405           x_attribute15                  => c_suaai_rec.attribute15,
406           x_attribute16                  => c_suaai_rec.attribute16,
407           x_attribute17                  => c_suaai_rec.attribute17,
408           x_attribute18                  => c_suaai_rec.attribute18,
409           x_attribute19                  => c_suaai_rec.attribute19,
410           x_attribute20                  => c_suaai_rec.attribute20,
411           x_uoo_id                       => c_suaai_rec.uoo_id,
412           x_unit_section_ass_item_id     => c_suaai_rec.unit_section_ass_item_id,
413           x_unit_ass_item_id             => c_suaai_rec.unit_ass_item_id,
414           x_sua_ass_item_group_id        => c_suaai_rec.sua_ass_item_group_id,
415           x_midterm_mandatory_type_code  => c_suaai_rec.midterm_mandatory_type_code,
416           x_midterm_weight_qty           => c_suaai_rec.midterm_weight_qty,
417           x_final_mandatory_type_code    => c_suaai_rec.final_mandatory_type_code,
418           x_final_weight_qty             => c_suaai_rec.final_weight_qty,
419           x_submitted_date               => c_suaai_rec.submitted_date,
420           x_waived_flag                  => c_suaai_rec.waived_flag,
421           x_penalty_applied_flag         => c_suaai_rec.penalty_applied_flag
422         );
423         IF c_suaai_rec.grade IS NOT NULL THEN
424           --
425           -- Log warning that the item has an outcome recorded against it.
426           --
427           igs_ge_ins_sle.genp_set_log_entry (
428             p_s_log_type,
429             p_key,
430             p_sle_key,
431             'IGS_AS_ASSITEM_LOGICALLY_DEL', -- Warn that an outcome exist.
432             'WARNING|ITEM||' || TO_CHAR (c_suaai_rec.ass_id)
433           );
434           p_warning_count := p_warning_count + 1;
435         END IF;
436       END LOOP;
437       p_message_name := NULL;
438       RETURN TRUE;
439     EXCEPTION
440       WHEN e_resource_busy_exception THEN
441         IF (c_suaai%ISOPEN) THEN
442           CLOSE c_suaai;
443         END IF;
444         ROLLBACK TO sp_save_point;
445         p_message_name := 'IGS_AS_UNABLE_LOGICAL_DEL';
446         p_error_count := p_error_count + 1;
447         igs_ge_ins_sle.genp_set_log_entry (
448           p_s_log_type,
449           p_key,
450           p_sle_key,
451           'IGS_AS_UNABLE_LOGICAL_DEL', -- Error, record locked.
452           'ERROR|ITEM||'
453         );
454         RETURN FALSE;
455       WHEN OTHERS THEN
456         IF (c_suaai%ISOPEN) THEN
457           CLOSE c_suaai;
458         END IF;
459         RAISE;
460     END;
461   EXCEPTION
462     WHEN OTHERS THEN
463       fnd_message.set_name ('IGS', 'IGS_GE_UNHANDLED_EXP');
464       fnd_message.set_token ('NAME', 'IGS_AS_GEN_001.assp_del_suaai_dflt');
465       igs_ge_msg_stack.ADD;
466       app_exception.raise_exception;
470   --
467   END assp_del_suaai_dflt;
468   --
469   --
471   FUNCTION assp_del_suaap_dflt (
472     p_person_id                    IN     NUMBER,
473     p_cal_type                     IN     VARCHAR2,
474     p_ci_sequence_number           IN     NUMBER,
475     p_course_cd                    IN     VARCHAR2,
476     p_unit_cd                      IN     VARCHAR2,
477     p_ass_pattern_id               IN     NUMBER,
478     p_s_log_type                   IN     VARCHAR2,
479     p_key                          IN     VARCHAR2,
480     p_sle_key                      IN     VARCHAR2,
481     p_error_count                  IN OUT NOCOPY NUMBER,
482     p_warning_count                IN OUT NOCOPY NUMBER,
483     p_message_name                 OUT NOCOPY VARCHAR2,
484     p_uoo_id                       IN     NUMBER
485   ) RETURN BOOLEAN IS
486   BEGIN
487     RETURN FALSE;
488   END assp_del_suaap_dflt;
489   --
490   --
491   --
492   FUNCTION assp_del_suaap_suaai (
493     p_person_id                    IN     NUMBER,
494     p_course_cd                    IN     VARCHAR2,
495     p_unit_cd                      IN     VARCHAR2,
496     p_cal_type                     IN     VARCHAR2,
497     p_ci_sequence_number           IN     NUMBER,
498     p_ass_pattern_id               IN     NUMBER,
499     p_creation_dt                  IN     DATE,
500     p_ass_id                       IN     NUMBER,
501     p_call_from_db_trg             IN     VARCHAR2 DEFAULT 'N',
502     p_s_log_type                   IN     VARCHAR2,
503     p_key                          IN     VARCHAR2,
504     p_sle_key                      IN     VARCHAR2,
505     p_error_count                  IN OUT NOCOPY NUMBER,
506     p_warning_count                IN OUT NOCOPY NUMBER,
507     p_message_name                 OUT NOCOPY VARCHAR2,
508     p_uoo_id                       IN     NUMBER
509   ) RETURN BOOLEAN IS
510   BEGIN
511     RETURN FALSE;
512   END assp_del_suaap_suaai;
513   --
514   --
515   --
516   FUNCTION assp_get_actn_msg (p_action_type IN VARCHAR2, p_s_student_todo_type IN VARCHAR2)
517     RETURN VARCHAR2 IS
518     gv_other_detail VARCHAR2 (255);
519   BEGIN -- assp_get_actn_msg
520     -- This function will be called from the report ASSR3212 which
521     -- inturn calls a procedure that processes the student todo
522     -- entries associated with automatically maintaining the
523     -- default stdnt_unit_atmpt_ass_items.
524     DECLARE
525       e_unknown_action_type         EXCEPTION;
526       e_unknown_s_student_todo_type EXCEPTION;
527       cst_cutoff_lock      CONSTANT VARCHAR2 (30) := 'CUTOFF_LOCK';
528       cst_after_cutoff     CONSTANT VARCHAR2 (30) := 'AFTER_CUTOFF';
529       cst_status_lock      CONSTANT VARCHAR2 (30) := 'STATUS_LOCK';
530       cst_change_lock      CONSTANT VARCHAR2 (30) := 'CHANGE_LOCK';
531       cst_todo_lock        CONSTANT VARCHAR2 (30) := 'TODO_LOCK';
532       cst_delete_lock      CONSTANT VARCHAR2 (30) := 'DELETE_LOCK';
533       cst_maintain_lock    CONSTANT VARCHAR2 (30) := 'MAINTAIN_LOCK';
534       cst_clear_actn_dt    CONSTANT VARCHAR2 (30) := 'CLEAR_ACTN_DT';
535       cst_ass_insert       CONSTANT VARCHAR2 (30) := 'ASS_INSERT';
536       cst_ass_status       CONSTANT VARCHAR2 (30) := 'ASS_STATUS';
537       cst_ass_change       CONSTANT VARCHAR2 (30) := 'ASS_CHANGE';
538     BEGIN
539       -- Determine the message number to be returned based on the
540       -- p_action_type and student todo type.
541       IF (p_action_type = cst_after_cutoff) THEN
542         IF (p_s_student_todo_type = cst_ass_insert) THEN
543           RETURN ('IGS_AS_CREATE_DFLT_ASSITEMS');
544         ELSIF (p_s_student_todo_type = cst_ass_status) THEN
545           RETURN ('IGS_AS_LOGICAL_DEL_DFLT_ITEMS');
546         ELSIF (p_s_student_todo_type = cst_ass_change) THEN
547           RETURN ('IGS_AS_ADJUST_DFLT_ASSITEMS');
548         ELSE
549           RAISE e_unknown_s_student_todo_type;
550         END IF;
551       END IF;
552       IF (p_action_type = cst_cutoff_lock) THEN
553         RETURN ('IGS_AS_LOGICAL_DEL_STUD_TODO');
554       END IF;
555       IF (p_action_type = cst_status_lock) THEN
556         RETURN ('IGS_AS_LOGICAL_DEL_DFLT_ITEMS');
557       END IF;
558       IF (p_action_type = cst_change_lock) THEN
559         RETURN ('IGS_AS_ADJUST_DFLT_ASSITEMS');
560       END IF;
561       IF (p_action_type = cst_todo_lock) THEN
562         IF (p_s_student_todo_type = cst_ass_insert) THEN
563           RETURN ('IGS_AS_LOGDEL_STUD_TODO_ITEM');
564         ELSIF (p_s_student_todo_type = cst_ass_status) THEN
565           RETURN ('IGS_AS_LOGDEL_STUD_TODO_CHGST');
566         ELSIF (p_s_student_todo_type = cst_ass_change) THEN
567           RETURN ('IGS_AS_LOGDEL_STUD_TODO_ALT');
568         ELSE
569           RAISE e_unknown_s_student_todo_type;
570         END IF;
571       END IF;
572       IF (p_action_type = cst_delete_lock) THEN
573         RETURN ('IGS_AS_LOGDEL_SFLT_STUD_SUAI');
574       END IF;
575       IF (p_action_type = cst_maintain_lock) THEN
576         RETURN ('IGS_AS_VALID_UAI_SUA');
577       END IF;
578       IF (p_action_type = cst_clear_actn_dt) THEN
579         RETURN ('IGS_AS_CLEAR_ACTIONDT_UAI');
580       END IF;
581       -- If processing has reached this point then have not
582       -- found a valid action type.
583       RAISE e_unknown_action_type;
584     EXCEPTION
585       WHEN e_unknown_s_student_todo_type THEN
589     END;
586         RAISE;
587       WHEN e_unknown_action_type THEN
588         RAISE;
590   END assp_get_actn_msg;
591   --
592   --
593   --
594   FUNCTION assp_get_ai_a_type (p_ass_id IN NUMBER)
595     RETURN VARCHAR2 IS
596     gv_other_detail VARCHAR2 (255);
597   BEGIN -- assp_get_ai_a_type
598     -- Return the assessment type of an assessment item.
599     DECLARE
600       CURSOR c_ai (cp_ass_id igs_as_assessmnt_itm.ass_id%TYPE) IS
601         SELECT assessment_type
602         FROM   igs_as_assessmnt_itm ai
603         WHERE  ai.ass_id = cp_ass_id;
604       v_ai_rec c_ai%ROWTYPE;
605     BEGIN
606       OPEN c_ai (p_ass_id);
607       FETCH c_ai INTO v_ai_rec;
608       IF c_ai%NOTFOUND THEN
609         CLOSE c_ai;
610         RAISE NO_DATA_FOUND;
611       END IF;
612       CLOSE c_ai;
613       RETURN v_ai_rec.assessment_type;
614     EXCEPTION
615       WHEN OTHERS THEN
616         fnd_message.set_name ('IGS', 'IGS_GE_UNHANDLED_EXP');
617         fnd_message.set_token ('NAME', 'IGS_AS_GEN_001.assp_get_ai_a_type');
618         igs_ge_msg_stack.ADD;
619         app_exception.raise_exception;
620     END;
621   END assp_get_ai_a_type;
622   --
623   --
624   --
625   FUNCTION assp_val_sua_display (
626     p_person_id                    IN     NUMBER,
627     p_course_cd                    IN     VARCHAR2,
628     p_version_number               IN     NUMBER,
629     p_unit_cd                      IN     VARCHAR2,
630     p_cal_type                     IN     VARCHAR2,
631     p_ci_sequence_number           IN     NUMBER,
632     p_unit_attempt_status          IN     VARCHAR2,
633     p_administrative_unit_status   IN     VARCHAR2,
634     p_finalised_ind                IN     VARCHAR2 DEFAULT 'N',
635     p_include_fail_grade_ind       IN     VARCHAR2 DEFAULT 'N',
636     p_enrolled_units_ind           IN     VARCHAR2 DEFAULT 'C',
637     p_exclude_research_units_ind   IN     VARCHAR2 DEFAULT 'N',
638     p_exclude_unit_category        IN     VARCHAR2,
639     p_uoo_id                       IN     NUMBER
640   ) RETURN VARCHAR2 IS
641     gv_other_detail VARCHAR2 (255);
642   BEGIN -- assp_val_sua_display
643     -- This module checks if the student IGS_PS_UNIT attempt is valid to be displayed on
644     -- documentation such as the Academic Transcripts. It determines if failed
645     -- grades are to be displayed and also if grades/IGS_PS_UNIT attempt status are to
646     -- be displayed.
647     DECLARE
648       v_grading_schema_cd        igs_as_grd_sch_grade.grading_schema_cd%TYPE;
649       v_gs_version_number        igs_as_grd_sch_grade.version_number%TYPE;
650       v_grade                    igs_as_grd_sch_grade.grade%TYPE;
651       v_dummy                    VARCHAR2 (1);
652       v_result_type              igs_as_grd_sch_grade.s_result_type%TYPE;
653       v_acad_cal_type            igs_ca_inst.cal_type%TYPE;
654       v_acad_ci_sequence_number  igs_ca_inst.sequence_number%TYPE;
655       v_acad_start_dt            igs_ca_inst.start_dt%TYPE;
656       v_acad_end_dt              igs_ca_inst.end_dt%TYPE;
657       v_effect_enr_strt_dt_alias igs_en_cal_conf.effect_enr_strt_dt_alias%TYPE;
658       v_effective_dt             DATE;
659       v_alt_code                 igs_ca_inst.alternate_code%TYPE;
660       v_message_name             VARCHAR2 (30);
661       cst_enrolled      CONSTANT VARCHAR2 (15)                                   := 'ENROLLED';
662       cst_active        CONSTANT VARCHAR2 (15)                                   := 'ACTIVE';
663       CURSOR c_aus IS
664         SELECT 'x'
665         FROM   igs_ad_adm_unit_stat aus
666         WHERE  aus.administrative_unit_status = p_administrative_unit_status
667         AND    aus.show_on_offic_ntfctn_ind = 'N';
668       CURSOR c_gsg (
669         cp_grading_schema_cd                  igs_as_grd_sch_grade.grading_schema_cd%TYPE,
670         cp_version_number                     igs_as_grd_sch_grade.version_number%TYPE,
671         cp_grade                              igs_as_grd_sch_grade.grade%TYPE
672       ) IS
673         SELECT 'x'
674         FROM   igs_as_grd_sch_grade gsg
675         WHERE  gsg.grading_schema_cd = cp_grading_schema_cd
676         AND    gsg.version_number = cp_version_number
677         AND    gsg.grade = cp_grade
678         AND    gsg.show_on_official_ntfctn_ind = 'N';
679       CURSOR c_crv IS
680         SELECT 'x'
681         FROM   igs_ps_ver crv,
682                igs_ps_type ct
683         WHERE  crv.course_cd = p_course_cd
684         AND    crv.version_number = p_version_number
685         AND    ct.course_type = crv.course_type
686         AND    ct.research_type_ind = 'Y';
687       CURSOR c_uv IS
688         SELECT 'x'
689         FROM   igs_ps_unit_ver uv
690         WHERE  uv.unit_cd = p_unit_cd
691         AND    uv.research_unit_ind = 'Y';
692       CURSOR c_uc IS
693         SELECT 'x'
694         FROM   igs_ps_unit_category uc
695         WHERE  uc.unit_cd = p_unit_cd
696         AND    uc.unit_cat = p_exclude_unit_category;
697       CURSOR c_ci (cp_acad_cal_type igs_ca_inst.cal_type%TYPE, cp_acad_ci_seq_no igs_ca_inst.sequence_number%TYPE) IS
698         SELECT 'x'
699         FROM   igs_ca_inst ci,
700                igs_ca_stat cs
701         WHERE  ci.cal_type = cp_acad_cal_type
702         AND    ci.sequence_number = cp_acad_ci_seq_no
703         AND    ci.cal_status = cs.cal_status
704         AND    cs.s_cal_status = cst_active;
705       CURSOR c_secc IS
706         SELECT secc.effect_enr_strt_dt_alias
707         FROM   igs_en_cal_conf secc
708         WHERE  secc.s_control_num = 1;
709       CURSOR c_daiv (
710         cp_acad_cal_type                      igs_ca_inst.cal_type%TYPE,
711         cp_acad_ci_seq_no                     igs_ca_inst.sequence_number%TYPE,
712         cp_effect_dt_alias                    VARCHAR2
713       ) IS
714         SELECT igs_ca_gen_001.calp_set_alias_value (
715                  absolute_val,
716                  igs_ca_gen_002.cals_clc_dt_from_dai (ci_sequence_number, cal_type, dt_alias, sequence_number)
717                ) alias_val
718         FROM   igs_ca_da_inst daiv
719         WHERE  daiv.cal_type = cp_acad_cal_type
720         AND    daiv.ci_sequence_number = cp_acad_ci_seq_no
721         AND    daiv.dt_alias = cp_effect_dt_alias;
722     BEGIN
723       -- Determine if the administrative IGS_PS_UNIT status indicates not to
724       -- show on official notifications.
725       IF p_administrative_unit_status IS NOT NULL THEN
726         OPEN c_aus;
727         FETCH c_aus INTO v_dummy;
728         IF c_aus%FOUND THEN
729           CLOSE c_aus;
730           RETURN 'N';
731         END IF;
732         CLOSE c_aus;
733       END IF;
734       -- Determine the grade and schema used for the IGS_PS_UNIT.
735       v_result_type := igs_as_gen_003.assp_get_sua_grade (
736                          p_person_id,
737                          p_course_cd,
738                          p_unit_cd,
739                          p_cal_type,
740                          p_ci_sequence_number,
741                          p_unit_attempt_status,
742                          p_finalised_ind,
743                          v_grading_schema_cd,
744                          v_gs_version_number,
745                          v_grade,
746                          p_uoo_id
747                        );
748       -- Check if failed units allowed.
749       IF  p_include_fail_grade_ind = 'N'
750           AND NVL (v_result_type, 'NULL') = 'FAIL' THEN
751         RETURN 'N';
752       END IF;
753       -- Check if the grade is allowed on official notification.
754       IF  v_grading_schema_cd IS NOT NULL
755           AND v_gs_version_number IS NOT NULL
756           AND v_grade IS NOT NULL THEN
757         OPEN c_gsg (v_grading_schema_cd, v_gs_version_number, v_grade);
758         FETCH c_gsg INTO v_dummy;
759         IF c_gsg%FOUND THEN
760           CLOSE c_gsg;
761           RETURN 'N';
762         END IF;
763         CLOSE c_gsg;
764       END IF;
765       -- Determine if research units are to be included.
766       IF p_exclude_research_units_ind = 'Y' THEN
767         OPEN c_crv;
768         FETCH c_crv INTO v_dummy;
769         IF c_crv%NOTFOUND THEN
770           CLOSE c_crv;
771         ELSE
772           CLOSE c_crv;
773           OPEN c_uv;
774           FETCH c_uv INTO v_dummy;
775           IF c_uv%FOUND THEN
776             CLOSE c_uv;
777             RETURN 'N';
778           END IF;
779           CLOSE c_uv;
780         END IF;
781       END IF;
782       IF p_exclude_unit_category IS NOT NULL THEN
783         OPEN c_uc;
784         FETCH c_uc INTO v_dummy;
785         IF c_uc%FOUND THEN
786           CLOSE c_uc;
787           RETURN 'N';
788         END IF;
789         CLOSE c_uc;
790       END IF;
791       -- Determine if current/future units are to be included
792       v_acad_cal_type := NULL;
793       v_acad_ci_sequence_number := NULL;
794       v_acad_start_dt := NULL;
795       v_acad_end_dt := NULL;
796       v_alt_code := igs_en_gen_002.enrp_get_acad_alt_cd (
797                       p_cal_type,
798                       p_ci_sequence_number,
799                       v_acad_cal_type,
800                       v_acad_ci_sequence_number,
801                       v_acad_start_dt,
802                       v_acad_end_dt,
803                       v_message_name
804                     );
805       OPEN c_ci (v_acad_cal_type, v_acad_ci_sequence_number);
806       FETCH c_ci INTO v_dummy;
807       IF c_ci%FOUND THEN
808         CLOSE c_ci;
809         IF v_acad_end_dt > SYSDATE THEN
810           OPEN c_secc;
811           FETCH c_secc INTO v_effect_enr_strt_dt_alias;
812           IF c_secc%NOTFOUND THEN
813             CLOSE c_secc;
814             v_effective_dt := v_acad_start_dt;
815           ELSE
816             CLOSE c_secc;
817             OPEN c_daiv (v_acad_cal_type, v_acad_ci_sequence_number, v_effect_enr_strt_dt_alias);
818             FETCH c_daiv INTO v_effective_dt;
819             IF c_daiv%NOTFOUND THEN
820               CLOSE c_daiv;
821               v_effective_dt := v_acad_start_dt;
822             ELSE
823               CLOSE c_daiv;
824             END IF;
825           END IF;
826           IF p_enrolled_units_ind = 'C' THEN
827             -- Current
828             IF v_effective_dt > SYSDATE THEN
829               RETURN 'N';
830             END IF;
831           ELSIF p_enrolled_units_ind = 'F' THEN
832             -- Future
833             IF  v_effective_dt > SYSDATE
834                 AND p_unit_attempt_status <> cst_enrolled THEN
835               RETURN 'N';
836             END IF;
837           ELSIF p_enrolled_units_ind = 'E' THEN
838             -- Exclude
839             IF p_unit_attempt_status = cst_enrolled THEN
840               RETURN 'N';
841             END IF;
842           END IF;
843         END IF;
844       ELSE
845         CLOSE c_ci;
846       END IF;
847       -- If this point reached then IGS_PS_UNIT is valid to be displayed
848       -- on official notification.
849       RETURN 'Y';
850     EXCEPTION
851       WHEN OTHERS THEN
852         IF c_aus%ISOPEN THEN
853           CLOSE c_aus;
854         END IF;
855         IF c_gsg%ISOPEN THEN
856           CLOSE c_gsg;
857         END IF;
858         IF c_crv%ISOPEN THEN
859           CLOSE c_crv;
860         END IF;
861         IF c_uc%ISOPEN THEN
862           CLOSE c_uc;
863         END IF;
864         IF c_uv%ISOPEN THEN
865           CLOSE c_uv;
866         END IF;
867         IF c_ci%ISOPEN THEN
868           CLOSE c_ci;
869         END IF;
870         IF c_secc%ISOPEN THEN
871           CLOSE c_secc;
872         END IF;
873         IF c_daiv%ISOPEN THEN
874           CLOSE c_daiv;
875         END IF;
876         RAISE;
877     END;
878   END assp_val_sua_display;
879 END igs_as_gen_001;