DBA Data[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;