1 PACKAGE BODY igf_aw_packng_subfns AS
2 /* $Header: IGFAW09B.pls 120.10 2006/08/04 07:38:08 veramach ship $ */
3
4 /* ------------------------------------------------------------------
5 || Created By : avenkatr
6 || Created On : 20-JUN-2001
7 || Purpose :
8 || Known limitations, enhancements or remarks :
9 || skoppula
10 || The functionality of this procedure is changed to recieve the loan
11 || amounts for the student and then compare them against the Federal
12 || Stafford loan limits setup through IGFAW021.fmb
13 || museshad 15-Jun-2005 Build# FA157 - Bug# 4382371.
14 || Added the parameters - l_awd_period, l_called_from.
15 || As of now, these parameters (defaultable) will get passed only
16 || when called from the Packaging process (igf_aw_packaging).
17 || Passed these paramaters to get_class_stnd()
18 || to get the class standing data from anticipated data, if
19 || actual data is not available.
20 || sjadhav 09-Nov-2004 corrected garde level override comparsion
21 || veramach 11-Oct-2004 Obsoleted get_coa_months,stud_elig_chk
22 || veramach 11-NOV-2003 FA 125 Multiple distribution methods
23 || 1.Changed function signature of get_class_stnd to take adplans_id instead of fund_id
24 || 2.Award start date is chosen based on distribution plan setup instead of fund setup
25 ||
26 || veramach 07-OCT-2003 FA 124
27 || 1.Removed the procedure get_im_efc
28 || 2.Added the function is_over_award_occured
29 || brajendr 20-Dec-2002 Bug # 2706197
30 || Modifed the logic for get class standing process, removed the return statement.
31 ||
32 || brajendr 24-Oct-2002 FA105 / FA108 Builds
33 || Modified the references of Obsoleted Views
34 --------------------------------------------------------------------*/
35
36 PROCEDURE check_loan_limits( l_base_id IN NUMBER,
37 fund_type IN VARCHAR2,
38 l_award_id IN NUMBER,
39 l_adplans_id IN NUMBER,
40 l_aid IN OUT NOCOPY NUMBER,
41 l_std_loan_tab IN std_loan_tab DEFAULT NULL,
42 p_msg_name OUT NOCOPY VARCHAR2,
43 l_awd_period IN igf_aw_awd_prd_term.award_prd_cd%TYPE DEFAULT NULL,
44 l_called_from IN VARCHAR2 DEFAULT 'NON-PACKAGING',
45 p_chk_aggr_limit IN VARCHAR2 DEFAULT 'Y'
46 ) IS
47 /*
48 || Created By : avenkatr
49 || Created On : 20-JUN-2001
50 || Purpose :
51 || Known limitations, enhancements or remarks :
52 || Change History :
53 || Who When What
54 || (reverse chronological order - newest change first)
55 || bkkumar 14-Jan-04 Bug# 3360702
56 || Added the check for the l_aid to be negative and then returning with the
57 || appropriate message.
58 || cdcruz 05-feb-03 Bug# 2758804
59 || cursor c_get_status ref changed to pick active isisr
60 */
61
62 lv_class_standing igs_pr_css_class_std_v.class_standing%TYPE;
63 lv_course_type igs_ps_ver_all.course_type%TYPE;
64
65 CURSOR c_fabase_det IS
66 SELECT *
67 FROM igf_ap_fa_base_rec_all
68 WHERE base_id = l_base_id;
69
70 l_fabase_det c_fabase_det%ROWTYPE;
71
72 CURSOR c_get_status IS
73 SELECT dependency_status
74 FROM igf_ap_isir_matched_all
75 WHERE base_id = l_base_id AND
76 payment_isir = 'Y' AND
77 system_record_type = 'ORIGINAL';
78
79 l_get_status c_get_status%ROWTYPE;
80
81 CURSOR c_loan_limit_FFELP ( x_depend_stat igf_ap_isir_matched.dependency_status%TYPE,
82 x_fl_grad_lvl VARCHAR2,
83 x_ci_cal_type Varchar,
84 x_ci_sequence_number Number) IS
85 SELECT subs_annual_lt, tot_annual_lt, subs_aggr_lt, tot_aggr_lt
86 FROM igf_aw_loan_limit_all
87 WHERE ci_cal_type = x_ci_cal_type AND
88 ci_sequence_number = x_ci_sequence_number AND
89 depend_stat = x_depend_stat AND
90 ffelp_grade_level = x_fl_grad_lvl;
91
92
93 CURSOR c_loan_limit_DL( x_depend_stat igf_ap_isir_matched.dependency_status%TYPE,
94 x_ci_cal_type Varchar,
95 x_ci_sequence_number Number,
96 x_dl_grad_lvl VARCHAR2 ) IS
97 SELECT subs_annual_lt, tot_annual_lt, subs_aggr_lt, tot_aggr_lt
98 FROM igf_aw_loan_limit_all
99 WHERE ci_cal_type = x_ci_cal_type AND
100 ci_sequence_number = x_ci_sequence_number AND
101 depend_stat = x_depend_stat AND
102 dl_grade_level = x_dl_grad_lvl;
103
104 l_loan_limit c_loan_limit_DL%ROWTYPE;
105
106 -- Cursor to fetch the nslds loan aggregates and the transaction process
107 -- date from the isir matced table
108 CURSOR c_nslds_loans IS SELECT
109 NVL(nslds.nslds_agg_subsz_out_prin_bal,0) aggr_subs_loan,
110 NVL(nslds.nslds_agg_comb_out_prin_bal,0) aggr_total_loan,
111 isir.tran_process_date
112 FROM igf_ap_isir_matched_all isir,igf_ap_nslds_data nslds
113 WHERE nslds.base_id = l_base_id
114 AND isir.isir_id = nslds.isir_id
115 ORDER BY TO_NUMBER(nslds.transaction_num_txt) DESC;
116
117 l_nslds_loan_rec c_nslds_loans%ROWTYPE;
118
119 -- Cursor to pick up all those awards which have not yet gone into
120 -- the NSLDS database
121
122 CURSOR c_get_addtnl_awd(
123 cp_awd_date igf_aw_award.award_date%TYPE
124 ) IS
125 SELECT SUM (NVL (awd.offered_amt, 0)) loan_amt,
126 SUM (DECODE (
127 fcat.fed_fund_code,
128 'FLS', NVL (awd.offered_amt, 0),
129 'DLS', NVL (awd.offered_amt, 0),
130 0
131 )) subs_loan_amt
132 FROM igf_aw_award_all awd,
133 igf_aw_fund_mast fm,
134 igf_aw_fund_cat_all fcat,
135 igf_ap_fa_base_rec_all fa
136 WHERE fa.person_id IN (SELECT person_id
137 FROM igf_ap_fa_base_rec_all
138 WHERE base_id = l_base_id)
139 AND awd.base_id = fa.base_id
140 AND awd.fund_id = fm.fund_id
141 AND ( cp_awd_date IS NULL
142 OR TRUNC (awd.award_date) >= TRUNC (cp_awd_date))
143 AND awd.award_status IN ('OFFERED', 'ACCEPTED')
144 AND fcat.fund_code = fm.fund_code
145 AND fcat.fed_fund_code IN ('DLS', 'DLU', 'FLS', 'FLU');
146 l_addtnl_awd_rec c_get_addtnl_awd%ROWTYPE;
147
148 -- Cursor to check annual loan limits
149 CURSOR c_get_anl_awd IS
150 SELECT SUM(NVL(awd.offered_amt,0)) loan_amt,
151 SUM(DECODE(fcat.fed_fund_code,'FLS',
152 NVL(awd.offered_amt,0),'DLS',NVL(awd.offered_amt,0),0)) subs_loan_amt
153 FROM igf_aw_award_all awd,
154 igf_aw_fund_mast_all fm,
155 igf_aw_fund_cat_all fcat
156 WHERE awd.base_id = l_base_id
157 AND awd.fund_id = fm.fund_id
158 AND awd.award_status IN ('OFFERED','ACCEPTED')
159 AND fcat.fund_code = fm.fund_code
160 AND fcat.fed_fund_code IN ('DLS','DLU','FLS','FLU');
161
162 -- Cursor to determine the start date for the award
163
164 --
165 -- cursor to read grade level override
166 -- FA 134 Build, Loan Level Grade Level Override Impact
167 -- use this value if not null for CommonLine Checks
168 CURSOR cur_grade_overide(p_award_id NUMBER) IS
169 SELECT override_grade_level_code
170 FROM igf_sl_lor_all lor,
171 igf_sl_loans_all loan
172 WHERE loan.loan_id = lor.loan_id
173 AND loan.award_id = p_award_id;
174
175 grade_overide_rec cur_grade_overide%ROWTYPE;
176 lv_grd_lvl VARCHAR2(30);
177
178 l_anl_awd_rec c_get_anl_awd%ROWTYPE;
179 l_yr_loan_amt NUMBER := 0; -- Current year loan amount
180 l_aggr_loan_amt NUMBER := 0; -- Aggregate loan amount
181 l_yr_subs_amt NUMBER := 0; -- Current year subs. loan amount
182 l_aggr_subs_amt NUMBER := 0; -- Aggregate Subsidized loan amount
183 l_nsl_nc_ln_amt NUMBER := 0; -- This var. is used in the std_loan table to fetch
184 l_nsl_nc_sub_amt NUMBER := 0;
185 l_dl_std_code igf_ap_class_std_map.dl_std_code%TYPE;
186 l_cl_std_code igf_ap_class_std_map.cl_std_code%TYPE;
187 l_aggr_unsb_total NUMBER;
188 l_anul_unsub_total NUMBER;
189
190 BEGIN
191
192 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
193 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Parameter List - START');
194 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','In Param :l_base_id '|| l_base_id );
195 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','In Param :fund_type '|| fund_type );
196 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','In Param :l_award_id '|| l_award_id );
197 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','In Param :l_aid '|| l_aid );
198 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','In Param :l_adplans_id '|| l_adplans_id );
199 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','In Param :l_awd_period '|| l_awd_period );
200 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','In Param :l_called_from '|| l_called_from );
201 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','In Param :p_chk_aggr_limit '|| p_chk_aggr_limit );
202 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Parameter List - END');
203 END IF;
204
205 p_msg_name := NULL;
206
207 OPEN c_fabase_det;
208 FETCH c_fabase_det INTO l_fabase_det;
209 CLOSE c_fabase_det;
210
211 OPEN cur_grade_overide(l_award_id);
212 FETCH cur_grade_overide INTO grade_overide_rec;
213 CLOSE cur_grade_overide;
214
215 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
216 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','grade_overide '|| grade_overide_rec.override_grade_level_code);
217 END IF;
218 --
219 -- If there is not grade level override record
220 -- or if grade level override is null then derive class
221 -- standing
222 --
223 IF grade_overide_rec.override_grade_level_code IS NULL THEN
224 lv_class_standing := get_class_stnd(l_base_id,
225 l_fabase_det.person_id,
226 l_adplans_id,
227 l_award_id,
228 lv_course_type,
229 l_awd_period,
230 l_called_from);
231 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
232 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','lv_class_standing:'||lv_class_standing);
233 END IF;
234 IF lv_class_standing IS NULL THEN
235 p_msg_name := 'IGF_AW_CLS_STD_NOT_FND';
236 l_aid := 0;
237 RETURN;
238 END IF;
239 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
240 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','calling dl cl std code with parameters - base_id: ' ||l_base_id|| ', class standing: ' ||lv_class_standing|| ', course type: ' ||lv_course_type);
241 END IF;
242
243 igf_sl_lar_creation.get_dl_cl_std_code(l_base_id,
244 lv_class_standing,
245 lv_course_type,
246 l_dl_std_code,
247 l_cl_std_code);
248 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
249 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','after dl cl std code');
250 END IF;
251
252 IF l_dl_std_code IS NULL AND l_cl_std_code IS NULL THEN
253 p_msg_name := 'IGF_AW_CLSSTD_MAP_NOT_FND';
254 l_aid := 0;
255 RETURN;
256 END IF;
257 END IF;
258
259 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
260 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_dl_std_code: '||l_dl_std_code||' l_cl_std_code: '||l_cl_std_code);
261 END IF;
262
263 OPEN c_get_status ;
264 FETCH c_get_status INTO l_get_status;
265 IF c_get_status%NOTFOUND THEN
266 CLOSE c_get_status;
267 p_msg_name := 'IGF_AW_DEP_STAT_NOT_FND';
268 l_aid := 0;
269 RETURN;
270 END IF;
271 CLOSE c_get_status;
272
273 -- Fetching the aggregate loans (Subsidized and combined)
274
275 OPEN c_nslds_loans;
276 FETCH c_nslds_loans INTO l_nslds_loan_rec;
277 IF c_nslds_loans%NOTFOUND THEN
278 fnd_message.set_name('IGF','IGF_AW_NSLDS_NOT_FND');
279 igs_ge_msg_stack.add;
280 END IF;
281 CLOSE c_nslds_loans;
282
283 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
284 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_nslds_loan_rec.aggr_subs_loan: '||l_nslds_loan_rec.aggr_subs_loan);
285 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_nslds_loan_rec.aggr_total_loan: '||l_nslds_loan_rec.aggr_total_loan);
286 END IF;
287
288 IF l_std_loan_tab IS NOT NULL AND l_std_loan_tab.COUNT > 0 THEN -- check whether the table parameter is passed with rows
289
290 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
291 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_std_loan_tab.COUNT:'||l_std_loan_tab.COUNT);
292 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Inside the pl-sql tab IF');
293 END IF;
294
295
296 FOR i IN 1..l_std_loan_tab.COUNT LOOP
297
298 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
299 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Inside the pl-sql tab loop');
300 END IF;
301
302 l_yr_loan_amt := NVL(l_yr_loan_amt,0) + NVL(l_std_loan_tab(i).award_amount,0);
303
304 -- Log
305 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
306 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','added, to l_yr_loan_amt,award:'||NVL(l_std_loan_tab(i).award_amount,0)||' from:'||l_std_loan_tab(i).fund_code);
307 END IF;
308
309 IF l_std_loan_tab(i).award_date >= l_nslds_loan_rec.tran_process_date THEN
310 l_nsl_nc_ln_amt := NVL(l_nsl_nc_ln_amt,0) + NVL(l_std_loan_tab(i).award_amount,0);
311
312 -- Log
313 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
314 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','added, to l_nsl_nc_ln_amt,award:'||NVL(l_std_loan_tab(i).award_amount,0)||' from:'||l_std_loan_tab(i).fund_code);
315 END IF;
316 END IF;
317
318 IF l_std_loan_tab(i).fed_fund_code IN ('FLS','DLS') THEN
319 l_yr_subs_amt := NVL(l_yr_subs_amt,0) + NVL(l_std_loan_tab(i).award_amount,0);
320 -- Log
321 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
322 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','added, to l_yr_subs_amt,award:'||NVL(l_std_loan_tab(i).award_amount,0)||' from:'||l_std_loan_tab(i).fund_code);
323 END IF;
324
325 IF l_std_loan_tab(i).award_date >= l_nslds_loan_rec.tran_process_date THEN
326 l_nsl_nc_sub_amt := NVL(l_nsl_nc_sub_amt,0) + NVL(l_std_loan_tab(i).award_amount,0);
327
328 -- Log
329 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
330 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','added, to l_nsl_nc_sub_amt,award:'||NVL(l_std_loan_tab(i).award_amount,0)||' from:'||l_std_loan_tab(i).fund_code);
331 END IF;
332 END IF;
333 END IF;
334 END LOOP; -- End for loop of student table
335
336 ELSE
337
338 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
339 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Inside the pl-sql tab ELSE');
340 END IF;
341
342 OPEN c_get_anl_awd;
343 FETCH c_get_anl_awd INTO l_anl_awd_rec;
344 CLOSE c_get_anl_awd;
345
346 l_yr_loan_amt := NVL(l_anl_awd_rec.loan_amt,0);
347 l_yr_subs_amt := NVL(l_anl_awd_rec.subs_loan_amt,0);
348
349 OPEN c_get_addtnl_awd(l_nslds_loan_rec.tran_process_date);
350 FETCH c_get_addtnl_awd INTO l_addtnl_awd_rec;
351 CLOSE c_get_addtnl_awd;
352
353 l_nsl_nc_ln_amt := NVL(l_addtnl_awd_rec.loan_amt,0);
354 l_nsl_nc_sub_amt := NVL(l_addtnl_awd_rec.subs_loan_amt,0);
355
356 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
357 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_yr_loan_amt:'||l_yr_loan_amt);
358 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_yr_subs_amt:'||l_yr_subs_amt);
359 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_nsl_nc_ln_amt:'||l_nsl_nc_ln_amt);
360 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_nsl_nc_sub_amt:'||l_nsl_nc_sub_amt);
361 END IF;
362
363 END IF; --End of table parameter check
364
365 l_aggr_loan_amt := NVL(l_nslds_loan_rec.aggr_total_loan,0) + NVL(l_nsl_nc_ln_amt,0);
366 l_aggr_subs_amt := NVL(l_nslds_loan_rec.aggr_subs_loan,0) + NVL(l_nsl_nc_sub_amt,0);
367 -- here the unsub aggregate and subsidized amounts are calculated to be used ahead.
368 l_aggr_unsb_total := l_aggr_loan_amt - l_aggr_subs_amt;
369 l_anul_unsub_total := l_yr_loan_amt - l_yr_subs_amt;
370
371 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
372 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_aggr_loan_amt:'||l_aggr_loan_amt);
373 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_aggr_subs_amt:'||l_aggr_subs_amt);
374 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_aggr_unsb_total:'||l_aggr_unsb_total);
375 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_anul_unsub_total:'||l_anul_unsub_total);
376 END IF;
377
378 /* Added by svuppala as part of bug: 3416936 */
379 IF (l_fabase_det.adnl_unsub_loan_elig_flag ='Y' AND l_get_status.dependency_status ='D') THEN
380 l_get_status.dependency_status := 'I';
381 END IF;
382
383 IF grade_overide_rec.override_grade_level_code IS NOT NULL THEN
384 IF fund_type IN ('DLP','DLS','DLU') THEN
385 l_dl_std_code := grade_overide_rec.override_grade_level_code;
386 END IF;
387 IF fund_type IN ('FLP','FLS','FLU','ALT') THEN
388 l_cl_std_code := grade_overide_rec.override_grade_level_code;
389 END IF;
390 END IF;
391
392 IF fund_type IN ('DLP','DLS','DLU') THEN
393 OPEN c_loan_limit_dl(l_get_status.dependency_status,l_fabase_det.ci_cal_type,l_fabase_det.ci_sequence_number,l_dl_std_code);
394 FETCH c_loan_limit_dl INTO l_loan_limit;
395 END IF;
396
397 IF fund_type IN ('FLP','FLS','FLU','ALT') THEN
398 OPEN c_loan_limit_ffelp(l_get_status.dependency_status,l_cl_std_code,l_fabase_det.ci_cal_type,l_fabase_det.ci_sequence_number);
399 FETCH c_loan_limit_ffelp INTO l_loan_limit;
400 END IF;
401
402 IF (fund_type IN ('DLP','DLS','DLU') AND c_loan_limit_dl%FOUND)
403 OR (fund_type IN ('FLP','FLS','FLU','ALT') AND c_loan_limit_ffelp%FOUND) THEN
404
405 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
406 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Stafford loan limits(as in setup) for fund '||fund_type||':');
407 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_loan_limit.tot_aggr_lt:'||l_loan_limit.tot_aggr_lt);
408 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_loan_limit.tot_annual_lt:'||l_loan_limit.tot_annual_lt);
409 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_loan_limit.subs_aggr_lt:'||l_loan_limit.subs_aggr_lt);
410 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_loan_limit.subs_annual_lt:'||l_loan_limit.subs_annual_lt);
411 END IF;
412
413 -- Subs+Unsubs Aggr limit check
414 /* Check if loan is within aggregate loan limits and adjust the amount accordingly */
415 IF p_chk_aggr_limit = 'Y' THEN
416
417 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
418 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Total Aggr limit check - START');
419 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Total Aggr already received by student= ' ||NVL(l_aggr_loan_amt,0));
420 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Permissible Total Aggr(as in setup)= ' ||NVL(l_loan_limit.tot_aggr_lt,0));
421 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_aid(current loan amt)= ' ||NVL(l_aid,0));
422 END IF;
423
424 IF (( NVL(l_aggr_loan_amt,0) + NVL(l_aid,0)) > NVL(l_loan_limit.tot_aggr_lt,0) ) THEN
425 l_aid := NVL(l_loan_limit.tot_aggr_lt,0) - NVL(l_aggr_loan_amt,0);
426 END IF;
427
428 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
429 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Aggr l_aid(after adjustment): '||l_aid );
430 END IF;
431
432 -- if the l_aid is less than 0 it means that already the limits have been exhausted so just set the
433 -- appropriate the message and return.
434 IF l_aid < 0 THEN
435 p_msg_name := 'IGF_AW_AGGR_LMT_ERR';
436 IF c_loan_limit_dl%ISOPEN THEN
437 CLOSE c_loan_limit_dl;
438 END IF;
439 IF c_loan_limit_ffelp%ISOPEN THEN
440 CLOSE c_loan_limit_ffelp;
441 END IF;
442
443 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
444 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Total Aggr limit check FAILED with IGF_AW_AGGR_LMT_ERR');
445 END IF;
446
447 RETURN;
448 END IF;
449
450 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
451 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Total Aggr limit check PASSED');
452 END IF;
453 END IF; -- <<p_chk_aggr_limit>>
454
455 -- Subs+Unsubs Annual limit check
456 /* Check if loan is within annual loan limits and adjust the amount accordingly*/
457 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
458 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Total Annual limit check - START');
459 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Total Annual already received by student= ' ||NVL(l_yr_loan_amt,0));
460 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Permissible Total Annual(as in setup)= ' ||NVL(l_loan_limit.tot_annual_lt,0));
461 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_aid(current loan amt)= ' ||NVL(l_aid,0));
462 END IF;
463
464 IF (( NVL(l_yr_loan_amt,0) + NVL(l_aid,0)) > NVL(l_loan_limit.tot_annual_lt,0) ) THEN
465 l_aid := NVL(l_loan_limit.tot_annual_lt,0) - NVL(l_yr_loan_amt,0);
466 END IF;
467
468 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
469 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Annual l_aid(after adjustment) : '||l_aid );
470 END IF;
471
472 IF l_aid < 0 THEN
473 p_msg_name := 'IGF_AW_ANNUAL_LMT_ERR';
474
475 IF c_loan_limit_dl%ISOPEN THEN
476 CLOSE c_loan_limit_dl;
477 END IF;
478
479 IF c_loan_limit_ffelp%ISOPEN THEN
480 CLOSE c_loan_limit_ffelp;
481 END IF;
482
483 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
484 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Total Annual limit check FAILED with IGF_AW_ANNUAL_LMT_ERR');
485 END IF;
486
487 RETURN;
488 END IF;
489
490 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
491 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Total Annual limit check PASSED');
492 END IF;
493
494 /* Check if loan is a subsidized loan and then check whether annual and aggregate
495 subisidzed loan limits are met for the student and adjust the aid accordingly */
496 IF fund_type IN('DLS','FLS') THEN
497 -- Subsidized Aggr limit check
498 IF p_chk_aggr_limit = 'Y' THEN
499 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
500 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Subs Aggr limit check - START');
501 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Subs Aggr already received by student= ' ||NVL(l_aggr_subs_amt,0));
502 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Permissible Subs Aggr (as in setup)= ' ||NVL(l_loan_limit.subs_aggr_lt,0));
503 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_aid(current loan amt)= ' ||NVL(l_aid,0));
504 END IF;
505
506 IF (( NVL(l_aggr_subs_amt,0) + NVL(l_aid,0)) > NVL(l_loan_limit.subs_aggr_lt,0)) THEN
507
508 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
509 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_aggr_subs_amt + aid > l_loan_limit.subs_aggr_lt');
510 END IF;
511
512 l_aid := NVL(l_loan_limit.subs_aggr_lt,0) - NVL(l_aggr_subs_amt,0);
513 END IF;
514
515 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
516 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Subs Aggr l_aid(after adjustment) : '||l_aid );
517 END IF;
518
519 IF l_aid < 0 THEN
520 p_msg_name := 'IGF_AW_SUB_AGGR_LMT_ERR';
521 IF c_loan_limit_dl%ISOPEN THEN
522 CLOSE c_loan_limit_dl;
523 END IF;
524 IF c_loan_limit_ffelp%ISOPEN THEN
525 CLOSE c_loan_limit_ffelp;
526 END IF;
527
528 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
529 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Subs Aggr limit check FAILED with IGF_AW_SUB_AGGR_LMT_ERR');
530 END IF;
531
532 RETURN;
533 END IF;
534
535 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
536 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Subs Aggr limit check PASSED');
537 END IF;
538 END IF; -- <<p_chk_aggr_limit>>
539
540 -- Subsidized Annual limit check
541 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
542 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Subs Annual limit check - START');
543 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Subs Annual already received by student= ' ||NVL(l_yr_subs_amt,0));
544 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Permissible Subs Annual (as in setup)= ' ||NVL(l_loan_limit.subs_annual_lt,0));
545 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_aid(current loan amt)= ' ||NVL(l_aid,0));
546 END IF;
547
548 IF (( NVL(l_yr_subs_amt,0) + NVL(l_aid,0)) > NVL(l_loan_limit.subs_annual_lt,0)) THEN
549
550 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
551 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_yr_subs_amt + aid > l_loan_limit.subs_annual_lt');
552 END IF;
553
554 l_aid := NVL(l_loan_limit.subs_annual_lt,0) - NVL(l_yr_subs_amt,0);
555 END IF;
556
557 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
558 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Subs Annual l_aid(after adjustment) : '||l_aid );
559 END IF;
560
561 IF l_aid < 0 THEN
562 p_msg_name := 'IGF_AW_SUB_LMT_ERR';
563 IF c_loan_limit_dl%ISOPEN THEN
564 CLOSE c_loan_limit_dl;
565 END IF;
566 IF c_loan_limit_ffelp%ISOPEN THEN
567 CLOSE c_loan_limit_ffelp;
568 END IF;
569
570 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
571 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Subs Annual limit check FAILED with IGF_AW_SUB_LMT_ERR');
572 END IF;
573
574 RETURN;
575 END IF;
576
577 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
578 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Subs Annual limit check PASSED');
579 END IF;
580 END IF; -- << fund_type IN('DLS','FLS') >>
581
582 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
583 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','l_aid:'||l_aid);
584 END IF;
585
586 ELSIF (fund_type IN ('DLP','DLS','DLU') AND c_loan_limit_dl%NOTFOUND)
587 OR (fund_type IN ('FLP','FLS','FLU','ALT') AND c_loan_limit_ffelp%NOTFOUND) THEN
588 p_msg_name := 'IGF_AW_LOAN_LMT_NOT_FND';
589 l_aid := 0;
590
591 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
592 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.check_loan_limits.debug','Stafford loan limits not defined, msg is IGF_AW_LOAN_LMT_NOT_FND');
593 END IF;
594 END IF;
595
596 IF c_loan_limit_dl%ISOPEN THEN
597 CLOSE c_loan_limit_dl;
598 END IF;
599 IF c_loan_limit_ffelp%ISOPEN THEN
600 CLOSE c_loan_limit_ffelp;
601 END IF;
602
603 IF l_aid < 0 THEN
604 l_aid := 0;
605 END IF;
606 -- Commonline Loans
607 EXCEPTION
608 WHEN OTHERS THEN
609
610 FND_MESSAGE.SET_NAME('IGS','IGS_GE_UNHANDLED_EXP');
611 FND_MESSAGE.SET_TOKEN('NAME','igf_aw_packng_subfns.check_loan_limits');
612 IGS_GE_MSG_STACK.ADD;
613 APP_EXCEPTION.RAISE_EXCEPTION ;
614
615 END check_loan_limits;
616
617 PROCEDURE get_fed_efc(
618 l_base_id IN NUMBER,
619 l_awd_prd_code IN igf_aw_awd_prd_term.award_prd_cd%TYPE,
620 l_efc_f OUT NOCOPY NUMBER,
621 l_pell_efc OUT NOCOPY NUMBER,
622 l_efc_ay OUT NOCOPY NUMBER
623 ) IS
624 /*
625 || Created By : avenkatr
626 || Created On : 07-JUN-2001
627 || Purpose :
628 || Known limitations, enhancements or remarks :
629 || Change History :
630 || Who When What
631 || veramach 08-Apr-2004 bug 3547237
632 || Enforced a check that if auto_zero_efc is set to 'Y' in the active_isir,
633 || then the EFC must be zero
634 || brajendr 03-Dec-2003 FA 128 Isir Update
635 || Modified the logic for deriving the PELL EFC
636 ||
637 || rasahoo 27-Nov-2003 FA 128 Isir Update
638 || Changed the query string 'qry_str'
639 ||
640 || cdcruz 05-feb-03 Bug# 2758804 FACR105
641 || cursor c_isir_id ref changed to pick active isisr
642 */
643
644 CURSOR c_isir_id ( x_base_id igf_ap_fa_base_rec.base_id%TYPE ) IS
645 SELECT isir_id,
646 primary_efc,
647 NVL(auto_zero_efc,'N') auto_zero_efc
648 FROM igf_ap_isir_matched
649 WHERE base_id = x_base_id
650 AND active_isir = 'Y';
651
652 l_isir_id c_isir_id%ROWTYPE;
653
654 CURSOR c_pell_efc ( cp_base_id igf_ap_fa_base_rec.base_id%TYPE ) IS
655 SELECT DECODE(fa.award_fmly_contribution_type, 2, isir.secondary_efc, isir.primary_efc) pell_efc
656 FROM igf_ap_fa_base_rec_all fa,
657 igf_ap_isir_matched_all isir
658 WHERE fa.base_id = isir.base_id
659 AND fa.base_id = cp_base_id
660 AND isir.active_isir = 'Y';
661
662 lc_pell_efc c_pell_efc%ROWTYPE;
663
664 -- Get the details of
665 CURSOR get_awd_fmly_contrib_type(cp_base_id igf_ap_fa_base_rec.base_id%TYPE) IS
666 SELECT award_fmly_contribution_type
667 FROM igf_ap_fa_base_rec_all
668 WHERE base_id = cp_base_id;
669
670 lv_awd_fmly_contrib_type igf_ap_fa_base_rec.award_fmly_contribution_type%TYPE;
671
672 cur_rec NUMBER;
673 rows NUMBER;
674 qry_str VARCHAR2(200);
675
676 l_coa_months NUMBER;
677
678 CURSOR c_efc(
679 cp_isir_id igf_ap_isir_matched_all.isir_id%TYPE,
680 cp_months_num NUMBER,
681 cp_awd_fmly_contrib_type igf_ap_fa_base_rec_all.award_fmly_contribution_type%TYPE
682 ) IS
683 SELECT DECODE (
684 cp_awd_fmly_contrib_type,
685 2, DECODE (
686 cp_months_num,
687 1, isir.sec_alternate_month_1,
688 2, isir.sec_alternate_month_2,
689 3, isir.sec_alternate_month_3,
690 4, isir.sec_alternate_month_4,
691 5, isir.sec_alternate_month_5,
692 6, isir.sec_alternate_month_6,
693 7, isir.sec_alternate_month_7,
694 8, isir.sec_alternate_month_8,
695 9, isir.secondary_efc,
696 10, isir.sec_alternate_month_10,
697 11, isir.sec_alternate_month_11,
698 12, isir.sec_alternate_month_12
699 ),
700 DECODE (
701 cp_months_num,
702 1, isir.primary_alternate_month_1,
703 2, isir.primary_alternate_month_2,
704 3, isir.primary_alternate_month_3,
705 4, isir.primary_alternate_month_4,
706 5, isir.primary_alternate_month_5,
707 6, isir.primary_alternate_month_6,
708 7, isir.primary_alternate_month_7,
709 8, isir.primary_alternate_month_8,
710 9, isir.primary_efc,
711 10, isir.primary_alternate_month_10,
712 11, isir.primary_alternate_month_11,
713 12, isir.primary_alternate_month_12
714 )
715 ) efc
716 FROM igf_ap_isir_matched isir
717 WHERE isir.isir_id = cp_isir_id;
718
719 BEGIN
720
721 OPEN c_isir_id( l_base_id );
722 FETCH c_isir_id INTO l_isir_id ;
723
724 IF c_isir_id%NOTFOUND THEN
725 l_efc_f := NULL;
726 l_pell_efc := NULL;
727 l_efc_ay := NULL;
728
729 ELSE
730
731 l_efc_f := NULL;
732 l_pell_efc := NULL;
733 l_efc_ay := NULL;
734 --
735 -- Derive the NON-PELL EFC
736 --
737
738 /*
739 If primary_efc is zero and auto_zero_efc='Y', then EFC for all months should be zero
740 */
741 IF l_isir_id.primary_efc = 0 AND NVL(l_isir_id.auto_zero_efc,'*') = 'Y' THEN
742 l_efc_f := 0;
743 l_pell_efc := 0;
744 l_efc_ay := 0;
745 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
746 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.get_fed_efc.debug','since auto_zero_efc=Y, returning zero');
747 END IF;
748 RETURN;
749 END IF;
750
751 -- Get the Awarding Family contribution type to corresponsing months EFC
752 lv_awd_fmly_contrib_type := NULL;
753 OPEN get_awd_fmly_contrib_type(l_base_id);
754 FETCH get_awd_fmly_contrib_type INTO lv_awd_fmly_contrib_type;
755 CLOSE get_awd_fmly_contrib_type;
756
757 l_coa_months := igf_aw_coa_gen.coa_duration(l_base_id,l_awd_prd_code);
758 IF l_coa_months > 12 OR l_coa_months < 0 THEN
759 l_coa_months := 12;
760 END IF;
761
762 IF l_coa_months IS NULL OR l_coa_months = 0 THEN
763 l_efc_f := NULL;
764 l_efc_ay := NULL;
765 ELSE
766 -- If the EFC Type is set to SECONDARY, then use Seconday months, else use Primary months
767 OPEN c_efc(l_isir_id.isir_id,l_coa_months,lv_awd_fmly_contrib_type);
768 FETCH c_efc INTO l_efc_ay;
769 CLOSE c_efc;
770 END IF;
771 --
772 -- Derive the PELL EFC
773 --
774 lc_pell_efc := NULL;
775 OPEN c_pell_efc( l_base_id );
776 FETCH c_pell_efc INTO lc_pell_efc;
777 IF c_pell_efc%FOUND THEN
778 l_pell_efc := lc_pell_efc.pell_efc;
779 END IF;
780 CLOSE c_pell_efc;
781
782 END IF;
783 CLOSE c_isir_id ;
784
785 IF l_awd_prd_code IS NOT NULL THEN
786 l_efc_f := igf_aw_gen_004.efc_f(l_base_id,l_awd_prd_code);
787 ELSE
788 l_efc_f := NULL;
789 END IF;
790
791 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
792 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.get_fed_efc.debug','l_efc_f: '||l_efc_f||' l_pell_efc: '||l_pell_efc);
793 END IF;
794
795 EXCEPTION
796 WHEN OTHERS THEN
797 FND_MESSAGE.SET_NAME('IGS','IGS_GE_UNHANDLED_EXP');
798 FND_MESSAGE.SET_TOKEN('NAME','IGF_AW_PACKNG_SUBFNS.GET_FED_EFC '||SQLERRM);
799 IGS_GE_MSG_STACK.ADD;
800 l_efc_f := NULL;
801 l_pell_efc := NULL;
802 l_efc_ay := NULL;
803 END get_fed_efc;
804
805
806 FUNCTION get_class_stnd(
807 p_base_id IN igf_ap_fa_base_rec.base_id%TYPE,
808 p_person_id IN igf_ap_fa_base_rec.person_id%TYPE,
809 p_adplans_id IN NUMBER,
810 p_award_id IN igf_aw_award_all.award_id%TYPE,
811 p_course_type OUT NOCOPY igs_ps_ver_all.course_type%TYPE,
812 p_awd_period IN igf_aw_awd_prd_term.award_prd_cd%TYPE DEFAULT NULL,
813 p_called_from IN VARCHAR2 DEFAULT 'NON-PACKAGING'
814 ) RETURN CHAR IS
815
816 /*
817 || Created By : skoppula
818 || Created On : 29-MAY-2002
819 || Purpose : This function checks whether the minimum start date of the load calendar
820 || that is attached to the fund falls with in the current term. If it falls
821 || then it returns the actual class standig, otherwise it returns the class
822 || standing as on the minimum start date of the load calendar
823 || that is attached to the fund
824 || Known limitations, enhancements or remarks :
825 || Change History :
826 || Who When What
827 || (reverse chronological order - newest change first)
828 || museshad 21-Oct-2005 Added the check to ensure that p_award_id is not null when
829 || deriving Class Standing.
830 || museshad 16-Sep-2005 Bug 4604393
831 || Modified the logic for deriving predictive/actual Class Standing
832 || museshad 02-Jun-2005 Build# FA157 - Bug# 4382371.
833 || Use anticipated data for Class Standing and Program type if actual
834 || data is not available, when called from Packaging
835 || concurent process.
836 || Added the parameters - p_awd_period, p_called_from in the signature
837 || bkkumar 14-Jan-04 Bug# 3360702
838 || Added one new award_id parameter and changed the fund_id parameter to adplans_id
839 ||
840 || veramach 11-NOV-2003 FA 125 Multiple distribution methods
841 || 1.Changed function signature to take adplans_id instead of fund_id
842 || 2.Award start date is chosen based on distribution plan setup instead of fund setup
843 || rasahoo 01-09-2003 Removed cursor C_GET_PROG and all its references.
844 || called genric API to get the values of coloumns used in cursor C_GET_PROG
845 ||
846 || brajendr 20-Dec-2002 Bug # 2706197
847 || Modifed the logic for get class standing process, removed the return statement.
848 */
849
850 -- Cursor that fetches the key program from fa base h
851
852 l_acad_cal_type igs_ca_inst.cal_type%TYPE;
853 l_acad_seq_num igs_ca_inst.sequence_number%TYPE;
854 l_message VARCHAR2(4000);
855
856 -- Cursor that fetched the current enrolled term for
857 -- student
858 CURSOR c_enrl_dtl_cur IS SELECT
859 ci.cal_type enrl_load_cal_type,
860 ci.sequence_number enrl_load_seq_num ,
861 ci.alternate_code enrolled_term ,
862 TRUNC(ci.start_dt) enrolled_start_dt,
863 TRUNC(ci.end_dt) enrolled_end_dt
864 FROM
865 igs_ca_inst ci,
866 igs_ca_type cty
867 WHERE cty.s_cal_cat = 'LOAD'
868 AND cty.cal_type = ci.cal_type
869 AND (ci.cal_type, ci.sequence_number)
870 IN
871 (
872 SELECT sup_cal_type,
873 sup_ci_sequence_number
874 FROM igs_ca_inst_rel
875 WHERE sub_cal_type = l_acad_cal_type
876 AND sub_ci_sequence_number = l_acad_seq_num
877 UNION
878 SELECT sub_cal_type,
879 sub_ci_sequence_number
880 FROM igs_ca_inst_rel
881 WHERE sup_cal_type = l_acad_cal_type
882 AND sup_ci_sequence_number = l_acad_seq_num
883 )
884 AND
885 TRUNC(SYSDATE) BETWEEN TRUNC(ci.start_dt) AND TRUNC(ci.end_dt)
886 ORDER BY ci.start_dt;
887
888 l_enrl_dt_rec c_enrl_dtl_cur%ROWTYPE;
889
890 CURSOR c_get_awd_dt(
891 cp_adplans_id igf_aw_awd_dist_plans.adplans_id%TYPE
892 ) IS
893 SELECT MIN(terms.start_date) start_dt
894 FROM igf_aw_dp_terms_v terms
895 WHERE terms.adplans_id = cp_adplans_id;
896
897 CURSOR c_get_min_date(
898 cp_award_id igf_aw_award_all.award_id%TYPE
899 )IS
900 SELECT igf_aw_packaging.get_term_start_date(awd.base_id, disb.ld_cal_type, disb.ld_sequence_number) start_dt
901 FROM igf_aw_awd_disb_v disb,
902 igf_aw_award_all awd
903 WHERE disb.award_id = cp_award_id
904 AND disb.award_id = awd.award_id
905 ORDER BY igf_aw_packaging.get_term_start_date(awd.base_id, disb.ld_cal_type, disb.ld_sequence_number);
906
907 -- museshad (Bug# 4604393)
908 -- Get the start date of the earliest term in the (COA + DP) matching terms
909 CURSOR c_get_ear_term_st_date(
910 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
911 cp_adplans_id NUMBER
912 )
913 IS
914 SELECT igf_aw_packaging.get_term_start_date(cp_base_id, dp_terms.ld_cal_type, dp_terms.ld_sequence_number) ear_term_start_date
915 FROM
916 igf_aw_coa_term_tot_v coa_terms,
917 igf_aw_dp_terms dp_terms,
918 igf_aw_awd_dist_plans adplans
919 WHERE
920 dp_terms.ld_cal_type = coa_terms.ld_cal_type
921 AND dp_terms.ld_sequence_number = coa_terms.ld_sequence_number
922 AND dp_terms.adplans_id = adplans.adplans_id
923 AND coa_terms.base_id = cp_base_id
924 AND dp_terms.adplans_id = cp_adplans_id
925 ORDER BY igf_aw_packaging.get_term_start_date(cp_base_id, dp_terms.ld_cal_type, dp_terms.ld_sequence_number) ASC;
926
927 -- Get the start date of the earliest term in the DP matching terms
928 CURSOR c_get_ear_term_st_date_dp(
929 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
930 cp_adplans_id igf_aw_awd_dist_plans.adplans_id%TYPE
931 ) IS
932 SELECT igf_aw_packaging.get_term_start_date(cp_base_id, dp_terms.ld_cal_type, dp_terms.ld_sequence_number) ear_term_start_date
933 FROM igf_aw_dp_terms dp_terms,
934 igf_aw_awd_dist_plans adplans
935 WHERE dp_terms.adplans_id = adplans.adplans_id
936 AND dp_terms.adplans_id = cp_adplans_id
937 ORDER BY igf_aw_packaging.get_term_start_date(cp_base_id, dp_terms.ld_cal_type, dp_terms.ld_sequence_number) ASC;
938
939 -- Gets start date of the eariest term in the award
940 CURSOR c_get_ear_term_st_date_awd(
941 cp_award_id igf_aw_award_all.award_id%TYPE
942 ) IS
943 SELECT igf_aw_packaging.get_term_start_date(awd.base_id, disb.ld_cal_type, disb.ld_sequence_number) ear_term_start_date
944 FROM igf_aw_awd_disb_all disb,
945 igf_aw_award_all awd
946 WHERE awd.award_id = cp_award_id
947 AND awd.award_id = disb.award_id
948 ORDER BY igf_aw_packaging.get_term_start_date(awd.base_id, disb.ld_cal_type, disb.ld_sequence_number) ASC;
949
950 l_ear_term_start_date DATE;
951 l_pred_flag VARCHAR2(1);
952 -- museshad (Bug# 4604393)
953
954 l_awd_dt_rec c_get_awd_dt%ROWTYPE;
955 l_class_standing igs_pr_css_class_std_v.class_standing%TYPE := NULL;
956 l_course_cd VARCHAR2(10);
957 l_ver_number NUMBER;
958
959 -- Getting anticipated Class standing
960 -- Scans all the terms (starting from the earliest) in the awarding period
961 -- for a valid anticipated class standing. The first term that has a valid anticipated
962 -- class standing data is taken into consideration. The ROWNUM predicate is
963 -- added to avoid scanning other terms in the awarding period.
964 CURSOR c_get_ant_class_stnd(
965 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
966 cp_awd_per igf_aw_awd_prd_term.award_prd_cd%TYPE
967 )
968 IS
969 SELECT ant_data.class_standing class_standing,
970 ant_data.ld_cal_type load_cal_type,
971 ant_data.ld_sequence_number load_seq_num
972 FROM
973 igf_aw_awd_prd_term awd_per,
974 igs_ca_inst_all cal_inst,
975 igf_ap_fa_ant_data ant_data,
976 igf_ap_fa_base_rec_all fabase
977 WHERE
978 awd_per.ld_cal_type = cal_inst.cal_type AND
979 awd_per.ld_sequence_number = cal_inst.sequence_number AND
980 ant_data.ld_cal_type = awd_per.ld_cal_type AND
981 ant_data.ld_sequence_number = awd_per.ld_sequence_number AND
982 awd_per.ci_cal_type = fabase.ci_cal_type AND
983 awd_per.ci_sequence_number = fabase.ci_sequence_number AND
984 fabase.base_id = cp_base_id AND
985 awd_per.award_prd_cd = cp_awd_per AND
986 ant_data.base_id = cp_base_id AND
987 ant_data.class_standing IS NOT NULL
988 ORDER BY igf_aw_packaging.get_term_start_date(cp_base_id, awd_per.ld_cal_type, awd_per.ld_sequence_number) ASC;
989
990 l_get_ant_class_stnd_rec c_get_ant_class_stnd%ROWTYPE;
991
992 -- Getting anticipated Prog type
993 -- Scans all the terms (starting from the earliest) in the awarding period
994 -- for a valid anticipated Prog type. The first term that has a valid anticipated
995 -- Prog type data is taken into consideration. The ROWNUM predicate is
996 -- added to avoid scanning other terms in the awarding period.
997 CURSOR c_get_ant_prog_type(
998 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
999 cp_awd_per igf_aw_awd_prd_term.award_prd_cd%TYPE
1000 )
1001 IS
1002 SELECT ant_data.program_type prog_type,
1003 ant_data.ld_cal_type load_cal_type,
1004 ant_data.ld_sequence_number load_seq_num
1005 FROM
1006 igf_aw_awd_prd_term awd_per,
1007 igs_ca_inst_all cal_inst,
1008 igf_ap_fa_ant_data ant_data,
1009 igf_ap_fa_base_rec_all fabase
1010 WHERE
1011 awd_per.ld_cal_type = cal_inst.cal_type AND
1012 awd_per.ld_sequence_number = cal_inst.sequence_number AND
1013 ant_data.ld_cal_type = awd_per.ld_cal_type AND
1014 ant_data.ld_sequence_number = awd_per.ld_sequence_number AND
1015 awd_per.ci_cal_type = fabase.ci_cal_type AND
1016 awd_per.ci_sequence_number = fabase.ci_sequence_number AND
1017 fabase.base_id = cp_base_id AND
1018 awd_per.award_prd_cd = cp_awd_per AND
1019 ant_data.base_id = cp_base_id AND
1020 ant_data.program_type IS NOT NULL
1021 ORDER BY igf_aw_packaging.get_term_start_date(cp_base_id, awd_per.ld_cal_type, awd_per.ld_sequence_number) ASC;
1022
1023 l_get_ant_prog_type_rec c_get_ant_prog_type%ROWTYPE;
1024
1025 -- Get the award year Calendar details
1026 CURSOR c_get_cal_det(cp_base_id igf_ap_fa_base_rec.base_id%TYPE)
1027 IS
1028 SELECT ci_cal_type, ci_sequence_number
1029 FROM igf_ap_fa_base_rec
1030 WHERE base_id = cp_base_id;
1031
1032 l_get_cal_det_rec c_get_cal_det%ROWTYPE;
1033 l_ld_cal_type igs_ca_inst.cal_type%TYPE;
1034 l_ld_seq_num igs_ca_inst.sequence_number%TYPE;
1035
1036 BEGIN
1037
1038 -- Call generic API get_key_program to get the cource code
1039 igf_ap_gen_001.get_key_program(p_base_id,l_course_cd,l_ver_number);
1040 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1041 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.get_class_stnd.debug',
1042 'key_program_course_cd:'||l_course_cd||'key_program_version_number'||l_ver_number);
1043 END IF;
1044 igs_en_gen_015.get_academic_cal( p_person_id,l_course_cd,l_acad_cal_type,l_acad_seq_num,l_message);
1045 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1046 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.get_class_stnd.debug',
1047 'l_acad_cal_type:'||l_acad_cal_type||'l_acad_seq_num'||l_acad_seq_num||'l_message'||l_message);
1048 END IF;
1049
1050
1051 OPEN c_enrl_dtl_cur;
1052 FETCH c_enrl_dtl_cur INTO l_enrl_dt_Rec;
1053 CLOSE c_enrl_dtl_cur;
1054
1055 -- if the adplans_id is null use the award_id parameter otherwise adplans_id
1056 IF p_adplans_id IS NULL THEN
1057 OPEN c_get_min_date(p_award_id);
1058 FETCH c_get_min_date INTO l_awd_dt_rec;
1059 IF c_get_min_date%NOTFOUND THEN
1060 CLOSE c_get_min_date;
1061 RETURN l_class_standing;
1062 END IF;
1063 CLOSE c_get_min_date;
1064
1065 ELSE
1066 OPEN c_get_awd_dt(p_adplans_id);
1067 FETCH c_get_awd_dt INTO l_awd_dt_rec;
1068 IF c_get_awd_dt%NOTFOUND THEN
1069 CLOSE c_get_awd_dt;
1070 RETURN l_class_standing;
1071 END IF;
1072 CLOSE c_get_awd_dt;
1073 END IF;
1074
1075 -- museshad (Bug# 4604393)
1076 -- Derive Class Standing
1077 l_ear_term_start_date := NULL;
1078 IF igf_aw_gen_003.check_coa(p_base_id,p_awd_period) THEN
1079 OPEN c_get_ear_term_st_date(p_base_id, p_adplans_id);
1080 FETCH c_get_ear_term_st_date INTO l_ear_term_start_date;
1081 CLOSE c_get_ear_term_st_date;
1082 ELSE
1083 OPEN c_get_ear_term_st_date_dp(p_base_id, p_adplans_id);
1084 FETCH c_get_ear_term_st_date_dp INTO l_ear_term_start_date;
1085 CLOSE c_get_ear_term_st_date_dp;
1086 END IF;
1087
1088 IF l_ear_term_start_date IS NOT NULL THEN
1089
1090 IF l_ear_term_start_date > TRUNC(SYSDATE) THEN
1091 -- Predictive Class Standing
1092 l_pred_flag := 'Y';
1093
1094 -- Log message
1095 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1096 fnd_log.string(fnd_log.level_statement,
1097 'igf.plsql.igf_aw_packng_subfns.get_class_stnd.debug',
1098 'Computing PREDICTIVE class standing for date ' || TO_CHAR(l_ear_term_start_date, 'DD-MON-YYYY'));
1099 END IF;
1100 ELSE
1101 -- Actual Class Standing
1102 l_pred_flag := 'N';
1103
1104 -- Log message
1105 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1106 fnd_log.string(fnd_log.level_statement,
1107 'igf.plsql.igf_aw_packng_subfns.get_class_stnd.debug',
1108 'Computing ACTUAL class standing for date ' || TO_CHAR(l_ear_term_start_date, 'DD-MON-YYYY'));
1109 END IF;
1110 END IF;
1111
1112 -- Get Class Standing
1113 l_class_standing := igs_pr_get_class_std.get_class_standing(
1114 p_person_id => p_person_id,
1115 p_course_cd => l_course_cd,
1116 p_predictive_ind => l_pred_flag,
1117 p_effective_dt => l_ear_term_start_date,
1118 p_load_cal_type => NULL,
1119 p_load_ci_sequence_number => NULL
1120 );
1121
1122 -- Log message
1123 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1124 fnd_log.string(fnd_log.level_statement,
1125 'igf.plsql.igf_aw_packng_subfns.get_class_stnd.debug',
1126 'Class Standing= ' || l_class_standing);
1127 END IF;
1128 ELSIF p_award_id IS NOT NULL THEN
1129 /*
1130 If terms cannot be found from adplans_id, use award_id
1131 */
1132 OPEN c_get_ear_term_st_date_awd(p_award_id);
1133 FETCH c_get_ear_term_st_date_awd INTO l_ear_term_start_date;
1134 CLOSE c_get_ear_term_st_date_awd;
1135
1136 IF l_ear_term_start_date IS NOT NULL AND l_ear_term_start_date > TRUNC(SYSDATE) THEN
1137 l_pred_flag := 'Y';
1138 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1139 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.get_class_stnd.debug','computing predictive class standing for'||TO_CHAR(l_ear_term_start_date));
1140 END IF;
1141 ELSE
1142 l_pred_flag := 'N';
1143 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1144 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packng_subfns.get_class_stnd.debug','computing actual class standing for'||TO_CHAR(l_ear_term_start_date));
1145 END IF;
1146 END IF;
1147
1148 -- Get Class Standing
1149 l_class_standing := igs_pr_get_class_std.get_class_standing(
1150 p_person_id => p_person_id,
1151 p_course_cd => l_course_cd,
1152 p_predictive_ind => l_pred_flag,
1153 p_effective_dt => l_ear_term_start_date,
1154 p_load_cal_type => NULL,
1155 p_load_ci_sequence_number => NULL
1156 );
1157 END IF;
1158 -- museshad (Bug# 4604393)
1159
1160
1161
1162 -- Call generic API get_enrl_program_type to get Program Type
1163 p_course_type := igf_ap_gen_001.get_enrl_program_type(p_base_id);
1164
1165 -- If actual Prog type is not available, then get it from anticipated data
1166 -- We will get anticipated Prog type when -
1167 -- 1. Enrollment (Actual) Prog type data is not available
1168 -- Note: We don't look into Admissions for Prog type, bcoz Admissions does not provide
1169 -- this information.
1170 -- 2. Profile option permits to consider anticipated data
1171 -- 3. Call is from Packaging concurent process
1172 IF (p_course_type IS NULL) AND (igf_aw_coa_gen.canUseAnticipVal) AND (p_called_from = 'PACKAGING') THEN
1173
1174 -- Anticipated data is defined at the term level. But the Packaging concurrent process
1175 -- works at the awarding period level. We will scan each term (starting from the earliest)
1176 -- in the awarding period and get its anticipated data. If Prog type is found for a
1177 -- term, we will not consider the remaining terms.
1178
1179 OPEN c_get_ant_prog_type(
1180 cp_base_id => p_base_id,
1181 cp_awd_per => p_awd_period
1182 );
1183 FETCH c_get_ant_prog_type INTO l_get_ant_prog_type_rec;
1184
1185 IF (c_get_ant_prog_type%FOUND) THEN
1186 -- Found anticipated Prog type
1187 p_course_type := l_get_ant_prog_type_rec.prog_type;
1188
1189 -- Log message
1190 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1191 fnd_log.string(fnd_log.level_statement,
1192 'igf.plsql.igf_aw_packng_subfns.get_class_stnd.debug',
1193 'Actual Prog type not available, but found anticipated Prog type.');
1194 fnd_log.string(fnd_log.level_statement,
1195 'igf.plsql.igf_aw_packng_subfns.get_class_stnd.debug',
1196 'Base Id: ' ||NVL(p_base_id,'')|| '. Anticipated Prog type=' ||p_course_type|| ', Term cal type=' ||l_get_ant_prog_type_rec.load_cal_type|| ', Term sequence number=' ||l_get_ant_prog_type_rec.load_seq_num);
1197 END IF;
1198 ELSE
1199 -- Anticipated Prog type is not defined in
1200 -- any of the terms in the awarding period.
1201 p_course_type := NULL;
1202
1203 -- Log message
1204 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1205 fnd_log.string(fnd_log.level_statement,
1206 'igf.plsql.igf_aw_packng_subfns.get_class_stnd.debug',
1207 'Both actual and anticipated Prog type is not available for - ' ||'Base Id: ' ||NVL(p_base_id,'')|| ' for any of the terms in the awarding period: ' ||p_awd_period);
1208 END IF;
1209 END IF; -- End (c_get_ant_prog_type%FOUND)
1210
1211 CLOSE c_get_ant_prog_type;
1212 END IF;
1213
1214 -- If actual Class Standing is not available, then get it from anticipated data
1215 -- We will get anticipated Class Standing when -
1216 -- 1. Enrollment (Actual) Class Standing data is not available
1217 -- Note: We don't look into Admissions for Class Standing, bcoz Admissions does not provide
1218 -- this information.
1219 -- 2. Profile option permits to consider anticipated data
1220 -- 3. Call is from Packaging concurent process
1221 IF (l_class_standing IS NULL) AND (igf_aw_coa_gen.canUseAnticipVal) AND (p_called_from = 'PACKAGING') THEN
1222
1223 -- Anticipated data is defined at the term level. But the Packaging concurrent process
1224 -- works at the awarding period level. We will scan each term (starting from the earliest)
1225 -- in the awarding period and get its anticipated data. If class standing is found for a
1226 -- term, we will not consider the remaining terms.
1227
1228 OPEN c_get_ant_class_stnd(
1229 cp_base_id => p_base_id,
1230 cp_awd_per => p_awd_period
1231 );
1232 FETCH c_get_ant_class_stnd INTO l_get_ant_class_stnd_rec;
1233
1234 IF (c_get_ant_class_stnd%FOUND) THEN
1235 -- Found anticipated Class Standing
1236 l_class_standing := l_get_ant_class_stnd_rec.class_standing;
1237
1238 -- Log message
1239 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1240 fnd_log.string(fnd_log.level_statement,
1241 'igf.plsql.igf_aw_packng_subfns.get_class_stnd.debug',
1242 'Actual class standing data not available, but found anticipated class standing.');
1243 fnd_log.string(fnd_log.level_statement,
1244 'igf.plsql.igf_aw_packng_subfns.get_class_stnd.debug',
1245 'Base Id: ' ||NVL(p_base_id,'')|| '. Anticipated class standing =' ||l_class_standing|| ', Term cal type=' ||l_get_ant_class_stnd_rec.load_cal_type|| ', Term sequence number=' ||l_get_ant_class_stnd_rec.load_seq_num);
1246 END IF;
1247
1248 CLOSE c_get_ant_class_stnd;
1249 RETURN l_class_standing;
1250 END IF;
1251 CLOSE c_get_ant_class_stnd;
1252
1253 -- Anticipated class standing is not defined in any of the terms in the
1254 -- awarding period.
1255 l_class_standing := NULL;
1256
1257 -- Log message
1258 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1259 fnd_log.string(fnd_log.level_statement,
1260 'igf.plsql.igf_aw_packng_subfns.get_class_stnd.debug',
1261 'Both actual and anticipated class standing is not available for - ' ||'Base Id: ' ||NVL(p_base_id,'')|| ' for any of the terms in the awarding period: ' ||p_awd_period);
1262 END IF;
1263 END IF; -- End of (l_class_standing IS NULL) AND (igf_aw_coa_gen.canUseAnticipVal) AND (p_called_from = 'PACKAGING')
1264
1265 RETURN l_class_standing;
1266 END get_class_stnd;
1267
1268 FUNCTION is_over_award_occured(
1269 p_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
1270 p_mthd_type VARCHAR2 ,
1271 p_awd_prd_code igf_aw_awd_prd_term.award_prd_cd%TYPE
1272 ) RETURN BOOLEAN AS
1273 ------------------------------------------------------------------
1274 --Created by : veramach, Oracle India
1275 --Date created: 07-OCT-2003
1276 --
1277 --Purpose: To check if over award occurs for a person
1278 --
1279 --
1280 --Known limitations/enhancements and/or remarks:
1281 --
1282 --Change History:
1283 --Who When What
1284 -------------------------------------------------------------------
1285
1286 l_unmetneed NUMBER;
1287 l_award NUMBER;
1288
1289 BEGIN
1290 l_unmetneed := NULL;
1291 l_award := NULL;
1292
1293 l_unmetneed := igf_aw_gen_004.unmetneed_f(p_base_id,p_awd_prd_code);
1294 l_award := igf_aw_coa_gen.award_amount(p_base_id,p_awd_prd_code);
1295
1296 IF NVL(p_mthd_type,'ISIR') = 'ISIR' THEN
1297 IF NVL(l_award,0) <> 0 AND l_unmetneed < 0 THEN
1298 RETURN TRUE;
1299 ELSE
1300 RETURN FALSE;
1301 END IF;
1302 ELSIF NVL(p_mthd_type,'ISIR') = 'PROFILE' THEN
1303 IF NVL(l_award,0) <> 0 AND l_unmetneed < 0 THEN
1304 RETURN TRUE;
1305 ELSE
1306 RETURN FALSE;
1307 END IF;
1308 END IF;
1309
1310 END is_over_award_occured;
1311
1312 END igf_aw_packng_subfns;