1 package body CE_INTEREST_SCHED_PKG as
2 /* $Header: ceintscb.pls 120.1 2005/07/29 20:42:04 lkwan ship $ */
3
4 l_DEBUG varchar2(1) := NVL(FND_PROFILE.value('CE_DEBUG'), 'N');
5 -- l_DEBUG varchar2(1) := 'Y';
6
7 --
8 -- cursor used when update/delete schedule or remove/add accounts to schedule
9 --
10 CURSOR SCHED_XTR_ACCTS(P_INTEREST_SCHEDULE_ID NUMBER,
11 P_BANK_ACCOUNT_ID NUMBER) IS
12 SELECT BA.BANK_ACCOUNT_ID
13 FROM CE_BANK_ACCT_USES_ALL BAU
14 , CE_BANK_ACCOUNTS BA
15 WHERE
16 BA.BANK_ACCOUNT_ID = BAU.BANK_ACCOUNT_ID
17 AND BAU.XTR_USE_ENABLE_FLAG = 'Y'
18 AND BA.INTEREST_SCHEDULE_ID = P_INTEREST_SCHEDULE_ID
19 AND BA.BANK_ACCOUNT_ID = NVL(P_BANK_ACCOUNT_ID, BA.BANK_ACCOUNT_ID);
20
21 /* --------------------------------------------------------------------
22 | PRIVATE PROCEDURE |
23 | xtr_schedule_update
24 | |
25 | CALLED BY |
26 | update_schedule, remove_schedule_account, assign_schedule_account|
27 | |
28 | DESCRIPTION |
29 | call xtr API when schedule related information has changed
30 | Following API needs to be called when
31 | -added a Treasury Bank account to an interest schedule
32 | -removed a treasury Bank account from an interest schedule.
33 | -updated interest schedule information that is attached to a
34 | treasury bank account
35 --------------------------------------------------------------------- */
36 PROCEDURE xtr_schedule_update(p_ce_bank_account_id IN number,
37 p_interest_rounding IN varchar2,
38 p_interest_includes IN varchar2,
39 p_basis IN varchar2,
40 p_day_count_basis IN varchar2,
41 x_return_status OUT NOCOPY varchar2,
42 x_msg_count OUT NOCOPY number,
43 x_msg_data OUT NOCOPY varchar2
44 ) IS
45 BEGIN
46 IF l_DEBUG in ('Y', 'C') THEN
47 cep_standard.debug('>> CE_INTEREST_SCHED_PKG.xtr_schedule_update');
48 END IF;
49
50 IF (p_ce_bank_account_id is not null ) THEN
51
52 XTR_REPLICATE_BANK_ACCOUNTS_P.REPLICATE_INTEREST_SCHEDULES
53 ( p_ce_bank_account_id => p_ce_bank_account_id,
54 p_interest_rounding => p_interest_rounding ,
55 p_interest_includes => p_interest_includes,
56 p_interest_calculation_basis => p_basis,
57 p_day_count_basis => p_day_count_basis,
58 x_return_status => x_return_status,
59 x_msg_count => x_msg_count,
60 x_msg_data => x_msg_data);
61
62 ELSE
63 IF l_DEBUG in ('Y', 'C') THEN
64 cep_standard.debug('EXCEPTION: CE_INTEREST_SCHED_PKG.xtr_schedule_update p_ce_bank_account_id missing');
65 END IF;
66 FND_MESSAGE.Set_Name('CE', 'CE_BANK_ACCOUNT_ID_MISSING');
67 FND_MESSAGE.Set_Token('PROCEDURE', 'CE_INTEREST_SCHED_PKG.xtr_schedule_update');
68 fnd_msg_pub.add;
69 END IF;
70
71 IF l_DEBUG in ('Y', 'C') THEN
72 cep_standard.debug('<< CE_INTEREST_SCHED_PKG.xtr_schedule_update');
73 END IF;
74
75 EXCEPTION
76 when others then
77 IF l_DEBUG in ('Y', 'C') THEN
78 cep_standard.debug('EXCEPTION: CE_INTEREST_SCHED_PKG.xtr_schedule_update');
79 END IF;
80 FND_MESSAGE.Set_Name('CE', 'CE_UNHANDLED_EXCEPTION');
81 FND_MESSAGE.Set_Token('PROCEDURE', 'CE_INTEREST_SCHED_PKG.xtr_schedule_update');
82 fnd_msg_pub.add;
83 END xtr_schedule_update;
84
85 /* --------------------------------------------------------------------
86 | PRIVATE PROCEDURE |
87 | remove_schedule_account |
88 | |
89 | CALLED BY |
90 | InterestAMImpl (ScheduleBankAcctPG/CO) |
91 | delete_schedule |
92 | |
93 | DESCRIPTION |
94 | remove bank accounts that has been assign to schedule |
95 | CE_BANK_ACCOUNTS |
96 --------------------------------------------------------------------- */
97 PROCEDURE remove_schedule_account(p_interest_schedule_id IN number,
98 p_bank_account_id IN number,
99 x_return_status IN OUT NOCOPY VARCHAR2,
100 x_msg_count OUT NOCOPY NUMBER,
101 x_msg_data OUT NOCOPY VARCHAR2
102 ) IS
103
104 x_bank_account_id NUMBER;
105 BEGIN
106 IF l_DEBUG in ('Y', 'C') THEN
107 cep_standard.debug('>> CE_INTEREST_SCHED_PKG.remove_schedule_account');
108 END IF;
109 -- initialize API return status to success.
110 x_return_status := fnd_api.g_ret_sts_success;
111
112 IF (p_interest_schedule_id is not null and p_bank_account_id is not null) THEN
113 UPDATE CE_BANK_ACCOUNTS
114 SET INTEREST_SCHEDULE_ID = NULL
115 WHERE INTEREST_SCHEDULE_ID = p_interest_schedule_id
116 and BANK_ACCOUNT_ID = p_bank_account_id;
117 ELSIF (p_interest_schedule_id is not null and p_bank_account_id is null) THEN
118 UPDATE CE_BANK_ACCOUNTS
119 SET INTEREST_SCHEDULE_ID = NULL
120 WHERE INTEREST_SCHEDULE_ID = p_interest_schedule_id;
121
122 END IF;
123
124 IF (p_interest_schedule_id is not null ) THEN
125 OPEN SCHED_XTR_ACCTS(p_interest_schedule_id, p_bank_account_id);
126 LOOP
127 FETCH SCHED_XTR_ACCTS into X_BANK_ACCOUNT_ID;
128 EXIT WHEN sched_xtr_accts%NOTFOUND OR sched_xtr_accts%NOTFOUND IS NULL;
129
130 xtr_schedule_update(p_ce_bank_account_id => X_BANK_ACCOUNT_ID,
131 p_interest_rounding => null,
132 p_interest_includes => null,
133 p_basis => null,
134 p_day_count_basis => null,
135 x_return_status => x_return_status,
136 x_msg_count => x_msg_count,
137 x_msg_data => x_msg_data);
138 END LOOP; -- SCHED_XTR_ACCTS
139 CLOSE SCHED_XTR_ACCTS;
140 END IF;
141 FND_MSG_PUB.Count_And_Get(
142 p_encoded => FND_API.G_FALSE,
143 p_count => x_msg_count,
144 p_data => x_msg_data);
145
146 IF x_msg_count > 0 THEN
147 x_return_status := fnd_api.g_ret_sts_error;
148 END IF;
149
150
151 IF l_DEBUG in ('Y', 'C') THEN
152 cep_standard.debug('<< CE_INTEREST_SCHED_PKG.remove_schedule_account');
153 END IF;
154
155 EXCEPTION
156 when others then
157 IF l_DEBUG in ('Y', 'C') THEN
158 cep_standard.debug('EXCEPTION: CE_INTEREST_SCHED_PKG.remove_schedule_account');
159 END IF;
160 FND_MESSAGE.Set_Name('CE', 'CE_UNHANDLED_EXCEPTION');
161 FND_MESSAGE.Set_Token('PROCEDURE', 'CE_INTEREST_SCHED_PKG.remove_schedule_account');
162 fnd_msg_pub.add;
163 END remove_schedule_account;
164
165 /* --------------------------------------------------------------------
166 | PRIVATE PROCEDURE |
167 | assign_schedule_account |
168 | |
169 | CALLED BY |
170 | InterestAMImpl (ScheduleBankAcctPG/CO) |
171 | |
172 | DESCRIPTION |
173 | assign bank accounts for the interest schedule |
174 | CE_BANK_ACCOUNTS |
175 --------------------------------------------------------------------- */
176 PROCEDURE assign_schedule_account(p_interest_schedule_id IN number,
177 p_bank_account_id IN number,
178 p_basis IN varchar2,
179 p_interest_includes IN varchar2,
180 p_interest_rounding IN varchar2,
181 p_day_count_basis IN varchar2,
182 x_return_status IN OUT NOCOPY VARCHAR2,
183 x_msg_count OUT NOCOPY NUMBER,
184 x_msg_data OUT NOCOPY VARCHAR2
185 ) IS
186
187 x_bank_account_id NUMBER;
188 x_ba_count NUMBER;
189 BEGIN
190 IF l_DEBUG in ('Y', 'C') THEN
191 cep_standard.debug('>> CE_INTEREST_SCHED_PKG.assign_schedule_account');
192 END IF;
193 -- initialize API return status to success.
194 x_return_status := fnd_api.g_ret_sts_success;
195
196 IF (p_interest_schedule_id is not null ) THEN
197 SELECT count(1)
198 into x_ba_count
199 from CE_BANK_ACCOUNTS
200 WHERE
201 nvl(interest_schedule_id, 1) = p_interest_schedule_id
202 and bank_account_id = p_bank_account_id;
203
204 IF (x_ba_count > 0) THEN
205 FND_MESSAGE.Set_Name('CE', 'CE_ACCT_IS_ASSIGNED');
206 --FND_MESSAGE.Set_Token('PROCEDURE', 'CE_INTEREST_SCHED_PKG.assign_schedule_account');
207 fnd_msg_pub.add;
208 ELSE
209 UPDATE CE_BANK_ACCOUNTS
210 SET INTEREST_SCHEDULE_ID = p_interest_schedule_id
211 WHERE INTEREST_SCHEDULE_ID is null
212 and BANK_ACCOUNT_ID = p_bank_account_id;
213
214 OPEN SCHED_XTR_ACCTS(p_interest_schedule_id, p_bank_account_id);
215 LOOP
216 FETCH SCHED_XTR_ACCTS into X_BANK_ACCOUNT_ID;
217 EXIT WHEN sched_xtr_accts%NOTFOUND OR sched_xtr_accts%NOTFOUND IS NULL;
218
219 xtr_schedule_update(p_ce_bank_account_id => X_BANK_ACCOUNT_ID,
220 p_interest_rounding => p_interest_rounding,
221 p_interest_includes => p_interest_includes,
222 p_basis => p_basis,
223 p_day_count_basis => p_day_count_basis,
224 x_return_status => x_return_status,
225 x_msg_count => x_msg_count,
226 x_msg_data => x_msg_data);
227 END LOOP; -- SCHED_XTR_ACCTS
228 CLOSE SCHED_XTR_ACCTS;
229
230 END IF;
231 ELSE
232 IF l_DEBUG in ('Y', 'C') THEN
233 cep_standard.debug('EXCEPTION: CE_INTEREST_SCHED_PKG.assign_schedule_account INTEREST_SCHEDULE_ID missing');
234 END IF;
235 FND_MESSAGE.Set_Name('CE', 'CE_INT_SCHED_ID_MISSING');
236 FND_MESSAGE.Set_Token('PROCEDURE', 'CE_INTEREST_SCHED_PKG.assign_schedule_account');
237 fnd_msg_pub.add;
238 END IF;
239
240 FND_MSG_PUB.Count_And_Get(
241 p_encoded => FND_API.G_FALSE,
242 p_count => x_msg_count,
243 p_data => x_msg_data);
244
245 IF x_msg_count > 0 THEN
246 x_return_status := fnd_api.g_ret_sts_error;
247 END IF;
248
249 IF l_DEBUG in ('Y', 'C') THEN
250 cep_standard.debug('<< CE_INTEREST_SCHED_PKG.assign_schedule_account');
251 END IF;
252
253 EXCEPTION
254 when others then
255 IF l_DEBUG in ('Y', 'C') THEN
256 cep_standard.debug('EXCEPTION: CE_INTEREST_SCHED_PKG.assign_schedule_account');
257 END IF;
258 FND_MESSAGE.Set_Name('CE', 'CE_UNHANDLED_EXCEPTION');
259 FND_MESSAGE.Set_Token('PROCEDURE', 'CE_INTEREST_SCHED_PKG.assign_schedule_account');
260 fnd_msg_pub.add;
261 END assign_schedule_account;
262
263 /* --------------------------------------------------------------------
264 | PRIVATE PROCEDURE |
265 | delete_interest_rates
266 | |
267 | CALLED BY |
268 | InterestAMImpl (populateIntRate) |
269 | delete_schedule |
270 | DESCRIPTION |
271 | delete interest_rates from
272 | CE_INTEREST_RATES |
273 --------------------------------------------------------------------- */
274 PROCEDURE delete_interest_rates(p_interest_schedule_id number,
275 p_effective_date date) IS
276
277 x_bank_account_id NUMBER;
278 x_interest_rate_count NUMBER;
279 BEGIN
280 IF l_DEBUG in ('Y', 'C') THEN
281 cep_standard.debug('>> CE_INTEREST_SCHED_PKG.delete_interest_rates');
282 END IF;
283
284 IF (p_effective_date is not null) THEN
285 select count(*)
286 into x_interest_rate_count
287 from CE_INTEREST_RATES
288 WHERE BALANCE_RANGE_ID in (SELECT BALANCE_RANGE_ID FROM CE_INTEREST_BAL_RANGES
289 WHERE INTEREST_SCHEDULE_ID = p_interest_schedule_id)
290 and EFFECTIVE_DATE = p_effective_date;
291
292 -- make sure at least one transaction exist
293 IF (x_interest_rate_count < 1) THEN
294
295 FND_MESSAGE.Set_Name('CE', 'CE_INT_RATE_DATE_NOT_EXIST');
296 FND_MESSAGE.Set_Token('EFFECTIVE_DATE',p_effective_date );
297 fnd_msg_pub.add;
298 END IF;
299 END IF;
300 IF (p_interest_schedule_id is not null and p_effective_date is not null) THEN
301 DELETE FROM CE_INTEREST_RATES
302 WHERE BALANCE_RANGE_ID in (SELECT BALANCE_RANGE_ID FROM CE_INTEREST_BAL_RANGES
303 WHERE INTEREST_SCHEDULE_ID = p_interest_schedule_id)
304 and EFFECTIVE_DATE = p_effective_date;
305
306 ELSIF (p_interest_schedule_id is not null and p_effective_date is null) THEN
307 DELETE FROM CE_INTEREST_RATES
308 WHERE BALANCE_RANGE_ID in (SELECT BALANCE_RANGE_ID FROM CE_INTEREST_BAL_RANGES
309 WHERE INTEREST_SCHEDULE_ID = p_interest_schedule_id);
310
311 END IF;
312
313
314 IF l_DEBUG in ('Y', 'C') THEN
315 cep_standard.debug('<< CE_INTEREST_SCHED_PKG.delete_interest_rates');
316 END IF;
317
318 EXCEPTION
319 when others then
320 IF l_DEBUG in ('Y', 'C') THEN
324 FND_MESSAGE.Set_Token('PROCEDURE', 'CE_INTEREST_SCHED_PKG.delete_interest_rates');
321 cep_standard.debug('EXCEPTION: CE_INTEREST_SCHED_PKG.delete_interest_rates');
322 END IF;
323 FND_MESSAGE.Set_Name('CE', 'CE_UNHANDLED_EXCEPTION');
325 fnd_msg_pub.add;
326 END delete_interest_rates;
327 /* --------------------------------------------------------------------
328 | PRIVATE PROCEDURE |
329 | delete_bal_ranges;
330 | |
331 | CALLED BY |
332 | delete_schedule
333 | |
334 | DESCRIPTION |
335 | delete all balance ranges for a schedule
336 |
337 --------------------------------------------------------------------- */
338 PROCEDURE delete_bal_ranges( p_interest_schedule_id number) IS
339 BEGIN
340 IF l_DEBUG in ('Y', 'C') THEN
341 cep_standard.debug('>> CE_INTEREST_SCHED_PKG.delete_bal_ranges');
342 END IF;
343
344 IF (p_interest_schedule_id is not null) THEN
345 DELETE FROM CE_INTEREST_BAL_RANGES
346 WHERE INTEREST_SCHEDULE_ID = p_interest_schedule_id;
347
348 END IF;
349
350 IF l_DEBUG in ('Y', 'C') THEN
351 cep_standard.debug('<< CE_INTEREST_SCHED_PKG.delete_bal_ranges');
352 END IF;
353
354 EXCEPTION
355 when others then
356 IF l_DEBUG in ('Y', 'C') THEN
357 cep_standard.debug('EXCEPTION: CE_INTEREST_SCHED_PKG.delete_bal_ranges');
358 END IF;
359 FND_MESSAGE.Set_Name('CE', 'CE_UNHANDLED_EXCEPTION');
360 FND_MESSAGE.Set_Token('PROCEDURE', 'CE_INTEREST_SCHED_PKG.delete_bal_ranges');
361 fnd_msg_pub.add;
362 END delete_bal_ranges;
363
364 /* --------------------------------------------------------------------
365 | PRIVATE PROCEDURE |
366 | delete_schedule
367 | |
368 | CALLED BY |
369 | InterestAMImpl (deleteIntSchedInfo) |
370 | |
371 | DESCRIPTION |
372 | delete all schedule related information
373 |
374 --------------------------------------------------------------------- */
375 PROCEDURE delete_schedule(p_interest_schedule_id IN number,
376 x_return_status IN OUT NOCOPY VARCHAR2,
377 x_msg_count OUT NOCOPY NUMBER,
378 x_msg_data OUT NOCOPY VARCHAR2
379 ) IS
380 p_effective_date date ;
381 p_bank_account_id number;
382 BEGIN
383 IF l_DEBUG in ('Y', 'C') THEN
384 cep_standard.debug('>> CE_INTEREST_SCHED_PKG.delete_schedule');
385 END IF;
386 -- initialize API return status to success.
387 x_return_status := fnd_api.g_ret_sts_success;
388
389 p_effective_date := null;
390 p_bank_account_id := null;
391 IF (p_interest_schedule_id is not null ) THEN
392
393 --deleteIntSchedule(interestScheduleId);
394 -- handle in OA
395 --deleteIntBalRanges(interestScheduleId);
396 delete_bal_ranges(p_interest_schedule_id);
397
398 --deleteIntRate(interestScheduleId);
399 delete_interest_rates(p_interest_schedule_id, p_effective_date);
400
401 --deleteIntBankAcct(interestScheduleId);
402 remove_schedule_account(p_interest_schedule_id, p_bank_account_id,
403 x_return_status,
404 x_msg_count,
405 x_msg_data);
406
407 ELSE
408 IF l_DEBUG in ('Y', 'C') THEN
409 cep_standard.debug('EXCEPTION: CE_INTEREST_SCHED_PKG.delete_schedule INTEREST_SCHEDULE_ID missing');
410 END IF;
411 FND_MESSAGE.Set_Name('CE', 'CE_INT_SCHED_ID_MISSING');
412 FND_MESSAGE.Set_Token('PROCEDURE', 'CE_INTEREST_SCHED_PKG.delete_schedule');
413 fnd_msg_pub.add;
414 END IF;
415
416 FND_MSG_PUB.Count_And_Get(
417 p_encoded => FND_API.G_FALSE,
418 p_count => x_msg_count,
419 p_data => x_msg_data);
420
421 IF x_msg_count > 0 THEN
422 x_return_status := fnd_api.g_ret_sts_error;
423 END IF;
424
425 IF l_DEBUG in ('Y', 'C') THEN
426 cep_standard.debug('<< CE_INTEREST_SCHED_PKG.delete_schedule');
427 END IF;
428
429 EXCEPTION
430 when others then
431 IF l_DEBUG in ('Y', 'C') THEN
432 cep_standard.debug('EXCEPTION: CE_INTEREST_SCHED_PKG.delete_schedule');
433 END IF;
434 FND_MESSAGE.Set_Name('CE', 'CE_UNHANDLED_EXCEPTION');
435 FND_MESSAGE.Set_Token('PROCEDURE', 'CE_INTEREST_SCHED_PKG.delete_schedule');
436 fnd_msg_pub.add;
437 END delete_schedule;
438
439 /* --------------------------------------------------------------------
440 | PRIVATE PROCEDURE |
441 | update_schedule
442 | |
443 | CALLED BY |
444 | InterestAMImpl (updateIntSchedInfo) |
445 | |
446 | DESCRIPTION |
447 | call xtr API when schedule related information has changed
448 |
449 --------------------------------------------------------------------- */
450 PROCEDURE update_schedule(p_interest_schedule_id IN number,
451 p_basis IN varchar2,
452 p_interest_includes IN varchar2,
453 p_interest_rounding IN varchar2,
457 x_msg_data OUT NOCOPY VARCHAR2
454 p_day_count_basis IN varchar2,
455 x_return_status IN OUT NOCOPY VARCHAR2,
456 x_msg_count OUT NOCOPY NUMBER,
458 ) IS
459
460 X_DAY_COUNT_BASIS VARCHAR(30);
461 X_INTEREST_INCLUDES VARCHAR(30);
462 X_INTEREST_ROUNDING VARCHAR(30);
463 X_BASIS VARCHAR(30);
464 X_BANK_ACCOUNT_ID NUMBER;
465 --X_return_status
466
467 BEGIN
468 IF l_DEBUG in ('Y', 'C') THEN
469 cep_standard.debug('>> CE_INTEREST_SCHED_PKG.update_schedule');
470 END IF;
471 -- initialize API return status to success.
472 x_return_status := fnd_api.g_ret_sts_success;
473
474 IF (p_interest_schedule_id is not null ) THEN
475
476 select
477 DAY_COUNT_BASIS,
478 INTEREST_INCLUDES,
479 INTEREST_ROUNDING,
480 BASIS
481 into
482 X_DAY_COUNT_BASIS,
483 X_INTEREST_INCLUDES,
484 X_INTEREST_ROUNDING,
485 X_BASIS
486 from ce_interest_schedules
487 where INTEREST_SCHEDULE_ID = p_interest_schedule_id;
488
489
490 IF ((X_DAY_COUNT_BASIS <> p_day_count_basis ) or
491 (X_INTEREST_INCLUDES <> p_interest_includes) or
492 (X_INTEREST_ROUNDING <> p_interest_rounding) or
493 (X_BASIS <> p_basis )) THEN
494
495 OPEN SCHED_XTR_ACCTS(p_interest_schedule_id, null);
496 LOOP
497 FETCH SCHED_XTR_ACCTS into X_BANK_ACCOUNT_ID;
498 EXIT WHEN sched_xtr_accts%NOTFOUND OR sched_xtr_accts%NOTFOUND IS NULL;
499
500 xtr_schedule_update(p_ce_bank_account_id => X_BANK_ACCOUNT_ID,
501 p_interest_rounding => p_interest_rounding,
502 p_interest_includes => p_interest_includes,
503 p_basis => p_basis,
504 p_day_count_basis => p_day_count_basis,
505 x_return_status => x_return_status,
506 x_msg_count => x_msg_count,
507 x_msg_data => x_msg_data);
508
509 END LOOP; -- SCHED_XTR_ACCTS
510 CLOSE SCHED_XTR_ACCTS;
511
512 END IF;
513 ELSE
514 IF l_DEBUG in ('Y', 'C') THEN
515 cep_standard.debug('EXCEPTION: CE_INTEREST_SCHED_PKG.update_schedule INTEREST_SCHEDULE_ID missing');
516 END IF;
517 FND_MESSAGE.Set_Name('CE', 'CE_INT_SCHED_ID_MISSING');
518 FND_MESSAGE.Set_Token('PROCEDURE', 'CE_INTEREST_SCHED_PKG.update_schedule');
519 fnd_msg_pub.add;
520 END IF;
521
522 FND_MSG_PUB.Count_And_Get(
523 p_encoded => FND_API.G_FALSE,
524 p_count => x_msg_count,
525 p_data => x_msg_data);
526
527 IF x_msg_count > 0 THEN
528 x_return_status := fnd_api.g_ret_sts_error;
529 END IF;
530
531 IF l_DEBUG in ('Y', 'C') THEN
532 cep_standard.debug('<< CE_INTEREST_SCHED_PKG.update_schedule');
533 END IF;
534
535 EXCEPTION
536 when others then
537 IF l_DEBUG in ('Y', 'C') THEN
538 cep_standard.debug('EXCEPTION: CE_INTEREST_SCHED_PKG.update_schedule');
539 END IF;
540 FND_MESSAGE.Set_Name('CE', 'CE_UNHANDLED_EXCEPTION');
541 FND_MESSAGE.Set_Token('PROCEDURE', 'CE_INTEREST_SCHED_PKG.update_schedule');
542 fnd_msg_pub.add;
543 END update_schedule;
544
545 END CE_INTEREST_SCHED_PKG;