1 PACKAGE BODY igs_av_val_asu AS
2 /* $Header: IGSAV04B.pls 120.4 2006/03/27 01:33:39 shimitta ship $ */
3 -------------------------------------------------------------------------------------------
4 --Change History:
5 --Who When What
6 --smadathi 24-AUG-2001 Bug No. 1956374 .The function genp_val_staff_prsn removed
7 --msrinivi 24-AUG-2001 Bug No. 1956374 .The function genp_val_prsn_id removed
8 -- To validate the advanced standing basis IGS_OR_INSTITUTION code.
9 --
10 -- skoppula 15-SEP-2001 Enhancement Bug for Academic Records Maintenance DLD
11 -- To change the credit_percentage logic to include advance standing credit points
12 --
13 -- nalkumar 11-Sep-2001 Added Parameter 'p_adv_stnd_trans' in advp_val_as_dates, advp_val_expiry_dt
14 -- advp_val_status_dts functions.
15 -- These changes has been done as per the Career Impact DLD.
16 -- Bug# 2027984.
17 --nalkumar 05-June-2002 Replaced the referances of the igs_av_stnd_unit/unit_lvl.(PREV_UNIT_CD and TEST_DETAILS_ID) columns
18 -- to igs_av_stnd_unit/unit_lvl.(unit_details_id and tst_rslt_dtls_id) columns. This is as per Bug# 2401170
19 --
20 --nalkumar 09-Sept-2002 Removed the references to the 'igs_av_stnd_conf_all.adv_stnd_cutoff_dt_alias' coulmn.
21 -- This column has been obsoleted as part of the Bug# 2446569.
22 -- Modified the 'advp_get_ua_del_alwd' function and removed the validations related to the obsoleted column.
23 --kdande 16-Oct-2002 Bug# 2627933. Changed the data type to column%TYPE to avoid value error.
24 -- And added check to see that the total approved exemption is < 999.999.
25 --svenkata 27-Nov-02 The routine 'adv_Credit_pts' has been modified to check the value of the fetched parameter l_adv_credits.s_adv_stnd_granting_status
26 -- instead of the IN parameter , which is incorrect.
27 -- kdande 08-Oct-03 Bug# 3154803; Changed the select to handle NULL values
28 --
29 -- nalkumar 10-Dec-2003 Bug# 3270446 RECR50 Build; Obsoleted the IGS_AV_STND_UNIT.CREDIT_PERCENTAGE column.
30 -- lkaki 05-Apr-2005 Bug# 4135171 The check for looking whether the computed value of 'v_total_exmptn_perc_grntd' is
31 -- changed to include values beyond 999.
32 -- swaghmar 25-Nov-2005 Bug# 4754378 Modified the cursor C_ADV_CP_PER
33 -- shimitta 07-Mar-2006 BUg# 5068233
34 -------------------------------------------------------------------------------------------
35 --
36 -- Validate the exemption institution code
37 --
38 FUNCTION advp_val_asu_inst (
39 p_exempt_inst IN VARCHAR2,
40 p_message_name OUT NOCOPY VARCHAR2
41 ) RETURN BOOLEAN IS
42 gv_other_detail VARCHAR2 (255);
43 BEGIN
44 DECLARE
45 CURSOR c_adv_stnd_exempt_inst_v (
46 cp_exempt_inst igs_av_adv_standing.exemption_institution_cd%TYPE
47 ) IS
48 SELECT ihp.oss_org_unit_cd exemption_institution_cd
49 FROM igs_pe_hz_parties ihp
50 WHERE ihp.inst_org_ind = 'I'
51 AND ihp.oss_org_unit_cd = cp_exempt_inst
52 UNION ALL
53 SELECT lk.lookup_code exemption_institution_cd
54 FROM igs_lookup_values lk
55 WHERE lk.lookup_type = 'OR_INSTITUTION_ADVSTEX'
56 AND lk.enabled_flag = 'Y'
57 AND lk.lookup_code = cp_exempt_inst;
58 BEGIN
59 -- Validate that exemption_institution_cd (IGS_AV_STND_UNIT or IGS_AV_STND_UNIT_LVL
60 -- ) is valid.
61 -- The status is not considered, as it is allowable to select an inactive
62 -- IGS_OR_INSTITUTION for advanced standing basis details.
63
64 p_message_name := NULL;
65
66 -- Validate input parameters.
67 IF (p_exempt_inst IS NULL) THEN
68 RETURN TRUE;
69 END IF;
70
71 -- Validate that exemption IGS_OR_INSTITUTION is valid.
72 FOR v_adv_stnd_exempt_inst_rec IN c_adv_stnd_exempt_inst_v (p_exempt_inst) LOOP
73 RETURN TRUE;
74 END LOOP;
75
76 p_message_name := 'IGS_GE_INVALID_VALUE';
77 RETURN FALSE;
78 EXCEPTION
79 WHEN OTHERS THEN
80 fnd_message.set_name ('IGS', 'IGS_GE_UNHANDLED_EXP');
81 fnd_message.set_token ('NAME', 'IGS_AV_VAL_ASU.ADVP_VAL_ASU_INST');
82 igs_ge_msg_stack.ADD;
83 app_exception.raise_exception;
84 END;
85 END advp_val_asu_inst;
86 --
87 -- To validate the granting of advanced standing (form level only)
88 -- shimitta 07-Mar-2006 BUg# 5068233
89 FUNCTION advp_val_as_frm_grnt (
90 p_person_id IN NUMBER,
91 p_course_cd IN VARCHAR2,
92 p_version_number IN NUMBER,
93 p_s_adv_stnd_granting_status IN VARCHAR2,
94 p_message_name OUT NOCOPY VARCHAR2
95 )
96 RETURN BOOLEAN IS
97 BEGIN
98 DECLARE
99 CURSOR c_course_details (
100 cp_person_id igs_en_stdnt_ps_att.person_id%TYPE,
101 cp_course_cd igs_en_stdnt_ps_att.course_cd%TYPE
102 ) IS
103 SELECT sca.version_number,
104 sca.course_attempt_status
105 FROM igs_en_stdnt_ps_att sca
106 WHERE sca.person_id = cp_person_id
107 AND sca.course_cd = cp_course_cd;
108
109 v_other_detail VARCHAR2 (255);
110 v_version_number igs_en_stdnt_ps_att.version_number%TYPE;
111 v_course_attempt_status igs_en_stdnt_ps_att.course_attempt_status%TYPE;
112 BEGIN
113 -- This function validates that an advanced standing
114 -- IGS_PS_UNIT can be granted.
115 -- IGS_GE_NOTE : this does not include IGS_PE_PERSON encumbrance
116 -- checks and IGS_PS_COURSE version advanced standing limit
117 -- checks.
118 -- This checks the IGS_AV_STND_UNIT.adv_stnd_granting
119 -- status maps to APPROVED, the IGS_EN_STDNT_PS_ATT
120 -- exists and has an attempt status of enrolled, inactive or
121 -- intermit and the IGS_EN_STDNT_PS_ATT version matches
122 -- the advanced standing approved.
123 -- set the default message number
124 p_message_name := NULL;
125
126 -- validate the input parameters
127 IF (p_person_id IS NULL
128 OR p_course_cd IS NULL
129 OR p_version_number IS NULL
130 OR p_s_adv_stnd_granting_status IS NULL
131 ) THEN
132 p_message_name := 'IGS_AV_INSUFFICIENT_INFO';
133 RETURN FALSE;
134 END IF;
135
136 -- validate that the current advanced standing
137 -- status is approved
138 IF (p_s_adv_stnd_granting_status <> 'APPROVED') THEN
139 p_message_name := 'IGS_AV_GRANTED_CURSTATUS_APPR';
140 RETURN FALSE;
141 END IF;
142
143 -- validate that a IGS_EN_STDNT_PS_ATT exists,
144 -- whether it is the correct version and has a
145 -- IGS_PS_COURSE attempt status of 'ENROLLED','INACTIVE' or
146 -- 'INTERMIT'
147 OPEN c_course_details (p_person_id, p_course_cd);
148 FETCH c_course_details INTO v_version_number,
149 v_course_attempt_status;
150
151 -- check if a record was found or not
152 IF (c_course_details%NOTFOUND) THEN
153 CLOSE c_course_details;
154 p_message_name := 'IGS_AV_GRANTED_STUDPRG_EXISTS';
155 RETURN FALSE;
156 ELSE
157 CLOSE c_course_details;
158
159 -- check if the versions are the same,
160 -- which they must be
161 IF (v_version_number <> p_version_number) THEN
162 p_message_name := 'IGS_AV_GRANTED_STUD_PRGVER';
163 RETURN FALSE;
164 END IF;
165
166 -- check the IGS_PS_COURSE attempt status,
167 -- which must be enrolled
168 IF (v_course_attempt_status IN('UNCONFIRM', 'LAPSED', 'DELETED')) THEN
169 p_message_name := 'IGS_AV_GRANTED_STUD_ENR';
170 RETURN FALSE;
171 ELSIF (v_course_attempt_status = 'INTERMIT') THEN
172 p_message_name := 'IGS_AV_NOTGRANT_ON_INTERMISSI';
173 RETURN FALSE;
174 END IF;
175 END IF;
176
177 -- set the default return type
178 RETURN TRUE;
179 EXCEPTION
180 WHEN OTHERS THEN
181 fnd_message.set_name ('IGS', 'IGS_GE_UNHANDLED_EXP');
182 fnd_message.set_token ('NAME', 'IGS_AV_VAL_ASU.ADVP_VAL_AS_FRM_GRNT');
183 igs_ge_msg_stack.ADD;
184 app_exception.raise_exception;
185 END;
186 END advp_val_as_frm_grnt;
187 --
188 -- To validate the various dates of advanced standing units or levels.
189 --
190 FUNCTION advp_val_as_dates (
191 p_advanced_standing_dt IN DATE,
192 p_date_type IN VARCHAR2,
193 p_message_name OUT NOCOPY VARCHAR2,
194 p_adv_stnd_trans IN VARCHAR2
195 ) -- This parameter has been added for Career Impact DLD.
196 RETURN BOOLEAN IS
197 gv_other_detail VARCHAR2 (255);
198 BEGIN
199 -- advp_val_as_dates
200 -- Validate that IGS_AV_ADV_STANDING related dates are not
201 -- greater than the current date.
202 DECLARE
203 v_ret_val BOOLEAN := TRUE;
204 BEGIN
205 p_message_name := NULL;
206
207 IF (p_advanced_standing_dt IS NULL
208 OR p_date_type IS NULL
209 ) THEN
210 RETURN TRUE;
211 END IF;
212
213 IF (p_advanced_standing_dt > SYSDATE)
214 AND p_adv_stnd_trans = 'N' THEN
215 IF (p_date_type = 'APPROVED') THEN
216 p_message_name := 'IGS_AV_APRVDT_LE_CURDT';
217 v_ret_val := FALSE;
218 ELSIF (p_date_type = 'GRANTED') THEN
219 p_message_name := 'IGS_AV_GRANTDT_LE_CURDT';
220 v_ret_val := FALSE;
221 ELSIF (p_date_type = 'CANCELLED') THEN
222 p_message_name := 'IGS_AV_CANCELDT_LE_CURDT';
223 v_ret_val := FALSE;
224 ELSIF (p_date_type = 'REVOKED') THEN
225 p_message_name := 'IGS_AV_REVOKED_LE_CURDT';
226 v_ret_val := FALSE;
227 ELSE
228 -- by default return TRUE
229 NULL;
230 END IF;
231 END IF;
232
233 RETURN v_ret_val;
234 END;
235 EXCEPTION
236 WHEN OTHERS THEN
237 fnd_message.set_name ('IGS', 'IGS_GE_UNHANDLED_EXP');
238 fnd_message.set_token ('NAME', 'IGS_AV_VAL_ASU.ADVP_VAL_AS_DATES');
239 igs_ge_msg_stack.ADD;
240 app_exception.raise_exception;
241 END advp_val_as_dates;
242 --
243 -- Routine to clear rowids saved in a PL/SQL TABLE from a prior commit.
244 --
245 -- To validate the status dates of advanced standing units or levels.
246 --
247 FUNCTION advp_val_status_dts (
248 p_granting_status IN VARCHAR2,
249 p_related_dt IN DATE,
250 p_message_name OUT NOCOPY VARCHAR2,
251 p_adv_stnd_trans IN VARCHAR2
252 ) -- This parameter has been added for Career Impact DLD.
253 RETURN BOOLEAN IS
254 gv_other_detail VARCHAR2 (255);
255 BEGIN -- advp_val_status_dts
256 -- Validate that if s_adv_stnd_granting_status is specified,
257 -- then its correspondeing date is also specified.
258 DECLARE
259 v_ret_val BOOLEAN := TRUE;
260 BEGIN
261 p_message_name := NULL;
262
263 IF (p_granting_status IS NULL) THEN
264 RETURN TRUE;
265 END IF;
266
267 -- validate that related_dt is not null
268 IF (p_related_dt IS NULL)
269 AND p_adv_stnd_trans = 'N' THEN
270 p_message_name := 'IGS_AV_ASSODT_SET_GRANT_ST';
271 v_ret_val := FALSE;
272 END IF;
273
274 RETURN v_ret_val;
275 END;
276 EXCEPTION
277 WHEN OTHERS THEN
278 fnd_message.set_name ('IGS', 'IGS_GE_UNHANDLED_EXP');
279 fnd_message.set_token ('NAME', 'IGS_AV_VAL_ASU.ADVP_VAL_STATUS_DTS');
280 igs_ge_msg_stack.ADD;
281 app_exception.raise_exception;
282 END advp_val_status_dts;
283 --
284 -- Validate the AS recognition type closed indicator.
285 --
286 FUNCTION advp_val_asrt_closed (
287 p_recognition_type IN VARCHAR2,
288 p_message_name OUT NOCOPY VARCHAR2
289 )
290 RETURN BOOLEAN IS
291 gv_other_detail VARCHAR2 (255);
292 BEGIN -- check if the s_adv_stnd_recognition_type is closed
293 DECLARE
294 v_closed_ind CHAR;
295
296 CURSOR c_get_closed_ind (
297 cp_recognition_type igs_lookups_view.lookup_code%TYPE
298 ) IS
299 SELECT closed_ind
300 FROM igs_lookups_view
301 WHERE lookup_type = 'ADV_STND_RECOGNITION_TYPE'
302 AND lookup_code = p_recognition_type;
303 BEGIN
304 p_message_name := NULL;
305
306 -- Validate input parameters
307 IF (p_recognition_type IS NULL) THEN
308 RETURN TRUE;
309 END IF;
310
311 -- Validate if the advanced standing recognition type is closed
312 OPEN c_get_closed_ind (p_recognition_type);
313 FETCH c_get_closed_ind INTO v_closed_ind;
314
315 IF (c_get_closed_ind%NOTFOUND) THEN
316 CLOSE c_get_closed_ind;
317 RETURN TRUE;
318 END IF;
319
320 CLOSE c_get_closed_ind;
321
322 IF (v_closed_ind = 'Y') THEN
323 p_message_name := 'IGS_AV_RECOGNITION_TYPE_CLOSE';
324 RETURN FALSE;
325 END IF;
326
327 RETURN TRUE;
328 END;
329 EXCEPTION
330 WHEN OTHERS THEN
331 fnd_message.set_name ('IGS', 'IGS_GE_UNHANDLED_EXP');
332 fnd_message.set_token ('NAME', 'IGS_AV_VAL_ASU.ADVP_VAL_ASRT_CLOSED');
333 igs_ge_msg_stack.ADD;
334 app_exception.raise_exception;
335 END advp_val_asrt_closed;
336 --
337 -- To validate the approved date of advanced standing units or levels.
338 --
339 FUNCTION advp_val_as_aprvd_dt (
340 p_approved_dt IN DATE,
341 p_related_dt IN DATE,
342 p_message_name OUT NOCOPY VARCHAR2
343 )
344 RETURN BOOLEAN IS
348 -- less than the granted_dt, cancelled_dt OR revoked_dt for the same record
345 gv_other_detail VARCHAR2 (255);
346 BEGIN -- advp_val_as_aprvd_dt
347 -- Validate that approved_dt(adv-stnd_unit OR IGS_AV_STND_UNIT_LVL) is not
349 DECLARE
350 v_ret_val BOOLEAN := TRUE;
351 BEGIN
352 p_message_name := NULL;
353
354 -- validate input parameter
355 IF (p_approved_dt IS NULL
356 OR p_related_dt IS NULL
357 ) THEN
358 RETURN TRUE;
359 END IF;
360
361 -- Validate that related_dt is greater than or equal to the approved_dt
362 IF (p_related_dt < p_approved_dt) THEN
363 p_message_name := 'IGS_AV_DTASSO_LE_APPRVDT';
364 v_ret_val := FALSE;
365 END IF;
366
367 RETURN v_ret_val;
368 END;
369 EXCEPTION
370 WHEN OTHERS THEN
371 fnd_message.set_name ('IGS', 'IGS_GE_UNHANDLED_EXP');
372 fnd_message.set_token ('NAME', 'IGS_AV_VAL_ASU.ADVP_VAL_AS_APRVD_DT');
373 igs_ge_msg_stack.ADD;
374 app_exception.raise_exception;
375 END advp_val_as_aprvd_dt;
376 --
377 -- To validate the approved date of advanced standing units or levels.
378 --
379 FUNCTION advp_val_approved_dt (
380 p_approved_dt IN DATE,
381 p_expiry_dt IN DATE,
382 p_message_name OUT NOCOPY VARCHAR2
383 )
384 RETURN BOOLEAN IS
385 gv_other_detail VARCHAR2 (255);
386 BEGIN -- Validate that IGS_AV_STND_UNIT.approved_dt is less
387 -- than or equal to IGS_AV_STND_UNIT.expiry_dt
388 DECLARE
389 BEGIN
390 p_message_name := NULL;
391
392 -- Validate input parameters
393 IF (p_approved_dt IS NULL
394 OR p_expiry_dt IS NULL
395 ) THEN
396 RETURN TRUE;
397 END IF;
398
399 -- Validate that approved_dt is less than or equal to expiry_dt
400 IF (TRUNC (p_approved_dt) > TRUNC (p_expiry_dt)) THEN
401 p_message_name := 'IGS_AV_APRVDT_NOT_GT_EXPDT';
402 RETURN FALSE;
403 ELSE
404 RETURN TRUE;
405 END IF;
406 END;
407 EXCEPTION
408 WHEN OTHERS THEN
409 fnd_message.set_name ('IGS', 'IGS_GE_UNHANDLED_EXP');
410 fnd_message.set_token ('NAME', 'IGS_AV_VAL_ASU.ADVP_VAL_APPROVED_DT');
411 igs_ge_msg_stack.ADD;
412 app_exception.raise_exception;
413 END advp_val_approved_dt;
414 --
415 -- To validate the expiry date of advanced standing units or levels.
416 --
417 FUNCTION advp_val_expiry_dt (
418 p_expiry_dt IN DATE,
419 p_message_name OUT NOCOPY VARCHAR2,
420 p_adv_stnd_trans IN VARCHAR2
421 ) -- This parameter has been added for Career Impact DLD.
422 RETURN BOOLEAN IS
423 gv_other_detail VARCHAR2 (255);
424 BEGIN -- Validate that IGS_AV_STND_UNIT.expiry_dt
425 -- is greater than the current date
426 DECLARE
427 BEGIN
428 p_message_name := NULL;
429
430 -- Validate input parameters
431 IF (p_expiry_dt IS NULL) THEN
432 RETURN TRUE;
433 END IF;
434
435 -- Validate that expiry_dt is greater than the current date
436 IF (TRUNC (p_expiry_dt) <= TRUNC (SYSDATE))
437 AND p_adv_stnd_trans = 'N' THEN
438 p_message_name := 'IGS_AV_EXPDT_GT_CURDT';
439 RETURN FALSE;
440 ELSE
441 RETURN TRUE;
442 END IF;
443 END;
444 EXCEPTION
445 WHEN OTHERS THEN
446 fnd_message.set_name ('IGS', 'IGS_GE_UNHANDLED_EXP');
447 fnd_message.set_token ('NAME', 'IGS_AV_VAL_ASU.ADVP_VAL_EXPIRY_DT');
448 igs_ge_msg_stack.ADD;
449 app_exception.raise_exception;
450 END advp_val_expiry_dt;
451 --
452 -- To validate the credit percentage of advanced standing units.
453 --
454 FUNCTION advp_val_credit_perc (
455 p_percentage IN NUMBER,
456 p_message_name OUT NOCOPY VARCHAR2
457 )
458 RETURN BOOLEAN IS
459 gv_other_detail VARCHAR2 (255);
460 BEGIN -- advp_val_credit_perc
461 -- Validate that the credit spcified for an advanced standing
462 -- IGS_PS_UNIT is either: a multiple of 5, equal to 33 or equal to 66
463 DECLARE
464 v_ret_val BOOLEAN := TRUE;
465 BEGIN
466 p_message_name := NULL;
467
468 IF (p_percentage = 33
469 OR p_percentage = 66
470 OR p_percentage MOD 5 = 0
471 ) THEN
472 p_message_name := NULL;
473 v_ret_val := TRUE;
474 ELSE
475 p_message_name := 'IGS_AV_CREDITPRC_33_66_MULT5';
476 v_ret_val := FALSE;
477 END IF;
478
479 RETURN v_ret_val;
480 END;
481 EXCEPTION
482 WHEN OTHERS THEN
483 fnd_message.set_name ('IGS', 'IGS_GE_UNHANDLED_EXP');
484 fnd_message.set_token ('NAME', 'IGS_AV_VAL_ASU.ADVP_VAL_CREDIT_PERC');
485 igs_ge_msg_stack.ADD;
486 app_exception.raise_exception;
487 END advp_val_credit_perc;
488 --
489 -- To validate internal/external advanced standing IGS_PS_COURSE limits.
490 --
491
492
496 p_version_number IN NUMBER,
493 FUNCTION advp_val_as_totals (
494 p_person_id IN NUMBER,
495 p_course_cd IN VARCHAR2,
497 p_include_approved IN BOOLEAN,
498 p_asu_unit_cd IN VARCHAR2,
499 p_asu_version_number IN NUMBER,
500 p_asu_advstnd_granting_status IN VARCHAR2,
501 p_asul_unit_level IN VARCHAR2,
502 p_asul_exmptn_institution_cd IN VARCHAR2,
503 p_asul_advstnd_granting_status IN VARCHAR2,
504 p_total_exmptn_approved OUT NOCOPY NUMBER,
505 p_total_exmptn_granted OUT NOCOPY NUMBER,
506 p_total_exmptn_perc_grntd OUT NOCOPY NUMBER,
507 p_message_name OUT NOCOPY VARCHAR2,
508 p_unit_details_id IN NUMBER,
509 p_tst_rslt_dtls_id IN NUMBER,
510 p_asu_exmptn_institution_cd IN VARCHAR2
511 )
512 RETURN BOOLEAN IS
513 BEGIN
514 DECLARE
515 cst_approved CONSTANT VARCHAR2 (10) := 'APPROVED';
516 cst_granted CONSTANT VARCHAR2 (10) := 'GRANTED';
517 cst_cancelled CONSTANT VARCHAR2 (10) := 'CANCELLED';
518 cst_revoked CONSTANT VARCHAR2 (10) := 'REVOKED';
519 cst_expired CONSTANT VARCHAR2 (10) := 'EXPIRED';
520 cst_credit CONSTANT VARCHAR2 (10) := 'CREDIT';
521 cst_not_instn CONSTANT VARCHAR2 (10) := 'NOT INSTN';
522 cst_unknown CONSTANT VARCHAR2 (10) := 'UNKNOWN';
523 --
524 -- Cursor to get the Advanced Standing Limits from the Course Version setup
525 -- kdande; 07-Oct-2003; Bug# 3154803; Changed the select to handle NULL values
526 --
527 CURSOR c_course_version_details (
528 cp_course_cd igs_ps_ver.course_cd%TYPE,
529 cp_version_number igs_ps_ver.version_number%TYPE
530 ) IS
531 SELECT NVL (cv.external_adv_stnd_limit, 0) external_adv_stnd_limit,
532 NVL (cv.internal_adv_stnd_limit, 0) internal_adv_stnd_limit,
533 NVL (cv.credit_points_required, 0) credit_points_required
534 FROM igs_ps_ver cv
535 WHERE cv.course_cd = cp_course_cd
536 AND cv.version_number = cp_version_number;
537
538 CURSOR c_local_inst_ind (cp_ins_cd igs_or_institution.institution_cd%TYPE) IS
539 SELECT ins.local_institution_ind
540 FROM igs_or_institution ins
541 WHERE ins.institution_cd = cp_ins_cd;
542
543 CURSOR c_adv_stnd_unit_details (
544 cp_person_id igs_av_stnd_unit.person_id%TYPE,
545 cp_course_cd igs_av_stnd_unit.as_course_cd%TYPE,
546 cp_version_number igs_av_stnd_unit.as_version_number%TYPE
547 ) IS
548 SELECT /* asu.credit_percentage, */
549 asu.exemption_institution_cd,
550 asu.s_adv_stnd_granting_status,
551 asu.unit_cd,
552 asu.version_number,
553 -- asu.prev_unit_cd,
554 asu.unit_details_id,
555 -- asu.test_segment_id
556 asu.tst_rslt_dtls_id
557 FROM igs_av_stnd_unit asu
558 WHERE asu.person_id = cp_person_id
559 AND asu.as_course_cd = cp_course_cd
560 AND asu.as_version_number = cp_version_number
561 AND asu.s_adv_stnd_granting_status IN (cst_approved, cst_granted)
562 AND asu.s_adv_stnd_recognition_type = cst_credit;
563
564
565 CURSOR c_adv_stnd_unit_level (
566 cp_person_id igs_av_stnd_unit_lvl.person_id%TYPE,
567 cp_course_cd igs_av_stnd_unit_lvl.as_course_cd%TYPE,
568 cp_version_num igs_av_stnd_unit_lvl.as_version_number%TYPE
569 ) IS
570 SELECT NVL (asul.credit_points, 0) credit_points,
571 asul.exemption_institution_cd,
572 asul.unit_level,
573 asul.s_adv_stnd_granting_status
574 FROM igs_av_stnd_unit_lvl asul
575 WHERE asul.person_id = cp_person_id
576 AND asul.as_course_cd = cp_course_cd
577 AND asul.as_version_number = cp_version_num
578 AND asul.s_adv_stnd_granting_status IN (cst_approved, cst_granted);
579
580 v_other_detail VARCHAR2 (255);
581 v_adv_stnd_granting_status igs_av_stnd_unit.s_adv_stnd_granting_status%TYPE;
582 v_ext_adv_stnd_limit igs_ps_ver.external_adv_stnd_limit%TYPE;
583 v_int_adv_stnd_limit igs_ps_ver.internal_adv_stnd_limit%TYPE;
584 v_credit_points_reqd igs_ps_ver.credit_points_required%TYPE;
585 v_local_inst_ind igs_or_institution.institution_cd%TYPE;
586 v_external_adv_stnd_total NUMBER;
587 v_internal_adv_stnd_total NUMBER;
588 -- 16-Oct-2002; kdande; Bug# 2627933
589 -- Changed the data type to column%TYPE to avoid value error.
590 v_total_exmptn_approved igs_av_adv_standing_all.total_exmptn_approved%TYPE;
591 v_total_exmptn_granted igs_av_adv_standing_all.total_exmptn_granted%TYPE;
592 v_total_exmptn_perc_grntd igs_av_adv_standing_all.total_exmptn_perc_grntd%TYPE;
593 v_add_in_totals BOOLEAN;
594 v_adv_stnd c_adv_stnd_unit_details%ROWTYPE;
595 v_credits NUMBER;
596 v_inst_credits NUMBER;
597 BEGIN
601 -- advanced standing exemption totals.
598 -- This function validates that the advanced standing
599 -- approved/granted has not exceeded the advanced
600 -- standing limits of the IGS_PS_COURSE version. It returns
602 -- initialise counts
603 v_external_adv_stnd_total := 0;
604 v_internal_adv_stnd_total := 0;
605 v_total_exmptn_approved := 0;
606 v_total_exmptn_granted := 0;
607 v_total_exmptn_perc_grntd := 0;
608
609 -- validate the input parameters
610 IF (p_person_id IS NULL
611 OR p_course_cd IS NULL
612 OR p_version_number IS NULL
613 ) THEN
614 p_total_exmptn_approved := v_total_exmptn_approved;
615 p_total_exmptn_granted := v_total_exmptn_granted;
616 p_total_exmptn_perc_grntd := v_total_exmptn_perc_grntd;
617 p_message_name := 'IGS_AV_INSUFFICIENT_INFO_VER';
618 RETURN FALSE;
619 END IF;
620
621 IF (p_asu_unit_cd IS NOT NULL) THEN
622 IF (p_asu_version_number IS NULL
623 OR p_asu_advstnd_granting_status IS NULL
624 ) THEN
625 p_total_exmptn_approved := v_total_exmptn_approved;
626 p_total_exmptn_granted := v_total_exmptn_granted;
627 p_total_exmptn_perc_grntd := v_total_exmptn_perc_grntd;
628 p_message_name := 'IGS_AV_INSUFFICIENT_INFO_VER';
629 RETURN FALSE;
630 END IF;
631 END IF;
632
633 -- added as part of academic records maintenance DLD ;
634 -- If unit is not null abd both unit_details_id and tst_rslt_dtls_id are null then returns false
635 IF p_asu_unit_cd IS NOT NULL
636 AND (p_unit_details_id IS NULL
637 AND p_tst_rslt_dtls_id IS NULL
638 ) THEN
639 p_total_exmptn_approved := v_total_exmptn_approved;
640 p_total_exmptn_granted := v_total_exmptn_granted;
641 p_total_exmptn_perc_grntd := v_total_exmptn_perc_grntd;
642 p_message_name := 'IGS_AV_INSUFFICIENT_INFO_VER';
643 RETURN FALSE;
644 END IF;
645
646 -- added as part of academic records maintenance DLD ;
647 -- If both unit_details_id and tst_rslt_dtls_id are not null then returns false
648 IF p_unit_details_id IS NOT NULL
649 AND p_tst_rslt_dtls_id IS NOT NULL THEN
650 p_total_exmptn_approved := v_total_exmptn_approved;
651 p_total_exmptn_granted := v_total_exmptn_granted;
652 p_total_exmptn_perc_grntd := v_total_exmptn_perc_grntd;
653 p_message_name := 'IGS_AV_INSUFFICIENT_INFO_VER';
654 RETURN FALSE;
655 END IF;
656
657 IF (p_asul_unit_level IS NOT NULL) THEN
658 IF (p_asul_exmptn_institution_cd IS NULL
659 OR p_asul_advstnd_granting_status IS NULL
660 ) THEN
661 p_total_exmptn_approved := v_total_exmptn_approved;
662 p_total_exmptn_granted := v_total_exmptn_granted;
663 p_total_exmptn_perc_grntd := v_total_exmptn_perc_grntd;
664 p_message_name := 'IGS_AV_INSUFFICIENT_INFO_VER';
665 RETURN FALSE;
666 END IF;
667 END IF;
668
669 -- get the IGS_PS_VER advanced
670 -- standing limits
671 OPEN c_course_version_details (p_course_cd, p_version_number);
672 FETCH c_course_version_details INTO v_ext_adv_stnd_limit,
673 v_int_adv_stnd_limit,
674 v_credit_points_reqd;
675
676 IF (c_course_version_details%NOTFOUND) THEN
677 -- invalid parameters entered
678 CLOSE c_course_version_details;
679 p_total_exmptn_approved := v_total_exmptn_approved;
680 p_total_exmptn_granted := v_total_exmptn_granted;
681 p_total_exmptn_perc_grntd := v_total_exmptn_perc_grntd;
682 p_message_name := 'IGS_AV_INSUFFICIENT_INFO_VER';
683 RETURN FALSE;
684 END IF;
685
686 CLOSE c_course_version_details;
687
688 FOR v_adv_stnd IN c_adv_stnd_unit_details (
689 p_person_id,
690 p_course_cd,
691 p_version_number
692 ) LOOP
693 v_add_in_totals := TRUE;
694 v_adv_stnd_granting_status := v_adv_stnd.s_adv_stnd_granting_status;
695
696 IF (p_asu_unit_cd IS NOT NULL) THEN
697 -- check the status of p_asu_unit_cd
698 IF (p_asu_unit_cd = v_adv_stnd.unit_cd
699 AND p_asu_version_number = v_adv_stnd.version_number
700 ) THEN
701 IF (p_asu_advstnd_granting_status IN
702 (cst_cancelled, cst_revoked, cst_expired)
703 ) THEN
704 -- do not include in counts
705 -- continue processing
706 v_add_in_totals := FALSE;
707 ELSE
708 v_adv_stnd_granting_status := p_asu_advstnd_granting_status;
709 END IF;
710 END IF;
711 END IF;
712
713 advp_get_adv_credit_pts (
714 p_person_id,
715 p_course_cd,
716 p_version_number,
717 v_adv_stnd_granting_status,
718 v_adv_stnd.unit_cd,
719 v_adv_stnd.version_number,
720 -- v_adv_stnd.prev_unit_cd,
724 v_credits,
721 -- v_adv_stnd.test_segment_id,
722 v_adv_stnd.unit_details_id,
723 v_adv_stnd.tst_rslt_dtls_id,
725 v_inst_credits,
726 p_asu_exmptn_institution_cd
727 );
728 v_credits := NVL (v_credits, 0);
729 v_inst_credits := NVL(v_inst_credits,0);
730 -- To handle null values
731
732 IF (v_add_in_totals = TRUE) THEN
733 -- add to exemption totals
734 -- only include total exempt IGS_PS_UNITs
735 IF (v_adv_stnd_granting_status = cst_approved) THEN
736 -- add achieveable_credit_points to v_total_exmptn_approved
737
738 v_total_exmptn_approved := v_total_exmptn_approved + v_inst_credits;
739 ELSE
740 -- add achieveable_credit_points to v_total_exmptn_granted
741 v_total_exmptn_granted := v_total_exmptn_granted + v_inst_credits;
742 END IF;
743 -- add to totals for validation
744 IF NOT p_include_approved
745 AND (v_adv_stnd_granting_status = cst_approved) THEN
746 -- don't include in totals
747 NULL;
748 ELSE
749 IF (v_adv_stnd.exemption_institution_cd IN
750 (cst_not_instn, cst_unknown)
751 ) THEN
752 -- add to external totals
753 v_external_adv_stnd_total := v_external_adv_stnd_total + v_credits;
754 ELSE
755 -- selecting the IGS_OR_INSTITUTION.local_institution_cd
756 OPEN c_local_inst_ind (v_adv_stnd.exemption_institution_cd);
757 FETCH c_local_inst_ind INTO v_local_inst_ind;
758
759 -- not in IGS_OR_INSTITUTION table, so add to external totals
760 IF (c_local_inst_ind%NOTFOUND) THEN
761 v_external_adv_stnd_total :=
762 v_external_adv_stnd_total + v_credits;
763 CLOSE c_local_inst_ind;
764 ELSE
765 CLOSE c_local_inst_ind;
766
767 IF (v_local_inst_ind = 'Y') THEN
768 -- add to internal totals
769 v_internal_adv_stnd_total :=
770 v_internal_adv_stnd_total + v_credits;
771 ELSE
772 -- add to external totals
773 v_external_adv_stnd_total :=
774 v_external_adv_stnd_total + v_credits;
775 END IF;
776 END IF;
777 END IF;
778 END IF;
779 END IF;
780 END LOOP;
781
782
783 --CLOSE v_av_cp_cur;
784 -- select IGS_AV_STND_UNIT_LVL for parameters
785 -- to add to existing totals
786
787 FOR v_unit_level IN c_adv_stnd_unit_level (
788 p_person_id,
789 p_course_cd,
790 p_version_number
791 ) LOOP
792 v_add_in_totals := TRUE;
793 v_adv_stnd_granting_status := v_unit_level.s_adv_stnd_granting_status;
794
795 IF (p_asul_unit_level IS NOT NULL) THEN
796 -- check the status of p_asul_unit_cd
797 IF (p_asul_unit_level = v_unit_level.unit_level
798 AND p_asul_exmptn_institution_cd =
799 v_unit_level.exemption_institution_cd
800 ) THEN
801 IF (p_asul_advstnd_granting_status IN
802 (cst_cancelled, cst_revoked, cst_expired)
803 ) THEN
804 -- do not include in counts
805 -- continue processing
806 v_add_in_totals := FALSE;
807 ELSE
808 v_adv_stnd_granting_status := p_asul_advstnd_granting_status;
809 END IF;
810 END IF;
811 END IF;
812
813 IF (v_add_in_totals = TRUE) THEN
814 -- add to exemption totals
815 IF (v_adv_stnd_granting_status = cst_approved) THEN
816 -- 16-Oct-2002; kdande; Bug# 2627933
817 -- Added check to see that the total approved exemption is < 999.999
818 -- Start of fix for Bug# 2627933
819 IF ((v_total_exmptn_approved + v_unit_level.credit_points) > 999.999) THEN
820 fnd_message.set_name ('IGS', 'IGS_GE_INVALID_VALUE');
821 igs_ge_msg_stack.ADD;
822 app_exception.raise_exception;
823 ELSIF (p_asul_exmptn_institution_cd IS NOT NULL) AND
824 (v_unit_level.exemption_institution_cd = p_asul_exmptn_institution_cd) THEN
825 v_total_exmptn_approved :=
826 v_total_exmptn_approved + v_unit_level.credit_points;
827 END IF;
828
829 -- End of fix for Bug# 2627933
830 ELSE
831 IF(p_asul_exmptn_institution_cd IS NOT NULL) AND
832 (v_unit_level.exemption_institution_cd = p_asul_exmptn_institution_cd) THEN
833 v_total_exmptn_granted :=
834 v_total_exmptn_granted + v_unit_level.credit_points;
835 END IF;
836 END IF;
837
838 -- add to totals for validation
839 IF NOT p_include_approved
843 ELSE
840 AND (v_adv_stnd_granting_status = cst_approved) THEN
841 -- don't include the totals
842 NULL;
844 IF (v_unit_level.exemption_institution_cd IN
845 (cst_not_instn, cst_unknown)
846 ) THEN
847 -- add to the external totals
848 v_external_adv_stnd_total :=
849 v_external_adv_stnd_total + v_unit_level.credit_points;
850 ELSE
851 -- selecting the IGS_OR_INSTITUTION.local_institution_cd
852 OPEN c_local_inst_ind (v_unit_level.exemption_institution_cd);
853 FETCH c_local_inst_ind INTO v_local_inst_ind;
854
855 -- not in IGS_OR_INSTITUTION table, so add to external totals
856 IF (c_local_inst_ind%NOTFOUND) THEN
857 v_external_adv_stnd_total :=
858 v_external_adv_stnd_total + v_unit_level.credit_points;
859 CLOSE c_local_inst_ind;
860 ELSE
861 CLOSE c_local_inst_ind;
862
863 IF (v_local_inst_ind = 'Y') THEN
864 -- add to internal totals
865 v_internal_adv_stnd_total :=
866 v_internal_adv_stnd_total + v_unit_level.credit_points;
867 ELSE
868 -- add to external totals
869 v_external_adv_stnd_total :=
870 v_external_adv_stnd_total + v_unit_level.credit_points;
871 END IF;
872 END IF;
873 END IF;
874 END IF;
875 END IF;
876 END LOOP;
877
878 -- after processing all records
879 -- set v_total_exmptn_perc_grnted to 0
880 -- if v_total_exmptn_granted or
881 -- v_credit_points_reqd is = 0, as
882 -- a division would produce an error
883 -- if trying to divide by 0
884 IF (v_total_exmptn_granted = 0
885 OR v_credit_points_reqd = 0
886 ) THEN
887 v_total_exmptn_perc_grntd := 0;
888 ELSE
889 -- determine IGS_PS_COURSE percentage covered by
890 -- advanced standing granted
891 -- can perform the division, as values are not 0
892 IF (((v_total_exmptn_granted/v_credit_points_reqd)*100) > 100) THEN
893 v_total_exmptn_perc_grntd := 100;
894 ELSE
895 v_total_exmptn_perc_grntd:=((v_total_exmptn_granted/v_credit_points_reqd)*100) ;
896 END IF;
897 END IF;
898
899 -- Check if granted total exceeds credit points
900 -- required for the IGS_PS_COURSE version.
901 -- Also check if the granted plus approved total exceeds the
902 -- credit points required for the IGS_PS_COURSE version.
903 IF NOT p_include_approved THEN
904 IF (v_total_exmptn_granted > v_credit_points_reqd) THEN
905 IF (p_asul_advstnd_granting_status = cst_granted
906 OR p_asu_advstnd_granting_status = cst_granted
907 ) THEN
908 p_total_exmptn_approved := v_total_exmptn_approved;
909 p_total_exmptn_granted := v_total_exmptn_granted;
910 p_total_exmptn_perc_grntd := v_total_exmptn_perc_grntd;
911 p_message_name := 'IGS_AV_MINIMUM_CREDIT_POINTS';
912 -- RETURN FALSE;
913 END IF;
914 END IF;
915 ELSE
916 IF ((v_total_exmptn_approved + v_total_exmptn_granted) >
917 v_credit_points_reqd
918 ) THEN
919 IF (p_asul_advstnd_granting_status = cst_approved
920 OR p_asu_advstnd_granting_status = cst_approved
921 ) THEN
922 p_total_exmptn_approved := v_total_exmptn_approved;
923 p_total_exmptn_granted := v_total_exmptn_granted;
924 p_total_exmptn_perc_grntd := v_total_exmptn_perc_grntd;
925 p_message_name := 'IGS_AV_MINIMUM_CREDIT_POINTS';
926 -- RETURN FALSE;
927 END IF;
928 END IF;
929 END IF;
930
931 -- check if totals exceed limits
932 -- external totals
933 IF (v_external_adv_stnd_total > v_ext_adv_stnd_limit) THEN
934 -- external limit exceeded
935 p_total_exmptn_approved := v_total_exmptn_approved;
936 p_total_exmptn_granted := v_total_exmptn_granted;
937 p_total_exmptn_perc_grntd := v_total_exmptn_perc_grntd;
938 p_message_name := 'IGS_AV_EXCEEDS_PRGVER_EXT_LMT';
939 RETURN FALSE;
940 END IF;
941
942 -- internal totals
943 IF (v_internal_adv_stnd_total > v_int_adv_stnd_limit) THEN
944 -- internal limit exceeded
945 p_total_exmptn_approved := v_total_exmptn_approved;
946 p_total_exmptn_granted := v_total_exmptn_granted;
947 p_total_exmptn_perc_grntd := v_total_exmptn_perc_grntd;
948 p_message_name := 'IGS_AV_EXCEEDS_PRGVER_INT_LMT';
949 RETURN FALSE;
950 END IF;
951
952 -- return totals
953 p_total_exmptn_approved := v_total_exmptn_approved;
954 p_total_exmptn_granted := v_total_exmptn_granted;
955 p_total_exmptn_perc_grntd := v_total_exmptn_perc_grntd;
956 -- p_message_name := null;
957 -- fnd_file.put_line(fnd_file.log,'returning true');
961 RETURN TRUE;
958 --dbms_output.put_line('exemption approved '||to_char(v_total_exmptn_approved));
959 --dbms_output.put_line('exemption granted '||to_char(v_total_exmptn_granted));
960 --dbms_output.put_line('exemption perc granted '||to_char(v_total_exmptn_perc_grntd));
962 fnd_file.put_line (fnd_file.LOG, 'returned');
963 EXCEPTION
964 WHEN OTHERS THEN
965 /*Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXP');
966 Fnd_Message.Set_Token('NAME','IGS_AV_VAL_ASU.ADVP_VAL_AS_TOTALS');
967 Igs_Ge_Msg_Stack.Add;*/
968 --dbms_output.put_line('igsavo4b '||sqlerrm);
969 app_exception.raise_exception;
970 END;
971 END advp_val_as_totals;
972 --
973 -- To get whether delete of student IGS_PS_UNIT attempt is allowed.
974 --
975 FUNCTION advp_get_ua_del_alwd (
976 p_cal_type IN VARCHAR2,
977 p_ci_sequence_number IN NUMBER,
978 p_effective_dt IN DATE
979 )
980 RETURN BOOLEAN IS
981 BEGIN
982 DECLARE
983 CURSOR c_daiv (
984 cp_cal_type igs_ca_inst.cal_type%TYPE,
985 cp_ci_seq_num igs_ca_inst.sequence_number%TYPE
986 ) IS
987 SELECT daiv.alias_val
988 FROM igs_ca_da_inst_v daiv,
989 igs_ge_s_gen_cal_con sgcc
990 WHERE daiv.cal_type = cp_cal_type
991 AND daiv.ci_sequence_number = cp_ci_seq_num
992 AND daiv.dt_alias = sgcc.census_dt_alias
993 AND sgcc.s_control_num = 1;
994 BEGIN
995 -- This module checks whether it is possible, as
996 -- at the effective date, to delete student IGS_PS_UNIT
997 -- attempts in the nominated teaching period
998 -- calendar instance, as a result of advanced
999 -- standing granting
1000 -- if p_effective_dt is greater than the census
1001 -- date, then do not allow deletion
1002 FOR v_daiv IN c_daiv (p_cal_type, p_ci_sequence_number) LOOP
1003 IF (p_effective_dt > v_daiv.alias_val) THEN
1004 RETURN FALSE;
1005 END IF;
1006 END LOOP;
1007
1008 RETURN TRUE;
1009 EXCEPTION
1010 WHEN OTHERS THEN
1011 fnd_message.set_name ('IGS', 'IGS_GE_UNHANDLED_EXP');
1012 fnd_message.set_token ('NAME', 'IGS_AV_VAL_ASU.ADVP_GET_UA_DEL_ALWD');
1013 igs_ge_msg_stack.ADD;
1014 app_exception.raise_exception;
1015 END;
1016 END advp_get_ua_del_alwd;
1017 --
1018 -- To validate the granting of advanced standing.
1019 -- shimitta 07-Mar-2006 BUg# 5068233
1020 FUNCTION advp_val_as_grant (
1021 p_person_id IN NUMBER,
1022 p_course_cd IN VARCHAR2,
1023 p_version_number IN NUMBER,
1024 p_s_adv_stnd_granting_status IN VARCHAR2,
1025 p_message_name OUT NOCOPY VARCHAR2
1026 )
1027 RETURN BOOLEAN IS
1028 BEGIN
1029 DECLARE
1030 CURSOR c_course_details (
1031 cp_person_id igs_en_stdnt_ps_att.person_id%TYPE,
1032 cp_course_cd igs_en_stdnt_ps_att.course_cd%TYPE
1033 ) IS
1034 SELECT sca.version_number,
1035 sca.course_attempt_status
1036 FROM igs_en_stdnt_ps_att sca
1037 WHERE sca.person_id = cp_person_id
1038 AND sca.course_cd = cp_course_cd;
1039
1040 v_other_detail VARCHAR2 (255);
1041 v_version_number igs_en_stdnt_ps_att.version_number%TYPE;
1042 v_course_attempt_status igs_en_stdnt_ps_att.course_attempt_status%TYPE;
1043 BEGIN
1044 -- This function validates that an advanced standing
1045 -- IGS_PS_UNIT can be granted.
1046 -- IGS_GE_NOTE : this does not include IGS_PE_PERSON encumbrance
1047 -- checks and IGS_PS_COURSE version advanced standing limit
1048 -- checks.
1049 -- This checks the IGS_AV_STND_UNIT.adv_stnd_granting
1050 -- status maps to APPROVED, the IGS_EN_STDNT_PS_ATT
1051 -- exists and has an attempt status of enrolled and
1052 -- the IGS_EN_STDNT_PS_ATT version matches the
1053 -- advanced standing approved.
1054 -- set the default message number
1055 p_message_name := NULL;
1056
1057 -- validate the input parameters
1058 IF (p_person_id IS NULL
1059 OR p_course_cd IS NULL
1060 OR p_version_number IS NULL
1061 OR p_s_adv_stnd_granting_status IS NULL
1062 ) THEN
1063 p_message_name := 'IGS_AV_INSUFFICIENT_INFO';
1064 RETURN FALSE;
1065 END IF;
1066
1067 -- validate that the current advanced standing
1068 -- status is approved
1069 IF (p_s_adv_stnd_granting_status <> 'APPROVED') THEN
1070 p_message_name := 'IGS_AV_GRANTED_CURSTATUS_APPR';
1071 RETURN FALSE;
1072 END IF;
1073
1074 -- validate that a IGS_EN_STDNT_PS_ATT exists,
1075 -- whether it is the correct version and has a
1076 -- IGS_PS_COURSE attempt status of 'ENROLLED'
1077 OPEN c_course_details (p_person_id, p_course_cd);
1078 FETCH c_course_details INTO v_version_number,
1079 v_course_attempt_status;
1080
1084 p_message_name := 'IGS_AV_GRANTED_STUDPRG_EXISTS';
1081 -- check if a record was found or not
1082 IF (c_course_details%NOTFOUND) THEN
1083 CLOSE c_course_details;
1085 RETURN FALSE;
1086 ELSE
1087 CLOSE c_course_details;
1088
1089 -- check if the versions are the same,
1090 -- which they must be
1091 IF (v_version_number <> p_version_number) THEN
1092 p_message_name := 'IGS_AV_GRANTED_STUD_PRGVER';
1093 RETURN FALSE;
1094 END IF;
1095
1096 -- check the IGS_PS_COURSE attempt status,
1097 -- which must be enrolled
1098 IF (v_course_attempt_status IN('UNCONFIRM', 'LAPSED', 'DELETED')) THEN
1099 p_message_name := 'IGS_AV_GRANTED_STUD_ENR';
1100 RETURN FALSE;
1101 ELSIF (v_course_attempt_status = 'INTERMIT') THEN
1102 p_message_name := 'IGS_AV_NOTGRANT_ON_INTERMISSI';
1103 RETURN FALSE;
1104 END IF;
1105 END IF;
1106
1107 -- set the default return type
1108 RETURN TRUE;
1109 EXCEPTION
1110 WHEN OTHERS THEN
1111 fnd_message.set_name ('IGS', 'IGS_GE_UNHANDLED_EXP');
1112 fnd_message.set_token ('NAME', 'IGS_AV_VAL_ASU.ADVP_VAL_AS_GRANT');
1113 igs_ge_msg_stack.ADD;
1114 app_exception.raise_exception;
1115 END;
1116 END advp_val_as_grant;
1117 --
1118 -- This procdure passes back advance standing credit points
1119 -- Intorduced as part of Academic Records Maintenance DLD
1120 -- MODIFIED BY DATE DESCRIPTION
1121 -- swaghmar 09-Dec-2005 Bug# 4869528
1122
1123 PROCEDURE advp_get_adv_credit_pts (
1124 p_person_id IN NUMBER,
1125 p_course_cd IN VARCHAR2,
1126 p_version_number IN NUMBER,
1127 p_s_adv_stnd_granting_status IN VARCHAR2,
1128 p_unit_cd IN VARCHAR2,
1129 p_unit_version IN NUMBER,
1130 -- p_previous_unit IN VARCHAR2,
1131 -- p_test_segment IN VARCHAR2,
1132 p_unit_details_id IN NUMBER,
1133 p_tst_rslt_dtls_id IN NUMBER,
1134 p_credit_points OUT NOCOPY NUMBER,
1135 p_inst_credit_points OUT NOCOPY NUMBER,
1136 p_exemption_institution_cd IN VARCHAR2
1137 ) AS
1138 CURSOR c_adv_pre_unit IS
1139 SELECT asu.achievable_credit_points advance_standing_cp,
1140 asu.exemption_institution_cd,
1141 /* asu.credit_percentage, */
1142 NVL (puv.achievable_credit_points, puv.enrolled_credit_points) enrolled_cp
1143 FROM igs_av_stnd_unit asu,
1144 igs_ps_unit_ver puv
1145 WHERE asu.person_id = p_person_id
1146 AND asu.as_course_cd = p_course_cd
1147 AND asu.as_version_number = p_version_number
1148 AND asu.unit_cd = p_unit_cd
1149 AND asu.version_number = p_unit_version
1150 AND
1151 --** asu.prev_unit_cd = p_previous_unit AND
1152 asu.unit_details_id = p_unit_details_id
1153 AND asu.s_adv_stnd_granting_status IN ('APPROVED', 'GRANTED')
1154 AND asu.s_adv_stnd_recognition_type = 'CREDIT'
1155 AND puv.unit_cd = asu.unit_cd
1156 AND puv.version_number = asu.version_number;
1157
1158 CURSOR c_adv_test IS
1159 SELECT asu.achievable_credit_points advance_standing_cp,
1160 asu.exemption_institution_cd,
1161 /* asu.credit_percentage, */
1162 NVL (puv.achievable_credit_points, puv.enrolled_credit_points) enrolled_cp
1163 FROM igs_av_stnd_unit asu,
1164 igs_ps_unit_ver puv
1165 WHERE asu.person_id = p_person_id
1166 AND asu.as_course_cd = p_course_cd
1167 AND asu.as_version_number = p_version_number
1168 AND asu.unit_cd = p_unit_cd
1169 AND asu.version_number = p_unit_version
1170 AND
1171 -- asu.test_Segment_id = p_test_segment AND
1172 asu.tst_rslt_dtls_id = p_tst_rslt_dtls_id
1173 AND asu.s_adv_stnd_granting_status IN ('APPROVED', 'GRANTED')
1174 AND asu.s_adv_stnd_recognition_type = 'CREDIT'
1175 AND puv.unit_cd = asu.unit_cd
1176 AND puv.version_number = asu.version_number;
1177
1178 l_adv_preunit c_adv_pre_unit%ROWTYPE;
1179 l_adv_test c_adv_test%ROWTYPE;
1180 BEGIN
1181 IF p_unit_details_id IS NOT NULL THEN
1182 -- if previous unit cd is not null then : 1. Checks whether credit points or credit
1183 -- percentage is null.If credit points is not null then
1184 -- selects achievable credit points from igs_av_stnd_unit table.If credit percentage
1185 -- equals 100 then selects achievable credit points from igs_ps_unit_ver table.
1186
1187 OPEN c_adv_pre_unit;
1188 FETCH c_adv_pre_unit INTO l_adv_preunit;
1189
1190 IF l_adv_preunit.advance_standing_cp IS NOT NULL THEN
1191 IF (p_exemption_institution_cd IS NOT NULL) AND
1192 (l_adv_preunit.exemption_institution_cd = p_exemption_institution_cd) THEN
1193 p_inst_credit_points :=l_adv_preunit.advance_standing_cp;
1194 END IF;
1195 p_credit_points := l_adv_preunit.advance_standing_cp;
1196 /* ELSIF l_adv_preunit.advance_standing_cp IS NULL
1197 AND l_adv_preunit.credit_percentage = 100 THEN
1201 CLOSE c_adv_pre_unit;
1198 p_credit_points := l_adv_preunit.enrolled_cp; */ --Obsoleted credit_percentage column as part of RECR50 Build.
1199 END IF;
1200
1202 ELSIF p_tst_rslt_dtls_id IS NOT NULL THEN
1203 -- if test segment is not null then : 1. Checks whether credit points or credit
1204 -- percentage is null.If credit points is not null then
1205 -- selects achievable credit points from igs_av_stnd_unit table.If credit percentage
1206 -- equals 100 then selects achievable credit points from igs_ps_unit_ver table.
1207
1208 OPEN c_adv_test;
1209 FETCH c_adv_test INTO l_adv_test;
1210
1211 IF l_adv_test.advance_standing_cp IS NOT NULL THEN
1212 IF (p_exemption_institution_cd IS NOT NULL) AND
1213 (l_adv_test.exemption_institution_cd = p_exemption_institution_cd) THEN
1214 p_inst_credit_points :=l_adv_test.advance_standing_cp;
1215 END IF;
1216 p_credit_points := l_adv_test.advance_standing_cp;
1217 /* ELSIF l_adv_test.advance_standing_cp IS NULL
1218 AND l_adv_test.credit_percentage = 100 THEN
1219 p_credit_points := l_adv_test.enrolled_cp; */ --Obsoleted credit_percentage column as part of RECR50 Build.
1220 END IF;
1221 END IF;
1222 END advp_get_adv_credit_pts;
1223 --
1224 -- Function to return whether advance standing is granted for a student
1225 --
1226 FUNCTION granted_adv_standing (
1227 p_person_id IN NUMBER,
1228 p_asu_course_cd IN VARCHAR2,
1229 p_asu_version_number IN NUMBER,
1230 p_unit_cd IN VARCHAR2,
1231 p_version_number IN NUMBER,
1232 p_s_adv_stnd_granting_status IN VARCHAR2,
1233 p_effective_dt IN DATE
1234 )
1235 RETURN VARCHAR2 AS
1236 CURSOR c_enrolled_cp IS
1237 SELECT NVL (achievable_credit_points, enrolled_credit_points) enrolled_cp
1238 FROM igs_ps_unit_ver
1239 WHERE unit_cd = p_unit_cd
1240 AND (version_number = p_version_number
1241 OR p_version_number IS NULL
1242 );
1243
1244 CURSOR c_adv_cp_sum IS
1245 SELECT DECODE (
1246 p_s_adv_stnd_granting_status,
1247 s_adv_stnd_granting_status, NVL (asu.achievable_credit_points, 0),
1248 'BOTH', NVL (asu.achievable_credit_points, 0),
1249 0
1250 ) advance_standing_credits,
1251 asu.unit_cd,
1252 asu.version_number,
1253 s_adv_stnd_granting_status
1254 FROM igs_av_stnd_unit asu
1255 WHERE asu.person_id = p_person_id
1256 AND asu.as_course_cd = p_asu_course_cd
1257 AND asu.as_version_number = p_asu_version_number
1258 AND asu.unit_cd = p_unit_cd
1259 AND (asu.version_number = p_version_number
1260 OR p_version_number IS NULL
1261 )
1262 AND asu.s_adv_stnd_granting_status IN ('GRANTED', 'APPROVED')
1263 AND asu.s_adv_stnd_recognition_type = 'CREDIT'
1264 AND (p_effective_dt IS NULL
1265 OR asu.granted_dt <= TRUNC (p_effective_dt)
1266 );
1267
1268 CURSOR c_adv_cp_per IS
1269 SELECT s_adv_stnd_granting_status
1270 FROM igs_av_stnd_unit asu
1271 WHERE asu.person_id = p_person_id
1272 AND asu.as_course_cd = p_asu_course_cd
1273 AND as_version_number = p_asu_version_number
1274 AND asu.unit_cd = p_unit_cd
1275 AND (asu.version_number = p_version_number
1276 OR p_version_number IS NULL
1277 )
1278 AND asu.s_adv_stnd_granting_status IN ('GRANTED', 'APPROVED')
1279 AND asu.s_adv_stnd_recognition_type = 'CREDIT'
1280 AND (p_effective_dt IS NULL
1281 OR asu.granted_dt <= TRUNC (p_effective_dt));
1282
1283 l_adv_credits c_adv_cp_sum%ROWTYPE;
1284 l_adv_per_credits c_adv_cp_per%ROWTYPE;
1285 l_enrolled_cp NUMBER;
1286 l_chk_exists NUMBER := 0;
1287 l_credits NUMBER := 0;
1288 l_appr_credits NUMBER := 0;
1289 l_grant_credits NUMBER := 0;
1290 l_gr_exists BOOLEAN := FALSE;
1291 l_appr_exists BOOLEAN := FALSE;
1292 BEGIN
1293 OPEN c_enrolled_cp;
1294 FETCH c_enrolled_cp INTO l_enrolled_cp;
1295 CLOSE c_enrolled_cp;
1296 OPEN c_adv_cp_sum;
1297
1298 LOOP
1299 FETCH c_adv_cp_sum INTO l_adv_credits;
1300 EXIT WHEN c_adv_cp_sum%NOTFOUND;
1301 l_chk_exists := l_chk_exists + 1;
1302 l_credits := l_credits + NVL (l_adv_credits.advance_standing_credits, 0);
1303
1304 IF l_adv_credits.s_adv_stnd_granting_status = 'APPROVED' THEN
1305 l_appr_credits :=
1306 l_appr_credits + NVL (
1307 l_adv_credits.advance_standing_credits,
1308 0
1309 );
1310 l_appr_exists := TRUE;
1311 ELSIF p_s_adv_stnd_granting_status = 'GRANTED' THEN
1312 l_grant_credits :=
1313 l_grant_credits + NVL (
1314 l_adv_credits.advance_standing_credits,
1315 0
1316 );
1317 l_gr_exists := TRUE;
1318 END IF;
1319 END LOOP;
1320
1321 CLOSE c_adv_cp_sum;
1322
1323 IF l_chk_exists = 0 THEN
1324 RETURN 'FALSE';
1325 ELSIF l_credits >= l_enrolled_cp THEN
1326 RETURN 'TRUE';
1327 ELSE
1328 OPEN c_adv_cp_per;
1329 FETCH c_adv_cp_per INTO l_adv_per_credits;
1330
1331 IF c_adv_cp_per%NOTFOUND THEN
1332 CLOSE c_adv_cp_per;
1333 RETURN 'FALSE';
1334 ELSIF (p_s_adv_stnd_granting_status =
1335 l_adv_per_credits.s_adv_stnd_granting_status
1336 )
1337 OR (p_s_adv_stnd_granting_status = 'BOTH') THEN
1338 CLOSE c_adv_cp_per;
1339 RETURN 'TRUE';
1340 ELSE
1341 CLOSE c_adv_cp_per;
1342 RETURN 'FALSE';
1343 END IF;
1344 END IF;
1345 END granted_adv_standing;
1346 --
1347 --
1348 --
1349 FUNCTION adv_credit_pts (
1350 p_person_id IN NUMBER,
1351 p_asu_course_cd IN VARCHAR2,
1352 p_asu_version_number IN NUMBER,
1353 p_unit_cd IN VARCHAR2,
1354 p_version_number IN NUMBER,
1355 p_s_adv_stnd_granting_status IN VARCHAR2,
1356 p_effective_dt IN DATE,
1357 p_cr_points OUT NOCOPY NUMBER,
1358 p_adv_grant_status OUT NOCOPY VARCHAR2,
1359 p_msg OUT NOCOPY VARCHAR2
1360 )
1361 RETURN BOOLEAN IS
1362 CURSOR c_enrolled_cp IS
1363 SELECT NVL (achievable_credit_points, enrolled_credit_points) enrolled_cp
1364 FROM igs_ps_unit_ver
1365 WHERE unit_cd = p_unit_cd
1366 AND (version_number = p_version_number
1367 OR p_version_number IS NULL
1368 );
1369
1370 CURSOR c_adv_cp_sum IS
1371 SELECT DECODE (
1372 p_s_adv_stnd_granting_status,
1373 s_adv_stnd_granting_status, NVL (asu.achievable_credit_points, 0),
1374 'BOTH', NVL (asu.achievable_credit_points, 0),
1375 0
1376 ) advance_standing_credits,
1377 asu.unit_cd,
1378 asu.version_number,
1379 s_adv_stnd_granting_status
1380 FROM igs_av_stnd_unit asu
1381 WHERE asu.person_id = p_person_id
1382 AND asu.as_course_cd = p_asu_course_cd
1383 AND asu.as_version_number = p_asu_version_number
1384 AND asu.unit_cd = p_unit_cd
1385 AND (asu.version_number = p_version_number
1386 OR p_version_number IS NULL
1387 )
1388 AND asu.s_adv_stnd_granting_status IN ('GRANTED', 'APPROVED')
1389 AND asu.s_adv_stnd_recognition_type = 'CREDIT'
1390 AND (p_effective_dt IS NULL
1391 OR asu.granted_dt <= TRUNC (p_effective_dt)
1392 );
1393
1394 CURSOR c_adv_cp_per IS
1395 SELECT s_adv_stnd_granting_status
1396 FROM igs_av_stnd_unit asu
1397 WHERE asu.person_id = p_person_id
1398 AND asu.as_course_cd = p_asu_course_cd
1399 AND as_version_number = p_asu_version_number
1400 AND asu.unit_cd = p_unit_cd
1401 AND (asu.version_number = p_version_number
1402 OR p_version_number IS NULL
1403 )
1404 AND asu.s_adv_stnd_granting_status IN ('GRANTED', 'APPROVED')
1405 AND asu.s_adv_stnd_recognition_type = 'CREDIT'
1406 AND p_effective_dt IS NULL
1407 OR asu.granted_dt <= TRUNC (p_effective_dt)
1408 /* AND credit_percentage = 100 */;
1409
1410 l_adv_credits c_adv_cp_sum%ROWTYPE;
1411 l_adv_per_credits c_adv_cp_per%ROWTYPE;
1412 l_enrolled_cp NUMBER;
1413 l_chk_exists NUMBER := 0;
1414 l_credits NUMBER := 0;
1415 l_appr_credits NUMBER := 0;
1416 l_grant_credits NUMBER := 0;
1417 l_gr_exists BOOLEAN := FALSE;
1418 l_appr_exists BOOLEAN := FALSE;
1419 BEGIN
1420 OPEN c_enrolled_cp;
1421 FETCH c_enrolled_cp INTO l_enrolled_cp;
1422 CLOSE c_enrolled_cp;
1423 OPEN c_adv_cp_sum;
1424
1425 LOOP
1426 FETCH c_adv_cp_sum INTO l_adv_credits;
1427 EXIT WHEN c_adv_cp_sum%NOTFOUND;
1428 l_chk_exists := l_chk_exists + 1;
1429 l_credits := l_credits + NVL (l_adv_credits.advance_standing_credits, 0);
1430
1431 IF l_adv_credits.s_adv_stnd_granting_status = 'APPROVED' THEN
1432 l_appr_credits :=
1433 l_appr_credits + NVL (
1434 l_adv_credits.advance_standing_credits,
1435 0
1436 );
1437 l_appr_exists := TRUE;
1438 ELSIF l_adv_credits.s_adv_stnd_granting_status = 'GRANTED' THEN
1439 l_grant_credits :=
1440 l_grant_credits + NVL (
1441 l_adv_credits.advance_standing_credits,
1442 0
1443 );
1444 l_gr_exists := TRUE;
1445 END IF;
1446 END LOOP;
1447
1448 CLOSE c_adv_cp_sum;
1449
1450 IF l_chk_exists = 0 THEN
1451 p_cr_points := 0;
1452 p_msg := 'IGS_AV_NO_PERSON_UNITS';
1453 RETURN FALSE;
1454 ELSIF l_credits >= l_enrolled_cp THEN
1455 p_cr_points := l_credits;
1456
1457 IF l_appr_exists
1458 AND l_gr_exists THEN
1459 p_adv_grant_status := 'BOTH';
1460 ELSIF l_appr_exists THEN
1461 p_adv_grant_status := 'APPROVED';
1462 ELSIF l_gr_exists THEN
1463 p_adv_grant_status := 'GRANTED';
1464 END IF;
1465
1466 RETURN TRUE;
1467 ELSE
1468 OPEN c_adv_cp_per;
1469 FETCH c_adv_cp_per INTO l_adv_per_credits;
1470
1471 IF c_adv_cp_per%NOTFOUND THEN
1472 CLOSE c_adv_cp_per;
1473 p_cr_points := l_credits; -- if there are no records with 100% then assign credits to calculated credits
1474 RETURN FALSE;
1475 ELSIF (p_s_adv_stnd_granting_status =
1476 l_adv_per_credits.s_adv_stnd_granting_status
1477 )
1478 OR (p_s_adv_stnd_granting_status = 'BOTH') THEN
1479 p_cr_points := l_enrolled_cp;
1480
1481 IF l_adv_per_credits.s_adv_stnd_granting_status = 'APPROVED' THEN
1482 p_adv_grant_status := 'APPROVED';
1483 ELSIF l_adv_per_credits.s_adv_stnd_granting_status = 'GRANTED' THEN
1484 p_adv_grant_status := 'GRANTED';
1485 END IF;
1486
1487 CLOSE c_adv_cp_per;
1488 RETURN TRUE;
1489 ELSE
1490 p_cr_points := l_credits; -- if there are no records with 100% then assign credits to calculated credits
1491 CLOSE c_adv_cp_per;
1492 RETURN FALSE;
1493 END IF;
1494 END IF;
1495 END adv_credit_pts;
1496 END igs_av_val_asu;