1 PACKAGE BODY igf_aw_li_import AS
2 /* $Header: IGFAW15B.pls 120.14 2006/09/08 13:55:06 akomurav ship $ */
3
4 /*=======================================================================+
5 | Copyright (c) 1994, 1996 Oracle Corp. Redwood Shores, California, USA|
6 | All rights reserved. |
7 +=======================================================================+
8 | |
9 | DESCRIPTION |
10 | PL/SQL body for package: IGF_AW_LI_IMPORT |
11 | |
12 | NOTES |
13 | |
14 |The Legacy - Award and Disbursement Data Import Process imports data |
15 |from the Legacy Award Data Interface Table, Legacy Disbursement Data |
16 |Interface Table, and Legacy Disbursement Activity Data Interface Table |
17 |into appropriate OSS Financial Aid tables. |
18 |This concurrent process performs specified business rules and |
19 |validations before data can be imported into the OSS Financial Aid |
20 |tables. Users will be notified via the concurrent request's log file |
21 |if the process has encountered errors. |
22 | |
23 | HISTORY |
24 | Who When What |
25 | |
26 | azmohamm 03-AUG-2006 FA 163, Added GPLUSFL fund code |
27 |
28 | ridas 29-Jul-2005 Bug #3536039. |
29 | Exception igf_se_gen_001.IGFSEGEN001 added in |
30 | procedure CREATE_AWARD_RECORD |
31 | |
32 | ridas 22-Jul-2005 Bug #4093072. If FEDERAL_FUND_CODE equal to |
33 | 'ALT'/'FLS'/'FLP'/'FLU', then call the function|
34 | igf_sl_award.get_cl_hold_rel_ind() which will |
35 | return the hold_release_indicator value. |
36 | If not assign FALSE as default value |
37 | |
38 | ridas 10-Jan-2005 Bug #3701698 if the Award Status='CANCELLED', |
39 | Accected amount should be zero. |
40 | |
41 | brajendr 04-Jan-2004 Bug 3701698 Loading Legacy awds with CANCEL st |
42 | Added the validations for validating the |
43 | -- Total offered/accepted amounts in disb |
44 | -- added check for disb_accepted_amt in dacts |
45 | |
46 | cdcruz 02-Dec-2004 Bug 3701698 Customer requirement was to be able|
47 | to upload Cancelled Awards via Legacy Import |
48 | |
49 | ridas 08-Nov-2004 Bug 3021287 If the profile_value = 'AWARDED' |
50 | then updating COA at the student level |
51 | |
52 | brajendr 12-Oct-2004 Bug 3732665 ISIR Enhacements |
53 | modified the payment isir reference |
54 | |
55 | veramach July 2004 FA 151 HR Integration (bug# 3709292) |
56 | Moved validations at the disbursement level |
57 | for FWS awards to award level. |
58 | also,creation of authorization is made at the |
59 | award level rather than at each disbursement |
60 | level |
61 | veramach 26-Feb-2004 bug 3466726 - Changed cursor c_get_att_type to |
62 | use lookup_code rather than description for |
63 | validating base_attendance_type_code |
64 | If this validation fails, message |
65 | IGF_AP_INV_FLD_VAL is displayed rather than |
66 | IGF_AW_LI_INVALID_ATT_TYPE |
67 | veramach 08-Dec-2003 FA 131 Build - made li_awd_rec parameter of |
68 | validate_awdyear_int_rec to IN OUT NOCOPY |
69 | sjadhav 4-Dec-2003 Limit logic for term comparision to Sponsor |
70 | Funds |
71 | veramach 04-Dec-2003 FA 131 COD Updates |
72 | Changed column names in legacy award/ |
73 | disbursement table to be in sync with the CS |
74 | nsidana 11/27/2003 FA131 COD updated for 2004-2005 build. |
75 | New cols added to legacy award and legacy award |
76 | disbursements table. Impact done here. |
77 | sjadhav 19-Nov-2003 Bug 3160568 FA 125 Build. Added run routine |
78 | Added validations for EXT Award Import |
79 | Added validations for attendance_type_code |
80 | veramach 1-NOV-2003 FA 125 Multiple Distr Methods |
81 | Changed calll to igf_aw_awd_disb_pkg.update_row|
82 | to reflect the addition of attendance_type_code|
83 | brajendr 08-Oct-2003 Bug # 3116511 - Update the Auth Date |
84 | |
85 | sjalasut June 16,2003 Created as Part of Fa118.2 Legacy Import Build |
86 | sjalasut August 4, 2003 Import Sponsorships and Federal Work Study |
87 | funds for FACR117, part of sep 03 patch |
88 | sjalasut Aug 12, 2003 Bug 3093913. Changed the message for validatio|
89 | n on transaction type. |
90 *=======================================================================*/
91
92 /***************************************************************
93 Created By : nsidana
94 Date Created By : 11/28/2003
95 Purpose : Legacy Awards Import package body.
96 Known Limitations,Enhancements or Remarks
97 Change History :
98 Who When What
99 nsidana 11/28/2003 FA131 COD updates build. Added validations on two new feilds
100 added to the legacy awards table and 1 feild in the legacy award
101 disbursements table.
102 ***************************************************************/
103
104
105 -- cursor to fetch records from the award legacy interface tables
106
107 CURSOR cur_legacy_award_int(p_alternate_code igs_ca_inst.alternate_code%TYPE,
108 p_batch_num igf_aw_li_awd_ints.batch_num%TYPE) IS
109 SELECT
110 awdint.batch_num,
111 trim(awdint.ci_alternate_code) ci_alternate_code,
112 trim(awdint.fund_code) fund_code,
113 trim(awdint.person_number) person_number,
114 trim(awdint.award_number_txt) award_number_txt,
115 awdint.import_status_type,
116 awdint.offered_amt,
117 awdint.accepted_amt,
118 trim(awdint.award_status_code) award_status_code,
119 awdint.award_date,
120 awdint.alt_pell_schedule_type,
121 awdint.import_record_type,
122 awdint.created_by,
123 awdint.creation_date,
124 awdint.last_updated_by,
125 awdint.last_update_date,
126 awdint.last_update_login,
127 awdint.request_id,
128 awdint.program_application_id,
129 awdint.program_id,
130 awdint.program_update_date,
131 awdint.lock_award_flag, --new col for FA131 COD updates build
132 awdint.app_trans_num_txt, --new col for FA131 COD updates build
133 awdint.authorization_date,
134 awdint.publish_in_ss_flag
135 FROM igf_aw_li_awd_ints awdint
136 WHERE awdint.batch_num = p_batch_num
137 AND awdint.ci_alternate_code = p_alternate_code
138 AND awdint.import_status_type IN ('U','R')
139 ORDER BY awdint.person_number, awdint.fund_code, awdint.award_number_txt;
140 l_out_person_id hz_parties.party_id%TYPE;
141 l_out_base_id igf_ap_fa_base_rec_all.base_id%TYPE;
142
143 g_ci_cal_type igf_ap_batch_aw_map.ci_cal_type%TYPE;
144 g_ci_sequence_number igf_ap_batch_aw_map_all.ci_sequence_number%TYPE;
145
146 g_award_year_status_code igf_ap_batch_aw_map_all.award_year_status_code%TYPE;
147 g_sys_award_year igf_ap_batch_aw_map_all.sys_award_year%TYPE;
148 g_fund_code igf_aw_fund_mast_all.fund_code%TYPE;
149 g_fed_fund_code igf_aw_fund_cat_all.fed_fund_code%TYPE;
150 g_fund_id igf_aw_fund_mast_all.fund_id%TYPE;
151 g_base_id igf_ap_fa_base_rec_all.base_id%TYPE;
152 g_award_id igf_aw_award_all.award_id%TYPE;
153 g_disb_net_amount igf_aw_li_dact_ints.disb_net_amt%TYPE;
154 g_person_id hz_parties.party_id%TYPE;
155 g_processing_string VARCHAR2(1000);
156 g_debug_string fnd_log_messages.message_text%TYPE;
157 g_debug_runtime_level NUMBER;
158 g_entry_point VARCHAR2(30);
159
160 g_print_msg VARCHAR2(200);
161 -- bvisvana - Bug # 4635941 - Global variables
162 CURSOR c_get_awd_details(cp_award_id igf_aw_award_all.award_id%TYPE) IS
163 SELECT * FROM igf_aw_award_all
164 WHERE award_id = cp_award_id;
165
166 g_old_award_rec c_get_awd_details%ROWTYPE; -- Collects information of the old award (that is getting deleted)
167 g_new_award_rec c_get_awd_details%ROWTYPE; -- Collects information of the new award (that is getting created)
168 g_hist_cnt NUMBER;
169 g_update_mode BOOLEAN := FALSE; -- To Track whether running in update mode or not
170 TYPE g_old_award_hist_tab_type IS TABLE OF igf_aw_award_level_hist%ROWTYPE INDEX BY BINARY_INTEGER;
171 g_old_award_hist_col g_old_award_hist_tab_type; -- Holds the history of the award that is getting deleted when running in update_mode
172
173
174 PROCEDURE lock_std_coa (p_base_id igf_ap_fa_base_rec_all.base_id%TYPE
175 )
176 IS
177 -----------------------------------------------------------------------------
178 -- Created By : ridas
179 -- Created On : 05-Nov-2004
180 -- Purpose : to lock COA at the student level
181 -- Known limitations, enhancements or remarks :
182 -- Change History :
183 -- Who When What
184 --
185 -----------------------------------------------------------------------------
186
187 --Cursor to fetch person details
188 CURSOR c_get_fab (p_base_id igf_ap_fa_base_rec_all.base_id%TYPE
189 )
190 IS
191 SELECT fab.rowid row_id,
192 fab.*
193 FROM igf_ap_fa_base_rec_all fab
194 WHERE fab.base_id = p_base_id
195 AND NVL(fab.lock_coa_flag,'N') <> 'Y';
196
197 l_get_fab c_get_fab%ROWTYPE;
198
199
200 --Cursor to fetch item details
201 CURSOR c_items(
202 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE
203 ) IS
204 SELECT items.rowid row_id,
205 items.*
206 FROM igf_aw_coa_items items
207 WHERE base_id = cp_base_id
208 AND NVL(lock_flag,'N') <> 'Y';
209
210
211 --Cursor to fetch term details
212 CURSOR c_terms(
213 cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,
214 cp_item_code igf_aw_item.item_code%TYPE
215 ) IS
216 SELECT terms.rowid row_id,
217 terms.*
218 FROM igf_aw_coa_itm_terms terms
219 WHERE base_id = cp_base_id
220 AND item_code = cp_item_code
221 AND NVL(lock_flag,'N') <> 'Y';
222
223
224 BEGIN
225
226 OPEN c_get_fab(p_base_id);
227 FETCH c_get_fab INTO l_get_fab;
228 CLOSE c_get_fab;
229
230 IF l_get_fab.base_id IS NOT NULL THEN
231
232 FOR l_items IN c_items(l_get_fab.base_id)
233 LOOP
234 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
235 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_li_import.lock_std_coa.debug','locking at the item level');
236 END IF;
237
238 igf_aw_coa_items_pkg.update_row(
239 x_rowid => l_items.row_id,
240 x_base_id => l_items.base_id,
241 x_item_code => l_items.item_code,
242 x_amount => l_items.amount,
243 x_pell_coa_amount => l_items.pell_coa_amount,
244 x_alt_pell_amount => l_items.alt_pell_amount,
245 x_fixed_cost => l_items.fixed_cost,
246 x_legacy_record_flag => l_items.legacy_record_flag,
247 x_mode => 'R',
248 x_lock_flag => 'Y'
249 );
250
251
252 FOR l_terms IN c_terms(l_get_fab.base_id,l_items.item_code)
253 LOOP
254 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
255 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_li_import.lock_std_coa.debug','locking at the term level');
256 END IF;
257
258 igf_aw_coa_itm_terms_pkg.update_row(
259 x_rowid => l_terms.row_id,
260 x_base_id => l_terms.base_id,
261 x_item_code => l_terms.item_code,
262 x_amount => l_terms.amount,
263 x_ld_cal_type => l_terms.ld_cal_type,
264 x_ld_sequence_number => l_terms.ld_sequence_number,
265 x_mode => 'R',
266 x_lock_flag => 'Y'
267 );
268
269 END LOOP;
270 END LOOP;
271
272
273 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
274 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_li_import.lock_std_coa.debug','l_get_fab.base_id IS NOT NULL');
275 END IF;
276
277 igf_ap_fa_base_rec_pkg.update_row
278 (x_Mode => 'R',
279 x_rowid => l_get_fab.row_id,
280 x_base_id => l_get_fab.base_id,
281 x_ci_cal_type => l_get_fab.ci_cal_type,
282 x_person_id => l_get_fab.person_id,
283 x_ci_sequence_number => l_get_fab.ci_sequence_number,
284 x_org_id => l_get_fab.org_id,
285 x_coa_pending => l_get_fab.coa_pending,
286 x_verification_process_run => l_get_fab.verification_process_run,
287 x_inst_verif_status_date => l_get_fab.inst_verif_status_date,
288 x_manual_verif_flag => l_get_fab.manual_verif_flag,
289 x_fed_verif_status => l_get_fab.fed_verif_status,
290 x_fed_verif_status_date => l_get_fab.fed_verif_status_date,
291 x_inst_verif_status => l_get_fab.inst_verif_status,
292 x_nslds_eligible => l_get_fab.nslds_eligible,
293 x_ede_correction_batch_id => l_get_fab.ede_correction_batch_id,
294 x_fa_process_status_date => l_get_fab.fa_process_status_date,
295 x_ISIR_corr_status => l_get_fab.ISIR_corr_status,
296 x_ISIR_corr_status_date => l_get_fab.ISIR_corr_status_date,
297 x_ISIR_status => l_get_fab.ISIR_status,
298 x_ISIR_status_date => l_get_fab.ISIR_status_date,
299 x_coa_code_f => l_get_fab.coa_code_f,
300 x_coa_code_i => l_get_fab.coa_code_i,
301 x_coa_f => l_get_fab.coa_f,
302 x_coa_i => l_get_fab.coa_i,
303 x_disbursement_hold => l_get_fab.disbursement_hold,
304 x_fa_process_status => l_get_fab.fa_process_status,
305 x_notification_status => l_get_fab.notification_status,
306 x_notification_status_date => l_get_fab.notification_status_date,
307 x_packaging_status => l_get_fab.packaging_status,
308 x_packaging_status_date => l_get_fab.packaging_status_date,
309 x_total_package_accepted => l_get_fab.total_package_accepted,
310 x_total_package_offered => l_get_fab.total_package_offered,
311 x_admstruct_id => l_get_fab.admstruct_id,
312 x_admsegment_1 => l_get_fab.admsegment_1,
313 x_admsegment_2 => l_get_fab.admsegment_2,
314 x_admsegment_3 => l_get_fab.admsegment_3,
315 x_admsegment_4 => l_get_fab.admsegment_4,
316 x_admsegment_5 => l_get_fab.admsegment_5,
317 x_admsegment_6 => l_get_fab.admsegment_6,
318 x_admsegment_7 => l_get_fab.admsegment_7,
319 x_admsegment_8 => l_get_fab.admsegment_8,
320 x_admsegment_9 => l_get_fab.admsegment_9,
321 x_admsegment_10 => l_get_fab.admsegment_10,
322 x_admsegment_11 => l_get_fab.admsegment_11,
323 x_admsegment_12 => l_get_fab.admsegment_12,
324 x_admsegment_13 => l_get_fab.admsegment_13,
325 x_admsegment_14 => l_get_fab.admsegment_14,
326 x_admsegment_15 => l_get_fab.admsegment_15,
327 x_admsegment_16 => l_get_fab.admsegment_16,
328 x_admsegment_17 => l_get_fab.admsegment_17,
329 x_admsegment_18 => l_get_fab.admsegment_18,
330 x_admsegment_19 => l_get_fab.admsegment_19,
331 x_admsegment_20 => l_get_fab.admsegment_20,
332 x_packstruct_id => l_get_fab.packstruct_id,
333 x_packsegment_1 => l_get_fab.packsegment_1,
334 x_packsegment_2 => l_get_fab.packsegment_2,
335 x_packsegment_3 => l_get_fab.packsegment_3,
336 x_packsegment_4 => l_get_fab.packsegment_4,
337 x_packsegment_5 => l_get_fab.packsegment_5,
338 x_packsegment_6 => l_get_fab.packsegment_6,
339 x_packsegment_7 => l_get_fab.packsegment_7,
340 x_packsegment_8 => l_get_fab.packsegment_8,
341 x_packsegment_9 => l_get_fab.packsegment_9,
342 x_packsegment_10 => l_get_fab.packsegment_10,
343 x_packsegment_11 => l_get_fab.packsegment_11,
344 x_packsegment_12 => l_get_fab.packsegment_12,
345 x_packsegment_13 => l_get_fab.packsegment_13,
346 x_packsegment_14 => l_get_fab.packsegment_14,
347 x_packsegment_15 => l_get_fab.packsegment_15,
348 x_packsegment_16 => l_get_fab.packsegment_16,
349 x_packsegment_17 => l_get_fab.packsegment_17,
350 x_packsegment_18 => l_get_fab.packsegment_18,
351 x_packsegment_19 => l_get_fab.packsegment_19,
352 x_packsegment_20 => l_get_fab.packsegment_20,
353 x_miscstruct_id => l_get_fab.miscstruct_id,
354 x_miscsegment_1 => l_get_fab.miscsegment_1,
355 x_miscsegment_2 => l_get_fab.miscsegment_2,
356 x_miscsegment_3 => l_get_fab.miscsegment_3,
357 x_miscsegment_4 => l_get_fab.miscsegment_4,
358 x_miscsegment_5 => l_get_fab.miscsegment_5,
359 x_miscsegment_6 => l_get_fab.miscsegment_6,
360 x_miscsegment_7 => l_get_fab.miscsegment_7,
361 x_miscsegment_8 => l_get_fab.miscsegment_8,
362 x_miscsegment_9 => l_get_fab.miscsegment_9,
363 x_miscsegment_10 => l_get_fab.miscsegment_10,
364 x_miscsegment_11 => l_get_fab.miscsegment_11,
365 x_miscsegment_12 => l_get_fab.miscsegment_12,
366 x_miscsegment_13 => l_get_fab.miscsegment_13,
367 x_miscsegment_14 => l_get_fab.miscsegment_14,
368 x_miscsegment_15 => l_get_fab.miscsegment_15,
369 x_miscsegment_16 => l_get_fab.miscsegment_16,
370 x_miscsegment_17 => l_get_fab.miscsegment_17,
371 x_miscsegment_18 => l_get_fab.miscsegment_18,
372 x_miscsegment_19 => l_get_fab.miscsegment_19,
373 x_miscsegment_20 => l_get_fab.miscsegment_20,
374 x_prof_judgement_flg => l_get_fab.prof_judgement_flg,
375 x_nslds_data_override_flg => l_get_fab.nslds_data_override_flg,
376 x_target_group => l_get_fab.target_group,
377 x_coa_fixed => l_get_fab.coa_fixed,
378 x_profile_status => l_get_fab.profile_status,
379 x_profile_status_date => l_get_fab.profile_status_date,
380 x_profile_fc => l_get_fab.profile_fc,
381 x_coa_pell => l_get_fab.coa_pell,
382 x_manual_disb_hold => l_get_fab.manual_disb_hold,
383 x_pell_alt_expense => l_get_fab.pell_alt_expense,
384 x_assoc_org_num => l_get_fab.assoc_org_num,
385 x_award_fmly_contribution_type => l_get_fab.award_fmly_contribution_type,
386 x_packaging_hold => l_get_fab.packaging_hold,
387 x_isir_locked_by => l_get_fab.isir_locked_by ,
388 x_adnl_unsub_loan_elig_flag => l_get_fab.adnl_unsub_loan_elig_flag,
389 x_lock_awd_flag => l_get_fab.lock_awd_flag,
390 x_lock_coa_flag => 'Y'
391 );
392 fnd_message.set_name('IGF','IGF_AW_STUD_COA_LOCK');
393 fnd_message.set_token('PERSON_NUM',igf_gr_gen.get_per_num (p_base_id));
394 g_print_msg := fnd_message.get;
395 END IF;
396
397 EXCEPTION
398 WHEN OTHERS THEN
399 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
400 fnd_message.set_token('NAME','igf_aw_li_import.lock_std_coa :' || SQLERRM);
401 IF fnd_log.level_exception >= fnd_log.g_current_runtime_level THEN
402 fnd_log.string(fnd_log.level_exception,'igf.plsql.igf_aw_li_import.lock_std_coa.exception','sql error:'||SQLERRM);
403 END IF;
404 igs_ge_msg_stack.conc_exception_hndl;
405 app_exception.raise_exception;
406
407
408 END lock_std_coa;
409
410
411
412 PROCEDURE validate_awdyear_int_rec(li_awd_rec IN OUT NOCOPY igf_aw_li_awd_ints%ROWTYPE, l_return_value OUT NOCOPY VARCHAR2) IS
413
414 /***************************************************************
415 Created By : nsidana
416 Date Created By : 11/28/2003
417 Purpose : Validates the interface record.
418 Known Limitations,Enhancements or Remarks
419 Change History :
420 Who When What
421 veramach 08-Dec-2003 FA 131 Build - made li_awd_rec parameter of
422 validate_awdyear_int_rec to IN OUT NOCOPY
423 nsidana 11/28/2003 FA131 COD updates build. Added validations on two new feilds
424 added to the legacy awards table.
425 ***************************************************************/
426
427 -- validates the award year interface record
428 CURSOR cur_check_sys_awd (p_base_id igf_ap_fa_base_rec_all.base_id%TYPE) IS
429 SELECT award_id, legacy_record_flag
430 FROM igf_aw_award_all
431 WHERE base_id = p_base_id
432 AND award_number_txt = li_awd_rec.award_number_txt;
433 l_award_id igf_aw_award_all.award_id%TYPE;
434 l_legacy_record_flag igf_aw_award_all.legacy_record_flag%TYPE;
435
436 CURSOR cur_get_fund_code(p_fund_code igf_aw_li_awd_ints.fund_code%TYPE) IS
437 SELECT fmast.fund_code, fcat.fed_fund_code, fmast.fund_id
438 FROM igf_aw_fund_mast_all fmast,
439 igf_aw_fund_cat fcat
440 WHERE fmast.fund_code = fcat.fund_code
441 AND fmast.fund_code = p_fund_code
442 AND fmast.ci_cal_type = g_ci_cal_type
443 AND fmast.ci_sequence_number = g_ci_sequence_number
444 AND discontinue_fund = 'N';
445
446 CURSOR c_1_more_pell_fws IS
447 SELECT 'X' present_in_award
448 FROM igf_aw_award_all
449 WHERE base_id = g_base_id
450 AND fund_id = g_fund_id;
451 c_1_more_pell_fws_rec c_1_more_pell_fws%ROWTYPE;
452
453 CURSOR c_get_fa_hold_spnsr IS
454 SELECT 'X' exist_hold
455 FROM igf_aw_li_hold_ints
456 WHERE person_number = li_awd_rec.person_number
457 AND award_number_txt = li_awd_rec.award_number_txt
458 AND ci_alternate_code = li_awd_rec.ci_alternate_code;
459 c_get_fa_hold_spnsr_rec c_get_fa_hold_spnsr%ROWTYPE;
460
461 CURSOR c_get_spnsr_amt IS
462 SELECT fmast.max_yearly_amt
463 FROM igf_aw_fund_mast_all fmast, igf_aw_fund_cat_all fcat
464 WHERE fmast.fund_id = g_fund_id
465 AND fcat.fed_fund_code = g_fed_fund_code
466 AND fmast.ci_cal_type = g_ci_cal_type
467 AND fmast.ci_sequence_number = g_ci_sequence_number
468 AND fmast.fund_code = fcat.fund_code
469 AND fmast.discontinue_fund = 'N';
470 c_get_spnsr_amt_rec c_get_spnsr_amt%ROWTYPE;
471
472 l_return_status_awd VARCHAR2(1);
473 l_status_open_awd_yr VARCHAR2(1);
474 l_return_status_db VARCHAR2(1);
475
476 CURSOR c_get_person_ssn IS
477 SELECT api.api_person_id, api.person_id_type, api.start_dt, api.end_dt
478 FROM igs_pe_alt_pers_id api,
479 igf_ap_fa_base_rec_all fabase,
480 igs_pe_person_id_typ pid
481 WHERE fabase.person_id = api.pe_person_id
482 AND fabase.base_id = g_base_id
483 AND api.person_id_Type = pid.person_id_type
484 AND pid.s_person_id_type = 'SSN'
485 AND SYSDATE BETWEEN api.start_Dt AND NVL(api.end_dt,SYSDATE);
486 c_get_person_ssn_rec c_get_person_ssn%ROWTYPE;
487
488 PROCEDURE validate_open_award_year (li_awd_rec IN igf_aw_li_awd_ints%ROWTYPE,
489 l_status_open_awd_yr OUT NOCOPY VARCHAR2) IS
490 /***************************************************************
491 Created By : nsidana
492 Date Created By : 11/28/2003
493 Purpose : Validates the open award year.
494 Known Limitations,Enhancements or Remarks
495 Change History :
496 Who When What
497 nsidana 11/28/2003 FA131 COD updates build. Added validations on two new feilds
498 added to the legacy awards table.
499 ***************************************************************/
500 CURSOR c_get_pay_isir IS
501 SELECT isir_id payment_isir_id
502 FROM igf_ap_isir_matched_all
503 WHERE base_id = g_base_id
504 AND system_record_type = 'ORIGINAL'
505 AND payment_isir = 'Y';
506
507 l_payment_isir_id igf_ap_isir_matched_all.isir_id%TYPE;
508
509 CURSOR c_get_fund_source IS
510 SELECT fund_source FROM igf_aw_fund_cat_all WHERE fund_code = li_awd_rec.fund_code;
511 l_fund_source igf_aw_fund_cat_all.fund_source%TYPE;
512
513 CURSOR c_get_fund_amt IS
514 SELECT NVL(remaining_amt,0) remaining_amt, NVL(max_award_amt,0) max_award_amt,
515 max_yearly_amt, max_life_amt
516 FROM igf_aw_fund_mast_all
517 WHERE fund_id = g_fund_id;
518 c_get_fund_amt_rec c_get_fund_amt%ROWTYPE;
519
520 CURSOR c_std_max_yr_amt IS
521 SELECT NVL(SUM(NVL(awd.accepted_amt,awd.offered_amt)), 0) yr_total
522 FROM igf_aw_award_all awd
523 WHERE awd.fund_id = g_fund_id
524 AND awd.base_id = g_base_id;
525 c_std_max_yr_amt_rec c_std_max_yr_amt%ROWTYPE;
526
527 CURSOR c_std_max_lf_count IS
528 SELECT NVL(SUM( NVL(awd.accepted_amt,awd.offered_amt)), 0) lf_total
529 FROM igf_aw_award_all awd, igf_aw_fund_mast_all fund, igf_ap_fa_base_rec_all fabase
530 WHERE fund.fund_code = g_fund_code
531 AND fabase.person_id = g_person_id
532 AND awd.base_id = fabase.base_id
533 AND awd.fund_id = fund.fund_id;
534 c_std_max_lf_count_rec c_std_max_lf_count%ROWTYPE;
535
536 CURSOR c_get_todo_items IS
537 SELECT MST.item_code, mst.todo_number
538 FROM igf_ap_td_item_mst mst, igf_aw_fund_td_map fund
539 WHERE fund.fund_id = g_fund_id
540 AND mst.todo_number = fund.item_sequence_number
541 AND fund.item_sequence_number NOT IN (SELECT item_sequence_number
542 FROM IGF_AP_TD_ITEM_INST
543 WHERE base_id = g_base_id);
544
545 -- nsidana 11/27/2003 FA131 COD updates build.
546 -- Get the details of transaction number for the base ID and the APP_TRANS_ID present in the interface table.
547 CURSOR c_get_trans_num(cp_base_id igf_ap_fa_base_rec_all.base_id%TYPE,cp_app_trans_num_txt VARCHAR2) IS
548 SELECT transaction_num
549 FROM
550 igf_ap_isir_matched
551 WHERE
552 BASE_ID=cp_base_id AND
553 transaction_num=cp_app_trans_num_txt;
554 l_trans_num NUMBER;
555
556 BEGIN -- begin of validate_open_award_year
557
558 l_status_open_awd_yr :='S';
559 l_payment_isir_id := NULL; l_fund_source := NULL; c_get_fund_amt_rec := NULL;
560
561 OPEN c_get_pay_isir; FETCH c_get_pay_isir INTO l_payment_isir_id; CLOSE c_get_pay_isir;
562 OPEN c_get_fund_source; FETCH c_get_fund_source INTO l_fund_source; CLOSE c_get_fund_source;
563 OPEN c_get_fund_amt; FETCH c_get_fund_amt INTO c_get_fund_amt_rec; CLOSE c_get_fund_amt;
564
565 IF(FND_LOG.LEVEL_STATEMENT >= g_debug_runtime_level)THEN
566 g_debug_string := 'Fund ID'||g_fund_id||', Payment Isir'||l_payment_isir_id||',Fund Source'||l_fund_source||
567 ',Remaining Amt'||c_get_fund_amt_rec.remaining_amt||',Max Award Amount'||
568 c_get_fund_amt_rec.max_Award_amt||',Max Yearly Amt'||c_get_fund_amt_rec.max_yearly_amt||
569 ',Max Life Amount'||c_get_fund_amt_rec.max_life_amt;
570 END IF;
571
572 -- check if the student is having a valid isir when the context fund is FEDERAL fund. student should have
573 -- valid active isir and payment isir
574 IF(l_payment_isir_id IS NULL AND l_fund_source IS NOT NULL AND l_fund_source = 'FEDERAL') THEN
575 l_status_open_awd_yr :='E';
576 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_ISIR_NOT_PRESENT');
577 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
578 END IF;
579
580 --<nsidana 11/27/2003 FA131 COD updates>
581 IF ((l_fund_source = 'FEDERAL') and (upper(li_awd_rec.fund_code)='PELL') AND (li_awd_rec.app_trans_num_txt IS NOT NULL))
582 THEN
583 OPEN c_get_trans_num(g_base_id,li_awd_rec.app_trans_num_txt);
584 FETCH c_get_trans_num INTO l_trans_num;
585 CLOSE c_get_trans_num;
586 IF (l_trans_num IS NULL)
587 THEN
588 l_return_value :='E';
589 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_NO_ISIR_TRANS'); -- New message to be entered.
590 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
591 END IF;
592 END IF;
593 --</nsidana 11/27/2003 FA131 COD>
594
595 -- if the award amount > fund remaining amount
596 IF(li_awd_rec.offered_amt > c_get_fund_amt_rec.remaining_amt)THEN
597 l_status_open_awd_yr :='E';
598 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_AMT_GT_REM_AMT');
599 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
600 END IF;
601
602 -- award amount greater than the fund max amount
603 --akomurav 5478287
604 --if the max_award_amt is null do not do this validation
605
606 IF(c_get_fund_amt_rec.max_award_amt <> 0 AND li_awd_rec.offered_amt > c_get_fund_amt_rec.max_award_amt) THEN
607 l_status_open_awd_yr :='E';
608 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_AMT_GT_MAX_AMT');
609 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
610 END IF;
611
612 -- sum of total year award amount and legacy award amount greater than the maximum year amount
613 -- defined at the fund
614 c_std_max_yr_amt_rec := NULL;
615 OPEN c_std_max_yr_amt; FETCH c_std_max_yr_amt INTO c_std_max_yr_amt_rec; CLOSE c_std_max_yr_amt;
616 IF(FND_LOG.LEVEL_STATEMENT >= g_debug_runtime_level)THEN
617 g_debug_string := g_debug_string ||'Year Total'||c_std_max_yr_amt_rec.yr_total;
618 END IF;
619 IF((c_get_fund_amt_rec.max_yearly_amt IS NOT NULL) AND
620 ((c_std_max_yr_amt_rec.yr_total + li_awd_rec.offered_amt) > c_get_fund_amt_rec.max_yearly_amt))THEN
621 l_status_open_awd_yr :='E';
622 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_AMT_GT_YR_AMT');
623 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
624 END IF;
625
626 -- sum of total life award amount and legacy award amount greater than the maximum life amount defined
627 -- at the fund
628 c_std_max_lf_count_rec := NULL;
629 OPEN c_std_max_lf_count; FETCH c_std_max_lf_count INTO c_std_max_lf_count_rec; CLOSE c_std_max_lf_count;
630 IF(FND_LOG.LEVEL_STATEMENT >= g_debug_runtime_level)THEN
631 g_debug_string := g_debug_string ||'Life Total'||c_std_max_lf_count_rec.lf_total;
632 END IF;
633 IF((c_get_fund_amt_rec.max_life_amt IS NOT NULL) AND
634 ((c_std_max_lf_count_rec.lf_total + li_awd_rec.offered_amt) > c_get_fund_amt_rec.max_life_amt))THEN
635 l_status_open_awd_yr :='E';
636 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_AMT_GT_LIFE_AMT');
637 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
638 END IF;
639 -- disbursement validation is present at the disbursement level. 'coz the disb intf record is not
640 -- yet processed
641
642 -- Check To Do's are present at the Fund level and the same To Do's are not assigned to FA Base
643 FOR c_get_todo_items_rec IN c_get_todo_items LOOP
644 IF(l_status_open_awd_yr <> 'E')THEN
645 l_status_open_awd_yr := 'W';
646 END IF;
647 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_TODO_NT_FND');
648 FND_MESSAGE.SET_TOKEN('TODO',c_get_todo_items_rec.item_code);
649 FND_MESSAGE.SET_TOKEN('FUND',g_fund_code);
650 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
651 END LOOP;
652
653 IF(FND_LOG.LEVEL_STATEMENT >= g_debug_runtime_level)THEN
654 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,'igf.plsql.igf_aw_li_import.validate_open_award_year.debug',g_debug_string);
655 g_debug_string := NULL;
656 END IF;
657 EXCEPTION WHEN OTHERS THEN
658 l_status_open_awd_yr :='E';
659 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
660 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
661 'igf.plsql.igf_aw_li_import.validate_open_award_year.exception',
662 SQLERRM );
663 END IF;
664 FND_MESSAGE.SET_NAME('IGF','IGF_GE_UNHANDLED_EXP');
665 FND_MESSAGE.SET_TOKEN('NAME','VALIDATE_OPEN_AWARD_YEAR : '||SQLERRM);
666 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
667 END validate_open_award_year;
668
669 /*
670 Created By : bvisvana
671 Created On : 24-May-2005
672 Purpose : Identifies whether the award attribute is changed or not.
673 Known limitations, enhancements or remarks :
674 Change History :
675 Who When What
676 -------------------------------------
677 -------------------------------------
678 (reverse chronological order - newest change first)
679 */
680
681 FUNCTION isChangeIn_AwardAttribute(p_award_atrr_code IN igf_aw_award_level_hist.award_attrib_code%TYPE)
682 RETURN BOOLEAN
683 AS
684 l_changed BOOLEAN := FALSE;
685 BEGIN
686 -- For offered amount change
687 IF (p_award_atrr_code = 'IGF_AW_AMOUNT_OFFERED') THEN
688 IF(NVL(g_old_award_rec.OFFERED_AMT,0) <> NVL(g_new_award_rec.OFFERED_AMT,0)) THEN
689 l_changed := TRUE;
690 END IF;
691 END IF;
692 -- For Accepted amount change
693 IF (p_award_atrr_code = 'IGF_AW_AMOUNT_ACCEPTED') THEN
694 IF (NVL(g_old_award_rec.ACCEPTED_AMT,0) <> NVL(g_new_award_rec.ACCEPTED_AMT,0)) THEN
695 l_changed := TRUE;
696 END IF;
697 END IF;
698 -- For Paid amount change
699 IF (p_award_atrr_code = 'IGF_AW_AMOUNT_PAID') THEN
700 IF (NVL(g_old_award_rec.PAID_AMT ,0) <> NVL(g_new_award_rec.PAID_AMT ,0)) THEN
701 l_changed := TRUE;
702 END IF;
703 END IF;
704 -- For Award Status change
705 IF (p_award_atrr_code = 'IGF_AW_AWARD_STATUS') THEN
706 IF (NVL(g_old_award_rec.AWARD_STATUS ,'*') <> NVL(g_new_award_rec.AWARD_STATUS,'*')) THEN
707 l_changed := TRUE;
708 END IF;
709 END IF;
710 -- For Award Distribution plan change
711 IF (p_award_atrr_code = 'IGF_AW_DIST_PLAN') THEN
712 IF (NVL(g_old_award_rec.ADPLANS_ID ,-1) <> NVL(g_new_award_rec.ADPLANS_ID,-1)) THEN
713 l_changed := TRUE;
714 END IF;
715 END IF;
716 -- For lock award change
717 IF (p_award_atrr_code = 'IGF_AW_LOCK_STATUS') THEN
718 IF (NVL(g_old_award_rec.LOCK_AWARD_FLAG ,'*') <> NVL(g_new_award_rec.LOCK_AWARD_FLAG,'*')) THEN
719 l_changed := TRUE;
720 END IF;
721 END IF;
722
723 RETURN l_changed;
724 END isChangeIn_AwardAttribute;
725
726 PROCEDURE create_new_award_hist_rec IS
727 /***************************************************************
728 Created By : bvisvana
729 Date Created By : 17-Oct-2005
730 Purpose : Bug # 4635941 - Since new award is created when runnig in update mode, there wud be some difference in
731 award attributes.This function will identify the differences in the old award (deleted) and new award (created).
732 For the difference in award attributes, it inserts a history record
733 Known Limitations,Enhancements or Remarks
734 Change History :
735 Who When What
736 ***************************************************************/
737 CURSOR c_lookup_attribute IS
738 SELECT lookup_code FROM igf_lookups_view
739 WHERE lookup_type = 'IGF_AW_AWARD_ATTRIBUTES';
740
741 l_award_hist_tran_id igf_aw_award_level_hist.award_hist_tran_id%TYPE;
742
743 l_award_atrr_code igf_aw_award_level_hist.award_attrib_code%TYPE;
744 l_awd_attr_changed BOOLEAN := FALSE;
745 l_row_id VARCHAR2(30) ;
746
747 BEGIN
748 -- Get the details of the newly created award
749 OPEN c_get_awd_details(cp_award_id => g_award_id);
750 FETCH c_get_awd_details INTO g_new_award_rec;
751 CLOSE c_get_awd_details;
752
753 IF g_old_award_rec.award_id IS NOT NULL AND g_new_award_rec.award_id IS NOT NULL THEN
754 -- Get the new transaction Id
755 SELECT igf_aw_award_level_hist_s.NEXTVAL INTO l_award_hist_tran_id from dual;
756 -- insert history record for the 6 attributes IF any change
757 l_row_id := null;
758 OPEN c_lookup_attribute;
759 LOOP
760 l_awd_attr_changed := FALSE;
761 FETCH c_lookup_attribute INTO l_award_atrr_code;
762 EXIT WHEN c_lookup_attribute%NOTFOUND;
763 l_awd_attr_changed := isChangeIn_AwardAttribute(l_award_atrr_code);
764 l_row_id := null;
765 /* If award attributes Change, then insert */
766 IF (l_awd_attr_changed) THEN
767 igf_aw_award_level_hist_pkg.insert_row
768 (
769 x_rowid => l_row_id,
770 x_award_id => g_new_award_rec.award_id,
771 x_award_hist_tran_id => l_award_hist_tran_id,
772 x_award_attrib_code => l_award_atrr_code,
773 x_award_change_source_code => 'CONCURRENT_PROCESS',
774 x_old_offered_amt => g_old_award_rec.offered_amt,
775 x_new_offered_amt => g_new_award_rec.offered_amt,
776 x_old_accepted_amt => g_old_award_rec.accepted_amt,
777 x_new_accepted_amt => g_new_award_rec.accepted_amt,
778 x_old_paid_amt => g_old_award_rec.paid_amt,
779 x_new_paid_amt => g_new_award_rec.paid_amt,
780 x_old_lock_award_flag => g_old_award_rec.lock_award_flag,
781 x_new_lock_award_flag => g_new_award_rec.lock_award_flag,
782 x_old_award_status_code => g_old_award_rec.award_status,
783 x_new_award_status_code => g_new_award_rec.award_status,
784 x_old_adplans_id => g_old_award_rec.adplans_id,
785 x_new_adplans_id => g_new_award_rec.adplans_id,
786 x_mode => 'R'
787 );
788 END IF;
789 END LOOP; -- End of Loop - 6 attribute comparison ends
790 CLOSE c_lookup_attribute;
791 END IF; -- End of records NOT NULL check
792
793 EXCEPTION
794 WHEN OTHERS THEN
795 fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
796 fnd_message.set_token('NAME','igf_aw_li_import.create_new_award_hist_rec' || SQLERRM);
797 igs_ge_msg_stack.add;
798 app_exception.raise_exception;
799 END create_new_award_hist_rec;
800
801 PROCEDURE maintain_old_award_hist_rec IS
802 /***************************************************************
803 Created By : bvisvana
804 Date Created By : 17-Oct-2005
805 Purpose : Bug # 4635941 - Maintains the Award History details of the deleted award and assigns
806 those to the newly created award (g_award_id)
807 Known Limitations,Enhancements or Remarks
808 Change History :
809 Who When What
810 ***************************************************************/
811 BEGIN
812 FOR i IN g_old_award_hist_col.FIRST..g_old_award_hist_col.LAST LOOP
813 INSERT INTO igf_aw_award_level_hist (
814 award_id,
815 award_hist_tran_id,
816 award_attrib_code,
817 award_change_source_code,
818 old_offered_amt,
819 new_offered_amt,
820 old_accepted_amt,
821 new_accepted_amt,
822 old_paid_amt,
823 new_paid_amt,
824 old_lock_award_flag,
825 new_lock_award_flag,
826 old_award_status_code,
827 new_award_status_code,
828 old_adplans_id,
829 new_adplans_id,
830 created_by,
831 creation_date,
832 last_updated_by,
833 last_update_date,
834 last_update_login,
835 request_id,
836 program_id,
837 program_application_id,
838 program_update_date
839 ) VALUES (
840 g_award_id,
841 g_old_award_hist_col(i).award_hist_tran_id,
842 g_old_award_hist_col(i).award_attrib_code,
843 g_old_award_hist_col(i).award_change_source_code,
844 g_old_award_hist_col(i).old_offered_amt,
845 g_old_award_hist_col(i).new_offered_amt,
846 g_old_award_hist_col(i).old_accepted_amt,
847 g_old_award_hist_col(i).new_accepted_amt,
848 g_old_award_hist_col(i).old_paid_amt,
849 g_old_award_hist_col(i).new_paid_amt,
850 g_old_award_hist_col(i).old_lock_award_flag,
851 g_old_award_hist_col(i).new_lock_award_flag,
852 g_old_award_hist_col(i).old_award_status_code,
853 g_old_award_hist_col(i).new_award_status_code,
854 g_old_award_hist_col(i).old_adplans_id,
855 g_old_award_hist_col(i).new_adplans_id,
856 g_old_award_hist_col(i).created_by,
857 g_old_award_hist_col(i).creation_date,
858 g_old_award_hist_col(i).last_updated_by,
859 g_old_award_hist_col(i).last_update_date,
860 g_old_award_hist_col(i).last_update_login,
861 g_old_award_hist_col(i).request_id,
862 g_old_award_hist_col(i).program_id,
863 g_old_award_hist_col(i).program_application_id,
864 g_old_award_hist_col(i).program_update_date
865 );
866 END LOOP;
867 END maintain_old_award_hist_rec;
868
869 PROCEDURE create_award_record(li_awd_rec IN igf_aw_li_awd_ints%ROWTYPE, l_awd_ins_status OUT NOCOPY VARCHAR2) IS
870 /***************************************************************
871 Created By : nsidana
872 Date Created By : 11/28/2003
873 Purpose : Created awards in the system.
874 Known Limitations,Enhancements or Remarks
875 Change History :
876 Who When What
877 ***************************************************************/
878 l_awd_rowid VARCHAR2(25);
879 l_alt_pell_schedule igf_aw_award_all.alt_pell_schedule%TYPE;
880
881 CURSOR c_visa (cv_person_id hz_parties.party_id%TYPE ) IS
882 SELECT a.visa_type,
883 a.visa_category,
884 a.visa_number,
885 a.visa_expiry_date,
886 b.visit_start_date entry_date
887 FROM igs_pe_visa a,
888 igs_pe_visit_histry b
889 WHERE a.person_id = cv_person_id
890 AND NVL(a.visa_expiry_date,SYSDATE) >= SYSDATE
891 AND a.visa_id = b.visa_id
892 ORDER BY a.visa_expiry_date DESC;
893
894 visa_rec c_visa%ROWTYPE;
895
896 CURSOR c_hzp (cv_person_id hz_parties.party_id%TYPE ) IS
897 SELECT person_first_name,
898 person_last_name,
899 address1,
900 address2,
901 address3,
902 address4,
903 city,
904 state,
905 province,
906 county,
907 country
908 FROM hz_parties
909 WHERE party_id = cv_person_id;
910
911 hzp_rec c_hzp%ROWTYPE;
912 l_warning VARCHAR2(200);
913
914 BEGIN --begin of create_award_record
915
916 l_awd_rowid := NULL; g_award_id:= NULL;
917 IF(li_awd_rec.alt_pell_schedule_type = 'Y')THEN
918 l_alt_pell_schedule := 'A';
919 ELSIF(li_awd_rec.alt_pell_schedule_type IS NULL)THEN
920 l_alt_pell_schedule := 'R';
921 END IF;
922 igf_aw_award_pkg.insert_row(
923 x_rowid => l_awd_rowid,
924 x_award_id => g_award_id,
925 x_fund_id => g_fund_id,
926 x_base_id => g_base_id,
927 x_offered_amt => li_awd_rec.offered_amt,
928 x_accepted_amt => li_awd_rec.accepted_amt,
929 x_paid_amt => NULL,
930 x_packaging_type => NULL,
931 x_batch_id => NULL,
932 x_manual_update => NULL,
933 x_rules_override => NULL,
934 x_award_date => li_awd_rec.award_date,
935 x_award_status => li_awd_rec.award_status_code,
936 x_attribute_category => NULL,
937 x_attribute1 => NULL,
938 x_attribute2 => NULL,
939 x_attribute3 => NULL,
940 x_attribute4 => NULL,
941 x_attribute5 => NULL,
942 x_attribute6 => NULL,
943 x_attribute7 => NULL,
944 x_attribute8 => NULL,
945 x_attribute9 => NULL,
946 x_attribute10 => NULL,
947 x_attribute11 => NULL,
948 x_attribute12 => NULL,
949 x_attribute13 => NULL,
950 x_attribute14 => NULL,
951 x_attribute15 => NULL,
952 x_attribute16 => NULL,
953 x_attribute17 => NULL,
954 x_attribute18 => NULL,
955 x_attribute19 => NULL,
956 x_attribute20 => NULL,
957 x_rvsn_id => NULL,
958 x_alt_pell_schedule => l_alt_pell_schedule,
959 x_award_number_txt => li_awd_rec.award_number_txt,
960 x_legacy_record_flag => 'Y',
961 x_adplans_id => NULL,
962 x_lock_award_flag => li_awd_rec.lock_award_flag,
963 x_app_trans_num_txt => li_awd_rec.app_trans_num_txt,
964 x_awd_proc_status_code => NULL,
965 x_notification_status_code => 'R',
966 x_notification_status_date => TRUNC(SYSDATE),
967 x_publish_in_ss_flag => li_awd_rec.publish_in_ss_flag
968 );
969 IF(l_awd_rowid IS NULL AND g_award_id IS NULL) THEN
970 l_awd_ins_status := 'E';
971 ELSE
972 l_awd_ins_status := 'S';
973 -- bvisvana - Bug # 4635941 - START
974 IF g_update_mode AND g_old_award_hist_col.COUNT > 0 THEN
975 -- Maintain / preserve the old award history if running in UPDATE MODE and if some history exists
976 maintain_old_award_hist_rec;
977 END IF;
978 -- While running in update mode, there wud be some changes and hence new award history should be inserted
979 IF g_update_mode THEN
980 create_new_award_hist_rec;
981 -- Clear the mode and history collection
982 g_update_mode := FALSE;
983 g_old_award_hist_col.DELETE;
984 END IF;
985 -- bvisvana - Bug # 4635941 - END
986 END IF;
987
988 IF(g_fed_fund_code = 'FWS' AND li_awd_rec.authorization_date IS NOT NULL
989 AND TRUNC(li_awd_rec.authorization_date) <= TRUNC(SYSDATE) AND l_awd_ins_status <> 'E')THEN
990 BEGIN
991 OPEN c_hzp (g_person_id);
992 FETCH c_hzp INTO hzp_rec;
993 CLOSE c_hzp;
994 OPEN c_visa (g_person_id);
995 FETCH c_visa INTO visa_rec;
996
997 IF c_visa%NOTFOUND AND (hzp_rec.country IS NOT NULL AND hzp_rec.country <> 'US') THEN
998 fnd_message.set_name('FND','FND_MBOX_WARN_CONSTANT');
999 l_warning := fnd_message.get;
1000 fnd_message.set_name('IGF','IGF_SE_INVALID_SETUP');
1001 fnd_message.set_token('PLACE','VISA');
1002 fnd_file.put_line( fnd_file.log,' -- '||l_warning ||' : '|| fnd_message.get);
1003 CLOSE c_visa;
1004 IF(l_awd_ins_status <> 'E')THEN
1005 l_awd_ins_status := 'W';
1006 END IF;
1007
1008 ELSE
1009 CLOSE c_visa;
1010 END IF;
1011
1012 igf_se_gen_001.send_work_auth(
1013 g_base_id,
1014 g_person_id,
1015 g_fund_id,
1016 g_award_id,
1017 NULL,
1018 NULL,
1019 'LEGACY',
1020 li_awd_rec.authorization_date
1021 );
1022
1023 EXCEPTION
1024 WHEN igf_se_gen_001.IGFSEGEN001 THEN
1025 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
1026 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION, 'igf.plsql.igf_aw_li_import.create_work_authorization.exception',SQLERRM);
1027 END IF;
1028 l_awd_ins_status := 'E';
1029 RETURN;
1030
1031 WHEN OTHERS THEN
1032 FND_MESSAGE.SET_NAME('IGF','IGF_GE_UNHANDLED_EXP');
1033 FND_MESSAGE.SET_TOKEN('NAME','CREATING WORK AUTHORIZATION : '||SQLERRM);
1034 FND_FILE.PUT_LINE(FND_FILE.LOG,RPAD(' ',3,' ')||'-- '||FND_MESSAGE.GET);
1035 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
1036 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION, 'igf.plsql.igf_aw_li_import.create_work_authorization.exception',SQLERRM);
1037 END IF;
1038 l_awd_ins_status := 'E';
1039 RETURN;
1040 END;
1041 END IF;
1042
1043 EXCEPTION WHEN OTHERS THEN
1044 l_awd_ins_status := 'E';
1045 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
1046 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
1047 'igf.plsql.igf_aw_li_import.create_award_record.exception',
1048 SQLERRM );
1049 END IF;
1050 FND_MESSAGE.SET_NAME('IGF','IGF_GE_UNHANDLED_EXP');
1051 FND_MESSAGE.SET_TOKEN('NAME','CREATE_AWARD_RECORD : '||SQLERRM);
1052 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1053 END create_award_record;
1054
1055 PROCEDURE delete_award_and_child_records(p_award_id IN igf_aw_award_all.award_id%TYPE) IS
1056 /***************************************************************
1057 Created By : nsidana
1058 Date Created By : 11/28/2003
1059 Purpose : deletes awards and child records.
1060 Known Limitations,Enhancements or Remarks
1061 Change History :
1062 Who When What
1063 bvisvana 17-Oct-2005 Bug # 4635941 - Capturing the award history before deleting the award
1064 Capturing the award details before deleting the award
1065 ***************************************************************/
1066 CURSOR c_get_awd_row IS
1067 SELECT ROWID row_id
1068 FROM igf_aw_award_all
1069 WHERE award_id = p_award_id;
1070
1071 -- bvisvana - Bug # 4635941 - Added new cursors
1072 CURSOR c_get_awd_hist IS
1073 SELECT ROWID row_id
1074 FROM igf_aw_award_level_hist
1075 WHERE award_id = p_award_id;
1076
1077 CURSOR c_get_awd_hist_details IS
1078 SELECT * FROM igf_aw_award_level_hist
1079 WHERE award_id = p_award_id;
1080 c_award_hist_rec c_get_awd_hist_details%ROWTYPE;
1081
1082 CURSOR c_get_disb_row IS
1083 SELECT ROWID row_id, auth_id
1084 FROM igf_aw_awd_disb_all
1085 WHERE award_id = p_award_id;
1086
1087 CURSOR c_get_disb_dtl_row IS
1088 SELECT ROWID row_id
1089 FROM igf_db_awd_disb_dtl_all
1090 WHERE award_id = p_award_id;
1091
1092 CURSOR c_get_disb_holds_row IS
1093 SELECT ROWID row_id
1094 FROM igf_db_disb_holds_all
1095 WHERE award_id = p_award_id;
1096
1097 CURSOR c_get_auth_row (cp_auth_id igf_se_auth.auth_id%TYPE) IS
1098 SELECT ROWID row_id
1099 FROM igf_se_auth
1100 WHERE auth_id = cp_auth_id;
1101
1102 CURSOR c_get_disb_chg_dtls_row (p_award_id igf_aw_award_all.award_id%TYPE) IS
1103 SELECT ROWID row_id
1104 FROM igf_aw_db_chg_dtls
1105 WHERE award_id = p_award_id;
1106
1107 CURSOR c_get_cod_dtl_row (p_award_id igf_aw_award_all.award_id%TYPE) IS
1108 SELECT ROWID row_id
1109 FROM igf_aw_db_cod_dtls
1110 WHERE award_id = p_award_id;
1111
1112
1113 BEGIN --begin of delete_award_and_child_records
1114
1115 -- bvisvana - Bug # 4635941 - START
1116 -- While deleting the award, collect details of the award and also its history.
1117 g_hist_cnt := 0;
1118 OPEN c_get_awd_details(cp_award_id => p_award_id);
1119 FETCH c_get_awd_details INTO g_old_award_rec;
1120 CLOSE c_get_awd_details;
1121
1122 OPEN c_get_awd_hist_details;
1123 LOOP
1124 FETCH c_get_awd_hist_details INTO c_award_hist_rec;
1125 EXIT WHEN c_get_awd_hist_details%NOTFOUND;
1126 g_hist_cnt := g_hist_cnt + 1;
1127 g_old_award_hist_col(g_hist_cnt).award_id := c_award_hist_rec.award_id;
1128 g_old_award_hist_col(g_hist_cnt).award_hist_tran_id := c_award_hist_rec.award_hist_tran_id;
1129 g_old_award_hist_col(g_hist_cnt).award_attrib_code := c_award_hist_rec.award_attrib_code;
1130 g_old_award_hist_col(g_hist_cnt).award_change_source_code := c_award_hist_rec.award_change_source_code;
1131 g_old_award_hist_col(g_hist_cnt).old_offered_amt := c_award_hist_rec.old_offered_amt;
1132 g_old_award_hist_col(g_hist_cnt).new_offered_amt := c_award_hist_rec.new_offered_amt;
1133 g_old_award_hist_col(g_hist_cnt).old_accepted_amt := c_award_hist_rec.old_accepted_amt;
1134 g_old_award_hist_col(g_hist_cnt).new_accepted_amt := c_award_hist_rec.new_accepted_amt;
1135 g_old_award_hist_col(g_hist_cnt).old_paid_amt := c_award_hist_rec.old_paid_amt;
1136 g_old_award_hist_col(g_hist_cnt).new_paid_amt := c_award_hist_rec.new_paid_amt;
1137 g_old_award_hist_col(g_hist_cnt).old_lock_award_flag := c_award_hist_rec.old_lock_award_flag;
1138 g_old_award_hist_col(g_hist_cnt).new_lock_award_flag := c_award_hist_rec.new_lock_award_flag;
1139 g_old_award_hist_col(g_hist_cnt).old_award_status_code := c_award_hist_rec.old_award_status_code;
1140 g_old_award_hist_col(g_hist_cnt).new_award_status_code := c_award_hist_rec.new_award_status_code;
1141 g_old_award_hist_col(g_hist_cnt).old_adplans_id := c_award_hist_rec.old_adplans_id;
1142 g_old_award_hist_col(g_hist_cnt).new_adplans_id := c_award_hist_rec.new_adplans_id;
1143 g_old_award_hist_col(g_hist_cnt).created_by := c_award_hist_rec.created_by;
1144 g_old_award_hist_col(g_hist_cnt).creation_date := c_award_hist_rec.creation_date;
1145 g_old_award_hist_col(g_hist_cnt).last_updated_by := c_award_hist_rec.last_updated_by;
1146 g_old_award_hist_col(g_hist_cnt).last_update_date := c_award_hist_rec.last_update_date;
1147 g_old_award_hist_col(g_hist_cnt).last_update_login := c_award_hist_rec.last_update_login;
1148 g_old_award_hist_col(g_hist_cnt).request_id := c_award_hist_rec.request_id;
1149 g_old_award_hist_col(g_hist_cnt).program_application_id := c_award_hist_rec.program_application_id;
1150 g_old_award_hist_col(g_hist_cnt).program_id := c_award_hist_rec.program_id;
1151 g_old_award_hist_col(g_hist_cnt).program_update_date := c_award_hist_rec.program_update_date;
1152 END LOOP;
1153 CLOSE c_get_awd_hist_details;
1154 -- bvisvana - Bug # 4635941 - END
1155
1156 -- while deleting the record in IGF_AW_AWD_DISB_ALL delete also from IGF_AW_DB_CHG_DTLS
1157
1158 FOR c_get_disb_dtl_row_rec IN c_get_disb_dtl_row LOOP
1159 igf_db_awd_disb_dtl_pkg.delete_row(c_get_disb_dtl_row_rec.row_id);
1160 END LOOP;
1161
1162 FOR c_get_cod_dtl_row_rec IN c_get_cod_dtl_row (p_award_id) LOOP
1163 igf_aw_db_cod_dtls_pkg.delete_row(c_get_cod_dtl_row_rec.row_id);
1164 END LOOP;
1165
1166 FOR c_get_disb_chg_dtls_row_rec IN c_get_disb_chg_dtls_row(p_award_id) LOOP
1167 igf_aw_db_chg_dtls_pkg.delete_row(c_get_disb_chg_dtls_row_rec.row_id);
1168 END LOOP;
1169
1170 FOR c_get_disb_holds_row_rec IN c_get_disb_holds_row LOOP
1171 igf_db_disb_holds_pkg.delete_row(c_get_disb_holds_row_rec.row_id);
1172 END LOOP;
1173
1174 FOR c_get_disb_row_rec IN c_get_disb_row LOOP
1175 -- Delete the authorization record for the corresponsing Disb
1176 IF c_get_disb_row_rec.auth_id IS NOT NULL THEN
1177 FOR c_get_auth_row_rec IN c_get_auth_row(c_get_disb_row_rec.auth_id) LOOP
1178 igf_se_auth_pkg.delete_row(c_get_auth_row_rec.row_id);
1179 END LOOP;
1180 END IF;
1181 igf_aw_awd_disb_pkg.delete_row(c_get_disb_row_rec.row_id);
1182 END LOOP;
1183
1184 -- bvisvana - Bug # 4635941 - Delete the Award History
1185 FOR award_hist_rec IN c_get_awd_hist LOOP
1186 igf_aw_award_level_hist_pkg.delete_row(award_hist_rec.row_id);
1187 END LOOP;
1188
1189 FOR c_get_awd_row_rec IN c_get_awd_row LOOP
1190 igf_aw_award_pkg.delete_row(c_get_awd_row_rec.row_id);
1191 END LOOP;
1192
1193 END delete_award_and_child_records;
1194
1195 PROCEDURE upd_aw_rec_with_legacy_status(p_award_id IN igf_aw_award_all.award_id%TYPE) IS
1196 /***************************************************************
1197 Created By : nsidana
1198 Date Created By : 11/28/2003
1199 Purpose : updates awards records with legacy status.
1200 Known Limitations,Enhancements or Remarks
1201 Change History :
1202 Who When What
1203 ***************************************************************/
1204 CURSOR c_get_award IS
1205 SELECT ROWID row_id,awd.*
1206 FROM igf_aw_award_all awd
1207 WHERE award_id = p_award_id;
1208 c_get_award_rec c_get_award%ROWTYPE;
1209 BEGIN --begin of upd_aw_rec_with_legacy_status
1210
1211 OPEN c_get_award; FETCH c_get_award INTO c_get_award_rec; CLOSE c_get_award;
1212 igf_aw_award_pkg.update_row (
1213 x_rowid => c_get_award_rec.row_id,
1214 x_award_id => c_get_award_rec.award_id,
1215 x_fund_id => c_get_award_rec.fund_id,
1216 x_base_id => c_get_award_rec.base_id,
1217 x_offered_amt => c_get_award_rec.offered_amt,
1218 x_accepted_amt => c_get_award_rec.accepted_amt,
1219 x_paid_amt => c_get_award_rec.paid_amt,
1220 x_packaging_type => c_get_award_rec.packaging_type,
1221 x_batch_id => c_get_award_rec.batch_id,
1222 x_manual_update => c_get_award_rec.manual_update,
1223 x_rules_override => c_get_award_rec.rules_override,
1224 x_award_date => c_get_award_rec.award_date,
1225 x_award_status => c_get_award_rec.award_status,
1226 x_attribute_category => c_get_award_rec.attribute_category,
1227 x_attribute1 => c_get_award_rec.attribute1,
1228 x_attribute2 => c_get_award_rec.attribute2,
1229 x_attribute3 => c_get_award_rec.attribute3,
1230 x_attribute4 => c_get_award_rec.attribute4,
1231 x_attribute5 => c_get_award_rec.attribute5,
1232 x_attribute6 => c_get_award_rec.attribute6,
1233 x_attribute7 => c_get_award_rec.attribute7,
1234 x_attribute8 => c_get_award_rec.attribute8,
1235 x_attribute9 => c_get_award_rec.attribute9,
1236 x_attribute10 => c_get_award_rec.attribute10,
1237 x_attribute11 => c_get_award_rec.attribute11,
1238 x_attribute12 => c_get_award_rec.attribute12,
1239 x_attribute13 => c_get_award_rec.attribute13,
1240 x_attribute14 => c_get_award_rec.attribute14,
1241 x_attribute15 => c_get_award_rec.attribute15,
1242 x_attribute16 => c_get_award_rec.attribute16,
1243 x_attribute17 => c_get_award_rec.attribute17,
1244 x_attribute18 => c_get_award_rec.attribute18,
1245 x_attribute19 => c_get_award_rec.attribute19,
1246 x_attribute20 => c_get_award_rec.attribute20,
1247 x_rvsn_id => c_get_award_rec.rvsn_id,
1248 x_alt_pell_schedule => c_get_award_rec.alt_pell_schedule,
1249 x_award_number_txt => c_get_award_rec.award_number_txt,
1250 x_legacy_record_flag => 'Y', -- this is required as the award record is modified to have legacy as N by other processes
1251 x_adplans_id => c_get_award_rec.adplans_id,
1252 x_app_trans_num_txt => c_get_award_rec.app_trans_num_txt,
1253 x_lock_award_flag => c_get_award_rec.lock_award_flag,
1254 x_awd_proc_status_code => c_get_award_rec.awd_proc_status_code,
1255 x_notification_status_code => c_get_award_rec.notification_status_code,
1256 x_notification_status_date => c_get_award_rec.notification_status_date,
1257 x_publish_in_ss_flag => c_get_award_rec.publish_in_ss_flag
1258 );
1259
1260 END upd_aw_rec_with_legacy_status;
1261
1262 BEGIN -- begin of validate_awdyear_int_rec
1263
1264 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
1265 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION, 'igf.plsql.igf_aw_li_import.validate_awdyear_int_rec.debug','start' );
1266 END IF;
1267
1268 -- initialize the return statuses, assuming all the validations are successful.
1269 l_return_value :='S'; l_status_open_awd_yr :='S'; l_return_status_db := 'S';
1270 -- initialize applicable global variables here.
1271 g_base_id := NULL; g_fund_code := NULL; g_fed_fund_code := NULL; g_fund_id := NULL;
1272 g_processing_string := igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','PROCESSING') || ' '||
1273 igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','AWARD_NUMBER')|| ' : '
1274 || li_awd_rec.award_number_txt ||' '||
1275 igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','FUND_CODE')
1276 || ' : '|| li_awd_rec.fund_code;
1277 FND_FILE.PUT_LINE(FND_FILE.LOG,g_processing_string);
1278
1279 IF(li_awd_rec.import_record_type = 'U' OR li_awd_rec.import_record_type IS NULL) THEN
1280 g_base_id := get_base_id_from_per_num(li_awd_rec.person_number, g_ci_cal_type, g_ci_sequence_number);
1281
1282 IF(g_base_id IS NOT NULL AND g_base_id <> -1) THEN
1283 l_award_id := NULL; l_legacy_record_flag := NULL;
1284 OPEN cur_check_sys_awd(g_base_id); FETCH cur_check_sys_awd INTO l_award_id, l_legacy_record_flag;
1285 IF(li_awd_rec.import_record_type = 'U' AND cur_check_sys_awd%NOTFOUND) THEN
1286 CLOSE cur_check_sys_awd;
1287 l_return_value :='E';
1288 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_UPD_FAIL_LINOT_FND');
1289 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1290 RETURN;
1291 ELSIF(li_awd_rec.import_record_type IS NULL AND cur_check_sys_awd%FOUND) THEN
1292 CLOSE cur_check_sys_awd;
1293 l_return_value :='E';
1294 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_AWD_ALREADY_PRSNT');
1295 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1296 RETURN;
1297 ELSIF((li_awd_rec.import_record_type = 'U' AND cur_check_sys_awd%FOUND) OR
1298 (li_awd_rec.import_record_type IS NULL AND cur_check_sys_awd%NOTFOUND)
1299 ) THEN
1300 CLOSE cur_check_sys_awd;
1301
1302 -- validate all the fields in the interface table. do not return unless all the fields are validated
1303
1304
1305 -- first validate if the award year status code is valid
1306 IF(li_awd_rec.award_status_code IN ('E_ACCEPTED','E_OFFERED','REVISED','SIMULATED','STOPPED')
1307 OR igf_ap_gen.get_aw_lookup_meaning('IGF_AWARD_STATUS',li_awd_rec.award_status_code, g_sys_award_year) IS NULL)THEN
1308 l_return_value :='E';
1309 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_INVALID_AWD_STATUS');
1310 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1311 END IF;
1312
1313 -- second, validate if the fund code in the interface table matches with that of the fund master
1314
1315 g_fund_code := NULL; g_fed_fund_code := NULL; g_fund_id := NULL;
1316 OPEN cur_get_fund_code(li_awd_rec.fund_code); FETCH cur_get_fund_code INTO g_fund_code, g_fed_fund_code, g_fund_id; CLOSE cur_get_fund_code;
1317 IF(FND_LOG.LEVEL_STATEMENT >= g_debug_runtime_level)THEN
1318 g_debug_string := g_debug_string || 'Fund Code'||g_fund_code||'Fed Fund Code'||g_fed_fund_code||'Fund Id'||g_fund_id;
1319 END IF;
1320 IF(g_fund_code IS NULL OR g_fund_id IS NULL)THEN
1321
1322 l_return_value :='E';
1323 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_FUND_CODE_NOT_FND');
1324 FND_MESSAGE.SET_TOKEN('FUND_CODE',li_awd_rec.fund_code);
1325 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1326 ELSE
1327
1328 SAVEPOINT st_def_del_award_records;
1329 -- delete production records only if legacy record is present in the system with legacy_record_flag = Y
1330 IF(l_award_id IS NOT NULL)THEN
1331 IF(NVL(l_legacy_record_flag,'N') = 'Y')THEN
1332
1333 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
1334 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION, 'igf.plsql.igf_aw_li_import.validate_awdyear_int_rec.debug','calling DELETE with award id' || l_award_id );
1335 END IF;
1336 g_update_mode := TRUE; -- bvisvana - Bug # 4635941 - To track the update mode
1337 delete_award_and_child_records(l_award_id);
1338
1339 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
1340 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION, 'igf.plsql.igf_aw_li_import.validate_awdyear_int_rec.debug','deleted records with award id' || l_award_id );
1341 END IF;
1342 ELSE
1343 l_return_value :='E';
1344 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_UPD_FAILED_NOT_LI'); --sjalasut, should this message b changed ?
1345 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1346 RETURN;
1347 END IF;
1348 END IF;
1349
1350 -- second, variant one. introduced in FACR117. Sponsorships cannot be imported for open award year.
1351 -- no further validations are required on this award if its a sponsorship and the award year is open
1352 IF(g_fed_fund_code = 'SPNSR' AND g_award_year_status_code = 'O')THEN
1353 l_return_value :='E';
1354 FND_MESSAGE.SET_NAME('IGF','IGF_SP_LI_NOT_IMP_4OPEN_AWDYR');
1355 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1356 RETURN;
1357 END IF;
1358
1359 --
1360 -- External Awards Import can only import EXT funds
1361 --
1362 IF g_entry_point = 'EXTERNAL' AND g_fed_fund_code <> 'EXT' THEN
1363 l_return_value :='E';
1364 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_FUND_CODE_FAIL');
1365 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1366 RETURN;
1367 END IF;
1368
1369 -- variant two. If the sponsorship has financial aid hold information, error out and do not proceed further with
1370 -- this award.
1371 IF(g_fed_fund_code = 'SPNSR')THEN
1372 c_get_fa_hold_spnsr_rec := NULL;
1373 OPEN c_get_fa_hold_spnsr;FETCH c_get_fa_hold_spnsr INTO c_get_fa_hold_spnsr_rec; CLOSE c_get_fa_hold_spnsr;
1374 IF(c_get_fa_hold_spnsr_rec.exist_hold IS NOT NULL)THEN
1375 l_return_value :='E';
1376 FND_MESSAGE.SET_NAME('IGF','IGF_SP_LI_HOLD_PRSNT');
1377 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1378 RETURN;
1379 END IF;
1380 -- for sponsorship awards, award status should always be accepted.
1381 IF(li_awd_rec.award_status_code <> 'ACCEPTED')THEN
1382 l_return_value :='E';
1383 FND_MESSAGE.SET_NAME('IGF','IGF_SP_LI_AWD_ACPT');
1384 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1385 END IF;
1386 END IF;
1387
1388 -- variant three. a student can have only one FWS award in an award year. this check should be done here to
1389 -- save further porcessing time.
1390 IF g_fed_fund_code = 'FWS' THEN
1391 -- Authorization Date should be NULL if the context award status is Offered.
1392 IF(li_awd_rec.award_status_code = 'OFFERED' AND li_awd_rec.authorization_date IS NOT NULL)THEN
1393 l_return_value := 'E';
1394 FND_MESSAGE.SET_NAME('IGF','IGF_SE_LI_AUTH_DT_BLNK_OFFRD');
1395 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1396 END IF;
1397
1398 -- Authorization Date should not be greater than sysdate
1399 IF(li_awd_rec.authorization_date IS NOT NULL AND TRUNC(li_awd_rec.authorization_date) > TRUNC(SYSDATE))THEN
1400 l_return_value := 'E';
1401 FND_MESSAGE.SET_NAME('IGF','IGF_SE_LI_DATE_GT_SYSDATE');
1402 FND_MESSAGE.SET_TOKEN('DATE','AUTHORIZATION_DATE');
1403 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1404 END IF;
1405
1406 -- SSN is mandatory for Federal Work Study Funds
1407 c_get_person_ssn_rec := NULL;
1408 OPEN c_get_person_ssn; FETCH c_get_person_ssn INTO c_get_person_ssn_rec; CLOSE c_get_person_ssn;
1409 IF(c_get_person_ssn_rec.api_person_id IS NULL)THEN
1410 l_return_value := 'E';
1411 FND_MESSAGE.SET_NAME('IGF', 'IGF_SE_LI_SSN_NOT_PRSNT');
1412 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1413 END IF;
1414 ELSE
1415
1416 -- authorization date should be blank for all the funds except Federal Work Study
1417 IF(li_awd_rec.authorization_date IS NOT NULL)THEN
1418 l_return_value := 'E';
1419 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_AWD_COL_BLNK');
1420 FND_MESSAGE.SET_TOKEN('COLUMN_NAME','AUTHORIZATION_DATE');
1421 FND_MESSAGE.SET_TOKEN('FUND_CODE',li_awd_rec.fund_code);
1422 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1423 END IF;
1424 END IF;
1425
1426 -- third, check if the offered amount > 0
1427 IF(li_awd_rec.offered_amt <= 0)THEN
1428 l_return_value :='E';
1429 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_AWD_OFRD_AMT_GT_0');
1430 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1431 ELSE -- interface offered amount should not match with the total sponsor amt for sponsorships.
1432 -- validation introduced in FACR117
1433
1434 IF(g_fed_fund_code = 'SPNSR')THEN
1435 c_get_spnsr_amt_rec := NULL;
1436 OPEN c_get_spnsr_amt; FETCH c_get_spnsr_amt INTO c_get_spnsr_amt_rec; CLOSE c_get_spnsr_amt;
1437 IF(c_get_spnsr_amt_rec.max_yearly_amt IS NOT NULL AND li_awd_rec.offered_amt <> c_get_spnsr_amt_rec.max_yearly_amt) THEN
1438 IF(l_return_value <> 'E')THEN
1439 l_return_value := 'W';
1440 END IF;
1441 FND_MESSAGE.SET_NAME('IGF','IGF_SP_LI_TOTAL_AMT_MISMTCH');
1442 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1443 END IF;
1444 END IF;
1445 END IF;
1446
1447 -- fourth, if the award status is accepted then
1448 IF(li_awd_rec.award_status_code = 'ACCEPTED')THEN
1449 IF(li_awd_rec.accepted_amt IS NULL OR li_awd_rec.accepted_amt <= 0)THEN
1450 l_return_value :='E';
1451 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_ACPT_AMT_GT_0_ACPT');
1452 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1453 END IF;
1454 IF(li_awd_rec.accepted_amt IS NOT NULL AND li_awd_rec.accepted_amt > li_awd_rec.offered_amt)THEN
1455 l_return_value :='E';
1456 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_ACPT_AMT_GT_OFRD_AMT');
1457 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1458 END IF;
1459 -- for sponsorships, the accepted amount and the offered amount should be equal.
1460 IF(li_awd_rec.accepted_amt IS NOT NULL AND g_fed_fund_code = 'SPNSR' AND li_awd_rec.accepted_amt <> li_awd_rec.offered_amt)THEN
1461 l_return_value :='E';
1462 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_EQ_ACPT_OFRD_AMT');
1463 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1464 END IF;
1465 ELSIF(li_awd_rec.award_status_code IN ('OFFERED','CANCELLED','DECLINED'))THEN
1466 --bug #3701698
1467 IF (li_awd_rec.award_status_code = 'CANCELLED' AND
1468 ( li_awd_rec.accepted_amt IS NULL OR li_awd_rec.accepted_amt <> 0 )
1469 ) THEN
1470 l_return_value :='E';
1471 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_ACPT_AMT_AWD_CNCL');
1472 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1473
1474 ELSIF(li_awd_rec.accepted_amt < 0)THEN
1475 l_return_value :='E';
1476 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_ACPT_AMT_NEG');
1477 FND_MESSAGE.SET_TOKEN('AWD_STATUS', li_awd_rec.award_status_code);
1478 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1479 END IF;
1480 END IF;
1481
1482 -- fifth, validate Pell Alternate Schedule indicator. for this we have to validate if the fund code is
1483 -- mapped to PELL fed fund code
1484 IF(g_fed_fund_code = 'PELL')THEN
1485 IF(li_awd_rec.alt_pell_schedule_type IS NOT NULL AND li_awd_rec.alt_pell_schedule_type <> 'Y') THEN
1486 l_return_value :='E';
1487 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_INVLD_PELL_ALT_CD');
1488 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1489 END IF;
1490 IF(li_awd_rec.import_record_type IS NULL)THEN
1491 -- student can have only one PELL fund code in the given award year. check if this guy has a PELL already
1492 -- since the interface record is marked for insert. the same curosor is used for FWS also, hence the name.
1493 c_1_more_pell_fws_rec := NULL;
1494 OPEN c_1_more_pell_fws; FETCH c_1_more_pell_fws INTO c_1_more_pell_fws_rec; CLOSE c_1_more_pell_fws;
1495 IF(c_1_more_pell_fws_rec.present_in_award IS NOT NULL)THEN
1496 l_return_value :='E';
1497 FND_MESSAGE.SET_NAME('IGF','IGF_AW_MORE_PELL_AWD');
1498 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1499 END IF;
1500 END IF;
1501 ELSE -- for all awards other than Pell, the pell alternate schedule type should be null
1502 IF(li_awd_rec.alt_pell_schedule_type IS NOT NULL) THEN
1503 l_return_value :='E';
1504 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_PELL_ALT_IND_BLNK');
1505 FND_MESSAGE.SET_TOKEN('FUND_CODE',li_awd_rec.fund_code);
1506 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1507 END IF;
1508 END IF;
1509 IF(FND_LOG.LEVEL_STATEMENT >= g_debug_runtime_level)THEN
1510 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, 'igf.plsql.igf_aw_li_import.validate_awdyear_int_rec.debug', g_debug_string);
1511 g_debug_string := NULL;
1512 END IF;
1513
1514 -- <nsidana 11/27/2003 FA131 COD updates build>
1515 -- Adding a check to see that the new col lock_award has only valid values i.e 'Y' or null.
1516 IF (li_awd_rec.lock_award_flag IS NOT NULL) THEN
1517 IF li_awd_rec.lock_award_flag NOT IN ('Y','N') THEN
1518 l_return_value :='E';
1519 fnd_message.set_name('IGF','IGF_AW_LI_INVD_LOCK_AWD_VAL');
1520 fnd_file.put_line(fnd_file.log,fnd_message.get);
1521 END IF;
1522 ELSE
1523 li_awd_rec.lock_award_flag := 'N';
1524 END IF;
1525
1526 -- </nsidana 11/27/2003 FA131 COD updates.>
1527
1528 IF li_awd_rec.publish_in_ss_flag IS NULL OR li_awd_rec.publish_in_ss_flag NOT IN ('Y','N') THEN
1529 l_return_value := 'E';
1530 fnd_message.set_name('IGF','IGF_AP_INV_FLD_VAL');
1531 fnd_message.set_token('FIELD','PUBLISH_IN_SS_FLAG');
1532 fnd_file.put_line(fnd_file.log,fnd_message.get);
1533 END IF;
1534 -- sixth, if the context award year is open and the return status is not E then perform open year validations
1535 IF(l_return_value IN ('S','W') AND g_award_year_status_code = 'O')THEN
1536
1537 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
1538 fnd_log.string(fnd_log.level_exception, 'igf.plsql.igf_aw_li_import.validate_awdyear_int_rec.debug','calling validate open awd' );
1539 END IF;
1540
1541 validate_open_award_year(li_awd_rec, l_status_open_awd_yr);
1542
1543 END IF;
1544 IF(l_return_value IN ('S','W') AND l_status_open_awd_yr IN ('S','W')) THEN
1545 BEGIN
1546
1547 -- insert into awards table
1548 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
1549 fnd_log.string(fnd_log.level_exception, 'igf.plsql.igf_aw_li_import.validate_awdyear_int_rec.debug','calling create awd rec' );
1550 END IF;
1551
1552 create_award_record(li_awd_rec, l_return_status_awd);
1553
1554 IF(l_return_status_awd = 'E')THEN
1555 l_return_value := 'E';
1556 ROLLBACK TO st_def_del_award_records;
1557 RETURN;
1558 END IF;
1559
1560 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
1561 fnd_log.string(fnd_log.level_exception, 'igf.plsql.igf_aw_li_import.validate_awdyear_int_rec.debug','calling validate_disb_int_rec' );
1562 END IF;
1563
1564 validate_disburs_int_rec(li_awd_rec, l_return_status_db);
1565
1566 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
1567 fnd_log.string(fnd_log.level_exception, 'igf.plsql.igf_aw_li_import.validate_awdyear_int_rec.debug','status returned = ' || l_return_status_db );
1568 END IF;
1569
1570 IF(l_return_status_db = 'E') THEN
1571 l_return_value := 'E';
1572 ROLLBACK TO st_def_del_award_records;
1573 RETURN;
1574 ELSE
1575
1576 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
1577 fnd_log.string(fnd_log.level_exception, 'igf.plsql.igf_aw_li_import.validate_awdyear_int_rec.debug','upd_awd_with_leg_stat' );
1578 END IF;
1579
1580 upd_aw_rec_with_legacy_status(g_award_id);
1581
1582 END IF;
1583 -- OR condition because the open award valiations are in the disbursement validation proc also
1584 IF(l_status_open_awd_yr = 'W' OR l_return_status_db = 'W')THEN
1585 l_return_value := 'W';
1586 ELSE
1587 l_return_value := 'S';
1588 END IF;
1589 EXCEPTION WHEN OTHERS THEN
1590
1591 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
1592 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
1593 'igf.plsql.igf_aw_li_import.create_award_validate_disb_section.exception',
1594 SQLERRM);
1595 END IF;
1596 ROLLBACK TO st_def_del_award_records;
1597 l_return_value := 'E';
1598 RETURN;
1599 END;
1600 ELSE
1601 ROLLBACK TO st_def_del_award_records;
1602 l_return_value:='E';
1603 RETURN;
1604 END IF; -- return status of l_return_value and l_status_open_awd_yr
1605 END IF; -- for fund_code is null or fund_id is null
1606 END IF; --end if of check import record type and sys award year found
1607 END IF; -- end if of base_id <> -1
1608 ELSE
1609 l_return_value :='E';
1610 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_INVLD_IMP_REC_TY');
1611 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1612 RETURN;
1613 END IF;
1614 EXCEPTION WHEN OTHERS THEN
1615 ROLLBACK TO st_def_del_award_records;
1616 l_return_value :='E';
1617 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
1618 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
1619 'igf.plsql.igf_aw_li_import.validate_awdyear_int_rec.exception',
1620 SQLERRM);
1621 END IF;
1622 FND_MESSAGE.SET_NAME('IGF','IGF_GE_UNHANDLED_EXP');
1623 FND_MESSAGE.SET_TOKEN('NAME','VALIDATE_AWDYEAR_INT_REC : '||SQLERRM);
1624 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
1625 END validate_awdyear_int_rec;
1626
1627
1628 PROCEDURE validate_disburs_int_rec(li_awd_rec IN igf_aw_li_awd_ints%ROWTYPE,
1629 p_return_status OUT NOCOPY VARCHAR2
1630 ) IS
1631
1632 /***************************************************************
1633 Created By : nsidana
1634 Date Created By : 11/28/2003
1635 Purpose : Validates legacy award disbursements interface record.
1636 Known Limitations,Enhancements or Remarks
1637 Change History :
1638 Who When What
1639 nsidana 11/28/2003 FA131 COD updates build. Added validations on 1 feild in the
1640 legacy award disbursements table.
1641 ***************************************************************/
1642 CURSOR cur_legacy_disb_int IS
1643 SELECT
1644 trim(disbint.ci_alternate_code) ci_alternate_code,
1645 trim(disbint.person_number) person_number,
1646 trim(disbint.award_number_txt) award_number_txt,
1647 disbint.disbursement_num,
1648 trim(disbint.ld_alternate_code) ld_alternate_code,
1649 trim(disbint.tp_alternate_code) tp_alternate_code,
1650 disbint.offered_amt,
1651 disbint.accepted_amt,
1652 disbint.fee_1_amt,
1653 disbint.fee_2_amt,
1654 disbint.disb_date,
1655 trim(disbint.trans_type_code) trans_type_code,
1656 disbint.elig_status_date,
1657 disbint.affirm_flag,
1658 disbint.int_rebate_amt,
1659 disbint.force_disb_flag,
1660 disbint.min_credit_pts_num,
1661 disbint.disb_exp_date,
1662 disbint.verf_enfr_date,
1663 disbint.planned_credit_flag,
1664 disbint.fee_paid_1_amt,
1665 disbint.fee_paid_2_amt,
1666 disbint.created_by,
1667 disbint.creation_date,
1668 disbint.last_updated_by,
1669 disbint.last_update_date,
1670 disbint.last_update_login,
1671 trim(fee_class_code) fee_class_code,
1672 authorization_date,
1673 TRIM(attendance_type_code) attendance_type_code,
1674 disbint.base_attendance_type_code -- new col added as part of FA131 COD updates build.
1675 FROM igf_aw_li_disb_ints disbint
1676 WHERE ci_alternate_code = li_awd_rec.ci_alternate_code
1677 AND person_number = li_awd_rec.person_number
1678 AND award_number_txt = li_awd_rec.award_number_txt
1679 ORDER BY disbursement_num;
1680
1681 CURSOR c_uniq_fee_class IS
1682 SELECT fee_class_code
1683 FROM igf_aw_li_disb_ints
1684 WHERE person_number = li_awd_rec.person_number
1685 AND award_number_txt = li_awd_rec.award_number_txt
1686 GROUP BY fee_class_code
1687 HAVING COUNT(fee_class_code) > 1;
1688 c_uniq_fee_class_rec c_uniq_fee_class%ROWTYPE;
1689
1690 CURSOR cur_legacy_disb_total IS
1691 SELECT SUM(offered_amt) total_offered_amt,
1692 SUM(accepted_amt) total_accepted_amt,
1693 COUNT(disbursement_num) number_of_disb,
1694 NVL(MAX(disbursement_num),0) max_disb_number,
1695 NVL(MIN(disbursement_num),0) min_disb_number
1696 FROM igf_aw_li_disb_ints
1697 WHERE ci_alternate_code = li_awd_rec.ci_alternate_code
1698 AND person_number = li_awd_rec.person_number
1699 AND award_number_txt = li_awd_rec.award_number_txt;
1700
1701 cur_legacy_disb_total_rec cur_legacy_disb_total%ROWTYPE;
1702
1703 CURSOR c_match_disb_term (p_cal_type igf_aw_fund_tp_all.tp_cal_type%TYPE,
1704 p_sequence_number igf_aw_fund_tp_all.tp_sequence_number%TYPE) IS
1705 SELECT fund_id, tp_cal_type, tp_sequence_number
1706 FROM igf_aw_fund_tp_all
1707 WHERE fund_id = g_fund_id
1708 AND tp_cal_type = p_cal_type
1709 AND tp_sequence_number = p_sequence_number;
1710 c_match_disb_term_rec c_match_disb_term%ROWTYPE;
1711
1712 CURSOR c_max_year_spnsr IS
1713 SELECT fmast.max_yearly_amt
1714 FROM igf_aw_fund_mast_all fmast,
1715 igf_aw_fund_cat_all fcat
1716 WHERE fcat.fund_code = fmast.fund_code
1717 AND fcat.fed_fund_code = g_fed_fund_code
1718 AND fmast.fund_id = g_fund_id
1719 AND fmast.discontinue_fund = 'N';
1720 c_max_year_spnsr_rec c_max_year_spnsr%ROWTYPE;
1721
1722 CURSOR c_get_sp_fee_class(p_fee_class_code igf_aw_li_disb_ints.fee_class_code%TYPE) IS
1723 SELECT fee_cls_id
1724 FROM igf_sp_fc_all
1725 WHERE fund_id = g_fund_id
1726 AND fee_class = p_fee_class_code;
1727 c_get_sp_fee_class_rec c_get_sp_fee_class%ROWTYPE;
1728
1729 CURSOR c_get_dact_fws(p_disbursement_num igf_aw_li_disb_ints.disbursement_num%TYPE) IS
1730 SELECT disb_activity_num
1731 FROM igf_aw_li_dact_ints
1732 WHERE ci_alternate_code = li_awd_rec.ci_alternate_code
1733 AND person_number = li_awd_rec.person_number
1734 AND award_number_txt = li_awd_rec.award_number_txt
1735 AND disbursement_num = p_disbursement_num;
1736 c_get_dact_fws_rec c_get_dact_fws%ROWTYPE;
1737
1738 CURSOR c_val_lookup_code(p_lookup_type igs_lookups_view.lookup_type%TYPE,
1739 p_lookup_code igs_lookups_view.lookup_code%TYPE) IS
1740 SELECT meaning FROM igs_lookups_view WHERE lookup_type = p_lookup_type AND
1741 lookup_code = p_lookup_code and enabled_flag = 'Y';
1742 c_val_lookup_code_rec c_val_lookup_code%ROWTYPE;
1743
1744 CURSOR c_get_disb_count IS
1745 SELECT count(*)
1746 FROM igf_aw_li_disb_ints disbint
1747 WHERE disbint.ci_alternate_code = li_awd_rec.ci_alternate_code
1748 AND disbint.person_number = li_awd_rec.person_number
1749 AND disbint.award_number_txt = li_awd_rec.award_number_txt
1750 ORDER BY disbursement_num;
1751 l_disb_rec_count PLS_INTEGER;
1752
1753 CURSOR c_get_uniq_ld_code IS
1754 SELECT count(distinct(ld_alternate_code))
1755 FROM igf_aw_li_disb_ints disbint
1756 WHERE ci_alternate_code = li_awd_rec.ci_alternate_code
1757 AND person_number = li_awd_rec.person_number
1758 AND award_number_txt = li_awd_rec.award_number_txt;
1759 l_uniq_ld_code PLS_INTEGER;
1760
1761 CURSOR cur_check_atd( cp_atd_code VARCHAR2) IS
1762 SELECT attendance_type
1763 FROM igs_en_atd_type
1764 WHERE attendance_type = cp_atd_code;
1765
1766 check_atd_rec cur_check_atd%ROWTYPE;
1767
1768 CURSOR cur_legacy_disb_fws_total IS
1769 SELECT COUNT (DISTINCT ld_alternate_code) terms,
1770 COUNT (tp_alternate_code) tp
1771 FROM igf_aw_li_disb_ints
1772 WHERE ci_alternate_code = li_awd_rec.ci_alternate_code
1773 AND person_number = li_awd_rec.person_number
1774 AND award_number_txt = li_awd_rec.award_number_txt;
1775
1776 cur_legacy_disb_total_fws_rec cur_legacy_disb_fws_total%ROWTYPE;
1777
1778 l_ctr PLS_INTEGER;
1779 l_ret_val BOOLEAN;
1780 l_var_cal_type igs_ca_inst.cal_type%TYPE;
1781 l_var_seq_number igs_ca_inst.sequence_number%TYPE;
1782 l_return_status_dh VARCHAR2(1);
1783 l_return_status_da VARCHAR2(1);
1784 l_disb_rec_ins_status VARCHAR2(1);
1785 l_net_amount igf_aw_awd_disb_all.disb_net_amt%TYPE;
1786
1787 l_padding_string VARCHAR2(100);
1788
1789 PROCEDURE create_disbursment_record(li_awd_rec IN igf_aw_li_awd_ints%ROWTYPE,
1790 cur_legacy_disb_int_rec IN igf_aw_li_disb_ints%ROWTYPE,
1791 l_disb_rec_ins_status OUT NOCOPY VARCHAR2
1792 ) IS
1793 /***************************************************************
1794 Created By : nsidana
1795 Date Created By : 11/28/2003
1796 Purpose : Creates disbursements records in the system.
1797 Known Limitations,Enhancements or Remarks
1798 Change History :
1799 Who When What
1800 nsidana 11/28/2003 FA131 COD updates build. Added validations on two new feilds
1801 added to the legacy awards table and 1 feild in the legacy award
1802 disbursements table.
1803 --veramach 1-NOV-2003 FA 125 Multiple Distr Methods
1804 -- Changed calll to igf_aw_awd_disb_pkg.update_row to reflect the addition of attendance_type_code
1805 --rasahoo 25/Aug/2003 #3101894 Called procedure send_work_auth with parameter 'LEGACY'
1806 ***************************************************************/
1807 l_rowid VARCHAR2(25);
1808
1809 CURSOR c_get_cal_typ_seq_num(p_alternate_code igs_ca_inst.alternate_code%TYPE) IS
1810 SELECT cal_type, sequence_number
1811 FROM igs_ca_inst
1812 WHERE alternate_code = p_alternate_code;
1813
1814 CURSOR cur_awd_disb( cp_row_id ROWID) IS
1815 SELECT rowid row_id, disb.*
1816 FROM igf_aw_awd_disb_all disb
1817 WHERE rowid = cp_row_id;
1818
1819 CURSOR c_get_fed_fund (cp_fund_code igf_aw_fund_cat_all.fund_code%TYPE) IS
1820 SELECT fed_fund_code
1821 FROM igf_aw_fund_cat_all
1822 WHERE fund_code = cp_fund_code;
1823
1824 l_fed_fund_code igf_aw_fund_cat_all.fed_fund_code%TYPE;
1825 lc_awd_disb cur_awd_disb%ROWTYPE;
1826 c_tp_calseq_rec c_get_cal_typ_seq_num%ROWTYPE;
1827 c_ld_calseq_rec c_get_cal_typ_seq_num%ROWTYPE;
1828 l_warning VARCHAR2(200);
1829 l_trans_type VARCHAR2(1);
1830 l_cal_type igs_ca_inst_all.cal_type%TYPE;
1831 ln_sequence_number igs_ca_inst_all.sequence_number%TYPE;
1832 ln_base_id igf_ap_fa_base_rec_all.base_id%TYPE := NULL;
1833 l_hol_rel_ind VARCHAR2(30) := NULL;
1834
1835
1836 BEGIN
1837 l_rowid := NULL;
1838
1839 -- obtain the cal type sequence number for teaching period
1840 c_tp_calseq_rec := NULL;
1841 OPEN c_get_cal_typ_seq_num(cur_legacy_disb_int_rec.tp_alternate_code);
1842 FETCH c_get_cal_typ_seq_num INTO c_tp_calseq_rec;
1843 CLOSE c_get_cal_typ_seq_num;
1844
1845 -- obtain the cal type, sequence number for load calendar
1846 OPEN c_get_cal_typ_seq_num(cur_legacy_disb_int_rec.ld_alternate_code);
1847 FETCH c_get_cal_typ_seq_num INTO c_ld_calseq_rec;
1848 CLOSE c_get_cal_typ_seq_num;
1849
1850 IF li_awd_rec.award_status_code = 'CANCELLED' THEN
1851
1852 l_net_amount := 0 ;
1853 l_trans_type := 'C' ;
1854 ELSE
1855
1856 l_trans_type := cur_legacy_disb_int_rec.trans_type_code ;
1857 END IF;
1858
1859 -- get the hold_rel_ind flag if fed_fund_code in ('ALT', 'FLS', 'FLP', 'FLU')
1860 l_fed_fund_code := NULL;
1861
1862 -- cursor to fetch the federal fund code
1863 OPEN c_get_fed_fund(li_awd_rec.fund_code);
1864 FETCH c_get_fed_fund INTO l_fed_fund_code;
1865 CLOSE c_get_fed_fund;
1866
1867 IF l_fed_fund_code IN ('ALT', 'FLS', 'FLP', 'FLU') THEN
1868 -- get the cal type, sequence number for the award year
1869 OPEN c_get_cal_typ_seq_num(li_awd_rec.ci_alternate_code);
1870 FETCH c_get_cal_typ_seq_num INTO l_cal_type,ln_sequence_number;
1871 CLOSE c_get_cal_typ_seq_num;
1872
1873 ln_base_id := get_base_id_from_per_num(li_awd_rec.person_number, l_cal_type, ln_sequence_number);
1874
1875 l_hol_rel_ind := igf_sl_award.get_cl_hold_rel_ind(
1876 p_fed_fund_code => l_fed_fund_code,
1877 p_ci_cal_type => l_cal_type,
1878 p_ci_seq_num => ln_sequence_number,
1879 p_base_id => ln_base_id,
1880 p_alt_rel_code => igf_sl_award.get_alt_rel_code(li_awd_rec.fund_code)
1881 );
1882
1883 ELSE
1884 l_hol_rel_ind := 'FALSE';
1885 END IF;
1886
1887
1888 igf_aw_awd_disb_pkg.insert_row(
1889 x_rowid => l_rowid,
1890 x_award_id => g_award_id,
1891 x_disb_num => cur_legacy_disb_int_rec.disbursement_num,
1892 x_tp_cal_type => c_tp_calseq_rec.cal_type,
1893 x_tp_sequence_number=> c_tp_calseq_rec.sequence_number,
1894 x_disb_gross_amt => cur_legacy_disb_int_rec.offered_amt,
1895 x_fee_1 => cur_legacy_disb_int_rec.fee_1_amt,
1896 x_fee_2 => cur_legacy_disb_int_rec.fee_2_amt,
1897 x_disb_net_amt => l_net_amount,
1898 x_disb_date => cur_legacy_disb_int_rec.disb_date,
1899 x_trans_type => l_trans_type,
1900 x_elig_status => NULL,
1901 x_elig_status_date => cur_legacy_disb_int_rec.elig_status_date,
1902 x_affirm_flag => cur_legacy_disb_int_rec.affirm_flag,
1903 x_hold_rel_ind => l_hol_rel_ind,
1904 x_manual_hold_ind => NULL,
1905 x_disb_status => NULL,
1906 x_disb_status_date => NULL,
1907 x_late_disb_ind => NULL,
1908 x_fund_dist_mthd => NULL,
1909 x_prev_reported_ind => NULL,
1910 x_fund_release_date => NULL,
1911 x_fund_status => NULL,
1912 x_fund_status_date => NULL,
1913 x_fee_paid_1 => cur_legacy_disb_int_rec.fee_paid_1_amt,
1914 x_fee_paid_2 => cur_legacy_disb_int_rec.fee_paid_2_amt,
1915 x_cheque_number => NULL,
1916 x_ld_cal_type => c_ld_calseq_rec.cal_type,
1917 x_ld_sequence_number=> c_ld_calseq_rec.sequence_number,
1918 x_disb_accepted_amt => cur_legacy_disb_int_rec.accepted_amt,
1919 x_disb_paid_amt => NULL,
1920 x_rvsn_id => NULL,
1921 x_int_rebate_amt => cur_legacy_disb_int_rec.int_rebate_amt,
1922 x_force_disb => cur_legacy_disb_int_rec.force_disb_flag,
1923 x_min_credit_pts => cur_legacy_disb_int_rec.min_credit_pts_num,
1924 x_disb_exp_dt => cur_legacy_disb_int_rec.disb_exp_date,
1925 x_verf_enfr_dt => cur_legacy_disb_int_rec.verf_enfr_date,
1926 x_fee_class => cur_legacy_disb_int_rec.fee_class_code,
1927 x_show_on_bill => cur_legacy_disb_int_rec.planned_credit_flag,
1928 x_attendance_type_code => cur_legacy_disb_int_rec.attendance_type_code,
1929 x_base_attendance_type_code => cur_legacy_disb_int_rec.base_attendance_type_code,
1930 x_payment_prd_st_date => NULL,
1931 x_change_type_code => NULL,
1932 x_fund_return_mthd_code => NULL,
1933 x_direct_to_borr_flag => 'N'
1934 );
1935
1936 IF(l_rowid IS NOT NULL)THEN
1937 l_disb_rec_ins_status := 'S';
1938 ELSE
1939 l_disb_rec_ins_status := 'E';
1940 RETURN;
1941 END IF;
1942
1943 EXCEPTION WHEN OTHERS THEN
1944 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
1945 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION, 'igf.plsql.igf_aw_li_import.create_disbursment_record.exception',SQLERRM);
1946 END IF;
1947 FND_FILE.PUT_LINE(FND_FILE.LOG,SQLERRM);
1948 l_disb_rec_ins_status := 'E';
1949 END create_disbursment_record;
1950
1951 BEGIN -- validate_disburs_int_rec
1952
1953 p_return_status := 'S';
1954 l_padding_string := RPAD(' ',3,' ')||'-- ';
1955 -- open the cusrsor cur_legacy_disb_total and obtain the total values
1956 cur_legacy_disb_total_rec := NULL;
1957 OPEN cur_legacy_disb_total; FETCH cur_legacy_disb_total INTO cur_legacy_disb_total_rec; CLOSE cur_legacy_disb_total;
1958 g_processing_string := l_padding_string || igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','PROCESSING') || ' '||
1959 igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','DISBURSMNT');
1960 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
1961 FND_FILE.PUT_LINE(FND_FILE.LOG,g_processing_string);
1962
1963 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
1964 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_li_import.validate_disburs_int_rec.debug','no of disb'|| cur_legacy_disb_total_rec.number_of_disb || 'max no = ' ||cur_legacy_disb_total_rec.max_disb_number);
1965 END IF;
1966 -- if total number of disbursement = 0 then error
1967 IF(cur_legacy_disb_total_rec.number_of_disb = 0)THEN
1968 p_return_status := 'E';
1969 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_NOT_PRSNT');
1970 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
1971 RETURN;
1972 ELSIF(cur_legacy_disb_total_rec.max_disb_number > 99)THEN
1973 p_return_status := 'E';
1974 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_NUM_INVALID');
1975 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
1976 RETURN;
1977 END IF;
1978
1979 -- validate disbursement numbers for the award. the numbers must be sequential starting from 1
1980 l_ctr:=1;
1981 FOR cur_legacy_disb_int_rec IN cur_legacy_disb_int LOOP
1982 IF(l_ctr <> cur_legacy_disb_int_rec.disbursement_num) THEN
1983 p_return_status := 'E';
1984 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_NUM_ST_1_INR_1');
1985 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
1986 RETURN;
1987 END IF;
1988 l_ctr:=l_ctr+1;
1989 END LOOP;
1990
1991 -- sum of all offered amounts for all disb at the context awd = total offered amt.
1992 IF( (li_awd_rec.offered_amt IS NOT NULL AND cur_legacy_disb_total_rec.total_offered_amt IS NULL) OR
1993 (li_awd_rec.offered_amt IS NOT NULL AND li_awd_rec.offered_amt <> cur_legacy_disb_total_rec.total_offered_amt )
1994 ) THEN
1995 p_return_status := 'E';
1996 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_SUM_OFRD_AMT_NOT_EQL');
1997 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
1998 RETURN;
1999 END IF;
2000
2001
2002 -- If accepted amt is present at award and not present at disb then error
2003 -- sum of all accepted amounts for all dis at the context awd = total accepted amt
2004 IF( ( li_awd_rec.accepted_amt IS NOT NULL AND cur_legacy_disb_total_rec.total_accepted_amt IS NULL ) OR
2005 ( li_awd_rec.accepted_amt IS NOT NULL AND li_awd_rec.accepted_amt <> cur_legacy_disb_total_rec.total_accepted_amt)
2006 ) THEN
2007 p_return_status := 'E';
2008 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_SUM_ACPT_AMT_NOT_EQL');
2009 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2010 RETURN;
2011 END IF;
2012
2013 IF(g_fed_fund_code = 'SPNSR')THEN
2014 -- unique fee class validation for sponsorship awards
2015 c_uniq_fee_class_rec := NULL;
2016 OPEN c_uniq_fee_class; FETCH c_uniq_fee_class INTO c_uniq_fee_class_rec; CLOSE c_uniq_fee_class;
2017 IF(c_uniq_fee_class_rec.fee_class_code IS NOT NULL)THEN
2018 p_return_status := 'E';
2019 FND_MESSAGE.SET_NAME('IGF','IGF_SP_LI_DUP_FC_FND');
2020 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2021 END IF;
2022 -- Sponsorship Awards should be awarded under one Load Calendar for the given Award. Check if the Student has any
2023 -- sponsorhsips not in the same load calendar for a sponsorship Award in the disbursement interface.
2024 -- table. If the Student does have more than one LD then error out
2025 OPEN c_get_uniq_ld_code; FETCH c_get_uniq_ld_code INTO l_uniq_ld_code; CLOSE c_get_uniq_ld_code;
2026 IF(l_uniq_ld_code > 1)THEN
2027 p_return_status := 'E';
2028 FND_MESSAGE.SET_NAME('IGF','IGF_SP_LI_LD_CAL_NOT_SAME');
2029 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2030 END IF;
2031 END IF;
2032
2033 IF g_fed_fund_code = 'FWS' THEN
2034 --check if the award has more than 1 disbursement per term
2035 --if yes, error OUT
2036 OPEN cur_legacy_disb_fws_total;
2037 FETCH cur_legacy_disb_fws_total INTO cur_legacy_disb_total_fws_rec;
2038 CLOSE cur_legacy_disb_fws_total;
2039 IF cur_legacy_disb_total_fws_rec.terms <> cur_legacy_disb_total_fws_rec.tp THEN
2040 p_return_status := 'E';
2041 FND_MESSAGE.SET_NAME('IGF','IGF_SE_MAX_TP_SETUP');
2042 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2043 RETURN;
2044 END IF;
2045 END IF;
2046
2047 l_ctr := 0; -- this initialization is necessary for checking only one disb record for sponsorships
2048 FOR cur_legacy_disb_int_rec IN cur_legacy_disb_int LOOP
2049 l_ctr := l_ctr + 1;
2050 -- validate the term calendar
2051 g_processing_string := RPAD(' ',3,' ')||'-- '|| igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','PROCESSING') || ' '||
2052 igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','DISBURSEMENT_NUMBER');
2053 FND_FILE.PUT_LINE(FND_FILE.LOG,g_processing_string||': '||cur_legacy_disb_int_rec.disbursement_num);
2054 l_ret_val := igf_ap_gen.validate_cal_inst('LOAD',li_awd_rec.ci_alternate_code,
2055 cur_legacy_disb_int_rec.ld_alternate_code,
2056 l_var_cal_type,
2057 l_var_seq_number);
2058
2059 IF(FND_LOG.LEVEL_STATEMENT >= g_debug_runtime_level)THEN
2060 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,'igf.plsql.igf_aw_li_import.validate_disburs_int_rec.debug',
2061 'LOAD validation ci_alternate_code'||li_awd_rec.ci_alternate_code||'ld_alternate_code:'||
2062 cur_legacy_disb_int_rec.ld_alternate_code||'l_var_cal_type'||l_var_cal_type||'l_var_seq_number'||l_var_seq_number
2063 );
2064 END IF;
2065
2066 IF(l_ret_val = FALSE AND l_var_cal_type IS NULL)THEN
2067 p_return_status := 'E';
2068 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_TERM_NOT_FND');
2069 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2070 END IF;
2071
2072 IF(l_ret_val = FALSE AND l_var_cal_type IS NOT NULL)THEN
2073 p_return_status := 'E';
2074 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_TERM_NOT_CHLD_AWD_YR');
2075 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2076 END IF;
2077
2078 -- error out if the award status is not accepted and accepted amount exists at the disbursement level
2079 IF ( li_awd_rec.award_status_code IN ('OFFERED','CANCELLED','DECLINED') AND
2080 cur_legacy_disb_int_rec.accepted_amt < 0
2081 )THEN
2082 p_return_status := 'E';
2083 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_ACPT_AMT_NEG');
2084 FND_MESSAGE.SET_TOKEN('AWD_STATUS', li_awd_rec.award_status_code);
2085 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
2086 END IF;
2087
2088 -- for cancelled awards acpt amt should be zero or null
2089 IF ( li_awd_rec.award_status_code ='CANCELLED' AND
2090 ( cur_legacy_disb_int_rec.accepted_amt IS NULL OR cur_legacy_disb_int_rec.accepted_amt <> 0 )
2091 ) THEN
2092 p_return_status := 'E';
2093 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DB_ACPT_AMT_AWD_CNCL');
2094 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
2095 END IF;
2096
2097 -- federal work study validations introduced in FACR117.
2098 IF(g_fed_fund_code = 'FWS')THEN
2099 -- Work Study Funds should not have Legacy Disbursement Activity Records
2100 c_get_dact_fws_rec := NULL;
2101 OPEN c_get_dact_fws(cur_legacy_disb_int_rec.disbursement_num); FETCH c_get_dact_fws INTO c_get_dact_fws_rec;
2102 CLOSE c_get_dact_fws;
2103 IF(c_get_dact_fws_rec.disb_activity_num IS NOT NULL)THEN
2104 p_return_status := 'E';
2105 FND_MESSAGE.SET_NAME('IGF','IGF_SE_LI_DISB_ADJ_PRSNT');
2106 FND_MESSAGE.SET_TOKEN('FUND',li_awd_rec.fund_code);
2107 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2108 END IF;
2109 END IF;
2110
2111 -- sponsorship validations, introduced in FACR117 for sep 2003 release
2112 IF(g_fed_fund_code <> 'SPNSR')THEN
2113 -- fee class code should be null for non sponsorship awards. introduced in FACR117
2114 IF(cur_legacy_disb_int_rec.fee_class_code IS NOT NULL)THEN
2115 p_return_status := 'E';
2116 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_COL_BLNK');
2117 FND_MESSAGE.SET_TOKEN('COLUMN_NAME','FEE_CLASS_CODE');
2118 FND_MESSAGE.SET_TOKEN('FUND_CODE',li_awd_rec.fund_code);
2119 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2120 END IF;
2121 ELSIF(g_fed_fund_code = 'SPNSR')THEN
2122 -- When the sponsorship amount is present, only one disbursement record exist without any fee class code
2123 -- also for second disbursement onwards, fee class codes should be present.
2124 -- Secondly, when the spoosorship amount is not present, error if fee class code is blank.
2125 c_max_year_spnsr_rec := NULL; l_disb_rec_count := NULL;
2126 OPEN c_max_year_spnsr; FETCH c_max_year_spnsr INTO c_max_year_spnsr_rec; CLOSE c_max_year_spnsr;
2127 OPEN c_get_disb_count; FETCH c_get_disb_count INTO l_disb_rec_count; CLOSE c_get_disb_count;
2128 IF(c_max_year_spnsr_rec.max_yearly_amt IS NOT NULL AND cur_legacy_disb_int_rec.fee_class_code IS NULL AND l_disb_rec_count > 1)THEN
2129 p_return_status := 'E';
2130 FND_MESSAGE.SET_NAME('IGF','IGF_SP_LI_FC_NOT_PRSNT');
2131 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2132 ELSIF(c_max_year_spnsr_rec.max_yearly_amt IS NULL AND cur_legacy_disb_int_rec.fee_class_code IS NULL AND l_disb_rec_count >= 1)THEN
2133 p_return_status := 'E';
2134 FND_MESSAGE.SET_NAME('IGF','IGF_SP_LI_GT1_DB_FC_NULL');
2135 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2136 END IF;
2137 -- check if the fee class code is valid value for configured lookup. Test this only if the value is present in the
2138 -- fee class code. validation introduced in FACR117
2139 IF(cur_legacy_disb_int_rec.fee_class_code IS NOT NULL)THEN
2140 c_val_lookup_code_rec := NULL;
2141 OPEN c_val_lookup_code('FEE_CLASS',cur_legacy_disb_int_rec.fee_class_code); FETCH c_val_lookup_code INTO c_val_lookup_code_rec;
2142 CLOSE c_val_lookup_code;
2143 IF(c_val_lookup_code_rec.meaning IS NULL)THEN
2144 p_return_status := 'E';
2145 FND_MESSAGE.SET_NAME('IGF','IGF_AP_INV_FLD_VAL');
2146 FND_MESSAGE.SET_TOKEN('FIELD','FEE_CLASS_CODE');
2147 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2148 END IF;
2149 END IF;
2150
2151 -- validate if the fee class is present in the sponsor definition. if not present then raise a warning
2152 c_get_sp_fee_class_rec := NULL;
2153 IF(cur_legacy_disb_int_rec.fee_class_code IS NOT NULL)THEN
2154 OPEN c_get_sp_fee_class(cur_legacy_disb_int_rec.fee_class_code); FETCH c_get_sp_fee_class INTO c_get_sp_fee_class_rec;
2155 CLOSE c_get_sp_fee_class;
2156 IF(c_get_sp_fee_class_rec.fee_cls_id IS NULL)THEN
2157 IF(p_return_status <> 'E')THEN
2158 p_return_status := 'W';
2159 END IF;
2160 FND_MESSAGE.SET_NAME('IGF','IGF_SP_LI_FC_NOT_CHILD');
2161 FND_MESSAGE.SET_TOKEN('FEE_CLASS',cur_legacy_disb_int_rec.fee_class_code);
2162 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2163 END IF;
2164 END IF;
2165 END IF;
2166
2167 -- disbursement term matching validations for open award year only
2168 -- Do this validation only for SPNSR
2169 IF(g_award_year_status_code = 'O')THEN
2170 IF g_fed_fund_code = 'SPNSR' THEN
2171 c_match_disb_term_rec := NULL;
2172 OPEN c_match_disb_term(l_var_cal_type, l_var_seq_number); FETCH c_match_disb_term INTO c_match_disb_term_rec;
2173 CLOSE c_match_disb_term;
2174 IF(c_match_disb_term_rec.fund_id IS NULL) THEN
2175 IF(p_return_status <> 'E')THEN
2176 p_return_status := 'W';
2177 END IF;
2178 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_TERM_DISTRIBUTION');
2179 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2180 END IF;
2181 END IF;
2182
2183 -- validations as per review comments doc # 17 in the s1 version of the TD
2184 IF(g_fed_fund_code in ('DLP','FLP','GPLUSFL') AND cur_legacy_disb_total_rec.max_disb_number > 4) THEN
2185 p_return_status := 'E';
2186 FND_MESSAGE.SET_NAME('IGF','IGF_AW_PLUS_DISB');
2187 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2188 ELSIF(g_fed_fund_code in ('DLS','FLS','DLU','FLU') AND cur_legacy_disb_total_rec.max_disb_number > 20) THEN
2189 p_return_status := 'E';
2190 FND_MESSAGE.SET_NAME('IGF','IGF_AW_SUNS_DISB');
2191 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2192 ELSIF(g_fed_fund_code in ('PELL') AND cur_legacy_disb_total_rec.max_disb_number > 90) THEN
2193 p_return_status := 'E';
2194 FND_MESSAGE.SET_NAME('IGF','IGF_AW_PELL_DISB');
2195 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2196 END IF;
2197 END IF;
2198
2199 -- validate transacation type. valid values are ACTUAL(A), PLANNED(P), CANCELLED(C)
2200 IF(igf_ap_gen.get_aw_lookup_meaning('IGF_DB_TRANS_TYPE',cur_legacy_disb_int_rec.trans_type_code,g_sys_award_year)IS NULL)THEN
2201 p_return_status := 'E';
2202 FND_MESSAGE.SET_NAME('IGF','IGF_AP_INV_FLD_VAL');
2203 FND_MESSAGE.SET_TOKEN('FIELD','TRANS_TYPE_CODE');
2204 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2205 END IF;
2206 --
2207 -- External Awards Import can import only Planned Disbursements
2208 --
2209 IF g_entry_point = 'EXTERNAL' AND g_fed_fund_code = 'EXT' AND cur_legacy_disb_int_rec.trans_type_code <> 'P' THEN
2210 p_return_status :='E';
2211 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_TRANS_TYPE_FAIL');
2212 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2213 END IF;
2214
2215 --
2216 -- Check if the Attendance Type Code is setup in OSS or not
2217 --
2218 IF cur_legacy_disb_int_rec.attendance_type_code IS NOT NULL THEN
2219 OPEN cur_check_atd(cur_legacy_disb_int_rec.attendance_type_code);
2220 FETCH cur_check_atd INTO check_atd_rec;
2221 IF cur_check_atd%NOTFOUND THEN
2222 p_return_status :='E';
2223 FND_MESSAGE.SET_NAME('IGF','IGF_AP_INV_FLD_VAL');
2224 FND_MESSAGE.SET_TOKEN('FIELD','ATTENDANCE_TYPE_CODE');
2225 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2226 END IF;
2227 CLOSE cur_check_atd;
2228 END IF;
2229
2230 IF (
2231 g_fed_fund_code = 'PELL' AND
2232 igf_ap_gen.get_aw_lookup_meaning('IGF_GR_RFMS_ENROL_STAT',cur_legacy_disb_int_rec.base_attendance_type_code,g_sys_award_year) IS NULL)
2233 OR (
2234 g_fed_fund_code <> 'PELL' AND
2235 cur_legacy_disb_int_rec.base_attendance_type_code IS NOT NULL
2236 )
2237 THEN
2238 p_return_status :='E';
2239 FND_MESSAGE.SET_NAME('IGF','IGF_AP_INV_FLD_VAL');
2240 fnd_message.set_token('FIELD','BASE_ATTENDANCE_TYPE_CODE');
2241 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2242 END IF;
2243
2244 --
2245 -- Either Attendance Type Code, or Credit Points can be
2246 -- entered, not both
2247 --
2248 IF cur_legacy_disb_int_rec.attendance_type_code IS NOT NULL AND
2249 cur_legacy_disb_int_rec.min_credit_pts_num IS NOT NULL THEN
2250 p_return_status :='E';
2251 FND_MESSAGE.SET_NAME('IGF','IGF_AW_CRP_ATT_FAIL');
2252 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2253 END IF;
2254
2255 -- validate teaching calendar
2256 l_ret_val := FALSE; l_var_cal_type:=NULL; l_var_seq_number:=NULL;
2257 l_ret_val := igf_ap_gen.validate_cal_inst('TEACHING',cur_legacy_disb_int_rec.ld_alternate_code,
2258 cur_legacy_disb_int_rec.tp_alternate_code,
2259 l_var_cal_type,
2260 l_var_seq_number);
2261 IF(l_ret_val = FALSE AND l_var_cal_type IS NULL)THEN
2262 p_return_status := 'E';
2263 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_TEACH_CAL_NOT_FND');
2264 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2265 END IF;
2266 IF(l_ret_val = FALSE AND l_var_cal_type IS NULL)THEN
2267 p_return_status := 'E';
2268 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_TEACH_NOT_CHLD_LOAD');
2269 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2270 END IF;
2271
2272 -- validate offered amount. offered amount > 0 always
2273 IF(cur_legacy_disb_int_rec.offered_amt <= 0)THEN
2274 p_return_status := 'E';
2275 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_OFRD_AMT_GT_0');
2276 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2277 END IF;
2278
2279 -- validate eligibility status date. ELIG_STATUS_DATE < sysdate always
2280 IF(trunc(cur_legacy_disb_int_rec.elig_status_date) > trunc(sysdate))THEN
2281 p_return_status := 'E';
2282 FND_MESSAGE.SET_NAME('IGS','IGS_AD_DATE_SYSDATE');
2283 FND_MESSAGE.SET_TOKEN('NAME','ELIG_STATUS_DATE');
2284 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2285 END IF;
2286
2287 IF(li_awd_rec.award_status_code = 'ACCEPTED')THEN
2288 -- accepted amount should be present at disb level if present at award level. if null
2289 -- at disb level, log error message and continue with validations
2290 IF(li_awd_rec.accepted_amt IS NOT NULL) THEN
2291 IF(cur_legacy_disb_int_rec.accepted_amt IS NULL) THEN
2292 p_return_status := 'E';
2293 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_ACPT_REQ_AWD_ACPT');
2294 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2295 -- accepted amount should be > 0.
2296 ELSIF(cur_legacy_disb_int_rec.accepted_amt <= 0) THEN
2297 p_return_status := 'E';
2298 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_ACPT_AMT_GT_0');
2299 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2300 END IF;
2301 IF(cur_legacy_disb_int_rec.trans_type_code = 'C' AND cur_legacy_disb_int_rec.accepted_amt <> 0) THEN
2302 p_return_status := 'E';
2303 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_ACPT_AMT_EQ_0_TT_C');
2304 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2305 END IF;
2306 END IF;
2307 END IF; -- end award status is ACCEPTED
2308
2309 -- Interest Rebate Amount and Affirmation Flag should be NULL for non Direct Loans
2310 IF(g_fed_fund_code NOT IN ('DLP','DLS','DLU'))THEN
2311 IF(cur_legacy_disb_int_rec.int_rebate_amt IS NOT NULL)THEN
2312 p_return_status := 'E';
2313 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_COL_BLNK');
2314 FND_MESSAGE.SET_TOKEN('COLUMN_NAME','INT_REBATE_AMT');
2315 FND_MESSAGE.SET_TOKEN('FUND_CODE',li_awd_rec.fund_code);
2316 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2317 END IF;
2318 IF(cur_legacy_disb_int_rec.affirm_flag IS NOT NULL)THEN
2319 p_return_status := 'E';
2320 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_COL_BLNK');
2321 FND_MESSAGE.SET_TOKEN('COLUMN_NAME','AFFIRM_FLAG');
2322 FND_MESSAGE.SET_TOKEN('FUND_CODE',li_awd_rec.fund_code);
2323 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2324 END IF;
2325 END IF;
2326
2327 -- Origination Fee should be null for all loans except for Direct, FFELP and Alternative
2328 IF(g_fed_fund_code NOT IN ('DLP','DLS','DLU','FLS','FLP','FLU','ALT','GPLUSFL') AND cur_legacy_disb_int_rec.fee_1_amt IS NOT NULL)THEN
2329 p_return_status := 'E';
2330 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_COL_BLNK');
2331 FND_MESSAGE.SET_TOKEN('COLUMN_NAME','FEE_1_AMT');
2332 FND_MESSAGE.SET_TOKEN('FUND_CODE',li_awd_rec.fund_code);
2333 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2334 END IF;
2335
2336 -- validate if the Origination Fee is correct for Direct, FFELP and Alternative Loan
2337 IF(g_fed_fund_code IN ('DLP','DLS','DLU','FLS','FLP','FLU','ALT','GPLUSFL'))THEN
2338 IF(cur_legacy_disb_int_rec.fee_1_amt IS NOT NULL AND cur_legacy_disb_int_rec.fee_1_amt < 0)THEN
2339 p_return_status := 'E';
2340 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_COL_REQ');
2341 FND_MESSAGE.SET_TOKEN('COLUMN_NAME','FEE_1_AMT');
2342 FND_MESSAGE.SET_TOKEN('FUND_CODE',li_awd_rec.fund_code);
2343 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2344 END IF;
2345 END IF;
2346
2347 -- Guarantee Fee, Guarantee Fee Paid, Origination Fee Paid should be null for non FFELP and Alternative Loans
2348 IF(g_fed_fund_code NOT IN('FLS','FLP','FLU','ALT','GPLUSFL'))THEN
2349 IF(cur_legacy_disb_int_rec.fee_2_amt IS NOT NULL)THEN
2350 p_return_status := 'E';
2351 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_COL_BLNK');
2352 FND_MESSAGE.SET_TOKEN('COLUMN_NAME','FEE_2_AMT');
2353 FND_MESSAGE.SET_TOKEN('FUND_CODE',li_awd_rec.fund_code);
2354 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2355 END IF;
2356 IF(cur_legacy_disb_int_rec.fee_paid_1_amt IS NOT NULL)THEN
2357 p_return_status := 'E';
2358 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_COL_BLNK');
2359 FND_MESSAGE.SET_TOKEN('COLUMN_NAME','FEE_PAID_1_AMT');
2360 FND_MESSAGE.SET_TOKEN('FUND_CODE',li_awd_rec.fund_code);
2361 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2362 END IF;
2363 IF(cur_legacy_disb_int_rec.fee_paid_2_amt IS NOT NULL)THEN
2364 p_return_status := 'E';
2365 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_COL_BLNK');
2366 FND_MESSAGE.SET_TOKEN('COLUMN_NAME','FEE_PAID_2_AMT');
2367 FND_MESSAGE.SET_TOKEN('FUND_CODE',li_awd_rec.fund_code);
2368 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2369 END IF;
2370 END IF;
2371
2372 IF(g_fed_fund_code NOT IN('DLP','DLS','DLU') AND cur_legacy_disb_int_rec.affirm_flag IS NOT NULL)THEN
2373 p_return_status := 'E';
2374 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_COL_BLNK');
2375 FND_MESSAGE.SET_TOKEN('COLUMN_NAME','AFFIRM_FLAG');
2376 FND_MESSAGE.SET_TOKEN('FUND_CODE',li_awd_rec.fund_code);
2377 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2378 END IF;
2379
2380 -- net amount is always the accepted amount for all the awards except for Direct Loans and Common Line Loans
2381 l_net_amount := NVL(cur_legacy_disb_int_rec.accepted_amt,0);
2382 -- perform direct loan validations
2383
2384 IF(g_fed_fund_code IS NOT NULL AND g_fed_fund_code IN ('DLP','DLS','DLU'))THEN
2385 -- interest rebate amount is optional for Direct Loans. Validate if it is < 0
2386
2387 IF(cur_legacy_disb_int_rec.int_rebate_amt IS NOT NULL AND cur_legacy_disb_int_rec.int_rebate_amt < 0)THEN
2388 p_return_status := 'E';
2389 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_COL_REQ');
2390 FND_MESSAGE.SET_TOKEN('COLUMN_NAME','INT_REBATE_AMT');
2391 FND_MESSAGE.SET_TOKEN('FUND_CODE',li_awd_rec.fund_code);
2392 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2393 END IF;
2394 IF(cur_legacy_disb_int_rec.affirm_flag IS NOT NULL AND cur_legacy_disb_int_rec.affirm_flag NOT IN('Y','N'))THEN
2395 p_return_status := 'E';
2396 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_AFRM_FG_INVALID');
2397 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2398 END IF;
2399
2400 -- compute l_net_amount here
2401 l_net_amount := NVL(cur_legacy_disb_int_rec.accepted_amt,0) -
2402 NVL(cur_legacy_disb_int_rec.fee_1_amt,0) +
2403 NVL(cur_legacy_disb_int_rec.int_rebate_amt,0);
2404
2405 -- perform common line loan validations
2406 ELSIF(g_fed_fund_code IS NOT NULL AND g_fed_fund_code IN ('FLP','FLS','FLU','ALT','GPLUSFL')) THEN
2407
2408 IF(cur_legacy_disb_int_rec.fee_paid_1_amt IS NOT NULL AND cur_legacy_disb_int_rec.fee_paid_1_amt < 0)THEN
2409 p_return_status := 'E';
2410 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_COL_REQ');
2411 FND_MESSAGE.SET_TOKEN('COLUMN_NAME','FEE_PAID_1_AMT');
2412 FND_MESSAGE.SET_TOKEN('FUND_CODE',li_awd_rec.fund_code);
2413 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2414 END IF;
2415 IF(cur_legacy_disb_int_rec.fee_2_amt IS NOT NULL AND cur_legacy_disb_int_rec.fee_2_amt < 0)THEN
2416 p_return_status := 'E';
2417 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_COL_REQ');
2418 FND_MESSAGE.SET_TOKEN('COLUMN_NAME','FEE_2_AMT');
2419 FND_MESSAGE.SET_TOKEN('FUND_CODE',li_awd_rec.fund_code);
2420 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2421 END IF;
2422 IF(cur_legacy_disb_int_rec.fee_paid_2_amt IS NOT NULL AND cur_legacy_disb_int_rec.fee_paid_2_amt < 0)THEN
2423 p_return_status := 'E';
2424 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_COL_REQ');
2425 FND_MESSAGE.SET_TOKEN('COLUMN_NAME','FEE_PAID_2_AMT');
2426 FND_MESSAGE.SET_TOKEN('FUND_CODE',li_awd_rec.fund_code);
2427 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2428 END IF;
2429
2430 -- compute net amount for common line loans
2431 l_net_amount := NVL(cur_legacy_disb_int_rec.accepted_amt,0) -
2432 NVL(cur_legacy_disb_int_rec.fee_1_amt,0) -
2433 NVL(cur_legacy_disb_int_rec.fee_2_amt,0) +
2434 NVL(cur_legacy_disb_int_rec.fee_paid_1_amt,0) +
2435 NVL(cur_legacy_disb_int_rec.fee_paid_2_amt,0);
2436 END IF; -- end common line validations
2437 -- call to insert row of disb production table package. with the calculations of Net Amount for
2438 -- direct loans and common line loans
2439 -- call to insert disb record and further validations only if the return status is S or W
2440
2441 IF(p_return_status = 'S' OR p_return_status = 'W')THEN
2442 SAVEPOINT st_def_ins_disb_records;
2443
2444 create_disbursment_record(li_awd_rec,cur_legacy_disb_int_rec,l_disb_rec_ins_status);
2445
2446 IF(l_disb_rec_ins_status = 'S' OR l_disb_rec_ins_status = 'W')THEN
2447
2448 -- process disb holds records for context disb
2449 validate_disb_hold_int_rec(li_awd_rec,cur_legacy_disb_int_rec,l_return_status_dh);
2450 IF(l_return_status_dh = 'E')THEN
2451 ROLLBACK TO st_def_ins_disb_records;
2452 p_return_status := 'E';
2453 RETURN;
2454 END IF;
2455 ELSE
2456 ROLLBACK TO st_def_ins_disb_records;
2457 p_return_status := 'E';
2458 RETURN;
2459 END IF;
2460 -- process disb activity for context disb. process disb activity only if transaction type is ACTUAL or CANCELLED
2461 -- disbursement activity records are not processed for FWS funds.
2462
2463 IF(cur_legacy_disb_int_rec.trans_type_code IN ('A','C') AND p_return_status <> 'E' AND g_fed_fund_code <> 'FWS') THEN
2464 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2465 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_li_import.validate_disburs_int_rec.debug','calling validate_disb_act_int_rec');
2466 END IF;
2467
2468 validate_disb_act_int_rec(li_awd_rec,cur_legacy_disb_int_rec,l_return_status_da);
2469
2470 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
2471 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_li_import.validate_disburs_int_rec.debug','done validate_disb_act_int_rec');
2472 END IF;
2473 IF(l_return_status_da = 'E')THEN
2474 ROLLBACK TO st_def_ins_disb_records;
2475 p_return_status := 'E';
2476 RETURN;
2477 END IF;
2478 END IF;
2479 END IF;
2480 END LOOP;
2481 EXCEPTION WHEN OTHERS THEN
2482 p_return_status := 'E';
2483 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
2484 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
2485 'igf.plsql.igf_aw_li_import.validate_disburs_int_rec.exception',
2486 SQLERRM);
2487 END IF;
2488 FND_MESSAGE.SET_NAME('IGF','IGF_GE_UNHANDLED_EXP');
2489 FND_MESSAGE.SET_TOKEN('NAME','VALIDATE_DISBURS_INT_REC : '||SQLERRM);
2490 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
2491 END validate_disburs_int_rec;
2492
2493 PROCEDURE validate_disb_act_int_rec(li_awd_rec igf_aw_li_awd_ints%ROWTYPE,
2494 li_awd_disb_rec igf_aw_li_disb_ints%ROWTYPE,
2495 p_return_status OUT NOCOPY VARCHAR2
2496 ) IS
2497 /***************************************************************
2498 Created By : nsidana
2499 Date Created By : 11/28/2003
2500 Purpose : Validates disbursements activity interface record.
2501 Known Limitations,Enhancements or Remarks
2502 Change History :
2503 Who When What
2504 pssahni 10/20/2004 The newly added fields in the table IGF_AW_LI_DACT_INTS and table IGF_DB_AWD_DISB_DTL.
2505 (ORIG_FEE_AMT, GUARNT_FEE_AMT, ORIG_FEE_PAID_AMT, GUARNT_FEE_PAID_AMT, INT_REBATE_AMT)
2506 are taken into account and data is inseted into IGF_AW_DB_CHG_DTLS table also
2507 Validation is done to check that the last activity always reflect the current disbursement information.
2508
2509 ***************************************************************/
2510 CURSOR cur_li_disb_act_int IS
2511 SELECT
2512 trim(disbact.ci_alternate_code) ci_alternate_code,
2513 trim(disbact.person_number) person_number,
2514 trim(disbact.award_number_txt) award_number_txt,
2515 disbact.disbursement_num,
2516 disbact.disb_activity_num,
2517 trim(disbact.disb_activity_type) disb_activity_type,
2518 disbact.disb_net_amt,
2519 disbact.disb_date,
2520 trim(disbact.sf_status_code) sf_status_code,
2521 disbact.sf_status_date,
2522 trim(disbact.sf_invoice_num_txt) sf_invoice_num_txt,
2523 trim(disbact.sf_credit_num_txt) sf_credit_num_txt,
2524 trim(disbact.disb_status_code) disb_status_code,
2525 disbact.notification_date,
2526 disbact.created_by,
2527 disbact.creation_date,
2528 disbact.last_updated_by,
2529 disbact.last_update_date,
2530 disbact.last_update_login,
2531 trim(disbact.spnsr_credit_num_txt) spnsr_credit_num_txt,
2532 trim(disbact.spnsr_charge_num_txt) spnsr_charge_num_txt,
2533 trim(disbact.origination_fee_amt ) origination_fee_amt ,
2534 trim(disbact.guarntee_fee_amt ) guarntee_fee_amt ,
2535 trim(disbact.origination_fee_paid_amt ) origination_fee_paid_amt ,
2536 trim(disbact.guarntee_fee_paid_amt ) guarntee_fee_paid_amt ,
2537 trim(disbact.interest_rebate_amt ) interest_rebate_amt ,
2538 trim(disbact.disbursement_accepted_amt ) disbursement_accepted_amt
2539 FROM igf_aw_li_dact_ints disbact
2540 WHERE ci_alternate_code = li_awd_disb_rec.ci_alternate_code
2541 AND person_number = li_awd_disb_rec.person_number
2542 AND award_number_txt = li_awd_disb_rec.award_number_txt
2543 AND disbursement_num = li_awd_disb_rec.disbursement_num
2544 ORDER BY disb_activity_num;
2545
2546 -- Get the last activity sequence number
2547 CURSOR cur_get_max_disb IS
2548 SELECT MAX(disb_activity_num) last_activity
2549 FROM igf_aw_li_dact_ints
2550 WHERE ci_alternate_code = li_awd_disb_rec.ci_alternate_code
2551 AND person_number = li_awd_disb_rec.person_number
2552 AND award_number_txt = li_awd_disb_rec.award_number_txt
2553 AND disbursement_num = li_awd_disb_rec.disbursement_num;
2554
2555 max_disb_num cur_get_max_disb%ROWTYPE;
2556
2557 CURSOR cur_sf_credit_num (p_credit_num igf_aw_li_dact_ints.sf_credit_num_txt%TYPE) IS
2558 SELECT credit_number, amount, credit_id
2559 FROM igs_fi_credits
2560 WHERE party_id = g_person_id
2561 AND credit_number = p_credit_num;
2562 cur_sf_credit_num_rec cur_sf_credit_num%ROWTYPE;
2563 l_trans_credit_id igs_fi_credits_all.credit_id%TYPE;
2564 l_trans_spnsr_credit_id igs_fi_credits_all.credit_id%TYPE;
2565
2566 CURSOR c_get_cal_typ_seq_num(p_alternate_code igs_ca_inst.alternate_code%TYPE) IS
2567 SELECT cal_type, sequence_number
2568 FROM igs_ca_inst
2569 WHERE alternate_code = p_alternate_code;
2570
2571 r_get_cal_typ_seq_num c_get_cal_typ_seq_num%ROWTYPE;
2572
2573
2574 CURSOR cur_sf_invoice_num(p_invoice_num igf_aw_li_dact_ints.sf_invoice_num_txt%TYPE) IS
2575 SELECT invoice_number, invoice_amount, invoice_id
2576 FROM igs_fi_inv_int
2577 WHERE person_id = g_person_id
2578 AND invoice_number = p_invoice_num;
2579 cur_sf_invoice_num_rec cur_sf_invoice_num%ROWTYPE;
2580 l_trans_invoice_id igs_fi_inv_int_all.invoice_id%TYPE;
2581 l_trans_spnsr_charge_id igs_fi_inv_int_all.invoice_id%TYPE;
2582
2583 --l_disbact_rec igf_aw_li_dact_ints%ROWTYPE;
2584 l_disbact_rec cur_li_disb_act_int%ROWTYPE;
2585 l_ctr PLS_INTEGER;
2586 l_adjust_amt igf_aw_li_dact_ints.disb_net_amt%TYPE;
2587 l_last_disb_net_amt igf_aw_li_dact_ints.disb_net_amt%TYPE;
2588 l_return_status_da VARCHAR2(1);
2589
2590 TYPE disb_net_amt_tab IS TABLE OF igf_aw_li_dact_ints.disb_net_amt%TYPE;
2591 disb_net_amt_table disb_net_amt_tab;
2592
2593 TYPE disb_date_tab IS TABLE OF igf_aw_li_dact_ints.disb_date%TYPE;
2594 disb_date_table disb_date_tab;
2595
2596 CURSOR c_get_all_disb_amt IS
2597 SELECT disbact.disb_net_amt, disbact.disb_date
2598 FROM igf_aw_li_dact_ints disbact
2599 WHERE ci_alternate_code = li_awd_disb_rec.ci_alternate_code
2600 AND person_number = li_awd_disb_rec.person_number
2601 AND award_number_txt = li_awd_disb_rec.award_number_txt
2602 AND disbursement_num = li_awd_disb_rec.disbursement_num
2603 ORDER BY disb_activity_num;
2604
2605
2606 -- Get the last disbursment sequence number activity
2607 CURSOR c_get_last_activity (p_disb_seq_num NUMBER)
2608 IS
2609 SELECT *
2610 FROM igf_aw_li_dact_ints
2611 WHERE ci_alternate_code = li_awd_disb_rec.ci_alternate_code
2612 AND person_number = li_awd_disb_rec.person_number
2613 AND award_number_txt = li_awd_disb_rec.award_number_txt
2614 AND disbursement_num = li_awd_disb_rec.disbursement_num
2615 AND disb_activity_num = p_disb_seq_num;
2616
2617 last_activity_rec c_get_last_activity%ROWTYPE;
2618
2619
2620 CURSOR cur_rowid ( p_award_id NUMBER, p_disb_num NUMBER, p_disb_seq_num NUMBER)
2621 IS
2622 SELECT ROWID row_id
2623 FROM igf_aw_db_chg_dtls
2624 WHERE award_id = p_award_id
2625 AND disb_num = p_disb_num
2626 AND disb_seq_num = p_disb_seq_num;
2627 lv_rowid cur_rowid%ROWTYPE;
2628
2629 l_rowid VARCHAR2(25);
2630 l_padding_string VARCHAR2(100);
2631
2632
2633 BEGIN -- begin of validate_disb_act_int_rec
2634 p_return_status := 'S';
2635 disb_net_amt_table := NULL; disb_date_table := NULL;
2636 l_padding_string := RPAD(' ',6,' ')||'-- ';
2637 l_disbact_rec := NULL;
2638
2639 OPEN cur_li_disb_act_int; FETCH cur_li_disb_act_int INTO l_disbact_rec;
2640 g_processing_string := l_padding_string || igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','PROCESSING') || ' '||
2641 igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','DISBURSEMENT_ACTIVITY');
2642 FND_FILE.PUT_LINE(FND_FILE.LOG,g_processing_string);
2643 -- if transaction type is Actual and disb records are not found.
2644
2645 IF(cur_li_disb_act_int%NOTFOUND AND li_awd_disb_rec.trans_type_code = 'A')THEN
2646 CLOSE cur_li_disb_act_int;
2647 p_return_status := 'E';
2648 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DACT_NOT_FND');
2649 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2650 RETURN;
2651 -- if transaction type is cancelled and disb activity records are not found
2652 ELSIF(cur_li_disb_act_int%NOTFOUND AND li_awd_disb_rec.trans_type_code = 'C') THEN
2653 CLOSE cur_li_disb_act_int;
2654 RETURN;
2655 END IF;
2656
2657 IF cur_li_disb_act_int%ISOPEN THEN
2658 CLOSE cur_li_disb_act_int;
2659 END IF;
2660
2661 --
2662 l_ctr:=1;
2663 FOR cur_li_disb_act_int_rec IN cur_li_disb_act_int LOOP
2664 IF(l_ctr <> cur_li_disb_act_int_rec.disb_activity_num) THEN
2665 p_return_status := 'E';
2666 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DB_SEQ_ST_1_INR_1');
2667 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2668 RETURN;
2669 END IF;
2670 l_ctr := l_ctr +1;
2671 END LOOP;
2672
2673
2674 IF(disb_net_amt_table IS NULL OR disb_date_table IS NULL)THEN -- this condition makes this if execute only once per call
2675
2676 -- fetch all the disb_net_amt into a PL/SQL Table. This is used in calculating the adjustment amount
2677 OPEN c_get_all_disb_amt;
2678 FETCH c_get_all_disb_amt BULK COLLECT INTO disb_net_amt_table,
2679 disb_date_table;
2680 CLOSE c_get_all_disb_amt;
2681
2682
2683 -- accepted amt in disb should be = to disb act last seq num disb_net_amt. step 15 in TD validation for disb acts
2684
2685 -- Find the last activity details
2686 OPEN cur_get_max_disb; FETCH cur_get_max_disb INTO max_disb_num ; CLOSE cur_get_max_disb;
2687 OPEN c_get_last_activity (max_disb_num.last_activity);
2688 FETCH c_get_last_activity INTO last_activity_rec;
2689 CLOSE c_get_last_activity;
2690
2691
2692 IF(( NVL(li_awd_disb_rec.accepted_amt,-1) <> NVL(disb_net_amt_table(disb_net_amt_table.COUNT),-1))
2693 OR (NVL(li_awd_disb_rec.fee_1_amt,-1) <> NVL(last_activity_rec.origination_fee_amt,-1) )
2694 OR (NVL(li_awd_disb_rec.fee_2_amt,-1) <> NVL(last_activity_rec.guarntee_fee_amt,-1) )
2695 OR (NVL(li_awd_disb_rec.fee_paid_1_amt,-1) <> NVL(last_activity_rec.origination_fee_paid_amt,-1) )
2696 OR (NVL(li_awd_disb_rec.fee_paid_2_amt,-1) <> NVL(last_activity_rec.guarntee_fee_paid_amt,-1) )
2697 OR (NVL(li_awd_disb_rec.int_rebate_amt,-1) <> NVL(last_activity_rec.interest_rebate_amt,-1) )
2698 )THEN
2699
2700
2701 p_return_status := 'E';
2702 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_ACPT_AMT_EQ_DISB_NET');
2703 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2704 END IF;
2705 END IF;
2706
2707 -- l_ctr has a different meaning here. used in calculating the disb_net_amt
2708 l_ctr := 0;
2709 FOR cur_li_disb_act_int_rec IN cur_li_disb_act_int LOOP
2710 l_ctr := l_ctr +1;
2711 g_processing_string := l_padding_string || igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','PROCESSING') || ' '||
2712 igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','DISBURSEMENT_ACTIVITY');
2713 FND_FILE.PUT_LINE(FND_FILE.LOG,g_processing_string||': '||cur_li_disb_act_int_rec.disb_activity_num);
2714 l_trans_invoice_id := NULL; l_trans_credit_id := NULL; l_trans_spnsr_credit_id := NULL; l_trans_spnsr_charge_id := NULL;
2715
2716 -- Disb Activity Table should not be processed for Disb Transaction Type is PLANNED
2717 IF(li_awd_disb_rec.trans_type_code = 'P' AND cur_li_disb_act_int_rec.person_number IS NOT NULL)THEN
2718 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_NO_PRC_ACTIVITY');
2719 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2720 RETURN;
2721 END IF;
2722
2723 -- sponsorship charge number and sponsorship activity number should be blank for non sponsorship awards
2724 -- introduced in FACR117
2725 IF(g_fed_fund_code <> 'SPNSR')THEN
2726 IF(cur_li_disb_act_int_rec.spnsr_credit_num_txt IS NOT NULL)THEN
2727 p_return_status := 'E';
2728 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_COL_BLNK');
2729 FND_MESSAGE.SET_TOKEN('COLUMN_NAME','SPNSR_CREDIT_NUM_TXT');
2730 FND_MESSAGE.SET_TOKEN('FUND_CODE',li_awd_rec.fund_code);
2731 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2732 END IF;
2733 IF(cur_li_disb_act_int_rec.spnsr_charge_num_txt IS NOT NULL)THEN
2734 p_return_status := 'E';
2735 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_COL_BLNK');
2736 FND_MESSAGE.SET_TOKEN('COLUMN_NAME','SPNSR_CHARGE_NUM_TXT');
2737 FND_MESSAGE.SET_TOKEN('FUND_CODE',li_awd_rec.fund_code);
2738 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2739 END IF;
2740 ELSIF(g_fed_fund_code = 'SPNSR')THEN
2741 IF(cur_li_disb_act_int_rec.sf_status_code IS NOT NULL AND cur_li_disb_act_int_rec.sf_status_code = 'P')THEN
2742 -- for posted transactions either both invoice number and sponsor credit number should be not null or both should be null.
2743 -- in any other cases, log an error
2744 IF ((cur_li_disb_act_int_rec.sf_invoice_num_txt IS NULL AND cur_li_disb_act_int_rec.spnsr_credit_num_txt IS NOT NULL) OR
2745 (cur_li_disb_act_int_rec.sf_invoice_num_txt IS NOT NULL AND cur_li_disb_act_int_rec.spnsr_credit_num_txt IS NULL))THEN
2746 p_return_status := 'E';
2747 FND_MESSAGE.SET_NAME('IGF','IGF_SP_LI_INVN_SPCRN_REQ');
2748 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2749 END IF;
2750 IF ((cur_li_disb_act_int_rec.sf_credit_num_txt IS NULL AND cur_li_disb_act_int_rec.spnsr_charge_num_txt IS NOT NULL) OR
2751 (cur_li_disb_act_int_rec.sf_credit_num_txt IS NOT NULL AND cur_li_disb_act_int_rec.spnsr_charge_num_txt IS NULL)) THEN
2752 p_return_status := 'E';
2753 FND_MESSAGE.SET_NAME('IGF','IGF_SP_LI_CRN_SPINVN_REQ');
2754 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2755 END IF;
2756 END IF;
2757 END IF;
2758
2759 -- These validations are necessary only from second Disb Act records
2760 IF(l_ctr > 1)THEN
2761 -- adjustment amount is calculated here.
2762 l_adjust_amt := disb_net_amt_table(l_ctr) - disb_net_amt_table(l_ctr-1);
2763 -- disb dates should be in ascending order
2764 IF(disb_date_table(l_ctr) < disb_date_table(l_ctr-1))THEN
2765 p_return_status := 'E';
2766 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_ADJ_DB_DT_INVALID');
2767 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2768 END IF;
2769 ELSIF(l_ctr = 1)THEN
2770 l_adjust_amt := 0;
2771 END IF;
2772
2773 -- disbursement date cannot be greater than sysdate
2774 IF(disb_date_table(l_ctr) > trunc(SYSDATE))THEN
2775 p_return_status := 'E';
2776 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_ADJ_DB_DT_GT_SYSDATE');
2777 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2778 END IF;
2779
2780 -- both sf_invoice_num_txt and sf_credit_num_txt should not be present at the disb activity level. error if such case
2781 IF(cur_li_disb_act_int_rec.sf_invoice_num_txt IS NOT NULL AND cur_li_disb_act_int_rec.sf_credit_num_txt IS NOT NULL)THEN
2782 p_return_status := 'E';
2783 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_CRINV_BOTH_PRSNT');
2784 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2785 END IF;
2786
2787 -- if either the invoice num txt or the credit_num_txt is present then sf_status_code is mandatory
2788 IF(cur_li_disb_act_int_rec.sf_invoice_num_txt IS NOT NULL OR cur_li_disb_act_int_rec.sf_credit_num_txt IS NOT NULL) THEN
2789 IF(cur_li_disb_act_int_rec.sf_status_code IS NULL)THEN
2790 p_return_status := 'E';
2791 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_SF_STATUS_BLNK');
2792 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2793 END IF;
2794 END IF;
2795
2796 -- Validate SF status code values
2797 IF(cur_li_disb_act_int_rec.sf_status_code IS NOT NULL AND cur_li_disb_act_int_rec.sf_status_code NOT IN ('P','R'))THEN
2798 p_return_status := 'E';
2799 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_SF_STATUS_INVALID');
2800 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2801 END IF;
2802
2803 -- first disb activity cannot have invoice number
2804 IF(cur_li_disb_act_int_rec.sf_invoice_num_txt IS NOT NULL AND l_ctr = 1)THEN
2805 p_return_status := 'E';
2806 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_INV_NUM_FIRST_DBIB');
2807 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2808 END IF;
2809
2810 -- credit number validation for posted transactions only. valid for open and legacy details award years
2811 IF(cur_li_disb_act_int_rec.sf_credit_num_txt IS NOT NULL AND cur_li_disb_act_int_rec.sf_status_code = 'P')THEN
2812 -- Fetch the credit number from the igs_fi_credits table
2813 cur_sf_credit_num_rec := NULL;
2814 OPEN cur_sf_credit_num(cur_li_disb_act_int_rec.sf_credit_num_txt); FETCH cur_sf_credit_num INTO cur_sf_credit_num_rec;
2815 CLOSE cur_sf_credit_num;
2816 l_trans_credit_id := cur_sf_credit_num_rec.credit_id;
2817 IF(FND_LOG.LEVEL_STATEMENT >= g_debug_runtime_level)THEN
2818 g_debug_string := 'SF Credit Num'||cur_sf_credit_num_rec.credit_number||'credit id'||l_trans_credit_id;
2819 END IF;
2820 IF(cur_sf_credit_num_rec.credit_number IS NULL)THEN
2821 p_return_status := 'E';
2822 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_CR_NUM_NOT_FND');
2823 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2824 END IF;
2825 -- credit amount validations for open award year only. the credit amount should match with the adjusted amount
2826 IF(g_award_year_status_code = 'O' AND cur_sf_credit_num_rec.amount IS NOT NULL)THEN
2827 IF((cur_sf_credit_num_rec.amount <> ABS(l_adjust_amt) AND l_ctr <> 1) OR
2828 (l_ctr=1 AND cur_sf_credit_num_rec.amount <> cur_li_disb_act_int_rec.disb_net_amt))THEN
2829 p_return_status := 'E';
2830 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_CR_AMT_NOT_MTCH');
2831 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2832 END IF;
2833 END IF;
2834 END IF;
2835
2836 -- invoice number validation for posted transactions only. valid for open and legacy details award years
2837 IF(cur_li_disb_act_int_rec.sf_invoice_num_txt IS NOT NULL AND cur_li_disb_act_int_rec.sf_status_code = 'P')THEN
2838 cur_sf_invoice_num_rec := NULL;
2839 OPEN cur_sf_invoice_num(cur_li_disb_act_int_rec.sf_invoice_num_txt); FETCH cur_sf_invoice_num INTO cur_sf_invoice_num_rec;
2840 CLOSE cur_sf_invoice_num;
2841 l_trans_invoice_id := cur_sf_invoice_num_rec.invoice_id;
2842 IF(FND_LOG.LEVEL_STATEMENT >= g_debug_runtime_level)THEN
2843 g_debug_string := g_debug_string ||'SF Invoice Num'||cur_sf_invoice_num_rec.invoice_number||'invoice id'||l_trans_invoice_id;
2844 END IF;
2845 IF(cur_sf_invoice_num_rec.invoice_number IS NULL)THEN
2846 p_return_status := 'E';
2847 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_INV_NUM_NOT_FND');
2848 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2849 END IF;
2850 -- invoice amount validations for open award year only. the invoice amount should match with the adjusted amount
2851 IF(g_award_year_status_code = 'O' AND cur_sf_invoice_num_rec.invoice_amount IS NOT NULL AND l_ctr <> 1)THEN
2852 IF(cur_sf_invoice_num_rec.invoice_amount <> ABS(l_adjust_amt))THEN
2853 p_return_status := 'E';
2854 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_INV_AMT_NOT_MTCH');
2855 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2856 END IF;
2857 END IF;
2858 END IF;
2859
2860 -- sponsor credit number validations for posted transactions only. applicable for open as well as legacy details award years
2861 IF(cur_li_disb_act_int_rec.spnsr_credit_num_txt IS NOT NULL AND cur_li_disb_act_int_rec.sf_status_code = 'P')THEN
2862 --Fetch the Sponsorship Credit number from the igs_fi_credits_table
2863 cur_sf_credit_num_rec := NULL;
2864 OPEN cur_sf_credit_num(cur_li_disb_act_int_rec.spnsr_credit_num_txt); FETCH cur_sf_credit_num INTO cur_sf_credit_num_rec;
2865 CLOSE cur_sf_credit_num;
2866 l_trans_spnsr_credit_id := cur_sf_credit_num_rec.credit_id;
2867 IF(FND_LOG.LEVEL_STATEMENT >= g_debug_runtime_level)THEN
2868 g_debug_string := 'SF sponsor credit num'||cur_sf_credit_num_rec.credit_number||'credit id is'||l_trans_spnsr_credit_id;
2869 END IF;
2870 IF(cur_sf_credit_num_rec.credit_number IS NULL)THEN
2871 p_return_status := 'E';
2872 FND_MESSAGE.SET_NAME('IGF','IGF_SP_LI_SPNSR_CRNUM_NOT_FND');
2873 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2874 END IF;
2875 -- credit amount validations for open award year only. the credit amount should match with the adjusted amount
2876 IF(g_award_year_status_code = 'O' AND cur_sf_credit_num_rec.amount IS NOT NULL)THEN
2877 IF((cur_sf_credit_num_rec.amount <> ABS(l_adjust_amt) AND l_ctr <> 1) OR
2878 (l_ctr=1 AND cur_sf_credit_num_rec.amount <> cur_li_disb_act_int_rec.disb_net_amt))THEN
2879 p_return_status := 'E';
2880 FND_MESSAGE.SET_NAME('IGF','IGF_SP_LI_CR_AMT_NOT_MTCH');
2881 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2882 END IF;
2883 END IF;
2884 END IF;
2885
2886 -- sponsor charge number validation for posted transactions only. valid for open and legacy details award years
2887 IF(cur_li_disb_act_int_rec.spnsr_charge_num_txt IS NOT NULL AND cur_li_disb_act_int_rec.sf_status_code = 'P')THEN
2888 cur_sf_invoice_num_rec := NULL;
2889 OPEN cur_sf_invoice_num(cur_li_disb_act_int_rec.spnsr_charge_num_txt); FETCH cur_sf_invoice_num INTO cur_sf_invoice_num_rec;
2890 CLOSE cur_sf_invoice_num;
2891 l_trans_spnsr_charge_id := cur_sf_invoice_num_rec.invoice_id;
2892 IF(FND_LOG.LEVEL_STATEMENT >= g_debug_runtime_level)THEN
2893 g_debug_string := g_debug_string ||'SF sponsor charge Num'||cur_sf_invoice_num_rec.invoice_number||'charge id'||l_trans_spnsr_charge_id;
2894 END IF;
2895 IF(cur_sf_invoice_num_rec.invoice_number IS NULL)THEN
2896 p_return_status := 'E';
2897 FND_MESSAGE.SET_NAME('IGF','IGF_SP_LI_SPNSR_INNUM_NOT_FND');
2898 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2899 END IF;
2900 -- sponsor charge amount validations for open award year only. the invoice amount should match with the adjusted amount
2901 IF(g_award_year_status_code = 'O' AND cur_sf_invoice_num_rec.invoice_amount IS NOT NULL AND l_ctr <> 1)THEN
2902 IF(cur_sf_invoice_num_rec.invoice_amount <> ABS(l_adjust_amt))THEN
2903 p_return_status := 'E';
2904 FND_MESSAGE.SET_NAME('IGF','IGF_SP_LI_INV_AMT_NOT_MTCH');
2905 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2906 END IF;
2907 END IF;
2908 END IF;
2909
2910 -- student finance status date
2911 IF(NVL(cur_li_disb_act_int_rec.sf_status_code,'X') = 'P' OR
2912 cur_li_disb_act_int_rec.sf_invoice_num_txt IS NOT NULL OR
2913 cur_li_disb_act_int_rec.sf_credit_num_txt IS NOT NULL)THEN
2914 IF(cur_li_disb_act_int_rec.sf_status_date IS NULL)THEN
2915 p_return_status := 'E';
2916 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_SF_STATUS_DT_BLNK');
2917 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2918 END IF;
2919 END IF;
2920
2921 IF(cur_li_disb_act_int_rec.sf_status_code IS NOT NULL AND cur_li_disb_act_int_rec.sf_status_code = 'R')THEN
2922 -- validation introduced in FACR117. when the sf_status is ready to send, the by products of the posting
2923 -- should be null. viz. the status date, invioce num, credit num, spnsr credit num, spnsr invoice num
2924 IF(cur_li_disb_act_int_rec.sf_status_date IS NOT NULL OR cur_li_disb_act_int_rec.sf_credit_num_txt IS NOT NULL OR
2925 cur_li_disb_act_int_rec.sf_invoice_num_txt IS NOT NULL OR cur_li_disb_act_int_rec.spnsr_credit_num_txt IS NOT NULL OR
2926 cur_li_disb_act_int_rec.spnsr_charge_num_txt IS NOT NULL)THEN
2927 p_return_status := 'E';
2928 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_SF_STATUS_DT_NTREQ');
2929 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2930 END IF;
2931 END IF;
2932
2933 IF((l_adjust_amt < 0 AND cur_li_disb_act_int_rec.sf_credit_num_txt IS NOT NULL) OR
2934 (l_adjust_amt >= 0 AND cur_li_disb_act_int_rec.sf_invoice_num_txt IS NOT NULL)
2935 ) THEN
2936 p_return_status := 'E';
2937 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_INC_CR_INV_NUM');
2938 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2939 END IF;
2940
2941 -- validate disbursement status and disbursement ctivity.
2942 IF(g_fed_fund_code IN ('DLP','DLS','DLU'))THEN
2943
2944 IF(cur_li_disb_act_int_rec.disb_status_code IS NULL)THEN
2945 p_return_status := 'E';
2946 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_INV_DISB_ACT');
2947 FND_MESSAGE.SET_TOKEN('FUND',li_awd_rec.fund_code);
2948 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2949 ELSIF(cur_li_disb_act_int_rec.disb_status_code NOT IN ('A','B','G','R'))THEN
2950 p_return_status := 'E';
2951 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_ACT_UPD');
2952 FND_MESSAGE.SET_TOKEN('COL_NAME', 'DISB_STATUS_CODE');
2953 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2954 END IF;
2955
2956 IF cur_li_disb_act_int_rec.disb_activity_type IS NULL THEN
2957 p_return_status := 'E';
2958 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_INVLD_ACTVTY_CD');
2959 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2960 ELSE
2961 IF(cur_li_disb_act_int_rec.disb_activity_type NOT IN ('D','A','Q'))THEN
2962 p_return_status := 'E';
2963 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_ACT_UPD');
2964 FND_MESSAGE.SET_TOKEN('COL_NAME','DISB_ACTIVITY_TYPE');
2965 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2966 END IF;
2967 -- the first disbact record should have the disbact type as D always
2968 IF(l_ctr = 1 AND cur_li_disb_act_int_rec.disb_activity_type <> 'D')THEN
2969 p_return_status := 'E';
2970 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_DISB_FIRST_ACT');
2971 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2972 END IF;
2973 END IF;
2974
2975
2976 ELSE
2977 -- disbursement status and activity should be null for non Direct Loans
2978 IF(cur_li_disb_act_int_rec.disb_status_code IS NOT NULL)THEN
2979 p_return_status := 'E';
2980 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_ACT_COL_BLNK');
2981 FND_MESSAGE.SET_TOKEN('COLUMN_NAME','DISB_STATUS_CODE');
2982 FND_MESSAGE.SET_TOKEN('FUND_CODE',li_awd_rec.fund_code);
2983 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2984 END IF;
2985 IF(cur_li_disb_act_int_rec.disb_activity_type IS NOT NULL)THEN
2986 p_return_status := 'E';
2987 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_ACT_COL_BLNK');
2988 FND_MESSAGE.SET_TOKEN('COLUMN_NAME','DISB_ACTIVITY_TYPE');
2989 FND_MESSAGE.SET_TOKEN('FUND_CODE',li_awd_rec.fund_code);
2990 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2991 END IF;
2992 END IF;
2993
2994 -- Disbusement Accepted amount is a mandatory amount
2995 IF cur_li_disb_act_int_rec.disbursement_accepted_amt IS NULL THEN
2996 p_return_status := 'E';
2997 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_ACPT_AMT_BLNK');
2998 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string || FND_MESSAGE.GET);
2999 END IF;
3000
3001
3002 -- insert row only if all the validations are successful
3003 -- check for cal of l_adjust_amt
3004
3005 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3006 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_li_import.validate_disb_act_int_rec.debug','inserting into igf_db_awd_disb_dtl table');
3007 END IF;
3008
3009 IF p_return_status <> 'E' THEN
3010 l_rowid := NULL;
3011
3012 OPEN c_get_cal_typ_seq_num(li_awd_disb_rec.ld_alternate_code);
3013 FETCH c_get_cal_typ_seq_num INTO r_get_cal_typ_seq_num;
3014 CLOSE c_get_cal_typ_seq_num;
3015
3016 igf_db_awd_disb_dtl_pkg.insert_row (
3017 x_rowid => l_rowid,
3018 x_award_id => g_award_id,
3019 x_disb_num => li_awd_disb_rec.disbursement_num,
3020 x_disb_seq_num => cur_li_disb_act_int_rec.disb_activity_num,
3021 x_disb_gross_amt => cur_li_disb_act_int_rec.disbursement_accepted_amt,
3022 x_fee_1 => cur_li_disb_act_int_rec.origination_fee_amt ,
3023 x_fee_2 => cur_li_disb_act_int_rec.guarntee_fee_amt ,
3024 x_disb_net_amt => cur_li_disb_act_int_rec.disb_net_amt,
3025 x_disb_adj_amt => l_adjust_amt ,
3026 x_disb_date => cur_li_disb_act_int_rec.disb_date,
3027 x_fee_paid_1 => cur_li_disb_act_int_rec.origination_fee_paid_amt,
3028 x_fee_paid_2 => cur_li_disb_act_int_rec.guarntee_fee_paid_amt ,
3029 x_disb_activity => cur_li_disb_act_int_rec.disb_activity_type,
3030 x_disb_batch_id => NULL,
3031 x_disb_ack_date => NULL,
3032 x_booking_batch_id => NULL,
3033 x_booked_date => NULL,
3034 x_disb_status => cur_li_disb_act_int_rec.disb_status_code,
3035 x_disb_status_date => NULL,
3036 x_sf_status => cur_li_disb_act_int_rec.sf_status_code,
3037 x_sf_status_date => cur_li_disb_act_int_rec.sf_status_date,
3038 x_sf_invoice_num => l_trans_invoice_id, -- dont get confused by the col name. this is invoice id only
3039 x_spnsr_credit_id => l_trans_spnsr_credit_id,
3040 x_spnsr_charge_id => l_trans_spnsr_charge_id,
3041 x_sf_credit_id => l_trans_credit_id,
3042 x_error_desc => NULL,
3043 x_mode => 'R',
3044 x_notification_date => cur_li_disb_act_int_rec.notification_date,
3045 x_interest_rebate_amt => cur_li_disb_act_int_rec.interest_rebate_amt,
3046 x_ld_cal_type => r_get_cal_typ_seq_num.cal_type,
3047 x_ld_sequence_number => r_get_cal_typ_seq_num.sequence_number
3048 );
3049
3050
3051 IF(l_rowid IS NULL)THEN
3052 p_return_status := 'E';
3053 RETURN;
3054 END IF;
3055
3056 IF fnd_log.level_statement >= fnd_log.g_current_runtime_level THEN
3057 fnd_log.string(fnd_log.level_statement,'igf.plsql.igf_aw_li_import.validate_disb_act_int_rec.debug','inserting into igf_aw_db_chg_dtls table');
3058 END IF;
3059 -- insert into IGF_AW_DB_CHG_DTLS table also
3060
3061 -- First delete the record in the table if present
3062 OPEN cur_rowid (g_award_id, li_awd_disb_rec.disbursement_num, cur_li_disb_act_int_rec.disb_activity_num);
3063 FETCH cur_rowid INTO lv_rowid;
3064
3065 IF cur_rowid%FOUND THEN
3066 CLOSE cur_rowid;
3067 igf_aw_db_chg_dtls_pkg.delete_row(lv_rowid.row_id);
3068 ELSE
3069 CLOSE cur_rowid;
3070 END IF;
3071
3072
3073 l_rowid := NULL;
3074 igf_aw_db_chg_dtls_pkg.insert_row (
3075 x_rowid => l_rowid,
3076 x_award_id => g_award_id,
3077 x_disb_num => li_awd_disb_rec.disbursement_num,
3078 x_disb_seq_num => cur_li_disb_act_int_rec.disb_activity_num,
3079 x_disb_accepted_amt => cur_li_disb_act_int_rec.disbursement_accepted_amt,
3080 x_orig_fee_amt => cur_li_disb_act_int_rec.origination_fee_amt,
3081 x_disb_net_amt => cur_li_disb_act_int_rec.disb_net_amt,
3082 x_disb_date => cur_li_disb_act_int_rec.disb_date,
3083 x_disb_activity => cur_li_disb_act_int_rec.disb_activity_type,
3084 x_disb_status => cur_li_disb_act_int_rec.disb_status_code,
3085 x_disb_status_date => NULL,
3086 x_disb_rel_flag => NULL,
3087 x_first_disb_flag => NULL,
3088 x_interest_rebate_amt => cur_li_disb_act_int_rec.interest_rebate_amt ,
3089 x_disb_conf_flag => NULL,
3090 x_pymnt_prd_start_date => NULL,
3091 x_note_message => NULL,
3092 x_batch_id_txt => NULL,
3093 x_ack_date => NULL,
3094 x_booking_id_txt => NULL,
3095 x_booking_date => NULL,
3096 x_mode => 'R'
3097
3098 );
3099
3100 IF(l_rowid IS NULL)THEN
3101 p_return_status := 'E';
3102 RETURN;
3103 END IF;
3104
3105
3106 END IF; -- End if of p_return_status <> 'E'
3107
3108 IF(FND_LOG.LEVEL_STATEMENT >= g_debug_runtime_level)THEN
3109 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,'igf.plsql.igf_aw_li_import.validate_disb_act_int_rec.debug',g_debug_string);
3110 g_debug_string := NULL;
3111 END IF;
3112 END LOOP;
3113
3114 EXCEPTION WHEN OTHERS THEN
3115 p_return_status := 'E';
3116 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
3117 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
3118 'igf.plsql.igf_aw_li_import.validate_disb_act_int_rec.exception',
3119 SQLERRM);
3120 END IF;
3121 FND_MESSAGE.SET_NAME('IGF','IGF_GE_UNHANDLED_EXP');
3122 FND_MESSAGE.SET_TOKEN('NAME','VALIDATE_DISB_ACT_INT_REC : '||SQLERRM);
3123 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
3124 END validate_disb_act_int_rec;
3125
3126 PROCEDURE validate_disb_hold_int_rec(li_awd_rec igf_aw_li_awd_ints%ROWTYPE,
3127 li_awd_disb_rec igf_aw_li_disb_ints%ROWTYPE,
3128 p_return_status OUT NOCOPY VARCHAR2
3129 ) IS
3130 /***************************************************************
3131 Created By : nsidana
3132 Date Created By : 11/28/2003
3133 Purpose : Validates disbursements holds interface record.
3134 Known Limitations,Enhancements or Remarks
3135 Change History :
3136 Who When What
3137 ***************************************************************/
3138 CURSOR cur_li_disb_hold_int IS
3139 SELECT
3140 trim(disbhold.ci_alternate_code) ci_alternate_code,
3141 trim(disbhold.person_number) person_number,
3142 trim(disbhold.award_number_txt) award_number_txt,
3143 disbhold.disbursement_num,
3144 trim(disbhold.hold_code) hold_code,
3145 disbhold.hold_date,
3146 disbhold.release_date,
3147 trim(disbhold.release_reason_txt) release_reason_txt,
3148 disbhold.created_by,
3149 disbhold.creation_date,
3150 disbhold.last_updated_by,
3151 disbhold.last_update_date,
3152 disbhold.last_update_login
3153 FROM igf_aw_li_hold_ints disbhold
3154 WHERE ci_alternate_code = li_awd_disb_rec.ci_alternate_code
3155 AND person_number = li_awd_disb_rec.person_number
3156 AND award_number_txt = li_awd_disb_rec.award_number_txt
3157 AND disbursement_num = li_awd_disb_rec.disbursement_num;
3158
3159 x_release_flag igf_db_disb_holds_all.release_flag%TYPE;
3160 l_rowid VARCHAR2(25);
3161 l_hold_id igf_db_disb_holds_All.hold_id%TYPE;
3162 l_release_flag igf_db_disb_holds_all.release_flag%TYPE;
3163
3164 l_padding_string VARCHAR2(100);
3165
3166 BEGIN
3167 p_return_status := 'S';
3168 l_padding_string := RPAD(' ',6,' ')||'-- ';
3169 g_processing_string := l_padding_string || igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','PROCESSING') || ' '||
3170 igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','DISBURSEMENT_HOLD');
3171 FOR cur_li_disb_hold_int_rec IN cur_li_disb_hold_int LOOP
3172 FND_FILE.PUT_LINE(FND_FILE.LOG,g_processing_string||': '||cur_li_disb_hold_int_rec.hold_code);
3173 -- validate hold code
3174 -- should be one of 'CL','DL','DL_PROM','ENROLMENT','MISC','OVERAWARD','PELL' unless some are removed for certain award years
3175 IF(igf_ap_gen.get_aw_lookup_meaning('IGF_DB_DISB_HOLDS',cur_li_disb_hold_int_rec.hold_code, g_sys_award_year)IS NULL)THEN
3176 p_return_status := 'E';
3177 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_INVAL_HOLD_CODE');
3178 FND_MESSAGE.SET_TOKEN('HOCDE',cur_li_disb_hold_int_rec.hold_code);
3179 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string ||FND_MESSAGE.GET);
3180 RETURN;
3181 END IF;
3182 IF(cur_li_disb_hold_int_rec.release_date IS NOT NULL AND cur_li_disb_hold_int_rec.hold_date IS NOT NULL)THEN
3183 IF(trunc(cur_li_disb_hold_int_rec.release_date) < trunc(cur_li_disb_hold_int_rec.hold_date))THEN
3184 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_INVAL_REL_DATE');
3185 FND_FILE.PUT_LINE(FND_FILE.LOG,l_padding_string ||FND_MESSAGE.GET);
3186 RETURN;
3187 END IF;
3188 END IF;
3189 IF(cur_li_disb_hold_int_rec.release_date IS NULL)THEN
3190 x_release_flag := 'N';
3191 ELSE
3192 x_release_flag := 'Y';
3193 END IF;
3194 IF(cur_li_disb_hold_int_rec.release_date IS NULL)THEN
3195 l_release_flag := 'N';
3196 ELSE
3197 l_release_flag := 'Y';
3198 END IF;
3199 l_rowid := NULL;l_hold_id:=NULL;
3200 igf_db_disb_holds_pkg.insert_row(
3201 x_rowid => l_rowid,
3202 x_hold_id => l_hold_id,
3203 x_award_id => g_award_id,
3204 x_disb_num => li_awd_disb_rec.disbursement_num,
3205 x_hold => cur_li_disb_hold_int_rec.hold_code,
3206 x_hold_date => cur_li_disb_hold_int_rec.hold_date,
3207 x_hold_type => 'SYSTEM',
3208 x_release_date => cur_li_disb_hold_int_rec.release_date,
3209 x_release_flag => l_release_flag,
3210 x_release_reason=> cur_li_disb_hold_int_rec.release_reason_txt
3211 );
3212 IF(l_hold_id IS NULL)THEN
3213 p_return_status := 'E';
3214 RETURN;
3215 END IF;
3216 END LOOP;
3217 EXCEPTION WHEN OTHERS THEN
3218 p_return_status := 'E';
3219 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
3220 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
3221 'igf.plsql.igf_aw_li_import.validate_disb_hold_int_rec.exception',
3222 SQLERRM);
3223 END IF;
3224 FND_MESSAGE.SET_NAME('IGF','IGF_GE_UNHANDLED_EXP');
3225 FND_MESSAGE.SET_TOKEN('NAME','VALIDATE_DISB_HOLD_INT_REC : '||SQLERRM);
3226 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
3227 END validate_disb_hold_int_rec;
3228
3229
3230 PROCEDURE main(errbuf OUT NOCOPY VARCHAR2,
3231 retcode OUT NOCOPY NUMBER,
3232 p_award_year IN VARCHAR2,
3233 p_batch_number IN NUMBER,
3234 p_delete_flag IN VARCHAR2
3235 ) IS
3236
3237 /***************************************************************
3238 Created By : nsidana
3239 Date Created By : 11/28/2003
3240 Purpose : Main procedure for the legacy awards and disbursements import process.
3241 Known Limitations,Enhancements or Remarks
3242 Change History :
3243 Who When What
3244 || tsailaja 13/Jan/2006 Bug 4947880 Added invocation of igf_aw_gen.set_org_id(NULL);
3245 ***************************************************************/
3246 l_cal_type igs_ca_inst.cal_type%TYPE;
3247 l_seq_number igs_ca_inst.sequence_number%TYPE;
3248
3249 l_var_cal_type igs_ca_inst.cal_type%TYPE;
3250 l_var_seq_number igs_ca_inst.sequence_number%TYPE;
3251 l_ret_value BOOLEAN;
3252
3253 l_success_records PLS_INTEGER;
3254 l_warning_records PLS_INTEGER;
3255 l_rejected_records PLS_INTEGER;
3256 l_total_records PLS_INTEGER;
3257 lv_profile_value VARCHAR2(30);
3258 lv_base_id igf_ap_fa_base_rec_all.base_id%TYPE;
3259
3260
3261 -- cursor to get the calendar alternate code
3262 CURSOR cur_alt_code ( x_ci_cal_type igs_ca_inst.cal_type%TYPE,
3263 x_ci_sequence_number igs_ca_inst.sequence_number%TYPE) IS
3264 SELECT cal.alternate_code
3265 FROM igs_ca_inst cal
3266 WHERE cal.cal_type = x_ci_cal_type
3267 AND cal.sequence_number = x_ci_sequence_number;
3268 l_alternate_code igs_ca_inst.alternate_code%TYPE;
3269
3270 -- cursor to verify if the cal_type and seq_number are present in the system award year
3271 CURSOR cur_in_award_year_form(x_ci_cal_type igs_ca_inst.cal_type%TYPE,
3272 x_ci_sequence_number igs_ca_inst.sequence_number%TYPE) IS
3273 SELECT award_year_status_code, sys_award_year
3274 FROM igf_ap_batch_aw_map
3275 WHERE ci_cal_type = x_ci_cal_type
3276 AND ci_sequence_number = x_ci_sequence_number;
3277 l_award_year_status_code igf_ap_batch_aw_map_all.award_year_status_code%TYPE;
3278 l_sys_award_year igf_ap_batch_aw_map_all.sys_award_year%TYPE;
3279 l_return_status_awd VARCHAR2(1);
3280
3281 PROCEDURE del_or_upd_int_records(p_operation IN VARCHAR2,
3282 ctx_li_awd_rec IN igf_aw_li_awd_ints%ROWTYPE,
3283 p_status IN VARCHAR2) IS
3284 BEGIN
3285
3286 IF(p_operation = 'U')THEN
3287 UPDATE igf_aw_li_awd_ints
3288 SET import_status_type = p_status,
3289 last_updated_by = fnd_global.user_id,
3290 last_update_date = SYSDATE,
3291 last_update_login = fnd_global.login_id,
3292 request_id = fnd_global.conc_request_id,
3293 program_id = fnd_global.conc_program_id,
3294 program_application_id = fnd_global.prog_appl_id,
3295 program_update_date = SYSDATE
3296 WHERE ci_alternate_code = ctx_li_awd_rec.ci_alternate_code
3297 AND person_number = ctx_li_awd_rec.person_number
3298 AND award_number_txt = ctx_li_awd_rec.award_number_txt
3299 AND import_status_type = ctx_li_awd_rec.import_status_type;
3300 ELSIF(p_operation = 'D') THEN
3301 DELETE FROM igf_aw_li_dact_ints
3302 WHERE ci_alternate_code = ctx_li_awd_rec.ci_alternate_code
3303 AND person_number = ctx_li_awd_rec.person_number
3304 AND award_number_txt = ctx_li_awd_rec.award_number_txt;
3305
3306 DELETE FROM igf_aw_li_hold_ints
3307 WHERE ci_alternate_code = ctx_li_awd_rec.ci_alternate_code
3308 AND person_number = ctx_li_awd_rec.person_number
3309 AND award_number_txt = ctx_li_awd_rec.award_number_txt;
3310
3311 DELETE FROM igf_aw_li_disb_ints
3312 WHERE ci_alternate_code = ctx_li_awd_rec.ci_alternate_code
3313 AND person_number = ctx_li_awd_rec.person_number
3314 AND award_number_txt = ctx_li_awd_rec.award_number_txt;
3315
3316 DELETE FROM igf_aw_li_awd_ints
3317 WHERE ci_alternate_code = ctx_li_awd_rec.ci_alternate_code
3318 AND person_number = ctx_li_awd_rec.person_number
3319 AND award_number_txt = ctx_li_awd_rec.award_number_txt
3320 AND import_status_type = ctx_li_awd_rec.import_status_type;
3321 END IF;
3322 EXCEPTION WHEN OTHERS THEN
3323 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
3324 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION,
3325 'igf.plsql.igf_aw_li_import.del_or_upd_int_records.exception',
3326 'Unhandled Exception'||SQLERRM);
3327 END IF;
3328 FND_MESSAGE.SET_NAME('IGF','IGF_GE_UNHANDLED_EXP');
3329 FND_MESSAGE.SET_TOKEN('NAME','DEL_OR_UPD_INT_RECORDS : '||SQLERRM );
3330 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
3331 END del_or_upd_int_records;
3332
3333
3334 BEGIN
3335 igf_aw_gen.set_org_id(NULL);
3336
3337 -- begin of procedure main
3338 -- Obtain cal_type and sequence number from the Parameter p_award_year
3339 g_debug_runtime_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
3340 l_cal_type := TRIM(SUBSTR(p_award_year,1,10));
3341 l_seq_number := TO_NUMBER(SUBSTR(p_award_year,11));
3342
3343 IF(FND_LOG.LEVEL_STATEMENT >= g_debug_runtime_level)THEN
3344 g_debug_string := 'REQUEST ID: '||fnd_global.conc_request_id;
3345 END IF;
3346
3347 -- copy the values into global variables for further processing
3348 g_ci_cal_type := l_cal_type; g_ci_sequence_number := l_seq_number;
3349
3350 -- <1> validate if the school is configured for us financial aid functionallity
3351 IF(igf_ap_gen.check_profile = 'N') THEN
3352 FND_MESSAGE.SET_NAME('IGF','IGF_AP_LGCY_PROC_NOT_RUN');
3353 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
3354 retcode := 2;
3355 RETURN;
3356 END IF;
3357
3358 -- obtain the alternate code corresponding to the passed cal_type and seq_number
3359 OPEN cur_alt_code(l_cal_type,l_seq_number); FETCH cur_alt_code INTO l_alternate_code;CLOSE cur_alt_code;
3360
3361 -- Record the parameters in the log
3362 FND_FILE.PUT_LINE(FND_FILE.LOG,igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','PARAMETER_PASS'));
3363 FND_FILE.PUT_LINE(FND_FILE.LOG,RPAD(igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','AWARD_YEAR'),25) || ' : '|| l_alternate_code);
3364 FND_FILE.PUT_LINE(FND_FILE.LOG,RPAD(igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','BATCH_NUMBER'),25) || ' : '|| p_batch_number);
3365 FND_FILE.PUT_LINE(FND_FILE.LOG,RPAD(igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','DELETE_FLAG'),25) || ' : '||
3366 igf_ap_gen.get_lookup_meaning('IGF_AP_YES_NO',p_delete_flag));
3367 FND_FILE.PUT_LINE(fnd_file.log,RPAD('-',55,'-'));
3368
3369 l_var_cal_type := l_cal_type;
3370 l_var_seq_number := l_seq_number;
3371 l_ret_value := igf_ap_gen.validate_cal_inst('AWARD',l_alternate_code,NULL,l_var_cal_type,l_var_seq_number);
3372
3373 -- <2> validate the existence of award year in the calendar system
3374 -- sjalasut, is this validation required ?
3375 IF(l_ret_value = FALSE AND l_var_cal_type IS NULL AND l_var_seq_number IS NULL) THEN
3376 FND_MESSAGE.SET_NAME('IGF','IGF_AP_AWD_YR_NOT_FOUND');
3377 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
3378 retcode := 2;
3379 RETURN;
3380 END IF;
3381
3382 -- <3> validate if the award year entered has been setup in the system award year form
3383 -- and the status if found is either open or legacy details
3384 OPEN cur_in_award_year_form(l_cal_type,l_seq_number); FETCH cur_in_award_year_form INTO l_award_year_status_code, l_sys_award_year;
3385 IF(cur_in_award_year_form%NOTFOUND)THEN
3386 CLOSE cur_in_award_year_form;
3387 FND_MESSAGE.SET_NAME('IGF','IGF_AP_AWD_YR_NOT_FOUND');
3388 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
3389 retcode := 2;
3390 RETURN;
3391 ELSE -- award year is present in the sys award year form. check for validity
3392 CLOSE cur_in_award_year_form;
3393 -- copy the award year status code and sys award year values into global variables.for further processing.
3394 g_award_year_status_code := l_award_year_status_code; g_sys_award_year := l_sys_award_year;
3395 IF(FND_LOG.LEVEL_STATEMENT >= g_debug_runtime_level)THEN
3396 g_debug_string := g_debug_string || 'Award year status code '||g_award_year_status_code||'Sys Award Year'||g_sys_award_year;
3397 END IF;
3398 IF(l_award_year_status_code NOT IN ('O','LD')) THEN
3399 FND_MESSAGE.SET_NAME('IGF','IGF_AP_LG_INVALID_STAT');
3400 FND_MESSAGE.SET_TOKEN('AWARD_STATUS',l_award_year_status_code);
3401 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
3402 retcode := 2;
3403 RETURN;
3404 END IF;
3405 END IF;
3406
3407 -- award year status code that is printed before starting the transaction
3408 FND_FILE.PUT_LINE(FND_FILE.LOG,RPAD(igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','AWARD_YR_STATUS'),25)|| ' : '||
3409 igf_ap_gen.get_lookup_meaning('IGF_AWARD_YEAR_STATUS',g_award_year_status_code));
3410
3411 FND_FILE.PUT_LINE(FND_FILE.LOG,RPAD('-',55,'-'));
3412
3413 -- final minute validation on batch number. if the config changes and the interface tables are not updated then error
3414 IF(igf_ap_gen.check_batch(p_batch_number,'AWD') = 'N')THEN
3415 FND_MESSAGE.SET_NAME('IGF','IGF_GR_BATCH_DOES_NOT_EXIST');
3416 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
3417 RETURN;
3418 END IF;
3419
3420 --To check whether the profile value is set to a value of 'When student is awarded' or not
3421 fnd_profile.get('IGF_AW_LOCK_COA',lv_profile_value);
3422
3423 lv_base_id := NULL;
3424 g_print_msg := NULL;
3425
3426 -- <4> now that the initial setup validations are passed, process each record of the interface table.
3427 l_success_records :=0; l_warning_records :=0; l_rejected_records:=0;
3428 FOR cur_legacy_award_int_rec IN cur_legacy_award_int(l_alternate_code, trim(p_batch_number)) LOOP
3429 IF g_print_msg IS NOT NULL AND lv_base_id<>l_out_base_id THEN
3430 fnd_file.put_line(fnd_file.log,g_print_msg);
3431 g_print_msg := NULL;
3432 END IF;
3433 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
3434
3435 l_out_person_id := NULL; l_out_base_id := NULL; g_award_id := NULL;
3436 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
3437 FND_FILE.PUT_LINE(FND_FILE.LOG,RPAD('-',40,'-'));
3438 FND_FILE.PUT_LINE(FND_FILE.LOG,igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','PROCESSING')||' '||
3439 igf_ap_gen.get_lookup_meaning('IGF_AW_LOOKUPS_MSG','PERSON_NUMBER')||' '||cur_legacy_award_int_rec.person_number);
3440 FND_FILE.PUT_LINE(FND_FILE.LOG,RPAD('-',40,'-'));
3441 igf_ap_gen.check_person(cur_legacy_award_int_rec.person_number,
3442 l_cal_type,
3443 l_seq_number,
3444 l_out_person_id,
3445 l_out_base_id
3446 );
3447
3448 -- person id is null. update the interface record with status E
3449 IF(l_out_person_id IS NULL) THEN
3450 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_PERSON_NOT_FND');
3451 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
3452 l_rejected_records := l_rejected_records + 1;
3453 del_or_upd_int_records('U',cur_legacy_award_int_rec,'E');
3454 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_SKIPPING_AWD');
3455 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
3456 ELSE
3457 g_person_id := l_out_person_id;
3458 END IF;
3459
3460 -- base id is null but the person id is not null. error out updating the interface record with status E
3461 IF(l_out_base_id IS NULL AND l_out_person_id IS NOT NULL) THEN
3462 FND_MESSAGE.SET_NAME('IGF','IGF_AP_FABASE_NOT_FOUND');
3463 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
3464 l_rejected_records := l_rejected_records + 1;
3465 del_or_upd_int_records('U',cur_legacy_award_int_rec,'E');
3466 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_SKIPPING_AWD');
3467 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
3468 ELSIF(l_out_base_id IS NOT NULL AND l_out_person_id IS NOT NULL)THEN -- here both person id and base id are found
3469 -- write to the log and clear the string so that it can be used for other procedures being called.
3470 IF(FND_LOG.LEVEL_STATEMENT >= g_debug_runtime_level)THEN
3471 g_debug_string := g_debug_string || 'Base Id'||l_out_base_id||'Person Id'||l_out_person_id;
3472 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,'igf.plsql.igf_aw_li_import.main.debug',g_debug_string);
3473 g_debug_string := NULL;
3474 END IF;
3475 -- call to validate award year interface record. this is the main fork. control goes around the
3476 -- world before comming back here.
3477
3478 validate_awdyear_int_rec(cur_legacy_award_int_rec, l_return_status_awd);
3479
3480 -- do some action based on the l_return_status_awd here.
3481 IF(l_return_status_awd IN ('S','W'))THEN
3482 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_IMP_SUCCESS');
3483 FND_MESSAGE.SET_TOKEN('AWARD_ID',g_award_id);
3484 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
3485 END IF;
3486 -- The Records did not error out so if delete flag is set, delete interface records
3487 IF(l_return_status_awd <> 'E' AND p_delete_flag ='Y')THEN
3488 del_or_upd_int_records('D',cur_legacy_award_int_rec,NULL); -- NULL here does not matter as the op is delete
3489 END IF;
3490 IF(l_return_status_awd = 'S') THEN
3491 l_success_records := l_success_records + 1;
3492 -- processing of award and its child records is successful. but the delete flag is not set
3493 IF(p_delete_flag = 'N')THEN
3494 del_or_upd_int_records('U',cur_legacy_award_int_rec,'I');
3495 END IF;
3496 ELSIF(l_return_status_awd = 'W')THEN
3497 l_warning_records := l_warning_records + 1;
3498 IF(p_delete_flag = 'N')THEN
3499 del_or_upd_int_records('U',cur_legacy_award_int_rec,'W');
3500 END IF;
3501 ELSIF(l_return_status_awd NOT IN ('S','W')) THEN
3502 l_rejected_records := l_rejected_records + 1;
3503 del_or_upd_int_records('U',cur_legacy_award_int_rec,'E');
3504 FND_MESSAGE.SET_NAME('IGF','IGF_AW_LI_SKIPPING_AWD');
3505 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
3506 END IF;
3507
3508 -- IF lv_profile_value = 'AWARDED' lock COA at the student level
3509 IF lv_profile_value = 'AWARDED' THEN
3510 IF (l_return_status_awd = 'S') OR (l_return_status_awd = 'W') THEN
3511 lock_std_coa(l_out_base_id);
3512 lv_base_id := l_out_base_id;
3513 END IF;
3514 END IF;
3515
3516 END IF; -- end if of if(l_out_base_id is null AND l_out_person_id IS NOT NULL)
3517 COMMIT;
3518 END LOOP;
3519
3520 -- print message if it is locked at the student level
3521 IF g_print_msg IS NOT NULL THEN
3522 fnd_file.put_line(fnd_file.log,g_print_msg);
3523 END IF;
3524
3525 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
3526 l_total_records := l_success_records + l_warning_records + l_rejected_records;
3527 -- if no records are available, then write no records to be processed in the log file and write the
3528 -- summary in the output file. else write the summary in both log and output files.
3529 IF(l_total_records = 0)THEN
3530 FND_MESSAGE.SET_NAME('IGS','IGS_FI_NO_RECORD_AVAILABLE');
3531 FND_FILE.PUT_LINE(FND_FILE.LOG,FND_MESSAGE.GET);
3532 -- write the summary into the out files.
3533 FND_FILE.PUT_LINE(FND_FILE.OUTPUT,RPAD('-',55,'-'));
3534 FND_FILE.PUT_LINE(FND_FILE.OUTPUT,RPAD(igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','RECORDS_PROCESSED'),40)||' : '||l_total_records);
3535 FND_FILE.PUT_LINE(FND_FILE.OUTPUT,RPAD(igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','RECORDS_SUCCESSFUL'),40)||' : '||l_success_records);
3536 FND_FILE.PUT_LINE(FND_FILE.OUTPUT,RPAD(igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','RECORDS_WARN'),40)||' : '||l_warning_records);
3537 FND_FILE.PUT_LINE(FND_FILE.OUTPUT,RPAD(igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','RECORDS_REJECTED'),40)||' : '||l_rejected_records);
3538 FND_FILE.PUT_LINE(FND_FILE.OUTPUT,RPAD('-',55,'-'));
3539 ELSE
3540 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
3541 FND_FILE.PUT_LINE(FND_FILE.LOG,RPAD(igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','RECORDS_PROCESSED'),40)||' : '||l_total_records);
3542 FND_FILE.PUT_LINE(FND_FILE.LOG,RPAD(igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','RECORDS_SUCCESSFUL'),40)||' : '||l_success_records);
3543 FND_FILE.PUT_LINE(FND_FILE.LOG,RPAD(igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','RECORDS_WARN'),40)||' : '||l_warning_records);
3544 FND_FILE.PUT_LINE(FND_FILE.LOG,RPAD(igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','RECORDS_REJECTED'),40)||' : '||l_rejected_records);
3545 FND_FILE.PUT_LINE(FND_FILE.LOG,' ');
3546
3547 -- write the summary into the out files.
3548 FND_FILE.PUT_LINE(FND_FILE.OUTPUT,RPAD('-',55,'-'));
3549 FND_FILE.PUT_LINE(FND_FILE.OUTPUT,RPAD(igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','RECORDS_PROCESSED'),40)||' : '||l_total_records);
3550 FND_FILE.PUT_LINE(FND_FILE.OUTPUT,RPAD(igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','RECORDS_SUCCESSFUL'),40)||' : '||l_success_records);
3551 FND_FILE.PUT_LINE(FND_FILE.OUTPUT,RPAD(igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','RECORDS_WARN'),40)||' : '||l_warning_records);
3552 FND_FILE.PUT_LINE(FND_FILE.OUTPUT,RPAD(igf_ap_gen.get_lookup_meaning('IGF_GE_PARAMETERS','RECORDS_REJECTED'),40)||' : '||l_rejected_records);
3553 FND_FILE.PUT_LINE(FND_FILE.OUTPUT,RPAD('-',55,'-'));
3554 END IF;
3555 EXCEPTION WHEN OTHERS THEN
3556 ROLLBACK;
3557 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
3558 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION, 'igf.plsql.igf_aw_li_import.main.exception',
3559 g_debug_string );
3560 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION, 'igf.plsql.igf_aw_li_import.main.exception',
3561 'Unhandled Exception '||SQLERRM );
3562 END IF;
3563 FND_MESSAGE.SET_NAME('IGF','IGF_GE_UNHANDLED_EXP');
3564 FND_MESSAGE.SET_TOKEN('NAME','MAIN : '||SQLERRM);
3565 IGS_GE_MSG_STACK.ADD;
3566 retcode := 2;
3567 errbuf:= FND_MESSAGE.GET;
3568 FND_FILE.PUT_LINE(fnd_file.log,errbuf);
3569 IGS_GE_MSG_STACK.CONC_EXCEPTION_HNDL;
3570 END main;
3571
3572 -------------------------------------------------------------------------------------------------------
3573 -- Generic Functions
3574 -------------------------------------------------------------------------------------------------------
3575 FUNCTION get_base_id_from_per_num (p_person_number hz_parties.party_number%TYPE,
3576 p_cal_type igs_ca_inst.cal_type%TYPE,
3577 p_sequence_number igs_ca_inst.sequence_number%TYPE
3578 ) RETURN NUMBER IS
3579 CURSOR cur_base_id IS
3580 SELECT base.base_id
3581 FROM igf_ap_fa_base_rec_all base,
3582 hz_parties hp
3583 WHERE
3584 base.ci_sequence_number = p_sequence_number
3585 AND base.ci_cal_type = p_cal_type
3586 AND base.person_id = hp.party_id
3587 AND hp.party_number = p_person_number;
3588
3589 l_base_id igf_ap_fa_base_rec_all.base_id%TYPE;
3590
3591 BEGIN
3592 IF(p_person_number IS NOT NULL AND p_cal_type IS NOT NULL AND p_sequence_number IS NOT NULL)THEN
3593 OPEN cur_base_id; FETCH cur_base_id INTO l_base_id; CLOSE cur_base_id;
3594 IF l_base_id IS NOT NULL THEN
3595 RETURN l_base_id;
3596 ELSE
3597 RETURN -1;
3598 END IF;
3599 END IF;
3600 END get_base_id_from_per_num ;
3601
3602 PROCEDURE run( errbuf OUT NOCOPY VARCHAR2,
3603 retcode OUT NOCOPY NUMBER,
3604 p_award_year IN VARCHAR2,
3605 p_batch_number IN NUMBER,
3606 p_delete_flag IN VARCHAR2
3607 )
3608 IS
3609 /***************************************************************
3610 Created By : nsidana
3611 Date Created By : 11/28/2003
3612 Purpose :
3613 Known Limitations,Enhancements or Remarks
3614 Change History :
3615 Who When What
3616
3617 ***************************************************************/
3618
3619 lv_errbuf VARCHAR2(4000);
3620 ln_retcode NUMBER;
3621 BEGIN
3622 errbuf := NULL;
3623 retcode := 0;
3624
3625 --
3626 -- Assign global variable
3627 --
3628 g_entry_point := 'EXTERNAL';
3629
3630 --
3631 --Invoke the main routine
3632 --
3633 main(lv_errbuf,
3634 ln_retcode,
3635 p_award_year,
3636 p_batch_number,
3637 p_delete_flag);
3638
3639 EXCEPTION WHEN OTHERS THEN
3640 ROLLBACK;
3641 IF(FND_LOG.LEVEL_EXCEPTION >= g_debug_runtime_level)THEN
3642 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION, 'igf.plsql.igf_aw_li_import.run.exception',
3643 g_debug_string );
3644 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION, 'igf.plsql.igf_aw_li_import.run.exception',
3645 'Unhandled Exception '||SQLERRM );
3646 END IF;
3647 FND_MESSAGE.SET_NAME('IGF','IGF_GE_UNHANDLED_EXP');
3648 FND_MESSAGE.SET_TOKEN('NAME','RUN : '||SQLERRM);
3649 IGS_GE_MSG_STACK.ADD;
3650 retcode := 2;
3651 errbuf:= FND_MESSAGE.GET;
3652 FND_FILE.PUT_LINE(fnd_file.log,errbuf);
3653 IGS_GE_MSG_STACK.CONC_EXCEPTION_HNDL;
3654
3655 END run;
3656
3657 END igf_aw_li_import;