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