1 PACKAGE BODY igf_aw_packaging AS
2 /* $Header: IGFAW03B.pls 120.28 2006/08/04 07:37:00 veramach ship $ */
3
4 /*
5 || Created By : cdcruz
6 || Created On : 14-NOV-2000
7 || Purpose : Main Packaging process does all fund checks
8 || Known limitations, enhancements or remarks :
9 ||
10 || (reverse chronological order - newest change first)
11 || who WHEN what
12 ------------------------------------------------------------------------------------
13 || museshad 24-Apr-2006 Bug 5116534. Modified the logic to apply NSLDS date
14 || offset to the disb date in post_award().
15 || museshad 17-Apr-2006 Bug 5039489.
16 || 1) Negative entry was NOT getting posted to Student a/c when a
17 || disb gets cancelled during repackaging. This was
18 || happening bcoz disb_net_amt was NOT getting set to 0 while
19 || cancelling extra disb in the old award during repackaging.
20 || Note, this issue is applicable to awards from all funds.
21 || Also not directly relating to this bug, disb_paid_amt was
22 || getting set to 0 in this case which should not happen actually.
23 || Fixed these issues in post_award().
24 || 2) Fixed the ORDER BY sequence in merge_funds().
25 || 3) In cancel_invalid_award(), passed 0 to disb_gross_amt in
26 || igf_aw_awd_disb_pkg.update_row() call.
27 || Note: Issues 2 and 3 are additional fixes not directly related to the bug.
28 || museshad 14-Apr-2006 Bug 5042136.
29 || Origination Fee, Guarantor Fee, Interest Rebate Amount should
30 || become 0 when a disb gets cancelled. Fixed this in -
31 || cancel_invalid_award() and post_award().
32 || veramach 19/July/2005 Bug # 3392043 FA 140 Student SS Build
33 || Added option to publish/hide packaged/repackaged awards to Student SS
34 || Exclusive Inclusive funds checks now work for Repackaging too - Rejoice!!!!!
35 || Yet another indicator added for temporary awards - AR - which indicates an award
36 || cancelled due to exclusive inclusive checks
37 || museshad 11-Jul-2005 Build FA 157.
38 || 1) Disbursement Rounding
39 || 2) Validate program eligibility
40 || 3) Use anticipated data
41 || 4) Cancel ineligible awards in Repackaging
42 || veramach April 2005 bug # 4274177
43 || Paid amount was getting reset to zero on repackaging. Fixed this - repackaging
44 || now does not update paid amount
45 || veramach Oct/Nov 2004 FA 152 - Automatic Repackaging
46 || FA 137 - COA Enhancements
47 || Modified logic to bring in packaging per awarding period rather than the whole award year
48 || Modified logic to allow repackage existing awards
49 || Added new functions and modified signatures of existing functions
50 || ayedubat 12-OCT-2004 Changed the post_award procedure for FA 149 build bug # 3416863
51 || Fixed the GSCC warning "File.Sql.35 261, 2047, 3229, 7461-7462 - Do not assign default
52 || values in PL/SQL initialization or declaration" except for line number: 261
53 || veramach July 2004 FA 151 HR integration (bug # 3709292)
54 || Impact of obsoleting columns from igf_aw_awd_disb_pkg
55 -- sjadhav 04-Aug-2004 Corrected Group By
56 --
57 || veramach 30-Jun-2004 bug 3709109 - Added call to function check_disb to enforce the rule that FWS funds can
58 || have only one disbursement per term
59 || veramach 11-Jun-2004 bug # 3684031 Added a check so that packaging does not put holds on any award-packaging, as per
60 || current logic, does not overaward. Single-fund packaging does impose overaward holds if it overawards.
61 || veramach 04-Mar-2004 bug # 3484438 - Changed cursor cur_new_awards to properly join on igf_aw_fund_mast_all
62 || veramach 16-Feb-2004 bug # 3446214 - removed code from process_single_fund which uses award group.
63 || cdcruz 04-Dec-2003 FA 131 COD Updates
64 || Modified the pell wrapper used to calculate pell amount. one more return parameter added
65 || Pell Schedule Code
66 || Modified igf_sl_roundoff_digits_pkg.gross_fees_roundoff , as the package dropped a parameter
67 || Modified igf_sl_roundoff_digits_pkg.cl_gross_fees_roundoff , as the pkg dropped 2 parameters
68 || veramach 03-Dec-2003 FA 131 COD Updates
69 || Modifies the pell wrapper used to calculate pell amount. The same wrapper returns the disbursements
70 || get_disbursements uses this disbursements and not calculate disbursements
71 || veramach 20-NOV-2003 Added check_plan,get_plan_desc procedures
72 || veramach 10-NOV-2003 Added debug statements
73 || ugumall 30 OCT 03 Bug 3102439. Removed code references of IGF_AP_FA_SETUP
74 || commented code related to FISAP since the implementation
75 || is not being supported. Done as part of FA126 Build
76 || Commented the declarations of the following variables
77 || l_method, l_pct, l_fseog_cnt, l_fseog_sum,
78 || l_match_pct, cursor c_match_method
79 || and cursor variable l_method_rec.
80 || veramach 13-OCT-2003 FA 124 Build Remove ISIR Requirement for Awarding
81 || 1.Added logic to insert 2 rows into igf_aw_award_t table which holds IM/FM needs in calc_need
82 || 2.Added logic to error out if a student does not have active ISIR in multiple fund packaging in stud_run
83 || 3.Added logic as specified in the logic flow specified in the TD in process_stud
84 || 4.Added logic for validations on g_sf_max_award_amt,g_sf_min_award_amt,g_allow_to_exceed in run
85 || 5.Removed p_grp_code parameter and added p_sf_min_amount,p_sf_max_amount,p_allow_to_exceed in pkg_single_fund
86 || bkkumar 30-sep-2003 FA 122 Loans Enhancemnts
87 || Added base_id to the get_loan_fee1 and
88 || get_loan_fee2 and added l_auto_late_ind
89 || for teh CL Loans
90 || ugummall 25-SEP-2003 FA 126 - Multiple FA Offices.
91 || added new parameter assoc_org_num to
92 || igf_ap_fa_base_rec_pkg.update_row call.
93 ||
94 bkkumar 27-Aug-2003 Bug# 3071157 Added explicit date format mask to the
95 to_date() function.
96 sjadhav 06-Aug-2003 Bug 3062062
97 Modified post_award.
98 Added check to not create award if there
99 are no disbursements
100 || sjadhav 24-Jun-2003 Bug 2983181. elig status populated with 'N'
101 || bkkumar 04-jun-2003 Bug #2858504
102 || Added legacy_record_flag,award_number_txt
103 || in the table handler calls for
104 || igf_aw_award_pkg.insert_row
105 || Added legacy_record_flag
106 || in the table handler calls for igf_ap_td_item_inst_pkg.insert_row
107 ||
108 || rasahoo 19-May-2003 Bug # 2860836
109 || Added exception handling for resolving
110 || locking problem created by fund manager
111 || brajendr 07-Mar-2003 Bug # 2829487
112 || Added the call to update the Process status of the student after adding the TO Do Items
113 ||
114 || brajendr 27-Feb-2003 Bug # 2662487
115 || Modified the rounding off logic.
116 ||
117 || cdcruz 05-Feb-2003 Bug # 2758804
118 || Modified the ISIR record being picked as part of FACR105
119 ||
120 || brajendr 08-Jan-2003 Bug # 2762648
121 || Removed Function validate_student_efc call as this validation is necessary only for Packaging Process
122 ||
123 || brajendr 09-Jan-2003 Bug # 2740222
124 || Added different messages for each validation and gave more clarity in the log file.
125 ||
126 || brajendr 09-Jan-2003 Bug # 2733847 Modified the code for calculating the Running Totals and Last Disbursement.
127 || Bug # 2742000 Modified the logic for updating Notification Status.
128 || Earlier notification status is done only for Auto Packaging
129 ||
130 || brajendr 08-Jan-2003 Bug # 2710314
131 || Added a Function validate_student_efc
132 || for checking the validity of EFC
133 ||
134 || brajendr 18-Dec-2002 Bug # 2711114
135 || Added a new token for message IGF_AW_AWD_FUND_HOLD_FAIL
136 ||
137 || brajendr 18-Dec-2002 Bug # 2691832
138 || Modified the logic for updating the Packaging Status.
139 ||
140 || brajendr 17-Dec-2002 Bug # 2686797
141 || Modified the logic to round off the Amounts to 2 decimals before creating the disbursements.
142 || Last disb amouts are calculated using the remaining amount at the award level.
143 ||
144 || brajendr 10-Dec-2002 Bug # 2701470
145 || Modified the logic for not validating the packaging status for single fund process
146 ||
147 || brajendr 09-Dec-2002 Bug # 2676394
148 || Removed the referrences of the EFC from igf_ap_efc_det table to igf_ap_isir_matched table.
149 || Used igf_aw_packng_subfns.get_fed_efc to calculate the EFC
150 ||
151 || brajendr 07-NOV-2002 Bug # 2613536
152 || Added the code to skip the fund if there are holds for the person
153 ||
154 || brajendr 24-Oct-2002 FA105 / FA108 Builds
155 || Refer TDs for the changes
156 ||
157 || CDCRUZ 22-Oct-2002 FA105 / FA108 Build
158 || removes a parameter from igf_ap_efc_calc.get_efc_no_of_months
159 ||
160 || brajendr 18-Oct-2002 Bug : 2591643
161 || Modified the chk_todo_result for FA104 - To Do Enhancements
162 ||
163 || sjadhav Bug 2411031
164 || Changed sequence of calling igf_sl_award.get_loan_amts and
165 || igf_sl_roundoff_digits_pkg.gross_fees_roundoff. This is done
166 || becuase first round off disbursement gross amount should be
167 || calculated first and then net amount / fee amount etc
168 ||
169 || CDCRUZ 12-JUN-2002 Bug ID : 2412897
170 || Prkins loan was still included for Stafford Loan Limits chk
171 ||
172 ||
173 || CDCRUZ 07-JUN-2002 Bug ID : 2405510
174 || Students with Packaging Hold should not be packaged
175 ||
176 || CDCRUZ 05-JUN-2002 Bug ID : 2400556
177 || The group level maximum limits running totals were getting updated
178 || only for Non Entitlement Funds .
179 || Even though Entitlement bypasses this validation the running total
180 || As a result of this entitlement has to be updated for future funds.
181 ||
182 || adhawan 02-may-2002 Bug ID : 2330105
183 || Removed the logic , {If the Individual Packaging is set to "Y"
184 || and manually packaged is set to "N" then Packaging should skip that fund}
185 ||
186 || sjadhav 12-sep-2001 Bug ID : 1978618
187 || added exception param_err
188 || removed hard coded messages
189 ||
190 || sjadhav 24-jul-2001 Bug ID : 1818617
191 || added parameter p_get_recent_info
192 ||
193 || skoppula 26-apr-2002 Bug :2317853
194 || Changed the cursor in process_stud that is raising invalid
195 || NUMBER exception
196 ||
197 || pmarada 14-feb-2002 FACR008-correspondence Build,2213043
198 || Added a p_upd_awd_notif_status parameter in run and post_award.
199 || as part of FACR008-Correspondence build.
200 ||
201 || ssawhney 31-Oct-2001 Introduce changes in packaging due to FISAP.
202 || Check the percentage of matching funds for an FSEOG fund
203 || Modified process_stud () and update_fund ().
204 ||
205 || pmarada 23-Jul-2001 Bug ID : 1818617
206 || OSS Interface usage was changde to pick the
207 || attributes from FA-Base-History record
208 ||
209 || sjadhav May-21-2001 Bug ID : 1747948
210 || 1. Added one more parameter Group_Code in the callable 'run'
211 || 2. Added new cursor to get enrollment details from
212 || OSS Interface table
213 || 3. In Stud_Run, a student is skipped if it fails conditions
214 ||
215 || avenkatr 15-May-2001 Bug Id : 1755969 Maximum NUMBER of terms
216 || 1. Added check to test if Aid exceeds Max Award
217 || amount given in Fund manager in stud_run procedure.
218 ||
219 || avenkatr 01-May-2001 Bug Id : 1755969 Maximum NUMBER of terms
220 || 1. Corrected the check for Max NUMBER of terms of a fund.
221 ||
222 || avenkatr 01-May-2001 Bug Id : 1754396 General Award Issues
223 || 1. Added check to continue awarding for 'Replace FC'
224 || funds even WHEN Need is over.
225 || 2. Corrected the 'OverAward' check for funds.
226 || 3. Updated the remaining amt of the fund if the awards are
227 || packaged
228 ||
229 || avenkatr 25-APR-2001 Bug Id : 1750254 Self Help Limits.
230 || 1. Corrected the variable used for checking self help in
231 || procedure stud_run.
232 || 2. Added clear_simulation in stud_run procedure
233 ||
234 || avenkatr 19-APR-2001 Bug Id : 1726280 Rounding off process for Direct Loans.
235 || 1. Corrected the variable used for printing
236 || the Disbursement Gross amount.
237 ||
238 || mesriniv 20-APR-2001 Bug Id : 1723272 Process Requests.
239 || 1.In the Procedure post_award,Added a cursor c_person_number
240 || to fetch the person number for the Base Id.
241 || 2.Changed the Prompt and variable (l_base_id)
242 || for Display of Person number.
243 ||
244 || avenkatr 19-APR-2001 Bug Id : 1726280 Rounding off process for Direct Loans.
245 || 1. Corrected the variable used for printing the
246 || Disbursement Gross amount.
247 || 2. Corrected the NVL(offered_amt, accepted_amt) to
248 || NVL( accepted_amt, offered_amt) in procedures
249 || stud_run and post_award.
250 || 3. Removed the NVL for accepted_amt in the c_awd_grp
251 || cursor of stud_run procedure.
252 ||
253 || prchandr 06-APR-2001 Bug Id : 1726280 Rounding off process for Direct Loans.
254 || In procedure "post_award", a call is made to
255 || round off procedure incase of direct loans.
256 || Rounding off process. A call is made to roundoff process package
257 ||
258
259 || The Packaging for a Run Code/Target Group/Individual Student is done in this pkg
260 ||
261 || Pre-requisites
262 || The following tables have to be populated before calling this process
263 || igf_fa_base_rec
264 || igf_aw_fund_mast
265 || igf_aw_ssn_tp
266 ||
267 || The Cost of Attendance Process must be run before Running Packaging
268
269
270 -------------------------------------------------------------------------------
271 Important : The following are the statuses present for the igf_aw_award_t.flag
272 -------------------------------------------------------------------------------
273 AA - Already Awarded fund to the student.(Will exist only if the student has awards)
274 AW - Selected for Award, before Fund checks.
275 CF - Initial loaded INTO the temporary table.
276 DB - Disbursements of the Fund.
277 FL - Final Indication : Fund Ready to award after fund validations.
278 LD - Load Calendar details of the Fund.
279 ND - Need Calculated for the Fund.(Will exist only if the student does not have existing awards
280 OV - Over Award Indicator of the Fund.
281 RF - Rejected fund while Exclusive and Inclusive checks.
282 ST - Loaded students as per decreaseing need
283 AL - Awards loaded for the student and locked.
284 AU - Awards which are candidates for repackaging(Awards which are unlocked)
285 AC - Awards cancelled due to some reason,during repackaging
286 AR - Awards cancelled due to Exclusive Inclusive Checks
287 -------------------------------------------------------------------------------
288 */
289
290 g_sf_min_amount NUMBER;
291 g_sf_max_amount NUMBER;
292 g_persid_grp NUMBER := NULL;
293 g_over_awd VARCHAR2(30);
294 g_upd_awd_notif_status VARCHAR2(30);
295 g_verif_stat VARCHAR2(10);
296 -- g_sf_packaging VARCHAR2(1) := 'F';
297 g_sf_packaging VARCHAR2(1);
298 g_allow_to_exceed igf_lookups_view.lookup_code%TYPE;
299 g_fm_fc_methd igf_aw_fund_mast_all.fm_fc_methd%TYPE;
300 g_ci_cal_type igs_ca_inst_all.cal_type%TYPE;
301 g_ci_sequence igs_ca_inst_all.sequence_number%TYPE;
302 g_sf_fund igf_aw_fund_mast_all.fund_id%TYPE;
303
304 g_pell_tab igf_gr_pell_calc.pell_tab := igf_gr_pell_calc.pell_tab();
305
306 PARAM_ERR EXCEPTION;
307 NON_MERGABLE_FUNDS EXCEPTION;
308 INVALID_DISTR_PLAN EXCEPTION;
309 INV_FWS_AWARD EXCEPTION;
310 PELL_NO_REPACK EXCEPTION;
311
312 TYPE std_awards IS RECORD(
313 award_id NUMBER,
314 award NUMBER,
315 fund_id NUMBER,
316 replace_fc igf_aw_fund_mast_all.replace_fc%TYPE,
317 update_need igf_aw_fund_mast_all.update_need%TYPE,
318 entitlement igf_aw_fund_mast_all.entitlement%TYPE,
319 fed_fund_code igf_aw_fund_cat_all.fed_fund_code%TYPE,
320 fm_fc_methd igf_aw_fund_mast_all.fm_fc_methd%TYPE
321 );
322
323
324 TYPE std_aid IS RECORD(
325 base_id igf_ap_fa_base_rec_all.base_id%TYPE,
326 need_f igf_ap_fa_base_rec_all.need_f%TYPE,
327 awarded_aid igf_aw_award_all.offered_amt%TYPE
328 );
329
330 TYPE std_aid_tab IS TABLE OF std_aid;
331
332 TYPE fund_awd IS RECORD(
333 base_id igf_ap_fa_base_rec_all.base_id%TYPE,
334 fund_id igf_aw_fund_mast_all.fund_id%TYPE,
335 awd_prct NUMBER
336 );
337
338 TYPE std_fund_awd IS TABLE OF fund_awd;
339
340 g_fund_awd_prct std_fund_awd := std_fund_awd();
341 g_awarded_aid std_aid_tab := std_aid_tab();
342
343 FUNCTION check_disb(
344 p_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
345 p_adplans_id igf_aw_awd_dist_plans.adplans_id%TYPE,
346 p_awd_prd_code igf_aw_awd_prd_term.award_prd_cd%TYPE
347 ) RETURN BOOLEAN AS
348 ------------------------------------------------------------------
349 --Created by : veramach, Oracle India
350 --Date created: 21-Jun-2004
351 --
352 --Purpose:
353 -- bug 3709109 -> FWS funds can have only one disbursement per term
354 --
355 --Known limitations/enhancements and/or remarks:
356 --
357 --Change History:
358 --Who When What
359 -------------------------------------------------------------------
360 CURSOR c_term_wcoa(
361 cp_adplans_id igf_aw_awd_dist_plans.adplans_id%TYPE,
362 cp_award_prd_code igf_aw_awd_prd_term.award_prd_cd%TYPE
363 ) IS
364 SELECT COUNT(tp.adteach_id) tp,
365 COUNT(DISTINCT terms.adterms_id) terms
366 FROM igf_aw_dp_teach_prds tp,
367 igf_aw_dp_terms terms,
368 igf_aw_awd_dist_plans dp,
369 igf_aw_awd_prd_term aprd
370 WHERE terms.adterms_id = tp.adterms_id
371 AND terms.adplans_id = cp_adplans_id
372 AND terms.adplans_id = dp.adplans_id
373 AND dp.cal_type = aprd.ci_cal_type
374 AND dp.sequence_number = aprd.ci_sequence_number
375 AND aprd.ld_cal_type = terms.ld_cal_type
376 AND aprd.ld_sequence_number = terms.ld_sequence_number
377 AND aprd.award_prd_cd = cp_award_prd_code;
378
379 CURSOR c_term(
380 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
381 cp_adplans_id igf_aw_awd_dist_plans.adplans_id%TYPE,
382 cp_award_prd_code igf_aw_awd_prd_term.award_prd_cd%TYPE
383 ) IS
384 SELECT COUNT(tp.adteach_id) tp,
385 COUNT(DISTINCT terms.adterms_id) terms
386 FROM igf_aw_dp_teach_prds tp,
387 igf_aw_dp_terms terms,
388 (SELECT base_id,
389 ld_cal_type,
390 ld_sequence_number
391 FROM igf_aw_coa_itm_terms
392 WHERE base_id = cp_base_id
393 GROUP BY base_id, ld_cal_type, ld_sequence_number) coaterms,
394 igf_aw_awd_prd_term aprd,
395 igf_aw_awd_dist_plans dp
396 WHERE terms.adterms_id = tp.adterms_id
397 AND terms.adplans_id = cp_adplans_id
398 AND coaterms.ld_cal_type = terms.ld_cal_type
399 AND coaterms.ld_sequence_number = terms.ld_sequence_number
400 AND coaterms.base_id = cp_base_id
401 AND dp.adplans_id = terms.adplans_id
402 AND dp.cal_type = aprd.ci_cal_type
403 AND dp.sequence_number = aprd.ci_sequence_number
404 AND aprd.ld_cal_type = terms.ld_cal_type
405 AND aprd.ld_sequence_number = terms.ld_sequence_number
406 AND aprd.award_prd_cd = cp_award_prd_code;
407
408 l_tot_teach_prds NUMBER;
409 l_tot_terms NUMBER;
410
411 BEGIN
412 IF NOT igf_aw_gen_003.check_coa(p_base_id,p_awd_prd_code) THEN
413 OPEN c_term_wcoa(p_adplans_id,p_awd_prd_code);
414 FETCH c_term_wcoa INTO l_tot_teach_prds,l_tot_terms;
415 CLOSE c_term_wcoa;
416 ELSE
417 OPEN c_term(p_base_id,p_adplans_id,p_awd_prd_code);
418 FETCH c_term INTO l_tot_teach_prds,l_tot_terms;
419 CLOSE c_term;
420 END IF;
421
422 IF l_tot_teach_prds <> l_tot_terms THEN
423 RETURN FALSE;
424 ELSE
425 RETURN TRUE;
426 END IF;
427 END check_disb;
428
429 FUNCTION get_fed_fund_code(
430 p_fund_id NUMBER
431 ) RETURN VARCHAR2 IS
432 CURSOR cur_get_fund (p_fund_id NUMBER)
433 IS
434 SELECT fcat.fed_fund_code
435 FROM igf_aw_fund_cat fcat,
436 igf_aw_fund_mast fmast
437 WHERE fcat.fund_code = fmast.fund_code
438 AND fmast.fund_id = p_fund_id;
439
440 get_fund_rec cur_get_fund%ROWTYPE;
441
442 BEGIN
443 OPEN cur_get_fund(p_fund_id);
444 FETCH cur_get_fund INTO get_fund_rec;
445 CLOSE cur_get_fund;
446
447 RETURN get_fund_rec.fed_fund_code;
448
449 END get_fed_fund_code;
450
451 FUNCTION get_sys_fund_type(
452 p_fund_id NUMBER
453 ) RETURN VARCHAR2 IS
454 CURSOR cur_get_fund_type(
455 p_fund_id NUMBER
456 ) IS
457 SELECT fcat.sys_fund_type
458 FROM igf_aw_fund_cat fcat,
459 igf_aw_fund_mast fmast
460 WHERE fcat.fund_code = fmast.fund_code
461 AND fmast.fund_id = p_fund_id;
462
463 get_fund_rec cur_get_fund_type%ROWTYPE;
464
465 BEGIN
466 OPEN cur_get_fund_type(p_fund_id);
467 FETCH cur_get_fund_type INTO get_fund_rec;
468 CLOSE cur_get_fund_type;
469 RETURN get_fund_rec.sys_fund_type;
470 END get_sys_fund_type;
471
472 FUNCTION get_disb_round_factor(
473 p_fund_id IN igf_aw_fund_mast.fund_id%TYPE
474 )
475 RETURN VARCHAR2
476 IS
477 /*
478 || Created By : museshad
479 || Created On : 05-Jun-2005
480 || Purpose : Build# FA157 - Bug# 4382371
481 || Returns the disbursement rounding factor setup
482 || for the given fund
483 || Known limitations, enhancements or remarks :
484 || Change History :
485 || Who WHEN What
486 || (reverse chronological order - newest change first)
487 */
488 CURSOR c_get_disb_round_factor(cp_fund_id igf_aw_fund_mast.fund_id%TYPE)
489 IS
490 SELECT disb_rounding_code
491 FROM igf_aw_fund_mast
492 WHERE fund_id = cp_fund_id;
493
494 l_get_disb_round_factor c_get_disb_round_factor%ROWTYPE;
495 l_disb_round_factor igf_aw_fund_mast.disb_rounding_code%TYPE := NULL;
496 BEGIN
497 OPEN c_get_disb_round_factor(p_fund_id);
498 FETCH c_get_disb_round_factor INTO l_get_disb_round_factor;
499
500 IF (c_get_disb_round_factor%NOTFOUND) THEN
501 l_disb_round_factor := NULL;
502 ELSE
503 l_disb_round_factor := l_get_disb_round_factor.disb_rounding_code;
504 END IF;
505
506 RETURN l_disb_round_factor;
507 END get_disb_round_factor;
508
509 FUNCTION get_prog_elig(
510 p_prog_cd IN igs_ps_ver_v.course_cd%type,
511 p_prog_ver IN igs_ps_ver_v.version_number%type,
512 p_fund_source IN igf_aw_fund_cat_all.fund_source%type
513 )
514 RETURN BOOLEAN
515 IS
516 ------------------------------------------------------------------
517 --Created by : museshad
518 --Date created: 14-Jun-2005
519 --
520 --Purpose: Build# FA157 - Bug# 4382371.
521 -- Checks if the Program is eligible for the given fund.
522 -- When the Program details are got from actual data, the
523 -- version number of the program is also taken into consideration
524 -- to determine the eligibility. However, if the program details
525 -- are got from anticipated data, then the version details are not
526 -- available, bcoz the anticipated data does not define it.
527 -- In this case, if any one version of the program is eligible for
528 -- the fund, then the program is considered to be eligible.
529 --Known limitations/enhancements and/or remarks:
530 --
531 --Change History:
532 --Who When What
533 -------------------------------------------------------------------
534
535 -- Check program eligibility for actual data
536 CURSOR c_chk_prog_elig_with_ver(
537 cp_stud_program_cd igs_ps_ver_v.course_cd%type,
538 cp_stud_program_ver igs_ps_ver_v.version_number%type,
539 cp_fund_source igf_aw_fund_cat_all.fund_source%type
540 )
541 IS
542 SELECT DECODE(cp_fund_source,
543 'STATE', UPPER(state_financial_aid),
544 'FEDERAL', UPPER(federal_financial_aid),
545 'INSTITUTIONAL', UPPER(institutional_financial_aid),
546 NULL) prog_eligibility
547 FROM IGS_PS_VER_V
548 WHERE course_cd = cp_stud_program_cd AND
549 version_number = cp_stud_program_ver;
550
551 l_chk_prog_elig_with_ver c_chk_prog_elig_with_ver%ROWTYPE;
552
553 -- Check program eligibility for anticipated data
554 CURSOR c_chk_prog_elig_wout_ver(
555 cp_stud_program_cd igs_ps_ver_v.course_cd%type,
556 cp_fund_source igf_aw_fund_cat_all.fund_source%type
557 )
558 IS
559 SELECT 'x' FROM dual
560 WHERE EXISTS
561 ( SELECT * FROM IGS_PS_VER_V
562 WHERE course_cd = cp_stud_program_cd AND
563 DECODE(cp_fund_source,
564 'STATE', UPPER(state_financial_aid),
565 'FEDERAL', UPPER(federal_financial_aid),
566 'INSTITUTIONAL', UPPER(institutional_financial_aid),
567 NULL) = 'Y'
568 );
569
570 l_chk_prog_elig_wout_ver c_chk_prog_elig_wout_ver%ROWTYPE;
571 l_prog_eligibility BOOLEAN;
572
573 BEGIN
574
575 -- When the Program details are got from actual data, the version
576 -- details are available
577 IF p_prog_ver IS NOT NULL THEN -- p_prog_ver
578 OPEN c_chk_prog_elig_with_ver(p_prog_cd, p_prog_ver, p_fund_source);
579 FETCH c_chk_prog_elig_with_ver INTO l_chk_prog_elig_with_ver;
580
581 IF (c_chk_prog_elig_with_ver%FOUND) THEN -- l_chk_prog_elig_with_ver
582 IF l_chk_prog_elig_with_ver.prog_eligibility = 'Y' THEN
583 l_prog_eligibility := TRUE;
584 ELSE
585 l_prog_eligibility := FALSE;
586 END IF;
587 END IF; -- End of l_chk_prog_elig_with_ver
588 CLOSE c_chk_prog_elig_with_ver;
589
590 -- When the Program details are got from anticipated data, the version
591 -- details are not available
592 ELSE
593 OPEN c_chk_prog_elig_wout_ver(p_prog_cd, p_fund_source);
594 FETCH c_chk_prog_elig_wout_ver INTO l_chk_prog_elig_wout_ver;
595
596 IF (c_chk_prog_elig_wout_ver%FOUND) THEN
597 l_prog_eligibility := TRUE;
598 ELSE
599 l_prog_eligibility := FALSE;
600 END IF;
601 CLOSE c_chk_prog_elig_wout_ver;
602 END IF; -- End of p_prog_ver
603
604 RETURN l_prog_eligibility;
605 END get_prog_elig;
606
607 FUNCTION get_term_start_date(
608 p_base_id IN igf_ap_fa_base_rec_all.base_id%TYPE,
609 p_ld_cal_type IN igs_ca_inst.cal_type%TYPE,
610 p_ld_sequence_number IN igs_ca_inst.sequence_number%TYPE
611 )
612 RETURN DATE
613 IS
614 ------------------------------------------------------------------
615 --Created by : museshad
616 --Date created : 29-Jun-2005
617 --
618 --Purpose : Build# FA157 - Bug# 4382371.
619 -- Returns the start date of the term passed as parameter
620
621 --Known limitations/enhancements and/or remarks:
622 --
623 --Change History:
624 --Who When What
625 -------------------------------------------------------------------
626 l_program_cd igs_ps_ver_all.course_cd%TYPE;
627 l_version_num igs_ps_ver_all.version_number%TYPE;
628 l_program_type igs_ps_ver_all.course_type%TYPE;
629 l_org_unit igs_ps_ver_all.responsible_org_unit_cd%TYPE;
630 l_term_start_date DATE := NULL;
631 l_term_end_date DATE := NULL;
632
633 BEGIN
634
635 -- Log values
636 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
637 fnd_log.string(fnd_log.level_statement,
638 'igf.plsql.igf_aw_packaging.get_term_start_date.debug '|| g_req_id,
639 'IGF_AP_GEN_001.get_term_dates called with the following parameters: p_base_id/p_ld_cal_type/p_ld_sequence_number = ' ||p_base_id|| '/' ||p_ld_cal_type|| '/' ||p_ld_sequence_number);
640 END IF;
641
642 -- Get term's start date
643 IGF_AP_GEN_001.get_term_dates (
644 p_base_id,
645 p_ld_cal_type,
646 p_ld_sequence_number,
647 l_term_start_date,
648 l_term_end_date
649 );
650
651 -- Log Values
652 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
653 fnd_log.string(fnd_log.level_statement,
654 'igf.plsql.igf_aw_packaging.get_term_start_date.debug '|| g_req_id,
655 'After calling igs_ca_compute_da_val_pkg.cal_da_elt_val -> Start date of term ld_cal_type: ' ||p_ld_cal_type|| ', ld_sequence_number: ' ||p_ld_sequence_number|| ' is ' ||l_term_start_date
656 );
657 END IF;
658
659 RETURN l_term_start_date;
660 END get_term_start_date;
661
662 PROCEDURE get_plan_desc(
663 p_adplans_id IN igf_aw_awd_dist_plans.adplans_id%TYPE,
664 p_method_name OUT NOCOPY igf_aw_awd_dist_plans.awd_dist_plan_cd_desc%TYPE,
665 p_method_desc OUT NOCOPY igf_aw_awd_dist_plans_v.dist_plan_method_code_desc%TYPE
666 ) AS
667 ------------------------------------------------------------------
668 --Created by : veramach, Oracle India
669 --Date created:
670 --
671 --Purpose:
672 --
673 --
674 --Known limitations/enhancements and/or remarks:
675 --
676 --Change History:
677 --Who When What
678 -------------------------------------------------------------------
679 -- Get get plan desc
680 CURSOR c_plan(
681 cp_adplans_id igf_aw_awd_dist_plans.adplans_id%TYPE
682 ) IS
683 SELECT awd_dist_plan_cd_desc,
684 dist_plan_method_code_desc
685 FROM igf_aw_awd_dist_plans_v
686 WHERE adplans_id = cp_adplans_id;
687 l_plan c_plan%ROWTYPE;
688
689 BEGIN
690 OPEN c_plan(p_adplans_id);
691 FETCH c_plan INTO l_plan;
692 CLOSE c_plan;
693
694 IF l_plan.awd_dist_plan_cd_desc IS NOT NULL AND l_plan.dist_plan_method_code_desc IS NOT NULL THEN
695 p_method_name := l_plan.awd_dist_plan_cd_desc;
696 p_method_desc := l_plan.dist_plan_method_code_desc;
697 END IF;
698
699 EXCEPTION
700 WHEN OTHERS THEN
701 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
702 fnd_message.set_token('NAME','IGF_AW_PACKAGING.GET_PLAN_DESC '|| SQLERRM);
703 igs_ge_msg_stack.add;
704 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
705 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.get_plan_desc.exception '|| g_req_id,'sql error message: '||SQLERRM);
706 END IF;
707 app_exception.raise_exception;
708 END get_plan_desc;
709
710 PROCEDURE setAPProcStat(
711 p_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
712 p_award_prd_cd igf_aw_award_prd.award_prd_cd%TYPE,
713 p_awd_proc_status_code igf_aw_award_all.awd_proc_status_code%TYPE
714 ) AS
715 ------------------------------------------------------------------
716 --Created by : veramach, Oracle India
717 --Date created: 10/September/2005
718 --
719 --Purpose:
720 -- Sets the award process status for an awarding period
721 --
722 --Known limitations/enhancements and/or remarks:
723 --
724 --Change History:
725 --Who When What
726 -------------------------------------------------------------------
727 l_ci_cal_type igs_ca_inst_all.cal_type%TYPE;
728 l_ci_sequence_number igs_ca_inst_all.sequence_number%TYPE;
729
730 CURSOR c_awards IS
731 SELECT awd.ROWID row_id,
732 awd.*
733 FROM igf_aw_award_all awd,
734 igf_aw_fund_mast_all fmast
735 WHERE fmast.ci_cal_type = l_ci_cal_type
736 AND fmast.ci_sequence_number = l_ci_sequence_number
737 AND awd.fund_id = fmast.fund_id
738 AND awd.base_id = p_base_id
739 AND NOT EXISTS(
740 SELECT disb.ld_cal_type,
741 disb.ld_sequence_number
742 FROM igf_aw_awd_disb_all disb
743 WHERE disb.award_id = awd.award_id
744 MINUS
745 SELECT ld_cal_type,
746 ld_sequence_number
747 FROM igf_aw_awd_prd_term apt
748 WHERE apt.ci_cal_type = l_ci_cal_type
749 AND apt.ci_sequence_number = l_ci_sequence_number
750 AND apt.award_prd_cd = p_award_prd_cd);
751
752
753 CURSOR c_cal IS
754 SELECT fa.ci_cal_type,
755 fa.ci_sequence_number
756 FROM igf_ap_fa_base_rec_all fa
757 WHERE fa.base_id = p_base_id;
758
759 BEGIN
760
761 OPEN c_cal;
762 FETCH c_cal INTO l_ci_cal_type,l_ci_sequence_number;
763 CLOSE c_cal;
764
765 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
766 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.setAPProcStat.debug '|| g_req_id,'l_ci_cal_type:'||l_ci_cal_type||' l_ci_sequence_number:'||l_ci_sequence_number);
767 END IF;
768
769 FOR l_awards IN c_awards LOOP
770 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
771 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.setAPProcStat.debug '|| g_req_id,'l_awards.award_id:'||l_awards.award_id);
772 END IF;
773 igf_aw_award_pkg.update_row(
774 x_rowid => l_awards.row_id,
775 x_award_id => l_awards.award_id,
776 x_fund_id => l_awards.fund_id,
777 x_base_id => l_awards.base_id,
778 x_offered_amt => l_awards.offered_amt,
779 x_accepted_amt => l_awards.accepted_amt,
780 x_paid_amt => l_awards.paid_amt,
781 x_packaging_type => l_awards.packaging_type,
782 x_batch_id => l_awards.batch_id,
783 x_manual_update => l_awards.manual_update,
784 x_rules_override => l_awards.rules_override,
785 x_award_date => l_awards.award_date,
786 x_award_status => l_awards.award_status,
787 x_attribute_category => l_awards.attribute_category,
788 x_attribute1 => l_awards.attribute1,
789 x_attribute2 => l_awards.attribute2,
790 x_attribute3 => l_awards.attribute3,
791 x_attribute4 => l_awards.attribute4,
792 x_attribute5 => l_awards.attribute5,
793 x_attribute6 => l_awards.attribute6,
794 x_attribute7 => l_awards.attribute7,
795 x_attribute8 => l_awards.attribute8,
796 x_attribute9 => l_awards.attribute9,
797 x_attribute10 => l_awards.attribute10,
798 x_attribute11 => l_awards.attribute11,
799 x_attribute12 => l_awards.attribute12,
800 x_attribute13 => l_awards.attribute13,
801 x_attribute14 => l_awards.attribute14,
802 x_attribute15 => l_awards.attribute15,
803 x_attribute16 => l_awards.attribute16,
804 x_attribute17 => l_awards.attribute17,
805 x_attribute18 => l_awards.attribute18,
806 x_attribute19 => l_awards.attribute19,
807 x_attribute20 => l_awards.attribute20,
808 x_rvsn_id => l_awards.rvsn_id,
809 x_alt_pell_schedule => l_awards.alt_pell_schedule,
810 x_mode => 'R',
811 x_award_number_txt => l_awards.award_number_txt,
812 x_legacy_record_flag => l_awards.legacy_record_flag,
813 x_adplans_id => l_awards.adplans_id,
814 x_lock_award_flag => l_awards.lock_award_flag,
815 x_app_trans_num_txt => l_awards.app_trans_num_txt,
816 x_awd_proc_status_code => 'AWARDED',
817 x_notification_status_code => l_awards.notification_status_code,
818 x_notification_status_date => l_awards.notification_status_date,
819 x_publish_in_ss_flag => l_awards.publish_in_ss_flag
820 );
821 END LOOP;
822 EXCEPTION
823 WHEN OTHERS THEN
824 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
825 fnd_message.set_token('NAME','IGF_AW_PACKAGING.setAPProcStat '|| SQLERRM);
826 igs_ge_msg_stack.add;
827 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
828 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.setAPProcStat.exception '|| g_req_id,'sql error message: '||SQLERRM);
829 END IF;
830 app_exception.raise_exception;
831 END setAPProcStat;
832
833 PROCEDURE calc_students_needs(
834 p_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
835 p_coa igf_ap_fa_base_rec_all.coa_f%TYPE
836 ) AS
837 /*
838 || Created By : brajendr
839 || Created On :
840 || Purpose :
841 || Known limitations, enhancements or remarks :
842 || Change History :
843 || Who When What
844 || brajendr 09-Dec-2002 Bug # 2676394
845 || Removed the referrences of the EFC from igf_ap_efc_det table to igf_ap_isir_matched table.
846 || Used igf_aw_packng_subfns.get_fed_efc to calculate the EFC
847 || (reverse chronological order - newest change first)
848 */
849 l_efc_months NUMBER;
850 lv_rowid ROWID;
851 l_sl_number NUMBER;
852 l_normal_efc igf_ap_isir_matched_all.paid_efc%TYPE := 0;
853 l_pell_efc igf_ap_isir_matched_all.paid_efc%TYPE := 0;
854 l_efc_ay NUMBER := 0;
855 BEGIN
856
857 -- Get the month for which EFC should be calcualted
858 l_efc_months := igf_aw_coa_gen.coa_duration(p_base_id,g_awd_prd);
859
860 IF l_efc_months > 12 OR l_efc_months < 0 THEN
861 l_efc_months := 12;
862 END IF;
863
864 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
865 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_students_need.debug '|| g_req_id,' Calculating students need for l_efc_months: '||l_efc_months);
866 END IF;
867
868 -- Get the EFC value for Federal Methodology
869 igf_aw_packng_subfns.get_fed_efc(
870 p_base_id,
871 g_awd_prd,
872 l_normal_efc,
873 l_pell_efc,
874 l_efc_ay
875 );
876
877 -- Insert the Student into Temp Table.
878 lv_rowid := NULL;
879 l_sl_number := NULL;
880
881 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
882 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_students_need.debug '|| g_req_id,'Calculated NEED values are l_normal_efc: '||l_normal_efc||' and p_coa : '||p_coa);
883 END IF;
884
885 igf_aw_award_t_pkg.insert_row(
886 x_rowid => lv_rowid ,
887 x_process_id => l_process_id ,
888 x_sl_number => l_sl_number,
889 x_fund_id => NULL,
890 x_base_id => p_base_id,
891 x_offered_amt => NULL,
892 x_accepted_amt => NULL,
893 x_paid_amt => NULL,
894 x_need_reduction_amt => NULL,
895 x_flag => 'ST',
896 x_temp_num_val1 => l_normal_efc, -- Students EFC
897 x_temp_num_val2 => p_coa - l_normal_efc, -- Students Need
898 x_temp_char_val1 => NULL,
899 x_tp_cal_type => NULL,
900 x_tp_sequence_number => NULL,
901 x_ld_cal_type => NULL,
902 x_ld_sequence_number => NULL,
903 x_mode => 'R',
904 x_adplans_id => NULL,
905 x_app_trans_num_txt => NULL,
906 x_award_id => NULL,
907 x_lock_award_flag => NULL,
908 x_temp_val3_num => NULL,
909 x_temp_val4_num => NULL,
910 x_temp_char2_txt => NULL,
911 x_temp_char3_txt => NULL
912 );
913
914 EXCEPTION
915 WHEN OTHERS THEN
916 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
917 fnd_message.set_token('NAME','IGF_AW_PACKAGING.CALC_STUDENTS_NEEDS '||SQLERRM);
918 igs_ge_msg_stack.add;
919 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
920 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.calc_students_need.exception '|| g_req_id,'sql error message: '||SQLERRM);
921 END IF;
922 app_exception.raise_exception;
923
924 END calc_students_needs;
925
926 PROCEDURE check_plan(
927 p_adplans_id IN igf_aw_awd_dist_plans.adplans_id%TYPE,
928 p_result OUT NOCOPY VARCHAR2,
929 p_method_code OUT NOCOPY igf_aw_awd_dist_plans.dist_plan_method_code%TYPE
930 ) AS
931 ------------------------------------------------------------------
932 --Created by : veramach, Oracle India
933 --Date created: 20-NOV-2003
934 --
935 --Purpose:
936 --
937 --
938 --Known limitations/enhancements and/or remarks:
939 --
940 --Change History:
941 --Who When What
942 -------------------------------------------------------------------
943
944 --cursor to get distribution plan code
945 CURSOR cur_get_plan_cd(
946 cp_adplans_id igf_aw_awd_dist_plans.adplans_id%TYPE
947 ) IS
948 SELECT awd_dist_plan_cd,
949 awd_dist_plan_cd_desc,
950 dist_plan_method_code
951 FROM igf_aw_awd_dist_plans
952 WHERE adplans_id = cp_adplans_id;
953 l_get_plan_cd cur_get_plan_cd%ROWTYPE;
954
955 BEGIN
956 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
957 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.check_plan.debug '|| g_req_id,'p_adplans_id:'||p_adplans_id);
958 END IF;
959 p_result := 'TRUE';
960
961 OPEN cur_get_plan_cd(p_adplans_id);
962 FETCH cur_get_plan_cd INTO l_get_plan_cd;
963
964 IF cur_get_plan_cd%NOTFOUND THEN
965 p_result := 'IGF_AW_DIST_CODE_FAIL';
966 CLOSE cur_get_plan_cd;
967 ELSE
968 CLOSE cur_get_plan_cd;
969 igf_aw_gen.check_ld_cal_tps(p_adplans_id,p_result);
970 IF p_result = 'TRUE' THEN
971 p_method_code := l_get_plan_cd.dist_plan_method_code;
972 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
973 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.check_plan.debug '|| g_req_id,'p_method_code:'||p_method_code);
974 END IF;
975 END IF;
976 END IF;
977
978 EXCEPTION
979 WHEN OTHERS THEN
980 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
981 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.check_plan.exception '|| g_req_id,'sql error:'||SQLERRM);
982 END IF;
983 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
984 fnd_message.set_token('NAME','IGF_AW_PACKAGING.CHECK_PLAN '||SQLERRM);
985 igs_ge_msg_stack.add;
986 app_exception.raise_exception;
987 END check_plan;
988
989 PROCEDURE group_run(
990 l_group_code IN VARCHAR2,
991 l_ci_cal_type IN VARCHAR2 ,
992 l_ci_sequence_number IN NUMBER,
993 l_post IN VARCHAR2,
994 l_run_mode IN VARCHAR2
995 ) IS
996 /*
997 || Created By : cdcruz
998 || Created On : 14-NOV-2000
999 || Purpose : Packages for each student in the given group
1000 || This Target Group is attached for each student in the Base Record.
1001 || Known limitations, enhancements or remarks :
1002 || Change History :
1003 || Who WHEN What
1004 || (reverse chronological order - newest change first)
1005 */
1006
1007 -- All students who fall within the current Target group are processed
1008 CURSOR c_group(
1009 x_group_code igf_aw_target_grp_all.group_cd%TYPE ,
1010 x_ci_cal_type igf_ap_fa_base_rec_all.ci_cal_type%TYPE ,
1011 x_ci_sequence_number igf_ap_fa_base_rec_all.ci_sequence_number%TYPE
1012 ) IS
1013 SELECT fa_detail.base_id,
1014 igf_aw_coa_gen.coa_amount(fa_detail.base_id,g_awd_prd) coa_f
1015 FROM igf_ap_fa_base_rec fa_detail
1016 WHERE fa_detail.ci_cal_type = x_ci_cal_type
1017 AND fa_detail.ci_sequence_number = x_ci_sequence_number
1018 AND fa_detail.target_group = x_group_code;
1019
1020 l_group c_group%ROWTYPE;
1021
1022 -- Get the details of students from the Temp Table in the descending order of their needs
1023 CURSOR c_ordered_stdnts IS
1024 SELECT base_id
1025 FROM igf_aw_award_t
1026 WHERE flag = 'ST'
1027 AND process_id = l_process_id
1028 ORDER BY temp_num_val2 DESC;
1029
1030 l_error_code NUMBER;
1031
1032 BEGIN
1033
1034 get_process_id;
1035
1036 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1037 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.group_run.debug '|| g_req_id,'starting group_run with l_group_code:'||l_group_code||' l_ci_cal_type:'||l_ci_cal_type||' l_ci_sequence_number:'||l_ci_sequence_number);
1038 END IF;
1039
1040 OPEN c_group(
1041 l_group_code ,
1042 l_ci_cal_type ,
1043 l_ci_sequence_number
1044 );
1045 FETCH c_group INTO l_group;
1046 IF ( c_group%NOTFOUND ) THEN
1047 fnd_message.set_name('IGF','IGF_AW_NO_STUDENTS');
1048 fnd_message.set_token('CODE', l_group_code );
1049 fnd_file.put_line(fnd_file.log,fnd_message.get);
1050 fnd_file.put_line(fnd_file.log,' ');
1051
1052 ELSE
1053
1054 -- Run for each student in the Given group. Insert the Calculated Need into the Temp Table. After calculating the
1055 -- Need for all students, Fetch the students from the Temp table in the decending order of their Federal Need.
1056 -- This is to ensure that "Students who is having more need will get awarded first"
1057 LOOP
1058 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1059 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.group_run.debug '|| g_req_id,'inside c_group%FOUND');
1060 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.group_run.debug '|| g_req_id,'calling calc_students_need');
1061 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.group_run.debug '|| g_req_id,'l_group.base_id:'||l_group.base_id);
1062 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.group_run.debug '|| g_req_id,'l_group.coa_f:'||l_group.coa_f);
1063 END IF;
1064 calc_students_needs(
1065 l_group.base_id,
1066 l_group.coa_f
1067 );
1068 FETCH c_group INTO l_group;
1069 EXIT WHEN c_group%NOTFOUND;
1070 END LOOP;
1071
1072 -- Fetch the students as per the decreasing order of their need.
1073 FOR c_ordered_stdnts_rec IN c_ordered_stdnts LOOP
1074
1075 -- Process for the student in the decending order of their needs
1076 g_over_awd := NULL;
1077 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1078 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.group_run.debug '|| g_req_id,'inside for loop of c_ordered_stdnts');
1079 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.group_run.debug '|| g_req_id,'calling stud_run with c_ordered_stdnts_rec.base_id:'||c_ordered_stdnts_rec.base_id);
1080 END IF;
1081 stud_run(
1082 c_ordered_stdnts_rec.base_id,
1083 l_post,
1084 l_run_mode
1085 );
1086 IF l_post = 'N' THEN
1087 COMMIT;
1088 ELSE
1089 BEGIN
1090 ROLLBACK TO IGFAW03B_POST_AWARD;
1091 EXCEPTION
1092 WHEN OTHERS THEN
1093 l_error_code := SQLCODE;
1094 IF l_error_code = -1086 THEN
1095 --savepoint not established error
1096 --post_award was not called from stud_run as stud_run returned without processing the student
1097 --rollback to savepoint established in stud_run
1098 ROLLBACK TO STUD_SP;
1099 ELSE
1100 RAISE;
1101 END IF;
1102 END;
1103 END IF;
1104 END LOOP;
1105
1106
1107 END IF; -- End of c_group FOUND check
1108 CLOSE c_group;
1109
1110 EXCEPTION
1111 WHEN OTHERS THEN
1112 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
1113 fnd_message.set_token('NAME','IGF_AW_PACKAGING.GROUP_RUN '||SQLERRM);
1114 igs_ge_msg_stack.add;
1115 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
1116 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.group_run.exception '|| g_req_id,'sql error message: '||SQLERRM);
1117 END IF;
1118 app_exception.raise_exception;
1119 END group_run;
1120
1121
1122 PROCEDURE clear_simulation( l_base_id IN NUMBER ) IS
1123 /*
1124 || Created By : cdcruz
1125 || Created On : 14-NOV-2000
1126 || Purpose : Clears all Simulation Awards and its Disburesement records that have created
1127 || during the previous Simulation run
1128 || Known limitations, enhancements or remarks :
1129 || Change History :
1130 || Who WHEN What
1131 || (reverse chronological order - newest change first)
1132 */
1133
1134 -- Retrieves all simulated disbursement records
1135 CURSOR c_sim_adisb ( cp_award_id igf_aw_award_all.award_id%TYPE ) IS
1136 SELECT adisb.rowid row_id
1137 FROM igf_aw_awd_disb_all adisb
1138 WHERE adisb.award_id = cp_award_id;
1139
1140 -- Retrieves all simulated award records
1141 CURSOR c_sim_awd ( cp_base_id igf_aw_award_all.base_id%TYPE ) IS
1142 SELECT awd.rowid row_id,
1143 awd.award_id
1144 FROM igf_aw_award_all awd
1145 WHERE awd.base_id = cp_base_id
1146 AND awd.award_status = 'SIMULATED';
1147
1148 BEGIN
1149
1150 -- Remove all the Simualated disbursements first and then Remove all Simulated Awards.
1151 -- These simulated awards should be removed for all selected students before re-processing
1152 -- the packing process, so that Award amounts can be recalculated as on date
1153 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1154 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.clear_simulation.debug '|| g_req_id,'clearing simulation records for l_base_id:'||l_base_id);
1155 END IF;
1156
1157 FOR l_sim_awd IN c_sim_awd(l_base_id) LOOP
1158 FOR l_sim_adisb IN c_sim_adisb(l_sim_awd.award_id) LOOP
1159 igf_aw_awd_disb_pkg.delete_row(l_sim_adisb.row_id);
1160 END LOOP;
1161 igf_aw_award_pkg.delete_row(l_sim_awd.row_id);
1162 END LOOP;
1163 EXCEPTION
1164 WHEN OTHERS THEN
1165 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
1166 fnd_message.set_token('NAME','IGF_AW_PACKAGING.CLEAR_SIMULATION '||SQLERRM);
1167 igs_ge_msg_stack.add;
1168 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
1169 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.clear_simulation.exception '|| g_req_id,'sql error message: '||SQLERRM);
1170 END IF;
1171 app_exception.raise_exception;
1172 END clear_simulation;
1173
1174 FUNCTION get_coa_lock_prof_val RETURN VARCHAR2 AS
1175 ------------------------------------------------------------------
1176 --Created by : veramach, Oracle India
1177 --Date created: 25-Oct-2004
1178 --
1179 --Purpose:
1180 -- Returns the value of the profile 'IGF: Lock COA Budget for Student'
1181 --
1182 --Known limitations/enhancements and/or remarks:
1183 --
1184 --Change History:
1185 --Who When What
1186 -------------------------------------------------------------------
1187 lv_profile_value fnd_profile_option_values.profile_option_value%TYPE;
1188 BEGIN
1189 fnd_profile.get('IGF_AW_LOCK_COA',lv_profile_value);
1190 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1191 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_coa_lock_prof_val.debug '|| g_req_id,'lv_profile_value:'||lv_profile_value);
1192 END IF;
1193 RETURN lv_profile_value;
1194 END get_coa_lock_prof_val;
1195
1196 PROCEDURE update_pell_orig_stat(
1197 p_award_id igf_aw_award_all.award_id%TYPE,
1198 p_amount igf_aw_award_all.offered_amt%TYPE
1199 ) AS
1200 ------------------------------------------------------------------
1201 --Created by : veramach, Oracle India
1202 --Date created: 05-Nov-2004
1203 --
1204 --Purpose:
1205 --
1206 --
1207 --Known limitations/enhancements and/or remarks:
1208 --
1209 --Change History:
1210 --Who When What
1211 -------------------------------------------------------------------
1212
1213 -- Get pell orig
1214 CURSOR c_pell_orig(
1215 cp_award_id igf_aw_award_all.award_id%TYPE,
1216 cp_amount igf_aw_award_all.offered_amt%TYPE
1217 ) IS
1218 SELECT rfms.rowid row_id,
1219 rfms.*
1220 FROM igf_gr_rfms_all rfms
1221 WHERE award_id = cp_award_id
1222 AND pell_amount <> cp_amount
1223 AND orig_action_code <> 'S';
1224 l_orig_action_code igf_gr_rfms_all.orig_action_code%TYPE;
1225
1226 BEGIN
1227 FOR l_pell_orig IN c_pell_orig(p_award_id,p_amount) LOOP
1228 IF l_pell_orig.orig_action_code = 'N' THEN
1229 l_orig_action_code := 'N';
1230 ELSE
1231 l_orig_action_code := 'R';
1232 END IF;
1233 igf_gr_rfms_pkg.update_row(
1234 x_rowid => l_pell_orig.row_id,
1235 x_origination_id => l_pell_orig.origination_id,
1236 x_ci_cal_type => l_pell_orig.ci_cal_type,
1237 x_ci_sequence_number => l_pell_orig.ci_sequence_number,
1238 x_base_id => l_pell_orig.base_id,
1239 x_award_id => l_pell_orig.award_id,
1240 x_rfmb_id => l_pell_orig.rfmb_id,
1241 x_sys_orig_ssn => l_pell_orig.sys_orig_ssn,
1242 x_sys_orig_name_cd => l_pell_orig.sys_orig_name_cd,
1243 x_transaction_num => l_pell_orig.transaction_num,
1244 x_efc => l_pell_orig.efc,
1245 x_ver_status_code => l_pell_orig.ver_status_code,
1246 x_secondary_efc => l_pell_orig.secondary_efc,
1247 x_secondary_efc_cd => l_pell_orig.secondary_efc_cd,
1248 x_pell_amount => p_amount,--update with new award amount
1249 x_pell_profile => l_pell_orig.pell_profile,
1250 x_enrollment_status => l_pell_orig.enrollment_status,
1251 x_enrollment_dt => l_pell_orig.enrollment_dt,
1252 x_coa_amount => l_pell_orig.coa_amount,
1253 x_academic_calendar => l_pell_orig.academic_calendar,
1254 x_payment_method => l_pell_orig.payment_method,
1255 x_total_pymt_prds => l_pell_orig.total_pymt_prds,
1256 x_incrcd_fed_pell_rcp_cd => l_pell_orig.incrcd_fed_pell_rcp_cd,
1257 x_attending_campus_id => l_pell_orig.attending_campus_id,
1258 x_est_disb_dt1 => l_pell_orig.est_disb_dt1,
1259 x_orig_action_code => l_orig_action_code,--update to 'Ready to Send' or 'Not Ready'
1260 x_orig_status_dt => TRUNC(SYSDATE),--update origination status date
1261 x_orig_ed_use_flags => l_pell_orig.orig_ed_use_flags,
1262 x_ft_pell_amount => l_pell_orig.ft_pell_amount,
1263 x_prev_accpt_efc => l_pell_orig.prev_accpt_efc,
1264 x_prev_accpt_tran_no => l_pell_orig.prev_accpt_tran_no,
1265 x_prev_accpt_sec_efc_cd => l_pell_orig.prev_accpt_sec_efc_cd,
1266 x_prev_accpt_coa => l_pell_orig.prev_accpt_coa,
1267 x_orig_reject_code => l_pell_orig.orig_reject_code,
1268 x_wk_inst_time_calc_pymt => l_pell_orig.wk_inst_time_calc_pymt,
1269 x_wk_int_time_prg_def_yr => l_pell_orig.wk_int_time_prg_def_yr,
1270 x_cr_clk_hrs_prds_sch_yr => l_pell_orig.cr_clk_hrs_prds_sch_yr,
1271 x_cr_clk_hrs_acad_yr => l_pell_orig.cr_clk_hrs_acad_yr,
1272 x_inst_cross_ref_cd => l_pell_orig.inst_cross_ref_cd,
1273 x_low_tution_fee => l_pell_orig.low_tution_fee,
1274 x_rec_source => l_pell_orig.rec_source,
1275 x_pending_amount => l_pell_orig.pending_amount,
1276 x_mode => 'R',
1277 x_birth_dt => l_pell_orig.birth_dt,
1278 x_last_name => l_pell_orig.last_name,
1279 x_first_name => l_pell_orig.first_name,
1280 x_middle_name => l_pell_orig.middle_name,
1281 x_current_ssn => l_pell_orig.current_ssn,
1282 x_legacy_record_flag => l_pell_orig.legacy_record_flag,
1283 x_reporting_pell_cd => l_pell_orig.reporting_pell_cd,
1284 x_rep_entity_id_txt => l_pell_orig.rep_entity_id_txt,
1285 x_atd_entity_id_txt => l_pell_orig.atd_entity_id_txt,
1286 x_note_message => l_pell_orig.note_message,
1287 x_full_resp_code => l_pell_orig.full_resp_code,
1288 x_document_id_txt => l_pell_orig.document_id_txt
1289 );
1290 fnd_message.set_name('IGF','IGF_GR_REORIG_PELL');
1291 fnd_file.put_line(fnd_file.log,fnd_message.get);
1292 END LOOP;
1293 END update_pell_orig_stat;
1294
1295 PROCEDURE update_loan_stat(
1296 p_award_id igf_aw_award_all.award_id%TYPE,
1297 p_amount igf_aw_award_all.offered_amt%TYPE
1298 ) AS
1299 ------------------------------------------------------------------
1300 --Created by : veramach, Oracle India
1301 --Date created: 07-Dec-2004
1302 --
1303 --Purpose:
1304 --
1305 --
1306 --Known limitations/enhancements and/or remarks:
1307 --
1308 --Change History:
1309 --Who When What
1310 -------------------------------------------------------------------
1311 -- Get loan
1312 CURSOR c_loan(
1313 cp_award_id igf_aw_award_all.award_id%TYPE,
1314 cp_amount igf_aw_award_all.offered_amt%TYPE
1315 ) IS
1316 SELECT loan.ROWID row_id,
1317 loan.*
1318 FROM igf_sl_loans_all loan,
1319 igf_aw_award_all awd
1320 WHERE loan.award_id = cp_award_id
1321 AND loan.award_id = awd.award_id
1322 AND awd.offered_amt <> cp_amount
1323 AND loan.loan_status <> 'S';
1324 l_loan_status igf_sl_loans_all.loan_status%TYPE;
1325
1326 BEGIN
1327 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1328 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_loan_stat.debug '|| g_req_id,'starting update_loan_stat with award_id:'||p_award_id||
1329 'amount:'||p_amount);
1330 END IF;
1331 FOR l_loan IN c_loan(p_award_id,p_amount) LOOP
1332 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1333 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_loan_stat.debug '|| g_req_id,'l_loan.loan_status:'||l_loan.loan_status);
1334 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_loan_stat.debug '|| g_req_id,'l_loan.loan_status_date:'||l_loan.loan_status_date);
1335 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_loan_stat.debug '|| g_req_id,'l_loan.loan_chg_status:'||l_loan.loan_chg_status);
1336 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_loan_stat.debug '|| g_req_id,'l_loan.loan_chg_status_date:'||l_loan.loan_chg_status_date);
1337 END IF;
1338
1339 IF l_loan.loan_status = 'N' THEN
1340 --when the loan is not ready, keep it in not ready status
1341 l_loan.loan_status := 'N';
1342 l_loan.loan_status_date := TRUNC(SYSDATE);
1343
1344 ELSIF l_loan.loan_status = 'A' THEN
1345 --when the loan has been accepted, change loan_chg_status
1346 IF l_loan.loan_chg_status = 'N' THEN
1347 l_loan.loan_chg_status := 'N';
1348 l_loan.loan_chg_status_date := TRUNC(SYSDATE);
1349 ELSE
1350 l_loan.loan_chg_status := 'G';
1351 l_loan.loan_chg_status_date := TRUNC(SYSDATE);
1352 END IF;
1353 ELSE
1354 --any other status, flip the status to ready
1355 l_loan.loan_status := 'G';
1356 l_loan.loan_status_date := TRUNC(SYSDATE);
1357 END IF;
1358
1359 igf_sl_loans_pkg.update_row(
1360 x_rowid => l_loan.row_id,
1361 x_loan_id => l_loan.loan_id,
1362 x_award_id => l_loan.award_id,
1363 x_seq_num => l_loan.seq_num,
1364 x_loan_number => l_loan.loan_number,
1365 x_loan_per_begin_date => l_loan.loan_per_begin_date,
1366 x_loan_per_end_date => l_loan.loan_per_end_date,
1367 x_loan_status => l_loan.loan_status,
1368 x_loan_status_date => l_loan.loan_status_date,
1369 x_loan_chg_status => l_loan.loan_chg_status,
1370 x_loan_chg_status_date => l_loan.loan_chg_status_date,
1371 x_active => l_loan.active,
1372 x_active_date => l_loan.active_date,
1373 x_borw_detrm_code => l_loan.borw_detrm_code,
1374 x_mode => 'R',
1375 x_legacy_record_flag => l_loan.legacy_record_flag,
1376 x_external_loan_id_txt => l_loan.external_loan_id_txt,
1377 x_called_from => 'IGFAW03B'
1378 );
1379 END LOOP;
1380 END update_loan_stat;
1381
1382 PROCEDURE cancel_invalid_award(
1383 p_award_id igf_aw_award_all.award_id%TYPE
1384 ) AS
1385 ------------------------------------------------------------------
1386 --Created by : veramach, Oracle India
1387 --Date created: 27-Oct-2004
1388 --
1389 --Purpose: to cancel an existing award and its disbursements
1390 --
1391 --
1392 --Known limitations/enhancements and/or remarks:
1393 --
1394 --Change History:
1395 --Who When What
1396 --museshad 14-Apr-2006 Bug 5042136.
1397 -- When an award is cancelled- Origination Fee,
1398 -- Guarantor Fee, Interest Rebate Amount in the disb
1399 -- should become 0. Fixed this.
1400 --museshad 18-Jul-2005 Build FA 157.
1401 -- Passed 'A' for x_elig_status and TRUNC(SYSDATE)
1402 -- for x_elig_status_date whiile updating the
1403 -- disbursements for a cancelled award.
1404 -------------------------------------------------------------------
1405
1406 -- Get an award
1407 CURSOR c_award(
1408 cp_award_id igf_aw_award_all.award_id%TYPE
1409 ) IS
1410 SELECT awd.rowid row_id,
1411 awd.*
1412 FROM igf_aw_award_all awd
1413 WHERE award_id = cp_award_id
1414 AND award_status <> 'CANCELLED';
1415
1416 -- Get disbursements for an award
1417 CURSOR c_disb(
1418 cp_award_id igf_aw_award_all.award_id%TYPE
1419 ) IS
1420 SELECT disb.rowid row_id,
1421 disb.*
1422 FROM igf_aw_awd_disb_all disb
1423 WHERE award_id = cp_award_id;
1424
1425 -- Get Fund Code from fund_id
1426 CURSOR c_fund_code(
1427 cp_fund_id igf_aw_fund_mast_all.fund_id%TYPE
1428 ) IS
1429 SELECT fund_code
1430 FROM igf_aw_fund_mast_all
1431 WHERE fund_id = cp_fund_id;
1432 l_fund_code igf_aw_fund_mast_all.fund_code%TYPE;
1433
1434 lv_rowid ROWID;
1435 l_amount igf_aw_award_all.offered_amt%TYPE;
1436
1437 -- Get total amount already sent to COD
1438 CURSOR c_rfms_disb(
1439 cp_award_id igf_aw_award_all.award_id%TYPE
1440 ) IS
1441 SELECT SUM(disb.disb_amt)
1442 FROM igf_gr_rfms_all rfms,
1443 igf_gr_rfms_disb_all disb
1444 WHERE rfms.award_id = cp_award_id
1445 AND rfms.origination_id = disb.origination_id
1446 AND disb.disb_ack_act_status IN ('S','A','D','C');
1447
1448 -- Get last disb
1449 CURSOR c_last_disb(
1450 cp_award_id igf_aw_award_all.award_id%TYPE
1451 ) IS
1452 SELECT disb_num,
1453 tp_cal_type,
1454 tp_sequence_number,
1455 ld_cal_type,
1456 ld_sequence_number,
1457 show_on_bill,
1458 base_attendance_type_code
1459 FROM igf_aw_awd_disb disb
1460 WHERE disb.award_id = p_award_id
1461 AND ROWNUM = 1
1462 ORDER BY disb_num DESC;
1463 l_last_disb c_last_disb%ROWTYPE;
1464
1465 BEGIN
1466
1467 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1468 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.cancel_invalid_award.debug '|| g_req_id,'starting cancel_invalid_award with award_id:'||p_award_id);
1469 END IF;
1470
1471 FOR awd_rec IN c_award(p_award_id) LOOP
1472
1473 fnd_message.set_name('IGF','IGF_AW_AWARD_CANCELLED');
1474 fnd_message.set_token('AWD',TO_CHAR(p_award_id));
1475 l_fund_code := NULL;
1476 OPEN c_fund_code(awd_rec.fund_id);
1477 FETCH c_fund_code INTO l_fund_code;
1478 CLOSE c_fund_code;
1479 fnd_message.set_token('FUND',l_fund_code);
1480 fnd_file.put_line(fnd_file.log,fnd_message.get);
1481
1482 FOR disb_rec IN c_disb(p_award_id) LOOP
1483
1484 igf_aw_awd_disb_pkg.update_row(
1485 x_rowid => disb_rec.row_id,
1486 x_award_id => disb_rec.award_id,
1487 x_disb_num => disb_rec.disb_num,
1488 x_tp_cal_type => disb_rec.tp_cal_type,
1489 x_tp_sequence_number => disb_rec.tp_sequence_number,
1490 x_disb_gross_amt => 0,
1491 x_fee_1 => 0,
1492 x_fee_2 => 0,
1493 x_disb_net_amt => 0,
1494 x_disb_date => disb_rec.disb_date,
1495 x_trans_type => 'C',
1496 x_elig_status => 'A',
1497 x_elig_status_date => TRUNC(SYSDATE),
1498 x_affirm_flag => disb_rec.affirm_flag,
1499 x_hold_rel_ind => disb_rec.hold_rel_ind,
1500 x_manual_hold_ind => disb_rec.manual_hold_ind,
1501 x_disb_status => disb_rec.disb_status,
1502 x_disb_status_date => disb_rec.disb_status_date,
1503 x_late_disb_ind => disb_rec.late_disb_ind,
1504 x_fund_dist_mthd => disb_rec.fund_dist_mthd,
1505 x_prev_reported_ind => disb_rec.prev_reported_ind,
1506 x_fund_release_date => disb_rec.fund_release_date,
1507 x_fund_status => disb_rec.fund_status,
1508 x_fund_status_date => disb_rec.fund_status_date,
1509 x_fee_paid_1 => disb_rec.fee_paid_1,
1510 x_fee_paid_2 => disb_rec.fee_paid_2,
1511 x_cheque_number => disb_rec.cheque_number,
1512 x_ld_cal_type => disb_rec.ld_cal_type,
1513 x_ld_sequence_number => disb_rec.ld_sequence_number,
1514 x_disb_accepted_amt => 0,
1515 x_disb_paid_amt => disb_rec.disb_paid_amt,
1516 x_rvsn_id => disb_rec.rvsn_id,
1517 x_int_rebate_amt => 0,
1518 x_force_disb => disb_rec.force_disb,
1519 x_min_credit_pts => disb_rec.min_credit_pts,
1520 x_disb_exp_dt => disb_rec.disb_exp_dt,
1521 x_verf_enfr_dt => disb_rec.verf_enfr_dt,
1522 x_fee_class => disb_rec.fee_class,
1523 x_show_on_bill => disb_rec.show_on_bill,
1524 x_mode => 'R',
1525 x_attendance_type_code => disb_rec.attendance_type_code,
1526 x_base_attendance_type_code => disb_rec.base_attendance_type_code,
1527 x_payment_prd_st_date => disb_rec.payment_prd_st_date,
1528 x_change_type_code => disb_rec.change_type_code,
1529 x_fund_return_mthd_code => disb_rec.fund_return_mthd_code,
1530 x_direct_to_borr_flag => disb_rec.direct_to_borr_flag
1531 );
1532
1533 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1534 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.cancel_invalid_award.debug '|| g_req_id,'updated disbursement number '||disb_rec.disb_num);
1535 END IF;
1536
1537 END LOOP;
1538
1539 igf_aw_award_pkg.update_row(
1540 x_rowid => awd_rec.row_id,
1541 x_award_id => awd_rec.award_id,
1542 x_fund_id => awd_rec.fund_id,
1543 x_base_id => awd_rec.base_id,
1544 x_offered_amt => 0,
1545 x_accepted_amt => 0,
1546 x_paid_amt => awd_rec.paid_amt,
1547 x_packaging_type => awd_rec.packaging_type,
1548 x_batch_id => awd_rec.batch_id,
1549 x_manual_update => awd_rec.manual_update,
1550 x_rules_override => awd_rec.rules_override,
1551 x_award_date => awd_rec.award_date,
1552 x_award_status => 'CANCELLED',
1553 x_attribute_category => awd_rec.attribute_category,
1554 x_attribute1 => awd_rec.attribute1,
1555 x_attribute2 => awd_rec.attribute2,
1556 x_attribute3 => awd_rec.attribute3,
1557 x_attribute4 => awd_rec.attribute4,
1558 x_attribute5 => awd_rec.attribute5,
1559 x_attribute6 => awd_rec.attribute6,
1560 x_attribute7 => awd_rec.attribute7,
1561 x_attribute8 => awd_rec.attribute8,
1562 x_attribute9 => awd_rec.attribute9,
1563 x_attribute10 => awd_rec.attribute10,
1564 x_attribute11 => awd_rec.attribute11,
1565 x_attribute12 => awd_rec.attribute12,
1566 x_attribute13 => awd_rec.attribute13,
1567 x_attribute14 => awd_rec.attribute14,
1568 x_attribute15 => awd_rec.attribute15,
1569 x_attribute16 => awd_rec.attribute16,
1570 x_attribute17 => awd_rec.attribute17,
1571 x_attribute18 => awd_rec.attribute18,
1572 x_attribute19 => awd_rec.attribute19,
1573 x_attribute20 => awd_rec.attribute20,
1574 x_rvsn_id => awd_rec.rvsn_id,
1575 x_alt_pell_schedule => awd_rec.alt_pell_schedule,
1576 x_mode => 'R',
1577 x_award_number_txt => awd_rec.award_number_txt,
1578 x_legacy_record_flag => awd_rec.legacy_record_flag,
1579 x_adplans_id => awd_rec.adplans_id,
1580 x_lock_award_flag => awd_rec.lock_award_flag,
1581 x_app_trans_num_txt => awd_rec.app_trans_num_txt,
1582 x_awd_proc_status_code => 'AWARDED',
1583 x_notification_status_code => awd_rec.notification_status_code,
1584 x_notification_status_date => awd_rec.notification_status_date,
1585 x_publish_in_ss_flag => awd_rec.publish_in_ss_flag
1586 );
1587 IF get_fed_fund_code(awd_rec.fund_id) ='PELL' AND g_phasein_participant THEN
1588 update_pell_orig_stat(awd_rec.award_id,0); --uodate the pell origination status with zero amount and 'Ready to Send' status
1589
1590 --get total amount already sent from igf_gr_rfms_disb
1591 l_amount := NULL;
1592 OPEN c_rfms_disb(awd_rec.award_id);
1593 FETCH c_rfms_disb INTO l_amount;
1594 CLOSE c_rfms_disb;
1595 IF l_amount IS NOT NULL THEN
1596 --create a new disbursement record with total amount already sent
1597 --copy values from the last disb
1598 OPEN c_last_disb(awd_rec.award_id);
1599 FETCH c_last_disb INTO l_last_disb;
1600 CLOSE c_last_disb;
1601
1602 l_amount := -1 * l_amount;
1603 lv_rowid := NULL;
1604
1605 igf_aw_awd_disb_pkg.insert_row(
1606 x_rowid => lv_rowid,
1607 x_award_id => awd_rec.award_id,
1608 x_disb_num => (l_last_disb.disb_num + 1),
1609 x_tp_cal_type => l_last_disb.tp_cal_type,
1610 x_tp_sequence_number => l_last_disb.tp_sequence_number,
1611 x_disb_gross_amt => l_amount,
1612 x_fee_1 => 0,
1613 x_fee_2 => 0,
1614 x_disb_net_amt => l_amount,
1615 x_disb_date => SYSDATE,
1616 x_trans_type => 'P',
1617 x_elig_status => 'N',
1618 x_elig_status_date => TRUNC(SYSDATE),
1619 x_affirm_flag => 'N',
1620 x_hold_rel_ind => 'N',
1621 x_manual_hold_ind => 'N',
1622 x_disb_status => NULL,
1623 x_disb_status_date => NULL,
1624 x_late_disb_ind => 'N',
1625 x_fund_dist_mthd => 'E',
1626 x_prev_reported_ind => 'N',
1627 x_fund_release_date => NULL,
1628 x_fund_status => NULL,
1629 x_fund_status_date => NULL,
1630 x_fee_paid_1 => 0,
1631 x_fee_paid_2 => 0,
1632 x_cheque_number => NULL,
1633 x_ld_cal_type => l_last_disb.ld_cal_type,
1634 x_ld_sequence_number => l_last_disb.ld_sequence_number,
1635 x_disb_accepted_amt => 0,
1636 x_disb_paid_amt => 0,
1637 x_rvsn_id => NULL,
1638 x_int_rebate_amt => 0,
1639 x_force_disb => NULL,
1640 x_min_credit_pts => 0,
1641 x_disb_exp_dt => NULL,
1642 x_verf_enfr_dt => NULL,
1643 x_fee_class => NULL,
1644 x_show_on_bill => l_last_disb.show_on_bill,
1645 x_attendance_type_code => NULL,
1646 x_mode => 'R',
1647 x_base_attendance_type_code => l_last_disb.base_attendance_type_code,
1648 x_payment_prd_st_date => NULL,
1649 x_change_type_code => NULL,
1650 x_fund_return_mthd_code => NULL,
1651 x_direct_to_borr_flag => 'N'
1652 );
1653 END IF;
1654 END IF;
1655 END LOOP;
1656
1657 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1658 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.cancel_invalid_award.debug '|| g_req_id,'finsihed cancel_invalid_award for award_id:'||p_award_id);
1659 END IF;
1660 END cancel_invalid_award;
1661
1662 PROCEDURE cancel_awards(
1663 p_process_id igf_aw_award_t.process_id%TYPE,
1664 p_base_id igf_ap_fa_base_rec_all.base_id%TYPE
1665 ) AS
1666 ------------------------------------------------------------------
1667 --Created by : veramach, Oracle India
1668 --Date created: 27-Oct-2004
1669 --
1670 --Purpose: Cancels any invalid awards
1671 --
1672 --
1673 --Known limitations/enhancements and/or remarks:
1674 --
1675 --Change History:
1676 --Who When What
1677 -------------------------------------------------------------------
1678
1679 -- Get cancelled awards
1680 CURSOR c_cancelled_awards(
1681 cp_process_id igf_aw_award_t.process_id%TYPE,
1682 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE
1683 ) IS
1684 SELECT awdt.award_id
1685 FROM igf_aw_award_t awdt
1686 WHERE process_id = cp_process_id
1687 AND base_id = cp_base_id
1688 AND flag IN ('AC','AR');
1689
1690 BEGIN
1691 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1692 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.cancel_awards.debug '|| g_req_id,'starting cancel awards with base_id:'||p_base_id);
1693 END IF;
1694
1695 FOR l_cancelled_awards IN c_cancelled_awards(p_process_id,p_base_id) LOOP
1696 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1697 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.cancel_awards.debug '|| g_req_id,'cancelling award:'||l_cancelled_awards.award_id);
1698 END IF;
1699 cancel_invalid_award(l_cancelled_awards.award_id);
1700 END LOOP;
1701 END cancel_awards;
1702
1703 PROCEDURE round_off_disbursements(
1704 p_fund_id IN igf_aw_award_t_all.fund_id%TYPE,
1705 p_base_id IN igf_aw_award_t_all.base_id%TYPE,
1706 p_process_id IN igf_aw_award_t_all.process_id%TYPE,
1707 p_award_id IN igf_aw_award_t_all.award_id%TYPE,
1708 p_adplans_id IN igf_aw_award_t_all.adplans_id%TYPE,
1709 p_offered_amt IN igf_aw_award_t_all.offered_amt%TYPE,
1710 p_dist_plan_code IN igf_aw_awd_dist_plans.dist_plan_method_code%TYPE,
1711 p_disb_count IN NUMBER
1712 )
1713 IS
1714 /*
1715 || Created By : museshad
1716 || Created On : 05-Jun-2005
1717 || Purpose : Build# FA157 - Bug# 4382371
1718 || Calculates the disbursement amount based on the
1719 || disbursement rounding factor. The procedure fills the
1720 || PL/SQL table 'l_disb_structure_tab' with the disbursement
1721 || amounts. This PL/SQL table is then used to update the
1722 || IGF_AW_AWARD_T table.
1723 ||
1724 || Note, this procedure holds good only for non-PELL funds.
1725 || Disbursement rounding for Pell is handled in IGFGR11B.pls
1726 ||
1727 || Note, with the 'Equal' distribution method, the extra disbursement
1728 || amount is shared with the possible disbursements starting from
1729 || the last/first disbursement. But with 'Match COA'
1730 || and 'Manual' distribution the extra disbursement amount is not
1731 || shared with each disbursement but it is fully given either to
1732 || the first/last disbursement.
1733 ||
1734 || Description of the main variables used -
1735 || l_disb_amt Normal disbursement amount
1736 ||
1737 || l_disb_diff Holds the extra disbursement amount that needs to be shared
1738 || with the disbursements
1739 ||
1740 || l_extra_factor In 'Equal Distribution' this variables gives the share of the
1741 || extra amount for each disbursement. For ONES rounding it is 1
1742 || and for DECIMALS rounding it is 0.01.
1743 ||
1744 || l_disb_amt_extra In 'Equal Distribution', the extra disbursement amount is shared with the
1745 || possible disbursements. This variable holds (l_disb_amt + l_extra_factor)
1746 ||
1747 || l_trunc_factor The trunc factor to be used for rounding the decimal portion in the disbursement amount.
1748 || For ONES rounding this is 0 and for DECIMALS rounding this is 2
1749 ||
1750 || l_disb_no Holds the disbursement number that is currently being processed.
1751 ||
1752 || l_special_disb_no In 'Match COA' distribution the extra amount is fully given to either
1753 || first/last disbursement depending on the disbursement rounding value.
1754 || This variable is either 1/p_disb_count
1755 ||
1756 || l_disb_limt1, All these three variable form the loop attributes.
1757 || l_disb_limt2, If l_step = 1, the loop runs from l_disb_limt1 to l_disb_limt2.
1758 || l_step If l_step = -1, the loop runs from l_disb_limt2 to l_disb_limt1.
1759 ||
1760 || Known limitations, enhancements or remarks :
1761 || Change History :
1762 || Who WHEN What
1763 || (reverse chronological order - newest change first)
1764 */
1765
1766 -- Returns all the disbursements in the temporary table
1767 -- The ORDER BY clause ensures that the disbursements are returned
1768 -- in the order of their creation
1769 CURSOR cur_get_all_disb (
1770 cp_fund_id igf_aw_award_t_all.fund_id%TYPE,
1771 cp_base_id igf_aw_award_t_all.base_id%TYPE,
1772 cp_process_id igf_aw_award_t_all.process_id%TYPE,
1773 cp_adplans_id igf_aw_award_t_all.adplans_id%TYPE,
1774 p_award_id igf_aw_award_t_all.award_id%TYPE
1775 )
1776 IS
1777 SELECT awd_t.rowid, awd_t.*
1778 FROM igf_aw_award_t_all awd_t
1779 WHERE
1780 base_id = p_base_id AND
1781 fund_id = p_fund_id AND
1782 process_id = p_process_id AND
1783 NVL(adplans_id,-1) = NVL(p_adplans_id,-1) AND
1784 NVL(award_id,-1) = NVL(p_award_id,-1) AND
1785 flag = 'DB'
1786 ORDER BY fnd_date.chardate_to_date(temp_char_val1) ASC;
1787
1788 l_disb_amt NUMBER := 0;
1789 l_disb_prelim_amt NUMBER := 0;
1790 l_disb_amt_extra NUMBER := 0;
1791 l_disb_inter_sum_amt NUMBER := 0;
1792 l_disb_diff NUMBER := 0;
1793 l_trunc_factor NUMBER := 0;
1794 l_extra_factor NUMBER := 0;
1795 l_disb_no NUMBER := 0;
1796 l_special_disb_no NUMBER := 0;
1797 l_disb_limit1 NUMBER := 0;
1798 l_disb_limit2 NUMBER := 0;
1799 l_step NUMBER := 0;
1800 l_disb_round_factor igf_aw_fund_mast.disb_rounding_code%TYPE := NULL;
1801
1802 TYPE l_disb_structure IS RECORD(
1803 fund_id igf_aw_fund_mast.fund_id%TYPE,
1804 disb_num NUMBER,
1805 disb_amt NUMBER
1806 );
1807 TYPE l_disb_structure_tab IS TABLE OF l_disb_structure INDEX BY BINARY_INTEGER;
1808 l_disb_structure_rec l_disb_structure_tab;
1809
1810 BEGIN
1811 l_disb_round_factor := get_disb_round_factor(p_fund_id);
1812 IF l_disb_round_factor IN ('ONE_FIRST', 'DEC_FIRST', 'ONE_LAST', 'DEC_LAST') THEN -- disb_round_factor
1813
1814 -- Log useful values
1815 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1816 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id,'Into round_off_disbursements. Parameters received ...');
1817 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id,'Fund id: '||p_fund_id);
1818 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id,'Award amount: '||p_offered_amt);
1819 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id,'Number of disbursements: '||p_disb_count);
1820 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id,'Disbursement rounding factor: '||l_disb_round_factor);
1821 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id,'Distribution plan code: ' || UPPER(p_dist_plan_code));
1822 END IF;
1823
1824 -- Set the attributes common to ONEs rounding factor
1825 IF l_disb_round_factor = 'ONE_FIRST' OR l_disb_round_factor = 'ONE_LAST' THEN
1826 l_trunc_factor := 0;
1827 l_extra_factor := 1;
1828 -- Set the attributes common to DECIMALs rounding factor
1829 ELSIF l_disb_round_factor = 'DEC_FIRST' OR l_disb_round_factor = 'DEC_LAST' THEN
1830 l_trunc_factor := 2;
1831 l_extra_factor := 0.01;
1832 END IF;
1833
1834 -- Set the attributes common to FIRST rounding factor
1835 IF l_disb_round_factor = 'ONE_FIRST' OR l_disb_round_factor = 'DEC_FIRST' THEN
1836 IF UPPER(p_dist_plan_code) = 'E' THEN
1837 l_disb_limit1 := 1;
1838 l_disb_limit2 := p_disb_count;
1839 l_step := 1;
1840 l_disb_no := l_disb_limit1;
1841 ELSIF UPPER(p_dist_plan_code) IN ('C', 'M') THEN
1842 l_special_disb_no := 1;
1843 END IF;
1844
1845 -- Set the attributes common to LAST rounding factor
1846 ELSIF l_disb_round_factor = 'ONE_LAST' OR l_disb_round_factor = 'DEC_LAST' THEN
1847 IF UPPER(p_dist_plan_code) = 'E' THEN
1848 l_disb_limit1 := 1;
1849 l_disb_limit2 := p_disb_count;
1850 l_step := -1;
1851 l_disb_no := l_disb_limit2;
1852 ELSIF UPPER(p_dist_plan_code) IN ('C', 'M') THEN
1853 l_special_disb_no := p_disb_count;
1854 END IF;
1855 END IF;
1856
1857 -- Log values
1858 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1859 fnd_log.string(fnd_log.level_statement, 'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id, 'l_trunc_factor: ' ||l_trunc_factor);
1860 fnd_log.string(fnd_log.level_statement, 'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id, 'l_extra_factor: ' ||l_extra_factor);
1861 END IF;
1862
1863 ------------------------------------
1864 -- EVEN Distribution
1865 ------------------------------------
1866 IF UPPER(p_dist_plan_code) = 'E' THEN -- p_dist_plan_code
1867
1868 -- Normal disbursement amount
1869 l_disb_amt := TRUNC(NVL((p_offered_amt/p_disb_count), 0), l_trunc_factor);
1870 -- Preliminary disbursement amount
1871 l_disb_prelim_amt := TRUNC(NVL((p_offered_amt - (l_disb_amt * (p_disb_count-1))), 0), l_trunc_factor);
1872
1873 -- Difference in disbursement amount
1874 l_disb_diff := TRUNC(NVL((l_disb_prelim_amt - l_disb_amt), 0), l_trunc_factor);
1875
1876 -- Extra disbursement amount
1877 IF l_disb_diff > 0 THEN
1878 l_disb_amt_extra := TRUNC(NVL((l_disb_amt + l_extra_factor), 0), l_trunc_factor);
1879 ELSIF l_disb_diff < 0 THEN
1880 l_disb_amt_extra := TRUNC(NVL((l_disb_amt - l_extra_factor), 0), l_trunc_factor);
1881 ELSE
1882 l_disb_amt_extra := TRUNC(NVL(l_disb_amt, 0), l_trunc_factor);
1883 END IF;
1884
1885 -- Get the absolute difference value between preliminary and normal disbursement amount
1886 l_disb_diff := ABS(l_disb_diff);
1887
1888 -- Log values
1889 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1890 fnd_log.string(fnd_log.level_statement, 'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id, 'l_disb_diff: ' ||l_disb_diff);
1891 fnd_log.string(fnd_log.level_statement, 'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id, 'l_disb_prelim_amt: ' ||l_disb_prelim_amt);
1892 fnd_log.string(fnd_log.level_statement, 'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id, 'l_disb_amt_extra: ' ||l_disb_amt_extra);
1893 fnd_log.string(fnd_log.level_statement, 'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id, 'l_disb_amt: ' ||l_disb_amt);
1894 fnd_log.string(fnd_log.level_statement, 'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id, 'l_disb_limit1: ' ||l_disb_limit1);
1895 fnd_log.string(fnd_log.level_statement, 'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id, 'l_disb_limit2: ' ||l_disb_limit2);
1896 fnd_log.string(fnd_log.level_statement, 'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id, 'l_step: ' ||l_step);
1897 END IF;
1898
1899 -- Calculate each disbursement and distribute the extra
1900 -- amount starting from the first/last disbursement
1901 WHILE l_disb_no BETWEEN l_disb_limit1 AND l_disb_limit2
1902 LOOP
1903 l_disb_structure_rec(l_disb_no).disb_num := l_disb_no;
1904
1905 IF l_disb_diff >= l_extra_factor THEN
1906 l_disb_structure_rec(l_disb_no).disb_amt := l_disb_amt_extra;
1907 l_disb_diff := NVL((l_disb_diff - l_extra_factor), 0);
1908 ELSE
1909 l_disb_structure_rec(l_disb_no).disb_amt := l_disb_amt;
1910 END IF;
1911
1912 -- Log useful values
1913 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1914 fnd_log.string(fnd_log.level_statement,
1915 'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id,
1916 'Disbursement number: '||l_disb_structure_rec(l_disb_no).disb_num || ' Disbursement amount: ' || to_char(l_disb_structure_rec(l_disb_no).disb_amt));
1917 END IF;
1918
1919 l_disb_no := NVL(l_disb_no, 0) + l_step;
1920 END LOOP;
1921
1922 ------------------------------------
1923 -- MATCH COA/MANUAL Distribution
1924 ------------------------------------
1925 ELSIF UPPER(p_dist_plan_code) IN ('C', 'M') THEN
1926
1927 -- Log values
1928 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1929 fnd_log.string(fnd_log.level_statement, 'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id, 'Special disbursement No: ' ||l_special_disb_no);
1930 END IF;
1931
1932 -- Initialize disbursement counter
1933 l_disb_no := 1;
1934
1935 -- Loop thru all the disbursement records and round the disbursement amount
1936 FOR l_disb_rec_all IN cur_get_all_disb(p_fund_id, p_base_id, p_process_id, p_adplans_id, p_award_id)
1937 LOOP
1938
1939 -- Skip the first/last disbursement
1940 IF l_disb_no <> l_special_disb_no THEN
1941
1942 -- Calculate disbursement amount truncated to correct decimal place
1943 l_disb_amt := TRUNC(NVL(l_disb_rec_all.temp_num_val1, 0), l_trunc_factor);
1944
1945 -- Add the disbursement to PL/SQL table
1946 l_disb_structure_rec(l_disb_no).disb_num := l_disb_no;
1947 l_disb_structure_rec(l_disb_no).disb_amt := l_disb_amt;
1948
1949 l_disb_inter_sum_amt := NVL((l_disb_inter_sum_amt + l_disb_amt), 0);
1950
1951 -- Log useful values
1952 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1953 fnd_log.string(fnd_log.level_statement,
1954 'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id,
1955 'Disbursement number: '||l_disb_structure_rec(l_disb_no).disb_num || ' Disbursement amount: ' || to_char(l_disb_structure_rec(l_disb_no).disb_amt));
1956 END IF;
1957 END IF;
1958
1959 l_disb_no := NVL(l_disb_no, 0) + 1;
1960 END LOOP;
1961
1962 -- Calculate first/last disbursement. Unlike other disbursements,
1963 -- this is not got from temporary table, but is claculated here
1964 l_disb_amt := TRUNC(NVL((p_offered_amt - l_disb_inter_sum_amt), 0), l_trunc_factor);
1965
1966 -- Add the first/last disbursement to PL/SQL table
1967 l_disb_structure_rec(l_special_disb_no).disb_num := l_special_disb_no;
1968 l_disb_structure_rec(l_special_disb_no).disb_amt := l_disb_amt;
1969
1970 -- Log useful values
1971 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1972 fnd_log.string(fnd_log.level_statement,
1973 'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id,
1974 'Disbursement number(Special Case): '|| l_disb_structure_rec(l_special_disb_no).disb_num || ' Disbursement amount: ' || to_char(l_disb_structure_rec(l_special_disb_no).disb_amt));
1975 END IF;
1976
1977 END IF; -- End of p_dist_plan_code
1978
1979 ELSE
1980 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1981 fnd_log.string(fnd_log.level_statement,
1982 'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id,
1983 'Invalid disbursement rounding factor in fund id: ' ||p_fund_id|| '. Cannot compute disbursement rounding');
1984 END IF;
1985 END IF; -- End of disb_round_factor
1986
1987 -- Log values
1988 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1989 fnd_log.string(fnd_log.level_statement, 'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id, 'Updating temp table(igf_aw_award_t) with the rounded disbursement amounts.');
1990 END IF;
1991
1992 -- All the rounded disbursement amounts are now available in the PL/SQL table
1993 -- Update these to the temporary table
1994 l_disb_no := 0;
1995
1996 FOR l_disb_rec IN cur_get_all_disb(p_fund_id, p_base_id, p_process_id, p_adplans_id, p_award_id)
1997 LOOP -- Get all disbursements
1998 l_disb_no := NVL(l_disb_no, 0) + 1;
1999
2000 -- Check if the PL/SQL table has got a valid value for that disbursement number
2001 IF l_disb_structure_rec.EXISTS(l_disb_no) THEN -- Disbursement existence check
2002
2003 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2004 fnd_log.string(fnd_log.level_statement,
2005 'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id,
2006 'Disbursement amounts before and after applying rounding logic');
2007
2008 fnd_log.string(fnd_log.level_statement,
2009 'igf.plsql.igf_aw_packaging.round_off_disbursements.debug '|| g_req_id,
2010 'Disbursement number: ' ||l_disb_no|| ' Old Disbursement amount: ' ||l_disb_rec.temp_num_val1|| ' New disbursement amount after applying rounding logic: ' ||NVL(l_disb_structure_rec(l_disb_no).disb_amt, 0));
2011 END IF;
2012
2013 igf_aw_award_t_pkg.update_row(
2014 x_rowid => l_disb_rec.rowid,
2015 x_process_id => l_disb_rec.process_id,
2016 x_sl_number => l_disb_rec.sl_number,
2017 x_fund_id => l_disb_rec.fund_id,
2018 x_base_id => l_disb_rec.base_id,
2019 x_offered_amt => NVL(l_disb_structure_rec(l_disb_no).disb_amt, 0),
2020 x_accepted_amt => l_disb_rec.accepted_amt,
2021 x_paid_amt => l_disb_rec.paid_amt,
2022 x_need_reduction_amt => l_disb_rec.need_reduction_amt,
2023 x_flag => l_disb_rec.flag,
2024 x_temp_num_val1 => NVL(l_disb_structure_rec(l_disb_no).disb_amt, 0),
2025 x_temp_num_val2 => l_disb_rec.temp_num_val2,
2026 x_temp_char_val1 => l_disb_rec.temp_char_val1,
2027 x_tp_cal_type => l_disb_rec.tp_cal_type,
2028 x_tp_sequence_number => l_disb_rec.tp_sequence_number,
2029 x_ld_cal_type => l_disb_rec.ld_cal_type,
2030 x_ld_sequence_number => l_disb_rec.ld_sequence_number,
2031 x_mode => 'R',
2032 x_adplans_id => l_disb_rec.adplans_id,
2033 x_app_trans_num_txt => l_disb_rec.app_trans_num_txt,
2034 x_award_id => l_disb_rec.award_id,
2035 x_lock_award_flag => l_disb_rec.lock_award_flag,
2036 x_temp_val3_num => l_disb_rec.temp_val3_num,
2037 x_temp_val4_num => l_disb_rec.temp_val4_num,
2038 x_temp_char2_txt => l_disb_rec.temp_char2_txt,
2039 x_temp_char3_txt => l_disb_rec.temp_char3_txt
2040 );
2041 END IF; -- End of Disbursement existence check
2042 END LOOP; -- End of Get all disbursements loop
2043
2044 EXCEPTION
2045 WHEN OTHERS THEN
2046 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
2047 fnd_message.set_token('NAME','IGF_AW_PACKAGING.ROUND_OFF_DISBURSEMENTS '||SQLERRM);
2048 igs_ge_msg_stack.add;
2049
2050 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
2051 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.round_off_disbursements.exception '|| g_req_id,'sql error message: '||SQLERRM);
2052 END IF;
2053
2054 app_exception.raise_exception;
2055 END round_off_disbursements;
2056
2057 -- This process posts records in the Awards and Disbursements Table
2058 PROCEDURE post_award(
2059 l_base_id IN NUMBER,
2060 l_process_id IN NUMBER,
2061 l_post IN VARCHAR2,
2062 l_called_from IN VARCHAR2,
2063 l_upd_awd_notif_status IN VARCHAR2,
2064 l_ret_status OUT NOCOPY VARCHAR2
2065 ) IS
2066 /*
2067 || Created By : cdcruz
2068 || Created On : 14-NOV-2000
2069 || Purpose :
2070 || Known limitations, enhancements or remarks :
2071 || Change History :
2072 || Who WHEN What
2073 || (reverse chronological order - newest change first)
2074 || museshad 24-Apr-2006 Bug 5116534.
2075 || 1. Modified cursor c_nslds to chk for valid nslds_loan_prog_code_1 data.
2076 || 2. Modified the logic used to derive lb_disb_update
2077 || museshad 17-Apr-2006 Bug 5039489.
2078 || Negative entry was NOT getting posted to Student a/c when a
2079 || disb gets cancelled during repackaging process. This was
2080 || happening bcoz disb_net_amt was NOT getting set to 0 while
2081 || cancelling extra disb in the old award during repackaging.
2082 || Note, this issue is applicable to awards from all funds.
2083 || Also not directly relating to this bug, disb_paid_amt was
2084 || getting set to 0 in this case which should not happen actually.
2085 || Fixed these issues.
2086 || museshad 14-Apr-2006 Bug 5042136.
2087 || When a disb is cancelled- Origination Fee, Guarantor Fee,
2088 || Interest Rebate Amount should become 0. Fixed this.
2089 || Note, in repackaging when there are extra disb of the old
2090 || award they are cancelled.
2091 || museshad 02-Jun-2005 Build# FA157 - Bug# 4382371.
2092 || As per the new logic 'Award Notification Status' and 'Award Notification
2093 || Status Date' are got at the award level (from IGF_AW_AWARD_ALL table).
2094 || Previously they were got from IGF_AP_FA_BASE_REC_ALL table. Passed
2095 || NULL to these columns in the TBH call for
2096 || IGF_AP_FA_BASE_REC_ALL table.
2097 || ayedubat 12-OCT-04 Changed the TBH calls of igf_aw_awd_disb_pkg package to add a new column,
2098 || PAYMENT_PRD_ST_DATE as part of FA 149 build bug # 3416863
2099 || bkkumar 02-04-04 FACR116 - Added the new paramter p_alt_rel_code to the
2100 || get_loan_fee1 , get_loan_fee2 , get_cl_hold_rel_ind
2101 || ,get_cl_auto_late_ind
2102 || veramach 03-Dec-2003 FA 131 COD Updates
2103 || Adds cursor c_trans_num which is used to populate payment ISIR transaction number
2104 || veramach 20-NOV-2003 c_awd_tot cursor select adplans_id also
2105 || c_awd_disb,c_awd_disb_cnt choose adplans_id
2106 || Added cursor c_disb. This is used to apply NSLDS offset to first disb of the student
2107 || bkkumar 30-sep-2003 Added base_id to the get_loan_fee1 and
2108 || get_loan_fee2 and added l_auto_late_ind
2109 || for teh CL Loans
2110 || ugummall 25-SEP-2003 FA 126 - Multiple FA Offices.
2111 || added new parameter assoc_org_num to
2112 || igf_ap_fa_base_rec_pkg.update_row call.
2113 || rasahoo 23-Apl-2003 Bug # 2860836
2114 || Added exception handling for resolving
2115 || locking problem created by fund manager
2116 || brajendr 07-Mar-2003 Bug # 2829487
2117 || Added the call to update the Process status of the student after adding the TO Do Items
2118 ||
2119 || masehgal 25-Feb-2003 Bug # 2662487 Introduced Logic to Round Off amounts for CL as well
2120 || Removed Hard Coded check for Fund Types
2121 ||
2122 || brajendr 09-Jan-2003 Bug # 2742000 Modified the logic for updating Notification Status.
2123 || Earlier notification status is done only for Auto Packaging
2124 ||
2125 || brajendr 18-Dec-2002 Bug # 2691832
2126 || Modified the logic for updating the Packaging Status.
2127 ||
2128 || masehgal 11-Nov-2002 FA 101 - SAP Obsoletion Removed packaging hold
2129 ||
2130 || pmarada 13-Feb-2002 Modified as part of FACR008-correspondence build, updateing fabase rec.
2131 */
2132
2133 -- Get all the awards which can be awarded to the students
2134 CURSOR c_awd_tot( x_process_id igf_aw_award_t.process_id%TYPE,
2135 x_base_id igf_aw_award_t.base_id%TYPE ) IS
2136 SELECT awdt.fund_id,
2137 awdt.adplans_id,
2138 NVL(awdt.offered_amt,0) offered_amt,
2139 NVL(awdt.accepted_amt,0) accepted_amt,
2140 temp_char_val1 over_award,
2141 temp_num_val1 common_perct,
2142 award_id,
2143 lock_award_flag
2144 FROM igf_aw_award_t awdt
2145 WHERE awdt.process_id = x_process_id
2146 AND awdt.base_id = x_base_id
2147 AND awdt.flag = 'FL';
2148
2149 l_awd_tot c_awd_tot%ROWTYPE;
2150
2151 -- Get the details of the Fund which are necessary while creating Awards and Disbursements
2152 CURSOR c_fmast ( x_fund_id igf_aw_fund_mast.fund_id%TYPE ) IS
2153 SELECT fmast.pckg_awd_stat,
2154 fmast.ci_cal_type,
2155 fmast.ci_sequence_number,
2156 fmast.nslds_disb_da,
2157 fmast.disb_exp_da,
2158 fmast.disb_verf_Da,
2159 fmast.fee_type,
2160 fmast.fund_code,
2161 fmast.show_on_bill,
2162 fmast.entitlement,
2163 fcat.fund_source,
2164 fcat.fed_fund_code,
2165 fcat.sys_fund_type
2166 FROM igf_aw_fund_mast_all fmast,
2167 igf_aw_fund_cat_all fcat
2168 WHERE fund_id = x_fund_id
2169 AND fcat.fund_code = fmast.fund_code;
2170
2171 l_fmast c_fmast%ROWTYPE;
2172
2173 -- Get the Person Number and SSN of the student, used to log the messages in the log file
2174 CURSOR c_person_number IS
2175 SELECT person_number, ssn, person_id
2176 FROM igf_ap_fa_con_v faconv
2177 WHERE faconv.base_id = l_base_id;
2178
2179 l_person_number c_person_number%ROWTYPE;
2180
2181 -- Get the list of disbursements of an award from the same fund of a student
2182 CURSOR c_awd_disb(
2183 x_base_id NUMBER,
2184 x_fund_id NUMBER,
2185 x_process_id NUMBER,
2186 x_adplans_id NUMBER,
2187 x_award_id NUMBER
2188 ) IS
2189 SELECT awdt.*
2190 FROM igf_aw_award_t awdt
2191 WHERE base_id = x_base_id
2192 AND fund_id = x_fund_id
2193 AND process_id = x_process_id
2194 AND NVL(award_id,-1) = NVL(x_award_id,-1)
2195 AND flag = 'DB'
2196 AND NVL(adplans_id,-1) = NVL(x_adplans_id,-1)
2197 ORDER BY fnd_date.chardate_to_date(awdt.temp_char_val1);
2198
2199 l_awd_disb c_awd_disb%ROWTYPE;
2200
2201 -- Get the count of number of Disbursements
2202 CURSOR c_awd_disb_cnt(
2203 x_base_id NUMBER,
2204 x_fund_id in NUMBER,
2205 x_process_id NUMBER,
2206 x_adplans_id NUMBER,
2207 x_award_id NUMBER
2208 ) IS
2209 SELECT COUNT(*)
2210 FROM igf_aw_award_t awdt
2211 WHERE base_id = x_base_id
2212 AND fund_id = x_fund_id
2213 AND process_id = x_process_id
2214 AND flag = 'DB'
2215 AND NVL(adplans_id,-1) = NVL(x_adplans_id,-1)
2216 AND NVL(award_id,-1) = NVL(x_award_id,-1);
2217
2218 -- Get the NSLDS details of the student, used while creating the Loan Awards
2219 -- Student should be having at least one loan award in his student life.
2220 -- so person id was used to check the existance in diferent awd years
2221 CURSOR c_nslds ( cp_person_id igf_ap_fa_base_rec_all.person_id%TYPE ) IS
2222 SELECT 'x'
2223 FROM igf_ap_nslds_data nslds,
2224 igf_ap_fa_base_rec_all fabase
2225 WHERE fabase.base_id = nslds.base_id AND
2226 fabase.person_id = cp_person_id AND
2227 nslds.nslds_loan_prog_code_1 IS NOT NULL;
2228
2229 x_nslds c_nslds%ROWTYPE;
2230
2231 -- Select all the detials of the student whose Notification is not 'Ready' OR 'Do not send'
2232 -- Used to create award / disbursement notifiactions for the student when there is change in Existing awards or new awards
2233 CURSOR c_fabase(cp_baseid igf_ap_fa_base_rec.base_id%TYPE) IS
2234 SELECT fabase.*
2235 FROM igf_ap_fa_base_rec fabase
2236 WHERE base_id = cp_baseid
2237 AND (notification_status NOT IN ('R','D') OR notification_status IS NULL);
2238
2239 l_fabase c_fabase%ROWTYPE;
2240
2241 -- Get a specific disbursment for an award
2242 CURSOR c_disb(
2243 cp_award_id igf_aw_award_all.award_id%TYPE,
2244 cp_disb_num igf_aw_awd_disb_all.disb_num%TYPE
2245 ) IS
2246 SELECT rowid row_id,
2247 disb.*
2248 FROM igf_aw_awd_disb_all disb
2249 WHERE award_id = cp_award_id
2250 AND disb_num = cp_disb_num;
2251
2252 l_disb c_disb%ROWTYPE;
2253 l_award_status VARCHAR2(30);
2254 lv_rowid ROWID;
2255 lv_method_name VARCHAR2(80);
2256 lv_method_desc VARCHAR2(100);
2257 l_award_id NUMBER;
2258 l_fee1 NUMBER(12,2);
2259 l_fee2 NUMBER(12,2);
2260 l_fee_paid1 NUMBER(12,2);
2261 l_fee_paid2 NUMBER(12,2);
2262 l_fee_amt1 NUMBER(12,2);
2263 l_fee_amt2 NUMBER(12,2);
2264 ln_dummy_net_amt NUMBER(12,2);
2265 ln_dummy_fee_1 NUMBER(12,2);
2266 l_disb_date DATE;
2267 l_disb_date1 DATE;
2268 l_disb_num NUMBER;
2269 l_flag VARCHAR2(30);
2270 l_hold_rel_ind igf_aw_awd_disb.hold_rel_ind%TYPE;
2271 lb_disb_update BOOLEAN := FALSE;
2272 l_auto_late_ind igf_sl_cl_setup.auto_late_disb_ind%TYPE; -- FA 122 Loans Enhancements
2273 l_log_mesg VARCHAR2(300);
2274 l_disb_dates disb_dt_tab := disb_dt_tab();
2275 l_cnt NUMBER;
2276 l_nslds_dt DATE;
2277 l_verf_dt DATE;
2278 l_exp_dt DATE;
2279 l_hld_flg VARCHAR2(1);
2280 l_hold_id igf_db_disb_holds.hold_id%TYPE;
2281 l_rebate NUMBER;
2282 l_net NUMBER;
2283 l_credits NUMBER;
2284 ln_total_disb NUMBER;
2285 ln_db_run_gross_amt NUMBER(12,2) := 0; -- Declared as 12,2 for rounding the Amount to 2 precision values.
2286 ln_db_act_gross_amt NUMBER(12,2) := 0;
2287 ln_db_run_accpt_amt NUMBER(12,2) := 0;
2288 ln_db_act_accpt_amt NUMBER(12,2) := 0;
2289 ln_com_perct NUMBER;
2290 l_alt_pell_schedule igf_aw_award_all.alt_pell_schedule%TYPE;
2291 lb_awards_created BOOLEAN;
2292 lv_update_notif_stat VARCHAR(2);
2293 l_attendance_type_code igf_aw_awd_disb_all.attendance_type_code%TYPE;
2294 l_base_attendance_type_code igf_aw_awd_disb_all.base_attendance_type_code%TYPE;
2295 ln_total_disb_num NUMBER;
2296 lv_awd_notif_status VARCHAR2(1);
2297 SKIP_RECORD EXCEPTION;
2298
2299 lv_app_trans_num_txt igf_aw_award_all.app_trans_num_txt%TYPE;
2300 lv_result VARCHAR2(80);
2301 lv_method_code igf_aw_awd_dist_plans.dist_plan_method_code%TYPE;
2302
2303 -- Get payment ISIR transaction number
2304 CURSOR c_trans_num(
2305 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE
2306 ) IS
2307 SELECT transaction_num
2308 FROM igf_ap_isir_matched_all
2309 WHERE base_id = cp_base_id
2310 AND system_record_type = 'ORIGINAL'
2311 AND payment_isir = 'Y';
2312 l_trans_num c_trans_num%ROWTYPE;
2313
2314 l_app VARCHAR2(80);
2315 l_name VARCHAR2(80);
2316
2317
2318 -- Get award details
2319 CURSOR c_award_det(
2320 cp_award_id igf_aw_award_all.award_id%TYPE
2321 ) IS
2322 SELECT awd.ROWID row_id,awd.*
2323 FROM igf_aw_award_all awd
2324 WHERE award_id = cp_award_id;
2325 l_award_det c_award_det%ROWTYPE;
2326
2327 -- Get disbursements which should be cancelled
2328 CURSOR c_disb_cancel(
2329 cp_award_id igf_aw_award_all.award_id%TYPE,
2330 cp_disb_num igf_aw_awd_disb_all.disb_num%TYPE
2331 ) IS
2332 SELECT *
2333 FROM igf_aw_awd_disb
2334 WHERE award_id = cp_award_id
2335 AND disb_num > cp_disb_num;
2336
2337 lv_locking_success VARCHAR2(1);
2338
2339 -- Get pell disb orig
2340 CURSOR c_pell_disb_orig(
2341 cp_award_id igf_aw_award_all.award_id%TYPE,
2342 cp_disb_num igf_aw_awd_disb_all.disb_num%TYPE
2343 ) IS
2344 SELECT rfmd.ROWID row_id,
2345 rfmd.*
2346 FROM igf_gr_rfms_all rfms,
2347 igf_gr_rfms_disb_all rfmd
2348 WHERE rfms.origination_id = rfmd.origination_id
2349 AND rfms.award_id = cp_award_id
2350 AND rfmd.disb_ref_num = cp_disb_num;
2351 l_pell_disb_orig c_pell_disb_orig%ROWTYPE;
2352
2353 lv_row_id VARCHAR2(25);
2354 lv_rfmd_id igf_gr_rfms_disb_all.rfmd_id%TYPE;
2355 l_orig_id igf_gr_rfms_all.origination_id%TYPE;
2356
2357 -- Get origination id for a PELL award
2358 CURSOR c_orig_id(
2359 cp_award_id igf_aw_award_all.award_id%TYPE
2360 ) IS
2361 SELECT rfms.origination_id
2362 FROM igf_gr_rfms_all rfms
2363 WHERE rfms.award_id = cp_award_id;
2364
2365 BEGIN
2366
2367 lb_awards_created := FALSE;
2368 lv_update_notif_stat := 'F';
2369 lv_awd_notif_status := 'D';
2370
2371 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2372 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'----------------------starting post_award--------------------------------------');
2373 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'starting post_award with l_process_id:'||l_process_id ||' l_base_id:'||l_base_id);
2374 END IF;
2375
2376 SAVEPOINT IGFAW03B_POST_AWARD;
2377 -- Process each award from the Temporary table for this Base_id and Process_id
2378 OPEN c_awd_tot( l_process_id, l_base_id);
2379 LOOP
2380
2381 BEGIN
2382
2383 SAVEPOINT disb_not_found;
2384
2385 FETCH c_awd_tot INTO l_awd_tot;
2386 EXIT WHEN c_awd_tot%NOTFOUND;
2387
2388
2389 lb_awards_created := TRUE;
2390
2391
2392 -- Re-Initialize all the variables
2393 -- Running Totals and Actual Totals should be reinitialized.
2394 ln_db_run_gross_amt := 0;
2395 ln_db_act_gross_amt := 0;
2396 ln_db_run_accpt_amt := 0;
2397 ln_db_act_accpt_amt := 0;
2398 ln_com_perct := NVL(l_awd_tot.common_perct,100);
2399
2400 -- Get the Fund details of the context award
2401 OPEN c_fmast( l_awd_tot.fund_id );
2402 FETCH c_fmast INTO l_fmast;
2403 IF c_fmast%NOTFOUND THEN
2404 CLOSE c_fmast;
2405 RAISE NO_DATA_FOUND;
2406 END IF;
2407 CLOSE c_fmast;
2408
2409 -- Initialize the Packaging Status.set the default status which is set at the fund level
2410 l_award_status := l_fmast.pckg_awd_stat;
2411
2412 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2413 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'set l_award_status:'||l_award_status||' after checking againt l_post:'||l_post);
2414 END IF;
2415
2416 -- For all PELL awards, Indicate whether the award is created using Alternate schedule or Regular matrix.
2417 -- And for other awards Initilize with NULL
2418 IF l_fmast.fed_fund_code = 'PELL' THEN
2419 l_alt_pell_schedule := g_alt_pell_schedule;
2420
2421 OPEN c_trans_num(l_base_id);
2422 FETCH c_trans_num INTO l_trans_num;
2423 CLOSE c_trans_num;
2424
2425 lv_app_trans_num_txt := l_trans_num.transaction_num;
2426 ELSE
2427 l_alt_pell_schedule := NULL;
2428 lv_app_trans_num_txt := NULL;
2429 END IF;
2430
2431 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2432 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'inserting into igf_aw_award');
2433 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_awd_tot.fund_id:'||l_awd_tot.fund_id);
2434 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_awd_tot.offered_amt:'||l_awd_tot.offered_amt);
2435 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_awd_tot.accepted_amt:'||l_awd_tot.accepted_amt);
2436 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_awd_tot.adplans_id:'||l_awd_tot.adplans_id);
2437 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'lv_app_trans_num_txt:'||lv_app_trans_num_txt);
2438 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_awd_tot.award_id:'||l_awd_tot.award_id);
2439 END IF;
2440
2441 lv_rowid := NULL;
2442 l_award_id := NULL;
2443
2444 -- Set the award notification status code based on the user value for the parameter
2445 IF l_upd_awd_notif_status = 'Y' THEN
2446 lv_awd_notif_status := 'R';
2447 END IF;
2448
2449 IF l_awd_tot.award_id IS NULL THEN --insert award only if the award is packaged.
2450 igf_aw_award_pkg.insert_row(
2451 x_rowid => lv_rowid,
2452 x_award_id => l_award_id,
2453 x_fund_id => l_awd_tot.fund_id,
2454 x_base_id => l_base_id,
2455 x_offered_amt => l_awd_tot.offered_amt * ln_com_perct / 100,
2456 x_accepted_amt => l_awd_tot.accepted_amt * ln_com_perct / 100,
2457 x_paid_amt => 0,
2458 x_packaging_type => 'B',
2459 x_batch_id => l_process_id,
2460 x_manual_update => 'N',
2461 x_rules_override => NULL,
2462 x_award_date => TRUNC(SYSDATE),
2463 x_award_status => l_award_status,
2464 x_attribute_category => NULL,
2465 x_attribute1 => NULL,
2466 x_attribute2 => NULL,
2467 x_attribute3 => NULL,
2468 x_attribute4 => NULL,
2469 x_attribute5 => NULL,
2470 x_attribute6 => NULL,
2471 x_attribute7 => NULL,
2472 x_attribute8 => NULL,
2473 x_attribute9 => NULL,
2474 x_attribute10 => NULL,
2475 x_attribute11 => NULL,
2476 x_attribute12 => NULL,
2477 x_attribute13 => NULL,
2478 x_attribute14 => NULL,
2479 x_attribute15 => NULL,
2480 x_attribute16 => NULL,
2481 x_attribute17 => NULL,
2482 x_attribute18 => NULL,
2483 x_attribute19 => NULL,
2484 x_attribute20 => NULL,
2485 x_rvsn_id => NULL,
2486 x_mode => 'R',
2487 x_alt_pell_schedule => l_alt_pell_schedule,
2488 x_award_number_txt => NULL,
2489 x_legacy_record_flag => NULL,
2490 x_adplans_id => l_awd_tot.adplans_id,
2491 x_lock_award_flag => NVL(l_awd_tot.lock_award_flag,'N'),
2492 x_app_trans_num_txt => lv_app_trans_num_txt,
2493 x_awd_proc_status_code => 'AWARDED',
2494 x_notification_status_code => lv_awd_notif_status,
2495 x_notification_status_date => TRUNC(sysdate),
2496 x_publish_in_ss_flag => g_publish_in_ss_flag
2497 );
2498 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2499 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'-----new award--------');
2500 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'award_id:'||l_award_id);
2501 END IF;
2502 -- Once the Award is successfully created, Attach all the To Do which are defined at the fund level
2503 -- to the student from the given fund.
2504 IF l_post <> 'Y' THEN
2505 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2506 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'calling add_todo as l_post <> Y');
2507 END IF;
2508 add_todo(l_awd_tot.fund_id, l_base_id);
2509
2510 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2511 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'calling igf_ap_batch_ver_prc_pkg.update_process_status as l_post <> Y');
2512 END IF;
2513 -- Change the Application Process status of student accordingly after ToDo Items are added.
2514 igf_ap_batch_ver_prc_pkg.update_process_status(l_base_id, NULL);
2515 END IF;
2516
2517 --Open the Cursor to fetch Person number for the Base Id l_base_id
2518 OPEN c_person_number;
2519 FETCH c_person_number INTO l_person_number;
2520 CLOSE c_person_number;
2521
2522 -- Log the Award details of the student in the OUTPUT file
2523 get_plan_desc(l_awd_tot.adplans_id,lv_method_name,lv_method_desc);
2524
2525 fnd_file.put_line(fnd_file.output,' ' );
2526 fnd_file.put_line(fnd_file.output,' ' );
2527 fnd_message.set_name('IGF','IGF_AW_AWD_DTLS');
2528 fnd_file.put_line(fnd_file.output,RPAD('-',10,'-') ||' '|| RPAD(fnd_message.get,20) ||' '|| RPAD('-',10,'-'));
2529
2530 fnd_file.put_line(fnd_file.output,RPAD(igf_aw_gen.lookup_desc('IGF_AW_LOOKUPS_MSG', 'PERSON_NUMBER'), 40, ' ') || ' : ' || l_person_number.person_number );
2531 fnd_file.put_line(fnd_file.output,RPAD(igf_aw_gen.lookup_desc('IGF_AW_LOOKUPS_MSG', 'SSN'), 40, ' ') || ' : ' || l_person_number.ssn );
2532 fnd_file.put_line(fnd_file.output,RPAD(igf_aw_gen.lookup_desc('IGF_AW_LOOKUPS_MSG', 'FUND_CODE'), 40, ' ') || ' : ' || l_fmast.fund_code);
2533 fnd_file.put_line(fnd_file.output,RPAD(igf_aw_gen.lookup_desc('IGF_AW_LOOKUPS_MSG', 'OFFERED_AMT'), 40, ' ') || ' : ' || TO_CHAR(l_awd_tot.offered_amt * ln_com_perct/100) );
2534 fnd_file.put_line(fnd_file.output,RPAD(igf_aw_gen.lookup_desc('IGF_GE_PARAMETERS','AWD_DIST_PLAN'), 40, ' ') || ' : ' || lv_method_name);
2535 fnd_file.put_line(fnd_file.output,RPAD(igf_aw_gen.lookup_desc('IGF_GE_PARAMETERS','DIST_PLAN_METHOD'),40,' ') || ' : ' || lv_method_desc);
2536 fnd_file.put_line(fnd_file.output,' ' );
2537
2538 l_fee1 := NULL;
2539 l_fee2 := NULL;
2540
2541 -- FA 122 Loan Enhancents 30-sep-2003 Added the base_id parameter to the get_loan_fee1 , get_loan_fee1 calls
2542
2543 -- Get the Direct and Federal/Common Loan limit Amounts
2544 IF igf_sl_gen.chk_dl_fed_fund_code (l_fmast.fed_fund_code) = 'TRUE'
2545 OR igf_sl_gen.chk_cl_fed_fund_code (l_fmast.fed_fund_code) = 'TRUE' THEN
2546 l_fee1 := igf_sl_award.get_loan_fee1 ( l_fmast.fed_fund_code,
2547 l_fmast.ci_cal_type ,
2548 l_fmast.ci_sequence_number,
2549 l_base_id,
2550 igf_sl_award.get_alt_rel_code(l_fmast.fund_code));
2551 END IF;
2552
2553 -- Get the Guarantor fee % for Commonline Loans
2554 IF igf_sl_gen.chk_cl_fed_fund_code (l_fmast.fed_fund_code) = 'TRUE' THEN
2555 l_fee2 := igf_sl_award.get_loan_fee2( l_fmast.fed_fund_code,
2556 l_fmast.ci_cal_type ,
2557 l_fmast.ci_sequence_number,
2558 l_base_id,
2559 igf_sl_award.get_alt_rel_code(l_fmast.fund_code));
2560 END IF;
2561
2562 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2563 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'called got loan limits');
2564 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_fee1:'||l_fee1);
2565 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_fee2:'||l_fee2);
2566 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'calling get_disbursements');
2567 END IF;
2568
2569 -- Create the Disbursements for this particualr Award
2570 -- This procedure call creates disbursements INTO temporay table
2571 get_disbursements(
2572 l_awd_tot.fund_id,
2573 l_awd_tot.offered_amt,
2574 l_base_id,
2575 l_process_id,
2576 l_awd_tot.accepted_amt,
2577 l_called_from,
2578 l_fmast.nslds_disb_da,
2579 l_fmast.disb_exp_da,
2580 l_fmast.disb_verf_da,
2581 l_disb_dates,
2582 l_awd_tot.adplans_id,
2583 NULL
2584 );
2585
2586 -- Flag verifing for over award holds, Initialize the Disbursement Hold flag
2587 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2588 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'after calling get_disbursements l_awd_tot.over_award:'||l_awd_tot.over_award);
2589 END IF;
2590 IF l_awd_tot.over_award = 'HOLD' THEN
2591 l_hld_flg := 'Y';
2592 ELSE
2593 l_hld_flg := 'N';
2594 END IF;
2595
2596 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2597 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_hld_flg:'||l_hld_flg||' as l_awd_tot.over_award:'||l_awd_tot.over_award);
2598 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_cnt:'||l_disb_dates.count);
2599 END IF;
2600
2601 l_disb_num := NULL;
2602 l_cnt := l_disb_dates.count;
2603
2604 -- Get the Total Number of disbursements which needs to be created
2605 ln_db_run_gross_amt := 0;
2606 ln_total_disb := 0;
2607
2608 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2609 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'opening c_awd_disb_cnt with adplans_id:'||l_awd_tot.adplans_id||' award_id:'||l_awd_tot.award_id);
2610 END IF;
2611 OPEN c_awd_disb_cnt( l_base_id, l_awd_tot.fund_id, l_process_id,l_awd_tot.adplans_id,l_awd_tot.award_id );
2612 FETCH c_awd_disb_cnt INTO ln_total_disb;
2613 CLOSE c_awd_disb_cnt;
2614
2615 -- Bug 3062062
2616 IF ln_total_disb = 0 THEN
2617 ROLLBACK TO disb_not_found;
2618 l_ret_status := 'D'; -- No disbursements created
2619 fnd_message.set_name('IGF','IGF_AW_SKP_FUND');
2620 fnd_message.set_token('FUND',l_fmast.fund_code);
2621 fnd_file.put_line(fnd_file.log,fnd_message.get);
2622 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2623 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'raising skip_record as total disbursements is 0');
2624 END IF;
2625 RAISE SKIP_RECORD;
2626 END IF;
2627
2628 -- Round disbursement amount for non-Pell funds.
2629 -- Pell disbursement rounding is handled separately in IGFGR11B
2630 IF get_fed_fund_code(p_fund_id => l_awd_tot.fund_id) <> 'PELL' THEN
2631 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2632 fnd_log.string(fnd_log.level_statement,
2633 'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,
2634 'Calling round_off_disbursements with fund_id:'||l_awd_tot.fund_id||', base_id:'||l_base_id||
2635 ', l_process_id: ' ||l_process_id||', Award_Id: '||l_awd_tot.award_id||', adplans_id: '||l_awd_tot.adplans_id||
2636 ', offered_amt: '||l_awd_tot.offered_amt||', g_method_cd: '||g_method_cd||', ln_total_disb: '||ln_total_disb);
2637 END IF;
2638
2639 round_off_disbursements(
2640 l_awd_tot.fund_id,
2641 l_base_id,
2642 l_process_id,
2643 l_awd_tot.award_id,
2644 l_awd_tot.adplans_id,
2645 l_awd_tot.offered_amt,
2646 g_method_cd,
2647 ln_total_disb
2648 );
2649 END IF;
2650
2651 IF l_fmast.entitlement = 'Y' AND l_hld_flg = 'Y' THEN
2652 /*
2653 Since the fund is an entitlement, we should not insert overaward holds on the award.
2654 we show a message to the user saying that this award will result in an overaward, but we are not
2655 inserting overaward holds as the fund is an entitlement
2656 */
2657 fnd_message.set_name('IGF','IGF_AW_ENTITLE_OVAWD');
2658 fnd_message.set_token('FUND_CODE',l_fmast.fund_code);
2659 fnd_message.set_token('AWD',TO_CHAR(l_awd_tot.offered_amt * ln_com_perct / 100));
2660 fnd_file.put_line(fnd_file.log,fnd_message.get);
2661 END IF;
2662
2663 IF g_sf_packaging = 'F' AND l_hld_flg = 'Y' AND l_fmast.entitlement <> 'Y' THEN
2664 /*
2665 Packaging process always gives upto the need of the student.
2666 So, a hold is not really necessary.
2667 This check is necessary in single-fund-packaging where overaward will occur.
2668 */
2669 l_hld_flg := 'N';
2670 END IF;
2671
2672
2673 --
2674 -- Get the total number of disbursements
2675 --
2676 ln_total_disb_num := ln_total_disb;
2677
2678 -- Get Disbursement records for this award that were calculated above in "get_disbursements" procedure
2679 OPEN c_awd_disb( l_base_id, l_awd_tot.fund_id, l_process_id,l_awd_tot.adplans_id,l_awd_tot.award_id );
2680 LOOP
2681 FETCH c_awd_disb INTO l_awd_disb;
2682
2683 EXIT WHEN c_awd_disb%NOTFOUND;
2684
2685 -- Initialize the Disbursement Number. Increment this counter for each disbursement
2686 -- This Dusbursement Number is unique in each Award.
2687 -- Initialize the Disbursement date with the calculated value
2688 l_disb_num := NVL(l_disb_num,0) + 1;
2689 l_disb_date := fnd_date.chardate_to_date(l_awd_disb.temp_char_val1);
2690
2691 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2692 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'$$$$$$ l_disb_num:'||l_disb_num||' $$$$$$');
2693 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_date:'||l_disb_date);
2694 END IF;
2695 -- Initialize the Disbursement Verification dates, Expiration date, NSLDS dates
2696 -- for each disbursement number
2697 FOR i IN 1..l_disb_dates.COUNT LOOP
2698
2699 IF l_disb_dates(i).process_id = l_awd_disb.process_id
2700 AND l_disb_dates(i).sl_no = l_awd_disb.sl_number THEN
2701 l_nslds_dt := l_disb_dates(i).nslds_disb_date;
2702 l_verf_dt := l_disb_dates(i).disb_verf_dt;
2703 l_exp_dt := l_disb_dates(i).disb_exp_dt;
2704 l_credits := l_disb_dates(i).min_credit_pts;
2705 l_attendance_type_code := l_disb_dates(i).attendance_type_code;
2706 l_base_attendance_type_code := l_disb_dates(i).base_attendance_type_code;
2707
2708 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2709 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'Get data from disb PL-SQL Table, l_disb_dates('||i||').process_id: '||l_disb_dates(i).process_id);
2710 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_dates('||i||').sl_no: '||l_disb_dates(i).sl_no);
2711 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_awd_disb.process_id '||l_awd_disb.process_id );
2712 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_awd_disb.sl_number '||l_awd_disb.sl_number);
2713 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_dates('||i||').nslds_disb_date:'||l_disb_dates(i).nslds_disb_date);
2714 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_dates('||i||').disb_verf_dt:'||l_disb_dates(i).disb_verf_dt);
2715 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_dates('||i||').disb_exp_dt:'||l_disb_dates(i).disb_exp_dt);
2716 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_dates('||i||').min_credit_pts:'||l_disb_dates(i).min_credit_pts);
2717 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_dates('||i||').attendance_type_code:'||l_disb_dates(i).attendance_type_code);
2718 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_dates('||i||').base_attendance_type:'||l_disb_dates(i).base_attendance_type_code);
2719 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_dates - l_attendance_type_code : '||l_attendance_type_code);
2720 END IF;
2721 END IF;
2722 END LOOP;
2723
2724 -- Delay Disb date by the "disb_delay_days" if necessary
2725 -- Check for disbursement delay days linked to NSLDS only for the first disbusement
2726 -- Note- NSLDS is applicable only for DL and CL loans
2727 IF (l_disb_num = 1) AND
2728 ( (igf_sl_gen.chk_dl_fed_fund_code(l_fmast.fed_fund_code) = 'TRUE') OR
2729 (igf_sl_gen.chk_cl_fed_fund_code(l_fmast.fed_fund_code) = 'TRUE')
2730 ) THEN
2731
2732 l_disb_date1 := NULL;
2733 OPEN c_nslds ( l_person_number.person_id );
2734 FETCH c_nslds INTO x_nslds;
2735
2736 IF c_nslds%NOTFOUND THEN
2737 -- No NSLDS History exists for current student, so delay the disbursement to NSLDS Date
2738 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2739 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'no NSLDS history for the student, so apply NSLDS date offset to delay disb date.');
2740 END IF;
2741
2742 IF l_nslds_dt IS NOT NULL THEN
2743 l_disb_date1 := l_nslds_dt; --to be changed by disbursements build
2744 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2745 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'Disb date after applying NSLDS offset, l_disb_date1: '||l_disb_date1);
2746 END IF;
2747 ELSE
2748 -- l_nslds_dt is NULL
2749 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2750 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,
2751 'Cannot compute NSLDS offset date. Either NSLDS offset has not been setup in Fund Manager or some error in computing NSLDS offset date. So using the actual disb date.');
2752 END IF;
2753 END IF;
2754 ELSE
2755 -- NSLDS history exists for the student, so do NOT delay disb date
2756 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2757 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'Person# ' ||l_person_number.person_number|| ' has NSLDS history, so NOT applying NSLDS date offset.');
2758 END IF;
2759 END IF;
2760
2761 CLOSE c_nslds;
2762 END IF; -- First Disbursement
2763
2764 -- Get the Origination fee for Direct/Commonline Loans
2765 l_fee_paid1 := NULL;
2766 l_fee_paid2 := NULL;
2767 l_fee_amt1 := NULL;
2768 l_fee_amt2 := NULL;
2769
2770 -- masehgal TRUNC these values also .. then use these for "other than" dl computations
2771 IF igf_sl_gen.chk_cl_fed_fund_code(l_fmast.fed_fund_code) = 'TRUE' THEN
2772 l_fee_amt1 := NVL(l_awd_disb.offered_amt,0) * (NVL(l_fee1,0) / 100) ;
2773 l_fee_amt1 := TRUNC(l_fee_amt1);
2774 ELSE
2775 l_fee_amt1 := 0;
2776 END IF;
2777
2778 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2779 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'after truncating, l_fee_amt1 is '||l_fee_amt1);
2780 END IF;
2781 -- Get the Guarantor fee for Commonline Loans
2782 IF igf_sl_gen.chk_cl_fed_fund_code(l_fmast.fed_fund_code) = 'TRUE' THEN
2783 l_fee_amt2 := NVL(l_awd_disb.offered_amt,0) * (NVL(l_fee2,0) / 100) ;
2784 l_fee_amt2 := TRUNC(l_fee_amt2);
2785 ELSE
2786 l_fee_amt2 := 0;
2787 END IF;
2788
2789 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2790 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'after truncating l_fee_amt2 is '||l_fee_amt2);
2791 END IF;
2792
2793 -- For LOANs, get the Hold Release Indicator which is defined at the fund level
2794 -- FA 122 Loans Enhancemnets added the l_auto_late_ind variable to get the auto_late_ind
2795 IF igf_sl_gen.chk_cl_fed_fund_code(l_fmast.fed_fund_code) = 'TRUE' THEN
2796 l_hold_rel_ind := igf_sl_award.get_cl_hold_rel_ind(
2797 l_fmast.fed_fund_code,
2798 l_fmast.ci_cal_type,
2799 l_fmast.ci_sequence_number,
2800 l_base_id,
2801 igf_sl_award.get_alt_rel_code(l_fmast.fund_code)
2802 );
2803 l_auto_late_ind := igf_sl_award.get_cl_auto_late_ind(
2804 l_fmast.fed_fund_code,
2805 l_fmast.ci_cal_type,
2806 l_fmast.ci_sequence_number,
2807 l_base_id,
2808 igf_sl_award.get_alt_rel_code(l_fmast.fund_code)
2809 );
2810 ELSE
2811 l_hold_rel_ind := NULL;
2812 l_auto_late_ind := NULL;
2813 END IF;
2814
2815 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2816 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_hold_rel_ind:'||l_hold_rel_ind);
2817 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_auto_late_ind:'||l_auto_late_ind);
2818 END IF;
2819 -- For the Last disbursement insert the remaining disbursement amount of the fund
2820 -- Update the Running Totals of Gross Amount and Net Amount
2821 -- This is necessary as to avoid truncation fraction of amounts when there is decimals.
2822 IF l_disb_num = ln_total_disb THEN
2823 ln_db_act_gross_amt := ( l_awd_tot.offered_amt * ln_com_perct / 100 )- ln_db_run_gross_amt;
2824
2825 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2826 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_award_id: '||l_award_id);
2827 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_num: '||l_disb_num);
2828 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'ln_db_act_gross_amt: '||ln_db_act_gross_amt);
2829 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'ln_db_run_gross_amt: '||ln_db_run_gross_amt);
2830 END IF;
2831
2832 ELSE
2833 -- Update the running totals
2834 ln_db_act_gross_amt := l_awd_disb.offered_amt;
2835
2836 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2837 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'ln_db_act_gross_amt:'||ln_db_act_gross_amt);
2838 END IF;
2839 END IF;
2840
2841 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2842 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'for last disb insert remaining amount!ln_db_act_gross_amt:'||ln_db_act_gross_amt);
2843 END IF;
2844 -- Incase of Direct Loans round off amounts
2845 IF igf_sl_gen.chk_dl_fed_fund_code(l_fmast.fed_fund_code) = 'TRUE' THEN
2846 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2847 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'igf_sl_gen.chk_dl_fed_fund_code('||l_fmast.fed_fund_code||')=TRUE');
2848 END IF;
2849 -- sjadhav Bug 2411031
2850 -- Changed sequence of calling igf_sl_award.get_loan_amts and igf_sl_roundoff_digits_pkg.gross_fees_roundoff.
2851 -- This is done becuase first round off disbursement gross amount should be calculated first and then net amount / fee amount etc
2852
2853 -- we are passing dummys here for Net and Fee amount as they will be calculated later on
2854
2855 igf_sl_roundoff_digits_pkg.gross_fees_roundoff(p_last_disb_num => ln_total_disb_num,
2856 p_offered_amt => l_awd_tot.offered_amt,
2857 p_fee_perct => l_fee1,
2858 p_disb_gross_amt => ln_db_act_gross_amt,
2859 p_disb_net_amt => ln_dummy_net_amt,
2860 p_fee => ln_dummy_fee_1
2861 );
2862
2863
2864
2865
2866 -- This routine will return Net Amount/ Fee Amounts / Interest Rebate Amount
2867 igf_sl_award.get_loan_amts(
2868 l_fmast.ci_cal_type,
2869 l_fmast.ci_sequence_number,
2870 l_fmast.fed_fund_code,
2871 NVL(ln_db_act_gross_amt,0),
2872 l_rebate,
2873 l_fee_amt1,
2874 l_net
2875 );
2876
2877 l_awd_disb.temp_num_val1 := NVL(l_net,0);
2878
2879 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2880 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'after calling igf_sl_award.get_loan_amts,l_awd_disb.temp_num_val1:'||l_awd_disb.temp_num_val1);
2881 END IF;
2882
2883 -- masehgal rounding off for CL
2884 ELSIF igf_sl_gen.chk_cl_fed_fund_code(l_fmast.fed_fund_code) = 'TRUE' THEN
2885 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2886 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'igf_sl_gen.chk_cl_fed_fund_code('||l_fmast.fed_fund_code||')=TRUE');
2887 END IF;
2888 -- we are passing dummys here for Net and Fee amount as they will be calculated later on
2889 igf_sl_roundoff_digits_pkg.cl_gross_fees_roundoff(
2890 p_last_disb_num => ln_total_disb_num,
2891 p_offered_amt => l_awd_tot.offered_amt,
2892 p_disb_gross_amt => ln_db_act_gross_amt );
2893
2894 l_awd_disb.temp_num_val1 := NVL(ln_db_act_gross_amt, 0) -
2895 NVL( l_fee_amt1, 0 ) -
2896 NVL( l_fee_amt2, 0 );
2897
2898 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2899 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'after calling igf_sl_roundoff_digits_pkg.cl_gross_fees_roundoff,l_awd_disb.temp_num_val1:'||l_awd_disb.temp_num_val1);
2900 END IF;
2901
2902 l_rebate := NULL;
2903
2904 ELSE
2905 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2906 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'igf_sl_gen.chk_dl_fed_fund_code('||l_fmast.fed_fund_code||')=FALSE');
2907 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'igf_sl_gen.chk_cl_fed_fund_code('||l_fmast.fed_fund_code||')=FALSE');
2908 END IF;
2909 -- For funds other than the loans, calculate the Total Net amount
2910 l_awd_disb.temp_num_val1 := NVL(ln_db_act_gross_amt, 0);
2911 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2912 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_awd_disb.temp_num_val1 = NVL(ln_db_act_gross_amt, 0) = '||l_awd_disb.temp_num_val1);
2913 END IF;
2914 l_rebate := NULL;
2915 l_fee_amt1 := NULL;
2916 l_fee_amt2 := NULL;
2917 END IF;
2918
2919 ln_db_run_gross_amt := ln_db_run_gross_amt + ln_db_act_gross_amt;
2920 IF l_fmast.pckg_awd_stat = 'ACCEPTED' THEN
2921 ln_db_act_accpt_amt := ln_db_act_gross_amt;
2922 ELSE
2923 ln_db_act_accpt_amt := 0;
2924 END IF;
2925 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2926 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'after checking awd_initial_status, ln_db_act_accpt_amt:'||ln_db_act_accpt_amt);
2927 END IF;
2928
2929 IF l_disb_date1 IS NOT NULL AND l_disb_num = 1 THEN
2930 -- No NSLDS history. Apply NSLDS date offset to delay disbursement date
2931 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2932 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,
2933 'l_disb_date1 IS NOT NULL and l_disb_num = 1. So, setting lb_disb_update to TRUE to apply NSLDS offset');
2934 END IF;
2935 lb_disb_update := TRUE;
2936 ELSIF l_disb_num = 1 THEN
2937 -- NSLDS history exists (or) NSLDS history does not exist, but the NSLDS date offset is not set (i.e. l_disb_date1 is null) (or) it is a non DL/CL fund
2938 -- In both cases, we must NOT delay disbursement date
2939 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2940 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,
2941 'l_disb_date1 IS NULL and l_disb_num = 1. So, setting lb_disb_update to FALSE so that NSLDS offset is NOT applied');
2942 END IF;
2943 lb_disb_update := FALSE;
2944 END IF;
2945
2946 lv_rowid := NULL;
2947 IF l_fmast.fed_fund_code IN ('FWS') THEN
2948 l_attendance_type_code := NULL;
2949 l_base_attendance_type_code := NULL;
2950 END IF;
2951
2952 IF l_fmast.entitlement = 'Y' THEN
2953 --make l_hld_flg to 'N'
2954 --this is necessary as there has to be no holds on an entitlement
2955 l_hld_flg := 'N';
2956 END IF;
2957
2958 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2959 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'Before inserting into igf_aw_awd_disb table with l_attendance_type_code : '||l_attendance_type_code);
2960 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'inserting into igf_aw_awd_disb table with manual_hold_ind:'||l_hld_flg);
2961 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'Before inserting into igf_aw_awd_disb table with l_base_attendance_type_code : '||l_base_attendance_type_code);
2962 END IF;
2963
2964 IF (l_fmast.fed_fund_code = 'PELL' AND
2965 igf_sl_dl_validation.check_full_participant (l_fmast.ci_cal_type,l_fmast.ci_sequence_number,'PELL'))
2966 OR (l_fmast.fed_fund_code IN ('DLP','DLS','DLU') AND
2967 igf_sl_dl_validation.check_full_participant (l_fmast.ci_cal_type,l_fmast.ci_sequence_number,'DL'))
2968 THEN
2969 l_hold_rel_ind := 'FALSE';
2970 END IF;
2971
2972 igf_aw_awd_disb_pkg.insert_row(
2973 x_rowid => lv_rowid,
2974 x_award_id => l_award_id,
2975 x_disb_num => l_disb_num,
2976 x_tp_cal_type => l_awd_disb.tp_cal_type,
2977 x_tp_sequence_number => l_awd_disb.tp_sequence_number,
2978 x_disb_gross_amt => ln_db_act_gross_amt ,
2979 x_fee_1 => NVL(l_fee_amt1, 0),
2980 x_fee_2 => NVL(l_fee_amt2, 0),
2981 x_disb_net_amt => NVL(l_awd_disb.temp_num_val1,0),
2982 x_disb_date => l_disb_date,
2983 x_trans_type => 'P',
2984 x_elig_status => 'N',
2985 x_elig_status_date => TRUNC(SYSDATE),
2986 x_affirm_flag => 'N',
2987 x_hold_rel_ind => l_hold_rel_ind,
2988 x_manual_hold_ind => l_hld_flg,
2989 x_disb_status => NULL,
2990 x_disb_status_date => NULL,
2991 x_late_disb_ind => l_auto_late_ind, -- FA 122 Added l_auto_late_ind
2992 x_fund_dist_mthd => 'E',
2993 x_prev_reported_ind => 'N',
2994 x_fund_release_date => NULL,
2995 x_fund_status => NULL,
2996 x_fund_status_date => NULL,
2997 x_fee_paid_1 => NVL(l_fee_paid1, 0),
2998 x_fee_paid_2 => NVL(l_fee_paid2, 0),
2999 x_cheque_number => NULL,
3000 x_ld_cal_type => l_awd_disb.ld_cal_type,
3001 x_ld_sequence_number => l_awd_disb.ld_sequence_number,
3002 x_disb_accepted_amt => ln_db_act_accpt_amt,
3003 x_disb_paid_amt => l_awd_disb.paid_amt,
3004 x_rvsn_id => NULL,
3005 x_int_rebate_amt => NVL(l_rebate, 0),
3006 x_force_disb => NULL,
3007 x_min_credit_pts => l_credits,
3008 x_disb_exp_dt => l_exp_dt,
3009 x_verf_enfr_dt => l_verf_dt,
3010 x_fee_class => NULL,
3011 x_show_on_bill => l_fmast.show_on_bill,
3012 x_attendance_type_code => l_attendance_type_code,
3013 x_mode => 'R',
3014 x_base_attendance_type_code => l_base_attendance_type_code,
3015 x_payment_prd_st_date => NULL,
3016 x_change_type_code => NULL,
3017 x_fund_return_mthd_code => NULL,
3018 x_direct_to_borr_flag => 'N'
3019 );
3020
3021 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3022 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'after inserting into disb table....l_hld_flg: '||l_hld_flg);
3023 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'after inserting into disb table....l_attendance_type_code: '||l_attendance_type_code);
3024 END IF;
3025 -- If Over Award Hold is present at the award, then create 'SYSTEM' Hold for each disbursement of the Award
3026 IF l_hld_flg = 'Y' THEN
3027
3028 l_hold_id := NULL;
3029 lv_rowid := NULL;
3030
3031
3032 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3033 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'inserting into igf_db_disb_holds table');
3034 END IF;
3035 igf_db_disb_holds_pkg.insert_row(
3036 x_rowid => lv_rowid,
3037 x_hold_id => l_hold_id,
3038 x_award_id => l_award_id,
3039 x_disb_num => l_disb_num,
3040 x_hold => 'OVERAWARD',
3041 x_hold_date => TRUNC(SYSDATE),
3042 x_hold_type => 'SYSTEM',
3043 x_release_date => NULL,
3044 x_release_flag => 'N',
3045 x_release_reason => NULL,
3046 x_mode => 'R'
3047 );
3048 END IF;
3049 END LOOP;--end loop for c_awd_disb
3050 IF c_awd_disb%ISOPEN THEN
3051 CLOSE c_awd_disb;
3052 END IF;
3053
3054 IF lb_disb_update THEN
3055
3056 OPEN c_disb(l_award_id,1);
3057 FETCH c_disb INTO l_disb;
3058 CLOSE c_disb;
3059
3060 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3061 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id, 'Flag set - updating disb num 1 with disb date delayed by NSLDS offset: ' ||l_disb_date1);
3062 END IF;
3063
3064 igf_aw_awd_disb_pkg.update_row(
3065 x_mode => 'R',
3066 x_rowid => l_disb.row_id,
3067 x_award_id => l_disb.award_id,
3068 x_disb_num => l_disb.disb_num,
3069 x_tp_cal_type => l_disb.tp_cal_type,
3070 x_tp_sequence_number => l_disb.tp_sequence_number,
3071 x_disb_gross_amt => l_disb.disb_gross_amt,
3072 x_fee_1 => l_disb.fee_1,
3073 x_fee_2 => l_disb.fee_2,
3074 x_disb_net_amt => l_disb.disb_net_amt,
3075 x_disb_date => l_disb_date1,
3076 x_trans_type => l_disb.trans_type,
3077 x_elig_status => l_disb.elig_status,
3078 x_elig_status_date => l_disb.elig_status_date,
3079 x_affirm_flag => l_disb.affirm_flag,
3080 x_hold_rel_ind => l_disb.hold_rel_ind,
3081 x_manual_hold_ind => l_disb.manual_hold_ind,
3082 x_disb_status => l_disb.disb_status,
3083 x_disb_status_date => l_disb.disb_status_date,
3084 x_late_disb_ind => l_disb.late_disb_ind,
3085 x_fund_dist_mthd => l_disb.fund_dist_mthd,
3086 x_prev_reported_ind => l_disb.prev_reported_ind ,
3087 x_fund_release_date => l_disb.fund_release_date,
3088 x_fund_status => l_disb.fund_status,
3089 x_fund_status_date => l_disb.fund_status_date,
3090 x_fee_paid_1 => l_disb.fee_paid_1,
3091 x_fee_paid_2 => l_disb.fee_paid_2,
3092 x_cheque_number => l_disb.cheque_number,
3093 x_ld_cal_type => l_disb.ld_cal_type,
3094 x_ld_sequence_number => l_disb.ld_sequence_number,
3095 x_disb_accepted_amt => l_disb.disb_accepted_amt,
3096 x_disb_paid_amt => l_disb.disb_paid_amt,
3097 x_rvsn_id => l_disb.rvsn_id,
3098 x_int_rebate_amt => l_disb.int_rebate_amt,
3099 x_force_disb => l_disb.force_disb,
3100 x_min_credit_pts => l_disb.min_credit_pts,
3101 x_disb_exp_dt => l_disb.disb_exp_dt,
3102 x_verf_enfr_dt => l_disb.verf_enfr_dt,
3103 x_fee_class => l_disb.fee_class,
3104 x_show_on_bill => l_disb.show_on_bill,
3105 x_attendance_type_code => l_disb.attendance_type_code,
3106 x_base_attendance_type_code => l_disb.base_attendance_type_code,
3107 x_payment_prd_st_date => l_disb.payment_prd_st_date,
3108 x_change_type_code => l_disb.change_type_code,
3109 x_fund_return_mthd_code => l_disb.fund_return_mthd_code,
3110 x_direct_to_borr_flag => l_disb.direct_to_borr_flag
3111 );
3112 END IF;
3113 ELSE -- l_awd_tot.award_id is not null check
3114 --update the award here. this award has been repackaged
3115 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3116 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'starting repackaging for award_id:'||l_awd_tot.award_id);
3117 END IF;
3118 OPEN c_award_det(l_awd_tot.award_id);
3119 FETCH c_award_det INTO l_award_det;
3120 CLOSE c_award_det;
3121 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3122 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'c_award_Det fetched rowid:'||l_award_det.row_id);
3123 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'-----old award--------');
3124 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'award_id:'||l_award_det.award_id);
3125 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_awd_tot.offered_amt:'||l_awd_tot.offered_amt);
3126 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_awd_tot.accepted_amt:'||l_awd_tot.accepted_amt);
3127 END IF;
3128
3129 -- here, a check is made on the fed_fund_code of the fund and paid_amt.
3130 IF l_fmast.fed_fund_code = 'FWS' AND l_award_det.paid_amt > l_awd_tot.offered_amt THEN
3131 --skip the student
3132 fnd_message.set_name('IGF','IGF_AW_INV_FWS_AWD');
3133 fnd_file.put_line(fnd_file.log,fnd_message.get);
3134 RAISE INV_FWS_AWARD;
3135 END IF;
3136
3137 IF l_award_det.award_status = 'CANCELLED' THEN
3138 l_award_status := l_fmast.pckg_awd_stat;
3139 ELSE
3140 l_award_status := l_award_det.award_status;
3141 END IF;
3142
3143 IF l_fmast.fed_fund_code = 'PELL' AND g_phasein_participant THEN
3144 l_awd_tot.adplans_id := l_award_det.adplans_id;
3145 END IF;
3146
3147 IF l_fmast.fed_fund_code = 'PELL' THEN
3148 /*
3149 Ask user to re-originate PELL
3150 */
3151 update_pell_orig_stat(l_award_det.award_id,l_awd_tot.offered_amt);
3152 END IF;
3153
3154 IF l_fmast.sys_fund_type = 'LOAN' AND l_fmast.fed_fund_code IN ('DLS','DLU','DLP') THEN
3155 update_loan_stat(l_award_det.award_id,l_awd_tot.offered_amt);
3156 END IF;
3157 igf_aw_award_pkg.update_row(
3158 x_rowid => l_award_det.row_id,
3159 x_award_id => l_award_det.award_id,
3160 x_fund_id => l_award_det.fund_id,
3161 x_base_id => l_award_det.base_id,
3162 x_offered_amt => l_awd_tot.offered_amt,
3163 x_accepted_amt => l_awd_tot.accepted_amt,
3164 x_paid_amt => l_award_det.paid_amt,
3165 x_packaging_type => l_award_det.packaging_type,
3166 x_batch_id => l_award_det.batch_id,
3167 x_manual_update => l_award_det.manual_update,
3168 x_rules_override => l_award_det.rules_override,
3169 x_award_date => l_award_det.award_date,
3170 x_award_status => l_award_status,
3171 x_attribute_category => l_award_det.attribute_category,
3172 x_attribute1 => l_award_det.attribute1,
3173 x_attribute2 => l_award_det.attribute2,
3174 x_attribute3 => l_award_det.attribute3,
3175 x_attribute4 => l_award_det.attribute4,
3176 x_attribute5 => l_award_det.attribute5,
3177 x_attribute6 => l_award_det.attribute6,
3178 x_attribute7 => l_award_det.attribute7,
3179 x_attribute8 => l_award_det.attribute8,
3180 x_attribute9 => l_award_det.attribute9,
3181 x_attribute10 => l_award_det.attribute10,
3182 x_attribute11 => l_award_det.attribute11,
3183 x_attribute12 => l_award_det.attribute12,
3184 x_attribute13 => l_award_det.attribute13,
3185 x_attribute14 => l_award_det.attribute14,
3186 x_attribute15 => l_award_det.attribute15,
3187 x_attribute16 => l_award_det.attribute16,
3188 x_attribute17 => l_award_det.attribute17,
3189 x_attribute18 => l_award_det.attribute18,
3190 x_attribute19 => l_award_det.attribute19,
3191 x_attribute20 => l_award_det.attribute20,
3192 x_rvsn_id => l_award_det.rvsn_id,
3193 x_mode => 'R',
3194 x_alt_pell_schedule => l_award_det.alt_pell_schedule,
3195 x_award_number_txt => l_award_det.award_number_txt,
3196 x_legacy_record_flag => l_award_det.legacy_record_flag,
3197 x_adplans_id => l_awd_tot.adplans_id,
3198 x_lock_award_flag => NVL(l_awd_tot.lock_award_flag,'N'),
3199 x_app_trans_num_txt => l_award_det.app_trans_num_txt,
3200 x_awd_proc_status_code => 'AWARDED',
3201 x_notification_status_code => lv_awd_notif_status,
3202 x_notification_status_date => TRUNC(sysdate),
3203 x_publish_in_ss_flag => g_publish_in_ss_flag
3204 );
3205 --Open the Cursor to fetch Person number for the Base Id l_base_id
3206 OPEN c_person_number;
3207 FETCH c_person_number INTO l_person_number;
3208 CLOSE c_person_number;
3209
3210 -- Log the Award details of the student in the OUTPUT file
3211 get_plan_desc(l_awd_tot.adplans_id,lv_method_name,lv_method_desc);
3212
3213 fnd_file.put_line(fnd_file.output,' ' );
3214 fnd_file.put_line(fnd_file.output,' ' );
3215 fnd_message.set_name('IGF','IGF_AW_AWD_DTLS');
3216 fnd_file.put_line(fnd_file.output,RPAD('-',10,'-') ||' '|| RPAD(fnd_message.get,20) ||' '|| RPAD('-',10,'-'));
3217
3218 fnd_file.put_line(fnd_file.output,RPAD(igf_aw_gen.lookup_desc('IGF_AW_LOOKUPS_MSG', 'PERSON_NUMBER'), 40, ' ') || ' : ' || l_person_number.person_number );
3219 fnd_file.put_line(fnd_file.output,RPAD(igf_aw_gen.lookup_desc('IGF_AW_LOOKUPS_MSG', 'SSN'), 40, ' ') || ' : ' || l_person_number.ssn );
3220 fnd_file.put_line(fnd_file.output,RPAD(igf_aw_gen.lookup_desc('IGF_AW_LOOKUPS_MSG', 'FUND_CODE'), 40, ' ') || ' : ' || l_fmast.fund_code);
3221 fnd_file.put_line(fnd_file.output,RPAD(igf_aw_gen.lookup_desc('IGF_AW_LOOKUPS_MSG', 'OFFERED_AMT'), 40, ' ') || ' : ' || TO_CHAR(l_awd_tot.offered_amt * ln_com_perct/100) );
3222 fnd_file.put_line(fnd_file.output,RPAD(igf_aw_gen.lookup_desc('IGF_GE_PARAMETERS','AWD_DIST_PLAN'), 40, ' ') || ' : ' || lv_method_name);
3223 fnd_file.put_line(fnd_file.output,RPAD(igf_aw_gen.lookup_desc('IGF_GE_PARAMETERS','DIST_PLAN_METHOD'),40,' ') || ' : ' || lv_method_desc);
3224 fnd_file.put_line(fnd_file.output,' ' );
3225
3226 l_fee1 := NULL;
3227 l_fee2 := NULL;
3228
3229 -- FA 122 Loan Enhancents 30-sep-2003 Added the base_id parameter to the get_loan_fee1 , get_loan_fee1 calls
3230
3231 -- Get the Direct and Federal/Common Loan limit Amounts
3232 IF igf_sl_gen.chk_dl_fed_fund_code (l_fmast.fed_fund_code) = 'TRUE'
3233 OR igf_sl_gen.chk_cl_fed_fund_code (l_fmast.fed_fund_code) = 'TRUE' THEN
3234 l_fee1 := igf_sl_award.get_loan_fee1 ( l_fmast.fed_fund_code,
3235 l_fmast.ci_cal_type ,
3236 l_fmast.ci_sequence_number,
3237 l_base_id,
3238 igf_sl_award.get_alt_rel_code(l_fmast.fund_code));
3239 END IF;
3240
3241 -- Get the Guarantor fee % for Commonline Loans
3242 IF igf_sl_gen.chk_cl_fed_fund_code (l_fmast.fed_fund_code) = 'TRUE' THEN
3243 l_fee2 := igf_sl_award.get_loan_fee2( l_fmast.fed_fund_code,
3244 l_fmast.ci_cal_type ,
3245 l_fmast.ci_sequence_number,
3246 l_base_id,
3247 igf_sl_award.get_alt_rel_code(l_fmast.fund_code));
3248 END IF;
3249
3250 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3251 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'called got loan limits');
3252 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_fee1:'||l_fee1);
3253 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_fee2:'||l_fee2);
3254 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'calling get_disbursements');
3255 END IF;
3256
3257 -- Create the Disbursements for this particualr Award
3258 -- This procedure call creates disbursements INTO temporay table
3259 get_disbursements(
3260 l_awd_tot.fund_id,
3261 l_awd_tot.offered_amt,
3262 l_base_id,
3263 l_process_id,
3264 l_awd_tot.accepted_amt,
3265 l_called_from,
3266 l_fmast.nslds_disb_da,
3267 l_fmast.disb_exp_da,
3268 l_fmast.disb_verf_da,
3269 l_disb_dates,
3270 l_awd_tot.adplans_id,
3271 l_award_det.award_id
3272 );
3273 l_disb_num := NULL;
3274 l_cnt := l_disb_dates.COUNT;
3275
3276 -- Get the Total Number of disbursements which needs to be created
3277 ln_db_run_gross_amt := 0;
3278 ln_total_disb := 0;
3279 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3280 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'opening c_awd_disb_cnt with adplans_id:'||l_awd_tot.adplans_id||' award_id:'||l_awd_tot.award_id);
3281 END IF;
3282 OPEN c_awd_disb_cnt( l_base_id, l_awd_tot.fund_id, l_process_id,l_awd_tot.adplans_id,l_awd_tot.award_id);
3283 FETCH c_awd_disb_cnt INTO ln_total_disb;
3284 CLOSE c_awd_disb_cnt;
3285
3286 -- Bug 3062062
3287 IF ln_total_disb = 0 THEN
3288 ROLLBACK TO disb_not_found;
3289 l_ret_status := 'D'; -- No disbursements created
3290 fnd_message.set_name('IGF','IGF_AW_SKP_FUND');
3291 fnd_message.set_token('FUND',l_fmast.fund_code);
3292 fnd_file.put_line(fnd_file.log,fnd_message.get);
3293 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3294 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'raising skip_record as total disbursements is 0');
3295 END IF;
3296 RAISE SKIP_RECORD;
3297 END IF;
3298
3299 -- Round disbursement amount for non-Pell funds.
3300 -- Pell disbursement rounding is handled separately in IGFGR11B
3301 IF get_fed_fund_code(p_fund_id => l_awd_tot.fund_id) <> 'PELL' THEN
3302 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3303 fnd_log.string(fnd_log.level_statement,
3304 'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,
3305 'Calling round_off_disbursements with fund_id:'||l_awd_tot.fund_id||', base_id:'||l_base_id||
3306 ', l_process_id: ' ||l_process_id||', Award_Id: '||l_awd_tot.award_id||', adplans_id: '||l_awd_tot.adplans_id||
3307 ', offered_amt: '||l_awd_tot.offered_amt||', g_method_cd: '||g_method_cd||', ln_total_disb: '||ln_total_disb);
3308 END IF;
3309
3310 round_off_disbursements(
3311 l_awd_tot.fund_id,
3312 l_base_id,
3313 l_process_id,
3314 l_awd_tot.award_id,
3315 l_awd_tot.adplans_id,
3316 l_awd_tot.offered_amt,
3317 g_method_cd,
3318 ln_total_disb
3319 );
3320 END IF;
3321
3322 IF l_fmast.entitlement = 'Y' AND l_hld_flg = 'Y' THEN
3323 /*
3324 Since the fund is an entitlement, we should not insert overaward holds on the award.
3325 we show a message to the user saying that this award will result in an overaward, but we are not
3326 inserting overaward holds as the fund is an entitlement
3327 */
3328 fnd_message.set_name('IGF','IGF_AW_ENTITLE_OVAWD');
3329 fnd_message.set_token('FUND_CODE',l_fmast.fund_code);
3330 fnd_message.set_token('AWD',TO_CHAR(l_awd_tot.offered_amt * ln_com_perct / 100));
3331 fnd_file.put_line(fnd_file.log,fnd_message.get);
3332 END IF;
3333
3334 IF g_sf_packaging = 'F' AND l_hld_flg = 'Y' AND l_fmast.entitlement <> 'Y' THEN
3335 /*
3336 Packaging process always gives upto the need of the student.
3337 So, a hold is not really necessary.
3338 This check is necessary in single-fund-packaging where overaward will occur.
3339 */
3340 l_hld_flg := 'N';
3341 END IF;
3342
3343
3344 --
3345 -- Get the total number of disbursements
3346 --
3347 ln_total_disb_num := ln_total_disb;
3348
3349 -- Get Disbursement records for this award that were calculated above in "get_disbursements" procedure
3350 OPEN c_awd_disb( l_base_id, l_awd_tot.fund_id, l_process_id,l_awd_tot.adplans_id,l_awd_tot.award_id );
3351 LOOP
3352 FETCH c_awd_disb INTO l_awd_disb;
3353
3354 EXIT WHEN c_awd_disb%NOTFOUND;
3355
3356 -- Initialize the Disbursement Number. Increment this counter for each disbursement
3357 -- This Dusbursement Number is unique in each Award.
3358 -- Initialize the Disbursement date with the calculated value
3359 l_disb_num := NVL(l_disb_num,0) + 1;
3360 l_disb_date := fnd_date.chardate_to_date(l_awd_disb.temp_char_val1);
3361
3362 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3363 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'$$$$$$ l_disb_num:'||l_disb_num||' $$$$$$');
3364 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_date: '||l_disb_date);
3365 END IF;
3366 -- Initialize the Disbursement Verification dates, Expiration date, NSLDS dates
3367 -- for each disbursement number
3368 FOR i IN 1..l_disb_dates.COUNT LOOP
3369
3370 IF l_disb_dates(i).process_id = l_awd_disb.process_id
3371 AND l_disb_dates(i).sl_no = l_awd_disb.sl_number THEN
3372 l_nslds_dt := l_disb_dates(i).nslds_disb_date;
3373 l_verf_dt := l_disb_dates(i).disb_verf_dt;
3374 l_exp_dt := l_disb_dates(i).disb_exp_dt;
3375 l_credits := l_disb_dates(i).min_credit_pts;
3376 l_attendance_type_code := l_disb_dates(i).attendance_type_code;
3377 l_base_attendance_type_code := l_disb_dates(i).base_attendance_type_code;
3378
3379 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3380 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'Get data from disb PL-SQL Table, l_disb_dates('||i||').process_id: '||l_disb_dates(i).process_id);
3381 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_dates('||i||').sl_no: '||l_disb_dates(i).sl_no);
3382 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_awd_disb.process_id '||l_awd_disb.process_id );
3383 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_awd_disb.sl_number '||l_awd_disb.sl_number);
3384 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_dates('||i||').nslds_disb_date:'||l_disb_dates(i).nslds_disb_date);
3385 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_dates('||i||').disb_verf_dt:'||l_disb_dates(i).disb_verf_dt);
3386 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_dates('||i||').disb_exp_dt:'||l_disb_dates(i).disb_exp_dt);
3387 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_dates('||i||').min_credit_pts:'||l_disb_dates(i).min_credit_pts);
3388 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_dates('||i||').attendance_type_code:'||l_disb_dates(i).attendance_type_code);
3389 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_dates('||i||').base_attendance_type:'||l_disb_dates(i).base_attendance_type_code);
3390 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_dates - l_attendance_type_code : '||l_attendance_type_code);
3391 END IF;
3392 END IF;
3393 END LOOP;
3394
3395 -- Delay Disb date by the "disb_delay_days" if necessary
3396 -- Check for disbursement delay days linked to NSLDS only for the first disbusement
3397 -- Note- NSLDS is applicable only for DL and CL loans
3398 IF (l_disb_num = 1) AND
3399 ( (igf_sl_gen.chk_dl_fed_fund_code(l_fmast.fed_fund_code) = 'TRUE') OR
3400 (igf_sl_gen.chk_cl_fed_fund_code(l_fmast.fed_fund_code) = 'TRUE')
3401 ) THEN
3402
3403 l_disb_date1 := NULL;
3404 OPEN c_nslds ( l_person_number.person_id );
3405 FETCH c_nslds INTO x_nslds;
3406
3407 IF c_nslds%NOTFOUND THEN
3408 -- No NSLDS History exists for current student, so delay the disbursement to NSLDS Date
3409 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3410 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'no NSLDS history for the student, so apply NSLDS date offset to delay disb date.');
3411 END IF;
3412
3413 IF l_nslds_dt IS NOT NULL THEN
3414 l_disb_date1 := l_nslds_dt; --to be changed by disbursements build
3415
3416 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3417 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'NSLDS disb date offset, l_disb_date1:'||l_disb_date1);
3418 END IF;
3419 ELSE
3420 -- l_nslds_dt is NULL
3421 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3422 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,
3423 'Cannot compute NSLDS offset date. Either NSLDS offset has not been setup in Fund Manager or some error in computing NSLDS offset date. So using the actual disb date.');
3424 END IF;
3425 END IF;
3426 ELSE
3427 -- NSLDS history exists for the student, so do NOT delay disb date
3428 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3429 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'Person# ' ||l_person_number.person_number|| ' has NSLDS history, so NOT applying NSLDS date offset.');
3430 END IF;
3431 END IF;
3432
3433 CLOSE c_nslds;
3434 END IF; -- First Disbursement
3435
3436 -- Get the Origination fee for Direct/Commonline Loans
3437 l_fee_paid1 := NULL;
3438 l_fee_paid2 := NULL;
3439 l_fee_amt1 := NULL;
3440 l_fee_amt2 := NULL;
3441
3442 -- masehgal TRUNC these values also .. then use these for "other than" dl computations
3443 IF igf_sl_gen.chk_cl_fed_fund_code(l_fmast.fed_fund_code) = 'TRUE' THEN
3444 l_fee_amt1 := NVL(l_awd_disb.offered_amt,0) * (NVL(l_fee1,0) / 100) ;
3445 l_fee_amt1 := TRUNC(l_fee_amt1);
3446 ELSE
3447 l_fee_amt1 := 0;
3448 END IF;
3449
3450 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3451 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'after truncating, l_fee_amt1 is '||l_fee_amt1);
3452 END IF;
3453 -- Get the Guarantor fee for Commonline Loans
3454 IF igf_sl_gen.chk_cl_fed_fund_code(l_fmast.fed_fund_code) = 'TRUE' THEN
3455 l_fee_amt2 := NVL(l_awd_disb.offered_amt,0) * (NVL(l_fee2,0) / 100) ;
3456 l_fee_amt2 := TRUNC(l_fee_amt2);
3457 ELSE
3458 l_fee_amt2 := 0;
3459 END IF;
3460
3461 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3462 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'after truncating l_fee_amt2 is '||l_fee_amt2);
3463 END IF;
3464
3465 -- For LOANs, get the Hold Release Indicator which is defined at the fund level
3466 -- FA 122 Loans Enhancemnets added the l_auto_late_ind variable to get the auto_late_ind
3467 IF igf_sl_gen.chk_cl_fed_fund_code(l_fmast.fed_fund_code) = 'TRUE' THEN
3468 l_hold_rel_ind := igf_sl_award.get_cl_hold_rel_ind(
3469 l_fmast.fed_fund_code,
3470 l_fmast.ci_cal_type,
3471 l_fmast.ci_sequence_number,
3472 l_base_id,
3473 igf_sl_award.get_alt_rel_code(l_fmast.fund_code)
3474 );
3475 l_auto_late_ind := igf_sl_award.get_cl_auto_late_ind(
3476 l_fmast.fed_fund_code,
3477 l_fmast.ci_cal_type,
3478 l_fmast.ci_sequence_number,
3479 l_base_id,
3480 igf_sl_award.get_alt_rel_code(l_fmast.fund_code)
3481 );
3482 ELSE
3483 l_hold_rel_ind := NULL;
3484 l_auto_late_ind := NULL;
3485 END IF;
3486
3487 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3488 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_hold_rel_ind:'||l_hold_rel_ind);
3489 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_auto_late_ind:'||l_auto_late_ind);
3490 END IF;
3491 -- For the Last disbursement insert the remaining disbursement amount of the fund
3492 -- Update the Running Totals of Gross Amount and Net Amount
3493 -- This is necessary as to avoid truncation fraction of amounts when there is decimals.
3494 IF l_disb_num = ln_total_disb THEN
3495 ln_db_act_gross_amt := ( l_awd_tot.offered_amt * ln_com_perct / 100 )- ln_db_run_gross_amt;
3496
3497 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3498 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_award_det.award_id: '||l_award_det.award_id);
3499 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_num: '||l_disb_num);
3500 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'ln_db_act_gross_amt: '||ln_db_act_gross_amt);
3501 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'ln_db_run_gross_amt: '||ln_db_run_gross_amt);
3502 END IF;
3503
3504 ELSE
3505 -- Update the running totals
3506 ln_db_act_gross_amt := l_awd_disb.offered_amt;
3507
3508 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3509 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'ln_db_act_gross_amt:'||ln_db_act_gross_amt);
3510 END IF;
3511 END IF;
3512
3513 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3514 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'for last disb insert remaining amount!ln_db_act_gross_amt:'||ln_db_act_gross_amt);
3515 END IF;
3516 -- Incase of Direct Loans round off amounts
3517 IF igf_sl_gen.chk_dl_fed_fund_code(l_fmast.fed_fund_code) = 'TRUE' THEN
3518 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3519 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'igf_sl_gen.chk_dl_fed_fund_code('||l_fmast.fed_fund_code||')=TRUE');
3520 END IF;
3521 -- sjadhav Bug 2411031
3522 -- Changed sequence of calling igf_sl_award.get_loan_amts and igf_sl_roundoff_digits_pkg.gross_fees_roundoff.
3523 -- This is done becuase first round off disbursement gross amount should be calculated first and then net amount / fee amount etc
3524
3525 -- we are passing dummys here for Net and Fee amount as they will be calculated later on
3526
3527 igf_sl_roundoff_digits_pkg.gross_fees_roundoff(p_last_disb_num => ln_total_disb_num,
3528 p_offered_amt => l_awd_tot.offered_amt,
3529 p_fee_perct => l_fee1,
3530 p_disb_gross_amt => ln_db_act_gross_amt,
3531 p_disb_net_amt => ln_dummy_net_amt,
3532 p_fee => ln_dummy_fee_1
3533 );
3534
3535 -- This routine will return Net Amount/ Fee Amounts / Interest Rebate Amount
3536 igf_sl_award.get_loan_amts(
3537 l_fmast.ci_cal_type,
3538 l_fmast.ci_sequence_number,
3539 l_fmast.fed_fund_code,
3540 NVL(ln_db_act_gross_amt,0),
3541 l_rebate,
3542 l_fee_amt1,
3543 l_net
3544 );
3545
3546 l_awd_disb.temp_num_val1 := NVL(l_net,0);
3547
3548 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3549 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'after calling igf_sl_award.get_loan_amts,l_awd_disb.temp_num_val1:'||l_awd_disb.temp_num_val1);
3550 END IF;
3551
3552 -- masehgal rounding off for CL
3553 ELSIF igf_sl_gen.chk_cl_fed_fund_code(l_fmast.fed_fund_code) = 'TRUE' THEN
3554 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3555 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'igf_sl_gen.chk_cl_fed_fund_code('||l_fmast.fed_fund_code||')=TRUE');
3556 END IF;
3557 -- we are passing dummys here for Net and Fee amount as they will be calculated later on
3558 igf_sl_roundoff_digits_pkg.cl_gross_fees_roundoff(
3559 p_last_disb_num => ln_total_disb_num,
3560 p_offered_amt => l_awd_tot.offered_amt,
3561 p_disb_gross_amt => ln_db_act_gross_amt );
3562
3563 l_awd_disb.temp_num_val1 := NVL(ln_db_act_gross_amt, 0) -
3564 NVL( l_fee_amt1, 0 ) -
3565 NVL( l_fee_amt2, 0 );
3566
3567 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3568 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'after calling igf_sl_roundoff_digits_pkg.cl_gross_fees_roundoff,l_awd_disb.temp_num_val1:'||l_awd_disb.temp_num_val1);
3569 END IF;
3570
3571 l_rebate := NULL;
3572
3573 ELSE
3574 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3575 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'igf_sl_gen.chk_dl_fed_fund_code('||l_fmast.fed_fund_code||')=FALSE');
3576 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'igf_sl_gen.chk_cl_fed_fund_code('||l_fmast.fed_fund_code||')=FALSE');
3577 END IF;
3578 -- For funds other than the loans, calculate the Total Net amount
3579 l_awd_disb.temp_num_val1 := NVL(ln_db_act_gross_amt, 0);
3580 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3581 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_awd_disb.temp_num_val1 = NVL(ln_db_act_gross_amt, 0) = '||l_awd_disb.temp_num_val1);
3582 END IF;
3583
3584 l_rebate := NULL;
3585 l_fee_amt1 := NULL;
3586 l_fee_amt2 := NULL;
3587 END IF;
3588
3589 ln_db_run_gross_amt := ln_db_run_gross_amt + ln_db_act_gross_amt;
3590 IF l_award_status = 'ACCEPTED' THEN
3591 ln_db_act_accpt_amt := ln_db_act_gross_amt;
3592 ELSE
3593 ln_db_act_accpt_amt := 0;
3594 END IF;
3595 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3596 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'after checking awd_initial_status, ln_db_act_accpt_amt:'||ln_db_act_accpt_amt);
3597 END IF;
3598
3599 -- Setting lb_disb_update to update disbursement date accordingly
3600 IF l_disb_date1 IS NOT NULL AND l_disb_num = 1 THEN
3601 -- No NSLDS history. Apply NSLDS date offset to delay disbursement date
3602 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3603 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'Setting lb_disb_update to TRUE');
3604 END IF;
3605
3606 lb_disb_update := TRUE;
3607 ELSIF l_disb_num = 1 THEN
3608 -- NSLDS history exists (or) NSLDS history does not exist, but the NSLDS date offset is not set (i.e. l_disb_date1 is null) (or) it is a non DL/CL fund
3609 -- In both cases, we must NOT delay disbursement date
3610 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3611 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'Setting lb_disb_update to FALSE');
3612 END IF;
3613
3614 lb_disb_update := FALSE;
3615 END IF;
3616
3617 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3618 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'Before inserting into igf_aw_awd_disb table with l_attendance_type_code : '||l_attendance_type_code);
3619 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'inserting into igf_aw_awd_disb table with manual_hold_ind:'||l_hld_flg);
3620 END IF;
3621
3622 lv_rowid := NULL;
3623 IF l_fmast.fed_fund_code IN ('FWS') THEN
3624 l_attendance_type_code := NULL;
3625 l_base_attendance_type_code := NULL;
3626 END IF;
3627
3628 IF l_fmast.entitlement = 'Y' THEN
3629 --make l_hld_flg to 'N'
3630 --this is necessary as there has to be no holds on an entitlement
3631 l_hld_flg := 'N';
3632 END IF;
3633
3634 OPEN c_disb(l_award_det.award_id,l_disb_num);
3635 FETCH c_disb INTO l_disb;
3636 IF c_disb%FOUND THEN
3637 --disbursement exists
3638 --so update
3639 CLOSE c_disb;
3640 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3641 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'calling igf_aw_awd_disb_pkg.update_row');
3642 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb.award_id:'||l_disb.award_id);
3643 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb.disb_num:'||l_disb.disb_num);
3644 END IF;
3645
3646 IF l_disb.trans_type = 'C' THEN
3647 l_disb.trans_type := 'P';
3648 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3649 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'...changing trans_type of disb:'||l_disb.disb_num||'to P...');
3650 END IF;
3651 END IF;
3652
3653 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3654 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb.trans_type:'||l_disb.trans_type);
3655 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb.tp_cal_type:'||l_disb.tp_cal_type);
3656 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb.tp_sequence_number:'||l_disb.tp_sequence_number);
3657 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_base_attendance_type_code:'||l_base_attendance_type_code);
3658 END IF;
3659
3660 IF (l_fmast.fed_fund_code = 'PELL' AND
3661 igf_sl_dl_validation.check_full_participant (l_fmast.ci_cal_type,l_fmast.ci_sequence_number,'PELL'))
3662 OR (l_fmast.fed_fund_code IN ('DLP','DLS','DLU') AND
3663 igf_sl_dl_validation.check_full_participant (l_fmast.ci_cal_type,l_fmast.ci_sequence_number,'DL'))
3664 THEN
3665 l_hold_rel_ind := NVL(l_disb.hold_rel_ind,'FALSE');
3666 END IF;
3667
3668 igf_aw_awd_disb_pkg.update_row(
3669 x_mode => 'R',
3670 x_rowid => l_disb.row_id,
3671 x_award_id => l_disb.award_id,
3672 x_disb_num => l_disb.disb_num,
3673 x_tp_cal_type => l_awd_disb.tp_cal_type,
3674 x_tp_sequence_number => l_awd_disb.tp_sequence_number,
3675 x_disb_gross_amt => ln_db_act_gross_amt ,
3676 x_fee_1 => NVL(l_fee_amt1, 0),
3677 x_fee_2 => NVL(l_fee_amt2, 0),
3678 x_disb_net_amt => NVL(l_awd_disb.temp_num_val1,0),
3679 x_disb_date => l_disb_date,
3680 x_trans_type => l_disb.trans_type,
3681 x_elig_status => l_disb.elig_status,
3682 x_elig_status_date => l_disb.elig_status_date,
3683 x_affirm_flag => l_disb.affirm_flag,
3684 x_hold_rel_ind => l_hold_rel_ind,
3685 x_manual_hold_ind => l_hld_flg,
3686 x_disb_status => l_disb.disb_status,
3687 x_disb_status_date => l_disb.disb_status_date,
3688 x_late_disb_ind => l_auto_late_ind,
3689 x_fund_dist_mthd => l_disb.fund_dist_mthd,
3690 x_prev_reported_ind => l_disb.prev_reported_ind ,
3691 x_fund_release_date => l_disb.fund_release_date,
3692 x_fund_status => l_disb.fund_status,
3693 x_fund_status_date => l_disb.fund_status_date,
3694 x_fee_paid_1 => NVL(l_fee_paid1, 0),
3695 x_fee_paid_2 => NVL(l_fee_paid2, 0),
3696 x_cheque_number => l_disb.cheque_number,
3697 x_ld_cal_type => l_awd_disb.ld_cal_type,
3698 x_ld_sequence_number => l_awd_disb.ld_sequence_number,
3699 x_disb_accepted_amt => ln_db_act_accpt_amt,
3700 x_disb_paid_amt => l_disb.disb_paid_amt,
3701 x_rvsn_id => l_disb.rvsn_id,
3702 x_int_rebate_amt => NVL(l_rebate, 0),
3703 x_force_disb => l_disb.force_disb,
3704 x_min_credit_pts => l_credits,
3705 x_disb_exp_dt => l_exp_dt,
3706 x_verf_enfr_dt => l_verf_dt,
3707 x_fee_class => l_disb.fee_class,
3708 x_show_on_bill => l_fmast.show_on_bill,
3709 x_attendance_type_code => l_disb.attendance_type_code,
3710 x_base_attendance_type_code => l_base_attendance_type_code,
3711 x_payment_prd_st_date => l_disb.payment_prd_st_date,
3712 x_change_type_code => l_disb.change_type_code,
3713 x_fund_return_mthd_code => l_disb.fund_return_mthd_code,
3714 x_direct_to_borr_flag => l_disb.direct_to_borr_flag
3715 );
3716 IF g_phasein_participant AND l_fmast.fed_fund_code = 'PELL' THEN
3717 /*
3718 Update the Pell Disbursement Origination Record, if it exists
3719 */
3720 OPEN c_pell_disb_orig(l_disb.award_id,l_disb.disb_num);
3721 FETCH c_pell_disb_orig INTO l_pell_disb_orig;
3722 IF c_pell_disb_orig%NOTFOUND THEN
3723 -- do nothing
3724 CLOSE c_pell_disb_orig;
3725 ELSE
3726 -- update the record
3727 CLOSE c_pell_disb_orig;
3728 l_pell_disb_orig.disb_dt := l_disb_date;
3729 l_pell_disb_orig.disb_amt := ln_db_act_gross_amt;
3730 IF l_pell_disb_orig.disb_amt >= 0 THEN
3731 l_pell_disb_orig.db_cr_flag := 'P' ;
3732 ELSE
3733 l_pell_disb_orig.db_cr_flag := 'N' ;
3734 END IF;
3735 l_pell_disb_orig.disb_ack_act_status := 'R' ;
3736 l_pell_disb_orig.disb_status_dt := TRUNC(SYSDATE);
3737 l_pell_disb_orig.disb_accpt_amt := NULL ;
3738 l_pell_disb_orig.accpt_db_cr_flag := NULL ;
3739 l_pell_disb_orig.disb_ytd_amt := NULL ;
3740 l_pell_disb_orig.pymt_prd_start_dt := NULL ;
3741 l_pell_disb_orig.accpt_pymt_prd_start_dt := NULL ;
3742 l_pell_disb_orig.edit_code := NULL ;
3743 l_pell_disb_orig.rfmb_id := NULL ;
3744
3745 igf_gr_rfms_disb_pkg.update_row(
3746 x_rowid => l_pell_disb_orig.row_id,
3747 x_rfmd_id => l_pell_disb_orig.rfmd_id,
3748 x_origination_id => l_pell_disb_orig.origination_id,
3749 x_disb_ref_num => l_pell_disb_orig.disb_ref_num,
3750 x_disb_dt => l_pell_disb_orig.disb_dt,
3751 x_disb_amt => l_pell_disb_orig.disb_amt,
3752 x_db_cr_flag => l_pell_disb_orig.db_cr_flag,
3753 x_disb_ack_act_status => l_pell_disb_orig.disb_ack_act_status,
3754 x_disb_status_dt => l_pell_disb_orig.disb_status_dt,
3755 x_accpt_disb_dt => l_pell_disb_orig.accpt_disb_dt,
3756 x_disb_accpt_amt => l_pell_disb_orig.disb_accpt_amt,
3757 x_accpt_db_cr_flag => l_pell_disb_orig.accpt_db_cr_flag,
3758 x_disb_ytd_amt => l_pell_disb_orig.disb_ytd_amt,
3759 x_pymt_prd_start_dt => l_pell_disb_orig.pymt_prd_start_dt,
3760 x_accpt_pymt_prd_start_dt => l_pell_disb_orig.accpt_pymt_prd_start_dt,
3761 x_edit_code => l_pell_disb_orig.edit_code,
3762 x_rfmb_id => l_pell_disb_orig.rfmb_id,
3763 x_mode => 'R',
3764 x_ed_use_flags => l_pell_disb_orig.ed_use_flags
3765 );
3766 END IF;
3767 END IF;
3768 ELSE
3769 --disbursement non-existent
3770 --so insert
3771 CLOSE c_disb;
3772 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3773 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'calling igf_aw_awd_disb_pkg.insert_row');
3774 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb.award_id:'||l_award_det.award_id);
3775 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_disb_num:'||l_disb_num);
3776 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'l_base_attendance_type_code:'||l_base_attendance_type_code);
3777 END IF;
3778 IF (l_fmast.fed_fund_code = 'PELL' AND
3779 igf_sl_dl_validation.check_full_participant (l_fmast.ci_cal_type,l_fmast.ci_sequence_number,'PELL'))
3780 OR (l_fmast.fed_fund_code IN ('DLP','DLS','DLU') AND
3781 igf_sl_dl_validation.check_full_participant (l_fmast.ci_cal_type,l_fmast.ci_sequence_number,'DL'))
3782 THEN
3783 l_hold_rel_ind := 'FALSE';
3784 END IF;
3785 igf_aw_awd_disb_pkg.insert_row(
3786 x_rowid => lv_rowid,
3787 x_award_id => l_award_det.award_id,
3788 x_disb_num => l_disb_num,
3789 x_tp_cal_type => l_awd_disb.tp_cal_type,
3790 x_tp_sequence_number => l_awd_disb.tp_sequence_number,
3791 x_disb_gross_amt => ln_db_act_gross_amt ,
3792 x_fee_1 => NVL(l_fee_amt1, 0),
3793 x_fee_2 => NVL(l_fee_amt2, 0),
3794 x_disb_net_amt => NVL(l_awd_disb.temp_num_val1,0),
3795 x_disb_date => l_disb_date,
3796 x_trans_type => 'P',
3797 x_elig_status => 'N',
3798 x_elig_status_date => TRUNC(SYSDATE),
3799 x_affirm_flag => 'N',
3800 x_hold_rel_ind => l_hold_rel_ind,
3801 x_manual_hold_ind => l_hld_flg,
3802 x_disb_status => NULL,
3803 x_disb_status_date => NULL,
3804 x_late_disb_ind => l_auto_late_ind, -- FA 122 Added l_auto_late_ind
3805 x_fund_dist_mthd => 'E',
3806 x_prev_reported_ind => 'N',
3807 x_fund_release_date => NULL,
3808 x_fund_status => NULL,
3809 x_fund_status_date => NULL,
3810 x_fee_paid_1 => NVL(l_fee_paid1, 0),
3811 x_fee_paid_2 => NVL(l_fee_paid2, 0),
3812 x_cheque_number => NULL,
3813 x_ld_cal_type => l_awd_disb.ld_cal_type,
3814 x_ld_sequence_number => l_awd_disb.ld_sequence_number,
3815 x_disb_accepted_amt => ln_db_act_accpt_amt,
3816 x_disb_paid_amt => l_awd_disb.paid_amt,
3817 x_rvsn_id => NULL,
3818 x_int_rebate_amt => NVL(l_rebate, 0),
3819 x_force_disb => NULL,
3820 x_min_credit_pts => l_credits,
3821 x_disb_exp_dt => l_exp_dt,
3822 x_verf_enfr_dt => l_verf_dt,
3823 x_fee_class => NULL,
3824 x_show_on_bill => l_fmast.show_on_bill,
3825 x_attendance_type_code => l_attendance_type_code,
3826 x_mode => 'R',
3827 x_base_attendance_type_code => l_base_attendance_type_code,
3828 x_payment_prd_st_date => NULL,
3829 x_change_type_code => NULL,
3830 x_fund_return_mthd_code => NULL,
3831 x_direct_to_borr_flag => 'N'
3832 );
3833 IF g_phasein_participant AND l_fmast.fed_fund_code = 'PELL' THEN
3834 l_orig_id := NULL;
3835
3836 OPEN c_orig_id(l_award_det.award_id);
3837 FETCH c_orig_id INTO l_orig_id;
3838 CLOSE c_orig_id;
3839
3840 IF l_orig_id IS NOT NULL THEN
3841 /* this PELL award has been already originated.
3842 so insert a disbursement origination record for this new disbursement
3843 we do this only for phase-in participant years - for full participant years,
3844 there will no IGF_GR_RFMS_DISB record. While sending the origination, the data
3845 is directly picked from the IGF_AW_AWD_DISB_ALL table.
3846 */
3847 lv_row_id := NULL;
3848 lv_rfmd_id := NULL;
3849
3850 igf_gr_rfms_disb_pkg.insert_row(
3851 x_mode => 'R',
3852 x_rowid => lv_row_id,
3853 x_rfmd_id => lv_rfmd_id,
3854 x_origination_id => l_orig_id,
3855 x_disb_ref_num => l_disb_num,
3856 x_disb_dt => l_disb_date,
3857 x_disb_amt => ln_db_act_gross_amt,
3858 x_db_cr_flag => 'P',
3859 x_disb_ack_act_status => 'R',
3860 x_disb_status_dt => TRUNC(SYSDATE) ,
3861 x_accpt_disb_dt => NULL,
3862 x_disb_accpt_amt => NULL,
3863 x_accpt_db_cr_flag => NULL,
3864 x_disb_ytd_amt => NULL,
3865 x_pymt_prd_start_dt => NULL,
3866 x_accpt_pymt_prd_start_dt => NULL,
3867 x_edit_code => NULL,
3868 x_rfmb_id => NULL,
3869 x_ed_use_flags => NULL
3870 );
3871 END IF;
3872 END IF;
3873 END IF;
3874
3875 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3876 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'after inserting into disb table....l_hld_flg: '||l_hld_flg);
3877 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'after inserting into disb table....l_attendance_type_code: '||l_attendance_type_code);
3878 END IF;
3879 -- If Over Award Hold is present at the award, then create 'SYSTEM' Hold for each disbursement of the Award
3880 IF l_hld_flg = 'Y' THEN
3881
3882 l_hold_id := NULL;
3883 lv_rowid := NULL;
3884
3885
3886 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3887 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'inserting into igf_db_disb_holds table');
3888 END IF;
3889 igf_db_disb_holds_pkg.insert_row(
3890 x_rowid => lv_rowid,
3891 x_hold_id => l_hold_id,
3892 x_award_id => l_award_det.award_id,
3893 x_disb_num => l_disb_num,
3894 x_hold => 'OVERAWARD',
3895 x_hold_date => TRUNC(SYSDATE),
3896 x_hold_type => 'SYSTEM',
3897 x_release_date => NULL,
3898 x_release_flag => 'N',
3899 x_release_reason => NULL,
3900 x_mode => 'R'
3901 );
3902 END IF;
3903 END LOOP;--end loop for c_awd_disb
3904 IF c_awd_disb%ISOPEN THEN
3905 CLOSE c_awd_disb;
3906 END IF;
3907 --after this,if more disbursements exist, delete those
3908 FOR disb_cancel_rec IN c_disb_cancel(l_award_det.award_id,l_disb_num) LOOP
3909
3910 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3911 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'cancelling awd_disb for award_id:'||l_award_det.award_id||' disb_num:'||disb_cancel_rec.disb_num);
3912 END IF;
3913
3914 -- cancel the disbursement
3915 igf_aw_awd_disb_pkg.update_row(
3916 x_rowid => disb_cancel_rec.row_id,
3917 x_award_id => disb_cancel_rec.award_id,
3918 x_disb_num => disb_cancel_rec.disb_num,
3919 x_tp_cal_type => disb_cancel_rec.tp_cal_type,
3920 x_tp_sequence_number => disb_cancel_rec.tp_sequence_number,
3921 x_disb_gross_amt => 0,
3922 x_fee_1 => 0,
3923 x_fee_2 => 0,
3924 x_disb_net_amt => 0,
3925 x_disb_date => disb_cancel_rec.disb_date,
3926 x_trans_type => 'C',
3927 x_elig_status => disb_cancel_rec.elig_status,
3928 x_elig_status_date => disb_cancel_rec.elig_status_date,
3929 x_affirm_flag => disb_cancel_rec.affirm_flag,
3930 x_hold_rel_ind => disb_cancel_rec.hold_rel_ind,
3931 x_manual_hold_ind => disb_cancel_rec.manual_hold_ind,
3932 x_disb_status => disb_cancel_rec.disb_status,
3933 x_disb_status_date => disb_cancel_rec.disb_status_date,
3934 x_late_disb_ind => disb_cancel_rec.late_disb_ind,
3935 x_fund_dist_mthd => disb_cancel_rec.fund_dist_mthd,
3936 x_prev_reported_ind => disb_cancel_rec.prev_reported_ind,
3937 x_fund_release_date => disb_cancel_rec.fund_release_date,
3938 x_fund_status => disb_cancel_rec.fund_status,
3939 x_fund_status_date => disb_cancel_rec.fund_status_date,
3940 x_fee_paid_1 => disb_cancel_rec.fee_paid_1,
3941 x_fee_paid_2 => disb_cancel_rec.fee_paid_2,
3942 x_cheque_number => disb_cancel_rec.cheque_number,
3943 x_ld_cal_type => disb_cancel_rec.ld_cal_type,
3944 x_ld_sequence_number => disb_cancel_rec.ld_sequence_number,
3945 x_disb_accepted_amt => 0,
3946 x_disb_paid_amt => disb_cancel_rec.disb_paid_amt,
3947 x_rvsn_id => disb_cancel_rec.rvsn_id,
3948 x_int_rebate_amt => 0,
3949 x_force_disb => disb_cancel_rec.force_disb,
3950 x_min_credit_pts => disb_cancel_rec.min_credit_pts,
3951 x_disb_exp_dt => disb_cancel_rec.disb_exp_dt,
3952 x_verf_enfr_dt => disb_cancel_rec.verf_enfr_dt,
3953 x_fee_class => disb_cancel_rec.fee_class,
3954 x_show_on_bill => disb_cancel_rec.show_on_bill,
3955 x_mode => 'R',
3956 x_attendance_type_code => disb_cancel_rec.attendance_type_code,
3957 x_base_attendance_type_code => disb_cancel_rec.base_attendance_type_code,
3958 x_payment_prd_st_date => disb_cancel_rec.payment_prd_st_date,
3959 x_change_type_code => disb_cancel_rec.change_type_code,
3960 x_fund_return_mthd_code => disb_cancel_rec.fund_return_mthd_code,
3961 x_direct_to_borr_flag => disb_cancel_rec.direct_to_borr_flag
3962 );
3963 END LOOP;
3964
3965 IF lb_disb_update THEN
3966
3967 OPEN c_disb(l_award_det.award_id,1);
3968 FETCH c_disb INTO l_disb;
3969 CLOSE c_disb;
3970
3971 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3972 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_gen_003.create_auto_disb.debug','Flag set - updating disb num 1 with disb date delayed by NSLDS offset: ' ||l_disb_date1);
3973 END IF;
3974
3975 igf_aw_awd_disb_pkg.update_row(
3976 x_mode => 'R',
3977 x_rowid => l_disb.row_id,
3978 x_award_id => l_disb.award_id,
3979 x_disb_num => l_disb.disb_num,
3980 x_tp_cal_type => l_disb.tp_cal_type,
3981 x_tp_sequence_number => l_disb.tp_sequence_number,
3982 x_disb_gross_amt => l_disb.disb_gross_amt,
3983 x_fee_1 => l_disb.fee_1,
3984 x_fee_2 => l_disb.fee_2,
3985 x_disb_net_amt => l_disb.disb_net_amt,
3986 x_disb_date => l_disb_date1,
3987 x_trans_type => l_disb.trans_type,
3988 x_elig_status => l_disb.elig_status,
3989 x_elig_status_date => l_disb.elig_status_date,
3990 x_affirm_flag => l_disb.affirm_flag,
3991 x_hold_rel_ind => l_disb.hold_rel_ind,
3992 x_manual_hold_ind => l_disb.manual_hold_ind,
3993 x_disb_status => l_disb.disb_status,
3994 x_disb_status_date => l_disb.disb_status_date,
3995 x_late_disb_ind => l_disb.late_disb_ind,
3996 x_fund_dist_mthd => l_disb.fund_dist_mthd,
3997 x_prev_reported_ind => l_disb.prev_reported_ind ,
3998 x_fund_release_date => l_disb.fund_release_date,
3999 x_fund_status => l_disb.fund_status,
4000 x_fund_status_date => l_disb.fund_status_date,
4001 x_fee_paid_1 => l_disb.fee_paid_1,
4002 x_fee_paid_2 => l_disb.fee_paid_2,
4003 x_cheque_number => l_disb.cheque_number,
4004 x_ld_cal_type => l_disb.ld_cal_type,
4005 x_ld_sequence_number => l_disb.ld_sequence_number,
4006 x_disb_accepted_amt => l_disb.disb_accepted_amt,
4007 x_disb_paid_amt => l_disb.disb_paid_amt,
4008 x_rvsn_id => l_disb.rvsn_id,
4009 x_int_rebate_amt => l_disb.int_rebate_amt,
4010 x_force_disb => l_disb.force_disb,
4011 x_min_credit_pts => l_disb.min_credit_pts,
4012 x_disb_exp_dt => l_disb.disb_exp_dt,
4013 x_verf_enfr_dt => l_disb.verf_enfr_dt,
4014 x_fee_class => l_disb.fee_class,
4015 x_show_on_bill => l_disb.show_on_bill,
4016 x_attendance_type_code => l_disb.attendance_type_code,
4017 x_base_attendance_type_code => l_disb.base_attendance_type_code,
4018 x_payment_prd_st_date => l_disb.payment_prd_st_date,
4019 x_change_type_code => l_disb.change_type_code,
4020 x_fund_return_mthd_code => l_disb.fund_return_mthd_code,
4021 x_direct_to_borr_flag => l_disb.direct_to_borr_flag
4022 );
4023 END IF;
4024
4025 END IF;
4026
4027 EXCEPTION
4028 WHEN SKIP_RECORD THEN
4029 NULL;
4030
4031 END;
4032 END LOOP;
4033
4034
4035 CLOSE c_awd_tot; -- Completed Creation of Awards and Disbursements with the content from the Temporary Table
4036
4037 --check if there were any cancelled awards.
4038 --post those awards too
4039 cancel_awards(l_process_id,l_base_id);
4040
4041 -- If Awards are Created then Update the Packaging Status and also the Award Amounts at the student level
4042 IF lb_awards_created = TRUE THEN
4043
4044 -- Update Student FA Base record with the Total Offered Amount, Accepted Amount and the Packaging status
4045 -- Update Notification status if the process is run in Single Fund or Autio Packaged.
4046 IF g_sf_packaging = 'T' THEN
4047 igf_aw_gen.update_fabase_awds( l_base_id, 'SINGLE' );
4048 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4049 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'called igf_aw_gen.update_fabase_awds with SINGLE');
4050 END IF;
4051 lv_update_notif_stat := 'T';
4052 ELSIF ( l_post = 'Y' ) THEN
4053 igf_aw_gen.update_fabase_awds( l_base_id, 'SIMULATED' );
4054 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4055 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'called igf_aw_gen.update_fabase_awds with SIMULATED');
4056 END IF;
4057 lv_update_notif_stat := 'F';
4058 ELSE
4059 igf_aw_gen.update_fabase_awds( l_base_id, 'AUTO_PACKAGED' );
4060 lv_update_notif_stat := 'T';
4061 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4062 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'called igf_aw_gen.update_fabase_awds with AUTO_PACKAGED');
4063 END IF;
4064 END IF; -- Notification End
4065
4066 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4067 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'after update_fabase_awds , lv_update_notif_stat:'||lv_update_notif_stat);
4068 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'after update_fabase_awds , l_upd_awd_notif_status:'||l_upd_awd_notif_status);
4069 END IF;
4070 --Added as part of FACR008-Correspondence Build,pmarada
4071 --updateing the fa base record with the notification status
4072 IF l_upd_awd_notif_status = 'Y' AND lv_update_notif_stat = 'T' THEN
4073 OPEN c_fabase(l_base_id );
4074 FETCH c_fabase INTO l_fabase;
4075 IF c_fabase%FOUND THEN
4076 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4077 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'updating fa base table');
4078 END IF;
4079 igf_ap_fa_base_rec_pkg.update_row(
4080 x_rowid => l_fabase.row_id,
4081 x_base_id => l_fabase.base_id,
4082 x_ci_cal_type => l_fabase.ci_cal_type,
4083 x_person_id => l_fabase.person_id,
4084 x_ci_sequence_number => l_fabase.ci_sequence_number,
4085 x_org_id => l_fabase.org_id,
4086 x_coa_pending => l_fabase.coa_pending,
4087 x_verification_process_run => l_fabase.verification_process_run,
4088 x_inst_verif_status_date => l_fabase.inst_verif_status_date,
4089 x_manual_verif_flag => l_fabase.manual_verif_flag,
4090 x_fed_verif_status => l_fabase.fed_verif_status,
4091 x_fed_verif_status_date => l_fabase.fed_verif_status_date,
4092 x_inst_verif_status => l_fabase.inst_verif_status,
4093 x_nslds_eligible => l_fabase.nslds_eligible,
4094 x_ede_correction_batch_id => l_fabase.ede_correction_batch_id,
4095 x_fa_process_status_date => l_fabase.fa_process_status_date,
4096 x_isir_corr_status => l_fabase.isir_corr_status,
4097 x_isir_corr_status_date => l_fabase.isir_corr_status_date,
4098 x_isir_status => l_fabase.isir_status,
4099 x_isir_status_date => l_fabase.isir_status_date,
4100 x_coa_code_f => l_fabase.coa_code_f,
4101 x_coa_code_i => l_fabase.coa_code_i,
4102 x_coa_f => l_fabase.coa_f,
4103 x_coa_i => l_fabase.coa_i,
4104 x_disbursement_hold => l_fabase.disbursement_hold,
4105 x_fa_process_status => l_fabase.fa_process_status,
4106 x_packaging_status => l_fabase.packaging_status,
4107 x_packaging_status_date => l_fabase.packaging_status_date,
4108 x_total_package_accepted => l_fabase.total_package_accepted,
4109 x_total_package_offered => l_fabase.total_package_offered,
4110 x_admstruct_id => l_fabase.admstruct_id,
4111 x_admsegment_1 => l_fabase.admsegment_1,
4112 x_admsegment_2 => l_fabase.admsegment_2,
4113 x_admsegment_3 => l_fabase.admsegment_3,
4114 x_admsegment_4 => l_fabase.admsegment_4,
4115 x_admsegment_5 => l_fabase.admsegment_5,
4116 x_admsegment_6 => l_fabase.admsegment_6,
4117 x_admsegment_7 => l_fabase.admsegment_7,
4118 x_admsegment_8 => l_fabase.admsegment_8,
4119 x_admsegment_9 => l_fabase.admsegment_9,
4120 x_admsegment_10 => l_fabase.admsegment_10,
4121 x_admsegment_11 => l_fabase.admsegment_11,
4122 x_admsegment_12 => l_fabase.admsegment_12,
4123 x_admsegment_13 => l_fabase.admsegment_13,
4124 x_admsegment_14 => l_fabase.admsegment_14,
4125 x_admsegment_15 => l_fabase.admsegment_15,
4126 x_admsegment_16 => l_fabase.admsegment_16,
4127 x_admsegment_17 => l_fabase.admsegment_17,
4128 x_admsegment_18 => l_fabase.admsegment_18,
4129 x_admsegment_19 => l_fabase.admsegment_19,
4130 x_admsegment_20 => l_fabase.admsegment_20,
4131 x_packstruct_id => l_fabase.packstruct_id,
4132 x_packsegment_1 => l_fabase.packsegment_1,
4133 x_packsegment_2 => l_fabase.packsegment_2,
4134 x_packsegment_3 => l_fabase.packsegment_3,
4135 x_packsegment_4 => l_fabase.packsegment_4,
4136 x_packsegment_5 => l_fabase.packsegment_5,
4137 x_packsegment_6 => l_fabase.packsegment_6,
4138 x_packsegment_7 => l_fabase.packsegment_7,
4139 x_packsegment_8 => l_fabase.packsegment_8,
4140 x_packsegment_9 => l_fabase.packsegment_9,
4141 x_packsegment_10 => l_fabase.packsegment_10,
4142 x_packsegment_11 => l_fabase.packsegment_11,
4143 x_packsegment_12 => l_fabase.packsegment_12,
4144 x_packsegment_13 => l_fabase.packsegment_13,
4145 x_packsegment_14 => l_fabase.packsegment_14,
4146 x_packsegment_15 => l_fabase.packsegment_15,
4147 x_packsegment_16 => l_fabase.packsegment_16,
4148 x_packsegment_17 => l_fabase.packsegment_17,
4149 x_packsegment_18 => l_fabase.packsegment_18,
4150 x_packsegment_19 => l_fabase.packsegment_19,
4151 x_packsegment_20 => l_fabase.packsegment_20,
4152 x_miscstruct_id => l_fabase.miscstruct_id,
4153 x_miscsegment_1 => l_fabase.miscsegment_1,
4154 x_miscsegment_2 => l_fabase.miscsegment_2,
4155 x_miscsegment_3 => l_fabase.miscsegment_3,
4156 x_miscsegment_4 => l_fabase.miscsegment_4,
4157 x_miscsegment_5 => l_fabase.miscsegment_5,
4158 x_miscsegment_6 => l_fabase.miscsegment_6,
4159 x_miscsegment_7 => l_fabase.miscsegment_7,
4160 x_miscsegment_8 => l_fabase.miscsegment_8,
4161 x_miscsegment_9 => l_fabase.miscsegment_9,
4162 x_miscsegment_10 => l_fabase.miscsegment_10,
4163 x_miscsegment_11 => l_fabase.miscsegment_11,
4164 x_miscsegment_12 => l_fabase.miscsegment_12,
4165 x_miscsegment_13 => l_fabase.miscsegment_13,
4166 x_miscsegment_14 => l_fabase.miscsegment_14,
4167 x_miscsegment_15 => l_fabase.miscsegment_15,
4168 x_miscsegment_16 => l_fabase.miscsegment_16,
4169 x_miscsegment_17 => l_fabase.miscsegment_17,
4170 x_miscsegment_18 => l_fabase.miscsegment_18,
4171 x_miscsegment_19 => l_fabase.miscsegment_19,
4172 x_miscsegment_20 => l_fabase.miscsegment_20,
4173 x_prof_judgement_flg => l_fabase.prof_judgement_flg,
4174 x_nslds_data_override_flg => l_fabase.nslds_data_override_flg,
4175 x_target_group => l_fabase.target_group,
4176 x_coa_fixed => l_fabase.coa_fixed,
4177 x_coa_pell => l_fabase.coa_pell,
4178 x_mode => 'R',
4179 x_profile_status => l_fabase.profile_status,
4180 x_profile_status_date => l_fabase.profile_status_date,
4181 x_profile_fc => l_fabase.profile_fc,
4182 x_tolerance_amount => l_fabase.tolerance_amount,
4183 x_manual_disb_hold => l_fabase.manual_disb_hold,
4184 x_pell_alt_expense => l_fabase.pell_alt_expense,
4185 x_assoc_org_num => l_fabase.assoc_org_num,
4186 x_award_fmly_contribution_type => l_fabase.award_fmly_contribution_type,
4187 x_isir_locked_by => l_fabase.isir_locked_by,
4188 x_lock_awd_flag => l_fabase.lock_awd_flag,
4189 x_lock_coa_flag => l_fabase.lock_coa_flag,
4190 x_adnl_unsub_loan_elig_flag => l_fabase.adnl_unsub_loan_elig_flag,
4191 x_notification_status => NULL,
4192 x_notification_status_date => NULL
4193 );
4194 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4195 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.post_award.debug '|| g_req_id,'updated FA Base');
4196 END IF;
4197 END IF;
4198 CLOSE c_fabase;
4199 END IF; -- End of l-post check
4200
4201 --check for COA Lock profile i.e. 'IGF: Lock COA Budget for Student'
4202 IF get_coa_lock_prof_val = 'AWARDED' THEN
4203 IF NOT igf_aw_coa_gen.isCOALocked(l_base_id) THEN
4204 lv_locking_success := igf_aw_coa_gen.doLock(l_base_id);
4205 END IF;
4206 END IF;
4207
4208 /*
4209 bug 4601747 - award process status should get set to AWARDED when the student is packaged or repackaged.
4210 Since some awards may be skipped during repackaged, we have to call the set_awd_proc_status wrapper to get
4211 all the awards to AWARDED status-This is because AWARDED status has a higher priority over AWARDED status
4212 and so, the award process status for the awarding period would still remain in READY
4213 */
4214 setAPProcStat(l_base_id,g_awd_prd,'AWARDED');
4215 END IF; -- Awards Created Check.
4216
4217 EXCEPTION
4218 WHEN INV_FWS_AWARD THEN
4219 IF (c_awd_tot%ISOPEN) THEN
4220 CLOSE c_awd_tot;
4221 END IF;
4222 IF (c_fmast%ISOPEN) THEN
4223 CLOSE c_fmast;
4224 END IF;
4225 IF (c_person_number%ISOPEN) THEN
4226 CLOSE c_person_number;
4227 END IF;
4228 IF (c_awd_disb_cnt%ISOPEN) THEN
4229 CLOSE c_awd_disb_cnt;
4230 END IF;
4231 IF (c_awd_disb%ISOPEN) THEN
4232 CLOSE c_awd_disb;
4233 END IF;
4234 IF (c_nslds%ISOPEN) THEN
4235 CLOSE c_nslds;
4236 END IF;
4237 IF (c_fabase%ISOPEN) THEN
4238 CLOSE c_fabase;
4239 END IF;
4240 IF c_disb%ISOPEN THEN
4241 CLOSE c_disb;
4242 END IF;
4243 IF c_award_det%ISOPEN THEN
4244 CLOSE c_award_det;
4245 END IF;
4246 RAISE;
4247 WHEN OTHERS THEN
4248
4249 fnd_message.parse_encoded(fnd_message.get_encoded,l_app,l_name);
4250 IF l_name = 'IGF_AW_FUND_LOCK_ERR' THEN
4251 l_ret_status := 'L';
4252
4253 IF (c_awd_tot%ISOPEN) THEN
4254 CLOSE c_awd_tot;
4255 END IF;
4256
4257 IF (c_fmast%ISOPEN) THEN
4258 CLOSE c_fmast;
4259 END IF;
4260
4261 IF (c_person_number%ISOPEN) THEN
4262 CLOSE c_person_number;
4263 END IF;
4264
4265 IF (c_awd_disb_cnt%ISOPEN) THEN
4266 CLOSE c_awd_disb_cnt;
4267 END IF;
4268 IF (c_awd_disb%ISOPEN) THEN
4269 CLOSE c_awd_disb;
4270 END IF;
4271
4272 IF (c_nslds%ISOPEN) THEN
4273 CLOSE c_nslds;
4274 END IF;
4275
4276 IF (c_fabase%ISOPEN) THEN
4277 CLOSE c_fabase;
4278 END IF;
4279
4280
4281
4282 RETURN;
4283 ELSE
4284 l_ret_status := 'E';
4285 IF c_awd_tot%ISOPEN THEN
4286 CLOSE c_awd_tot;
4287 END IF;
4288
4289 IF c_fmast%ISOPEN THEN
4290 CLOSE c_fmast;
4291 END IF;
4292
4293 IF c_person_number%ISOPEN THEN
4294 CLOSE c_person_number;
4295 END IF;
4296 IF c_awd_disb_cnt%ISOPEN THEN
4297 CLOSE c_awd_disb_cnt;
4298 END IF;
4299 IF c_awd_disb%ISOPEN THEN
4300 CLOSE c_awd_disb;
4301 END IF;
4302
4303 IF c_nslds%ISOPEN THEN
4304 CLOSE c_nslds;
4305 END IF;
4306
4307 IF c_fabase%ISOPEN THEN
4308 CLOSE c_fabase;
4309 END IF;
4310 END IF;
4311
4312 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
4313 fnd_message.set_token('NAME','IGF_AW_PACKAGING.POST_AWARD' ||SQLERRM);
4314 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
4315 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.post_award.exception '|| g_req_id,'sql error message: '||SQLERRM);
4316 END IF;
4317 igs_ge_msg_stack.add;
4318 app_exception.raise_exception;
4319 RETURN;
4320
4321 END post_award;
4322
4323 FUNCTION actualDisbExist(
4324 p_award_id igf_aw_award_all.award_id%TYPE
4325 ) RETURN BOOLEAN AS
4326 ------------------------------------------------------------------
4327 --Created by : veramach, Oracle India
4328 --Date created: 13-Oct-2004
4329 --
4330 --Purpose:
4331 --
4332 --
4333 --Known limitations/enhancements and/or remarks:
4334 --
4335 --Change History:
4336 --Who When What
4337 -------------------------------------------------------------------
4338
4339 CURSOR c_adisb IS
4340 SELECT 'x'
4341 FROM igf_aw_awd_disb_all
4342 WHERE award_id = p_award_id
4343 AND trans_type = 'A'
4344 AND ROWNUM = 1;
4345 l_adisb c_adisb%ROWTYPE;
4346
4347 BEGIN
4348 OPEN c_adisb;
4349 FETCH c_adisb INTO l_adisb;
4350 IF c_adisb%FOUND THEN
4351 CLOSE c_adisb;
4352 RETURN TRUE;
4353 ELSE
4354 CLOSE c_adisb;
4355 RETURN FALSE;
4356 END IF;
4357 END actualDisbExist;
4358
4359 FUNCTION awardsExist(
4360 p_ci_cal_type igs_ca_inst.cal_type%TYPE,
4361 p_ci_sequence_number igs_ca_inst.sequence_number%TYPE,
4362 p_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
4363 p_fund_id igf_aw_fund_mast_all.fund_id%TYPE,
4364 p_awd_prd_code igf_aw_awd_prd_term.award_prd_cd%TYPE
4365 ) RETURN BOOLEAN AS
4366 ------------------------------------------------------------------
4367 --Created by : veramach, Oracle India
4368 --Date created: 13-Oct-2004
4369 --
4370 --Purpose: Returns true if atleast one award exists for the base_id/fund_id combination
4371 -- which lies partly or entirely within the award period passed and the award is not already
4372 -- loaded into the temporary table
4373 --
4374 --Known limitations/enhancements and/or remarks:
4375 --
4376 --Change History:
4377 --Who When What
4378 -------------------------------------------------------------------
4379
4380 CURSOR c_awd IS
4381 SELECT 'x'
4382 FROM igf_aw_award_all awd,
4383 igf_aw_awd_disb_all disb,
4384 igf_aw_awd_prd_term aprd
4385 WHERE awd.fund_id = p_fund_id
4386 AND awd.base_id = p_base_id
4387 AND awd.award_status IN ('ACCEPTED','OFFERED','CANCELLED')
4388 AND awd.award_id = disb.award_id
4389 AND disb.ld_cal_type = aprd.ld_cal_type
4390 AND disb.ld_sequence_number = aprd.ld_sequence_number
4391 AND aprd.award_prd_cd = p_awd_prd_code
4392 AND aprd.ci_cal_type = p_ci_cal_type
4393 AND aprd.ci_sequence_number = p_ci_sequence_number
4394 AND ROWNUM = 1;
4395 l_awd c_awd%ROWTYPE;
4396
4397 CURSOR c_awd_pell IS
4398 SELECT 'x'
4399 FROM igf_aw_award_all
4400 WHERE fund_id = p_fund_id
4401 AND base_id = p_base_id
4402 AND award_status IN ('ACCEPTED','OFFERED','CANCELLED')
4403 AND ROWNUM = 1;
4404 l_awd_pell c_awd_pell%ROWTYPE;
4405
4406 BEGIN
4407 IF get_fed_fund_code(p_fund_id) <> 'PELL' THEN
4408 OPEN c_awd;
4409 FETCH c_awd INTO l_awd;
4410 IF c_awd%FOUND THEN
4411 CLOSE c_awd;
4412 RETURN TRUE;
4413 ELSE
4414 CLOSE c_awd;
4415 RETURN FALSE;
4416 END IF;
4417 ELSE
4418 /*
4419 Award period does not apply for PELL
4420 */
4421 OPEN c_awd_pell;
4422 FETCH c_awd_pell INTO l_awd_pell;
4423 IF c_awd_pell%FOUND THEN
4424 CLOSE c_awd_pell;
4425 RETURN TRUE;
4426 ELSE
4427 CLOSE c_awd_pell;
4428 RETURN FALSE;
4429 END IF;
4430 END IF;
4431 END awardsExist;
4432
4433 FUNCTION isOriginated(
4434 p_fund_id igf_aw_fund_mast_all.fund_id%TYPE,
4435 p_award_id igf_aw_award_all.award_id%TYPE
4436 ) RETURN BOOLEAN AS
4437 ------------------------------------------------------------------
4438 --Created by : veramach, Oracle India
4439 --Date created: 13-Oct-2004
4440 --
4441 --Purpose:
4442 --
4443 --
4444 --Known limitations/enhancements and/or remarks:
4445 --
4446 --Change History:
4447 --Who When What
4448 -------------------------------------------------------------------
4449
4450 -- Get loan status
4451 CURSOR c_loan IS
4452 SELECT 'x'
4453 FROM igf_sl_loans
4454 WHERE award_id = p_award_id
4455 AND loan_status NOT IN ('G','N');--ready to send and not ready to send
4456 l_loan c_loan%ROWTYPE;
4457
4458 -- Get pell status
4459 CURSOR c_pell IS
4460 SELECT 'x'
4461 FROM igf_gr_rfms_all
4462 WHERE award_id = p_award_id
4463 AND orig_action_code NOT IN ('R','N','A','D','C');--ready to send and not ready to send
4464 l_pell c_pell%ROWTYPE;
4465 BEGIN
4466 IF get_fed_fund_code(p_fund_id) = 'PELL' THEN
4467 OPEN c_pell;
4468 FETCH c_pell INTO l_pell;
4469 IF c_pell%FOUND THEN
4470 CLOSE c_pell;
4471 RETURN TRUE;
4472 ELSE
4473 CLOSE c_pell;
4474 RETURN FALSE;
4475 END IF;
4476 ELSE
4477 OPEN c_loan;
4478 FETCH c_loan INTO l_loan;
4479 IF c_loan%FOUND THEN
4480 CLOSE c_loan;
4481 RETURN TRUE;
4482 ELSE
4483 CLOSE c_loan;
4484 RETURN FALSE;
4485 END IF;
4486 END IF;
4487 END isOriginated;
4488
4489 FUNCTION getFedVerifStatus(
4490 p_base_id igf_ap_fa_base_rec_all.base_id%TYPE
4491 ) RETURN VARCHAR2 AS
4492 ------------------------------------------------------------------
4493 --Created by : veramach, Oracle India
4494 --Date created: 13-Oct-2004
4495 --
4496 --Purpose:
4497 --
4498 --
4499 --Known limitations/enhancements and/or remarks:
4500 --
4501 --Change History:
4502 --Who When What
4503 -------------------------------------------------------------------
4504
4505 CURSOR c_verif IS
4506 SELECT fed_verif_status
4507 FROM igf_ap_fa_base_rec_all
4508 WHERE base_id = p_base_id;
4509 l_verif_status igf_ap_fa_base_rec_all.fed_verif_status%TYPE;
4510 BEGIN
4511 l_verif_status := NULL;
4512 OPEN c_verif;
4513 FETCH c_verif INTO l_verif_status;
4514 CLOSE c_verif;
4515 RETURN l_verif_status;
4516 END getFedVerifStatus;
4517
4518 FUNCTION doesAwardSpanOutsideAP(
4519 p_ci_cal_type igs_ca_inst.cal_type%TYPE,
4520 p_ci_sequence_number igs_ca_inst.sequence_number%TYPE,
4521 p_award_id igf_aw_award_all.award_id%TYPE,
4522 p_awd_prd_code igf_aw_awd_prd_term.award_prd_cd%TYPE
4523 ) RETURN BOOLEAN AS
4524 ------------------------------------------------------------------
4525 --Created by : veramach, Oracle India
4526 --Date created: 13-Oct-2004
4527 --
4528 --Purpose:
4529 --
4530 --
4531 --Known limitations/enhancements and/or remarks:
4532 --
4533 --Change History:
4534 --Who When What
4535 -------------------------------------------------------------------
4536
4537 CURSOR c_terms IS
4538 SELECT 'x'
4539 FROM DUAL
4540 WHERE EXISTS(
4541 SELECT 'x'
4542 FROM igf_aw_awd_disb_all
4543 WHERE award_id = p_award_id
4544 AND (ld_cal_type, ld_sequence_number) IN(
4545 SELECT ld_cal_type,
4546 ld_sequence_number
4547 FROM igf_aw_awd_prd_term
4548 WHERE ci_cal_type = p_ci_cal_type
4549 AND ci_sequence_number = p_ci_sequence_number
4550 AND award_prd_cd = p_awd_prd_code))
4551 AND EXISTS(
4552 SELECT 'x'
4553 FROM igf_aw_awd_disb_all
4554 WHERE award_id = p_award_id
4555 AND (ld_cal_type, ld_sequence_number) NOT IN(
4556 SELECT ld_cal_type,
4557 ld_sequence_number
4558 FROM igf_aw_awd_prd_term
4559 WHERE ci_cal_type = p_ci_cal_type
4560 AND ci_sequence_number = p_ci_sequence_number
4561 AND award_prd_cd = p_awd_prd_code));
4562 l_terms c_terms%ROWTYPE;
4563 BEGIN
4564 OPEN c_terms;
4565 FETCH c_terms INTO l_terms;
4566 IF c_terms%FOUND THEN
4567 CLOSE c_terms;
4568 RETURN TRUE;
4569 ELSE
4570 CLOSE c_terms;
4571 RETURN FALSE;
4572 END IF;
4573 END doesAwardSpanOutsideAP;
4574
4575 FUNCTION chk_gplus_loan_limits (
4576 p_base_id IN igf_ap_fa_base_rec_all.base_id%TYPE,
4577 p_fed_fund_code IN igf_aw_fund_cat_all.fed_fund_code%TYPE,
4578 p_adplans_id IN igf_aw_awd_dist_plans.adplans_id%TYPE,
4579 p_aid IN NUMBER,
4580 p_std_loan_tab IN igf_aw_packng_subfns.std_loan_tab,
4581 p_msg_name OUT NOCOPY fnd_new_messages.message_name%TYPE
4582 )
4583 RETURN BOOLEAN
4584 IS
4585 /*
4586 || Created By : museshad
4587 || Created On : 25-JUL-2006
4588 || Purpose : Build FA 163(Bug 5337551).
4589 || Graduate PLUS loans (GPLUSDL, GPLUSFL) can be awarded only if the student has already been
4590 || awarded his full Stafford Loan eligibility for the award year. Note that aggregate limit checks
4591 || are not applicable here.
4592 || Known limitations, enhancements or remarks :
4593 || Change History :
4594 || Who When What
4595 || (reverse chronological order - newest change first)
4596 */
4597
4598 lv_fed_fund_code igf_aw_fund_cat_all.fed_fund_code%TYPE;
4599 lv_aid NUMBER := 0;
4600 lv_msg_name fnd_new_messages.message_name%TYPE := NULL;
4601 lv_ret_status BOOLEAN := FALSE;
4602 BEGIN
4603 lv_aid := p_aid;
4604
4605 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4606 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.chk_gplus_loan_limits.debug '|| g_req_id,'Parameter list - START' ||p_base_id);
4607 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.chk_gplus_loan_limits.debug '|| g_req_id,'p_base_id: ' ||p_base_id);
4608 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.chk_gplus_loan_limits.debug '|| g_req_id,'p_fed_fund_code: ' ||p_fed_fund_code);
4609 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.chk_gplus_loan_limits.debug '|| g_req_id,'p_adplans_id: ' ||p_adplans_id);
4610 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.chk_gplus_loan_limits.debug '|| g_req_id,'Parameter list - END' ||p_base_id);
4611 END IF;
4612
4613 -- Check if Stafford loan limit is exhausted for the corresponding Unsubsidized loan.
4614 IF p_fed_fund_code = 'GPLUSDL' THEN
4615 lv_fed_fund_code := 'DLU';
4616 ELSIF p_fed_fund_code = 'GPLUSFL' THEN
4617 lv_fed_fund_code := 'FLU';
4618 END IF;
4619
4620 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4621 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.chk_gplus_loan_limits.debug '|| g_req_id,'Calling check_loan_limits for ' ||lv_fed_fund_code);
4622 END IF;
4623
4624 igf_aw_packng_subfns.check_loan_limits(
4625 l_base_id => p_base_id,
4626 fund_type => lv_fed_fund_code,
4627 l_award_id => NULL,
4628 l_adplans_id => p_adplans_id,
4629 l_aid => lv_aid,
4630 l_std_loan_tab => p_std_loan_tab,
4631 p_msg_name => lv_msg_name,
4632 p_chk_aggr_limit => 'N' -- do not do Aggr limit checks
4633 );
4634 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4635 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.chk_gplus_loan_limits.debug '|| g_req_id,'After Calling check_loan_limits: lv_aid= ' ||lv_aid|| 'p_msg_name= ' ||p_msg_name);
4636 END IF;
4637
4638 IF lv_aid < 0 THEN
4639 -- Student has got loans (Subs+Unsubz) more than his Annual Stafford loan limit, so he is eligible for Graduate PLUS loan.
4640 lv_ret_status := TRUE;
4641 lv_msg_name := NULL;
4642
4643 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4644 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.chk_gplus_loan_limits.debug '|| g_req_id,'Stafford loan limit exhausted for ' ||lv_fed_fund_code);
4645 END IF;
4646
4647 ELSIF lv_aid = 0 THEN
4648 IF lv_msg_name IS NOT NULL THEN
4649 -- Some err like- not able to derive Class Standing or Class Standing Mapping not defined etc.
4650 lv_ret_status := FALSE;
4651 ELSE
4652 -- Stafford loan limit exhausted. Student is eligible for Graduate PLUS loan
4653 lv_ret_status := TRUE;
4654
4655 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4656 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.chk_gplus_loan_limits.debug '|| g_req_id,'Stafford loan limit exhausted for ' ||lv_fed_fund_code);
4657 END IF;
4658 END IF;
4659
4660 ELSIF lv_aid > 0 THEN
4661 -- Stafford loan limit NOT exhausted yet, not eligible for Graduate PLUS loan.
4662 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4663 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.chk_gplus_loan_limits.debug '|| g_req_id,'Stafford loan limit NOT exhausted for ' ||lv_fed_fund_code|| '. Cannot award ' ||p_fed_fund_code);
4664 END IF;
4665
4666 lv_msg_name := 'IGF_AW_LOAN_LMT_NOT_EXHST';
4667 lv_ret_status := FALSE;
4668 END IF; -- <<lv_aid = 0>>
4669
4670 p_msg_name := lv_msg_name;
4671 RETURN lv_ret_status;
4672
4673 EXCEPTION
4674 WHEN OTHERS THEN
4675 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
4676 fnd_message.set_token('NAME','IGF_AW_PACKAGING.chk_gplus_loan_limits '||SQLERRM);
4677 igs_ge_msg_stack.add;
4678
4679 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
4680 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.chk_gplus_loan_limits.exception '|| g_req_id,'sql error message: '||SQLERRM);
4681 END IF;
4682
4683 p_msg_name := NULL;
4684 RETURN FALSE;
4685 END chk_gplus_loan_limits;
4686
4687 PROCEDURE merge_funds(
4688 p_target_group IN igf_ap_fa_base_rec_all.target_group%TYPE,
4689 p_ci_cal_type IN igf_ap_fa_base_rec_all.ci_cal_type%TYPE,
4690 p_ci_sequence_number IN igf_ap_fa_base_rec_all.ci_sequence_number%TYPE,
4691 p_base_id IN igf_ap_fa_base_rec_all.base_id%TYPE
4692 ) AS
4693 ------------------------------------------------------------------
4694 --Created by : veramach, Oracle India
4695 --Date created: 19-Oct-2004
4696 --
4697 --Purpose:
4698 -- To merge awards of award group and non award group funds
4699 --
4700 --Known limitations/enhancements and/or remarks:
4701 --
4702 --Change History:
4703 --Who When What
4704 --museshad 17-Apr-2006 Awards were not getting repackaged in the order defined in
4705 -- Repackage priority sequence setup. Fixed this by modifying
4706 -- the ORDER BY in c_merge.
4707 -------------------------------------------------------------------
4708
4709 -- Get funds which are not from the award group and are candidates for re-packaging
4710 CURSOR c_rep_funds(
4711 cp_target_group igf_ap_fa_base_rec_all.target_group%TYPE,
4712 cp_ci_cal_type igf_ap_fa_base_rec_all.ci_cal_type%TYPE,
4713 cp_ci_sequence_number igf_ap_fa_base_rec_all.ci_sequence_number%TYPE,
4714 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE
4715 ) IS
4716 SELECT 'x'
4717 FROM igf_aw_award_t
4718 WHERE base_id = cp_base_id
4719 AND process_id = l_process_id
4720 AND flag = 'AU'
4721 AND fund_id NOT IN (SELECT fund_id
4722 FROM igf_aw_awd_frml_det
4723 WHERE formula_code = cp_target_group
4724 AND ci_cal_type = cp_ci_cal_type
4725 AND ci_sequence_number = cp_ci_sequence_number);
4726 l_rep_funds c_rep_funds%ROWTYPE;
4727
4728 --check if there are non-mergable funds. If seq_no is null means the fund is not from the target group
4729 CURSOR c_non_merge(
4730 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE
4731 ) IS
4732 SELECT awd.fund_id
4733 FROM igf_aw_award_t awd
4734 WHERE awd.temp_char_val1 IS NULL
4735 AND awd.flag IN ('CF','AU')
4736 AND awd.base_id = cp_base_id
4737 AND awd.process_id = l_process_id
4738 AND NOT EXISTS (SELECT 'x'
4739 FROM igf_aw_fn_rpkg_prty
4740 WHERE fund_id = awd.fund_id);
4741 l_non_merge c_non_merge%ROWTYPE;
4742
4743 -- Get priorities for all funds
4744 CURSOR c_merge(
4745 cp_ci_cal_type igf_ap_fa_base_rec_all.ci_cal_type%TYPE,
4746 cp_ci_sequence_number igf_ap_fa_base_rec_all.ci_sequence_number%TYPE,
4747 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE
4748 ) IS
4749 SELECT ROWNUM priority,
4750 awd.*
4751 FROM igf_aw_fn_rpkg_prty prty,
4752 igf_aw_award_t awd
4753 WHERE awd.base_id = cp_base_id
4754 AND awd.process_id = l_process_id
4755 AND awd.flag IN ('CF','AU')
4756 AND awd.fund_id = prty.fund_id
4757 AND prty.ci_cal_type = cp_ci_cal_type
4758 AND prty.ci_sequence_number = cp_ci_sequence_number
4759 ORDER BY prty.fund_order_num, awd.award_id;
4760
4761 -- Get fund_code
4762 CURSOR c_fund(
4763 cp_fund_id igf_aw_fund_mast_all.fund_id%TYPE
4764 ) IS
4765 SELECT fund_code
4766 FROM igf_aw_fund_mast_all
4767 WHERE fund_id = cp_fund_id;
4768 l_fund_code igf_aw_fund_mast_all.fund_code%TYPE;
4769
4770 BEGIN
4771
4772 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4773 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.merge_funds.debug '|| g_req_id,'starting merge_funds');
4774 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.merge_funds.debug '|| g_req_id,'p_target_group:'||p_target_group);
4775 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.merge_funds.debug '|| g_req_id,'p_ci_cal_type:'||p_ci_cal_type);
4776 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.merge_funds.debug '|| g_req_id,'p_ci_sequence_number:'||p_ci_sequence_number);
4777 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.merge_funds.debug '|| g_req_id,'p_base_id:'||p_base_id);
4778 END IF;
4779
4780 OPEN c_rep_funds(p_target_group,p_ci_cal_type,p_ci_sequence_number,p_base_id);
4781 FETCH c_rep_funds INTO l_rep_funds;
4782 IF c_rep_funds%NOTFOUND THEN
4783 --got nothing to merge.
4784 --quit merging
4785 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4786 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.merge_funds.debug '|| g_req_id,'no funds to merge');
4787 END IF;
4788 CLOSE c_rep_funds;
4789 RETURN;
4790 END IF;
4791 CLOSE c_rep_funds;
4792
4793 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4794 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.merge_funds.debug '|| g_req_id,'have funds to merge');
4795 END IF;
4796
4797 OPEN c_non_merge(p_base_id);
4798 FETCH c_non_merge INTO l_non_merge;
4799 IF c_non_merge%FOUND THEN
4800 CLOSE c_non_merge;
4801 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4802 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.merge_funds.debug '|| g_req_id,'unable to merge.quitting...');
4803 END IF;
4804 fnd_message.set_name('IGF','IGF_AW_FUND_NO_MERGE');
4805 l_fund_code := NULL;
4806 OPEN c_fund(l_non_merge.fund_id);
4807 FETCH c_fund INTO l_fund_code;
4808 CLOSE c_fund;
4809 fnd_message.set_token('FUND_CODE',l_fund_code);
4810 fnd_file.put_line(fnd_file.log,fnd_message.get);
4811 RAISE NON_MERGABLE_FUNDS;
4812 END IF;
4813
4814 --at this point, we know there are funds to be merged and all those can be merged.
4815 FOR l_merge IN c_merge(p_ci_cal_type,p_ci_sequence_number,p_base_id) LOOP
4816 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
4817 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.merge_funds.debug '|| g_req_id,'updating fund_id:'||l_merge.fund_id||
4818 ' base_id:'||l_merge.base_id||
4819 ' with priority:'||l_merge.priority||
4820 ' l_merge.temp_val3_num:'||l_merge.temp_val3_num||
4821 'l_merge.temp_val4_num:'||l_merge.temp_val4_num
4822 );
4823 END IF;
4824 igf_aw_award_t_pkg.update_row(
4825 x_rowid => l_merge.row_id,
4826 x_process_id => l_merge.process_id,
4827 x_sl_number => l_merge.sl_number,
4828 x_fund_id => l_merge.fund_id,
4829 x_base_id => l_merge.base_id,
4830 x_offered_amt => l_merge.offered_amt,
4831 x_accepted_amt => l_merge.accepted_amt,
4832 x_paid_amt => l_merge.paid_amt,
4833 x_need_reduction_amt => l_merge.need_reduction_amt,
4834 x_flag => l_merge.flag,
4835 x_temp_num_val1 => l_merge.temp_num_val1,
4836 x_temp_num_val2 => l_merge.temp_num_val2,
4837 x_temp_char_val1 => TO_CHAR(l_merge.priority),
4838 x_tp_cal_type => l_merge.tp_cal_type,
4839 x_tp_sequence_number => l_merge.tp_sequence_number,
4840 x_ld_cal_type => l_merge.ld_cal_type,
4841 x_ld_sequence_number => l_merge.ld_sequence_number,
4842 x_mode => 'R',
4843 x_adplans_id => l_merge.adplans_id,
4844 x_app_trans_num_txt => l_merge.app_trans_num_txt,
4845 x_award_id => l_merge.award_id,
4846 x_lock_award_flag => l_merge.lock_award_flag,
4847 x_temp_val3_num => l_merge.temp_val3_num,
4848 x_temp_val4_num => l_merge.temp_val4_num,
4849 x_temp_char2_txt => l_merge.temp_char2_txt,
4850 x_temp_char3_txt => l_merge.temp_char3_txt
4851 );
4852 END LOOP;
4853
4854 END merge_funds;
4855
4856 PROCEDURE load_awards(
4857 p_ci_cal_type igs_ca_inst.cal_type%TYPE,
4858 p_ci_sequence_number igs_ca_inst.sequence_number%TYPE,
4859 p_award_prd_code igf_aw_awd_prd_term.award_prd_cd%TYPE,
4860 p_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
4861 p_fund_id igf_aw_fund_mast_all.fund_id%TYPE,
4862 p_lock_award_flag igf_aw_fund_mast_all.lock_award_flag%TYPE,
4863 p_re_pkg_verif_flag igf_aw_fund_mast_all.re_pkg_verif_flag%TYPE,
4864 p_donot_repkg_if_code igf_aw_fund_mast_all.donot_repkg_if_code%TYPE,
4865 p_adplans_id igf_aw_awd_dist_plans.adplans_id%TYPE,
4866 p_max_award_amt igf_aw_fund_mast_all.max_award_amt%TYPE,
4867 p_min_award_amt igf_aw_fund_mast_all.min_award_amt%TYPE,
4868 p_seq_no NUMBER
4869 ) AS
4870 ------------------------------------------------------------------
4871 --Created by : veramach, Oracle India
4872 --Date created: 25-Oct-2004
4873 --
4874 --Purpose:
4875 -- Loads awards from a given fund, which lie partly
4876 -- or entirely within the passed award period,after imposing restrictions
4877 --
4878 --Known limitations/enhancements and/or remarks:
4879 --
4880 --Change History:
4881 --Who When What
4882 -------------------------------------------------------------------
4883 lv_fed_fund_code igf_aw_fund_cat_all.fed_fund_code%TYPE;
4884 -- Get awards from a fund
4885 CURSOR c_awds(
4886 cp_ci_cal_type igs_ca_inst.cal_type%TYPE,
4887 cp_ci_sequence_number igs_ca_inst.sequence_number%TYPE,
4888 cp_award_prd_code igf_aw_awd_prd_term.award_prd_cd%TYPE,
4889 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
4890 cp_fund_id igf_aw_fund_mast_all.fund_id%TYPE
4891 ) IS
4892 SELECT awd.award_id,
4893 awd.offered_amt,
4894 awd.paid_amt,
4895 awd.lock_award_flag,
4896 awd.adplans_id,
4897 fmast.auto_pkg,
4898 NVL(p_max_award_amt, fmast.max_award_amt) max_award_amt,
4899 NVL(p_min_award_amt, fmast.min_award_amt) min_award_amt,
4900 fmast.allow_overaward,
4901 fmast.over_award_amt,
4902 fmast.over_award_perct,
4903 fmast.available_amt,
4904 fmast.remaining_amt
4905 FROM igf_aw_award_all awd, igf_aw_fund_mast_all fmast
4906 WHERE awd.base_id = cp_base_id
4907 AND awd.fund_id = cp_fund_id
4908 AND awd.award_status IN('OFFERED', 'ACCEPTED', 'CANCELLED')
4909 AND fmast.fund_id = awd.fund_id
4910 AND lv_fed_fund_code <> 'PELL'
4911 AND awd.award_id IN(
4912 SELECT DISTINCT awd.award_id
4913 FROM igf_aw_award_all awd,
4914 igf_aw_awd_disb_all disb,
4915 igf_aw_awd_prd_term aprd
4916 WHERE awd.fund_id = cp_fund_id
4917 AND awd.base_id = cp_base_id
4918 AND awd.award_id = disb.award_id
4919 AND disb.ld_cal_type = aprd.ld_cal_type
4920 AND disb.ld_sequence_number = aprd.ld_sequence_number
4921 AND aprd.award_prd_cd = cp_award_prd_code
4922 AND aprd.ci_cal_type = cp_ci_cal_type
4923 AND aprd.ci_sequence_number = cp_ci_sequence_number)
4924 UNION ALL
4925 SELECT awd.award_id,
4926 awd.offered_amt,
4927 awd.paid_amt,
4928 awd.lock_award_flag,
4929 awd.adplans_id,
4930 fmast.auto_pkg,
4931 NVL(p_max_award_amt, fmast.max_award_amt) max_award_amt,
4932 NVL(p_min_award_amt, fmast.min_award_amt) min_award_amt,
4933 fmast.allow_overaward,
4934 fmast.over_award_amt,
4935 fmast.over_award_perct,
4936 fmast.available_amt,
4937 fmast.remaining_amt
4938 FROM igf_aw_award_all awd, igf_aw_fund_mast_all fmast
4939 WHERE awd.base_id = cp_base_id
4940 AND awd.fund_id = cp_fund_id
4941 AND awd.award_status IN('OFFERED', 'ACCEPTED', 'CANCELLED')
4942 AND fmast.fund_id = awd.fund_id
4943 AND lv_fed_fund_code = 'PELL';
4944
4945 -- Get loan status
4946 CURSOR c_loan_status(
4947 cp_award_id igf_aw_award_all.award_id%TYPE
4948 ) IS
4949 SELECT loan_status,
4950 loan_chg_status
4951 FROM igf_sl_loans
4952 WHERE award_id = cp_award_id;
4953 l_loan_status igf_sl_loans.loan_status%TYPE;
4954 l_loan_chg_status igf_sl_loans.loan_chg_status%TYPE;
4955
4956 CURSOR c_pell_orig_stat(
4957 cp_award_id igf_aw_award_all.award_id%TYPE
4958 ) IS
4959 SELECT orig_action_code
4960 FROM igf_gr_rfms_all
4961 WHERE award_id = cp_award_id;
4962 l_pell_orig_stat igf_gr_rfms_all.orig_action_code%TYPE;
4963
4964 lb_awards_locked BOOLEAN;
4965
4966 -- Get pell disb orig status
4967 CURSOR c_pell_disb_orig_stat(
4968 cp_award_id igf_aw_award_all.award_id%TYPE
4969 ) IS
4970 SELECT disb.disb_ack_act_status
4971 FROM igf_gr_rfms_disb_all disb,
4972 igf_gr_rfms_all rfms
4973 WHERE rfms.origination_id = disb.origination_id
4974 AND rfms.award_id = cp_award_id
4975 AND disb.disb_ack_act_status = 'S'
4976 AND ROWNUM = 1;
4977 l_pell_disb_orig_stat igf_gr_rfms_disb_all.disb_ack_act_status%TYPE;
4978
4979 lv_rowid VARCHAR2(25);
4980 l_sl_number NUMBER(15);
4981
4982 -- Check for locked awards for the Student in the current fund
4983 CURSOR c_chk_locked_award(
4984 cp_fund_id igf_aw_fund_mast_all.fund_id%TYPE,
4985 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE
4986 )
4987 IS
4988 SELECT 'x'
4989 FROM igf_aw_award_t_all
4990 WHERE
4991 process_id = l_process_id AND
4992 fund_id = cp_fund_id AND
4993 base_id = cp_base_id AND
4994 flag = 'AL';
4995 l_chk_locked_award c_chk_locked_award%ROWTYPE;
4996
4997 -- Returns all existing awards which are not locked
4998 CURSOR c_get_unlocked_award (
4999 cp_fund_id igf_aw_fund_mast_all.fund_id%TYPE,
5000 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE
5001 )
5002 IS
5003 SELECT awd_t.rowid, awd_t.*
5004 FROM igf_aw_award_t_all awd_t
5005 WHERE
5006 awd_t.flag = 'AU' AND
5007 process_id = l_process_id AND
5008 fund_id = cp_fund_id AND
5009 base_id = cp_base_id;
5010
5011
5012 -- Get the Over Award records from the temporary table.
5013 CURSOR c_ov_fund( x_fund_id igf_aw_fund_mast.fund_id%TYPE ) IS
5014 SELECT row_id
5015 FROM igf_aw_award_t awdt
5016 WHERE fund_id = x_fund_id
5017 AND flag = 'OV'
5018 AND process_id = l_process_id;
5019
5020 l_ov_fund c_ov_fund%ROWTYPE;
5021 l_overaward NUMBER;
5022
5023 CURSOR c_pell_cnt(
5024 cp_fund_id igf_aw_fund_mast_all.fund_id%TYPE,
5025 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE
5026 ) IS
5027 SELECT SUM(DECODE(awd.award_status,'CANCELLED',1,0)) cancelled_awd,
5028 SUM(DECODE(awd.award_status,'OFFERED',1,'ACCEPTED',1,0)) off_acc_awd
5029 FROM igf_aw_award_t_all awdt,
5030 igf_aw_award_all awd
5031 WHERE awdt.fund_id = cp_fund_id
5032 AND awdt.base_id = cp_base_id
5033 AND awdt.process_id = l_process_id
5034 AND awdt.flag = 'AU'
5035 AND awdt.award_id = awd.award_id;
5036 l_pell_cnt c_pell_cnt%ROWTYPE;
5037
5038 CURSOR c_lock_pell_awd(
5039 cp_fund_id igf_aw_fund_mast_all.fund_id%TYPE,
5040 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE
5041 ) IS
5042 SELECT awdt.ROWID row_id,
5043 awdt.*
5044 FROM igf_aw_award_t_all awdt,
5045 igf_aw_award_all awd
5046 WHERE awdt.award_id = awd.award_id
5047 AND awdt.fund_id = cp_fund_id
5048 AND awdt.base_id = cp_base_id
5049 AND awdt.process_id = l_process_id
5050 AND awd.award_status = 'CANCELLED';
5051 l_lock_pell_awd c_lock_pell_awd%ROWTYPE;
5052
5053 CURSOR c_lock_pell_awd1(
5054 cp_fund_id igf_aw_fund_mast_all.fund_id%TYPE,
5055 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
5056 cp_award_id igf_aw_award_all.award_id%TYPE
5057 ) IS
5058 SELECT awdt.ROWID row_id,
5059 awdt.*
5060 FROM igf_aw_award_t_all awdt
5061 WHERE awdt.award_id <> cp_award_id
5062 AND awdt.base_id = cp_base_id
5063 AND awdt.fund_id = cp_fund_id
5064 AND awdt.process_id = l_process_id;
5065
5066 CURSOR c_latest_awd(
5067 cp_fund_id igf_aw_fund_mast_all.fund_id%TYPE,
5068 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE
5069 ) IS
5070 SELECT awd.award_id
5071 FROM igf_aw_award_t_all awdt,
5072 igf_aw_award_all awd
5073 WHERE awdt.award_id = awd.award_id
5074 AND awdt.fund_id = cp_fund_id
5075 AND awdt.base_id = cp_base_id
5076 AND awdt.process_id = l_process_id
5077 AND awd.award_status = 'CANCELLED'
5078 AND awdt.flag = 'AU'
5079 ORDER BY awd.award_id DESC;
5080 l_latest_awd c_latest_awd%ROWTYPE;
5081
5082 BEGIN
5083 lv_fed_fund_code := get_fed_fund_code(p_fund_id);
5084 FOR l_awds IN c_awds(p_ci_cal_type,p_ci_sequence_number,p_award_prd_code,p_base_id,p_fund_id) LOOP
5085 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5086 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'****processing award_id:'||l_awds.award_id);
5087 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'p_base_id:'||p_base_id);
5088 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'p_fund_id:'||p_fund_id);
5089 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'p_lock_award_flag:'||p_lock_award_flag);
5090 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'p_re_pkg_verif_flag:'||p_re_pkg_verif_flag);
5091 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'p_donot_repkg_if_code:'||p_donot_repkg_if_code);
5092 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'p_adplans_id:'||p_adplans_id);
5093 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'p_max_award_amt:'||p_max_award_amt);
5094 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'p_min_award_amt:'||p_min_award_amt);
5095 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'p_seq_no:'||p_seq_no);
5096 END IF;
5097
5098 /*
5099 First check to see if the current fund has a OV record. Else, put it into the temp table
5100 */
5101 OPEN c_ov_fund(p_fund_id);
5102 FETCH c_ov_fund INTO l_ov_fund;
5103 IF c_ov_fund%FOUND THEN
5104 CLOSE c_ov_fund;
5105 --nothing to do. the record exists
5106 ELSE
5107 CLOSE c_ov_fund;
5108 --got to insert the record
5109
5110 l_overaward := 0;
5111
5112 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5113 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'c_ov_fund%NOTFOUND!l_overaward:'||l_overaward);
5114 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'l_awds.allow_overaward:'||l_awds.allow_overaward);
5115 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'l_awds.over_award_amt:'||l_awds.over_award_amt);
5116 END IF;
5117
5118 IF ( l_awds.allow_overaward = 'Y' ) THEN
5119
5120 IF NVL(l_awds.over_award_amt,0) > 0 THEN
5121 l_overaward := l_awds.over_award_amt;
5122
5123 ELSIF NVL(l_awds.over_award_perct,0) > 0 THEN
5124 l_overaward := ( l_awds.available_amt * l_awds.over_award_perct/100 );
5125 END IF;
5126
5127 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5128 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'set l_overaward to '||l_overaward);
5129 END IF;
5130
5131 END IF;
5132 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5133 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'inserting into igf_aw_award_t with flag:OV for fund:'||p_fund_id||' and base_id:'||p_base_id);
5134 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'l_awds.remaining_amt:'||l_awds.remaining_amt);
5135 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'l_overaward:'||l_overaward);
5136 END IF;
5137 igf_aw_award_t_pkg.insert_row(
5138 x_rowid => lv_rowid ,
5139 x_process_id => l_process_id ,
5140 x_sl_number => l_sl_number,
5141 x_fund_id => p_fund_id,
5142 x_base_id => p_base_id,
5143 x_offered_amt => 0 ,
5144 x_accepted_amt => 0 ,
5145 x_paid_amt => 0 ,
5146 x_need_reduction_amt => NULL,
5147 x_flag => 'OV',
5148 x_temp_num_val1 => l_awds.remaining_amt,
5149 x_temp_num_val2 => l_overaward,
5150 x_temp_char_val1 => NULL,
5151 x_tp_cal_type => NULL,
5152 x_tp_sequence_number => NULL,
5153 x_ld_cal_type => NULL,
5154 x_ld_sequence_number => NULL,
5155 x_mode => 'R',
5156 x_adplans_id => NULL,
5157 x_app_trans_num_txt => NULL,
5158 x_lock_award_flag => NULL,
5159 x_temp_val3_num => NULL,
5160 x_temp_val4_num => NULL,
5161 x_temp_char2_txt => NULL,
5162 x_temp_char3_txt => NULL
5163 );
5164 END IF;
5165
5166 lb_awards_locked := FALSE;
5167
5168 --Fund should be auto-packagable
5169 IF NVL(l_awds.auto_pkg,'N') = 'N' THEN
5170 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5171 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'fund cannot be auto-packaged');
5172 END IF;
5173 lb_awards_locked := TRUE;
5174 ELSE
5175 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5176 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'passed auto-package validation');
5177 END IF;
5178 END IF;
5179 --1.award should exist within the current awarding period
5180 IF lv_fed_fund_code <> 'PELL' AND doesAwardSpanOutsideAP(p_ci_cal_type,p_ci_sequence_number,l_awds.award_id,g_awd_prd) THEN
5181 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5182 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'award spans outside AP');
5183 END IF;
5184 lb_awards_locked := TRUE;
5185 ELSE
5186 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5187 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'award lies within AP');
5188 END IF;
5189 END IF;
5190
5191 --2.award's lock status
5192 IF NVL(l_awds.lock_award_flag,'N') = 'Y' THEN
5193 lb_awards_locked := TRUE;
5194 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5195 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'award locked');
5196 END IF;
5197 ELSE
5198 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5199 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'award not locked');
5200 END IF;
5201 END IF;
5202
5203 --3. check on donot_rpkg_if_code
5204 IF p_donot_repkg_if_code = 'ACTUAL_DISB_EXISTS' THEN
5205 IF actualDisbExist(l_awds.award_id) THEN
5206 --skip this award from repackaging
5207 --this would contribute only to need
5208 lb_awards_locked := TRUE;
5209 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5210 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'fails actual_disb_exist');
5211 END IF;
5212 ELSE
5213 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5214 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'no actual disb');
5215 END IF;
5216 END IF;
5217 ELSIF p_donot_repkg_if_code = 'ORIGINATED' THEN
5218 --means this can be a loan or PELL
5219 IF isOriginated(p_fund_id,l_awds.award_id) THEN
5220 lb_awards_locked := TRUE;
5221 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5222 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'fails originated chk');
5223 END IF;
5224 /*
5225 If fund is PELL,print a message
5226 */
5227 IF lv_fed_fund_code = 'PELL' THEN
5228 fnd_message.set_name('IGF','IGF_GR_ORIG_SENT_NO_RECALC');
5229 fnd_file.put_line(fnd_file.log,fnd_message.get);
5230 END IF;
5231 ELSE
5232 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5233 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'not originated');
5234 END IF;
5235 END IF;
5236 ELSIF p_donot_repkg_if_code = 'ORIG_OR_ACTUAL' THEN
5237 IF isOriginated(p_fund_id,l_awds.award_id) OR actualDisbExist(l_awds.award_id) THEN
5238 lb_awards_locked := TRUE;
5239 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5240 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'fails orig_or_actual chk');
5241 END IF;
5242 /*
5243 IF fund is PELL,print a message
5244 */
5245 IF lv_fed_fund_code = 'PELL' AND isOriginated(p_fund_id,l_awds.award_id) THEN
5246 fnd_message.set_name('IGF','IGF_GR_ORIG_SENT_NO_RECALC');
5247 fnd_file.put_line(fnd_file.log,fnd_message.get);
5248 END IF;
5249 ELSE
5250 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5251 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'passed orig_or_actual chk');
5252 END IF;
5253 END IF;
5254 END IF;
5255
5256 --4.Verification status
5257 IF NVL(p_re_pkg_verif_flag,'N') = 'N' AND getFedVerifStatus(p_base_id)= 'ACCURATE' THEN
5258 lb_awards_locked := TRUE;
5259 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5260 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'fails verification status');
5261 END IF;
5262 ELSE
5263 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5264 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'passed verification status chk');
5265 END IF;
5266 END IF;
5267
5268 --5. FFELP loans whose loan status is ACCEPTED must be skipped.
5269 IF lv_fed_fund_code IN ('FLS','FLU','FLP','GPLUSFL') THEN
5270 OPEN c_loan_status(l_awds.award_id);
5271 FETCH c_loan_status INTO l_loan_status,l_loan_chg_status;
5272 IF c_loan_status%FOUND AND l_loan_status IN ('A','S') THEN
5273 CLOSE c_loan_status;
5274 lb_awards_locked := TRUE;
5275 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5276 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'fails FFELP with accepted origination chk. Cannot repackage.');
5277 END IF;
5278 ELSE
5279 CLOSE c_loan_status;
5280 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5281 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'passed FFELP with accepted origination chk');
5282 END IF;
5283 END IF;
5284 END IF;
5285
5286 --6.sponsorhsips will only be resources. they cannot be repackaged
5287 IF lv_fed_fund_code = 'SPNSR' THEN
5288 lb_awards_locked := TRUE;
5289 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5290 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'fails sponsot chk');
5291 END IF;
5292 END IF;
5293
5294 --7.PELL or LOANS,if in transit,cannot be repackaged
5295 IF lv_fed_fund_code = 'PELL' THEN
5296 l_pell_orig_stat := NULL;
5297 OPEN c_pell_orig_stat(l_awds.award_id);
5298 FETCH c_pell_orig_stat INTO l_pell_orig_stat;
5299 CLOSE c_pell_orig_stat;
5300 IF l_pell_orig_stat IS NOT NULL AND l_pell_orig_stat = 'S' THEN
5301 lb_awards_locked := TRUE;
5302 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5303 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'PELL in sent status.cannot repackage');
5304 END IF;
5305 ELSE
5306 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5307 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'PELL passed SENT status chk');
5308 END IF;
5309 END IF;
5310 ELSIF get_sys_fund_type(p_fund_id) = 'LOAN' THEN
5311 l_loan_status := NULL;
5312 l_loan_chg_status := NULL;
5313 OPEN c_loan_status(l_awds.award_id);
5314 FETCH c_loan_status INTO l_loan_status,l_loan_chg_status;
5315 CLOSE c_loan_status;
5316 IF l_loan_status IS NOT NULL AND (l_loan_status IN ('S', 'C', 'R', 'T') OR (l_loan_status = 'A' AND NVL(l_loan_chg_status,'G') IN ('S','R'))) THEN
5317 lb_awards_locked := TRUE;
5318 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5319 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'LOAN in sent/cancelled/terminated/rejected status.cannot repackage');
5320 END IF;
5321 ELSE
5322 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5323 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'LOAN passed sent/cancelled/terminated/rejected status chk');
5324 END IF;
5325 END IF;
5326 END IF;
5327
5328 --8.PELL Grant cannot be repackage, when disbursement record is sent (only for phase-in participant)
5329 IF g_phasein_participant AND lv_fed_fund_code = 'PELL' THEN
5330 l_pell_disb_orig_stat := NULL;
5331 OPEN c_pell_disb_orig_stat(l_awds.award_id);
5332 FETCH c_pell_disb_orig_stat INTO l_pell_disb_orig_stat;
5333 CLOSE c_pell_disb_orig_stat;
5334 IF l_pell_disb_orig_stat IS NOT NULL AND l_pell_disb_orig_stat = 'S' THEN
5335 lb_awards_locked := TRUE;
5336 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5337 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'PELL Disb in sent status.cannot repackage');
5338 END IF;
5339 ELSE
5340 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5341 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'PELL passed DISB SENT chk');
5342 END IF;
5343 END IF;
5344 END IF;
5345
5346 lv_rowid := NULL;
5347 l_sl_number := NULL;
5348 IF lb_awards_locked THEN
5349 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5350 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'created locked award');
5351 END IF;
5352 igf_aw_award_t_pkg.insert_row(
5353 x_rowid => lv_rowid ,
5354 x_process_id => l_process_id ,
5355 x_sl_number => l_sl_number,
5356 x_fund_id => p_fund_id,
5357 x_base_id => p_base_id,
5358 x_offered_amt => igf_aw_coa_gen.award_amount(p_base_id,g_awd_prd,l_awds.award_id),
5359 x_accepted_amt => 0,
5360 x_paid_amt => 0,
5361 x_need_reduction_amt => NULL,
5362 x_flag => 'AL',
5363 x_temp_num_val1 => NULL,
5364 x_temp_num_val2 => NULL,
5365 x_temp_char_val1 => NULL,
5366 x_tp_cal_type => NULL,
5367 x_tp_sequence_number => NULL,
5368 x_ld_cal_type => NULL,
5369 x_ld_sequence_number => NULL,
5370 x_mode => 'R',
5371 x_adplans_id => l_awds.adplans_id,
5372 x_app_trans_num_txt => NULL,
5373 x_award_id => l_awds.award_id,
5374 x_lock_award_flag => p_lock_award_flag,
5375 x_temp_val3_num => NULL,
5376 x_temp_val4_num => NULL,
5377 x_temp_char2_txt => NULL,
5378 x_temp_char3_txt => NULL
5379 );
5380 ELSE
5381 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5382 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'created unlocked award');
5383 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'l_awds.max_award_amt:'||l_awds.max_award_amt||',l_awds.min_award_amt:'||l_awds.min_award_amt);
5384 END IF;
5385
5386 igf_aw_award_t_pkg.insert_row(
5387 x_rowid => lv_rowid ,
5388 x_process_id => l_process_id ,
5389 x_sl_number => l_sl_number,
5390 x_fund_id => p_fund_id,
5391 x_base_id => p_base_id,
5392 x_offered_amt => igf_aw_coa_gen.award_amount(p_base_id,g_awd_prd,l_awds.award_id),
5393 x_accepted_amt => 0,
5394 x_paid_amt => 0,
5395 x_need_reduction_amt => NULL,
5396 x_flag => 'AU',
5397 x_temp_num_val1 => NULL,
5398 x_temp_num_val2 => NULL,
5399 x_temp_char_val1 => p_seq_no,
5400 x_tp_cal_type => NULL,
5401 x_tp_sequence_number => NULL,
5402 x_ld_cal_type => NULL,
5403 x_ld_sequence_number => NULL,
5404 x_mode => 'R',
5405 x_adplans_id => NVL(p_adplans_id,g_plan_id),
5406 x_app_trans_num_txt => NULL,
5407 x_award_id => l_awds.award_id,
5408 x_lock_award_flag => p_lock_award_flag,
5409 x_temp_val3_num => l_awds.max_award_amt,
5410 x_temp_val4_num => l_awds.min_award_amt,
5411 x_temp_char2_txt => NULL,
5412 x_temp_char3_txt => NULL
5413 );
5414 END IF;
5415 END LOOP;
5416
5417 -- Check if there are any existing awards in locked ('AL') status
5418 OPEN c_chk_locked_award(p_fund_id, p_base_id);
5419 FETCH c_chk_locked_award INTO l_chk_locked_award;
5420 IF (c_chk_locked_award%FOUND) THEN
5421 -- There are existing locked award(s)
5422 -- Mark all existing awards as locked. Re-packaging cannot happen
5423 -- for the fund when there are any existing locked awards from that
5424 -- fund
5425 FOR l_exist_awd IN c_get_unlocked_award(p_fund_id, p_base_id)
5426 LOOP
5427 igf_aw_award_t_pkg.update_row(
5428 x_rowid => l_exist_awd.rowid,
5429 x_process_id => l_exist_awd.process_id,
5430 x_sl_number => l_exist_awd.sl_number,
5431 x_fund_id => l_exist_awd.fund_id,
5432 x_base_id => l_exist_awd.base_id,
5433 x_offered_amt => l_exist_awd.offered_amt,
5434 x_accepted_amt => l_exist_awd.accepted_amt,
5435 x_paid_amt => l_exist_awd.paid_amt,
5436 x_need_reduction_amt => l_exist_awd.need_reduction_amt,
5437 x_flag => 'AL',
5438 x_temp_num_val1 => l_exist_awd.temp_num_val1,
5439 x_temp_num_val2 => l_exist_awd.temp_num_val2,
5440 x_temp_char_val1 => l_exist_awd.temp_char_val1,
5441 x_tp_cal_type => l_exist_awd.tp_cal_type,
5442 x_tp_sequence_number => l_exist_awd.tp_sequence_number,
5443 x_ld_cal_type => l_exist_awd.ld_cal_type,
5444 x_ld_sequence_number => l_exist_awd.ld_sequence_number,
5445 x_mode => 'R',
5446 x_adplans_id => l_exist_awd.adplans_id,
5447 x_app_trans_num_txt => l_exist_awd.app_trans_num_txt,
5448 x_award_id => l_exist_awd.award_id,
5449 x_lock_award_flag => l_exist_awd.lock_award_flag,
5450 x_temp_val3_num => l_exist_awd.temp_val3_num,
5451 x_temp_val4_num => l_exist_awd.temp_val4_num,
5452 x_temp_char2_txt => l_exist_awd.temp_char2_txt,
5453 x_temp_char3_txt => l_exist_awd.temp_char3_txt
5454 );
5455 END LOOP;
5456
5457 -- Log message that all existing awards have been locked
5458 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5459 fnd_log.string(fnd_log.level_statement,
5460 'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,
5461 'Base Id: ' ||p_base_id|| ', Fund Id: ' ||p_fund_id|| '. Found an existing award that is locked. So locked all other existing awards.');
5462 END IF;
5463 END IF;
5464
5465 IF lv_fed_fund_code = 'PELL' THEN
5466 l_pell_cnt := NULL;
5467 OPEN c_pell_cnt(p_fund_id,p_base_id);
5468 FETCH c_pell_cnt INTO l_pell_cnt;
5469 CLOSE c_pell_cnt;
5470
5471 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5472 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'l_pell_cnt.cancelled_awd:'||l_pell_cnt.cancelled_awd);
5473 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'l_pell_cnt.off_acc_awd:'||l_pell_cnt.off_acc_awd);
5474 END IF;
5475
5476 IF l_pell_cnt.cancelled_awd > 0 AND l_pell_cnt.off_acc_awd = 1 THEN
5477 --logic comes in here if the student has 1 offered/accepted PELL award and multiple cancelled PELL awards
5478 --oh dear....we are into problems
5479 --update all cancelled awards to locked
5480 FOR l_lock_pell_awd IN c_lock_pell_awd(p_fund_id,p_base_id) LOOP
5481 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5482 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'locked award_id:'||l_lock_pell_awd.award_id);
5483 END IF;
5484 igf_aw_award_t_pkg.update_row(
5485 x_rowid => l_lock_pell_awd.row_id,
5486 x_process_id => l_lock_pell_awd.process_id,
5487 x_sl_number => l_lock_pell_awd.sl_number,
5488 x_fund_id => l_lock_pell_awd.fund_id,
5489 x_base_id => l_lock_pell_awd.base_id,
5490 x_offered_amt => l_lock_pell_awd.offered_amt,
5491 x_accepted_amt => l_lock_pell_awd.accepted_amt,
5492 x_paid_amt => l_lock_pell_awd.paid_amt,
5493 x_need_reduction_amt => l_lock_pell_awd.need_reduction_amt,
5494 x_flag => 'AL',
5495 x_temp_num_val1 => l_lock_pell_awd.temp_num_val1,
5496 x_temp_num_val2 => l_lock_pell_awd.temp_num_val2,
5497 x_temp_char_val1 => l_lock_pell_awd.temp_char_val1,
5498 x_tp_cal_type => l_lock_pell_awd.tp_cal_type,
5499 x_tp_sequence_number => l_lock_pell_awd.tp_sequence_number,
5500 x_ld_cal_type => l_lock_pell_awd.ld_cal_type,
5501 x_ld_sequence_number => l_lock_pell_awd.ld_sequence_number,
5502 x_mode => 'R',
5503 x_adplans_id => l_lock_pell_awd.adplans_id,
5504 x_app_trans_num_txt => l_lock_pell_awd.app_trans_num_txt,
5505 x_award_id => l_lock_pell_awd.award_id,
5506 x_lock_award_flag => l_lock_pell_awd.lock_award_flag,
5507 x_temp_val3_num => l_lock_pell_awd.temp_val3_num,
5508 x_temp_val4_num => l_lock_pell_awd.temp_val4_num,
5509 x_temp_char2_txt => l_lock_pell_awd.temp_char2_txt,
5510 x_temp_char3_txt => l_lock_pell_awd.temp_char3_txt
5511 );
5512 END LOOP;
5513 ELSIF l_pell_cnt.off_acc_awd = 0 AND l_pell_cnt.cancelled_awd > 0 THEN
5514 --logic comes in here if the student has 0 offered/accepted PELL award and multiple cancelled PELL awards
5515 --oh dear....more problems
5516 --there are PELL awards but all of them are cancelled
5517 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5518 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'all PELL awards are CANCELLED');
5519 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'update the latest PELL to re-packagable');
5520 END IF;
5521 OPEN c_latest_awd(p_fund_id,p_base_id);
5522 FETCH c_latest_awd INTO l_latest_awd;
5523 CLOSE c_latest_awd;
5524
5525 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5526 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'l_latest_awd.award_id:'||l_latest_awd.award_id);
5527 END IF;
5528
5529 FOR l_lock_pell_awd IN c_lock_pell_awd1(p_fund_id,p_base_id,l_latest_awd.award_id) LOOP
5530 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5531 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_awards.debug '|| g_req_id,'locked award_id:'||l_lock_pell_awd.award_id);
5532 END IF;
5533 igf_aw_award_t_pkg.update_row(
5534 x_rowid => l_lock_pell_awd.row_id,
5535 x_process_id => l_lock_pell_awd.process_id,
5536 x_sl_number => l_lock_pell_awd.sl_number,
5537 x_fund_id => l_lock_pell_awd.fund_id,
5538 x_base_id => l_lock_pell_awd.base_id,
5539 x_offered_amt => l_lock_pell_awd.offered_amt,
5540 x_accepted_amt => l_lock_pell_awd.accepted_amt,
5541 x_paid_amt => l_lock_pell_awd.paid_amt,
5542 x_need_reduction_amt => l_lock_pell_awd.need_reduction_amt,
5543 x_flag => 'AL',
5544 x_temp_num_val1 => l_lock_pell_awd.temp_num_val1,
5545 x_temp_num_val2 => l_lock_pell_awd.temp_num_val2,
5546 x_temp_char_val1 => l_lock_pell_awd.temp_char_val1,
5547 x_tp_cal_type => l_lock_pell_awd.tp_cal_type,
5548 x_tp_sequence_number => l_lock_pell_awd.tp_sequence_number,
5549 x_ld_cal_type => l_lock_pell_awd.ld_cal_type,
5550 x_ld_sequence_number => l_lock_pell_awd.ld_sequence_number,
5551 x_mode => 'R',
5552 x_adplans_id => l_lock_pell_awd.adplans_id,
5553 x_app_trans_num_txt => l_lock_pell_awd.app_trans_num_txt,
5554 x_award_id => l_lock_pell_awd.award_id,
5555 x_lock_award_flag => l_lock_pell_awd.lock_award_flag,
5556 x_temp_val3_num => l_lock_pell_awd.temp_val3_num,
5557 x_temp_val4_num => l_lock_pell_awd.temp_val4_num,
5558 x_temp_char2_txt => l_lock_pell_awd.temp_char2_txt,
5559 x_temp_char3_txt => l_lock_pell_awd.temp_char3_txt
5560 );
5561 END LOOP;
5562 END IF;
5563 END IF;
5564 END load_awards;
5565
5566 PROCEDURE load_funds(
5567 l_target_group IN igf_ap_fa_base_rec_all.target_group%TYPE,
5568 l_ci_cal_type IN igf_ap_fa_base_rec_all.ci_cal_type%TYPE,
5569 l_ci_sequence_number IN igf_ap_fa_base_rec_all.ci_sequence_number%TYPE,
5570 l_base_id IN igf_ap_fa_base_rec_all.base_id%TYPE,
5571 l_person_id IN igf_ap_fa_base_rec_all.person_id%TYPE
5572 ) IS
5573 /*
5574 || Created By : cdcruz
5575 || Created On : 14-NOV-2000
5576 || Purpose :
5577 || Known limitations, enhancements or remarks :
5578 || Change History :
5579 || Who WHEN What
5580 || (reverse chronological order - newest change first)
5581 || ridas 08-Feb-2006 Bug #5021084. Added new parameter 'lv_group_type' in call to igf_ap_ss_pkg.get_pid
5582 || museshad 01-Jun-2005 Build# FA157 - Bug# 4382371.
5583 || 1) Validate Program eligibility.
5584 || Check if the fund can sponsor the student's
5585 || program or not.
5586 || 2) Determine fund eligibility during Repackaging.
5587 || When an award from a fund is given to a student
5588 || during Packaging, but for some reason the student later
5589 || loses his eligibility for the fund. These awards need to
5590 || cancelled, when the student is repackaged the next time.
5591 || Implemented this functionality
5592 || veramach 30-Jun-2004 bug 3709109 - Added call to function check_disb to enforce the rule that FWS funds can
5593 || have only one disbursement per term
5594 || bkkumar 05-Apr-04 FACR116 Added the check that if the fund is of type 'ALT' then
5595 || check if the relationship code assosiated with it has a set up in the
5596 || context award year.
5597 || veramach 08-Dec-2003 FA 131 COD Updates
5598 || Added validations so that funds with no matching terms of the distribution plan and COA
5599 || for the student are not loaded
5600 || veramach 20-NOV-2003 FA 125 multiple distr methods
5601 || 1.changed cursor c_fund_ld to fetch adplans_id,
5602 || max_num_disb,min_num_disb
5603 || 2.Added validations to reject a fund if the distribution will result in
5604 || disbursements whose number is not within the max/min levels set in fund manager
5605 */
5606
5607 -- Retrieves all the funds that are part of the Formula Code in Sequence and loads the temporary table
5608 -- If this procedure being called from Single Fund, then retrive the details of fund directly.
5609 -- If not called from Single fund, then load all the funds which are linked to the given group code
5610 CURSOR c_fund_ld(
5611 x_group_code igf_aw_awd_frml_det_all.formula_code%TYPE,
5612 x_ci_cal_type igf_aw_awd_frml_det_all.ci_cal_type%TYPE,
5613 x_ci_sequence_number igf_aw_awd_frml_det_all.ci_sequence_number%TYPE
5614 ) IS
5615 SELECT fmdet.fund_id fund_id,
5616 fmast.fund_code,
5617 fmdet.seq_no seq_no,
5618 fmdet.max_award_amt max_award_amt,
5619 fmdet.min_award_amt min_award_amt,
5620 fmdet.replace_fc replace_fc,
5621 fmast.allow_overaward allow_overaward,
5622 fmast.over_award_amt over_award_amt,
5623 fmast.over_award_perct over_award_perct,
5624 fmast.available_amt available_amt,
5625 fmast.remaining_amt remaining_amt,
5626 fmast.max_num_disb max_num_disb,
5627 fmast.min_num_disb min_num_disb,
5628 fmast.donot_repkg_if_code donot_repkg_if_code,
5629 fmdet.pe_group_id pe_group_id,
5630 fmdet.adplans_id adplans_id,
5631 fmast.re_pkg_verif_flag re_pkg_verif_flag,
5632 NVL(fmdet.lock_award_flag,fmast.lock_award_flag) lock_award_flag
5633 FROM igf_aw_awd_frml_det fmdet,
5634 igf_aw_fund_mast_all fmast
5635 WHERE fmdet.formula_code = x_group_code
5636 AND fmdet.ci_cal_type = x_ci_cal_type
5637 AND fmdet.ci_sequence_number = x_ci_sequence_number
5638 AND fmdet.fund_id = fmast.fund_id
5639 AND fmast.discontinue_fund <> 'Y'
5640 AND g_sf_packaging = 'F'
5641 UNION
5642 SELECT fmast.fund_id fund_id,
5643 fmast.fund_code,
5644 1 seq_no,
5645 fmast.max_award_amt max_award_amt,
5646 fmast.min_award_amt min_award_amt,
5647 fmast.replace_fc replace_fc,
5648 fmast.allow_overaward allow_overaward,
5649 fmast.over_award_amt over_award_amt,
5650 fmast.over_award_perct over_award_perct,
5651 fmast.available_amt available_amt,
5652 fmast.remaining_amt remaining_amt,
5653 fmast.max_num_disb max_num_disb,
5654 fmast.min_num_disb min_num_disb,
5655 fmast.donot_repkg_if_code donot_repkg_if_code,
5656 0 pe_group_id,
5657 g_plan_id adplans_id,
5658 fmast.re_pkg_verif_flag re_pkg_verif_flag,
5659 NVL(g_lock_award,fmast.lock_award_flag) lock_award_flag
5660 FROM igf_aw_fund_mast_all fmast
5661 WHERE fmast.discontinue_fund <> 'Y'
5662 AND g_sf_packaging = 'T'
5663 AND fund_id = g_sf_fund
5664 ORDER BY 3;
5665
5666 l_fund_ld c_fund_ld%ROWTYPE;
5667
5668 -- Get the Over Award records from the temporary table.
5669 CURSOR c_ovr_awd( x_fund_id igf_aw_fund_mast.fund_id%TYPE ) IS
5670 SELECT row_id
5671 FROM igf_aw_award_t awdt
5672 WHERE fund_id = x_fund_id
5673 AND flag = 'OV'
5674 AND process_id = l_process_id;
5675
5676 l_ovr_awd c_ovr_awd%ROWTYPE;
5677 lv_rowid VARCHAR2(25);
5678 l_sl_number NUMBER(15);
5679 l_overaward NUMBER(12,2);
5680
5681 -- Remove the funds from the students list who does not belong to the Person ID group defined at the Traget group funds.
5682
5683 CURSOR c_rmv_funds(
5684 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
5685 cp_fund_id igf_aw_fund_mast_all.fund_id%TYPE,
5686 cp_seq_no igf_aw_awd_frml_det_all.seq_no%TYPE,
5687 cp_formula_code igf_aw_awd_frml_det_all.formula_code%TYPE,
5688 cp_ci_cal_type igf_aw_awd_frml_det_all.ci_cal_type%TYPE,
5689 cp_ci_sequence_number igf_aw_awd_frml_det_all.ci_sequence_number%TYPE
5690 ) IS
5691 SELECT fmdet.seq_no, fmdet.pe_group_id, grp.group_cd
5692 FROM igf_aw_awd_frml_det fmdet,
5693 igf_aw_fund_mast fmast,
5694 igs_pe_all_persid_group_v grp
5695 WHERE fmast.fund_id = cp_fund_id
5696 AND fmdet.fund_id = fmast.fund_id
5697 AND fmdet.seq_no = cp_seq_no
5698 AND fmdet.pe_group_id IS NOT NULL
5699 AND fmdet.pe_group_id = grp.group_id
5700 AND fmdet.formula_code = cp_formula_code
5701 AND fmdet.ci_cal_type = cp_ci_cal_type
5702 AND fmdet.ci_sequence_number = cp_ci_sequence_number;
5703
5704 lc_rmv_funds c_rmv_funds%ROWTYPE;
5705
5706 -- Variables for the dynamic person id group
5707 lv_status VARCHAR2(1);
5708 lv_sql_stmt VARCHAR(32767) ;
5709
5710 TYPE CrmvFundsCurTyp IS REF CURSOR ;
5711 c_rmv_funds_check CrmvFundsCurTyp ;
5712 lv_rmv_funds_check NUMBER(1);
5713
5714 lb_create_funds BOOLEAN;
5715 lb_elig_funds BOOLEAN;
5716 lv_message_str VARCHAR2(1000);
5717
5718 l_terms NUMBER;
5719 lv_fed_fund_code VARCHAR2(30);
5720
5721 lv_result VARCHAR2(80);
5722 lv_method_code igf_aw_awd_dist_plans.dist_plan_method_code%TYPE;
5723
5724 lv_name igf_aw_awd_dist_plans.awd_dist_plan_cd_desc%TYPE;
5725 lv_desc igf_aw_awd_dist_plans_v.dist_plan_method_code_desc%TYPE;
5726 --FACR116
5727 l_rel_code igf_sl_cl_setup.relationship_cd%TYPE;
5728 ln_person_id igf_sl_cl_pref_lenders.person_id%TYPE;
5729 l_party_id igf_sl_cl_setup.party_id%TYPE;
5730 l_alt_rel_code igf_sl_cl_setup.relationship_cd%TYPE;
5731
5732 CURSOR c_dp_ap(
5733 cp_ci_cal_type igs_ca_inst.cal_type%TYPE,
5734 cp_ci_sequence_number igs_ca_inst.sequence_number%TYPE,
5735 cp_adplans_id igf_aw_awd_dist_plans.adplans_id%TYPE,
5736 cp_award_prd_code igf_aw_awd_prd_term.award_prd_cd%TYPE
5737 ) IS
5738 SELECT 'x'
5739 FROM dual
5740 WHERE EXISTS (
5741 SELECT DISTINCT ld_cal_type,ld_sequence_number
5742 FROM igf_aw_dp_terms
5743 WHERE adplans_id = cp_adplans_id
5744
5745 MINUS
5746
5747 SELECT ld_cal_type,ld_sequence_number
5748 FROM igf_aw_awd_prd_term
5749 WHERE ci_cal_type = cp_ci_cal_type
5750 AND ci_sequence_number = cp_ci_sequence_number
5751 AND award_prd_cd = cp_award_prd_code
5752 );
5753 l_dp_ap c_dp_ap%ROWTYPE;
5754
5755 CURSOR c_other_awards(
5756 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
5757 cp_awd_prd_code igf_aw_awd_prd_term.award_prd_cd%TYPE,
5758 cp_group_code igf_aw_awd_frml_det_all.formula_code%TYPE,
5759 cp_ci_cal_type igf_aw_awd_frml_det_all.ci_cal_type%TYPE,
5760 cp_ci_sequence_number igf_aw_awd_frml_det_all.ci_sequence_number%TYPE
5761 ) IS
5762 SELECT DISTINCT fmast.fund_id,
5763 fmast.lock_award_flag,
5764 fmast.re_pkg_verif_flag,
5765 fmast.donot_repkg_if_code
5766 FROM igf_aw_award_all awd,
5767 igf_aw_fund_mast_all fmast,
5768 igf_aw_awd_disb_all disb,
5769 igf_aw_awd_prd_term aprd
5770 WHERE fmast.fund_id = awd.fund_id
5771 AND awd.base_id = cp_base_id
5772 AND awd.award_id = disb.award_id
5773 AND disb.ld_cal_type = aprd.ld_cal_type
5774 AND disb.ld_sequence_number = aprd.ld_sequence_number
5775 AND aprd.ci_cal_type = fmast.ci_cal_type
5776 AND aprd.ci_sequence_number = fmast.ci_sequence_number
5777 AND aprd.award_prd_cd = cp_awd_prd_code
5778 AND awd.fund_id NOT IN (SELECT fmdet.fund_id
5779 FROM igf_aw_awd_frml_det_all fmdet
5780 WHERE fmdet.formula_code = cp_group_code
5781 AND fmdet.ci_cal_type = cp_ci_cal_type
5782 AND fmdet.ci_sequence_number = cp_ci_sequence_number);
5783
5784 l_stud_program_cd igs_ps_ver_v.course_cd%TYPE;
5785 l_stud_program_ver igs_ps_ver_v.version_number%TYPE;
5786 l_ld_cal_type igs_ca_inst.cal_type%TYPE;
5787 l_ld_seq_num igs_ca_inst.sequence_number%TYPE;
5788
5789 -- Returns the fund source of the given fund
5790 CURSOR c_get_fund_source(
5791 cp_fund_code IGF_AW_FUND_CAT_ALL.FUND_CODE%TYPE
5792 )
5793 IS
5794 SELECT fund_source
5795 FROM IGF_AW_FUND_CAT_ALL
5796 WHERE fund_code = cp_fund_code;
5797 l_get_fund_source c_get_fund_source%ROWTYPE;
5798
5799 -- Scans the terms (starting from the earliest) in the awarding period
5800 -- for a valid key program. The first term that has a valid anticipated
5801 -- key program data is taken into consideration.
5802 CURSOR c_get_ant_prog(
5803 cp_ci_cal_type igs_ca_inst.cal_type%TYPE,
5804 cp_sequence_number igs_ca_inst.sequence_number%TYPE,
5805 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
5806 cp_awd_per igf_aw_awd_prd_term.award_prd_cd%TYPE
5807 )
5808 IS
5809 SELECT ant_data.program_cd prog,
5810 ant_data.ld_cal_type load_cal_type,
5811 ant_data.ld_sequence_number load_seq_num
5812 FROM
5813 igf_aw_awd_prd_term awd_per,
5814 igs_ca_inst_all cal_inst,
5815 igf_ap_fa_ant_data ant_data,
5816 igs_ps_ver prog
5817 WHERE
5818 awd_per.ld_cal_type = cal_inst.cal_type AND
5819 awd_per.ld_sequence_number = cal_inst.sequence_number AND
5820 ant_data.ld_cal_type = awd_per.ld_cal_type AND
5821 ant_data.ld_sequence_number = awd_per.ld_sequence_number AND
5822 awd_per.ci_cal_type = cp_ci_cal_type AND
5823 awd_per.ci_sequence_number = cp_sequence_number AND
5824 awd_per.award_prd_cd = cp_awd_per AND
5825 ant_data.base_id = cp_base_id AND
5826 ant_data.program_cd = prog.course_cd AND
5827 prog.course_status = 'ACTIVE' AND
5828 ant_data.program_cd IS NOT NULL
5829 ORDER BY get_term_start_date(cp_base_id, awd_per.ld_cal_type, awd_per.ld_sequence_number) ASC,
5830 prog.version_number DESC;
5831
5832 l_ant_prog_rec c_get_ant_prog%ROWTYPE;
5833
5834 -- Gets all the existing awards for a particular fund for a particular student
5835 CURSOR c_get_cancel_awds(
5836 cp_fund_id igf_aw_fund_mast_all.fund_id%TYPE,
5837 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
5838 cp_process_id igf_aw_award_t_all.process_id%TYPE
5839 )
5840 IS
5841 SELECT awd_t.rowid, awd_t.*
5842 FROM igf_aw_award_t_all awd_t
5843 WHERE
5844 base_id = cp_base_id AND
5845 fund_id = cp_fund_id AND
5846 process_id = cp_process_id AND
5847 flag <> 'AL';
5848
5849 -- Get Key program data from Admissions
5850 -- A student can have more than one record in Admissions. But we will
5851 -- consider only those students who have a single Admission record.
5852 -- The 'COUNT(person_id)' predicate is used to implement this
5853 CURSOR c_get_prog_frm_adm(cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE)
5854 IS
5855 SELECT adm.course_cd key_prog, adm.crv_version_number key_prog_ver
5856 FROM
5857 igs_ad_ps_appl_inst_all adm,
5858 igs_ad_ou_stat s_adm_st,
5859 igf_ap_fa_base_rec_all fabase
5860 WHERE
5861 adm.person_id = fabase.person_id AND
5862 fabase.base_id = cp_base_id AND
5863 adm.adm_outcome_status = s_adm_st.adm_outcome_status AND
5864 s_adm_st.s_adm_outcome_status IN ('OFFER', 'COND-OFFER') AND
5865 adm.course_cd IS NOT NULL AND
5866 1 = (SELECT COUNT(person_id)
5867 FROM igs_ad_ps_appl_inst_all adm1, igs_ad_ou_stat s_adm_st1
5868 WHERE
5869 adm1.person_id = adm.person_id AND
5870 adm1.adm_outcome_status = s_adm_st1.adm_outcome_status AND
5871 s_adm_st1.s_adm_outcome_status IN ('OFFER', 'COND-OFFER') AND
5872 adm1.course_cd IS NOT NULL);
5873
5874 l_adm_rec c_get_prog_frm_adm%ROWTYPE;
5875 lv_group_type igs_pe_persid_group_v.group_type%TYPE;
5876
5877 BEGIN
5878 lv_status := 'S'; -- Defaulted to 'S' and the function will return 'F' in case of failure
5879
5880 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5881 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'starting load_funds with l_target_group:'||l_target_group||' l_ci_cal_type:'||l_ci_cal_type||' l_ci_sequence_number:'||l_ci_sequence_number);
5882 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'g_sf_packaging:'||g_sf_packaging);
5883 END IF;
5884 --Load all funds INTO the temporary table with a flag of 'CF'
5885 --Indicating this is not an award
5886 OPEN c_fund_ld(
5887 l_target_group,
5888 l_ci_cal_type,
5889 l_ci_sequence_number
5890 );
5891 LOOP
5892 FETCH c_fund_ld INTO l_fund_ld;
5893 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5894 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'opened and fetched c_fund_ld');
5895 END IF;
5896 EXIT WHEN c_fund_ld%NOTFOUND;
5897
5898 lc_rmv_funds := NULL;
5899 lb_create_funds := TRUE;
5900 lb_elig_funds := TRUE;
5901
5902 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5903 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'opened c_fund_ld and it fetched l_fund_ld.fund_id:'||l_fund_ld.fund_id||' l_fund_ld.seq_no:'||l_fund_ld.seq_no||
5904 ',adplans_id:'||l_fund_ld.adplans_id);
5905 END IF;
5906 -- For packaging process check whether the student is present in the Person ID Group which is
5907 -- defined against the fund instance in the Target groups. If present load that fund else skip
5908 -- that fund instance from the target group
5909 IF g_sf_packaging = 'F' THEN
5910 OPEN c_rmv_funds(
5911 l_base_id,
5912 l_fund_ld.fund_id,
5913 l_fund_ld.seq_no,
5914 l_target_group,
5915 l_ci_cal_type,
5916 l_ci_sequence_number
5917 );
5918 FETCH c_rmv_funds INTO lc_rmv_funds;
5919
5920 IF c_rmv_funds%FOUND THEN
5921 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5922 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'c_rmv_funds%FOUND=TRUE');
5923 END IF;
5924
5925 -- To check that the person does not exist in the group
5926 -- Bug #5021084
5927 lv_sql_stmt := igf_ap_ss_pkg.get_pid(lc_rmv_funds.pe_group_id,lv_status,lv_group_type);
5928
5929 --Bug #5021084. Passing Group ID if the group type is STATIC.
5930 IF lv_group_type = 'STATIC' THEN
5931 OPEN c_rmv_funds_check FOR 'SELECT 1
5932 FROM igf_ap_fa_base_rec fabase
5933 WHERE fabase.base_id = :base_id
5934 AND fabase.person_id in ( '||lv_sql_stmt||') ' USING l_base_id, lc_rmv_funds.pe_group_id;
5935 ELSIF lv_group_type = 'DYNAMIC' THEN
5936 OPEN c_rmv_funds_check FOR 'SELECT 1
5937 FROM igf_ap_fa_base_rec fabase
5938 WHERE fabase.base_id = :base_id
5939 AND fabase.person_id in ( '||lv_sql_stmt||') ' USING l_base_id;
5940 END IF;
5941
5942 FETCH c_rmv_funds_check INTO lv_rmv_funds_check;
5943
5944 IF c_rmv_funds_check%NOTFOUND THEN
5945 lb_create_funds := FALSE;
5946 lb_elig_funds := FALSE;
5947 lv_message_str := NULL;
5948
5949 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5950 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'c_rmv_funds_check%NOTFOUND=TRUE');
5951 END IF;
5952 -- Log the message in the log file
5953 fnd_file.put_line(fnd_file.log,' ');
5954 fnd_message.set_name('IGF','IGF_AW_SKIP_REC');
5955 lv_message_str := fnd_message.get;
5956 lv_message_str := lv_message_str || l_fund_ld.fund_code || '. ';
5957
5958 fnd_message.set_name('IGF','IGF_AP_STUD_NOT_QLFY_GRP');
5959 fnd_message.set_token('GROUP',lc_rmv_funds.group_cd);
5960
5961 lv_message_str := lv_message_str || fnd_message.get;
5962 fnd_file.put_line(fnd_file.log,lv_message_str);
5963 fnd_file.put_line(fnd_file.log,' ');
5964 END IF;
5965 END IF;
5966 CLOSE c_rmv_funds;
5967
5968 END IF;
5969
5970 -- Check whether the fund can be awarded to the Person, if not skip the fund
5971 IF igf_aw_gen_005.get_stud_hold_effect( 'A', l_person_id, l_fund_ld.fund_code ) = 'F' THEN
5972 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5973 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'after c_remv_funds cursor loop,igf_aw_gen_005.get_stud_hold_effect(A,'||l_person_id||','||l_fund_ld.fund_code||'=F');
5974 END IF;
5975 fnd_message.set_name('IGF','IGF_AW_AWD_FUND_HOLD_FAIL');
5976 fnd_message.set_token('FUND',l_fund_ld.fund_code);
5977 fnd_file.put_line(fnd_file.log,fnd_message.get);
5978 lb_create_funds := FALSE;
5979 lb_elig_funds := FALSE;
5980 END IF;
5981
5982 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5983 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'l_fund_ld.adplans_id: '||l_fund_ld.adplans_id || 'g_plan_id : '||g_plan_id);
5984 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'l_fund_ld.max_num_disb: '||l_fund_ld.max_num_disb);
5985 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'l_fund_ld.min_num_disb: '||l_fund_ld.min_num_disb);
5986 END IF;
5987 igf_aw_gen_003.check_common_terms(NVL(l_fund_ld.adplans_id,g_plan_id),l_base_id,l_terms);
5988
5989 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
5990 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'l_terms:'||l_terms);
5991 END IF;
5992
5993 IF l_terms = 0 THEN
5994 /*
5995 when no common terms exist between the COA of the student and
5996 in single fund packaging, the allow_to_exceed is set to COA,
5997 then load the fund if the distribution plan is not 'Match COA'
5998 else dont load the fund
5999 */
6000 IF igf_aw_gen_003.check_coa(l_base_id) = FALSE AND g_sf_packaging = 'T' AND NVL(g_allow_to_exceed,'*') = 'COA' THEN
6001 --check the distribution type
6002 check_plan(NVL(l_fund_ld.adplans_id,g_plan_id),lv_result,lv_method_code);
6003 IF lv_result = 'TRUE' AND lv_method_code = 'C' THEN
6004 lb_create_funds := FALSE;
6005
6006 fnd_message.set_name('IGF','IGF_AW_PROC_FUND');
6007 fnd_message.set_token('FUND',l_fund_ld.fund_code);
6008 fnd_file.put_line(fnd_file.log,fnd_message.get);
6009
6010 fnd_message.set_name('IGF','IGF_AW_COA_COMMON_TERMS_FAIL');
6011 get_plan_desc(l_fund_ld.adplans_id,lv_name,lv_desc);
6012 fnd_message.set_token('PLAN_CD',lv_name);
6013 fnd_file.put_line(fnd_file.log,fnd_message.get);
6014
6015 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6016 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'not loading fund '||l_fund_ld.fund_code||' as common terms failed for the MATCH COA distribution');
6017 END IF;
6018
6019 ELSE
6020 lb_create_funds := TRUE;
6021 END IF;
6022 ELSE
6023
6024 lb_create_funds := FALSE;
6025
6026 fnd_message.set_name('IGF','IGF_AW_PROC_FUND');
6027 fnd_message.set_token('FUND',l_fund_ld.fund_code);
6028 fnd_file.put_line(fnd_file.log,fnd_message.get);
6029
6030 fnd_message.set_name('IGF','IGF_AW_COA_COMMON_TERMS_FAIL');
6031 get_plan_desc(NVL(l_fund_ld.adplans_id,g_plan_id),lv_name,lv_desc);
6032 fnd_message.set_token('PLAN_CD',lv_name);
6033 fnd_file.put_line(fnd_file.log,fnd_message.get);
6034
6035 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6036 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'not loading fund '||l_fund_ld.fund_code||' as common terms = 0');
6037 END IF;
6038
6039 END IF;
6040
6041 ELSIF l_fund_ld.max_num_disb IS NOT NULL AND l_terms > l_fund_ld.max_num_disb THEN
6042
6043 fnd_message.set_name('IGF','IGF_AW_PROC_FUND');
6044 fnd_message.set_token('FUND',l_fund_ld.fund_code);
6045 fnd_file.put_line(fnd_file.log,fnd_message.get);
6046
6047 fnd_message.set_name('IGF','IGF_AW_MAX_NUM_DISB_EXCEEDED');
6048 fnd_file.put_line(fnd_file.log,fnd_message.get);
6049 lb_create_funds := FALSE;
6050 ELSIF l_fund_ld.min_num_disb IS NOT NULL AND l_terms < l_fund_ld.min_num_disb THEN
6051
6052 fnd_message.set_name('IGF','IGF_AW_PROC_FUND');
6053 fnd_message.set_token('FUND',l_fund_ld.fund_code);
6054 fnd_file.put_line(fnd_file.log,fnd_message.get);
6055
6056 fnd_message.set_name('IGF','IGF_AW_MIN_NUM_DISB_NOT_EXCEED');
6057 fnd_file.put_line(fnd_file.log,fnd_message.get);
6058 lb_create_funds := FALSE;
6059 END IF;
6060
6061 IF l_fund_ld.max_num_disb IS NULL THEN
6062
6063 lv_fed_fund_code := get_fed_fund_code(l_fund_ld.fund_id);
6064
6065 IF lv_fed_fund_code IN ('DLP','FLP') THEN -- PLUS
6066 IF l_terms > 4 THEN
6067 fnd_message.set_name('IGF','IGF_AW_PLUS_DISB');
6068 fnd_file.put_line(fnd_file.log,fnd_message.get);
6069 lb_create_funds := FALSE;
6070 END IF;
6071
6072 ELSIF lv_fed_fund_code IN ('DLS','FLS','DLU','FLU') THEN -- S.UNS.
6073 IF l_terms > 20 THEN
6074 fnd_message.set_name('IGF','IGF_AW_SUNS_DISB');
6075 fnd_file.put_line(fnd_file.log,fnd_message.get);
6076 lb_create_funds := FALSE;
6077 END IF;
6078
6079 ELSIF lv_fed_fund_code = 'PELL' THEN
6080 --
6081 -- If the maximum disb num is not specified, for Pell it can be 90
6082 --
6083 IF l_terms > 90 THEN
6084 fnd_message.set_name('IGF','IGF_AW_PELL_DISB');
6085 fnd_file.put_line(fnd_file.log,fnd_message.get);
6086 lb_create_funds := FALSE;
6087 END IF;
6088
6089 END IF;
6090 END IF;
6091
6092 l_rel_code := NULL;
6093 ln_person_id := NULL;
6094 l_party_id := NULL;
6095 l_alt_rel_code := NULL;
6096
6097 -- FACR116
6098 IF get_fed_fund_code(l_fund_ld.fund_id) = 'ALT' THEN
6099 l_alt_rel_code := igf_sl_award.get_alt_rel_code(l_fund_ld.fund_code);
6100 -- get the rel_code assosiated with the fund_code and check if the set up is present
6101 IF l_alt_rel_code IS NULL THEN
6102 fnd_message.set_name('IGF','IGF_AW_PROC_FUND');
6103 fnd_message.set_token('FUND',l_fund_ld.fund_code);
6104 fnd_file.put_line(fnd_file.log,fnd_message.get);
6105 fnd_message.set_name('IGF','IGF_AW_NO_ALT_LOAN_CD');
6106 fnd_file.put_line(fnd_file.log,fnd_message.get);
6107 lb_create_funds := FALSE;
6108 lb_elig_funds := FALSE;
6109 ELSE
6110 -- this will ensure whether that relationship code has a set up for the context award year
6111 igf_sl_award.pick_setup(l_base_id,l_ci_cal_type,l_ci_sequence_number,l_rel_code,ln_person_id,l_party_id,l_alt_rel_code);
6112 IF l_rel_code IS NULL AND l_party_id IS NULL THEN
6113 fnd_message.set_name('IGF','IGF_AW_PROC_FUND');
6114 fnd_message.set_token('FUND',l_fund_ld.fund_code);
6115 fnd_file.put_line(fnd_file.log,fnd_message.get);
6116 fnd_message.set_name('IGF','IGF_SL_NO_ALT_SETUP');
6117 fnd_file.put_line(fnd_file.log,fnd_message.get);
6118 lb_create_funds := FALSE;
6119 lb_elig_funds := FALSE;
6120 END IF;
6121 END IF;
6122 END IF;
6123
6124 IF get_fed_fund_code(l_fund_ld.fund_id) = 'FWS' THEN
6125 IF NOT check_disb(l_base_id,NVL(l_fund_ld.adplans_id,g_plan_id),g_awd_prd) THEN
6126 fnd_message.set_name('IGF','IGF_AW_PROC_FUND');
6127 fnd_message.set_token('FUND',l_fund_ld.fund_code);
6128 fnd_file.put_line(fnd_file.log,fnd_message.get);
6129 fnd_message.set_name('IGF','IGF_SE_MAX_TP_SETUP');
6130 fnd_file.put_line(fnd_file.log,fnd_message.get);
6131 lb_create_funds := FALSE;
6132 END IF;
6133 END IF;
6134
6135 --here, we have to check if the distr plan would cause the award to span outside the current awarding period.
6136 --if yes, the whole student should be skipped.
6137 --this would happen only for packaging.
6138 --for single fund, this validation is enforced in the parameters screen itself
6139 IF g_sf_packaging = 'F' THEN
6140 OPEN c_dp_ap(l_ci_cal_type,l_ci_sequence_number,NVL(l_fund_ld.adplans_id,g_plan_id),g_awd_prd);
6141 FETCH c_dp_ap INTO l_dp_ap;
6142 IF c_dp_ap%FOUND THEN
6143 CLOSE c_dp_ap;
6144 fnd_message.set_name('IGF','IGF_AW_INV_DIST_PLAN');
6145 lv_name := NULL;
6146 lv_desc := NULL;
6147 get_plan_desc(NVL(l_fund_ld.adplans_id,g_plan_id),lv_name,lv_desc);
6148 fnd_message.set_token('DISTRPLAN',lv_name);
6149 fnd_file.put_line(fnd_file.log,fnd_message.get);
6150 RAISE INVALID_DISTR_PLAN;
6151 END IF;
6152 CLOSE c_dp_ap;
6153 END IF;
6154
6155 -- Build# FA157 - Bug# 4382371
6156 -- Validate Program Eligibility: Check if the Fund Source is eligible to
6157 -- provide aid for Student's Key Program. If not, skip the fund.
6158 -- Key program information is got by looking in this order -
6159 -- (a) Enrollment data (Actual data)
6160 -- (b) Admissions data
6161 -- (c) FA Anticipated data
6162
6163 -- (a) Get the Student's Key Program from Enrollment (Actual data)
6164 IGF_AP_GEN_001.get_key_program( cp_base_id => l_base_id,
6165 cp_course_cd => l_stud_program_cd,
6166 cp_version_number => l_stud_program_ver);
6167
6168 IF l_stud_program_cd IS NULL THEN -- Enrollment
6169
6170 -- (b) Key Prog not defined in Enrollment. Get the Student's Key Program from Admissions data
6171 OPEN c_get_prog_frm_adm(cp_base_id => l_base_id);
6172 FETCH c_get_prog_frm_adm INTO l_adm_rec;
6173
6174 IF (c_get_prog_frm_adm%FOUND) THEN
6175 l_stud_program_cd := l_adm_rec.key_prog;
6176 l_stud_program_ver := l_adm_rec.key_prog_ver;
6177
6178 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6179 fnd_log.string(fnd_log.level_statement, 'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id, 'Getting key program details from Admissions. Key program: ' ||l_stud_program_cd|| ', Version: ' ||l_stud_program_ver);
6180 END IF;
6181
6182 END IF;
6183 CLOSE c_get_prog_frm_adm;
6184
6185 IF l_stud_program_cd IS NULL THEN -- Admission
6186
6187 -- (c) Key Prog not defined in Admissions. Get the Student's Key Program from FA anticipated data
6188 -- Anticipated data is defined at the term level. But the Packaging concurrent process
6189 -- works at the awarding period level. We will consider the earliest term in the
6190 -- awarding period that has a valid anticipated key program data.
6191 -- Note, if we are getting the Key Program details from anticipated data
6192 -- the version number is not available
6193
6194 IF igf_aw_coa_gen.canUseAnticipVal THEN
6195 OPEN c_get_ant_prog (
6196 cp_ci_cal_type => l_ci_cal_type,
6197 cp_sequence_number => l_ci_sequence_number,
6198 cp_base_id => l_base_id,
6199 cp_awd_per => g_awd_prd
6200 );
6201 FETCH c_get_ant_prog INTO l_ant_prog_rec;
6202
6203 IF (c_get_ant_prog%FOUND) THEN
6204 -- Anticipated KeyProgram data found
6205 l_stud_program_cd := l_ant_prog_rec.prog;
6206 l_stud_program_ver := NULL;
6207
6208 -- Log message
6209 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6210 fnd_log.string(fnd_log.level_statement,
6211 'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,
6212 'Actual key program data not available, but found anticipated key program.');
6213 fnd_log.string(fnd_log.level_statement,
6214 'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,
6215 'Anticipated key program=' ||l_stud_program_cd|| ', Term cal type=' ||l_ant_prog_rec.load_cal_type|| ', Term sequence number=' ||l_ant_prog_rec.load_seq_num|| ', Base_id=' ||l_base_id);
6216 END IF;
6217
6218 ELSE
6219 -- Anticipated data is not avaiable, there is no way we can get the Key Program details.
6220 -- Log message and skip fund
6221 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6222 fnd_log.string(fnd_log.level_statement,
6223 'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,
6224 'Key program details are not available in both actual and anticipated data for fund: ' ||l_fund_ld.fund_code|| ', base_id ' ||l_base_id|| '. But still continue to award the student.');
6225 END IF;
6226 END IF;
6227 CLOSE c_get_ant_prog;
6228 ELSE
6229 -- Profile setting does not permit to look into anticipated data
6230 -- Log message and skip fund
6231 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6232 fnd_log.string(fnd_log.level_statement,
6233 'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,
6234 'Key program details are not available in both actual and anticipated data for fund: ' ||l_fund_ld.fund_code|| ', base_id ' ||l_base_id|| '. But still continue to award the student.');
6235 END IF;
6236 END IF; -- End igf_aw_coa_gen.canUseAnticipVal
6237 END IF; -- l_stud_program_cd IS NULL (Admissions)
6238 END IF; -- l_stud_program_cd IS NULL (Enrollment)
6239
6240 -- Get the Fund Source of the current Fund code
6241 OPEN c_get_fund_source(l_fund_ld.fund_code);
6242 FETCH c_get_fund_source INTO l_get_fund_source;
6243 CLOSE c_get_fund_source;
6244
6245 -- Check program eligibility.
6246 -- If the fund source is FEDERAL/INSTITUTIONAL/STATE
6247 -- then check if the fund is eligible to sponsor the program
6248 -- Note, for other fund sources, this check is not required
6249 IF l_get_fund_source.fund_source IN ('FEDERAL', 'INSTITUTIONAL', 'STATE') AND (l_stud_program_cd IS NOT NULL) THEN
6250 -- Log values
6251 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6252 fnd_log.string(fnd_log.level_statement, 'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id, 'Calling get_prog_elig to check the eligiblity of the program: ' ||l_stud_program_cd|| ' for the fund: ' ||l_fund_ld.fund_code);
6253 END IF;
6254
6255 IF get_prog_elig(l_stud_program_cd, l_stud_program_ver, l_get_fund_source.fund_source) THEN
6256 -- Eligible
6257 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6258 fnd_log.string(fnd_log.level_statement, 'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id, 'Fund Code: ' ||l_fund_ld.fund_code|| ' is eligible to sponsor the program: ' ||l_stud_program_cd);
6259 END IF;
6260 ELSE
6261 -- Not Eligible
6262 fnd_message.set_name('IGF','IGF_AW_FND_NOT_ELIGIBLE');
6263 fnd_message.set_token('PROGRAM',l_stud_program_cd);
6264 fnd_message.set_token('FUND',(l_fund_ld.fund_code));
6265 fnd_file.put_line(fnd_file.log,fnd_message.get);
6266 lb_create_funds := FALSE;
6267 lb_elig_funds := FALSE;
6268
6269 -- Log values
6270 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6271 fnd_log.string(fnd_log.level_statement, 'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id, 'Fund Code: ' ||l_fund_ld.fund_code|| ' is NOT eligible to sponsor the program: ' ||l_stud_program_cd);
6272 END IF;
6273 END IF;
6274 END IF;
6275
6276 -- If students passes person id group check then load the fund into temp table.
6277 -- Person id check is not necessary for single fund process
6278 IF lb_create_funds THEN
6279 -- Log values
6280 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6281 fnd_log.string(fnd_log.level_statement, 'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id, 'lb_create_funds is TRUE');
6282 END IF;
6283
6284 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6285 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'calling awardsExist with '||
6286 'p_ci_cal_type:'||l_ci_cal_type||
6287 'p_ci_sequence_number:'||l_ci_sequence_number||
6288 'p_base_id:'||l_base_id||
6289 'p_fund_id:'||l_fund_ld.fund_id||
6290 'p_awd_prd_code:'||g_awd_prd
6291 );
6292 END IF;
6293
6294 IF awardsExist(
6295 p_ci_cal_type => l_ci_cal_type,
6296 p_ci_sequence_number => l_ci_sequence_number,
6297 p_base_id => l_base_id,
6298 p_fund_id => l_fund_ld.fund_id,
6299 p_awd_prd_code => g_awd_prd
6300 ) THEN
6301 --oops.we are into repackaging
6302 --we have to load the awards into the igf_aw_award_t table
6303
6304 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6305 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'calling load_awards for fund:'||l_fund_ld.fund_id||
6306 'base_id:'||l_base_id||
6307 'seq_no:'||l_fund_ld.seq_no||
6308 'max_award_amt:'||l_fund_ld.max_award_amt||
6309 'min_award_amt:'||l_fund_ld.min_award_amt
6310 );
6311 END IF;
6312 --but first, impose repackaging rules for all awards from the fund
6313 load_awards(
6314 p_ci_cal_type => l_ci_cal_type,
6315 p_ci_sequence_number => l_ci_sequence_number,
6316 p_award_prd_code => g_awd_prd,
6317 p_base_id => l_base_id,
6318 p_fund_id => l_fund_ld.fund_id,
6319 p_lock_award_flag => l_fund_ld.lock_award_flag,
6320 p_re_pkg_verif_flag => l_fund_ld.re_pkg_verif_flag,
6321 p_donot_repkg_if_code => l_fund_ld.donot_repkg_if_code,
6322 p_adplans_id => l_fund_ld.adplans_id,
6323 p_max_award_amt => l_fund_ld.max_award_amt,
6324 p_min_award_amt => l_fund_ld.min_award_amt,
6325 p_seq_no => l_fund_ld.seq_no
6326 );
6327 ELSE
6328 lv_rowid := NULL;
6329 l_sl_number := NULL;
6330 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6331 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'inserting into igf_aw_award_t with flag:CF for fund:'||l_fund_ld.fund_id||' and base_id:'||l_base_id);
6332 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'also g_plan_id:'||g_plan_id||',l_fund_ld.fund_id:'||l_fund_ld.adplans_id);
6333 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'also l_fund_ld.max_award_amt:'||l_fund_ld.max_award_amt||',l_fund_ld.min_award_amt:'||l_fund_ld.min_award_amt);
6334 END IF;
6335
6336 igf_aw_award_t_pkg.insert_row(
6337 x_rowid => lv_rowid ,
6338 x_process_id => l_process_id ,
6339 x_sl_number => l_sl_number,
6340 x_fund_id => l_fund_ld.fund_id,
6341 x_base_id => l_base_id,
6342 x_offered_amt => 0,
6343 x_accepted_amt => 0,
6344 x_paid_amt => 0,
6345 x_need_reduction_amt => NULL,
6346 x_flag => 'CF',
6347 x_temp_num_val1 => NULL,
6348 x_temp_num_val2 => NULL,
6349 x_temp_char_val1 => TO_CHAR(l_fund_ld.seq_no),
6350 x_tp_cal_type => NULL,
6351 x_tp_sequence_number => NULL,
6352 x_ld_cal_type => NULL,
6353 x_ld_sequence_number => NULL,
6354 x_mode => 'R',
6355 x_adplans_id => NVL(l_fund_ld.adplans_id,g_plan_id),
6356 x_app_trans_num_txt => NULL,
6357 x_award_id => NULL,
6358 x_lock_award_flag => l_fund_ld.lock_award_flag,
6359 x_temp_val3_num => l_fund_ld.max_award_amt,
6360 x_temp_val4_num => l_fund_ld.min_award_amt,
6361 x_temp_char2_txt => NULL,
6362 x_temp_char3_txt => NULL
6363 );
6364 END IF;
6365
6366 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6367 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'opening c_ovr_awd');
6368 END IF;
6369 -- If OverAward is allowed for a fund, maintain overaward details in the Temporary table ( with flag 'OV' )
6370 -- This record will be inserted only once for the fund irrespective of students and the
6371 -- remaining total will be decreasing for every award created
6372 OPEN c_ovr_awd( l_fund_ld.fund_id );
6373 FETCH c_ovr_awd INTO l_ovr_awd;
6374
6375 IF ( c_ovr_awd%NOTFOUND ) THEN
6376 l_overaward := 0;
6377
6378 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6379 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'c_ovr_awd%NOTFOUND!l_overaward:'||l_overaward);
6380 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'l_fund_ld.allow_overaward:'||l_fund_ld.allow_overaward);
6381 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'l_fund_ld.over_award_amt:'||l_fund_ld.over_award_amt);
6382 END IF;
6383
6384 IF ( l_fund_ld.allow_overaward = 'Y' ) THEN
6385
6386 IF NVL(l_fund_ld.over_award_amt,0) > 0 THEN
6387 l_overaward := l_fund_ld.over_award_amt;
6388
6389 ELSIF NVL(l_fund_ld.over_award_perct,0) > 0 THEN
6390 l_overaward := ( l_fund_ld.available_amt * l_fund_ld.over_award_perct/100 );
6391 END IF;
6392
6393 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6394 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'set l_overaward to '||l_overaward);
6395 END IF;
6396
6397 END IF;
6398 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6399 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'inserting into igf_aw_award_t with flag:OV for fund:'||l_fund_ld.fund_id||' and base_id:'||l_base_id);
6400 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'l_fund_ld.remaining_amt:'||l_fund_ld.remaining_amt);
6401 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'l_overaward:'||l_overaward);
6402 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'adplans_id:'||NVL(l_fund_ld.adplans_id,g_plan_id));
6403 END IF;
6404 igf_aw_award_t_pkg.insert_row(
6405 x_rowid => lv_rowid ,
6406 x_process_id => l_process_id ,
6407 x_sl_number => l_sl_number,
6408 x_fund_id => l_fund_ld.fund_id,
6409 x_base_id => l_base_id,
6410 x_offered_amt => 0 ,
6411 x_accepted_amt => 0 ,
6412 x_paid_amt => 0 ,
6413 x_need_reduction_amt => NULL,
6414 x_flag => 'OV',
6415 x_temp_num_val1 => l_fund_ld.remaining_amt,
6416 x_temp_num_val2 => l_overaward,
6417 x_temp_char_val1 => NULL,
6418 x_tp_cal_type => NULL,
6419 x_tp_sequence_number => NULL,
6420 x_ld_cal_type => NULL,
6421 x_ld_sequence_number => NULL,
6422 x_mode => 'R',
6423 x_adplans_id => NULL,
6424 x_app_trans_num_txt => NULL,
6425 x_lock_award_flag => NULL,
6426 x_temp_val3_num => NULL,
6427 x_temp_val4_num => NULL,
6428 x_temp_char2_txt => NULL,
6429 x_temp_char3_txt => NULL
6430 );
6431
6432 END IF;
6433 CLOSE c_ovr_awd;
6434
6435 ELSE
6436 -- museshad (Build# FA 157): This ELSE part holds good only for Repackaging.
6437 -- This part comes into context when an award from a fund was given to a
6438 -- student during Packaging, but for some reason the student later
6439 -- lost his eligibility for the fund. In such cases, we need to cancel
6440 -- the award that was given to the student earlier during Packaging.
6441
6442 -- Check if Repackaging
6443 IF awardsExist(
6444 p_ci_cal_type => l_ci_cal_type,
6445 p_ci_sequence_number => l_ci_sequence_number,
6446 p_base_id => l_base_id,
6447 p_fund_id => l_fund_ld.fund_id,
6448 p_awd_prd_code => g_awd_prd
6449 ) THEN
6450
6451 IF NOT lb_elig_funds THEN
6452
6453 -- Log Values
6454 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6455 fnd_log.string(fnd_log.level_statement,
6456 'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,
6457 'Both lb_create_funds and lb_elig_funds are FALSE. Base id: ' ||l_base_id|| ' is not eligible for fund: ' ||l_fund_ld.fund_id|| '. Cancelling all existing awards.');
6458 END IF;
6459
6460 -- Student not eligible for fund. Load existing awards given to the
6461 -- student from the fund
6462 load_awards(
6463 p_ci_cal_type => l_ci_cal_type,
6464 p_ci_sequence_number => l_ci_sequence_number,
6465 p_award_prd_code => g_awd_prd,
6466 p_base_id => l_base_id,
6467 p_fund_id => l_fund_ld.fund_id,
6468 p_lock_award_flag => l_fund_ld.lock_award_flag,
6469 p_re_pkg_verif_flag => l_fund_ld.re_pkg_verif_flag,
6470 p_donot_repkg_if_code => l_fund_ld.donot_repkg_if_code,
6471 p_adplans_id => l_fund_ld.adplans_id,
6472 p_max_award_amt => l_fund_ld.max_award_amt,
6473 p_min_award_amt => l_fund_ld.min_award_amt,
6474 p_seq_no => l_fund_ld.seq_no
6475 );
6476
6477 -- Loop thru each existing award and cancel it
6478 FOR l_cancel_awd_rec IN c_get_cancel_awds(cp_fund_id => l_fund_ld.fund_id,
6479 cp_base_id => l_base_id,
6480 cp_process_id => l_process_id)
6481 LOOP
6482 -- Cancel awards
6483 igf_aw_award_t_pkg.update_row(
6484 x_rowid => l_cancel_awd_rec.rowid,
6485 x_process_id => l_cancel_awd_rec.process_id,
6486 x_sl_number => l_cancel_awd_rec.sl_number,
6487 x_fund_id => l_cancel_awd_rec.fund_id,
6488 x_base_id => l_cancel_awd_rec.base_id,
6489 x_offered_amt => 0,
6490 x_accepted_amt => l_cancel_awd_rec.accepted_amt,
6491 x_paid_amt => l_cancel_awd_rec.paid_amt,
6492 x_need_reduction_amt => l_cancel_awd_rec.need_reduction_amt,
6493 x_flag => 'AC',
6494 x_temp_num_val1 => 0,
6495 x_temp_num_val2 => l_cancel_awd_rec.temp_num_val2,
6496 x_temp_char_val1 => l_cancel_awd_rec.temp_char_val1,
6497 x_tp_cal_type => l_cancel_awd_rec.tp_cal_type,
6498 x_tp_sequence_number => l_cancel_awd_rec.tp_sequence_number,
6499 x_ld_cal_type => l_cancel_awd_rec.ld_cal_type,
6500 x_ld_sequence_number => l_cancel_awd_rec.ld_sequence_number,
6501 x_mode => 'R',
6502 x_adplans_id => l_cancel_awd_rec.adplans_id,
6503 x_app_trans_num_txt => l_cancel_awd_rec.app_trans_num_txt,
6504 x_award_id => l_cancel_awd_rec.award_id,
6505 x_lock_award_flag => l_cancel_awd_rec.lock_award_flag,
6506 x_temp_val3_num => l_cancel_awd_rec.temp_val3_num,
6507 x_temp_val4_num => l_cancel_awd_rec.temp_val4_num,
6508 x_temp_char2_txt => l_cancel_awd_rec.temp_char2_txt,
6509 x_temp_char3_txt => l_cancel_awd_rec.temp_char3_txt
6510 );
6511 -- Log values
6512 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6513 fnd_log.string(fnd_log.level_statement,
6514 'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,
6515 'Cancelled award id: ' ||l_cancel_awd_rec.award_id|| ' for fund: ' ||l_cancel_awd_rec.fund_id|| ' and base_id: ' ||l_cancel_awd_rec.base_id);
6516 END IF;
6517 END LOOP;
6518 END IF; -- End lb_elig_funds
6519 END IF; -- End awardsExist
6520 END IF; -- End OV loading funds
6521
6522 END LOOP;
6523 CLOSE c_fund_ld;
6524
6525 IF g_sf_packaging <> 'T' THEN
6526 --load awards from funds which are not in the award group also
6527 FOR l_other_awards IN c_other_awards(l_base_id,g_awd_prd,l_target_group,l_ci_cal_type,l_ci_sequence_number) LOOP
6528 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6529 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'calling load_awards with fund_id:'||l_other_awards.fund_id);
6530 END IF;
6531
6532 load_awards(
6533 p_ci_cal_type => l_ci_cal_type,
6534 p_ci_sequence_number => l_ci_sequence_number,
6535 p_award_prd_code => g_awd_prd,
6536 p_base_id => l_base_id,
6537 p_fund_id => l_other_awards.fund_id,
6538 p_lock_award_flag => l_other_awards.lock_award_flag,
6539 p_re_pkg_verif_flag => l_other_awards.re_pkg_verif_flag,
6540 p_donot_repkg_if_code => l_other_awards.donot_repkg_if_code,
6541 p_adplans_id => g_plan_id,
6542 p_max_award_amt => NULL,
6543 p_min_award_amt => NULL,
6544 p_seq_no => NULL
6545 );
6546 END LOOP;
6547
6548 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6549 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.load_funds.debug '|| g_req_id,'calling merge_funds');
6550 END IF;
6551 --call merge_funds only if running in re-packaging mode
6552 merge_funds(
6553 l_target_group,
6554 l_ci_cal_type,
6555 l_ci_sequence_number,
6556 l_base_id
6557 );
6558 END IF;
6559
6560 EXCEPTION
6561 WHEN INVALID_DISTR_PLAN THEN
6562 IF c_fund_ld%ISOPEN THEN
6563 CLOSE c_fund_ld;
6564 END IF;
6565 RAISE;
6566 WHEN NON_MERGABLE_FUNDS THEN
6567 RAISE;
6568 WHEN OTHERS THEN
6569
6570 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
6571 fnd_message.set_token('NAME','IGF_AW_PACKAGING.LOAD_FUNDS '||SQLERRM);
6572 igs_ge_msg_stack.add;
6573 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
6574 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.load_funds.exception '|| g_req_id,'sql error message: '||SQLERRM);
6575 END IF;
6576 app_exception.raise_exception;
6577 END load_funds;
6578
6579
6580 PROCEDURE excl_incl_check(
6581 l_process_no IN NUMBER,
6582 l_base_id IN NUMBER,
6583 l_run_mode IN VARCHAR2
6584 ) IS
6585 /*
6586 || Created By : avenkatr
6587 || Created On : 08-JUN-2001
6588 || Purpose : This procedure checks for Exclusive and Inclusive fund cheks for already loaded
6589 || Funds in the temp table. There are two cycles of checking as
6590 || Known limitations, enhancements or remarks :
6591 || Change History :
6592 || Who WHEN What
6593 || (reverse chronological order - newest change first)
6594 || veramach 04-Mar-2004 bug # 3484438 - Changed cursor cur_new_awards to properly join on igf_aw_fund_mast_all
6595 || veramach 20-NOV-2003 FA 125 - Modified cur_new_awards to use adplans_id instead of fund_id
6596 */
6597
6598 -- Get all the funds which were rejected earlier for reconsidering
6599 CURSOR c_init_flag(
6600 x_process_is NUMBER,
6601 x_base_id igf_ap_fa_base_rec.base_id%TYPE
6602 ) IS
6603 SELECT *
6604 FROM igf_aw_award_t
6605 WHERE process_id = x_process_is
6606 AND base_id = x_base_id
6607 AND flag IN ('RF','AR');
6608
6609 l_init_flag c_init_flag%ROWTYPE;
6610
6611 -- Get all the Active funds from Temp table for checking Inclusive and Exclusive
6612 CURSOR c_fund_chk(
6613 x_process_id NUMBER,
6614 x_base_id NUMBER
6615 ) IS
6616 SELECT awdt.*
6617 FROM igf_aw_award_t awdt
6618 WHERE awdt.process_id = x_process_id
6619 AND awdt.base_id = x_base_id
6620 AND awdt.flag IN ('CF','AU')
6621 ORDER BY TO_NUMBER(awdt.temp_char_val1); -- Sequence order of the fund in Temp table
6622
6623 l_fund_chk c_fund_chk%ROWTYPE;
6624
6625 -- Get all the Exclusive funds for a given fund
6626 CURSOR c_fund_ex (x_fund_id igf_aw_fund_excl.fund_id%TYPE ) IS
6627 SELECT fexc.fund_code
6628 FROM igf_aw_fund_excl fexc
6629 WHERE fexc.fund_id = x_fund_id;
6630
6631 l_fund_ex c_fund_ex%ROWTYPE;
6632
6633 -- Get all the Inclusive funds for a given fund
6634 CURSOR c_fund_in (x_fund_id igf_aw_fund_incl.fund_id%TYPE ) IS
6635 SELECT finc.fund_code
6636 FROM igf_aw_fund_incl finc
6637 WHERE finc.fund_id = x_fund_id;
6638
6639 l_fund_in c_fund_in%ROWTYPE;
6640
6641 -- Get the count of all the funds from the Temp Table for a given fund code and base_id
6642 -- Here the checking for the fund for the same TERMs occurances
6643 CURSOR cur_new_awards(
6644 x_fund_code igf_aw_fund_cat.fund_code%TYPE,
6645 x_base_id igf_aw_award_t.base_id%TYPE,
6646 x_process_id igf_aw_award_t.base_id%TYPE,
6647 x_award_prd_code igf_aw_awd_prd_term.award_prd_cd%TYPE
6648 ) IS
6649 SELECT COUNT(awdt.fund_id) ftotal
6650 FROM igf_aw_award_t awdt,
6651 igf_aw_fund_mast_all fmast,
6652 igf_aw_dp_terms adterms,
6653 igf_aw_awd_prd_term aprd
6654 WHERE fmast.fund_code = x_fund_code
6655 AND awdt.base_id = x_base_id
6656 AND awdt.process_id = x_process_id
6657 AND awdt.fund_id = fmast.fund_id
6658 AND awdt.flag = 'CF'
6659 AND awdt.adplans_id = adterms.adplans_id
6660 AND aprd.ld_cal_type = adterms.ld_cal_type
6661 AND aprd.ld_sequence_number = adterms.ld_sequence_number
6662 AND aprd.award_prd_cd = x_award_prd_code
6663 AND aprd.ci_cal_type = fmast.ci_cal_type
6664 AND aprd.ci_sequence_number = fmast.ci_sequence_number;
6665
6666 new_awards_rec cur_new_awards%ROWTYPE;
6667
6668 -- Get the count of the Active Awards of the student for a given fund
6669
6670 CURSOR cur_prior_awards(
6671 x_fund_code igf_aw_fund_cat.fund_code%TYPE,
6672 x_base_id igf_aw_award_t.base_id%TYPE,
6673 x_award_prd_code igf_aw_awd_prd_term.award_prd_cd%TYPE
6674 ) IS
6675 SELECT COUNT(fmast.fund_code) ftotal
6676 FROM igf_aw_award_all awd,
6677 igf_aw_awd_disb_all disb,
6678 igf_aw_fund_mast_all fmast,
6679 igf_aw_awd_prd_term aprd
6680 WHERE fmast.fund_code = x_fund_code
6681 AND awd.base_id = x_base_id
6682 AND awd.fund_id = fmast.fund_id
6683 AND awd.award_id = disb.award_id
6684 AND disb.ld_cal_type = aprd.ld_cal_type
6685 AND disb.ld_sequence_number = aprd.ld_sequence_number
6686 AND aprd.award_prd_cd = x_award_prd_code
6687 AND aprd.ci_cal_type = fmast.ci_cal_type
6688 AND aprd.ci_sequence_number = fmast.ci_sequence_number
6689 AND awd.award_status IN ('OFFERED','ACCEPTED')
6690 AND disb.trans_type <> 'C';
6691
6692 prior_awards_rec cur_prior_awards%ROWTYPE;
6693
6694 CURSOR c_fund_cd(cp_fund_id igf_aw_fund_mast.fund_id%TYPE) IS
6695 SELECT fund_code
6696 FROM igf_aw_fund_mast
6697 WHERE fund_id = cp_fund_id;
6698
6699 l_fund_cd c_fund_cd%ROWTYPE;
6700
6701 l_flag igf_aw_award_t.flag%TYPE;
6702 BEGIN
6703
6704 -- Initialise the previously rejected funds back so that they too are considered
6705 OPEN c_init_flag( l_process_id, l_base_id );
6706 LOOP
6707 FETCH c_init_flag INTO l_init_flag;
6708 EXIT WHEN c_init_flag%NOTFOUND;
6709
6710 -- Log messages if the selected parameter is 'Detail Mode'
6711 IF ( l_run_mode = 'D' ) THEN
6712
6713 OPEN c_fund_cd(l_init_flag.fund_id);
6714 FETCH c_fund_cd INTO l_fund_cd;
6715 CLOSE c_fund_cd;
6716
6717 fnd_message.set_name('IGF','IGF_AW_RECONSIDER_FUND');
6718 fnd_message.set_token('FUND', l_fund_cd.fund_code );
6719 fnd_file.put_line(fnd_file.log,fnd_message.get);
6720 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6721 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.excl_incl_check.debug '|| g_req_id,'c_fund_cd%FOUND - reconsidering fund:'||l_fund_cd.fund_code);
6722 END IF;
6723 END IF;
6724
6725 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6726 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.excl_incl_check.debug '|| g_req_id,'updating igf_aw_award_t for fund_id:'||l_init_flag.fund_id||' with flag:CF,adplans_id:'||l_init_flag.adplans_id);
6727 END IF;
6728 /*
6729 If the record was a rejected fund, make it a considered fund.
6730 If the record was a rejected award, make it a repackagable candidate.
6731 */
6732 l_flag := NULL;
6733 IF l_init_flag.flag = 'RF' THEN
6734 l_flag := 'CF';
6735 ELSIF l_init_flag.flag = 'AR' THEN
6736 l_flag := 'AU';
6737 END IF;
6738
6739 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6740 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.excl_incl_check.debug '|| g_req_id,'updating fund_id:'|| l_init_flag.fund_id||
6741 ' base_id:'||l_init_flag.base_id||' to flag:'||l_flag
6742 );
6743 END IF;
6744
6745 igf_aw_award_t_pkg.update_row(
6746 x_rowid => l_init_flag.row_id,
6747 x_process_id => l_init_flag.process_id,
6748 x_sl_number => l_init_flag.sl_number,
6749 x_fund_id => l_init_flag.fund_id,
6750 x_base_id => l_init_flag.base_id,
6751 x_offered_amt => l_init_flag.offered_amt,
6752 x_accepted_amt => l_init_flag.accepted_amt,
6753 x_paid_amt => l_init_flag.paid_amt ,
6754 x_need_reduction_amt => l_init_flag.need_reduction_amt,
6755 x_flag => l_flag,
6756 x_temp_num_val1 => l_init_flag.temp_num_val1,
6757 x_temp_num_val2 => l_init_flag.temp_num_val2,
6758 x_temp_char_val1 => l_init_flag.temp_char_val1,
6759 x_tp_cal_type => l_init_flag.tp_cal_type,
6760 x_tp_sequence_number => l_init_flag.tp_sequence_number,
6761 x_ld_cal_type => l_init_flag.ld_cal_type,
6762 x_ld_sequence_number => l_init_flag.ld_sequence_number,
6763 x_mode => 'R',
6764 x_adplans_id => l_init_flag.adplans_id,
6765 x_app_trans_num_txt => l_init_flag.app_trans_num_txt,
6766 x_award_id => l_init_flag.award_id,
6767 x_lock_award_flag => l_init_flag.lock_award_flag,
6768 x_temp_val3_num => l_init_flag.temp_val3_num,
6769 x_temp_val4_num => l_init_flag.temp_val4_num,
6770 x_temp_char2_txt => l_init_flag.temp_char2_txt,
6771 x_temp_char3_txt => l_init_flag.temp_char3_txt
6772 );
6773 END LOOP;
6774 CLOSE c_init_flag;
6775
6776 -- Execute the below loop for two time, bcoz some funds might funds get excluded / included in first cycle
6777 -- These needs to re checked for the second time for perfect match
6778 FOR i IN 1..2 LOOP
6779
6780 --Excl/Incl Fund check first cycle
6781 OPEN c_fund_chk( l_process_id, l_base_id);
6782 LOOP
6783 FETCH c_fund_chk INTO l_fund_chk;
6784 EXIT WHEN c_fund_chk%NOTFOUND;
6785
6786 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6787 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.excl_incl_check.debug '|| g_req_id,'fetched c_fund_chk: it fetched l_fund_chk.fund_id:'||l_fund_chk.fund_id);
6788 END IF;
6789
6790
6791 --Check for exclusive funds
6792 OPEN c_fund_ex ( l_fund_chk.fund_id );
6793 LOOP
6794 FETCH c_fund_ex INTO l_fund_ex;
6795 EXIT WHEN c_fund_ex%NOTFOUND;
6796
6797 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6798 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.excl_incl_check.debug '|| g_req_id,'fetched c_fund_ex:it fetched l_fund_ex.fund_code:'||l_fund_ex.fund_code);
6799 END IF;
6800 -- Get the count of Exclusive funds whihc are already loaded INTO the Temp Table
6801 OPEN cur_new_awards(
6802 l_fund_ex.fund_code,
6803 l_base_id,
6804 l_process_id,
6805 g_awd_prd
6806 );
6807 FETCH cur_new_awards INTO new_awards_rec;
6808 CLOSE cur_new_awards;
6809
6810 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6811 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.excl_incl_check.debug '|| g_req_id,'new_awards_rec.ftotal:'||new_awards_rec.ftotal);
6812 END IF;
6813
6814 -- Get the count of Awards which were awarded to the student from the Exclusive fund
6815 OPEN cur_prior_awards(l_fund_ex.fund_code, l_base_id,g_awd_prd);
6816 FETCH cur_prior_awards INTO prior_awards_rec;
6817 CLOSE cur_prior_awards;
6818
6819 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6820 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.excl_incl_check.debug '|| g_req_id,'prior_awards_rec.ftotal:'||prior_awards_rec.ftotal);
6821 END IF;
6822
6823 -- If the Exclusive fund is already loaded INTO the Temp table or
6824 -- If the student gets any awards from the Exclusive funds then skip the fund.
6825 IF new_awards_rec.ftotal >= 1 OR prior_awards_rec.ftotal >= 1 THEN
6826
6827 IF ( l_run_mode = 'D' ) THEN
6828 OPEN c_fund_cd(l_fund_chk.fund_id);
6829 FETCH c_fund_cd INTO l_fund_cd;
6830 CLOSE c_fund_cd;
6831
6832 fnd_message.set_name('IGF','IGF_AW_PK_EX_FND_FAIL');
6833 fnd_message.set_token('FUND', l_fund_cd.fund_code );
6834 fnd_file.put_line(fnd_file.log,fnd_message.get);
6835 END IF;
6836
6837 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6838 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.excl_incl_check.debug '|| g_req_id,'updating igf_aw_award_t for fund_id:'||l_fund_chk.fund_id||' with flag:RF,adplans_id:'||l_fund_chk.adplans_id);
6839 END IF;
6840
6841 -- Update the Fund status as 'REJECTED' in the Temp Table.
6842 -- This can used while reconsidering later in different Incl or Excl CHECK
6843 /*
6844 If the record was a rejected fund, make it a considered fund.
6845 If the record was a rejected award, make it a repackagable candidate.
6846 */
6847 l_flag := NULL;
6848 IF l_fund_chk.flag = 'CF' THEN
6849 l_flag := 'RF';
6850 ELSIF l_fund_chk.flag = 'AU' THEN
6851 l_flag := 'AR';
6852 END IF;
6853
6854 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6855 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.excl_incl_check.debug '|| g_req_id,'updating fund_id:'|| l_fund_chk.fund_id||
6856 ' base_id:'||l_fund_chk.base_id||' to flag:'||l_flag
6857 );
6858 END IF;
6859
6860 igf_aw_award_t_pkg.update_row(
6861 x_rowid => l_fund_chk.row_id,
6862 x_process_id => l_fund_chk.process_id,
6863 x_sl_number => l_fund_chk.sl_number,
6864 x_fund_id => l_fund_chk.fund_id,
6865 x_base_id => l_fund_chk.base_id,
6866 x_offered_amt => l_fund_chk.offered_amt,
6867 x_accepted_amt => l_fund_chk.accepted_amt,
6868 x_paid_amt => l_fund_chk.paid_amt ,
6869 x_need_reduction_amt => l_fund_chk.need_reduction_amt,
6870 x_flag => l_flag,
6871 x_temp_num_val1 => l_fund_chk.temp_num_val1,
6872 x_temp_num_val2 => l_fund_chk.temp_num_val2,
6873 x_temp_char_val1 => l_fund_chk.temp_char_val1,
6874 x_tp_cal_type => l_fund_chk.tp_cal_type,
6875 x_tp_sequence_number => l_fund_chk.tp_sequence_number,
6876 x_ld_cal_type => l_fund_chk.ld_cal_type,
6877 x_ld_sequence_number => l_fund_chk.ld_sequence_number,
6878 x_mode => 'R',
6879 x_adplans_id => l_fund_chk.adplans_id,
6880 x_app_trans_num_txt => l_fund_chk.app_trans_num_txt,
6881 x_award_id => l_fund_chk.award_id,
6882 x_lock_award_flag => l_fund_chk.lock_award_flag,
6883 x_temp_val3_num => l_fund_chk.temp_val3_num,
6884 x_temp_val4_num => l_fund_chk.temp_val4_num,
6885 x_temp_char2_txt => l_fund_chk.temp_char2_txt,
6886 x_temp_char3_txt => l_fund_chk.temp_char3_txt
6887 );
6888 END IF;
6889 END LOOP; -- c_fund_exc loop
6890 CLOSE c_fund_ex;
6891
6892 -- Check for Inclusive Fund
6893 OPEN c_fund_in ( l_fund_chk.fund_id );
6894 LOOP
6895 FETCH c_fund_in INTO l_fund_in;
6896 EXIT WHEN c_fund_in%NOTFOUND;
6897
6898 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6899 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.excl_incl_check.debug '|| g_req_id,'fetched c_fund_in:it fetched l_fund_in.fund_code:'||l_fund_in.fund_code);
6900 END IF;
6901
6902 -- Get the count of Inclusive funds whihc are already loaded INTO the Temp Table
6903 OPEN cur_new_awards(
6904 l_fund_in.fund_code,
6905 l_base_id,
6906 l_process_id,
6907 g_awd_prd
6908 );
6909 FETCH cur_new_awards INTO new_awards_rec;
6910 CLOSE cur_new_awards;
6911
6912 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6913 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.excl_incl_check.debug '|| g_req_id,'new_awards_rec.ftotal:'||new_awards_rec.ftotal);
6914 END IF;
6915
6916 -- Get the count of Awards which were awarded to the student from the Inclusive fund
6917 OPEN cur_prior_awards(l_fund_in.fund_code, l_base_id,g_awd_prd);
6918 FETCH cur_prior_awards INTO prior_awards_rec;
6919 CLOSE cur_prior_awards;
6920
6921 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6922 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.excl_incl_check.debug '|| g_req_id,'prior_awards_rec.ftotal:'||prior_awards_rec.ftotal);
6923 END IF;
6924
6925 -- If the Inclusive fund was not already loaded INTO the Temp table or
6926 -- If the student is not having any awards from the Inclusive funds then skip the fund.
6927 IF NVL(new_awards_rec.ftotal,0) + NVL(prior_awards_rec.ftotal,0) < 1 THEN
6928
6929 IF ( l_run_mode = 'D' ) THEN
6930 OPEN c_fund_cd(l_fund_chk.fund_id);
6931 FETCH c_fund_cd INTO l_fund_cd;
6932 CLOSE c_fund_cd;
6933
6934 fnd_message.set_name('IGF','IGF_AW_PK_IN_FND_FAIL');
6935 fnd_message.set_token('FUND', l_fund_cd.fund_code );
6936 fnd_file.put_line(fnd_file.log,fnd_message.get);
6937 END IF;
6938
6939 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6940 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.excl_incl_check.debug '|| g_req_id,'updating igf_aw_award_t for fund_id:'||l_fund_chk.fund_id||' with flag:RF');
6941 END IF;
6942
6943 -- Update the Fund status as 'REJECTED' in the Temp Table.
6944 -- This can used while reconsidering later in different Incl or Excl CHECK
6945 /*
6946 If the record was a rejected fund, make it a considered fund.
6947 If the record was a rejected award, make it a repackagable candidate.
6948 */
6949 l_flag := NULL;
6950 IF l_fund_chk.flag = 'CF' THEN
6951 l_flag := 'RF';
6952 ELSIF l_fund_chk.flag = 'AU' THEN
6953 l_flag := 'AR';
6954 END IF;
6955
6956 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
6957 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.excl_incl_check.debug '|| g_req_id,'updating fund_id:'|| l_fund_chk.fund_id||
6958 ' base_id:'||l_fund_chk.base_id||' to flag:'||l_flag
6959 );
6960 END IF;
6961
6962 igf_aw_award_t_pkg.update_row(
6963 x_rowid => l_fund_chk.row_id,
6964 x_process_id => l_fund_chk.process_id,
6965 x_sl_number => l_fund_chk.sl_number,
6966 x_fund_id => l_fund_chk.fund_id,
6967 x_base_id => l_fund_chk.base_id,
6968 x_offered_amt => l_fund_chk.offered_amt,
6969 x_accepted_amt => l_fund_chk.accepted_amt,
6970 x_paid_amt => l_fund_chk.paid_amt ,
6971 x_need_reduction_amt => l_fund_chk.need_reduction_amt,
6972 x_flag => l_flag,
6973 x_temp_num_val1 => l_fund_chk.temp_num_val1,
6974 x_temp_num_val2 => l_fund_chk.temp_num_val2,
6975 x_temp_char_val1 => l_fund_chk.temp_char_val1,
6976 x_tp_cal_type => l_fund_chk.tp_cal_type,
6977 x_tp_sequence_number => l_fund_chk.tp_sequence_number,
6978 x_ld_cal_type => l_fund_chk.ld_cal_type,
6979 x_ld_sequence_number => l_fund_chk.ld_sequence_number,
6980 x_mode => 'R',
6981 x_adplans_id => l_fund_chk.adplans_id,
6982 x_app_trans_num_txt => l_fund_chk.app_trans_num_txt,
6983 x_award_id => l_fund_chk.award_id,
6984 x_lock_award_flag => l_fund_chk.lock_award_flag,
6985 x_temp_val3_num => l_fund_chk.temp_val3_num,
6986 x_temp_val4_num => l_fund_chk.temp_val4_num,
6987 x_temp_char2_txt => l_fund_chk.temp_char2_txt,
6988 x_temp_char3_txt => l_fund_chk.temp_char3_txt
6989 );
6990 END IF;
6991 END LOOP; -- c_fund_incl loop
6992 CLOSE c_fund_in;
6993
6994 END LOOP;
6995 CLOSE c_fund_chk;
6996
6997 END LOOP; -- End of Looping cycle ( 2 times )
6998
6999 EXCEPTION
7000 WHEN OTHERS THEN
7001 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
7002 fnd_message.set_token('NAME','IGF_AW_PACKAGING.EXCL_INCL_CHECK '||SQLERRM);
7003 igs_ge_msg_stack.add;
7004 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
7005 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.excl_incl_check.exception '|| g_req_id,'sql error message: '||SQLERRM);
7006 END IF;
7007 app_exception.raise_exception;
7008 END excl_incl_check;
7009
7010
7011 PROCEDURE calc_need(
7012 p_base_id IN NUMBER,
7013 p_coa_f IN igf_ap_fa_base_rec.coa_f%TYPE,
7014 p_awds IN OUT NOCOPY std_awards
7015 ) IS
7016 /*
7017 || Created By : skoppula
7018 || Created On : 02-JAN-2002
7019 || Purpose :
7020 || Known limitations, enhancements or remarks :
7021 || Change History :
7022 || Who WHEN What
7023 || (reverse chronological order - newest change first)
7024 --veramach 20-NOV-2003 FA 125 Build -Removed p_coa_i,p_need_f as parameters
7025 --veramach 13-OCT-2003 FA 124 Build -Added logic to insert 2 rows into igf_aw_award_t table which holds IM/FM needs
7026 --rasahoo 05-Aug-2003 #3024112 Changed the parameters in call igf_ap_efc_calc.get_efc_no_of_months
7027 --
7028 */
7029
7030 /* This procedure calculates the NET NEED of the student by substracting the already
7031 aided award (which are not eligible for Repackaging) to the student and his efc from his cost of attendance COA. The net efc and
7032 need values are loaded INTO the temporary table and are used in 'process student' procedure
7033 to calculate the need
7034 Net Need = COA - (Already Awards which are not eligible for Repkg + EFC)
7035 */
7036 CURSOR c_rem_efc IS
7037 SELECT *
7038 FROM igf_aw_award_t
7039 WHERE process_id = l_process_id
7040 AND base_id = p_base_id
7041 AND flag = 'AA';
7042
7043 TYPE efc_cur IS REF CURSOR;
7044
7045 l_efc_cur c_rem_efc%ROWTYPE;
7046 l_new_efc efc_cur;
7047 l_emulate_fed VARCHAR2(30);
7048 l_inst_method VARCHAR2(30);
7049 l_need_f NUMBER;
7050 l_need NUMBER;
7051 l_efc_f NUMBER;
7052 l_need_i NUMBER;
7053 l_efc NUMBER;
7054 l_efc_i NUMBER;
7055 lv_rowid VARCHAR2(30);
7056 l_sl_number NUMBER;
7057 l_efc_months NUMBER;
7058 l_efc_qry VARCHAR2(1500);
7059 l_cnt NUMBER;
7060 l_rec_fnd BOOLEAN := FALSE;
7061 l_rem_efc_f NUMBER := 0;
7062 l_rem_efc_i NUMBER := 0;
7063 l_rem_efc NUMBER := 0;
7064 l_dummy_efc NUMBER;
7065 l_efc_ay NUMBER := 0;
7066 l_need_VB_AC NUMBER := 0;
7067 l_need_VB_AC_f NUMBER := 0;
7068 l_need_VB_AC_i NUMBER := 0;
7069
7070 -- Get efc for Institutional methodology
7071 CURSOR c_efc_i(
7072 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE
7073 ) IS
7074 SELECT coa_duration_efc_amt
7075 FROM igf_ap_css_profile_all
7076 WHERE active_profile = 'Y'
7077 AND base_id = cp_base_id;
7078
7079 BEGIN
7080
7081 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7082 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'Info - START');
7083 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'p_base_id= ' ||p_base_id);
7084 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'p_coa_f= ' ||p_coa_f);
7085 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'fed_fund_code= ' ||p_awds.fed_fund_code);
7086 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'award_id= ' ||p_awds.award_id);
7087 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'Info - END');
7088 END IF;
7089
7090 OPEN c_rem_efc;
7091 FETCH c_rem_efc INTO l_efc_cur;
7092
7093 IF c_rem_efc%FOUND THEN
7094 WHILE c_rem_efc%FOUND LOOP
7095 l_need := l_efc_cur.temp_num_val2;
7096 l_need_VB_AC := l_efc_cur.temp_val3_num;
7097 l_efc := l_efc_cur.temp_num_val1;
7098 l_rem_efc := NVL(l_efc,0); -- Initialize to total remaining efc
7099
7100 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7101 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'Getting previous calculated value for l_need, l_need_VB_AC, l_efc');
7102 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'l_need= ' ||l_need|| ' l_need_VB_AC= ' ||l_need_VB_AC|| ' l_efc= ' ||l_efc);
7103 END IF;
7104
7105 -- If Fund has both the Replcae EFC and Replace NEED are checked then calculate new EFC and NEED
7106 -- If any of the above are set at the fund level, then calculte only that
7107 IF p_awds.replace_fc = 'Y' AND p_awds.update_need = 'Y' THEN
7108 l_rem_efc := NVL(l_efc,0) - NVL(p_awds.award,0);
7109
7110 -- EFC cannot be less than zero as the contribution can be always greater than zero
7111 IF l_rem_efc < 0 THEN
7112 l_rem_efc := 0;
7113 END IF;
7114
7115 -- Calculated the Remaining Need (update also the -ve EFC )
7116 l_need := NVL(l_need,0) - (NVL(p_awds.award,0) - (NVL(l_efc,0) - NVL(l_rem_efc,0)));
7117
7118 -- l_need_VB_AC stores the Need without taking into account VA30 and Americorps awards.
7119 -- This is needed bcoz for subsidized loans (DLS, FLS), VA30 and Americorps awards should NOT be considered as a resource.
7120 IF p_awds.fed_fund_code NOT IN ('VA30', 'AMERICORPS') THEN
7121 l_need_VB_AC := NVL(l_need_VB_AC,0) - (NVL(p_awds.award,0) - (NVL(l_efc,0) - NVL(l_rem_efc,0)));
7122 ELSE
7123 -- Award is VA30/Americorps, l_need_VB_AC is NOT reduced
7124 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7125 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'This is a VA30/AMERICORPS award. l_need_VB_AC is NOT touched');
7126 END IF;
7127 END IF;
7128
7129 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7130 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'Replace_EFC and Update_Need set in Fund Mgr for fund ' ||p_awds.fed_fund_code|| '. Updated EFC and Need.');
7131 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'l_rem_efc= ' ||l_rem_efc);
7132 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'l_need= ' ||l_need);
7133 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'l_need_VB_AC= ' ||l_need_VB_AC);
7134 END IF;
7135
7136 ELSIF p_awds.replace_fc ='Y' THEN
7137 l_rem_efc := NVL(l_efc,0) - NVL(p_awds.award,0);
7138
7139 IF l_rem_efc < 0 THEN
7140 l_need := l_need + l_rem_efc;
7141 l_rem_efc := 0;
7142 END IF;
7143
7144 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7145 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'Replace_EFC set in Fund Mgr for fund ' ||p_awds.fed_fund_code|| '. Updated EFC.');
7146 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'l_rem_efc= ' ||l_rem_efc);
7147 END IF;
7148
7149 ELSIF p_awds.update_need = 'Y' THEN
7150 l_need := NVL(l_need,0) - NVL(p_awds.award,0);
7151
7152 -- l_need_VB_AC stores the Need without taking into account VA30 and Americorps awards.
7153 -- This is needed bcoz for subsidized loans (DLS, FLS) VA30 and Americorps awards should NOT be considered as a resource.
7154 IF p_awds.fed_fund_code NOT IN ('VA30', 'AMERICORPS') THEN
7155 l_need_VB_AC := NVL(l_need_VB_AC,0) - NVL(p_awds.award,0);
7156 ELSE
7157 -- Award is VA30/Americorps, l_need_VB_AC is NOT reduced
7158 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7159 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'This is a VA30/AMERICORPS award. l_need_VB_AC is NOT touched');
7160 END IF;
7161 END IF;
7162
7163 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7164 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'Update_Need set in Fund Mgr for fund ' ||p_awds.fed_fund_code|| '. Updated Need.');
7165 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'l_need= ' ||l_need);
7166 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'l_need_VB_AC= ' ||l_need_VB_AC);
7167 END IF;
7168 END IF;
7169
7170 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7171 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'c_rem_efc%FOUND - so updating values with '||' l_need:'||l_need||' l_efc:'||l_efc||' l_rem_efc:'||l_rem_efc||' l_need_VB_AC: '||l_need_VB_AC);
7172 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'p_awds.replace_fc:'||p_awds.replace_fc||' p_awds.update_need:'||p_awds.update_need||'adplans_id:'||l_efc_cur.adplans_id);
7173 END IF;
7174
7175 igf_aw_award_t_pkg.update_row(
7176 x_rowid => l_efc_cur.row_id ,
7177 x_process_id => l_efc_cur.process_id ,
7178 x_sl_number => l_efc_cur.sl_number,
7179 x_fund_id => l_efc_cur.fund_id,
7180 x_base_id => l_efc_cur.base_id,
7181 x_offered_amt => l_efc_cur.offered_amt,
7182 x_accepted_amt => l_efc_cur.accepted_amt,
7183 x_paid_amt => l_efc_cur.paid_amt,
7184 x_need_reduction_amt => l_efc_cur.need_reduction_amt,
7185 x_flag => l_efc_cur.flag,
7186 x_temp_num_val1 => l_rem_efc,
7187 x_temp_num_val2 => l_need,
7188 x_temp_char_val1 => l_efc_cur.temp_char_val1,
7189 x_tp_cal_type => l_efc_cur.tp_cal_type,
7190 x_tp_sequence_number => l_efc_cur.tp_sequence_number,
7191 x_ld_cal_type => l_efc_cur.ld_cal_type,
7192 x_ld_sequence_number => l_efc_cur.ld_sequence_number,
7193 x_mode => 'R',
7194 x_adplans_id => l_efc_cur.adplans_id,
7195 x_app_trans_num_txt => l_efc_cur.app_trans_num_txt,
7196 x_award_id => l_efc_cur.award_id,
7197 x_lock_award_flag => l_efc_cur.lock_award_flag,
7198 x_temp_val3_num => l_need_VB_AC,
7199 x_temp_val4_num => l_efc_cur.temp_val4_num,
7200 x_temp_char2_txt => l_efc_cur.temp_char2_txt,
7201 x_temp_char3_txt => l_efc_cur.temp_char3_txt
7202 );
7203 FETCH c_rem_efc INTO l_efc_cur;
7204 END LOOP;
7205
7206 ELSIF c_rem_efc%NOTFOUND THEN
7207
7208 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7209 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'c_rem_efc%NOTFOUND-so calculating values');
7210 END IF;
7211
7212 -- Get the month for which EFC should be calcualted
7213 l_efc_months := igf_aw_coa_gen.coa_duration(p_base_id,g_awd_prd);
7214 IF l_efc_months > 12 OR l_efc_months < 0 THEN
7215 l_efc_months := 12;
7216 END IF;
7217
7218 -- Get the EFC value for Federal Methodology
7219 igf_aw_packng_subfns.get_fed_efc(
7220 p_base_id,
7221 g_awd_prd,
7222 l_efc_f,
7223 l_dummy_efc,
7224 l_efc_ay
7225 );
7226
7227
7228 -- Get the EFC values from the Awarding PROFILE record.
7229 OPEN c_efc_i(p_base_id);
7230 FETCH c_efc_i INTO l_efc_i;
7231 IF c_efc_i%NOTFOUND THEN
7232 l_efc_i := NULL;
7233 END IF;
7234 CLOSE c_efc_i;
7235
7236
7237 -- If the Selected methodology is Emulate Fed then use Federal COA else use Institutional COA for calculating NEED
7238 -- This is an initial need without considering the existing awards, existing awards are seperated below
7239 l_need_f := NVL(p_coa_f,0) - NVL(l_efc_f,0);
7240 l_need_i := NVL(p_coa_f,0) - NVL(l_efc_i,0);
7241 l_need_VB_AC_f := l_need_f;
7242 l_need_VB_AC_i := l_need_i;
7243
7244 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7245 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'l_need_f= ' ||l_need_f|| ' l_need_i= ' ||l_need_i|| ' l_need_VB_AC_f= ' ||l_need_VB_AC_f|| ' l_need_VB_AC_i= ' ||l_need_VB_AC_i);
7246 END IF;
7247
7248 -- Initialize to total efc
7249 -- This is an initial efc without considering the existing awards with replace FC, existing awards FC are seperated below
7250 l_rem_efc_f := NVL(l_efc_f,0);
7251 l_rem_efc_i := NVL(l_efc_i,0);
7252
7253 IF p_coa_f IS NOT NULL AND l_efc_f IS NOT NULL AND p_coa_f > 0 AND p_coa_f < l_efc_f THEN
7254 l_rem_efc_f := p_coa_f;
7255 END IF;
7256
7257 -- If Fund has both the Replcae EFC and Replace NEED are checked then calculate new EFC and NEED
7258 -- If any of the above are set at the fund level, then calculte only that
7259 IF NVL(p_awds.replace_fc,'N') = 'Y' AND NVL(p_awds.update_need,'N') = 'Y' THEN
7260 l_rem_efc_f := NVL(l_efc_f,0) - NVL(p_awds.award,0);
7261 l_rem_efc_i := NVL(l_efc_i,0) - NVL(p_awds.award,0);
7262
7263 -- Always EFC cannot be lesser than ZERO
7264 IF l_rem_efc_f < 0 THEN
7265 l_rem_efc_f := 0;
7266 END IF;
7267
7268 IF l_rem_efc_i < 0 THEN
7269 l_rem_efc_i := 0;
7270 END IF;
7271
7272 -- Calculated the Remaining Need
7273 l_need_f := NVL(l_need_f,0) - (NVL(p_awds.award,0) - (NVL(l_efc_f,0) - NVL(l_rem_efc_f,0)));
7274 l_need_i := NVL(l_need_i,0) - (NVL(p_awds.award,0) - (NVL(l_efc_i,0) - NVL(l_rem_efc_i,0)));
7275
7276 -- l_need_VB_AC_f/l_need_VB_AC_i stores the Need without taking into account VA30 and Americorps awards.
7277 -- This is needed bcoz for subsidized loans (DLS, FLS), VA30 and Americorps awards should NOT be considered as a resource.
7278 IF p_awds.fed_fund_code NOT IN ('VA30', 'AMERICORPS') THEN
7279 l_need_VB_AC_f := NVL(l_need_VB_AC_f,0) - (NVL(p_awds.award,0) - (NVL(l_efc_f,0) - NVL(l_rem_efc_f,0)));
7280 l_need_VB_AC_i := NVL(l_need_VB_AC_i,0) - (NVL(p_awds.award,0) - (NVL(l_efc_i,0) - NVL(l_rem_efc_i,0)));
7281 ELSE
7282 -- Award is VA30/Americorps, l_need_VB_AC_f/l_need_VB_AC_i is NOT reduced
7283 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7284 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'This is a VA30/AMERICORPS award. l_need_VB_AC_f/l_need_VB_AC_i is NOT touched');
7285 END IF;
7286 END IF;
7287
7288 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7289 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'Replace_EFC and Update_Need set in Fund Mgr for fund ' ||p_awds.fed_fund_code|| '. Updated EFC and Need.');
7290 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'l_rem_efc_f= ' ||l_rem_efc_f|| ' l_rem_efc_i= ' ||l_rem_efc_i);
7291 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'l_need_f= ' ||l_need_f|| ' l_need_i= ' ||l_need_i);
7292 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'l_need_VB_AC_f= ' ||l_need_VB_AC_f|| ' l_need_VB_AC_i= ' ||l_need_VB_AC_i);
7293 END IF;
7294
7295 -- If only Replace EFC is present
7296 ELSIF p_awds.replace_fc ='Y' THEN
7297
7298 l_rem_efc_f := NVL(l_efc_f,0) - NVL(p_awds.award,0);
7299 IF l_rem_efc_f < 0 THEN
7300 l_need_f := l_need_f + l_rem_efc_f;
7301 l_rem_efc_f := 0;
7302 END IF;
7303
7304 l_rem_efc_i := NVL(l_efc_i,0) - NVL(p_awds.award,0);
7305 IF l_rem_efc_i < 0 THEN
7306 l_need_i := l_need_i + l_rem_efc_i;
7307 l_rem_efc_i := 0;
7308 END IF;
7309
7310 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7311 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'Replace_EFC set in Fund Mgr for fund ' ||p_awds.fed_fund_code|| '. Updated EFC.');
7312 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'l_rem_efc_f= ' ||l_rem_efc_f|| ' l_rem_efc_i= ' ||l_rem_efc_i);
7313 END IF;
7314
7315 -- If only Replace Need is present
7316 ELSIF p_awds.update_need ='Y' THEN
7317
7318 l_need_f := NVL(l_need_f,0) - NVL(p_awds.award,0);
7319 l_need_i := NVL(l_need_i,0) - NVL(p_awds.award,0);
7320
7321 -- l_need_VB_AC_f/l_need_VB_AC_i stores the Need without taking into account VA30 and Americorps awards.
7322 -- This is needed bcoz for subsidized loans (DLS, FLS), VA30 and Americorps awards should NOT be considered as a resource.
7323 IF p_awds.fed_fund_code NOT IN ('VA30', 'AMERICORPS') THEN
7324 l_need_VB_AC_f := NVL(l_need_VB_AC_f,0) - NVL(p_awds.award,0);
7325 l_need_VB_AC_i := NVL(l_need_VB_AC_i,0) - NVL(p_awds.award,0);
7326 ELSE
7327 -- Award is VA30/Americorps, l_need_VB_AC_f/l_need_VB_AC_i is NOT reduced
7328 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7329 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'This is a VA30/AMERICORPS award. l_need_VB_AC_f/l_need_VB_AC_i is NOT touched');
7330 END IF;
7331 END IF;
7332
7333 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7334 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'Update_Need set in Fund Mgr for fund ' ||p_awds.fed_fund_code|| '. Updated Need.');
7335 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'l_need_f= ' ||l_need_f|| ' l_need_i= ' ||l_need_i);
7336 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'l_need_VB_AC_f= ' ||l_need_VB_AC_f|| ' l_need_VB_AC_i= ' ||l_need_VB_AC_i);
7337 END IF;
7338 END IF;
7339
7340 fnd_message.set_name('IGF','IGF_AW_PKG_EFC_MONTH');
7341 fnd_message.set_token('MONTH',l_efc_months);
7342 fnd_file.put_line(fnd_file.log,fnd_message.get);
7343
7344 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7345 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'fund Setup values are, Award ID : '||p_awds.award_id||' Fund Id: '||p_awds.fund_id);
7346 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,' p_awds.replace_fc : '||p_awds.replace_fc||' p_awds.update_need: '||p_awds.update_need);
7347 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'Calculated values are: '||' l_efc_months: '||l_efc_months);
7348 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,' l_efc_f:'||l_efc_f||' l_efc_i:'||l_efc_i||' l_rem_efc_f:'||l_rem_efc_f||' l_rem_efc_i:'||l_rem_efc_i);
7349 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'l_need_f:'||l_need_f||' l_need_i:'||l_need_i||' l_need_VB_AC_f:'||l_need_VB_AC_f|| ' l_need_VB_AC_i:' ||l_need_VB_AC_i);
7350 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'inserting calculated values into igf_aw_award_t with x_temp_char_val1=FEDERAL');
7351 END IF;
7352 -- insert the record into Temp table
7353 igf_aw_award_t_pkg.insert_row(
7354 x_rowid => lv_rowid ,
7355 x_process_id => l_process_id ,
7356 x_sl_number => l_sl_number,
7357 x_fund_id => NULL,
7358 x_base_id => p_base_id,
7359 x_offered_amt => NULL,
7360 x_accepted_amt => NULL,
7361 x_paid_amt => NULL ,
7362 x_need_reduction_amt => NULL,
7363 x_flag => 'AA', -- Allready awarded either manually or in prior runs.
7364 x_temp_num_val1 => l_rem_efc_f, -- efc to be passed
7365 x_temp_num_val2 => l_need_f, -- need to be passed
7366 x_temp_char_val1 => 'FEDERAL',
7367 x_tp_cal_type => NULL,
7368 x_tp_sequence_number => NULL,
7369 x_ld_cal_type => NULL,
7370 x_ld_sequence_number => NULL,
7371 x_mode => 'R',
7372 x_adplans_id => NULL,
7373 x_app_trans_num_txt => NULL,
7374 x_award_id => NULL,
7375 x_lock_award_flag => NULL,
7376 x_temp_val3_num => l_need_VB_AC_f,
7377 x_temp_val4_num => NULL,
7378 x_temp_char2_txt => NULL,
7379 x_temp_char3_txt => NULL
7380 );
7381 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7382 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.calc_need.debug '|| g_req_id,'inserting calculating values into igf_aw_award_t with x_temp_char_val1=INSTITUTIONAL');
7383 END IF;
7384 -- insert the record into Temp table
7385 igf_aw_award_t_pkg.insert_row(
7386 x_rowid => lv_rowid ,
7387 x_process_id => l_process_id ,
7388 x_sl_number => l_sl_number,
7389 x_fund_id => NULL,
7390 x_base_id => p_base_id,
7391 x_offered_amt => NULL,
7392 x_accepted_amt => NULL,
7393 x_paid_amt => NULL ,
7394 x_need_reduction_amt => NULL,
7395 x_flag => 'AA', -- Allready awarded either manually or in prior runs.
7396 x_temp_num_val1 => l_rem_efc_i, -- efc to be passed
7397 x_temp_num_val2 => l_need_i, -- need to be passed
7398 x_temp_char_val1 => 'INSTITUTIONAL',
7399 x_tp_cal_type => NULL,
7400 x_tp_sequence_number => NULL,
7401 x_ld_cal_type => NULL,
7402 x_ld_sequence_number => NULL,
7403 x_mode => 'R',
7404 x_adplans_id => NULL,
7405 x_app_trans_num_txt => NULL,
7406 x_award_id => NULL,
7407 x_lock_award_flag => NULL,
7408 x_temp_val3_num => l_need_VB_AC_i,
7409 x_temp_val4_num => NULL,
7410 x_temp_char2_txt => NULL,
7411 x_temp_char3_txt => NULL
7412 );
7413
7414
7415 END IF; -- Fetch IF
7416 CLOSE c_rem_efc;
7417
7418 --
7419 -- The following logic stores the already awarded aid of the student INTO a plsql table
7420 -- It updates the plsql table to hold all the aid awarded for a student. This is used
7421 -- later in process_stud to calculate over award
7422 --
7423
7424 l_cnt := g_awarded_aid.COUNT;
7425
7426 -- If plsql table is not alread created, create it and load the Aid details
7427 IF NVL(l_cnt,0) = 0 THEN
7428 l_cnt := 1;
7429 g_awarded_aid.EXTEND(1);
7430 g_awarded_aid(l_cnt).base_id := p_base_id;
7431 g_awarded_aid(l_cnt).need_f := NVL(l_need_f,0);
7432 g_awarded_aid(l_cnt).awarded_aid := NVL(p_awds.award,0);
7433
7434 -- If the table is already populated then search for that record and add increase the aid amount with the new award amount
7435 ELSIF l_cnt > 0 THEN
7436 l_cnt := 0;
7437 FOR i in 1..g_awarded_aid.COUNT LOOP
7438 l_cnt := l_cnt + 1;
7439
7440 IF g_awarded_aid(i).base_id = p_base_id THEN
7441
7442 g_awarded_aid(i).awarded_aid := g_awarded_aid(i).awarded_aid + NVL(p_awds.award,0);
7443 l_rec_fnd := TRUE;
7444 EXIT;
7445
7446 ELSE
7447 l_rec_fnd := FALSE;
7448 END IF;
7449
7450 END LOOP;
7451
7452 -- If record is not found, then load the table with the Aid deatils
7453 IF NOT l_rec_fnd THEN
7454 l_cnt := l_cnt + 1;
7455 g_awarded_aid.EXTEND(1);
7456 g_awarded_aid(l_cnt).base_id := p_base_id;
7457 g_awarded_aid(l_cnt).need_f := NVL(l_need_f,0);
7458 g_awarded_aid(l_cnt).awarded_aid := NVL(p_awds.award,0);
7459 END IF;
7460 END IF; -- End of logic to populate the student aid INTO plsql table
7461 EXCEPTION
7462 WHEN OTHERS THEN
7463 fnd_file.put_line(fnd_file.log,SQLERRM);
7464 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
7465 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.calc_need.exception '|| g_req_id,'sql error message: '||SQLERRM);
7466 END IF;
7467 RAISE;
7468 END calc_need;
7469
7470 FUNCTION hasActiveIsir(
7471 p_base_id igf_ap_fa_base_rec_all.base_id%TYPE
7472 ) RETURN NUMBER AS
7473 ------------------------------------------------------------------
7474 --Created by : veramach, Oracle India
7475 --Date created: 14-Oct-2004
7476 --
7477 --Purpose:
7478 --
7479 --
7480 --Known limitations/enhancements and/or remarks:
7481 --
7482 --Change History:
7483 --Who When What
7484 -------------------------------------------------------------------
7485
7486 -- Get active isir
7487 CURSOR c_active_isir IS
7488 SELECT isir_id
7489 FROM igf_ap_isir_matched_all
7490 WHERE base_id = p_base_id
7491 AND active_isir = 'Y';
7492 l_isir_id igf_ap_isir_matched_all.isir_id%TYPE;
7493 BEGIN
7494 l_isir_id := NULL;
7495 OPEN c_active_isir;
7496 FETCH c_active_isir INTO l_isir_id;
7497 CLOSE c_active_isir;
7498 RETURN l_isir_id;
7499 END hasActiveIsir;
7500
7501 FUNCTION hasActiveProfile(
7502 p_base_id igf_ap_fa_base_rec_all.base_id%TYPE
7503 ) RETURN NUMBER AS
7504 ------------------------------------------------------------------
7505 --Created by : veramach, Oracle India
7506 --Date created: 14-Oct-2004
7507 --
7508 --Purpose:
7509 --
7510 --
7511 --Known limitations/enhancements and/or remarks:
7512 --
7513 --Change History:
7514 --Who When What
7515 -------------------------------------------------------------------
7516
7517 -- Get active isir
7518 CURSOR c_active_profile IS
7519 SELECT cssp_id
7520 FROM igf_ap_css_profile_all
7521 WHERE base_id = p_base_id
7522 AND active_profile = 'Y';
7523 l_css_id igf_ap_css_profile_all.cssp_id%TYPE;
7524 BEGIN
7525 l_css_id := NULL;
7526 OPEN c_active_profile;
7527 FETCH c_active_profile INTO l_css_id;
7528 CLOSE c_active_profile;
7529 RETURN l_css_id;
7530 END hasActiveProfile;
7531
7532 FUNCTION get_award_process_status(
7533 p_ci_cal_type igs_ca_inst.cal_type%TYPE,
7534 p_ci_sequence_number igs_ca_inst.sequence_number%TYPE,
7535 p_award_prd_code igf_aw_awd_prd_term.award_prd_cd%TYPE,
7536 p_base_id igf_ap_fa_base_rec_all.base_id%TYPE
7537 ) RETURN VARCHAR2 AS
7538 ------------------------------------------------------------------
7539 --Created by : veramach, Oracle India
7540 --Date created: 25-Oct-2004
7541 --
7542 --Purpose: Returns the award processing status for a student
7543 -- in a award year's awarding period
7544 --
7545 --
7546 --Known limitations/enhancements and/or remarks:
7547 --
7548 --Change History:
7549 --Who When What
7550 -------------------------------------------------------------------
7551
7552 CURSOR c_award_process_status IS
7553 SELECT DECODE(
7554 MAX(status_order),
7555 0, NULL,
7556 1, 'AWARDED',
7557 2, 'READY',
7558 3, 'REVIEW',
7559 4, 'DO_NOT_REPKG'
7560 ) award_processing_status
7561 FROM (SELECT awd.award_id,
7562 awd_proc_status_code,
7563 DECODE(
7564 awd.awd_proc_status_code,
7565 NULL, 0,
7566 'AWARDED', 1,
7567 'READY', 2,
7568 'REVIEW', 3,
7569 'DO_NOT_REPKG', 4
7570 ) status_order
7571 FROM igf_aw_award_all awd,
7572 igf_aw_fund_mast_all fmast
7573 WHERE fmast.ci_cal_type = p_ci_cal_type
7574 AND fmast.ci_sequence_number = p_ci_sequence_number
7575 AND awd.fund_id = fmast.fund_id
7576 AND awd.base_id = p_base_id
7577 AND NOT EXISTS(
7578 SELECT disb.ld_cal_type,
7579 disb.ld_sequence_number
7580 FROM igf_aw_awd_disb_all disb
7581 WHERE disb.award_id = awd.award_id
7582 MINUS
7583 SELECT ld_cal_type,
7584 ld_sequence_number
7585 FROM igf_aw_awd_prd_term apt
7586 WHERE apt.ci_cal_type = p_ci_cal_type
7587 AND apt.ci_sequence_number = p_ci_sequence_number
7588 AND apt.award_prd_cd = p_award_prd_code));
7589 l_award_process_status igf_aw_award_all.awd_proc_status_code%TYPE;
7590
7591 BEGIN
7592 l_award_process_status := NULL;
7593 OPEN c_award_process_status;
7594 FETCH c_award_process_status INTO l_award_process_status;
7595 IF c_award_process_status%FOUND THEN
7596 RETURN l_award_process_status;
7597 ELSE
7598 RETURN NULL;
7599 END IF;
7600 END get_award_process_status;
7601
7602 PROCEDURE stud_run(
7603 l_base_id IN NUMBER,
7604 l_post IN VARCHAR2,
7605 l_run_mode IN VARCHAR2
7606 ) IS
7607 /*
7608 || Created By : cdcruz
7609 || Created On : 14-NOV-2000
7610 || Purpose :
7611 || Known limitations, enhancements or remarks :
7612 || Change History :
7613 || Who WHEN What
7614 || (reverse chronological order - newest change first)
7615 || veramach 20-NOV-2003 FA 125 multiple distribution methods
7616 || Added call to check_plan and error out if check_plan returns failure
7617 || veramach 13-OCT2-03 FA 124 Build - Added logic to error out if a student does not have active ISIR in multiple fund packaging
7618 || rasahoo 27-Aug-2003 Removed call to get_oss_details as part of obsoletion of FA base record history.
7619 || rasahoo 23-Apl-2003 Bug # 2860836
7620 || Added rollback for resolving
7621 || locking problem created by fund manager
7622 ||
7623 || cdcruz 05-Feb-2003 Bug # 2758804
7624 || FACR105 - ISIR picked is the active ISIR-CURSOR c_get_isir
7625 ||
7626 || brajendr 08-Jan-2003 Bug # 2762648
7627 || Removed Function validate_student_efc call as this validation is necessary only for Packaging Process
7628 ||
7629 || brajendr 08-Jan-2003 Bug # 2710314
7630 || Added a Function validate_student_efc
7631 || for checking the validity of EFC
7632 ||
7633 || brajendr 10-Dec-2002 Bug # 2701470
7634 || Modified the logic for not validating the packaging status for single fund process
7635 ||
7636 || brajendr 18-OCT-2002 Bug # 2591643
7637 || Modified the logic for fetching the Context ISIR
7638 */
7639
7640 -- Get the student existing award Details
7641
7642 CURSOR c_awds ( cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE )
7643 IS
7644 SELECT awd.award_id,
7645 awd.offered_amt award,
7646 fm.fund_id fund_id,
7647 fm.replace_fc replace_fc,
7648 fm.update_need update_need,
7649 NVL(fm.entitlement,'N') entitlement,
7650 fcat.fed_fund_code fed_fund_code,
7651 fm.fm_fc_methd fm_fc_methd
7652 FROM igf_aw_award_all awd,
7653 igf_aw_fund_mast_all fm,
7654 igf_aw_fund_cat_all fcat
7655 WHERE base_id = cp_base_id
7656 AND awd.fund_id = fm.fund_id
7657 AND fm.fund_code = fcat.fund_code
7658 AND awd.award_status IN ('ACCEPTED','OFFERED')
7659 AND awd.award_id NOT IN ( SELECT award_id
7660 FROM igf_aw_award_t
7661 WHERE base_id = cp_base_id
7662 AND process_id = l_process_id
7663 AND flag = 'AU'); -- AU is it is a candidate for repackaging
7664
7665 l_awds std_awards;
7666
7667 -- Get the person Number for log
7668 CURSOR c_person_number( x_base_id igf_ap_fa_con_v.base_id%TYPE ) IS
7669 SELECT pe.party_number person_number, fa.packaging_status
7670 FROM igf_ap_fa_base_rec_all fa,
7671 hz_parties pe
7672 WHERE fa.base_id = x_base_id
7673 AND pe.party_id = fa.person_id;
7674
7675 l_person_number c_person_number%ROWTYPE;
7676
7677 -- Get the Base record details
7678 CURSOR c_fabase ( x_base_id igf_ap_fa_base_rec.base_id%TYPE ) IS
7679 SELECT fabase.*
7680 FROM igf_ap_fa_base_rec fabase
7681 WHERE fabase.base_id = x_base_id;
7682
7683 l_fabase c_fabase%ROWTYPE;
7684
7685 -- Retrieves all the Formula Policies
7686 CURSOR c_frml_plcy(
7687 x_group_cd igf_aw_target_grp_all.group_cd%TYPE,
7688 x_ci_cal_type igf_ap_fa_base_rec_all.ci_cal_type%TYPE,
7689 x_ci_sequence_number igf_ap_fa_base_rec_all.ci_sequence_number%TYPE
7690 ) IS
7691 SELECT tgrp.*
7692 FROM igf_aw_target_grp_all tgrp
7693 WHERE tgrp.cal_type = x_ci_cal_type
7694 AND tgrp.sequence_number = x_ci_sequence_number
7695 AND tgrp.group_cd = x_group_cd;
7696
7697 l_frml_plcy c_frml_plcy%ROWTYPE;
7698
7699 -- Get the funds from the Temp table which are not yet awarded
7700 CURSOR c_rem_fund(x_base_id igf_ap_fa_base_rec.base_id%TYPE) IS
7701 SELECT COUNT(*)
7702 FROM igf_aw_award_t
7703 WHERE process_id = l_process_id
7704 AND base_id = x_base_id
7705 AND flag IN ('CF','AU');
7706
7707 l_rem_cnt NUMBER;
7708 l_coa_months NUMBER;
7709 l_skip_fund BOOLEAN;
7710 l_fund_fail BOOLEAN;
7711 l_fund_id igf_aw_fund_mast_all.fund_id%TYPE;
7712 l_aid NUMBER(12,2);
7713 l_accepted_amt NUMBER(12,2);
7714 l_seq_no NUMBER;
7715 l_pers_num igf_ap_fa_con_v.person_number%TYPE;
7716 lv_rowid VARCHAR2(30);
7717 l_sl_number NUMBER;
7718 l_chk NUMBER;
7719 l_ret_status VARCHAR2(3);
7720
7721
7722 lv_result VARCHAR2(80) := NULL;
7723 lv_method_code VARCHAR2(80) := NULL;
7724
7725 lv_name igf_aw_awd_dist_plans.awd_dist_plan_cd_desc%TYPE := NULL;
7726 lv_desc igf_aw_awd_dist_plans_v.dist_plan_method_code_desc%TYPE := NULL;
7727
7728 l_failed_award_id igf_aw_award_all.award_id%TYPE;
7729
7730 BEGIN
7731 l_ret_status :='S';
7732 l_failed_award_id := NULL;
7733
7734 get_process_id;
7735
7736 -- Savepoint to Rollback changes if the base id raises Exception
7737 SAVEPOINT STUD_SP;
7738
7739 -- get person NUMBER for base id
7740 OPEN c_person_number(l_base_id );
7741 FETCH c_person_number INTO l_person_number;
7742 CLOSE c_person_number;
7743 l_pers_num := l_person_number.person_number;
7744
7745 -- Log a message stating that : Process Person : Person Number
7746 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7747 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'************* Student : '||l_person_number.person_number||' *************');
7748 END IF;
7749 fnd_file.put_line(fnd_file.log,' ');
7750 fnd_file.put_line(fnd_file.log,' ');
7751 fnd_file.put_line(fnd_file.log,'------------------------------------------------- ');
7752 fnd_message.set_name('IGF','IGF_AW_PROCESS_STUD');
7753 fnd_message.set_token('STUD', l_person_number.person_number );
7754 fnd_file.put_line(fnd_file.log,fnd_message.get);
7755 fnd_file.put_line(fnd_file.log,'------------------------------------------------- ');
7756
7757
7758 -- Check for the valid EFC of the student. If no valid EFC, show message and stop processing
7759 IF g_sf_packaging <> 'T' THEN
7760 IF igf_aw_gen_005.validate_student_efc(l_base_id,g_awd_prd) = 'F' THEN
7761 fnd_message.set_name('IGF','IGF_AW_NO_VALID_EFC');
7762 fnd_message.set_token('STDNT', l_pers_num );
7763 fnd_file.put_line(fnd_file.log,fnd_message.get);
7764 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7765 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'no valid efc for '||l_pers_num);
7766 END IF;
7767 RETURN;
7768 END IF;
7769 END IF;
7770
7771 --check if student has awarding isir in multiple fund packaging.if not error out
7772 IF g_sf_packaging <> 'T' THEN
7773
7774 IF hasActiveIsir(l_base_id) IS NULL THEN
7775 fnd_message.set_name('IGF','IGF_AW_NO_ISIR');
7776 fnd_message.set_token('STDNT',l_person_number.person_number);
7777 fnd_file.put_line(fnd_file.log,fnd_message.get);
7778 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7779 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'no active ISIR for '||l_person_number.person_number);
7780 END IF;
7781 RETURN;
7782 END IF;
7783
7784 --Cbeck if student has valid COA in multiple fund packaging.if not error out
7785
7786 IF NOT igf_aw_gen_003.check_coa(l_base_id,g_awd_prd) THEN
7787 fnd_message.set_name('IGF','IGF_AW_PK_COA_NULL');
7788 fnd_file.put_line(fnd_file.log,fnd_message.get);
7789 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7790 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'no COA for '||l_person_number.person_number);
7791 END IF;
7792 RETURN;
7793 END IF;
7794 END IF;
7795
7796 IF g_sf_packaging = 'T' THEN
7797
7798 IF g_allow_to_exceed IS NULL THEN
7799 -- If COA Value is not set, then cannot proceed further
7800 -- Log a message and exit from the Job
7801 IF NOT igf_aw_gen_003.check_coa(l_base_id,g_awd_prd) THEN
7802
7803 --get the plan name for the token
7804 get_plan_desc(g_plan_id,lv_name,lv_desc);
7805
7806 fnd_message.set_name('IGF','IGF_AW_COA_COMMON_TERMS_FAIL');
7807 fnd_message.set_token('PLAN_CD',lv_name);
7808 fnd_file.put_line(fnd_file.log,fnd_message.get);
7809 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7810 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'no COA for '||l_pers_num||' and allow_to_exceed=NULL');
7811 END IF;
7812 RETURN;
7813 END IF;
7814
7815 ELSIF g_allow_to_exceed = 'NEED' THEN
7816
7817 IF NOT igf_aw_gen_003.check_coa(l_base_id,g_awd_prd) THEN
7818 fnd_message.set_name('IGF','IGF_AW_PK_COA_NULL');
7819 fnd_file.put_line(fnd_file.log,fnd_message.get);
7820 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7821 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'no COA for '||l_person_number.person_number ||' and allow_to_exceed=NEED');
7822 END IF;
7823 RETURN;
7824 END IF;
7825 END IF;
7826
7827 END IF;
7828
7829 -- Initialize all the amounts
7830 l_grant_amt :=0;
7831 l_loan_amt :=0;
7832 l_work_amt :=0;
7833 l_shelp_amt :=0;
7834 l_gift_amt :=0;
7835 l_schlp_amt :=0;
7836 l_gap_amt :=0;
7837 l_coa_months :=0;
7838 l_efc_f :=0;
7839 l_efc_i :=0;
7840 l_pell_efc :=0;
7841
7842 -- This below LOOP will be executed for only once, Here is loop is used to come out the from the middle to the end of the logic
7843 OPEN c_fabase (l_base_id );
7844 LOOP
7845 FETCH c_fabase INTO l_fabase;
7846 EXIT WHEN c_fabase%NOTFOUND;
7847
7848 -- Check whether are there any package hold are present at the student level, if not continue the packaging
7849 IF igf_aw_gen_005.get_stud_hold_effect('A', l_fabase.person_id, NULL ) = 'F' THEN
7850 fnd_message.set_name('IGF','IGF_AW_AWD_PACK_HOLD_FAIL');
7851 fnd_file.put_line(fnd_file.log,fnd_message.get);
7852 CLOSE c_fabase;
7853 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7854 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'igf_aw_gen_005.get_stud_hold_effect(A,'||l_fabase.person_id||',NULL=F');
7855 END IF;
7856 RETURN;
7857 END IF;
7858
7859 /*
7860 FA 152 Change - If award processing status for the student is not 'READY' or NULL,
7861 then skip the student.
7862 */
7863 IF get_award_process_status(l_fabase.ci_cal_type,l_fabase.ci_sequence_number,g_awd_prd,l_fabase.base_id) IN ('AWARDED','REVIEW','DO_NOT_REPKG') THEN
7864 fnd_message.set_name('IGF','IGF_AW_CANNOT_REPACKAGE');
7865 fnd_message.set_token('PERSON', l_person_number.person_number );
7866 fnd_file.put_line(fnd_file.log,fnd_message.get);
7867 RETURN;
7868 END IF;
7869
7870 IF NVL(l_fabase.lock_awd_flag,'N') = 'Y' THEN
7871 fnd_message.set_name('IGF','IGF_AW_LOCK_AWD');
7872 fnd_message.set_token('PERSON', l_person_number.person_number );
7873 fnd_file.put_line(fnd_file.log,fnd_message.get);
7874 RETURN;
7875 END IF;
7876 -- Clear old simualted records for the student which were created in the previous run
7877 clear_simulation( l_base_id );
7878
7879 /* Get the students COA Months. Get the students efc. */
7880 l_efc_i := l_pell_efc;
7881
7882 l_fabase.coa_f := igf_aw_coa_gen.coa_amount(l_fabase.base_id,g_awd_prd);
7883 l_fabase.coa_i := l_fabase.coa_f;
7884 l_fabase.coa_fixed := igf_aw_coa_gen.coa_amount(l_fabase.base_id,g_awd_prd,'Y');
7885
7886 -- If the process is not run for the Single fund, then Load all Formula Group Policies
7887 -- Get all the overrides set at the formula levels and load the Temp table
7888 IF g_sf_packaging = 'F' THEN
7889 OPEN c_frml_plcy(
7890 l_fabase.target_group,
7891 l_fabase.ci_cal_type,
7892 l_fabase.ci_sequence_number
7893 );
7894 FETCH c_frml_plcy INTO l_frml_plcy;
7895
7896 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7897 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'opened c_frml_policy');
7898 END IF;
7899 -- If Formula policys were not present then log a message and skip the formula checks
7900 IF c_frml_plcy%NOTFOUND THEN
7901 fnd_message.set_name('IGF','IGF_AW_PK_FRML_PLCY');
7902 fnd_file.put_line(fnd_file.log,fnd_message.get);
7903 CLOSE c_frml_plcy;
7904 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7905 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'no formula policies available');
7906 END IF;
7907 RETURN;
7908 END IF;
7909 CLOSE c_frml_plcy;
7910
7911 IF ( l_run_mode = 'D') THEN
7912 fnd_message.set_name('IGF','IGF_AW_PKG_AWD_GRP');
7913 fnd_message.set_token('AWDGRP',l_fabase.target_group);
7914 fnd_file.put_line(fnd_file.log,fnd_message.get);
7915 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7916 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'after closing c_frml_policy packaging award group '||l_fabase.target_group);
7917 END IF;
7918 END IF;
7919
7920 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7921 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'calling check_plan with adplans_id:'||l_frml_plcy.adplans_id);
7922 END IF;
7923 check_plan(l_frml_plcy.adplans_id,lv_result,lv_method_code);
7924 IF lv_result <> 'TRUE' THEN
7925 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7926 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'check_plan did not return true-it returned '||lv_result);
7927 END IF;
7928 fnd_message.set_name('IGF',lv_result);
7929 fnd_file.put_line(fnd_file.log,fnd_message.get);
7930 RETURN;
7931 ELSE
7932 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
7933 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'check_plan returned TRUE with g_plan_id:'||g_plan_id||',g_method_cd:'||g_method_cd);
7934 END IF;
7935 g_plan_id := l_frml_plcy.adplans_id;
7936 g_method_cd := lv_method_code;
7937 END IF;
7938
7939 -- Calculate the Max Loan Amt ( directly from the loan amt or from the % defined at the Frml Policy level)
7940 IF l_frml_plcy.max_loan_amt IS NOT NULL THEN
7941 l_loan_amt := l_frml_plcy.max_loan_amt;
7942 ELSIF l_frml_plcy.max_loan_perct IS NULL THEN
7943 l_loan_amt := 0;
7944 ELSE
7945 l_loan_amt := get_perct_amt(l_frml_plcy.max_loan_perct_fact,l_frml_plcy.max_loan_perct,l_base_id,igf_aw_gen_004.efc_f(l_base_id,g_awd_prd),g_awd_prd);
7946 END IF;
7947
7948 -- Calculate the Max Grant Amt ( directly from the grant amt or grom the % defined at the Frml Policy level)
7949 IF l_frml_plcy.max_grant_amt IS NOT NULL THEN
7950 l_grant_amt := l_frml_plcy.max_grant_amt;
7951
7952 ELSIF l_frml_plcy.max_grant_perct IS NULL THEN
7953 l_grant_amt := 0;
7954 ELSE
7955 l_grant_amt := get_perct_amt(l_frml_plcy.max_grant_perct_fact,l_frml_plcy.max_grant_perct,l_base_id,igf_aw_gen_004.efc_f(l_base_id,g_awd_prd),g_awd_prd);
7956 END IF;
7957
7958 -- Calculate the Max Work Amt ( directly from the work amt or from the % defined at the Frml Policy level)
7959 IF l_frml_plcy.max_work_amt IS NOT NULL THEN
7960 l_work_amt := l_frml_plcy.max_work_amt;
7961
7962 ELSIF l_frml_plcy.max_work_perct IS NULL THEN
7963 l_work_amt := 0;
7964 ELSE
7965 l_work_amt := get_perct_amt(l_frml_plcy.max_work_perct_fact,l_frml_plcy.max_work_perct,l_base_id,igf_aw_gen_004.efc_f(l_base_id,g_awd_prd),g_awd_prd);
7966 END IF;
7967
7968 -- Calculate the Max Self Help Amt
7969 IF l_frml_plcy.max_shelp_amt IS NOT NULL THEN
7970 l_shelp_amt := l_frml_plcy.max_shelp_amt;
7971
7972 ELSIF l_frml_plcy.max_shelp_perct IS NULL THEN
7973 l_shelp_amt := 0;
7974 ELSE
7975 l_shelp_amt := get_perct_amt(l_frml_plcy.max_shelp_perct_fact,l_frml_plcy.max_shelp_perct,l_base_id,igf_aw_gen_004.efc_f(l_base_id,g_awd_prd),g_awd_prd);
7976 END IF;
7977
7978 -- Calculate the Max Gift Aid Amt
7979 IF l_frml_plcy.max_gift_amt IS NOT NULL THEN
7980 l_gift_amt := l_frml_plcy.max_gift_amt;
7981
7982 ELSIF l_frml_plcy.max_gift_perct IS NULL THEN
7983 l_gift_amt := 0;
7984 ELSE
7985 l_gift_amt := get_perct_amt(l_frml_plcy.max_gift_perct_fact,l_frml_plcy.max_gift_perct,l_base_id,igf_aw_gen_004.efc_f(l_base_id,g_awd_prd),g_awd_prd);
7986 END IF;
7987
7988 -- Calculate the Max Scholarship Amt
7989 IF l_frml_plcy.max_schlrshp_amt IS NOT NULL THEN
7990 l_schlp_amt := l_frml_plcy.max_schlrshp_amt;
7991
7992 ELSIF l_frml_plcy.max_schlrshp_perct IS NULL THEN
7993 l_schlp_amt := 0;
7994 ELSE
7995 l_schlp_amt := get_perct_amt(l_frml_plcy.max_schlrshp_perct_fact,l_frml_plcy.max_schlrshp_perct,l_base_id,igf_aw_gen_004.efc_f(l_base_id,g_awd_prd),g_awd_prd);
7996 END IF;
7997
7998 -- Calculate the Gap Amount
7999 IF l_frml_plcy.max_gap_amt IS NOT NULL THEN
8000 l_gap_amt := l_frml_plcy.max_gap_amt;
8001 ELSIF l_frml_plcy.max_gap_perct IS NULL THEN
8002
8003 l_gap_amt := 0;
8004 ELSE
8005 l_gap_amt := get_perct_amt(l_frml_plcy.max_gap_perct_fact,l_frml_plcy.max_gap_perct,l_base_id,igf_aw_gen_004.efc_f(l_base_id,g_awd_prd),g_awd_prd);
8006 END IF;
8007
8008 -- Get the Max Aid Package
8009 l_max_aid_pkg := l_frml_plcy.max_aid_pkg;
8010
8011 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
8012 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'data fetched from c_frml_policy l_loan_amt:'||l_loan_amt||' l_grant_amt:'||l_grant_amt);
8013 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'l_work_amt:'||l_work_amt||' l_shelp_amt:'||l_shelp_amt||' l_gift_amt:'||l_gift_amt);
8014 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'l_schlp_amt:'||l_schlp_amt||' l_gap_amt:'||l_gap_amt||' l_max_aid_pkg:'||l_max_aid_pkg);
8015 END IF;
8016 END IF; -- End if for Formula Policies
8017
8018 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
8019 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'after calculating max limits for loan,etc.calling load_funds');
8020 END IF;
8021 -- Load all the Funds INTO the Tempoary Table with the flag 'CF'
8022 -- If running for single fund, it loads only that fund using the gloabal variable value
8023
8024 load_funds(
8025 l_fabase.target_group,
8026 l_fabase.ci_cal_type,
8027 l_fabase.ci_sequence_number,
8028 l_fabase.base_id,
8029 l_fabase.person_id
8030 );
8031
8032 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
8033 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'after calling load_funds, calling excl_incl_check');
8034 END IF;
8035 -- Check for Exclusive and Inclusive funds and get only valid ones INTO the Temp Table
8036 excl_incl_check( l_process_id, l_base_id , l_run_mode);
8037
8038 /*
8039 FA 152 Changes.
8040 Need should be calculated after the awards are loaded into the temporary table.
8041 This ensures that awards which are candidates for repackaging are NOT considered
8042 for calculation of need. Modified CURSOR c_awds accordingly to select awards which cannot be re-packaged.
8043 */
8044 /* If Student is awarded already then his resources need to be considered
8045 Earlier logic of ignoring earlier awards is changed. Logic to calculate
8046 COA is also removed as the COA is now changed
8047 */
8048
8049 -- Get all the awards which are already awarded to the students and update the Temp table
8050 -- with the fund details, EFC and Need with the status as 'AA' - Already Awarded
8051 OPEN c_awds( l_fabase.base_id);
8052 LOOP
8053 FETCH c_awds INTO l_awds;
8054 EXIT WHEN c_awds%NOTFOUND;
8055
8056 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
8057 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'opened c_awds for l_fabase.base_id:'||l_fabase.base_id);
8058 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'calling calc_need using l_fabase.coa_f:'||l_fabase.coa_f||' l_fabase.coa_i:'||l_fabase.coa_i);
8059 END IF;
8060 l_awds.award := igf_aw_coa_gen.award_amount(l_fabase.base_id,g_awd_prd,l_awds.award_id);
8061 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
8062 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'Calling calc_need');
8063 END IF;
8064 calc_need(
8065 l_fabase.base_id,
8066 igf_aw_coa_gen.coa_amount(l_fabase.base_id,g_awd_prd),
8067 l_awds
8068 );
8069 END LOOP;
8070 CLOSE c_awds;
8071
8072 -- Once all the data is set in the Temp table. Start awarding funds to the students
8073
8074 l_chk := 0;
8075 LOOP -- This loop is to repackage a student if a fund fails
8076 SAVEPOINT START_PACK;
8077 l_fund_fail := FALSE;
8078
8079 IF l_chk = 0 THEN
8080 fnd_message.set_name('IGF','IGF_AW_PKG_EXCL_FND_CHK');
8081 fnd_file.put_line(fnd_file.log,fnd_message.get);
8082 ELSE
8083 fnd_file.put_line(fnd_file.log,' ');
8084 fnd_file.put_line(fnd_file.log,'------------------------------------------------- ');
8085 fnd_message.set_name('IGF','IGF_AW_PKG_EXCL_FND_RE_CHK');
8086 fnd_file.put_line(fnd_file.log,fnd_message.get);
8087 END IF;
8088
8089 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
8090 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'after calling excl_incl_check, calling process_stud with fund_id:'||l_fund_id);
8091 END IF;
8092 process_stud(
8093 l_fabase,
8094 l_frml_plcy.use_fixed_costs,
8095 l_post,
8096 l_run_mode,
8097 l_fund_id,
8098 l_seq_no,
8099 l_failed_award_id,
8100 l_fund_fail
8101 );
8102
8103 -- Fund failed for some reason. So repackage student
8104 IF ( l_fund_fail = TRUE ) THEN
8105
8106 ROLLBACK TO START_PACK;
8107
8108 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
8109 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'after process_stud,fund '||l_fund_id||' failed');
8110 END IF;
8111 -- Delete failed fund from the Temp Table
8112 update_fund( l_fund_id, l_seq_no, l_process_id, l_base_id ,l_failed_award_id);
8113
8114 -- Rerun Exclusive and Inclsive checks for remaining funds. This is necessary as there are
8115 -- chances that earlier rejected funds might get added/ existing funds might get removed,
8116 -- bcoz of the removal of the obove failed fund
8117 excl_incl_check( l_process_id, l_base_id, l_run_mode );
8118
8119 -- Exit from the loop If there are no funds remaining in the Temp table for awarding to the student.
8120 OPEN c_rem_fund(l_fabase.base_id);
8121 FETCH c_rem_fund INTO l_rem_cnt;
8122 CLOSE c_rem_fund;
8123
8124 IF NVL(l_rem_cnt,0) = 0 THEN
8125 EXIT;
8126 END IF;
8127
8128 ELSE
8129 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
8130 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'inside loop,after process_stud fund '||l_fund_id||' suceeded');
8131 END IF;
8132 EXIT;
8133 END IF;
8134
8135 l_chk := l_chk +1;
8136 IF l_chk > 100 THEN
8137 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
8138 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'inside loop,l_chk > 100.exiting loop');
8139 END IF;
8140 EXIT;
8141 END IF;
8142
8143 EXIT WHEN l_fund_fail = FALSE;
8144
8145 END LOOP; -- End of loop that is used to repackage a student if a fund fails
8146
8147 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
8148 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'after loop, calling post_award');
8149 END IF;
8150 -- Post the Award INTO the Actual tables
8151 -- Added g_upd_awd_notif_status parameter, as part of FACR008-Correspondence build,pmarada
8152 post_award(
8153 l_fabase.base_id,
8154 l_process_id,
8155 l_post,
8156 'P',
8157 g_upd_awd_notif_status,
8158 l_ret_status
8159 );
8160 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
8161 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'post_award returned successfully');
8162 END IF;
8163 IF l_ret_status = 'L' THEN
8164 ROLLBACK TO STUD_SP ;
8165
8166 --FUND MANAGER HAS BEEN LOCKED SKIPPING STUDENT
8167
8168 fnd_message.set_name('IGF', 'IGF_AW_AWARD_NOT_CREATED');
8169 fnd_file.put_line(fnd_file.output,fnd_message.get);
8170
8171 fnd_message.set_name('IGF', 'IGF_AW_FUND_LOCK_ERR');
8172 fnd_file.put_line(fnd_file.log,fnd_message.get);
8173
8174 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
8175 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'fund has been locked');
8176 END IF;
8177
8178 EXIT;
8179
8180 ELSIF l_ret_status = 'E' THEN
8181
8182 ROLLBACK TO STUD_SP;
8183
8184 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
8185 fnd_message.set_token('NAME','IGF_AW_PACKAGING.STUD_RUN ' || SQLERRM);
8186 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
8187 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.stud_run.exception '|| g_req_id,'sql error message: '||SQLERRM);
8188 END IF;
8189 igs_ge_msg_stack.conc_exception_hndl;
8190 fnd_message.set_name('IGF','IGF_SL_SKIPPING');
8191
8192 END IF;
8193
8194
8195 END LOOP; -- End of student loop
8196 CLOSE c_fabase;
8197 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
8198 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'closed c_fabase. stud_run returning');
8199 END IF;
8200 EXCEPTION
8201
8202 WHEN NON_MERGABLE_FUNDS THEN
8203 ROLLBACK TO STUD_SP;
8204 fnd_message.set_name('IGF','IGF_SL_SKIPPING');
8205 fnd_file.put_line(fnd_file.log,fnd_message.get || igf_aw_gen.lookup_desc('IGF_GE_PARAMETERS','PERSON_NUMBER') || ' : ' || l_pers_num);
8206 fnd_file.new_line(fnd_file.log,1);
8207
8208 WHEN INVALID_DISTR_PLAN THEN
8209 ROLLBACK TO STUD_SP;
8210 fnd_message.set_name('IGF','IGF_SL_SKIPPING');
8211 fnd_file.put_line(fnd_file.log,fnd_message.get || igf_aw_gen.lookup_desc('IGF_GE_PARAMETERS','PERSON_NUMBER') || ' : ' || l_pers_num);
8212 fnd_file.new_line(fnd_file.log,1);
8213
8214 WHEN INV_FWS_AWARD THEN
8215 ROLLBACK TO STUD_SP;
8216 fnd_message.set_name('IGF','IGF_SL_SKIPPING');
8217 fnd_file.put_line(fnd_file.log,fnd_message.get || igf_aw_gen.lookup_desc('IGF_GE_PARAMETERS','PERSON_NUMBER') || ' : ' || l_pers_num);
8218 fnd_file.new_line(fnd_file.log,1);
8219
8220 WHEN PELL_NO_REPACK THEN
8221 ROLLBACK TO STUD_SP;
8222 fnd_message.set_name('IGF','IGF_SL_SKIPPING');
8223 fnd_file.put_line(fnd_file.log,fnd_message.get || igf_aw_gen.lookup_desc('IGF_GE_PARAMETERS','PERSON_NUMBER') || ' : ' || l_pers_num);
8224 fnd_file.new_line(fnd_file.log,1);
8225
8226 WHEN OTHERS THEN
8227 ROLLBACK TO STUD_SP;
8228 fnd_file.put_line(fnd_file.log,SQLERRM);
8229 fnd_file.put_line(fnd_file.log,' ');
8230 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
8231 fnd_message.set_token('NAME','IGF_AW_PACKAGING.STUD_RUN ' || SQLERRM);
8232 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
8233 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.stud_run.exception '|| g_req_id,'sql error message: '||SQLERRM);
8234 END IF;
8235 igs_ge_msg_stack.conc_exception_hndl;
8236 fnd_message.set_name('IGF','IGF_SL_SKIPPING');
8237 fnd_file.put_line(fnd_file.log,fnd_message.get || igf_aw_gen.lookup_desc('IGF_GE_PARAMETERS','PERSON_NUMBER') || ' : ' || l_pers_num);
8238 fnd_file.put_line(fnd_file.log,' ');
8239
8240 -------------------------------------------------------------------------
8241 -- Important : Do not remove these comments
8242 -- APP_EXCEPTION.RAISE_EXCEPTION;
8243 -- As stud_run is called in loop; if a student fails any of the criteria
8244 -- then we should skip that record
8245 -- and proceed to the next record
8246 -- control should not come out NOCOPY at this point
8247 -- changes done for processing this record is rolled back
8248 -- upto savepoint STUD_SP
8249
8250 END stud_run;
8251
8252 FUNCTION isPhaseInParticipant(
8253 p_ci_cal_type igs_ca_inst.cal_type%TYPE,
8254 p_ci_sequence_number igs_ca_inst.sequence_number%TYPE
8255 ) RETURN BOOLEAN AS
8256 ------------------------------------------------------------------
8257 --Created by : veramach, Oracle India
8258 --Date created: 25-Oct-2004
8259 --
8260 --Purpose:
8261 --
8262 --
8263 --Known limitations/enhancements and/or remarks:
8264 --
8265 --Change History:
8266 --Who When What
8267 -------------------------------------------------------------------
8268
8269 -- Get pell participation type
8270 CURSOR c_pell_particip(
8271 cp_ci_cal_type igs_ca_inst.cal_type%TYPE,
8272 cp_ci_sequence_number igs_ca_inst.sequence_number%TYPE
8273 ) IS
8274 SELECT pell_participant_code
8275 FROM igf_ap_batch_aw_map_all
8276 WHERE ci_cal_type = cp_ci_cal_type
8277 AND ci_sequence_number = cp_ci_sequence_number;
8278 l_pell_participant_code igf_ap_batch_aw_map_all.pell_participant_code%TYPE;
8279
8280 BEGIN
8281 l_pell_participant_code := NULL;
8282 OPEN c_pell_particip(p_ci_cal_type,p_ci_sequence_number);
8283 FETCH c_pell_particip INTO l_pell_participant_code;
8284 CLOSE c_pell_particip;
8285 IF l_pell_participant_code = 'PHASE_IN_PARTICIPANT' THEN
8286 RETURN TRUE;
8287 ELSE
8288 RETURN FALSE;
8289 END IF;
8290 END isPhaseInParticipant;
8291
8292 PROCEDURE process_stud(
8293 l_fabase IN igf_ap_fa_base_rec%ROWTYPE,
8294 l_use_fixed_costs IN VARCHAR2,
8295 l_post IN VARCHAR2,
8296 l_run_mode IN VARCHAR2,
8297 l_fund_id OUT NOCOPY NUMBER,
8298 l_seq_no OUT NOCOPY NUMBER,
8299 l_award_id OUT NOCOPY NUMBER,
8300 l_fund_fail OUT NOCOPY BOOLEAN
8301 ) IS
8302 /*
8303 || Created By : avenkatr
8304 || Created On : 11-JUN-2001
8305 || Purpose :
8306 || Known limitations, enhancements or remarks :
8307 || Change History :
8308 || Who WHEN What
8309 || museshad 15-Jun-2005 Build# FA157 - Bug# 4382371.
8310 || 1)Added the parameters - awarding period, 'PACKAGING' in the call to
8311 || igf_aw_packng_subfns.check_loan_limits(). This procedure computes
8312 || the class standing. These two parameters are added, so that it
8313 || gets the Class Standing from anticipated data, if actual data is
8314 || not available. Note, that as of now only the Packaging process
8315 || passes these two parameters.
8316 || 2) Modified the award amount rounding logic
8317 || veramach 14-Jun-2004 bug 3684031 - Added a check in cursor 'cur_fund_awd_exist' so that cancelled awards
8318 || are reconsidered while awarding
8319 || veramach 08-Dec-2003 FA 131 COD Updates
8320 || Added validations so that the pell wrapper is called with different parameters
8321 || when student has COA and student does not have COA
8322 || This is required for the pell wrapper to distribute the award
8323 || veramach 03-Dec-2003 FA 131 COD Updates
8324 || Modifies the pell wrapper used to calculate pell award amount
8325 || veramach 20-NOV-2003 FA 125 Build - cursor c_fund selects adplans_id also
8326 || cursor c_get_term_prsnt uses adplans_id instead of fund_id to find matching terms %
8327 || c_awd_grp cursor selects adplans_id
8328 || veramach 13-OCT-2003 FA 124 Build - Added logic as specified in the logic flow specified in the TD
8329 || rasahoo 01-09-2003 Removed Cursor C_ENROLL_STATUS as part of FA-114 (Obsoletion
8330 || of base record history)
8331 || brajendr 09-Dec-2002 Bug # 2676394
8332 || Modified the logic for calculating the EFC value. Code for retriving
8333 || the value from efc_det table is replaced with igf_aw_packng_subfns.get_fed_efc
8334 ||
8335 || ssawhney 31october introduce check for FSEOG matching fund percentage
8336 || (reverse chronological order - newest change first)
8337 */
8338
8339 -- Retrieves all the funds that are part of the Formula Code in Sequence
8340 -- It has a link to igf_aw_award_t with a flag = 'CF' ie the valid funds
8341 CURSOR c_fund(
8342 x_group_code igf_aw_target_grp_all.group_cd%TYPE,
8343 x_ci_cal_type igf_ap_fa_base_rec_all.ci_cal_type%TYPE,
8344 x_ci_sequence_number igf_ap_fa_base_rec_all.ci_sequence_number%TYPE,
8345 x_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
8346 x_process_id NUMBER
8347 ) IS
8348 SELECT TO_NUMBER(awt.temp_char_val1) seq_no,
8349 awt.fund_id fund_id,
8350 awt.temp_val3_num max_award_amt,
8351 awt.temp_val4_num min_award_amt,
8352 awt.adplans_id adplans_id,
8353 fmast.replace_fc replace_fc,
8354 fmast.fund_code,
8355 awt.lock_award_flag,
8356 fmast.fm_fc_methd,
8357 fcat.fund_source fund_source,
8358 awt.award_id,
8359 awt.offered_amt
8360 FROM igf_aw_award_t awt,
8361 igf_aw_fund_mast_all fmast,
8362 igf_aw_fund_cat_all fcat
8363 WHERE awt.fund_id = fmast.fund_id
8364 AND fmast.fund_code = fcat.fund_code
8365 AND awt.base_id = x_base_id
8366 AND awt.flag IN ('CF','AU')
8367 AND process_id = l_process_id
8368 AND g_sf_packaging = 'F'
8369
8370 UNION
8371 SELECT 1 seq_no,
8372 fmast.fund_id fund_id,
8373 max_award_amt,
8374 min_award_amt,
8375 awt1.adplans_id,
8376 replace_fc,
8377 fmast.fund_code,
8378 awt1.lock_award_flag,
8379 fmast.fm_fc_methd,
8380 fcat.fund_source fund_source,
8381 awt1.award_id,
8382 awt1.offered_amt
8383 FROM igf_aw_fund_mast_all fmast ,
8384 igf_aw_award_t awt1,
8385 igf_aw_fund_cat_all fcat
8386 WHERE g_sf_packaging = 'T'
8387 AND fmast.fund_id = g_sf_fund
8388 AND fmast.fund_id = awt1.fund_id
8389 AND fmast.fund_code = fcat.fund_code
8390 AND awt1.flag IN ('CF','AU')
8391 AND awt1.process_id = x_process_id
8392 AND awt1.base_id = x_base_id
8393 ORDER BY 1;
8394
8395 l_fund c_fund%ROWTYPE;
8396
8397 -- Retrieves fund Properties
8398 CURSOR c_fmast ( cp_fund_id igf_aw_fund_mast.fund_id%TYPE ) IS
8399 SELECT fmast.*,
8400 fcat.fund_type,
8401 fcat.fund_source,
8402 fcat.fed_fund_code,
8403 fcat.sys_fund_type,
8404 'Y' emulate_fed,
8405 DECODE(fmast.fm_fc_methd,'INSTITUTIONAL','Y','N') inst_method
8406 FROM igf_aw_fund_mast_all fmast ,
8407 igf_aw_fund_cat fcat
8408 WHERE fmast.fund_id = cp_fund_id
8409 AND fcat.fund_code = fmast.fund_code;
8410
8411 l_fmast c_fmast%ROWTYPE;
8412
8413 -- Gets the Total amount awarded for a fund from the temporary table
8414 CURSOR c_temp(
8415 x_process_id igf_aw_award_t.process_id%TYPE ,
8416 x_fund_id igf_aw_award_t.fund_id%TYPE,
8417 x_base_id igf_aw_award_t.base_id%TYPE
8418 ) IS
8419 SELECT NVL(SUM(offered_amt),0) offered
8420 FROM igf_aw_award_t awdt
8421 WHERE awdt.base_id = x_base_id
8422 AND awdt.fund_id = x_fund_id
8423 AND awdt.process_id = x_process_id
8424 AND awdt.flag = 'AW';
8425
8426 l_temp c_temp%ROWTYPE;
8427
8428 -- Check whether the fund is resulted in over award or not
8429 CURSOR c_cur_ovr_awd ( x_fund_id igf_aw_fund_mast.fund_id%TYPE ) IS
8430 SELECT awdt.*
8431 FROM igf_aw_award_t awdt
8432 WHERE awdt.fund_id = x_fund_id
8433 AND flag = 'OV'
8434 AND process_id = l_process_id;
8435
8436 l_cur_ovr_awd c_cur_ovr_awd%ROWTYPE;
8437
8438 -- Get the Pell Attendance code for a given attendance type
8439 CURSOR c_enrollment (cp_derived VARCHAR2) IS
8440 SELECT pell_att_code
8441 FROM igf_ap_attend_map
8442 WHERE attendance_type = cp_derived;
8443
8444 l_enroll_st_rec c_enrollment%ROWTYPE;
8445 l_enroll_st_rec_d c_enrollment%ROWTYPE;
8446
8447 -- Enhancement bug no 1818617, pmarada
8448 -- Get the Maximum Year Amount which is award to a student for a given fund
8449 -- ???? Common Terms
8450 CURSOR c_max_yr_amt(
8451 cp_fund_id igf_aw_award_all.fund_id%TYPE,
8452 cp_base_id igf_aw_award_all.base_id%TYPE
8453 ) IS
8454 SELECT SUM(disb.disb_gross_amt) yr_total
8455 FROM igf_aw_awd_disb_all disb,
8456 igf_aw_award_all awd,
8457 igf_aw_fund_mast_all fmast
8458 WHERE disb.award_id = awd.award_id
8459 AND fmast.fund_id = awd.fund_id
8460 AND fmast.fund_id = cp_fund_id
8461 AND awd.base_id = cp_base_id
8462 AND awd.award_status IN ('OFFERED','ACCEPTED')
8463 AND disb.trans_type <> 'C';
8464
8465 l_max_yr_amt c_max_yr_amt%ROWTYPE;
8466
8467 --Cursor to fetch the Person Number for the base id.
8468 CURSOR c_person_number( cp_base_id igf_ap_fa_base_rec.base_id%TYPE ) IS
8469 SELECT pe.party_number person_number
8470 FROM hz_parties pe,
8471 igf_ap_fa_base_rec_all fabase
8472 WHERE fabase.base_id = cp_base_id
8473 AND pe.party_id = fabase.person_id;
8474
8475 l_person_number c_person_number%ROWTYPE;
8476
8477 --
8478 -- Gets the max amt + max terms the student got a fund in a lifetime
8479 --
8480 -- ???? Common Terms
8481 CURSOR cur_max_lf_count ( cp_fund_code igf_aw_fund_mast_all.fund_code%TYPE ,
8482 cp_person_id igf_ap_fa_base_rec_all.person_id%TYPE)
8483 IS
8484 SELECT
8485 NVL(SUM(NVL(disb.disb_gross_amt,0)),0) lf_total,
8486 COUNT(DISTINCT awd.award_id) lf_count
8487 FROM
8488 igf_aw_awd_disb_all disb,
8489 igf_aw_award_all awd,
8490 igf_aw_fund_mast_all fmast,
8491 igf_ap_fa_base_rec_all fabase
8492 WHERE fmast.fund_code = cp_fund_code
8493 AND disb.award_id = awd.award_id
8494 AND awd.fund_id = fmast.fund_id
8495 AND awd.base_id = fabase.base_id
8496 AND fabase.person_id = cp_person_id
8497 AND disb.trans_type <> 'C'
8498 AND awd.award_status IN ('OFFERED', 'ACCEPTED');
8499
8500 max_lf_count_rec cur_max_lf_count%ROWTYPE;
8501
8502 --
8503 -- Cursor to Aggregate Award and Count
8504 --
8505 CURSOR cur_agg_lf_count ( cp_fund_code igf_aw_fund_mast_all.fund_code%TYPE ,
8506 cp_person_id igf_ap_fa_base_rec_all.person_id%TYPE)
8507 IS
8508 SELECT NVL(SUM(NVL(awd.offered_amt,0)),0) lf_total,
8509 COUNT(awd.award_id) lf_count
8510 FROM igf_aw_award_all awd,
8511 igf_aw_fund_mast_all fmast,
8512 igf_ap_fa_base_rec fabase,
8513 igf_ap_batch_aw_map_all bam
8514 WHERE fmast.fund_code = cp_fund_code
8515 AND awd.fund_id = fmast.fund_id
8516 AND awd.base_id = fabase.base_id
8517 AND fabase.person_id = cp_person_id
8518 AND fabase.ci_cal_type = bam.ci_cal_type
8519 AND fabase.ci_sequence_number = bam.ci_sequence_number
8520 AND awd.award_status IN ('OFFERED', 'ACCEPTED')
8521 AND bam.award_year_status_code IN ('LA','LE');
8522
8523 agg_lf_count_rec cur_agg_lf_count%ROWTYPE;
8524
8525 -- Get all the funds from te temp table whose consolidated records are calculated
8526 CURSOR c_awd_grp_funds(
8527 x_fund_id igf_aw_award_t.fund_id%TYPE,
8528 x_base_id igf_aw_award_t.base_id%TYPE,
8529 x_process_id igf_aw_award_t.process_id%TYPE
8530 ) IS
8531 SELECT awdt.row_id row_id
8532 FROM igf_aw_award_t awdt
8533 WHERE awdt.process_id = x_process_id
8534 AND awdt.base_id = x_base_id
8535 AND awdt.fund_id = x_fund_id
8536 AND flag = 'AW';
8537
8538 l_awd_grp_funds c_awd_grp_funds%ROWTYPE;
8539 /*
8540 -- ssawhney FISAP DLD
8541 -- first cursor to get the fund matching method and percentage details.
8542 -- it is assumed that there will always be only one record in the FA SETUP
8543 -- CURSOR c_match_method IS
8544 -- SELECT fa.fseog_match_mthd, fa.fseog_fed_pct
8545 -- FROM igf_ap_fa_setup fa;
8546
8547 -- l_method_rec c_match_method%ROWTYPE;
8548
8549 -- now select whether there is any FSEOG Fund Type in the passed combination of
8550 -- of process_id and base_id, No need to check for calendar details.
8551 CURSOR c_find_fseog(
8552 cp_base_id igf_aw_award_t.base_id%TYPE ,
8553 cp_process_id igf_aw_award_t.process_id%TYPE
8554 ) IS
8555 SELECT COUNT(*) cnt, fm.fund_id
8556 FROM igf_aw_fund_mast_all fm,
8557 igf_aw_fund_cat_all ca
8558 WHERE fm.fund_code = ca.fund_code
8559 AND ca.fed_fund_code ='FSEOG'
8560 AND fm.fund_id IN ( SELECT awdt.fund_id
8561 FROM igf_aw_award_t awdt
8562 WHERE awdt.process_id = cp_process_id
8563 AND awdt.base_id = cp_base_id )
8564 GROUP BY fm.fund_id;
8565
8566 l_fseog_rec c_find_fseog%ROWTYPE;
8567
8568 -- now get the matching fund ids for the FSEOG Fund in that award year
8569 -- note this table will have all match funds for the FSEOG fund type in that award yr
8570 -- but it doesnt store the FSEOG Fund_id
8571 CURSOR c_find_match(
8572 cp_ci_cal_type igf_aw_fseog_match.ci_cal_type%TYPE,
8573 cp_ci_sequence_number igf_aw_fseog_match.ci_sequence_number%TYPE
8574 ) IS
8575 SELECT fsm.fund_id
8576 FROM igf_aw_fseog_match fsm
8577 WHERE fsm.ci_cal_type = cp_ci_cal_type
8578 AND fsm.ci_sequence_number = cp_ci_sequence_number
8579 ORDER BY fsm.fund_id;
8580
8581 -- get the sum of offered amout of fund passed as variable.
8582 CURSOR c_get_fund_sum(
8583 cp_fund_id igf_aw_award_t.fund_id%TYPE ,
8584 cp_base_id igf_aw_award_t.base_id%TYPE ,
8585 cp_process_id igf_aw_award_t.process_id%TYPE
8586 ) IS
8587 SELECT NVL(SUM(awdt.offered_amt),0) offered_amt
8588 FROM igf_aw_award_t awdt
8589 WHERE awdt.fund_id= cp_fund_id
8590 AND awdt.process_id = cp_process_id
8591 AND awdt.base_id = cp_base_id
8592 AND awdt.flag = 'AW'
8593 UNION ALL
8594 SELECT NVL(SUM(awd.offered_amt),0) offered_amt
8595 FROM igf_aw_award_all awd
8596 WHERE awd.fund_id = cp_fund_id
8597 AND awd.base_id=cp_base_id
8598 AND award_status NOT IN ('DECLINED','CANCELLED','STOPPED');
8599 commented for FISAP
8600 */
8601
8602 -- Get the remaining EFC of the student from the Temp Table
8603 CURSOR c_rem_efc IS
8604 SELECT *
8605 FROM igf_aw_award_t
8606 WHERE process_id = l_process_id
8607 AND base_id = l_fabase.base_id
8608 AND flag IN ('ND','AA');
8609
8610 l_rem_efc c_rem_efc%ROWTYPE;
8611
8612 --
8613 -- Get the total number of NON Simulated Awards of a student for a fund
8614 -- This cursor is used to know if the person is having awards from the
8615 -- fund, if there are awards then do not re-package
8616 -- -- ???? Common Terms
8617 CURSOR cur_fund_awd_exist (cp_fund_id igf_aw_fund_mast_all.fund_id%TYPE,
8618 cp_base_id igf_aw_award_all.base_id%TYPE)
8619 IS
8620 SELECT COUNT(award_id) cnt
8621 FROM igf_aw_award_all
8622 WHERE base_id = cp_base_id
8623 AND fund_id = cp_fund_id
8624 AND award_status NOT IN ('SIMULATED','CANCELLED');
8625
8626 l_chk_fund NUMBER;
8627
8628 -- Get all the Loan Awards of the students which were already awarded or yet to be awarded
8629 CURSOR c_std_ln_awd(
8630 cp_base_id igf_ap_fa_base_rec.base_id%TYPE,
8631 cp_process_id igf_aw_award_t.process_id%TYPE
8632 ) IS
8633 SELECT fcat.fund_code fund_code,
8634 fed_fund_code,
8635 NVL(awd.offered_amt,0) offered_amt ,
8636 award_date
8637 FROM igf_aw_award_all awd,
8638 igf_aw_fund_mast_all fm,
8639 igf_aw_fund_cat_all fcat
8640 WHERE awd.award_status IN ('OFFERED','ACCEPTED')
8641 AND awd.base_id = cp_base_id
8642 AND awd.fund_id = fm.fund_id
8643 AND fm.fund_code = fcat.fund_code
8644 AND fcat.fed_fund_code IN ('FLS','FLU','DLS','DLU')
8645 AND awd.award_id NOT IN (SELECT award_id
8646 FROM igf_aw_award_t
8647 WHERE award_id IS NOT NULL
8648 AND base_id = cp_base_id
8649 AND process_id = cp_process_id
8650 AND flag IN ('AU','AW'))
8651 /* Fetches all awards that are not getting repackaged */
8652 UNION
8653 SELECT fcat.fund_code fund_code,
8654 fed_fund_code,
8655 NVL(awdt.offered_amt,0),
8656 SYSDATE award_date
8657 FROM igf_aw_Award_t awdt,
8658 igf_aw_fund_mast_all fmt,
8659 igf_aw_fund_cat_all fcat
8660 WHERE awdt.base_id = cp_base_id
8661 AND awdt.process_id = cp_process_id
8662 AND awdt.fund_id = fmt.fund_id
8663 AND awdt.flag = 'AW'
8664 AND fmt.fund_code = fcat.fund_code
8665 AND fcat.fed_fund_code IN ('FLS','FLU','DLS','DLU');
8666 /* Fetches all awards that have been awarded or got repackaged */
8667
8668 l_std_ln_awd_rec c_std_ln_awd%ROWTYPE;
8669
8670 -- Get the details of term percent
8671 CURSOR c_get_term_prsnt(
8672 cp_adplans_id igf_aw_awd_dist_plans.adplans_id%TYPE,
8673 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE
8674 ) IS
8675 SELECT terms.ld_perct_num,
8676 terms.ld_cal_type,
8677 terms.ld_sequence_number
8678 FROM igf_aw_dp_terms terms
8679 WHERE terms.adplans_id = cp_adplans_id
8680 AND EXISTS (SELECT ld_cal_type,
8681 ld_sequence_number
8682 FROM igf_aw_coa_itm_terms coat
8683 WHERE coat.base_id = cp_base_id
8684 AND coat.ld_cal_type = terms.ld_cal_type
8685 AND coat.ld_sequence_number = terms.ld_sequence_number
8686 );
8687 lc_get_term_prsnt c_get_term_prsnt%ROWTYPE;
8688
8689
8690 TYPE awd_grp_rec IS RECORD(
8691 fund_id igf_aw_fund_mast.fund_id%TYPE,
8692 fund_Code igf_aw_fund_mast_v.fund_code%TYPE,
8693 offered_amt igf_aw_award_t.offered_amt%TYPE,
8694 accepted_amt igf_aw_award_t.accepted_Amt%TYPE,
8695 total NUMBER,
8696 seq_no igf_aw_awd_frml_det.seq_no%TYPE,
8697 adplans_id igf_aw_awd_dist_plans.adplans_id%TYPE,
8698 award_id igf_aw_award_all.award_id%TYPE,
8699 lock_award_flag igf_aw_award_all.lock_award_flag%TYPE
8700 );
8701
8702 l_awd_grp awd_grp_rec;
8703 TYPE awd_grp IS REF CURSOR RETURN awd_grp_rec;
8704
8705 TYPE efc_cur IS REF CURSOR;
8706
8707
8708 l_need_set BOOLEAN;
8709 l_need NUMBER(12,2) := 0;
8710 l_need_f NUMBER(12,2) := 0;
8711 l_need_VB_AC_f NUMBER(12,2) := 0;
8712 l_need_bkup_f NUMBER(12,2) := 0;
8713 l_need_i NUMBER(12,2) := 0;
8714 l_need_VB_AC_i NUMBER(12,2) := 0;
8715 l_need_bkup_i NUMBER(12,2) := 0;
8716 l_net_need_f NUMBER(12,2) := 0;
8717 l_net_need_i NUMBER(12,2) := 0;
8718 l_rem_rep_efc_f NUMBER(12,2) := 0;
8719 l_rem_rep_efc_i NUMBER(12,2) := 0;
8720 l_old_need NUMBER(12,2) := 0;
8721 l_fund_total NUMBER(12,2) := 0;
8722 l_aid NUMBER := 0; -- Changed this from NUMBER(12,2) to NUMBER
8723 l_remaining_amt NUMBER(12,2) := 0;
8724 l_overaward NUMBER(12,2) := 0;
8725 l_accepted_amt NUMBER(12,2) := 0;
8726 l_actual_aid NUMBER(12,2) := 0;
8727 l_total_fund_amnt NUMBER(12,2) := 0;
8728 l_round_tol_ant NUMBER(12,2) := 0;
8729 lv_rowid VARCHAR2(25);
8730 l_sl_number NUMBER(15);
8731 l_found BOOLEAN;
8732 l_match_fund_id igf_aw_award_t.fund_id%TYPE;
8733 l_total_match_amnt NUMBER(12,2) := 0;
8734 l_match_sum NUMBER(12,2) := 0;
8735 l_est_match_amnt NUMBER(12,2) := 0;
8736 l_efc_cur efc_cur;
8737 l_efc_qry VARCHAR2(1500);
8738 l_efc igf_ap_isir_matched.paid_efc%TYPE := 0;
8739 l_pell_efc igf_ap_isir_matched.paid_efc%TYPE := 0;
8740 l_emulate_fed VARCHAR2(30);
8741 l_inst_method VARCHAR2(30);
8742 l_efc_months NUMBER;
8743 l_rem_rep_efc NUMBER;
8744 l_cnt NUMBER := 0;
8745 l_rec_fnd BOOLEAN := FALSE;
8746 c_awd_grp awd_grp;
8747 l_std_loan_tab igf_aw_packng_subfns.std_loan_tab := igf_aw_packng_subfns.std_loan_tab();
8748 l_reccnt NUMBER := 0;
8749 l_msg_name fnd_new_messages.message_name%TYPE;
8750 ln_award_perct NUMBER(5,2) := 100; -- To store the common terms percentage
8751 l_efc_ay NUMBER := 0;
8752 l_reset_need BOOLEAN := FALSE;
8753 lv_prof_value VARCHAR2(10);
8754
8755 -- Find if student already has FM awards
8756 CURSOR c_fm_awards(
8757 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
8758 cp_process_id igf_aw_award_t.process_id%TYPE
8759 ) IS
8760 SELECT fmast.fm_fc_methd fm_fc_methd
8761 FROM igf_aw_fund_mast_all fmast,
8762 igf_aw_award_all awd
8763 WHERE awd.fund_id = fmast.fund_id
8764 AND awd.base_id=cp_base_id
8765 AND fmast.fm_fc_methd = 'FEDERAL'
8766 UNION
8767 SELECT awd_t.temp_char_val1 fm_fc_methd
8768 FROM igf_aw_award_t awd_t
8769 WHERE awd_t.base_id = cp_base_id
8770 AND awd_t.temp_char_val1 = 'FEDERAL'
8771 and awd_t.flag = 'AA'
8772 and awd_t.process_id = cp_process_id;
8773
8774 l_fm_awards c_fm_awards%ROWTYPE;
8775
8776 l_existing_awards NUMBER := 0;
8777
8778 lv_result VARCHAR2(80);
8779 lv_method_code igf_aw_awd_dist_plans.dist_plan_method_code%TYPE;
8780 lv_method_name igf_aw_awd_dist_plans.awd_dist_plan_cd_desc%TYPE;
8781 lv_method_desc igf_aw_awd_dist_plans_v.dist_plan_method_code_desc%TYPE;
8782
8783 ln_com_perct NUMBER;
8784
8785 l_pell_seq_id igf_gr_pell_setup_all.pell_seq_id%TYPE;
8786 lv_message fnd_new_messages.message_text%TYPE;
8787 lv_return_status VARCHAR2(10);
8788 l_pell_schedule_code igf_aw_award_all.alt_pell_schedule%TYPE;
8789
8790 lv_called_from VARCHAR2(80);
8791 lb_coa_defined BOOLEAN;
8792
8793
8794 CURSOR c_temp_awd(
8795 cp_award_id igf_aw_award_all.award_id%TYPE
8796 ) IS
8797 SELECT *
8798 FROM igf_aw_award_t
8799 WHERE award_id = cp_award_id
8800 AND process_id = l_process_id
8801 AND flag = 'AU';
8802 l_temp_awd c_temp_awd%ROWTYPE;
8803
8804 CURSOR cur_term_amounts(
8805 p_award_id NUMBER
8806 ) IS
8807 SELECT disb.ld_cal_type,
8808 disb.ld_sequence_number,
8809 disb.base_attendance_type_code,
8810 SUM(disb.disb_gross_amt) term_total,
8811 awd.adplans_id
8812 FROM igf_aw_awd_disb_all disb,
8813 igf_aw_award_all awd
8814 WHERE awd.award_id = disb.award_id
8815 AND awd.award_id = p_award_id
8816 GROUP BY disb.ld_cal_type,
8817 disb.ld_sequence_number,
8818 disb.base_attendance_type_code,
8819 awd.adplans_id;
8820 l_term_aid NUMBER;
8821
8822 -- Get first disb date for a term
8823 CURSOR c_first_disb_dt(
8824 cp_award_id igf_aw_award_all.award_id%TYPE,
8825 cp_ld_cal_type igs_ca_inst.cal_type%TYPE,
8826 cp_ld_sequence_number igs_ca_inst.sequence_number%TYPE
8827 ) IS
8828 SELECT disb_date,
8829 tp_cal_type,
8830 tp_sequence_number
8831 FROM igf_aw_awd_disb_all
8832 WHERE award_id = cp_award_id
8833 AND ld_cal_type = cp_ld_cal_type
8834 AND ld_sequence_number = cp_ld_sequence_number
8835 AND ROWNUM = 1
8836 ORDER BY disb_date;
8837 l_first_disb_dt c_first_disb_dt%ROWTYPE;
8838 l_term_start DATE;
8839 l_term_end DATE;
8840 lv_msg_text VARCHAR2(2000);
8841 ln_msg_index NUMBER;
8842
8843 l_pell_setup_rec igf_gr_pell_setup_all%ROWTYPE;
8844 l_pell_attend_type VARCHAR2(30);
8845 l_message fnd_new_messages.message_text%TYPE;
8846 l_return_status VARCHAR2(30);
8847 l_program_cd igs_en_stdnt_ps_att.course_cd%TYPE;
8848 l_program_version igs_en_stdnt_ps_att.version_number%TYPE;
8849
8850 BEGIN
8851
8852 /*
8853 Do All the fund checks, Pick all the funds from the the Award Formulas and Temp table if the
8854 Trarget groups are mentioned else pick the fund details from the fund manager and temp table.
8855 ( Here Temp table contains all the funds which need be awarded for the student)
8856
8857 1. For each fund from the above cursor get the fund details from the fund master.
8858 2. Check whether the fund is present in the fund master, if not present then skip the fund with log message.
8859 3. If the fund is not allowed for auto packaging then skip the fund with log message.
8860 4. If the fund is already awarded to the student ( NON SIMULATED ) then skip the fund with the log message.
8861 5. If the fund is not having Teaching Periods defined for all the load calendars, then skip the fund with the log message
8862 6. Calculate the EFC, Remaining EFC and Need for the student for the given federal method. If these details are not present
8863 for the student in the Temp table then calculate these and insert also into Temp table with flag as 'ND'
8864 7. If the context fund is PELL, then get the PELL award amount form the PELL Regular or Alternate Matrix
8865 And do all the entilement checks etc
8866 a. If fund is Entitlement, then the student will get the awarded aid irrespective of target group level max limits.
8867 and for non Entitlement funds group level limits should be enforced ( Bug 3400556 ). At the same time update the running totals
8868 The following check are performed
8869 i. Check for the Max Grant Amount limit
8870 ii. Check for the Max Self Help Amount limit
8871 iii. Check for the Max Gift Aid Amount limit
8872 iv. Check for the Max Scholarship Amount limit
8873 v. Check whether the award aid amount is crosing Max slab amount
8874 b. If the fund package status is accepted, then update the accepted amount of the award
8875 c. Set the Global award percentage to 100 as we are not considering the common terms for PELL.
8876 8. If the fund is NOT PELL then
8877 a. Check whether the student is still having the Need, if not having and fund is
8878 not entilement or not replace FC then skip the fund and start awarding.
8879 b. Get the total awarding amount for the context fund. ( Sum up from the temp table with the flag = 'AW' for the fund id + base id )
8880 c. Get the Max amount limits defined at the fund level or target group level and award the student with that amount.
8881 d. Decrease the Awarded Aid upto the extent of the common terms present at the COA Items and at the FUND.
8882 Sum up all the percentages for the common terms and set to global variable.
8883 e. If the Replace EFC is set for the fund and it is not already awarded then update students need. (Replace for the fund can
8884 be considered only once for the fund. this check is not present for PELL as pell can be awarded only once for a student)
8885 f. Check whether the award can be given with the overaward limit defined at the fund if the available amount defined at
8886 the fund is vanished. ( This is making use of execeeding fund limits with the over award %)
8887 g. Check whether the award is vaoilating the Max limit of fund, then award upto max limit.
8888 h. If the fund is Entitlement then award aid upto the need of the student.
8889 i. Check for students Maximum Yearly amount for context fund.
8890 j. Check whether the student has already exceed the Max Life Terms (Maximum time student can get the fund), then log a message and skip the fund
8891 k. Check for students Maximum Life amount for context fund.
8892 l. Do all fund specific checks
8893 i. Check for the Max Grant Amount limit
8894 ii. Check for the Max Work Amount limit
8895 iii. Check for the Max Self Help Amount limit
8896 iv. Check for the Max Gift Aid Amount limit
8897 v. Check for the Max Scholarship Amount limit
8898 vi. Check whether the award aid amount is crosing Max slab amount
8899 m. For LOANS, check for max loan amount
8900 i. Update the Loans PL/SQL table with offered amounts and fund details
8901 ii. Check for the loan limits set at Target group level.
8902 n. check for the Minimum award Amount, If awarded aid is less then log a message and skip the fund.
8903 o. If the awarded Aid is less than ZERO then log a message and skip the fund.
8904 p. If the fund package status is accepted, then update the accepted amount of the award.
8905 q. Update the Remaining Amount and Over Award Limt for the fund as these were changed after the current award.
8906 9. Now the Actual Aid is calculated. Insert this award into the Temp table.
8907 10. If Replace FC and Update Need are set. Accordingly update the running totals in the Temp tables.
8908 This amounts will be used while awarding the same fund once again as specified in the Target Group.
8909
8910 */
8911
8912 -- initialise package variables.
8913 l_fund_fail := FALSE;
8914 l_actual_grant_amt := 0;
8915 l_actual_loan_amt := 0;
8916 l_actual_work_amt := 0;
8917 l_actual_shelp_amt := 0;
8918 l_actual_gift_amt := 0;
8919 l_actual_schlp_amt := 0;
8920
8921 -- Get the need
8922 -- Set Remaining FC
8923
8924 -- Bug NUMBER: 2402622 (Need Analysis Issues)
8925 -- Calculation of teaching period months and federal verification status
8926 -- are moved out NOCOPY of fund loop as they are independent of fund
8927 -- Get the EFC months
8928 l_efc_months := igf_aw_coa_gen.coa_duration(l_fabase.base_id,g_awd_prd);
8929
8930 IF l_efc_months > 12 OR l_efc_months < 1 THEN
8931 l_efc_months := 12;
8932 END IF;
8933
8934 -- Get the Funds That need to be awarded to the student
8935 -- Loop through for all the funds in the Temp table
8936
8937 -- Main loop
8938
8939 OPEN c_fund(
8940 l_fabase.target_group,
8941 l_fabase.ci_cal_type,
8942 l_fabase.ci_sequence_number,
8943 l_fabase.base_id,
8944 l_process_id
8945 );
8946 LOOP
8947
8948 FETCH c_fund INTO l_fund;
8949 EXIT WHEN c_fund%NOTFOUND; -- Exit when all the funds were awarded
8950
8951 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
8952 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'----opened c_fund and it fetched----');
8953 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_fund.seq_no:'||l_fund.seq_no);
8954 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_fund.fund_id:'||l_fund.fund_id);
8955 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_fund.max_award_amt:'||l_fund.max_award_amt);
8956 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_fund.min_award_amt:'||l_fund.min_award_amt);
8957 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_fund.seq_no:'||l_fund.seq_no);
8958 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_fund.award_id:'||l_fund.award_id);
8959 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'------------------------------------');
8960 END IF;
8961
8962 l_seq_no := l_fund.seq_no;
8963 l_aid := 0;
8964 l_need := 0;
8965 l_efc := 0;
8966 l_rem_rep_efc := 0;
8967 l_reset_need := FALSE;
8968
8969 fnd_file.new_line(fnd_file.log,1);
8970 fnd_message.set_name('IGF','IGF_AW_PROC_FUND');
8971 fnd_message.set_token('FUND',l_fund.fund_code);
8972 fnd_file.put_line(fnd_file.log,fnd_message.get);
8973
8974 IF (NOT(g_sf_packaging = 'T' AND g_allow_to_exceed = 'COA')) THEN
8975 -- Based on the fund Methodology, check whether the student has either ISIR or PROFILE, if not log an error message
8976 IF (
8977 (l_fund.fm_fc_methd = 'FEDERAL' AND g_sf_packaging <> 'T' ) OR
8978 (l_fund.fund_source = 'FEDERAL' AND g_sf_packaging = 'T' AND get_fed_fund_code(l_fund.fund_id) NOT IN ('DLP','FLP'))
8979 )
8980 THEN
8981
8982 IF hasActiveIsir(l_fabase.base_id) IS NULL THEN
8983 l_fund_id := l_fund.fund_id;
8984 l_fund_fail := TRUE;
8985 l_award_id := l_fund.award_id;
8986 l_person_number := NULL;
8987 OPEN c_person_number(l_fabase.base_id);
8988 FETCH c_person_number INTO l_person_number;
8989 CLOSE c_person_number;
8990 fnd_message.set_name('IGF','IGF_AW_NO_ISIR');
8991 fnd_message.set_token('STDNT',l_person_number.person_number);
8992 fnd_file.put_line(fnd_file.log,fnd_message.get);
8993
8994 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
8995 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'no active ISIR for '||l_person_number.person_number);
8996 END IF;
8997
8998 EXIT;
8999 END IF;
9000
9001 ELSIF l_fund.fm_fc_methd = 'INSTITUTIONAL' THEN
9002
9003
9004 IF hasActiveProfile(l_fabase.base_id) IS NOT NULL THEN
9005 --student has no profile
9006 fnd_message.set_name('IGF','IGF_AP_NO_ACTIVE_PROFILE');
9007 fnd_file.put_line(fnd_file.log,fnd_message.get);
9008 l_fund_id := l_fund.fund_id;
9009 l_fund_fail := TRUE;
9010 l_award_id := l_fund.award_id;
9011 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9012 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'exiting as student has no active profile');
9013 END IF;
9014 EXIT;
9015 END IF;
9016 END IF;
9017 END IF;
9018
9019 -- Get the Fund Properties
9020 OPEN c_fmast ( l_fund.fund_id );
9021 LOOP
9022 FETCH c_fmast INTO l_fmast;
9023 IF c_fmast%NOTFOUND THEN
9024
9025 fnd_message.set_name('IGF','IGF_AW_PK_FUND_NOT_EXIST');
9026 fnd_message.set_token('FUND',l_fund.fund_code);
9027 fnd_file.put_line(fnd_file.log,fnd_message.get);
9028 l_fund_id := l_fund.fund_id;
9029 l_fund_fail := TRUE;
9030 l_award_id := l_fund.award_id;
9031 EXIT;
9032 END IF;
9033
9034 g_fm_fc_methd := l_fmast.fm_fc_methd;
9035 --
9036 -- Get the Max amount limit defined for the fund. if defined at group level then get it else get from fund manager
9037 -- Then award the student with that amount
9038 --
9039 IF ( NVL(l_fund.max_award_amt,0) > 0 ) THEN
9040 -- Take the formula level Max amt as base
9041 l_fmast.max_award_amt := l_fund.max_award_amt;
9042 END IF;
9043
9044 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9045 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'------------------ Fund Code :'||l_fund.fund_code||'------------------');
9046 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'starting process_stud with g_sf_packaging:'||g_sf_packaging);
9047 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_fmast.fm_fc_methd:'||l_fmast.fm_fc_methd);
9048 END IF;
9049
9050 --Set fund's max and min amounts as specified in single fund packaging process
9051 IF g_sf_packaging = 'T' THEN
9052 l_fmast.max_award_amt := NVL(g_sf_max_amount,l_fmast.max_award_amt);
9053 l_fmast.min_award_amt := NVL(g_sf_min_amount,l_fmast.min_award_amt);
9054 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9055 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'setting l_fmast.max_award_amt:'||l_fmast.max_award_amt||' l_fmast.min_award_amt:'||l_fmast.min_award_amt);
9056 END IF;
9057 END IF;
9058
9059 -- Check if the fund can be Auto Packaged
9060 IF l_fmast.auto_pkg = 'N' THEN
9061
9062 fnd_message.set_name('IGF','IGF_AW_PK_AUTO_SKIP');
9063 fnd_message.set_token('FUND_ID',l_fmast.fund_code);
9064 fnd_file.put_line(fnd_file.log,fnd_message.get);
9065 l_fund_id := l_fund.fund_id;
9066 l_fund_fail := TRUE;
9067 l_award_id := l_fund.award_id;
9068 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9069 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'skipping fund '||l_fmast.fund_code||' as it cannot be autopackaged');
9070 END IF;
9071 EXIT;
9072 END IF;
9073
9074 l_need_set := FALSE;
9075
9076 check_plan(l_fund.adplans_id,lv_result,lv_method_code);
9077 IF lv_result <> 'TRUE' THEN
9078 fnd_message.set_name('IGF',lv_result);
9079 fnd_file.put_line(fnd_file.log,fnd_message.get);
9080 l_fund_id := l_fund.fund_id;
9081 l_fund_fail := TRUE;
9082 l_award_id := l_fund.award_id;
9083 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9084 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'check_plan returned '||lv_result);
9085 END IF;
9086 EXIT;
9087 END IF;
9088
9089 IF g_fm_fc_methd = 'INSTITUTIONAL' AND g_sf_packaging <> 'T' THEN
9090
9091 IF hasActiveProfile(l_fabase.base_id) IS NOT NULL THEN
9092 --student has no profile
9093 fnd_message.set_name('IGF','IGF_AP_NO_ACTIVE_PROFILE');
9094 fnd_file.put_line(fnd_file.log,fnd_message.get);
9095 l_fund_id := l_fund.fund_id;
9096 l_fund_fail := TRUE;
9097 l_award_id := l_fund.award_id;
9098 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9099 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'exiting as student has no active profile');
9100 END IF;
9101 EXIT;
9102 END IF;
9103 END IF;
9104
9105 /*
9106 Enforce the check that FWS funds cannot have
9107 more than 1 disbursement per term for single-fund packaging.
9108 For packaging process, this is enforced in load_funds.
9109 */
9110 IF g_sf_packaging = 'T' THEN
9111 IF get_fed_fund_code(l_fund.fund_id) = 'FWS' THEN
9112 IF NOT check_disb(l_fabase.base_id,l_fund.adplans_id,g_awd_prd) THEN
9113 fnd_message.set_name('IGF','IGF_SE_MAX_TP_SETUP');
9114 fnd_file.put_line(fnd_file.log,fnd_message.get);
9115 l_fund_id := l_fund.fund_id;
9116 l_fund_fail := TRUE;
9117 l_award_id := l_fund.award_id;
9118 END IF;
9119 END IF;
9120 END IF;
9121
9122 -- GPLUSFL and GPLUSDL funds can be awarded only when the Student has ISIR
9123 IF l_fmast.fed_fund_code IN ('GPLUSDL', 'GPLUSFL') THEN
9124
9125 IF hasActiveIsir(l_fabase.base_id) IS NULL THEN
9126 l_fund_id := l_fund.fund_id;
9127 l_fund_fail := TRUE;
9128 l_award_id := l_fund.award_id;
9129 l_person_number := NULL;
9130
9131 OPEN c_person_number(l_fabase.base_id);
9132 FETCH c_person_number INTO l_person_number;
9133 CLOSE c_person_number;
9134
9135 fnd_message.set_name('IGF','IGF_AW_NO_ISIR');
9136 fnd_message.set_token('STDNT',l_person_number.person_number);
9137 fnd_file.put_line(fnd_file.log,fnd_message.get);
9138
9139 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9140 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'No active ISIR for '||l_person_number.person_number||'. For GPLUSDL/GPLUSFL funds the Student must have a valid ISIR');
9141 END IF;
9142
9143 EXIT;
9144 END IF;
9145 END IF;
9146
9147 -- Calculate the EFC, NEED and Remaining EFC for calculating the award
9148 -- For the fund if these are already calcualted then load the same.
9149 OPEN c_rem_efc;
9150 FETCH c_rem_efc INTO l_rem_efc;
9151 IF c_rem_efc%FOUND THEN
9152 WHILE c_rem_efc%FOUND LOOP
9153 IF l_rem_efc.temp_char_val1 = 'FEDERAL' THEN
9154 l_rem_rep_efc_f := NVL(l_rem_efc.temp_num_val1,0);
9155 l_efc_f := NVL(l_rem_efc.temp_num_val1,0);
9156 l_need_f := NVL(l_rem_efc.temp_num_val2,0);
9157 l_need_VB_AC_f := NVL(l_rem_efc.temp_val3_num,0);
9158 ELSE
9159 l_rem_rep_efc_i := NVL(l_rem_efc.temp_num_val1,0);
9160 l_efc_i := NVL(l_rem_efc.temp_num_val1,0);
9161 l_need_i := NVL(l_rem_efc.temp_num_val2,0);
9162 l_need_VB_AC_i := NVL(l_rem_efc.temp_val3_num,0);
9163 END IF;
9164 FETCH c_rem_efc INTO l_rem_efc;
9165 END LOOP;
9166
9167 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9168 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'c_rem_efc%FOUND');
9169 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_efc_f:'||l_efc_f||' l_efc_i:'||l_efc_i);
9170 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_rem_rep_efc_f:'||l_rem_rep_efc_f||' l_rem_rep_efc_i:'||l_rem_rep_efc_i);
9171 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_need_f:'||l_need_f||' l_need_i:'||l_need_i);
9172 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_need_VB_AC_f:'||l_need_VB_AC_f||' l_need_VB_AC_i:'||l_need_VB_AC_i);
9173 END IF;
9174
9175 IF g_fm_fc_methd = 'FEDERAL' THEN
9176 IF l_fmast.fed_fund_code in ('DLS','FLS') AND (l_need_VB_AC_f > l_need_f) THEN
9177 -- Do not consider VA30/AC awards as resource for Subsidized loans, increase need accordingly.
9178 l_need_bkup_f := l_need_f;
9179 l_need_f := l_need_VB_AC_f;
9180 l_reset_need := TRUE;
9181
9182 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9183 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'Increased Need to '||l_need_f||' for ' ||l_fmast.fed_fund_code|| ', bcoz student has VA30/AC award');
9184 END IF;
9185 END IF;
9186
9187 l_need := l_need_f;
9188 l_efc := l_efc_f;
9189 l_rem_rep_efc := NVL(l_efc_f,0);
9190 ELSE
9191 IF l_fmast.fed_fund_code in ('DLS','FLS') AND (l_need_VB_AC_i > l_need_i) THEN
9192 -- Do not consider VA30/AC awards as resource for Subsidized loans, increase need accordingly
9193 l_need_bkup_i := l_need_i;
9194 l_need_i := l_need_VB_AC_i;
9195 l_reset_need := TRUE;
9196
9197 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9198 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'Increased Need to '||l_need_i||' for ' ||l_fmast.fed_fund_code|| ', bcoz student has VA30/AC award');
9199 END IF;
9200 END IF;
9201
9202 l_need := l_need_i;
9203 l_efc := l_efc_i;
9204 l_rem_rep_efc := NVL(l_efc_i,0);
9205 END IF;
9206
9207 ELSE
9208
9209 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9210 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'c_rem_efc%NOTFOUND');
9211 END IF;
9212
9213 -- If Awarding PROFILE is present for the student, get the EFC, NEED
9214 l_efc_i := igf_aw_gen_004.efc_i(l_fabase.base_id,g_awd_prd);
9215
9216 IF l_use_fixed_costs = 'Y' THEN
9217 l_need_i := NVL(l_fabase.coa_fixed,0) - NVL(l_efc_i,0) - NVL(l_gap_amt,0);
9218 ELSE
9219 l_need_i := NVL(l_fabase.coa_i,0) - NVL(l_efc_i,0) - NVL(l_gap_amt,0);
9220 END IF;
9221
9222 l_rem_rep_efc_i := NVL(l_efc_i,0);
9223
9224 -- If Awarding ISIR is present for the student, get the EFC, NEED
9225 -- Get the EFC value for Federal Methodology
9226 igf_aw_packng_subfns.get_fed_efc(
9227 l_fabase.base_id,
9228 g_awd_prd,
9229 l_efc_f,
9230 l_pell_efc,
9231 l_efc_ay
9232 );
9233
9234 -- If fixed costs were set, then calculate using the Fixed COA
9235 IF l_use_fixed_costs = 'Y' THEN
9236 l_need_f := NVL(l_fabase.coa_fixed,0) - NVL(l_efc_f,0) - NVL(l_gap_amt,0);
9237 ELSE
9238 l_need_f := NVL(l_fabase.coa_f,0) - NVL(l_efc_f,0) - NVL(l_gap_amt,0);
9239 END IF;
9240
9241 l_rem_rep_efc_f := NVL(l_efc_f,0);
9242
9243 IF g_fm_fc_methd = 'FEDERAL' THEN
9244 l_need := l_need_f;
9245 l_efc := l_efc_f;
9246 l_rem_rep_efc := NVL(l_efc_f,0);
9247 ELSE
9248 l_need := l_need_i;
9249 l_efc := l_efc_i;
9250 l_rem_rep_efc := NVL(l_efc_i,0);
9251 END IF;
9252
9253 IF l_use_fixed_costs = 'Y' THEN
9254 IF l_fabase.coa_fixed IS NOT NULL AND l_efc_f IS NOT NULL AND l_fabase.coa_fixed > 0 AND l_fabase.coa_fixed < l_efc_f THEN
9255 l_rem_rep_efc_f := l_fabase.coa_fixed;
9256 l_rem_rep_efc := l_fabase.coa_fixed;
9257 END IF;
9258 ELSE
9259 IF l_fabase.coa_f IS NOT NULL AND l_efc_f IS NOT NULL AND l_fabase.coa_f > 0 AND l_fabase.coa_f < l_efc_f THEN
9260 l_rem_rep_efc_f := l_fabase.coa_f;
9261 l_rem_rep_efc := l_fabase.coa_f;
9262 END IF;
9263 END IF;
9264
9265 l_sl_number := NULL;
9266
9267 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9268 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'calculated need,efc for method:INSTITUTIONAL as l_efc_i: '||l_efc_i||' l_need_i: '||l_need_i||' l_rem_rep_efc_i: '||l_rem_rep_efc_i);
9269 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'calculated need,efc for method:FEDERAL as l_efc_f: '||l_efc_f||' l_need_f: '||l_need_f||' l_rem_rep_efc_f: '||l_rem_rep_efc_f);
9270 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'inserting into igf_aw_award_t with flag:ND and adplans_id: '||l_fund.adplans_id);
9271 END IF;
9272
9273 fnd_message.set_name('IGF','IGF_AW_PKG_EFC_MONTH');
9274 fnd_message.set_token('MONTH',l_efc_months);
9275 fnd_file.put_line(fnd_file.log,fnd_message.get);
9276
9277
9278 igf_aw_award_t_pkg.insert_row(
9279 x_rowid => lv_rowid ,
9280 x_process_id => l_process_id ,
9281 x_sl_number => l_sl_number,
9282 x_fund_id => l_fund.fund_id,
9283 x_base_id => l_fabase.base_id,
9284 x_offered_amt => NULL,
9285 x_accepted_amt => NULL,
9286 x_paid_amt => NULL ,
9287 x_need_reduction_amt => NULL,
9288 x_flag => 'ND',
9289 x_temp_num_val1 => NVL(l_efc_i,0),
9290 x_temp_num_val2 => NVL(l_need_i,0),
9291 x_temp_char_val1 => 'INSTITUTIONAL',--l_fmast.fm_fc_methd,
9292 x_tp_cal_type => NULL,
9293 x_tp_sequence_number => NULL,
9294 x_ld_cal_type => NULL,
9295 x_ld_sequence_number => NULL,
9296 x_mode => 'R',
9297 x_adplans_id => NULL,
9298 x_app_trans_num_txt => NULL,
9299 x_award_id => NULL,
9300 x_lock_award_flag => NULL,
9301 x_temp_val3_num => NULL,
9302 x_temp_val4_num => NULL,
9303 x_temp_char2_txt => NULL,
9304 x_temp_char3_txt => NULL
9305 );
9306
9307 igf_aw_award_t_pkg.insert_row(
9308 x_rowid => lv_rowid ,
9309 x_process_id => l_process_id ,
9310 x_sl_number => l_sl_number,
9311 x_fund_id => l_fund.fund_id,
9312 x_base_id => l_fabase.base_id,
9313 x_offered_amt => NULL,
9314 x_accepted_amt => NULL,
9315 x_paid_amt => NULL ,
9316 x_need_reduction_amt => NULL,
9317 x_flag => 'ND',
9318 x_temp_num_val1 => NVL(l_efc_f,0),
9319 x_temp_num_val2 => NVL(l_need_f,0),
9320 x_temp_char_val1 => 'FEDERAL',--l_fmast.fm_fc_methd,
9321 x_tp_cal_type => NULL,
9322 x_tp_sequence_number => NULL,
9323 x_ld_cal_type => NULL,
9324 x_ld_sequence_number => NULL,
9325 x_mode => 'R',
9326 x_adplans_id => NULL,
9327 x_app_trans_num_txt => NULL,
9328 x_award_id => NULL,
9329 x_lock_award_flag => NULL,
9330 x_temp_val3_num => NULL,
9331 x_temp_val4_num => NULL,
9332 x_temp_char2_txt => NULL,
9333 x_temp_char3_txt => NULL
9334 );
9335 END IF;
9336 CLOSE c_rem_efc;
9337
9338 -- If the awarding fund is PELL then do all the PELL validations
9339 -- Process for Pell Grant
9340 IF l_fmast.fed_fund_code = 'PELL' THEN
9341
9342 IF l_fund.award_id IS NULL OR (l_fund.award_id IS NOT NULL AND NOT g_phasein_participant) THEN
9343 --means PELL is being packaged or repackaged for a full participant-both follow similar logic
9344 -- Set the indicator from which PELL Grant was calculated ( either PELL Alternate matrix or PELL Regular matrix )
9345 -- also get the eligible PELL aid amount
9346
9347 lv_return_status := NULL;
9348 lv_message := NULL;
9349 l_pell_seq_id := NULL;
9350 l_aid := 0;
9351
9352 --if student has no COA defined and g_allow_to_exceed is set to 'COA' in single_fund_packaging,call the pell wrapper with cp_called_from as 'PACKAGING_DP'
9353 --else call it with 'PACKAGING' as the wrapper needs to take care of the distribution
9354
9355 IF igf_aw_gen_003.check_coa(l_fabase.base_id,g_awd_prd) THEN
9356 lb_coa_defined := TRUE;
9357 ELSE
9358 lb_coa_defined := FALSE;
9359 END IF;
9360
9361 IF g_sf_packaging = 'T' AND g_allow_to_exceed = 'COA' AND lb_coa_defined = FALSE THEN
9362 lv_called_from := 'PACKAGING_DP';
9363 ELSE
9364 lv_called_from := 'PACKAGING';
9365 END IF;
9366
9367 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9368 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'before call to igf_gr_pell_calc.calc_pell >fund_id/adplans_id/base_id/lv_called_from ->'||
9369 l_fmast.fund_id || '/' || l_fund.adplans_id || '/' || l_fabase.base_id || '/' || lv_called_from);
9370 END IF;
9371
9372 g_pell_tab.DELETE;
9373 igf_gr_pell_calc.calc_pell(
9374 cp_fund_id => l_fmast.fund_id,
9375 cp_plan_id => l_fund.adplans_id,
9376 cp_base_id => l_fabase.base_id,
9377 cp_aid => l_aid,
9378 cp_pell_tab => g_pell_tab,
9379 cp_return_status => lv_return_status,
9380 cp_message => lv_message,
9381 cp_called_from => lv_called_from,
9382 cp_pell_seq_id => l_pell_seq_id,
9383 cp_pell_schedule_code => l_pell_schedule_code
9384 );
9385
9386 g_alt_pell_schedule := l_pell_schedule_code;
9387
9388 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9389 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'pell wrapper returned l_aid:'||l_aid);
9390 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'pell wrapper returned return_status:'||lv_return_status);
9391 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'pell wrapper returned message:'||lv_message);
9392 END IF;
9393
9394 IF lv_return_status = 'E' THEN
9395 --Error occured in the pell calculation wrapper
9396 --so log the error message
9397 fnd_file.put_line(fnd_file.log,lv_message);
9398 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9399 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'pell wrapper returned error message '||lv_message);
9400 END IF;
9401 l_fund_id := l_fund.fund_id;
9402 l_fund_fail := TRUE;
9403 l_award_id := l_fund.award_id;
9404 EXIT;
9405 ELSIF ( l_aid <= 0 ) THEN
9406 l_aid := 0;
9407 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9408 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'pell_calc returned NO pell aid');
9409 END IF;
9410 IF ( l_run_mode = 'D') THEN
9411 fnd_message.set_name('IGF','IGF_AW_NO_PELL_AID');
9412 fnd_file.put_line(fnd_file.log,fnd_message.get);
9413 END IF;
9414
9415 l_fund_id := l_fund.fund_id;
9416 l_fund_fail := TRUE;
9417 l_award_id := l_fund.award_id;
9418 EXIT;
9419 END IF;
9420
9421 -- Note : After FA131 - All Group level checks will not be enforced for PELL
9422
9423 -- If the Packaging status is Accepted, then set the accepted amount of the award
9424 IF ( l_fmast.pckg_awd_stat = 'ACCEPTED' ) THEN
9425 l_accepted_amt := l_aid;
9426 ELSE
9427 l_accepted_amt := NULL;
9428 END IF;
9429
9430 -- For PELL awards do not consider the common terms accros the COA and FUND, so set the value to 100
9431 gn_fund_awd_cnt := NVL(gn_fund_awd_cnt, 0) + 1;
9432 g_fund_awd_prct.extend;
9433 g_fund_awd_prct(gn_fund_awd_cnt).base_id := l_fabase.base_id;
9434 g_fund_awd_prct(gn_fund_awd_cnt).fund_id := l_fund.fund_id;
9435 g_fund_awd_prct(gn_fund_awd_cnt).awd_prct := 100;
9436
9437 l_need := l_need_f;
9438 l_efc := l_efc_f;
9439 l_rem_rep_efc := l_rem_rep_efc_f;
9440
9441 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9442 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'after pell processing, actual amounts:');
9443 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_actual_grant_amt:'||l_actual_grant_amt);
9444 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_actual_shelp_amt:'||l_actual_shelp_amt);
9445 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_actual_gift_amt:'||l_actual_gift_amt);
9446 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_actual_aid:'||l_actual_aid);
9447 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_accepted_amt:'||l_accepted_amt);
9448 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_need:'||l_need);
9449 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_efc:'||l_efc);
9450 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_rem_rep_efc:'||l_rem_rep_efc);
9451 END IF;
9452 ELSE --means PELL is being repackaged.
9453 IF g_phasein_participant THEN
9454 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9455 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'phase in participant');
9456 END IF;
9457 -- before we repackage, we should check whether the student's PELL eligibility changed after PELL was awarded
9458 lv_return_status := NULL;
9459 igf_gr_pell_calc.pell_elig(l_fabase.base_id,lv_return_status);
9460 IF NVL(lv_return_status,'N') = 'E' THEN
9461 IF igs_ge_msg_stack.count_msg > 0 THEN
9462 FOR i IN 1..igs_ge_msg_stack.count_msg LOOP
9463 lv_msg_text := NULL;
9464 igs_ge_msg_stack.get(i,'F',lv_msg_text, ln_msg_index);
9465 fnd_file.put_line(fnd_file.log,lv_msg_text);
9466 END LOOP;
9467 END IF;
9468 RAISE PELL_NO_REPACK;
9469 END IF;
9470 -- loop thru all terms in the award
9471 FOR l_term_amounts IN cur_term_amounts(l_fund.award_id) LOOP
9472 --for each of the terms, calculate the amount
9473 lv_message := NULL;
9474 lv_return_status := NULL;
9475 l_pell_schedule_code := NULL;
9476 l_term_aid := NULL;
9477
9478 igf_ap_gen_001.get_key_program(
9479 cp_base_id => l_fabase.base_id,
9480 cp_course_cd => l_program_cd,
9481 cp_version_number => l_program_version
9482 );
9483 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9484 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'key prog:'||l_program_cd||'/'||l_program_version);
9485 END IF;
9486
9487 igf_gr_pell_calc.get_pell_setup(
9488 cp_base_id => l_fabase.base_id,
9489 cp_course_cd => l_program_cd,
9490 cp_version_number => l_program_version,
9491 cp_cal_type => l_fabase.ci_cal_type,
9492 cp_sequence_number => l_fabase.ci_sequence_number ,
9493 cp_pell_setup_rec => l_pell_setup_rec ,
9494 cp_message => l_message ,
9495 cp_return_status => l_return_status
9496 );
9497 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9498 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_pell_setup_rec.pell_seq_id:'||l_pell_setup_rec.pell_seq_id);
9499 END IF;
9500
9501 igf_gr_pell_calc.get_pell_attendance_type(
9502 cp_base_id => l_fabase.base_id,
9503 cp_ld_cal_type => l_term_amounts.ld_cal_type ,
9504 cp_ld_sequence_number => l_term_amounts.ld_sequence_number ,
9505 cp_pell_setup_rec => l_pell_setup_rec ,
9506 cp_attendance_type => l_pell_attend_type ,
9507 cp_message => l_message ,
9508 cp_return_status => l_return_status
9509 );
9510 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9511 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_pell_attend_type:'||l_pell_attend_type);
9512 END IF;
9513 l_term_amounts.base_attendance_type_code := l_pell_attend_type;
9514
9515 igf_gr_pell_calc.calc_term_pell(
9516 l_fabase.base_id,
9517 l_term_amounts.base_attendance_type_code,
9518 l_term_amounts.ld_cal_type,
9519 l_term_amounts.ld_sequence_number,
9520 l_term_aid,
9521 lv_return_status,
9522 lv_message,
9523 'PACKAGING',
9524 l_pell_schedule_code
9525 );
9526 IF NVL(lv_return_status,'N') = 'E' THEN
9527 fnd_file.put_line(fnd_file.log,lv_message);
9528 RAISE PELL_NO_REPACK;
9529 ELSE
9530 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9531 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'for term '||l_term_amounts.ld_cal_type||
9532 '/'||l_term_amounts.ld_sequence_number||' existing amount:'||l_term_amounts.term_total||
9533 ' calc aid:'||l_term_aid);
9534 END IF;
9535 l_aid := NVL(l_aid,0) + l_term_aid;
9536 IF l_term_aid <> l_term_amounts.term_total THEN
9537 --have to adjust the term total with the difference amount
9538 --the difference can be either a positive amount or a negative amount
9539 lv_rowid := NULL;
9540 l_sl_number := NULL;
9541 l_term_start := NULL;
9542 l_term_end := NULL;
9543 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9544 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'calling get_term_dates');
9545 END IF;
9546 igf_ap_gen_001.get_term_dates(
9547 p_base_id => l_fabase.base_id,
9548 p_ld_cal_type => l_term_amounts.ld_cal_type,
9549 p_ld_sequence_number => l_term_amounts.ld_sequence_number,
9550 p_ld_start_date => l_term_start,
9551 p_ld_end_date => l_term_end
9552 );
9553 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9554 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_coa_gen.process_stud.debug','l_term_start:'||l_term_start);
9555 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_coa_gen.process_stud.debug','l_term_end:'||l_term_end);
9556 END IF;
9557 IF l_term_end < TRUNC(SYSDATE) THEN
9558 --term has lapsed
9559 l_first_disb_dt := NULL;
9560 OPEN c_first_disb_dt(l_fund.award_id,l_term_amounts.ld_cal_type,l_term_amounts.ld_sequence_number);
9561 FETCH c_first_disb_dt INTO l_first_disb_dt;
9562 CLOSE c_first_disb_dt;
9563 l_first_disb_dt.disb_date := TRUNC(SYSDATE);
9564 ELSIF TRUNC(SYSDATE) BETWEEN l_term_start AND l_term_end THEN
9565 --current term
9566 l_first_disb_dt := NULL;
9567 OPEN c_first_disb_dt(l_fund.award_id,l_term_amounts.ld_cal_type,l_term_amounts.ld_sequence_number);
9568 FETCH c_first_disb_dt INTO l_first_disb_dt;
9569 CLOSE c_first_disb_dt;
9570 l_first_disb_dt.disb_date := TRUNC(SYSDATE);
9571 ELSE
9572 --future term
9573 l_first_disb_dt := NULL;
9574 OPEN c_first_disb_dt(l_fund.award_id,l_term_amounts.ld_cal_type,l_term_amounts.ld_sequence_number);
9575 FETCH c_first_disb_dt INTO l_first_disb_dt;
9576 CLOSE c_first_disb_dt;
9577 END IF;
9578 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9579 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'^^^inserting into igf_aw_award_t with flag GR^^^');
9580 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_fund.fund_id:'||l_fund.fund_id);
9581 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_fabase.base_id:'||l_fabase.base_id);
9582 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_term_aid - l_term_amounts.term_total:'||(l_term_aid - l_term_amounts.term_total));
9583 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_first_disb_dt.disb_date:'||l_first_disb_dt.disb_date);
9584 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_first_disb_dt.tp_cal_type:'||l_first_disb_dt.tp_cal_type);
9585 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_first_disb_dt.tp_sequence_number:'||l_first_disb_dt.tp_sequence_number);
9586 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_term_amounts.ld_cal_type:'||l_term_amounts.ld_cal_type);
9587 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_term_amounts.ld_sequence_number:'||l_term_amounts.ld_sequence_number);
9588 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_term_amounts.adplans_id:'||l_term_amounts.adplans_id);
9589 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_fund.award_id:'||l_fund.award_id);
9590 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'^^^done inserting into igf_aw_award_t^^^');
9591 END IF;
9592 igf_aw_award_t_pkg.insert_row(
9593 x_rowid => lv_rowid ,
9594 x_process_id => l_process_id ,
9595 x_sl_number => l_sl_number,
9596 x_fund_id => l_fund.fund_id,
9597 x_base_id => l_fabase.base_id,
9598 x_offered_amt => l_term_aid - l_term_amounts.term_total,
9599 x_accepted_amt => NULL,
9600 x_paid_amt => NULL ,
9601 x_need_reduction_amt => NULL,
9602 x_flag => 'GR',
9603 x_temp_num_val1 => NULL,
9604 x_temp_num_val2 => NULL,
9605 x_temp_char_val1 => l_first_disb_dt.disb_date,
9606 x_tp_cal_type => l_first_disb_dt.tp_cal_type,
9607 x_tp_sequence_number => l_first_disb_dt.tp_sequence_number,
9608 x_ld_cal_type => l_term_amounts.ld_cal_type,
9609 x_ld_sequence_number => l_term_amounts.ld_sequence_number,
9610 x_mode => 'R',
9611 x_adplans_id => l_term_amounts.adplans_id,
9612 x_app_trans_num_txt => NULL,
9613 x_award_id => l_fund.award_id,
9614 x_lock_award_flag => NULL,
9615 x_temp_val3_num => NULL,
9616 x_temp_val4_num => NULL,
9617 x_temp_char2_txt => l_term_amounts.base_attendance_type_code,
9618 x_temp_char3_txt => NULL
9619 );
9620
9621 END IF;
9622 END IF;
9623 END LOOP;
9624 END IF;
9625 END IF;
9626 ELSE
9627
9628 -----------------------------------------------------------
9629 -- Process for funds other than Pell Grants
9630 -----------------------------------------------------------
9631
9632 IF (l_need <= 0) AND g_allow_to_exceed IS NULL THEN -- If Need is exhausted
9633
9634 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9635 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'Need exhausted');
9636 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_fund.replace_fc:'||NVL(l_fund.replace_fc,'NULL')||
9637 'l_fmast.entitlement:'||NVL(l_fmast.entitlement,'NULL'));
9638 END IF;
9639 -- If Need is over and Replace FC is not set and the fund is not a entitlement. then log a message and skip the fund
9640 IF ( l_fund.replace_fc <> 'Y' ) AND (l_fmast.entitlement <> 'Y') THEN
9641
9642 IF ( l_run_mode = 'D' ) THEN
9643 fnd_message.set_name('IGF','IGF_AW_NEED_OVER');
9644 fnd_message.set_token('FUND', l_fmast.fund_code );
9645 fnd_file.put_line(fnd_file.log,fnd_message.get);
9646 END IF;
9647 l_fund_id := l_fund.fund_id;
9648 l_fund_fail := TRUE;
9649 l_award_id := l_fund.award_id;
9650 EXIT;
9651
9652 -- Need is over but Replace FC is set. So the need is the Remaining FC
9653 ELSIF ( l_fund.replace_fc = 'Y') AND g_fm_fc_methd = 'FEDERAL' THEN
9654 l_old_need := 0;
9655 l_need_f := l_rem_rep_efc_f;
9656 l_need := l_rem_rep_efc_f;
9657 l_need_set := TRUE;
9658 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9659 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'1.l_need_f:'||l_need_f);
9660 END IF;
9661 END IF;
9662
9663 -- if need is still zero, log a message and skip the fund
9664 IF l_need <= 0 AND l_need_set THEN
9665 fnd_message.set_name('IGF','IGF_AW_NEED_OVER');
9666 fnd_message.set_token('FUND', l_fmast.fund_code );
9667 fnd_file.put_line(fnd_file.log,fnd_message.get);
9668 l_fund_id := l_fund.fund_id;
9669 l_fund_fail := TRUE;
9670 l_award_id := l_fund.award_id;
9671 EXIT;
9672 END IF;
9673 END IF; -- End of Need Check
9674
9675
9676 IF g_sf_packaging = 'T' AND l_fmast.fund_source = 'FEDERAL' THEN
9677 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9678 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'fund source is federal');
9679 END IF;
9680
9681 IF l_fmast.replace_fc = 'Y' THEN
9682
9683 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9684 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'2.l_need_f:'||l_need_f);
9685 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'2.l_rem_rep_efc_f:'||l_rem_rep_efc_f);
9686 END IF;
9687
9688 IF l_need_f > 0 THEN
9689 l_need_f := l_rem_rep_efc_f + l_need_f;
9690 ELSE
9691 l_need_f := l_rem_rep_efc_f;
9692 END IF;
9693
9694 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9695 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_need_f:'||l_need_f);
9696 END IF;
9697
9698 END IF;
9699
9700 IF l_fmast.fed_fund_code in ('DLP','FLP') THEN -- DLP/FLP Check
9701 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9702 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'fund code is FLP/DLP');
9703 END IF;
9704
9705 --if student has coa defined
9706 IF NOT igf_aw_gen_003.check_coa(l_fabase.base_id,g_awd_prd) THEN -- COA Check
9707 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9708 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'student has no COA defined');
9709 END IF;
9710 fnd_message.set_name('IGF','IGF_AW_PK_COA_NULL');
9711 fnd_file.put_line(fnd_file.log,fnd_message.get);
9712 l_fund_id := l_fund.fund_id;
9713 l_fund_fail := TRUE;
9714 l_award_id := l_fund.award_id;
9715 EXIT;
9716
9717 ELSE
9718 --then aid = min((coa-existing awards),fund min)
9719
9720 IF l_need_f < l_fmast.max_award_amt THEN
9721 l_aid := l_need_f;
9722 ELSE
9723 l_aid := l_fmast.max_award_amt;
9724 END IF;
9725 --
9726 -- if entitlement is set to TRUE then give max amount
9727 --
9728 IF NVL(l_fmast.entitlement,'N') = 'Y' THEN
9729 l_aid := l_fmast.max_award_amt;
9730 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9731 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'Fund Entitlment is set to Y, so aid = l_fmast.max_award_amt ' || l_fmast.max_award_amt);
9732 END IF;
9733 END IF;
9734
9735 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9736 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'student has COA-so aid=min(fund max,need)');
9737 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_need_f:'||l_need_f||' l_fmast.max_award_amt:'||l_fmast.max_award_amt||' l_aid:'||l_aid);
9738 END IF;
9739 END IF; -- COA Check End
9740
9741 ELSE -- DLP/FLP Else
9742 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9743 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'fund code is not FLP/DLP');
9744 END IF;
9745
9746 --if student has coa
9747 IF NOT igf_aw_gen_003.check_coa(l_fabase.base_id,g_awd_prd) THEN --COA Check
9748 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9749 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'student has no COA defined');
9750 END IF;
9751 fnd_message.set_name('IGF','IGF_AW_PK_COA_NULL');
9752 fnd_file.put_line(fnd_file.log,fnd_message.get);
9753 l_fund_id := l_fund.fund_id;
9754 l_fund_fail := TRUE;
9755 l_award_id := l_fund.award_id;
9756 EXIT;
9757
9758 ELSE --COA Else
9759 --if student has awarding isir
9760 IF hasActiveIsir(l_fabase.base_id) IS NOT NULL THEN -- ISIR Check
9761 --
9762 -- award student
9763 --
9764 IF l_fmast.max_award_amt IS NOT NULL THEN
9765 IF l_need_f < l_fmast.max_award_amt THEN
9766 l_aid := l_need_f;
9767 ELSE
9768 l_aid := l_fmast.max_award_amt;
9769 END IF;
9770 ELSE
9771 l_aid := l_need_f;
9772 END IF;
9773 --
9774 -- if entitlement is set to TRUE then give max amount
9775 --
9776 IF NVL(l_fmast.entitlement,'N') = 'Y' THEN
9777 l_aid := l_fmast.max_award_amt;
9778 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9779 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'Fund Entitlment is set to Y, so aid = l_fmast.max_award_amt ' || l_fmast.max_award_amt);
9780 END IF;
9781 END IF;
9782
9783 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9784 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_need_f: '||l_need_f||' l_fmast.max_award_amt: '||l_fmast.max_award_amt||' l_aid:'||l_aid);
9785 END IF;
9786 ELSE -- ISIR Else
9787 --log error message
9788 fnd_message.set_name('IGF','IGF_AW_NO_ISIR');
9789 fnd_message.set_token('STDNT',l_person_number.person_number);
9790 fnd_file.put_line(fnd_file.log,fnd_message.get);
9791 l_fund_id := l_fund.fund_id;
9792 l_fund_fail := TRUE;
9793 l_award_id := l_fund.award_id;
9794 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9795 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'student has no active ISIR defined');
9796 END IF;
9797 EXIT;
9798 END IF; -- ISIR End
9799 END IF; -- COA End
9800 END IF; -- DLP/FLP End
9801
9802 ELSIF g_sf_packaging = 'T' AND l_fmast.fund_source <> 'FEDERAL' THEN
9803 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9804 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'fund source is not federal');
9805 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'g_allow_to_exceed: '||g_allow_to_exceed);
9806 END IF;
9807 IF NVL(g_allow_to_exceed,'*') = 'COA' AND l_fmast.max_award_amt IS NOT NULL THEN
9808 l_aid := l_fmast.max_award_amt;
9809 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9810 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'since COA can be exceeded l_aid=fund max='||l_aid);
9811 END IF;
9812 ELSE
9813 IF NOT igf_aw_gen_003.check_coa(l_fabase.base_id,g_awd_prd) THEN --COA Check
9814 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9815 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'student has no COA defined');
9816 END IF;
9817 fnd_message.set_name('IGF','IGF_AW_PK_COA_NULL');
9818 fnd_file.put_line(fnd_file.log,fnd_message.get);
9819 l_fund_id := l_fund.fund_id;
9820 l_fund_fail := TRUE;
9821 l_award_id := l_fund.award_id;
9822 EXIT;
9823
9824 ELSE --COA Else
9825 IF NVL(g_allow_to_exceed,'*') = 'NEED' THEN --Start allow_to_exceed = 'need' check
9826 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9827 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'allow NEED to be exceeded');
9828 END IF;
9829 --aid amount is minimum of COA-existing awards,max award amt
9830 l_existing_awards := igf_aw_coa_gen.award_amount(l_fabase.base_id,g_awd_prd);
9831
9832 IF l_fmast.max_award_amt IS NOT NULL THEN
9833 IF (l_fabase.coa_f - l_existing_awards) < l_fmast.max_award_amt THEN
9834 l_aid := l_fabase.coa_f - l_existing_awards;
9835 ELSE
9836 l_aid := l_fmast.max_award_amt;
9837 END IF;
9838 ELSE
9839 l_aid := l_fabase.coa_f - l_existing_awards;
9840 END IF;
9841
9842 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9843 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'student has COA-so aid=min(COA-existing awards,fund max)');
9844 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'COA:'||l_fabase.coa_f||' l_fmast.max_award_amt:'||l_fmast.max_award_amt||' l_existing_awards:'||l_existing_awards||' l_aid:'||l_aid);
9845 END IF;
9846 ELSE
9847 --need cannot b exceeded
9848 --check if fund used FM
9849 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9850 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'NEED cannot be exceeded-finding need using active isir/profile');
9851 END IF;
9852
9853 --if the fund replaces family contribution, then add remaining efc to be satisfied to the need.
9854 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9855 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_need_f:'||l_need_f);
9856 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_rem_rep_efc_f:'||l_rem_rep_efc_f);
9857 END IF;
9858
9859 IF NVL(l_fmast.replace_fc,'N') = 'Y' THEN
9860 IF l_need_f > 0 THEN
9861 l_need_f := l_rem_rep_efc_f + l_need_f;
9862 ELSE
9863 l_need_f := l_rem_rep_efc_f;
9864 END IF;
9865 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9866 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'3.l_need_f:'||l_need_f);
9867 END IF;
9868 END IF;
9869
9870 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9871 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_need_f:'||l_need_f);
9872 END IF;
9873
9874 IF l_fmast.fm_fc_methd = 'FEDERAL' THEN
9875 --fund uses FM
9876 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9877 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'fund uses FM-so using active isir');
9878 END IF;
9879
9880 IF hasActiveIsir(l_fabase.base_id) IS NOT NULL THEN
9881 --student has active isir
9882 IF l_fmast.max_award_amt IS NOT NULL THEN
9883 IF l_need_f < l_fmast.max_award_amt THEN
9884 l_aid := l_need_f;
9885 ELSE
9886 l_aid := l_fmast.max_award_amt;
9887 END IF;
9888 ELSE
9889 l_aid := l_need_f;
9890 END IF;
9891 --
9892 -- if entitlement is set to TRUE then give max amount
9893 --
9894 IF NVL(l_fmast.entitlement,'N') = 'Y' THEN
9895 l_aid := l_fmast.max_award_amt;
9896 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9897 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'Fund Entitlment is set to Y, so aid = l_fmast.max_award_amt ' || l_fmast.max_award_amt);
9898 END IF;
9899 END IF;
9900 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9901 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_need_f:'||l_need_f||' l_fmast.max_award_amt:'||l_fmast.max_award_amt||' l_aid:'||l_aid);
9902 END IF;
9903 ELSE
9904 --student does not have isir
9905 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9906 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'student has no active ISIR-cant continue');
9907 END IF;
9908 fnd_message.set_name('IGF','IGF_AW_NO_ISIR');
9909 fnd_message.set_token('STDNT',l_person_number.person_number);
9910 fnd_file.put_line(fnd_file.log,fnd_message.get);
9911 l_fund_id := l_fund.fund_id;
9912 l_fund_fail := TRUE;
9913 l_award_id := l_fund.award_id;
9914 EXIT;
9915 END IF;
9916 ELSE
9917 --fund uses IM
9918 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9919 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'fund uses IM-so using active profile');
9920 END IF;
9921
9922 IF hasActiveProfile(l_fabase.base_id) IS NOT NULL THEN
9923 --student has no profile
9924 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9925 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'student has no active profile-cant continue');
9926 END IF;
9927 fnd_message.set_name('IGF','IGF_AP_NO_ACTIVE_PROFILE');
9928 fnd_file.put_line(fnd_file.log,fnd_message.get);
9929 l_fund_id := l_fund.fund_id;
9930 l_fund_fail := TRUE;
9931 l_award_id := l_fund.award_id;
9932 EXIT;
9933 ELSE
9934 --student has active profile
9935 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9936 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'student has active profile');
9937 END IF;
9938 --if student has fm awards
9939 OPEN c_fm_awards(l_fabase.base_id,l_process_id);
9940 FETCH c_fm_awards INTO l_fm_awards;
9941 IF c_fm_awards%FOUND THEN
9942 --student has fm awards
9943 CLOSE c_fm_awards;
9944 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9945 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'student has FM awards');
9946 END IF;
9947
9948 --if student has active isir
9949 IF hasActiveIsir(l_fabase.base_id) IS NOT NULL THEN
9950 --student has active isir
9951 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9952 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'student has active isir-so aid=min(need_i,need_f,fund max)');
9953 END IF;
9954 --award amount is minimum of im need,fm need,fund max
9955 IF l_fmast.max_award_amt IS NOT NULL THEN
9956 l_aid := LEAST(l_need_i,LEAST(l_need_f,l_fmast.max_award_amt));
9957 ELSE
9958 l_aid := LEAST(l_need_i,l_need_f);
9959 END IF;
9960 --
9961 -- IF fund is entitlement then give the fund max amount
9962 --
9963 IF NVL(l_fmast.entitlement,'N') = 'Y' THEN
9964 l_aid := l_fmast.max_award_amt;
9965 END IF;
9966
9967 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9968 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_need_i:'||l_need_i||' l_need_f:'||l_need_f||' l_fmast.max_award_amt:'||l_fmast.max_award_amt||' l_aid:'||l_aid);
9969 END IF;
9970 ELSE
9971 IF l_fmast.max_award_amt IS NOT NULL THEN
9972 IF l_need_i < l_fmast.max_award_amt THEN
9973 l_aid := l_need_i;
9974 ELSE
9975 l_aid := l_fmast.max_award_amt;
9976 END IF;
9977 ELSE
9978 l_aid := l_need_i;
9979 END IF;
9980
9981 --
9982 -- if entitlement is set to TRUE then give max amount
9983 --
9984 IF NVL(l_fmast.entitlement,'N') = 'Y' THEN
9985 l_aid := l_fmast.max_award_amt;
9986 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9987 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'Fund Entitlment is set to Y, so aid = l_fmast.max_award_amt ' || l_fmast.max_award_amt);
9988 END IF;
9989 END IF;
9990
9991 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
9992 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'student has no active isir-so aid=min(need_i,fund max)');
9993 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_need_i:'||l_need_i||' l_fmast.max_award_amt:'||l_fmast.max_award_amt||' l_aid:'||l_aid);
9994
9995 END IF;
9996 END IF;
9997 ELSE
9998 --student does not have fm awards
9999 CLOSE c_fm_awards;
10000 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10001 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'student has no FM awards');
10002 END IF;
10003 --if student has active isir
10004 IF hasActiveIsir(l_fabase.base_id) IS NOT NULL THEN
10005 --student has active isir
10006 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10007 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'student has active isir');
10008 END IF;
10009 fnd_profile.get('IGF_AW_USE_LOW_IM_FM',lv_prof_value);
10010 IF lv_prof_value = 'Y' THEN
10011 --profile set
10012 --here im need,fm need, fund max are known
10013 --so award amount is minimum of these 3
10014 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10015 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'IGF_AW_USE_LOW_IM_FM:'||lv_prof_value);
10016 END IF;
10017
10018 IF l_fmast.max_award_amt IS NOT NULL THEN
10019 l_aid := LEAST(l_need_i,LEAST(l_need_f,l_fmast.max_award_amt));
10020 ELSE
10021 l_aid := LEAST(l_need_i,l_need_f);
10022 END IF;
10023 --
10024 -- if entitlement is set to TRUE then give max amount
10025 --
10026 IF NVL(l_fmast.entitlement,'N') = 'Y' THEN
10027 l_aid := l_fmast.max_award_amt;
10028 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10029 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'Fund Entitlment is set to Y, so aid = l_fmast.max_award_amt ' || l_fmast.max_award_amt);
10030 END IF;
10031 END IF;
10032
10033 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10034 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'since profile is set aid=min(need_i,need_f,fund max)');
10035 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_need_i:'||l_need_i||' l_need_f:'||l_need_f||' l_fmast.max_award_amt:'||l_fmast.max_award_amt||' l_aid:'||l_aid);
10036 END IF;
10037
10038 ELSE
10039 --profile not set
10040 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10041 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'IGF_AW_USE_LOW_IM_FM:'||lv_prof_value);
10042 END IF;
10043
10044 IF l_fmast.max_award_amt IS NOT NULL THEN
10045 IF l_need_i < l_fmast.max_award_amt THEN
10046 l_aid := l_need_i;
10047 ELSE
10048 l_aid := l_fmast.max_award_amt;
10049 END IF;
10050 ELSE
10051 l_aid := l_need_i;
10052 END IF;
10053
10054 --
10055 -- if entitlement is set to TRUE then give max amount
10056 --
10057 IF NVL(l_fmast.entitlement,'N') = 'Y' THEN
10058 l_aid := l_fmast.max_award_amt;
10059 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10060 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'Fund Entitlment is set to Y, so aid = l_fmast.max_award_amt ' || l_fmast.max_award_amt);
10061 END IF;
10062 END IF;
10063
10064 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10065 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'since profile is not set aid=min(need_i,fund max)');
10066 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_need_i:'||l_need_i||' l_fmast.max_award_amt:'||l_fmast.max_award_amt||' l_aid:'||l_aid);
10067 END IF;
10068
10069 END IF;
10070 ELSE
10071 --student does not have active isir;
10072 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10073 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'student has no active ISIR-aid=min(need_i,fund max)');
10074 END IF;
10075
10076 IF l_fmast.max_award_amt IS NOT NULL THEN
10077 IF l_need_i < l_fmast.max_award_amt THEN
10078 l_aid := l_need_i;
10079 ELSE
10080 l_aid := l_fmast.max_award_amt;
10081 END IF;
10082 ELSE
10083 l_aid := l_need_i;
10084 END IF;
10085
10086 --
10087 -- if entitlement is set to TRUE then give max amount
10088 --
10089 IF NVL(l_fmast.entitlement,'N') = 'Y' THEN
10090 l_aid := l_fmast.max_award_amt;
10091 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10092 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'Fund Entitlment is set to Y, so aid = l_fmast.max_award_amt ' || l_fmast.max_award_amt);
10093 END IF;
10094 END IF;
10095
10096 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10097 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_need_i:'||l_need_i||' l_fmast.max_award_amt:'||l_fmast.max_award_amt||' l_aid:'||l_aid);
10098 END IF;
10099
10100 END IF;
10101 END IF;
10102 END IF;
10103 END IF;
10104 END IF; -- End allow_to_exceed ='need' check
10105 END IF;
10106 END IF;
10107 END IF; -- End of Single fund
10108
10109 IF g_sf_packaging <> 'T' THEN
10110
10111 --if fund uses fm
10112 IF l_fmast.fm_fc_methd = 'FEDERAL' THEN
10113
10114 IF NVL(l_fmast.replace_fc,'N') = 'Y' THEN
10115 l_need_f := l_need_f + l_rem_rep_efc_f;
10116 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10117 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'4.l_need_f:'||l_need_f);
10118 END IF;
10119 END IF;
10120
10121 --award amount = min(fm need,fund max)
10122 IF l_fmast.max_award_amt IS NOT NULL THEN
10123 IF l_need_f < l_fmast.max_award_amt THEN
10124 l_aid := l_need_f;
10125 ELSE
10126 l_aid := l_fmast.max_award_amt;
10127 END IF;
10128 ELSE
10129 -- l_fmast.max_award_amt is null, so l_aid is l_need_f
10130 l_aid := l_need_f;
10131 END IF;
10132
10133 --
10134 -- if entitlement is set to TRUE then give max amount
10135 --
10136 IF NVL(l_fmast.entitlement,'N') = 'Y' THEN
10137 l_aid := l_fmast.max_award_amt;
10138 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10139 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'Fund Entitlment is set to Y, so aid = l_fmast.max_award_amt ' || l_fmast.max_award_amt);
10140 END IF;
10141 END IF;
10142
10143 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10144 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'since fund uses federal method,aid=min(need_f,fund max)');
10145 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_need_f: '||l_need_f||' l_fmast.max_award_amt: '||l_fmast.max_award_amt||' l_aid: '||l_aid);
10146 END IF;
10147
10148 ELSE
10149 --if student has awarding profile
10150 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10151 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'since fund used institutional method,checking if student has active profile');
10152 END IF;
10153
10154 IF hasActiveProfile(l_fabase.base_id) IS NOT NULL THEN
10155 fnd_message.set_name('IGF','IGF_AP_NO_ACTIVE_PROFILE');
10156 fnd_file.put_line(fnd_file.log,fnd_message.get);
10157 l_fund_id := l_fund.fund_id;
10158 l_fund_fail := TRUE;
10159 l_award_id := l_fund.award_id;
10160 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10161 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'student has no active profile');
10162 END IF;
10163 EXIT;
10164 END IF;
10165 --award amount = min(fm need,imneed, fund max)
10166 --here im need,fm need, fund max are known
10167 --so award amount is minimum of these 3
10168 IF l_fmast.max_award_amt IS NOT NULL THEN
10169 l_aid := LEAST(l_need_i,LEAST(l_need_f,l_fmast.max_award_amt));
10170 ELSE
10171 l_aid := LEAST(l_need_i,l_need_f);
10172 END IF;
10173
10174 --
10175 -- if entitlement is set to TRUE then give max amount
10176 --
10177 IF NVL(l_fmast.entitlement,'N') = 'Y' THEN
10178 l_aid := l_fmast.max_award_amt;
10179 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10180 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'Fund Entitlment is set to Y, so aid = l_fmast.max_award_amt ' || l_fmast.max_award_amt);
10181 END IF;
10182 END IF;
10183
10184 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10185 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'aid=min(need_f,need_i,fund max)');
10186 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_need_i:'||l_need_i||' l_need_f:'||l_need_f||' l_fmast.max_award_amt:'||l_fmast.max_award_amt||' l_aid:'||l_aid);
10187 END IF;
10188
10189 END IF;
10190 END IF; -- End for g_sf_packaging <> 'T'
10191
10192 -- Get the total amt awarded under current fund from Temp table
10193 OPEN c_temp(
10194 l_process_id ,
10195 l_fmast.fund_id ,
10196 l_fabase.base_id
10197 );
10198 FETCH c_temp INTO l_temp;
10199 CLOSE c_temp;
10200 l_fund_total := l_temp.offered;
10201
10202 -- Decrease the Awarded Aid upto the extent of the common terms present at the COA Items and at the FUND
10203 -- Awards should be created for only the common terms for which student has enrolled for the
10204 -- COA Items and the same terms should be present at the Fund Terms
10205
10206 -- Get the common terms and sum up the total percentages for calculating the award
10207 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10208 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'before proceeding to find total award % - method is:'||lv_method_code);
10209 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_fund.adplans_id: '||l_fund.adplans_id||' l_fabase.base_id: '||l_fabase.base_id);
10210 END IF;
10211
10212 ln_award_perct := 0;
10213 IF lv_method_code = 'M' THEN
10214
10215 IF igf_aw_gen_003.check_coa(l_fabase.base_id,g_awd_prd) THEN
10216
10217 FOR c_get_term_prsnt_rec IN c_get_term_prsnt(l_fund.adplans_id, l_fabase.base_id) LOOP
10218 ln_award_perct := ln_award_perct + c_get_term_prsnt_rec.ld_perct_num;
10219 END LOOP;
10220
10221 ELSE
10222 ln_award_perct := 100;
10223
10224 END IF;
10225
10226 ELSE
10227 ln_award_perct := 100;
10228
10229 END IF;
10230
10231 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10232 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'ln_award_perct:'||ln_award_perct);
10233 END IF;
10234
10235 get_plan_desc(l_fund.adplans_id,lv_method_name,lv_method_desc);
10236 fnd_file.put_line(fnd_file.log,igf_aw_gen.lookup_desc('IGF_GE_PARAMETERS','AWD_DIST_PLAN') || ' : ' || lv_method_name);
10237 fnd_file.put_line(fnd_file.log,igf_aw_gen.lookup_desc('IGF_GE_PARAMETERS','DIST_PLAN_METHOD') || ' : ' || lv_method_desc);
10238
10239 fnd_message.set_name('IGF','IGF_AW_PKG_PERSNT_CALC');
10240 fnd_message.set_token('PERSNT',ln_award_perct);
10241 fnd_file.put_line(fnd_file.log,fnd_message.get);
10242
10243 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10244 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'matching term percent ln_award_perct:'||ln_award_perct);
10245 END IF;
10246 -- Insert the Fund Awd percentage into the fund awd temp table if the fund is being awarded for the first time.
10247 IF l_fund_total = 0 THEN
10248 gn_fund_awd_cnt := NVL(gn_fund_awd_cnt, 0) + 1;
10249 g_fund_awd_prct.extend;
10250 g_fund_awd_prct(gn_fund_awd_cnt).base_id := l_fabase.base_id;
10251 g_fund_awd_prct(gn_fund_awd_cnt).fund_id := l_fund.fund_id;
10252 g_fund_awd_prct(gn_fund_awd_cnt).awd_prct := ln_award_perct;
10253 END IF;
10254
10255 -- Now decrease the amount upto the award percentage
10256 l_aid := (ln_award_perct * l_aid ) / 100;
10257
10258 fnd_message.set_name('IGF','IGF_AW_PKG_PERSNT_AMT');
10259 fnd_message.set_token('AMOUNT',l_aid);
10260 fnd_file.put_line(fnd_file.log,fnd_message.get);
10261
10262 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10263 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'decreased aid,upto macthing terms is l_aid: '||l_aid||' l_need: '||l_need);
10264 END IF;
10265
10266 -- Check if the Fund has the 'Can Replace FC flag '
10267 -- Check if Replace FC has alerady been applied for the fund
10268 -- if the l_fund_total has a value that means this is a second round run for the current fund
10269 IF ( l_fund.replace_fc = 'Y' ) AND ( NOT l_need_set) THEN -- Disb DLD Change
10270 l_old_need := l_need;
10271 l_need := l_need + l_rem_rep_efc;
10272 END IF;
10273
10274 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10275 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'updated need after funding aid is l_need:'||l_need);
10276 END IF;
10277 l_overaward := 0;
10278 l_remaining_amt := 0;
10279
10280 --Check whether the fund can be awarded with the Overaward limit set at the fund if the fund available amount is vanished
10281 l_cur_ovr_awd := NULL;
10282 OPEN c_cur_ovr_awd( l_fund.fund_id );
10283 FETCH c_cur_ovr_awd INTO l_cur_ovr_awd;
10284 CLOSE c_cur_ovr_awd;
10285
10286 l_overaward := NVL(l_cur_ovr_awd.temp_num_val2,0);
10287 l_remaining_amt := NVL(l_cur_ovr_awd.temp_num_val1,0);
10288
10289 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10290 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'after checking fund has amount left for disbursments');
10291 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'overaward amount l_overaward:'||l_overaward);
10292 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'fund has amount l_remaining_amt:'||l_remaining_amt||' left');
10293 END IF;
10294
10295 -- Check if award aid exceeds the available amount, then get the money from overaward limit
10296 IF l_fund.award_id IS NULL THEN
10297 IF NVL(l_aid,0) > l_remaining_amt THEN
10298 l_aid := l_remaining_amt + l_overaward;
10299 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10300 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'after checking if packaged award exceeds overaward of aid,l_aid:'||l_aid);
10301 END IF;
10302 END IF;
10303 ELSE
10304 IF NVL(l_aid,0) - l_fund.offered_amt > l_remaining_amt THEN
10305 l_aid := l_remaining_amt + l_overaward;
10306 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10307 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'after checking if repackaged award exceeds overaward of aid,l_aid:'||l_aid);
10308 END IF;
10309 END IF;
10310 END IF;
10311 --
10312 -- If l_aid is zero, it means there is no remaining amount in the fund
10313 --
10314 IF l_aid = 0 THEN
10315 fnd_message.set_name('IGF','IGF_AW_INSUFFCNT_FUND');
10316 fnd_message.set_token('AMOUNT',0);
10317 fnd_file.put_line(fnd_file.log,fnd_message.get);
10318 l_fund_id := l_fund.fund_id;
10319 l_fund_fail := TRUE;
10320 l_award_id := l_fund.award_id;
10321 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10322 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'no remaining amount in fund '||l_fund.fund_id);
10323 END IF;
10324 EXIT;
10325 END IF;
10326
10327 -- Check if it exceed the max amount for fund
10328 IF l_fmast.max_award_amt IS NOT NULL THEN
10329 IF NVL(l_aid,0) > l_fmast.max_award_amt THEN
10330 l_aid := l_fmast.max_award_amt;
10331 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10332 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'after checking if award exceeds fund max,l_aid:'||l_aid);
10333 END IF;
10334 END IF;
10335 END IF;
10336
10337 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10338 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'before entitlement check-l_aid:'||l_aid||' g_allow_to_exceed :'||g_allow_to_exceed);
10339 END IF;
10340 -- If Entitlement fund then award upto need of the student
10341 IF (l_fmast.entitlement <>'Y') AND ( NVL(l_aid,0) > NVL(l_need,0)) THEN
10342 IF g_allow_to_exceed IS NULL THEN
10343 l_aid := l_need;
10344 END IF;
10345 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10346 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'inside entitlement check-l_aid:'||l_aid);
10347 END IF;
10348 END IF;
10349
10350 -- Check for Max Yearly amt
10351 IF NVL(l_fmast.max_yearly_amt,0) > 0 THEN
10352 OPEN c_max_yr_amt(
10353 l_fmast.fund_id,
10354 l_fabase.base_id
10355 ) ;
10356 FETCH c_max_yr_amt INTO l_max_yr_amt;
10357 CLOSE c_max_yr_amt;
10358
10359 IF ( l_max_yr_amt.yr_total + l_aid + l_fund_total ) > l_fmast.max_yearly_amt THEN
10360 l_aid := (l_fmast.max_yearly_amt ) - ( l_max_yr_amt.yr_total + l_fund_total );
10361 END IF;
10362 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10363 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'fund has max yearly amount l_fmast.max_yearly_amt:'||l_fmast.max_yearly_amt);
10364 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_max_yr_amt.yr_total:'||l_max_yr_amt.yr_total);
10365 END IF;
10366 END IF; -- Max Yerly amt
10367
10368 -- Check for Max NUMBER of Life Terms
10369 OPEN cur_max_lf_count ( l_fmast.fund_code, l_fabase.person_id);
10370 FETCH cur_max_lf_count INTO max_lf_count_rec;
10371 CLOSE cur_max_lf_count;
10372
10373 OPEN cur_agg_lf_count( l_fmast.fund_code, l_fabase.person_id );
10374 FETCH cur_agg_lf_count INTO agg_lf_count_rec;
10375 CLOSE cur_agg_lf_count;
10376
10377 max_lf_count_rec.lf_count := agg_lf_count_rec.lf_count + max_lf_count_rec.lf_count;
10378 max_lf_count_rec.lf_total := agg_lf_count_rec.lf_total + max_lf_count_rec.lf_total;
10379
10380 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10381 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'fund has max life terms count max_lf_count_rec.lf_count:'||max_lf_count_rec.lf_count);
10382 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_fmast.max_life_term:'||l_fmast.max_life_term);
10383 END IF;
10384
10385 IF ( max_lf_count_rec.lf_count >= l_fmast.max_life_term ) THEN
10386
10387 OPEN c_person_number( l_fabase.person_id );
10388 FETCH c_person_number INTO l_person_number;
10389 CLOSE c_person_number;
10390
10391 fnd_message.set_name('IGF','IGF_AW_PK_EXCEED_LIFE_TERM');
10392 fnd_message.set_token('PERSON_NUMBER', l_person_number.person_number);
10393 fnd_message.set_token('FUND_ID',l_fmast.fund_code);
10394 fnd_file.put_line(fnd_file.log,fnd_message.get);
10395
10396 l_fund_id := l_fund.fund_id;
10397 l_fund_fail := TRUE;
10398 l_award_id := l_fund.award_id;
10399 EXIT;
10400 END IF;
10401
10402 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10403 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'fund has max lifeterm amount as l_fmast.max_life_amt:'||l_fmast.max_life_amt);
10404 END IF;
10405 -- Check for max life amount
10406 IF NVL(l_fmast.max_life_amt,0) > 0 THEN
10407 IF ( max_lf_count_rec.lf_total + l_aid + l_fund_total ) > l_fmast.max_life_amt THEN
10408 l_aid := (l_fmast.max_life_amt ) - ( max_lf_count_rec.lf_total + l_fund_total );
10409 END IF;
10410 END IF; -- Max Life amt
10411
10412 IF l_fmast.entitlement <> 'Y' THEN
10413
10414 -- Check for Max Grant Amt
10415 IF ( l_fmast.sys_fund_type ='GRANT' and l_grant_amt <> 0 ) THEN
10416
10417 l_actual_grant_amt := NVL(l_actual_grant_amt,0) + l_aid;
10418 IF l_actual_grant_amt > l_grant_amt THEN
10419 l_aid := l_aid - ( l_actual_grant_amt - l_grant_amt );
10420 l_actual_grant_amt := l_grant_amt;
10421 END IF;
10422
10423 END IF; -- Max grant chk
10424
10425 -- Check for Max Work Aid Amt
10426 IF ( l_fmast.sys_fund_type ='WORK' and l_work_amt <> 0 ) THEN
10427 l_actual_work_amt := NVL(l_actual_work_amt,0) + l_aid;
10428 IF l_actual_work_amt > l_work_amt THEN
10429 l_aid := l_aid - ( l_actual_work_amt - l_work_amt );
10430 l_actual_work_amt := l_work_amt;
10431 END IF;
10432 END IF; -- Max work chk
10433
10434 -- Check for Max Self Help Amt
10435 IF ( l_fmast.self_help ='Y' and l_shelp_amt <> 0 ) THEN
10436 l_actual_shelp_amt := NVL(l_actual_shelp_amt,0) + l_aid;
10437
10438 IF l_actual_shelp_amt > l_shelp_amt THEN
10439 l_aid := l_aid - ( l_actual_shelp_amt - l_shelp_amt );
10440 l_actual_shelp_amt := l_shelp_amt;
10441 END IF;
10442 END IF; -- Max self chk
10443
10444 -- Check for Max Gift Aid Amt
10445 IF ( l_fmast.gift_aid ='Y' and l_gift_amt <> 0 ) THEN
10446 l_actual_gift_amt := NVL(l_actual_gift_amt,0) + l_aid;
10447
10448 IF l_actual_gift_amt > l_gift_amt THEN
10449 l_aid := l_aid - ( l_actual_gift_amt - l_gift_amt );
10450 l_actual_gift_amt := l_gift_amt;
10451 END IF;
10452 END IF; -- Max Gift Aid
10453
10454 -- Check for Max Scholarship Amt
10455 IF ( l_fmast.sys_fund_type ='SCHOLARSHIP' and l_schlp_amt <> 0 ) THEN
10456 l_actual_schlp_amt := NVL(l_actual_schlp_amt,0) + l_aid;
10457 IF l_actual_schlp_amt > l_schlp_amt THEN
10458 l_aid := l_aid - ( l_actual_schlp_amt - l_schlp_amt );
10459 l_actual_schlp_amt := l_schlp_amt;
10460 END IF;
10461 END IF; -- Max Scholarship chk
10462
10463 -- Check for amount exceeding net amount slab
10464 IF NVL(l_max_aid_pkg,0) <> 0 THEN
10465 l_actual_aid := NVL(l_actual_aid,0) + l_aid;
10466
10467 IF l_actual_aid > l_max_aid_pkg THEN
10468 l_aid := l_aid - ( l_actual_aid - l_max_aid_pkg );
10469 l_actual_aid := l_max_aid_pkg;
10470 END IF;
10471 END IF; -- Net amount Check
10472
10473 ELSE
10474
10475 -- Bug 2400556
10476 IF ( l_fmast.sys_fund_type ='GRANT' and l_grant_amt <> 0 ) THEN
10477 l_actual_grant_amt := NVL(l_actual_grant_amt,0) + l_aid;
10478 END IF;
10479
10480 -- Bug 2400556
10481 IF ( l_fmast.sys_fund_type ='WORK' and l_work_amt <> 0 ) THEN
10482 l_actual_work_amt := NVL(l_actual_work_amt,0) + NVL(l_aid,0);
10483 END IF;
10484
10485 -- Check for Max Self Help Amt
10486 IF ( l_fmast.self_help ='Y' and l_shelp_amt <> 0 ) THEN
10487 l_actual_shelp_amt := NVL(l_actual_shelp_amt,0) + NVL(l_aid,0);
10488 END IF;
10489
10490 -- Check for Max Gift Aid Amt
10491 IF ( l_fmast.gift_aid ='Y' and l_gift_amt <> 0 ) THEN
10492 l_actual_gift_amt := NVL(l_actual_gift_amt,0) + NVL(l_aid,0);
10493 END IF;
10494
10495 -- Check for Max Scholarship Amt
10496 IF ( l_fmast.sys_fund_type ='SCHOLARSHIP' and l_schlp_amt <> 0 ) THEN
10497 l_actual_schlp_amt := NVL(l_actual_schlp_amt,0) + NVL(l_aid,0);
10498 END IF;
10499
10500 IF NVL(l_max_aid_pkg,0) <> 0 THEN
10501 l_actual_aid := NVL(l_actual_aid,0) + NVL(l_aid,0);
10502 END IF;
10503
10504 END IF;
10505
10506 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10507 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'after fund processing, actual amounts are ');
10508 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_actual_grant_amt:'||l_actual_grant_amt);
10509 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_actual_shelp_amt:'||l_actual_shelp_amt);
10510 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_actual_gift_amt:'||l_actual_gift_amt);
10511 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_actual_aid:'||l_actual_aid);
10512 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_accepted_amt:'||l_accepted_amt);
10513 END IF;
10514
10515 -- Check for Max Loan Amt
10516 IF ( l_fmast.sys_fund_type ='LOAN' ) THEN
10517 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10518 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'initiating loan checks');
10519 END IF;
10520 l_std_loan_tab.DELETE;
10521 OPEN c_std_ln_awd(l_fabase.base_id,l_process_id);
10522 LOOP
10523 FETCH c_std_ln_awd INTO l_std_ln_awd_rec;
10524 EXIT WHEN c_std_ln_awd%NOTFOUND;
10525 l_std_loan_tab.EXTEND;
10526 l_reccnt := l_std_loan_tab.COUNT;
10527 l_std_loan_tab(l_reccnt).fed_fund_code := l_std_ln_awd_rec.fed_fund_code;
10528 l_std_loan_tab(l_reccnt).fund_code := l_std_ln_awd_rec.fund_code;
10529 l_std_loan_tab(l_reccnt).award_amount := l_std_ln_awd_rec.offered_amt;
10530 l_std_loan_tab(l_reccnt).award_date := l_std_ln_awd_rec.award_date;
10531
10532 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10533 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug','added fed_fund_code:'||l_std_ln_awd_rec.fed_fund_code
10534 ||' fund_code:'||l_std_ln_awd_rec.fund_code
10535 ||' award:'||l_std_ln_awd_rec.offered_amt
10536 ||' date:'||l_std_ln_awd_rec.award_date
10537 );
10538 END IF;
10539 END LOOP;
10540 CLOSE c_std_ln_awd;
10541
10542 /*
10543 Fix added for bug 4599103
10544 */
10545 IF l_std_loan_tab IS NULL OR l_std_loan_tab.COUNT = 0 THEN
10546 l_std_loan_tab.EXTEND;
10547 l_reccnt := l_std_loan_tab.COUNT;
10548 l_std_loan_tab(l_reccnt).fed_fund_code := '';
10549 l_std_loan_tab(l_reccnt).fund_code := '';
10550 l_std_loan_tab(l_reccnt).award_amount := 0;
10551 l_std_loan_tab(l_reccnt).award_date := NULL;
10552 END IF;
10553
10554 l_msg_name := NULL;
10555
10556 --Bug ID : 2404111
10557 --The Perkins loan should not be subjected to Stafford Limits processing
10558 IF l_fmast.fed_fund_code IN ('DLS','FLS','DLU','FLU') THEN
10559 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10560 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'loans fed_fund_code not in PRK,DLP,FLP');
10561 END IF;
10562 fnd_message.set_name('IGF','IGF_AW_PKG_CHK_LOAN_LMTS');
10563 fnd_message.set_token('FUND',l_fmast.fund_code);
10564 fnd_file.put_line(fnd_file.log,fnd_message.get);
10565
10566 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10567 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'calling igf_aw_packng_subfns.check_loan_limits');
10568 END IF;
10569 igf_aw_packng_subfns.check_loan_limits(
10570 l_fabase.base_id,
10571 l_fmast.fed_fund_code,
10572 NULL,
10573 l_fund.adplans_id,
10574 l_aid,
10575 l_std_loan_tab,
10576 l_msg_name,
10577 g_awd_prd,
10578 'PACKAGING'
10579 );
10580 -- Bug 3360702
10581 -- l_aid is the amount that can be maximum given to the student after checking the loan limits.
10582 -- If l_aid = 0 then either there is no available loan amount or some of the error that class standing etc. has failed.
10583 -- depending on the returned l_msg_name
10584 -- If l_aid < 0 then some of the stafford loan limit check has failed and the corresponding message is in l_msg_name
10585 -- In the log file the amount that is returned from the check_loan_limits
10586 IF l_aid > 0 THEN
10587 fnd_message.set_name('IGF','IGF_AW_CHK_LOAN_LMT_AMT');
10588 fnd_message.set_token('AMOUNT',l_aid);
10589 fnd_file.put_line(fnd_file.log,fnd_message.get);
10590 END IF;
10591
10592 END IF;
10593
10594 IF l_aid = 0 and l_msg_name IS NULL THEN
10595 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10596 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'after calling check_loan_limts l_aid=0');
10597 END IF;
10598 fnd_message.set_name('IGF','IGF_AW_PKG_NO_LOAN_AMT');
10599 fnd_file.put_line(fnd_file.log,fnd_message.get);
10600 l_fund_id := l_fund.fund_id;
10601 l_fund_fail := TRUE;
10602 l_award_id := l_fund.award_id;
10603 EXIT;
10604 END IF; -- This condition is added as part of dl loan limit check
10605
10606 IF l_aid <= 0 and l_msg_name IS NOT NULL THEN
10607 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10608 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'after calling checkloan_limits l_msg_name:'||l_msg_name);
10609 END IF;
10610 IF l_aid = 0 THEN
10611 fnd_message.set_name('IGF',l_msg_name);
10612 fnd_file.put_line(fnd_file.log,fnd_message.get);
10613 ELSE
10614 fnd_message.set_name('IGF',l_msg_name);
10615 fnd_message.set_token('FUND_CODE',l_fmast.fed_fund_code);
10616 fnd_file.put_line(fnd_file.log,fnd_message.get);
10617 END IF;
10618 l_fund_id := l_fund.fund_id;
10619 l_fund_fail := TRUE;
10620 l_award_id := l_fund.award_id;
10621 EXIT;
10622 END IF; -- This condition is added as part of dl loan limit check
10623
10624 -- museshad (Build FA 163)
10625 IF l_fmast.fed_fund_code IN ('GPLUSDL','GPLUSFL') THEN
10626
10627 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10628 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'Calling chk_gplus_loan_limits');
10629 END IF;
10630
10631 IF NOT chk_gplus_loan_limits(
10632 p_base_id => l_fabase.base_id,
10633 p_fed_fund_code => l_fmast.fed_fund_code,
10634 p_adplans_id => l_fund.adplans_id,
10635 p_aid => l_aid,
10636 p_std_loan_tab => l_std_loan_tab,
10637 p_msg_name => l_msg_name
10638 ) THEN
10639 -- Failed
10640 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10641 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'chk_gplus_loan_limits check FAILED with l_msg_name '||l_msg_name);
10642 END IF;
10643
10644 IF l_msg_name = 'IGF_AW_LOAN_LMT_NOT_EXHST' THEN
10645 fnd_message.set_name('IGF',l_msg_name);
10646 fnd_message.set_token('FUND',l_fmast.fed_fund_code);
10647 fnd_file.put_line(fnd_file.log,fnd_message.get);
10648 ELSE
10649 IF l_msg_name IS NOT NULL THEN
10650 fnd_message.set_name('IGF',l_msg_name);
10651 fnd_file.put_line(fnd_file.log,fnd_message.get);
10652 END IF;
10653 END IF;
10654
10655 l_fund_id := l_fund.fund_id;
10656 l_fund_fail := TRUE;
10657 l_award_id := l_fund.award_id;
10658 EXIT;
10659 ELSE
10660 -- Passed
10661 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10662 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'chk_gplus_loan_limits check PASSED');
10663 END IF;
10664 END IF; -- <<chk_gplus_loan_limits>>
10665 END IF; -- <<l_fmast.fed_fund_code IN ('GPLUSDL','GPLUSFL')>>
10666 -- museshad (Build FA 163)
10667
10668 IF l_fmast.entitlement <> 'Y' THEN
10669
10670 IF ( l_loan_amt <> 0 ) THEN
10671 l_actual_loan_amt := NVL(l_actual_loan_amt,0) + l_aid;
10672
10673 IF l_actual_loan_amt > l_loan_amt THEN
10674 l_aid := l_aid - ( l_actual_loan_amt - l_loan_amt );
10675 l_actual_loan_amt := l_loan_amt;
10676 END IF;
10677 END IF;
10678
10679 ELSE
10680
10681 -- Bug 2400556
10682 IF ( l_loan_amt <> 0 ) THEN
10683 l_actual_loan_amt := NVL(l_actual_loan_amt,0) + l_aid;
10684 END IF;
10685
10686
10687 END IF; -- entitlement check
10688 END IF; -- Max loan chk
10689 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10690 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'after calling check_loan_limits l_actual_loan_amt:'||l_actual_loan_amt);
10691 END IF;
10692 -- If Aid is less than Minimum amount that can be awarded
10693 -- Validate Award Group Min Amt check. ( Always Award Groups is higher priority than fund level)
10694 IF NVL(l_aid,0) < NVL(l_fund.min_award_amt,0) AND g_sf_packaging <> 'T' THEN
10695 l_aid := 0;
10696 fnd_message.set_name('IGF','IGF_AW_MIN_AWD_CHK_AWDGRP');
10697 fnd_message.set_token('FUND',l_fmast.fund_code);
10698 fnd_message.set_token('AWDGRP',l_fabase.target_group);
10699 fnd_file.put_line(fnd_file.log,fnd_message.get);
10700 l_fund_id := l_fund.fund_id;
10701 l_fund_fail := TRUE;
10702 l_award_id := l_fund.award_id;
10703 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10704 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'skipping fund as aid < awd grp min');
10705 END IF;
10706 EXIT;
10707 -- Validate Fund level Group Min Amt check.
10708
10709 ELSIF NVL(l_aid,0) < NVL(l_fmast.min_award_amt,0) THEN
10710 l_aid := 0;
10711 fnd_message.set_name('IGF','IGF_AW_MIN_AWD_CHECK');
10712 fnd_message.set_token('FUND',l_fmast.fund_code);
10713 fnd_file.put_line(fnd_file.log,fnd_message.get);
10714 l_fund_id := l_fund.fund_id;
10715 l_fund_fail := TRUE;
10716 l_award_id := l_fund.award_id;
10717 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10718 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'skipping fund as aid < fund min');
10719 END IF;
10720 EXIT;
10721
10722 END IF; -- End of Min Award Check
10723
10724 -- Incase of No Need Skip fund
10725 IF ( l_aid <= 0) THEN
10726 fnd_message.set_name('IGF','IGF_AW_NO_AID');
10727 fnd_message.set_token('FUND',l_fmast.fund_code);
10728 fnd_file.put_line(fnd_file.log,fnd_message.get);
10729 l_aid := 0;
10730 l_fund_id := l_fund.fund_id;
10731 l_fund_fail := TRUE;
10732 l_award_id := l_fund.award_id;
10733 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10734 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'skipping fund as aid amount <= 0');
10735 END IF;
10736 EXIT;
10737 END IF;
10738
10739 --If Packaging Status is Accepted or Estimated Accepted then set the Accepted amt
10740 IF (l_fmast.pckg_awd_stat = 'ACCEPTED') THEN
10741 l_accepted_amt := l_aid;
10742 ELSE
10743 l_accepted_amt := NULL;
10744 END IF;
10745
10746 -- Updating Remaining and the overaward amount
10747 l_remaining_amt := l_remaining_amt - NVL( l_accepted_amt, l_aid );
10748
10749 -- Person awarded from the over award amount
10750 IF ( l_remaining_amt < 0 ) THEN
10751 l_overaward := l_overaward + l_remaining_amt;
10752 END IF;
10753
10754 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10755 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'after awarding updating amount for the fund as l_remaining_amt:'||l_remaining_amt||' l_overaward:'||l_overaward);
10756 END IF;
10757
10758 igf_aw_award_t_pkg.update_row(
10759 x_rowid => l_cur_ovr_awd.row_id,
10760 x_process_id => l_cur_ovr_awd.process_id,
10761 x_sl_number => l_cur_ovr_awd.sl_number,
10762 x_fund_id => l_cur_ovr_awd.fund_id,
10763 x_base_id => l_cur_ovr_awd.base_id,
10764 x_offered_amt => l_cur_ovr_awd.offered_amt,
10765 x_accepted_amt => l_cur_ovr_awd.accepted_amt,
10766 x_paid_amt => l_cur_ovr_awd.paid_amt,
10767 x_need_reduction_amt => l_cur_ovr_awd.need_reduction_amt,
10768 x_flag => l_cur_ovr_awd.flag,
10769 x_temp_num_val1 => l_remaining_amt,
10770 x_temp_num_val2 => l_overaward,
10771 x_temp_char_val1 => l_cur_ovr_awd.temp_char_val1,
10772 x_tp_cal_type => l_cur_ovr_awd.tp_cal_type,
10773 x_tp_sequence_number => l_cur_ovr_awd.tp_sequence_number,
10774 x_ld_cal_type => l_cur_ovr_awd.ld_cal_type,
10775 x_ld_sequence_number => l_cur_ovr_awd.ld_sequence_number,
10776 x_mode => 'R',
10777 x_adplans_id => l_cur_ovr_awd.adplans_id,
10778 x_app_trans_num_txt => l_cur_ovr_awd.app_trans_num_txt,
10779 x_award_id => l_cur_ovr_awd.award_id,
10780 x_lock_award_flag => l_cur_ovr_awd.lock_award_flag,
10781 x_temp_val3_num => l_cur_ovr_awd.temp_val3_num,
10782 x_temp_val4_num => l_cur_ovr_awd.temp_val4_num,
10783 x_temp_char2_txt => l_cur_ovr_awd.temp_char2_txt,
10784 x_temp_char3_txt => l_cur_ovr_awd.temp_char3_txt
10785 );
10786
10787 ----------------------------------------------
10788 -- Completed Non PELL funds
10789 ----------------------------------------------
10790
10791 END IF; -- End of Pell check i.e (IF (l_fmast.fed_fund_code = 'PELL'))
10792
10793 -- Insert Data INTO the Temporary Table
10794 IF NVL(l_aid,0) > 0 THEN
10795 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10796 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'after awarding,inserting to igf_aw_award_t with flag:AW and l_aid: '||l_aid||' ln_award_perct:'||ln_award_perct||
10797 'lock_award_flag:'||l_fund.lock_award_flag);
10798 END IF;
10799 IF l_fund.award_id IS NULL THEN
10800 --Update the Overaward record in the Temp Award table for this fund
10801 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10802 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'inserting a new award with flag=AW'||
10803 'process_id:'||l_process_id||
10804 'fund_id:'||l_fmast.fund_id||
10805 'base_id:'||l_fabase.base_id);
10806 END IF;
10807 igf_aw_award_t_pkg.insert_row(
10808 x_rowid => lv_rowid ,
10809 x_process_id => l_process_id ,
10810 x_sl_number => l_sl_number,
10811 x_fund_id => l_fmast.fund_id,
10812 x_base_id => l_fabase.base_id,
10813 x_offered_amt => l_aid * 100 / ln_award_perct,
10814 x_accepted_amt => l_accepted_amt * 100 / ln_award_perct,
10815 x_paid_amt => NULL ,
10816 x_need_reduction_amt => NULL,
10817 x_flag => 'AW',
10818 x_temp_num_val1 => NULL,
10819 x_temp_num_val2 => NULL,
10820 x_temp_char_val1 => NULL,
10821 x_tp_cal_type => NULL,
10822 x_tp_sequence_number => NULL,
10823 x_ld_cal_type => NULL,
10824 x_ld_sequence_number => NULL,
10825 x_mode => 'R',
10826 x_adplans_id => l_fund.adplans_id,
10827 x_app_trans_num_txt => NULL,
10828 x_award_id => NULL,
10829 x_lock_award_flag => l_fund.lock_award_flag,
10830 x_temp_val3_num => NULL,
10831 x_temp_val4_num => NULL,
10832 x_temp_char2_txt => NULL,
10833 x_temp_char3_txt => NULL
10834 );
10835 ELSE
10836 OPEN c_temp_awd(l_fund.award_id);
10837 FETCH c_temp_awd INTO l_temp_awd;
10838 CLOSE c_temp_awd;
10839 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10840 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'updating old award with flag=AW'||
10841 'process_id:'||l_temp_awd.process_id||
10842 'fund_id:'||l_fmast.fund_id||
10843 'base_id:'||l_fabase.base_id||
10844 'award_id:'||l_temp_awd.award_id
10845 );
10846 END IF;
10847 igf_aw_award_t_pkg.update_row(
10848 x_rowid => l_temp_awd.row_id,
10849 x_process_id => l_temp_awd.process_id,
10850 x_sl_number => l_temp_awd.sl_number,
10851 x_fund_id => l_fmast.fund_id,
10852 x_base_id => l_fabase.base_id,
10853 x_offered_amt => l_aid * 100 / ln_award_perct,
10854 x_accepted_amt => l_accepted_amt * 100 / ln_award_perct,
10855 x_paid_amt => l_temp_awd.paid_amt,
10856 x_need_reduction_amt => l_temp_awd.need_reduction_amt,
10857 x_flag => 'AW',
10858 x_temp_num_val1 => l_temp_awd.temp_num_val1,
10859 x_temp_num_val2 => l_temp_awd.temp_num_val2,
10860 x_temp_char_val1 => l_temp_awd.temp_char_val1,
10861 x_tp_cal_type => l_temp_awd.tp_cal_type,
10862 x_tp_sequence_number => l_temp_awd.tp_sequence_number,
10863 x_ld_cal_type => l_temp_awd.ld_cal_type,
10864 x_ld_sequence_number => l_temp_awd.ld_sequence_number,
10865 x_mode => 'R',
10866 x_adplans_id => l_fund.adplans_id,
10867 x_app_trans_num_txt => l_temp_awd.app_trans_num_txt,
10868 x_award_id => l_temp_awd.award_id,
10869 x_lock_award_flag => l_temp_awd.lock_award_flag,
10870 x_temp_val3_num => l_temp_awd.temp_val3_num,
10871 x_temp_val4_num => l_temp_awd.temp_val4_num,
10872 x_temp_char2_txt => l_temp_awd.temp_char2_txt,
10873 x_temp_char3_txt => l_temp_awd.temp_char3_txt
10874 );
10875 END IF;
10876
10877 -- museshad (FA 163)
10878 -- If fund is DLS/FLS, then the reduced need(reduced bcoz of VA30/Americorps awds) must be
10879 -- reset to the proper need so that the next fund gets the right need.
10880 IF l_fmast.fed_fund_code IN ('DLS','FLS') AND l_reset_need THEN
10881 IF l_fmast.fm_fc_methd = 'FEDERAL' THEN
10882 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10883 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,
10884 'Fund is Subsidized loan and Student has VA30/AMRICORPS awd, so need (FEDERAL) was increased to ' ||l_need|| '. Resetting Need.');
10885 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'After resetting, Need= ' ||l_need_bkup_f);
10886 END IF;
10887
10888 l_need := l_need_bkup_f;
10889 ELSE
10890 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10891 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,
10892 'Fund is Subsidized loan and Student has VA30/AMRICORPS awd, so need (INSTITUTIONAL) was reduced to ' ||l_need|| '. Resetting Need.');
10893 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'After resetting, Need= ' ||l_need_bkup_i);
10894 END IF;
10895
10896 l_need := l_need_bkup_i;
10897 l_need_i := l_need_bkup_i;
10898 END IF; -- << l_fmast.fm_fc_methd >>
10899 END IF; -- << l_fmast.fed_fund_code >>
10900 -- museshad (FA 163)
10901
10902 IF ( l_fund.replace_fc = 'Y' ) AND ( NOT l_need_set) THEN
10903 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10904 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,
10905 'need set : l_need:'||l_need||
10906 'l_rem_rep_efc:'||l_rem_rep_efc);
10907 END IF;
10908 l_need := NVL(l_need,0) - NVL(l_rem_rep_efc,0);
10909 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10910 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,
10911 'need set :need recalculated as: l_need:'||l_need);
10912 END IF;
10913 END IF;
10914
10915 --Update Remaining FC if the Replace FC was checked
10916 IF l_fmast.fm_fc_methd = 'FEDERAL' THEN
10917 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10918 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,
10919 '@@l_fmast.fm_fc_methd:'||l_fmast.fm_fc_methd||
10920 'l_fund.replace_fc:'||l_fund.replace_fc||
10921 'l_fmast.update_need:'||l_fmast.update_need||
10922 'l_aid:'||l_aid||
10923 'l_rem_rep_efc:'||l_rem_rep_efc||
10924 'l_need:'||l_need||
10925 'l_old_need:'||l_old_need
10926 );
10927 END IF;
10928 IF l_fund.replace_fc = 'Y' AND l_fmast.update_need = 'Y' THEN
10929
10930 l_rem_rep_efc := NVL(l_rem_rep_efc,0) - NVL(l_aid,0);
10931 IF l_rem_rep_efc < 0 THEN
10932 l_rem_rep_efc := 0;
10933 END IF;
10934
10935 -- l_need_f := NVL(l_old_need,0);
10936 l_need_f := NVL(l_need,0) - (NVL(l_aid,0) - (NVL(l_efc,0) - NVL(l_rem_rep_efc,0)) );
10937 l_need_VB_AC_f := NVL(l_need_VB_AC_f,0) - (NVL(l_aid,0) - (NVL(l_efc,0) - NVL(l_rem_rep_efc,0)));
10938 l_need_i := NVL(l_need_i,0) - NVL(l_aid,0);
10939 l_need_VB_AC_i := NVL(l_need_VB_AC_i,0) - NVL(l_aid,0);
10940
10941 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10942 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,
10943 'Update Need and Replace FC are set, l_rem_rep_efc: '||l_rem_rep_efc
10944 ||' l_need_f: '||l_need_f||' l_need_i: '||l_need_i
10945 ||' l_need_VB_AC_f: '||l_need_VB_AC_f||' l_need_VB_AC_i: '||l_need_VB_AC_i);
10946 END IF;
10947
10948 ELSIF l_fund.replace_fc = 'Y' THEN
10949
10950 l_rem_rep_efc := NVL(l_rem_rep_efc,0) - NVL(l_aid,0);
10951 IF l_rem_rep_efc < 0 THEN
10952 l_need := l_need + l_rem_rep_efc;
10953 l_rem_rep_efc := 0;
10954 END IF;
10955
10956 -- l_need_f := NVL(l_old_need,0);
10957 l_need_f := l_need;
10958 l_need_i := l_need_i;
10959
10960 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10961 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'Only Replace FC is set, l_rem_rep_efc: '||l_rem_rep_efc||' l_need_f: '||l_need_f||' l_need_i: '||l_need_i);
10962 END IF;
10963
10964 ELSIF l_fmast.update_need = 'Y' THEN
10965 l_need_f := NVL(l_need,0) - NVL(l_aid,0);
10966 l_need_VB_AC_f := NVL(l_need_VB_AC_f,0) - NVL(l_aid,0);
10967 l_need_i := NVL(l_need_i,0) - NVL(l_aid,0);
10968 l_need_VB_AC_i := NVL(l_need_VB_AC_i,0) - NVL(l_aid,0);
10969
10970 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10971 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,
10972 'Only Update Need is set, l_rem_rep_efc: '||l_rem_rep_efc
10973 ||' l_need_f: '||l_need_f||' l_need_i: '||l_need_i
10974 ||' l_need_VB_AC_f: '||l_need_VB_AC_f|| 'l_need_VB_AC_i: '||l_need_VB_AC_i);
10975 END IF;
10976
10977 ELSE
10978 l_need_f := l_need_f;
10979 l_need_i := l_need_i;
10980
10981 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10982 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'Both Update Need and Replace FC are NOT set, l_rem_rep_efc: '||l_rem_rep_efc||' l_need_f: '||l_need_f||' l_need_i: '||l_need_i);
10983 END IF;
10984
10985 END IF;
10986
10987 ELSIF l_fmast.fm_fc_methd = 'INSTITUTIONAL' THEN
10988 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
10989 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,
10990 '@@l_fmast.fm_fc_methd:'||l_fmast.fm_fc_methd||
10991 'l_fund.replace_fc:'||l_fund.replace_fc||
10992 'l_fmast.update_need:'||l_fmast.update_need||
10993 'l_aid:'||l_aid||
10994 'l_rem_rep_efc:'||l_rem_rep_efc||
10995 'l_need:'||l_need||
10996 'l_old_need:'||l_old_need
10997 );
10998 END IF;
10999 IF l_fmast.update_need = 'Y' THEN
11000 l_need_i := NVL(l_need,0) - NVL(l_aid,0);
11001 l_need_VB_AC_i := NVL(l_need_VB_AC_i,0) - NVL(l_aid,0);
11002 l_need_f := NVL(l_need_f,0) - NVL(l_aid,0);
11003 l_need_VB_AC_f := NVL(l_need_VB_AC_f,0) - NVL(l_aid,0);
11004
11005 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11006 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,
11007 'Only Update Need is set, l_rem_rep_efc: '||l_rem_rep_efc
11008 ||' l_need_f: '||l_need_f||' l_need_i: '||l_need_i
11009 ||' l_need_VB_AC_f: '||l_need_VB_AC_f||' l_need_VB_AC_i: '||l_need_VB_AC_i);
11010 END IF;
11011 ELSE
11012 l_need_i := l_need;
11013 l_need_f := l_need_f;
11014 END IF;
11015
11016 END IF;
11017
11018 -- Update the Need and Remaining EFC values for all Need and Already Awarded funds which are loaded in the temp table
11019 -- for the same student in the same methodology
11020 FOR l_rem_efc IN c_rem_efc LOOP
11021
11022 IF l_rem_efc.temp_char_val1 = 'INSTITUTIONAL' THEN
11023
11024 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11025 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'after awarding,updating igf_aw_awrd_t (ONLY INSTITUTIONAL) with l_need_i :'||l_need_i|| ' l_need_VB_AC_i: ' ||l_need_VB_AC_i);
11026 END IF;
11027
11028 igf_aw_award_t_pkg.update_row(
11029 x_rowid => l_rem_efc.row_id ,
11030 x_process_id => l_rem_efc.process_id ,
11031 x_sl_number => l_rem_efc.sl_number,
11032 x_fund_id => l_rem_efc.fund_id,
11033 x_base_id => l_rem_efc.base_id,
11034 x_offered_amt => l_rem_efc.offered_amt,
11035 x_accepted_amt => l_rem_efc.accepted_amt,
11036 x_paid_amt => l_rem_efc.paid_Amt,
11037 x_need_reduction_amt => l_rem_efc.need_reduction_amt,
11038 x_flag => l_rem_efc.flag,
11039 x_temp_num_val1 => l_rem_efc.temp_num_val1,
11040 x_temp_num_val2 => NVL(l_need_i,0),
11041 x_temp_char_val1 => l_rem_efc.temp_char_val1,
11042 x_tp_cal_type => NULL,
11043 x_tp_sequence_number => NULL,
11044 x_ld_cal_type => NULL,
11045 x_ld_sequence_number => NULL,
11046 x_mode => 'R',
11047 x_adplans_id => l_rem_efc.adplans_id,
11048 x_app_trans_num_txt => l_rem_efc.app_trans_num_txt,
11049 x_award_id => l_rem_efc.award_id,
11050 x_lock_award_flag => l_rem_efc.lock_award_flag,
11051 x_temp_val3_num => NVL(l_need_VB_AC_i,0),
11052 x_temp_val4_num => l_rem_efc.temp_val4_num,
11053 x_temp_char2_txt => l_rem_efc.temp_char2_txt,
11054 x_temp_char3_txt => l_rem_efc.temp_char3_txt
11055 );
11056
11057 ELSIF l_rem_efc.temp_char_val1 = 'FEDERAL' THEN
11058
11059 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11060 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,
11061 'after awarding,updating igf_aw_awrd_t (ONLY FEDERAL) with l_rem_rep_efc:'||l_rem_rep_efc
11062 ||' l_need_f :'||l_need_f|| ' l_need_VB_AC_f: ' ||l_need_VB_AC_f);
11063 END IF;
11064
11065 igf_aw_award_t_pkg.update_row(
11066 x_rowid => l_rem_efc.row_id ,
11067 x_process_id => l_rem_efc.process_id ,
11068 x_sl_number => l_rem_efc.sl_number,
11069 x_fund_id => l_rem_efc.fund_id,
11070 x_base_id => l_rem_efc.base_id,
11071 x_offered_amt => l_rem_efc.offered_amt,
11072 x_accepted_amt => l_rem_efc.accepted_amt,
11073 x_paid_amt => l_rem_efc.paid_Amt,
11074 x_need_reduction_amt => l_rem_efc.need_reduction_amt,
11075 x_flag => l_rem_efc.flag,
11076 x_temp_num_val1 => NVL(l_rem_rep_efc,0),
11077 x_temp_num_val2 => NVL(l_need_f,0),
11078 x_temp_char_val1 => l_rem_efc.temp_char_val1,
11079 x_tp_cal_type => NULL,
11080 x_tp_sequence_number => NULL,
11081 x_ld_cal_type => NULL,
11082 x_ld_sequence_number => NULL,
11083 x_mode => 'R',
11084 x_adplans_id => l_rem_efc.adplans_id,
11085 x_app_trans_num_txt => l_rem_efc.app_trans_num_txt,
11086 x_award_id => l_rem_efc.award_id,
11087 x_lock_award_flag => l_rem_efc.lock_award_flag,
11088 x_temp_val3_num => NVL(l_need_VB_AC_f,0),
11089 x_temp_val4_num => l_rem_efc.temp_val4_num,
11090 x_temp_char2_txt => l_rem_efc.temp_char2_txt,
11091 x_temp_char3_txt => l_rem_efc.temp_char3_txt
11092 );
11093
11094 END IF;
11095
11096 END LOOP; -- End of Loop c_rem_efc
11097
11098 END IF;
11099 EXIT;
11100
11101 END LOOP;
11102 CLOSE c_fmast;
11103
11104 EXIT WHEN l_fund_fail = TRUE;
11105
11106 END LOOP; -- Main loop
11107 CLOSE c_fund;
11108
11109 /*
11110 Do all the FSEOG Fund checks.
11111 */
11112 /* Code commented as part of FA126 Multiple Financial Aid Offices Build
11113 Bug 3102439
11114 */
11115 /*
11116 -- ssawhney FISAP DLD
11117 IF ( NOT l_fund_fail ) THEN -- *1
11118
11119 OPEN c_match_method;
11120 FETCH c_match_method INTO l_method_rec;
11121 CLOSE c_match_method;
11122
11123 l_method := l_method_rec.fseog_match_mthd; -- this will be the FSEOG contribution
11124 l_pct := l_method_rec.fseog_fed_pct;
11125
11126 IF l_method = 'INDV_MATCH' THEN -- proceed -- *2
11127
11128 -- get if any fund of type FSEOG is present in the base id
11129 OPEN c_find_fseog(l_fabase.base_id, l_process_id);
11130 FETCH c_find_fseog INTO l_fseog_rec;
11131 l_fseog_cnt := l_fseog_rec.cnt;
11132 l_fund_id := l_fseog_rec.fund_id;
11133 CLOSE c_find_fseog;
11134
11135 IF NVL(l_fseog_cnt,0) <> 0 THEN -- *3
11136
11137 -- this means an FSEOG fund exists for the baseid
11138 -- now get the SUM for the FSEOG FUND
11139
11140 OPEN c_get_fund_sum(
11141 l_fund_id,
11142 l_fabase.base_id,
11143 l_process_id
11144 );
11145 FETCH c_get_fund_sum INTO l_fseog_sum;
11146 CLOSE c_get_fund_sum;
11147
11148 -- now get the list of matched fund ids
11149 OPEN c_find_match( l_fabase.ci_cal_type, l_fabase.ci_sequence_number);
11150
11151 l_total_match_amnt := 0; -- reset the variable
11152 LOOP -- there can be more than one fund ids that match this
11153 FETCH c_find_match INTO l_match_fund_id;
11154 EXIT WHEN c_find_match%NOTFOUND;
11155
11156 -- for every match id get the sum of the fund amount
11157 OPEN c_get_fund_sum(
11158 l_match_fund_id,
11159 l_fabase.base_id,
11160 l_process_id
11161 );
11162 l_match_sum :=0;
11163
11164 LOOP -- Added as part of disb build
11165 FETCH c_get_fund_sum INTO l_match_sum;
11166 EXIT WHEN c_get_fund_sum%NOTFOUND;
11167 l_total_match_amnt := NVL(l_total_match_amnt,0) + NVL(l_match_sum,0);
11168 END LOOP; -- Added as part of disb build;
11169
11170 CLOSE c_get_fund_sum;
11171
11172 END LOOP;
11173 CLOSE c_find_match;
11174
11175 l_total_fund_amnt := NVL(l_total_match_amnt,0) + NVL(l_fseog_sum,0);
11176
11177 -- this amount is the total fund amount and should be 100%.
11178 -- get total match funds percentage
11179 l_match_pct := ROUND(100 - NVL(l_pct,0));
11180
11181 -- get the estimated match fund amount
11182 l_est_match_amnt := (l_total_fund_amnt*l_match_pct)/100;
11183
11184 -- now compare the amounts
11185 IF NVL(l_total_match_amnt,0) < NVL(l_est_match_amnt,0) THEN
11186
11187 -- since total matching fund amount is LESS than the amount estimated from
11188 -- the PERCENTAGE defined in the setup. THe FSEOG fund is marked as failed.
11189 -- set out NOCOPY varaibles. l_fund_id is already set to the FSEOG Fund Id
11190 -- If the matching fails, all the occurrence of FSEOG funds need to be
11191 -- deleted in the award_t table, so seq_no doesnt matter. Pass it as -1.
11192
11193 l_seq_no := -1;
11194 l_fund_fail := TRUE;
11195 IF ( l_run_mode = 'D') THEN
11196 fnd_message.set_name('IGF','IGF_AW_FSEOG_MATCH_PCT');
11197 fnd_message.set_token('FUND',to_char(l_fund_id));
11198 fnd_file.put_line(fnd_file.log,fnd_message.get);
11199 END IF;
11200 END IF;
11201
11202 END IF; -- *3
11203 END IF; -- *2
11204
11205 END IF; -- *1
11206 -- ssawhney code end.
11207
11208 */
11209 /*
11210 Fund Awards are calculated and they are ready to award. There will be multiple instances of the same fund
11211 in the Temp Table, these should be clubbed into a single award. So an final will be created in the
11212 Temp table with the falg status as 'FL' with the consolidated amounts.
11213
11214 1. Below Dynamic cursor fetches the records based on the Single fund proceess or Packaging Process
11215 2. For the consolidated Award Amounts apply the rounding factor specified at the fund level
11216 3. After rounding, Check the for the Min and Max amount checks ( Note : Not necessary for PELL as PELL amounts is from PELL marrix)
11217 4. Remove all these consolidated funds from the temporary table ( flag = 'CF' )
11218 5. Update the running totals in the PL/SQL table for the base_id and Fund id combination
11219 6. Insert a consolidated Record for the fund with the falg as 'FL'
11220 */
11221 IF ( NOT l_fund_fail ) THEN
11222
11223 -- Get Consolidated Totals for each fund and validate the consolidated checks
11224 IF g_sf_packaging = 'F' THEN
11225
11226 OPEN c_awd_grp FOR
11227 SELECT awdt.fund_id,
11228 fmast.fund_code,
11229 SUM(NVL(awdt.offered_amt,0)) offered_amt ,
11230 SUM(awdt.accepted_amt) accepted_amt ,
11231 COUNT(*) total,
11232 frml.seq_no,
11233 awdt.adplans_id,
11234 awdt.award_id,
11235 awdt.lock_award_flag
11236 FROM igf_aw_award_t awdt ,
11237 igf_aw_fund_mast fmast,
11238 (SELECT MIN(awdt1.temp_char_val1) seq_no,
11239 awdt1.fund_id fund_id
11240 FROM igf_aw_award_t awdt1
11241 WHERE awdt1.process_id = l_process_id
11242 AND awdt1.base_id = l_fabase.base_id
11243 AND awdt1.flag = 'AW'
11244 GROUP BY awdt1.fund_id) frml
11245 WHERE awdt.process_id = l_process_id
11246 AND awdt.base_id = l_fabase.base_id
11247 AND fmast.fund_id = awdt.fund_id
11248 AND awdt.flag = 'AW'
11249 AND frml.fund_id = fmast.fund_id
11250 GROUP BY awdt.fund_id,
11251 awdt.adplans_id,
11252 fmast.fund_code,
11253 awdt.base_id,
11254 frml.seq_no,
11255 awdt.award_id,
11256 awdt.lock_award_flag
11257 ORDER BY frml.seq_no;
11258
11259
11260 ELSIF g_sf_packaging = 'T' THEN
11261
11262 OPEN c_awd_grp FOR
11263 SELECT awdt.fund_id,
11264 fmast.fund_code,
11265 SUM(NVL(awdt.offered_amt,0)) offered_amt ,
11266 SUM(awdt.accepted_amt) accepted_amt ,
11267 COUNT(*) total,
11268 1,
11269 awdt.adplans_id,
11270 awdt.award_id,
11271 awdt.lock_award_flag
11272 FROM igf_aw_award_t awdt,
11273 igf_aw_fund_mast fmast
11274 WHERE awdt.process_id = l_process_id
11275 AND awdt.base_id = l_fabase.base_id
11276 AND awdt.fund_id = fmast.fund_id
11277 AND awdt.flag = 'AW'
11278 GROUP BY awdt.fund_id,
11279 awdt.adplans_id,
11280 fmast.fund_code,
11281 awdt.award_id,
11282 awdt.lock_award_flag;
11283
11284 END IF;
11285
11286 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11287 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'opened c_awd_grp');
11288 END IF;
11289
11290 -- This loop will execute for each fund id once. This will group all the funds from the temp table
11291 LOOP
11292
11293 FETCH c_awd_grp INTO l_awd_grp;
11294 EXIT WHEN c_awd_grp%NOTFOUND;
11295
11296 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11297 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'===fetched c_awd_grp,fund_id:'||l_awd_grp.fund_id||' aid:'||l_awd_grp.offered_amt||
11298 'l_awd_grp.lock_award_flag:'||l_awd_grp.lock_award_flag||'===');
11299 END IF;
11300
11301 IF NVL(l_awd_grp.accepted_amt,0) = 0 THEN
11302 l_aid := l_awd_grp.offered_amt;
11303 ELSE
11304 l_aid := l_awd_grp.accepted_amt;
11305 END IF;
11306 l_accepted_amt := l_awd_grp.accepted_amt;
11307
11308 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11309 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_aid:'||l_aid);
11310 END IF;
11311
11312 OPEN c_fmast(l_awd_grp.fund_id );
11313 FETCH c_fmast INTO l_fmast;
11314 CLOSE c_fmast;
11315 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11316 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'opened and fetched c_fmast for fund_id:'||l_awd_grp.fund_id);
11317 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_fmast.roundoff_fact:'||l_fmast.roundoff_fact);
11318 END IF;
11319 -- Round off on consolidated totals per fund as set in Fund Manager
11320 IF l_fmast.roundoff_fact IS NOT NULL THEN
11321
11322 IF LTRIM(RTRIM(NVL(l_fmast.roundoff_fact,'0'))) = '0.5' THEN
11323 -- museshad (Build# FA157 - Bug# 4382371)
11324 -- From FA 157 lookup-code '0.5' refers to 'Round off To Two Decimals'
11325 -- Changed the Round factor to 2 decimal places for this.
11326 l_aid := ROUND(l_aid, 2); -- l_aid := ROUND(l_aid/0.5) * 0.5;
11327 l_round_tol_ant := 0.5;
11328
11329 ELSIF LTRIM(RTRIM(NVL(l_fmast.roundoff_fact,'0'))) = '1' THEN
11330 l_aid := ROUND( l_aid );
11331 l_round_tol_ant := 1;
11332
11333 ELSIF LTRIM(RTRIM(NVL(l_fmast.roundoff_fact,'0'))) = '10' THEN
11334 l_aid := ROUND( l_aid/10 ) * 10 ;
11335 l_round_tol_ant := 10;
11336
11337 ELSIF LTRIM(RTRIM(NVL(l_fmast.roundoff_fact,'0'))) = '50' THEN
11338 l_aid := ROUND( l_aid/50 ) * 50 ;
11339 l_round_tol_ant := 50;
11340
11341 ELSIF LTRIM(RTRIM(NVL(l_fmast.roundoff_fact,'0'))) = '100' THEN
11342 l_aid := ROUND( l_aid/100 ) * 100 ;
11343 l_round_tol_ant := 100;
11344
11345 ELSE
11346 l_round_tol_ant := 0;
11347
11348 END IF;
11349
11350 END IF;
11351 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11352 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'after rouding off aid amount,l_aid:'||l_aid||' l_round_tol_ant:'||l_round_tol_ant);
11353 END IF;
11354
11355 IF l_fmast.fed_fund_code <> 'PELL' THEN
11356 -- After rounding off now Check for Maximum Fund Check
11357
11358 IF l_aid > l_fmast.max_award_amt THEN
11359 -- Aid can only be given to the extent of max award amt
11360 l_aid := l_aid - l_round_tol_ant ;
11361 END IF;
11362
11363 -- After rounding off now Check for Minimum Fund Check
11364 IF ( l_aid < l_fmast.min_award_amt ) OR ( l_aid < 0 ) THEN
11365 IF ( l_run_mode = 'D') THEN
11366 fnd_message.set_name('IGF','IGF_AW_MIN_AWD_CHECK');
11367 fnd_message.set_token('FUND',l_fmast.fund_code);
11368 fnd_file.put_line(fnd_file.log,fnd_message.get);
11369 END IF;
11370 l_fund_id := l_fund.fund_id;
11371 l_fund_fail := TRUE;
11372 l_award_id := l_fund.award_id;
11373 EXIT;
11374 END IF;
11375 END IF;
11376
11377 -- Clear out Individiual Values and Insert Groupwise values / of One per fund ID
11378 -- after applying Round Off Rule
11379 OPEN c_awd_grp_funds(
11380 l_awd_grp.fund_id,
11381 l_fabase.base_id,
11382 l_process_id
11383 );
11384 LOOP
11385
11386 FETCH c_awd_grp_funds INTO l_awd_grp_funds;
11387 EXIT WHEN c_awd_grp_funds%NOTFOUND;
11388 igf_aw_award_t_pkg.delete_row(l_awd_grp_funds.row_id);
11389 END LOOP;
11390 CLOSE c_awd_grp_funds;
11391
11392 -- Insert one consolidated Value per fund ID
11393 IF NVL(l_aid,0) > 0 THEN
11394
11395 lv_rowid := NULL;
11396 l_sl_number := NULL;
11397
11398 IF NVL(l_accepted_amt,0) > 0 THEN
11399 l_accepted_amt := l_aid;
11400 END IF;
11401
11402 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11403 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'Before Determining Over Award with l_aid : '||l_aid);
11404 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'before checking overaward situation-fund uses '||l_fmast.fm_fc_methd||'with aid '||l_aid||' l_need_f:'||l_need_f||' l_need_i:'||l_need_i);
11405 END IF;
11406 -- Check whether the award leads to Over Award, then set the indicator with the HOLD or NO HOLD
11407 g_over_awd := NULL;
11408
11409 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11410 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'checking aid > need!l_aid:'||l_aid||' l_need_f:'||l_need_f);
11411 END IF;
11412
11413 -- ???? IF NVL(l_aid,0) > NVL(l_need_f,0) THEN
11414 IF NVL(l_need_f,0) < 0 THEN
11415
11416 IF l_post = 'Y' THEN
11417 g_over_awd := 'NO HOLD';
11418 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11419 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_post=Y,g_over_awd=NO HOLD');
11420 END IF;
11421 ELSE
11422 g_over_awd := 'HOLD';
11423 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11424 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_post <> Y,g_over_awd=HOLD');
11425 END IF;
11426 END IF;
11427
11428 END IF; -- End of Over Award Hold
11429
11430 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11431 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'after determining overaward,l_post:'||l_post||' g_over_awd:'||g_over_awd);
11432 END IF;
11433
11434 -- Update the running totals for the student
11435 IF NVL(g_awarded_aid.COUNT,0) = 0 THEN
11436 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11437 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'updating running totals - extending g_awarded_aid');
11438 END IF;
11439 l_cnt := 1;
11440 g_awarded_aid.extend;
11441 g_awarded_aid(l_cnt).base_id := l_fabase.base_id;
11442 g_awarded_aid(l_cnt).need_f := NVL(igf_aw_gen_004.need_f(l_fabase.base_id,g_awd_prd),0);
11443 g_awarded_aid(l_cnt).awarded_aid := NVL(l_aid,0);
11444 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11445 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'set g_awarded_aid('||l_cnt||').base_id:'||g_awarded_aid(l_cnt).base_id);
11446 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'set g_awarded_aid('||l_cnt||').need_f:'||g_awarded_aid(l_cnt).need_f);
11447 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'set g_awarded_aid('||l_cnt||').awarded_aid:'||g_awarded_aid(l_cnt).awarded_aid);
11448 END IF;
11449
11450 ELSIF NVL(g_awarded_aid.COUNT,0) > 0 THEN
11451
11452 -- Loop thru all the records till there is match
11453 FOR i IN 1..g_awarded_aid.COUNT LOOP
11454 l_cnt := l_cnt + 1;
11455 IF g_awarded_aid(i).base_id = l_fabase.base_id THEN
11456 g_awarded_aid(i).awarded_aid := g_awarded_aid(i).awarded_aid + NVL(l_aid,0);
11457 l_rec_fnd := TRUE;
11458 EXIT;
11459 ELSE
11460 l_rec_fnd := FALSE;
11461 END IF;
11462 END LOOP;
11463
11464 -- if awarded_aid is present then update the values
11465 IF l_rec_fnd THEN
11466 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11467 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_rec_fnd=TRUE!g_awarded_aid('||l_cnt||').awarded_aid:'||g_awarded_aid(l_cnt).awarded_aid);
11468 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'g_awarded_aid('||l_cnt||').need_f:'||g_awarded_aid(l_cnt).need_f);
11469 END IF;
11470 -- Need to re-check this as Awarded Aid is getting increased for the student
11471 -- ???? IF NVL(g_awarded_aid(l_cnt).awarded_aid,0) > NVL(g_awarded_aid(l_cnt).need_f,0) THEN
11472 IF NVL(g_awarded_aid(l_cnt).need_f,0) < 0 THEN
11473 IF l_post = 'Y' THEN
11474 g_over_awd := 'NO HOLD';
11475 ELSE
11476 g_over_awd := 'HOLD';
11477 END IF;
11478 END IF;
11479
11480 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11481 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'inside (NVL(g_awarded_aid.COUNT,0) > 0) check,l_post:'||l_post||' g_over_awd:'||g_over_awd);
11482 END IF;
11483
11484 -- if awarded_aid is not present then create the new record
11485 ELSE
11486
11487 l_cnt := l_cnt + 1;
11488 g_awarded_Aid.extend;
11489 g_awarded_aid(l_cnt).base_id := l_fabase.base_id;
11490 g_awarded_aid(l_cnt).need_f := NVL(igf_aw_gen_004.need_f(l_fabase.base_id,g_awd_prd),0);
11491 g_awarded_aid(l_cnt).awarded_aid := NVL(l_aid,0);
11492
11493 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11494 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'l_rec_fnd=FALSE!g_awarded_aid('||l_cnt||').awarded_aid:'||g_awarded_aid(l_cnt).awarded_aid);
11495 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'g_awarded_aid('||l_cnt||').need_f:'||g_awarded_aid(l_cnt).need_f);
11496 END IF;
11497
11498 END IF; -- End if awarded_aid found in running totals table
11499
11500 END IF; -- end if awarded aid count
11501
11502 l_cnt := 0;
11503 l_rec_fnd := FALSE;
11504
11505 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11506 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'inserting to igf_aw_award_t with flag:FL for base_id:'||l_fabase.base_id||' g_over_awd:'||g_over_awd);
11507 END IF;
11508 -- Insert a new consolidated record into the temp table.
11509 -- These are the actual awards to the inserted in the igf_aw_award and igf_aw_awd_disb
11510
11511 ln_com_perct := 100;
11512 igf_aw_gen_003.get_common_perct(l_awd_grp.adplans_id,l_fabase.base_id,ln_com_perct);
11513
11514 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11515 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_stud.debug '|| g_req_id,'Before inserting with FL flag in the temp, ln_com_perct : '||ln_com_perct
11516 ||' l_awd_grp.fund_id:'||l_awd_grp.fund_id
11517 ||' l_aid:'||l_aid
11518 ||' l_fabase.base_id:'||l_fabase.base_id
11519 ||' l_awd_grp.award_id:'||l_awd_grp.award_id
11520 );
11521 END IF;
11522
11523 igf_aw_award_t_pkg.insert_row(
11524 x_rowid => lv_rowid ,
11525 x_process_id => l_process_id ,
11526 x_sl_number => l_sl_number,
11527 x_fund_id => l_awd_grp.fund_id,
11528 x_base_id => l_fabase.base_id,
11529 x_offered_amt => l_aid ,
11530 x_accepted_amt => l_accepted_amt ,
11531 x_paid_amt => NULL ,
11532 x_need_reduction_amt => NULL,
11533 x_flag => 'FL',
11534 x_temp_num_val1 => NVL(ln_com_perct,100),
11535 x_temp_num_val2 => NULL,
11536 x_temp_char_val1 => g_over_awd,
11537 x_tp_cal_type => NULL,
11538 x_tp_sequence_number => NULL,
11539 x_ld_cal_type => NULL,
11540 x_ld_sequence_number => NULL,
11541 x_mode => 'R',
11542 x_adplans_id => l_awd_grp.adplans_id,
11543 x_app_trans_num_txt => NULL,
11544 x_award_id => l_awd_grp.award_id,
11545 x_lock_award_flag => l_awd_grp.lock_award_flag,
11546 x_temp_val3_num => NULL,
11547 x_temp_val4_num => NULL,
11548 x_temp_char2_txt => NULL,
11549 x_temp_char3_txt => NULL
11550 );
11551 END IF;
11552
11553 END LOOP; -- award group check ( dynamic cursor)
11554 CLOSE c_awd_grp;
11555
11556 END IF;
11557
11558 EXCEPTION
11559 WHEN PELL_NO_REPACK THEN
11560 RAISE;
11561 WHEN OTHERS THEN
11562 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
11563 fnd_message.set_token('NAME','IGF_AW_PACKAGING.PROCESS_STUD '||SQLERRM);
11564 igs_ge_msg_stack.add;
11565 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
11566 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.process_stud.exception '|| g_req_id,'sql error:'||SQLERRM);
11567 END IF;
11568 RAISE;
11569
11570 END process_stud;
11571
11572
11573 PROCEDURE get_process_id IS
11574 /*
11575 || Created By : cdcruz
11576 || Created On : 14-NOV-2000
11577 || Purpose :
11578 || Known limitations, enhancements or remarks :
11579 || Change History :
11580 || Who WHEN What
11581 || (reverse chronological order - newest change first)
11582 */
11583
11584 BEGIN
11585
11586 -- If the process ID is not assigned then assign the same from the sequences
11587 -- This is uesd to uniquely identify the records in the temporary table
11588 IF l_process_id IS NULL THEN
11589 SELECT igf_aw_process_s.nextval INTO l_process_id FROM dual;
11590 END IF;
11591
11592 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11593 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_process_id.debug '|| g_req_id,'l_process_id:'||l_process_id);
11594 END IF;
11595
11596 EXCEPTION
11597 WHEN OTHERS THEN
11598 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
11599 fnd_message.set_token('NAME','IGF_AW_PACKAGING.GET_PROCESS_ID '|| SQLERRM);
11600 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
11601 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.get_process_id.exception '|| g_req_id,'sql error message: '||SQLERRM);
11602 END IF;
11603 igs_ge_msg_stack.add;
11604 app_exception.raise_exception;
11605
11606 END get_process_id;
11607
11608
11609 FUNCTION get_perct_amt(
11610 l_perct_fact IN VARCHAR2,
11611 l_perct_val IN NUMBER,
11612 l_base_id IN NUMBER,
11613 l_efc_f IN NUMBER,
11614 p_awd_prd_code IN VARCHAR2
11615 ) RETURN NUMBER IS
11616 /*
11617 || Created By : cdcruz
11618 || Created On : 14-NOV-2000
11619 || Purpose :
11620 || Known limitations, enhancements or remarks :
11621 || Change History :
11622 || Who WHEN What
11623 || (reverse chronological order - newest change first)
11624 */
11625
11626 l_coa NUMBER;
11627 l_perct_amt NUMBER(12,2);
11628 l_awd_aid NUMBER;
11629
11630 BEGIN
11631
11632 -- Get Federal COA of the student.
11633 -- Use these values while calculating the Net Need, COA, EFC or Gross Need for the student.
11634 l_coa := igf_aw_coa_gen.coa_amount(l_base_id,p_awd_prd_code);
11635
11636 -- The group Policies set are irrespective of the Fund, so the EFC value of the Federal Methodology MUST be taken
11637 IF l_perct_fact = 'EFC' then
11638 l_perct_amt := l_efc_f * (l_perct_val / 100 ) ;
11639
11640 ELSIF l_perct_fact = 'COA' then
11641 l_perct_amt := l_coa * (l_perct_val / 100 ) ;
11642
11643 ELSIF l_perct_fact = 'GROSS_NEED' then
11644 IF (l_coa - l_efc_f) <= 0 THEN
11645 l_perct_amt := 0;
11646 ELSE
11647 l_perct_amt := ((l_coa - l_efc_f) * (l_perct_val / 100 )) ;
11648 END IF;
11649
11650 ELSIF l_perct_fact = 'NET_NEED' then
11651
11652 l_awd_aid := igf_aw_coa_gen.award_amount(l_base_id,p_awd_prd_code);
11653
11654 IF NVL(NVL(l_coa,0) - (NVL(l_efc_f,0) + NVL(l_awd_aid,0)),0) <=0 THEN
11655 l_perct_amt := 0;
11656 ELSE
11657
11658 l_perct_amt := ((NVL(l_coa,0) - (NVL(l_efc_f,0) + NVL(l_awd_aid,0))) * (NVL(l_perct_val,0) / 100 )) ;
11659 END IF;
11660
11661 ELSE
11662 l_perct_amt := 0;
11663
11664 END IF;
11665
11666 RETURN l_perct_amt;
11667
11668 END get_perct_amt;
11669
11670
11671 PROCEDURE update_fund(
11672 l_fund_id IN NUMBER,
11673 l_seq_no IN NUMBER,
11674 l_process_id IN NUMBER,
11675 l_base_id IN NUMBER,
11676 l_award_id IN NUMBER
11677 ) IS
11678 /*
11679 || Created By : skoppula
11680 || Created On : 02-JAN-2002
11681 || Purpose :
11682 || Known limitations, enhancements or remarks :
11683 || Change History :
11684 || Who WHEN What
11685 || (reverse chronological order - newest change first)
11686 */
11687
11688 CURSOR c_awd_det(
11689 x_fund_id igf_aw_fund_mast.fund_id%TYPE,
11690 x_process_id NUMBER,
11691 x_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
11692 x_seq_no NUMBER,
11693 x_award_id igf_aw_award_all.award_id%TYPE
11694 ) IS
11695 SELECT awdt.*
11696 FROM igf_aw_award_t awdt
11697 WHERE fund_id = x_fund_id
11698 AND (temp_char_val1 = TO_CHAR( x_seq_no ) OR x_seq_no =-1)
11699 AND process_id = x_process_id
11700 AND flag IN ('CF','AU')
11701 AND base_id = x_base_id
11702 AND NVL(award_id,-1) = NVL(x_award_id,-1);
11703
11704 l_awd_det c_awd_det%ROWTYPE;
11705
11706 l_paid_amt igf_aw_award_all.paid_amt%TYPE;
11707 -- Get paid amt
11708 CURSOR c_paid_amt(
11709 cp_award_id igf_aw_award_all.award_id%TYPE
11710 ) IS
11711 SELECT SUM(paid_amount) paid_amount
11712 FROM igf_se_payment pay,
11713 igf_se_auth auth
11714 WHERE pay.auth_id = auth.auth_id
11715 AND auth.award_id = cp_award_id
11716 AND auth.flag = 'A';
11717
11718 -- check if the award has been repackaged
11719 CURSOR c_awd_ex(
11720 cp_process_id NUMBER,
11721 cp_award_id igf_aw_award_all.award_id%TYPE,
11722 cp_seq_no NUMBER
11723 ) IS
11724 SELECT 'x'
11725 FROM igf_aw_award_t
11726 WHERE process_id = cp_process_id
11727 AND award_id = cp_award_id
11728 AND flag = 'AU'
11729 AND TO_NUMBER(NVL(temp_char_val1,-1)) < cp_seq_no;
11730 l_awd_ex c_awd_ex%ROWTYPE;
11731 BEGIN
11732
11733 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11734 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_fund.debug '|| g_req_id,'update_fund called');
11735 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_fund.debug '|| g_req_id,'fund_id:'||l_fund_id);
11736 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_fund.debug '|| g_req_id,'base_id:'||l_base_id);
11737 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_fund.debug '|| g_req_id,'process_id:'||l_process_id);
11738 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_fund.debug '|| g_req_id,'l_seq_no:'||l_seq_no);
11739 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_fund.debug '|| g_req_id,'l_award_id:'||l_award_id);
11740 END IF;
11741 -- ssawhney. Added LOOP, because id l_seq_no=-1 then fund=FSEOG and there will be more than one occurence of an FSEOG fund.
11742 -- Remove all Find Instances from the Temporary table for a given fund and base_id combination
11743 -- This is used to check the Fund Rules like Inclusive, Exclusive etc.
11744 OPEN c_awd_det( l_fund_id, l_process_id ,l_base_id,l_seq_no,l_award_id);
11745 LOOP
11746 FETCH c_awd_det INTO l_awd_det;
11747 EXIT WHEN c_awd_det%NOTFOUND;
11748
11749 IF l_award_id IS NULL THEN
11750 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11751 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_fund.debug '|| g_req_id,'Calling delete_row for');
11752 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_fund.debug '|| g_req_id,'fund_id:'||l_awd_det.fund_id);
11753 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_fund.debug '|| g_req_id,'base_id:'||l_awd_det.base_id);
11754 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_fund.debug '|| g_req_id,'flag:'||l_awd_det.flag);
11755 END IF;
11756
11757 igf_aw_award_t_pkg.delete_row( x_rowid => l_awd_det.row_id );
11758 ELSE
11759 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11760 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_fund.debug '|| g_req_id,'Calling update_row for');
11761 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_fund.debug '|| g_req_id,'fund_id:'||l_awd_det.fund_id);
11762 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_fund.debug '|| g_req_id,'base_id:'||l_awd_det.base_id);
11763 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_fund.debug '|| g_req_id,'flag:'||l_awd_det.flag);
11764 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_fund.debug '|| g_req_id,'award_id:'||l_awd_det.award_id);
11765 END IF;
11766 --do a check for FWS before cancelling this
11767 IF get_fed_fund_code(l_awd_det.fund_id) = 'FWS' THEN
11768 l_paid_amt := NULL;
11769 OPEN c_paid_amt(l_awd_det.award_id);
11770 FETCH c_paid_amt INTO l_paid_amt;
11771 CLOSE c_paid_amt;
11772 IF l_paid_amt IS NOT NULL THEN
11773 fnd_message.set_name('IGF','IGF_AW_INV_FWS_AWD');
11774 fnd_file.put_line(fnd_file.log,fnd_message.get);
11775 RAISE INV_FWS_AWARD;
11776 END IF;
11777 END IF;
11778
11779 --here, we need to check if the award has been already repackaged successfully
11780 OPEN c_awd_ex(l_process_id,l_awd_det.award_id,l_seq_no);
11781 FETCH c_awd_ex INTO l_awd_ex;
11782 IF c_awd_ex%NOTFOUND THEN
11783 --award has not been already repackaged
11784 --so it can be cancelled
11785 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11786 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_fund.debug '|| g_req_id,'cancelling the award');
11787 END IF;
11788 CLOSE c_awd_ex;
11789 igf_aw_award_t_pkg.update_row(
11790 x_rowid => l_awd_det.row_id,
11791 x_process_id => l_awd_det.process_id,
11792 x_sl_number => l_awd_det.sl_number,
11793 x_fund_id => l_awd_det.fund_id,
11794 x_base_id => l_awd_det.base_id,
11795 x_offered_amt => l_awd_det.offered_amt,
11796 x_accepted_amt => l_awd_det.accepted_amt,
11797 x_paid_amt => l_awd_det.paid_amt,
11798 x_need_reduction_amt => l_awd_det.need_reduction_amt,
11799 x_flag => 'AC',
11800 x_temp_num_val1 => l_awd_det.temp_num_val1,
11801 x_temp_num_val2 => l_awd_det.temp_num_val2,
11802 x_temp_char_val1 => l_awd_det.temp_char_val1,
11803 x_tp_cal_type => l_awd_det.tp_cal_type,
11804 x_tp_sequence_number => l_awd_det.tp_sequence_number,
11805 x_ld_cal_type => l_awd_det.ld_cal_type,
11806 x_ld_sequence_number => l_awd_det.ld_sequence_number,
11807 x_mode => 'R',
11808 x_adplans_id => l_awd_det.adplans_id,
11809 x_app_trans_num_txt => l_awd_det.app_trans_num_txt,
11810 x_award_id => l_awd_det.award_id,
11811 x_lock_award_flag => l_awd_det.lock_award_flag,
11812 x_temp_val3_num => l_awd_det.temp_val3_num,
11813 x_temp_val4_num => l_awd_det.temp_val4_num,
11814 x_temp_char2_txt => l_awd_det.temp_char2_txt,
11815 x_temp_char3_txt => l_awd_det.temp_char3_txt
11816 );
11817 ELSE
11818 --award has been repackaged. cancelling an repackaged award does not make sense
11819 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11820 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_fund.debug '|| g_req_id,'deleting the award');
11821 END IF;
11822 CLOSE c_awd_ex;
11823 igf_aw_award_t_pkg.delete_row( x_rowid => l_awd_det.row_id );
11824 END IF;
11825 END IF;
11826 END LOOP;
11827
11828 CLOSE c_awd_det;
11829 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
11830 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.update_fund.debug '|| g_req_id,'update_fund finished');
11831 END IF;
11832
11833 EXCEPTION
11834 WHEN INV_FWS_AWARD THEN
11835 RAISE;
11836 WHEN OTHERS THEN
11837 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
11838 fnd_message.set_token('NAME','IGF_AW_PACKAGING.UPDATE_FUND '||SQLERRM);
11839 igs_ge_msg_stack.add;
11840 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
11841 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.update_fund.exception '|| g_req_id,'sql error message: '||SQLERRM);
11842 END IF;
11843 app_exception.raise_exception;
11844
11845 END update_fund;
11846
11847
11848 PROCEDURE get_disbursements(
11849 l_fund_id IN NUMBER,
11850 l_offered_amt IN NUMBER,
11851 l_base_id IN NUMBER,
11852 l_process_id IN NUMBER,
11853 l_accepted_amt IN NUMBER,
11854 l_called_from IN VARCHAR2,
11855 l_nslds_da IN VARCHAR2,
11856 l_exp_da IN VARCHAR2,
11857 l_verf_da IN VARCHAR2,
11858 l_disb_dt IN OUT NOCOPY disb_dt_tab,
11859 l_adplans_id IN NUMBER,
11860 l_award_id IN NUMBER
11861 ) IS
11862 /*
11863 || Created By : skoppula
11864 || Created On : 02-JAN-2002
11865 || Purpose :
11866 || Known limitations, enhancements or remarks :
11867 || Change History :
11868 || Who WHEN What
11869 || (reverse chronological order - newest change first)
11870 || museshad 08-Jun-2005 Build# FA157 - Bug# 4382371.
11871 || In 'Equal' distribution method previously, the number of
11872 || terms in the awarding period was passed as parameter to the
11873 || cursors - c_auto_disb_equal, c_auto_disb_equal_wcoa. From now
11874 || on the number of teaching periods in the awarding period will
11875 || get passed. Changed the above mentioned two cursors
11876 || accordingly. This changes is needed because, Equal distribution plan
11877 || will not have teaching period percentages from here on.
11878 || veramach 08-Dec-2003 FA 131 COD Updates
11879 || Added 2 new cursors c_auto_disb_wcoa,c_auto_disb_equal_wcoa
11880 || These cursors do not use student's COA terms for distributing the award
11881 || veramach 03-Dec-2003 FA 131 COD Updates
11882 || Existing logic to find disbursement is now used only for non-PELL funds
11883 || For PELL funds, the disbursements returned from the PELL wrapper is used.
11884 || veramach 21-NOV-2003 FA 125 - changed c_tp_perct to choose distribution % using adplans_id
11885 || Added c_auto_disb_equal,cur_terms_count,c_auto_disb_coa_match,c_coa
11886 || Modified cursor c_get_ofst
11887 || Added logic to choose distribution % based on distribution method
11888 */
11889
11890 -- Get the Teching and load calendar details of the fund for creating the disbursements
11891 CURSOR c_tp_perct(
11892 cp_adplans_id igf_aw_awd_dist_plans.adplans_id%TYPE,
11893 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE
11894 ) IS
11895 SELECT NVL(igf_aw_packaging.get_date_instance(cp_base_id,teach_periods.date_offset_cd,terms.ld_cal_type,terms.ld_sequence_number),teach_periods.start_date) disb_dt,
11896 terms.ld_cal_type ld_cal_type,
11897 terms.ld_sequence_number ld_sequence_number,
11898 teach_periods.tp_cal_type tp_cal_type,
11899 teach_periods.tp_sequence_number tp_sequence_number,
11900 (teach_periods.tp_perct_num * terms.ld_perct_num)/100 perct,
11901 teach_periods.start_date start_dt,
11902 teach_periods.date_offset_cd tp_offset_da,
11903 teach_periods.credit_points_num min_credit_points,
11904 teach_periods.attendance_type_code
11905 FROM igf_aw_dp_terms terms,
11906 igf_aw_dp_teach_prds_v teach_periods,
11907 (SELECT base_id,
11908 ld_cal_type,
11909 ld_sequence_number
11910 FROM igf_aw_coa_itm_terms
11911 WHERE base_id = cp_base_id
11912 GROUP BY base_id,ld_cal_type,ld_sequence_number) coaterms
11913 WHERE terms.adplans_id = cp_adplans_id
11914 AND terms.adterms_id = teach_periods.adterms_id
11915 AND coaterms.ld_cal_type = terms.ld_cal_type
11916 AND coaterms.ld_sequence_number = terms.ld_sequence_number
11917 AND coaterms.base_id = cp_base_id
11918 ORDER BY 1;
11919
11920 l_tp_perct c_tp_perct%ROWTYPE;
11921
11922 --Added this cursor for processing student without COA when COA can be exceeded
11923 CURSOR c_auto_disb_wcoa(
11924 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
11925 cp_adplans_id igf_aw_awd_dist_plans.adplans_id%TYPE
11926 ) IS
11927 SELECT NVL(igf_aw_packaging.get_date_instance(cp_base_id,teach_periods.date_offset_cd,terms.ld_cal_type,terms.ld_sequence_number),teach_periods.start_date) disb_dt,
11928 terms.ld_cal_type ld_cal_type,
11929 terms.ld_sequence_number ld_sequence_number,
11930 teach_periods.tp_cal_type tp_cal_type,
11931 teach_periods.tp_sequence_number tp_sequence_number,
11932 (teach_periods.tp_perct_num * terms.ld_perct_num)/100 perct,
11933 teach_periods.start_date start_dt,
11934 teach_periods.date_offset_cd tp_offset_da,
11935 teach_periods.credit_points_num min_credit_points,
11936 teach_periods.attendance_type_code attendance_type_code
11937 FROM igf_aw_dp_terms terms,
11938 igf_aw_dp_teach_prds_v teach_periods
11939 WHERE terms.adplans_id = cp_adplans_id
11940 AND terms.adterms_id = teach_periods.adterms_id
11941 ORDER BY 1;
11942
11943
11944 CURSOR c_auto_disb_equal(
11945 cp_adplans_id igf_aw_awd_dist_plans.adplans_id%TYPE,
11946 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
11947 cp_num_teach_periods NUMBER
11948 ) IS
11949 SELECT NVL(igf_aw_packaging.get_date_instance(cp_base_id,teach_periods.date_offset_cd,terms.ld_cal_type,terms.ld_sequence_number),teach_periods.start_date) disb_dt,
11950 terms.ld_cal_type ld_cal_type,
11951 terms.ld_sequence_number ld_sequence_number,
11952 teach_periods.tp_cal_type tp_cal_type,
11953 teach_periods.tp_sequence_number tp_sequence_number,
11954 100/cp_num_teach_periods perct,
11955 teach_periods.start_date start_dt,
11956 teach_periods.date_offset_cd tp_offset_da,
11957 teach_periods.credit_points_num min_credit_points,
11958 teach_periods.attendance_type_code
11959 FROM igf_aw_dp_terms terms,
11960 igf_aw_dp_teach_prds_v teach_periods,
11961 (SELECT base_id,
11962 ld_cal_type,
11963 ld_sequence_number
11964 FROM igf_aw_coa_itm_terms
11965 WHERE base_id = cp_base_id
11966 GROUP BY base_id,ld_cal_type,ld_sequence_number) coaterms
11967 WHERE terms.adplans_id = cp_adplans_id
11968 AND terms.adterms_id = teach_periods.adterms_id
11969 AND coaterms.ld_cal_type = terms.ld_cal_type
11970 AND coaterms.ld_sequence_number = terms.ld_sequence_number
11971 AND coaterms.base_id = cp_base_id
11972 ORDER BY 1;
11973
11974 -- Added this cursor to process students without COA when COA can be exceeded
11975 CURSOR c_auto_disb_equal_wcoa(
11976 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
11977 cp_adplans_id igf_aw_awd_dist_plans.adplans_id%TYPE,
11978 cp_num_teach_periods NUMBER
11979 ) IS
11980 SELECT NVL(igf_aw_packaging.get_date_instance (cp_base_id,teach_periods.date_offset_cd,terms.ld_cal_type,terms.ld_sequence_number),teach_periods.start_date) disb_dt,
11981 terms.ld_cal_type ld_cal_type,
11982 terms.ld_sequence_number ld_sequence_number,
11983 teach_periods.tp_cal_type tp_cal_type,
11984 teach_periods.tp_sequence_number tp_sequence_number,
11985 100/cp_num_teach_periods perct,
11986 teach_periods.start_date start_dt,
11987 teach_periods.date_offset_cd tp_offset_da,
11988 teach_periods.credit_points_num min_credit_points,
11989 teach_periods.attendance_type_code attendance_type_code
11990 FROM igf_aw_dp_terms terms,
11991 igf_aw_dp_teach_prds_v teach_periods
11992 WHERE terms.adplans_id = cp_adplans_id
11993 AND terms.adterms_id = teach_periods.adterms_id
11994 ORDER BY 1;
11995
11996 -- Get total terms
11997 CURSOR cur_terms_count(
11998 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
11999 cp_adplans_id igf_aw_awd_dist_plans.adplans_id%TYPE
12000 ) IS
12001 SELECT COUNT(*)
12002 FROM igf_aw_dp_terms terms,
12003 (SELECT base_id,
12004 ld_cal_type,
12005 ld_sequence_number
12006 FROM igf_aw_coa_itm_terms
12007 WHERE base_id = cp_base_id
12008 GROUP BY base_id,ld_cal_type,ld_sequence_number) coaterms,
12009 igf_aw_awd_dist_plans adplans,
12010 igf_aw_awd_prd_term aprd
12011 WHERE terms.adplans_id = cp_adplans_id
12012 AND coaterms.ld_cal_type = terms.ld_cal_type
12013 AND coaterms.ld_sequence_number = terms.ld_sequence_number
12014 AND coaterms.base_id = cp_base_id
12015 AND adplans.adplans_id = terms.adplans_id
12016 AND adplans.cal_type = aprd.ci_cal_type
12017 AND adplans.sequence_number = aprd.ci_sequence_number
12018 AND aprd.ld_cal_type = terms.ld_cal_type
12019 AND aprd.ld_sequence_number = terms.ld_sequence_number
12020 AND aprd.award_prd_cd = g_awd_prd;
12021
12022 l_terms_count NUMBER := 0;
12023
12024 CURSOR c_auto_disb_coa_match(
12025 cp_adplans_id igf_aw_awd_dist_plans.adplans_id%TYPE,
12026 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
12027 cp_total_coa_amount NUMBER
12028 ) IS
12029 SELECT NVL(igf_aw_packaging.get_date_instance(cp_base_id,teach_periods.date_offset_cd,terms.ld_cal_type,terms.ld_sequence_number),teach_periods.start_date) disb_dt,
12030 terms.ld_cal_type ld_cal_type,
12031 terms.ld_sequence_number ld_sequence_number,
12032 teach_periods.tp_cal_type tp_cal_type,
12033 teach_periods.tp_sequence_number tp_sequence_number,
12034 (coa_term_amount/cp_total_coa_amount) * teach_periods.tp_perct_num perct,
12035 teach_periods.start_date start_dt,
12036 teach_periods.date_offset_cd tp_offset_da,
12037 teach_periods.credit_points_num min_credit_points,
12038 teach_periods.attendance_type_code
12039 FROM igf_aw_dp_terms terms,
12040 igf_aw_dp_teach_prds_v teach_periods,
12041 (SELECT base_id,
12042 ld_cal_type,
12043 ld_sequence_number,
12044 amount coa_term_amount
12045 FROM igf_aw_coa_term_tot_v
12046 WHERE base_id = cp_base_id) coaterms
12047 WHERE terms.adplans_id = cp_adplans_id
12048 AND terms.adterms_id = teach_periods.adterms_id
12049 AND coaterms.ld_cal_type = terms.ld_cal_type
12050 AND coaterms.ld_sequence_number = terms.ld_sequence_number
12051 AND coaterms.base_id = cp_base_id
12052 ORDER BY 1;
12053
12054 -- Get COA
12055 CURSOR c_coa(
12056 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
12057 cp_adplans_id igf_aw_awd_dist_plans.adplans_id%TYPE
12058 ) IS
12059 SELECT SUM(amount) coa
12060 FROM igf_aw_coa_itm_terms coa_terms,
12061 igf_aw_dp_terms terms,
12062 igf_aw_awd_dist_plans adplans,
12063 igf_aw_awd_prd_term aprd
12064 WHERE terms.ld_cal_type = coa_terms.ld_cal_type
12065 AND terms.ld_sequence_number = coa_terms.ld_sequence_number
12066 AND coa_terms.base_id = cp_base_id
12067 AND terms.adplans_id = cp_adplans_id
12068 AND terms.adplans_id = adplans.adplans_id
12069 AND adplans.cal_type = aprd.ci_cal_type
12070 AND adplans.sequence_number = aprd.ci_sequence_number
12071 AND aprd.ld_cal_type = terms.ld_cal_type
12072 AND aprd.ld_sequence_number = terms.ld_sequence_number
12073 AND aprd.award_prd_cd = g_awd_prd;
12074 ln_coa igf_ap_fa_base_rec_all.coa_f%TYPE;
12075
12076
12077 cnt NUMBER := 0;
12078 lv_rowid VARCHAR2(30);
12079 l_sl_number NUMBER;
12080 l_disb_amt NUMBER; -- Changed from NUMBER(12,2) to NUMBER
12081 l_disb_num NUMBER := 0;
12082 l_disb_accpt_amt NUMBER; -- Changed from NUMBER(12,2) to NUMBER
12083 l_cnt NUMBER := 0;
12084 ln_fund_awd_prct NUMBER;
12085
12086 lv_result VARCHAR2(80);
12087 lv_method_code igf_aw_awd_dist_plans.dist_plan_method_code%TYPE;
12088
12089 lb_use_wcoa_cur BOOLEAN := FALSE;
12090
12091 -- Get existing pell disbursments
12092 CURSOR c_pelldisb(
12093 cp_award_id igf_aw_award_all.award_id%TYPE
12094 ) IS
12095 SELECT disb.rowid row_id,
12096 disb.*
12097 FROM igf_aw_awd_disb_all disb
12098 WHERE disb.award_id = cp_award_id
12099 AND disb.trans_type <> 'C'
12100 ORDER BY disb.disb_num;
12101
12102 -- Get distribution plan for the pell award
12103 CURSOR c_pell_dp(
12104 cp_award_id igf_aw_award_all.award_id%TYPE
12105 ) IS
12106 SELECT adplans_id
12107 FROM igf_aw_award_all
12108 WHERE award_id = cp_award_id;
12109 l_pell_dp igf_aw_awd_dist_plans.adplans_id%TYPE;
12110
12111 -- Get extra pell disbursements
12112 CURSOR c_pell_new_disb(
12113 cp_award_id igf_aw_award_all.award_id%TYPE,
12114 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE
12115 ) IS
12116 SELECT awdt.*
12117 FROM igf_aw_award_t awdt
12118 WHERE process_id = l_process_id
12119 AND base_id = cp_base_id
12120 AND award_id = cp_award_id
12121 AND flag = 'GR';
12122
12123 CURSOR c_base_attendance(
12124 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
12125 cp_award_id igf_aw_award_all.award_id%TYPE,
12126 cp_ld_cal_type igs_ca_inst_all.cal_type%TYPE,
12127 cp_ld_sequence_number igs_ca_inst_all.sequence_number%TYPE
12128 ) IS
12129 SELECT awdt.temp_char2_txt base_attendance_type_code
12130 FROM igf_aw_award_t awdt
12131 WHERE process_id = l_process_id
12132 AND base_id = cp_base_id
12133 AND award_id = cp_award_id
12134 AND ld_cal_type = cp_ld_cal_type
12135 AND ld_sequence_number = cp_ld_sequence_number;
12136 l_base_attendance c_base_attendance%ROWTYPE;
12137
12138 BEGIN
12139
12140 l_disb_num := NULL;
12141 l_disb_dt.delete;
12142
12143 IF get_fed_fund_code(l_fund_id) <> 'PELL' THEN -- Added in FA 131 COD Updates Build
12144 -- Get the Fund details like Amount, Calendar dates etc for each fund and insert INTO the Temporary table
12145 -- and at the same time fetch the actual dates for the date aliases mentioned at the fund.
12146 -- These details are used while validating the awards of the sutdents
12147
12148 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12149 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'calling check_plan');
12150 END IF;
12151
12152 check_plan(l_adplans_id,lv_result,lv_method_code);
12153
12154 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12155 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'check_plan returned lv_result:'||lv_result);
12156 END IF;
12157
12158 /*
12159 check if the student has COA or not and set a flag specifying what cursor should be used
12160 */
12161 IF igf_aw_gen_003.check_coa(l_base_id) = FALSE AND g_sf_packaging = 'T' AND g_allow_to_exceed = 'COA' THEN
12162 IF lv_method_code IN ('M','E') THEN
12163 lb_use_wcoa_cur := TRUE;
12164 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12165 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'have to use alternate cursor for base_id:'||l_base_id||' and adplans_id:'||l_adplans_id);
12166 END IF;
12167 END IF;
12168 END IF;
12169
12170 IF lv_result = 'TRUE' THEN
12171 IF lv_method_code = 'M' THEN -- Manual distribution
12172 IF lb_use_wcoa_cur = FALSE THEN
12173 OPEN c_tp_perct(l_adplans_id,l_base_id);
12174 FETCH c_tp_perct INTO l_tp_perct;
12175 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12176 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'opened and fetched cursor c_tp_perct');
12177 END IF;
12178 ELSE
12179 OPEN c_auto_disb_wcoa(l_base_id,l_adplans_id);
12180 FETCH c_auto_disb_wcoa INTO l_tp_perct;
12181 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12182 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'opened and fetched cursor c_auto_disb_wcoa');
12183 END IF;
12184 END IF;
12185
12186 ELSIF lv_method_code = 'E' THEN -- Equal distribution
12187 --Find the number of terms
12188 OPEN cur_terms_count(l_base_id,l_adplans_id);
12189 FETCH cur_terms_count INTO l_terms_count;
12190 CLOSE cur_terms_count;
12191
12192 IF lb_use_wcoa_cur = FALSE THEN
12193 OPEN c_auto_disb_equal(l_adplans_id,l_base_id,igf_aw_gen_003.get_plan_disb_count(l_adplans_id, g_awd_prd));
12194 FETCH c_auto_disb_equal INTO l_tp_perct;
12195 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12196 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'opened and fetched cursor c_auto_disb_equal');
12197 END IF;
12198 ELSE
12199 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12200 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'igf_aw_gen_003.get_plan_disb_count('||l_adplans_id||'):'||igf_aw_gen_003.get_plan_disb_count(l_adplans_id));
12201 END IF;
12202 OPEN c_auto_disb_equal_wcoa(l_base_id,l_adplans_id,igf_aw_gen_003.get_plan_disb_count(l_adplans_id, g_awd_prd));
12203 FETCH c_auto_disb_equal_wcoa INTO l_tp_perct;
12204 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12205 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'opened and fetched cursor c_auto_disb_equal_wcoa');
12206 END IF;
12207 END IF;
12208
12209 ELSIF lv_method_code = 'C' THEN -- Match COA distribution
12210
12211 OPEN c_coa(l_base_id,l_adplans_id);
12212 FETCH c_coa INTO ln_coa;
12213 CLOSE c_coa;
12214
12215 OPEN c_auto_disb_coa_match(l_adplans_id,l_base_id,NVL(ln_coa,0));
12216 FETCH c_auto_disb_coa_match INTO l_tp_perct;
12217 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12218 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'opened and fetched cursor c_auto_disb_coa_match');
12219 END IF;
12220 END IF;
12221 END IF;
12222
12223 -- loop through till all the disbursements will get created for each teaching periods defined for a given fund,
12224 -- since disbursements are distributed at the teaching period level
12225 LOOP
12226 IF lv_method_code = 'M' THEN
12227
12228 IF lb_use_wcoa_cur = FALSE THEN
12229 EXIT WHEN c_tp_perct%NOTFOUND;
12230 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12231 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'----will exit when c_tp_perct%NOTFOUND-------');
12232 END IF;
12233
12234 ELSE
12235 EXIT WHEN c_auto_disb_wcoa%NOTFOUND;
12236 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12237 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'----will exit when c_auto_disb_wcoa%NOTFOUND-------');
12238 END IF;
12239 END IF;
12240
12241 ELSIF lv_method_code = 'E' THEN
12242
12243 IF lb_use_wcoa_cur = FALSE THEN
12244 EXIT WHEN c_auto_disb_equal%NOTFOUND;
12245 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12246 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'----will exit when c_auto_disb_equal%NOTFOUND-------');
12247 END IF;
12248
12249 ELSE
12250 EXIT WHEN c_auto_disb_equal_wcoa%NOTFOUND;
12251 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12252 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'----will exit when c_auto_disb_equal_wcoa%NOTFOUND-------');
12253 END IF;
12254 END IF;
12255
12256 ELSIF lv_method_code = 'C' THEN
12257 EXIT WHEN c_auto_disb_coa_match%NOTFOUND;
12258 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12259 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'----will exit when c_auto_disb_coa_match%NOTFOUND-------');
12260 END IF;
12261
12262 END IF;
12263
12264
12265 lv_rowid := NULL;
12266 l_sl_number := NULL;
12267 ln_fund_awd_prct := 0;
12268
12269 -- Get the fund award percentage calculated while calculating the award from the PL/SQL table
12270 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12271 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'getting award percentage from temp table -g_fund_awd_prct.COUNT:'||g_fund_awd_prct.COUNT);
12272 END IF;
12273 FOR i IN 1..g_fund_awd_prct.COUNT LOOP
12274 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12275 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'g_fund_awd_prct('||i||').base_id:'||g_fund_awd_prct(i).base_id);
12276 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'g_fund_awd_prct('||i||').fund_id:'||g_fund_awd_prct(i).fund_id);
12277 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'g_fund_awd_prct('||i||').awd_prct:'||g_fund_awd_prct(i).awd_prct);
12278 END IF;
12279 IF g_fund_awd_prct(i).base_id = l_base_id AND g_fund_awd_prct(i).fund_id = l_fund_id THEN
12280 ln_fund_awd_prct := g_fund_awd_prct(i).awd_prct;
12281 END IF;
12282 END LOOP;
12283
12284 -- Split the Offered and Accepted amount specified at the fund INTO disbursements using the disbursement percentages
12285 l_disb_num := NVL( l_disb_num, 0) + 1;
12286 l_disb_amt := ( l_offered_amt * l_tp_perct.perct ) / 100;
12287 l_disb_accpt_amt := ( l_accepted_amt * l_tp_perct.perct ) / 100;
12288
12289 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12290 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'after splitting award amount for disbursments l_disb_num:'||l_disb_num||' l_disb_amt:'||l_disb_amt||
12291 ' l_disb_accpt_amt:'||l_disb_accpt_amt);
12292 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_tp_perct.perct:'||l_tp_perct.perct||' l_accepted_amt:'||l_accepted_amt||' l_disb_amt:'||l_disb_amt);
12293 END IF;
12294 -- Create a disbursements INTO the temporary table with the fund deatils and the newly calculated disbursements amounts with the status = 'DB'
12295 l_sl_number := NULL;
12296
12297 igf_aw_award_t_pkg.insert_row(
12298 x_rowid => lv_rowid,
12299 x_process_id => l_process_id,
12300 x_sl_number => l_sl_number,
12301 x_fund_id => l_fund_id,
12302 x_base_id => l_base_id,
12303 x_offered_amt => l_disb_amt,
12304 x_accepted_amt => l_disb_accpt_amt,
12305 x_paid_amt => 0,
12306 x_need_reduction_amt => ((l_disb_amt/l_offered_amt)*100),
12307 x_flag => 'DB',
12308 x_temp_num_val1 => l_disb_amt,
12309 x_temp_num_val2 => l_disb_num,
12310 x_temp_char_val1 => fnd_date.date_to_chardate(l_tp_perct.disb_dt),
12311 x_tp_cal_type => l_tp_perct.tp_cal_type,
12312 x_tp_sequence_number => l_tp_perct.tp_sequence_number,
12313 x_ld_cal_type => l_tp_perct.ld_cal_type,
12314 x_ld_sequence_number => l_tp_perct.ld_sequence_number,
12315 x_mode => 'R',
12316 x_adplans_id => l_adplans_id,
12317 x_app_trans_num_txt => NULL,
12318 x_award_id => l_award_id,
12319 x_lock_award_flag => NULL,
12320 x_temp_val3_num => NULL,
12321 x_temp_val4_num => NULL,
12322 x_temp_char2_txt => NULL,
12323 x_temp_char3_txt => NULL
12324 );
12325
12326 l_cnt := l_cnt + 1;
12327 l_disb_dt.extend(1);
12328 l_disb_dt(l_cnt).process_id := l_process_id;
12329 l_disb_dt(l_cnt).sl_no := l_sl_number;
12330 l_disb_dt(l_cnt).min_credit_pts := l_tp_perct.min_credit_points;
12331 l_disb_dt(l_cnt).nslds_disb_date := NULL;
12332 l_disb_dt(l_cnt).disb_verf_dt := NULL;
12333 l_disb_dt(l_cnt).disb_exp_dt := NULL;
12334 l_disb_dt(l_cnt).attendance_type_code := l_tp_perct.attendance_type_code;
12335 l_disb_dt(l_cnt).base_attendance_type_code := NULL;
12336
12337 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12338 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'-------Disb Date PL-SQL Table values ---------');
12339 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_disb_dt('||l_cnt||').process_id ' ||l_disb_dt(l_cnt).process_id);
12340 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_disb_dt('||l_cnt||').sl_no ' || l_disb_dt(l_cnt).sl_no);
12341 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_disb_dt('||l_cnt||').min_credit_pts ' || l_disb_dt(l_cnt).min_credit_pts);
12342 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_disb_dt('||l_cnt||').attendance_type_code ' || l_disb_dt(l_cnt).attendance_type_code);
12343 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_disb_dt('||l_cnt||').base_attendance_type ' || l_disb_dt(l_cnt).base_attendance_type_code);
12344 END IF;
12345
12346 -- Get the Offset data alias instances of the Fund.
12347 l_disb_dt(l_cnt).nslds_disb_date := igf_ap_gen_001.get_date_alias_val(
12348 l_base_id,
12349 l_tp_perct.ld_cal_type,
12350 l_tp_perct.ld_sequence_number,
12351 l_nslds_da
12352 );
12353 l_disb_dt(l_cnt).disb_exp_dt := igf_ap_gen_001.get_date_alias_val(
12354 l_base_id,
12355 l_tp_perct.ld_cal_type,
12356 l_tp_perct.ld_sequence_number,
12357 l_exp_da
12358 );
12359 l_disb_dt(l_cnt).disb_verf_dt := igf_ap_gen_001.get_date_alias_val(
12360 l_base_id,
12361 l_tp_perct.ld_cal_type,
12362 l_tp_perct.ld_sequence_number,
12363 l_verf_da
12364 );
12365
12366 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12367 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'disb date offset l_disb_dt('||l_cnt||').nslds_disb_date:'||l_disb_dt(l_cnt).nslds_disb_date);
12368 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'disb date offset l_disb_dt('||l_cnt||').disb_exp_dt:'||l_disb_dt(l_cnt).disb_exp_dt);
12369 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'disb date offset l_disb_dt('||l_cnt||').disb_verf_dt:'||l_disb_dt(l_cnt).disb_verf_dt);
12370 END IF;
12371
12372 IF lv_method_code = 'M' THEN
12373
12374 IF lb_use_wcoa_cur = FALSE THEN
12375 FETCH c_tp_perct INTO l_tp_perct;
12376 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12377 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'fetched c_tp_perct');
12378 END IF;
12379 EXIT WHEN c_tp_perct%NOTFOUND;
12380
12381 ELSE
12382 FETCH c_auto_disb_wcoa INTO l_tp_perct;
12383 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12384 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'fetched c_auto_disb_wcoa');
12385 END IF;
12386 EXIT WHEN c_auto_disb_wcoa%NOTFOUND;
12387 END IF;
12388
12389 ELSIF lv_method_code = 'E' THEN
12390
12391 IF lb_use_wcoa_cur = FALSE THEN
12392 FETCH c_auto_disb_equal INTO l_tp_perct;
12393 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12394 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'fetched c_auto_disb_equal');
12395 END IF;
12396 EXIT WHEN c_auto_disb_equal%NOTFOUND;
12397
12398 ELSE
12399 FETCH c_auto_disb_equal_wcoa INTO l_tp_perct;
12400 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12401 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'fetched c_auto_disb_equal_wcoa');
12402 END IF;
12403 EXIT WHEN c_auto_disb_equal_wcoa%NOTFOUND;
12404
12405 END IF;
12406
12407 ELSIF lv_method_code = 'C' THEN
12408 FETCH c_auto_disb_coa_match INTO l_tp_perct;
12409 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12410 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'fetched c_auto_disb_coa_match');
12411 END IF;
12412 EXIT WHEN c_auto_disb_coa_match%NOTFOUND;
12413 END IF;
12414
12415 END LOOP; -- ending teach percentage loop
12416
12417 IF lv_method_code = 'M' THEN
12418 IF lb_use_wcoa_cur = FALSE THEN
12419 CLOSE c_tp_perct;
12420 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12421 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'closed c_tp_perct');
12422 END IF;
12423 ELSE
12424 CLOSE c_auto_disb_wcoa;
12425 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12426 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'closed c_auto_disb_wcoa');
12427 END IF;
12428 END IF;
12429 ELSIF lv_method_code = 'E' THEN
12430 IF lb_use_wcoa_cur = FALSE THEN
12431 CLOSE c_auto_disb_equal;
12432 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12433 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'closed c_auto_disb_equal');
12434 END IF;
12435 ELSE
12436 CLOSE c_auto_disb_equal_wcoa;
12437 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12438 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'closed c_auto_disb_wcoa');
12439 END IF;
12440 END IF;
12441 ELSIF lv_method_code = 'C' THEN
12442 CLOSE c_auto_disb_coa_match;
12443 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12444 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'closed c_auto_disb_coa_match');
12445 END IF;
12446 END IF;
12447
12448 ELSE -- fed_fund_code is PELL
12449
12450 --from here, the logic for phase-in participant and full participant schools differ
12451 IF NOT g_phasein_participant OR l_award_id IS NULL THEN
12452 l_sl_number := NULL;
12453 IF g_pell_tab IS NOT NULL THEN
12454 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12455 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'full participant logic');
12456 END IF;
12457 FOR i IN 1..g_pell_tab.COUNT LOOP
12458 igf_aw_award_t_pkg.insert_row(
12459 x_rowid => lv_rowid,
12460 x_process_id => l_process_id,
12461 x_sl_number => l_sl_number,
12462 x_fund_id => l_fund_id,
12463 x_base_id => l_base_id,
12464 x_offered_amt => g_pell_tab(i).offered_amt,
12465 x_accepted_amt => g_pell_tab(i).accepted_amt,
12466 x_paid_amt => 0,
12467 x_need_reduction_amt => g_pell_tab(i).offered_amt * 100 / l_offered_amt,
12468 x_flag => 'DB',
12469 x_temp_num_val1 => g_pell_tab(i).offered_amt,
12470 x_temp_num_val2 => i,
12471 x_temp_char_val1 => fnd_date.date_to_chardate(g_pell_tab(i).disb_dt),
12472 x_tp_cal_type => g_pell_tab(i).tp_cal_type,
12473 x_tp_sequence_number => g_pell_tab(i).tp_sequence_number,
12474 x_ld_cal_type => g_pell_tab(i).ld_cal_type,
12475 x_ld_sequence_number => g_pell_tab(i).ld_sequence_number,
12476 x_mode => 'R',
12477 x_adplans_id => g_pell_tab(i).adplans_id,
12478 x_app_trans_num_txt => g_pell_tab(i).app_trans_num_txt,
12479 x_award_id => l_award_id,
12480 x_lock_award_flag => NULL,
12481 x_temp_val3_num => NULL,
12482 x_temp_val4_num => NULL,
12483 x_temp_char2_txt => NULL,
12484 x_temp_char3_txt => NULL
12485 );
12486
12487 l_cnt := l_cnt + 1;
12488 l_disb_dt.extend(1);
12489 l_disb_dt(l_cnt).process_id := l_process_id;
12490 l_disb_dt(l_cnt).sl_no := l_sl_number;
12491 l_disb_dt(l_cnt).min_credit_pts := g_pell_tab(i).min_credit_pts;
12492 l_disb_dt(l_cnt).nslds_disb_date := NULL;
12493 l_disb_dt(l_cnt).disb_verf_dt := g_pell_tab(i).verf_enfr_dt;
12494 l_disb_dt(l_cnt).disb_exp_dt := g_pell_tab(i).disb_exp_dt;
12495 l_disb_dt(l_cnt).attendance_type_code := g_pell_tab(i).attendance_type_code;
12496 l_disb_dt(l_cnt).base_attendance_type_code := g_pell_tab(i).base_attendance_type_code;
12497
12498 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12499 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'------pell disb:'||i||'------');
12500 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'x_need_reduction_amt:'||g_pell_tab(i).offered_amt * 100 / l_offered_amt);
12501 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'g_pell_tab(i).offered_amt:'||g_pell_tab(i).offered_amt);
12502 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'g_pell_tab(i).accepted_amt:'||g_pell_tab(i).accepted_amt);
12503 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'g_pell_tab(i).disb_dt:'||g_pell_tab(i).disb_dt);
12504 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'g_pell_tab(i).tp_cal_type:'||g_pell_tab(i).tp_cal_type);
12505 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'g_pell_tab(i).tp_sequence_number:'||g_pell_tab(i).tp_sequence_number);
12506 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'g_pell_tab(i).ld_cal_type:'||g_pell_tab(i).ld_cal_type);
12507 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'g_pell_tab(i).ld_sequence_number:'||g_pell_tab(i).ld_sequence_number);
12508 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'g_pell_tab(i).app_trans_num_txt:'||g_pell_tab(i).app_trans_num_txt);
12509 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'g_pell_tab(i).adplans_id:'||g_pell_tab(i).adplans_id);
12510 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'g_pell_tab(i).min_credit_pts:'||g_pell_tab(i).min_credit_pts);
12511 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'g_pell_tab(i).verf_enfr_dt:'||g_pell_tab(i).verf_enfr_dt);
12512 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'g_pell_tab(i).disb_exp_dt:'||g_pell_tab(i).disb_exp_dt);
12513 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'g_pell_tab(i).attendance_type_code:'||g_pell_tab(i).attendance_type_code);
12514 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'g_pell_tab(i).base_attendance_type_code:'||g_pell_tab(i).base_attendance_type_code);
12515 END IF;
12516
12517 END LOOP; -- End g_pell_tab loop
12518 END IF;
12519 ELSE
12520 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12521 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'phase-in participant logic with Award Id : '||l_award_id);
12522 END IF;
12523 l_pell_dp := NULL;
12524 OPEN c_pell_dp(l_award_id);
12525 FETCH c_pell_dp INTO l_pell_dp;
12526 CLOSE c_pell_dp;
12527 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12528 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pell_dp:'||l_pell_dp);
12529 END IF;
12530
12531 FOR l_pelldisb IN c_pelldisb(l_award_id) LOOP
12532
12533 lv_rowid := NULL;
12534 l_sl_number := NULL;
12535
12536 OPEN c_base_attendance(l_base_id,l_award_id,l_pelldisb.ld_cal_type,l_pelldisb.ld_sequence_number);
12537 FETCH c_base_attendance INTO l_base_attendance;
12538 CLOSE c_base_attendance;
12539
12540 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12541 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'^^^inserting into igf_aw_award_t for PELL(old)^^^');
12542 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_fund_id:'||l_fund_id);
12543 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_base_id:'||l_base_id);
12544 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pelldisb.disb_gross_amt:'||l_pelldisb.disb_gross_amt);
12545 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pelldisb.disb_accepted_amt:'||l_pelldisb.disb_accepted_amt);
12546 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pelldisb.disb_gross_amt:'||l_pelldisb.disb_gross_amt);
12547 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pelldisb.disb_date:'||l_pelldisb.disb_date);
12548 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pelldisb.tp_cal_type:'||l_pelldisb.tp_cal_type);
12549 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pelldisb.tp_sequence_number:'||l_pelldisb.tp_sequence_number);
12550 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pelldisb.ld_cal_type:'||l_pelldisb.ld_cal_type);
12551 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pelldisb.ld_sequence_number:'||l_pelldisb.ld_sequence_number);
12552 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pelldisb.award_id:'||l_pelldisb.award_id);
12553 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'^^^done inserting into igf_aw_award_t^^^');
12554 END IF;
12555 igf_aw_award_t_pkg.insert_row(
12556 x_rowid => lv_rowid,
12557 x_process_id => l_process_id,
12558 x_sl_number => l_sl_number,
12559 x_fund_id => l_fund_id,
12560 x_base_id => l_base_id,
12561 x_offered_amt => l_pelldisb.disb_gross_amt,
12562 x_accepted_amt => l_pelldisb.disb_accepted_amt,
12563 x_paid_amt => 0,
12564 x_need_reduction_amt => 100,
12565 x_flag => 'DB',
12566 x_temp_num_val1 => l_pelldisb.disb_gross_amt,
12567 x_temp_num_val2 => NULL,
12568 x_temp_char_val1 => l_pelldisb.disb_date,
12569 x_tp_cal_type => l_pelldisb.tp_cal_type,
12570 x_tp_sequence_number => l_pelldisb.tp_sequence_number,
12571 x_ld_cal_type => l_pelldisb.ld_cal_type,
12572 x_ld_sequence_number => l_pelldisb.ld_sequence_number,
12573 x_mode => 'R',
12574 x_adplans_id => l_pell_dp,
12575 x_app_trans_num_txt => NULL,
12576 x_award_id => l_pelldisb.award_id,
12577 x_lock_award_flag => NULL,
12578 x_temp_val3_num => NULL,
12579 x_temp_val4_num => NULL,
12580 x_temp_char2_txt => NVL(l_base_attendance.base_attendance_type_code,l_pelldisb.base_attendance_type_code),
12581 x_temp_char3_txt => NULL
12582 );
12583 l_cnt := l_cnt + 1;
12584 l_disb_dt.extend(1);
12585 l_disb_dt(l_cnt).process_id := l_process_id;
12586 l_disb_dt(l_cnt).sl_no := l_sl_number;
12587 l_disb_dt(l_cnt).min_credit_pts := l_pelldisb.min_credit_pts;
12588 l_disb_dt(l_cnt).base_attendance_type_code := NVL(l_base_attendance.base_attendance_type_code,l_pelldisb.base_attendance_type_code);
12589 END LOOP;
12590
12591 FOR l_pell_new_disb IN c_pell_new_disb(l_award_id,l_base_id) LOOP
12592 lv_rowid := NULL;
12593 l_sl_number := NULL;
12594 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12595 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'^^^inserting into igf_aw_award_t for PELL(new)^^^');
12596 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pell_new_disb.offered_amt:'||l_pell_new_disb.offered_amt);
12597 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pell_new_disb.accepted_amt:'||l_pell_new_disb.accepted_amt);
12598 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pell_new_disb.offered_amt:'||l_pell_new_disb.offered_amt);
12599 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pell_new_disb.temp_num_val2:'||l_pell_new_disb.temp_num_val2);
12600 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pell_new_disb.temp_char_val1:'||l_pell_new_disb.temp_char_val1);
12601 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pell_new_disb.tp_cal_type:'||l_pell_new_disb.tp_cal_type);
12602 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pell_new_disb.tp_sequence_number:'||l_pell_new_disb.tp_sequence_number);
12603 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pell_new_disb.ld_cal_type:'||l_pell_new_disb.ld_cal_type);
12604 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pell_new_disb.ld_sequence_number:'||l_pell_new_disb.ld_sequence_number);
12605 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pell_new_disb.adplans_id:'||l_pell_new_disb.adplans_id);
12606 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'l_pell_new_disb.award_id:'||l_pell_new_disb.award_id);
12607 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.get_disbursements.debug '|| g_req_id,'^^^done inserting into igf_aw_award_t^^^');
12608 END IF;
12609 igf_aw_award_t_pkg.insert_row(
12610 x_rowid => lv_rowid,
12611 x_process_id => l_process_id,
12612 x_sl_number => l_sl_number,
12613 x_fund_id => l_fund_id,
12614 x_base_id => l_base_id,
12615 x_offered_amt => l_pell_new_disb.offered_amt,
12616 x_accepted_amt => l_pell_new_disb.accepted_amt,
12617 x_paid_amt => 0,
12618 x_need_reduction_amt => 100,
12619 x_flag => 'DB',
12620 x_temp_num_val1 => l_pell_new_disb.offered_amt,
12621 x_temp_num_val2 => l_pell_new_disb.temp_num_val2,
12622 x_temp_char_val1 => l_pell_new_disb.temp_char_val1,
12623 x_tp_cal_type => l_pell_new_disb.tp_cal_type,
12624 x_tp_sequence_number => l_pell_new_disb.tp_sequence_number,
12625 x_ld_cal_type => l_pell_new_disb.ld_cal_type,
12626 x_ld_sequence_number => l_pell_new_disb.ld_sequence_number,
12627 x_mode => 'R',
12628 x_adplans_id => l_pell_new_disb.adplans_id,
12629 x_app_trans_num_txt => NULL,
12630 x_award_id => l_pell_new_disb.award_id,
12631 x_lock_award_flag => NULL,
12632 x_temp_val3_num => NULL,
12633 x_temp_val4_num => NULL,
12634 x_temp_char2_txt => l_pell_new_disb.temp_char2_txt,
12635 x_temp_char3_txt => NULL
12636 );
12637 l_cnt := l_cnt + 1;
12638 l_disb_dt.extend(1);
12639 l_disb_dt(l_cnt).process_id := l_process_id;
12640 l_disb_dt(l_cnt).sl_no := l_sl_number;
12641 l_disb_dt(l_cnt).base_attendance_type_code := l_pell_new_disb.temp_char2_txt;
12642 END LOOP;
12643 END IF;
12644 END IF; -- end fed_fund_code <> PELL Check
12645
12646 EXCEPTION
12647 WHEN OTHERS THEN
12648 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
12649 fnd_message.set_token('NAME','IGF_AW_PACKAGING.GET_DISBURSEMENTS '||SQLERRM);
12650 igs_ge_msg_stack.add;
12651 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
12652 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.get_disbursements.exception '|| g_req_id,'sql error message: '||SQLERRM);
12653 END IF;
12654 app_exception.raise_exception;
12655 END get_disbursements;
12656
12657 PROCEDURE add_todo(
12658 p_fund_id IN igf_aw_fund_mast_all.fund_id%TYPE,
12659 p_base_id IN igf_ap_fa_base_rec_all.base_id%TYPE
12660 ) IS
12661 /*
12662 || Created By : skoppula
12663 || Created On : 02-JAN-2002
12664 || Purpose :
12665 || Known limitations, enhancements or remarks :
12666 || Change History :
12667 || Who WHEN What
12668 || gmuralid 10-030-2003 BUG 2829487 .In proc add_todo,
12669 || inactive_flag parameter was being passed as NULL in insert_row.changed that to 'N'.
12670 || (reverse chronological order - newest change first)
12671 */
12672
12673 -- Get all the To Do Items which needs to be assigned to the student
12674 -- Fetch all To Do Items defined at the fund level and remove all To Do which are already assigned to the student
12675 CURSOR c_fnd_todo(
12676 cp_person_id igf_ap_fa_base_rec_all.person_id%TYPE,
12677 cp_fund_id igf_aw_fund_mast_all.fund_id%TYPE
12678 ) IS
12679 SELECT tdmst.todo_number,
12680 tdmst.required_for_application,
12681 tdmst.max_attempt,
12682 tdmst.freq_attempt,
12683 tdmst.system_todo_type_code,
12684 td.row_id,
12685 td.base_id,
12686 td.item_sequence_number,
12687 td.status,
12688 td.status_date,
12689 td.add_date,
12690 td.corsp_date,
12691 td.corsp_count,
12692 td.inactive_flag,
12693 td.freq_attempt td_freq_attempt,
12694 td.max_attempt td_max_attempt,
12695 td.required_for_application td_required_for_application,
12696 td.legacy_record_flag,
12697 td.clprl_id
12698 FROM igf_aw_fund_td_map fndtd,
12699 igf_ap_td_item_mst tdmst,
12700 igf_ap_td_item_inst_v td
12701 WHERE fndtd.fund_id = cp_fund_id
12702 AND tdmst.todo_number = td.item_sequence_number(+)
12703 AND tdmst.todo_number = fndtd.item_sequence_number
12704 AND td.person_id(+) = cp_person_id;
12705
12706 l_fd_td_rec c_fnd_todo%ROWTYPE;
12707 lv_rowid VARCHAR2(30);
12708
12709 CURSOR c_person_id(
12710 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE
12711 ) IS
12712 SELECT person_id
12713 FROM igf_ap_fa_base_rec_all
12714 WHERE base_id = cp_base_id;
12715 l_person_id igf_ap_fa_base_rec_all.person_id%TYPE;
12716
12717 CURSOR c_active_lender(
12718 cp_person_id igf_ap_fa_base_rec_all.person_id%TYPE
12719 ) IS
12720 SELECT relationship_cd
12721 FROM igf_sl_cl_pref_lenders
12722 WHERE person_id = cp_person_id
12723 AND TRUNC(SYSDATE) BETWEEN TRUNC(start_date) AND TRUNC(NVL(end_date,SYSDATE));
12724 l_active_lender igf_sl_cl_pref_lenders.relationship_cd%TYPE;
12725
12726 BEGIN
12727
12728 -- Assign all the To Dos which are present at the Fund level and not present for the student.
12729
12730 l_person_id := NULL;
12731 OPEN c_person_id(p_base_id);
12732 FETCH c_person_id INTO l_person_id;
12733 CLOSE c_person_id;
12734
12735 FOR c_fnd_todo_rec IN c_fnd_todo(l_person_id, p_fund_id) LOOP
12736 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12737 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.add_todo.debug '|| g_req_id,'c_fnd_todo_rec.todo_number:'||c_fnd_todo_rec.todo_number);
12738 END IF;
12739 IF c_fnd_todo_rec.row_id IS NULL THEN
12740 igf_ap_td_item_inst_pkg.insert_row(
12741 x_rowid => lv_rowid,
12742 x_base_id => p_base_id,
12743 x_item_sequence_number => c_fnd_todo_rec.todo_number,
12744 x_status => 'REQ',
12745 x_status_date => TRUNC(SYSDATE),
12746 x_add_date => TRUNC(SYSDATE),
12747 x_corsp_date => NULL,
12748 x_corsp_count => NULL,
12749 x_inactive_flag => 'N',
12750 x_required_for_application => c_fnd_todo_rec.required_for_application,
12751 x_max_attempt => c_fnd_todo_rec.max_attempt,
12752 x_freq_attempt => c_fnd_todo_rec.freq_attempt,
12753 x_mode => 'R',
12754 x_legacy_record_flag => NULL,
12755 x_clprl_id => NULL
12756 );
12757 ELSIF c_fnd_todo_rec.row_id IS NOT NULL AND c_fnd_todo_rec.system_todo_type_code = 'PREFLEND' AND c_fnd_todo_rec.inactive_flag='Y' THEN
12758 --reactivate the preferred lender item after checking if the student has an active preferred lender
12759 l_active_lender := NULL;
12760 OPEN c_active_lender(l_person_id);
12761 FETCH c_active_lender INTO l_active_lender;
12762 CLOSE c_active_lender;
12763
12764 IF l_active_lender IS NULL THEN
12765 igf_ap_td_item_inst_pkg.update_row(
12766 x_rowid => c_fnd_todo_rec.row_id,
12767 x_base_id => c_fnd_todo_rec.base_id,
12768 x_item_sequence_number => c_fnd_todo_rec.todo_number,
12769 x_status => c_fnd_todo_rec.status,
12770 x_status_date => c_fnd_todo_rec.status_date,
12771 x_add_date => c_fnd_todo_rec.add_date,
12772 x_corsp_date => c_fnd_todo_rec.corsp_date,
12773 x_corsp_count => c_fnd_todo_rec.corsp_count,
12774 x_inactive_flag => 'N',
12775 x_required_for_application => c_fnd_todo_rec.td_required_for_application,
12776 x_max_attempt => c_fnd_todo_rec.td_max_attempt,
12777 x_freq_attempt => c_fnd_todo_rec.td_freq_attempt,
12778 x_mode => 'R',
12779 x_legacy_record_flag => c_fnd_todo_rec.legacy_record_flag,
12780 x_clprl_id => c_fnd_todo_rec.clprl_id
12781 );
12782
12783 END IF;
12784 END IF;
12785 END LOOP;
12786
12787 EXCEPTION
12788 WHEN OTHERS THEN
12789 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
12790 fnd_message.set_token('NAME','IGF_AW_PACKAGING.ADD_TODO '||SQLERRM);
12791 igs_ge_msg_stack.add;
12792 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
12793 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.add_todo.exception '|| g_req_id,'sql error message: '||SQLERRM);
12794 END IF;
12795 app_exception.raise_exception;
12796
12797 END add_todo;
12798
12799
12800 FUNCTION get_date_instance(
12801 p_base_id IN igf_ap_fa_base_rec_all.base_id%TYPE,
12802 p_dt_alias IN igs_ca_da.dt_alias%TYPE,
12803 p_cal_type IN igs_ca_inst.cal_type%TYPE,
12804 p_cal_sequence IN igs_ca_inst.sequence_number%TYPE
12805 ) RETURN DATE IS
12806 /*
12807 || Created By : skoppula
12808 || Created On : 02-JAN-2002
12809 || Purpose :
12810 || Known limitations, enhancements or remarks :
12811 || Change History :
12812 || Who WHEN What
12813 || (reverse chronological order - newest change first)
12814 || veramach 30-Oct-2004 FA 152 Modified code to call igf_ap_gen_001.get_date_alias_val
12815 */
12816
12817 BEGIN
12818
12819 RETURN igf_ap_gen_001.get_date_alias_val(
12820 p_base_id => p_base_id,
12821 p_cal_type => p_cal_type,
12822 p_sequence_number => p_cal_sequence,
12823 p_date_alias => p_dt_alias
12824 );
12825 EXCEPTION
12826 WHEN OTHERS THEN
12827 RETURN NULL;
12828 END get_date_instance;
12829
12830
12831 PROCEDURE process_single_fund(
12832 p_grp_code IN VARCHAR2,
12833 p_ci_cal_type IN VARCHAR2,
12834 p_ci_sequence_number IN NUMBER,
12835 p_base_id IN NUMBER,
12836 p_persid_grp IN NUMBER
12837 ) IS
12838 /*
12839 || Created By : skoppula
12840 || Created On : 02-JAN-2002
12841 || Purpose :
12842 || Known limitations, enhancements or remarks :
12843 || Change History :
12844 || Who WHEN What
12845 || (reverse chronological order - newest change first)
12846 || ridas 08-Feb-2006 Bug #5021084. Added new parameter 'lv_group_type' in call to igf_ap_ss_pkg.get_pid
12847 */
12848
12849 -- Fetch the student for a given Base_id or fetch all students for a given group code
12850 CURSOR cur_sf_std IS
12851 SELECT fabase.*
12852 FROM igf_ap_fa_base_rec fabase
12853 WHERE fabase.ci_cal_type = p_ci_cal_type
12854 AND fabase.ci_Sequence_number = p_ci_sequence_number
12855 AND fabase.base_id = NVL(p_base_id, fabase.base_id);
12856 l_sf_std_rec cur_sf_std%ROWTYPE;
12857
12858 -- Fetch all the students for a given Person ID Group
12859 -- Variables for the dynamic person id group
12860 lv_status VARCHAR2(1) ;
12861 lv_sql_stmt VARCHAR(32767) ;
12862
12863 TYPE cur_sf_persidCurTyp IS REF CURSOR ;
12864 cur_sf_persid cur_sf_persidCurTyp ;
12865 TYPE l_persid_std_recTyp IS RECORD ( base_id igf_ap_fa_base_rec.base_id%TYPE, coa_f igf_ap_fa_base_rec.coa_f%TYPE );
12866 l_persid_std_rec l_persid_std_recTyp ;
12867
12868
12869 -- Get the details of students from the Temp Table in the descending order of their needs
12870 CURSOR c_ordered_stdnts IS
12871 SELECT base_id
12872 FROM igf_aw_award_t
12873 WHERE flag = 'ST'
12874 AND process_id = l_process_id
12875 ORDER BY temp_num_val2 DESC;
12876
12877 ln_person_count NUMBER;
12878 lv_group_type igs_pe_persid_group_v.group_type%TYPE;
12879
12880 BEGIN
12881 lv_status := 'S'; -- Defaulted to 'S' and the function will return 'F' in case of failure
12882 --Bug #5021084
12883 lv_sql_stmt := igf_ap_ss_pkg.get_pid(p_persid_grp,lv_status,lv_group_type);
12884
12885 get_process_id;
12886
12887 -- Process for a single student as the Person ID Group is not Present
12888 IF p_persid_grp IS NULL THEN
12889 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12890 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_single_fund.debug '|| g_req_id,'person id group not specified');
12891 END IF;
12892 OPEN cur_sf_std;
12893 LOOP
12894 FETCH cur_sf_std INTO l_sf_std_rec;
12895 EXIT WHEN cur_sf_std%NOTFOUND;
12896
12897 g_over_awd := NULL;
12898
12899 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12900 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_single_fund.debug '|| g_req_id,'calling stud_run with base_id:'||l_sf_std_rec.base_id);
12901 END IF;
12902 stud_run(
12903 l_sf_std_rec.base_id, -- l_base_id
12904 'N', -- l_post
12905 'D' -- l_run_mode
12906 );
12907 COMMIT;
12908 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12909 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_single_fund.debug '|| g_req_id,'----------------stud_run returned-------------------');
12910 END IF;
12911 END LOOP;
12912 CLOSE cur_sf_std;
12913
12914 -- Process for all the student who belongs to the Given Person ID Group
12915 ELSE
12916
12917 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12918 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_single_fund.debug '|| g_req_id,'person id group specified');
12919 END IF;
12920 ln_person_count := 0;
12921
12922 --Bug #5021084. Passing Group ID if the group type is STATIC.
12923 IF lv_group_type = 'STATIC' THEN
12924 OPEN cur_sf_persid FOR 'SELECT fabase.base_id, igf_aw_coa_gen.coa_amount(fabase.base_id,:g_aprd) coa_f
12925 FROM igf_ap_fa_base_rec fabase
12926 WHERE fabase.ci_cal_type = :p_ci_cal_type
12927 AND fabase.ci_sequence_number = :p_ci_sequence_number
12928 AND fabase.person_id IN ( '||lv_sql_stmt||' ) ' USING g_awd_prd,g_ci_cal_type,g_ci_sequence,p_persid_grp;
12929 ELSIF lv_group_type = 'DYNAMIC' THEN
12930 OPEN cur_sf_persid FOR 'SELECT fabase.base_id, igf_aw_coa_gen.coa_amount(fabase.base_id,:g_aprd) coa_f
12931 FROM igf_ap_fa_base_rec fabase
12932 WHERE fabase.ci_cal_type = :p_ci_cal_type
12933 AND fabase.ci_sequence_number = :p_ci_sequence_number
12934 AND fabase.person_id IN ( '||lv_sql_stmt||' ) ' USING g_awd_prd,g_ci_cal_type,g_ci_sequence;
12935 END IF;
12936
12937 LOOP
12938 FETCH cur_sf_persid INTO l_persid_std_rec;
12939 EXIT WHEN cur_sf_persid%NOTFOUND;
12940
12941 ln_person_count := ln_person_count + 1;
12942 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12943 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_single_fund.debug '|| g_req_id,'calling calc_students_need with base_id:'||l_persid_std_rec.base_id);
12944 END IF;
12945 calc_students_needs(
12946 l_persid_std_rec.base_id,
12947 l_persid_std_rec.coa_f
12948 );
12949
12950
12951 END LOOP;
12952 CLOSE cur_sf_persid;
12953
12954 -- If There are no students in the person_id group then log message and exit
12955 IF ln_person_count = 0 THEN
12956 fnd_message.set_name('IGF','IGF_DB_NO_PER_GRP');
12957 fnd_file.put_line(fnd_file.log,fnd_message.get);
12958 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12959 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_single_fund.debug '|| g_req_id,'no persons in person id group');
12960 END IF;
12961 END IF;
12962
12963 -- Fetch the students as per the decreasing order of their need.
12964 FOR c_ordered_stdnts_rec IN c_ordered_stdnts LOOP
12965
12966 -- Process for the student in the decending order of their needs
12967 g_over_awd := NULL;
12968
12969 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
12970 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.process_single_fund.debug '|| g_req_id,'calling stud_run with base_id:'||c_ordered_stdnts_rec.base_id);
12971 END IF;
12972
12973 stud_run(
12974 c_ordered_stdnts_rec.base_id,
12975 'N',
12976 'D'
12977 );
12978
12979 COMMIT;
12980
12981 END LOOP;
12982
12983 END IF;
12984
12985 EXCEPTION
12986 WHEN OTHERS THEN
12987 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
12988 fnd_message.set_token('NAME','IGF_AW_PACKAGING.PROCESS_SINGLE_FUND '||SQLERRM);
12989 igs_ge_msg_stack.add;
12990 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
12991 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.process_single_fund.exception '|| g_req_id,'sql error message: '||SQLERRM);
12992 END IF;
12993 app_exception.raise_exception;
12994 END process_single_fund;
12995
12996 PROCEDURE log_parameters(
12997 p_award_year VARCHAR2 DEFAULT NULL,
12998 p_awd_prd_code VARCHAR2 DEFAULT NULL,
12999 p_fund_id NUMBER DEFAULT NULL,
13000 p_dist_id NUMBER DEFAULT NULL,
13001 p_base_id NUMBER DEFAULT NULL,
13002 p_persid_grp NUMBER DEFAULT NULL,
13003 p_sf_min_amount NUMBER DEFAULT NULL,
13004 p_sf_max_amount NUMBER DEFAULT NULL,
13005 p_allow_to_exceed VARCHAR2 DEFAULT NULL,
13006 p_upd_awd_notif_status VARCHAR2 DEFAULT NULL,
13007 p_lock_award VARCHAR2 DEFAULT NULL,
13008 p_grp_code VARCHAR2 DEFAULT NULL,
13009 p_sim_mode VARCHAR2 DEFAULT NULL,
13010 p_run_mode VARCHAR2 DEFAULT NULL,
13011 p_publish_in_ss_flag VARCHAR2 DEFAULT NULL
13012 ) AS
13013 ------------------------------------------------------------------
13014 --Created by : veramach, Oracle India
13015 --Date created:
13016 --
13017 --Purpose:
13018 --
13019 --
13020 --Known limitations/enhancements and/or remarks:
13021 --
13022 --Change History:
13023 --Who When What
13024 -------------------------------------------------------------------
13025 l_param_pass_log igf_lookups_view.meaning%TYPE ;
13026 l_awd_yr_log igf_lookups_view.meaning%TYPE ;
13027 l_pers_number_log igf_lookups_view.meaning%TYPE ;
13028 l_pers_id_grp_log igf_lookups_view.meaning%TYPE ;
13029 l_ap_log igf_lookups_view.meaning%TYPE ;
13030 l_fund_log igf_lookups_view.meaning%TYPE ;
13031 l_dp_log igf_lookups_view.meaning%TYPE ;
13032 l_sf_min_log igf_lookups_view.meaning%TYPE ;
13033 l_sf_max_log igf_lookups_view.meaning%TYPE ;
13034 l_allow_log igf_lookups_view.meaning%TYPE ;
13035 l_notif_log igf_lookups_view.meaning%TYPE ;
13036 l_lock_log igf_lookups_view.meaning%TYPE ;
13037 l_agrp_log igf_lookups_view.meaning%TYPE ;
13038 l_sim_log igf_lookups_view.meaning%TYPE ;
13039 l_runm_log igf_lookups_view.meaning%TYPE ;
13040 l_publish_log igf_lookups_view.meaning%TYPE ;
13041
13042 -- Get alternate code
13043 CURSOR c_alternate_code(
13044 cp_award_year VARCHAR2
13045 ) IS
13046 SELECT alternate_code
13047 FROM igs_ca_inst_all
13048 WHERE cal_type = TRIM(SUBSTR(cp_award_year,1,10))
13049 AND sequence_number = TO_NUMBER(SUBSTR(p_award_year,11));
13050
13051 l_alternate_code igs_ca_inst_all.alternate_code%TYPE;
13052
13053 -- Get get group description for group_id
13054 CURSOR c_person_group(
13055 cp_persid_grp igs_pe_persid_group_all.group_id%TYPE
13056 ) IS
13057 SELECT group_cd group_name
13058 FROM igs_pe_persid_group_all
13059 WHERE group_id = cp_persid_grp;
13060
13061 l_persid_grp_name c_person_group%ROWTYPE;
13062
13063 -- Get AP descripton
13064 CURSOR c_ap(
13065 cp_awd_prd_code igf_aw_award_prd.award_prd_cd%TYPE,
13066 cp_award_year VARCHAR2
13067 ) IS
13068 SELECT award_prd_desc
13069 FROM igf_aw_award_prd
13070 WHERE award_prd_cd = cp_awd_prd_code
13071 AND ci_cal_type = TRIM(SUBSTR(cp_award_year,1,10))
13072 AND ci_sequence_number = TO_NUMBER(SUBSTR(p_award_year,11));
13073 l_ap igf_aw_award_prd.award_prd_desc%TYPE;
13074
13075 -- Get fund code
13076 CURSOR c_fund(
13077 cp_fund_id igf_aw_fund_mast_all.fund_id%TYPE
13078 ) IS
13079 SELECT fund_code
13080 FROM igf_aw_fund_mast_all
13081 WHERE fund_id = cp_fund_id;
13082 l_fund igf_aw_fund_mast_all.fund_code%TYPE;
13083
13084 -- Get person number
13085 CURSOR c_person_number(
13086 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE
13087 ) IS
13088 SELECT party_number
13089 FROM hz_parties parties,
13090 igf_ap_fa_base_rec_all fabase
13091 WHERE fabase.person_id = parties.party_id
13092 AND fabase.base_id = cp_base_id;
13093 l_person_number hz_parties.party_number%TYPE;
13094
13095 -- Get DP details
13096 CURSOR c_dp(
13097 cp_adplans_id igf_aw_awd_dist_plans.adplans_id%TYPE
13098 ) IS
13099 SELECT awd_dist_plan_cd_desc
13100 FROM igf_aw_awd_dist_plans
13101 WHERE adplans_id = cp_adplans_id;
13102 l_dp igf_aw_awd_dist_plans.awd_dist_plan_cd_desc%TYPE;
13103
13104 -- Get award group
13105 CURSOR c_awd_grp(
13106 cp_grp_code igf_aw_target_grp_all.group_cd%TYPE,
13107 cp_award_year VARCHAR2
13108 ) IS
13109 SELECT description
13110 FROM igf_aw_target_grp_all
13111 WHERE group_cd = cp_grp_code
13112 AND cal_type = TRIM(SUBSTR(cp_award_year,1,10))
13113 AND sequence_number = TO_NUMBER(SUBSTR(p_award_year,11));
13114 l_awd_grp c_awd_grp%ROWTYPE;
13115
13116 BEGIN
13117
13118 l_param_pass_log := igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','PARAMETER_PASS');
13119 l_awd_yr_log := igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','AWARD_YEAR');
13120 l_pers_number_log := igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','PERSON_NUMBER');
13121 l_pers_id_grp_log := igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','PERSON_ID_GROUP');
13122 l_ap_log := igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','AWARD_PERIOD');
13123 l_fund_log := igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','FUND_CODE');
13124 l_dp_log := igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','AWD_DIST_PLAN');
13125 l_sf_min_log := igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','MIN_AMOUNT');
13126 l_sf_max_log := igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','MAX_AMOUNT');
13127 l_allow_log := igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','ALLOW_EXCEED');
13128 l_notif_log := igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','UPD_NOTIF_STAT');
13129 l_lock_log := igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','LOCK_AWD');
13130 l_agrp_log := igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','AWD_GRP');
13131 l_sim_log := igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','SIM_MODE');
13132 l_runm_log := igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','RUN_MODE');
13133 l_publish_log := igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','PUBLISH_IN_SS');
13134
13135 fnd_file.put_line(fnd_file.log,l_param_pass_log);
13136
13137 --log award year
13138 IF p_award_year IS NOT NULL THEN
13139 OPEN c_alternate_code(p_award_year);
13140 FETCH c_alternate_code INTO l_alternate_code;
13141 CLOSE c_alternate_code;
13142 fnd_file.put_line(fnd_file.log,RPAD(l_awd_yr_log,40) || ' : ' || l_alternate_code);
13143 END IF;
13144
13145 --log award period
13146 IF p_awd_prd_code IS NOT NULL THEN
13147 OPEN c_ap(p_awd_prd_code,p_award_year);
13148 FETCH c_ap INTO l_ap;
13149 CLOSE c_ap;
13150 fnd_file.put_line(fnd_file.log,RPAD(l_ap_log,40) || ' : ' || l_ap);
13151 END IF;
13152
13153 --log fund_id
13154 IF p_fund_id IS NOT NULL THEN
13155 OPEN c_fund(p_fund_id);
13156 FETCH c_fund INTO l_fund;
13157 CLOSE c_fund;
13158 fnd_file.put_line(fnd_file.log,RPAD(l_fund_log,40) || ' : ' || l_fund);
13159 END IF;
13160
13161 --log distribution plan
13162 IF p_dist_id IS NOT NULL THEN
13163 OPEN c_dp(p_dist_id);
13164 FETCH c_dp INTO l_dp;
13165 CLOSE c_dp;
13166 fnd_file.put_line(fnd_file.log,RPAD(l_dp_log,40) || ' : ' || l_dp);
13167 END IF;
13168
13169 --log person number
13170 IF p_base_id IS NOT NULL THEN
13171 OPEN c_person_number(p_base_id);
13172 FETCH c_person_number INTO l_person_number;
13173 CLOSE c_person_number;
13174 fnd_file.put_line(fnd_file.log,RPAD(l_pers_number_log,40) || ' : ' || l_person_number);
13175 END IF;
13176
13177 --log person id group
13178 IF p_persid_grp IS NOT NULL THEN
13179 OPEN c_person_group(p_persid_grp);
13180 FETCH c_person_group INTO l_persid_grp_name;
13181 CLOSE c_person_group;
13182 fnd_file.put_line(fnd_file.log,RPAD(l_pers_id_grp_log,40) || ' : ' || l_persid_grp_name.group_name);
13183 END IF;
13184
13185 --log minimum amount
13186 IF p_sf_min_amount IS NOT NULL THEN
13187 fnd_file.put_line(fnd_file.log,RPAD(l_sf_min_log,40) || ' : ' || p_sf_min_amount);
13188 END IF;
13189
13190 --log maximum amount
13191 IF p_sf_max_amount IS NOT NULL THEN
13192 fnd_file.put_line(fnd_file.log,RPAD(l_sf_max_log,40) || ' : ' || p_sf_max_amount);
13193 END IF;
13194
13195 --log allow to exceed
13196 IF p_allow_to_exceed IS NOT NULL THEN
13197 fnd_file.put_line(fnd_file.log,RPAD(l_allow_log,40) || ' : ' || igf_aw_gen.lookup_desc('IGF_AW_SF_ALLOW_EXCEED',p_allow_to_exceed));
13198 END IF;
13199
13200 --log update award notification status
13201 IF p_upd_awd_notif_status IS NOT NULL THEN
13202 fnd_file.put_line(fnd_file.log,RPAD(l_notif_log,40) || ' : ' || igf_aw_gen.lookup_desc('IGF_AP_YES_NO',p_upd_awd_notif_status));
13203 END IF;
13204
13205 --log lock award setting
13206 IF p_lock_award IS NOT NULL THEN
13207 fnd_file.put_line(fnd_file.log,RPAD(l_lock_log,40) || ' : ' || igf_aw_gen.lookup_desc('IGF_AP_YES_NO',p_lock_award));
13208 END IF;
13209
13210 --log award group
13211 IF p_grp_code IS NOT NULL THEN
13212 OPEN c_awd_grp(p_grp_code,p_award_year);
13213 FETCH c_awd_grp INTO l_awd_grp;
13214 CLOSE c_awd_grp;
13215 fnd_file.put_line(fnd_file.log,RPAD(l_agrp_log,40) || ' : ' ||l_awd_grp.description);
13216 END IF;
13217
13218 --log simulation
13219 IF p_sim_mode IS NOT NULL THEN
13220 fnd_file.put_line(fnd_file.log,RPAD(l_sim_log,40) || ' : ' || igf_aw_gen.lookup_desc('IGF_AP_YES_NO',p_sim_mode));
13221 END IF;
13222
13223 --log run mode
13224 IF p_run_mode IS NOT NULL THEN
13225 fnd_file.put_line(fnd_file.log,RPAD(l_runm_log,40) || ' : ' || p_run_mode);
13226 END IF;
13227
13228 --log publish mode
13229 IF p_publish_in_ss_flag IS NOT NULL THEN
13230 fnd_file.put_line(fnd_file.log,RPAD(l_publish_log,40) || ' : ' || igf_aw_gen.lookup_desc('IGF_AP_YES_NO',p_publish_in_ss_flag));
13231 END IF;
13232
13233 fnd_file.put_line(fnd_file.log,RPAD('-',55,'-'));
13234 END log_parameters;
13235
13236 PROCEDURE run(
13237 errbuf OUT NOCOPY VARCHAR2,
13238 retcode OUT NOCOPY NUMBER,
13239 l_award_year IN VARCHAR2,
13240 p_awd_prd_code IN VARCHAR2,
13241 l_grp_code IN VARCHAR2,
13242 l_base_id IN NUMBER,
13243 l_sim_mode IN VARCHAR2,
13244 p_upd_awd_notif_status IN VARCHAR2,
13245 l_run_mode IN VARCHAR2,
13246 p_fund_id IN NUMBER,
13247 l_run_type IN VARCHAR2, -- Obsoleted parameter, retaining for backward compatibility
13248 p_publish_in_ss_flag IN VARCHAR2,
13249 l_run_code IN VARCHAR2, -- Obsoleted parameter, retaining for backward compatibility
13250 l_individual_pkg IN VARCHAR2 -- Obsoleted parameter, retaining for backward compatibility
13251 ) IS
13252 /*
13253 || Created By : cdcruz
13254 || Created On : 14-NOV-2000
13255 || Purpose :
13256 || Known limitations, enhancements or remarks :
13257 || Change History :
13258 || Who WHEN What
13259 || tsailaja 13/Jan/2006 Bug 4947880 Added invocation of igf_aw_gen.set_org_id(NULL);
13260 || veramach 13-OCT-2003 FA 124 Build - Added logic for validations on g_sf_max_award_amt,g_sf_min_award_amt,g_allow_to_exceed
13261 || (reverse chronological order - newest change first)
13262 */
13263
13264 /*
13265 When Calling from the Packaging Conc. Job
13266 Award Year Target Group Person Number Action
13267
13268 1. Yes No No Get all the student from the FA Base Record who has Valid ISIR
13269 and valid Target Group. Loop for each person and award the
13270 funds which are present in that target group.
13271
13272 2. Yes Yes No Get all the student from the FA Base Record who has Valid ISIR
13273 and having mentioned Target Group. Loop for each person and award
13274 the funds which are present in that target group.
13275
13276 3. Yes No Yes Get the target group specified at the student and award the
13277 funds which are present in that target group.
13278
13279 4. Yes Yes Yes Invalid combination, log a message that invalid combination
13280
13281 5. If fund id is present, that means it is called from singlr fund award process, so process only for that fund
13282 for the parameter combinations like Person Number ans Person ID Group
13283 */
13284
13285 l_ci_cal_type VARCHAR2(10);
13286 l_ci_sequence_number NUMBER;
13287
13288 CURSOR c_temp_rec IS
13289 SELECT row_id row_id
13290 FROM igf_aw_award_t awdt
13291 WHERE awdt.process_id = l_process_id;
13292
13293 l_temp_rec c_temp_rec%ROWTYPE;
13294
13295 CURSOR c_summary_awd IS
13296 SELECT COUNT(*) cnt,
13297 SUM(awt.offered_amt * awt.temp_num_val1/100) offered_amt,
13298 fund_code,
13299 adplans_id
13300 FROM igf_aw_award_t awt,
13301 igf_aw_fund_mast_all fm
13302 WHERE fm.fund_id=awt.fund_id
13303 AND awt.flag = 'FL'
13304 AND awt.process_id = l_process_id
13305 GROUP BY fund_code,
13306 adplans_id;
13307
13308 l_summ_rec c_summary_awd%ROWTYPE;
13309
13310 -- Get the details of
13311 CURSOR c_fund_dtls( cp_fund_id igf_aw_fund_mast_all.fund_id%TYPE) IS
13312 SELECT fm.auto_pkg,
13313 fm.fund_code,
13314 fcat.fed_fund_code,
13315 fcat.fund_source,
13316 fm.entitlement,
13317 fm.min_award_amt,
13318 fm.max_award_amt
13319 FROM igf_aw_fund_mast fm,
13320 igf_aw_fund_cat fcat
13321 WHERE fm.fund_id = cp_fund_id
13322 AND fm.fund_code = fcat.fund_code;
13323
13324 -- Fetch all the student when the Target Group and Person Number is not specified who
13325 -- has valid Payment ISIR ID and also valid Target Group in descending order of their need
13326 CURSOR c_get_stds(
13327 cp_cal_type igf_ap_fa_base_rec_all.ci_cal_type%TYPE,
13328 cp_sequence_number igf_ap_fa_base_rec_all.ci_sequence_number%TYPE
13329 ) IS
13330 SELECT fabase.base_id,igf_aw_coa_gen.coa_amount(fabase.base_id,g_awd_prd) coa_f
13331 FROM igf_ap_fa_base_rec_all fabase,
13332 igf_ap_isir_matched_all im
13333 WHERE fabase.ci_cal_type = cp_cal_type
13334 AND fabase.ci_sequence_number = cp_sequence_number
13335 AND fabase.target_group IS NOT NULL
13336 AND im.system_record_type = 'ORIGINAL'
13337 AND im.payment_isir = 'Y'
13338 AND im.base_id = fabase.base_id;
13339
13340 -- Get the details of students from the Temp Table in the descending order of their needs
13341 CURSOR c_ordered_stdnts IS
13342 SELECT base_id
13343 FROM igf_aw_award_t
13344 WHERE flag = 'ST'
13345 AND process_id = l_process_id
13346 ORDER BY temp_num_val2 DESC;
13347
13348 l_str VARCHAR(4000);
13349 l_count NUMBER := 0;
13350
13351 -- Get distribution plan associated with a target group
13352 CURSOR c_tgrp_dist(
13353 cp_group_cd igf_aw_target_grp_all.group_cd%TYPE
13354 ) IS
13355 SELECT adplans_id
13356 FROM igf_aw_target_grp
13357 WHERE group_cd = cp_group_cd;
13358 l_tgrp_dist c_tgrp_dist%ROWTYPE;
13359 lv_result VARCHAR2(80);
13360 lv_method_code igf_aw_awd_dist_plans.dist_plan_method_code%TYPE;
13361
13362 l_error_code NUMBER;
13363 BEGIN
13364 igf_aw_gen.set_org_id(NULL);
13365 IF g_req_id IS NULL THEN
13366 g_req_id := fnd_global.conc_request_id;
13367 END IF;
13368
13369 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13370 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.run.debug '|| g_req_id,'l_award_year:'||l_award_year);
13371 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.run.debug '|| g_req_id,'l_grp_code:'||l_grp_code);
13372 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.run.debug '|| g_req_id,'l_base_id:'||l_base_id);
13373 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.run.debug '|| g_req_id,'l_base_id:'||l_base_id);
13374 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.run.debug '|| g_req_id,'p_fund_id:'||p_fund_id);
13375 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.run.debug '|| g_req_id,'g_plan_id:'||g_plan_id);
13376 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.run.debug '|| g_req_id,'p_publish_in_ss_flag:'||p_publish_in_ss_flag);
13377 END IF;
13378 IF NVL(g_sf_packaging,'F') <> 'T' THEN
13379 log_parameters(
13380 p_award_year => l_award_year,
13381 p_awd_prd_code => p_awd_prd_code,
13382 p_fund_id => p_fund_id,
13383 p_dist_id => NULL,
13384 p_base_id => l_base_id,
13385 p_persid_grp => NULL,
13386 p_sf_min_amount => NULL,
13387 p_sf_max_amount => NULL,
13388 p_allow_to_exceed => NULL,
13389 p_upd_awd_notif_status => p_upd_awd_notif_status,
13390 p_lock_award => NULL,
13391 p_grp_code => l_grp_code,
13392 p_sim_mode => NVL(l_sim_mode,'Y'),
13393 p_run_mode => l_run_mode,
13394 p_publish_in_ss_flag => p_publish_in_ss_flag
13395 );
13396 END IF;
13397 -- Get the Calendar details form the award year paramter
13398 l_ci_cal_type := TRIM(SUBSTR(l_award_year,1,10));
13399 l_ci_sequence_number := TO_NUMBER(SUBSTR(l_award_year,11));
13400 l_process_id := NULL;
13401 gn_fund_awd_cnt := NULL;
13402
13403 IF l_ci_cal_type IS NULL OR l_ci_sequence_number IS NULL THEN
13404 retcode := 2;
13405 fnd_message.set_name('IGS','IGS_AD_SYSCAL_CONFIG_NOT_DTMN');
13406 fnd_file.put_line(fnd_file.log,fnd_message.get);
13407 RETURN;
13408 END IF;
13409
13410 get_process_id;
13411
13412 g_awd_prd := p_awd_prd_code;
13413
13414 IF l_grp_code IS NOT NULL THEN
13415 OPEN c_tgrp_dist(l_grp_code);
13416 FETCH c_tgrp_dist INTO l_tgrp_dist;
13417 check_plan(l_tgrp_dist.adplans_id,lv_result,lv_method_code);
13418
13419 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13420 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.run.debug '|| g_req_id,'check_plan returned lv_result: '||lv_result||' lv_method_code: '||lv_method_code);
13421 END IF;
13422
13423 IF lv_result <> 'TRUE' THEN
13424 fnd_message.set_name('IGF',lv_result);
13425 fnd_file.put_line(fnd_file.log,fnd_message.get);
13426 RETURN;
13427 END IF;
13428 END IF;
13429
13430
13431 -- Set all the global parameters
13432 g_upd_awd_notif_status := p_upd_awd_notif_status;
13433
13434 g_phasein_participant := isPhaseInParticipant(l_ci_cal_type,l_ci_sequence_number);
13435
13436 g_publish_in_ss_flag := p_publish_in_ss_flag;
13437 -- Process for a fund if fund id is present. This condition appears when this
13438 -- program is being called from "Single Fund Packaging"
13439 -- Senario : 5
13440 IF p_fund_id IS NOT NULL THEN
13441
13442 g_sf_packaging := 'T';
13443 g_sf_fund := p_fund_id;
13444 g_ci_cal_type := l_ci_cal_type;
13445 g_ci_sequence := l_ci_sequence_number;
13446
13447 -- Check if the fund can be Auto Packaged, if not log a messae and exit
13448 FOR c_fund_dtls_rec IN c_fund_dtls(p_fund_id) LOOP
13449 IF c_fund_dtls_rec.auto_pkg <>'Y' THEN
13450 fnd_message.set_name('IGF','IGF_AW_PK_AUTO_SKIP');
13451 fnd_message.set_token('FUND_ID',c_fund_dtls_rec.fund_code);
13452 fnd_file.put_line(fnd_file.log,fnd_message.get);
13453 RETURN;
13454 END IF;
13455
13456 IF c_fund_dtls_rec.entitlement = 'Y' AND g_allow_to_exceed IS NOT NULL THEN
13457 fnd_message.set_name('IGF','IGF_AW_ALLOW_EXCD_WHEN_ENTLMNT');
13458 fnd_file.put_line(fnd_file.log,fnd_message.get);
13459 RAISE PARAM_ERR;
13460 END IF;
13461
13462 IF c_fund_dtls_rec.fund_source = 'FEDERAL' AND g_allow_to_exceed IS NOT NULL THEN
13463 fnd_message.set_name('IGF','IGF_AW_ALLOW_EXCD_WHEN_FEDERAL');
13464 fnd_file.put_line(fnd_file.log,fnd_message.get);
13465 RAISE PARAM_ERR;
13466 END IF;
13467
13468 IF g_sf_min_amount IS NOT NULL AND g_sf_max_amount IS NOT NULL AND g_sf_min_amount > g_sf_max_amount THEN
13469 fnd_message.set_name('IGF','IGF_AW_MAX_MIN');
13470 fnd_file.put_line(fnd_file.log,fnd_message.get);
13471 RAISE PARAM_ERR;
13472 END IF;
13473
13474 IF c_fund_dtls_rec.fed_fund_code IN ('ACG','SMART') AND g_persid_grp IS NULL THEN
13475 fnd_message.set_name('IGF','IGF_AW_PER_GRP_REQD');
13476 fnd_file.put_line(fnd_file.log,fnd_message.get);
13477 RAISE PARAM_ERR;
13478 END IF;
13479
13480 IF (g_sf_min_amount IS NOT NULL) AND
13481 ( g_sf_min_amount < NVL(c_fund_dtls_rec.min_award_amt,0) OR g_sf_min_amount > c_fund_dtls_rec.max_award_amt)
13482 THEN
13483 fnd_message.set_name('IGF','IGF_AW_SF_MIN_AMT_LESS_FUND');
13484 fnd_file.put_line(fnd_file.log,fnd_message.get);
13485 END IF;
13486
13487 IF (g_sf_max_amount IS NOT NULL) AND
13488 (g_sf_max_amount > c_fund_dtls_rec.max_award_amt OR g_sf_max_amount < NVL(c_fund_dtls_rec.min_award_amt,0))
13489 THEN
13490 fnd_message.set_name('IGF','IGF_AW_SF_MAX_AMT_GTR_FUND');
13491 fnd_file.put_line(fnd_file.log,fnd_message.get);
13492 END IF;
13493
13494 END LOOP;
13495
13496 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13497 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.run.debug '|| g_req_id,'calling process_single_fund');
13498 END IF;
13499 process_single_fund(
13500 l_grp_code, -- p_grp_code
13501 l_ci_Cal_type, -- p_ci_cal_type
13502 l_ci_sequence_number, -- p_ci_sequence_number
13503 l_base_id, -- p_base_id
13504 g_persid_grp -- p_persid_grp
13505 );
13506
13507 -- If calling Packaging process directly from the Conc Job
13508 ELSE
13509 g_sf_packaging := 'F';
13510
13511 -- Conc program cannot be executed for both group code and the base id at a time, so log message and exit
13512 IF l_grp_code IS NOT NULL AND l_base_id IS NOT NULL THEN
13513 fnd_message.set_name('IGF','IGF_AW_SF_GRP_BASE');
13514 fnd_file.put_line(fnd_file.log,fnd_message.get);
13515 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13516 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.run.debug '|| g_req_id,'both base_id and l_grp_code specified');
13517 END IF;
13518 RAISE PARAM_ERR;
13519
13520 -- Process run for the given Group Code
13521 ELSIF l_grp_code IS NOT NULL THEN
13522
13523 group_run(
13524 l_grp_code , -- l_group_code
13525 l_ci_cal_type , -- l_ci_cal_type
13526 l_ci_sequence_number, -- l_ci_sequence_number
13527 NVL(l_sim_mode,'Y'), -- l_post (Simulated mode or non simlated mode)
13528 l_run_mode -- l_run_mode
13529 );
13530 -- Process run for the given student
13531 ELSIF l_base_id IS NOT NULL THEN
13532
13533 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13534 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.run.debug '|| g_req_id,'calling stud_run with base_id:'||l_base_id);
13535 END IF;
13536 g_over_awd := NULL;
13537
13538 stud_run(
13539 l_base_id, -- l_base_id
13540 NVL(l_sim_mode,'Y'), -- l_post (Simulated mode or non simlated mode)
13541 l_run_mode -- l_run_mode
13542 );
13543 IF NVL(l_sim_mode,'Y') = 'N' THEN
13544 COMMIT;
13545 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13546 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'stud_run complete.data committed');
13547 END IF;
13548 ELSE
13549 BEGIN
13550 ROLLBACK TO IGFAW03B_POST_AWARD;
13551 EXCEPTION
13552 WHEN OTHERS THEN
13553 l_error_code := SQLCODE;
13554 IF l_error_code = -1086 THEN
13555 --savepoint not established error
13556 --post_award was not called from stud_run as stud_run returned without processing the student
13557 --rollback to savepoint established in stud_run
13558 ROLLBACK TO STUD_SP;
13559 ELSE
13560 RAISE;
13561 END IF;
13562 END;
13563 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13564 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.stud_run.debug '|| g_req_id,'stud_run complete.data rolled back');
13565 END IF;
13566 END IF;
13567
13568 -- Both Target Group is NULL and Person ID is NULL
13569 ELSIF l_base_id IS NULL AND l_grp_code IS NULL THEN
13570
13571 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13572 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.run.debug '|| g_req_id,'Processing all students in '||l_ci_cal_type||' '||l_ci_sequence_number);
13573 END IF;
13574 FOR c_get_stds_rec IN c_get_stds(l_ci_cal_type, l_ci_sequence_number) LOOP
13575
13576 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13577 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.run.debug '|| g_req_id,'calling calc_students_needs with base_id:'||c_get_stds_rec.base_id);
13578 END IF;
13579
13580 calc_students_needs(
13581 c_get_stds_rec.base_id,
13582 c_get_stds_rec.coa_f
13583 );
13584
13585 END LOOP;
13586
13587 -- Fetch the students as per the decreasing order of their need.
13588 FOR c_ordered_stdnts_rec IN c_ordered_stdnts LOOP
13589
13590 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13591 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.run.debug '|| g_req_id,'calling stud_run with base_id:'||c_ordered_stdnts_rec.base_id);
13592 END IF;
13593
13594 -- Process for the student in the decending order of their needs
13595 g_over_awd := NULL;
13596 stud_run(
13597 c_ordered_stdnts_rec.base_id,
13598 NVL(l_sim_mode,'Y'),
13599 l_run_mode
13600 );
13601 IF NVL(l_sim_mode,'Y') = 'N' THEN
13602 COMMIT;
13603 ELSE
13604 BEGIN
13605 ROLLBACK TO IGFAW03B_POST_AWARD;
13606 EXCEPTION
13607 WHEN OTHERS THEN
13608 l_error_code := SQLCODE;
13609 IF l_error_code = -1086 THEN
13610 --savepoint not established error
13611 --post_award was not called from stud_run as stud_run returned without processing the student
13612 --rollback to savepoint established in stud_run
13613 ROLLBACK TO STUD_SP;
13614 ELSE
13615 RAISE;
13616 END IF;
13617 END;
13618 END IF;
13619
13620 END LOOP;
13621
13622 END IF;
13623 END IF;
13624
13625 --- Log the award count INTO output file.
13626 OPEN c_summary_awd;
13627 LOOP
13628 FETCH c_summary_awd INTO l_summ_rec;
13629 EXIT WHEN c_summary_awd%NOTFOUND;
13630 l_count := c_summary_awd%ROWCOUNT;
13631
13632 IF c_summary_awd%ROWCOUNT = 1 THEN
13633 l_str := RPAD(igf_aw_gen.lookup_desc('IGF_AW_LOOKUPS_MSG','FUND_CODE'), 40, ' ');
13634 l_str := l_str ||RPAD(igf_aw_gen.lookup_desc('IGF_AW_LOOKUPS_MSG','AWARD_COUNT'), 30, ' ');
13635 l_str := l_str ||RPAD(igf_aw_gen.lookup_desc('IGF_AW_LOOKUPS_MSG','AWARD_AMOUNT'), 30, ' ');
13636 fnd_file.put_line(fnd_file.output,RPAD('-',90,'-'));
13637 fnd_file.put_line(fnd_file.output,l_str);
13638 fnd_file.put_line(fnd_file.output,RPAD('-',90,'-'));
13639 END IF;
13640
13641 l_str := NULL;
13642 l_str := RPAD(l_summ_rec.fund_code,40,' ');
13643 l_str :=l_str||RPAD(TO_CHAR(l_summ_rec.cnt),30,' ');
13644 l_str :=l_str||LPAD(TO_CHAR(l_summ_rec.offered_amt),20,' ');
13645 fnd_file.put_line(fnd_file.output,l_str );
13646 END LOOP;
13647 CLOSE c_summary_awd;
13648
13649 IF l_count > 0 THEN
13650 fnd_file.put_line(fnd_file.output,RPAD('-',90,'-'));
13651 END IF;
13652
13653 -- Clear out NOCOPY temporary records
13654 OPEN c_temp_rec;
13655 LOOP
13656 FETCH c_temp_rec INTO l_temp_rec;
13657 EXIT WHEN c_temp_rec%NOTFOUND;
13658
13659 igf_aw_award_t_pkg.delete_row(l_temp_rec.row_id );
13660
13661 END LOOP;
13662 CLOSE c_temp_rec;
13663
13664 fnd_file.new_line(fnd_file.log,2);
13665
13666 EXCEPTION
13667
13668 WHEN PARAM_ERR THEN
13669 ROLLBACK;
13670 retcode := 2;
13671 fnd_file.new_line(fnd_file.log,2);
13672 fnd_message.set_name('IGF','IGF_AW_PARAM_ERR');
13673 igs_ge_msg_stack.add;
13674 igs_ge_msg_stack.conc_exception_hndl;
13675
13676 WHEN OTHERS THEN
13677 ROLLBACK;
13678 RETCODE := 2;
13679 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
13680 fnd_message.set_token('NAME','IGF_AW_PACKAGING.RUN '||SQLERRM);
13681 errbuf := fnd_message.get;
13682 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
13683 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.run.exception '|| g_req_id,'sql error message: '||SQLERRM);
13684 END IF;
13685 igs_ge_msg_stack.conc_exception_hndl;
13686
13687 END run;
13688
13689
13690 PROCEDURE pkg_single_fund(
13691 errbuf OUT NOCOPY VARCHAR2,
13692 retcode OUT NOCOPY NUMBER,
13693 p_award_year IN VARCHAR2, -- 10
13694 p_awd_prd_code IN VARCHAR2,
13695 p_fund_id IN NUMBER, -- 20
13696 p_dist_id IN NUMBER,
13697 p_base_id IN NUMBER, -- 40
13698 p_persid_grp IN NUMBER, -- 50
13699 p_sf_min_amount IN NUMBER,
13700 p_sf_max_amount IN NUMBER,
13701 p_allow_to_exceed IN VARCHAR2,
13702 p_upd_awd_notif_status IN VARCHAR2, -- 60
13703 p_lock_award IN VARCHAR2,
13704 p_publish_in_ss_flag IN VARCHAR2
13705 ) IS
13706
13707 /*
13708 || Created By : skoppula
13709 || Created On : 02-JAN-2002
13710 || Purpose :
13711 || Known limitations, enhancements or remarks :
13712 || Change History :
13713 || Who WHEN What
13714 || (reverse chronological order - newest change first)
13715 || tsailaja 13/Jan/2006 Bug 4947880 Added invocation of igf_aw_gen.set_org_id(NULL);
13716 || veramach 30-Jun-2004 bug 3709109 - Added call to function check_disb to enforce the rule that FWS funds can
13717 || have only one disbursement per term
13718 || veramach 20-NOV-2003 FA 125 multiple distribution method
13719 || Added p_dist_id as parameter and validations on this parameter
13720 || veramach 13-OCT-2003 FA 124 - Removed p_grp_code parameter. Added p_sf_min_amount,p_sf_max_amount,p_allow_to_exceed
13721 || pmarada 14-feb-2002 added p_upd_awd_notif_status parameter.
13722 */
13723
13724 lv_result VARCHAR2(80) := NULL;
13725 lv_method_code VARCHAR2(80) := NULL;
13726 l_terms NUMBER := 0;
13727
13728 BEGIN
13729 igf_aw_gen.set_org_id(NULL);
13730 IF g_req_id IS NULL THEN
13731 g_req_id := fnd_global.conc_request_id;
13732 END IF;
13733 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13734 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.pkg_single_fund.debug '|| g_req_id,'g_persid_grp:'||p_persid_grp);
13735 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.pkg_single_fund.debug '|| g_req_id,'g_sf_min_amount:'||p_sf_min_amount);
13736 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.pkg_single_fund.debug '|| g_req_id,'g_sf_max_amount:'||p_sf_max_amount);
13737 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.pkg_single_fund.debug '|| g_req_id,'g_allow_to_exceed:'||p_allow_to_exceed);
13738 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.pkg_single_fund.debug '|| g_req_id,'p_fund_id:'||p_fund_id);
13739 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.pkg_single_fund.debug '|| g_req_id,'p_dist_id:'||p_dist_id);
13740 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.pkg_single_fund.debug '|| g_req_id,'p_base_id:'||p_base_id);
13741 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.pkg_single_fund.debug '|| g_req_id,'p_lock_award:'||p_lock_award);
13742 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.pkg_single_fund.debug '|| g_req_id,'p_awd_prd_code:'||p_awd_prd_code);
13743 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.pkg_single_fund.debug '|| g_req_id,'p_publish_in_ss_flag:'||p_publish_in_ss_flag);
13744 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.pkg_single_fund.debug '|| g_req_id,'calling run');
13745 END IF;
13746
13747 log_parameters(
13748 p_award_year => p_award_year,
13749 p_awd_prd_code => p_awd_prd_code,
13750 p_fund_id => p_fund_id,
13751 p_dist_id => p_dist_id,
13752 p_base_id => p_base_id,
13753 p_persid_grp => p_persid_grp,
13754 p_sf_min_amount => p_sf_min_amount,
13755 p_sf_max_amount => p_sf_max_amount,
13756 p_allow_to_exceed => p_allow_to_exceed,
13757 p_upd_awd_notif_status => p_upd_awd_notif_status,
13758 p_lock_award => p_lock_award,
13759 p_grp_code => NULL,
13760 p_sim_mode => NULL,
13761 p_run_mode => NULL,
13762 p_publish_in_ss_flag => p_publish_in_ss_flag
13763 );
13764 -- Check whether the required parameters are passed or not.
13765 -- If sufficient parameters are not present then log a message and exit the conc job
13766 IF p_base_id IS NULL AND p_persid_grp IS NULL THEN
13767 fnd_message.set_name('IGF','IGF_AW_SF_PARAM_NULL');
13768 fnd_file.put_line(fnd_file.log,fnd_message.get);
13769 RAISE PARAM_ERR;
13770 ELSIF p_base_id IS NOT NULL AND p_persid_grp IS NOT NULL THEN
13771 fnd_message.set_name('IGF','IGF_AW_SF_BASE_PERSID');
13772 fnd_file.put_line(fnd_file.log,fnd_message.get);
13773 RAISE PARAM_ERR;
13774 END IF;
13775
13776 g_sf_packaging := 'T';
13777 g_lock_award := p_lock_award;
13778
13779 check_plan(p_dist_id,lv_result,lv_method_code);
13780
13781 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
13782 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_packaging.pkg_single_fund.debug '|| g_req_id,'check_plan returned lv_result: '||lv_result||' lv_method_code: '||lv_method_code);
13783 END IF;
13784
13785 IF lv_result <> 'TRUE' THEN
13786 fnd_message.set_name('IGF',lv_result);
13787 fnd_file.put_line(fnd_file.log,fnd_message.get);
13788 RAISE PARAM_ERR;
13789 ELSE
13790 g_plan_id := p_dist_id;
13791 g_method_cd := lv_method_code;
13792 END IF;
13793
13794 g_persid_grp := p_persid_grp;
13795 g_sf_min_amount := p_sf_min_amount;
13796 g_sf_max_amount := p_sf_max_amount;
13797 g_allow_to_exceed := p_allow_to_exceed;
13798 g_publish_in_ss_flag := p_publish_in_ss_flag;
13799
13800 run(
13801 errbuf, -- errbuf
13802 retcode, -- retcode
13803 p_award_year, -- l_award_year
13804 p_awd_prd_code, -- p_awd_prd_code
13805 NULL, -- l_grp_code
13806 p_base_id, -- l_base_id
13807 'N', -- l_sim_mode
13808 p_upd_awd_notif_status, -- p_upd_awd_notif_status
13809 'D', -- l_run_mode
13810 p_fund_id, -- p_fund_id
13811 NULL, -- l_run_type -- Obsoleted parameter
13812 p_publish_in_ss_flag, -- p_publish_in_ss_flag
13813 NULL, -- l_run_code -- Obsoleted parameter
13814 NULL -- l_individual_pkg -- Obsoleted parameter
13815 );
13816
13817 EXCEPTION
13818 WHEN PARAM_ERR THEN
13819 ROLLBACK;
13820 retcode := 2;
13821 fnd_file.new_line(fnd_file.log,2);
13822 fnd_message.set_name('IGF','IGF_AW_PARAM_ERR');
13823 igs_ge_msg_stack.add;
13824 igs_ge_msg_stack.conc_exception_hndl;
13825
13826 WHEN OTHERS THEN
13827 ROLLBACK;
13828 RETCODE := 2;
13829 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
13830 fnd_message.set_token('NAME','IGF_AW_PACKAGING.PKG_SINGLE_FUND '||SQLERRM);
13831 errbuf := fnd_message.get;
13832 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
13833 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_packaging.pkg_single_fund.exception '|| g_req_id,'sql error message: '||SQLERRM);
13834 END IF;
13835 igs_ge_msg_stack.conc_exception_hndl;
13836
13837 END pkg_single_fund;
13838
13839 END igf_aw_packaging;