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