DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGF_AW_PACKAGING

Source


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;