1 PACKAGE BODY IGS_EN_VAL_PCE AS
2 /* $Header: IGSEN50B.pls 115.5 2002/11/29 00:02:08 nsidana ship $ */
3 --
4 -- bug id : 1956374
5 -- sjadhav , 28-aug-2001
6 -- modified procedure ENRP_VAL_PEE_TABLE
7 -- added code from IGSEN60B
8 --
9 -- Validate that IGS_PE_PERSON doesn't already have an open crs exclusion.
10 FUNCTION enrp_val_pce_open(
11 p_person_id IN NUMBER ,
12 p_encumbrance_type IN VARCHAR2 ,
13 p_pen_start_dt IN DATE ,
14 p_s_encmb_effect_type IN VARCHAR2 ,
15 p_pee_start_dt IN DATE ,
16 p_course_cd IN VARCHAR2 ,
17 p_pce_start_dt IN DATE ,
18 p_message_name OUT NOCOPY VARCHAR2)
19 RETURN BOOLEAN AS
20
21 BEGIN -- enrp_val_pce_open
22 -- Validate that there are no other "open ended" pce records
23 -- for the nominated encumbrance effect type
24 DECLARE
25 v_check VARCHAR2(1);
26 v_ret_val BOOLEAN DEFAULT TRUE;
27 CURSOR c_person_course_exclusion IS
28 SELECT 'x'
29 FROM IGS_PE_COURSE_EXCL
30 WHERE
31 person_id = p_person_id AND
32 encumbrance_type = p_encumbrance_type AND
33 pen_start_dt = p_pen_start_dt AND
34 s_encmb_effect_type = p_s_encmb_effect_type AND
35 pee_start_dt = p_pee_start_dt AND
36 course_cd = p_course_cd AND
37 expiry_dt IS NULL AND
38 pce_start_dt <> p_pce_start_dt;
39 BEGIN
40 p_message_name := NULL;
41 OPEN c_person_course_exclusion;
42 FETCH c_person_course_exclusion INTO v_check;
43 IF (c_person_course_exclusion%FOUND) THEN
44 -- open record already exists
45 IF (p_s_encmb_effect_type = 'EXC_COURSE') THEN
46 p_message_name := 'IGS_EN_PRSN_PRG_EXCLUSION';
47 v_ret_val := FALSE;
48 ELSE
49 p_message_name := 'IGS_EN_PRSN_PRG_SUSPENSION';
50 v_ret_val := FALSE;
51 END IF;
52 END IF;
53 CLOSE c_person_course_exclusion;
54 RETURN v_ret_val;
55 END;
56 EXCEPTION
57 WHEN OTHERS THEN
58 Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXP');
59 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_PCE.enrp_val_pce_open');
60 IGS_GE_MSG_STACK.ADD;
61 App_Exception.Raise_Exception;
62
63
64 END enrp_val_pce_open;
65 --
66 -- Routine to process pce rowids in PL/SQL TABLE for the current commit.
67 FUNCTION enrp_prc_pce_rowids(
68 p_inserting IN BOOLEAN ,
69 p_updating IN BOOLEAN ,
70 p_deleting IN BOOLEAN ,
71 p_message_name IN OUT NOCOPY VARCHAR2 )
72 RETURN BOOLEAN AS
73 v_index BINARY_INTEGER;
74 r_person_course_exclusion IGS_PE_COURSE_EXCL%ROWTYPE;
75 BEGIN
76 -- Process saved rows.
77 FOR v_index IN 1..gv_table_index - 1
78 LOOP
79 BEGIN
80 SELECT *
81 INTO r_person_course_exclusion
82 FROM IGS_PE_COURSE_EXCL
83 WHERE ROWID = gt_rowid_table(v_index);
84 EXCEPTION
85 WHEN OTHERS THEN
86 Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXP');
87 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_PCE.enrp_prc_pce_rowids');
88 IGS_GE_MSG_STACK.ADD;
89 App_Exception.Raise_Exception;
90
91
92 END;
93 -- Validate for open ended person_crs_exclusion records.
94 IF r_person_course_exclusion.expiry_dt IS NULL THEN
95 IF IGS_EN_VAL_PCE.enrp_val_pce_open (
96 r_person_course_exclusion.person_id,
97 r_person_course_exclusion.encumbrance_type,
98 r_person_course_exclusion.pen_start_dt,
99 r_person_course_exclusion.s_encmb_effect_type,
100 r_person_course_exclusion.pee_start_dt,
101 r_person_course_exclusion.course_cd,
102 r_person_course_exclusion.pce_start_dt,
103 p_message_name) = FALSE THEN
104 RETURN FALSE;
105 END IF;
106 END IF;
107 END LOOP;
108 RETURN TRUE;
109 END enrp_prc_pce_rowids;
110 --
111 --
112 -- To validate the nominated date is not less than current date..
113 FUNCTION enrp_val_encmb_dt(
114 p_date IN DATE ,
115 p_message_name OUT NOCOPY VARCHAR2)
116 RETURN BOOLEAN AS
117
118 BEGIN -- Validate that encumbrance date (start or expiry)
119 -- is greater or equal to the current date
120 DECLARE
121 BEGIN
122 p_message_name := NULL;
123 -- Validate input parameters
124 IF (p_date IS NULL) THEN
125 RETURN TRUE;
126 END IF;
127 -- Validate that parameter date is not less than the current date
128 IF (TRUNC(p_date) < TRUNC(SYSDATE)) THEN
129 p_message_name := 'IGS_EN_DT_NOT_LT_CURR_DT';
130 RETURN FALSE;
131 ELSE
132 RETURN TRUE;
133 END IF;
134 END;
135 EXCEPTION
136 WHEN OTHERS THEN
137 Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXP');
138 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_PCE.enrp_val_encmb_dt');
139 IGS_GE_MSG_STACK.ADD;
140 App_Exception.Raise_Exception;
141
142
143 END enrp_val_encmb_dt;
144 --
145 -- To validate that expiry date is greater than or equal to start date.
146 FUNCTION enrp_val_strt_exp_dt(
147 p_start_dt IN DATE ,
148 p_expiry_dt IN DATE ,
149 p_message_name OUT NOCOPY VARCHAR2)
150 RETURN BOOLEAN AS
151 BEGIN
152 IF p_expiry_dt < p_start_dt THEN
153 p_message_name := 'IGS_EN_EXPDT_GE_STDT';
154 RETURN FALSE;
155 END IF;
156 p_message_name := NULL;
157 RETURN TRUE;
158 END enrp_val_strt_exp_dt;
159 --
160 -- Validate if a IGS_PS_COURSE must be discontinued before it can excluded.
161 FUNCTION enrp_val_crs_exclsn(
162 p_person_id IN NUMBER ,
163 p_course_cd IN VARCHAR2 ,
164 p_exclusion_start_dt IN DATE ,
165 p_message_name OUT NOCOPY VARCHAR2,
166 p_return_type OUT NOCOPY VARCHAR2 )
167 RETURN BOOLEAN AS
168 e_get_census_dt_alias_failed EXCEPTION;
169 BEGIN -- enrp_val_crs_exlcsn
170 -- Validate if a IGS_PS_COURSE must be discontinued before
171 -- a IGS_PS_COURSE exclusion can be applied. It is assumed that this
172 -- module only ever invoked with an enrolled IGS_PS_COURSE.
173 DECLARE
174 cst_warn CONSTANT VARCHAR2(1) := 'W';
175 cst_error CONSTANT VARCHAR2(1) := 'E';
176 v_census_dt_alias IGS_GE_S_GEN_CAL_CON.census_dt_alias%TYPE;
177 v_person_enrolled BOOLEAN DEFAULT FALSE;
178 v_validate_failed BOOLEAN DEFAULT FALSE;
179 v_check VARCHAR2(1);
180 CURSOR c_get_census_dt_alias IS
181 SELECT census_dt_alias
182 FROM IGS_GE_S_GEN_CAL_CON
183 WHERE s_control_num = 1;
184 CURSOR c_student_unit_attempt IS
185 SELECT cal_type,
186 ci_sequence_number
187 FROM IGS_EN_SU_ATTEMPT
188 WHERE person_id = p_person_id AND
189 course_cd = p_course_cd AND
190 unit_attempt_status = 'ENROLLED';
191 CURSOR c_check_census_dt (
192 cp_cal_type IGS_CA_DA_INST_V.cal_type%TYPE,
193 cp_ci_sequence_number IGS_CA_DA_INST_V.ci_sequence_number%TYPE,
194 cp_dt_alias IGS_CA_DA_INST_V.dt_alias%TYPE) IS
195 SELECT 'x'
196 FROM IGS_CA_DA_INST_V
197 WHERE cal_type = cp_cal_type AND
198 ci_sequence_number = cp_ci_sequence_number AND
199 dt_alias = cp_dt_alias AND
200 NVL(alias_val,IGS_GE_DATE.IGSDATE('1900/01/01'))
201 >= p_exclusion_start_dt;
202 BEGIN
203 p_message_name := NULL;
204 -- Validate the input parameters
205 IF (p_person_id IS NULL OR
206 p_course_cd IS NULL OR
207 p_exclusion_start_dt IS NULL) THEN
208 RETURN TRUE;
209 END IF;
210 OPEN c_get_census_dt_alias;
211 FETCH c_get_census_dt_alias INTO v_census_dt_alias;
212 IF (c_get_census_dt_alias%NOTFOUND) THEN
213 CLOSE c_get_census_dt_alias;
214 RAISE e_get_census_dt_alias_failed;
215 END IF;
216 CLOSE c_get_census_dt_alias;
217 FOR v_sua_rec IN c_student_unit_attempt LOOP
218 v_person_enrolled := TRUE;
219 -- Check if the IGS_PE_PERSON is enrolled in units which have a census date after
220 -- the exclusion start date.
221 OPEN c_check_census_dt(v_sua_rec.cal_type,
222 v_sua_rec.ci_sequence_number,
223 v_census_dt_alias);
224 FETCH c_check_census_dt INTO v_check;
225 IF (c_check_census_dt%FOUND) THEN
226 CLOSE c_check_census_dt;
227 v_validate_failed := TRUE;
228 EXIT;
229 END IF;
230 CLOSE c_check_census_dt;
231 END LOOP;
232 IF (v_person_enrolled = FALSE) THEN
233 -- IGS_PE_PERSON is not enrolled in any units within the IGS_PS_COURSE
234 p_message_name := 'IGS_EN_CANT_APPLY_ENCUM_EFFEC';
235 p_return_type := cst_error;
236 RETURN FALSE;
237 END IF;
238 IF (v_validate_failed = TRUE) THEN
239 -- These units must be discontinued before the exclusion can be applied
240 p_message_name := 'IGS_EN_DISCON_STUD_ENRL';
241 p_return_type := cst_error;
242 RETURN FALSE;
243 END IF;
244 -- The IGS_PE_PERSON is not enrolled in any units within the IGS_PS_COURSE which have a
245 -- census date after the exclusion start date
246 -- Exclusion can be applied, but a warning will be displayed about the
247 -- enrolled IGS_PS_UNITs
248 p_message_name := 'IGS_EN_PERS_ENRL_EXCL_COURSE';
249 p_return_type := cst_warn;
250 RETURN TRUE;
251 END;
252 EXCEPTION
253 WHEN e_get_census_dt_alias_failed THEN
254 Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXP');
255 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_PCE.enrp_val_crs_exclsn 1');
256 IGS_GE_MSG_STACK.ADD;
257 App_Exception.Raise_Exception;
258
259
260 WHEN OTHERS THEN
261 Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXP');
262 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_PCE.enrp_val_crs_exclsn 2');
263 IGS_GE_MSG_STACK.ADD;
264 App_Exception.Raise_Exception;
265
266
267 END enrp_val_crs_exclsn;
268 --
269 -- Validate the IGS_PS_COURSE code on the IGS_PE_PERSON IGS_PS_COURSE exclusion table.
270 FUNCTION enrp_val_pce_crs(
271 p_person_id IN NUMBER ,
272 p_course_cd IN VARCHAR2 ,
273 p_exclusion_start_dt IN DATE ,
274 p_message_name OUT NOCOPY VARCHAR2,
275 p_return_type OUT NOCOPY VARCHAR2 )
276 RETURN BOOLEAN AS
277
278 BEGIN -- enrp_val_pce_crs
279 -- Validate whether or not a IGS_PE_PERSON is enrolled
280 -- in a specified IGS_PS_COURSE and whether or not the IGS_PS_COURSE must
281 -- be discontinue before a IGS_PS_COURSE exclusion can be applied
282 DECLARE
283 v_check VARCHAR2(1);
284 v_result BOOLEAN;
285 CURSOR c_person_exist IS
286 SELECT 'x'
287 FROM IGS_EN_STDNT_PS_ATT
288 WHERE person_id = p_person_id AND
289 course_cd = p_course_cd AND
290 course_attempt_status IN
291 ('ENROLLED', 'INACTIVE', 'INTERMIT');
292 BEGIN
293 p_message_name := NULL;
294 -- Validate input parameters
295 IF (p_person_id IS NULL OR
296 p_course_cd IS NULL OR
297 p_exclusion_start_dt IS NULL) THEN
298 RETURN TRUE;
299 END IF;
300 -- Check if the IGS_PE_PERSON is enrolled in the specified IGS_PS_COURSE
301 OPEN c_person_exist;
302 FETCH c_person_exist INTO v_check;
303 IF (c_person_exist%FOUND) THEN
304 CLOSE c_person_exist;
305 -- validate if the IGS_PS_COURSE must be discontinued
306 v_result := IGS_EN_VAL_PCE.enrp_val_crs_exclsn(
307 p_person_id,
308 p_course_cd,
309 p_exclusion_start_dt,
310 p_message_name,
311 p_return_type);
312 RETURN v_result;
313 END IF;
314 CLOSE c_person_exist;
315 -- IGS_PE_PERSON is not enrolled in the specified IGS_PS_COURSE
316 RETURN TRUE;
317 END;
318 EXCEPTION
319 WHEN OTHERS THEN
320 Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXP');
321 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_PCE.enrp_val_pce_crs');
322 IGS_GE_MSG_STACK.ADD;
323 App_Exception.Raise_Exception;
324
325
326 END enrp_val_pce_crs;
327 --
328 -- Validate the encumbrance effect table
329 FUNCTION enrp_val_pee_table(
330 p_effect_type IN VARCHAR2 ,
331 p_table_name IN VARCHAR2 ,
332 p_message_name OUT NOCOPY VARCHAR2)
333 RETURN BOOLEAN AS
334
335 BEGIN -- enrp_val_pee_table
336 -- Validate if records can be created in the nominated exclusion/requirement
337 -- table for the nominated s_encmb_effect_type
338 DECLARE
339 BEGIN
340 p_message_name := null;
341 IF (p_effect_type = 'EXC_CRS_GP' AND
342 p_table_name = 'IGS_PE_CRS_GRP_EXCL') THEN
343 RETURN TRUE;
344 ELSIF (p_effect_type IN('EXC_COURSE', 'SUS_COURSE') AND
345 p_table_name = 'IGS_PE_COURSE_EXCL') THEN
346 RETURN TRUE;
347 ELSIF (p_effect_type = 'EXC_CRS_U' AND
348 p_table_name = 'IGS_PE_PERS_UNT_EXCL') THEN
349 RETURN TRUE;
350 ELSIF (p_effect_type = 'RQRD_CRS_U' AND
351 p_table_name = 'IGS_PE_UNT_REQUIRMNT') THEN
352 RETURN TRUE;
353 ELSIF (p_effect_type = 'EXC_CRS_US' AND
354 p_table_name = 'IGS_PE_UNT_SET_EXCL') THEN
355 RETURN TRUE;
356 END IF;
357
358 -- Unable to create exclusion/requirement records for this
359 -- encumbrance effect type
360 p_message_name := 'IGS_EN_CANT_CREATE_REC_ENCUMB';
361 RETURN FALSE;
362 END;
363 EXCEPTION
364 WHEN OTHERS THEN
365 Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXP');
366 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_PCE.enrp_val_pee_table');
367 IGS_GE_MSG_STACK.ADD;
368 App_Exception.Raise_Exception;
369
370
371 END enrp_val_pee_table;
372 --
373 -- To validate that child date is not less than parent start date.
374 FUNCTION enrp_val_encmb_dts(
375 p_parent_start_dt IN DATE ,
376 p_child_start_dt IN DATE ,
377 p_message_name OUT NOCOPY VARCHAR2)
378 RETURN BOOLEAN AS
379
380 BEGIN -- enrp_val_encmb_dts
381 -- validate that a child encumbrace type record does not have
382 -- a start date less than of the parent record.
383 DECLARE
384 BEGIN
385 IF (p_child_start_dt < p_parent_start_dt) THEN
386 p_message_name := 'IGS_EN_CANT_SET_START_DATE';
387 RETURN FALSE;
388 END IF;
389 p_message_name := NULL;
390 RETURN TRUE;
391 END;
392 EXCEPTION
393 WHEN OTHERS THEN
394 Fnd_Message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXP');
395 FND_MESSAGE.SET_TOKEN('NAME', 'IGS_EN_VAL_PCE.enrp_val_encmb_dts');
396 IGS_GE_MSG_STACK.ADD;
397 App_Exception.Raise_Exception;
398
399
400 END enrp_val_encmb_dts;
401 END IGS_EN_VAL_PCE;