[Home] [Help]
PACKAGE BODY: APPS.XTR_RATE_CHANGE
Source
1 PACKAGE BODY XTR_RATE_CHANGE AS
2 /* $Header: xtrpdrtb.pls 120.3 2005/06/29 10:48:38 rjose ship $ */
3
4
5
6 PROCEDURE PRODUCT_RATE_CHANGE(
7 errbuf OUT NOCOPY VARCHAR2,
8 retcode OUT NOCOPY VARCHAR2,
9 p_effective_from_date IN VARCHAR2,
10 p_eff_from_next_rollover_yn IN VARCHAR2,
11 p_new_interest_rate IN VARCHAR2,
12 p_change_pi_yn IN VARCHAR2,
13 p_deal_subtype IN VARCHAR2,
14 p_payment_schedule_code IN VARCHAR2,
15 p_currency IN VARCHAR2,
16 p_min_balance IN NUMBER,
17 p_max_balance IN NUMBER)
18 IS
19
20 g_expected_balance_bf NUMBER;
21 g_balance_out_bf NUMBER;
22 g_accum_interest_bf NUMBER;
23 g_principal_adjust NUMBER;
24 l_new_pi_amount_due NUMBER;
25 l_effective_from_date DATE;
26 l_effective_date DATE;
27 l_created_on DATE;
28 p_created_by VARCHAR2(30);
29 CHK_DATE VARCHAR2(1) := 'N';
30 l_pi_amount_due NUMBER;
31 l_pi_amount_received NUMBER;
32 l_tran_num NUMBER;
33 l_interest_rate NUMBER;
34 l_maturity_date DATE;
35 l_row_inserted VARCHAR2(1) := null;
36
37 cursor DEAL_CUR is
38 select DEAL_NO, PAYMENT_SCHEDULE_CODE, DEAL_TYPE,
39 DEAL_SUBTYPE, PRODUCT_TYPE, INTEREST_RATE,
40 PI_AMOUNT_DUE, CURRENCY, SETTLE_DATE,
41 PORTFOLIO_CODE,COMPANY_CODE,DEAL_DATE,
42 CPARTY_CODE,CLIENT_CODE,DEALER_CODE
43 from XTR_DEALS_V d
44 where d.DEAL_TYPE = 'RTMM'
45 and d.DEAL_SUBTYPE = nvl(p_deal_subtype, d.DEAL_SUBTYPE)
46 and d.CURRENCY = nvl(p_currency, d.CURRENCY)
47 and d.PAYMENT_SCHEDULE_CODE = nvl(p_payment_schedule_code, d.PAYMENT_SCHEDULE_CODE)
48 and d.STATUS_CODE = 'CURRENT'
49 and exists( select 'ANY TRANS'
50 from XTR_ROLLOVER_TRANSACTIONS_V t
51 where nvl(t.STATUS_CODE, 'CURRENT') = 'CURRENT'
52 and t.BALANCE_OUT between nvl(p_min_balance, 0) and
53 nvl(p_max_balance, t.BALANCE_OUT + 1)
54 and t.SETTLE_DATE is NULL
55 and t.START_DATE >= l_effective_from_date
56 and t.START_DATE >= nvl(d.SETTLE_DATE, t.START_DATE)
57 --and nvl(RATE_EFFECTIVE_CREATED,l_effective_from_date )
58 -- <= l_effective_from_date
59 and t.DEAL_NUMBER = d.DEAL_NO);
60
61 cursor CHECK_ON_ROLLOVER(p_deal_no NUMBER, p_date DATE) is
62 select 'Y'
63 from XTR_ROLLOVER_TRANSACTIONS
64 where DEAL_NUMBER = p_deal_no
65 and START_DATE = p_date;
66
67 cursor T_NOS(p_deal_no NUMBER) is
68 select nvl(max(TRANSACTION_NUMBER),0) + 1
69 from XTR_ROLLOVER_TRANSACTIONS_V
70 where DEAL_NUMBER = p_deal_no;
71
72 cursor THIS_ROW(p_deal_no NUMBER, p_date DATE) is
73 select PI_AMOUNT_DUE,
74 INTEREST_RATE,
75 PI_AMOUNT_RECEIVED,
76 MATURITY_DATE
77 from XTR_ROLLOVER_TRANSACTIONS_V
78 where DEAL_NUMBER = p_deal_no
79 and START_DATE < p_date
80 and MATURITY_DATE >= p_date
81 and nvl(PI_AMOUNT_DUE,0) <> 0
82 order by START_DATE desc,TRANSACTION_NUMBER desc;
83
84 cursor DEALER is
85 select dealer_code
86 from xtr_dealer_codes_v
87 where user_id = fnd_global.user_id;
88
89
90 BEGIN
91 --cep_standard.enable_debug;
92 IF xtr_debug_pkg.pg_sqlplus_enable_flag = 1 THEN
93 xtr_debug_pkg.debug('XTR_RATE_CHANGE.PRODUCT_RATE_CHANGE');
94 xtr_debug_pkg.debug('PRODUCT_RATE_CHANGE: ' || 'p_effective_from_date = ' ||p_effective_from_date );
95 xtr_debug_pkg.debug('PRODUCT_RATE_CHANGE: ' || 'p_deal_subtype = ' ||p_deal_subtype );
96 xtr_debug_pkg.debug('PRODUCT_RATE_CHANGE: ' || 'p_payment_schedule_code = ' ||p_payment_schedule_code );
97 xtr_debug_pkg.debug('PRODUCT_RATE_CHANGE: ' || 'p_currency = ' ||p_currency );
98 xtr_debug_pkg.debug('PRODUCT_RATE_CHANGE: ' || 'p_min_balance = ' ||p_min_balance );
99 xtr_debug_pkg.debug('PRODUCT_RATE_CHANGE: ' || 'p_max_balance = ' ||p_max_balance );
100 xtr_debug_pkg.debug('PRODUCT_RATE_CHANGE: ' || 'p_change_pi_yn = ' ||p_change_pi_yn );
101 xtr_debug_pkg.debug('PRODUCT_RATE_CHANGE: ' || 'p_change_pi_yn = ' ||p_change_pi_yn );
102 xtr_debug_pkg.debug('PRODUCT_RATE_CHANGE: ' || 'p_new_interest_rate = ' ||p_new_interest_rate );
103 END IF;
104
105 open DEALER;
106 fetch DEALER into p_created_by;
107 if DEALER%NOTFOUND then
108 p_created_by := null;
109 end if;
110 close DEALER;
111 l_created_on := sysdate;
112
113 l_effective_from_date := to_date(
114 to_date(p_effective_from_date, 'YYYY/MM/DD HH24:MI:SS'), 'DD-MON-RR');
115
116 IF xtr_debug_pkg.pg_sqlplus_enable_flag = 1 THEN
117 xtr_debug_pkg.debug('PRODUCT_RATE_CHANGE: ' || 'l_effective_from_date = ' ||l_effective_from_date );
118 END IF;
119
120 FOR deal in DEAL_CUR LOOP
121 IF xtr_debug_pkg.pg_sqlplus_enable_flag = 1 THEN
122 xtr_debug_pkg.debug('PRODUCT_RATE_CHANGE: ' || 'deal_no = ' ||deal.DEAL_NO );
123 END IF;
124
125 ----IF deal.DEAL_NO = 13135 THEN ----------------------------
126
127 if nvl(deal.SETTLE_DATE, l_effective_from_date) > l_effective_from_date then
128 l_effective_date := deal.SETTLE_DATE;
129 else
130 l_effective_date := l_effective_from_date;
131 end if;
132
133 if nvl(p_change_pi_yn, 'N') = 'Y' then
134 XTR_RATE_CHANGE.RECALC_PI_AMOUNT( deal.DEAL_NO,
135 p_new_interest_rate,
136 l_effective_date,
137 p_eff_from_next_rollover_yn,
138 l_new_pi_amount_due);
139 else
140 l_new_pi_amount_due := null;
141 end if;
142
143 update XTR_ROLLOVER_TRANSACTIONS_V
144 set INTEREST_RATE = p_new_interest_rate,
145 RATE_EFFECTIVE_CREATED = l_created_on, -- AW 7/15 sysdate,
146 PI_AMOUNT_DUE = nvl(l_new_pi_amount_due, PI_AMOUNT_DUE)
147 where DEAL_NUMBER = deal.DEAL_NO
148 and nvl(STATUS_CODE, 'CURRENT') = 'CURRENT'
149 and (BALANCE_OUT between nvl(p_min_balance, 0) and
150 nvl(p_max_balance, BALANCE_OUT + 1))
151 and SETTLE_DATE is NULL
152 and START_DATE >= l_effective_date;
153 -- and nvl(RATE_EFFECTIVE_CREATED,l_effective_from_date )
154 -- <= l_effective_from_date;
155
156 if SQL%FOUND then
157 update XTR_DEALS
158 set INTEREST_RATE = p_new_interest_rate
159 where DEAL_NO = deal.DEAL_NO;
160 end if;
161
162 open CHECK_ON_ROLLOVER(deal.DEAL_NO, l_effective_date);
163 fetch CHECK_ON_ROLLOVER into CHK_DATE;
164 close CHECK_ON_ROLLOVER;
165
166 if nvl(p_eff_from_next_rollover_yn, 'N') = 'N' and nvl(CHK_DATE, 'N') = 'N' then
167
168 open T_NOS(deal.DEAL_NO);
169 fetch T_NOS INTO l_tran_num;
170 close T_NOS;
171
172 open THIS_ROW(deal.DEAL_NO, l_effective_date);
173 fetch THIS_ROW INTO l_pi_amount_due,
174 l_interest_rate,
175 l_pi_amount_received,
176 l_maturity_date;
177 close THIS_ROW;
178
179 if l_tran_num is NOT NULL then
180 insert into XTR_ROLLOVER_TRANSACTIONS_V
181 (DEAL_NUMBER,
182 TRANSACTION_NUMBER,
183 DEAL_TYPE,
184 RATE_FIXING_DATE,
185 START_DATE,
186 MATURITY_DATE,
187 INTEREST_RATE,
188 NO_OF_DAYS,
189 PI_AMOUNT_DUE,
190 BALANCE_OUT_BF,
191 BALANCE_OUT,
192 CREATED_BY,
193 CREATED_ON,
194 PRINCIPAL_ADJUST,
195 STATUS_CODE,
196 PORTFOLIO_CODE,
197 CURRENCY,
198 DEAL_SUBTYPE,
199 COMPANY_CODE,
200 DEAL_DATE,
201 PRODUCT_TYPE,
202 CPARTY_CODE,
203 CLIENT_CODE,
204 DEALER_CODE)
205 values
206 (deal.DEAL_NO,
207 l_tran_num,
208 'RTMM',
209 l_effective_date,
210 l_effective_date,
211 l_maturity_date,
212 p_new_interest_rate,
213 (l_maturity_date - l_effective_date),
214 l_pi_amount_due,
215 0,
216 0,
217 '-1',
218 SYSDATE,
219 0,
220 'CURRENT',
221 deal.PORTFOLIO_CODE,
222 deal.CURRENCY,
223 deal.DEAL_SUBTYPE,
224 deal.COMPANY_CODE,
225 deal.DEAL_DATE,
226 deal.PRODUCT_TYPE,
227 deal.CPARTY_CODE,
228 deal.CLIENT_CODE,
229 deal.DEALER_CODE);
230 end if;
231
232 l_row_inserted := 'Y';
233
234 end if;
235
236 /* AW 7/15 Bug 914129 Should not allow to update previous actions for this deal !!!
237 update XTR_term_actions_V
238 set NEW_INTEREST_RATE = p_new_interest_rate,
239 EFFECTIVE_FROM_DATE = sysdate,
240 CREATED_ON = SYSDATE,
241 CREATED_BY = '-1'
242 where deal_no = deal.DEAL_NO;
243 if SQL%NOTFOUND then
244 */
245 insert into XTR_term_actions_V(
246 DEAL_NO,
247 NEW_INTEREST_RATE,
248 EFFECTIVE_FROM_DATE,
249 CREATED_ON,
250 CREATED_BY,
251 MASS_RATE_UPDATE)
252 values (deal.DEAL_NO,
253 p_new_interest_rate,
254 l_effective_date, -- AW 7/15 Bug 914129 sysdate,
255 l_created_on, -- AW 7/15 Bug 914129 sysdate,
256 p_created_by,
257 'Y');
258 /* AW 7/15 Bug 914129
259 select deal.DEAL_NO,
260 p_new_interest_rate,
261 l_effective_date, -- AW 7/15 Bug 914129 sysdate,
262 l_created_on, -- AW 7/15 Bug 914129 sysdate,
263 '-1'
264 from dual;
265
266 end if;
267 */
268
269 XTR_CALC_P.RECALC_DT_DETAILS(
270 deal.DEAL_NO,
271 l_row_inserted,
272 l_effective_date,
273 l_tran_num,
274 'N',
275 'N',
276 g_expected_balance_bf,
277 g_balance_out_bf,
278 g_accum_interest_bf,
279 g_principal_adjust,
280 null,
281 null,
282 null,
283 null,
284 null );
285
286
287 ----END IF; ---------------
288
289 END LOOP;
290
291 -- AW 7/27 939515
292 update XTR_RATE_SETS
293 set CONCURRENT_REQUEST = 'Y'
294 where EFFECTIVE_FROM = to_date(p_effective_from_date,'YYYY/MM/DD')
295 and RATE = p_new_interest_rate
296 and DEAL_SUBTYPE = p_deal_subtype
297 and PRODUCT_TYPE = p_payment_schedule_code
298 and CURRENCY = p_currency
299 and LOW_RANGE = p_min_balance
300 and HIGH_RANGE = p_max_balance;
301 commit;
302
303 END PRODUCT_RATE_CHANGE;
304
305 PROCEDURE RECALC_PI_AMOUNT(
306 p_deal_number IN NUMBER,
307 p_new_interest_rate IN NUMBER,
308 p_effective_from_date IN DATE,
309 p_eff_from_next_rollover_yn IN VARCHAR2,
310 p_new_pi_amount_due OUT NOCOPY NUMBER)
311 IS
312 cursor DEAL_CUR is
313 select PAYMENT_SCHEDULE_CODE, DEAL_TYPE,DEAL_SUBTYPE,
314 PRODUCT_TYPE, INTEREST_RATE, MATURITY_DATE,
315 PI_AMOUNT_DUE, CURRENCY
316 from XTR_DEALS_V d
317 where d.DEAL_NO = p_deal_number;
318
319 cursor THIS_ROW is
320 select START_DATE, MATURITY_DATE,
321 EXPECTED_BALANCE_BF,EXPECTED_BALANCE_OUT,
322 PRINCIPAL_ADJUST,
323 INTEREST_RATE
324 from XTR_ROLLOVER_TRANSACTIONS_V
325 where DEAL_NUMBER = p_deal_number
326 and STATUS_CODE = 'CURRENT'
327 and MATURITY_DATE >= p_effective_from_date
328 and START_DATE < p_effective_from_date
329 order by START_DATE asc,TRANSACTION_NUMBER asc;
330
331 cursor START_ROW is
332 select START_DATE,EXPECTED_BALANCE_BF, PRINCIPAL_ADJUST
333 from XTR_ROLLOVER_TRANSACTIONS_V
334 where DEAL_NUMBER = p_deal_number
335 and STATUS_CODE = 'CURRENT'
336 and START_DATE >= p_effective_from_date
337 order by START_DATE asc,TRANSACTION_NUMBER asc;
338
339 l_payment_schedule_code varchar2(7);
340 l_deal_type varchar2(7);
341 l_deal_subtype varchar2(7);
342 l_product_type varchar2(10);
343 l_interest_rate NUMBER;
344 l_maturity_date DATE;
345 l_pi_amount_due NUMBER;
346 l_currency VARCHAR2(15);
347 l_start_date DATE;
348 l_expected_balance_bf NUMBER;
349 l_principal_adjust NUMBER;
350 l_year_basis NUMBER := 365;
351 l_this_start_date DATE;
352 l_this_maturity_date DATE;
353 l_this_expected_balance_bf NUMBER;
354 l_this_expected_balance_out NUMBER;
355 l_this_principal_adjust NUMBER;
356 l_this_interest_rate NUMBER;
357
358 cursor FREQ is
359 select PAYMENT_FREQUENCY,
360 JAN_YN,FEB_YN,MAR_YN,APR_YN,MAY_YN,JUN_YN,
361 JUL_YN,AUG_YN,SEP_YN,OCT_YN,NOV_YN,DEC_YN
362 from XTR_PAYMENT_SCHEDULE_V
363 where PAYMENT_SCHEDULE_CODE = l_payment_schedule_code
364 and DEAL_TYPE = 'RTMM'
365 and DEAL_SUBTYPE = l_deal_subtype;
366
367 l_mth1 VARCHAR2(1);
368 l_mth2 VARCHAR2(1);
369 l_mth3 VARCHAR2(1);
370 l_mth4 VARCHAR2(1);
371 l_mth5 VARCHAR2(1);
372 l_mth6 VARCHAR2(1);
373 l_mth7 VARCHAR2(1);
374 l_mth8 VARCHAR2(1);
375 l_mth9 VARCHAR2(1);
376 l_mth10 VARCHAR2(1);
377 l_mth11 VARCHAR2(1);
378 l_mth12 VARCHAR2(1);
379 l_pymts_per_year NUMBER;
380 l_tot_pymts NUMBER;
381
382 cursor RND_YR is
383 select ROUNDING_FACTOR
384 from XTR_MASTER_CURRENCIES_V
385 where CURRENCY = l_currency;
386
387 L_ROUND NUMBER;
388 L_PAYMENT_FREQ VARCHAR2(12);
389
390 BEGIN
391
392 open DEAL_CUR;
393 fetch DEAL_CUR into l_payment_schedule_code, l_deal_type, l_deal_subtype,
394 l_product_type, l_interest_rate,l_maturity_date,
395 l_pi_amount_due,l_currency;
396 close DEAL_CUR;
397
398 open START_ROW;
399 fetch START_ROW into l_start_date, l_expected_balance_bf, l_principal_adjust;
400 close START_ROW;
401
402 open THIS_ROW;
403 fetch THIS_ROW into l_this_start_date, l_this_maturity_date,
404 l_this_expected_balance_bf, l_this_expected_balance_out,
405 l_this_principal_adjust,l_this_interest_rate;
406 close THIS_ROW;
407
408 open FREQ;
409 fetch FREQ into L_PAYMENT_FREQ,l_mth1,l_mth2,l_mth3,l_mth4,l_mth5,
410 l_mth6,l_mth7,l_mth8,l_mth9,l_mth10,l_mth11,l_mth12;
411 close FREQ;
412
413 if L_PAYMENT_FREQ = 'WEEKLY' then
414 l_pymts_per_year := 52;
415 elsif L_PAYMENT_FREQ = 'FORTNIGHTLY' then
416 l_pymts_per_year := 26;
417 elsif L_PAYMENT_FREQ = 'FOUR WEEKLY' then
418 l_pymts_per_year := 12;
419 elsif L_PAYMENT_FREQ = 'MONTHLY' then
420 l_pymts_per_year := 12;
421 elsif L_PAYMENT_FREQ = 'BI MONTHLY' then
422 l_pymts_per_year := 6;
423 elsif L_PAYMENT_FREQ = 'QUARTERLY' then
424 l_pymts_per_year := 4;
425 elsif L_PAYMENT_FREQ = 'SEMI ANNUAL' then
426 l_pymts_per_year := 2;
427 elsif L_PAYMENT_FREQ = 'ANNUAL' then
428 l_pymts_per_year := 1;
429 elsif L_PAYMENT_FREQ = 'AD HOC' then
430 l_pymts_per_year := 0;
431 if l_mth1 = 'Y' then
432 l_pymts_per_year := l_pymts_per_year + 1;
433 end if;
434 if l_mth2 = 'Y' then
435 l_pymts_per_year := l_pymts_per_year + 1;
436 end if;
437 if l_mth3 = 'Y' then
438 l_pymts_per_year := l_pymts_per_year + 1;
439 end if;
440 if l_mth4 = 'Y' then
441 l_pymts_per_year := l_pymts_per_year + 1;
442 end if;
443 if l_mth5 = 'Y' then
444 l_pymts_per_year := l_pymts_per_year + 1;
445 end if;
446 if l_mth6 = 'Y' then
447 l_pymts_per_year := l_pymts_per_year + 1;
448 end if;
449 if l_mth7 = 'Y' then
450 l_pymts_per_year := l_pymts_per_year + 1;
451 end if;
452 if l_mth8 = 'Y' then
453 l_pymts_per_year := l_pymts_per_year + 1;
454 end if;
455 if l_mth9 = 'Y' then
456 l_pymts_per_year := l_pymts_per_year + 1;
457 end if;
458 if l_mth10 = 'Y' then
459 l_pymts_per_year := l_pymts_per_year + 1;
460 end if;
461 if l_mth11 = 'Y' then
462 l_pymts_per_year := l_pymts_per_year + 1;
463 end if;
464 if l_mth12 = 'Y' then
465 l_pymts_per_year := l_pymts_per_year + 1;
466 end if;
467 else
468 l_pymts_per_year := 12;
469 end if;
470
471 l_tot_pymts := round(l_pymts_per_year *
472 months_between(l_maturity_date, l_start_date)/12, 0);
473
474 OPEN RND_YR;
475 FETCH RND_YR INTO L_ROUND;
476 CLOSE RND_YR;
477
478 if nvl(p_eff_from_next_rollover_yn, 'N') = 'N' then
479
480 l_expected_balance_bf := l_expected_balance_bf +
481 nvl(round((nvl(l_this_expected_balance_bf, 0)+nvl(l_this_principal_adjust,0)) *
482 (p_new_interest_rate-l_this_interest_rate)*(l_this_maturity_date - p_effective_from_date )
483 / (100 * l_year_basis),l_round),0);
484
485 end if;
486
487 select round((nvl(l_expected_balance_bf,0) + nvl(l_principal_adjust,0)) *
488 power((1 + (nvl(p_new_interest_rate, 0)/(l_pymts_per_year * 100))),l_tot_pymts)/
489 ((power((1 + (nvl(p_new_interest_rate, 0)/(l_pymts_per_year * 100))),l_tot_pymts) - 1) /
490 (nvl(p_new_interest_rate, 0)/(l_pymts_per_year * 100))),
491 NVL(l_round,2))
492 into p_new_pi_amount_due
493 from dual;
494
495 END RECALC_PI_AMOUNT;
496
497 END XTR_RATE_CHANGE;