[Home] [Help]
PACKAGE BODY: APPS.XTR_REVAL_PROCESS_P
Source
1 PACKAGE BODY XTR_REVAL_PROCESS_P as
2 /* $Header: xtrrevlb.pls 120.59 2006/11/15 10:11:20 eaggarwa ship $ */
3 -------------------------------------------------------------------------------------------------------
4 /***************************************************************/
5 /* This procedure get rates information from xtr_market_prices */
6 /* based on time and input into XTR_REVALUATION_RATES table */
7 /* Also it generates a batch ID for the new period */
8 /***************************************************************/
9 PROCEDURE GET_ALL_REVAL_RATES(l_company IN VARCHAR2,
10 l_start_date IN DATE,
11 l_end_date IN DATE,
12 l_upgrade_batch IN VARCHAR2,
13 l_batch_id IN OUT NOCOPY NUMBER) IS
14 --
15 p_BATCH_ID NUMBER;
16 p_UNIQUE_REF_NUM NUMBER;
17 p_REVAL_TYPE VARCHAR2(20);
18 p_PERIOD_REF1 NUMBER;
19 p_PERIOD_REF2 NUMBER;
20 p_CURRENCYA VARCHAR2(15);
21 p_CURRENCYB VARCHAR2(15);
22 p_PERIOD_FROM DATE;
23 p_RATE_DATE DATE;
24 p_NUMBER_OF_DAYS NUMBER;
25 p_DAY_MTH VARCHAR2(13);
26 p_BID NUMBER;
27 p_ASK NUMBER;
28 p_DAY_COUNT_BASIS VARCHAR2(30);
29 p_VOLATILITY_OR_RATE VARCHAR2(4);
30 l_bid_curr_rate NUMBER;
31 l_ask_curr_rate NUMBER;
32 l_day_count_basis VARCHAR2(30);
33 l_latest_rate_date DATE;
34 l_type VARCHAR2(20);
35 l_term_type VARCHAR2(1);
36 l_vol_type VARCHAR2(1);
37 l_vol_code VARCHAR2(20);
38 im_nos_of_days NUMBER;
39 l_sysdate DATE :=trunc(sysdate);
40
41 cursor BATCH is
42 select XTR_BATCHES_S.NEXTVAL
43 from DUAL;
44
45 cursor BATCH_EXIST is
46 select 1
47 from XTR_BATCHES
48 where BATCH_ID = l_batch_id;
49
50 l_exist number;
51
52 cursor NUM is
53 select XTR_REVALUATION_DETAILS_S.NEXTVAL
54 from DUAL;
55
56 -- Get Volatility (O, V) rows from Market Price table
57 cursor OPTION_VOLS is
58 select RIC_CODE, CURRENCY_A, CURRENCY_B, TERM_TYPE, TERM_LENGTH,
59 LAST_DOWNLOAD_TIME, NOS_OF_DAYS
60 from XTR_MARKET_PRICES
61 where TERM_TYPE in ('O', 'V');
62
63 -- This Cursor will find the snap shot of market rate for the above row found
64 cursor STORED_VOL_RATE is
65 select a.UNIQUE_PERIOD_ID,a.RATE_DATE,a.BID_RATE, a.OFFER_RATE
66 from XTR_INTEREST_PERIOD_RATES a
67 where a.UNIQUE_PERIOD_ID = l_vol_code
68 and ((a.CONTRA_OPTION_CCY = p_CURRENCYB and p_CURRENCYB is NOT NULL) or
69 (p_CURRENCYB is NULL))
70 and a.RATE_DATE < trunc(l_end_date+1)
71 order by a.RATE_DATE desc;
72
73
74 --- Get all Other Maintained Codes from the Market Price table
75 --- These codes will be used to fetch the LATEST RATES from XTR_MASTER_CURRENCIES and
76 --- INTEREST_PERIOD_RATES tables
77 ---
78 --- TERM_TYPE
79 --- S Day(s)
80 --- M Month(s)
81 --- Y Year(s)
82 --- O Opt Vol(Days)
83 --- V Opt Vol(Mths)
84 --- S FX Spot
85 --- F FX Fwd(Days)
86 --- W FX Fwd(Mths)
87 --- B Bond Price
88
89 cursor INSTRUMENTS_MAINTAINED is
90 select RIC_CODE,TERM_LENGTH,TERM_YEAR,CURRENCY_A,CURRENCY_B,TERM_TYPE, DAY_COUNT_BASIS,
91 nvl(BID_PRICE, 0),nvl(ASK_PRICE,0),LAST_DOWNLOAD_TIME,
92 NOS_OF_DAYS
93 from XTR_MARKET_PRICES
94 where TERM_TYPE not in('O','V','A')
95 and ((TERM_TYPE = 'S' and (CURRENCY_A = 'USD' or CURRENCY_B = 'USD'))
96 or (TERM_TYPE <> 'S'));
97
98 cursor RATES_FX_SPOT is
99 select a.RATE_DATE,
100 nvl(a.BID_RATE_AGAINST_USD,0),nvl(a.OFFER_RATE_AGAINST_USD,0)
101 from XTR_SPOT_RATES a
102 where a.CURRENCY = decode(p_CURRENCYA,'USD',p_CURRENCYB,p_CURRENCYA)
103 and a.RATE_DATE < trunc(l_end_date+1)
104 order by a.RATE_DATE desc;
105 --
106 -- Fetch Rates OTHER RATES from XTR_INTEREST_PERIOD_RATES table
107 cursor RATES_NON_FX is
108 select a.RATE_DATE,nvl(a.BID_RATE,0), nvl(a.OFFER_RATE,0)
109 from XTR_INTEREST_PERIOD_RATES a
110 where a.UNIQUE_PERIOD_ID = p_REVAL_TYPE
111 and a.RATE_DATE < trunc(l_end_date+1)
112 order by a.RATE_DATE desc;
113 --
114 /*
115 cursor GET_BOND_ISSUE is
116 select distinct currency,bond_issue
117 from XTR_DEALS
118 where deal_type='BOND'
119 and status_code='CURRENT'
120 and maturity_date >l_end_date;
121
122 l_currency varchar2(20);
123 l_bond_issue varchar2(50);
124 l_ric_code varchar2(50);
125
126 cursor GET_BOND_RIC_CODE is
127 select ric_code
128 from XTR_BOND_ISSUES
129 where bond_issue_code=l_bond_issue
130 and ric_code IS NOT NULL;
131
132 cursor BOND_PRICE is
133 select a.RATE_DATE,nvl(a.BID_RATE,0), nvl(a.OFFER_RATE,0)
134 from XTR_INTEREST_PERIOD_RATES a
135 where a.UNIQUE_PERIOD_ID = l_ric_code
136 and a.RATE_DATE < trunc(l_end_date+1)
137 order by a.RATE_DATE desc;
138 */
139
140 begin
141 open BATCH_EXIST;
142 fetch BATCH_EXIST into l_exist;
143 if BATCH_EXIST%NOTFOUND then -- check if batch_id exists. If not, generate new one. jhung
144 open BATCH;
145 fetch BATCH into p_BATCH_ID;
146 close BATCH;
147
148 insert into XTR_BATCHES
149 (batch_id, company_code, period_start, period_end, created_by, creation_date,
150 last_updated_by, last_update_date, last_update_login, gl_group_id, upgrade_batch)
151 values
152 (p_BATCH_ID, l_company, nvl(l_start_date, to_date('01/01/1980', 'DD/MM/YYYY')),
153 l_end_date, fnd_global.user_id, l_sysdate, fnd_global.user_id,
154 l_sysdate, fnd_global.login_id, null, nvl(l_upgrade_batch, 'N'));
155
156 l_batch_id := p_BATCH_ID;
157 else
158 p_BATCH_ID := l_batch_id;
159 update XTR_BATCHES
160 set last_updated_by = fnd_global.user_id,
161 last_update_date = l_sysdate
162 where BATCH_ID = l_batch_id;
163 end if;
164 close BATCH_EXIST;
165
166 open OPTION_VOLS;
167 LOOP
168 fetch OPTION_VOLS INTO l_vol_code, p_CURRENCYA,p_CURRENCYB,l_vol_type,
169 p_PERIOD_REF1, p_RATE_DATE, IM_NOS_OF_DAYS;
170 if OPTION_VOLS%NOTFOUND then
171 exit;
172 else
173 p_UNIQUE_REF_NUM := NULL;
174 p_VOLATILITY_OR_RATE := 'VOL';
175 if l_vol_type = 'O' then
176 if p_PERIOD_REF1 = 1 then
177 p_DAY_MTH := 'DAY';
178 else
179 p_DAY_MTH := 'DAYS';
180 end if;
181 else
182 if p_PERIOD_REF1 = 1 then
183 p_DAY_MTH := 'MONTH';
184 else
185 p_DAY_MTH := 'MONTHS';
186 end if;
187 end if;
188
189 -- Get Rate from XTR_INTEREST_PERIOD_TABLES for the latest date
190 open STORED_VOL_RATE;
191 fetch STORED_VOL_RATE INTO p_REVAL_TYPE,p_RATE_DATE,p_BID, p_ASK;
192 close STORED_VOL_RATE;
193
194 open NUM;
195 fetch NUM INTO p_UNIQUE_REF_NUM;
196 close NUM;
197
198 insert into XTR_REVALUATION_RATES
199 (batch_id,unique_ref_num,company_code,period_from,period_to,reval_type,
200 currencya,bid,ask,entered_on,
201 entered_by,rate_date,volatility_or_rate,day_mth,day_count_basis,currencyb,period_ref1,
202 period_ref2,number_of_days,created_on,created_by)
203 values
204 (p_BATCH_ID,p_UNIQUE_REF_NUM,l_company,l_start_date,l_end_date,
205 l_vol_code,p_CURRENCYA,p_BID,p_ASK,
206 l_sysdate,fnd_global.user_id,nvl(p_RATE_DATE,l_end_date),p_VOLATILITY_OR_RATE,
207 p_DAY_MTH,p_DAY_COUNT_BASIS,p_CURRENCYB,p_PERIOD_REF1,p_PERIOD_REF2,
208 IM_NOS_OF_DAYS,l_sysdate,fnd_global.user_id);
209 end if;
210 END LOOP;
211 close OPTION_VOLS;
212 --
213 open INSTRUMENTS_MAINTAINED;
214 fetch INSTRUMENTS_MAINTAINED INTO p_REVAL_TYPE,p_PERIOD_REF1,p_PERIOD_REF2,
215 p_CURRENCYA, p_CURRENCYB,l_term_type, l_day_count_basis,
216 l_bid_curr_rate,l_ask_curr_rate,l_latest_rate_date,
217 IM_NOS_OF_DAYS;
218 WHILE INSTRUMENTS_MAINTAINED%FOUND LOOP
219 p_RATE_DATE := l_latest_rate_date;
220 p_BID := l_bid_curr_rate;
221 p_ASK := l_ask_curr_rate;
222 p_DAY_COUNT_BASIS := l_day_count_basis;
223 if l_term_type in('D','F') then
224 if p_PERIOD_REF1 = 1 then
225 p_DAY_MTH := 'DAY';
226 else
227 p_DAY_MTH := 'DAYS';
228 end if;
229 p_NUMBER_OF_DAYS := p_PERIOD_REF1;
230 elsif l_term_type in('M','W') then
231 if p_PERIOD_REF1 = 1 then
232 p_DAY_MTH := 'MONTH';
233 else
234 p_DAY_MTH := 'MONTHS';
235 end if;
236 p_NUMBER_OF_DAYS := p_PERIOD_REF1 * 30;
237 elsif l_term_type = 'Y' then
238 if p_PERIOD_REF1 = 1 then
239 p_DAY_MTH := 'YEAR';
240 else
241 p_DAY_MTH := 'YEARS';
242 end if;
243 p_NUMBER_OF_DAYS := p_PERIOD_REF1 * 360;
244 elsif l_term_type in ('B', 'T') then
245 p_DAY_MTH :=null;
246 p_NUMBER_OF_DAYS :=null;
247 end if;
248
249 if l_term_type in('F','W') then
250 p_VOLATILITY_OR_RATE := 'FWDS';
251 elsif l_term_type in('B', 'T') then
252 p_VOLATILITY_OR_RATE := 'PRIC';
253 else
254 p_VOLATILITY_OR_RATE := 'RATE';
255 end if;
256
257 if l_term_type = 'S' then
258 -- Get FX SPOT Rates
259 p_UNIQUE_REF_NUM := NULL;
260 p_DAY_MTH := NULL;
261 open RATES_FX_SPOT;
262 fetch RATES_FX_SPOT INTO p_RATE_DATE,p_BID, p_ASK;
263
264 if RATES_FX_SPOT%NOTFOUND then
265 p_RATE_DATE := l_latest_rate_date;
266 p_BID := l_bid_curr_rate;
267 p_ASK := l_ask_curr_rate;
268 end if;
269
270 close RATES_FX_SPOT;
271 p_NUMBER_OF_DAYS := 2;
272 p_PERIOD_REF1 := NULL;
273 open NUM;
274 fetch NUM INTO p_UNIQUE_REF_NUM;
275 close NUM;
276
277 insert into XTR_REVALUATION_RATES
278 (batch_id,unique_ref_num,company_code,period_from,period_to,reval_type,
279 currencya,bid,ask,entered_on,
280 entered_by,rate_date,volatility_or_rate,day_mth,day_count_basis,currencyb,period_ref1,
281 period_ref2,number_of_days,created_on,created_by)
282 values
283 (p_BATCH_ID,p_UNIQUE_REF_NUM,l_company,l_start_date,l_end_date,
284 p_REVAL_TYPE,p_CURRENCYA,p_BID,p_ASK,
285 l_sysdate,fnd_global.user_id,nvl(p_RATE_DATE,l_end_date),p_VOLATILITY_OR_RATE,
286 p_DAY_MTH,p_day_count_basis,p_CURRENCYB,p_PERIOD_REF1,p_PERIOD_REF2,
287 IM_NOS_OF_DAYS,l_sysdate,fnd_global.user_id);
288 else
289 p_UNIQUE_REF_NUM := NULL;
290 -- Get OTHER Rates
291 open RATES_NON_FX;
292 fetch RATES_NON_FX INTO p_RATE_DATE,p_BID, p_ASK;
293
294 if RATES_NON_FX%NOTFOUND then
295 p_RATE_DATE := l_latest_rate_date;
296 p_BID := l_bid_curr_rate;
297 p_ASK := l_ask_curr_rate;
298 end if;
299 close RATES_NON_FX;
300
301 open NUM;
302 fetch NUM INTO p_UNIQUE_REF_NUM;
303 close NUM;
304
305 insert into XTR_REVALUATION_RATES
306 (batch_id,unique_ref_num,company_code,period_from,period_to,reval_type,
307 currencya,bid, ask,entered_on,
308 entered_by,rate_date,volatility_or_rate,day_mth,day_count_basis,currencyb,period_ref1,
309 period_ref2,number_of_days,created_on,created_by)
310 values
311 (p_BATCH_ID,p_UNIQUE_REF_NUM,l_company,l_start_date,l_end_date,
312 p_REVAL_TYPE,p_CURRENCYA,p_BID,p_ASK,
313 l_sysdate,fnd_global.user_id,nvl(p_RATE_DATE,l_end_date),p_VOLATILITY_OR_RATE,
314 p_DAY_MTH,p_DAY_COUNT_BASIS,p_CURRENCYB,p_PERIOD_REF1,p_PERIOD_REF2,
315 IM_NOS_OF_DAYS,l_sysdate,fnd_global.user_id);
316 end if;
317 fetch INSTRUMENTS_MAINTAINED INTO p_REVAL_TYPE,p_PERIOD_REF1,p_PERIOD_REF2,
318 p_CURRENCYA, p_CURRENCYB,l_term_type, l_day_count_basis,
319 l_bid_curr_rate, l_ask_curr_rate,l_latest_rate_date,
320 IM_NOS_OF_DAYS;
321 END LOOP;
322 close INSTRUMENTS_MAINTAINED;
323
324 commit;
325
326 end GET_ALL_REVAL_RATES;
327 -----------------------------------------------------------------------------
328 /***********************************************************************/
329 /* This procedure calculation Revaluation details and insert into table*/
330 /* Before calculating reval detail, we need to make sure: */
331 /* (1) the previous batch for the same company has been run */
332 /* (2) The batch is not run yet */
333 /***********************************************************************/
334 PROCEDURE CALC_REVALS(errbuf OUT NOCOPY VARCHAR2,
335 retcode OUT NOCOPY NUMBER,
336 p_company IN VARCHAR2,
337 p_batch_id IN NUMBER) IS
338
339 Cursor CHK_PRE_BATCH is
340 Select 'Y'
341 From XTR_BATCHES CUR, XTR_BATCHES PRE,
342 XTR_BATCH_EVENTS EV
343 Where cur.batch_id = p_batch_id
344 and cur.company_code = pre.company_code
345 and (( cur.batch_id > pre.batch_id
346 and pre.batch_id = ev.batch_id
347 and ev.event_code = 'REVAL' ) or pre.batch_id is null)
348 order by pre.batch_id desc;
349
350 Cursor CHK_BATCH_RUN is
351 Select 'Y'
352 From XTR_BATCH_EVENTS
353 Where batch_id = p_batch_id
354 and event_code = 'REVAL';
355
356 rec xtr_revl_rec;
357 l_rc NUMBER;
358 r_rd XTR_REVALUATION_DETAILS%rowtype;
359 l_cur VARCHAR2(1); -- cursor holder
360 l_cur1 VARCHAR2(1);
361 l_dirname VARCHAR2(240);
362 --retcode NUMBER;
363
364 begin
365 /* TBC comment out temporarily. allow very first batch to run */
366 /*
367 Open CHK_PRE_BATCH;
368 Fetch CHK_PRE_BATCH into l_cur;
369 If CHK_PRE_BATCH%NOTFOUND then -- The previous batch has not run yet
370 Close CHK_PRE_BATCH;
371 Raise e_no_pre_batch;
372 End If;
373 Close CHK_PRE_BATCH;
374 */
375
376 Open CHK_BATCH_RUN;
377 Fetch CHK_BATCH_RUN into l_cur1;
378 If CHK_BATCH_RUN%FOUND then -- the current batch has run
379 Close CHK_BATCH_RUN;
380 Raise e_batch_been_run;
381 End If;
382 Close CHK_BATCH_RUN;
383
384 xtr_risk_debug_pkg.start_conc_prog;
385 t_log_init; -- initial the temp error log table
386 xtr_revl_main(p_batch_id, rec, r_rd, l_rc);
387 if g_status = 1 then
388 retcode := 1;
389 end if;
390 xtr_risk_debug_pkg.stop_conc_debug;
391
392 -------------------------------------
393 /* For local debugging purpose only
394 -------------------------------------
395 SELECT SUBSTR(value,1,DECODE(INSTR(value,','),0,LENGTH(value),INSTR(value,',')-1) )
396 into l_dirname
397 from v$parameter
398 where name = 'utl_file_dir';
399
400 xtr_risk_debug_pkg.start_debug(l_dirname, 'reval.log');
401 t_log_init; -- initial the temp error log table
402 xtr_revl_main(p_batch_id, rec, r_rd, retcode);
403 xtr_risk_debug_pkg.stop_debug;
404 */
405
406 EXCEPTION
407 When e_no_pre_batch then
408 FND_MESSAGE.Set_Name('XTR', 'XTR_NO_PRE_REVAL');
409 FND_MESSAGE.Set_Token('BATCH', p_batch_id);
410 APP_EXCEPTION.raise_exception;
411 When e_batch_been_run then
412 FND_MESSAGE.Set_Name('XTR', 'XTR_BATCH_IN_REVAL');
413 FND_MESSAGE.Set_Token('BATCH', p_batch_id);
414 APP_EXCEPTION.raise_exception;
415
416 end CALC_REVALS;
417 --------------------------------------------------------
418 /********************************************************/
419 /* The real process to calculate revaluation details */
420 /********************************************************/
421 PROCEDURE xtr_revl_main(
422 p_batch_id IN NUMBER,
423 rec IN OUT NOCOPY xtr_revl_rec,
424 r_rd IN OUT NOCOPY XTR_REVALUATION_DETAILS%rowtype,
425 retcode OUT NOCOPY NUMBER) IS
426 l_buf Varchar2(500);
427 l_batch_end DATE;
428 l_batch_start DATE;
429 l_company_code VARCHAR2(7);
430 l_accounting VARCHAR2(30);
431 l_exchange_type VARCHAR2(30);
432 l_sob_ccy VARCHAR2(15); -- company SOB currency
433 l_fv NUMBER; -- fairvalue
434 l_rc NUMBER := 0; -- return code
435 l_end_fv NUMBER;
436 unrel_pl_value NUMBER; -- unrealized P/L
437 rel_pl_value NUMBER; -- realized P/L
438 cum_pl_value NUMBER:= null; -- cumulative unrealized P/L
439 rel_sob_gl NUMBER; -- realized G/L in SOB currency
440 unrel_sob_gl NUMBER; -- unrealized G/L in SOB currency
441 currency_gl NUMBER; -- G/L in reval currency
442 rel_curr_gl NUMBER;
443 unrel_curr_gl NUMBER;
444 fv_sob_amt NUMBER; -- Fair value of SOB currency
445 l_ca_acct VARCHAR2(20); -- Account number for CA
446 ca_deal_no NUMBER;
447 ca_currency VARCHAR2(15);
448 ca_port VARCHAR2(7);
449 ig_deal_no NUMBER;
450 ig_currency VARCHAR2(15);
451 ig_product VARCHAR2(10);
452 onc_deal_no NUMBER;
453 onc_currency VARCHAR2(15);
454 onc_subtype VARCHAR2(7);
455 rel_currency_gl NUMBER; -- For IG, CA, and ONC
456 unrel_currency_gl NUMBER; -- For IG, CA, and ONC
457 l_tmp xtr_eligible_rec;
458 l_round NUMBER;
459 l_reneg_date DATE;
460 l_ni_pl NUMBER;
461 l_dummy NUMBER;
462 l_dummy1 NUMBER;
463 l_dummy2 NUMBER;
464 l_port VARCHAR2(7);
465 l_ca_rate NUMBER;
466 r_fx_rate xtr_revl_fx_rate; -- record type
467 l_sob_curr_rate NUMBER;
468 l_first BOOLEAN;
469 l_deno NUMBER;
470 l_numer NUMBER;
471 l_base_ccy VARCHAR2(15);
472 l_contra_ccy VARCHAR2(15);
473 l_reverse BOOLEAN;
474 l_fx_rate NUMBER;
475 l_fx_param VARCHAR2(50);
476 l_complete_flag VARCHAR2(1);
477 l_hedge_flag VARCHAR2(1) := 'N';
478 l_close_no NUMBER;
479 r_err_log err_log; -- record type
480
481 /**************************************************************/
482 /* Find all eligible deals for each deal type for revaluation */
483 /**************************************************************/
484 cursor c_bdo_deal is
485 Select * from XTR_BDO_ELIGIBLE_DEALS_V
486 where eligible_date <= l_batch_end and company_code = l_company_code;
487
488 Cursor c_bond_deal is
489 Select * from XTR_BOND_ELIGIBLE_DEALS_V
490 where eligible_date <= l_batch_end and company_code = l_company_code;
491
492 Cursor c_fra_deal is
493 Select * from XTR_FRA_ELIGIBLE_DEALS_V
494 where eligible_date <= l_batch_end and company_code = l_company_code;
495
496 Cursor c_hedge is
497 Select * from XTR_ELIGIBLE_HEDGES_V
498 where eligible_date <= l_batch_end and company_code = l_company_code;
499
500 Cursor c_fx_hedge_deal is
501 Select * from XTR_FX_ELIGIBLE_DEALS_V
502 where eligible_date <= l_batch_end and company_code = l_company_code
503 and deal_no in (select h.primary_code
504 from xtr_hedge_relationships H, xtr_revaluation_details R
505 where h.instrument_item_flag = 'U'
506 and r.batch_id = p_batch_id
507 and h.hedge_attribute_id = r.deal_no);
508
509 Cursor c_fx_deal is
510 Select * from XTR_FX_ELIGIBLE_DEALS_V
511 where eligible_date <= l_batch_end and company_code = l_company_code
512 and deal_no not in (select h.primary_code
513 from xtr_hedge_relationships H, xtr_revaluation_details R
514 where h.instrument_item_flag = 'U'
515 and r.batch_id = p_batch_id
516 and h.hedge_attribute_id = r.deal_no);
517
518 Cursor c_fxo_deal is
519 Select * from XTR_FXO_ELIGIBLE_DEALS_V
520 where eligible_date <= l_batch_end and company_code = l_company_code;
521
522 -- For IG, we calculate currency G/L for each deal number of the company
523 -- which is the unique combination of company, cparty, and currency
524 Cursor c_ig_deal is
525 Select distinct deal_no, currencya from XTR_IG_ELIGIBLE_DEALS_V
526 where eligible_date <= l_batch_end and company_code = l_company_code;
527
528 Cursor c_iro_deal is
529 Select * from XTR_IRO_ELIGIBLE_DEALS_V
530 where eligible_date <= l_batch_end and company_code = l_company_code;
531
532 Cursor c_irs_deal is
533 Select * from XTR_IRS_ELIGIBLE_DEALS_V
534 where eligible_date <= l_batch_end and company_code = l_company_code;
535
536 Cursor c_ni_deal is
537 Select * from XTR_NI_ELIGIBLE_DEALS_V
538 where eligible_date <= l_batch_end and company_code = l_company_code;
539
540 Cursor c_onc_deal is
541 Select distinct deal_no, deal_subtype, currencya, portfolio_code
542 from XTR_ONC_ELIGIBLE_DEALS_V
543 where eligible_date <= l_batch_end and company_code = l_company_code;
544
545 Cursor c_swptn_deal is
546 Select * from XTR_SWPTN_ELIGIBLE_DEALS_V
547 where eligible_date <= l_batch_end and company_code = l_company_code;
548
549 Cursor c_rtmm_deal is
550 Select * from XTR_RTMM_ELIGIBLE_DEALS_V
551 where eligible_date <= l_batch_end and company_code = l_company_code
552 and deal_no in (select deal_no from xtr_deals where deal_type = 'RTMM'
553 and last_reval_batch_id is null);
554
555 Cursor c_stock_deal is
556 select * from XTR_STOCK_ELIGIBLE_DEALS_V
557 where eligible_date <= l_batch_end and company_code = l_company_code;
558
559 Cursor c_tmm_deal is
560 Select * from XTR_TMM_ELIGIBLE_DEALS_V
561 where eligible_date <= l_batch_end and company_code = l_company_code;
562
563 -- For CA, we calculate currency G/L for each account number of the company
564 Cursor c_ca_acct is
565 Select distinct ca.account_no, ca.currencya, dda.deal_number,
566 ca.portfolio_code
567 from XTR_CA_ELIGIBLE_DEALS_V CA,
568 XTR_DEAL_DATE_AMOUNTS DDA
569 where ca.company_code = l_company_code
570 and ca.eligible_date <= l_batch_end
571 and ca.company_code = dda.company_code
572 and ca.currencya = dda.currency
573 and dda.deal_type = 'CA'
574 and ca.account_no = dda.account_no;
575
576 begin
577 -- set the flag to indicate it is called by concurrent program
578 -- so that error log will write to the output file
579 set_call_by_curr;
580
581 select PERIOD_END, COMPANY_CODE, PERIOD_START
582 into l_batch_end, l_company_code, l_batch_start
583 from xtr_batches
584 where BATCH_ID = p_batch_id;
585
586 select PARAMETER_VALUE_CODE into l_accounting
587 from xtr_company_parameters
588 where COMPANY_CODE = l_company_code and
589 PARAMETER_CODE = C_DEAL_SETTLE_ACCOUNTING;
590
591 select PARAMETER_VALUE_CODE into l_exchange_type
592 from xtr_company_parameters
593 where COMPANY_CODE = l_company_code and
594 PARAMETER_CODE = C_EXCHANGE_RATE_TYPE;
595
596 select sob.currency_code
597 into l_sob_ccy
598 from gl_sets_of_books sob, xtr_party_info pinfo
599 where pinfo.party_code = l_company_code
600 and pinfo.set_of_books_id = sob.SET_OF_BOOKS_ID;
601
602 select param_value
603 into l_fx_param
604 from XTR_PRO_PARAM
605 where param_type = 'DFLTVAL'
606 and param_name = 'FX_REALIZED_RATE';
607
608 rec.batch_id := p_batch_id;
609 rec.batch_start := l_batch_start;
610 rec.company_code := l_company_code;
611 rec.revldate := l_batch_end;
612 rec.sob_ccy := l_sob_ccy;
613 rec.ex_rate_type := l_exchange_type;
614
615 -- Insert into XTR_BATCH_EVENTS table
616 xtr_insert_event(p_batch_id);
617
618 /********************* BDO revaluation ***********************/
619 for l_tmp in c_bdo_deal loop
620 xtr_get_deal_value(l_tmp, rec, r_rd);
621 xtr_revl_get_fairvalue(rec, l_fv, retcode);
622 rec.fair_value := l_fv;
623
624 if l_tmp.effective_date <= l_batch_end and
625 (rec.status_code = 'EXPIRED' or rec.status_code = 'EXERCISED') then
626 -- Insert realized g/l info to XTR_REVALUATION_DETAILS
627 rel_pl_value := rec.fair_value - rec.init_fv;
628 xtr_revl_exchange_rate(rec, retcode);
629 xtr_revl_get_curr_gl(rec, null, rel_pl_value,
630 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
631 xtr_revl_real_log(rec, rel_pl_value, fv_sob_amt, rel_sob_gl, currency_gl, r_rd, retcode);
632
633 -- Also insert the last unrealized g/l info to XTR_REVALUATION_DETAILS
634 xtr_get_fv_from_batch(rec, l_dummy, l_dummy1, cum_pl_value, l_dummy2);
635 unrel_pl_value := rel_pl_value - cum_pl_value;
636 xtr_revl_get_curr_gl(rec, unrel_pl_value, null,
637 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
638 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
639 unrel_sob_gl, currency_gl, r_rd, retcode);
640 else
641 xtr_revl_get_unrel_pl(rec, unrel_pl_value,cum_pl_value, retcode);
642 xtr_revl_exchange_rate(rec, retcode);
643 xtr_revl_get_curr_gl(rec, unrel_pl_value, rel_pl_value,
644 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
645 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
646 unrel_sob_gl, currency_gl, r_rd, retcode);
647 end if;
648 cum_pl_value:= null;
649 END loop;
650 l_tmp := null;
651
652 /********************* BOND revaluation ***********************/
653 for l_tmp in c_bond_deal loop
654 xtr_get_deal_value(l_tmp, rec, r_rd);
655 xtr_revl_get_fairvalue(rec, l_fv, retcode);
656 rec.fair_value := l_fv;
657
658 END loop;
659 l_tmp := null;
660
661 /********************* FRA revaluation ***********************/
662 for l_tmp in c_fra_deal loop
663 xtr_get_deal_value(l_tmp, rec,r_rd);
664 xtr_revl_get_fairvalue(rec, l_fv, retcode);
665 rec.fair_value := l_fv;
666
667 if l_rc = 0 then
668 if l_tmp.effective_date <= l_batch_end and rec.status_code = 'SETTLED' then
669 -- Insert realized g/l info to XTR_REVALUATION_DETAILS
670 rel_pl_value := rec.fair_value - rec.init_fv;
671 xtr_revl_exchange_rate(rec, retcode);
672 xtr_revl_get_curr_gl(rec, null, rel_pl_value,
673 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
674 xtr_revl_real_log(rec, rel_pl_value, fv_sob_amt, rel_sob_gl, currency_gl, r_rd, retcode);
675
676 -- Also insert the last unrealized g/l info to XTR_REVALUATION_DETAILS
677 xtr_get_fv_from_batch(rec, l_dummy, l_dummy1, cum_pl_value, l_dummy2);
678 unrel_pl_value := rel_pl_value - cum_pl_value;
679 xtr_revl_get_curr_gl(rec, unrel_pl_value, null,
680 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
681 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
682 unrel_sob_gl, currency_gl, r_rd, retcode);
683
684 else -- calculate unrealized g/l
685 if l_tmp.effective_date <= l_batch_end and l_tmp.settle_amount is null then
686 -- this deal should be mature, but user does not settle it. Still create unrealized g/l row
687 unrel_pl_value := 0;
688 fv_sob_amt := 0;
689 unrel_sob_gl := 0;
690 currency_gl := 0;
691 else
692 xtr_revl_get_unrel_pl(rec, unrel_pl_value,cum_pl_value, retcode);
693 xtr_revl_exchange_rate(rec, retcode);
694 xtr_revl_get_curr_gl(rec, unrel_pl_value, rel_pl_value,
695 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
696 end if;
697 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
698 unrel_sob_gl, currency_gl, r_rd, retcode);
699 end if;
700 end if;
701 cum_pl_value:= null;
702 END loop;
703 l_tmp := null;
704 --
705 /********************** HEDGE revaluation ***********************/
706 for l_tmp in c_hedge loop
707 xtr_get_deal_value(l_tmp, rec, r_rd);
708 xtr_revl_fv_hedge(rec);
709 end loop;
710 l_tmp := NULL;
711
712 ---
713 /********************* Hedge associated FX revaluation ***********************/
714 /* This process needs to be done after Hedge item been revalued. So system */
715 /* system can find hedge related FX deals based on xtr_revaluation_details */
716 /* table. */
717 /*****************************************************************************/
718 for l_tmp in c_fx_hedge_deal loop
719 xtr_get_deal_value(l_tmp, rec, r_rd);
720 xtr_revl_fv_fxh(rec, r_rd);
721 cum_pl_value:= null;
722 end loop;
723 l_tmp := NULL;
724 --
725
726 /********************* FX revaluation ***********************/
727 for l_tmp in c_fx_deal loop
728 xtr_get_deal_value(l_tmp, rec, r_rd);
729
730 if l_tmp.effective_date <= l_batch_end then
731 -- Insert realized g/l info to XTR_REVALUATION_DETAILS
732 if rec.status_code = 'CLOSED' then -- this deal is predeliever/rollover
733 select profit_loss, fx_ro_pd_rate
734 into rel_pl_value, l_fx_rate
735 from XTR_DEALS
736 where deal_no = rec.deal_no;
737
738 rec.fair_value := rel_pl_value + rec.init_fv;
739 rec.reval_rate := l_fx_rate;
740 rec.reval_fx_fwd_rate := null;
741 else -- status = 'CURRENT'. Hold to maturity
742 if l_fx_param = 'Y' then -- system parameter for FX realized records
743 rec.effective_date := rec.revldate;
744 end if;
745
746 xtr_revl_getrate_fx(rec, l_hedge_flag, r_fx_rate);
747 rec.reval_rate := r_fx_rate.fx_forward_rate;
748 xtr_revl_fv_fx(rec, r_fx_rate, l_hedge_flag, l_fv, l_sob_curr_rate);
749 rec.reval_fx_fwd_rate := l_sob_curr_rate;
750 rec.fair_value := l_fv;
751
752 rel_pl_value := rec.fair_value - rec.init_fv;
753 end if;
754 xtr_revl_fx_curr_gl(rec, l_hedge_flag, TRUE, currency_gl);
755 xtr_revl_real_log(rec, rel_pl_value, rec.fair_value, rel_pl_value,
756 currency_gl, r_rd, retcode);
757
758 -- Also insert the last unrealized g/l info to XTR_REVALUATION_DETAILS
759 -- For spot, we only show one realized record. This part is not needed
760 xtr_get_fv_from_batch(rec, l_dummy, l_dummy1, cum_pl_value, l_dummy2);
761 unrel_pl_value := rel_pl_value - cum_pl_value;
762 xtr_revl_fx_curr_gl(rec, l_hedge_flag, FALSE, currency_gl);
763 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, rec.fair_value,
764 unrel_pl_value, currency_gl, r_rd, retcode);
765
766 else -- calculate unrealized g/l
767 if rec.deal_subtype = 'FORWARD' then
768 xtr_revl_getrate_fx(rec, l_hedge_flag, r_fx_rate);
769 rec.reval_rate := r_fx_rate.fx_forward_rate;
770 xtr_revl_fv_fx(rec, r_fx_rate, l_hedge_flag, l_fv, l_sob_curr_rate);
771 rec.reval_fx_fwd_rate := l_sob_curr_rate;
772 rec.fair_value := l_fv;
773 else -- SPOT
774 rec.reval_rate := rec.transaction_rate;
775 rec.fair_value := 0;
776 rec.reval_fx_fwd_rate := null;
777 end if;
778
779 xtr_revl_get_unrel_pl(rec, unrel_pl_value,cum_pl_value, retcode);
780 xtr_revl_fx_curr_gl(rec, l_hedge_flag, FALSE, currency_gl);
781 /** For FX, the reval ccy is SOB ccy, so the unrel_pl_value = unrel_sob_gl */
782 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, rec.fair_value,
783 unrel_pl_value, currency_gl, r_rd, retcode);
784 end if;
785 cum_pl_value:= null;
786 END loop;
787 l_tmp := null;
788 --
789
790 /********************* FXO revaluation ***********************/
791 for l_tmp in c_fxo_deal loop
792 xtr_get_deal_value(l_tmp, rec, r_rd);
793 xtr_revl_get_fairvalue(rec, l_fv, retcode);
794 rec.fair_value := l_fv;
795
796 if l_rc = 0 then
797 if l_tmp.effective_date <= l_batch_end and
798 (rec.status_code = 'EXPIRED' or rec.status_code = 'EXERCISED') then
799 -- The deal is mature. We may calculate realized g/l
800 -- Insert realized g/l info to XTR_REVALUATION_DETAILS
801 rel_pl_value := rec.fair_value - rec.init_fv;
802 xtr_revl_exchange_rate(rec, retcode);
803 xtr_revl_get_curr_gl(rec, null, rel_pl_value,
804 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
805 xtr_revl_real_log(rec, rel_pl_value, fv_sob_amt, rel_sob_gl, currency_gl, r_rd, retcode);
806
807 -- Also insert the last unrealized g/l info to XTR_REVALUATION_DETAILS
808 xtr_get_fv_from_batch(rec, l_dummy, l_dummy1, cum_pl_value, l_dummy2);
809 unrel_pl_value := rel_pl_value - cum_pl_value;
810 xtr_revl_get_curr_gl(rec, unrel_pl_value, null,
811 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
812 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
813 unrel_sob_gl, currency_gl, r_rd, retcode);
814
815 else -- calculate unrealized g/l
816 xtr_revl_get_unrel_pl(rec, unrel_pl_value,cum_pl_value, retcode);
817 xtr_revl_exchange_rate(rec, retcode);
818 xtr_revl_get_curr_gl(rec, unrel_pl_value, rel_pl_value,
819 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
820 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
821 unrel_sob_gl, currency_gl, r_rd, retcode);
822 end if;
823 end if;
824 cum_pl_value:= null;
825 END loop;
826 l_tmp := null;
827 --
828 /********************* IRO revaluation ***********************/
829 for l_tmp in c_iro_deal loop
830 xtr_get_deal_value(l_tmp, rec, r_rd);
831 xtr_revl_get_fairvalue(rec, l_fv, retcode);
832 rec.fair_value := l_fv;
833
834 if l_rc = 0 then
835 if l_tmp.effective_date <= l_batch_end and
836 (rec.status_code = 'EXPIRED' or rec.status_code = 'EXERCISED') then
837 -- The deal is mature. We may calculate realized g/l
838 -- Insert realized g/l info to XTR_REVALUATION_DETAILS
839 rel_pl_value := rec.fair_value - rec.init_fv;
840 xtr_revl_exchange_rate(rec, retcode);
841 xtr_revl_get_curr_gl(rec, null, rel_pl_value,
842 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
843 xtr_revl_real_log(rec, rel_pl_value, fv_sob_amt, rel_sob_gl, currency_gl, r_rd, retcode);
844
845 -- Also insert the last unrealized g/l info to XTR_REVALUATION_DETAILS
846 xtr_get_fv_from_batch(rec, l_dummy, l_dummy1, cum_pl_value, l_dummy2);
847 unrel_pl_value := rel_pl_value - cum_pl_value;
848 xtr_revl_get_curr_gl(rec, unrel_pl_value, null,
849 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
850 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
851 unrel_sob_gl, currency_gl, r_rd, retcode);
852
853 else -- calculate unrealized g/l
854 xtr_revl_get_unrel_pl(rec, unrel_pl_value,cum_pl_value, retcode);
855 xtr_revl_exchange_rate(rec, retcode);
856 xtr_revl_get_curr_gl(rec, unrel_pl_value, rel_pl_value,
857 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
858 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
859 unrel_sob_gl, currency_gl, r_rd, retcode);
860 end if;
861 end if;
862 cum_pl_value:= null;
863 END loop;
864 l_tmp := null;
865 --
866 /********************* IRS revaluation ***********************/
867 for l_tmp in c_irs_deal loop
868 xtr_get_deal_value(l_tmp, rec, r_rd);
869 xtr_revl_get_fairvalue(rec, l_fv, retcode);
870 rec.fair_value := l_fv;
871 rec.reval_rate := null;
872
873 if l_rc = 0 then
874 if l_tmp.effective_date <= l_batch_end then
875 -- The deal is mature. We may calculate realized g/l
876 -- Insert realized g/l info to XTR_REVALUATION_DETAILS
877 rel_pl_value := rec.fair_value - rec.init_fv;
878 xtr_revl_exchange_rate(rec, retcode);
879
880 if rec.discount_yield = 'Y' then
881 -- there is principal exchange. Currency G/L is same as TMM curr G/L
882 xtr_revl_tmm_curr_gl(rec, rel_curr_gl, unrel_curr_gl);
883 fv_sob_amt := rec.fair_value * rec.reval_ex_rate_one;
884 unrel_sob_gl := unrel_pl_value * rec.reval_ex_rate_one;
885 rel_sob_gl := rel_pl_value * rec.reval_ex_rate_one;
886 xtr_revl_real_log(rec, rel_pl_value, fv_sob_amt, rel_sob_gl, rel_curr_gl,r_rd, retcode);
887 else -- no principal cashflow. Use normal currency G/L
888 xtr_revl_get_curr_gl(rec, null, rel_pl_value,
889 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
890 xtr_revl_real_log(rec, rel_pl_value, fv_sob_amt, rel_sob_gl, currency_gl,r_rd, retcode);
891 end if;
892
893 -- Also insert the last unrealized g/l info to XTR_REVALUATION_DETAILS
894 xtr_get_fv_from_batch(rec, l_dummy, l_dummy1, cum_pl_value, l_dummy2);
895 unrel_pl_value := rel_pl_value - cum_pl_value;
896 if rec.discount_yield = 'N' then
897 xtr_revl_get_curr_gl(rec, unrel_pl_value, null,
898 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
899 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
900 unrel_sob_gl, currency_gl, r_rd, retcode);
901 else
902 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
903 unrel_sob_gl, unrel_curr_gl, r_rd, retcode);
904 end if;
905 else -- calculate unrealized g/l
906 xtr_revl_get_unrel_pl(rec, unrel_pl_value,cum_pl_value, retcode);
907 xtr_revl_exchange_rate(rec, retcode);
908 if rec.discount_yield = 'Y' then
909 xtr_revl_tmm_curr_gl(rec, rel_curr_gl, unrel_curr_gl);
910 fv_sob_amt := rec.fair_value * rec.reval_ex_rate_one;
911 unrel_sob_gl := unrel_pl_value * rec.reval_ex_rate_one;
912 rel_sob_gl := rel_pl_value * rec.reval_ex_rate_one;
913 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
914 unrel_sob_gl, unrel_curr_gl, r_rd, retcode);
915
916 if nvl(rel_curr_gl, 0) <> 0 then
917 -- We do have realized G/L for this record. insert a new row
918 xtr_revl_real_log(rec, 0, 0, 0, rel_curr_gl, r_rd, retcode);
919 end if;
920 else
921 xtr_revl_get_curr_gl(rec, unrel_pl_value, rel_pl_value,
922 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
923 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
924 unrel_sob_gl, currency_gl, r_rd, retcode);
925 end if;
926 end if;
927 end if;
928 cum_pl_value:= null;
929 END loop;
930 l_tmp := null;
931 --
932 /********************* NI revaluation ***********************/
933 for l_tmp in c_ni_deal loop
934 xtr_get_deal_value(l_tmp, rec, r_rd);
935
936 l_close_no := NULL;
937 select trans_closeout_no, ni_profit_loss, initial_fair_value
938 into l_close_no, l_ni_pl, rec.init_fv
939 from xtr_rollover_transactions
940 where deal_number = rec.deal_no
941 and transaction_number = rec.trans_no;
942
943 if l_close_no is NOT NULL then
944 select decode(l_accounting, 'TRADE', deal_date, start_date)
945 into l_reneg_date
946 from XTR_DEALS
947 where deal_no = l_close_no;
948 end if;
949
950 xtr_revl_get_fairvalue(rec, l_fv, retcode);
951 rec.fair_value := l_fv;
952
953 if l_rc = 0 then
954 if (l_tmp.effective_date <= l_batch_end) or
955 (rec.status_code = 'CLOSED' and l_reneg_date <= l_batch_end) then
956 if (rec.status_code = 'CLOSED' and l_reneg_date <= l_batch_end) then
957 -- This parcel has been resale or covered. We get realized G/L from
958 -- rollover table ni_profit_loss column and + initial fv = FV.
959 rec.effective_date := l_reneg_date;
960 rec.period_end := l_reneg_date;
961 rel_pl_value := l_ni_pl;
962 rec.fair_value := rel_pl_value + rec.init_fv;
963 -- Insert reval rate equal to new resale deal's rate
964 select interest_rate
965 into rec.reval_rate
966 from XTR_DEALS
967 where deal_no = (select trans_closeout_no
968 from XTR_ROLLOVER_TRANSACTIONS
969 where deal_number = rec.deal_no
970 and transaction_number = rec.trans_no);
971 else -- The deal is mature. We may calculate realized g/l
972 rel_pl_value := 0;
973 xtr_end_fv(rec, rec.fair_value);
974 rec.reval_rate := 0;
975 end if;
976
977 xtr_get_fv_from_batch(rec, l_dummy, l_dummy1, cum_pl_value, l_dummy2);
978 xtr_revl_exchange_rate(rec, retcode);
979 xtr_revl_get_curr_gl(rec, null, rel_pl_value,
980 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
981 xtr_revl_real_log(rec, rel_pl_value, fv_sob_amt, rel_sob_gl, currency_gl, r_rd, retcode);
982
983 -- Also insert the last unrealized g/l info to XTR_REVALUATION_DETAILS
984 unrel_pl_value := rel_pl_value - cum_pl_value;
985 xtr_revl_get_curr_gl(rec, unrel_pl_value, null,
986 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
987 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
988 unrel_sob_gl, currency_gl, r_rd, retcode);
989
990 else -- calculate unrealized g/l
991 xtr_revl_get_unrel_pl(rec, unrel_pl_value,cum_pl_value, retcode);
992 xtr_revl_exchange_rate(rec, retcode);
993 xtr_revl_get_curr_gl(rec, unrel_pl_value, rel_pl_value,
994 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
995 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
996 unrel_sob_gl, currency_gl, r_rd, retcode);
997 end if;
998 end if;
999 cum_pl_value:= null;
1000 END loop;
1001 l_tmp := null;
1002 --
1003 /********************* STOCK revaluation ***********************/
1004 for l_tmp in c_stock_deal loop
1005 xtr_get_deal_value(l_tmp, rec, r_rd);
1006 xtr_revl_get_fairvalue(rec, l_fv, retcode);
1007 rec.fair_value := l_fv;
1008 end loop;
1009 l_tmp := null;
1010 --
1011
1012 /********************* RTMM revaluation ***********************/
1013 for l_tmp in c_rtmm_deal loop
1014 xtr_get_deal_value(l_tmp, rec, r_rd);
1015 xtr_revl_get_fairvalue(rec, l_fv, retcode);
1016 rec.fair_value := l_fv;
1017
1018 if l_tmp.effective_date <= l_batch_end then
1019 -- The deal is mature. We may calculate realized g/l
1020 -- Insert realized g/l info to XTR_REVALUATION_DETAILS
1021 rel_pl_value := rec.fair_value - rec.init_fv;
1022 xtr_revl_exchange_rate(rec, retcode);
1023 xtr_revl_get_curr_gl(rec, null, rel_pl_value,
1024 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
1025 xtr_revl_real_log(rec, rel_pl_value, fv_sob_amt, rel_sob_gl, currency_gl, r_rd, retcode);
1026
1027 -- Also insert the last unrealized g/l info to XTR_REVALUATION_DETAILS
1028 xtr_get_fv_from_batch(rec, l_dummy, l_dummy1, cum_pl_value, l_dummy2);
1029 unrel_pl_value := rel_pl_value - cum_pl_value;
1030 xtr_revl_get_curr_gl(rec, unrel_pl_value, null,
1031 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
1032 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
1033 unrel_sob_gl, currency_gl, r_rd, retcode);
1034
1035 else -- calculate unrealized g/l
1036 xtr_revl_get_unrel_pl(rec, unrel_pl_value,cum_pl_value, retcode);
1037 xtr_revl_exchange_rate(rec, retcode);
1038 xtr_revl_get_curr_gl(rec, unrel_pl_value, rel_pl_value,
1039 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
1040 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
1041 unrel_sob_gl, currency_gl, r_rd, retcode);
1042 end if;
1043 cum_pl_value:= null;
1044 END loop;
1045 l_tmp := null;
1046 --
1047 /********************* SWPTN revaluation ***********************/
1048 for l_tmp in c_swptn_deal loop
1049 xtr_get_deal_value(l_tmp, rec, r_rd);
1050 xtr_revl_get_fairvalue(rec, l_fv, retcode);
1051 rec.fair_value := l_fv;
1052
1053 if l_tmp.effective_date <= l_batch_end and
1054 (rec.status_code = 'EXPIRED' or rec.status_code = 'EXERCISED') then
1055 -- The deal is mature. We may calculate realized g/l
1056 -- Insert realized g/l info to XTR_REVALUATION_DETAILS
1057 rel_pl_value := rec.fair_value - rec.init_fv;
1058 xtr_revl_exchange_rate(rec, retcode);
1059 xtr_revl_get_curr_gl(rec, null, rel_pl_value,
1060 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
1061 xtr_revl_real_log(rec, rel_pl_value, fv_sob_amt, rel_sob_gl, currency_gl, r_rd, retcode);
1062
1063 -- Also insert the last unrealized g/l info to XTR_REVALUATION_DETAILS
1064 xtr_get_fv_from_batch(rec, l_dummy, l_dummy1, cum_pl_value, l_dummy2);
1065 unrel_pl_value := rel_pl_value - cum_pl_value;
1066 xtr_revl_get_curr_gl(rec, unrel_pl_value, null,
1067 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
1068 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
1069 unrel_sob_gl, currency_gl, r_rd, retcode);
1070 else
1071 xtr_revl_get_unrel_pl(rec, unrel_pl_value,cum_pl_value, retcode);
1072 xtr_revl_exchange_rate(rec, retcode);
1073 xtr_revl_get_curr_gl(rec, unrel_pl_value, rel_pl_value,
1074 fv_sob_amt, rel_sob_gl, unrel_sob_gl, currency_gl);
1075 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
1076 unrel_sob_gl, currency_gl, r_rd, retcode);
1077 end if;
1078 cum_pl_value:= null;
1079 END loop;
1080 l_tmp := null;
1081
1082 /********************* TMM revaluation ***********************/
1083 for l_tmp in c_tmm_deal loop
1084 xtr_get_deal_value(l_tmp, rec, r_rd);
1085 xtr_revl_get_fairvalue(rec, l_fv, retcode);
1086 rec.fair_value := l_fv;
1087
1088 if l_rc = 0 then
1089 if l_tmp.effective_date <= l_batch_end then
1090 -- The deal is mature. We may calculate realized g/l
1091 -- Insert realized g/l info to XTR_REVALUATION_DETAILS
1092 rel_pl_value := rec.fair_value - rec.init_fv;
1093 xtr_get_fv_from_batch(rec, l_dummy, l_dummy1, cum_pl_value, l_dummy2);
1094 unrel_pl_value := rel_pl_value - cum_pl_value;
1095 xtr_revl_tmm_curr_gl(rec, rel_curr_gl, unrel_curr_gl);
1096 xtr_revl_exchange_rate(rec, retcode);
1097 fv_sob_amt := rec.fair_value * rec.reval_ex_rate_one;
1098 unrel_sob_gl := unrel_pl_value * rec.reval_ex_rate_one;
1099 rel_sob_gl := rel_pl_value * rec.reval_ex_rate_one;
1100 xtr_revl_real_log(rec, rel_pl_value, fv_sob_amt, rel_sob_gl, rel_curr_gl, r_rd, retcode);
1101
1102 -- Also insert the last unrealized g/l info to XTR_REVALUATION_DETAILS
1103 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
1104 unrel_sob_gl, unrel_curr_gl, r_rd, retcode);
1105
1106 else -- calculate unrealized g/l
1107 xtr_revl_get_unrel_pl(rec, unrel_pl_value,cum_pl_value, retcode);
1108 xtr_revl_tmm_curr_gl(rec, rel_curr_gl, unrel_curr_gl);
1109 xtr_revl_exchange_rate(rec, retcode);
1110 fv_sob_amt := rec.fair_value * rec.reval_ex_rate_one;
1111 unrel_sob_gl := unrel_pl_value * rec.reval_ex_rate_one;
1112 rel_sob_gl := rel_pl_value * rec.reval_ex_rate_one;
1113 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
1114 unrel_sob_gl, unrel_curr_gl, r_rd, retcode);
1115
1116 if nvl(rel_curr_gl, 0) <> 0 then
1117 -- We do have realized G/L for this record. insert a new row
1118 xtr_revl_real_log(rec, 0, 0, 0, rel_curr_gl, r_rd, retcode);
1119 end if;
1120 end if;
1121 end if;
1122 cum_pl_value:= null;
1123 END loop;
1124 l_tmp := null;
1125 --
1126 /********************* ONC revaluation ***********************/
1127 Open c_onc_deal;
1128 Fetch c_onc_deal into onc_deal_no,onc_subtype, onc_currency, l_port;
1129 -- Calculate each deal no's currency G/L
1130 While c_onc_deal%FOUND Loop
1131 rec.deal_type := 'ONC';
1132 rec.deal_subtype := onc_subtype;
1133 rec.deal_no := onc_deal_no;
1134 rec.currencya := onc_currency;
1135 rec.reval_ccy := onc_currency;
1136 rec.portfolio_code := l_port;
1137 rec.account_no := NULL;
1138
1139 xtr_revl_onc_curr_gl(rec, l_rc);
1140 if l_rc = 1 then -- deal is incomplete
1141 rec.trans_no := 1;
1142 select nvl(sum(principal_adjust), 0)
1143 into rec.face_value
1144 from XTR_ROLLOVER_TRANSACTIONS
1145 where deal_number = rec.deal_no
1146 and deal_type = 'ONC'
1147 and transaction_number in (select transaction_number
1148 from XTR_ROLLOVER_TRANSACTIONS
1149 where deal_number = rec.deal_no
1150 and start_date <= rec.revldate
1151 and (cross_ref_to_trans is null));
1152
1153 rec.fair_value := rec.face_value;
1154 rec.period_start := rec.batch_start;
1155 rec.period_end := rec.revldate;
1156 r_rd.transaction_period := rec.period_end - rec.period_start;
1157 rec.effective_date := rec.revldate;
1158 r_rd.effective_days := rec.period_end - rec.period_start;
1159 r_rd.amount_type := 'CCYUNRL';
1160 xtr_revl_unreal_log(rec, 0, 0, 0, 0, null, r_rd, retcode);
1161 end if;
1162
1163 fetch c_onc_deal into onc_deal_no, onc_subtype, onc_currency, l_port;
1164 End Loop;
1165 Close c_onc_deal;
1166
1167 l_tmp := null;
1168 --
1169 /********************* IG revaluation ***********************/
1170 Open c_ig_deal;
1171 Fetch c_ig_deal into ig_deal_no, ig_currency; -- Calculate each deal no's currency G/L
1172 While c_ig_deal%FOUND Loop
1173 rec.deal_type := 'IG';
1174 rec.deal_subtype := 'INVEST';
1175 rec.deal_no := ig_deal_no;
1176 rec.currencya := ig_currency;
1177 rec.reval_ccy := rec.sob_ccy;
1178 rec.transaction_rate := 0;
1179 rec.account_no := NULL;
1180
1181 xtr_revl_ig_curr_gl(rec, l_rc);
1182 if l_rc = 1 then -- deal is incomplete
1183 select face_value, product_type
1184 into rec.face_value, rec.product_type
1185 from xtr_ig_eligible_deals_v
1186 where deal_no = rec.deal_no
1187 and company_code = rec.company_code
1188 and transaction_no = (select max(transaction_no)
1189 from xtr_ig_eligible_deals_v
1190 where deal_no = rec.deal_no
1191 and effective_date = (select max(effective_date)
1192 from xtr_ig_eligible_deals_v
1193 where deal_no = rec.deal_no
1194 and company_code = rec.company_code
1195 and eligible_date <= rec.revldate));
1196 rec.fair_value := rec.face_value;
1197 rec.trans_no := 1;
1198 rec.period_start := rec.batch_start;
1199 rec.period_end := rec.revldate;
1200 r_rd.transaction_period := rec.period_end - rec.period_start;
1201 rec.effective_date := rec.revldate;
1202 r_rd.effective_days := rec.period_end - rec.period_start;
1203 r_rd.amount_type := 'CCYUNRL';
1204 xtr_revl_unreal_log(rec, 0, 0, 0, 0, null, r_rd, retcode);
1205 update XTR_INTERGROUP_TRANSFERS
1206 set first_batch_id = rec.batch_id
1207 where company_code = rec.company_code
1208 and deal_number = rec.deal_no
1209 and transfer_date <= rec.revldate;
1210 end if;
1211
1212 Fetch c_ig_deal into ig_deal_no, ig_currency;
1213 End Loop;
1214 Close c_ig_deal;
1215 l_tmp := null;
1216
1217 /********************* CA revaluation ***********************/
1218 Open c_ca_acct;
1219 Fetch c_ca_acct into l_ca_acct, ca_currency, ca_deal_no, ca_port;
1220 -- calculate each account's G/L
1221 While c_ca_acct%FOUND Loop
1222 rec.deal_type := 'CA';
1223 rec.portfolio_code := ca_port;
1224 rec.account_no := l_ca_acct;
1225 rec.currencya := ca_currency;
1226 rec.reval_ccy := rec.sob_ccy;
1227 rec.deal_no := ca_deal_no;
1228 rec.trans_no := 1;
1229 rec.product_type:= 'N/A';
1230
1231 xtr_revl_ca_curr_gl(rec, l_rc);
1232 if l_rc = 1 then -- deal is incomplete
1233 select nvl(face_value,0), transaction_rate -- added nvl for R12
1234 into rec.face_value, rec.transaction_rate
1235 from xtr_ca_eligible_deals_v
1236 where account_no = rec.account_no
1237 and company_code = rec.company_code
1238 and effective_date = (select max(effective_date)
1239 from xtr_ca_eligible_deals_v
1240 where account_no = rec.account_no
1241 and company_code = rec.company_code
1242 and eligible_date <= rec.revldate);
1243 rec.fair_value := rec.face_value;
1244 if rec.fair_value >= 0 then
1245 rec.deal_subtype := 'INVEST';
1246 else
1247 rec.deal_subtype := 'FUND';
1248 end if;
1249 rec.period_start := rec.batch_start;
1250 rec.period_end := rec.revldate;
1251 r_rd.transaction_period := rec.period_end - rec.period_start;
1252 rec.effective_date := rec.revldate;
1253 r_rd.effective_days := rec.period_end - rec.period_start;
1254 r_rd.amount_type := 'CCYUNRL';
1255 xtr_revl_unreal_log(rec, 0, 0, 0, 0, null, r_rd, retcode);
1256 update XTR_BANK_BALANCES
1257 set first_batch_id = rec.batch_id
1258 where company_code = rec.company_code
1259 and account_number = rec.account_no
1260 and balance_date <= rec.revldate;
1261 end if;
1262
1263 fetch c_ca_acct into l_ca_acct, ca_currency, ca_deal_no, ca_port;
1264 End Loop;
1265 Close c_ca_acct;
1266
1267 t_log_dump;
1268
1269
1270 EXCEPTION
1271 when GL_CURRENCY_API.no_rate then
1272 if g_call_by_form = true then
1273 FND_MESSAGE.set_name('XTR', 'XTR_NO_GL_RATE');
1274 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
1275 APP_EXCEPTION.raise_exception;
1276 else
1277 set_err_log(retcode);
1278 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_RATE_CURRENCY_GL');
1279 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
1280 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
1281 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
1282 l_buf := FND_MESSAGE.GET;
1283 FND_FILE.put_line(fnd_file.log, l_buf);
1284 end if;
1285 when GL_CURRENCY_API.invalid_currency then
1286 if g_call_by_form = true then
1287 FND_MESSAGE.set_name('XTR', 'XTR_INVALID_CURRENCY');
1288 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
1289 FND_MESSAGE.set_token('CURRENCY', rec.currencya);
1290 APP_EXCEPTION.raise_exception;
1291 else
1292 set_err_log(retcode);
1293 FND_MESSAGE.SET_NAME('XTR', 'XTR_INVALID_CURRENCY_TYPE');
1294 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
1295 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
1296 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
1297 l_buf := FND_MESSAGE.GET;
1298 FND_FILE.put_line(fnd_file.log, l_buf);
1299 end if;
1300 when others then
1301 if g_call_by_form = true then
1302 APP_EXCEPTION.raise_exception;
1303 else
1304 set_err_log(retcode);
1305 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
1306 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
1307 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
1308 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
1309 l_buf := FND_MESSAGE.GET;
1310 FND_FILE.put_line(fnd_file.log, l_buf);
1311 end if;
1312 end xtr_revl_main;
1313 --------------------------------------------------------
1314 /********************************************************/
1315 /* This procedure get necessary deal info in order to */
1316 /* calculate fair value and other G/L values */
1317 /********************************************************/
1318 PROCEDURE xtr_get_deal_value(
1319 l_tmp IN xtr_eligible_rec,
1320 rec IN OUT NOCOPY xtr_revl_rec,
1321 r_rd OUT NOCOPY XTR_REVALUATION_DETAILS%rowtype) is
1322
1323 Cursor C_ITEM_TOTAL is
1324 select sum(reference_amount)
1325 from xtr_hedge_relationships
1326 where hedge_attribute_id = rec.deal_no
1327 and instrument_item_flag = 'I';
1328
1329 Cursor C_HEDGE_BAL is
1330 select min(reclass_balance_amt)
1331 from XTR_RECLASS_DETAILS
1332 where hedge_attribute_id = rec.deal_no
1333 and reclass_date <= rec.batch_start;
1334
1335 l_buf Varchar2(500);
1336 l_first BOOLEAN; -- return TRUE or FALSE to see if it's the first batch
1337 l_hedge_bal NUMBER;
1338 l_item_total NUMBER;
1339 retcode NUMBER;
1340 r_err_log err_log; -- record type
1341
1342 BEGIN
1343 rec.deal_no := l_tmp.DEAL_NO;
1344 rec.deal_type := l_tmp.DEAL_TYPE;
1345 rec.deal_subtype := l_tmp.DEAL_SUBTYPE;
1346 rec.product_type := l_tmp.PRODUCT_TYPE;
1347 rec.fair_value := NULL;
1348 rec.trans_no := l_tmp.TRANSACTION_NO;
1349 rec.ow_type := NULL;
1350 rec.ow_value := NULL;
1351 rec.year_calc_type := l_tmp.YEAR_CALC_TYPE;
1352 rec.year_basis := l_tmp.YEAR_BASIS;
1353 rec.discount_yield := l_tmp.DISCOUNT_YIELD;
1354 rec.deal_date := l_tmp.deal_date;
1355 rec.start_date := l_tmp.start_date;
1356 rec.maturity_date := l_tmp.maturity_date;
1357 rec.expiry_date := l_tmp.expiry_date;
1358 rec.settle_date := l_tmp.settle_date;
1359 rec.settle_amount := l_tmp.settle_amount;
1360 rec.settle_action := l_tmp.settle_action;
1361 rec.premium_action := l_tmp.premium_action;
1362 rec.premium_amount := l_tmp.premium_amount;
1363 rec.market_data_set := l_tmp.market_data_set;
1364 rec.pricing_model := l_tmp.pricing_model;
1365 rec.brokerage_amount:= l_tmp.brokerage_amount;
1366 rec.portfolio_code := l_tmp.PORTFOLIO_CODE;
1367 rec.transaction_rate := l_tmp.transaction_rate;
1368 rec.currencya := l_tmp.currencya;
1369 rec.currencyb := l_tmp.currencyb;
1370 rec.effective_date := l_tmp.effective_date;
1371 rec.contract_code := l_tmp.contract_code;
1372 rec.face_value := l_tmp.face_value;
1373 rec.fxo_sell_ref_amount := l_tmp.fxo_sell_ref_amount;
1374 rec.cap_or_floor := l_tmp.cap_or_floor;
1375 rec.swap_ref := l_tmp.swap_ref;
1376 rec.eligible_date := l_tmp.eligible_date;
1377 rec.status_code := l_tmp.status_code;
1378
1379 /* determine the period_from value for XTR_REVALUATION_DETAILS */
1380 /* If it's first reval for the deal, use begin date. Otherwise */
1381 /* use batch start date which is already defaulted */
1382 xtr_first_reval(rec, l_first);
1383 if l_first = TRUE then
1384 rec.period_start := l_tmp.eligible_date;
1385 else
1386 rec.period_start := rec.batch_start;
1387 end if;
1388
1389 -- If deal is mature, use effective date, otherwise use batch end date
1390 if l_tmp.effective_date < rec.revldate then
1391 rec.period_end := l_tmp.effective_date;
1392 else
1393 rec.period_end := rec.revldate;
1394 end if;
1395
1396 if rec.deal_type = 'FX' or rec.deal_type = 'HEDGE' then --bug 4256416
1397 rec.reval_ccy := rec.sob_ccy;
1398 elsif rec.deal_type = 'FXO' then
1399 rec.reval_ccy := l_tmp.premium_ccy;
1400 else
1401 rec.reval_ccy := l_tmp.currencya;
1402 end if;
1403
1404 if l_tmp.effective_date > rec.revldate then
1405 r_rd.effective_days := l_tmp.effective_date - rec.revldate;
1406 r_rd.transaction_period := l_tmp.effective_date - rec.revldate;
1407 else
1408 r_rd.effective_days := 0;
1409 r_rd.transaction_period := 0;
1410 end if;
1411
1412 if rec.deal_type in ('NI', 'ONC') then
1413 select initial_fair_value
1414 into rec.init_fv
1415 from XTR_ROLLOVER_TRANSACTIONS
1416 where deal_number = rec.deal_no
1417 and transaction_number = rec.trans_no;
1418 elsif rec.deal_type = 'HEDGE' then
1419 rec.init_fv := 0;
1420 else
1421 select initial_fair_value
1422 into rec.init_fv
1423 from XTR_DEALS
1424 where deal_no = rec.deal_no;
1425 end if;
1426
1427 if rec.deal_type = 'STOCK' then
1428 rec.quantity := l_tmp.FX_REVAL_PRINCIPAL_BAL;
1429 rec.remaining_quantity := l_tmp.FXO_SELL_REF_AMOUNT;
1430 end if;
1431
1432 if rec.deal_type = 'HEDGE' then
1433 Open C_HEDGE_BAL;
1434 Fetch C_HEDGE_BAL into l_hedge_bal;
1435 -- If C_HEDGE_BAL%FOUND then -- Hedge has been reclassified
1436 If l_hedge_bal is NOT NULL then -- Hedge has been reclassified
1437 If sign(rec.face_value) = -1 then
1438 rec.face_value := (-1) * l_hedge_bal;
1439 else
1440 rec.face_value := l_hedge_bal;
1441 end if;
1442 Else -- No reclassification. Determine hedge amt based on hedge approach
1443 if rec.product_type <> 'FORECAST' then
1444 Open C_ITEM_TOTAL;
1445 Fetch C_ITEM_TOTAL into l_item_total;
1446 if C_ITEM_TOTAL%FOUND then
1447 rec.face_value := l_item_total;
1448 end if;
1449 Close C_ITEM_TOTAL;
1450 End if;
1451 End if;
1452 Close C_HEDGE_BAL;
1453 end if;
1454
1455 EXCEPTION
1456 when others then
1457 if g_call_by_form = true then
1458 APP_EXCEPTION.raise_exception;
1459 else
1460 set_err_log(retcode);
1461 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
1462 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
1463 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
1464 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
1465 l_buf := FND_MESSAGE.GET;
1466 FND_FILE.put_line(fnd_file.log, l_buf);
1467 end if;
1468 END;
1469 --------------------------------------------------------------------------
1470 /************************************************************/
1471 /* This procedure returns deal fair value and reval rate */
1472 /* for each deal type */
1473 /************************************************************/
1474 PROCEDURE xtr_revl_get_fairvalue(
1475 rec IN OUT NOCOPY xtr_revl_rec,
1476 fair_value OUT NOCOPY NUMBER,
1477 retcode OUT NOCOPY NUMBER) IS
1478 l_buf Varchar2(500);
1479 l_round NUMBER;
1480 l_put_price NUMBER;
1481 l_call_price NUMBER;
1482 l_spot_rate NUMBER;
1483 l_fra_price NUMBER;
1484 l_sob_curr_rate NUMBER; -- out parameter for FX
1485 l_revl_rate NUMBER; -- out parameter for NI
1486 l_rec xtr_revl_rec;
1487 l_int_sum NUMBER; -- out parameter for TMM
1488 l_fwd_rate NUMBER; -- out parameter for TMM
1489 l_clean_price NUMBER; -- out parameter for BOND
1490 l_stock_price NUMBER; -- out parameter for STOCK
1491 l_settle_date DATE;
1492 r_fx_rate xtr_revl_fx_rate; -- record type
1493 r_md_in xtr_market_data_p.md_from_set_in_rec_type;
1494 r_md_out xtr_market_data_p.md_from_set_out_rec_type;
1495 l_market_set VARCHAR2(30);
1496 l_ric_code XTR_BOND_ISSUES.ric_code%TYPE;
1497 l_dummy NUMBER;
1498 l_dummy1 NUMBER;
1499 l_knock_type XTR_DEALS.knock_type%TYPE;
1500 l_knock_date DATE;
1501 l_strike_price NUMBER;
1502 l_base_ccy VARCHAR2(15);
1503 l_contra_ccy VARCHAR2(15);
1504 l_deno NUMBER;
1505 l_numer NUMBER;
1506 gl_end_rate NUMBER;
1507 l_reverse BOOLEAN;
1508 l_hedge_flag VARCHAR2(1):= 'N';
1509 r_err_log err_log; -- record type
1510
1511 begin
1512 select rounding_factor
1513 into l_round
1514 from xtr_master_currencies_v
1515 where currency = rec.reval_ccy;
1516
1517 l_market_set := rec.MARKET_DATA_SET;
1518 xtr_revl_get_mds(l_market_set, rec);
1519
1520 -- for all the deal has overwrite type = FAIR_VALUE should
1521 -- never call this procedure.
1522 if rec.ow_type = 'FAIR_VALUE' then
1523 raise e_invalid_code;
1524 end if;
1525
1526 /************** BDO fair value *******************/
1527 if rec.deal_type = 'BDO' then
1528 if rec.effective_date <= rec.revldate and rec.status_code = 'CURRENT' then -- unrealized
1529 fair_value := 0;
1530 rec.reval_rate := null;
1531 set_err_log(retcode);
1532 FND_MESSAGE.SET_NAME('XTR', 'XTR_DEAL_EXPIRY');
1533 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
1534 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
1535 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
1536 l_buf := FND_MESSAGE.GET;
1537 FND_FILE.put_line(fnd_file.log, l_buf);
1538 elsif rec.expiry_date <= rec.revldate and rec.status_code = 'EXPIRED' then -- realized
1539 if rec.contract_code is not null then
1540 select RIC_CODE
1541 into l_ric_code
1542 from XTR_BOND_ISSUES
1543 where bond_issue_code = rec.contract_code;
1544 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE,
1545 C_BOND_IND, rec.expiry_date, null, rec.currencya, NULL,
1546 NULL, C_INTERPOL_LINER, 'M', rec.batch_id, l_ric_code);
1547 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
1548 rec.reval_rate := r_md_out.p_md_out;
1549 else
1550 rec.reval_rate := null;
1551 end if;
1552 fair_value := 0; -- realized
1553 elsif rec.effective_date <= rec.revldate and rec.status_code = 'EXERCISED' then -- realized
1554 if rec.settle_amount is not null then -- Cash settlement
1555 select exercise_price
1556 into rec.reval_rate
1557 from xtr_deals
1558 where deal_no = rec.deal_no;
1559
1560 fair_value := rec.settle_amount;
1561 else
1562 select base_rate, capital_price -- Get exercise price for BDO
1563 into rec.reval_rate, l_strike_price
1564 from xtr_deals
1565 where deal_no = rec.deal_no;
1566
1567 fair_value := round((rec.face_value * (rec.reval_rate - l_strike_price) /100), l_round);
1568 if rec.deal_subtype in ('BFLOOR', 'SCAP') then
1569 fair_value := fair_value * (-1);
1570 end if;
1571 end if;
1572 else -- unrealized
1573 fair_value := null; -- user need to provide unrealized Fair value
1574 end if;
1575
1576 /************** SWPTN fair value *******************/
1577 elsif rec.deal_type = 'SWPTN' then
1578 if rec.effective_date <= rec.revldate and rec.status_code = 'CURRENT' then -- unrealized
1579 rec.reval_rate := null;
1580 fair_value := 0;
1581 set_err_log(retcode);
1582 FND_MESSAGE.SET_NAME('XTR', 'XTR_DEAL_EXPIRY');
1583 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
1584 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
1585 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
1586 l_buf := FND_MESSAGE.GET;
1587 FND_FILE.put_line(fnd_file.log, l_buf);
1588 elsif rec.expiry_date <= rec.revldate and rec.status_code = 'EXPIRED' then -- realized
1589 rec.reval_rate := null;
1590 fair_value := 0; -- realized
1591 elsif rec.effective_date <= rec.revldate and rec.status_code = 'EXERCISED' then -- realized
1592 if rec.settle_amount is not null then -- Cash settlement
1593 select settle_rate
1594 into rec.reval_rate
1595 from XTR_DEALS
1596 where deal_no = rec.deal_no;
1597 else -- Create Interest Swap, the reval rate is equal to the interest rate
1598 -- on Pay or Rec side of created swap(other side from Swaption 'Action')
1599 select interest_rate
1600 into rec.reval_rate
1601 from XTR_DEALS
1602 where int_swap_ref = (select swap_ref from XTR_DEALS
1603 where deal_no = rec.deal_no)
1604 and deal_subtype = (select decode(D.coupon_action, 'REC', 'FUND', 'INVEST')
1605 from XTR_DEALS D where d.deal_no = rec.deal_no);
1606 end if;
1607 xtr_end_fv(rec, fair_value);
1608 else
1609 fair_value := null; -- user need to provide unrealized Fair value
1610 end if;
1611
1612 /************** FRA fair value *******************/
1613 elsif rec.deal_type = 'FRA' then
1614 if rec.effective_date <= rec.revldate and rec.status_code = 'CURRENT' then -- unrealized
1615 if rec.pricing_model in ('FRA_DISC', 'FRA_YIELD') then
1616 xtr_get_fv_from_batch(rec, fair_value, l_dummy, l_dummy1, l_revl_rate);
1617 rec.reval_rate := l_revl_rate;
1618 else -- 'FAIR_VALUE' or user provided
1619 fair_value := null;
1620 rec.reval_rate := null;
1621 end if;
1622 set_err_log(retcode);
1623 FND_MESSAGE.SET_NAME('XTR', 'XTR_SETTLE_DEAL');
1624 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
1625 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
1626 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
1627 l_buf := FND_MESSAGE.GET;
1628 FND_FILE.put_line(fnd_file.log, l_buf);
1629 elsif rec.effective_date <= rec.revldate and rec.status_code = 'SETTLED' then -- realized
1630 select settle_rate
1631 into rec.reval_rate
1632 from xtr_deals
1633 where deal_no = rec.deal_no;
1634
1635 xtr_end_fv(rec, fair_value); -- realized, fair value = ending fair value
1636 else -- unrealized. Using formula
1637 if rec.pricing_model in ('FRA_DISC', 'FRA_YIELD') then
1638 if rec.ow_type = 'RATE' then
1639 l_fra_price := rec.ow_value;
1640 else
1641 xtr_revl_getprice_fwd(rec, FALSE, l_fra_price);
1642 end if;
1643 xtr_revl_fv_fra(rec, l_fra_price, fair_value);
1644 rec.reval_rate := l_fra_price;
1645 else -- 'FAIR_VALUE' or others
1646 fair_value := null;
1647 rec.reval_rate := null;
1648 end if;
1649 end if;
1650
1651 /************** FX fair value *******************/
1652 elsif rec.deal_type = 'FX' then
1653 if rec.effective_date <= rec.revldate and rec.status_code = 'CURRENT' then
1654 -- get realized fair value
1655 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE, C_SPOT_RATE_IND,
1656 rec.effective_date, NULL, rec.currencya, rec.currencyb, NULL, NULL, 'M',
1657 rec.batch_id, NULL);
1658 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
1659 rec.reval_rate := r_md_out.p_md_out;
1660
1661 xtr_end_fv(rec, fair_value);
1662 elsif rec.effective_date > rec.revldate and rec.status_code = 'CURRENT' then -- unrealized
1663 if rec.pricing_model = 'FX_FORWARD' then
1664 xtr_revl_getrate_fx(rec, l_hedge_flag, r_fx_rate);
1665 rec.reval_rate := r_fx_rate.fx_forward_rate;
1666 xtr_revl_fv_fx(rec, r_fx_rate, l_hedge_flag, fair_value, l_sob_curr_rate);
1667 rec.reval_fx_fwd_rate := l_sob_curr_rate;
1668 elsif rec.pricing_model = 'FX_GL' then
1669 l_base_ccy := rec.currencya;
1670 l_contra_ccy := rec.currencyb;
1671 xtr_get_base_contra(l_base_ccy, l_contra_ccy, l_reverse);
1672
1673 GL_CURRENCY_API.get_triangulation_rate(l_base_ccy, l_contra_ccy,
1674 rec.revldate, rec.ex_rate_type,l_deno, l_numer, gl_end_rate);
1675 rec.reval_rate := gl_end_rate;
1676 r_fx_rate.fx_forward_rate := gl_end_rate;
1677 xtr_revl_fv_fx(rec, r_fx_rate, l_hedge_flag, fair_value, l_sob_curr_rate);
1678 rec.reval_fx_fwd_rate := l_sob_curr_rate;
1679 else
1680 fair_value := null;
1681 rec.reval_rate := null;
1682 end if;
1683 end if;
1684
1685 /************** FXO fair value *******************/
1686 elsif rec.deal_type = 'FXO' then
1687 select knock_type, knock_execute_date
1688 into l_knock_type, l_knock_date
1689 from XTR_DEALS
1690 where deal_no = rec.deal_no;
1691
1692 if rec.effective_date <= rec.revldate and rec.status_code = 'CURRENT' then
1693 -- This deal should be mature, but not settled yet, create unrealized record.
1694 if rec.pricing_model = 'GARMAN_KOHL' then
1695 fair_value := 0;
1696 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE, C_SPOT_RATE_IND,
1697 rec.expiry_date, NULL, rec.currencya, rec.currencyb, NULL, NULL, 'M',
1698 rec.batch_id, NULL);
1699 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
1700 rec.reval_rate := r_md_out.p_md_out;
1701 else -- 'FAIR_VALUE' other others
1702 fair_value := null;
1703 rec.reval_rate := null;
1704 end if;
1705 set_err_log(retcode);
1706 FND_MESSAGE.SET_NAME('XTR', 'XTR_DEAL_EXPIRY');
1707 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
1708 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
1709 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
1710 l_buf := FND_MESSAGE.GET;
1711 FND_FILE.put_line(fnd_file.log, l_buf);
1712 elsif rec.effective_date <= rec.revldate and rec.status_code = 'EXPIRED' then -- realized
1713 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE, C_SPOT_RATE_IND,
1714 rec.expiry_date, NULL, rec.currencya, rec.currencyb, NULL, NULL, 'M',
1715 rec.batch_id, NULL);
1716 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
1717 rec.reval_rate := r_md_out.p_md_out;
1718 fair_value := 0;
1719 elsif rec.effective_date <= rec.revldate and rec.status_code = 'EXERCISED' then -- realized
1720 select base_rate
1721 into rec.reval_rate
1722 from xtr_deals
1723 where deal_no = (select fxo_deal_no
1724 from xtr_deals
1725 where deal_no = rec.deal_no);
1726 xtr_end_fv(rec, fair_value);
1727 else -- calcualte unrealized fair value using formula
1728 if (l_knock_type = 'I' and l_knock_date is null) or -- Not yet knock-in. fair value is 0
1729 ((rec.revldate < l_knock_date) and (l_knock_date < rec.effective_date)) then
1730 fair_value := 0;
1731 rec.reval_rate := null;
1732 else
1733 if rec.pricing_model = 'GARMAN_KOHL' then
1734 xtr_revl_getprice_fxo(rec, l_spot_rate, l_put_price, l_call_price);
1735 xtr_revl_fv_fxo(rec, l_spot_rate, l_put_price, l_call_price,
1736 fair_value);
1737 else
1738 fair_value := null;
1739 rec.reval_rate := null;
1740 end if;
1741 end if;
1742 end if;
1743
1744 /************** NI fair value *******************/
1745 elsif rec.deal_type = 'NI' then -- handle reval rate in the cursor level
1746 if rec.effective_date <= rec.revldate then -- realized
1747 xtr_end_fv(rec, fair_value);
1748 else -- unrealized
1749 if rec.pricing_model = 'DISC_METHOD' then
1750 if rec.ow_type = 'RATE' then
1751 l_revl_rate := rec.ow_value;
1752 end if;
1753 xtr_revl_fv_ni(rec, fair_value, l_revl_rate);
1754 rec.reval_rate := l_revl_rate;
1755 else
1756 fair_value := null;
1757 rec.reval_rate := null;
1758 end if;
1759 end if;
1760
1761 /************** IRO fair value *******************/
1762 elsif rec.deal_type = 'IRO' then
1763 if rec.effective_date <= rec.revldate and rec.status_code = 'CURRENT' then -- unrealized
1764 if rec.pricing_model = 'BLACK' then
1765 fair_value := 0;
1766 else
1767 fair_value := null;
1768 end if;
1769 set_err_log(retcode);
1770 FND_MESSAGE.SET_NAME('XTR', 'XTR_SETTLE_DEAL');
1771 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
1772 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
1773 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
1774 l_buf := FND_MESSAGE.GET;
1775 FND_FILE.put_line(fnd_file.log, l_buf);
1776 elsif rec.expiry_date <= rec.revldate and rec.status_code = 'EXPIRED' then -- realized
1777 rec.reval_rate := rec.transaction_rate;
1778 fair_value := 0;
1779 elsif rec.effective_date <= rec.revldate and rec.status_code = 'EXERCISED' then -- realized
1780 select settle_rate
1781 into rec.reval_rate
1782 from xtr_deals
1783 where deal_no = rec.deal_no;
1784 xtr_end_fv(rec, fair_value); -- realized, fair value = ending fair value
1785 else -- unrealized. Using formula
1786 if rec.pricing_model = 'BLACK' then
1787 xtr_revl_fv_iro(rec, fair_value);
1788 else
1789 rec.reval_rate := null;
1790 fair_value := null;
1791 end if;
1792 end if;
1793
1794 /************** IRS fair value *******************/
1795 elsif rec.deal_type = 'IRS' then
1796 if rec.effective_date <= rec.revldate then -- realized
1797 rec.reval_rate := null;
1798 xtr_end_fv(rec, fair_value);
1799 else
1800 if rec.pricing_model in ('DISC_CASHFLOW', 'DISC_CASHSTA') then -- unrealized,using formula
1801 xtr_revl_fv_irs(rec, fair_value);
1802 else
1803 rec.reval_rate := null;
1804 fair_value := null;
1805 end if;
1806 end if;
1807
1808 /************** BOND fair value *******************/
1809 elsif rec.deal_type = 'BOND' then
1810 -- reval rate is handled in the procedure
1811 if rec.ow_type = 'PRICE' then -- Overwrite rate
1812 l_clean_price := rec.ow_value;
1813 else
1814 l_clean_price := null;
1815 end if;
1816 xtr_revl_fv_bond(rec, l_clean_price, fair_value);
1817
1818 /************** STOCK fair value *******************/
1819 elsif rec.deal_type = 'STOCK' then
1820 -- reval rate is handled in the procedure
1821 if rec.ow_type = 'PRICE' then -- Overwrite rate
1822 l_stock_price := rec.ow_value;
1823 else
1824 l_stock_price := null;
1825 end if;
1826 xtr_revl_fv_stock(rec, l_stock_price, fair_value);
1827
1828 /************** ONC, CA, IG fair value *******************/
1829 elsif rec.deal_type in ('ONC', 'CA', 'IG') then
1830 rec.reval_rate := null;
1831 fair_value := rec.face_value;
1832
1833 /************** RTMM fair value *******************/
1834 elsif rec.deal_type = 'RTMM' then
1835 rec.reval_rate := null;
1836 fair_value := null;
1837
1838 /************** TMM fair value *******************/
1839 elsif rec.deal_type = 'TMM' then
1840 if rec.effective_date <= rec.revldate then -- realized
1841 rec.reval_rate := null;
1842 xtr_end_fv(rec, fair_value);
1843 else
1844 if rec.pricing_model in ('DISC_CASHFLOW', 'DISC_CASHSTA') then
1845 if rec.ow_type = 'RATE' then
1846 l_fwd_rate := rec.ow_value;
1847 end if;
1848 xtr_revl_fv_tmm(rec, fair_value, l_int_sum, l_fwd_rate);
1849 rec.reval_rate := l_fwd_rate;
1850 else
1851 rec.reval_rate := null;
1852 fair_value := null;
1853 end if;
1854 end if;
1855 else
1856 raise e_invalid_dealtype;
1857 end if;
1858
1859 fair_value := round(fair_value, l_round);
1860 rec.fair_value := fair_value;
1861
1862 EXCEPTION
1863 when e_invalid_dealtype then
1864 if g_call_by_form = true then
1865 FND_MESSAGE.set_name('XTR', 'XTR_INVALID_DEAL_TYPE');
1866 FND_MESSAGE.Set_Token('DEAL_TYPE', rec.deal_type);
1867 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
1868 APP_EXCEPTION.raise_exception;
1869 else
1870 set_err_log(retcode);
1871 FND_MESSAGE.SET_NAME('XTR', 'XTR_INVALID_DEALTYPE');
1872 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
1873 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
1874 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
1875 l_buf := FND_MESSAGE.GET;
1876 FND_FILE.put_line(fnd_file.log, l_buf);
1877 end if;
1878 when e_invalid_transno then
1879 if g_call_by_form = true then
1880 FND_MESSAGE.set_name('XTR', 'XTR_INVALID_TRANS_NUM');
1881 FND_MESSAGE.Set_Token('DEAL_NO', rec.deal_no);
1882 FND_MESSAGE.Set_Token('TRANS_NO', rec.trans_no);
1883 APP_EXCEPTION.raise_exception;
1884 else
1885 set_err_log(retcode);
1886 FND_MESSAGE.SET_NAME('XTR', 'XTR_INVALID_TRANSNUM');
1887 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
1888 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
1889 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
1890 l_buf := FND_MESSAGE.GET;
1891 FND_FILE.put_line(fnd_file.log, l_buf);
1892 end if;
1893 when e_invalid_price_model then
1894 if g_call_by_form = true then
1895 FND_MESSAGE.set_name('XTR', 'XTR_INVALID_PRICE_MODEL');
1896 FND_MESSAGE.Set_Token('PRICE_MODEL', rec.pricing_model);
1897 FND_MESSAGE.Set_Token('DEAL_TYPE', rec.deal_type);
1898 FND_MESSAGE.Set_Token('DEAL_NO', rec.deal_no);
1899 APP_EXCEPTION.raise_exception;
1900 else
1901 set_err_log(retcode);
1902 FND_MESSAGE.SET_NAME('XTR', 'XTR_INVALID_PRICEMODEL');
1903 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
1904 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
1905 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
1906 l_buf := FND_MESSAGE.GET;
1907 FND_FILE.put_line(fnd_file.log, l_buf);
1908 end if;
1909 when e_date_order_error then
1910 if g_call_by_form = true then
1911 FND_MESSAGE.set_name('XTR', 'XTR_DATE_ORDER_ERROR');
1912 FND_MESSAGE.Set_Token('DEAL_NO', rec.deal_no);
1913 APP_EXCEPTION.raise_exception;
1914 else
1915 set_err_log(retcode);
1916 FND_MESSAGE.SET_NAME('XTR', 'XTR_SPOTDATE_REVALDATE');
1917 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
1918 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
1919 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
1920 l_buf := FND_MESSAGE.GET;
1921 FND_FILE.put_line(fnd_file.log, l_buf);
1922 end if;
1923 when e_invalid_code then
1924 if g_call_by_form = true then
1925 FND_MESSAGE.set_name('XTR', 'XTR_INVALID_CODE');
1926 FND_MESSAGE.Set_Token('DEAL_NO', rec.deal_no);
1927 APP_EXCEPTION.raise_exception;
1928 else
1929 set_err_log(retcode);
1930 FND_MESSAGE.SET_NAME('XTR', 'XTR_INTERNAL_ERR');
1931 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
1932 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
1933 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
1934 l_buf := FND_MESSAGE.GET;
1935 FND_FILE.put_line(fnd_file.log, l_buf);
1936 end if;
1937 when XTR_MARKET_DATA_P.e_mdcs_no_data_found then
1938 if g_call_by_form = true then
1939 FND_MESSAGE.set_name('XTR', 'XTR_NO_MARKET');
1940 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
1941 APP_EXCEPTION.raise_exception;
1942 else
1943 set_err_log(retcode);
1944 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_MARKETDATASET');
1945 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
1946 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
1947 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
1948 l_buf := FND_MESSAGE.GET;
1949 FND_FILE.put_line(fnd_file.log, l_buf);
1950 end if;
1951 when XTR_MARKET_DATA_P.e_mdcs_no_curve_found then
1952 if g_call_by_form = true then
1953 FND_MESSAGE.set_name('XTR', 'XTR_NO_CURVE');
1954 FND_MESSAGE.set_token('MARKET', rec.market_data_set);
1955 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
1956 APP_EXCEPTION.raise_exception;
1957 else
1958 set_err_log(retcode);
1959 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_CURVEMARKET');
1960 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
1961 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
1962 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
1963 l_buf := FND_MESSAGE.GET;
1964 FND_FILE.put_line(fnd_file.log, l_buf);
1965 end if;
1966 when others then
1967 if g_call_by_form = true then
1968 APP_EXCEPTION.raise_exception;
1969 else
1970 set_err_log(retcode);
1971 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
1972 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
1973 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
1974 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
1975 l_buf := FND_MESSAGE.GET;
1976 FND_FILE.put_line(fnd_file.log, l_buf);
1977 end if;
1978 end xtr_revl_get_fairvalue;
1979 -----------------------------------------
1980 /************************************************************/
1981 /* This procedure returns unrealized P/L and cummulative pl */
1982 /* value in order to calculate last unrealized P/L */
1983 /************************************************************/
1984 PROCEDURE xtr_revl_get_unrel_pl(
1985 rec IN OUT NOCOPY xtr_revl_rec,
1986 unrel_pl_value OUT NOCOPY NUMBER,
1987 cum_pl_value OUT NOCOPY NUMBER,
1988 retcode OUT NOCOPY NUMBER) AS
1989 l_buf Varchar2(500);
1990 l_ex_fv NUMBER;
1991 l_in_pri_adjust NUMBER:= NULL; -- for TMM and RTMM increased principal
1992 l_de_pri_adjust NUMBER:= NULL; -- for TMM and RTMM decreased principal
1993 l_pri_adjust NUMBER := NULL;
1994 l_recon NUMBER := NULL; -- for RTMM reconciation
1995 l_int NUMBER := NULL;
1996 r_err_log err_log; -- record type
1997 l_round NUMBER;
1998 l_pre_disc_amt NUMBER;
1999 l_ni_disc_amt NUMBER;
2000 l_eff_interest NUMBER;
2001 l_dummy NUMBER;
2002 l_dummy1 NUMBER;
2003 l_dummy2 NUMBER;
2004
2005 begin
2006 select rounding_factor
2007 into l_round
2008 from xtr_master_currencies_v
2009 where currency = rec.reval_ccy;
2010
2011 xtr_get_fv_from_batch(rec, l_ex_fv, l_dummy, cum_pl_value, l_dummy2);
2012
2013 -- For ONC, CA and IG, we do not need to calculate G/L, but only curency G/L
2014 if rec.deal_type in ('ONC', 'CA', 'IG') then
2015 unrel_pl_value := 0;
2016 cum_pl_value := 0;
2017
2018 elsif rec.deal_type in ('TMM', 'IRS') then
2019 -- For TMM and IRS, we need to take principal adjust(increase or decrease) into
2020 -- consideration when calculating the (un)realized P/L.
2021 if xtr_get_pre_batchid(rec) = -1 then
2022 -- this is the first one, no previous batch exists
2023 select sum(PRINCIPAL_ADJUST)
2024 into l_in_pri_adjust
2025 from xtr_rollover_transactions
2026 where principal_action = 'INCRSE'
2027 and DEAL_NUMBER = rec.deal_no
2028 and START_DATE <= rec.revldate
2029 and start_date <> (select start_date
2030 from XTR_DEALS
2031 where deal_no = rec.deal_no);
2032
2033 select sum(PRINCIPAL_ADJUST)
2034 into l_de_pri_adjust
2035 from xtr_rollover_transactions
2036 where principal_action = 'DECRSE'
2037 and DEAL_NUMBER = rec.deal_no
2038 and START_DATE <= rec.revldate
2039 and start_date <> (select maturity_date
2040 from XTR_DEALS
2041 where deal_no = rec.deal_no);
2042
2043 l_pri_adjust := nvl(l_in_pri_adjust,0) - nvl(l_de_pri_adjust,0);
2044 else
2045 select sum(PRINCIPAL_ADJUST)
2046 into l_in_pri_adjust
2047 from xtr_rollover_transactions
2048 where principal_action = 'INCRSE'
2049 and DEAL_NUMBER = rec.deal_no
2050 and START_DATE <= rec.revldate
2051 and START_DATE >= rec.period_start
2052 and start_date <> (select start_date
2053 from XTR_DEALS
2054 where deal_no = rec.deal_no);
2055
2056 select sum(PRINCIPAL_ADJUST)
2057 into l_de_pri_adjust
2058 from xtr_rollover_transactions
2059 where principal_action = 'DECRSE'
2060 and DEAL_NUMBER = rec.deal_no
2061 and START_DATE <= rec.revldate
2062 and START_DATE >= rec.period_start
2063 and start_date <> (select maturity_date
2064 from XTR_DEALS
2065 where deal_no = rec.deal_no);
2066
2067 l_pri_adjust := nvl(l_in_pri_adjust,0) - nvl(l_de_pri_adjust,0);
2068 end if;
2069
2070 if rec.deal_subtype = 'FUND' then
2071 l_pri_adjust := l_pri_adjust * (-1);
2072 end if;
2073 xtr_get_fv_from_batch(rec, l_ex_fv, l_dummy, l_dummy1, l_dummy2);
2074 if rec.deal_type = 'TMM' or (rec.deal_type = 'IRS' and rec.discount_yield = 'Y') then
2075 unrel_pl_value := round((rec.fair_value - l_pri_adjust - l_ex_fv), l_round);
2076 else
2077 unrel_pl_value := round((rec.fair_value - l_ex_fv), l_round);
2078 end if;
2079 cum_pl_value := cum_pl_value + unrel_pl_value;
2080
2081 -- For RTMM, need to consider the principal adjust and repayment from bank reconcilation.
2082 elsif rec.deal_type = 'RTMM' then
2083 if xtr_get_pre_batchid(rec) = -1 then
2084 -- this is the first one, no previous batch exists
2085 select sum(PRINCIPAL_ADJUST)
2086 into l_in_pri_adjust
2087 from xtr_rollover_transactions
2088 where principal_action = 'INCRSE'
2089 and DEAL_NUMBER = rec.deal_no
2090 and START_DATE <= rec.revldate
2091 and start_date <> (select start_date
2092 from XTR_DEALS
2093 where deal_no = rec.deal_no);
2094
2095 select sum(PRINCIPAL_ADJUST)
2096 into l_de_pri_adjust
2097 from xtr_rollover_transactions
2098 where principal_action = 'DECRSE'
2099 and DEAL_NUMBER = rec.deal_no
2100 and START_DATE <= rec.revldate
2101 and start_date <> (select maturity_date
2102 from XTR_DEALS
2103 where deal_no = rec.deal_no);
2104
2105 select sum(pi_amount_received)
2106 into l_recon
2107 from xtr_rollover_transactions
2108 where deal_number = rec.deal_no
2109 and nvl(settle_date,maturity_date) <= rec.revldate;
2110
2111 select sum(interest)
2112 into l_int
2113 from xtr_rollover_transactions
2114 where deal_number = rec.deal_no
2115 and nvl(settle_date,maturity_date) <= rec.revldate
2116 and nvl(pi_amount_received, 0) <> 0;
2117
2118 l_pri_adjust := nvl(l_in_pri_adjust,0) - nvl(l_de_pri_adjust,0) - nvl(l_recon, 0) + nvl(l_int,0);
2119 else
2120 select sum(PRINCIPAL_ADJUST)
2121 into l_in_pri_adjust
2122 from xtr_rollover_transactions
2123 where principal_action = 'INCRSE'
2124 and DEAL_NUMBER = rec.deal_no
2125 and START_DATE <= rec.revldate
2126 and START_DATE >= rec.period_start
2127 and start_date <> (select start_date
2128 from XTR_DEALS
2129 where deal_no = rec.deal_no);
2130 select sum(PRINCIPAL_ADJUST)
2131 into l_de_pri_adjust
2132 from xtr_rollover_transactions
2133 where principal_action = 'DECRSE'
2134 and DEAL_NUMBER = rec.deal_no
2135 and START_DATE <= rec.revldate
2136 and START_DATE >= rec.period_start
2137 and start_date <> (select maturity_date
2138 from XTR_DEALS
2139 where deal_no = rec.deal_no);
2140
2141 select sum(pi_amount_received)
2142 into l_recon
2143 from xtr_rollover_transactions
2144 where deal_number = rec.deal_no
2145 and nvl(settle_date,maturity_date) <= rec.revldate
2146 and nvl(settle_date,maturity_date) >= rec.period_start;
2147
2148 select sum(interest)
2149 into l_int
2150 from xtr_rollover_transactions
2151 where deal_number = rec.deal_no
2152 and nvl(settle_date,maturity_date) <= rec.revldate
2153 and nvl(settle_date,maturity_date) >= rec.period_start
2154 and nvl(pi_amount_received, 0) <> 0;
2155
2156 l_pri_adjust := nvl(l_in_pri_adjust,0) - nvl(l_de_pri_adjust,0) - nvl(l_recon, 0) + nvl(l_int,0);
2157 end if;
2158
2159 if rec.deal_subtype = 'FUND' then
2160 l_pri_adjust := l_pri_adjust * (-1);
2161 end if;
2162 xtr_get_fv_from_batch(rec, l_ex_fv, l_dummy, l_dummy1, l_dummy2);
2163 unrel_pl_value := round((rec.fair_value - l_pri_adjust - l_ex_fv), l_round);
2164 cum_pl_value := cum_pl_value + unrel_pl_value;
2165
2166 --For NI, the unrealized G/L = current FV - pre FV -(+) Effective interest
2167 elsif rec.deal_type = 'NI' then
2168 xtr_get_fv_from_batch(rec, l_ex_fv, l_pre_disc_amt, l_dummy1, l_dummy2);
2169 xtr_ni_eff_interest(rec, l_pre_disc_amt, l_ni_disc_amt, l_eff_interest);
2170 rec.ni_disc_amount := l_ni_disc_amt;
2171 if rec.deal_subtype = 'BUY' then
2172 unrel_pl_value := rec.fair_value - l_ex_fv - l_eff_interest;
2173 elsif rec.deal_subtype = 'ISSUE' then
2174 unrel_pl_value := rec.fair_value - l_ex_fv + l_eff_interest;
2175 end if;
2176 cum_pl_value := cum_pl_value + unrel_pl_value;
2177
2178 else
2179 -- for most of the deal types, unrealized P/L is always the
2180 -- current fair value - previous fair value
2181 xtr_get_fv_from_batch(rec, l_ex_fv, l_dummy, l_dummy1, l_dummy2);
2182 unrel_pl_value := round((rec.fair_value - l_ex_fv), l_round);
2183 cum_pl_value := cum_pl_value + unrel_pl_value;
2184 end if;
2185
2186 EXCEPTION
2187 when e_invalid_dealtype then
2188 if g_call_by_form = true then
2189 FND_MESSAGE.set_name('XTR', 'XTR_INVALID_DEAL_TYPE');
2190 FND_MESSAGE.set_token('DEAL_TYPE', rec.deal_type);
2191 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
2192 APP_EXCEPTION.raise_exception;
2193 else
2194 set_err_log(retcode);
2195 FND_MESSAGE.SET_NAME('XTR', 'XTR_INVALID_DEALTYPE');
2196 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
2197 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
2198 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
2199 l_buf := FND_MESSAGE.GET;
2200 FND_FILE.put_line(fnd_file.log, l_buf);
2201 end if;
2202 when e_invalid_deal_subtype then
2203 if g_call_by_form = true then
2204 FND_MESSAGE.set_name('XTR', 'XTR_INVALID_DEAL_SUBTYPE');
2205 FND_MESSAGE.set_token('DEAL_TYPE', rec.deal_type);
2206 FND_MESSAGE.set_token('DEAL_SUBTYPE', rec.deal_subtype);
2207 APP_EXCEPTION.raise_exception;
2208 else
2209 set_err_log(retcode);
2210 FND_MESSAGE.SET_NAME('XTR', 'XTR_INVALID_DEALSUBTYPE');
2211 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
2212 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
2213 FND_MESSAGE.SET_TOKEN('DEAL_SUBTYPE', rec.deal_subtype);
2214 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
2215 l_buf := FND_MESSAGE.GET;
2216 FND_FILE.put_line(fnd_file.log, l_buf);
2217 end if;
2218 when others then
2219 if g_call_by_form = true then
2220 APP_EXCEPTION.raise_exception;
2221 else
2222 set_err_log(retcode);
2223 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
2224 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
2225 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
2226 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
2227 l_buf := FND_MESSAGE.GET;
2228 FND_FILE.put_line(fnd_file.log, l_buf);
2229 end if;
2230 end xtr_revl_get_unrel_pl;
2231 --------------------------------------------------------------
2232 /*************************************************************************************/
2233 /* This procedure gets all rates information for XTR_REVALUATION_DETAILS and */
2234 /* XTR_DEALS */
2235 /* For Revaluation table: exchange_rate_one = reval_ccy/SOB ccy on revaluation date */
2236 /* except for FX, exchange_rate_one = base_ccy/SOB ccy on revaluation date */
2237 /* exchange_rate_two for FX = contra_ccy/SOB ccy on revaluation date */
2238 /* ctr_curr_sob_curr_fwd_rate = contra_ccy/SOB FX forward rate */
2239 /* For Deals table, exchange_rate_one and exchange_rate_two will be the same currency*/
2240 /* consideration except the date will be the deal_date/start_date depending on */
2241 /* company parameter settting. */
2242 /*************************************************************************************/
2243 PROCEDURE xtr_revl_exchange_rate(
2244 rec IN OUT NOCOPY xtr_revl_rec,
2245 retcode OUT NOCOPY NUMBER)IS
2246 l_accounting VARCHAR2(30);
2247 l_base_ccy VARCHAR2(15);
2248 l_contra_ccy VARCHAR2(15);
2249 l_deno NUMBER;
2250 l_numer NUMBER;
2251 l_dummy BOOLEAN;
2252 r_err_log err_log; -- record type
2253 l_buf Varchar2(500);
2254 Begin
2255
2256 select PARAMETER_VALUE_CODE into l_accounting
2257 from xtr_company_parameters
2258 where COMPANY_CODE = rec.company_code and
2259 PARAMETER_CODE = C_DEAL_SETTLE_ACCOUNTING;
2260
2261 If rec.deal_type = 'FX' then
2262 -- Get base and contra currency for FX.
2263 l_base_ccy := rec.currencya;
2264 l_contra_ccy := rec.currencyb;
2265 xtr_get_base_contra(l_base_ccy, l_contra_ccy, l_dummy);
2266 End If;
2267
2268 rec.deal_ex_rate_one :=NULL;
2269 rec.deal_ex_rate_two :=NULL;
2270 rec.reval_ex_rate_one :=NULL;
2271 rec.reval_ex_rate_two :=NULL;
2272
2273 -- Get XTR_DEALS table exchange_rate_one and exchange_rate_two
2274 If rec.deal_type = 'FX' then
2275 GL_CURRENCY_API.get_triangulation_rate
2276 (l_base_ccy, rec.sob_ccy, rec.eligible_date, rec.ex_rate_type,
2277 l_deno, l_numer, rec.deal_ex_rate_one);
2278 GL_CURRENCY_API.get_triangulation_rate
2279 (l_contra_ccy, rec.sob_ccy, rec.eligible_date, rec.ex_rate_type,
2280 l_deno, l_numer, rec.deal_ex_rate_two);
2281
2282 Else -- for other deal types, only exchange_rate_one is used
2283 GL_CURRENCY_API.get_triangulation_rate
2284 (rec.reval_ccy, rec.sob_ccy, rec.eligible_date, rec.ex_rate_type,
2285 l_deno, l_numer, rec.deal_ex_rate_one);
2286 rec.deal_ex_rate_two := null;
2287 End If;
2288
2289 IF xtr_risk_debug_pkg.g_Debug THEN
2290 xtr_risk_debug_pkg.dpush('xtr_revl_exchange_rate: ' || 'deal_date exchange rate');
2291 xtr_risk_debug_pkg.dlog('xtr_revl_exchange_rate: ' || 'rec.deal_no', rec.deal_no);
2292 xtr_risk_debug_pkg.dlog('xtr_revl_exchange_rate: ' || 'reval ccy' , rec.reval_ccy);
2293 xtr_risk_debug_pkg.dlog('xtr_revl_exchange_rate: ' || 'sob ccy' , rec.sob_ccy);
2294 xtr_risk_debug_pkg.dlog('xtr_revl_exchange_rate: ' || 'rec.eligible_date' , rec.eligible_date);
2295 xtr_risk_debug_pkg.dlog('xtr_revl_exchange_rate: ' || 'ex rate type' , rec.ex_rate_type);
2296 xtr_risk_debug_pkg.dlog('xtr_revl_exchange_rate: ' || 'ex rate ' , rec.deal_ex_rate_one);
2297 xtr_risk_debug_pkg.dpop('xtr_revl_exchange_rate: ' || 'deal_date exchange rate');
2298 END IF;
2299
2300 -- Get XTR_REVALUATION_DETAILS table exchange_rate_one, exchange_rate_two, and Fx forwad rate
2301 If rec.effective_date <= rec.revldate then -- deal is realized. Used maturity date rate
2302 If rec.deal_type = 'FX' then
2303 GL_CURRENCY_API.get_triangulation_rate
2304 (l_base_ccy, rec.sob_ccy, rec.effective_date, rec.ex_rate_type,
2305 l_deno, l_numer, rec.reval_ex_rate_one);
2306 GL_CURRENCY_API.get_triangulation_rate
2307 (l_contra_ccy, rec.sob_ccy, rec.effective_date, rec.ex_rate_type,
2308 l_deno, l_numer, rec.reval_ex_rate_two);
2309 Else
2310 GL_CURRENCY_API.get_triangulation_rate
2311 (rec.reval_ccy, rec.sob_ccy, rec.effective_date, rec.ex_rate_type,
2312 l_deno, l_numer, rec.reval_ex_rate_one);
2313 rec.reval_ex_rate_two := null;
2314 IF xtr_risk_debug_pkg.g_Debug THEN
2315 xtr_risk_debug_pkg.dpush('xtr_revl_exchange_rate: ' || 'END_EX_RATE');
2316 xtr_risk_debug_pkg.dlog('xtr_revl_exchange_rate: ' || 'rec.deal_no', rec.deal_no);
2317 xtr_risk_debug_pkg.dlog('xtr_revl_exchange_rate: ' || 'reval ccy' , rec.reval_ccy);
2318 xtr_risk_debug_pkg.dlog('xtr_revl_exchange_rate: ' || 'sob ccy' , rec.sob_ccy);
2319 xtr_risk_debug_pkg.dlog('xtr_revl_exchange_rate: ' || 'rec.effective_date' , rec.effective_date);
2320 xtr_risk_debug_pkg.dlog('xtr_revl_exchange_rate: ' || 'rec.revldate' , rec.revldate);
2321 xtr_risk_debug_pkg.dlog('xtr_revl_exchange_rate: ' || 'ex rate type' , rec.ex_rate_type);
2322 xtr_risk_debug_pkg.dlog('xtr_revl_exchange_rate: ' || 'end rate ' , rec.reval_ex_rate_one);
2323 xtr_risk_debug_pkg.dpop('xtr_revl_exchange_rate: ' || 'END_EX_RATE');
2324 END IF;
2325
2326 End If;
2327 Else -- deal is unrealized. Use reval date's G/L rate
2328 If rec.deal_type = 'FX' then
2329 GL_CURRENCY_API.get_triangulation_rate
2330 (l_base_ccy, rec.sob_ccy, rec.revldate, rec.ex_rate_type,
2331 l_deno, l_numer, rec.reval_ex_rate_one);
2332 GL_CURRENCY_API.get_triangulation_rate
2333 (l_contra_ccy, rec.sob_ccy, rec.revldate, rec.ex_rate_type,
2334 l_deno, l_numer, rec.reval_ex_rate_two);
2335 Else
2336 GL_CURRENCY_API.get_triangulation_rate
2337 (rec.reval_ccy, rec.sob_ccy, rec.revldate, rec.ex_rate_type,
2338 l_deno, l_numer, rec.reval_ex_rate_one);
2339 rec.reval_ex_rate_two := null;
2340 End If;
2341 End If;
2342
2343 IF xtr_risk_debug_pkg.g_Debug THEN
2344 xtr_risk_debug_pkg.dpush('xtr_revl_exchange_rate: ' || 'reval_date exchange rate');
2345 xtr_risk_debug_pkg.dlog('xtr_revl_exchange_rate: ' || 'rec.deal_no', rec.deal_no);
2346 xtr_risk_debug_pkg.dlog('xtr_revl_exchange_rate: ' || 'reval ccy' , rec.reval_ccy);
2347 xtr_risk_debug_pkg.dlog('xtr_revl_exchange_rate: ' || 'sob ccy' , rec.sob_ccy);
2348 xtr_risk_debug_pkg.dlog('xtr_revl_exchange_rate: ' || 'revaldate' , rec.revldate);
2349 xtr_risk_debug_pkg.dlog('xtr_revl_exchange_rate: ' || 'ex rate type' , rec.ex_rate_type);
2350 xtr_risk_debug_pkg.dlog('xtr_revl_exchange_rate: ' || 'ex rate ' , rec.reval_ex_rate_one);
2351 xtr_risk_debug_pkg.dpop('xtr_revl_exchange_rate: ' || 'reval_date exchange rate');
2352 END IF;
2353
2354 EXCEPTION
2355 when GL_CURRENCY_API.no_rate then
2356 if g_call_by_form = true then
2357 FND_MESSAGE.set_name('XTR', 'XTR_NO_GL_RATE');
2358 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
2359 APP_EXCEPTION.raise_exception;
2360 else
2361 set_err_log(retcode);
2362 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_RATE_CURRENCY_GL');
2363 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
2364 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
2365 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
2366 l_buf := FND_MESSAGE.GET;
2367 FND_FILE.put_line(fnd_file.log, l_buf);
2368 end if;
2369 when GL_CURRENCY_API.invalid_currency then
2370 if g_call_by_form = true then
2371 FND_MESSAGE.set_name('XTR', 'XTR_INVALID_CURRENCY');
2372 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
2373 FND_MESSAGE.set_token('CURRENCY', rec.currencya);
2374 APP_EXCEPTION.raise_exception;
2375 else
2376 set_err_log(retcode);
2377 FND_MESSAGE.SET_NAME('XTR', 'XTR_INVALID_CURRENCY_TYPE');
2378 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
2379 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
2380 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
2381 l_buf := FND_MESSAGE.GET;
2382 FND_FILE.put_line(fnd_file.log, l_buf);
2383 end if;
2384 when others then
2385 if g_call_by_form = true then
2386 APP_EXCEPTION.raise_exception;
2387 else
2388 set_err_log(retcode);
2389 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
2390 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
2391 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
2392 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
2393 l_buf := FND_MESSAGE.GET;
2394 FND_FILE.put_line(fnd_file.log, l_buf);
2395 end if;
2396 End xtr_revl_exchange_rate;
2397 -----------------------------------------------------------------------------------
2398 /*************************************************************************************/
2399 /* The procedure should return following values in reval table */
2400 /* 1. SOB fair value amount (X_SOB_FAIR_VALUE_AMOUNT)- fv_sob_amt */
2401 /* 2. SOB Fair value g/l (SOB_FV_GAIN_LOSS_AMOUNT)- rel_sob_gl, unrel_sob_gl */
2402 /* 3. Currency g/l amount (CURR_GAIN_LOSS_AMOUNT) - currency_gl */
2403 /* ***********************************************************************************/
2404 PROCEDURE xtr_revl_get_curr_gl(
2405 rec IN OUT NOCOPY xtr_revl_rec,
2406 unrel_pl_value IN NUMBER,
2407 rel_pl_value IN NUMBER,
2408 fv_sob_amt OUT NOCOPY NUMBER,
2409 rel_sob_gl OUT NOCOPY NUMBER,
2410 unrel_sob_gl OUT NOCOPY NUMBER,
2411 currency_gl OUT NOCOPY NUMBER) IS
2412
2413 r_err_log err_log; -- record type
2414 l_pre_batch NUMBER;
2415 l_pre_gl_rate NUMBER; -- The previous Batch G/L rate
2416 l_pre_sob_fv NUMBER; -- The previous Batch SOB fair value
2417 l_init_fv NUMBER;
2418 l_deal_rate1 NUMBER;
2419 l_reval_rate1 NUMBER;
2420 l_rate0 NUMBER;
2421 l_rate1 NUMBER;
2422 l_date0 DATE; -- reference date for l_r0
2423 l_date1 DATE; -- reference date for l_r1
2424 l_round NUMBER;
2425 l_first BOOLEAN; -- return TURE if it's the first reval for the deal
2426 l_begin_fv VARCHAR2(30); -- END or BEGIN to calucation different currency G/L
2427 l_fair_value NUMBER; -- fair value used to calculation curency G/L.
2428 l_dummy NUMBER;
2429 l_dummy1 NUMBER;
2430 l_dummy2 NUMBER;
2431 retcode NUMBER;
2432 l_buf Varchar2(500);
2433 Begin
2434 select PARAMETER_VALUE_CODE into l_begin_fv
2435 from xtr_company_parameters
2436 where COMPANY_CODE = rec.company_code and
2437 PARAMETER_CODE = C_BEGIN_FV;
2438
2439 select rounding_factor
2440 into l_round
2441 from xtr_master_currencies_v
2442 where currency = rec.sob_ccy;
2443
2444 if l_begin_fv = 'BEGIN' then -- currency G/L = last batch's fair value * (rate1 - rate0)
2445 xtr_get_fv_from_batch(rec, l_fair_value, l_dummy, l_dummy1, l_dummy2);
2446 else -- 'END', currency G/L = current fair value * (rate1 - rate0)
2447 l_fair_value := rec.fair_value;
2448 end if;
2449
2450 l_rate1 := rec.reval_ex_rate_one;
2451 -- Calculate realized SOB currency G/L info and obtain reval rate info
2452 If rel_pl_value is not null then
2453 l_rate0 := rec.deal_ex_rate_one;
2454
2455 -- For FRA, since it's initial fair value is 0, we provide estimate number for user
2456 -- by using ending fair value.
2457 if rec.deal_type = 'FRA' then
2458 currency_gl := round((rec.fair_value * (l_rate1 - l_rate0)), l_round);
2459 else
2460 currency_gl:= round((rec.init_fv * (l_rate1 - l_rate0)), l_round);
2461 end if;
2462 fv_sob_amt := round((rec.fair_value * l_rate1), l_round);
2463 rel_sob_gl := round((rel_pl_value * l_rate1), l_round);
2464 End if;
2465
2466 If unrel_pl_value is not null then
2467 -- calculate unrealized SOB currency G/L info and obtain reval rate info
2468 xtr_first_reval(rec, l_first);
2469 if l_first = FALSE then
2470 -- not the first reval batch. compare with last batch
2471 l_pre_batch := xtr_get_pre_batchid(rec);
2472 select exchange_rate_one, sob_fair_value_amount
2473 into l_pre_gl_rate, l_pre_sob_fv
2474 from XTR_REVALUATION_DETAILS
2475 where deal_no = rec.deal_no
2476 and transaction_no = rec.trans_no
2477 and nvl(realized_flag, 'N') = 'N'
2478 and batch_id = l_pre_batch;
2479
2480 l_rate0 := l_pre_gl_rate;
2481 else -- first time reval, use exchange rate on deal date
2482 l_rate0 := rec.deal_ex_rate_one;
2483 end if;
2484
2485 fv_sob_amt := round((rec.fair_value * l_rate1), l_round);
2486 currency_gl:= round((l_fair_value * (l_rate1 - l_rate0)), l_round);
2487 unrel_sob_gl:= round((unrel_pl_value * l_rate1), l_round);
2488 End If;
2489
2490 EXCEPTION
2491 when others then
2492 if g_call_by_form = true then
2493 APP_EXCEPTION.raise_exception;
2494 else
2495 set_err_log(retcode);
2496 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
2497 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
2498 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
2499 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
2500 l_buf := FND_MESSAGE.GET;
2501 FND_FILE.put_line(fnd_file.log, l_buf);
2502 end if;
2503 end xtr_revl_get_curr_gl;
2504 -------------------------------------------------------------------
2505 /*******************************************************************/
2506 /* This procedure is to calculate currency G/L for TMM. */
2507 /*******************************************************************/
2508 PROCEDURE xtr_revl_tmm_curr_gl(
2509 rec IN OUT NOCOPY xtr_revl_rec,
2510 rel_currency_gl OUT NOCOPY NUMBER,
2511 unrel_currency_gl OUT NOCOPY NUMBER)IS
2512 l_buf Varchar2(500);
2513 l_batch_end_rate NUMBER;
2514 l_trans_no0 NUMBER;
2515 l_trans_no1 NUMBER;
2516 l_start_date0 DATE;
2517 l_start_date1 DATE;
2518 l_principal0 NUMBER;
2519 l_principal1 NUMBER;
2520 l_balance_out0 NUMBER;
2521 l_balance_out1 NUMBER;
2522 l_prin_action0 VARCHAR2(7);
2523 l_prin_action1 VARCHAR2(7);
2524 l_first_batch0 NUMBER;
2525 l_avg_rate NUMBER;
2526 l_trans_ex_rate0 NUMBER;
2527 l_trans_ex_rate1 NUMBER;
2528 l_unrel_start_rate NUMBER;
2529 l_unrel_end_rate NUMBER;
2530 l_unrel_curr_gl NUMBER;
2531 l_rel_start_rate NUMBER;
2532 l_rel_end_rate NUMBER;
2533 l_rel_curr_gl NUMBER;
2534 l_sum_rel_curr_gl NUMBER:= null;
2535 l_sum_unrel_curr_gl NUMBER:= null;
2536 l_deno NUMBER;
2537 l_numer NUMBER;
2538 l_pre_batch_id NUMBER;
2539 l_first_batch_id NUMBER := null;
2540 l_last_batch_id NUMBER := null;
2541 l_pre_avg_rate NUMBER;
2542 l_pre_balance_out NUMBER;
2543 l_round NUMBER;
2544 l_first BOOLEAN;
2545 r_err_log err_log; -- record type
2546 retcode NUMBER;
2547
2548 Cursor C_PAIR_PRINCIPAL is
2549 Select a.start_date, a.transaction_number, a.principal_adjust,
2550 a.principal_action, a.balance_out, a.first_reval_batch_id,
2551 b.start_date, b.transaction_number, b.principal_adjust,
2552 b.principal_action, b.balance_out
2553 from xtr_rollover_transactions a,
2554 xtr_rollover_transactions b
2555 where a.deal_number = rec.deal_no
2556 and a.deal_number = b.deal_number
2557 and a.start_date < b.start_date
2558 and b.start_date <= rec.revldate
2559 and nvl(a.principal_adjust, 0) <> 0
2560 and nvl(b.principal_adjust, 0) <> 0
2561 and a.start_date =
2562 (select max(c.start_date)
2563 from xtr_rollover_transactions c
2564 where c.deal_number = a.deal_number
2565 and nvl(c.principal_adjust,0) <> 0
2566 and c.start_date < b.start_date)
2567 and a.last_reval_batch_id is null
2568 and b.last_reval_batch_id is null
2569 order by a.start_date;
2570
2571 Cursor C_LAST_PRIN_ADJ is
2572 select start_date, transaction_number, principal_adjust, principal_action,
2573 balance_out, first_reval_batch_id
2574 from XTR_ROLLOVER_TRANSACTIONS
2575 where deal_number = rec.deal_no
2576 and nvl(principal_adjust, 0) <> 0
2577 and start_date <= rec.revldate
2578 order by start_date desc, transaction_number desc;
2579
2580
2581 Begin
2582 select rounding_factor
2583 into l_round
2584 from xtr_master_currencies_v
2585 where currency = rec.sob_ccy;
2586
2587 if rec.reval_ccy = rec.sob_ccy then -- No curency G/L calculation needed
2588 rel_currency_gl := 0;
2589 unrel_currency_gl := 0;
2590 return;
2591 end if;
2592
2593 -- Obtain GL exchange rate on the batch end date
2594 GL_CURRENCY_API.get_triangulation_rate (rec.reval_ccy, rec.sob_ccy,
2595 rec.revldate, rec.ex_rate_type, l_deno, l_numer, l_batch_end_rate);
2596
2597 -- Calculate pair
2598 open C_PAIR_PRINCIPAL;
2599 fetch C_PAIR_PRINCIPAL into l_start_date0, l_trans_no0,
2600 l_principal0, l_prin_action0, l_balance_out0, l_first_batch0,
2601 l_start_date1, l_trans_no1, l_principal1, l_prin_action1, l_balance_out1;
2602
2603 while C_PAIR_PRINCIPAL%FOUND loop
2604 -- Determine the 'Previous exchange rate'
2605 if l_first_batch0 is null then -- transaction been first revaled
2606 GL_CURRENCY_API.get_triangulation_rate (rec.reval_ccy, rec.sob_ccy,
2607 l_start_date0, rec.ex_rate_type, l_deno, l_numer, l_trans_ex_rate0);
2608
2609 l_unrel_start_rate := l_trans_ex_rate0;
2610 l_first_batch_id := rec.batch_id;
2611 else
2612 l_pre_batch_id := xtr_get_pre_batchid(rec);
2613 select exchange_rate_one
2614 into l_unrel_start_rate
2615 from XTR_REVALUATION_DETAILS
2616 where batch_id = l_pre_batch_id
2617 and deal_no = rec.deal_no
2618 and nvl(realized_flag, 'N') = 'N';
2619 end if;
2620
2621 -- Determine the 'Ending exchange rate'
2622 GL_CURRENCY_API.get_triangulation_rate(rec.reval_ccy, rec.sob_ccy,
2623 l_start_date1, rec.ex_rate_type, l_deno, l_numer, l_trans_ex_rate1);
2624 l_unrel_end_rate := l_trans_ex_rate1;
2625
2626 -- Calculate UCGL = balance_out * (ending ex rate - start ex rate)
2627 l_unrel_curr_gl := l_balance_out0 * (l_unrel_end_rate - l_unrel_start_rate);
2628 if rec.deal_subtype = 'FUND' then
2629 l_unrel_curr_gl := l_unrel_curr_gl * (-1);
2630 end if;
2631 l_sum_unrel_curr_gl := round((nvl(l_sum_unrel_curr_gl,0) + nvl(l_unrel_curr_gl,0)), l_round);
2632
2633 l_last_batch_id := rec.batch_id;
2634
2635 if l_first_batch0 is null then
2636 -- This transaction is the first time reval. For principal action = 'INCRSE',
2637 -- we need to calculate new average rate. For 'DECRSE', we need to calculate
2638 -- RCGL
2639 xtr_first_reval(rec, l_first);
2640 if l_first = TRUE and l_trans_no0 = 1 then -- first time reval for the whole deal
2641 l_pre_avg_rate := l_trans_ex_rate0;
2642 l_pre_balance_out := l_balance_out0;
2643 else
2644 select average_exchange_rate -- Get previous transaction's average rate
2645 into l_pre_avg_rate
2646 from xtr_rollover_transactions
2647 where deal_number = rec.deal_no
2648 and average_exchange_rate is NOT NULL -- bug 4598526
2649 and (start_date, maturity_date) = (select max(start_date),max(maturity_date) -- bug 5598286
2650 from xtr_rollover_transactions
2651 where deal_number = rec.deal_no
2652 and nvl(principal_adjust, 0) <> 0
2653 and start_date < l_start_date0
2654 and average_exchange_rate is NOT NULL);
2655
2656 select balance_out -- Get previous transaction's outstandin balance
2657 into l_pre_balance_out
2658 from xtr_rollover_transactions
2659 where deal_number = rec.deal_no
2660 and nvl(principal_adjust, 0) <> 0 -- bug 4598526
2661 and (start_date,maturity_date) = (select max(start_date),max(maturity_date) -- bug 5598286
2662 from xtr_rollover_transactions
2663 where deal_number = rec.deal_no
2664 and nvl(principal_adjust, 0) <> 0
2665 and start_date < l_start_date0);
2666 end if;
2667
2668 if l_prin_action0 = 'INCRSE' then
2669 if l_trans_no0 = 1 then -- the first transaction of the deal
2670 l_avg_rate := l_trans_ex_rate0;
2671 else
2672 l_avg_rate := (l_principal0 * l_trans_ex_rate0 +
2673 l_pre_balance_out * l_pre_avg_rate) /l_balance_out0;
2674
2675 end if;
2676 elsif l_prin_action0 = 'DECRSE' then -- principal action is 'DECRSE'
2677 l_rel_curr_gl := l_principal0 * (l_trans_ex_rate0 - l_pre_avg_rate);
2678 if rec.deal_subtype = 'FUND' then
2679 l_rel_curr_gl := l_rel_curr_gl * (-1);
2680 end if;
2681 l_sum_rel_curr_gl := round((nvl(l_sum_rel_curr_gl, 0) + nvl(l_rel_curr_gl, 0)),l_round);
2682 end if;
2683 end if;
2684
2685 Update XTR_ROLLOVER_TRANSACTIONS
2686 set first_reval_batch_id = nvl(first_reval_batch_id, l_first_batch_id),
2687 last_reval_batch_id = nvl(last_reval_batch_id, l_last_batch_id),
2688 currency_exchange_rate = nvl(currency_exchange_rate, l_trans_ex_rate0),
2689 average_exchange_rate = nvl(average_exchange_rate, l_avg_rate)
2690 where deal_number = rec.deal_no
2691 and transaction_number = l_trans_no0;
2692
2693 fetch C_PAIR_PRINCIPAL into l_start_date0, l_trans_no0,
2694 l_principal0, l_prin_action0, l_balance_out0, l_first_batch0,
2695 l_start_date1, l_trans_no1, l_principal1, l_prin_action1, l_balance_out1;
2696 end loop;
2697 close C_PAIR_PRINCIPAL;
2698
2699 -- Calculate the last transaction of the batch. This transaction will be still
2700 -- eligible for next batch revaluation
2701 open C_LAST_PRIN_ADJ;
2702 fetch C_LAST_PRIN_ADJ into l_start_date0, l_trans_no0,
2703 l_principal0, l_prin_action0, l_balance_out0, l_first_batch0;
2704 if C_LAST_PRIN_ADJ%FOUND then
2705 -- Determine the 'Previous exchange rate'
2706 if l_first_batch0 is null then -- transaction been first revaled
2707 GL_CURRENCY_API.get_triangulation_rate (rec.reval_ccy, rec.sob_ccy,
2708 l_start_date0, rec.ex_rate_type, l_deno, l_numer, l_trans_ex_rate0);
2709
2710 l_unrel_start_rate := l_trans_ex_rate0;
2711 l_first_batch_id := rec.batch_id;
2712 else
2713 l_pre_batch_id := xtr_get_pre_batchid(rec);
2714 select exchange_rate_one
2715 into l_unrel_start_rate
2716 from XTR_REVALUATION_DETAILS
2717 where batch_id = l_pre_batch_id
2718 and deal_no = rec.deal_no
2719 and nvl(realized_flag, 'N') = 'N';
2720 end if;
2721
2722 -- Determine the 'Ending exchange rate'
2723 l_unrel_end_rate := l_batch_end_rate;
2724
2725 -- Calculate UCGL = balance_out * (ending ex rate - start ex rate)
2726 l_unrel_curr_gl := l_balance_out0 * (l_unrel_end_rate - l_unrel_start_rate);
2727 if rec.deal_subtype = 'FUND' then
2728 l_unrel_curr_gl := l_unrel_curr_gl * (-1);
2729 end if;
2730 l_sum_unrel_curr_gl := round((nvl(l_sum_unrel_curr_gl,0) + nvl(l_unrel_curr_gl,0)), l_round);
2731
2732 if l_first_batch0 is null then
2733 -- This transaction is the first time reval. For principal action = 'INCRSE',
2734 -- we need to calculate new average rate. For 'DECRSE', we need to calculate
2735 -- RCGL
2736 if l_trans_no0 <> 1 then
2737 select average_exchange_rate -- Get previous transaction's average rate
2738 into l_pre_avg_rate
2739 from xtr_rollover_transactions
2740 where deal_number = rec.deal_no
2741 and average_exchange_rate is NOT NULL -- bug 4598526
2742 and (start_date, maturity_date) = (select max(start_date), max(maturity_date) -- bug 5598286
2743 from xtr_rollover_transactions
2744 where deal_number = rec.deal_no
2745 and nvl(principal_adjust, 0) <> 0
2746 and start_date < l_start_date0
2747 and average_exchange_rate is NOT NULL);
2748
2749 select balance_out -- Get previous transaction's outstandin balance
2750 into l_pre_balance_out
2751 from xtr_rollover_transactions
2752 where deal_number = rec.deal_no
2753 and nvl(principal_adjust, 0) <> 0 -- bug 4598526
2754 and (start_date, maturity_date) = (select max(start_date),max(maturity_date) -- bug 5598286
2755 from xtr_rollover_transactions
2756 where deal_number = rec.deal_no
2757 and nvl(principal_adjust, 0) <> 0
2758 and start_date < l_start_date0);
2759 end if;
2760
2761 if l_prin_action0 = 'INCRSE' then
2762 if l_trans_no0 = 1 then -- the first transaction of the deal
2763 l_avg_rate := l_trans_ex_rate0;
2764 else
2765 l_avg_rate := (l_principal0 * l_trans_ex_rate0 +
2766 l_pre_balance_out * l_pre_avg_rate) /l_balance_out0;
2767
2768 end if;
2769 elsif l_prin_action0 = 'DECRSE' then -- principal action is 'DECRSE'
2770 l_rel_curr_gl := l_principal0 * (l_trans_ex_rate0 - l_pre_avg_rate);
2771 if rec.deal_subtype = 'FUND' then
2772 l_rel_curr_gl := l_rel_curr_gl * (-1);
2773 end if;
2774 l_sum_rel_curr_gl := round((nvl(l_sum_rel_curr_gl,0) + nvl(l_rel_curr_gl,0)), l_round);
2775 end if;
2776 end if;
2777 rel_currency_gl := l_sum_rel_curr_gl;
2778 unrel_currency_gl := l_sum_unrel_curr_gl;
2779
2780 Update XTR_ROLLOVER_TRANSACTIONS
2781 set first_reval_batch_id = nvl(first_reval_batch_id, l_first_batch_id),
2782 currency_exchange_rate = nvl(currency_exchange_rate, l_trans_ex_rate0),
2783 average_exchange_rate = nvl(average_exchange_rate, l_avg_rate)
2784 where deal_number = rec.deal_no
2785 and transaction_number = l_trans_no0;
2786 end if;
2787 close C_LAST_PRIN_ADJ;
2788
2789 EXCEPTION
2790 when GL_CURRENCY_API.no_rate then
2791 if g_call_by_form = true then
2792 FND_MESSAGE.set_name('XTR', 'XTR_NO_GL_RATE');
2793 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
2794 APP_EXCEPTION.raise_exception;
2795 else
2796 set_err_log(retcode);
2797 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_RATE_CURRENCY_GL');
2798 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
2799 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
2800 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
2801 l_buf := FND_MESSAGE.GET;
2802 FND_FILE.put_line(fnd_file.log, l_buf);
2803 end if;
2804 when GL_CURRENCY_API.invalid_currency then
2805 if g_call_by_form = true then
2806 FND_MESSAGE.set_name('XTR', 'XTR_INVALID_CURRENCY');
2807 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
2808 FND_MESSAGE.set_token('CURRENCY', rec.currencya);
2809 APP_EXCEPTION.raise_exception;
2810 else
2811 set_err_log(retcode);
2812 FND_MESSAGE.SET_NAME('XTR', 'XTR_INVALID_CURRENCY_TYPE');
2813 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
2814 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
2815 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
2816 l_buf := FND_MESSAGE.GET;
2817 FND_FILE.put_line(fnd_file.log, l_buf);
2818 end if;
2819 when others then
2820 if g_call_by_form = true then
2821 APP_EXCEPTION.raise_exception;
2822 else
2823 set_err_log(retcode);
2824 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
2825 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
2826 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
2827 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
2828 l_buf := FND_MESSAGE.GET;
2829 FND_FILE.put_line(fnd_file.log, l_buf);
2830 end if;
2831 End;
2832 --------------------------------------------------------
2833 /*******************************************************************/
2834 /* This procedure pass one account no for each company and calculate */
2835 /* (un)realized currency G/L and average exchange rate for the row */
2836 /* in xtr_bank_balances for deal type CA */
2837 /*******************************************************************/
2838 PROCEDURE xtr_revl_ca_curr_gl(
2839 rec IN OUT NOCOPY xtr_revl_rec,
2840 retcode OUT NOCOPY NUMBER) IS
2841 l_buf Varchar2(500);
2842 l_bal_date0 DATE;
2843 l_bal_date1 DATE;
2844 l_bal_amt0 NUMBER;
2845 l_bal_amt1 NUMBER;
2846 l_ex_rate0 NUMBER;
2847 l_ex_rate1 NUMBER;
2848 l_avg_rate NUMBER;
2849 l_avg_rate0 NUMBER;
2850 l_avg_rate1 NUMBER;
2851 l_last_bal_date DATE;
2852 l_last_bal_amt NUMBER;
2853 l_last_avg_rate NUMBER;
2854 l_gl_rate NUMBER;
2855 l_currency_gl NUMBER;
2856 r_err_log err_log; -- record type
2857 l_bed_rate NUMBER; --the GL exchange rate on the batch end date
2858 l_deno NUMBER;
2859 l_numer NUMBER;
2860 l_first_batch_id NUMBER;
2861 l_last_batch_id NUMBER;
2862 l_last_unrel_date DATE;
2863 l_unrel_start_rate NUMBER;
2864 l_unrel_end_rate NUMBER;
2865 l_increase NUMBER;
2866 l_decrease NUMBER;
2867 l_pre_balance NUMBER;
2868 l_unrel_cur_gl NUMBER;
2869 l_rel_cur_gl NUMBER;
2870 l_pre_batch_id NUMBER;
2871 l_rc NUMBER:= 0;
2872 r_rd XTR_REVALUATION_DETAILS%rowtype;
2873 l_trans_rate0 NUMBER;
2874 l_trans_rate1 NUMBER;
2875 l_round NUMBER;
2876
2877 --------------------------------------------------------------------------------------
2878 --Select pair of balances row to calculate UCGL and RCGL (not include last single row)
2879 --------------------------------------------------------------------------------------
2880 Cursor C_PAIR_BALANCE is
2881 SELECT a.balance_date, nvl(a.balance_cflow,0), a.first_batch_id,
2882 a.interest_rate,
2883 b.balance_date, nvl(b.balance_cflow,0), b.interest_rate
2884 FROM xtr_bank_balances a,
2885 xtr_bank_balances b
2886 Where a.company_code = rec.company_code
2887 and a.company_code = b.company_code
2888 and a.account_number = rec.account_no
2889 and a.account_number = b.account_number
2890 and a.balance_date < b.balance_date
2891 and b.balance_date <= rec.revldate
2892 and a.balance_date =
2893 (SELECT max(c.balance_date)
2894 FROM xtr_bank_balances c
2895 where c.company_code = a.company_code
2896 AND c.account_number = a.account_number
2897 AND c.balance_date < b.balance_date)
2898 and a.last_batch_id is null
2899 and b.last_batch_id is null
2900 ORDER by 1;
2901
2902 ------------------------------------------------------------
2903 -- select last eligible row of the account to calculate UCGL
2904 ------------------------------------------------------------
2905 Cursor C_LAST_BALANCE is
2906 Select balance_date, nvl(balance_cflow,0), first_batch_id, interest_rate
2907 From XTR_BANK_BALANCES
2908 Where company_code = rec.company_code
2909 and account_number = rec.account_no
2910 and balance_date =
2911 (select max(effective_date)
2912 from XTR_CA_ELIGIBLE_DEALS_V
2913 where company_code = rec.company_code
2914 and account_no = rec.account_no
2915 and effective_date <= rec.revldate)
2916 and last_batch_id is null;
2917
2918
2919 ------------- AW 25/10/01 ------------------------
2920 -- Select the last balance's average exchange rate
2921 --------------------------------------------------
2922 CURSOR c_last_ca_avg_rate IS
2923 SELECT average_exchange_rate
2924 FROM xtr_bank_balances
2925 WHERE company_code = rec.company_code
2926 AND account_number = rec.account_no
2927 AND first_batch_id = l_pre_batch_id
2928 ORDER BY balance_date desc;
2929
2930 Begin
2931 retcode := 1;
2932 select rounding_factor
2933 into l_round
2934 from xtr_master_currencies_v
2935 where currency = rec.sob_ccy;
2936
2937 ----------------------------------------------------------------------
2938 -- Obtain GL exchange rate on the batch end date
2939 ----------------------------------------------------------------------
2940 GL_CURRENCY_API.get_triangulation_rate (rec.currencya, rec.sob_ccy,
2941 rec.revldate, rec.ex_rate_type, l_deno, l_numer, l_bed_rate);
2942
2943 ----------------------------------------------------------------------
2944 -- Calculate pair records (un)realized currency G/L
2945 ----------------------------------------------------------------------
2946 Open C_PAIR_BALANCE;
2947 Fetch C_PAIR_BALANCE into l_bal_date0, l_bal_amt0, l_first_batch_id, l_trans_rate0,
2948 l_bal_date1, l_bal_amt1, l_trans_rate1;
2949 While C_PAIR_BALANCE%FOUND loop
2950 ----------------------------------------------------------------------
2951 -- Get date and rate information for 1st record of the pair
2952 ----------------------------------------------------------------------
2953 if l_first_batch_id is null then
2954
2955 GL_CURRENCY_API.get_triangulation_rate(rec.currencya, rec.sob_ccy,
2956 l_bal_date0, rec.ex_rate_type, l_deno, l_numer, l_ex_rate0);
2957 xtr_risk_debug_pkg.dpush('FIRST_BATCH_CA');
2958 xtr_risk_debug_pkg.dlog('l_ex_rate0', l_ex_rate0);
2959 xtr_risk_debug_pkg.dpop('FIRST_BATCH_CA');
2960
2961 l_last_unrel_date := l_bal_date0;
2962 l_avg_rate0 := nvl(l_avg_rate0, l_ex_rate0);
2963 l_unrel_start_rate:= l_ex_rate0;
2964 else
2965 l_pre_batch_id := xtr_get_pre_batchid(rec);
2966 if l_pre_batch_id <> -1 then
2967 select exchange_rate_one, (period_to + 1)
2968 into l_unrel_start_rate, l_last_unrel_date
2969 from XTR_REVALUATION_DETAILS
2970 where batch_id = l_pre_batch_id
2971 and company_code = rec.company_code
2972 and account_no = rec.account_no
2973 and effective_date = l_bal_date0
2974 and nvl(realized_flag, 'N') = 'N';
2975
2976 --------------- AW 25/10/01 ----------------
2977 l_ex_rate0 := l_unrel_start_rate;
2978
2979 OPEN c_last_ca_avg_rate;
2980 FETCH c_last_ca_avg_rate INTO l_avg_rate0;
2981 CLOSE c_last_ca_avg_rate;
2982 l_avg_rate0 := nvl(l_avg_rate0, l_ex_rate0);
2983 ---------------------------------------------
2984
2985 xtr_risk_debug_pkg.dpush('SEC_BATCH_CA');
2986 xtr_risk_debug_pkg.dlog('l_ex_rate0', l_ex_rate0);
2987 xtr_risk_debug_pkg.dlog('company_code', rec.company_code);
2988 xtr_risk_debug_pkg.dlog('account_no', rec.account_no);
2989 xtr_risk_debug_pkg.dlog('l_pre_batch_id', l_pre_batch_id);
2990 xtr_risk_debug_pkg.dpop('SEC_BATCH_CA');
2991
2992 else
2993 GL_CURRENCY_API.get_triangulation_rate(rec.currencya, rec.sob_ccy,
2994 l_bal_date0, rec.ex_rate_type, l_deno, l_numer, l_ex_rate0);
2995 l_last_unrel_date := l_bal_date0;
2996 l_avg_rate0 := nvl(l_avg_rate0, l_ex_rate0);
2997 l_unrel_start_rate:= l_ex_rate0;
2998 xtr_risk_debug_pkg.dpush('SEC_BATCH_CA1');
2999 xtr_risk_debug_pkg.dlog('l_ex_rate0', l_ex_rate0);
3000 xtr_risk_debug_pkg.dpop('SEC_BATCH_CA1');
3001
3002 end if;
3003 end if;
3004
3005
3006 l_first_batch_id := rec.batch_id;
3007
3008 ----------------------------------------------------------------------
3009 -- Get date and rate information for 2nd record of the pair
3010 ----------------------------------------------------------------------
3011 GL_CURRENCY_API.get_triangulation_rate(rec.currencya, rec.sob_ccy,
3012 l_bal_date1, rec.ex_rate_type, l_deno, l_numer, l_ex_rate1);
3013 l_unrel_end_rate := l_ex_rate1;
3014
3015 ----------------------------------------------------------------------
3016 -- Determine the increase and decrease
3017 ----------------------------------------------------------------------
3018 l_increase := 0;
3019 l_decrease := 0;
3020 l_pre_balance := 0;
3021
3022 if (sign(l_bal_amt0) + sign(l_bal_amt1)) > 0 then
3023 -----------------------------------------------------------
3024 --both balances are positives or one is positive, one is 0
3025 -----------------------------------------------------------
3026 if (l_bal_amt1 > l_bal_amt0) then
3027 l_increase := l_bal_amt1 - l_bal_amt0;
3028 l_pre_balance := l_bal_amt0;
3029 else
3030 l_decrease := l_bal_amt0 - l_bal_amt1;
3031 end if;
3032
3033 elsif (sign(l_bal_amt0) + sign(l_bal_amt1)) < 0 then
3034 -----------------------------------------------------------
3035 --both balances are negatives or one is negative, one is 0
3036 -----------------------------------------------------------
3037 if abs(l_bal_amt1) > abs(l_bal_amt0) then
3038 l_increase := abs(l_bal_amt1) - abs(l_bal_amt0);
3039 l_pre_balance := abs(l_bal_amt0);
3040 else
3041 l_decrease := l_bal_amt0 - l_bal_amt1;
3042 end if;
3043 else
3044 -----------------------------------------------------------
3045 -- balance A and B are on opposite side of 0 balance line
3046 -- or both balances = 0
3047 -----------------------------------------------------------
3048 l_increase := abs(l_bal_amt1);
3049 l_pre_balance := 0;
3050 l_decrease := l_bal_amt0;
3051 end if;
3052
3053 ----------------------------------------------------------------------
3054 -- Calculate unrealized G/L for the first record of the pair and insert
3055 -- into xtr_revaluation_details table
3056 ----------------------------------------------------------------------
3057 l_unrel_cur_gl := round((l_bal_amt0 * (l_unrel_end_rate - l_unrel_start_rate)), l_round);
3058 rec.deal_subtype := 'INVEST';
3059 rec.fair_value := l_bal_amt0;
3060 rec.face_value := l_bal_amt0;
3061 rec.transaction_rate := l_trans_rate0;
3062 rec.effective_date := l_bal_date0;
3063 r_rd.effective_days := l_bal_date0 - rec.revldate;
3064 rec.period_start := l_last_unrel_date;
3065 rec.period_end := l_bal_date1;
3066 r_rd.transaction_period := rec.period_end - rec.period_start;
3067 r_rd.amount_type := 'CCYUNRL';
3068 if rec.fair_value >= 0 then
3069 rec.deal_subtype := 'INVEST';
3070 else
3071 rec.deal_subtype := 'FUND';
3072 end if;
3073 ------------- AW 26/10/01 ------------
3074 rec.reval_ex_rate_one := l_ex_rate1;
3075 -- rec.reval_ex_rate_one := l_ex_rate0;
3076 --------------------------------------
3077 xtr_revl_unreal_log(rec, 0, 0, 0, 0, l_unrel_cur_gl, r_rd, retcode);
3078
3079 xtr_risk_debug_pkg.dpush('CA_UNREL_CURR_GL');
3080 xtr_risk_debug_pkg.dlog('l_bal_date0', l_bal_date0);
3081 xtr_risk_debug_pkg.dlog('l_bal_amt0', l_bal_amt0);
3082 xtr_risk_debug_pkg.dlog('l_bal_date1', l_bal_date1);
3083 xtr_risk_debug_pkg.dlog('l_bal_amt1', l_bal_amt1);
3084 xtr_risk_debug_pkg.dlog('l_unrel_cur_gl', l_unrel_cur_gl);
3085 xtr_risk_debug_pkg.dlog('l_ex_rate0', l_ex_rate0);
3086 xtr_risk_debug_pkg.dlog('l_ex_rate1', l_ex_rate1);
3087 xtr_risk_debug_pkg.dpop('CA_UNREL_CURR_GL');
3088
3089 if l_decrease <> 0 then
3090 ----------------------------------------------------------------------
3091 -- Calculate realized G/L for the second record of the pair and insert
3092 -- into xtr_revaluation_details table
3093 ----------------------------------------------------------------------
3094 l_rel_cur_gl := round((l_decrease * (l_ex_rate1 - l_avg_rate0)), l_round);
3095 rec.fair_value := l_bal_amt1;
3096 rec.face_value := l_bal_amt1;
3097 rec.transaction_rate := l_trans_rate1;
3098 rec.effective_date := l_bal_date1;
3099 r_rd.effective_days := rec.effective_date - rec.revldate;
3100 rec.period_start := l_bal_date0;
3101 rec.period_end := l_bal_date1;
3102 r_rd.transaction_period := rec.period_end - rec.period_start;
3103 r_rd.amount_type := 'CCYREAL';
3104 l_avg_rate := l_avg_rate0;
3105 rec.reval_ex_rate_one := l_ex_rate1;
3106 if rec.fair_value >= 0 then
3107 rec.deal_subtype := 'INVEST';
3108 else
3109 rec.deal_subtype := 'FUND';
3110 end if;
3111
3112 xtr_revl_real_log(rec, 0, 0, 0, l_rel_cur_gl, r_rd, retcode);
3113
3114 xtr_risk_debug_pkg.dpush('CA_REAL_CURR_GL');
3115 xtr_risk_debug_pkg.dlog('l_bal_date0', l_bal_date0);
3116 xtr_risk_debug_pkg.dlog('l_bal_amt0', l_bal_amt0);
3117 xtr_risk_debug_pkg.dlog('l_bal_date1', l_bal_date1);
3118 xtr_risk_debug_pkg.dlog('l_bal_amt1', l_bal_amt1);
3119 xtr_risk_debug_pkg.dlog('l_ex_rate1', l_ex_rate1);
3120 xtr_risk_debug_pkg.dlog('l_avg_rate0', l_avg_rate0);
3121 xtr_risk_debug_pkg.dlog('l_rel_cur_gl', l_rel_cur_gl);
3122 xtr_risk_debug_pkg.dpop('CA_REAL_CURR_GL');
3123
3124 end if;
3125
3126 l_last_batch_id := rec.batch_id;
3127
3128 if l_increase <> 0 then
3129 ----------------------------------------------------------------------
3130 -- Calcualte new average rate for second record of the pair.
3131 ----------------------------------------------------------------------
3132 l_avg_rate := ((l_increase * l_ex_rate1) + (l_pre_balance * l_avg_rate0))
3133 / abs(l_bal_amt1);
3134 else
3135 l_avg_rate := l_avg_rate0;
3136 end if;
3137
3138 ----------------------------------------------------------------------
3139 -- Update the first record of the pair in XTR_BANK_BALANCES table
3140 ----------------------------------------------------------------------
3141 update XTR_BANK_BALANCES
3142 set first_batch_id = nvl(first_batch_id, l_first_batch_id),
3143 last_batch_id = nvl(last_batch_id, l_last_batch_id),
3144 exchange_rate = nvl(exchange_rate, l_ex_rate0),
3145 average_exchange_rate = nvl(average_exchange_rate, l_avg_rate0)
3146 where company_code = rec.company_code
3147 and account_number = rec.account_no
3148 and balance_date = l_bal_date0;
3149
3150 ----------------------------------------------------------------------
3151 -- Update the second record of the pair in XTR_BANK_BALANCES table
3152 ----------------------------------------------------------------------
3153 update XTR_BANK_BALANCES
3154 set average_exchange_rate = l_avg_rate
3155 where company_code = rec.company_code
3156 and account_number = rec.account_no
3157 and balance_date = l_bal_date1;
3158
3159 ----------------------------------------------------------------------
3160 -- Reset rate and date for next pair records comparison
3161 ----------------------------------------------------------------------
3162 l_unrel_start_rate := l_ex_rate1;
3163 l_last_unrel_date := l_bal_date1;
3164 l_avg_rate0 := l_avg_rate;
3165
3166 Fetch C_PAIR_BALANCE into l_bal_date0, l_bal_amt0, l_first_batch_id, l_trans_rate0,
3167 l_bal_date1, l_bal_amt1, l_trans_rate1;
3168 End Loop;
3169 Close C_PAIR_BALANCE;
3170
3171 ----------------------------------------------------------------
3172 -- For the last row, we always calculate unrealized currency G/L
3173 ----------------------------------------------------------------
3174 Open C_LAST_BALANCE;
3175 Fetch C_LAST_BALANCE into l_bal_date0, l_bal_amt0, l_first_batch_id, l_trans_rate0;
3176
3177 if C_LAST_BALANCE%FOUND then
3178 if l_first_batch_id is null then
3179 GL_CURRENCY_API.get_triangulation_rate(rec.currencya, rec.sob_ccy,
3180 l_bal_date0, rec.ex_rate_type, l_deno, l_numer, l_ex_rate0);
3181 l_last_unrel_date := l_bal_date0;
3182 l_avg_rate0 := l_ex_rate0;
3183 l_unrel_start_rate:= l_ex_rate0;
3184 else
3185 l_pre_batch_id := xtr_get_pre_batchid(rec);
3186 if l_pre_batch_id <> -1 then
3187 select exchange_rate_one, (period_to + 1)
3188 into l_unrel_start_rate, l_last_unrel_date
3189 from XTR_REVALUATION_DETAILS
3190 where batch_id = l_pre_batch_id
3191 and company_code = rec.company_code
3192 and account_no = rec.account_no
3193 and effective_date = l_bal_date0
3194 and nvl(realized_flag, 'N') = 'N';
3195 -------- AW 25/10/01 ------------
3196 l_ex_rate0 := l_unrel_start_rate;
3197 ---------------------------------
3198 else
3199 GL_CURRENCY_API.get_triangulation_rate(rec.currencya, rec.sob_ccy,
3200 l_bal_date0, rec.ex_rate_type, l_deno, l_numer, l_ex_rate0);
3201 l_last_unrel_date := l_bal_date0;
3202 l_avg_rate0 := l_ex_rate0;
3203 l_unrel_start_rate:= l_ex_rate0;
3204 end if;
3205 end if;
3206
3207 l_first_batch_id := rec.batch_id;
3208 if l_last_unrel_date <> rec.revldate then
3209 l_unrel_end_rate := l_bed_rate;
3210 else
3211 l_unrel_end_rate := l_ex_rate0;
3212 end if;
3213
3214 l_unrel_cur_gl := round((l_bal_amt0 * (l_unrel_end_rate - l_unrel_start_rate)), l_round);
3215 rec.fair_value := l_bal_amt0;
3216 rec.face_value := l_bal_amt0;
3217 rec.transaction_rate := l_trans_rate0;
3218 rec.effective_date := l_bal_date0;
3219 r_rd.effective_days := l_bal_date0 - rec.revldate;
3220 rec.period_start := l_last_unrel_date;
3221 rec.period_end := rec.revldate;
3222 r_rd.transaction_period := rec.period_end - rec.period_start;
3223 r_rd.amount_type := 'CCYUNRL';
3224 rec.reval_ex_rate_one := l_unrel_end_rate;
3225 if rec.fair_value >= 0 then
3226 rec.deal_subtype := 'INVEST';
3227 else
3228 rec.deal_subtype := 'FUND';
3229 end if;
3230 xtr_revl_unreal_log(rec, 0, 0, 0, 0, l_unrel_cur_gl, r_rd, retcode);
3231
3232 xtr_risk_debug_pkg.dpush('CA_LAST_UNREL');
3233 xtr_risk_debug_pkg.dlog('l_bal_date0', l_bal_date0);
3234 xtr_risk_debug_pkg.dlog('l_bal_amt0', l_bal_amt0);
3235 xtr_risk_debug_pkg.dlog('l_unrel_cur_gl', l_unrel_cur_gl);
3236 xtr_risk_debug_pkg.dpop('CA_LAST_UNREL');
3237
3238 ----------------------------------------------------------------------
3239 -- Update the last row into XTR_BANK_BALANCES table
3240 ----------------------------------------------------------------------
3241 update XTR_BANK_BALANCES
3242 set first_batch_id = nvl(first_batch_id, l_first_batch_id),
3243 exchange_rate = nvl(exchange_rate, l_ex_rate0),
3244 average_exchange_rate = nvl(average_exchange_rate, l_avg_rate0)
3245 where company_code = rec.company_code
3246 and account_number = rec.account_no
3247 and balance_date = l_bal_date0;
3248 END if;
3249 Close C_LAST_BALANCE;
3250 retcode := 0;
3251
3252 EXCEPTION
3253 when GL_CURRENCY_API.no_rate then
3254 if g_call_by_form = true then
3255 FND_MESSAGE.set_name('XTR', 'XTR_NO_GL_RATE');
3256 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
3257 APP_EXCEPTION.raise_exception;
3258 else
3259 set_err_log(retcode);
3260 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_RATE_CURRENCY_GL');
3261 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
3262 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
3263 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
3264 l_buf := FND_MESSAGE.GET;
3265 FND_FILE.put_line(fnd_file.log, l_buf);
3266 end if;
3267 when GL_CURRENCY_API.invalid_currency then
3268 if g_call_by_form = true then
3269 FND_MESSAGE.set_name('XTR', 'XTR_INVALID_CURRENCY');
3270 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
3271 FND_MESSAGE.set_token('CURRENCY', rec.currencya);
3272 APP_EXCEPTION.raise_exception;
3273 else
3274 set_err_log(retcode);
3275 FND_MESSAGE.SET_NAME('XTR', 'XTR_INVALID_CURRENCY_TYPE');
3276 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
3277 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
3278 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
3279 l_buf := FND_MESSAGE.GET;
3280 FND_FILE.put_line(fnd_file.log, l_buf);
3281 end if;
3282 when others then
3283 if g_call_by_form = true then
3284 APP_EXCEPTION.raise_exception;
3285 else
3286 set_err_log(retcode);
3287 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
3288 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
3289 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
3290 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
3291 l_buf := FND_MESSAGE.GET;
3292 FND_FILE.put_line(fnd_file.log, l_buf);
3293 end if;
3294
3295 End;
3296
3297 --------------------------------------------------------------
3298 /******************************************************************/
3299 /* This procedure pass one deal no for each company and calculate */
3300 /* (un)realized currency G/L and average exchange rate for the row */
3301 /* in xtr_intergroup_transfers for deal type IG */
3302 /*******************************************************************/
3303 PROCEDURE xtr_revl_ig_curr_gl(
3304 rec IN OUT NOCOPY xtr_revl_rec,
3305 retcode OUT NOCOPY NUMBER) IS
3306 l_buf Varchar2(500);
3307 l_trans_no0 NUMBER;
3308 l_trans_no1 NUMBER;
3309 l_bal_date0 DATE;
3310 l_bal_date1 DATE;
3311 l_bal_amt0 NUMBER;
3312 l_bal_amt1 NUMBER;
3313 l_ex_rate0 NUMBER;
3314 l_ex_rate1 NUMBER;
3315 l_avg_rate0 NUMBER;
3316 l_avg_rate1 NUMBER;
3317 l_avg_rate NUMBER;
3318 l_last_bal_date DATE;
3319 l_last_bal_amt NUMBER;
3320 l_last_avg_rate NUMBER;
3321 l_last_trans_no NUMBER;
3322 l_gl_rate NUMBER;
3323 l_currency_gl NUMBER;
3324 r_err_log err_log; -- record type
3325 l_bed_rate NUMBER; --the GL exchange rate on the batch end date
3326 l_deno NUMBER;
3327 l_numer NUMBER;
3328 l_first_batch_id NUMBER;
3329 l_last_batch_id NUMBER;
3330 l_last_unrel_date DATE;
3331 l_unrel_start_rate NUMBER;
3332 l_unrel_end_rate NUMBER;
3333 l_increase NUMBER;
3334 l_decrease NUMBER;
3335 l_pre_balance NUMBER;
3336 l_unrel_cur_gl NUMBER;
3337 l_rel_cur_gl NUMBER;
3338 l_pre_batch_id NUMBER;
3339 r_rd XTR_REVALUATION_DETAILS%rowtype;
3340 l_product0 VARCHAR2(10);
3341 l_product1 VARCHAR2(10);
3342 l_port0 VARCHAR2(7);
3343 l_port1 VARCHAR2(7);
3344 l_rc NUMBER := 1;
3345 l_round NUMBER;
3346
3347 /*-----------------------------------------------------------------------------------
3348 Cursor C_PAIR_BALANCE is
3349 SELECT a.transfer_date, a.balance_out, a.transaction_number, a.first_batch_id,
3350 a.product_type, a.portfolio,
3351 b.transfer_date, b.balance_out, b.transaction_number, b.product_type,
3352 b.portfolio
3353 FROM XTR_INTERGROUP_TRANSFERS a,
3354 XTR_INTERGROUP_TRANSFERS b
3355 WHERE a.company_code = rec.company_code
3356 AND a.company_code = b.company_code
3357 AND a.deal_number = rec.deal_no
3358 AND a.deal_number = b.deal_number
3359 AND b.transfer_date <= rec.revldate
3360 AND ((b.transaction_number > a.transaction_number and a.transfer_date = b.transfer_date)
3361 or(b.transfer_date > a.transfer_date))
3362 AND a.transfer_date =
3363 (select max(transfer_date)
3364 from XTR_INTERGROUP_TRANSFERS c
3365 where c.deal_number = a.deal_number
3366 and ((c.transfer_date < b.transfer_date) or
3367 (c.transaction_number < b.transaction_number and c.transfer_date = b.transfer_date)))
3368 AND a.last_batch_id is null
3369 AND b.last_batch_id is null
3370 ORDER by 1;
3371 -------------------------------------------------------------------------------------*/
3372
3373 Cursor C_CURR_BALANCE is
3374 SELECT b.transfer_date, b.balance_out, b.transaction_number,
3375 b.product_type, b.portfolio
3376 FROM XTR_INTERGROUP_TRANSFERS b
3377 WHERE b.company_code = rec.company_code
3378 AND b.deal_number = rec.deal_no
3379 AND b.transfer_date <= rec.revldate
3380 AND b.last_batch_id is null
3381 ORDER by b.transfer_date, b.transaction_number;
3382
3383 Cursor C_PREV_BALANCE is
3384 SELECT a.transfer_date, a.balance_out, a.transaction_number, a.first_batch_id,
3385 a.product_type, a.portfolio
3386 FROM XTR_INTERGROUP_TRANSFERS a
3387 WHERE a.company_code = rec.company_code
3388 AND a.deal_number = rec.deal_no
3389 AND ((l_trans_no1 > a.transaction_number and a.transfer_date = l_bal_date1)
3390 or(l_bal_date1 > a.transfer_date))
3391 AND a.last_batch_id is null
3392 ORDER by a.transfer_date desc, a.transaction_number desc;
3393
3394 -------------------------------------------------------------------------------
3395 -- This cursor will fetch the last row for the deal number with latest transfer
3396 -- date and transaction number
3397 -------------------------------------------------------------------------------
3398 Cursor C_LAST_BALANCE is
3399 SELECT transaction_number, transfer_date, balance_out,
3400 first_batch_id, product_type, portfolio
3401 FROM XTR_INTERGROUP_TRANSFERS
3402 Where deal_number = rec.deal_no
3403 AND transfer_date <= rec.revldate
3404 AND last_batch_id is null
3405 ORDER BY transfer_date desc, transaction_number desc;
3406
3407 /*-------------------------- AW 25/10/01 ----------------------
3408 and transfer_date = (select max(transfer_date)
3409 from XTR_INTERGROUP_TRANSFERS
3410 where deal_number = rec.deal_no)
3411 and transaction_number = (select max(transaction_number)
3412 from XTR_INTERGROUP_TRANSFERS
3413 where deal_number = rec.deal_no)
3414 and last_batch_id is null;
3415 */-------------------------------------------------------------
3416
3417
3418 ---------------- AW 25/10/01 ------------------------
3419 -- Select the last balance's average exchange rate
3420 -----------------------------------------------------
3421 CURSOR c_last_ig_avg_rate IS
3422 SELECT average_exchange_rate
3423 FROM xtr_intergroup_transfers
3424 WHERE deal_number = rec.deal_no
3425 AND transfer_date <= l_bal_date0
3426 AND first_batch_id = l_pre_batch_id
3427 ORDER BY transfer_date desc, transaction_number desc;
3428 -----------------------------------------------------
3429
3430 Begin
3431 retcode := 1;
3432 select rounding_factor
3433 into l_round
3434 from xtr_master_currencies_v
3435 where currency = rec.sob_ccy;
3436
3437 -------------------------------------------------
3438 -- Obtain GL exchange rate on the batch end date
3439 -------------------------------------------------
3440 GL_CURRENCY_API.get_triangulation_rate (rec.currencya, rec.sob_ccy,
3441 rec.revldate, rec.ex_rate_type, l_deno, l_numer, l_bed_rate);
3442
3443 ----------------------------------------------------
3444 -- Calculate pair records (un)realized currency G/L
3445 ----------------------------------------------------
3446 Open C_CURR_BALANCE;
3447 Fetch C_CURR_BALANCE into l_bal_date1, l_bal_amt1, l_trans_no1, l_product1, l_port1;
3448 While C_CURR_BALANCE%FOUND loop
3449 ------------------------------------------------------------
3450 -- Get date and rate information for 1st record of the pair
3451 ------------------------------------------------------------
3452
3453 OPEN C_PREV_BALANCE;
3454 FETCH C_PREV_BALANCE into l_bal_date0, l_bal_amt0, l_trans_no0,
3455 l_first_batch_id, l_product0, l_port0;
3456 if C_PREV_BALANCE%FOUND then
3457 if l_first_batch_id is null then
3458 GL_CURRENCY_API.get_triangulation_rate(rec.currencya, rec.sob_ccy, l_bal_date0,
3459 rec.ex_rate_type, l_deno, l_numer, l_ex_rate0);
3460 l_last_unrel_date := l_bal_date0;
3461 l_avg_rate0 := nvl(l_avg_rate0, l_ex_rate0);
3462 l_unrel_start_rate:= l_ex_rate0;
3463 else
3464 l_pre_batch_id := xtr_get_pre_batchid(rec);
3465 if l_pre_batch_id <> -1 then
3466 select exchange_rate_one, (period_to +1)
3467 into l_unrel_start_rate, l_last_unrel_date
3468 from XTR_REVALUATION_DETAILS
3469 where batch_id = l_pre_batch_id
3470 and deal_no = rec.deal_no
3471 and deal_type = rec.deal_type
3472 and transaction_no = l_trans_no0
3473 and nvl(realized_flag, 'N') = 'N';
3474
3475 ---------- AW 25/10/01 --------------------
3476 l_ex_rate0 := l_unrel_start_rate;
3477
3478 OPEN c_last_ig_avg_rate;
3479 FETCH c_last_ig_avg_rate INTO l_avg_rate0;
3480 CLOSE c_last_ig_avg_rate;
3481 l_avg_rate0 := nvl(l_avg_rate0, l_ex_rate0);
3482 -------------------------------------------
3483
3484 else
3485 GL_CURRENCY_API.get_triangulation_rate(rec.currencya, rec.sob_ccy,
3486 l_bal_date0, rec.ex_rate_type, l_deno, l_numer, l_ex_rate0);
3487 l_last_unrel_date := l_bal_date0;
3488 l_avg_rate0 := nvl(l_avg_rate0, l_ex_rate0);
3489 l_unrel_start_rate:= l_ex_rate0;
3490 end if;
3491 end if;
3492
3493 l_first_batch_id := rec.batch_id;
3494
3495 ------------------------------------------------------------
3496 -- Get date and rate information for 2nd record of the pair
3497 ------------------------------------------------------------
3498 GL_CURRENCY_API.get_triangulation_rate(rec.currencya, rec.sob_ccy, l_bal_date1,
3499 rec.ex_rate_type, l_deno, l_numer, l_ex_rate1);
3500 l_unrel_end_rate := l_ex_rate1;
3501
3502 ------------------------------------------------------------
3503 -- Determine the increase and decrease
3504 ------------------------------------------------------------
3505 l_increase := 0;
3506 l_decrease := 0;
3507 l_pre_balance := 0;
3508
3509 if (sign(l_bal_amt0) + sign(l_bal_amt1)) > 0 then
3510 ------------------------------------------------------------
3511 --both balances are positives or one is positive, one is 0
3512 ------------------------------------------------------------
3513 if (l_bal_amt1 > l_bal_amt0) then
3514 l_increase := l_bal_amt1 - l_bal_amt0;
3515 l_pre_balance := l_bal_amt0;
3516 else
3517 l_decrease := l_bal_amt0 - l_bal_amt1;
3518 end if;
3519
3520 elsif (sign(l_bal_amt0) + sign(l_bal_amt1)) < 0 then
3521 ------------------------------------------------------------
3522 --both balances are negatives or one is negative, one is 0
3523 ------------------------------------------------------------
3524 if abs(l_bal_amt1) > abs(l_bal_amt0) then
3525 l_increase := abs(l_bal_amt1) - abs(l_bal_amt0);
3526 l_pre_balance := abs(l_bal_amt0);
3527 else
3528 l_decrease := l_bal_amt0 - l_bal_amt1;
3529 end if;
3530 else
3531 ------------------------------------------------------------
3532 -- balance A and B are on opposite side of 0 balance line
3533 -- or both balances = 0
3534 ------------------------------------------------------------
3535 l_increase := abs(l_bal_amt1);
3536 l_pre_balance := 0;
3537 l_decrease := l_bal_amt0;
3538 end if;
3539
3540 ------------------------------------------------------------------------
3541 -- Calculate unrealized G/L for the first record of the pair and insert
3542 -- into xtr_revaluation_details table
3543 ------------------------------------------------------------------------
3544 l_unrel_cur_gl := round((l_bal_amt0 * (l_unrel_end_rate - l_unrel_start_rate)), l_round);
3545 rec.trans_no := l_trans_no0;
3546 rec.fair_value := l_bal_amt0;
3547 rec.face_value := l_bal_amt0;
3548 rec.product_type := l_product0;
3549 rec.portfolio_code := l_port0;
3550 rec.effective_date := l_bal_date0;
3551 r_rd.effective_days:= rec.revldate - l_bal_date0;
3552 rec.trans_no := l_trans_no0;
3553 rec.period_start := l_last_unrel_date;
3554 rec.period_end := l_bal_date1;
3555 r_rd.transaction_period := rec.period_end - rec.period_start;
3556 r_rd.amount_type := 'CCYUNRL';
3557 if rec.fair_value >= 0 then
3558 rec.deal_subtype := 'INVEST';
3559 else
3560 rec.deal_subtype := 'FUND';
3561 end if;
3562
3563 ------------- AW 26/10/01 ---------------
3564 rec.reval_ex_rate_one := l_ex_rate1;
3565 --rec.reval_ex_rate_one := l_ex_rate0;
3566 -----------------------------------------
3567
3568 xtr_revl_unreal_log(rec, 0, 0, 0, 0, l_unrel_cur_gl, r_rd, retcode);
3569 if l_decrease <> 0 then
3570 ------------------------------------------------------------------------
3571 -- Calculate realized G/L for the second record of the pair and insert
3572 -- into xtr_revaluation_details table
3573 ------------------------------------------------------------------------
3574 l_rel_cur_gl := round((l_decrease * (l_ex_rate1 - l_avg_rate0)), l_round);
3575 rec.trans_no := l_trans_no1;
3576 rec.fair_value := l_bal_amt1;
3577 rec.face_value := l_bal_amt1;
3578 rec.effective_date := l_bal_date1;
3579 r_rd.effective_days := rec.effective_date - rec.revldate;
3580 rec.period_start := l_bal_date0;
3581 rec.period_end := l_bal_date1;
3582 rec.product_type := l_product1;
3583 rec.portfolio_code := l_port1;
3584 r_rd.transaction_period := rec.period_end - rec.period_start;
3585 rec.trans_no := l_trans_no1;
3586 l_avg_rate := l_avg_rate0;
3587 rec.reval_ex_rate_one := l_ex_rate1;
3588 r_rd.amount_type := 'CCYREAL';
3589 if rec.fair_value >= 0 then
3590 rec.deal_subtype := 'INVEST';
3591 else
3592 rec.deal_subtype := 'FUND';
3593 end if;
3594 xtr_revl_real_log(rec, 0, 0, 0, l_rel_cur_gl, r_rd, retcode);
3595 l_avg_rate := l_avg_rate0;
3596 end if;
3597
3598 l_last_batch_id := rec.batch_id;
3599
3600 if l_increase <> 0 then
3601 -----------------------------------------------------------
3602 -- Calcualte new average rate for second record of the pair.
3603 -----------------------------------------------------------
3604 l_avg_rate := ((l_increase * l_ex_rate1) + (l_pre_balance * l_avg_rate0))
3605 / abs(l_bal_amt1);
3606 else
3607 l_avg_rate := l_avg_rate0;
3608 end if;
3609
3610 -------------------------------------------------------------------------
3611 -- Update the first record of the pair in XTR_INTERGROUP_TRANSFERS table
3612 -------------------------------------------------------------------------
3613 update XTR_INTERGROUP_TRANSFERS
3614 set first_batch_id = nvl(first_batch_id, l_first_batch_id),
3615 last_batch_id = nvl(last_batch_id, l_last_batch_id),
3616 exchange_rate = nvl(exchange_rate, l_ex_rate0),
3617 average_exchange_rate = nvl(average_exchange_rate, l_avg_rate0)
3618 where company_code = rec.company_code
3619 and deal_number = rec.deal_no
3620 and transaction_number = l_trans_no0;
3621
3622 -------------------------------------------------------------------------
3623 -- Update the second record of the pair in XTR_INTERGROUP_TRANSFERS table
3624 -------------------------------------------------------------------------
3625 update XTR_INTERGROUP_TRANSFERS
3626 set average_exchange_rate = l_avg_rate
3627 where company_code = rec.company_code
3628 and deal_number = rec.deal_no
3629 and transaction_number = l_trans_no1;
3630 --------------------------------------------------------
3631 -- Reset rate and date for next pair records comparison
3632 --------------------------------------------------------
3633 l_unrel_start_rate := l_ex_rate1;
3634 l_last_unrel_date := l_bal_date1;
3635 l_avg_rate0 := l_avg_rate;
3636
3637 end if; -- C_PREV_BALANCE%FOUND
3638 CLOSE C_PREV_BALANCE;
3639
3640 Fetch C_CURR_BALANCE into l_bal_date1, l_bal_amt1, l_trans_no1, l_product1, l_port1;
3641
3642 End Loop;
3643 Close C_CURR_BALANCE;
3644
3645 ------------------------------------------------------------------
3646 -- For the last row, we always calculate unrealized currency G/L
3647 ------------------------------------------------------------------
3648 Open C_LAST_BALANCE;
3649 Fetch C_LAST_BALANCE into l_trans_no0, l_bal_date0, l_bal_amt0, l_first_batch_id,
3650 l_product0, l_port0;
3651
3652 if C_LAST_BALANCE%FOUND then
3653 if l_first_batch_id is null then
3654 GL_CURRENCY_API.get_triangulation_rate(rec.currencya, rec.sob_ccy,
3655 l_bal_date0, rec.ex_rate_type, l_deno, l_numer, l_ex_rate0);
3656 l_last_unrel_date := l_bal_date0;
3657 l_avg_rate0 := l_ex_rate0;
3658 l_unrel_start_rate:= l_ex_rate0;
3659 else
3660 l_pre_batch_id := xtr_get_pre_batchid(rec);
3661 if l_pre_batch_id <> -1 then
3662 select exchange_rate_one, (period_to +1)
3663 into l_unrel_start_rate, l_last_unrel_date
3664 from XTR_REVALUATION_DETAILS
3665 where batch_id = l_pre_batch_id
3666 and deal_no = rec.deal_no
3667 and deal_type = rec.deal_type
3668 and transaction_no = l_trans_no0
3669 and nvl(realized_flag, 'N') = 'N';
3670
3671 -------- AW 25/10/01 ------------
3672 l_ex_rate0 := l_unrel_start_rate;
3673 ---------------------------------
3674
3675 else
3676 GL_CURRENCY_API.get_triangulation_rate(rec.currencya, rec.sob_ccy,
3677 l_bal_date0, rec.ex_rate_type, l_deno, l_numer, l_ex_rate0);
3678 l_last_unrel_date := l_bal_date0;
3679 l_avg_rate0 := l_ex_rate0;
3680 l_unrel_start_rate:= l_ex_rate0;
3681 end if;
3682 end if;
3683 l_first_batch_id := rec.batch_id;
3684 if l_last_unrel_date <> rec.revldate then
3685 l_unrel_end_rate := l_bed_rate;
3686 else
3687 l_unrel_end_rate := l_ex_rate0;
3688 end if;
3689
3690 l_unrel_cur_gl := round((l_bal_amt0 * (l_unrel_end_rate - l_unrel_start_rate)), l_round);
3691 rec.trans_no := l_trans_no0;
3692 rec.fair_value := l_bal_amt0;
3693 rec.face_value := l_bal_amt0;
3694 rec.effective_date := l_bal_date0;
3695 r_rd.effective_days := l_bal_date0 - rec.revldate;
3696 rec.period_start := l_last_unrel_date;
3697 rec.period_end := rec.revldate;
3698 rec.product_type := l_product0;
3699 rec.portfolio_code := l_port0;
3700 r_rd.transaction_period := rec.period_end - rec.period_start;
3701 r_rd.amount_type := 'CCYUNRL';
3702 rec.reval_ex_rate_one := l_unrel_end_rate;
3703 if rec.fair_value >= 0 then
3704 rec.deal_subtype := 'INVEST';
3705 else
3706 rec.deal_subtype := 'FUND';
3707 end if;
3708 xtr_revl_unreal_log(rec, 0, 0, 0, 0, l_unrel_cur_gl, r_rd, retcode);
3709
3710 ------------------------------------------------------------------
3711 -- Update the last row into XTR_INTERGROUP_TRANSFERS table
3712 ------------------------------------------------------------------
3713 update XTR_INTERGROUP_TRANSFERS
3714 set first_batch_id = nvl(first_batch_id, l_first_batch_id),
3715 exchange_rate = nvl(exchange_rate, l_ex_rate0),
3716 average_exchange_rate = nvl(average_exchange_rate, l_avg_rate0)
3717 where company_code = rec.company_code
3718 and deal_number = rec.deal_no
3719 and transaction_number = rec.trans_no;
3720 End if;
3721 Close C_LAST_BALANCE;
3722
3723 retcode := 0;
3724 EXCEPTION
3725 when GL_CURRENCY_API.no_rate then
3726 if g_call_by_form = true then
3727 FND_MESSAGE.set_name('XTR', 'XTR_NO_GL_RATE');
3728 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
3729 APP_EXCEPTION.raise_exception;
3730 else
3731 set_err_log(retcode);
3732 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_RATE_CURRENCY_GL');
3733 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
3734 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
3735 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
3736 l_buf := FND_MESSAGE.GET;
3737 FND_FILE.put_line(fnd_file.log, l_buf);
3738 end if;
3739 when GL_CURRENCY_API.invalid_currency then
3740 if g_call_by_form = true then
3741 FND_MESSAGE.set_name('XTR', 'XTR_INVALID_CURRENCY');
3742 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
3743 FND_MESSAGE.set_token('CURRENCY', rec.currencya);
3744 APP_EXCEPTION.raise_exception;
3745 else
3746 set_err_log(retcode);
3747 FND_MESSAGE.SET_NAME('XTR', 'XTR_INVALID_CURRENCY_TYPE');
3748 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
3749 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
3750 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
3751 l_buf := FND_MESSAGE.GET;
3752 FND_FILE.put_line(fnd_file.log, l_buf);
3753 end if;
3754 when others then
3755 if g_call_by_form = true then
3756 APP_EXCEPTION.raise_exception;
3757 else
3758 set_err_log(retcode);
3759 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
3760 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
3761 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
3762 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
3763 l_buf := FND_MESSAGE.GET;
3764 FND_FILE.put_line(fnd_file.log, l_buf);
3765 end if;
3766 End;
3767 -----------------------------------------------------------------
3768 /*******************************************************************/
3769 /* This procedure pass one deal no for each company and calculate */
3770 /* (un)realized currency G/L and average exchange rate for the row */
3771 /* in xtr_rollover_transactions for deal type ONC */
3772 /*******************************************************************/
3773 PROCEDURE xtr_revl_onc_curr_gl(
3774 rec IN OUT NOCOPY xtr_revl_rec,
3775 retcode OUT NOCOPY NUMBER) IS
3776 l_buf Varchar2(500);
3777 l_trans_first_batch NUMBER;
3778 l_trans_last_batch NUMBER;
3779 l_batch_end_rate NUMBER;
3780 l_unrel_start_rate NUMBER;
3781 l_unrel_start_date DATE;
3782 l_unrel_end_rate NUMBER;
3783 l_unrel_end_date DATE;
3784 l_rel_start_date DATE;
3785 l_trans_avg_rate NUMBER;
3786 l_trans_gl_rate NUMBER;
3787 l_deno NUMBER;
3788 l_numer NUMBER;
3789 l_repay_amount NUMBER;
3790 l_first_batch_id NUMBER;
3791 l_pre_avg_rate NUMBER;
3792 l_cross_trans_no NUMBER;
3793 l_dummy NUMBER;
3794 l_sum NUMBER:= 0;
3795 l_pre_balance NUMBER;
3796 l_pre_rate NUMBER;
3797 l_pre_batch_id NUMBER;
3798 l_unrel_curr_gl NUMBER;
3799 l_rel_curr_gl NUMBER;
3800 l_round NUMBER;
3801 l_int_action VARCHAR2(7);
3802 l_accum_int NUMBER;
3803 r_rd XTR_REVALUATION_DETAILS%rowtype;
3804 l_rc NUMBER := 1; -- return code
3805 l_rowid VARCHAR2(30);
3806 r_err_log err_log; -- record type
3807
3808 cursor c_eligi_roll is
3809 select r.deal_subtype, r.transaction_number,
3810 decode(cp.parameter_value_code, 'TRADE', r.deal_date,
3811 r.start_date) start_date,
3812 r.maturity_date, r.balance_out, r.repay_amount,
3813 r.first_reval_batch_id, r.interest_rate,
3814 r.average_exchange_rate, r.cross_ref_to_trans, r.product_type,
3815 r.currency_exchange_rate, r.accum_int_action, r.accum_interest_bf --bug 2895074
3816 from XTR_ROLLOVER_TRANSACTIONS R,
3817 XTR_COMPANY_PARAMETERS CP
3818 where r.deal_number = rec.deal_no
3819 and cp.company_code = r.company_code
3820 and cp.parameter_code = 'ACCNT_TSDTM'
3821 and decode(cp.parameter_value_code, 'TRADE', r.deal_date,
3822 r.start_date) <= rec.revldate
3823 and last_reval_batch_id is null
3824 and status_code <> 'CANCELLED'
3825 order by transaction_number asc;
3826
3827 cursor c_trans_avg_rate is
3828 select balance_out, currency_exchange_rate,
3829 average_exchange_rate --bug 3041100
3830 from XTR_ROLLOVER_TRANSACTIONS
3831 where deal_number = rec.deal_no
3832 and cross_ref_to_trans = rec.trans_no;
3833
3834 Cursor CHK_LOCK_ROLL is
3835 select rowid
3836 from XTR_ROLLOVER_TRANSACTIONS
3837 Where DEAL_NUMBER = rec.deal_no
3838 And TRANSACTION_NUMBER = rec.trans_no
3839 And DEAL_TYPE = 'ONC'
3840 for update of FIRST_REVAL_BATCH_ID NOWAIT;
3841
3842 Begin
3843 retcode := 1;
3844 select rounding_factor
3845 into l_round
3846 from xtr_master_currencies_v
3847 where currency = rec.sob_ccy;
3848
3849 GL_CURRENCY_API.get_triangulation_rate
3850 (rec.reval_ccy, rec.sob_ccy, rec.revldate, rec.ex_rate_type,
3851 l_deno, l_numer, l_batch_end_rate);
3852
3853 for l_tmp in c_eligi_roll loop
3854 l_sum:=0; --bug 3041100
3855 l_trans_first_batch := NULL;
3856 l_trans_last_batch := NULL;
3857 rec.deal_subtype := l_tmp.deal_subtype;
3858 rec.trans_no := l_tmp.transaction_number;
3859 rec.start_date := l_tmp.start_date;
3860 rec.effective_date:= l_tmp.start_date;
3861 rec.maturity_date := l_tmp.maturity_date;
3862 rec.fair_value := l_tmp.balance_out;
3863 rec.face_value := l_tmp.balance_out;
3864 rec.transaction_rate := l_tmp.interest_rate;
3865 rec.reval_rate := null;
3866 rec.product_type := l_tmp.product_type;
3867 r_rd.effective_days := rec.effective_date - rec.revldate;
3868 r_rd.transaction_period := rec.effective_date - rec.revldate;
3869
3870 l_cross_trans_no := l_tmp.cross_ref_to_trans;
3871 l_repay_amount := l_tmp.repay_amount;
3872 l_first_batch_id := l_tmp.first_reval_batch_id;
3873 l_int_action := l_tmp.accum_int_action;
3874 l_accum_int := l_tmp.accum_interest_bf;
3875
3876 If l_first_batch_id is null then -- First time reval Section A
3877 -- Get GL rate on start date
3878 GL_CURRENCY_API.get_triangulation_rate
3879 (rec.reval_ccy, rec.sob_ccy, rec.effective_date, rec.ex_rate_type,
3880 l_deno, l_numer, l_trans_gl_rate);
3881 --FND_FILE.put_line(fnd_file.log, 'l_trans_gl_rate = '||l_trans_gl_rate);
3882 l_unrel_start_rate := l_trans_gl_rate;
3883 l_unrel_start_date := rec.start_date;
3884
3885 select count(*)
3886 into l_dummy
3887 from xtr_rollover_transactions
3888 where deal_number = rec.deal_no
3889 and cross_ref_to_trans = rec.trans_no;
3890
3891 if l_dummy > 1 then
3892 -- the transaction is the result of consolidating previous transactions
3893 -- Need to calculate new average rate for current transaction
3894 for l_tmp in c_trans_avg_rate loop
3895 l_pre_balance := l_tmp.balance_out;
3896 l_pre_rate := l_tmp.average_exchange_rate;
3897 l_sum := l_sum + (l_pre_balance * l_pre_rate);
3898 end loop;
3899 --Principal Incrs bug 2961502,2895074
3900 --This is to handle case where consolidating with Principal Increase
3901 if nvl(l_repay_amount,0)<0 then
3902 if l_int_action in ('COMPNET', 'RENEG') then -- bug 3672879
3903 l_trans_avg_rate := (l_sum +(l_trans_gl_rate*((-1)*l_repay_amount +
3904 nvl(l_accum_int,0)))) / rec.face_value;
3905 else
3906 l_trans_avg_rate := (l_sum+l_repay_amount*-1*l_trans_gl_rate)
3907 /(rec.face_value+l_repay_amount*-1);
3908 end if;
3909 elsif l_int_action in ('COMPNET', 'RENEG') then -- bug 3672879
3910 l_trans_avg_rate := (l_sum + (l_trans_gl_rate * l_accum_int))
3911 / (rec.face_value+ nvl(l_repay_amount,0));
3912 else
3913 l_trans_avg_rate := l_sum / (rec.face_value + nvl(l_repay_amount,0));
3914 end if;
3915
3916 elsif l_dummy = 1 then
3917 -- the transaction the result of reneg of previous transaction
3918 select nvl(average_exchange_rate,currency_exchange_rate),balance_out
3919 into l_pre_avg_rate, l_pre_balance
3920 from XTR_ROLLOVER_TRANSACTIONS
3921 where deal_number = rec.deal_no
3922 and cross_ref_to_trans = rec.trans_no;
3923 --begin bug 2895074, 2961502
3924 if nvl(l_repay_amount,0)<0 then --ONC Principal Increase Case
3925 --recalc average rate using the formula in HLD
3926 if l_int_action in ('COMPNET', 'RENEG') then -- bug 3672879
3927 l_trans_avg_rate := (l_pre_avg_rate*l_pre_balance +
3928 l_trans_gl_rate*((-1)*l_repay_amount+nvl(l_accum_int,0)))
3929 /rec.face_value;
3930 else
3931 l_trans_avg_rate := (l_pre_avg_rate*l_pre_balance+
3932 l_trans_gl_rate*l_repay_amount*-1)/(l_pre_balance+l_repay_amount*-1);
3933 end if;
3934 elsif l_int_action in ('COMPNET', 'RENEG') then -- bug 3672879
3935 l_trans_avg_rate := ((l_pre_avg_rate * l_pre_balance) +
3936 (l_trans_gl_rate * l_accum_int))
3937 / (rec.face_value+ nvl(l_repay_amount,0));
3938 else
3939 l_trans_avg_rate := l_pre_avg_rate;
3940 end if;
3941 else
3942 l_trans_avg_rate := l_trans_gl_rate;
3943 end if;
3944
3945 l_trans_first_batch := rec.batch_id;
3946
3947 else -- this deal is not the first time reval
3948 l_pre_batch_id := xtr_get_pre_batchid(rec);
3949 select exchange_rate_one
3950 into l_unrel_start_rate
3951 from XTR_REVALUATION_DETAILS
3952 where batch_id = l_pre_batch_id
3953 and deal_no = rec.deal_no
3954 and transaction_no = rec.trans_no
3955 and deal_type = rec.deal_type
3956 and nvl(realized_flag, 'N') = 'N';
3957
3958 l_unrel_start_date := rec.batch_start;
3959 end if; -- B section
3960
3961 if l_cross_trans_no is not null then
3962 -- the transaction is reneg or consolidated
3963 if rec.maturity_date >= rec.revldate then
3964 if rec.maturity_date = rec.revldate then
3965 l_trans_last_batch := rec.batch_id;
3966 l_unrel_end_rate := l_batch_end_rate;
3967 l_unrel_end_date := rec.revldate;
3968 else
3969 l_unrel_end_rate := l_batch_end_rate;
3970 l_unrel_end_date := rec.revldate;
3971 end if;
3972 else
3973 GL_CURRENCY_API.get_triangulation_rate
3974 (rec.reval_ccy, rec.sob_ccy, rec.maturity_date,
3975 rec.ex_rate_type, l_deno, l_numer, l_unrel_end_rate);
3976 l_unrel_end_date := rec.maturity_date;
3977 l_trans_last_batch := rec.batch_id;
3978 end if;
3979 else -- the current transctions is not reneg or consolidated
3980 l_unrel_end_rate := l_batch_end_rate;
3981 l_unrel_end_date := rec.revldate;
3982 end if; -- C section
3983 l_unrel_curr_gl :=round((rec.face_value *(l_unrel_end_rate -l_unrel_start_rate)), l_round);
3984 if rec.deal_subtype = 'FUND' then
3985 l_unrel_curr_gl := l_unrel_curr_gl * (-1);
3986 end if;
3987
3988 -- Insert period unrealized G/L amount for the transaction
3989 rec.period_start := l_unrel_start_date;
3990 rec.period_end := l_unrel_end_date;
3991 rec.reval_ex_rate_one := l_unrel_end_rate;
3992 r_rd.amount_type := 'CCYUNRL';
3993 xtr_revl_unreal_log(rec, 0, 0, 0, 0, l_unrel_curr_gl, r_rd, l_rc);
3994
3995 --if (l_first_batch_id is NULL) and (l_repay_amount <> 0) then
3996 if (l_first_batch_id is NULL) and (l_repay_amount > 0 )then --bug 2895074
3997 -- exclude ONC Principal Increase, l_repay_amount<0.
3998 -- this condition is met if the transaction is reneg or consolidated
3999 -- we should insert a realized row
4000 -- if l_int_action in ('COMPNET', 'RENEG') then
4001 -- l_rel_curr_gl := round(((rec.face_value - l_pre_balance) * (l_trans_gl_rate - l_trans_avg_rate)), l_round);
4002 --else
4003 l_rel_curr_gl := round((l_repay_amount * (l_trans_gl_rate - l_trans_avg_rate)), l_round);
4004 -- end if;
4005 if rec.deal_subtype = 'FUND' then
4006 l_rel_curr_gl := l_rel_curr_gl * (-1);
4007 end if;
4008
4009 -- Insert a realized G/L row into XTR_REVALUATION_DETAILS table
4010 select min(start_date)
4011 into l_rel_start_date
4012 from XTR_ROLLOVER_TRANSACTIONS
4013 where cross_ref_to_trans = rec.trans_no;
4014
4015 rec.period_start := l_rel_start_date;
4016 rec.period_end := rec.start_date;
4017 rec.fair_value := l_repay_amount;
4018 rec.reval_ex_rate_one := l_trans_gl_rate;
4019 r_rd.amount_type := 'CCYREAL';
4020 xtr_revl_real_log(rec, 0, 0, 0, l_rel_curr_gl, r_rd, l_rc);
4021 end if;
4022
4023 -- Update rollover table to update column values
4024 Open CHK_LOCK_ROLL;
4025 Fetch CHK_LOCK_ROLL into l_rowid;
4026 if CHK_LOCK_ROLL%FOUND then
4027 close CHK_LOCK_ROLL;
4028 Update XTR_ROLLOVER_TRANSACTIONS
4029 Set FIRST_REVAL_BATCH_ID = nvl(l_trans_first_batch, FIRST_REVAL_BATCH_ID),
4030 LAST_REVAL_BATCH_ID = nvl(l_trans_last_batch, LAST_REVAL_BATCH_ID),
4031 CURRENCY_EXCHANGE_RATE = nvl(CURRENCY_EXCHANGE_RATE, l_trans_gl_rate),
4032 AVERAGE_EXCHANGE_RATE = nvl(AVERAGE_EXCHANGE_RATE, l_trans_avg_rate)
4033 Where rowid = l_rowid;
4034 else
4035 Close CHK_LOCK_ROLL;
4036 end if;
4037
4038 end loop;
4039
4040 retcode := 0;
4041 EXCEPTION
4042 when GL_CURRENCY_API.no_rate then
4043 if g_call_by_form = true then
4044 FND_MESSAGE.set_name('XTR', 'XTR_NO_GL_RATE');
4045 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
4046 APP_EXCEPTION.raise_exception;
4047 else
4048 set_err_log(retcode);
4049 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_RATE_CURRENCY_GL');
4050 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
4051 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
4052 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
4053 l_buf := FND_MESSAGE.GET;
4054 FND_FILE.put_line(fnd_file.log, l_buf);
4055 end if;
4056 when GL_CURRENCY_API.invalid_currency then
4057 if g_call_by_form = true then
4058 FND_MESSAGE.set_name('XTR', 'XTR_INVALID_CURRENCY');
4059 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
4060 FND_MESSAGE.set_token('CURRENCY', rec.currencya);
4061 APP_EXCEPTION.raise_exception;
4062 else
4063 set_err_log(retcode);
4064 FND_MESSAGE.SET_NAME('XTR', 'XTR_INVALID_CURRENCY_TYPE');
4065 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
4066 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
4067 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
4068 l_buf := FND_MESSAGE.GET;
4069 FND_FILE.put_line(fnd_file.log, l_buf);
4070 end if;
4071 when others then
4072 if g_call_by_form = true then
4073 APP_EXCEPTION.raise_exception;
4074 else
4075 set_err_log(retcode);
4076 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
4077 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
4078 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
4079 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
4080 l_buf := FND_MESSAGE.GET;
4081 FND_FILE.put_line(fnd_file.log, l_buf);
4082 end if;
4083 end;
4084 ---------------------------------------------------------------
4085 /***************************************************************/
4086 /* Get fair value, NI discount amount, cummulative unrealized */
4087 /* G/L, reval_rate, from previous batch for the deal. */
4088 /* If there is not previous batch, then return: */
4089 /* fair value = initial fair value. */
4090 /* NI discount amount = Balance out - interest */
4091 /* cummulative unrealizd G/L = 0 */
4092 /* reval rate = rec.transaction_rate */
4093 /***************************************************************/
4094 PROCEDURE xtr_get_fv_from_batch(
4095 rec IN xtr_revl_rec,
4096 p_fair_value OUT NOCOPY NUMBER,
4097 p_ni_disc_amt OUT NOCOPY NUMBER,
4098 p_cumm_unrel_gl OUT NOCOPY NUMBER,
4099 p_reval_rate OUT NOCOPY NUMBER) IS
4100
4101 l_batch_id xtr_batches.BATCH_ID%type; -- previous batch id
4102 l_found boolean := FALSE;
4103 r_err_log err_log; -- record type
4104 retcode NUMBER;
4105 l_buf Varchar2(500);
4106 cursor c_fv is
4107 select fair_value, cumm_gain_loss_amount, reval_rate
4108 from xtr_revaluation_details
4109 where DEAL_NO = rec.deal_no
4110 and TRANSACTION_NO = rec.trans_no
4111 and nvl(realized_flag, 'N') = 'N'
4112 and BATCH_ID = l_batch_id
4113 order by period_to desc; -- bug 4214521 issue 1
4114
4115 cursor c_disc is
4116 select ni_disc_amount
4117 from xtr_revaluation_details
4118 where DEAL_NO = rec.deal_no
4119 and TRANSACTION_NO = rec.trans_no
4120 and BATCH_ID = l_batch_id;
4121
4122 Begin
4123 l_batch_id := xtr_get_pre_batchid(rec);
4124
4125 if l_batch_id <> -1 then
4126 open c_fv;
4127 fetch c_fv into p_fair_value, p_cumm_unrel_gl, p_reval_rate;
4128 if p_fair_value is not null then
4129 l_found := TRUE;
4130 end if;
4131 close c_fv;
4132 end if;
4133
4134 if l_found = false then
4135 if rec.deal_type in ('NI', 'ONC') then
4136 select initial_fair_value
4137 into p_fair_value
4138 from XTR_ROLLOVER_TRANSACTIONS
4139 where deal_number = rec.deal_no
4140 and transaction_number = rec.trans_no;
4141 else
4142 select initial_fair_value
4143 into p_fair_value
4144 from XTR_DEALS
4145 where deal_no = rec.deal_no;
4146 end if;
4147 p_reval_rate := rec.transaction_rate;
4148 p_cumm_unrel_gl := 0;
4149 end if;
4150
4151 if rec.deal_type = 'NI' then
4152 open c_disc;
4153 fetch c_disc into p_ni_disc_amt;
4154 if p_ni_disc_amt is not null then
4155 l_found := TRUE;
4156 end if;
4157 close c_disc;
4158
4159 if l_found = false then
4160 select interest
4161 into p_ni_disc_amt
4162 from xtr_rollover_transactions
4163 where deal_number = rec.deal_no
4164 and transaction_number = rec.trans_no;
4165 end if;
4166 end if;
4167
4168 EXCEPTION
4169 when others then
4170 if g_call_by_form = true then
4171 APP_EXCEPTION.raise_exception;
4172 else
4173 set_err_log(retcode);
4174 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
4175 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
4176 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
4177 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
4178 l_buf := FND_MESSAGE.GET;
4179 FND_FILE.put_line(fnd_file.log, l_buf);
4180 end if;
4181 end xtr_get_fv_from_batch;
4182
4183 --------------------------------------------------------
4184 /*********************************************************/
4185 /* this function returns the initial fairvalue when deal */
4186 /* inception. we need this value for calculating the P/L*/
4187 /*********************************************************/
4188 FUNCTION xtr_init_fv(rec IN xtr_revl_rec)
4189 return NUMBER is
4190 l_buf Varchar2(500);
4191 init_fv NUMBER := NULL;
4192 l_inclu_cost VARCHAR2(30) := NULL;
4193 l_discount VARCHAR2(1); -- for IRS
4194 l_brk_amt NUMBER;
4195 l_pre_action VARCHAR2(7);
4196 l_pre_amt NUMBER;
4197 l_face_value NUMBER;
4198 l_int_rate NUMBER;
4199 l_deal_subtype VARCHAR2(7);
4200 r_err_log err_log; -- record type
4201 retcode NUMBER;
4202
4203 begin
4204 select PARAMETER_VALUE_CODE -- determine if we are going to include transaction cost in deal type
4205 into l_inclu_cost
4206 from xtr_company_parameters
4207 where company_code = rec.company_code
4208 and parameter_code = C_INCOST;
4209
4210 if rec.deal_type = 'FRA' then
4211 init_fv := 0;
4212
4213 elsif rec.deal_type = 'IRS' then
4214 select discount
4215 into l_discount
4216 from xtr_deals
4217 where deal_no = rec.deal_no;
4218
4219 if nvl(l_discount, 'N') = 'N' then -- No principal cashflow, IFV = 0
4220 init_fv := 0;
4221 else
4222 select face_value_amount, deal_subtype
4223 into init_fv, l_deal_subtype
4224 from xtr_deals
4225 where deal_no = rec.deal_no;
4226
4227 if l_deal_subtype = 'FUND' then
4228 init_fv := init_fv * (-1);
4229 end if;
4230 end if;
4231
4232 elsif rec.deal_type = 'FX' then
4233 if l_inclu_cost = 'Y' then
4234 select brokerage_amount
4235 into init_fv
4236 from xtr_deals
4237 where deal_no = rec.deal_no;
4238 else
4239 init_fv := 0;
4240 end if;
4241
4242 elsif rec.deal_type in ('BDO', 'FXO', 'IRO', 'SWPTN') then
4243 -- For these Options, no transaction cost column shown on form,
4244 -- so we don't need to consider for now.
4245 select premium_action, premium_amount
4246 into l_pre_action, l_pre_amt
4247 from xtr_deals
4248 where deal_no = rec.deal_no;
4249
4250 if l_pre_action = 'PAY' then
4251 init_fv := l_pre_amt;
4252 elsif l_pre_action = 'REC' then
4253 init_fv := l_pre_amt * (-1);
4254 end if;
4255
4256 elsif rec.deal_type = 'NI' then
4257 select decode(l_inclu_cost, 'N', (BALANCE_OUT - INTEREST),
4258 (BALANCE_OUT - INTEREST + nvl(BROKERAGE_AMOUNT, 0))),
4259 deal_subtype
4260 into init_fv, l_deal_subtype
4261 from xtr_rollover_transactions
4262 where DEAL_NUMBER = rec.deal_no
4263 and TRANSACTION_NUMBER = rec.trans_no;
4264
4265 if l_deal_subtype in ('SHORT', 'ISSUE') then
4266 init_fv := init_fv * (-1);
4267 end if;
4268
4269 elsif rec.deal_type = 'BOND' then
4270 select maturity_amount, brokerage_amount,
4271 nvl(base_rate, capital_price), deal_subtype
4272 into l_face_value, l_brk_amt, l_int_rate, l_deal_subtype
4273 from xtr_deals
4274 where deal_no = rec.deal_no;
4275
4276 if l_inclu_cost = 'Y' then
4277 init_fv := (l_face_value * l_int_rate)/100
4278 + l_brk_amt;
4279 else
4280 init_fv := (l_face_value * l_int_rate)/100;
4281 end if;
4282
4283 if l_deal_subtype in ('SHORT', 'ISSUE') then
4284 init_fv := init_fv * (-1);
4285 end if;
4286
4287 elsif rec.deal_type = 'STOCK' then
4288 select start_amount, brokerage_amount
4289 into l_face_value, l_brk_amt
4290 from XTR_DEALS
4291 where deal_no = rec.deal_no;
4292
4293 if l_inclu_cost = 'Y' then
4294 init_fv := l_face_value + nvl(l_brk_amt, 0);
4295 else
4296 init_fv := l_face_value;
4297 end if;
4298
4299 elsif rec.deal_type in ('RTMM', 'TMM') then
4300 select face_value_amount, brokerage_amount, deal_subtype
4301 into l_face_value, l_brk_amt, l_deal_subtype
4302 from xtr_deals
4303 where deal_no = rec.deal_no;
4304
4305 if l_inclu_cost = 'Y' then
4306 init_fv := l_face_value + nvl(l_brk_amt, 0);
4307 else
4308 init_fv := l_face_value;
4309 end if;
4310
4311 if l_deal_subtype = 'FUND' then
4312 init_fv := init_fv * (-1);
4313 end if;
4314
4315 elsif rec.deal_type = 'ONC' then
4316 -- ONC's FV is for reference only. We don't take it to calculate G/L.
4317 if rec.deal_subtype = 'INVEST' then
4318 init_fv := rec.face_value;
4319 else
4320 init_fv := rec.face_value * (-1);
4321 end if;
4322
4323 elsif rec.deal_type = 'IG' then
4324 -- IG's FV is for reference only. We don't take it to calculate G/L.
4325 select BALANCE_OUT
4326 into init_fv
4327 from XTR_INTERGROUP_TRANSFERS_V
4328 where DEAL_NUMBER = rec.deal_no
4329 and TRANSACTION_NUMBER = rec.trans_no;
4330
4331 elsif rec.deal_type = 'CA' then
4332 -- CA's FV is for reference only. We don't take it to calculate G/L.
4333 select STATEMENT_BALANCE
4334 into init_fv
4335 from XTR_BANK_BALANCES_V
4336 where company_code = rec.company_code
4337 and account_number = rec.account_no
4338 and BALANCE_DATE <= rec.revldate;
4339 end if;
4340 return init_fv;
4341
4342 EXCEPTION
4343 when others then
4344 if g_call_by_form = true then
4345 APP_EXCEPTION.raise_exception;
4346 else
4347 set_err_log(retcode);
4348 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
4349 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
4350 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
4351 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
4352 l_buf := FND_MESSAGE.GET;
4353 FND_FILE.put_line(fnd_file.log, l_buf);
4354 end if;
4355 end xtr_init_fv;
4356
4357 -------------------------------------------------------------------
4358 Procedure xtr_ins_init_fv
4359 (p_company_code in XTR_PARTY_INFO.PARTY_CODE%TYPE,
4360 p_deal_no in XTR_DEALS.DEAL_NO%TYPE,
4361 p_deal_type in XTR_DEALS.DEAL_TYPE%TYPE,
4362 p_transaction_no in XTR_DEALS.TRANSACTION_NO%TYPE,
4363 p_day_count_type in XTR_DEALS.DAY_COUNT_TYPE%TYPE
4364 )
4365 IS
4366 --
4367 -- Purpose: This Procedure inserts the INITIAL_FAIR_VALUE into the
4368 -- tables XTR_DEALS or XTR_ROLLOVER_TRANSACTIONS or others depending
4369 -- on the Deal Type.This will be callled from the forms either after
4370 -- the POST-DATA-BASE-COMMIT Trigger or POST-INSERT Triggers or other
4371 -- appropriate triggers.
4372 -- This procedure uses xtr_reval_process_p.xtr_init_fv() for getting
4373 -- the initial fair value.
4374 -- MODIFICATION HISTORY
4375 -- Person Date Comments
4376 -- --------- ----------- --------------------------------------------------
4377 -- Rvallams 22-May-2001 Initial Creation
4378 -- Declare program variables as shown above
4379 rec xtr_revl_rec;
4380 fv number;
4381 l_inclu_cost VARCHAR2(30);
4382 l_brk_amt NUMBER;
4383 l_face_value NUMBER;
4384 l_start_date DATE;
4385 l_end_date DATE;
4386 l_year_calc_type VARCHAR2(15);
4387 l_no_of_days NUMBER;
4388 l_year_basis NUMBER;
4389 l_disc_yield VARCHAR2(8);
4390 l_all_in_rate NUMBER;
4391
4392 BEGIN
4393 rec.company_code := p_company_code;
4394 rec.deal_type := p_deal_type;
4395 rec.deal_no := p_deal_no;
4396 rec.trans_no := p_transaction_no;
4397 fv := xtr_init_fv(rec);
4398
4399 If p_deal_type in ('FRA', 'IRS','FX','BDO', 'FXO', 'IRO', 'STOCK',
4400 'SWPTN','BOND','RTMM', 'TMM') then
4401 If p_transaction_no is NOT NULL then
4402 update xtr_deals set initial_fair_value = fv
4403 where deal_no = p_deal_no and
4404 deal_type = p_deal_type and
4405 transaction_no = p_transaction_no and
4406 company_code = p_company_code;
4407 Else
4408 update xtr_deals set initial_fair_value = fv
4409 where deal_no = p_deal_no and
4410 deal_type = p_deal_type and
4411 company_code = p_company_code;
4412 End If;
4413 Elsif p_deal_type in ('NI') then
4414 If p_transaction_no is NOT NULL then
4415 update xtr_rollover_transactions set initial_fair_value = fv
4416 where deal_number = p_deal_no and
4417 deal_type = p_deal_type and
4418 transaction_number = p_transaction_no and
4419 company_code = p_company_code;
4420 Else
4421 update xtr_rollover_transactions set initial_fair_value = fv
4422 where ((deal_number = p_deal_no) or (trans_closeout_no = p_deal_no)) and
4423 deal_type = p_deal_type and
4424 company_code = p_company_code;
4425 End if;
4426
4427 /* AW Bug 2184427
4428 -- Also insert ALL_IN_RATE to xtr_rollover_transactions table
4429 select PARAMETER_VALUE_CODE
4430 into l_inclu_cost
4431 from XTR_COMPANY_PARAMETERS
4432 where company_code = p_company_code
4433 and parameter_code = C_INCOST;
4434 */
4435
4436 -------------------------------------------------------
4437 -- AW Bug 2184427 Should use Yield rate calculation.
4438 -------------------------------------------------------
4439 select rt.balance_out, nvl(rt.brokerage_amount, 0), d.year_calc_type,
4440 d.calc_basis, rt.start_date, rt.maturity_date
4441 into l_face_value, l_brk_amt, l_year_calc_type, l_disc_yield, l_start_date, l_end_date
4442 from xtr_deals D,
4443 xtr_rollover_transactions RT
4444 where D.deal_no = p_deal_no
4445 and D.deal_no = RT.deal_number
4446 and RT.transaction_number = p_transaction_no;
4447
4448 -------------------------------------------------------
4449 -- AW Bug 2184427 Should use Yield rate calculation.
4450 -------------------------------------------------------
4451 XTR_CALC_P.calc_days_run(l_start_date, l_end_date, l_year_calc_type,
4452 l_no_of_days, l_year_basis, null, p_day_count_type, 'Y');
4453
4454 -------------------------------------------------------
4455 -- AW Bug 2184427 Should use Yield rate calculation.
4456 -------------------------------------------------------
4457 l_all_in_rate := (l_year_basis * 100) / l_no_of_days * (l_face_value / abs(fv) - 1);
4458
4459 /* AW Bug 2184427 Should use Yield rate calculation.
4460 if l_inclu_cost = 'Y' then
4461 select rt.balance_out, nvl(rt.brokerage_amount, 0), d.year_calc_type,
4462 d.calc_basis, rt.start_date, rt.maturity_date
4463 into l_face_value, l_brk_amt, l_year_calc_type, l_disc_yield,
4464 l_start_date, l_end_date
4465 from xtr_deals D, xtr_rollover_transactions RT
4466 where D.deal_no = p_deal_no
4467 and D.deal_no = RT.deal_number
4468 and RT.transaction_number = p_transaction_no;
4469
4470 if l_brk_amt <> 0 then
4471 XTR_CALC_P.calc_days_run(l_start_date, l_end_date, l_year_calc_type,
4472 l_no_of_days, l_year_basis, null, p_day_count_type, 'Y');
4473 if l_disc_yield = 'DISCOUNT' then -- 'DISCOUNT'
4474 l_all_in_rate := ((l_face_value - abs(fv)) * (l_year_basis * 100))/
4475 (l_no_of_days * l_face_value);
4476 else -- 'YIELD'
4477 l_all_in_rate := (l_year_basis * 100) / l_no_of_days *
4478 (l_face_value / abs(fv) - 1);
4479 end if;
4480
4481 else
4482
4483 select interest_rate
4484 into l_all_in_rate
4485 from xtr_rollover_transactions
4486 where deal_number = p_deal_no
4487 and transaction_number = p_transaction_no;
4488
4489 end if;
4490
4491 else -- not including cost
4492
4493 select interest_rate
4494 into l_all_in_rate
4495 from xtr_rollover_transactions
4496 where deal_number = p_deal_no
4497 and transaction_number = p_transaction_no;
4498
4499 end if;
4500 */
4501
4502 If p_transaction_no is NOT NULL then
4503 update xtr_rollover_transactions
4504 set all_in_rate = l_all_in_rate
4505 where deal_number = p_deal_no and
4506 deal_type = p_deal_type and
4507 transaction_number = p_transaction_no and
4508 company_code = p_company_code;
4509 Else
4510 update xtr_rollover_transactions
4511 set all_in_rate = l_all_in_rate
4512 where ((deal_number = p_deal_no) or (trans_closeout_no = p_deal_no)) and
4513 deal_type = p_deal_type and
4514 company_code = p_company_code;
4515 End if;
4516
4517 Elsif p_deal_type in ('ONC') then
4518 If p_transaction_no is NOT NULL then
4519 update xtr_rollover_transactions set initial_fair_value = fv
4520 where deal_number = p_deal_no and
4521 deal_type = p_deal_type and
4522 transaction_number = p_transaction_no and
4523 company_code = p_company_code;
4524 Else
4525 update xtr_rollover_transactions set initial_fair_value = fv
4526 where deal_number = p_deal_no and
4527 deal_type = p_deal_type and
4528 company_code = p_company_code;
4529 End If;
4530 Elsif p_deal_type in ('CA','IG') then
4531 Null; -- Not Applicable for these Deal Types;
4532 End If;
4533 EXCEPTION
4534 WHEN others THEN
4535 APP_EXCEPTION.raise_exception;
4536 END xtr_ins_init_fv;
4537
4538 --------------------------------------------------------
4539 /********************************************************/
4540 /* This procedure return ending fair value for each deal*/
4541 /* type in order to calculate realized G/L */
4542 /********************************************************/
4543 PROCEDURE xtr_end_fv(
4544 rec IN OUT NOCOPY xtr_revl_rec,
4545 end_fv OUT NOCOPY NUMBER) IS
4546 l_buff Varchar2(500);
4547 l_rc NUMBER := 0; -- return code
4548 l_value_date DATE;
4549 l_gl_rate NUMBER; -- GL daily rate for FX FWD
4550 l_sob_ccy VARCHAR2(15);
4551 l_base_ccy VARCHAR2(15);
4552 l_contra_ccy VARCHAR2(15);
4553 l_base_amt NUMBER;
4554 l_contra_amt NUMBER;
4555 l_buf NUMBER;
4556 p_sob_curr_rate NUMBER;
4557 l_spot_rate NUMBER;
4558 l_reverse BOOLEAN;
4559 l_round NUMBER;
4560 r_err_log err_log; -- record type
4561 l_market_set VARCHAR2(30);
4562 r_md_in xtr_market_data_p.md_from_set_in_rec_type;
4563 r_md_out xtr_market_data_p.md_from_set_out_rec_type;
4564 l_buy_amt NUMBER;
4565 l_sell_amt NUMBER;
4566 retcode NUMBER;
4567
4568 begin
4569 select rounding_factor
4570 into l_round
4571 from xtr_master_currencies_v
4572 where currency = rec.reval_ccy;
4573
4574 /*********** TMM ending FV **********************/
4575 if rec.deal_type = 'TMM' then
4576 select R.BALANCE_OUT_BF
4577 into end_fv
4578 from XTR_ROLLOVER_TRANSACTIONS R
4579 where deal_number = rec.deal_no
4580 and transaction_number =
4581 (select max(transaction_number)
4582 from xtr_rollover_transactions
4583 where deal_number = rec.deal_no);
4584
4585 if rec.deal_subtype = 'FUND' then
4586 end_fv := end_fv * (-1);
4587 end if;
4588
4589 /*********** IRS ending FV **********************/
4590 elsif rec.deal_type = 'IRS' then
4591 end_fv := 0;
4592
4593 /*********** FRA ending FV **********************/
4594 elsif rec.deal_type = 'FRA' then
4595 end_fv := rec.settle_amount;
4596 if rec.settle_date is null then
4597 set_err_log(retcode);
4598 FND_MESSAGE.SET_NAME('XTR', 'XTR_SETTLE_DEAL');
4599 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
4600 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
4601 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
4602 l_buff := FND_MESSAGE.GET;
4603 FND_FILE.put_line(fnd_file.log, l_buff);
4604 end if;
4605 if rec.settle_action = 'PAY' then
4606 end_fv := end_fv * (-1);
4607 end if;
4608
4609 /*********** NI, BOND ending FV **********************/
4610 elsif rec.deal_type in ('NI', 'BOND') then
4611 -- For NI, it's the BALANCE_OUT in parcel level.
4612 -- For BOND, it's the MATURITY_BALANCE_AMOUNT in deal level
4613 end_fv := rec.face_value;
4614
4615 if rec.deal_subtype in ('SHORT', 'ISSUE') then
4616 end_fv := end_fv * (-1);
4617 end if;
4618
4619 /*********** BDO, IRO ending FV **********************/
4620 elsif rec.deal_type in ('BDO', 'IRO') then
4621 if rec.settle_amount is not null then -- Cash settlement
4622 end_fv := rec.settle_amount;
4623 if rec.settle_action = 'PAY' then
4624 end_fv := end_fv * (-1);
4625 end if;
4626 else
4627 end_fv := 0;
4628 end if;
4629
4630 /*********** SWPTN ending FV **********************/
4631 elsif rec.deal_type = 'SWPTN' then
4632 -- Calculate ending fair value when status = 'EXERCISED'
4633 if rec.settle_amount is not null then -- Cash settlement
4634 end_fv := rec.settle_amount;
4635 if rec.settle_action = 'PAY' then
4636 end_fv := end_fv * (-1);
4637 end if;
4638 else -- Create Swap deal
4639 if rec.cap_or_floor = 'PAY' then -- paying leg is the default leg of Swap deal
4640 select decode(discount,'Y', (initial_fair_value - face_value_amount),
4641 initial_fair_value)
4642 into end_fv
4643 from XTR_DEALS
4644 where deal_subtype = 'FUND'
4645 and int_swap_ref = (select swap_ref
4646 from XTR_DEALS
4647 where deal_no = rec.deal_no);
4648 else -- 'REC'
4649 select decode(discount,'Y', (initial_fair_value - face_value_amount),
4650 initial_fair_value)
4651 into end_fv
4652 from XTR_DEALS
4653 where deal_subtype = 'INVEST'
4654 and int_swap_ref = (select swap_ref
4655 from XTR_DEALS
4656 where deal_no = rec.deal_no);
4657 End if;
4658 End if;
4659
4660 /*********** FXO ending FV **********************/
4661 elsif rec.deal_type = 'FXO' then
4662 if rec.status_code in ('EXPIRED', 'CURRENT') then
4663 end_fv := 0;
4664 elsif rec.status_code in ('EXERCISED') then
4665 -- the FXO is exercised and become physical FX deals
4666 l_base_ccy := rec.currencya; -- buy currency
4667 l_contra_ccy := rec.currencyb; -- sell currency
4668 l_market_set := rec.MARKET_DATA_SET;
4669 xtr_revl_get_mds(l_market_set, rec);
4670 l_sell_amt := rec.fxo_sell_ref_amount; -- deal sell amount
4671 l_buy_amt := rec.face_value; -- deal buy amount
4672 xtr_get_base_contra(l_base_ccy, l_contra_ccy, l_reverse);
4673
4674 if l_reverse = TRUE then -- buy currency is different from system base currency
4675 if rec.currencya = rec.reval_ccy then -- premium currency is buy currency
4676 end_fv := l_buy_amt - (l_sell_amt * rec.reval_rate);
4677 else -- premium currency is sell currency
4678 end_fv := l_buy_amt / rec.reval_rate - l_sell_amt;
4679 end if;
4680 else -- buy currency is the same as system base currency
4681 if rec.currencya = rec.reval_ccy then
4682 end_fv := l_buy_amt - (l_sell_amt /rec.reval_rate);
4683 else
4684 end_fv := l_buy_amt * rec.reval_rate - l_sell_amt;
4685 end if;
4686 end if;
4687 end if;
4688
4689 /*********** FX ending FV **********************/
4690 elsif rec.deal_type = 'FX' then
4691 if rec.deal_subtype = 'FORWARD' then
4692 xtr_revl_get_fairvalue(rec, end_fv, retcode);
4693 elsif rec.deal_subtype = 'SPOT' then
4694 end_fv := 0;
4695 end if;
4696 end_fv := round(end_fv, l_round);
4697
4698 /*********** RTMM ending FV **********************/
4699 elsif rec.deal_type = 'RTMM' then
4700 end_fv := null; -- Ending fv has to be provided by user.
4701
4702 /*********** ONC, CA, IG ending FV **********************/
4703 elsif rec.deal_type in ('ONC', 'CA', 'IG') then
4704 -- We don't need to calcualte G/L for ONC, CA, and IG. So EFV does not matter
4705 end_fv := 0 ;
4706 else
4707 raise e_invalid_dealtype;
4708 end if;
4709 end_fv := round(end_fv, l_round);
4710
4711 EXCEPTION
4712 when GL_CURRENCY_API.no_rate then
4713 if g_call_by_form = true then
4714 FND_MESSAGE.set_name('XTR', 'XTR_NO_GL_RATE');
4715 APP_EXCEPTION.raise_exception;
4716 else
4717 set_err_log(retcode);
4718 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_RATE_CURRENCY_GL');
4719 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
4720 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
4721 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
4722 l_buff := FND_MESSAGE.GET;
4723 FND_FILE.put_line(fnd_file.log, l_buff);
4724 end if;
4725 when GL_CURRENCY_API.invalid_currency then
4726 if g_call_by_form = true then
4727 FND_MESSAGE.set_name('XTR', 'XTR_INVALID_CURRENCY');
4728 APP_EXCEPTION.raise_exception;
4729 else
4730 set_err_log(retcode);
4731 FND_MESSAGE.SET_NAME('XTR', 'XTR_INVALID_CURRENCY_TYPE');
4732 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
4733 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
4734 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
4735 l_buff := FND_MESSAGE.GET;
4736 FND_FILE.put_line(fnd_file.log, l_buff);
4737 end if;
4738 when others then
4739 if g_call_by_form = true then
4740 APP_EXCEPTION.raise_exception;
4741 else
4742 set_err_log(retcode);
4743 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
4744 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
4745 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
4746 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
4747 l_buff := FND_MESSAGE.GET;
4748 FND_FILE.put_line(fnd_file.log, l_buff);
4749 end if;
4750 end xtr_end_fv;
4751 --------------------------------------------------------
4752 /*********************************************************/
4753 /* This function input current batch Id and company to */
4754 /* find the most recent batch ID */
4755 /* It returns either batch ID or -1(no previous batch ID)*/
4756 /*********************************************************/
4757 FUNCTION xtr_get_pre_batchid(
4758 rec IN xtr_revl_rec) return NUMBER is
4759
4760 cursor c_batchid is
4761 select batch_id
4762 from xtr_batches
4763 where COMPANY_CODE = rec.company_code
4764 and PERIOD_END = (select max(b.period_end)
4765 from xtr_batches b, xtr_revaluation_details r
4766 where b.BATCH_ID <> rec.batch_id
4767 and r.deal_no = rec.deal_no
4768 and b.batch_id = r.batch_id)
4769 and nvl(upgrade_batch, 'N') <> 'Y'
4770 and batch_type is NULL;
4771
4772 begin
4773 for l_tmp in c_batchid loop
4774 return l_tmp.BATCH_ID;
4775 end loop;
4776 return -1;
4777 end xtr_get_pre_batchid;
4778
4779 --------------------------------------------------------
4780 /****************************************************************/
4781 /* This procedure get forward rate for the following deal types:*/
4782 /* FRA, IRO, IRS, and TMM */
4783 /* For FRA and IRO, start_date and maturity_date come from */
4784 /* XTR_DEALS table. */
4785 /* For TMM and IRS, start_date and maturity_date come from */
4786 /* XTR_ROLLOVER_TRANSACTIONS table */
4787 /****************************************************************/
4788 PROCEDURE xtr_revl_getprice_fwd(
4789 rec IN xtr_revl_rec, has_transno IN BOOLEAN,
4790 fwd_rate OUT NOCOPY NUMBER) IS
4791 l_buf Varchar2(500);
4792 l_start_date DATE;
4793 l_maturity_date DATE;
4794 l_day_count VARCHAR2(20);
4795 l_side VARCHAR2(5);
4796 l_days_t1 NUMBER;
4797 l_days_t2 NUMBER;
4798 l_year NUMBER;
4799 r_md_in xtr_market_data_p.md_from_set_in_rec_type;
4800 r_md_out xtr_market_data_p.md_from_set_out_rec_type;
4801 r_mm_in XTR_MM_COVERS.int_forw_rate_in_rec_type;
4802 r_mm_out XTR_MM_COVERS.int_forw_rate_out_rec_type;
4803 l_market_set VARCHAR2(30);
4804 l_rt1 NUMBER;
4805 l_rt2 NUMBER;
4806 retcode NUMBER;
4807 r_err_log err_log; -- record type
4808
4809 -- for deal_type = TMM and IRS, we need to calculate in transacation level
4810 cursor c_roll is
4811 select START_DATE, MATURITY_DATE
4812 from xtr_rollover_transactions
4813 where DEAL_NUMBER = rec.deal_no and TRANSACTION_NUMBER =
4814 rec.trans_no;
4815
4816 begin
4817 if has_transno = TRUE then
4818 for l_tmp in c_roll loop
4819 l_start_date := l_tmp.START_DATE;
4820 l_maturity_date := l_tmp.MATURITY_DATE;
4821 end loop;
4822 else
4823 l_start_date := rec.start_date;
4824 l_maturity_date := rec.maturity_date;
4825 end if;
4826 l_market_set := rec.MARKET_DATA_SET;
4827 xtr_revl_get_mds(l_market_set, rec);
4828
4829 if rec.deal_subtype in ('BUY', 'FUND', 'BCAP', 'SCAP') then
4830 l_side := 'A';
4831 else
4832 l_side := 'B';
4833 end if;
4834
4835 -- For FRA, if start_date < batch end date and settle date is null,
4836 -- we don't need to calculate price. Just use previous batch FV.
4837 If rec.deal_type in ('FRA', 'IRO') and
4838 (l_start_date <= rec.revldate and rec.settle_date is null) then
4839 set_err_log(retcode);
4840 FND_MESSAGE.SET_NAME('XTR', 'XTR_SETTLE_DEAL');
4841 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
4842 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
4843 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
4844 l_buf := FND_MESSAGE.GET;
4845 FND_FILE.put_line(fnd_file.log, l_buf);
4846 Else
4847 XTR_CALC_P.calc_days_run(rec.revldate, l_start_date,
4848 rec.year_calc_type, l_days_t1, l_year);
4849 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE,
4850 C_YIELD_IND, rec.revldate, l_start_date,
4851 rec.currencya, NULL, rec.year_calc_type,
4852 C_INTERPOL_LINER, l_side, rec.batch_id, NULL);
4853 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
4854 l_rt1 := r_md_out.p_md_out;
4855
4856 XTR_CALC_P.calc_days_run(rec.revldate, l_maturity_date,
4857 rec.year_calc_type, l_days_t2, l_year);
4858 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE,
4859 C_YIELD_IND, rec.revldate, l_maturity_date,
4860 rec.currencya, NULL, rec.year_calc_type,
4861 C_INTERPOL_LINER, l_side, rec.batch_id, NULL);
4862 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
4863 l_rt2 := r_md_out.p_md_out;
4864
4865 IF xtr_risk_debug_pkg.g_Debug THEN
4866 xtr_risk_debug_pkg.dpush('xtr_revl_getprice_fwd');
4867 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_fwd: ' || 'rec.trans_no', rec.trans_no);
4868 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_fwd: ' || 'rec.revldate', rec.revldate);
4869 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_fwd: ' || 'rec.year_calc_type', rec.year_calc_type);
4870 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_fwd: ' || 'l_start_date', l_start_date);
4871 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_fwd: ' || 'l_days_t1' , l_days_t1);
4872 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_fwd: ' || 'l_rt1' , l_rt1);
4873 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_fwd: ' || 'l_days_t2' , l_days_t2);
4874 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_fwd: ' || 'l_rt2' , l_rt2);
4875 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_fwd: ' || 'l_year' , l_year);
4876 xtr_risk_debug_pkg.dpop('xtr_revl_getprice_fwd');
4877 END IF;
4878
4879
4880 -- Calculate FWD price
4881 If l_days_t1 = l_days_t2 then
4882 fwd_rate := 0;
4883 Else
4884 r_mm_in.p_indicator := C_YEAR_RATE;
4885 r_mm_in.p_t := l_days_t1;
4886 r_mm_in.p_T1 := l_days_t2;
4887 r_mm_in.p_Rt := l_rt1;
4888 r_mm_in.p_Rt1 := l_rt2;
4889 r_mm_in.p_year_basis:= l_year;
4890 XTR_MM_COVERS.interest_forward_rate(r_mm_in, r_mm_out);
4891 fwd_rate := r_mm_out.p_fra_rate;
4892 End If;
4893
4894 End If;
4895
4896 EXCEPTION
4897 when XTR_MARKET_DATA_P.e_mdcs_no_data_found then
4898 if g_call_by_form = true then
4899 FND_MESSAGE.set_name('XTR', 'XTR_NO_MARKET');
4900 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
4901 APP_EXCEPTION.raise_exception;
4902 else
4903 set_err_log(retcode);
4904 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_MARKETDATASET');
4905 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
4906 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
4907 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
4908 l_buf := FND_MESSAGE.GET;
4909 FND_FILE.put_line(fnd_file.log, l_buf);
4910 end if;
4911 when XTR_MARKET_DATA_P.e_mdcs_no_curve_found then
4912 if g_call_by_form = true then
4913 FND_MESSAGE.set_name('XTR', 'XTR_NO_CURVE');
4914 FND_MESSAGE.set_token('MARKET', rec.market_data_set);
4915 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
4916 APP_EXCEPTION.raise_exception;
4917 else
4918 set_err_log(retcode);
4919 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_CURVEMARKET');
4920 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
4921 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
4922 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
4923 l_buf := FND_MESSAGE.GET;
4924 FND_FILE.put_line(fnd_file.log, l_buf);
4925 end if;
4926 when others then
4927 if g_call_by_form = true then
4928 APP_EXCEPTION.raise_exception;
4929 else
4930 set_err_log(retcode);
4931 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
4932 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
4933 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
4934 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
4935 l_buf := FND_MESSAGE.GET;
4936 FND_FILE.put_line(fnd_file.log, l_buf);
4937 end if;
4938 end xtr_revl_getprice_fwd;
4939 --------------------------------------------------------
4940 /*********************************************************/
4941 /* This procedure returns fair value for deal type FRA */
4942 /*********************************************************/
4943 PROCEDURE xtr_revl_fv_fra(
4944 rec IN OUT NOCOPY xtr_revl_rec,
4945 p_fra_price IN NUMBER,
4946 fair_value OUT NOCOPY NUMBER) IS
4947 l_buf Varchar2(500);
4948 l_settle_amt NUMBER;
4949 l_market_set VARCHAR2(30);
4950 l_discount_date_method VARCHAR2(30);
4951 l_discount_date DATE;
4952 l_day NUMBER;
4953 l_year NUMBER;
4954 l_side VARCHAR2(5);
4955 l_settle_rate NUMBER;
4956 l_discount_rate NUMBER;
4957 r_md_in xtr_market_data_p.md_from_set_in_rec_type;
4958 r_md_out xtr_market_data_p.md_from_set_out_rec_type;
4959 r_fra_in XTR_MM_COVERS.fra_settlement_in_rec_type;
4960 r_fra_out XTR_MM_COVERS.fra_settlement_out_rec_type;
4961 l_dummy NUMBER;
4962 l_dummy1 NUMBER;
4963 l_reval_rate NUMBER;
4964 r_mm_in XTR_MM_COVERS.presentValue_in_rec_type;
4965 r_mm_out XTR_MM_COVERS.presentValue_out_rec_type;
4966 retcode NUMBER;
4967 r_err_log err_log; -- record type
4968
4969 begin
4970 select PARAMETER_VALUE_CODE into l_discount_date_method
4971 from xtr_company_parameters
4972 where COMPANY_CODE = rec.company_code and
4973 PARAMETER_CODE = C_FRA_DISCOUNT_METHOD;
4974
4975 l_market_set := rec.market_data_set;
4976 xtr_revl_get_mds(l_market_set, rec);
4977
4978 If rec.settle_date is not null and rec.effective_date <= rec.revldate then
4979 -- Calculate realized G/L
4980 xtr_end_fv(rec, fair_value);
4981 Elsif (rec.start_date <= rec.revldate) and rec.settle_date is null then
4982 -- Pass expiry data and deal not settled yet. get fv and reval rate from previous batch
4983 xtr_get_fv_from_batch(rec, fair_value, l_dummy, l_dummy1, l_reval_rate);
4984 rec.reval_rate := l_reval_rate;
4985 Else -- calculate unrealized G/L
4986 if(rec.deal_subtype = 'FUND') then
4987 l_side := 'A';
4988 else
4989 l_side := 'B';
4990 end if;
4991
4992 XTR_CALC_P.calc_days_run(rec.start_date, rec.maturity_date,
4993 rec.year_calc_type, l_day, l_year);
4994 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE,
4995 C_YIELD_IND, rec.start_date, rec.maturity_date,
4996 rec.currencya, NULL, rec.year_calc_type,
4997 C_INTERPOL_LINER, l_side, rec.batch_id, NULL);
4998 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
4999 l_settle_rate := r_md_out.p_md_out;
5000
5001 if(rec.pricing_model = C_P_MODEL_FRA_D) then -- 'FRA_DISC'
5002 r_fra_in.p_indicator := 'DR';
5003 elsif (rec.pricing_model = C_P_MODEL_FRA_Y) then -- 'FRA_YIELD'
5004 r_fra_in.p_indicator := 'Y';
5005 elsif rec.pricing_model is null then
5006 raise e_invalid_price_model;
5007 else
5008 fair_value := null;
5009 return;
5010 end if;
5011
5012 r_fra_in.p_fra_price := rec.transaction_rate;
5013 r_fra_in.p_settlement_rate := p_fra_price;
5014 r_fra_in.p_face_value := rec.face_value; -- deal's face_value_amount
5015 r_fra_in.p_day_count := l_day;
5016 r_fra_in.p_annual_basis := l_year;
5017 r_fra_in.p_deal_subtype := rec.deal_subtype;
5018 XTR_MM_COVERS.fra_settlement_amount(r_fra_in, r_fra_out);
5019 l_settle_amt := r_fra_out.p_settlement_amount;
5020
5021 if(l_discount_date_method = 'REVAL') then
5022 if rec.deal_subtype = 'FUND' then
5023 if l_settle_amt < 0 then
5024 l_side := 'A';
5025 else
5026 l_side := 'B';
5027 end if;
5028 else -- rec.deal_subtype = 'INVEST'
5029 if l_settle_amt >= 0 then
5030 l_side := 'A';
5031 else
5032 l_side := 'B';
5033 end if;
5034 end if;
5035
5036
5037 XTR_CALC_P.calc_days_run(rec.revldate, rec.start_date,
5038 rec.year_calc_type, l_day, l_year);
5039 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE,
5040 C_YIELD_IND, rec.revldate, rec.start_date,
5041 rec.currencya, NULL, rec.year_calc_type,
5042 C_INTERPOL_LINER, l_side, rec.batch_id, NULL);
5043 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
5044
5045 l_discount_rate := r_md_out.p_md_out;
5046
5047 r_mm_in.P_INDICATOR := C_YIELD_IND;
5048 r_mm_in.P_FUTURE_VAL := l_settle_amt;
5049 r_mm_in.P_RATE := l_discount_rate;
5050 r_mm_in.P_DAY_COUNT := l_day;
5051 r_mm_in.P_ANNUAL_BASIS := l_year;
5052 XTR_MM_COVERS.present_value(r_mm_in, r_mm_out);
5053
5054 fair_value := r_mm_out.P_PRESENT_VAL;
5055 /*
5056 IF xtr_risk_debug_pkg.g_Debug THEN
5057 xtr_risk_debug_pkg.dpush('xtr_revl_fv_fra: ' || 'FRA_FAIR_VALUE');
5058 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fra: ' || 'rec.deal_no', rec.deal_no);
5059 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fra: ' || 'rec.revldate', rec.revldate);
5060 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fra: ' || 'rec.start_date', rec.start_date);
5061 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fra: ' || 'year calc type', rec.year_calc_type);
5062 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fra: ' || 'currency', rec.currencya);
5063 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fra: ' || 'r_mm_in.P_INDICATOR', r_mm_in.P_INDICATOR);
5064 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fra: ' || 'r_mm_in.P_RATE', r_mm_in.P_RATE);
5065 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fra: ' || 'r_mm_in.P_DAY_COUNT', r_mm_in.P_DAY_COUNT);
5066 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fra: ' || 'r_mm_in.P_ANNUAL_BASIS', r_mm_in.P_ANNUAL_BASIS);
5067 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fra: ' || 'r_mm_in.P_FUTURE_VAL', r_mm_in.P_FUTURE_VAL);
5068 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fra: ' || 'discount date method', l_discount_date_method);
5069 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fra: ' || 'fair value', fair_value);
5070 xtr_risk_debug_pkg.dpop('xtr_revl_fv_fra: ' || 'FRA_FAIR_VALUE');
5071 END IF;
5072 */
5073 else
5074 fair_value := l_settle_amt;
5075 end if;
5076 End If;
5077
5078 EXCEPTION
5079 when XTR_MARKET_DATA_P.e_mdcs_no_data_found then
5080 if g_call_by_form = true then
5081 FND_MESSAGE.set_name('XTR', 'XTR_NO_MARKET');
5082 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
5083 APP_EXCEPTION.raise_exception;
5084 else
5085 set_err_log(retcode);
5086 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_MARKETDATASET');
5087 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
5088 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
5089 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
5090 l_buf := FND_MESSAGE.GET;
5091 FND_FILE.put_line(fnd_file.log, l_buf);
5092 end if;
5093 when XTR_MARKET_DATA_P.e_mdcs_no_curve_found then
5094 if g_call_by_form = true then
5095 FND_MESSAGE.set_name('XTR', 'XTR_NO_CURVE');
5096 FND_MESSAGE.set_token('MARKET', rec.market_data_set);
5097 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
5098 APP_EXCEPTION.raise_exception;
5099 else
5100 set_err_log(retcode);
5101 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_CURVEMARKET');
5102 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
5103 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
5104 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
5105 l_buf := FND_MESSAGE.GET;
5106 FND_FILE.put_line(fnd_file.log, l_buf);
5107 end if;
5108 when others then
5109 if g_call_by_form = true then
5110 APP_EXCEPTION.raise_exception;
5111 else
5112 set_err_log(retcode);
5113 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
5114 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
5115 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
5116 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
5117 l_buf := FND_MESSAGE.GET;
5118 FND_FILE.put_line(fnd_file.log, l_buf);
5119 end if;
5120 end xtr_revl_fv_fra;
5121 -----------------------------------------
5122 /*********************************************************/
5123 /* This procedure returns fair value for deal type FX */
5124 /*********************************************************/
5125 PROCEDURE xtr_revl_fv_fx(
5126 rec IN xtr_revl_rec,
5127 r_fx_rate IN xtr_revl_fx_rate,
5128 p_hedge_flag IN VARCHAR2,
5129 fair_value OUT NOCOPY NUMBER,
5130 p_sob_curr_rate OUT NOCOPY NUMBER) IS
5131 l_buff Varchar2(500);
5132 l_spot_date DATE;
5133 l_future_date DATE;
5134 l_base_ccy VARCHAR2(15);
5135 l_contra_ccy VARCHAR2(15);
5136 l_base1 VARCHAR2(15);
5137 l_contra1 VARCHAR2(15);
5138 l_market_set VARCHAR2(30);
5139 l_base_amt NUMBER;
5140 l_contra_amt NUMBER;
5141 l_buf NUMBER;
5142 l_contra_sob_side VARCHAR2(5);
5143 l_reverse BOOLEAN;
5144 r_md_in xtr_market_data_p.md_from_set_in_rec_type;
5145 r_md_out xtr_market_data_p.md_from_set_out_rec_type;
5146 l_discount_date_method VARCHAR2(30);
5147 l_future_fv NUMBER;
5148 l_base_val NUMBER;
5149 l_contra_val NUMBER;
5150 p_spot_rate NUMBER;
5151 p_contra_yield_rate NUMBER;
5152 p_sob_yield_rate NUMBER;
5153 l_num_days NUMBER;
5154 l_year_basis NUMBER;
5155 l_end_fv NUMBER;
5156 l_begin_fv NUMBER;
5157 l_begin_base_contra_rate NUMBER;
5158 l_begin_contra_sob_rate NUMBER;
5159 l_begin_date DATE;
5160 l_end_date DATE;
5161 l_end_base_contra_rate NUMBER;
5162 l_end_contra_sob_rate NUMBER;
5163 l_round NUMBER;
5164 l_dummy VARCHAR2(1);
5165 l_indicator VARCHAR2(1);
5166 l_mature VARCHAR2(1);
5167 l_source VARCHAR2(1);
5168 l_deno NUMBER;
5169 l_numer NUMBER;
5170 r_mm_in XTR_MM_COVERS.presentValue_in_rec_type;
5171 r_mm_out XTR_MM_COVERS.presentValue_out_rec_type;
5172 r_err_log err_log; -- record type
5173 l_fx_param VARCHAR2(50);
5174 retcode NUMBER;
5175
5176 begin
5177
5178 If rec.pricing_model = 'FAIR_VALUE' then -- bug 3184136
5179 p_sob_curr_rate := NULL;
5180 fair_value := NULL;
5181 return;
5182 End if;
5183
5184 select PARAMETER_VALUE_CODE
5185 into l_discount_date_method
5186 from xtr_company_parameters
5187 where COMPANY_CODE = rec.company_code and
5188 PARAMETER_CODE = C_FX_DISCOUNT_METHOD;
5189
5190 select param_value
5191 into l_fx_param
5192 from XTR_PRO_PARAM
5193 where param_type = 'DFLTVAL'
5194 and param_name = 'FX_REALIZED_RATE';
5195
5196 select rounding_factor
5197 into l_round
5198 from xtr_master_currencies_v
5199 where currency = rec.reval_ccy;
5200
5201 if g_call_by_form = TRUE then
5202 -- called from form for FX rollover/predelive
5203 l_source := C_HIST_SOURCE; -- look currency system rate table
5204 else
5205 l_source := C_SOURCE; -- look reval rate table
5206 end if;
5207
5208 l_future_date := rec.effective_date; -- deal value date
5209 l_base_ccy := rec.currencya;
5210 l_contra_ccy := rec.currencyb;
5211 l_market_set := rec.MARKET_DATA_SET;
5212 xtr_revl_get_mds(l_market_set, rec);
5213 l_contra_amt := rec.fxo_sell_ref_amount; -- deal sell amount
5214 l_base_amt := rec.face_value; -- deal buy amount
5215
5216 if (l_future_date <= rec.revldate and l_fx_param = 'N') or g_call_by_form = TRUE then
5217 l_spot_date := l_future_date;
5218 l_source := 'C';
5219 l_mature := 'Y';
5220 l_end_date := l_future_date;
5221 elsif l_future_date <= rec.revldate and l_fx_param = 'Y' then
5222 l_spot_date := rec.revldate;
5223 l_source := 'R';
5224 l_mature := 'Y';
5225 l_end_date := l_future_date;
5226 else
5227 if(nvl(p_hedge_flag,'N') = 'Y') then -- If condition Added bug 4276964
5228 l_spot_date := rec.period_end;
5229 else
5230 l_spot_date := rec.revldate;
5231 end if;
5232 l_source := 'R';
5233 l_mature := 'N';
5234 l_end_date := rec.revldate;
5235 end if;
5236
5237 xtr_get_base_contra(l_base_ccy, l_contra_ccy, l_reverse);
5238 -- set p_side depend on ask or bid
5239 if (l_reverse = true) then
5240 l_buf := l_base_amt;
5241 l_base_amt := -l_contra_amt;
5242 l_contra_amt := l_buf;
5243 else
5244 l_contra_amt := -l_contra_amt;
5245 end if;
5246
5247 -- Fair value in Contra ccy without discount
5248 fair_value := round((l_base_amt * r_fx_rate.fx_forward_rate +
5249 l_contra_amt), l_round);
5250 /*
5251 IF xtr_risk_debug_pkg.g_Debug THEN
5252 xtr_risk_debug_pkg.dpush('xtr_revl_fv_fx: ' || 'FX_FAIR_VALUE');
5253 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'rec.deal_no', rec.deal_no);
5254 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'l_base_amt', l_base_amt);
5255 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'l_contra_amt', l_contra_amt);
5256 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'forward rate', r_fx_rate.fx_forward_rate);
5257 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'fair value', fair_value);
5258 xtr_risk_debug_pkg.dpop('xtr_revl_fv_fx: ' || 'FX_FAIR_VALUE');
5259 END IF;
5260 */
5261
5262 /***********************************************************/
5263 /* Convert the fair value in contra currency to SOB */
5264 /* currency equivalent */
5265 /***********************************************************/
5266 if rec.pricing_model <> 'FX_GL' then
5267 l_contra_sob_side := 'M';
5268 if l_contra_ccy = rec.sob_ccy then
5269 p_sob_curr_rate := 1;
5270
5271 -- get sob currency yield rate from market data set
5272 XTR_CALC_P.calc_days_run(l_spot_date, l_future_date,
5273 rec.year_calc_type, l_num_days, l_year_basis);
5274
5275 xtr_revl_mds_init(r_md_in, l_market_set, l_source,
5276 C_YIELD_IND, l_spot_date, l_future_date,
5277 rec.sob_ccy, NULL, rec.year_calc_type,
5278 C_INTERPOL_LINER, l_contra_sob_side, rec.batch_id, NULL);
5279 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
5280 p_sob_yield_rate := r_md_out.p_md_out;
5281 else
5282 l_base1 := l_contra_ccy;
5283 l_contra1 := rec.sob_ccy;
5284 xtr_get_base_contra(l_base1, l_contra1, l_reverse);
5285 XTR_CALC_P.calc_days_run(l_spot_date, l_future_date,
5286 rec.year_calc_type, l_num_days, l_year_basis);
5287
5288 xtr_revl_mds_init(r_md_in, l_market_set, l_source,
5289 C_SPOT_RATE_IND, l_spot_date, NULL,
5290 l_base1, l_contra1, NULL,
5291 NULL, l_contra_sob_side, rec.batch_id, NULL);
5292 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
5293 p_spot_rate := r_md_out.p_md_out;
5294 /*
5295 IF xtr_risk_debug_pkg.g_Debug THEN
5296 xtr_risk_debug_pkg.dpush('xtr_revl_fv_fx: ' || 'CONTRA_SOB_CONVERT: spot rate');
5297 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'rec.deal_no', rec.deal_no);
5298 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'indicator', l_indicator);
5299 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'C_SPOT_RATE_IND', C_SPOT_RATE_IND);
5300 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'spot date' , l_spot_date);
5301 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'contra ccy' , l_contra_ccy);
5302 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'sob ccy' , rec.sob_ccy);
5303 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'spot side' , l_contra_sob_side);
5304 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'spot rate', p_spot_rate);
5305 xtr_risk_debug_pkg.dpop('xtr_revl_fv_fx: ' || 'CONTRA_SOB_CONVERT: spot rate');
5306 END IF; */
5307
5308 if l_mature = 'Y' then
5309 p_sob_curr_rate := p_spot_rate;
5310 else
5311 -- get contra currency yield rate from market data set
5312 xtr_revl_mds_init(r_md_in, l_market_set, l_source,
5313 C_YIELD_IND, l_spot_date, l_future_date,
5314 l_base1, NULL, rec.year_calc_type,
5315 C_INTERPOL_LINER, l_contra_sob_side, rec.batch_id, NULL);
5316 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
5317 p_contra_yield_rate := r_md_out.p_md_out;
5318
5319 -- get sob currency yield rate from market data set
5320 xtr_revl_mds_init(r_md_in, l_market_set, l_source,
5321 C_YIELD_IND, l_spot_date, l_future_date,
5322 l_contra1, NULL, rec.year_calc_type,
5323 C_INTERPOL_LINER, l_contra_sob_side, rec.batch_id, NULL);
5324 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
5325 p_sob_yield_rate := r_md_out.p_md_out;
5326
5327 IF xtr_risk_debug_pkg.g_Debug THEN
5328 xtr_risk_debug_pkg.dpush('xtr_revl_fv_fx: ' || 'CONTRA_SOB_CONVERT: contra yield rate');
5329 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'rec.deal_no', rec.deal_no);
5330 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'l_indicator', l_indicator);
5331 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'C_YIELD_IND', C_YIELD_IND);
5332 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'spot date' , l_spot_date);
5333 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'future date' , l_future_date);
5334 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'contra ccy' , l_contra_ccy);
5335 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'calc type' , rec.year_calc_type);
5336 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'C_INTERPOL_LINER' , C_INTERPOL_LINER);
5337 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'contra side', l_contra_sob_side);
5338 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'contra yield rate', p_contra_yield_rate);
5339 xtr_risk_debug_pkg.dpop('xtr_revl_fv_fx: ' || 'CONTRA_SOB_CONVERT: contra yield rate');
5340 END IF;
5341
5342 -- get fx forward rate for SOB currency(r_fx_rate.fx_forward_rate)
5343 XTR_FX_FORMULAS.fx_forward_rate(
5344 p_spot_rate,
5345 p_contra_yield_rate,
5346 p_sob_yield_rate,
5347 l_num_days,
5348 l_num_days,
5349 l_year_basis,
5350 l_year_basis,
5351 p_sob_curr_rate);
5352 end if;
5353 end if;
5354 end if;
5355
5356 if l_contra_ccy <> rec.sob_ccy and rec.pricing_model = 'FX_GL' then
5357 -- use GL daily rate between SOB and Contra ccy instead of forward rate
5358 l_base1 := l_contra_ccy;
5359 l_contra1 := rec.sob_ccy;
5360 xtr_get_base_contra(l_base1, l_contra1, l_reverse);
5361 GL_CURRENCY_API.get_triangulation_rate(l_base1, l_contra1,
5362 l_spot_date, rec.ex_rate_type,l_deno, l_numer, p_sob_curr_rate);
5363 elsif l_contra_ccy = rec.sob_ccy and rec.pricing_model = 'FX_GL' then
5364 p_sob_curr_rate := 1;
5365 end if;
5366
5367 -- Fair value in term of SOB currency
5368 if l_reverse = TRUE then
5369 fair_value := round((fair_value / p_sob_curr_rate), l_round);
5370 else
5371 fair_value := round((fair_value * p_sob_curr_rate), l_round);
5372 end if;
5373
5374 /*
5375 IF xtr_risk_debug_pkg.g_Debug THEN
5376 xtr_risk_debug_pkg.dpush('xtr_revl_fv_fx: ' || 'FAIR_VALUE_IN_SOB');
5377 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'p_spot_rate', p_spot_rate);
5378 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'p_contra_yield_rate', p_contra_yield_rate);
5379 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'p_sob_yield_rate', p_sob_yield_rate);
5380 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'l_num_days', l_num_days);
5381 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'l_year_basis', l_year_basis);
5382 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'p_sob_curr_rate', p_sob_curr_rate);
5383 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'fair_value', fair_value);
5384 xtr_risk_debug_pkg.dpop('xtr_revl_fv_fx: ' || 'FAIR_VALUE_IN_SOB');
5385 END IF; */
5386
5387 -- If company parameter set to 'REVAL', then we should get discount fair value
5388 if (l_discount_date_method = 'REVAL') and (rec.effective_date > rec.revldate)
5389 and rec.pricing_model = 'FX_FORWARD' then
5390 r_mm_in.P_FUTURE_VAL := fair_value;
5391 r_mm_in.P_INDICATOR := C_YIELD_IND;
5392 r_mm_in.P_RATE := p_sob_yield_rate;
5393 r_mm_in.P_DAY_COUNT := l_num_days;
5394 r_mm_in.P_ANNUAL_BASIS:= l_year_basis;
5395 XTR_MM_COVERS.present_value(r_mm_in, r_mm_out);
5396 fair_value := round(r_mm_out.P_PRESENT_VAL, l_round);
5397 /*
5398 IF xtr_risk_debug_pkg.g_Debug THEN
5399 xtr_risk_debug_pkg.dpush('xtr_revl_fv_fx: ' || 'FAIR_VALUE_DISCOUNT');
5400 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'rec.deal_no', rec.deal_no);
5401 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'p_sob_yield_rate', r_mm_in.P_RATE);
5402 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'future value', r_mm_in.P_FUTURE_VAL);
5403 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'l_num_days', r_mm_in.P_DAY_COUNT);
5404 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'l_year_basis', r_mm_in.P_ANNUAL_BASIS);
5405 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'P_INDICATOR', r_mm_in.P_INDICATOR);
5406 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'fair value', fair_value);
5407 xtr_risk_debug_pkg.dpop('xtr_revl_fv_fx: ' || 'FAIR_VALUE_DISCOUNT');
5408 END IF; */
5409 end if;
5410
5411 EXCEPTION
5412 when GL_CURRENCY_API.no_rate then
5413 if g_call_by_form = true then
5414 FND_MESSAGE.set_name('XTR', 'XTR_NO_GL_RATE');
5415 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
5416 APP_EXCEPTION.raise_exception;
5417 else
5418 set_err_log(retcode);
5419 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_RATE_CURRENCY_GL');
5420 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
5421 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
5422 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
5423 l_buff := FND_MESSAGE.GET;
5424 FND_FILE.put_line(fnd_file.log, l_buff);
5425 end if;
5426 when GL_CURRENCY_API.invalid_currency then
5427 if g_call_by_form = true then
5428 FND_MESSAGE.set_name('XTR', 'XTR_INVALID_CURRENCY');
5429 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
5430 FND_MESSAGE.set_token('CURRENCY', rec.currencya);
5431 APP_EXCEPTION.raise_exception;
5432 else
5433 set_err_log(retcode);
5434 FND_MESSAGE.SET_NAME('XTR', 'XTR_INVALID_CURRENCY_TYPE');
5435 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
5436 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
5437 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
5438 l_buff := FND_MESSAGE.GET;
5439 FND_FILE.put_line(fnd_file.log, l_buff);
5440 end if;
5441 when XTR_MARKET_DATA_P.e_mdcs_no_data_found then
5442 if g_call_by_form = true then
5443 FND_MESSAGE.set_name('XTR', 'XTR_NO_MARKET');
5444 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
5445 APP_EXCEPTION.raise_exception;
5446 else
5447 set_err_log(retcode);
5448 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_MARKETDATASET');
5449 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
5450 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
5451 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
5452 l_buff := FND_MESSAGE.GET;
5453 FND_FILE.put_line(fnd_file.log, l_buff);
5454 end if;
5455 when XTR_MARKET_DATA_P.e_mdcs_no_curve_found then
5456 if g_call_by_form = true then
5457 FND_MESSAGE.set_name('XTR', 'XTR_NO_CURVE');
5458 FND_MESSAGE.set_token('MARKET', rec.market_data_set);
5459 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
5460 APP_EXCEPTION.raise_exception;
5461 else
5462 set_err_log(retcode);
5463 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_CURVEMARKET');
5464 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
5465 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
5466 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
5467 l_buff := FND_MESSAGE.GET;
5468 FND_FILE.put_line(fnd_file.log, l_buff);
5469 end if;
5470 when others then
5471 if g_call_by_form = true then
5472 APP_EXCEPTION.raise_exception;
5473 else
5474 set_err_log(retcode);
5475 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
5476 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
5477 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
5478 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
5479 l_buff := FND_MESSAGE.GET;
5480 FND_FILE.put_line(fnd_file.log, l_buff);
5481 end if;
5482 end xtr_revl_fv_fx;
5483 --------------------------------------------------------
5484 /*************************************************************/
5485 /* Calculate FX currency G/L, we cannot use normal procedure */
5486 /* to derive currency_gl */
5487 /*************************************************************/
5488 PROCEDURE xtr_revl_fx_curr_gl(
5489 rec IN OUT NOCOPY xtr_revl_rec,
5490 p_hedge_flag IN VARCHAR2,
5491 p_realized IN BOOLEAN,
5492 currency_gl OUT NOCOPY NUMBER) IS
5493
5494 l_end_fv NUMBER;
5495 l_begin_fv NUMBER;
5496 l_begin_base_contra_rate NUMBER;
5497 l_begin_contra_sob_rate NUMBER;
5498 l_begin_date DATE;
5499 l_end_date DATE;
5500 l_end_base_contra_rate NUMBER;
5501 l_end_contra_sob_rate NUMBER;
5502 l_round NUMBER;
5503 l_deno NUMBER;
5504 l_numer NUMBER;
5505 l_base_ccy VARCHAR2(15);
5506 l_contra_ccy VARCHAR2(15);
5507 l_base_amt NUMBER;
5508 l_contra_amt NUMBER;
5509 l_reverse BOOLEAN;
5510 l_buf NUMBER;
5511 l_dummy VARCHAR2(1);
5512 r_err_log err_log; -- record type
5513 retcode NUMBER;
5514 l_buff Varchar2(500);
5515
5516 cursor c_fx is
5517 select 'Y'
5518 from XTR_REVALUATION_DETAILS R,
5519 XTR_BATCHES B
5520 where r.deal_no = rec.deal_no
5521 and r.batch_id = b.batch_id
5522 and r.batch_id <> rec.batch_id
5523 and b.upgrade_batch <> 'Y';
5524
5525 Begin
5526 rec.deal_ex_rate_one :=NULL;
5527 rec.deal_ex_rate_two :=NULL;
5528 rec.reval_ex_rate_one :=NULL;
5529 rec.reval_ex_rate_two :=NULL;
5530
5531 select rounding_factor
5532 into l_round
5533 from xtr_master_currencies_v
5534 where currency = rec.reval_ccy;
5535
5536 l_base_ccy := rec.currencya;
5537 l_contra_ccy := rec.currencyb;
5538 l_contra_amt := rec.fxo_sell_ref_amount; -- deal sell amount
5539 l_base_amt := rec.face_value; -- deal buy amount
5540 xtr_get_base_contra(l_base_ccy, l_contra_ccy, l_reverse);
5541 if (l_reverse = true) then
5542 l_buf := l_base_amt;
5543 l_base_amt := -l_contra_amt;
5544 l_contra_amt := l_buf;
5545 else
5546 l_contra_amt := -l_contra_amt;
5547 end if;
5548
5549 -- Determine the begin and end date to get rate on that date
5550 if nvl(p_hedge_flag, 'N') = 'Y' then -- hedge associated FX
5551 if p_realized = FALSE then -- bug 4214521 issue 2 added lines
5552 l_begin_date := rec.period_start;
5553 else
5554 l_begin_date := rec.deal_date;
5555 end if; -- bug 4214521 issue 2 ended lines
5556 else
5557 open c_fx;
5558 fetch c_fx into l_dummy;
5559 close c_fx;
5560 if nvl(l_dummy, 'N') = 'Y' and p_realized = FALSE then
5561 -- deal is not first time reval or it's unrealized records
5562 l_begin_date := rec.batch_start - 1; --(previous batch end date)
5563 else
5564 l_begin_date := rec.deal_date;
5565 end if;
5566 end if;
5567
5568 if nvl(p_hedge_flag, 'N') = 'Y' then
5569 l_end_date := rec.period_end;
5570 else
5571 if rec.effective_date <= rec.revldate then
5572 l_end_date := rec.effective_date;
5573 else
5574 l_end_date := rec.revldate;
5575 end if;
5576 end if;
5577
5578 ------------------------------------------------------------
5579 -- Get exchange rate between base and contra, contra ccy and sob ccy in
5580 -- min(batch end date, deal value date) as end rate
5581 ------------------------------------------------------------
5582 GL_CURRENCY_API.get_triangulation_rate(l_base_ccy, l_contra_ccy,
5583 l_end_date, rec.ex_rate_type,l_deno, l_numer, l_end_base_contra_rate);
5584
5585 GL_CURRENCY_API.get_triangulation_rate(l_contra_ccy, rec.sob_ccy,
5586 l_end_date, rec.ex_rate_type,l_deno, l_numer, l_end_contra_sob_rate);
5587
5588 rec.reval_ex_rate_one := l_end_base_contra_rate;
5589 rec.reval_ex_rate_two := l_end_contra_sob_rate;
5590
5591 /* --------------------------------------------------------------------
5592 This part is for later use if we decide to change the definition of exchange rate
5593 ------------------------------------------------------------
5594 -- Store base-> SOB currency as exchange_rate_one and
5595 -- store contra -> SOB currency as exchange_rate_two in reval table
5596 ------------------------------------------------------------
5597 GL_CURRENCY_API.get_triangulation_rate(l_base_ccy, rec.sob_ccy,
5598 l_end_date, rec.ex_rate_type,l_deno, l_numer, rec.reval_ex_rate_one);
5599
5600 GL_CURRENCY_API.get_triangulation_rate(l_contra_ccy, rec.sob_ccy,
5601 l_end_date, rec.ex_rate_type,l_deno, l_numer, rec.reval_ex_rate_two);
5602 ---------------------------------------------------------------------------------
5603 */
5604
5605 l_end_fv := round(((l_base_amt * l_end_base_contra_rate + l_contra_amt)
5606 * l_end_contra_sob_rate), l_round);
5607
5608 ------------------------------------------------------------
5609 -- Get exchange rate between base and contra, contra and sob ccy in
5610 -- nvl(last batch end date, deal.deal_date) as begin rate
5611 ------------------------------------------------------------
5612 GL_CURRENCY_API.get_triangulation_rate(l_base_ccy, l_contra_ccy,
5613 l_begin_date, rec.ex_rate_type,l_deno, l_numer, l_begin_base_contra_rate);
5614
5615 GL_CURRENCY_API.get_triangulation_rate(l_contra_ccy, rec.sob_ccy,
5616 l_begin_date, rec.ex_rate_type,l_deno, l_numer, l_begin_contra_sob_rate);
5617
5618 rec.deal_ex_rate_one := l_begin_base_contra_rate;
5619 rec.deal_ex_rate_two := l_begin_contra_sob_rate;
5620
5621 /* --------------------------------------------------------------------
5622 This part is for later use if we decide to change the definition of exchange rate
5623 ------------------------------------------------------------
5624 -- Store base-> SOB currency as exchange_rate_one and
5625 -- store contra -> SOB currency as exchange_rate_two in xtr_deals table
5626 ------------------------------------------------------------
5627 GL_CURRENCY_API.get_triangulation_rate(l_base_ccy, rec.sob_ccy,
5628 l_begin_date, rec.ex_rate_type,l_deno, l_numer, rec.deal_ex_rate_one);
5629
5630 GL_CURRENCY_API.get_triangulation_rate(l_contra_ccy, rec.sob_ccy,
5631 l_begin_date, rec.ex_rate_type,l_deno, l_numer, rec.deal_ex_rate_two);
5632 ------------------------------------------------------------------------
5633 */
5634
5635 l_begin_fv := round(((l_base_amt * l_begin_base_contra_rate + l_contra_amt)
5636 * l_begin_contra_sob_rate), l_round);
5637
5638 currency_gl := l_end_fv - l_begin_fv;
5639
5640 IF xtr_risk_debug_pkg.g_Debug THEN
5641 xtr_risk_debug_pkg.dpush('xtr_revl_fv_fx: ' || 'xtr_fx_currency_gl');
5642 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'rec.deal_no', rec.deal_no);
5643 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'base ccy', l_base_ccy);
5644 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'contra ccy', l_contra_ccy);
5645 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'sob ccy', rec.sob_ccy);
5646 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'base amount', l_base_amt);
5647 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'contra amount', l_contra_amt);
5648 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'end date', l_end_date);
5649 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'end base contra rate', l_end_base_contra_rate);
5650 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'end contra sob rate', l_end_contra_sob_rate);
5651 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'begin date', l_begin_date);
5652 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'begin base contra rate', l_begin_base_contra_rate);
5653 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'begin contra sob rate', l_begin_contra_sob_rate);
5654 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'end fv', l_end_fv);
5655 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'begin fv', l_begin_fv);
5656 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'currency gl', currency_gl);
5657 xtr_risk_debug_pkg.dpop('xtr_revl_fv_fx: ' || 'xtr_fx_currency_gl');
5658 END IF;
5659
5660 EXCEPTION
5661 when GL_CURRENCY_API.no_rate then
5662 if g_call_by_form = true then
5663 FND_MESSAGE.set_name('XTR', 'XTR_NO_GL_RATE');
5664 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
5665 APP_EXCEPTION.raise_exception;
5666 else
5667 set_err_log(retcode);
5668 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_RATE_CURRENCY_GL');
5669 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
5670 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
5671 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
5672 l_buff := FND_MESSAGE.GET;
5673 FND_FILE.put_line(fnd_file.log, l_buff);
5674 end if;
5675 when GL_CURRENCY_API.invalid_currency then
5676 if g_call_by_form = true then
5677 FND_MESSAGE.set_name('XTR', 'XTR_INVALID_CURRENCY');
5678 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
5679 FND_MESSAGE.set_token('CURRENCY', rec.currencya);
5680 APP_EXCEPTION.raise_exception;
5681 else
5682 set_err_log(retcode);
5683 FND_MESSAGE.SET_NAME('XTR', 'XTR_INVALID_CURRENCY_TYPE');
5684 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
5685 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
5686 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
5687 l_buff := FND_MESSAGE.GET;
5688 FND_FILE.put_line(fnd_file.log, l_buff);
5689 end if;
5690 when others then
5691 if g_call_by_form = true then
5692 APP_EXCEPTION.raise_exception;
5693 else
5694 set_err_log(retcode);
5695 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
5696 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
5697 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
5698 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
5699 l_buff := FND_MESSAGE.GET;
5700 FND_FILE.put_line(fnd_file.log, l_buff);
5701 end if;
5702 End;
5703 ----------------------------------------------------------------
5704 /*********************************************************/
5705 /* This procedure returns reval rate for deal type FX */
5706 /*********************************************************/
5707 PROCEDURE xtr_revl_getrate_fx(
5708 rec IN xtr_revl_rec,
5709 p_hedge_flag in VARCHAR2,
5710 r_fx_rate OUT NOCOPY xtr_revl_fx_rate) IS
5711 l_spot_date DATE;
5712 l_future_date DATE;
5713 l_base_ccy VARCHAR2(15);
5714 l_contra_ccy VARCHAR2(15);
5715 l_market_set VARCHAR2(30);
5716 l_base_amt NUMBER;
5717 l_contra_amt NUMBER;
5718 l_buf NUMBER;
5719 -- 'A' ask, 'B' bid. if l_base_amt<0 then 'B' else 'A'
5720 l_side VARCHAR2(5);
5721 l_reverse BOOLEAN;
5722 l_spot_side VARCHAR2(5);
5723 l_contra_side VARCHAR2(5);
5724 l_base_side VARCHAR2(5);
5725 l_indicator VARCHAR2(1);
5726 l_mature VARCHAR2(1);
5727 r_md_in xtr_market_data_p.md_from_set_in_rec_type;
5728 r_md_out xtr_market_data_p.md_from_set_out_rec_type;
5729 r_err_log err_log; -- record type
5730 retcode NUMBER;
5731 l_buff Varchar2(500);
5732 l_gl_rate NUMBER;
5733 l_deno NUMBER;
5734 l_numer NUMBER;
5735
5736 begin
5737 l_future_date := rec.effective_date; -- deal value date
5738 l_base_ccy := rec.currencya;
5739 l_contra_ccy := rec.currencyb;
5740 l_market_set := rec.MARKET_DATA_SET;
5741 xtr_revl_get_mds(l_market_set, rec);
5742 l_contra_amt := rec.fxo_sell_ref_amount; -- deal sell amount
5743 l_base_amt := rec.face_value; -- deal buy amount
5744
5745 -- bug 4214525 modified the if condition for hedge deals
5746 if nvl(p_hedge_flag, 'N') = 'Y' then
5747 l_spot_date := rec.period_end;
5748 if l_future_date <= rec.revldate then
5749 l_indicator := 'C';
5750 l_mature := 'Y';
5751 else
5752 l_indicator := 'R';
5753 l_mature := 'N';
5754 end if;
5755 else
5756 if l_future_date <= rec.revldate then
5757 l_spot_date := l_future_date;
5758 l_indicator := 'C';
5759 l_mature := 'Y';
5760 else
5761 l_spot_date := rec.revldate;
5762 l_indicator := 'R';
5763 l_mature := 'N';
5764 end if;
5765 end if;
5766
5767 /*
5768 if l_future_date <= rec.revldate then
5769 l_spot_date := l_future_date;
5770 l_indicator := 'C';
5771 l_mature := 'Y';
5772 else
5773 if nvl(p_hedge_flag, 'N') = 'Y' then -- hedge assoicated FX
5774 l_spot_date := rec.period_end;
5775 else
5776 l_spot_date := rec.revldate;
5777 end if;
5778 l_indicator := 'R';
5779 l_mature := 'N';
5780 end if;
5781 */
5782
5783 xtr_get_base_contra(l_base_ccy, l_contra_ccy, l_reverse);
5784
5785
5786 /*******************************************************************/
5787 /* Introduce new FX pricing model, if GL-deal, then use either */
5788 /* batch end date or maturity date G/L rate as fx rate to reval */
5789 /*******************************************************************/
5790 if rec.pricing_model = 'FX_GL' then
5791 GL_CURRENCY_API.get_triangulation_rate(l_base_ccy, l_contra_ccy,
5792 l_spot_date, rec.ex_rate_type,l_deno, l_numer, l_gl_rate);
5793 r_fx_rate.fx_forward_rate := l_gl_rate;
5794
5795 else
5796
5797 -- set p_side depend on ask or bid
5798 if (l_reverse = true) then
5799 l_buf := l_base_amt;
5800 l_base_amt := -l_contra_amt;
5801 l_contra_amt := l_buf;
5802 l_side := 'B';
5803 else
5804 l_side := 'A';
5805 l_contra_amt := -l_contra_amt;
5806 end if;
5807
5808 /* determine FX rates using 'FX Forward' price model */
5809 XTR_CALC_P.calc_days_run(l_spot_date, l_future_date,
5810 rec.year_calc_type, r_fx_rate.num_days, r_fx_rate.year_basis);
5811 if (l_side = 'B') then
5812 l_spot_side := 'B';
5813 l_contra_side := 'B';
5814 l_base_side := 'A';
5815 elsif (l_side = 'A') then
5816 l_spot_side := 'A';
5817 l_contra_side := 'A';
5818 l_base_side := 'B';
5819 else
5820 l_spot_side := 'M';
5821 l_contra_side := 'M';
5822 l_base_side := 'M';
5823 end if;
5824
5825 -- get spot rate between base/contra from market data set
5826 xtr_revl_mds_init(
5827 r_md_in,
5828 l_market_set,
5829 l_indicator,
5830 C_SPOT_RATE_IND,
5831 l_spot_date,
5832 NULL,
5833 l_base_ccy,
5834 l_contra_ccy,
5835 NULL,
5836 NULL,
5837 l_spot_side,
5838 rec.batch_id,
5839 NULL);
5840
5841 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
5842 r_fx_rate.spot_rate := r_md_out.p_md_out;
5843
5844 /*
5845 IF xtr_risk_debug_pkg.g_Debug THEN
5846 xtr_risk_debug_pkg.dpush('xtr_revl_fv_fx: ' || 'xtr_revl_getrate_fx: spot rate');
5847 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'rec.deal_no', rec.deal_no);
5848 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'C_SOURCE', C_SOURCE);
5849 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'C_SPOT_RATE_IND', C_SPOT_RATE_IND);
5850 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'spot date' , l_spot_date);
5851 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'base ccy' , l_base_ccy);
5852 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'contra ccy' , l_contra_ccy);
5853 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'spot side' , l_spot_side);
5854 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'spot rate', r_fx_rate.spot_rate);
5855 xtr_risk_debug_pkg.dpop('xtr_revl_fv_fx: ' || 'xtr_revl_getrate_fx: spot rate');
5856 END IF; */
5857
5858 if l_mature = 'Y' then
5859 r_fx_rate.fx_forward_rate := r_fx_rate.spot_rate;
5860 else
5861
5862 -- get base currency yield rate from market data set
5863 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE,
5864 C_YIELD_IND, l_spot_date, l_future_date,
5865 l_base_ccy, NULL, rec.year_calc_type,
5866 C_INTERPOL_LINER, l_base_side, rec.batch_id, NULL);
5867 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
5868 r_fx_rate.base_yield_rate := r_md_out.p_md_out;
5869
5870 IF xtr_risk_debug_pkg.g_Debug THEN
5871 xtr_risk_debug_pkg.dpush('xtr_revl_fv_fx: ' || 'xtr_revl_getrate_fx: base yield rate');
5872 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'rec.deal_no', rec.deal_no);
5873 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'C_SOURCE', C_SOURCE);
5874 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'C_YIELD_IND', C_YIELD_IND);
5875 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'spot date' , l_spot_date);
5876 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'future date' , l_future_date);
5877 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'base ccy' , l_base_ccy);
5878 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'calc type' , rec.year_calc_type);
5879 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'C_INTERPOL_LINER' , C_INTERPOL_LINER);
5880 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'base side', l_base_side);
5881 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'base yield rate', r_fx_rate.base_yield_rate);
5882 xtr_risk_debug_pkg.dpop('xtr_revl_fv_fx: ' || 'xtr_revl_getrate_fx: base yield rate');
5883 END IF;
5884
5885 -- get contra currency yield rate from market data set
5886 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE,
5887 C_YIELD_IND, l_spot_date, l_future_date,
5888 l_contra_ccy, NULL, rec.year_calc_type,
5889 C_INTERPOL_LINER, l_contra_side, rec.batch_id, NULL);
5890 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
5891 r_fx_rate.contra_yield_rate := r_md_out.p_md_out;
5892
5893 IF xtr_risk_debug_pkg.g_Debug THEN
5894 xtr_risk_debug_pkg.dpush('xtr_revl_fv_fx: ' || 'xtr_revl_getrate_fx: contra yield rate');
5895 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'rec.deal_no', rec.deal_no);
5896 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'C_SOURCE', C_SOURCE);
5897 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'C_YIELD_IND', C_YIELD_IND);
5898 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'spot date' , l_spot_date);
5899 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'future date' , l_future_date);
5900 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'contra ccy' , l_contra_ccy);
5901 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'calc type' , rec.year_calc_type);
5902 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'C_INTERPOL_LINER' , C_INTERPOL_LINER);
5903 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'contra side', l_contra_side);
5904 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'contra yield rate', r_fx_rate.contra_yield_rate);
5905 xtr_risk_debug_pkg.dpop('xtr_revl_fv_fx: ' || 'xtr_revl_getrate_fx: contra yield rate');
5906 END IF;
5907
5908 -- set fx forward rate (r_fx_rate.fx_forward_rate)
5909 XTR_FX_FORMULAS.fx_forward_rate(
5910 r_fx_rate.spot_rate,
5911 r_fx_rate.base_yield_rate,
5912 r_fx_rate.contra_yield_rate,
5913 r_fx_rate.num_days,
5914 r_fx_rate.num_days,
5915 r_fx_rate.year_basis,
5916 r_fx_rate.year_basis,
5917 r_fx_rate.fx_forward_rate);
5918 end if;
5919 IF xtr_risk_debug_pkg.g_Debug THEN
5920 xtr_risk_debug_pkg.dpush('xtr_revl_fv_fx: ' || 'xtr_revl_getrate_fx: forward rate');
5921 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'rec.deal_no', rec.deal_no);
5922 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'spot_rate', r_fx_rate.spot_rate);
5923 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'base rate' , r_fx_rate.base_yield_rate);
5924 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'contra rate' , r_fx_rate.contra_yield_rate);
5925 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'num of days' , r_fx_rate.num_days);
5926 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'year basis', r_fx_rate.year_basis);
5927 xtr_risk_debug_pkg.dlog('xtr_revl_fv_fx: ' || 'forward rate', r_fx_rate.fx_forward_rate);
5928 xtr_risk_debug_pkg.dpop('xtr_revl_fv_fx: ' || 'xtr_revl_getrate_fx: forward rate');
5929 END IF;
5930
5931 end if;
5932
5933 EXCEPTION
5934 when GL_CURRENCY_API.no_rate then
5935 if g_call_by_form = true then
5936 FND_MESSAGE.set_name('XTR', 'XTR_NO_GL_RATE');
5937 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
5938 APP_EXCEPTION.raise_exception;
5939 else
5940 set_err_log(retcode);
5941 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_RATE_CURRENCY_GL');
5942 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
5943 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
5944 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
5945 l_buff := FND_MESSAGE.GET;
5946 FND_FILE.put_line(fnd_file.log, l_buff);
5947 end if;
5948 when GL_CURRENCY_API.invalid_currency then
5949 if g_call_by_form = true then
5950 FND_MESSAGE.set_name('XTR', 'XTR_INVALID_CURRENCY');
5951 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
5952 FND_MESSAGE.set_token('CURRENCY', rec.currencya);
5953 APP_EXCEPTION.raise_exception;
5954 else
5955 set_err_log(retcode);
5956 FND_MESSAGE.SET_NAME('XTR', 'XTR_INVALID_CURRENCY_TYPE');
5957 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
5958 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
5959 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
5960 l_buff := FND_MESSAGE.GET;
5961 FND_FILE.put_line(fnd_file.log, l_buff);
5962 end if;
5963 when XTR_MARKET_DATA_P.e_mdcs_no_data_found then
5964 if g_call_by_form = true then
5965 FND_MESSAGE.set_name('XTR', 'XTR_NO_MARKET');
5966 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
5967 APP_EXCEPTION.raise_exception;
5968 else
5969 set_err_log(retcode);
5970 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_MARKETDATASET');
5971 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
5972 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
5973 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
5974 l_buff := FND_MESSAGE.GET;
5975 FND_FILE.put_line(fnd_file.log, l_buff);
5976 end if;
5977 when XTR_MARKET_DATA_P.e_mdcs_no_curve_found then
5978 if g_call_by_form = true then
5979 FND_MESSAGE.set_name('XTR', 'XTR_NO_CURVE');
5980 FND_MESSAGE.set_token('MARKET', rec.market_data_set);
5981 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
5982 APP_EXCEPTION.raise_exception;
5983 else
5984 set_err_log(retcode);
5985 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_CURVEMARKET');
5986 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
5987 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
5988 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
5989 l_buff := FND_MESSAGE.GET;
5990 FND_FILE.put_line(fnd_file.log, l_buff);
5991 end if;
5992 when others then
5993 if g_call_by_form = true then
5994 APP_EXCEPTION.raise_exception;
5995 else
5996 set_err_log(retcode);
5997 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
5998 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
5999 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
6000 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
6001 l_buff := FND_MESSAGE.GET;
6002 FND_FILE.put_line(fnd_file.log, l_buff);
6003 end if;
6004 end xtr_revl_getrate_fx;
6005
6006
6007 ----------------------------------------------------------------
6008 /***************************************************************/
6009 /* This procedure handel hedge associated FX deals revaluations*/
6010 /***************************************************************/
6011 PROCEDURE xtr_revl_fv_fxh (rec IN OUT NOCOPY xtr_revl_rec,
6012 r_rd IN OUT NOCOPY XTR_REVALUATION_DETAILS%rowtype) IS
6013
6014 /***************************************************/
6015 /* This cursor returns the max of batch end date */
6016 /* that includes the FX deals */
6017 /***************************************************/
6018 cursor C_LAST_END_DATE is
6019 select max(b.period_end)
6020 from xtr_batches b, xtr_revaluation_details r
6021 where b.batch_id = r.batch_id
6022 and b.company_code = rec.company_code
6023 and b.batch_type is NULL
6024 and r.deal_no = rec.deal_no;
6025
6026 /******************************************************/
6027 /* This cursor will return the broken down pieces of */
6028 /* end date if hedge item's start date, discontinue */
6029 /* date, end date, or reclass date is fallen into */
6030 /* batch range. */
6031 /******************************************************/
6032 cursor C_REVAL_DATE(p_last_end_date DATE) is
6033 select a.start_date reval_date
6034 from XTR_HEDGE_ATTRIBUTES a,
6035 XTR_HEDGE_RELATIONSHIPS r
6036 where a.hedge_attribute_id = r.hedge_attribute_id
6037 and r.primary_code = rec.deal_no
6038 and r.instrument_item_flag = 'U'
6039 and a.start_date < rec.revldate
6040 and a.start_date >= p_last_end_date
6041 union
6042 select nvl(discontinue_date, end_date) reval_date
6043 from XTR_HEDGE_ATTRIBUTES a,
6044 XTR_HEDGE_RELATIONSHIPS r
6045 where a.hedge_attribute_id = r.hedge_attribute_id
6046 and r.primary_code = rec.deal_no
6047 and r.instrument_item_flag = 'U'
6048 and nvl(a.discontinue_date, a.end_date) < rec.revldate
6049 and nvl(a.discontinue_date, a.end_date) >= p_last_end_date
6050 union
6051 select c.reclass_date reval_date
6052 from XTR_RECLASS_DETAILS c, xtr_hedge_relationships R
6053 where c.hedge_attribute_id = r.hedge_attribute_id
6054 and r.primary_code = rec.deal_no
6055 and r.instrument_item_flag = 'U'
6056 and c.reclass_date > p_last_end_date -- bug 4214523
6057 and c.reclass_date < rec.revldate
6058 union
6059 select effective_date reval_date
6060 from xtr_fx_eligible_deals_v
6061 where deal_no = rec.deal_no
6062 and effective_date < rec.revldate
6063 union
6064 select period_end reval_date
6065 from xtr_batches
6066 where batch_id = rec.batch_id
6067 order by reval_date asc;
6068
6069 l_first BOOLEAN;
6070 l_last_end_date DATE;
6071 l_reval_date DATE;
6072 l_hedge_flag VARCHAR2(1) := 'Y';
6073 l_sob_curr_rate NUMBER;
6074 r_fx_rate xtr_revl_fx_rate; -- record type
6075 l_fv NUMBER;
6076 unrel_pl_value NUMBER;
6077 rel_pl_value NUMBER;
6078 cum_pl_value NUMBER;
6079 currency_gl NUMBER;
6080 r_prev_hedge XTR_PREV_HEDGE;
6081 retcode NUMBER;
6082
6083 BEGIN
6084 xtr_first_reval(rec, l_first);
6085 if l_first = TRUE then
6086 rec.period_start := rec.deal_date;
6087 l_last_end_date := rec.period_start;
6088 else
6089 rec.period_start := rec.batch_start -1;
6090 open C_LAST_END_DATE;
6091 fetch C_LAST_END_DATE into l_last_end_date;
6092 close C_LAST_END_DATE;
6093 end if;
6094
6095 open C_REVAL_DATE(l_last_end_date);
6096 fetch C_REVAL_DATE into l_reval_date;
6097 while C_REVAL_DATE%FOUND loop
6098 if l_first = TRUE and rec.period_start = l_reval_date then
6099 fetch C_REVAL_DATE into l_reval_date;
6100 else
6101 rec.period_end := l_reval_date;
6102 xtr_revl_getrate_fx(rec, l_hedge_flag, r_fx_rate);
6103 rec.reval_rate := r_fx_rate.fx_forward_rate;
6104 xtr_revl_fv_fx(rec, r_fx_rate, l_hedge_flag, l_fv, l_sob_curr_rate);
6105 rec.reval_fx_fwd_rate := l_sob_curr_rate;
6106 rec.fair_value := l_fv;
6107
6108 /*****************/
6109 /* Realized FX */
6110 /*****************/
6111 if rec.effective_date = l_reval_date then
6112 rel_pl_value := rec.fair_value;
6113 xtr_revl_fx_curr_gl(rec, l_hedge_flag, TRUE, currency_gl);
6114 xtr_revl_real_log(rec, rel_pl_value, rec.fair_value, rel_pl_value,
6115 currency_gl, r_rd, retcode);
6116
6117 -- Also insert the last unrealized g/l info to XTR_REVALUATION_DETAILS
6118 xtr_get_prev_fv_rate(rec, r_prev_hedge);
6119 unrel_pl_value := rel_pl_value - r_prev_hedge.cum_pl;
6120 xtr_revl_fx_curr_gl(rec, l_hedge_flag, FALSE, currency_gl);
6121 xtr_revl_unreal_log(rec, unrel_pl_value, r_prev_hedge.cum_pl,
6122 rec.fair_value, unrel_pl_value, currency_gl, r_rd, retcode);
6123
6124 Close C_REVAL_DATE;
6125 Return;
6126 else
6127 /*****************/
6128 /* Unrealized FX */
6129 /*****************/
6130 if l_first = TRUE and rec.period_start = rec.deal_date then
6131 unrel_pl_value := l_fv;
6132 cum_pl_value := unrel_pl_value;
6133 else
6134 xtr_get_prev_fv_rate(rec, r_prev_hedge);
6135 unrel_pl_value := l_fv - r_prev_hedge.fair_value;
6136 cum_pl_value := r_prev_hedge.cum_pl + unrel_pl_value;
6137 end if;
6138 xtr_revl_fx_curr_gl(rec, l_hedge_flag, FALSE, currency_gl);
6139 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, rec.fair_value,
6140 unrel_pl_value, currency_gl, r_rd, retcode);
6141 end if;
6142
6143 rec.period_start := l_reval_date; -- this period end will be next period start
6144 fetch C_REVAL_DATE into l_reval_date;
6145 end if;
6146 end loop;
6147 Close C_REVAL_DATE;
6148
6149 END xtr_revl_fv_fxh;
6150
6151 ----------------------------------------------------------------
6152 /**************************************************************/
6153 /* This procedure calculates and insert record into table */
6154 /* for Hedge Items Revaluations */
6155 /**************************************************************/
6156
6157 PROCEDURE xtr_revl_fv_hedge (rec IN OUT NOCOPY xtr_revl_rec) IS
6158
6159 Cursor C_REVAL_DATE is -- Find hedge reclass date within the batch range
6160 select reclass_date reval_date
6161 from XTR_RECLASS_DETAILS
6162 where hedge_attribute_id = rec.deal_no
6163 and reclass_date < rec.revldate
6164 and last_reval_batch_id is NULL
6165 union
6166 select nvl(discontinue_date, end_date) reval_date
6167 from XTR_HEDGE_ATTRIBUTES
6168 where hedge_attribute_id = rec.deal_no
6169 and nvl(discontinue_date, end_date) < rec.revldate
6170 union
6171 select effective_date reval_date
6172 from XTR_ELIGIBLE_HEDGES_V
6173 where deal_no = rec.deal_no
6174 and effective_date < rec.revldate
6175 union
6176 select period_end reval_date
6177 from xtr_batches
6178 where batch_id = rec.batch_id
6179 order by reval_date asc;
6180
6181 -- Bug 4234575 This cursor has been added so that totally reclassified
6182 -- hedges are not picked up for revaluation
6183 cursor C_BALANCE_AMT(p_revldate DATE) is
6184 select RECLASS_BALANCE_AMT
6185 from xtr_reclass_details
6186 where HEDGE_ATTRIBUTE_ID = rec.deal_no
6187 and RECLASS_DATE = (select max(RECLASS_DATE) from xtr_reclass_details
6188 where HEDGE_ATTRIBUTE_ID = rec.deal_no and rECLASS_DATE < p_revldate);
6189
6190
6191
6192 cursor C_PROS_FREQ is
6193 select pros_frequency_num, pros_frequency_unit
6194 from XTR_HEDGE_ATTRIBUTES
6195 where hedge_attribute_id = rec.deal_no
6196 and PROS_METHOD <> 'NOTEST';
6197
6198 /* This Cursor is added to populate hedge date when */
6199 /* the prospective test is not done initially Bug 4201031 */
6200 cursor C_PROS_NOT_FOUND is
6201 select start_date
6202 from XTR_HEDGE_ATTRIBUTES
6203 where hedge_attribute_id = rec.deal_no
6204 and PROS_METHOD <> 'NOTEST';
6205
6206 -- bug 4214554
6207 /* This cursor is added to check that the date on which the
6208 prospective test is required should not exceed the hedge end date */
6209 cursor C_PROS_NOT_REQUIRED is
6210 select least( nvl(discontinue_date, end_date),reclass_date)
6211 from XTR_HEDGE_ATTRIBUTES hat , XTR_RECLASS_DETAILS rd
6212 where hat.hedge_attribute_id = rec.deal_no
6213 and PROS_METHOD <> 'NOTEST'
6214 and reclass_balance_amt = 0
6215 and hat.hedge_attribute_id = rd.hedge_attribute_id;
6216
6217
6218
6219 cursor C_PROS_TEST is
6220 select max(result_date)
6221 from XTR_HEDGE_PRO_TESTS
6222 where hedge_attribute_id = rec.deal_no;
6223
6224 l_start_date DATE;
6225 l_end_date DATE;
6226 l_hedge_end DATE;
6227 l_prev_end_date DATE;
6228 l_test VARCHAR2(30);
6229 l_freq_num NUMBER;
6230 l_freq_unit VARCHAR2(1);
6231 l_result_date DATE;
6232 l_next_test_date DATE;
6233 l_complete_flag VARCHAR2(1) := 'Y';
6234 l_first BOOLEAN;
6235 l_buff Varchar2(500);
6236 retcode NUMBER;
6237 l_balance_amt NUMBER := -1;
6238
6239 BEGIN
6240 LOG_MSG('Entering procedure xtr_revl_fv_hedge');
6241 -- Check Prospective Tests status
6242 select PARAMETER_VALUE_CODE
6243 into l_test
6244 from xtr_company_parameters
6245 where COMPANY_CODE = rec.company_code and
6246 PARAMETER_CODE = C_BTEST;
6247
6248 if nvl(l_test, 'N') = 'Y' then
6249 open C_PROS_FREQ;
6250 Fetch C_PROS_FREQ into l_freq_num, l_freq_unit;
6251 if C_PROS_FREQ%FOUND then -- prospective test is required
6252 Open C_PROS_TEST;
6253 Fetch C_PROS_TEST into l_result_date;
6254 --if C_PROS_TEST%FOUND then
6255 if l_result_date is NOT NULL then
6256 if l_freq_unit = 'D' then
6257 l_next_test_date := l_result_date + l_freq_num;
6258 elsif l_freq_unit = 'W' then
6259 l_next_test_date := l_result_date + (7 * l_freq_num);
6260 elsif l_freq_unit = 'M' then
6261 l_next_test_date := add_months(l_result_date, l_freq_num);
6262 elsif l_freq_unit = 'Q' then
6263 l_next_test_date := add_months(l_result_date, l_freq_num * 3);
6264 elsif l_freq_unit = 'Y' then
6265 l_next_test_date := add_months(l_result_date, l_freq_num * 12);
6266 end if;
6267
6268 open C_PROS_NOT_REQUIRED;
6269 fetch C_PROS_NOT_REQUIRED into l_hedge_end ;
6270 close C_PROS_NOT_REQUIRED;
6271
6272 if l_next_test_date < rec.revldate and l_next_test_date <
6273 nvl(l_hedge_end,rec.revldate) then
6274 l_complete_flag := 'N';
6275 end if;
6276 else -- No prospective test record exists
6277 l_complete_flag := 'N';
6278 open C_PROS_NOT_FOUND;
6279 fetch C_PROS_NOT_FOUND into l_next_test_date;
6280 close C_PROS_NOT_FOUND;
6281 end if;
6282 CLose C_PROS_TEST;
6283 End if;
6284 Close C_PROS_FREQ;
6285 end if;
6286
6287 if l_complete_flag = 'N' then
6288 set_err_log(retcode);
6289 FND_MESSAGE.SET_NAME('XTR', 'XTR_REVAL_PROS_FAIL');
6290 FND_MESSAGE.SET_TOKEN('HEDGE_NO', rec.deal_no);
6291 FND_MESSAGE.SET_TOKEN('NEXT_TEST_DATE', l_next_test_date);
6292 l_buff := FND_MESSAGE.GET;
6293 FND_FILE.put_line(fnd_file.log, l_buff);
6294 end if;
6295
6296 xtr_first_reval(rec, l_first);
6297 if l_first = TRUE then -- first time reval
6298 l_start_date := rec.start_date;
6299 else
6300 l_start_date := rec.batch_start - 1;
6301 end if;
6302 Open C_REVAL_DATE;
6303 Fetch C_REVAL_DATE into l_end_date;
6304 While C_REVAL_DATE%FOUND loop
6305 if l_end_date >= rec.batch_start then -- bug 4214523
6306 if l_end_date > rec.effective_date then
6307 Close C_REVAL_DATE;
6308 Return;
6309 else
6310 -- bug 4234575
6311 open c_balance_amt(l_end_date);
6312 fetch c_balance_amt into l_balance_amt;
6313 close c_balance_amt;
6314
6315 LOG_MSG('xtr_revl_fv_hedge rec.deal_no',rec.deal_no);
6316 LOG_MSG('xtr_revl_fv_hedge l_start_date',l_start_date);
6317 LOG_MSG('xtr_revl_fv_hedge l_end_date',l_end_date);
6318 LOG_MSG('xtr_revl_fv_hedge rec.face_value',rec.face_value);
6319
6320 if nvl(l_balance_amt, -1) <> 0 then
6321 if rec.pricing_model = 'NONE' then -- forward rate model
6322 XTR_HEDGE_FWD_RATE(rec, l_start_date, l_end_date, l_complete_flag);
6323 else
6324 XTR_HEDGE_GL_RATE(rec, l_start_date, l_end_date, l_complete_flag);
6325 end if;
6326 else
6327 return;
6328 end if;
6329 end if;
6330 l_start_date := l_end_date; -- bug 42145323
6331 end if;
6332 Fetch C_REVAL_DATE into l_end_date;
6333 End loop;
6334 Close C_REVAL_DATE;
6335
6336 LOG_MSG('Ending xtr_revl_fv_hedge');
6337 END xtr_revl_fv_hedge;
6338 ----------------------------------------------------------------
6339 /**************************************************************/
6340 /* This procedure calculates Hedge item currency gain/loss for*/
6341 /* pricing mode 'GL Rate' (exclusion item value is TIME) */
6342 /**************************************************************/
6343 PROCEDURE xtr_hedge_gl_rate (rec IN OUT NOCOPY xtr_revl_rec,
6344 p_start_date IN DATE,
6345 p_end_date IN DATE,
6346 p_complete_flag IN VARCHAR2) IS
6347
6348 cursor C_CUR_HEDGE_AMT is
6349 select reclass_details_id, reclass_balance_amt
6350 from XTR_RECLASS_DETAILS
6351 where hedge_attribute_id = rec.deal_no
6352 and reclass_date >= p_start_date
6353 and reclass_date < p_end_date;
6354
6355 l_buff Varchar2(500);
6356 r_rd XTR_REVALUATION_DETAILS%rowtype;
6357 retcode NUMBER;
6358 l_first BOOLEAN;
6359 l_reclass_id NUMBER;
6360 l_cur_hedge_amt NUMBER;
6361 l_last_reval BOOLEAN;
6362 l_begin_fv NUMBER;
6363 l_end_fv NUMBER;
6364 l_begin_rate NUMBER;
6365 l_end_rate NUMBER;
6366 l_deno NUMBER;
6367 l_numer NUMBER;
6368 l_round NUMBER;
6369 currency_gl NUMBER;
6370 fv_sob_amt NUMBER;
6371 unrel_sob_gl NUMBER;
6372 l_hedge_flag VARCHAR2(1);
6373 r_prev_hedge XTR_PREV_HEDGE;
6374
6375 BEGIN
6376 select rounding_factor
6377 into l_round
6378 from xtr_master_currencies_v
6379 where currency = rec.reval_ccy;
6380
6381 /* Derive the correct current hedge amount for the broken down piece */
6382 open C_CUR_HEDGE_AMT;
6383 Fetch C_CUR_HEDGE_AMT into l_reclass_id, l_cur_hedge_amt;
6384 if C_CUR_HEDGE_AMT%FOUND then
6385 rec.face_value := l_cur_hedge_amt;
6386
6387 Update XTR_RECLASS_DETAILS
6388 Set last_reval_batch_id = rec.batch_id
6389 where reclass_details_id = l_reclass_id;
6390 end if;
6391 Close C_CUR_HEDGE_AMT;
6392
6393 rec.fair_value := rec.face_value;
6394 rec.reval_rate := NULL;
6395 rec.period_start := p_start_date;
6396 rec.period_end := p_end_date;
6397 r_rd.amount_type := 'CCYUNRL';
6398 r_rd.transaction_period := p_end_date - p_start_date;
6399 if rec.effective_date < rec.revldate then
6400 r_rd.effective_days := 0;
6401 else
6402 r_rd.effective_days := rec.effective_date - rec.revldate;
6403 end if;
6404
6405 -- Find beginning GL rate
6406 xtr_first_reval(rec, l_first);
6407 if l_first = TRUE then -- first time reval
6408 GL_CURRENCY_API.get_triangulation_rate
6409 (rec.reval_ccy, rec.sob_ccy, rec.period_start, rec.ex_rate_type,
6410 l_deno, l_numer, l_begin_rate);
6411
6412 rec.deal_ex_rate_one := l_begin_rate;
6413 else
6414 XTR_GET_PREV_FV_RATE(rec, r_prev_hedge);
6415 l_begin_rate := r_prev_hedge.rate;
6416 if l_begin_rate is NULL then
6417 GL_CURRENCY_API.get_triangulation_rate
6418 (rec.reval_ccy, rec.sob_ccy, rec.period_start, rec.ex_rate_type,
6419 l_deno, l_numer, l_begin_rate);
6420 end if;
6421 end if;
6422
6423 -- Find ending GL rate
6424 GL_CURRENCY_API.get_triangulation_rate
6425 (rec.reval_ccy, rec.sob_ccy, rec.period_end, rec.ex_rate_type,
6426 l_deno, l_numer, l_end_rate);
6427
6428 l_begin_fv := round(rec.fair_value * l_begin_rate, l_round);
6429 l_end_fv := round(rec.fair_value * l_end_rate, l_round);
6430
6431 currency_gl := l_end_fv - l_begin_fv;
6432 rec.reval_ex_rate_one := l_end_rate;
6433
6434 if currency_gl is NULL or p_complete_flag = 'N' then
6435 l_hedge_flag := 'N';
6436 end if;
6437
6438 XTR_REVL_UNREAL_LOG(rec, 0, 0, l_end_fv, 0,
6439 currency_gl, r_rd, retcode, l_hedge_flag );
6440
6441
6442 EXCEPTION
6443 when GL_CURRENCY_API.no_rate then
6444 if g_call_by_form = true then
6445 FND_MESSAGE.set_name('XTR', 'XTR_NO_GL_RATE');
6446 APP_EXCEPTION.raise_exception;
6447 else
6448 set_err_log(retcode);
6449 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_RATE_CURRENCY_GL');
6450 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
6451 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
6452 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
6453 l_buff := FND_MESSAGE.GET;
6454 FND_FILE.put_line(fnd_file.log, l_buff);
6455 end if;
6456 when GL_CURRENCY_API.invalid_currency then
6457 if g_call_by_form = true then
6458 FND_MESSAGE.set_name('XTR', 'XTR_INVALID_CURRENCY');
6459 APP_EXCEPTION.raise_exception;
6460 else
6461 set_err_log(retcode);
6462 FND_MESSAGE.SET_NAME('XTR', 'XTR_INVALID_CURRENCY_TYPE');
6463 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
6464 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
6465 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
6466 l_buff := FND_MESSAGE.GET;
6467 FND_FILE.put_line(fnd_file.log, l_buff);
6468 end if;
6469 when others then
6470 if g_call_by_form = true then
6471 APP_EXCEPTION.raise_exception;
6472 else
6473 set_err_log(retcode);
6474 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
6475 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
6476 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
6477 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
6478 l_buff := FND_MESSAGE.GET;
6479 FND_FILE.put_line(fnd_file.log, l_buff);
6480 end if;
6481
6482 END xtr_hedge_gl_rate;
6483
6484
6485 ---------------------------------------------------------------
6486 /**************************************************************/
6487 /* This procedure calculates Hedge item unrealized gain/loss */
6488 /* for pricing mode 'Forward Rate' (Exclusion item is NONE) */
6489 /**************************************************************/
6490 PROCEDURE xtr_hedge_fwd_rate(rec IN OUT NOCOPY xtr_revl_rec,
6491 p_start_date IN DATE,
6492 p_end_date IN DATE,
6493 p_complete_flag IN VARCHAR2) IS
6494
6495 cursor C_CUR_HEDGE_AMT is
6496 select reclass_details_id, reclass_balance_amt
6497 from XTR_RECLASS_DETAILS
6498 where hedge_attribute_id = rec.deal_no
6499 and reclass_date >= p_start_date
6500 and reclass_date < p_end_date; -- bug 4276970
6501
6502
6503
6504 l_buff Varchar2(500);
6505 r_rd XTR_REVALUATION_DETAILS%rowtype;
6506 retcode NUMBER;
6507 l_reclass_id NUMBER;
6508 l_cur_hedge_amt NUMBER;
6509 l_last_reval BOOLEAN;
6510 l_begin_date DATE;
6511 l_begin_spot_rate NUMBER;
6512 l_begin_base_rate NUMBER;
6513 l_begin_contra_rate NUMBER;
6514 l_begin_fwd_rate NUMBER;
6515 l_spot_rate NUMBER;
6516 l_base_yield_rate NUMBER;
6517 l_contra_yield_rate NUMBER;
6518 l_sob_yield_rate NUMBER;
6519 l_forward_rate NUMBER;
6520 l_begin_fv NUMBER;
6521 l_end_fv NUMBER;
6522 l_base_ccy VARCHAR2(15);
6523 l_contra_ccy VARCHAR2(15);
6524 l_market_set VARCHAR2(30);
6525 l_reverse BOOLEAN ;
6526 l_first BOOLEAN;
6527 l_base_side VARCHAR2(1);
6528 l_contra_side VARCHAR2(1);
6529 l_spot_side VARCHAR2(1);
6530 l_spot_date DATE;
6531 l_future_date DATE;
6532 r_md_in xtr_market_data_p.md_from_set_in_rec_type;
6533 r_md_out xtr_market_data_p.md_from_set_out_rec_type;
6534 l_discount_date_method VARCHAR2(30);
6535 l_round NUMBER;
6536 l_deno NUMBER;
6537 l_no_of_days NUMBER;
6538 l_year_basis NUMBER;
6539 l_numer NUMBER;
6540 currency_gl NUMBER;
6541 unrel_pl_value NUMBER;
6542 l_hedge_flag VARCHAR2(1);
6543 r_prev_hedge XTR_PREV_HEDGE;
6544 r_mm_in XTR_MM_COVERS.presentValue_in_rec_type;
6545 r_mm_out XTR_MM_COVERS.presentValue_out_rec_type;
6546 l_first_call NUMBER; -- bug 4145664 issue 12
6547 BEGIN
6548 LOG_MSG('Entering xtr_hedge_fwd_rate');
6549
6550 select rounding_factor
6551 into l_round
6552 from xtr_master_currencies_v
6553 where currency = rec.reval_ccy;
6554
6555 /* Derive the correct current hedge amount for the broken down piece */
6556 open C_CUR_HEDGE_AMT;
6557 Fetch C_CUR_HEDGE_AMT into l_reclass_id, l_cur_hedge_amt;
6558 if C_CUR_HEDGE_AMT%FOUND then
6559 rec.face_value := l_cur_hedge_amt;
6560
6561 LOG_MSG(' xtr_hedge_fwd_rate rec.face_value',rec.face_value);
6562
6563 Update XTR_RECLASS_DETAILS
6564 Set last_reval_batch_id = rec.batch_id
6565 where reclass_details_id = l_reclass_id;
6566 end if;
6567 Close C_CUR_HEDGE_AMT;
6568
6569
6570 l_spot_date := p_end_date;
6571 l_future_date := rec.maturity_date; -- hedge end date
6572 l_first_call := 1;
6573 rec.period_start := p_start_date;
6574 rec.period_end := p_end_date;
6575 currency_gl := 0; -- No need to calculate currency gain/loss
6576 r_rd.amount_type := 'UNREAL';
6577 r_rd.transaction_period := p_end_date - p_start_date;
6578 if rec.effective_date < rec.revldate then
6579 r_rd.effective_days := 0;
6580 else
6581 r_rd.effective_days := rec.effective_date - rec.revldate;
6582 end if;
6583
6584 l_base_ccy := rec.currencya;
6585 l_contra_ccy := rec.sob_ccy;
6586 xtr_get_base_contra(l_base_ccy, l_contra_ccy, l_reverse);
6587
6588 -- set p_side depend on ask or bid
6589 if (l_reverse = true) then
6590 l_spot_side := 'B';
6591 l_contra_side := 'B';
6592 l_base_side := 'A';
6593 else
6594 l_spot_side := 'A';
6595 l_contra_side := 'A';
6596 l_base_side := 'B';
6597 end if;
6598
6599 l_market_set := rec.MARKET_DATA_SET;
6600 xtr_revl_get_mds(l_market_set, rec);
6601
6602 /**********************************************************************/
6603 /* Determine the beginning forward rate and FV at hedge start date */
6604 /*********************************************************************/
6605 xtr_first_reval(rec, l_first);
6606
6607 if l_first = TRUE then -- first time reval
6608 l_begin_date := rec.start_date;
6609
6610 XTR_CALC_P.calc_days_run(l_begin_date, l_future_date,
6611 rec.year_calc_type, l_no_of_days, l_year_basis);
6612 -- get spot rate between hedge ccy/sob ccy at hedge start date
6613 xtr_revl_mds_init(
6614 r_md_in,
6615 l_market_set,
6616 'R',
6617 C_SPOT_RATE_IND,
6618 l_begin_date,
6619 NULL,
6620 l_base_ccy,
6621 l_contra_ccy,
6622 NULL,
6623 NULL,
6624 l_spot_side,
6625 rec.batch_id,
6626 NULL);
6627
6628 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out, l_first_call);
6629 l_begin_spot_rate := r_md_out.p_md_out;
6630
6631 -- get base currency yield rate from market data set
6632 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE,
6633 C_YIELD_IND, l_begin_date, l_future_date,
6634 l_base_ccy, NULL, rec.year_calc_type,
6635 C_INTERPOL_LINER, l_base_side, rec.batch_id, NULL);
6636 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
6637 l_begin_base_rate := r_md_out.p_md_out;
6638
6639 -- get contra currency yield rate from market data set
6640 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE,
6641 C_YIELD_IND, l_begin_date, l_future_date,
6642 l_contra_ccy, NULL, rec.year_calc_type,
6643 C_INTERPOL_LINER, l_contra_side, rec.batch_id, NULL);
6644 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
6645 l_begin_contra_rate := r_md_out.p_md_out;
6646
6647 -- Get forward-forward rate
6648 XTR_FX_FORMULAS.fx_forward_rate(
6649 l_begin_spot_rate,
6650 l_begin_base_rate,
6651 l_begin_contra_rate,
6652 l_no_of_days,
6653 l_no_of_days,
6654 l_year_basis,
6655 l_year_basis,
6656 l_begin_fwd_rate);
6657
6658 rec.deal_ex_rate_one := l_begin_fwd_rate;
6659
6660 Else -- not the first time reval. Get fwd rate from previous record.
6661 XTR_GET_PREV_FV_RATE(rec, r_prev_hedge);
6662 l_begin_fwd_rate := r_prev_hedge.rate;
6663 end if;
6664
6665 /***********************************************************/
6666 /* Determine the ending forward rate and FV at end date */
6667 /***********************************************************/
6668 XTR_CALC_P.calc_days_run(l_spot_date, l_future_date,
6669 rec.year_calc_type, l_no_of_days, l_year_basis);
6670 -- get spot rate between hedge ccy/sob ccy at hedge start date
6671 xtr_revl_mds_init(
6672 r_md_in,
6673 l_market_set,
6674 'R',
6675 C_SPOT_RATE_IND,
6676 l_spot_date,
6677 NULL,
6678 l_base_ccy,
6679 l_contra_ccy,
6680 NULL,
6681 NULL,
6682 l_spot_side,
6683 rec.batch_id,
6684 NULL);
6685
6686 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
6687 l_spot_rate := r_md_out.p_md_out;
6688
6689 -- get base currency yield rate from market data set
6690 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE,
6691 C_YIELD_IND, l_spot_date, l_future_date,
6692 l_base_ccy, NULL, rec.year_calc_type,
6693 C_INTERPOL_LINER, l_base_side, rec.batch_id, NULL);
6694 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
6695 l_base_yield_rate := r_md_out.p_md_out;
6696
6697 -- get contra currency yield rate from market data set
6698 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE,
6699 C_YIELD_IND, l_spot_date, l_future_date,
6700 l_contra_ccy, NULL, rec.year_calc_type,
6701 C_INTERPOL_LINER, l_contra_side, rec.batch_id, NULL);
6702 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
6703 l_contra_yield_rate := r_md_out.p_md_out;
6704
6705 -- Get forward-forward rate
6706 XTR_FX_FORMULAS.fx_forward_rate(
6707 l_spot_rate,
6708 l_base_yield_rate,
6709 l_contra_yield_rate,
6710 l_no_of_days,
6711 l_no_of_days,
6712 l_year_basis,
6713 l_year_basis,
6714 l_forward_rate);
6715
6716 if l_reverse = TRUE then
6717 l_begin_fv := round((rec.face_value / l_begin_fwd_rate), l_round);
6718 l_end_fv := round((rec.face_value / l_forward_rate), l_round);
6719 else
6720 l_begin_fv := round((rec.face_value * l_begin_fwd_rate), l_round);
6721 l_end_fv := round((rec.face_value * l_forward_rate), l_round);
6722 end if;
6723 rec.reval_rate := l_forward_rate;
6724
6725 -- If company parameter set to 'REVAL', then we should get discount fair value
6726 if (l_discount_date_method = 'REVAL') and (rec.effective_date > rec.revldate) then
6727 if l_reverse = TRUE then
6728 l_sob_yield_rate := l_base_yield_rate;
6729 else
6730 l_sob_yield_rate := l_contra_yield_rate;
6731 end if;
6732
6733 r_mm_in.P_FUTURE_VAL := rec.fair_value;
6734 r_mm_in.P_INDICATOR := C_YIELD_IND;
6735 r_mm_in.P_RATE := l_sob_yield_rate;
6736 r_mm_in.P_DAY_COUNT := l_no_of_days;
6737 r_mm_in.P_ANNUAL_BASIS:= l_year_basis;
6738 XTR_MM_COVERS.present_value(r_mm_in, r_mm_out);
6739 l_end_fv := round(r_mm_out.P_PRESENT_VAL, l_round);
6740 end if;
6741
6742 rec.fair_value := l_end_fv;
6743 unrel_pl_value := rec.fair_value - l_begin_fv;
6744
6745 if currency_gl is NULL or p_complete_flag = 'N' then
6746 l_hedge_flag := 'N';
6747 end if;
6748
6749 XTR_REVL_UNREAL_LOG(rec, unrel_pl_value, 0, l_end_fv, unrel_pl_value,
6750 currency_gl, r_rd, retcode, l_hedge_flag);
6751
6752
6753 EXCEPTION
6754 when XTR_MARKET_DATA_P.e_mdcs_no_data_found then
6755 if g_call_by_form = true then
6756 FND_MESSAGE.set_name('XTR', 'XTR_NO_MARKET');
6757 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
6758 APP_EXCEPTION.raise_exception;
6759 else
6760 set_err_log(retcode);
6761 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_MARKETDATASET');
6762 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
6763 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
6764 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
6765 l_buff := FND_MESSAGE.GET;
6766 FND_FILE.put_line(fnd_file.log, l_buff);
6767 end if;
6768 when XTR_MARKET_DATA_P.e_mdcs_no_curve_found then
6769 if g_call_by_form = true then
6770 FND_MESSAGE.set_name('XTR', 'XTR_NO_CURVE');
6771 FND_MESSAGE.set_token('MARKET', rec.market_data_set);
6772 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
6773 APP_EXCEPTION.raise_exception;
6774 else
6775 set_err_log(retcode);
6776 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_CURVEMARKET');
6777 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
6778 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
6779 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
6780 l_buff := FND_MESSAGE.GET;
6781 FND_FILE.put_line(fnd_file.log, l_buff);
6782 end if;
6783 when others then
6784 if g_call_by_form = true then
6785 APP_EXCEPTION.raise_exception;
6786 else
6787 set_err_log(retcode);
6788 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_RATE_REF');
6789 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
6790 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
6791 FND_MESSAGE.SET_TOKEN('ISSUE_CODE', rec.contract_code);
6792 l_buff := FND_MESSAGE.GET;
6793 fnd_file.put_line(fnd_file.log, l_buff);
6794 end if;
6795 END xtr_hedge_fwd_rate;
6796
6797 ---------------------------------------------------------------
6798 /****************************************************************/
6799 /* This procedure returns either previous currency exchange rate*/
6800 /* for GL rate pricing model or previous forward-forward rate */
6801 /* for forward rate pricing model. */
6802 /****************************************************************/
6803 PROCEDURE xtr_get_prev_fv_rate(rec IN OUT NOCOPY xtr_revl_rec,
6804 r_prev_hedge OUT NOCOPY xtr_prev_hedge) IS
6805
6806 cursor C_GL_RATE is
6807 select fair_value, exchange_rate_one, cumm_gain_loss_amount
6808 from XTR_REVALUATION_DETAILS
6809 where deal_no = rec.deal_no
6810 and company_code = rec.company_code
6811 and period_to = (select max(period_to)
6812 from xtr_revaluation_details
6813 where company_code = rec.company_code
6814 and deal_no = rec.deal_no
6815 and nvl(realized_flag, 'N') = 'N');
6816
6817 Cursor C_FWD_RATE is
6818 select fair_value, reval_rate, CTR_CURR_SOB_CURR_FWD_RATE,
6819 cumm_gain_loss_amount
6820 from XTR_REVALUATION_DETAILS
6821 where deal_no = rec.deal_no
6822 and company_code = rec.company_code
6823 and period_to = (select max(period_to)
6824 from xtr_revaluation_details
6825 where company_code = rec.company_code
6826 and deal_no = rec.deal_no
6827 and nvl(realized_flag, 'N') = 'N');
6828
6829 l_gl_rate NUMBER;
6830 l_fwd_rate NUMBER;
6831 l_sob_fwd_rate NUMBER;
6832 l_fv NUMBER;
6833 l_cum_pl NUMBER;
6834
6835 BEGIN
6836 if (rec.deal_type = 'HEDGE' and rec.pricing_model = 'TIME') or
6837 (rec.deal_type = 'FX' and rec.pricing_model = 'FX_GL') then -- GL rate model
6838 Open C_GL_RATE;
6839 Fetch C_GL_RATE into l_fv, l_gl_rate, l_cum_pl;
6840 Close C_GL_RATE;
6841
6842 r_prev_hedge.fair_value := nvl(l_fv, 0);
6843 r_prev_hedge.rate := l_gl_rate;
6844 r_prev_hedge.cum_pl := l_cum_pl;
6845
6846 Elsif (rec.deal_type = 'HEDGE' and rec.pricing_model = 'NONE') or
6847 (rec.deal_type = 'FX' and rec.pricing_model = 'FX_FORWARD') then -- Forward rate model
6848 Open C_FWD_RATE;
6849 Fetch C_FWD_RATE into l_fv, l_fwd_rate, l_sob_fwd_rate, l_cum_pl;
6850 Close C_FWD_RATE;
6851
6852 r_prev_hedge.fair_value := nvl(l_fv, 0);
6853 r_prev_hedge.rate := l_fwd_rate;
6854 r_prev_hedge.sob_rate := l_sob_fwd_rate;
6855 r_prev_hedge.cum_pl := l_cum_pl;
6856 end if;
6857
6858 END xtr_get_prev_fv_rate;
6859
6860 --------------------------------------------------------
6861 /*********************************************************/
6862 /* This procedure returns fair value for deal type FXO */
6863 /*********************************************************/
6864 PROCEDURE xtr_revl_fv_fxo(
6865 rec IN xtr_revl_rec,
6866 p_spot_rate IN NUMBER,
6867 p_put_price IN NUMBER,
6868 p_call_price IN NUMBER,
6869 fair_value OUT NOCOPY NUMBER) IS
6870
6871 l_ref_ccy VARCHAR2(15);
6872 l_counter_ccy VARCHAR2(15);
6873 l_base_ccy VARCHAR2(15);
6874 l_contra_ccy VARCHAR2(15);
6875 l_deal_base_ccy VARCHAR2(15);
6876 l_cap_floor VARCHAR2(5);
6877 l_base_amt NUMBER;
6878 l_side VARCHAR2(5);
6879 l_ccy VARCHAR2(15);
6880 l_dummy BOOLEAN;
6881 retcode NUMBER;
6882
6883 begin
6884
6885 -- determine counter currency and base amount
6886 l_base_ccy := rec.currencya;
6887 l_contra_ccy := rec.currencyb;
6888
6889 -- get base contra ccy here
6890 xtr_get_base_contra(l_base_ccy, l_contra_ccy, l_dummy);
6891
6892 if (rec.deal_subtype = 'BUY' and rec.cap_or_floor = 'C') or
6893 (rec.deal_subtype = 'SELL' and rec.cap_or_floor = 'P')then
6894 l_ref_ccy := rec.currencya;
6895 l_counter_ccy := rec.currencyb;
6896 else
6897 l_ref_ccy := rec.currencyb;
6898 l_counter_ccy := rec.currencya;
6899 end if;
6900
6901 if (l_ref_ccy <> l_base_ccy) then
6902 -- turn around the floor cap
6903 if (rec.cap_or_floor = 'C') then
6904 l_cap_floor := 'P';
6905 else
6906 l_cap_floor := 'C';
6907 end if;
6908 else
6909 l_cap_floor := rec.cap_or_floor;
6910 end if;
6911
6912 if (l_base_ccy = rec.currencya) then
6913 l_base_amt := rec.face_value; -- deal buy amount
6914 else
6915 l_base_amt := rec.fxo_sell_ref_amount; -- deal sell amount
6916 end if;
6917
6918 if (l_cap_floor = 'C') then -- fair value in contra ccy
6919 fair_value := p_call_price * l_base_amt;
6920 else
6921 fair_value := p_put_price * l_base_amt;
6922 end if;
6923
6924 if (rec.reval_ccy <> l_contra_ccy) then --fair value in premium ccy
6925 fair_value := fair_value/p_spot_rate;
6926 end if;
6927
6928 if rec.deal_subtype = 'SELL' then
6929 fair_value := fair_value * (-1);
6930 end if;
6931
6932 end xtr_revl_fv_fxo;
6933 --------------------------------------------------------
6934 /*********************************************************/
6935 /* This procedure returns reval rate for deal type FXO */
6936 /*********************************************************/
6937 PROCEDURE xtr_revl_getprice_fxo(
6938 rec IN OUT NOCOPY xtr_revl_rec,
6939 p_spot_rate IN OUT NOCOPY NUMBER,
6940 p_put_price IN OUT NOCOPY NUMBER,
6941 p_call_price IN OUT NOCOPY NUMBER) IS
6942 l_buf Varchar2(500);
6943 l_no_of_days NUMBER;
6944 l_year NUMBER;
6945 l_base_ccy VARCHAR2(15);
6946 l_contra_ccy VARCHAR2(15);
6947 l_side VARCHAR2(5);
6948 l_dummy BOOLEAN;
6949 r_md_in xtr_market_data_p.md_from_set_in_rec_type;
6950 r_md_out xtr_market_data_p.md_from_set_out_rec_type;
6951 l_volatility NUMBER;
6952 l_trans_rate_buy NUMBER;
6953 l_trans_rate_sell NUMBER;
6954 l_trans_rate NUMBER;
6955 l_num_year NUMBER;
6956 l_market_set VARCHAR2(30);
6957 l_fwd_rate NUMBER;
6958 l_base_rate NUMBER;
6959 l_contra_rate NUMBER;
6960 r_fx_in XTR_FX_FORMULAS.GK_OPTION_CV_IN_REC_TYPE;
6961 r_fx_out XTR_FX_FORMULAS.GK_OPTION_CV_OUT_REC_TYPE;
6962 r_err_log err_log; -- record type
6963 retcode NUMBER;
6964
6965 BEGIN
6966 l_market_set := rec.MARKET_DATA_SET;
6967 xtr_revl_get_mds(l_market_set, rec);
6968
6969 if rec.pricing_model <> C_P_MODEL_GARMAN then
6970 return;
6971 end if;
6972
6973 if rec.expiry_date <= rec.revldate and rec.status_code = 'CURRENT' then
6974 set_err_log(retcode);
6975 FND_MESSAGE.SET_NAME('XTR', 'XTR_DEAL_EXPIRY');
6976 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
6977 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
6978 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
6979 l_buf := FND_MESSAGE.GET;
6980 FND_FILE.put_line(fnd_file.log, l_buf);
6981 Else
6982 XTR_CALC_P.calc_days_run(rec.revldate, rec.expiry_date,
6983 rec.year_calc_type, l_no_of_days, l_year);
6984
6985 l_num_year := l_no_of_days/l_year;
6986
6987 -- determine counter currency and base amount
6988 l_base_ccy := rec.currencya; -- deal buy currency
6989 l_contra_ccy := rec.currencyb; -- deal sell currency
6990
6991 -- get base contra ccy here
6992 xtr_get_base_contra(l_base_ccy, l_contra_ccy, l_dummy);
6993
6994 if(rec.deal_subtype = 'BUY') then
6995 l_side := 'A';
6996 else
6997 l_side := 'B';
6998 end if;
6999
7000 -- Get volatility rate
7001 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE,
7002 C_VOLATILITY_IND, rec.revldate, rec.expiry_date,
7003 l_base_ccy, l_contra_ccy, rec.year_calc_type,
7004 C_INTERPOL_LINER, l_side, rec.batch_id, NULL);
7005
7006 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
7007 l_volatility := r_md_out.p_md_out;
7008
7009 -- return a interest rate for Buy currency
7010 l_side := 'A';
7011 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE,
7012 C_YIELD_IND, rec.revldate, rec.expiry_date,
7013 rec.currencya, l_contra_ccy, rec.year_calc_type,
7014 C_INTERPOL_LINER, l_side, rec.batch_id, NULL);
7015 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
7016 l_trans_rate_buy := r_md_out.p_md_out;
7017
7018 -- return a interest rate for Sell currency
7019 l_side := 'B';
7020
7021 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE,
7022 C_YIELD_IND, rec.revldate, rec.expiry_date,
7023 rec.currencyb, l_contra_ccy, rec.year_calc_type,
7024 C_INTERPOL_LINER, l_side, rec.batch_id, NULL);
7025 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
7026 l_trans_rate_sell := r_md_out.p_md_out;
7027
7028 -- get FX spot rate
7029 if(rec.currencyb = l_base_ccy) then
7030 l_side := 'B';
7031 else
7032 l_side := 'A';
7033 end if;
7034
7035 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE,
7036 C_SPOT_RATE_IND, rec.start_date, NULL,
7037 l_base_ccy, l_contra_ccy, rec.year_calc_type,
7038 C_INTERPOL_LINER, l_side, rec.batch_id, NULL);
7039 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
7040 p_spot_rate := r_md_out.p_md_out;
7041
7042 if (l_base_ccy = rec.currencya) then
7043 l_base_rate := l_trans_rate_buy;
7044 l_contra_rate := l_trans_rate_sell;
7045 else
7046 l_base_rate := l_trans_rate_sell;
7047 l_contra_rate := l_trans_rate_buy;
7048 end if;
7049
7050 r_fx_in.p_spot_date := rec.revldate;
7051 r_fx_in.p_maturity_date:= rec.expiry_date;
7052 r_fx_in.p_rate_dom := l_contra_rate;
7053 r_fx_in.p_day_count_basis_dom := rec.year_calc_type;
7054 r_fx_in.p_rate_for := l_base_rate;
7055 r_fx_in.p_day_count_basis_for := rec.year_calc_type;
7056 r_fx_in.p_spot_rate := p_spot_rate;
7057 r_fx_in.p_strike_rate := rec.transaction_rate;
7058 r_fx_in.p_volatility := l_volatility;
7059
7060 XTR_FX_FORMULAS.fx_gk_option_price_cv(r_fx_in, r_fx_out);
7061 p_call_price := r_fx_out.p_CALL_PRICE;
7062 p_put_price := r_fx_out.p_PUT_PRICE;
7063 l_fwd_rate := r_fx_out.p_FX_FWD_RATE;
7064 /*
7065 IF xtr_risk_debug_pkg.g_Debug THEN
7066 xtr_risk_debug_pkg.dpush('xtr_revl_getprice_fxo: ' || 'fx_gk_option_price_cv');
7067 xtr_risk_debug_pkg.dlog ('xtr_revl_getprice_fxo: ' || 'deal no', rec.deal_no);
7068 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_fxo: ' || 'spot date', r_fx_in.p_spot_date);
7069 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_fxo: ' || 'mature date', r_fx_in.p_maturity_date);
7070 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_fxo: ' || 'l_base_rate', r_fx_in.p_rate_dom);
7071 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_fxo: ' || 'l_contra_rate', r_fx_in.p_rate_for);
7072 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_fxo: ' || 'p_spot_rate', r_fx_in.p_spot_rate);
7073 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_fxo: ' || 'l_trans_rate', r_fx_in.p_strike_rate);
7074 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_fxo: ' || 'l_volatility', r_fx_in.p_volatility);
7075 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_fxo: ' || 'p_call_price', p_call_price);
7076 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_fxo: ' || 'p_put_price', p_put_price);
7077 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_fxo: ' || 'l_fwd_rate', l_fwd_rate);
7078 xtr_risk_debug_pkg.dpop('xtr_revl_getprice_fxo: ' || 'fx_gk_option_price_cv');
7079 END IF; */
7080
7081 End If;
7082 rec.reval_rate := l_fwd_rate;
7083
7084 EXCEPTION
7085 when XTR_MARKET_DATA_P.e_mdcs_no_data_found then
7086 if g_call_by_form = true then
7087 FND_MESSAGE.set_name('XTR', 'XTR_NO_MARKET');
7088 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
7089 APP_EXCEPTION.raise_exception;
7090 else
7091 set_err_log(retcode);
7092 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_MARKETDATASET');
7093 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
7094 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
7095 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
7096 l_buf := FND_MESSAGE.GET;
7097 FND_FILE.put_line(fnd_file.log, l_buf);
7098 end if;
7099 when XTR_MARKET_DATA_P.e_mdcs_no_curve_found then
7100 if g_call_by_form = true then
7101 FND_MESSAGE.set_name('XTR', 'XTR_NO_CURVE');
7102 FND_MESSAGE.set_token('MARKET', rec.market_data_set);
7103 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
7104 APP_EXCEPTION.raise_exception;
7105 else
7106 set_err_log(retcode);
7107 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_CURVEMARKET');
7108 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
7109 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
7110 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
7111 l_buf := FND_MESSAGE.GET;
7112 FND_FILE.put_line(fnd_file.log, l_buf);
7113 end if;
7114 when others then
7115 if g_call_by_form = true then
7116 APP_EXCEPTION.raise_exception;
7117 else
7118 set_err_log(retcode);
7119 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
7120 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
7121 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
7122 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
7123 l_buf := FND_MESSAGE.GET;
7124 FND_FILE.put_line(fnd_file.log, l_buf);
7125 end if;
7126 end xtr_revl_getprice_fxo;
7127 --------------------------------------------------------
7128 /*********************************************************/
7129 /* This procedure returns fair value for deal type NI */
7130 /*********************************************************/
7131 PROCEDURE xtr_revl_fv_ni(
7132 rec IN xtr_revl_rec,
7133 fair_value IN OUT NOCOPY NUMBER,
7134 p_revl_rate IN OUT NOCOPY NUMBER) IS
7135 l_buf Varchar2(500);
7136 l_spot_date DATE;
7137 l_start_date DATE;
7138 l_end_date DATE;
7139 l_market_set VARCHAR2(30);
7140 l_discount_date_method VARCHAR2(30);
7141 l_side VARCHAR2(5);
7142 l_rate_type VARCHAR2(1);
7143 r_md_in xtr_market_data_p.md_from_set_in_rec_type;
7144 r_md_out xtr_market_data_p.md_from_set_out_rec_type;
7145 r_present_in XTR_MM_COVERS.presentValue_in_rec_type;
7146 r_present_out XTR_MM_COVERS.presentValue_out_rec_type;
7147 l_day NUMBER;
7148 l_year NUMBER;
7149 l_int_rate NUMBER;
7150 l_margin NUMBER;
7151 l_parcel_amt NUMBER;
7152 l_disc_yield_basis VARCHAR2(8);
7153 p_indicator VARCHAR2(2);
7154 r_err_log err_log; -- record type
7155 retcode NUMBER;
7156
7157 begin
7158 select PARAMETER_VALUE_CODE into l_discount_date_method
7159 from xtr_company_parameters
7160 where COMPANY_CODE = rec.company_code and
7161 PARAMETER_CODE = C_FUTURE_DATE_NI; -- 'REVAL_FDNDR'
7162
7163 -- select BALANCE_OUT - INTEREST
7164 select BALANCE_OUT
7165 into l_parcel_amt
7166 from xtr_rollover_transactions
7167 where DEAL_NUMBER = rec.deal_no and
7168 TRANSACTION_NUMBER = rec.trans_no;
7169
7170 select MARGIN, CALC_BASIS
7171 into l_margin, l_disc_yield_basis
7172 from XTR_DEALS
7173 where deal_no = rec.deal_no;
7174
7175 l_int_rate := rec.transaction_rate;
7176 l_market_set := rec.MARKET_DATA_SET;
7177 xtr_revl_get_mds(l_market_set, rec);
7178
7179 if rec.pricing_model <> C_P_MODEL_DIS then
7180 if rec.pricing_model is null then
7181 raise e_invalid_price_model;
7182 else
7183 fair_value := null;
7184 return;
7185 end if;
7186 end if;
7187
7188 -- Only reval BUY, SHORT, and ISSUE, not COVER and SELL
7189 if(rec.deal_subtype = 'BUY') then
7190 l_side := 'B';
7191 elsif rec.deal_subtype in ('SHORT', 'ISSUE') then
7192 l_side := 'A';
7193 else
7194 raise e_invalid_deal_subtype;
7195 end if;
7196
7197 if rec.start_date <= rec.revldate then
7198 l_rate_type := 'Y'; --yield
7199 else
7200 l_rate_type := 'F';
7201 end if;
7202 l_start_date := rec.start_date;
7203 l_spot_date := rec.revldate;
7204 l_end_date := rec.maturity_date;
7205
7206 xtr_revl_getrate_ni(rec, l_rate_type, l_market_set,
7207 rec.batch_id, rec.currencya, l_spot_date, l_start_date,
7208 rec.maturity_date, rec.year_calc_type, l_side, l_disc_yield_basis,
7209 l_int_rate, l_day, l_year);
7210
7211 -- If use overwrite rate, we do not need to take calcualted rate
7212 If p_revl_rate is null then
7213 p_revl_rate := l_int_rate + nvl(l_margin, 0)/100;
7214 End If;
7215
7216 if l_disc_yield_basis = C_CALC_BASIS_D then -- 'DISCOUNT'
7217 p_indicator := C_DISCOUNT_IND; -- 'DR'
7218 else -- YIELD
7219 p_indicator := C_YIELD_IND; -- 'Y'
7220 end if;
7221
7222 r_present_in.p_indicator := p_indicator;
7223 r_present_in.p_future_val := l_parcel_amt;
7224 r_present_in.p_rate := p_revl_rate;
7225 r_present_in.p_day_count := l_day;
7226 r_present_in.p_annual_basis := l_year;
7227 XTR_MM_COVERS.present_value(r_present_in, r_present_out);
7228
7229 fair_value := r_present_out.p_present_val;
7230
7231 /* If trade date accounting is being used, the company parameter
7232 is set to discount back to revaluation date, and the revaluation
7233 date is < the deal start date, we have to perform another
7234 calculation to obtain the fair value of the deal on the date
7235 of revaluation. */
7236 if (l_discount_date_method = 'YRSRD' and rec.revldate < rec.start_date) then
7237 l_rate_type := 'Y'; --yield
7238 l_start_date := rec.revldate;
7239 l_spot_date := rec.revldate;
7240 l_end_date := rec.start_date;
7241 xtr_revl_getrate_ni(rec, l_rate_type, l_market_set,
7242 rec.batch_id, rec.currencya, l_spot_date, l_start_date,
7243 l_end_date, rec.year_calc_type, l_side, l_disc_yield_basis,
7244 l_int_rate, l_day, l_year);
7245
7246 -- If use overwrite rate, we do not need to take calcualted rate
7247 If p_revl_rate is null then
7248 p_revl_rate := l_int_rate;
7249 End if;
7250
7251 if l_disc_yield_basis = C_CALC_BASIS_D then -- 'DISCOUNT'
7252 p_indicator := C_DISCOUNT_IND; -- 'DR'
7253 else -- YIELD
7254 p_indicator := C_YIELD_IND; -- 'Y'
7255 end if;
7256 r_present_in.p_indicator := p_indicator;
7257 r_present_in.p_future_val := l_parcel_amt;
7258 r_present_in.p_rate := p_revl_rate;
7259 r_present_in.p_day_count := l_day;
7260 r_present_in.p_annual_basis := l_year;
7261 XTR_MM_COVERS.present_value(r_present_in, r_present_out);
7262
7263 fair_value := r_present_out.p_present_val;
7264 end if;
7265
7266 if rec.deal_subtype in ('SHORT', 'ISSUE') then
7267 fair_value := fair_value * (-1);
7268 end if;
7269
7270 EXCEPTION
7271 when others then
7272 if g_call_by_form = true then
7273 APP_EXCEPTION.raise_exception;
7274 else
7275 set_err_log(retcode);
7276 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
7277 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
7278 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
7279 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
7280 l_buf := FND_MESSAGE.GET;
7281 FND_FILE.put_line(fnd_file.log, l_buf);
7282 end if;
7283 end xtr_revl_fv_ni;
7284 --------------------------------------------------------
7285 /*********************************************************/
7286 /* This procedure returns reval rate for deal type NI */
7287 /*********************************************************/
7288 PROCEDURE xtr_revl_getrate_ni(
7289 rec IN xtr_revl_rec,
7290 p_rate_type IN VARCHAR2,
7291 p_market_set IN VARCHAR2,
7292 p_batch_id IN NUMBER,
7293 p_ccy IN VARCHAR2,
7294 p_spot_date IN DATE,
7295 p_start_date IN DATE,
7296 p_end_date IN DATE,
7297 p_day_count IN VARCHAR2,
7298 p_side IN VARCHAR2,
7299 p_deal_basis IN VARCHAR2,
7300 p_int_rate OUT NOCOPY NUMBER,
7301 p_day OUT NOCOPY NUMBER,
7302 p_year OUT NOCOPY NUMBER) IS
7303 l_buf Varchar2(500);
7304 l_ind VARCHAR2(1);
7305 l_date DATE;
7306 r_md_in xtr_market_data_p.md_from_set_in_rec_type;
7307 r_md_out xtr_market_data_p.md_from_set_out_rec_type;
7308 r_err_log err_log; -- record type
7309 retcode NUMBER;
7310
7311 begin
7312 if p_rate_type = 'Y' then
7313 l_ind := C_YIELD_IND;
7314 else
7315 l_ind := NULL; -- for forward rate
7316 end if;
7317
7318 if p_spot_date > p_start_date then
7319 l_date := p_spot_date;
7320 else
7321 l_date := p_start_date;
7322 end if;
7323
7324 xtr_revl_mds_init(r_md_in, p_market_set, C_SOURCE,
7325 l_ind, l_date, p_end_date,
7326 p_ccy, NULL, p_day_count,
7327 C_INTERPOL_LINER, p_side, p_batch_id, NULL);
7328 if l_ind is not NULL then
7329 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
7330 p_int_rate := r_md_out.p_md_out;
7331 else
7332 xtr_revl_getprice_fwd(rec, FALSE, p_int_rate); -- get forward forward rate
7333 end if;
7334
7335 XTR_CALC_P.calc_days_run(l_date, p_end_date,
7336 p_day_count, p_day, p_year);
7337
7338 if p_deal_basis = 'DISCOUNT' then
7339 XTR_RATE_CONVERSION.yield_to_discount_rate(
7340 p_int_rate, p_day, p_year, p_int_rate);
7341 end if;
7342
7343 EXCEPTION
7344 when XTR_MARKET_DATA_P.e_mdcs_no_data_found then
7345 if g_call_by_form = true then
7346 FND_MESSAGE.set_name('XTR', 'XTR_NO_MARKET');
7347 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
7348 APP_EXCEPTION.raise_exception;
7349 else
7350 set_err_log(retcode);
7351 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_MARKETDATASET');
7352 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
7353 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
7354 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
7355 l_buf := FND_MESSAGE.GET;
7356 FND_FILE.put_line(fnd_file.log, l_buf);
7357 end if;
7358 when XTR_MARKET_DATA_P.e_mdcs_no_curve_found then
7359 if g_call_by_form = true then
7360 FND_MESSAGE.set_name('XTR', 'XTR_NO_CURVE');
7361 FND_MESSAGE.set_token('MARKET', rec.market_data_set);
7362 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
7363 APP_EXCEPTION.raise_exception;
7364 else
7365 set_err_log(retcode);
7366 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_CURVEMARKET');
7367 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
7368 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
7369 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
7370 l_buf := FND_MESSAGE.GET;
7371 FND_FILE.put_line(fnd_file.log, l_buf);
7372 end if;
7373 when others then
7374 if g_call_by_form = true then
7375 APP_EXCEPTION.raise_exception;
7376 else
7377 set_err_log(retcode);
7378 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
7379 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
7380 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
7381 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
7382 l_buf := FND_MESSAGE.GET;
7383 FND_FILE.put_line(fnd_file.log, l_buf);
7384 end if;
7385
7386 end xtr_revl_getrate_ni;
7387 -------------------------------------------------------------
7388 /*********************************************************/
7389 /* This procedure returns reval rate for deal type BOND */
7390 /*********************************************************/
7391 PROCEDURE xtr_revl_getprice_bond(
7392 rec IN xtr_revl_rec,
7393 p_bond_clean_price OUT NOCOPY NUMBER) IS
7394 l_bond_issue XTR_DEALS.bond_issue%TYPE;
7395 l_ric_code XTR_BOND_ISSUES.ric_code%TYPE;
7396 l_margin XTR_DEALS.margin%TYPE;
7397 l_coupon_action XTR_DEALS.coupon_action%TYPE;
7398 l_side VARCHAR2(1);
7399 l_bond_yield_m NUMBER;
7400 l_yield NUMBER;
7401 l_accrued_interest NUMBER;
7402 l_settle_date DATE;
7403 l_dirty_price NUMBER;
7404 l_market_set VARCHAR2(30);
7405 l_clean_price NUMBER;
7406 r_md_in xtr_market_data_p.md_from_set_in_rec_type;
7407 r_md_out xtr_market_data_p.md_from_set_out_rec_type;
7408 r_err_log err_log; -- record type
7409 retcode NUMBER;
7410 l_buf VARCHAR2(300);
7411 l_buff Varchar2(500);
7412
7413 Begin
7414 -- We only reval BOND when the pricing model = 'MARKET'
7415 if rec.pricing_model <> C_P_MODEL_MARKET then
7416 return;
7417 end if;
7418
7419 If rec.revldate <= rec.maturity_date then
7420 l_settle_date := rec.revldate;
7421 Else
7422 l_settle_date := rec.maturity_date;
7423 End if;
7424
7425 select MARGIN, COUPON_ACTION
7426 into l_margin, l_coupon_action
7427 from XTR_DEALS
7428 where DEAL_NO = rec.deal_no;
7429
7430 select RIC_CODE
7431 into l_ric_code
7432 from XTR_BOND_ISSUES
7433 where bond_issue_code = rec.contract_code;
7434
7435 l_market_set := rec.MARKET_DATA_SET;
7436 xtr_revl_get_mds(l_market_set, rec);
7437
7438 if rec.deal_subtype = 'BUY' then
7439 l_side := 'B';
7440 elsif rec.deal_subtype = 'ISSUE' then
7441 l_side := 'A';
7442 else
7443 raise e_invalid_deal_subtype;
7444 end if;
7445
7446 /*** Get clean price from market data set ***/
7447 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE,
7448 C_BOND_IND, rec.revldate, rec.revldate, rec.currencya, NULL,
7449 NULL, NULL, l_side, rec.batch_id, l_ric_code);
7450 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
7451 p_bond_clean_price := r_md_out.p_md_out;
7452
7453 /*
7454 IF xtr_risk_debug_pkg.g_Debug THEN
7455 xtr_risk_debug_pkg.dpush('xtr_revl_getprice_bond: ' || 'BOND fair value');
7456 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_bond: ' || 'batch_id',rec.batch_id);
7457 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_bond: ' || 'market data set is '||l_market_set);
7458 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_bond: ' || 'reval date', rec.revldate);
7459 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_bond: ' || 'l_ric_code is ', l_ric_code);
7460 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_bond: ' || 'p_bond_clean_price is ', p_bond_clean_price);
7461 xtr_risk_debug_pkg.dpop('xtr_revl_getprice_bond: ' || 'BOND fair value');
7462 END IF;
7463 */
7464 If l_margin is not null then
7465 -- margin involved, convert bond price to YTM. Add margin to result.
7466 -- Then convert the sum back to a bond price
7467 XTR_CALC_P.calculate_bond_price_yield (
7468 p_bond_issue_code => rec.contract_code,
7469 p_settlement_date => rec.revldate,
7470 p_ex_cum_next_coupon => l_coupon_action,
7471 p_calculate_yield_or_price => 'Y',
7472 p_yield => l_yield,
7473 p_accrued_interest => l_accrued_interest,
7474 p_clean_price => p_bond_clean_price,
7475 p_dirty_price => l_dirty_price,
7476 p_input_or_calculator => 'I',
7477 p_commence_date => null,
7478 p_maturity_date => null,
7479 p_prev_coupon_date => null,
7480 p_next_coupon_date => null,
7481 p_calc_type => null,
7482 p_year_calc_type => null,
7483 p_accrued_int_calc_basis=> null,
7484 p_coupon_freq => null,
7485 p_calc_rounding => null,
7486 p_price_rounding => null,
7487 p_price_round_type => null,
7488 p_yield_rounding => null,
7489 p_yield_round_type => null,
7490 p_coupon_rate => null,
7491 p_num_coupons_remain => null
7492 );
7493 /*
7494 IF xtr_risk_debug_pkg.g_Debug THEN
7495 xtr_risk_debug_pkg.dpush('xtr_revl_getprice_bond: ' || 'BOND fair value');
7496 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_bond: ' || 'batch_id',rec.batch_id);
7497 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_bond: ' || 'l_bond_issue is ', l_bond_issue);
7498 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_bond: ' || 'reval date', rec.revldate);
7499 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_bond: ' || 'l_yield is ', l_yield);
7500 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_bond: ' || 'l_accrued_interest is ', l_accrued_interest);
7501 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_bond: ' || 'p_bond_clean_price', p_bond_clean_price);
7502 xtr_risk_debug_pkg.dlog('xtr_revl_getprice_bond: ' || 'l_dirty_price is ', l_dirty_price);
7503 xtr_risk_debug_pkg.dpop('xtr_revl_getprice_bond: ' || 'BOND fair value');
7504 END IF;
7505 */
7506 /* Add in margin */
7507 l_bond_yield_m := l_yield + nvl(l_margin,0)/100;
7508
7509 /* Convert yield with margin back to clean price */
7510 XTR_CALC_P.calculate_bond_price_yield (
7511 p_bond_issue_code => rec.contract_code,
7512 p_settlement_date => l_settle_date,
7513 p_ex_cum_next_coupon => l_coupon_action,
7514 p_calculate_yield_or_price => 'P',
7515 p_yield => l_bond_yield_m,
7516 p_accrued_interest => l_accrued_interest,
7517 p_clean_price => l_clean_price,
7518 p_dirty_price => l_dirty_price,
7519 p_input_or_calculator => 'I',
7520 p_commence_date => null,
7521 p_maturity_date => null,
7522 p_prev_coupon_date => null,
7523 p_next_coupon_date => null,
7524 p_calc_type => null,
7525 p_year_calc_type => null,
7526 p_accrued_int_calc_basis=> null,
7527 p_coupon_freq => null,
7528 p_calc_rounding => null,
7529 p_price_rounding => null,
7530 p_price_round_type => null,
7531 p_yield_rounding => null,
7532 p_yield_round_type => null,
7533 p_coupon_rate => null,
7534 p_num_coupons_remain => null
7535 );
7536 p_bond_clean_price := l_clean_price;
7537 End If;
7538
7539 EXCEPTION
7540 when XTR_MARKET_DATA_P.e_mdcs_no_data_found then
7541 if g_call_by_form = true then
7542 FND_MESSAGE.set_name('XTR', 'XTR_NO_MARKET');
7543 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
7544 APP_EXCEPTION.raise_exception;
7545 else
7546 set_err_log(retcode);
7547 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_MARKETDATASET');
7548 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
7549 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
7550 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
7551 l_buff := FND_MESSAGE.GET;
7552 FND_FILE.put_line(fnd_file.log, l_buff);
7553 end if;
7554 when XTR_MARKET_DATA_P.e_mdcs_no_curve_found then
7555 if g_call_by_form = true then
7556 FND_MESSAGE.set_name('XTR', 'XTR_NO_CURVE');
7557 FND_MESSAGE.set_token('MARKET', rec.market_data_set);
7558 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
7559 APP_EXCEPTION.raise_exception;
7560 else
7561 set_err_log(retcode);
7562 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_CURVEMARKET');
7563 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
7564 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
7565 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
7566 l_buff := FND_MESSAGE.GET;
7567 FND_FILE.put_line(fnd_file.log, l_buff);
7568 end if;
7569 when others then
7570 if g_call_by_form = true then
7571 APP_EXCEPTION.raise_exception;
7572 else
7573 set_err_log(retcode);
7574 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_RATE_REF');
7575 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
7576 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
7577 FND_MESSAGE.SET_TOKEN('ISSUE_CODE', rec.contract_code);
7578 l_buff := FND_MESSAGE.GET;
7579 fnd_file.put_line(fnd_file.log, l_buff);
7580 end if;
7581 End xtr_revl_getprice_bond;
7582 -------------------------------------------------------------
7583 /*********************************************************/
7584 /* This procedure returns fair value for deal type BOND */
7585 /*********************************************************/
7586 PROCEDURE xtr_revl_fv_bond(
7587 rec IN OUT NOCOPY xtr_revl_rec,
7588 p_clean_price IN NUMBER,
7589 fair_value OUT NOCOPY NUMBER) IS
7590
7591 Cursor c_bond_alloc is
7592 Select bond.deal_no, bond.cross_ref_no, bond.face_value, bond.initial_fair_value,
7593 bond.amc_real_gain_loss, bond.mtm_real_gain_loss, bond.cross_ref_clean_px,
7594 decode(cp.parameter_value_code, 'TRADE', bond.cross_ref_deal_date,
7595 bond.cross_ref_start_date) resale_rec_date
7596 from XTR_BOND_ALLOC_DETAILS BOND,
7597 XTR_COMPANY_PARAMETERS CP,
7598 XTR_DEALS D
7599 Where bond.deal_no = rec.deal_no
7600 and bond.deal_no = d.deal_no
7601 and bond.batch_id is null
7602 and cp.company_code = d.company_code
7603 and cp.parameter_code = 'ACCNT_TSDTM'
7604 and decode(cp.parameter_value_code, 'TRADE', bond.cross_ref_deal_date,
7605 bond.cross_ref_start_date) <= rec.revldate;
7606 l_buf Varchar2(500);
7607 bo_rec xtr_bond_rec; -- BOND record type
7608 l_pre_batch NUMBER;
7609 l_first BOOLEAN;
7610 l_resale BOOLEAN := null; -- Indicate if the record is result of resale
7611 l_overwrite BOOLEAN := FALSE;
7612 l_rounding NUMBER;
7613 r_err_log err_log; -- record type
7614 retcode NUMBER;
7615
7616 Begin
7617 select ROUNDING_FACTOR
7618 into l_rounding
7619 from XTR_MASTER_CURRENCIES_V
7620 where currency = rec.currencya;
7621
7622 bo_rec.batch_id := rec.batch_id;
7623 xtr_first_reval(rec, l_first);
7624 if l_first = TRUE then -- first time reval
7625 bo_rec.maturity_face_value := rec.face_value; -- xtr_deals.maturity_amount
7626 bo_rec.start_face_value := rec.face_value;
7627 bo_rec.cum_unrel_gl := 0;
7628 bo_rec.cum_unrel_gl_bal := 0;
7629 bo_rec.start_fair_value := rec.init_fv;
7630 bo_rec.pre_gl_rate := null;
7631 else -- not the first reval, got info from previous reval batch
7632 l_pre_batch := xtr_get_pre_batchid(rec);
7633 select fair_value, face_value, exchange_rate_one, cumm_gain_loss_amount
7634 into bo_rec.start_fair_value, bo_rec.maturity_face_value,
7635 bo_rec.pre_gl_rate, bo_rec.cum_unrel_gl
7636 from XTR_REVALUATION_DETAILS
7637 where batch_id = l_pre_batch
7638 and deal_no = rec.deal_no
7639 and nvl(realized_flag, 'N') = 'N'
7640 and transaction_no = 1;
7641
7642 bo_rec.start_face_value := bo_rec.maturity_face_value;
7643 bo_rec.cum_unrel_gl_bal := bo_rec.cum_unrel_gl;
7644 end if;
7645
7646 Open C_BOND_ALLOC;
7647 Fetch C_BOND_ALLOC into bo_rec.deal_no, bo_rec.cross_ref_no,
7648 bo_rec.face_value, bo_rec.init_fv, bo_rec.amc_real,
7649 bo_rec.mtm_real, bo_rec.clean_px, bo_rec.resale_rec_date;
7650 While C_BOND_ALLOC%FOUND loop
7651 l_resale := TRUE;
7652 XTR_REVL_BOND_REALAMC(rec, bo_rec);
7653 XTR_REVL_BOND_REALMTM(rec, bo_rec, l_resale);
7654 XTR_REVL_BOND_UNREAL(rec, bo_rec, l_resale, l_overwrite);
7655
7656 -- Update xtr_bond_alloc_details record so this record will not be
7657 -- eligible for next time
7658 Update XTR_BOND_ALLOC_DETAILS
7659 Set batch_id = rec.batch_id
7660 where deal_no = bo_rec.deal_no
7661 and cross_ref_no = bo_rec.cross_ref_no;
7662
7663 Fetch C_BOND_ALLOC into bo_rec.deal_no, bo_rec.cross_ref_no,
7664 bo_rec.face_value, bo_rec.init_fv, bo_rec.amc_real,
7665 bo_rec.mtm_real, bo_rec.clean_px, bo_rec.resale_rec_date;
7666 End loop;
7667
7668 if bo_rec.maturity_face_value = 0 then
7669 update XTR_DEALS
7670 set last_reval_batch_id = rec.batch_id
7671 where deal_no = rec.deal_no;
7672 else
7673 l_resale := FALSE;
7674 if rec.maturity_date <= rec.revldate then -- deal matured
7675 XTR_REVL_BOND_REALMTM(rec, bo_rec, l_resale);
7676
7677 -- Bug 2990046 - Issue #6.
7678 -- Corrected oversight from original flow logic to update last batch id
7679 -- of a deal which has matured, making it ineligible for future revaluation batch.
7680
7681 update XTR_DEALS
7682 set last_reval_batch_id = rec.batch_id
7683 where deal_no = rec.deal_no;
7684
7685 -- End 2990046 - Issue #6 additions.
7686
7687 end if;
7688 -- Only this part allow overwritten from form
7689 if p_clean_price is not null then -- user provide overwrite Rate
7690 rec.reval_rate := p_clean_price;
7691 l_overwrite := TRUE;
7692 end if;
7693 XTR_REVL_BOND_UNREAL(rec, bo_rec, l_resale, l_overwrite);
7694 fair_value := rec.fair_value;
7695 end if;
7696
7697 EXCEPTION
7698 when others then
7699 if g_call_by_form = true then
7700 APP_EXCEPTION.raise_exception;
7701 else
7702 set_err_log(retcode);
7703 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
7704 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
7705 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
7706 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
7707 l_buf := FND_MESSAGE.GET;
7708 FND_FILE.put_line(fnd_file.log, l_buf);
7709 end if;
7710 End;
7711 --------------------------------------------------------
7712 /*********************************************************/
7713 /* This procedure insert value to revaluation details */
7714 /* table with BOND amount type 'REALAMC' information */
7715 /*********************************************************/
7716 PROCEDURE xtr_revl_bond_realamc(rec IN OUT NOCOPY xtr_revl_rec,
7717 bo_rec IN xtr_bond_rec) IS
7718 l_buf Varchar2(500);
7719 r_rd XTR_REVALUATION_DETAILS%rowtype;
7720 l_begin_fv NUMBER;
7721 rel_pl_value NUMBER;
7722 fv_sob_amt NUMBER;
7723 rel_sob_gl NUMBER;
7724 unrel_sob_gl NUMBER;
7725 currency_gl NUMBER;
7726 l_rc NUMBER;
7727 r_err_log err_log; -- record type
7728 retcode NUMBER;
7729
7730 Begin
7731 rec.init_fv := bo_rec.init_fv;
7732 rec.trans_no := bo_rec.cross_ref_no;
7733 rec.face_value := bo_rec.face_value;
7734 rec.fair_value := bo_rec.init_fv + bo_rec.amc_real;
7735 rec.period_start := rec.eligible_date;
7736 rec.period_end := bo_rec.resale_rec_date;
7737 rec.effective_date:= bo_rec.resale_rec_date;
7738 r_rd.transaction_period := rec.period_end - rec.period_start;
7739 r_rd.effective_days := rec.period_end - rec.period_start;
7740 r_rd.amount_type := C_REALAMC; -- 'REALAMC'
7741 rec.reval_ccy := rec.currencya;
7742 rec.reval_rate := bo_rec.clean_px;
7743 rel_pl_value := bo_rec.amc_real;
7744
7745 If rec.reval_ccy = rec.sob_ccy then
7746 rec.reval_ex_rate_one := 1;
7747 rec.deal_ex_rate_one := 1;
7748 currency_gl := 0;
7749 fv_sob_amt := rec.fair_value;
7750 rel_sob_gl := rel_pl_value;
7751 Else
7752 xtr_revl_exchange_rate(rec, retcode);
7753 xtr_revl_get_curr_gl(rec, null, rel_pl_value, fv_sob_amt,
7754 rel_sob_gl, unrel_sob_gl, currency_gl);
7755 End if;
7756
7757 xtr_revl_real_log(rec, rel_pl_value, fv_sob_amt, rel_sob_gl, currency_gl, r_rd, retcode);
7758
7759 EXCEPTION
7760 when others then
7761 if g_call_by_form = true then
7762 APP_EXCEPTION.raise_exception;
7763 else
7764 set_err_log(retcode);
7765 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
7766 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
7767 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
7768 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
7769 l_buf := FND_MESSAGE.GET;
7770 FND_FILE.put_line(fnd_file.log, l_buf);
7771 end if;
7772 End xtr_revl_bond_realamc;
7773 -------------------------------------------------------------
7774 /*********************************************************/
7775 /* This procedure insert value to revaluation details */
7776 /* table with BOND amount type 'REALMTM' information */
7777 /*********************************************************/
7778 PROCEDURE xtr_revl_bond_realmtm(rec IN OUT NOCOPY xtr_revl_rec,
7779 bo_rec IN xtr_bond_rec,
7780 p_resale IN BOOLEAN) IS
7781 l_buf Varchar2(500);
7782 r_rd XTR_REVALUATION_DETAILS%rowtype;
7783 l_begin_fv NUMBER;
7784 l_bond_init_fv NUMBER;
7785 rel_pl_value NUMBER;
7786 fv_sob_amt NUMBER;
7787 rel_sob_gl NUMBER;
7788 unrel_sob_gl NUMBER;
7789 currency_gl NUMBER;
7790 l_rc NUMBER;
7791 l_rate0 NUMBER;
7792 l_rate1 NUMBER;
7793 l_round NUMBER;
7794 r_err_log err_log; -- record type
7795 retcode NUMBEr;
7796
7797 l_full_init_fv NUMBER := 0; -- Bug 3046471 addition.
7798
7799 Begin
7800 select rounding_factor
7801 into l_round
7802 from xtr_master_currencies_v
7803 where currency = rec.reval_ccy;
7804
7805 r_rd.amount_type := 'REAL'; -- 'REALMTM'
7806 rec.reval_ccy := rec.currencya;
7807
7808 If p_resale = TRUE then -- record is a result of resale
7809 rec.trans_no := bo_rec.cross_ref_no;
7810 rec.face_value := bo_rec.face_value;
7811 rec.init_fv := bo_rec.init_fv;
7812
7813 -- 2879858. Bond Repurchase Project.
7814
7815 If (rec.deal_subtype in ('ISSUE','SHORT')) then
7816 rec.fair_value := -rec.face_value * bo_rec.clean_px / 100;
7817 Else
7818 rec.fair_value := rec.face_value * bo_rec.clean_px / 100;
7819 End If;
7820
7821 -- End 2879858.
7822
7823 rec.period_start := rec.effective_date;
7824 rec.period_end := bo_rec.resale_rec_date;
7825 rec.effective_date:= bo_rec.resale_rec_date;
7826 r_rd.transaction_period := rec.period_end - rec.period_start;
7827 rec.reval_rate := bo_rec.clean_px;
7828 rel_pl_value := bo_rec.mtm_real;
7829 Else -- record not a result of resale. Deal is mature
7830 rec.trans_no := 1;
7831 rec.period_start := rec.eligible_date;
7832 rec.period_end := rec.maturity_date;
7833 rec.effective_date:= rec.maturity_date;
7834 r_rd.transaction_period := rec.period_end - rec.period_start;
7835 rec.reval_rate := 100;
7836 rec.fair_value := rec.fxo_sell_ref_amount; -- xtr_deals.maturity_balance_amount
7837
7838 if rec.deal_subtype in ('SHORT', 'ISSUE') then
7839 rec.fair_value := rec.fair_value * (-1);
7840 end if;
7841
7842 -- Bug 3046471 additions.
7843 -- Re-fetch initial fair value for full deal face value to properly calculate
7844 -- last period's realized MTM gain/loss at time of maturity.
7845
7846 Select nvl(initial_fair_value,rec.fair_value)
7847 into l_full_init_fv
7848 from xtr_deals
7849 where deal_no = rec.deal_no;
7850
7851 -- End 3046471 additions.
7852
7853 if rec.face_value = rec.fxo_sell_ref_amount then
7854 -- Deal is not resale for the whole period. Hold until maturity.
7855 --3046471 l_begin_fv := rec.init_fv;
7856 l_begin_fv := l_full_init_fv; -- 3046471.
7857 else
7858 select sum(initial_fair_value) -- 2879585. Correction from initial design.
7859 into l_bond_init_fv
7860 from xtr_bond_alloc_details
7861 where deal_no = rec.deal_no;
7862 --3046471 l_begin_fv := rec.init_fv - l_bond_init_fv;
7863 l_begin_fv := l_full_init_fv - l_bond_init_fv; -- 3046471.
7864 end if;
7865 rec.face_value := rec.fxo_sell_ref_amount; -- xtr_deals.maturity_balance_amount
7866 rel_pl_value := rec.fair_value - l_begin_fv;
7867 End if;
7868
7869 If rec.reval_ccy = rec.sob_ccy then
7870 rec.reval_ex_rate_one := 1;
7871 rec.deal_ex_rate_one := 1;
7872 currency_gl := 0;
7873 fv_sob_amt := rec.fair_value;
7874 rel_sob_gl := rel_pl_value;
7875 Else
7876 if p_resale = TRUE then
7877 xtr_revl_exchange_rate(rec, retcode);
7878 xtr_revl_get_curr_gl(rec, null, rel_pl_value, fv_sob_amt,
7879 rel_sob_gl, unrel_sob_gl, currency_gl);
7880 else
7881 xtr_revl_exchange_rate(rec, retcode);
7882 l_rate1 := rec.reval_ex_rate_one;
7883 l_rate0 := rec.deal_ex_rate_one;
7884 fv_sob_amt := round((rec.fair_value * l_rate1), l_round);
7885 currency_gl:= round((l_begin_fv * (l_rate1 - l_rate0)), l_round);
7886 rel_sob_gl:= round((rel_pl_value * l_rate1), l_round);
7887 end if;
7888 End if;
7889 r_rd.effective_days := rec.period_end - rec.period_start;
7890 xtr_revl_real_log(rec, rel_pl_value, fv_sob_amt, rel_sob_gl, currency_gl, r_rd, retcode);
7891
7892 EXCEPTION
7893 when others then
7894 if g_call_by_form = true then
7895 APP_EXCEPTION.raise_exception;
7896 else
7897 set_err_log(retcode);
7898 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
7899 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
7900 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
7901 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
7902 l_buf := FND_MESSAGE.GET;
7903 FND_FILE.put_line(fnd_file.log, l_buf);
7904 end if;
7905 End xtr_revl_bond_realmtm;
7906 ---------------------------------------------------------------
7907 /*********************************************************/
7908 /* This procedure insert value to revaluation details */
7909 /* table with BOND amount type 'UNREAL' information */
7910 /* We only allow overwrite Price for UNREAL amount type */
7911 /* with transaction no = 1 */
7912 /*********************************************************/
7913 PROCEDURE xtr_revl_bond_unreal(rec IN OUT NOCOPY xtr_revl_rec,
7914 bo_rec IN OUT NOCOPY xtr_bond_rec,
7915 p_resale IN BOOLEAN,
7916 p_overwrite IN BOOLEAN) IS
7917 l_buf Varchar2(500);
7918 r_rd XTR_REVALUATION_DETAILS%rowtype;
7919 l_begin_fv NUMBER;
7920 unrel_pl_value NUMBER;
7921 fv_sob_amt NUMBER;
7922 rel_sob_gl NUMBER;
7923 unrel_sob_gl NUMBER;
7924 currency_gl NUMBER;
7925 cum_pl_value NUMBER;
7926 l_resale_cum_gl NUMBER;
7927 l_resale_unrel_gl NUMBER;
7928 l_bond_clean_px NUMBER;
7929 l_end_fv NUMBER;
7930 l_rc NUMBER;
7931 l_deno NUMBER;
7932 l_numer NUMBER;
7933 l_rate0 NUMBER;
7934 l_rate1 NUMBER;
7935 l_round NUMBER;
7936 l_mtm_real NUMBER;
7937 l_reval_rate NUMBER;
7938 r_err_log err_log; -- record type
7939 retcode NUMBER;
7940
7941 Begin
7942 r_rd.amount_type := C_UNREAL; -- 'UNREAL'
7943 rec.reval_ccy := rec.currencya;
7944 if rec.batch_start > rec.eligible_date then
7945 rec.period_start := rec.batch_start;
7946 else
7947 rec.period_start := rec.eligible_date;
7948 end if;
7949
7950 select rounding_factor
7951 into l_round
7952 from xtr_master_currencies_v
7953 where currency = rec.reval_ccy;
7954
7955 If p_resale = TRUE then
7956 -- record is a result of resale. Create last unrealized G/L record for resold amount.
7957
7958 l_resale_cum_gl := bo_rec.cum_unrel_gl * (bo_rec.face_value /bo_rec.start_face_value);
7959 l_resale_unrel_gl:= bo_rec.mtm_real - l_resale_cum_gl;
7960 rec.trans_no := bo_rec.cross_ref_no;
7961 rec.face_value := bo_rec.face_value;
7962 rec.period_end := bo_rec.resale_rec_date;
7963 rec.reval_rate := bo_rec.clean_px;
7964 rec.effective_date:= bo_rec.resale_rec_date;
7965 r_rd.transaction_period := rec.period_end - rec.period_start;
7966
7967 -- 2879858. Bond Repurchase Project.
7968 -- Ensure signage of fair value is properly presented for an ISSUE deal.
7969
7970 If (rec.deal_subtype = 'ISSUE') then
7971 rec.fair_value := -rec.face_value * bo_rec.clean_px / 100;
7972 Else
7973 rec.fair_value := rec.face_value * bo_rec.clean_px / 100;
7974 End If;
7975
7976 -- End 2879858.
7977
7978 unrel_pl_value := l_resale_unrel_gl;
7979 cum_pl_value := bo_rec.mtm_real;
7980
7981 if (bo_rec.maturity_face_value - bo_rec.face_value) > 0 then
7982 bo_rec.maturity_face_value := bo_rec.maturity_face_value - bo_rec.face_value;
7983 else
7984 bo_rec.maturity_face_value := 0;
7985 end if;
7986
7987 -- Bug 2990046 - Issue #1.
7988 -- Corrected bug existing since XTR.F which incorrectly resets the cumulative unrealized
7989 -- gain/loss amount for any remaining face value going forward to zero if the cum amount
7990 -- is a loss.
7991
7992 /*
7993 if (bo_rec.cum_unrel_gl_bal - l_resale_cum_gl) > 0 then
7994 bo_rec.cum_unrel_gl_bal := bo_rec.cum_unrel_gl_bal - l_resale_cum_gl;
7995 else
7996 bo_rec.cum_unrel_gl_bal := 0;
7997 end if;
7998 */
7999
8000 bo_rec.cum_unrel_gl_bal := bo_rec.cum_unrel_gl_bal - l_resale_cum_gl;
8001
8002 -- End bug 2990046 - Issue #1 fix.
8003
8004
8005 GL_CURRENCY_API.get_triangulation_rate
8006 (rec.reval_ccy, rec.sob_ccy, rec.effective_date, rec.ex_rate_type,
8007 l_deno, l_numer, rec.reval_ex_rate_one);
8008
8009 Else -- UNREAL record is not result of resale
8010 rec.trans_no := 1;
8011 rec.effective_date := rec.maturity_date;
8012 if rec.maturity_date <= rec.revldate then -- deal matured
8013 select realised_pl, reval_rate
8014 into l_mtm_real, l_reval_rate
8015 from XTR_REVALUATION_DETAILS
8016 where batch_id = rec.batch_id
8017 and deal_no = rec.deal_no
8018 and transaction_no = rec.trans_no
8019 and amount_type = 'REAL';
8020
8021 rec.face_value := rec.fxo_sell_ref_amount; -- xtr_deals.maturity_balance_amount
8022 rec.fair_value := rec.fxo_sell_ref_amount;
8023 rec.period_end := rec.maturity_date;
8024 unrel_pl_value := l_mtm_real - bo_rec.cum_unrel_gl_bal;
8025 cum_pl_value := l_mtm_real;
8026 rec.reval_rate := l_reval_rate;
8027 if rec.deal_subtype in ('SHORT', 'ISSUE') then
8028 rec.fair_value := rec.fair_value * (-1);
8029 end if;
8030
8031 else -- deal not mature
8032 if p_overwrite = FALSE then
8033 xtr_revl_getprice_bond(rec, l_bond_clean_px);
8034 rec.reval_rate := l_bond_clean_px;
8035 end if;
8036 l_end_fv := bo_rec.maturity_face_value * (rec.reval_rate /100);
8037 if bo_rec.start_face_value = bo_rec.maturity_face_value then
8038 -- no recognized resaled have occured since last reval
8039 l_begin_fv := bo_rec.start_fair_value;
8040 else
8041 l_begin_fv := bo_rec.start_fair_value *
8042 (bo_rec.maturity_face_value / bo_rec.start_face_value);
8043 end if;
8044 rec.face_value := bo_rec.maturity_face_value;
8045 rec.period_end := rec.revldate;
8046 if rec.pricing_model = 'MARKET' then
8047 rec.fair_value := l_end_fv;
8048 if rec.deal_subtype in ('SHORT', 'ISSUE') then
8049 rec.fair_value := rec.fair_value * (-1);
8050 end if;
8051 else
8052 rec.fair_value := null;
8053 end if;
8054 unrel_pl_value := rec.fair_value - l_begin_fv;
8055 cum_pl_value := bo_rec.cum_unrel_gl_bal + unrel_pl_value;
8056 end if;
8057 r_rd.transaction_period := rec.period_end - rec.period_start;
8058 End if;
8059
8060 If rec.reval_ccy = rec.sob_ccy then
8061 rec.reval_ex_rate_one := 1;
8062 rec.deal_ex_rate_one := 1;
8063 currency_gl := 0;
8064 fv_sob_amt := rec.fair_value;
8065 unrel_sob_gl := unrel_pl_value;
8066 Else
8067 if p_resale <> TRUE then
8068 xtr_revl_exchange_rate(rec, retcode);
8069 xtr_revl_get_curr_gl(rec, unrel_pl_value, null, fv_sob_amt,
8070 rel_sob_gl, unrel_sob_gl, currency_gl);
8071 else
8072 if p_resale <> TRUE and (rec.maturity_date <= rec.revldate) then
8073 if bo_rec.pre_gl_rate is NULL then
8074 l_rate0 := rec.deal_ex_rate_one;
8075 else
8076 l_rate0 := bo_rec.pre_gl_rate;
8077 end if;
8078 l_rate1 := rec.reval_ex_rate_one;
8079 IF xtr_risk_debug_pkg.g_Debug THEN
8080 xtr_risk_debug_pkg.dpush('xtr_revl_bond_unreal: ' || 'BOND_UNREAL');
8081 xtr_risk_debug_pkg.dlog('xtr_revl_bond_unreal: ' || 'rec.deal_no', rec.deal_no);
8082 xtr_risk_debug_pkg.dlog('xtr_revl_bond_unreal: ' || 'l_rate1' , l_rate1);
8083 xtr_risk_debug_pkg.dlog('xtr_revl_bond_unreal: ' || 'l_rate0' , l_rate0);
8084 xtr_risk_debug_pkg.dlog('xtr_revl_bond_unreal: ' || 'fair value' , rec.fair_value);
8085 xtr_risk_debug_pkg.dpop('xtr_revl_bond_unreal: ' || 'BOND_UNREAL');
8086 END IF;
8087
8088 elsif p_resale = TRUE then
8089 l_rate1 := rec.reval_ex_rate_one;
8090 l_rate0 := rec.deal_ex_rate_one;
8091 end if;
8092 fv_sob_amt := round((rec.fair_value * l_rate1), l_round);
8093 currency_gl:= round((rec.fair_value * (l_rate1 - l_rate0)), l_round);
8094 unrel_sob_gl:= round((unrel_pl_value * l_rate1), l_round);
8095 end if;
8096 End if;
8097
8098 r_rd.effective_days := rec.period_end - rec.period_start;
8099 if p_overwrite = FALSE then -- insert new record from concurrent program
8100 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
8101 unrel_sob_gl, currency_gl, r_rd, retcode);
8102 end if;
8103
8104 EXCEPTION
8105 when GL_CURRENCY_API.no_rate then
8106 if g_call_by_form = true then
8107 FND_MESSAGE.set_name('XTR', 'XTR_NO_GL_RATE');
8108 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
8109 APP_EXCEPTION.raise_exception;
8110 else
8111 set_err_log(retcode);
8112 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_RATE_CURRENCY_GL');
8113 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
8114 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
8115 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
8116 l_buf := FND_MESSAGE.GET;
8117 FND_FILE.put_line(fnd_file.log, l_buf);
8118 end if;
8119 when GL_CURRENCY_API.invalid_currency then
8120 if g_call_by_form = true then
8121 FND_MESSAGE.set_name('XTR', 'XTR_INVALID_CURRENCY');
8122 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
8123 FND_MESSAGE.set_token('CURRENCY', rec.currencya);
8124 APP_EXCEPTION.raise_exception;
8125 else
8126 set_err_log(retcode);
8127 FND_MESSAGE.SET_NAME('XTR', 'XTR_INVALID_CURRENCY_TYPE');
8128 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
8129 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
8130 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
8131 l_buf := FND_MESSAGE.GET;
8132 FND_FILE.put_line(fnd_file.log, l_buf);
8133 end if;
8134 when others then
8135 if g_call_by_form = true then
8136 APP_EXCEPTION.raise_exception;
8137 else
8138 set_err_log(retcode);
8139 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
8140 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
8141 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
8142 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
8143 l_buf := FND_MESSAGE.GET;
8144 FND_FILE.put_line(fnd_file.log, l_buf);
8145 end if;
8146 End xtr_revl_bond_unreal;
8147 ----------------------------------------------------------------
8148 /*********************************************************/
8149 /* This procedure returns fair value for deal type TMM */
8150 /*********************************************************/
8151 PROCEDURE xtr_revl_fv_tmm(
8152 rec IN OUT NOCOPY xtr_revl_rec,
8153 fair_value IN OUT NOCOPY NUMBER,
8154 p_accum_int_sum IN OUT NOCOPY NUMBER,
8155 p_fwd_rate IN NUMBER) IS
8156 l_buf Varchar2(500);
8157 l_trans_no NUMBER;
8158 l_start_date DATE;
8159 l_maturity_date DATE;
8160 l_settle_date DATE;
8161 l_price_model VARCHAR2(30);
8162 l_market_set VARCHAR2(30);
8163 l_settle_term VARCHAR2(1);
8164 l_side VARCHAR2(5);
8165 l_day NUMBER;
8166 l_year NUMBER;
8167 l_pri_action VARCHAR2(7);
8168 l_pri_adjust NUMBER;
8169 l_acc_int NUMBER;
8170 l_balance_out NUMBER;
8171 l_future_val NUMBER;
8172 l_principal NUMBER;
8173 l_coupon_cf NUMBER;
8174 l_coupon_rate NUMBER;
8175 l_coupon_int NUMBER;
8176 l_int_settle NUMBER;
8177 l_int_rate NUMBER;
8178 l_accrued_int NUMBER;
8179 l_interest NUMBER;
8180 l_last_rec_trans NUMBER;
8181 l_round NUMBER;
8182 l_day_count_type VARCHAR2(1);
8183 l_round_type VARCHAR2(1);
8184 l_first_trans_flag VARCHAR2(1);
8185 l_pre_int VARCHAR2(1);
8186 l_int_refund NUMBER;
8187 l_pv_refund NUMBER;
8188 r_err_log err_log; -- record type
8189 retcode NUMBER;
8190
8191 cursor c_roll is
8192 select TRANSACTION_NUMBER, START_DATE, MATURITY_DATE, PRINCIPAL_ACTION,
8193 INTEREST_RATE, INTEREST_SETTLED, PRINCIPAL_ADJUST, ACCUM_INTEREST,
8194 BALANCE_OUT, SETTLE_TERM_INTEREST, INTEREST, INTEREST_REFUND, SETTLE_DATE
8195 from xtr_rollover_transactions
8196 where DEAL_NUMBER = rec.deal_no
8197 and maturity_date >= rec.revldate
8198 order by start_date, transaction_number asc;
8199
8200 Begin
8201 select day_count_type, rounding_type, prepaid_interest
8202 into l_day_count_type, l_round_type, l_pre_int
8203 from XTR_DEALS_V
8204 where deal_no = rec.deal_no;
8205
8206 select rounding_factor
8207 into l_round
8208 from xtr_master_currencies_v
8209 where currency = rec.reval_ccy;
8210
8211 l_market_set := rec.MARKET_DATA_SET;
8212 xtr_revl_get_mds(l_market_set, rec);
8213
8214 -- determine the last record's transaction number
8215 select max(transaction_number)
8216 into l_last_rec_trans
8217 from xtr_rollover_transactions
8218 where DEAL_NUMBER=rec.deal_no
8219 and START_DATE = MATURITY_DATE;
8220
8221 for l_tmp in c_roll loop
8222 l_trans_no := l_tmp.TRANSACTION_NUMBER;
8223 l_start_date := l_tmp.START_DATE;
8224 l_maturity_date := l_tmp.MATURITY_DATE;
8225 l_settle_date := l_tmp.SETTLE_DATE;
8226 l_pri_action := l_tmp.PRINCIPAL_ACTION;
8227 l_pri_adjust := nvl(l_tmp.PRINCIPAL_ADJUST, 0);
8228 l_acc_int := l_tmp.ACCUM_INTEREST;
8229 l_balance_out := l_tmp.BALANCE_OUT;
8230 l_int_settle := l_tmp.INTEREST_SETTLED;
8231 l_int_rate := l_tmp.INTEREST_RATE;
8232 l_settle_term := l_tmp.SETTLE_TERM_INTEREST;
8233 l_interest := l_tmp.INTEREST;
8234 l_int_refund := l_tmp.INTEREST_REFUND;
8235
8236 l_principal := 0;
8237 l_coupon_cf := 0;
8238 l_accrued_int := 0;
8239
8240 if l_day_count_type = 'B' and l_trans_no = 1 then
8241 l_first_trans_flag := 'Y';
8242 else
8243 l_first_trans_flag := 'N';
8244 end if;
8245
8246 /*********************************************/
8247 /* Calculate the present value of Principal */
8248 /*********************************************/
8249 if rec.revldate < l_start_date then
8250 if l_pri_adjust <> 0 then
8251 if l_pri_action = 'INCRSE' then
8252 if(rec.deal_subtype = 'FUND') then
8253 l_side := 'B';
8254 else
8255 l_side := 'A';
8256 end if;
8257 l_future_val := l_pri_adjust;
8258
8259 xtr_revl_present_value_tmm(rec, rec.batch_id, rec.year_calc_type,
8260 rec.revldate, l_start_date, l_future_val, rec.currencya,
8261 l_market_set, l_side, l_principal);
8262 elsif l_pri_action = 'DECRSE' then
8263 if(rec.deal_subtype = 'FUND') then
8264 l_side := 'A';
8265 else
8266 l_side := 'B';
8267 end if;
8268 l_future_val := l_pri_adjust;
8269 xtr_revl_present_value_tmm(rec, rec.batch_id, rec.year_calc_type,
8270 rec.revldate, l_start_date, l_future_val, rec.currencya,
8271 l_market_set, l_side, l_principal);
8272 end if;
8273 else
8274 l_principal := 0;
8275 end if;
8276 l_principal := round(l_principal, l_round);
8277 end if;
8278
8279 IF xtr_risk_debug_pkg.g_Debug THEN
8280 xtr_risk_debug_pkg.dpush('xtr_revl_fv_tmm: ' || 'TMM_PRINCIPAL');
8281 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'deal_no', rec.deal_no);
8282 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'trans no', l_trans_no);
8283 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'year_calc_type', rec.year_calc_type);
8284 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'l_start_date', l_start_date);
8285 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'l_future_val', l_future_val);
8286 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'rec.currencya', rec.currencya);
8287 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'l_market_set', l_market_set);
8288 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'l_side', l_side);
8289 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'l_principal', l_principal);
8290 xtr_risk_debug_pkg.dpop('xtr_revl_fv_tmm: ' || 'TMM_PRINCIPAL');
8291 END IF;
8292
8293 if(rec.deal_subtype = 'FUND') then
8294 l_side := 'A';
8295 else
8296 l_side := 'B';
8297 end if;
8298
8299 /****************************************************/
8300 /* Calculate the present value of Coupon(Interest) */
8301 /****************************************************/
8302 if l_last_rec_trans = l_trans_no then -- last record
8303 l_future_val := nvl(-l_int_settle,0) - nvl(p_accum_int_sum,0);
8304 /* if nvl(l_pre_int, 'N') = 'Y' and rec.deal_type = 'TMM' then
8305 xtr_revl_present_value_tmm(rec, rec.batch_id, rec.year_calc_type,
8306 rec.revldate, l_start_date, l_future_val, rec.currencya,
8307 l_market_set, l_side, l_coupon_cf);
8308 else
8309 */
8310 xtr_revl_present_value_tmm(rec, rec.batch_id, rec.year_calc_type,
8311 rec.revldate, l_settle_date, l_future_val, rec.currencya,
8312 l_market_set, l_side, l_coupon_cf);
8313 -- end if;
8314
8315 elsif(rec.revldate<= rec.settle_date and
8316 rec.settle_date is not NULL) then
8317 -- fixed rate
8318 l_side := 'A';
8319 l_future_val := l_int_settle;
8320 l_coupon_rate := l_int_rate;
8321
8322 /*** Prepaid Interest ****/
8323 /* if nvl(l_pre_int, 'N') = 'Y' and rec.deal_type = 'TMM' then
8324 if l_start_date < rec.revldate then
8325 l_coupon_cf := 0;
8326 else
8327 xtr_revl_present_value_tmm(rec, rec.batch_id, rec.year_calc_type,
8328 rec.revldate, l_start_date, l_future_val, rec.currencya,
8329 l_market_set, l_side, l_coupon_cf);
8330 end if;
8331 else
8332 */
8333 xtr_revl_present_value_tmm(rec, rec.batch_id, rec.year_calc_type,
8334 rec.revldate, l_settle_date, l_future_val, rec.currencya,
8335 l_market_set, l_side, l_coupon_cf);
8336 -- end if;
8337
8338 l_coupon_int := l_interest;
8339 else
8340 -- floating rate
8341 if rec.revldate > l_start_date then
8342 l_coupon_rate := l_int_rate;
8343 else
8344 if p_fwd_rate is NULL then
8345 -- no overwrite
8346 rec.trans_no := l_trans_no;
8347 xtr_revl_getprice_fwd(rec, TRUE, l_coupon_rate);
8348 else
8349 l_coupon_rate := p_fwd_rate;
8350 end if;
8351 end if; -- rec.revldate >
8352 rec.reval_rate := l_coupon_rate;
8353
8354 if rec.pricing_model = 'DISC_CASHFLOW' then
8355 l_coupon_int := xtr_calc_interest(l_balance_out,
8356 l_start_date, l_maturity_date, l_coupon_rate,
8357 rec.year_calc_type);
8358 else -- 'DISC_CASHSTA' take overwrite value from TMM record
8359 l_coupon_int := l_interest;
8360 end if;
8361
8362
8363 IF xtr_risk_debug_pkg.g_Debug THEN
8364 xtr_risk_debug_pkg.dpush('xtr_revl_fv_tmm: ' || 'TMM_REVAL_RATE');
8365 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'deal_no', rec.deal_no);
8366 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'trans no', l_trans_no);
8367 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'rec.revldate', rec.revldate);
8368 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'l_start_date', l_start_date);
8369 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'l_int_rate', l_int_rate);
8370 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'l_coupon_rate', l_coupon_rate);
8371 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'rec.reval_rate', rec.reval_rate);
8372 xtr_risk_debug_pkg.dpop('xtr_revl_fv_tmm: ' || 'TMM_REVAL_RATE');
8373 END IF;
8374
8375
8376 /* for Interest Overwrite project
8377 l_coupon_int := xtr_calc_interest(l_balance_out,
8378 l_start_date, l_maturity_date, l_coupon_rate,
8379 rec.year_calc_type); */
8380 -- l_coupon_int := l_interest;
8381
8382 if l_settle_term = 'Y' and nvl(l_int_settle, 0)<> 0 then
8383 if rec.deal_subtype = 'FUND' then
8384 l_side := 'A';
8385 l_future_val := l_coupon_int;
8386 else
8387 l_side := 'B';
8388 l_future_val := l_coupon_int;
8389 end if;
8390
8391 /*** Prepaid Interest ****/
8392 /* if nvl(l_pre_int, 'N') = 'Y' and rec.deal_type = 'TMM' then
8393 if l_start_date < rec.revldate then
8394 l_coupon_cf := 0;
8395 else
8396 xtr_revl_present_value_tmm(rec, rec.batch_id, rec.year_calc_type,
8397 rec.revldate, l_start_date, l_future_val, rec.currencya,
8398 l_market_set, l_side, l_coupon_cf);
8399 end if;
8400 else
8401 */
8402 xtr_revl_present_value_tmm(rec, rec.batch_id, rec.year_calc_type,
8403 rec.revldate, l_settle_date, l_future_val, rec.currencya,
8404 l_market_set, l_side, l_coupon_cf);
8405 -- end if;
8406 elsif l_settle_term = 'Y' and nvl(l_int_settle, 0) = 0 then
8407 l_coupon_cf := 0;
8408 else
8409 p_accum_int_sum := nvl(p_accum_int_sum,0) + nvl(l_coupon_int,0) +
8410 nvl(l_acc_int,0);
8411 end if;
8412
8413 -- for Interest Overwrite project
8414 if l_round_type = 'U' then
8415 l_coupon_cf := xtr_fps2_p.roundup(l_coupon_cf, l_round);
8416 elsif l_round_type = 'T' then
8417 l_coupon_cf := trunc(l_coupon_cf, l_round);
8418 else
8419 l_coupon_cf := round(l_coupon_cf, l_round);
8420 end if;
8421 end if;
8422
8423 IF xtr_risk_debug_pkg.g_Debug THEN
8424 xtr_risk_debug_pkg.dpush('xtr_revl_fv_tmm: ' || 'TMM_INTEREST');
8425 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'deal_no', rec.deal_no);
8426 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'trans no', l_trans_no);
8427 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'year_calc_type', rec.year_calc_type);
8428 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'rec.revldate', rec.revldate);
8429 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'l_maturity_date', l_maturity_date);
8430 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'l_future_val', l_future_val);
8431 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'rec.currencya', rec.currencya);
8432 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'l_market_set', l_market_set);
8433 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'l_side', l_side);
8434 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'l_coupon_cf', l_coupon_cf);
8435 xtr_risk_debug_pkg.dpop('xtr_revl_fv_tmm: ' || 'TMM_INTEREST');
8436 END IF;
8437
8438 /*********************************************/
8439 /* Calculate the Accrued Interest */
8440 /*********************************************/
8441 -- for Interest Overwrite project
8442 if rec.revldate > l_start_date then -- BUG 30043228
8443 /*** Prepaid Interest ****/
8444 if nvl(l_pre_int, 'N') = 'Y' and rec.deal_type = 'TMM' then
8445 if rec.revldate = l_maturity_date then
8446 l_accrued_int := 0;
8447 else
8448 /* BUG 3004328
8449 l_accrued_int := xtr_calc_interest(l_balance_out,
8450 rec.revldate +1, l_maturity_date, l_coupon_rate, rec.year_calc_type,
8451 l_day_count_type, l_first_trans_flag);
8452 */
8453 l_accrued_int := xtr_calc_interest(l_balance_out,
8454 l_start_date, rec.revldate, l_coupon_rate, rec.year_calc_type,
8455 l_day_count_type, l_first_trans_flag)
8456 -xtr_calc_interest(l_balance_out,
8457 l_start_date, l_maturity_date, l_coupon_rate, rec.year_calc_type,
8458 l_day_count_type, l_first_trans_flag);
8459 l_accrued_int := - l_accrued_int; -- Code assumes positive values for prepaid TMM
8460 -- END BUG 30043228
8461 end if;
8462 else
8463 if rec.revldate = l_maturity_date then
8464 l_accrued_int := l_coupon_int;
8465 else
8466 l_accrued_int := xtr_calc_interest(l_balance_out,
8467 l_start_date, rec.revldate, l_coupon_rate, rec.year_calc_type,
8468 l_day_count_type, l_first_trans_flag);
8469 end if;
8470 end if;
8471
8472 if l_round_type = 'U' then
8473 l_accrued_int := xtr_fps2_p.roundup(l_accrued_int, l_round);
8474 elsif l_round_type = 'T' then
8475 l_accrued_int := trunc(l_accrued_int, l_round);
8476 else
8477 l_accrued_int := round(l_accrued_int, l_round);
8478 end if;
8479 end if;
8480
8481 IF xtr_risk_debug_pkg.g_Debug THEN
8482 xtr_risk_debug_pkg.dpush('xtr_revl_fv_tmm: ' || 'TMM_ACCRU_INT');
8483 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'deal_no', rec.deal_no);
8484 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'trans no', l_trans_no);
8485 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'year_calc_type', rec.year_calc_type);
8486 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'l_balance_out', l_balance_out);
8487 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'l_start_date', l_start_date);
8488 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'rec.revldate', rec.revldate);
8489 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'l_coupon_rate', l_coupon_rate);
8490 xtr_risk_debug_pkg.dlog('xtr_revl_fv_tmm: ' || 'l_accrued_int', l_accrued_int);
8491 xtr_risk_debug_pkg.dpop('xtr_revl_fv_tmm: ' || 'TMM_ACCRU_INT');
8492 END IF;
8493
8494 /***** Prepaid Interest *******/
8495 if nvl(l_pre_int, 'N') = 'Y' and rec.deal_type = 'TMM' then
8496 if (l_start_date < rec.revldate) or nvl(l_int_refund, 0) = 0 then
8497 l_pv_refund := 0;
8498 else
8499 xtr_revl_present_value_tmm(rec, rec.batch_id, rec.year_calc_type,
8500 rec.revldate, l_settle_date, l_int_refund, rec.currencya,
8501 l_market_set, l_side, l_pv_refund);
8502 end if;
8503
8504 fair_value := nvl(fair_value,0) + nvl(l_principal,0) + nvl(l_pv_refund,0)
8505 + nvl(l_coupon_cf,0) + nvl(l_accrued_int,0);
8506 else
8507 fair_value := nvl(fair_value,0) + nvl(l_principal,0)
8508 + nvl(l_coupon_cf,0) - nvl(l_accrued_int,0);
8509 end if;
8510 End loop;
8511
8512 if rec.deal_subtype = 'FUND' then
8513 fair_value := fair_value * (-1);
8514 end if;
8515
8516 EXCEPTION
8517 when others then
8518 if g_call_by_form = true then
8519 APP_EXCEPTION.raise_exception;
8520 else
8521 set_err_log(retcode);
8522 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
8523 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
8524 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
8525 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
8526 l_buf := FND_MESSAGE.GET;
8527 FND_FILE.put_line(fnd_file.log, l_buf);
8528 end if;
8529 end xtr_revl_fv_tmm;
8530 --------------------------------------------------------
8531 PROCEDURE xtr_revl_present_value_tmm(
8532 rec IN xtr_revl_rec,
8533 p_batch_id IN NUMBER,
8534 p_day_count IN VARCHAR2,
8535 p_revl_date IN DATE,
8536 p_start_date IN DATE,
8537 p_future_val IN NUMBER,
8538 p_ccy IN VARCHAR2,
8539 p_market_set IN VARCHAR2,
8540 p_side IN VARCHAR2,
8541 p_present_value OUT NOCOPY NUMBER) is
8542 l_buf Varchar2(500);
8543 r_md_in xtr_market_data_p.md_from_set_in_rec_type;
8544 r_md_out xtr_market_data_p.md_from_set_out_rec_type;
8545 r_mm_in XTR_MM_COVERS.PresentValue_in_rec_type;
8546 r_mm_out XTR_MM_COVERS.PresentValue_out_rec_type;
8547 l_day NUMBER;
8548 l_year NUMBER;
8549 r_err_log err_log; -- record type
8550 retcode NUMBER;
8551
8552 begin
8553 if p_revl_date > p_start_date then
8554 p_present_value := 0;
8555 else
8556
8557 XTR_CALC_P.calc_days_run(p_revl_date, p_start_date,
8558 p_day_count, l_day, l_year);
8559 xtr_revl_mds_init(r_md_in, p_market_set, C_SOURCE,
8560 C_DISCOUNT_FAC, p_revl_date, p_start_date,
8561 p_ccy, NULL, p_day_count,
8562 C_INTERPOL_LINER, p_side, p_batch_id, NULL);
8563 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
8564 r_mm_in.p_indicator := C_DISCOUNT_FAC;
8565 r_mm_in.p_future_val:= p_future_val;
8566 r_mm_in.p_rate := r_md_out.p_md_out;
8567 r_mm_in.p_day_count := l_day;
8568 r_mm_in.p_annual_basis := l_year;
8569 XTR_MM_COVERS.present_value(r_mm_in, r_mm_out);
8570 p_present_value := r_mm_out.p_present_val;
8571 end if;
8572
8573 IF xtr_risk_debug_pkg.g_Debug THEN
8574 xtr_risk_debug_pkg.dpush('xtr_revl_present_value_tmm: ' || 'PRESENT_VALUE');
8575 xtr_risk_debug_pkg.dlog('xtr_revl_present_value_tmm: ' || 'p_revl_date', p_revl_date);
8576 xtr_risk_debug_pkg.dlog('xtr_revl_present_value_tmm: ' || 'p_start_date', p_start_date);
8577 xtr_risk_debug_pkg.dlog('xtr_revl_present_value_tmm: ' || 'p_day_count', p_day_count);
8578 xtr_risk_debug_pkg.dlog('xtr_revl_present_value_tmm: ' || 'l_day', l_day);
8579 xtr_risk_debug_pkg.dlog('xtr_revl_present_value_tmm: ' || 'l_year', l_year);
8580 xtr_risk_debug_pkg.dlog('xtr_revl_present_value_tmm: ' || 'p_indicator', r_mm_in.p_indicator);
8581 xtr_risk_debug_pkg.dlog('xtr_revl_present_value_tmm: ' || 'p_future_val', r_mm_in.p_future_val);
8582 xtr_risk_debug_pkg.dlog('xtr_revl_present_value_tmm: ' || 'p_rate', r_mm_in.p_rate);
8583 xtr_risk_debug_pkg.dlog('xtr_revl_present_value_tmm: ' || 'p_day_count', r_mm_in.p_day_count);
8584 xtr_risk_debug_pkg.dlog('xtr_revl_present_value_tmm: ' || 'p_annual_basis', r_mm_in.p_annual_basis);
8585 xtr_risk_debug_pkg.dlog('xtr_revl_present_value_tmm: ' || 'p_present_value', p_present_value);
8586 xtr_risk_debug_pkg.dpop('xtr_revl_present_value_tmm: ' || 'PRESENT_VALUE');
8587 END IF;
8588
8589 EXCEPTION
8590 when XTR_MARKET_DATA_P.e_mdcs_no_data_found then
8591 if g_call_by_form = true then
8592 FND_MESSAGE.set_name('XTR', 'XTR_NO_MARKET');
8593 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
8594 APP_EXCEPTION.raise_exception;
8595 else
8596 set_err_log(retcode);
8597 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_MARKETDATASET');
8598 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
8599 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
8600 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
8601 l_buf := FND_MESSAGE.GET;
8602 FND_FILE.put_line(fnd_file.log, l_buf);
8603 end if;
8604 when XTR_MARKET_DATA_P.e_mdcs_no_curve_found then
8605 if g_call_by_form = true then
8606 FND_MESSAGE.set_name('XTR', 'XTR_NO_CURVE');
8607 FND_MESSAGE.set_token('MARKET', rec.market_data_set);
8608 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
8609 APP_EXCEPTION.raise_exception;
8610 else
8611 set_err_log(retcode);
8612 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_CURVEMARKET');
8613 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
8614 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
8615 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
8616 l_buf := FND_MESSAGE.GET;
8617 FND_FILE.put_line(fnd_file.log, l_buf);
8618 end if;
8619 when others then
8620 if g_call_by_form = true then
8621 APP_EXCEPTION.raise_exception;
8622 else
8623 set_err_log(retcode);
8624 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
8625 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
8626 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
8627 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
8628 l_buf := FND_MESSAGE.GET;
8629 FND_FILE.put_line(fnd_file.log, l_buf);
8630 end if;
8631
8632 end xtr_revl_present_value_tmm;
8633 --------------------------------------------------------
8634 /*********************************************************/
8635 /* This procedure calculates the fair value of STOCK */
8636 /*********************************************************/
8637 PROCEDURE xtr_revl_fv_stock(rec IN OUT NOCOPY xtr_revl_rec,
8638 p_price IN NUMBER,
8639 fair_value OUT NOCOPY NUMBER) is
8640
8641 Cursor c_stock_alloc is
8642 Select stock.deal_no, stock.cross_ref_no, stock.fair_value, stock.init_consideration,
8643 stock.real_gain_loss, stock.quantity, stock.remaining_quantity,
8644 stock.price_per_share, decode(cp.parameter_value_code, 'TRADE',
8645 stock.cross_ref_deal_date, stock.cross_ref_start_date) resale_rec_date
8646 from XTR_STOCK_ALLOC_DETAILS STOCK,
8647 XTR_COMPANY_PARAMETERS CP,
8648 XTR_DEALS D
8649 Where stock.deal_no = rec.deal_no
8650 and stock.deal_no = d.deal_no
8651 and stock.batch_id is null
8652 and cp.company_code = d.company_code
8653 and cp.parameter_code = 'ACCNT_TSDTM'
8654 and decode(cp.parameter_value_code, 'TRADE', stock.cross_ref_deal_date,
8655 stock.cross_ref_start_date) <= rec.revldate
8656 Order by resale_rec_date asc, stock.cross_ref_no asc;
8657
8658 st_rec xtr_stock_rec; -- STOCK record type
8659 l_pre_batch NUMBER;
8660 l_first BOOLEAN;
8661 l_resale BOOLEAN := null; -- Indicate if the record is result of resale
8662 l_overwrite BOOLEAN := FALSE;
8663 l_rounding NUMBER;
8664 l_dummy NUMBER;
8665 l_dummy1 NUMBER;
8666 l_dummy2 NUMBER;
8667 r_err_log err_log; -- record type
8668 retcode NUMBER;
8669 l_buf Varchar2(500);
8670 BEGIN
8671 select ROUNDING_FACTOR
8672 into l_rounding
8673 from XTR_MASTER_CURRENCIES_V
8674 where currency = rec.currencya;
8675 xtr_first_reval(rec, l_first);
8676 if l_first = TRUE then -- first time reval
8677 l_pre_batch := NULL;
8678 st_rec.prev_price := rec.transaction_rate;
8679 st_rec.init_quantity := rec.quantity;
8680 st_rec.quantity := rec.quantity;
8681 st_rec.remaining_quantity := rec.quantity;
8682 st_rec.cum_unrel_gl := 0;
8683 st_rec.pre_gl_rate := NULL;
8684
8685 else -- not the first time reval
8686 l_pre_batch := xtr_get_pre_batchid(rec);
8687 select quantity, quantity, reval_rate, exchange_rate_one, cumm_gain_loss_amount
8688 into st_rec.init_quantity, st_rec.remaining_quantity, st_rec.prev_price,
8689 st_rec.pre_gl_rate, st_rec.cum_unrel_gl
8690 from XTR_REVALUATION_DETAILS
8691 where batch_id = l_pre_batch
8692 and deal_no = rec.deal_no
8693 and nvl(realized_flag, 'N') = 'N'
8694 and transaction_no = 1;
8695
8696 end if;
8697
8698 Open C_STOCK_ALLOC;
8699 Fetch C_STOCK_ALLOC into st_rec.deal_no, st_rec.cross_ref_no,
8700 st_rec.fair_value, st_rec.init_cons, st_rec.real_gl,
8701 st_rec.quantity, st_rec.remaining_quantity, st_rec.price_per_share,
8702 st_rec.resale_rec_date;
8703 While C_STOCK_ALLOC%FOUND loop
8704 l_resale := TRUE;
8705 XTR_REVL_STOCK_REAL(rec, st_rec);
8706 XTR_REVL_STOCK_UNREAL(rec, st_rec, l_resale, l_overwrite, l_dummy, l_dummy1, l_dummy2);
8707
8708 -- Update xtr_bond_alloc_details record so this record will not be
8709 -- eligible for next time
8710 Update XTR_STOCK_ALLOC_DETAILS
8711 Set batch_id = rec.batch_id
8712 where deal_no = st_rec.deal_no
8713 and cross_ref_no = st_rec.cross_ref_no;
8714
8715 Fetch C_STOCK_ALLOC into st_rec.deal_no, st_rec.cross_ref_no,
8716 st_rec.fair_value, st_rec.init_cons, st_rec.real_gl,
8717 st_rec.quantity, st_rec.remaining_quantity, st_rec.price_per_share,
8718 st_rec.resale_rec_date;
8719
8720 End loop;
8721
8722 If st_rec.remaining_quantity = 0 and
8723 nvl(st_rec.resale_rec_date, rec.revldate +1) <= rec.revldate then -- totally resale
8724 update XTR_DEALS
8725 set last_reval_batch_id = rec.batch_id
8726 where deal_no = rec.deal_no;
8727 Else
8728 l_resale := FALSE;
8729 if p_price is not null then -- user provide overwrite Rate
8730 rec.reval_rate := p_price;
8731 l_overwrite := TRUE;
8732 end if;
8733 XTR_REVL_STOCK_UNREAL(rec, st_rec, l_resale, l_overwrite, l_dummy, l_dummy1, l_dummy2);
8734 fair_value := rec.fair_value;
8735 end if;
8736
8737 EXCEPTION
8738 when others then
8739 if g_call_by_form = true then
8740 APP_EXCEPTION.raise_exception;
8741 else
8742 set_err_log(retcode);
8743 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
8744 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
8745 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
8746 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
8747 l_buf := FND_MESSAGE.GET;
8748 FND_FILE.put_line(fnd_file.log, l_buf);
8749 end if;
8750
8751 END;
8752
8753 -----------------------------------------------------------
8754 /*********************************************************/
8755 /* This procedure inserts STOCK realized G/L records */
8756 /*********************************************************/
8757 PROCEDURE xtr_revl_stock_real(rec IN OUT NOCOPY xtr_revl_rec,
8758 st_rec IN xtr_stock_rec) is
8759 l_buf Varchar2(500);
8760 r_rd XTR_REVALUATION_DETAILS%rowtype;
8761 rel_pl_value NUMBER;
8762 fv_sob_amt NUMBER;
8763 rel_sob_gl NUMBER;
8764 unrel_sob_gl NUMBER;
8765 currency_gl NUMBER;
8766 l_rc NUMBER;
8767 r_err_log err_log; -- record type
8768 retcode NUMBER;
8769
8770
8771 BEGIN
8772 rec.reval_ccy := rec.currencya;
8773 rec.trans_no := st_rec.cross_ref_no;
8774 rec.face_value := st_rec.init_cons;
8775 rec.init_fv := st_rec.init_cons;
8776 rec.fair_value := st_rec.fair_value;
8777 rec.period_start := rec.eligible_date;
8778 rec.period_end := st_rec.resale_rec_date;
8779 rec.effective_date := st_rec.resale_rec_date;
8780 rec.reval_rate := st_rec.price_per_share;
8781 r_rd.amount_type := 'REAL';
8782 r_rd.quantity := st_rec.quantity;
8783 r_rd.transaction_period := rec.period_end - rec.period_start;
8784 r_rd.effective_days := rec.period_end - rec.period_start;
8785 rel_pl_value := st_rec.real_gl;
8786
8787 If rec.reval_ccy = rec.sob_ccy then
8788 rec.reval_ex_rate_one := 1;
8789 rec.deal_ex_rate_one := 1;
8790 currency_gl := 0;
8791 fv_sob_amt := rec.fair_value;
8792 rel_sob_gl := rel_pl_value;
8793 Else
8794 xtr_revl_exchange_rate(rec, retcode);
8795 xtr_revl_get_curr_gl(rec, null, rel_pl_value, fv_sob_amt,
8796 rel_sob_gl, unrel_sob_gl, currency_gl);
8797 End if;
8798
8799 xtr_revl_real_log(rec, rel_pl_value, fv_sob_amt, rel_sob_gl, currency_gl, r_rd, retcode);
8800
8801 EXCEPTION
8802 when others then
8803 if g_call_by_form = true then
8804 APP_EXCEPTION.raise_exception;
8805 else
8806 set_err_log(retcode);
8807 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
8808 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
8809 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
8810 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
8811 l_buf := FND_MESSAGE.GET;
8812 FND_FILE.put_line(fnd_file.log, l_buf);
8813 end if;
8814
8815 END;
8816
8817 -------------------------------------------------------------
8818 /**********************************************************/
8819 /* This procedure inserts STOCK unrealized G/L records */
8820 /* We only allow overwrite Price for UNREAL amount type */
8821 /* with transaction no = 1 */
8822 /*********************************************************/
8823 PROCEDURE xtr_revl_stock_unreal(rec IN OUT NOCOPY xtr_revl_rec,
8824 st_rec IN xtr_stock_rec,
8825 p_resale IN BOOLEAN,
8826 p_overwrite IN BOOLEAN,
8827 unrel_pl_value IN OUT NOCOPY NUMBER,
8828 cum_pl_value IN OUT NOCOPY NUMBER,
8829 currency_gl IN OUT NOCOPY NUMBER) IS
8830
8831 l_buf Varchar2(500);
8832 r_rd XTR_REVALUATION_DETAILS%rowtype;
8833 fv_sob_amt NUMBER;
8834 rel_sob_gl NUMBER;
8835 unrel_sob_gl NUMBER;
8836 l_resale_cum_gl NUMBER;
8837 l_resale_unrel_gl NUMBER;
8838 l_begin_fv NUMBER;
8839 l_end_fv NUMBER;
8840 l_rc NUMBER;
8841 l_deno NUMBER;
8842 l_numer NUMBER;
8843 l_rate0 NUMBER;
8844 l_rate1 NUMBER;
8845 l_round NUMBER;
8846 l_reval_rate NUMBER;
8847 l_stock_price NUMBER;
8848 l_pre_batch NUMBER;
8849 l_first BOOLEAN;
8850 r_err_log err_log; -- record type
8851 retcode NUMBER;
8852
8853 BEGIN
8854 r_rd.amount_type := C_UNREAL; -- 'UNREAL'
8855 rec.reval_ccy := rec.currencya;
8856 if rec.batch_start > rec.eligible_date then
8857 rec.period_start := rec.batch_start;
8858 else
8859 rec.period_start := rec.eligible_date;
8860 end if;
8861
8862 select rounding_factor
8863 into l_round
8864 from xtr_master_currencies_v
8865 where currency = rec.reval_ccy;
8866
8867 If p_resale = TRUE then
8868 -- record is a result of resale. Create last unrealized G/L record for resold amount.
8869 rec.trans_no := st_rec.cross_ref_no;
8870 rec.face_value := st_rec.init_cons;
8871 rec.period_end := st_rec.resale_rec_date;
8872 rec.reval_rate := st_rec.price_per_share;
8873 rec.effective_date := st_rec.resale_rec_date;
8874 rec.fair_value := st_rec.fair_value;
8875 rec.quantity := st_rec.quantity;
8876 unrel_pl_value := st_rec.real_gl - (st_rec.cum_unrel_gl *
8877 (st_rec.quantity /st_rec.init_quantity));
8878 cum_pl_value := st_rec.cum_unrel_gl + unrel_pl_value;
8879
8880 If rec.reval_ccy = rec.sob_ccy then
8881 rec.reval_ex_rate_one := 1;
8882 rec.deal_ex_rate_one := 1;
8883 currency_gl := 0;
8884 fv_sob_amt := rec.fair_value;
8885 unrel_sob_gl := unrel_pl_value;
8886
8887 Else
8888 xtr_first_reval(rec, l_first);
8889 if l_first = FALSE then -- not the first reval
8890 l_pre_batch := xtr_get_pre_batchid(rec);
8891 select exchange_rate_one
8892 into rec.deal_ex_rate_one
8893 from XTR_REVALUATION_DETAILS
8894 where deal_no = rec.deal_no
8895 and transaction_no = 1
8896 and nvl(realized_flag, 'N') = 'N'
8897 and batch_id = l_pre_batch;
8898
8899 else
8900 GL_CURRENCY_API.get_triangulation_rate
8901 (rec.reval_ccy, rec.sob_ccy, rec.eligible_date, rec.ex_rate_type,
8902 l_deno, l_numer, rec.deal_ex_rate_one);
8903 end if;
8904
8905 GL_CURRENCY_API.get_triangulation_rate
8906 (rec.reval_ccy, rec.sob_ccy, rec.effective_date, rec.ex_rate_type,
8907 l_deno, l_numer, rec.reval_ex_rate_one);
8908
8909 fv_sob_amt := round((rec.fair_value * rec.reval_ex_rate_one), l_round);
8910 currency_gl:= round((rec.fair_value * (rec.reval_ex_rate_one - rec.deal_ex_rate_one)), l_round);
8911 unrel_sob_gl:= round((unrel_pl_value * rec.reval_ex_rate_one), l_round);
8912 /*
8913 IF xtr_risk_debug_pkg.g_Debug THEN
8914 xtr_risk_debug_pkg.dpush('xtr_revl_stock_unreal: ' || 'UNREAL_CURR');
8915 xtr_risk_debug_pkg.dlog('xtr_revl_stock_unreal: ' || 'deal_no', rec.deal_no);
8916 xtr_risk_debug_pkg.dlog('xtr_revl_stock_unreal: ' || 'trans no', rec.trans_no);
8917 xtr_risk_debug_pkg.dlog('xtr_revl_stock_unreal: ' || 'rate0', rec.deal_ex_rate_one);
8918 xtr_risk_debug_pkg.dlog('xtr_revl_stock_unreal: ' || 'rate1', rec.reval_ex_rate_one);
8919 xtr_risk_debug_pkg.dlog('xtr_revl_stock_unreal: ' || 'fv', rec.fair_value);
8920 xtr_risk_debug_pkg.dpop('xtr_revl_stock_unreal: ' || 'UNREAL_CURR');
8921 END IF;
8922 */
8923
8924 End if;
8925
8926
8927 Else -- UNREAL record is not result of resale
8928 rec.trans_no := 1;
8929 rec.effective_date := rec.revldate;
8930
8931 if p_overwrite = FALSE then -- Get STOCK price from API
8932 xtr_revl_getprice_stock(rec, l_stock_price);
8933 rec.reval_rate := l_stock_price;
8934 l_end_fv := nvl(st_rec.remaining_quantity, rec.quantity) * rec.reval_rate;
8935 rec.fair_value := l_end_fv;
8936
8937 /*
8938 if st_rec.init_quantity = st_rec.remaining_quantity then
8939 -- no recognized resale since the last reval
8940 l_begin_fv := st_rec.remaining_quantity * st_rec.prev_price;
8941 else
8942 -- resales have occurred since the last reval
8943 l_begin_fv := st_rec.prev_price * (st_rec.init_quantity /st_rec.remaining_quantity);
8944 end if;
8945 */
8946 l_begin_fv := nvl(st_rec.remaining_quantity, rec.quantity) * st_rec.prev_price;
8947
8948 rec.quantity := nvl(st_rec.remaining_quantity, rec.quantity);
8949
8950 else -- p_overwrite = TRUE
8951 if rec.ow_type = 'PRICE' then
8952 l_end_fv := rec.quantity * rec.reval_rate;
8953 rec.fair_value := l_end_fv;
8954 else --user overwrite FAIR VALUE
8955 l_end_fv := rec.fair_value;
8956 end if;
8957 xtr_first_reval(rec, l_first);
8958 if l_first = FALSE then -- not the first reval
8959 l_pre_batch := xtr_get_pre_batchid(rec);
8960 select fair_value
8961 into l_begin_fv
8962 from XTR_REVALUATION_DETAILS
8963 where deal_no = rec.deal_no
8964 and transaction_no = 1
8965 and nvl(realized_flag, 'N') = 'N'
8966 and batch_id = l_pre_batch;
8967 else
8968 l_begin_fv := rec.quantity * rec.transaction_rate;
8969 end if;
8970 end if;
8971
8972 rec.period_end := rec.revldate;
8973 rec.face_value := rec.quantity * rec.transaction_rate;
8974 unrel_pl_value := rec.fair_value - l_begin_fv;
8975 cum_pl_value := unrel_pl_value + (st_rec.cum_unrel_gl
8976 * nvl(st_rec.remaining_quantity, rec.quantity) / st_rec.init_quantity);
8977
8978 -- Calculate currency G/L and other SOB related fields
8979 If rec.reval_ccy = rec.sob_ccy then
8980 rec.reval_ex_rate_one := 1;
8981 rec.deal_ex_rate_one := 1;
8982 currency_gl := 0;
8983 fv_sob_amt := rec.fair_value;
8984 unrel_sob_gl := unrel_pl_value;
8985 Else
8986 if p_overwrite <> TRUE then
8987 xtr_revl_exchange_rate(rec, retcode);
8988 xtr_revl_get_curr_gl(rec, unrel_pl_value, null, fv_sob_amt,
8989 rel_sob_gl, unrel_sob_gl, currency_gl);
8990 else
8991 xtr_revl_get_curr_gl(rec, unrel_pl_value, null, fv_sob_amt,
8992 rel_sob_gl, unrel_sob_gl, currency_gl);
8993 end if;
8994 End if;
8995
8996
8997 End if;
8998
8999 r_rd.transaction_period := rec.period_end - rec.period_start;
9000 r_rd.effective_days := rec.period_end - rec.period_start;
9001
9002 if p_overwrite = FALSE then -- insert new record from concurrent program
9003 xtr_revl_unreal_log(rec, unrel_pl_value, cum_pl_value, fv_sob_amt,
9004 unrel_sob_gl, currency_gl, r_rd, retcode);
9005 end if;
9006
9007 EXCEPTION
9008 when GL_CURRENCY_API.no_rate then
9009 if g_call_by_form = true then
9010 FND_MESSAGE.set_name('XTR', 'XTR_NO_GL_RATE');
9011 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
9012 APP_EXCEPTION.raise_exception;
9013 else
9014 set_err_log(retcode);
9015 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_RATE_CURRENCY_GL');
9016 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
9017 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
9018 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
9019 l_buf := FND_MESSAGE.GET;
9020 FND_FILE.put_line(fnd_file.log, l_buf);
9021 end if;
9022 when GL_CURRENCY_API.invalid_currency then
9023 if g_call_by_form = true then
9024 FND_MESSAGE.set_name('XTR', 'XTR_INVALID_CURRENCY');
9025 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
9026 FND_MESSAGE.set_token('CURRENCY', rec.currencya);
9027 APP_EXCEPTION.raise_exception;
9028 else
9029 set_err_log(retcode);
9030 FND_MESSAGE.SET_NAME('XTR', 'XTR_INVALID_CURRENCY_TYPE');
9031 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
9032 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
9033 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
9034 l_buf := FND_MESSAGE.GET;
9035 FND_FILE.put_line(fnd_file.log, l_buf);
9036 end if;
9037 when others then
9038 if g_call_by_form = true then
9039 APP_EXCEPTION.raise_exception;
9040 else
9041 set_err_log(retcode);
9042 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_RATE_REF');
9043 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
9044 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
9045 APP_EXCEPTION.raise_exception;
9046 end if;
9047 END xtr_revl_stock_unreal;
9048
9049 ------------------------------------------------------------------
9050 /*********************************************************/
9051 /* This procedure returns reval rate for deal type STOCK */
9052 /*********************************************************/
9053 PROCEDURE xtr_revl_getprice_stock(
9054 rec IN xtr_revl_rec,
9055 p_stock_price OUT NOCOPY NUMBER) IS
9056
9057 l_stock_issue XTR_DEALS.bond_issue%TYPE;
9058 l_ric_code XTR_BOND_ISSUES.ric_code%TYPE;
9059 l_side VARCHAR2(1);
9060 r_md_in xtr_market_data_p.md_from_set_in_rec_type;
9061 r_md_out xtr_market_data_p.md_from_set_out_rec_type;
9062 r_err_log err_log; -- record type
9063 retcode NUMBER;
9064 l_market_set VARCHAR2(30);
9065 l_buf VARCHAR2(300);
9066 l_buff Varchar2(500);
9067 Begin
9068 -- We only reval STOCK when the pricing model = 'MARKET'
9069 if rec.pricing_model <> C_P_MODEL_MARKET then
9070 return;
9071 end if;
9072
9073 select RIC_CODE
9074 into l_ric_code
9075 from XTR_STOCK_ISSUES
9076 where stock_issue_code = rec.contract_code;
9077
9078 l_market_set := rec.MARKET_DATA_SET;
9079 xtr_revl_get_mds(l_market_set, rec);
9080
9081 l_side := 'B'; -- Always BUY deal, use BID
9082
9083 /*** Get stock price from market data set ***/
9084 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE,
9085 C_STOCK_IND, rec.revldate, rec.revldate, rec.currencya, NULL,
9086 NULL, NULL, l_side, rec.batch_id, l_ric_code);
9087 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
9088 p_stock_price := r_md_out.p_md_out;
9089
9090 EXCEPTION
9091 when XTR_MARKET_DATA_P.e_mdcs_no_data_found then
9092 if g_call_by_form = true then
9093 FND_MESSAGE.set_name('XTR', 'XTR_NO_MARKET');
9094 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
9095 APP_EXCEPTION.raise_exception;
9096 else
9097 set_err_log(retcode);
9098 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_MARKETDATASET');
9099 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
9100 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
9101 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
9102 l_buff := FND_MESSAGE.GET;
9103 FND_FILE.put_line(fnd_file.log, l_buff);
9104 end if;
9105 when XTR_MARKET_DATA_P.e_mdcs_no_curve_found then
9106 if g_call_by_form = true then
9107 FND_MESSAGE.set_name('XTR', 'XTR_NO_CURVE');
9108 FND_MESSAGE.set_token('MARKET', rec.market_data_set);
9109 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
9110 APP_EXCEPTION.raise_exception;
9111 else
9112 set_err_log(retcode);
9113 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_CURVEMARKET');
9114 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
9115 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
9116 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
9117 l_buff := FND_MESSAGE.GET;
9118 FND_FILE.put_line(fnd_file.log, l_buff);
9119 end if;
9120 when others then
9121 if g_call_by_form = true then
9122 APP_EXCEPTION.raise_exception;
9123 else
9124 set_err_log(retcode);
9125 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_RATE_REF');
9126 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
9127 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
9128 FND_MESSAGE.SET_TOKEN('ISSUE_CODE', rec.contract_code);
9129 l_buff := FND_MESSAGE.GET;
9130 fnd_file.put_line(fnd_file.log, l_buff);
9131 end if;
9132 End xtr_revl_getprice_stock;
9133
9134 -----------------------------------------------------------
9135 /*********************************************************/
9136 /* This procedure returns fair value for deal type IRO */
9137 /*********************************************************/
9138 PROCEDURE xtr_revl_fv_iro(
9139 rec IN OUT NOCOPY xtr_revl_rec,
9140 fair_value IN OUT NOCOPY NUMBER) is
9141 l_buf Varchar2(500);
9142 l_market_set VARCHAR2(30);
9143 l_ccy VARCHAR2(15);
9144 l_side VARCHAR2(5);
9145 l_day_t1 NUMBER;
9146 l_year_t1 NUMBER;
9147 l_day_t2 NUMBER;
9148 l_year_t2 NUMBER;
9149 l_face_amt NUMBER;
9150 l_int_rate NUMBER;
9151 l_fwd_rate NUMBER;
9152 l_volatility NUMBER;
9153 l_short_rate NUMBER;
9154 l_long_rate NUMBER;
9155 r_md_in xtr_market_data_p.md_from_set_in_rec_type;
9156 r_md_out xtr_market_data_p.md_from_set_out_rec_type;
9157 r_black_in XTR_MM_COVERS.black_opt_cv_in_rec_type;
9158 r_black_out XTR_MM_COVERS.black_opt_cv_out_rec_type;
9159 l_dummy NUMBER;
9160 l_dummy1 NUMBER;
9161 l_reval_rate NUMBER;
9162 r_err_log err_log; -- record type
9163 retcode NUMBER;
9164
9165 BEGIN
9166 l_market_set := rec.MARKET_DATA_SET;
9167 xtr_revl_get_mds(l_market_set, rec);
9168
9169 If rec.settle_date is not null and rec.effective_date <= rec.revldate then
9170 -- realized.
9171 xtr_end_fv(rec, fair_value);
9172 Elsif (rec.effective_date <= rec.revldate) and rec.settle_date is null then
9173 -- pass expiry date and deal not settled yet. Get fv from previous batch
9174 xtr_get_fv_from_batch(rec, fair_value, l_dummy, l_dummy1, l_reval_rate);
9175 rec.reval_rate := l_reval_rate;
9176 Else -- calculated unrealized FV
9177 XTR_CALC_P.calc_days_run(rec.revldate, rec.start_date,
9178 rec.year_calc_type, l_day_t1, l_year_t1);
9179 XTR_CALC_P.calc_days_run(rec.revldate, rec.maturity_date,
9180 rec.year_calc_type, l_day_t2, l_year_t2);
9181 if rec.deal_subtype in ('BCAP', 'BFLOOR') then
9182 l_side := 'A';
9183 else
9184 l_side := 'B';
9185 end if;
9186
9187 -- Get volatility rate
9188 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE,
9189 C_VOLATILITY_IND, rec.revldate, rec.maturity_date,
9190 rec.currencya, NULL, rec.year_calc_type,
9191 C_INTERPOL_LINER, l_side, rec.batch_id, NULL);
9192 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
9193 l_volatility := r_md_out.p_md_out;
9194
9195 if rec.deal_subtype in ('BCAP', 'SCAP') then
9196 l_side := 'A';
9197 else
9198 l_side := 'B';
9199 end if;
9200
9201 -- get int rate between reval date and start date based on Actual/365
9202 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE,
9203 C_YIELD_IND, rec.revldate, rec.start_date,
9204 rec.currencya, NULL, 'ACTUAL365', -- bug 3509267
9205 C_INTERPOL_LINER, l_side, rec.batch_id, NULL);
9206 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
9207 l_short_rate := r_md_out.p_md_out;
9208
9209 -- get int rate between reval date and maturity date based on Actual/365
9210 xtr_revl_mds_init(r_md_in, l_market_set, C_SOURCE,
9211 C_YIELD_IND, rec.revldate, rec.maturity_date,
9212 rec.currencya, NULL, 'ACTUAL365', -- bug 3509267
9213 C_INTERPOL_LINER, l_side, rec.batch_id, NULL);
9214 XTR_MARKET_DATA_P.get_md_from_set(r_md_in, r_md_out);
9215 l_long_rate := r_md_out.p_md_out;
9216
9217 if rec.pricing_model = C_P_MODEL_BLACK then
9218 r_black_in.p_principal := rec.face_value; -- deal face_value_amount
9219 r_black_in.p_strike_rate := rec.transaction_rate;
9220 r_black_in.p_day_count_basis_strike := rec.year_calc_type;
9221 r_black_in.p_day_count_basis_short := 'ACTUAL365';
9222 r_black_in.p_day_count_basis_long := 'ACTUAL365';
9223 r_black_in.p_ir_short := l_short_rate;
9224 r_black_in.p_ir_long := l_long_rate;
9225 r_black_in.p_spot_date := rec.revldate;
9226 r_black_in.p_start_date := rec.start_date;
9227 r_black_in.p_maturity_date := rec.maturity_date;
9228 r_black_in.p_volatility := l_volatility;
9229 XTR_MM_COVERS.black_option_price_cv(r_black_in, r_black_out);
9230 rec.reval_rate := r_black_out.p_forward_forward_rate;
9231
9232 if rec.deal_subtype in ('BCAP', 'SCAP') then
9233 fair_value := r_black_out.p_caplet_price;
9234 else
9235 fair_value := r_black_out.p_floorlet_price;
9236 end if;
9237
9238 if rec.deal_subtype in ('SCAP', 'SFLOOR') then
9239 fair_value := fair_value * (-1);
9240 end if;
9241 else
9242 if rec.pricing_model is null then
9243 raise e_invalid_price_model;
9244 else
9245 fair_value := null;
9246 return;
9247 end if;
9248 end if;
9249 End If;
9250
9251 EXCEPTION
9252 when XTR_MARKET_DATA_P.e_mdcs_no_data_found then
9253 if g_call_by_form = true then
9254 FND_MESSAGE.set_name('XTR', 'XTR_NO_MARKET');
9255 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
9256 APP_EXCEPTION.raise_exception;
9257 else
9258 set_err_log(retcode);
9259 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_MARKETDATASET');
9260 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
9261 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
9262 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
9263 l_buf := FND_MESSAGE.GET;
9264 FND_FILE.put_line(fnd_file.log, l_buf);
9265 end if;
9266 when XTR_MARKET_DATA_P.e_mdcs_no_curve_found then
9267 if g_call_by_form = true then
9268 FND_MESSAGE.set_name('XTR', 'XTR_NO_CURVE');
9269 FND_MESSAGE.set_token('MARKET', rec.market_data_set);
9270 FND_MESSAGE.set_token('DEAL_NO', rec.deal_no);
9271 APP_EXCEPTION.raise_exception;
9272 else
9273 set_err_log(retcode);
9274 FND_MESSAGE.SET_NAME('XTR', 'XTR_NO_CURVEMARKET');
9275 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
9276 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
9277 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
9278 l_buf := FND_MESSAGE.GET;
9279 FND_FILE.put_line(fnd_file.log, l_buf);
9280 end if;
9281 when others then
9282 if g_call_by_form = true then
9283 APP_EXCEPTION.raise_exception;
9284 else
9285 set_err_log(retcode);
9286 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
9287 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
9288 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
9289 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
9290 l_buf := FND_MESSAGE.GET;
9291 FND_FILE.put_line(fnd_file.log, l_buf);
9292 end if;
9293 end xtr_revl_fv_iro;
9294 --------------------------------------------------------
9295 /*********************************************************/
9296 /* This procedure returns fair value for deal type FRA */
9297 /*********************************************************/
9298 PROCEDURE xtr_revl_fv_irs(
9299 rec IN OUT NOCOPY xtr_revl_rec,
9300 fair_value IN OUT NOCOPY NUMBER) IS
9301 l_buf Varchar2(500);
9302 l_trans_no NUMBER;
9303 l_start_date DATE;
9304 l_maturity_date DATE;
9305 l_settle_date DATE;
9306 l_price_model VARCHAR2(30);
9307 l_market_set VARCHAR2(30);
9308 l_side VARCHAR2(5);
9309 l_day NUMBER;
9310 l_year NUMBER;
9311 l_pri_action VARCHAR2(7);
9312 l_pri_adjust NUMBER;
9313 l_acc_int NUMBER;
9314 l_balance_out NUMBER;
9315 l_future_val NUMBER;
9316 l_principal NUMBER;
9317 l_coupon_cf NUMBER;
9318 l_coupon_rate NUMBER;
9319 l_coupon_int NUMBER;
9320 l_int_settle NUMBER;
9321 l_int_rate NUMBER;
9322 l_accrued_int NUMBER;
9323 l_last_rec_trans NUMBER;
9324 l_fix_float VARCHAR2(5);
9325 l_round NUMBER;
9326 l_day_count_type VARCHAR2(1);
9327 l_round_type VARCHAR2(1);
9328 l_deal_begin_date DATE;
9329 l_max_trans_no NUMBER;
9330 l_first_trans_flag VARCHAR2(1);
9331 l_interest NUMBER;
9332 l_margin NUMBER;
9333 r_err_log err_log; -- record type
9334 retcode NUMBER;
9335
9336 cursor c_roll is
9337 select TRANSACTION_NUMBER, START_DATE, MATURITY_DATE, PRINCIPAL_ACTION,
9338 INTEREST_RATE, INTEREST_SETTLED, PRINCIPAL_ADJUST, ACCUM_INTEREST,
9339 BALANCE_OUT, SETTLE_TERM_INTEREST, INTEREST, SETTLE_DATE
9340 from xtr_rollover_transactions
9341 where DEAL_NUMBER = rec.deal_no
9342 and maturity_date >= rec.revldate
9343 order by transaction_number asc;
9344
9345 Begin
9346 select rounding_factor
9347 into l_round
9348 from xtr_master_currencies_v
9349 where currency = rec.reval_ccy;
9350
9351 select fixed_or_floating_rate, day_count_type, rounding_type, start_date, margin
9352 into l_fix_float, l_day_count_type, l_round_type, l_deal_begin_date,
9353 l_margin -- Bug 3230779
9354 from XTR_DEALS_V
9355 where deal_no = rec.deal_no;
9356
9357 select max(transaction_number)
9358 into l_max_trans_no
9359 from XTR_ROLLOVER_TRANSACTIONS_V
9360 where deal_number = rec.deal_no
9361 and start_date = l_deal_begin_date;
9362
9363 l_market_set := rec.MARKET_DATA_SET;
9364 xtr_revl_get_mds(l_market_set, rec);
9365
9366 for l_tmp in c_roll loop
9367 l_trans_no := l_tmp.TRANSACTION_NUMBER;
9368 l_start_date := l_tmp.START_DATE;
9369 l_maturity_date := l_tmp.MATURITY_DATE;
9370 l_settle_date := l_tmp.SETTLE_DATE;
9371 l_pri_action := l_tmp.PRINCIPAL_ACTION;
9372 l_pri_adjust := nvl(l_tmp.PRINCIPAL_ADJUST, 0);
9373 l_acc_int := l_tmp.ACCUM_INTEREST;
9374 l_balance_out := l_tmp.BALANCE_OUT;
9375 l_int_settle := l_tmp.INTEREST_SETTLED;
9376 l_int_rate := l_tmp.INTEREST_RATE;
9377 l_interest := l_tmp.INTEREST;
9378 l_principal := 0;
9379 l_coupon_cf := 0;
9380 l_accrued_int := 0;
9381
9382 -- for Interest Overwrite project
9383 if l_day_count_type = 'B' and l_trans_no = l_max_trans_no then
9384 l_first_trans_flag := 'Y';
9385 else
9386 l_first_trans_flag := 'N';
9387 end if;
9388
9389 /*********************************************/
9390 /* Calculate the present value of Principal */
9391 /*********************************************/
9392 if rec.discount_yield = 'N' then -- No principal cashflow
9393 l_principal := 0;
9394 else -- principal cashflow is exchanged
9395 if rec.revldate < l_start_date then
9396 if l_pri_adjust <> 0 then
9397 if l_pri_action = 'INCRSE' then
9398 if(rec.deal_subtype = 'FUND') then
9399 l_side := 'B';
9400 else
9401 l_side := 'A';
9402 end if;
9403 l_future_val := l_pri_adjust;
9404
9405 xtr_revl_present_value_tmm(rec, rec.batch_id, rec.year_calc_type,
9406 rec.revldate, l_start_date, l_future_val, rec.currencya,
9407 l_market_set, l_side, l_principal);
9408 elsif l_pri_action = 'DECRSE' then
9409 if(rec.deal_subtype = 'FUND') then
9410 l_side := 'A';
9411 else
9412 l_side := 'B';
9413 end if;
9414 l_future_val := l_pri_adjust;
9415 xtr_revl_present_value_tmm(rec, rec.batch_id, rec.year_calc_type,
9416 rec.revldate, l_start_date, l_future_val, rec.currencya,
9417 l_market_set, l_side, l_principal);
9418 end if;
9419 else
9420 l_principal := 0;
9421 end if;
9422 l_principal := round(l_principal, l_round);
9423 end if;
9424 end if;
9425
9426 IF xtr_risk_debug_pkg.g_Debug THEN
9427 xtr_risk_debug_pkg.dpush('xtr_revl_fv_irs: ' || 'IRS_PRINCIPAL');
9428 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'deal_no', rec.deal_no);
9429 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'trans no', l_trans_no);
9430 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'year_calc_type', rec.year_calc_type);
9431 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'l_start_date', l_start_date);
9432 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'l_future_val', l_future_val);
9433 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'rec.currencya', rec.currencya);
9434 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'l_market_set', l_market_set);
9435 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'l_side', l_side);
9436 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'l_principal', l_principal);
9437 xtr_risk_debug_pkg.dpop('xtr_revl_fv_irs: ' || 'IRS_PRINCIPAL');
9438 END IF;
9439
9440 if(rec.deal_subtype = 'FUND') then
9441 l_side := 'A';
9442 else
9443 l_side := 'B';
9444 end if;
9445
9446 /****************************************************/
9447 /* Calculate the present value of Coupon(Interest) */
9448 /****************************************************/
9449 if l_fix_float = 'FIXED' then -- fixed rate
9450 l_future_val := l_int_settle;
9451 l_coupon_rate := l_int_rate;
9452 xtr_revl_present_value_tmm(rec, rec.batch_id, rec.year_calc_type,
9453 rec.revldate, l_settle_date, l_future_val, rec.currencya,
9454 l_market_set, l_side, l_coupon_cf);
9455
9456 l_coupon_int := l_interest;
9457 else -- floating rate
9458 if rec.revldate > l_start_date then
9459 l_coupon_rate := l_int_rate;
9460 rec.reval_rate := l_coupon_rate;
9461 else
9462 rec.trans_no := l_trans_no;
9463 xtr_revl_getprice_fwd(rec, TRUE, l_coupon_rate);
9464 rec.reval_rate := l_coupon_rate + nvl(l_margin, 0)/100; -- bug 3230779
9465 end if; -- rec.revldate >
9466
9467 if rec.pricing_model = 'DISC_CASHFLOW' then
9468 l_coupon_int := xtr_calc_interest(l_balance_out,
9469 l_start_date, l_maturity_date, rec.reval_rate,
9470 rec.year_calc_type);
9471 else -- 'DISC_CASHSTA' take user overwriten interest from IRS deal
9472 l_coupon_int := l_interest;
9473 end if;
9474
9475 IF xtr_risk_debug_pkg.g_Debug THEN
9476 xtr_risk_debug_pkg.dpush('xtr_revl_fv_irs: ' || 'IRS_REVAL_RATE');
9477 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'deal_no', rec.deal_no);
9478 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'trans no', l_trans_no);
9479 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'rec.revldate', rec.revldate);
9480 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'l_start_date', l_start_date);
9481 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'l_int_rate', l_int_rate);
9482 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'l_coupon_rate', l_coupon_rate);
9483 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'rec.reval_rate', rec.reval_rate);
9484 xtr_risk_debug_pkg.dpop('xtr_revl_fv_irs: ' || 'IRS_REVAL_RATE');
9485 END IF;
9486
9487 /* for Interest Overwrite project
9488 l_coupon_int := xtr_calc_interest(l_balance_out,
9489 l_start_date, l_maturity_date, l_coupon_rate,
9490 rec.year_calc_type); */
9491 -- l_coupon_int := l_interest;
9492
9493 if rec.deal_subtype = 'FUND' then
9494 l_side := 'A';
9495 else
9496 l_side := 'B';
9497 end if;
9498 l_future_val := l_coupon_int;
9499 xtr_revl_present_value_tmm(rec, rec.batch_id, rec.year_calc_type,
9500 rec.revldate, l_settle_date, l_future_val, rec.currencya,
9501 l_market_set, l_side, l_coupon_cf);
9502
9503 -- for Interest Overwrite project
9504 if l_round_type = 'U' then
9505 l_coupon_cf := xtr_fps2_p.roundup(l_coupon_cf, l_round);
9506 elsif l_round_type = 'T' then
9507 l_coupon_cf := trunc(l_coupon_cf, l_round);
9508 else
9509 l_coupon_cf := round(l_coupon_cf, l_round);
9510 end if;
9511 end if;
9512
9513 IF xtr_risk_debug_pkg.g_Debug THEN
9514 xtr_risk_debug_pkg.dpush('xtr_revl_fv_irs: ' || 'IRS_INTEREST');
9515 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'deal_no', rec.deal_no);
9516 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'trans no', l_trans_no);
9517 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'year_calc_type', rec.year_calc_type);
9518 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'rec.revldate', rec.revldate);
9519 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'l_maturity_date', l_maturity_date);
9520 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'l_future_val', l_future_val);
9521 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'rec.currencya', rec.currencya);
9522 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'l_market_set', l_market_set);
9523 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'l_side', l_side);
9524 xtr_risk_debug_pkg.dlog('xtr_revl_fv_irs: ' || 'l_coupon_cf', l_coupon_cf);
9525 xtr_risk_debug_pkg.dpop('xtr_revl_fv_irs: ' || 'IRS_INTEREST');
9526 END IF;
9527
9528 -- for Interest Overwrite project
9529 if rec.revldate > l_start_date then
9530 if rec.revldate = l_maturity_date then
9531 l_accrued_int := l_coupon_int;
9532 else
9533 if l_fix_float = 'FIXED' then -- Bug 3230779
9534 l_accrued_int := xtr_calc_interest(l_balance_out, l_start_date,
9535 rec.revldate, l_coupon_rate, rec.year_calc_type,
9536 l_day_count_type, l_first_trans_flag);
9537 else -- floating leg
9538 l_accrued_int := xtr_calc_interest(l_balance_out, l_start_date,
9539 rec.revldate, l_coupon_rate, rec.year_calc_type,
9540 l_day_count_type, l_first_trans_flag);
9541 end if;
9542 end if;
9543
9544 if l_round_type = 'U' then
9545 l_accrued_int := xtr_fps2_p.roundup(l_accrued_int, l_round);
9546 elsif l_round_type = 'T' then
9547 l_accrued_int := trunc(l_accrued_int, l_round);
9548 else
9549 l_accrued_int := round(l_accrued_int, l_round);
9550 end if;
9551 end if;
9552
9553 fair_value := nvl(fair_value,0) + nvl(l_principal,0)
9554 + nvl(l_coupon_cf,0) - nvl(l_accrued_int,0);
9555 End loop;
9556 if rec.deal_subtype = 'FUND' then
9557 fair_value := fair_value * (-1);
9558 end if;
9559
9560 rec.trans_no := 1;
9561 EXCEPTION
9562 when others then
9563 if g_call_by_form = true then
9564 APP_EXCEPTION.raise_exception;
9565 else
9566 set_err_log(retcode);
9567 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
9568 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
9569 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
9570 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
9571 l_buf := FND_MESSAGE.GET;
9572 FND_FILE.put_line(fnd_file.log, l_buf);
9573 end if;
9574 end xtr_revl_fv_irs;
9575
9576 -------------------------------------------------------------
9577 /*******************************************************/
9578 /* This function return interest base on principle, */
9579 /* rate and number of days */
9580 /*******************************************************/
9581 FUNCTION xtr_calc_interest(
9582 p_principle IN NUMBER,
9583 p_start_date IN DATE,
9584 p_end_date IN DATE,
9585 p_rate IN NUMBER,
9586 p_day_count_basis IN VARCHAR2,
9587 p_day_count_type IN VARCHAR2,
9588 p_first_trans_flag IN VARCHAR2) return NUMBER IS
9589
9590 l_day NUMBER;
9591 l_year NUMBER;
9592 begin
9593 XTR_CALC_P.calc_days_run(p_start_date, p_end_date,
9594 p_day_count_basis, l_day, l_year, null, p_day_count_type, p_first_trans_flag);
9595 return (p_principle * p_rate * l_day) / (l_year * 100);
9596 end xtr_calc_interest;
9597 --------------------------------------------------------
9598 /*********************************************************/
9599 /* This procedure returns base and contra currency info */
9600 /* from system rate setup.Also return TRUE */
9601 /* if we need to invert base and contra */
9602 /*********************************************************/
9603 PROCEDURE xtr_get_base_contra(
9604 p_base IN OUT NOCOPY VARCHAR2,
9605 p_contra IN OUT NOCOPY VARCHAR2,
9606 p_reverse OUT NOCOPY BOOLEAN) IS
9607
9608 l_cur VARCHAR2(15) := NULL;
9609 cursor c_cur is
9610 select CURRENCY_FIRST
9611 from XTR_BUY_SELL_COMBINATIONS
9612 where (CURRENCY_BUY = p_base and CURRENCY_SELL = p_contra)
9613 or (CURRENCY_BUY = p_contra and CURRENCY_SELL = p_base);
9614
9615 begin
9616 for l_tmp in c_cur loop
9617 l_cur := l_tmp.CURRENCY_FIRST;
9618 end loop;
9619
9620 if l_cur = p_base then
9621 p_reverse := false;
9622 else
9623 -- swap it
9624 p_reverse := true;
9625 p_contra := p_base;
9626 p_base := l_cur;
9627 end if;
9628
9629 end xtr_get_base_contra;
9630 ----------------------------------------------------------------
9631 /**********************************************************/
9632 /* This procedure returns NI discount amount and effective*/
9633 /* interest for calculatin NI unrealized P/L */
9634 /**********************************************************/
9635 PROCEDURE xtr_ni_eff_interest(
9636 rec IN xtr_revl_rec,
9637 pre_disc_amt IN NUMBER,
9638 disc_amount OUT NOCOPY NUMBER,
9639 eff_interest OUT NOCOPY NUMBER) IS
9640 l_buf Varchar2(500);
9641 l_all_in_rate NUMBER;
9642 l_dummy NUMBER;
9643 l_disc_yield VARCHAR2(1);
9644 l_round NUMBER;
9645 l_no_of_days NUMBER;
9646 l_year_basis NUMBER;
9647 r_err_log err_log; -- record type
9648 retcode NUMBER;
9649 l_rounding_type VARCHAR2(10);
9650
9651 Begin
9652 select rounding_factor
9653 into l_round
9654 from xtr_master_currencies_v
9655 where currency = rec.reval_ccy;
9656
9657 select all_in_rate, rounding_type
9658 into l_all_in_rate, l_rounding_type -- 5130446
9659 from xtr_rollover_transactions, xtr_deals
9660 where deal_number = rec.deal_no
9661 and deal_number= deal_no
9662 and transaction_number = rec.trans_no;
9663
9664 if rec.discount_yield = 'Y' then -- 'DISCOUNT'
9665 l_disc_yield := 'D';
9666 else -- 'YIELD'
9667 l_disc_yield := 'Y';
9668 end if;
9669
9670 XTR_ACCRUAL_PROCESS_P.calculate_effective_interest(
9671 rec.face_value, l_all_in_rate, rec.start_date, rec.revldate,
9672 rec.maturity_date, 'Y', rec.year_calc_type, l_disc_yield, pre_disc_amt,
9673 l_no_of_days, l_year_basis, disc_amount, eff_interest);
9674
9675 eff_interest := xtr_fps2_p.interest_round(eff_interest,l_round,l_rounding_type); --bug 5130446
9676
9677 xtr_risk_debug_pkg.dpush('EFF_INTEREST');
9678 xtr_risk_debug_pkg.dlog('face value', rec.face_value);
9679 xtr_risk_debug_pkg.dlog('all in rate', l_all_in_rate);
9680 xtr_risk_debug_pkg.dlog('batch end date', rec.revldate);
9681 xtr_risk_debug_pkg.dlog('maturity date', rec.maturity_date);
9682 xtr_risk_debug_pkg.dlog('disc_yield', l_disc_yield);
9683 xtr_risk_debug_pkg.dlog('pre disc amt', pre_disc_amt);
9684 xtr_risk_debug_pkg.dlog('no of days', l_no_of_days);
9685 xtr_risk_debug_pkg.dlog('year basis', l_year_basis);
9686 xtr_risk_debug_pkg.dlog('disc amount', disc_amount);
9687 xtr_risk_debug_pkg.dlog('effective interest', eff_interest);
9688 xtr_risk_debug_pkg.dpop('EFF_INTEREST');
9689
9690 EXCEPTION
9691 when others then
9692 if g_call_by_form = true then
9693 APP_EXCEPTION.raise_exception;
9694 else
9695 set_err_log(retcode);
9696 FND_MESSAGE.SET_NAME('XTR', 'XTR_SQL_FAILURE');
9697 FND_MESSAGE.SET_TOKEN('DEAL_NO', rec.deal_no);
9698 FND_MESSAGE.SET_TOKEN('DEAL_TYPE', rec.deal_type);
9699 FND_MESSAGE.SET_TOKEN('TRANS_NO', rec.trans_no);
9700 l_buf := FND_MESSAGE.GET;
9701 FND_FILE.put_line(fnd_file.log, l_buf);
9702 end if;
9703 End;
9704 --------------------------------------------------------
9705 /*******************************************************/
9706 /* This procedure gathers necessary information from */
9707 /* XTR_MARKET_DATA table for calcuating the spot rate */
9708 /* or interest rate */
9709 /*******************************************************/
9710 PROCEDURE xtr_revl_mds_init(
9711 rec out NOCOPY XTR_MARKET_DATA_P.md_from_set_in_rec_type,
9712 p_md_set_code VARCHAR2,
9713 p_source VARCHAR2,
9714 p_indicator VARCHAR2,
9715 p_spot_date DATE,
9716 p_future_date DATE,
9717 p_ccy VARCHAR2,
9718 p_contra_ccy VARCHAR2,
9719 p_day_count_basis_out VARCHAR2,
9720 p_interpolation_method VARCHAR2,
9721 p_side VARCHAR2,
9722 p_batch_id NUMBER,
9723 p_bond_code VARCHAR2) IS
9724
9725 begin
9726 if (p_future_date is not NULL and
9727 p_spot_date > p_future_date) then
9728 raise e_date_order_error;
9729 end if;
9730 rec.p_md_set_code := p_md_set_code;
9731 rec.p_source := p_source;
9732 rec.p_indicator := p_indicator;
9733 rec.p_spot_date := p_spot_date;
9734 rec.p_future_date := p_future_date;
9735 rec.p_ccy := p_ccy;
9736 rec.p_contra_ccy := p_contra_ccy;
9737 rec.p_day_count_basis_out := p_day_count_basis_out;
9738 rec.p_interpolation_method := p_interpolation_method;
9739 rec.p_side := p_side;
9740 rec.p_batch_id := p_batch_id;
9741 rec.p_bond_code := p_bond_code;
9742
9743 end xtr_revl_mds_init;
9744
9745 --------------------------------------------------------
9746 /************************************************************/
9747 /* this flag determine the error message will write to the */
9748 /* log or prompt to the user immediately */
9749 /************************************************************/
9750 PROCEDURE set_call_by_curr IS
9751 begin
9752 g_call_by_form := FALSE;
9753 end set_call_by_curr;
9754
9755 --------------------------------------------------------
9756 PROCEDURE set_call_by_form IS
9757 begin
9758 g_call_by_form := TRUE;
9759 end set_call_by_form;
9760
9761 --------------------------------------------------------
9762 PROCEDURE set_err_log(retcode OUT NOCOPY NUMBER) IS
9763 begin
9764 g_status := 1;
9765 retcode := 1;
9766 end set_err_log;
9767
9768 -------------------------------------------------------------
9769 /************************************************************/
9770 /* This procedure writes the t_log array to concurrent */
9771 /* program default output file */
9772 /************************************************************/
9773 PROCEDURE t_log_dump is
9774 l_tmp NUMBER := 1;
9775 l_buf VARCHAR2(300);
9776 l_dirname VARCHAR2(512);
9777
9778 begin
9779 if t_log_count = 0 then
9780 return;
9781 end if;
9782
9783 while (l_tmp<=t_log_count) loop
9784 l_buf := 'Deal number: '|| t_log(l_tmp).deal_id ||
9785 ' Deal type: '|| t_log(l_tmp).deal_type;
9786
9787 if t_log(l_tmp).err_warn = 0 then -- This is a warning
9788 l_buf := l_buf || ' Warning: ' || t_log(l_tmp).log;
9789 Else
9790 if t_log(l_tmp).trans_no is NULL then
9791 l_buf := l_buf || ' Error: ' || t_log(l_tmp).log;
9792 else
9793 l_buf := l_buf || ' Transaction no: ' ||
9794 t_log(l_tmp).trans_no || ' Error: ' ||
9795 t_log(l_tmp).log;
9796 end if;
9797 End If;
9798 fnd_file.put_line(fnd_file.log, l_buf);
9799 l_tmp := l_tmp + 1;
9800 end loop;
9801 fnd_file.close;
9802 end t_log_dump;
9803
9804 --------------------------------------------------------
9805 PROCEDURE t_log_init is
9806 begin
9807 t_log.delete;
9808 end t_log_init;
9809
9810 --------------------------------------------------------
9811 FUNCTION t_log_count return NUMBER is
9812 begin
9813 return t_log.count;
9814 end t_log_count;
9815
9816 --------------------------------------------------------
9817 /*****************************************************************/
9818 /* This procedure insert unrealized values into xtr_revaluation_details table*/
9819 /* Also update xtr_deals and xtr_rollover_transactions, */
9820 /* xtr_bank_balance, xtr_intergroup_transfers */
9821 /******************************************************************/
9822 PROCEDURE xtr_revl_unreal_log(
9823 rec IN xtr_revl_rec,
9824 unrel_pl_value IN NUMBER,
9825 cum_pl_value IN NUMBER,
9826 fv_sob_amt IN NUMBER,
9827 unrel_sob_gl IN NUMBER,
9828 currency_gl IN NUMBER,
9829 r in XTR_REVALUATION_DETAILS%rowtype,
9830 retcode OUT NOCOPY NUMBER,
9831 p_hedge_flag IN VARCHAR2 DEFAULT NULL) IS
9832
9833 l_ROWID VARCHAR2(20);
9834 l_reval_detail_id NUMBER;
9835 l_event_id XTR_BATCH_EVENTS.BATCH_EVENT_ID%TYPE;
9836 l_sysdate DATE := trunc(sysdate);
9837 l_complete VARCHAR2(1);
9838 l_deal_rowid VARCHAR2(30);
9839 r_err_log err_log; -- record type
9840
9841 Cursor CHK_LOCK_DEAL is
9842 select rowid
9843 from XTR_DEALS
9844 where DEAL_NO = rec.deal_no
9845 and DEAL_TYPE not in ('NI', 'ONC', 'CA', 'IG')
9846 and FIRST_REVAL_BATCH_ID is null
9847 for update of FIRST_REVAL_BATCH_ID NOWAIT;
9848
9849 Cursor CHK_LOCK_ROLL is
9850 select rowid
9851 from XTR_ROLLOVER_TRANSACTIONS
9852 Where DEAL_NUMBER = rec.deal_no
9853 And TRANSACTION_NUMBER = rec.trans_no
9854 And DEAL_TYPE = 'NI'
9855 And FIRST_REVAL_BATCH_ID is null
9856 for update of FIRST_REVAL_BATCH_ID NOWAIT;
9857
9858 Cursor CHK_LOCK_HEDGE is
9859 select rowid
9860 from XTR_HEDGE_ATTRIBUTES
9861 where hedge_attribute_id = rec.deal_no
9862 and first_batch_id is NULL
9863 for update of first_batch_id NOWAIT;
9864
9865 Cursor CHK_LAST_HEDGE is
9866 select rowid
9867 from XTR_HEDGE_ATTRIBUTES
9868 where hedge_attribute_id = rec.deal_no
9869 and last_batch_id is NULL
9870 for update of last_batch_id NOWAIT;
9871
9872
9873 begin
9874 select XTR_REVALUATION_DETAILS_S.NEXTVAL
9875 into l_reval_detail_id from DUAL;
9876
9877 -- we consider the deal is complete if all FV P/L and currency G/L has been derived
9878 if rec.fair_value is not null and currency_gl is not null
9879 and p_hedge_flag is NULL then
9880 l_complete := 'Y';
9881 else
9882 l_complete := 'N';
9883 End if;
9884
9885 XTR_REVALUATION_DETAILS_PKG.INSERT_ROW(
9886 X_ROWID => l_ROWID,
9887 X_REVALUATION_DETAILS_ID=> l_reval_detail_id,
9888 X_REVAL_CURR_FV_AMOUNT => rec.fair_value,
9889 X_COMPLETE_FLAG => l_complete,
9890 X_FAIR_VALUE => rec.fair_value,
9891 X_CUMM_GAIN_LOSS_AMOUNT => cum_pl_value,
9892 X_CURR_GAIN_LOSS_AMOUNT => currency_gl,
9893 X_SOB_FV_GAIN_LOSS_AMOUNT => unrel_sob_gl,
9894 X_SOB_FAIR_VALUE_AMOUNT => fv_sob_amt,
9895 X_CTR_CURR_SOB_CURR_FWD_RATE => rec.reval_fx_fwd_rate,
9896 X_EXCHANGE_RATE_TWO => rec.reval_ex_rate_two,
9897 X_ACTION_CODE => null, -- obsolete
9898 X_COMPANY_CODE => rec.company_code,
9899 X_CONTRACT_CODE => rec.CONTRACT_CODE,
9900 X_CURRENCYA => rec.CURRENCYA,
9901 X_CURRENCYB => rec.CURRENCYB,
9902 X_DEAL_NO => rec.deal_no,
9903 X_DEAL_SUBTYPE => rec.deal_subtype,
9904 X_DEAL_TYPE => rec.deal_type,
9905 X_EFFECTIVE_DATE => rec.EFFECTIVE_DATE,
9906 X_EFFECTIVE_DAYS => r.EFFECTIVE_DAYS,
9907 X_ENTERED_BY => fnd_global.user_id,
9908 X_ENTERED_ON => l_sysdate,
9909 X_FACE_VALUE => rec.FACE_VALUE,
9910 X_FXO_SELL_REF_AMOUNT => rec.FXO_SELL_REF_AMOUNT,
9911 X_PERIOD_FROM => rec.period_start,
9912 X_PERIOD_TO => rec.period_end,
9913 X_PORTFOLIO_CODE => rec.PORTFOLIO_CODE,
9914 X_PRODUCT_TYPE => nvl(rec.PRODUCT_TYPE, 'NOT APPLIC'),
9915 X_REALISED_PL => null,
9916 X_REVAL_CCY => rec.REVAL_CCY,
9917 X_REVAL_RATE => rec.REVAL_RATE,
9918 X_TRANSACTION_NO => rec.trans_no,
9919 X_TRANSACTION_PERIOD => r.TRANSACTION_PERIOD,
9920 X_TRANSACTION_RATE => rec.TRANSACTION_RATE,
9921 X_UNREALISED_PL => unrel_pl_value,
9922 X_UPDATED_BY => fnd_global.user_id,
9923 X_UPDATED_ON => l_sysdate,
9924 X_YEAR_BASIS => rec.YEAR_BASIS,
9925 X_CREATED_ON => l_sysdate,
9926 X_EXCHANGE_RATE_ONE => rec.reval_ex_rate_one,
9927 X_REALIZED_FLAG => 'N',
9928 X_OVERWRITE_TYPE => rec.ow_type,
9929 X_OVERWRITE_VALUE => rec.ow_value,
9930 X_OVERWRITE_REASON => null,
9931 X_BATCH_ID => rec.batch_id,
9932 X_CREATED_BY => fnd_global.user_id,
9933 X_ACCOUNT_NO => rec.account_no,
9934 X_SWAP_REF => rec.swap_ref,
9935 X_NI_DISC_AMOUNT => rec.ni_disc_amount,
9936 X_AMOUNT_TYPE => nvl(r.amount_type, 'UNREAL'),
9937 X_QUANTITY => rec.quantity
9938 );
9939
9940 -- Insert FIRST_REVAL_BATCH_ID to deal table for the first time revaluation
9941 -- For NI and ONC, we insert into Rollover table, other deal types go to XTR_DEALS
9942
9943 Open CHK_LOCK_DEAL;
9944 Fetch CHK_LOCK_DEAL into l_deal_rowid;
9945 if CHK_LOCK_DEAL%FOUND then
9946 Update XTR_DEALS
9947 Set FIRST_REVAL_BATCH_ID = rec.batch_id,
9948 EXCHANGE_RATE_ONE = rec.deal_ex_rate_one,
9949 EXCHANGE_RATE_TWO = rec.deal_ex_rate_two
9950 Where rowid = l_deal_rowid;
9951 close CHK_LOCK_DEAL;
9952 else
9953 Close CHK_LOCK_DEAL;
9954 end if;
9955
9956 Open CHK_LOCK_ROLL;
9957 Fetch CHK_LOCK_ROLL into l_deal_rowid;
9958 if CHK_LOCK_ROLL%FOUND then
9959 Update XTR_ROLLOVER_TRANSACTIONS
9960 Set FIRST_REVAL_BATCH_ID = rec.batch_id,
9961 CURRENCY_EXCHANGE_RATE = rec.deal_ex_rate_one
9962 Where rowid = l_deal_rowid;
9963 close CHK_LOCK_ROLL;
9964 else
9965 Close CHK_LOCK_ROLL;
9966 end if;
9967
9968 if rec.deal_type = 'HEDGE' then
9969 Open CHK_LOCK_HEDGE;
9970 Fetch CHK_LOCK_HEDGE into l_deal_rowid;
9971 if CHK_LOCK_HEDGE%FOUND then
9972 Update XTR_HEDGE_ATTRIBUTES
9973 Set FIRST_BATCH_ID = rec.batch_id,
9974 INIT_FAIR_VALUE_RATE = rec.deal_ex_rate_one
9975 Where rowid = l_deal_rowid;
9976 close CHK_LOCK_HEDGE;
9977 else
9978 Close CHK_LOCK_HEDGE;
9979 end if;
9980
9981 if rec.effective_date <= rec.revldate then
9982 Open CHK_LAST_HEDGE;
9983 Fetch CHK_LAST_HEDGE into l_deaL_rowid;
9984 if CHK_LAST_HEDGE%FOUND then
9985 Update XTR_HEDGE_ATTRIBUTES
9986 Set LAST_BATCH_ID = rec.batch_id
9987 Where rowid = l_deal_rowid;
9988 close CHK_LAST_HEDGE;
9989 else
9990 Close CHK_LAST_HEDGE;
9991 end if;
9992 end if;
9993 end if;
9994
9995 Exception
9996 When app_exceptions.RECORD_LOCK_EXCEPTION then
9997 if CHK_LOCK_DEAL%ISOPEN then
9998 close CHK_LOCK_DEAL;
9999 end if;
10000
10001 if CHK_LOCK_ROLL%ISOPEN then
10002 close CHK_LOCK_ROLL;
10003 end if;
10004
10005 if CHK_LOCK_HEDGE%ISOPEN then
10006 close CHK_LOCK_HEDGE;
10007 end if;
10008
10009 if CHK_LAST_HEDGE%ISOPEN then
10010 close CHK_LAST_HEDGE;
10011 end if;
10012 FND_MESSAGE.Set_name('XTR', 'XTR_DEAL_LOCK');
10013 FND_MESSAGE.Set_token('DEAL_NO', rec.deal_no);
10014 FND_MESSAGE.Set_token('DEAL_TYPE', rec.deal_type);
10015 Raise app_exceptions.RECORD_LOCK_EXCEPTION;
10016
10017 end xtr_revl_unreal_log;
10018
10019 --------------------------------------------------------------------
10020 /*****************************************************************/
10021 /* This procedure insert realized values into xtr_revaluation_details table*/
10022 /* Also update xtr_deals and xtr_rollover_transactions, */
10023 /* xtr_bank_balance, xtr_intergroup_transfers */
10024 /******************************************************************/
10025 PROCEDURE xtr_revl_real_log (
10026 rec IN xtr_revl_rec,
10027 rel_pl_value IN NUMBER,
10028 fv_sob_amt IN NUMBER,
10029 rel_sob_gl IN NUMBER,
10030 currency_gl IN NUMBER,
10031 r in XTR_REVALUATION_DETAILS%rowtype,
10032 retcode OUT NOCOPY NUMBER) IS
10033
10034 l_ROWID VARCHAR2(20);
10035 l_reval_detail_id NUMBER;
10036 l_event_id XTR_BATCH_EVENTS.BATCH_EVENT_ID%TYPE;
10037 l_sysdate DATE := trunc(sysdate);
10038 l_complete VARCHAR2(1);
10039 l_deal_rowid VARCHAR2(30);
10040 r_err_log err_log; -- record type
10041
10042 Cursor CHK_LOCK_DEAL is
10043 select rowid
10044 from XTR_DEALS
10045 where DEAL_NO = rec.deal_no
10046 and ((DEAL_TYPE not in ('NI', 'ONC', 'CA', 'IG', 'BOND', 'STOCK','TMM', 'IRS'))
10047 or (DEAL_TYPE in ('TMM', 'IRS') and rec.effective_date <= rec.revldate))
10048 for update of FIRST_REVAL_BATCH_ID NOWAIT;
10049
10050 Cursor CHK_LOCK_ROLL is
10051 select rowid
10052 from XTR_ROLLOVER_TRANSACTIONS
10053 Where DEAL_NUMBER = rec.deal_no
10054 And TRANSACTION_NUMBER = rec.trans_no
10055 And DEAL_TYPE = 'NI'
10056 for update of FIRST_REVAL_BATCH_ID NOWAIT;
10057
10058 begin
10059 select XTR_REVALUATION_DETAILS_S.NEXTVAL
10060 into l_reval_detail_id from DUAL;
10061
10062 -- we consider the deal is complete if all FV P/L and currency G/L has been derived
10063 if rec.fair_value is not null and currency_gl is not null then
10064 l_complete := 'Y';
10065 else
10066 l_complete := 'N';
10067 End if;
10068
10069 XTR_REVALUATION_DETAILS_PKG.INSERT_ROW(
10070 X_ROWID => l_ROWID,
10071 X_REVALUATION_DETAILS_ID=> l_reval_detail_id,
10072 X_REVAL_CURR_FV_AMOUNT => rec.fair_value,
10073 X_COMPLETE_FLAG => l_complete,
10074 X_FAIR_VALUE => rec.fair_value,
10075 X_CUMM_GAIN_LOSS_AMOUNT => 0,
10076 X_CURR_GAIN_LOSS_AMOUNT => currency_gl,
10077 X_SOB_FV_GAIN_LOSS_AMOUNT => rel_sob_gl,
10078 X_SOB_FAIR_VALUE_AMOUNT => fv_sob_amt,
10079 X_CTR_CURR_SOB_CURR_FWD_RATE => rec.reval_fx_fwd_rate,
10080 X_EXCHANGE_RATE_TWO => rec.reval_ex_rate_two,
10081 X_ACTION_CODE => null, -- obsolete
10082 X_COMPANY_CODE => rec.company_code,
10083 X_CONTRACT_CODE => rec.CONTRACT_CODE,
10084 X_CURRENCYA => rec.CURRENCYA,
10085 X_CURRENCYB => rec.CURRENCYB,
10086 X_DEAL_NO => rec.deal_no,
10087 X_DEAL_SUBTYPE => rec.deal_subtype,
10088 X_DEAL_TYPE => rec.deal_type,
10089 X_EFFECTIVE_DATE => rec.EFFECTIVE_DATE,
10090 X_EFFECTIVE_DAYS => r.EFFECTIVE_DAYS,
10091 X_ENTERED_BY => fnd_global.user_id,
10092 X_ENTERED_ON => l_sysdate,
10093 X_FACE_VALUE => rec.FACE_VALUE,
10094 X_FXO_SELL_REF_AMOUNT => rec.FXO_SELL_REF_AMOUNT,
10095 X_PERIOD_FROM => rec.period_start,
10096 X_PERIOD_TO => rec.period_end,
10097 X_PORTFOLIO_CODE => rec.portfolio_code,
10098 X_PRODUCT_TYPE => nvl(rec.PRODUCT_TYPE, 'NOT APPLICABLE'),
10099 X_REALISED_PL => rel_pl_value,
10100 X_REVAL_CCY => rec.REVAL_CCY,
10101 X_REVAL_RATE => rec.REVAL_RATE,
10102 X_TRANSACTION_NO => rec.trans_no,
10103 X_TRANSACTION_PERIOD => r.TRANSACTION_PERIOD,
10104 X_TRANSACTION_RATE => rec.TRANSACTION_RATE,
10105 X_UNREALISED_PL => null,
10106 X_UPDATED_BY => fnd_global.user_id,
10107 X_UPDATED_ON => l_sysdate,
10108 X_YEAR_BASIS => rec.YEAR_BASIS,
10109 X_CREATED_ON => l_sysdate,
10110 X_EXCHANGE_RATE_ONE => rec.reval_ex_rate_one,
10111 X_REALIZED_FLAG => 'Y',
10112 X_OVERWRITE_TYPE => rec.ow_type,
10113 X_OVERWRITE_VALUE => rec.ow_value,
10114 X_OVERWRITE_REASON => null,
10115 X_BATCH_ID => rec.batch_id,
10116 X_CREATED_BY => fnd_global.user_id,
10117 X_ACCOUNT_NO => rec.account_no,
10118 X_SWAP_REF => rec.swap_ref,
10119 X_NI_DISC_AMOUNT => rec.ni_disc_amount,
10120 X_AMOUNT_TYPE => nvl(r.amount_type, 'REAL'),
10121 X_QUANTITY => rec.quantity
10122 );
10123
10124 -- Insert LAST_REVAL_BATCH_ID to deal table once realized G/L has obtained.
10125 -- For NI and ONC, we insert into Rollover table, other deal types go to XTR_DEALS
10126
10127 Open CHK_LOCK_DEAL;
10128 Fetch CHK_LOCK_DEAL into l_deal_rowid;
10129 if CHK_LOCK_DEAL%FOUND then
10130 close CHK_LOCK_DEAL;
10131 Update XTR_DEALS
10132 Set LAST_REVAL_BATCH_ID = rec.batch_id
10133 Where rowid = l_deal_rowid;
10134 else
10135 Close CHK_LOCK_DEAL;
10136 end if;
10137
10138 Open CHK_LOCK_ROLL;
10139 Fetch CHK_LOCK_ROLL into l_deal_rowid;
10140 if CHK_LOCK_ROLL%FOUND then
10141 close CHK_LOCK_ROLL;
10142 Update XTR_ROLLOVER_TRANSACTIONS
10143 Set LAST_REVAL_BATCH_ID = rec.batch_id
10144 Where rowid = l_deal_rowid;
10145 else
10146 Close CHK_LOCK_ROLL;
10147 end if;
10148
10149 Exception
10150 When app_exceptions.RECORD_LOCK_EXCEPTION then
10151 if CHK_LOCK_DEAL%ISOPEN then
10152 close CHK_LOCK_DEAL;
10153 end if;
10154
10155 if CHK_LOCK_ROLL%ISOPEN then
10156 close CHK_LOCK_ROLL;
10157 end if;
10158
10159 FND_MESSAGE.Set_name('XTR', 'XTR_DEAL_LOCK');
10160 FND_MESSAGE.Set_token('DEAL_NO', rec.deal_no);
10161 FND_MESSAGE.Set_token('DEAL_TYPE', rec.deal_type);
10162 Raise app_exceptions.RECORD_LOCK_EXCEPTION;
10163
10164 end xtr_revl_real_log;
10165
10166 ------------------------------------------------------------------------------
10167 /***********************************************************/
10168 /* This procedure insert value into XTR_BATCH_EVENTS table */
10169 /***********************************************************/
10170 PROCEDURE xtr_insert_event(
10171 p_batch_ID IN NUMBER) is
10172
10173 Cursor CHK_BATCH_RUN is
10174 Select 'Y'
10175 From XTR_BATCH_EVENTS
10176 Where batch_id = p_batch_id
10177 and event_code = 'REVAL';
10178
10179 l_event_id XTR_BATCH_EVENTS.BATCH_EVENT_ID%TYPE;
10180 l_sysdate DATE := trunc(sysdate);
10181 l_cur VARCHAR2(1);
10182 Begin
10183 Open CHK_BATCH_RUN;
10184 Fetch CHK_BATCH_RUN into l_cur;
10185 If CHK_BATCH_RUN%FOUND then -- the current batch has run
10186 Close CHK_BATCH_RUN;
10187 Raise e_batch_been_run;
10188 End If;
10189 Close CHK_BATCH_RUN;
10190
10191 -- insert new row to XTR_BATCH_EVENTS table
10192 select XTR_BATCH_EVENTS_S.NEXTVAL
10193 into l_event_id from DUAL;
10194
10195 Insert into XTR_BATCH_EVENTS(batch_event_id, batch_id, event_code, authorized,
10196 authorized_by, authorized_on, created_by, creation_date,
10197 last_updated_by, last_update_date, last_update_login)
10198 values(l_event_id, p_batch_id, 'REVAL', 'N', null, null, fnd_global.user_id,
10199 l_sysdate, fnd_global.user_id, l_sysdate, fnd_global.login_id);
10200
10201 EXCEPTION
10202 When e_batch_been_run then
10203 FND_MESSAGE.Set_Name('XTR', 'XTR_BATCH_IN_REVAL');
10204 FND_MESSAGE.Set_Token('BATCH', p_batch_id);
10205 APP_EXCEPTION.raise_exception;
10206
10207 End;
10208 --------------------------------------------------------
10209 PROCEDURE dump_xtr_mds_rec(
10210 p_name IN VARCHAR2,
10211 rec in XTR_MARKET_DATA_P.md_from_set_in_rec_type) IS
10212
10213 begin
10214 IF xtr_risk_debug_pkg.g_Debug THEN
10215 xtr_risk_debug_pkg.dpush('dump_xtr_mds_rec: ' || p_name);
10216 xtr_risk_debug_pkg.dlog('dump_xtr_mds_rec: ' || 'mds set code',rec.p_md_set_code);
10217 xtr_risk_debug_pkg.dlog('dump_xtr_mds_rec: ' || 'source', rec.p_source);
10218 xtr_risk_debug_pkg.dlog('dump_xtr_mds_rec: ' || 'ind', rec.p_indicator);
10219 xtr_risk_debug_pkg.dlog('dump_xtr_mds_rec: ' || 'spot date', rec.p_spot_date);
10220 xtr_risk_debug_pkg.dlog('dump_xtr_mds_rec: ' || 'future date', rec.p_future_date);
10221 xtr_risk_debug_pkg.dlog('dump_xtr_mds_rec: ' || 'currency', rec.p_ccy);
10222 xtr_risk_debug_pkg.dlog('dump_xtr_mds_rec: ' || 'contra ccy', rec.p_contra_ccy);
10223 xtr_risk_debug_pkg.dlog('dump_xtr_mds_rec: ' || 'day count basis', rec.p_day_count_basis_out);
10224 xtr_risk_debug_pkg.dlog('dump_xtr_mds_rec: ' || 'interpolation', rec.p_interpolation_method);
10225 xtr_risk_debug_pkg.dlog('dump_xtr_mds_rec: ' || 'side', rec.p_side);
10226 xtr_risk_debug_pkg.dlog('dump_xtr_mds_rec: ' || 'batch id', rec.p_batch_id);
10227 xtr_risk_debug_pkg.dlog('dump_xtr_mds_rec: ' || 'bond code', rec.p_bond_code);
10228 xtr_risk_debug_pkg.dpop('dump_xtr_mds_rec: ' || p_name);
10229 END IF;
10230
10231 end dump_xtr_mds_rec;
10232
10233 --------------------------------------------------------
10234 PROCEDURE dump_xtr_revl_rec(
10235 p_name IN VARCHAR2,
10236 rec IN xtr_revl_rec) is
10237 begin
10238 IF xtr_risk_debug_pkg.g_Debug THEN
10239 xtr_risk_debug_pkg.dpush('dump_xtr_revl_rec: ' || p_name);
10240 xtr_risk_debug_pkg.dlog('dump_xtr_revl_rec: ' || 'company_code', rec.company_code);
10241 xtr_risk_debug_pkg.dlog('dump_xtr_revl_rec: ' || 'deal_no', rec.deal_no);
10242 xtr_risk_debug_pkg.dlog('dump_xtr_revl_rec: ' || 'deal_type', rec.deal_type);
10243 xtr_risk_debug_pkg.dlog('dump_xtr_revl_rec: ' || 'deal_subtype', rec.deal_subtype);
10244 xtr_risk_debug_pkg.dlog('dump_xtr_revl_rec: ' || 'batch_id', rec.batch_id);
10245 xtr_risk_debug_pkg.dlog('dump_xtr_revl_rec: ' || 'fair_value', rec.fair_value);
10246 xtr_risk_debug_pkg.dlog('dump_xtr_revl_rec: ' || 'trans_no', rec.trans_no);
10247 xtr_risk_debug_pkg.dlog('dump_xtr_revl_rec: ' || 'ow_type', rec.ow_type);
10248 xtr_risk_debug_pkg.dlog('dump_xtr_revl_rec: ' || 'ow_value', rec.ow_value);
10249 xtr_risk_debug_pkg.dlog('dump_xtr_revl_rec: ' || 'revldate', rec.revldate);
10250 xtr_risk_debug_pkg.dpop('dump_xtr_revl_rec: ' || p_name);
10251 END IF;
10252
10253 end dump_xtr_revl_rec;
10254
10255 --------------------------------------------------------
10256 /* this procedure should retire later once the new deal
10257 input form the market data set become a not null field or
10258 has default value.
10259 */
10260
10261 PROCEDURE xtr_revl_get_mds(
10262 p_mds IN OUT NOCOPY VARCHAR2,
10263 rec IN xtr_revl_rec) is
10264
10265 cursor c_mds is
10266 select DEFAULT_MARKET_DATA_SET
10267 from xtr_product_types
10268 where DEAL_TYPE = rec.deal_type and
10269 PRODUCT_TYPE = rec.product_type;
10270
10271 begin
10272 if p_mds is not null then
10273 return;
10274 end if;
10275
10276 for l_tmp in c_mds loop
10277 p_mds := l_tmp.DEFAULT_MARKET_DATA_SET;
10278 end loop;
10279
10280
10281 if p_mds is not null then
10282 return;
10283 else
10284 select PARAMETER_VALUE_CODE into p_mds
10285 from xtr_company_parameters
10286 where COMPANY_CODE = rec.company_code and
10287 PARAMETER_CODE = C_MARKET_DATA_SET;
10288 end if;
10289
10290 end xtr_revl_get_mds;
10291 --------------------------------------------------------------
10292 /********************************************************************/
10293 /* This procedure determine whether the deal is reval at first time. */
10294 /* If it's the first time, return TRUE, else return FALSE */
10295 /* NOTE: this procedure is not working for CA and IG because the */
10296 /* first_batch_id is stored in xtr_bank_balances and xtr_intergroup */
10297 /* table. Since these two deals do not call procedure. So no worry */
10298 /* We may enhance later */
10299 /*********************************************************************/
10300 PROCEDURE xtr_first_reval(
10301 rec IN xtr_revl_rec,
10302 p_out OUT NOCOPY BOOLEAN) is
10303
10304 cursor C_FIRST_DEAL is
10305 select 'Y'
10306 from XTR_DEALS
10307 where deal_no = rec.deal_no
10308 and deal_type not in ('CA', 'IG', 'ONC', 'NI')
10309 and first_reval_batch_id is NOT NULL
10310 and first_reval_batch_id <> rec.batch_id;
10311
10312 cursor C_FIRST_ROLL is
10313 select 'Y'
10314 from XTR_ROLLOVER_TRANSACTIONS
10315 where deal_number = rec.deal_no
10316 and transaction_number = rec.trans_no
10317 and deal_type in ('NI', 'ONC')
10318 and first_reval_batch_id is NOT NULL
10319 and first_reval_batch_id <> rec.batch_id;
10320
10321 cursor C_FIRST_HEDGE is
10322 select 'Y'
10323 from XTR_HEDGE_ATTRIBUTES
10324 where hedge_attribute_id = rec.deal_no
10325 and first_batch_id is NOT NULL;
10326
10327 l_dummy VARCHAR2(1);
10328 Begin
10329 If rec.deal_type not in ('CA', 'IG', 'ONC', 'NI', 'HEDGE') then
10330 Open C_FIRST_DEAL;
10331 Fetch C_FIRST_DEAL into l_dummy;
10332 If C_FIRST_DEAL%FOUND then -- have record in reval table. Not the first time
10333 p_out := FALSE;
10334 else
10335 p_out := TRUE;
10336 end If;
10337 Close c_FIRST_DEAL;
10338 Elsif rec.deal_type in ('NI', 'ONC') then
10339 Open C_FIRST_ROLL;
10340 Fetch C_FIRST_ROLL into l_dummy;
10341 If C_FIRST_ROLL%FOUND then -- have record in reval table. Not the first time
10342 p_out := FALSE;
10343 else
10344 p_out := TRUE;
10345 end If;
10346 Close c_FIRST_ROLL;
10347 Elsif rec.deal_type = 'HEDGE' then
10348 Open C_FIRST_HEDGE;
10349 Fetch C_FIRST_HEDGE into l_dummy;
10350 If C_FIRST_HEDGE%FOUND then
10351 p_out := FALSE;
10352 else
10353 p_out := TRUE;
10354 end If;
10355 Close c_FIRST_HEDGE;
10356 End if;
10357
10358 End;
10359 ---------------------------------------------------------------
10360 PROCEDURE UPDATE_FX_REVALS (l_deal_no IN NUMBER,
10361 l_transaction_no IN NUMBER,
10362 l_deal_type IN VARCHAR2) is
10363
10364 Begin
10365 Delete from xtr_revaluation_details
10366 where deal_no = l_deal_no
10367 and transaction_no = l_transaction_no
10368 and deal_type = l_deal_type;
10369
10370 Exception
10371 When NO_DATA_FOUND then
10372 Null;
10373 When OTHERS then
10374 RAISE;
10375 End UPDATE_FX_REVALS;
10376 -------------------------------------------------------------
10377 PROCEDURE LOG_MSG(P_TEXT IN VARCHAR2 DEFAULT NULL, P_VALUE IN VARCHAR2 DEFAULT
10378 NULL) IS
10379
10380 l_flag VARCHAR2(1) ;
10381
10382 BEGIN
10383
10384 if l_flag = 'D' then
10385 /*dbms_output.put_line(p_text||' : '||p_value);*/
10386 null;
10387 elsif l_flag = 'C' then
10388 fnd_file.put_line(1,p_text||' : '||p_value);
10389 else
10390 xtr_risk_debug_pkg.dlog(p_text, p_value);
10391 end if;
10392
10393 END LOG_MSG;
10394 -------------------------------
10395 end XTR_REVAL_PROCESS_P;