DBA Data[Home] [Help]

PACKAGE BODY: APPS.QRM_CALCULATORS_P

Source


1 PACKAGE BODY QRM_CALCULATORS_P AS
2 /* $Header: qrmcalcb.pls 120.5 2004/07/02 16:19:21 jhung ship $ */
3 
4 PROCEDURE ni_calculator (p_settlement_date DATE,
5 			 p_maturity_date DATE,
6 			 p_day_count_basis VARCHAR2,
7 		--'C'=to calculate considertion,'M'=to calculate maturity
8 			 p_indicator VARCHAR2,
9 			 p_ref_amt NUMBER,
10 			 p_rate_type VARCHAR2,
11 		--'DR'=discount rate,'Y'=yield rate
12 			 p_rate NUMBER,
13 			 p_consideration OUT NOCOPY NUMBER,
14 			 p_int_amt OUT NOCOPY NUMBER,
15 			 p_mat_amt OUT NOCOPY NUMBER,
16 			 p_price OUT NOCOPY NUMBER,
17 			 p_hold_prd OUT NOCOPY NUMBER,
18 			 p_adj_hold_prd OUT NOCOPY NUMBER,
19 			 p_conv_rate OUT NOCOPY NUMBER,
20 			 p_duration OUT NOCOPY NUMBER,
21 			 p_mod_dur OUT NOCOPY NUMBER,
22 			 p_bpv_y OUT NOCOPY NUMBER,
23 			 p_bpv_d OUT NOCOPY NUMBER,
24 			 p_dol_dur_y OUT NOCOPY NUMBER,
25 			 p_dol_dur_d OUT NOCOPY NUMBER,
26 			 p_convexity OUT NOCOPY NUMBER,
27 			 p_ccy IN OUT NOCOPY VARCHAR2) IS
28 
29   v_yield NUMBER;
30   v_day_count NUMBER;
31   v_ann_basis NUMBER;
32   v_in_pv xtr_mm_covers.presentvalue_in_rec_type;
33   v_out_pv xtr_mm_covers.presentvalue_out_rec_type;
34   v_in_fv xtr_mm_covers.futurevalue_in_rec_type;
35   v_out_fv xtr_mm_covers.futurevalue_out_rec_type;
36   v_pvc xtr_md_num_table := xtr_md_num_table();
37   v_days xtr_md_num_table := xtr_md_num_table();
38 
39 BEGIN
40   --call the debug package
41   IF (g_proc_level>=g_debug_level) THEN
42      xtr_risk_debug_pkg.dpush(null,'QRM_CALCULATORS_P.NI_CALCULATOR');
43      xtr_risk_debug_pkg.dlog('ni_calculator: ' || 'p_settlement_date',p_settlement_date);
44      xtr_risk_debug_pkg.dlog('ni_calculator: ' || 'p_maturity_date',p_maturity_date);
45      xtr_risk_debug_pkg.dlog('ni_calculator: ' || 'p_day_count_basis',p_day_count_basis);
46      xtr_risk_debug_pkg.dlog('ni_calculator: ' || 'p_indicator',p_indicator);
47      xtr_risk_debug_pkg.dlog('ni_calculator: ' || 'p_ref_amt',p_ref_amt);
48      xtr_risk_debug_pkg.dlog('ni_calculator: ' || 'p_rate_type',p_rate_type);
49      xtr_risk_debug_pkg.dlog('ni_calculator: ' || 'p_rate',p_rate);
50   END IF;
51 
52   --need to find day count and ann basis first
53   xtr_calc_p.calc_days_run_c(p_settlement_date, p_maturity_date,
54 			p_day_count_basis, null, v_day_count, v_ann_basis);
55   p_hold_prd := p_maturity_date - p_settlement_date;
56   p_adj_hold_prd := v_day_count;
57   --calc the mat. or cons depending on the indicator
58   IF (p_indicator = 'C') THEN
59     p_mat_amt := p_ref_amt;
60     v_in_pv.p_indicator := p_rate_type;
61     v_in_pv.p_future_val := p_ref_amt;
62     v_in_pv.p_rate := p_rate;
63     v_in_pv.p_day_count := v_day_count;
64     v_in_pv.p_annual_basis := v_ann_basis;
65     xtr_mm_covers.present_value(v_in_pv, v_out_pv);
66     p_consideration := v_out_pv.p_present_val;
67   ELSE
68     p_consideration := p_ref_amt;
69     v_in_fv.p_indicator := p_rate_type;
70     v_in_fv.p_present_val := p_ref_amt;
71     v_in_fv.p_rate := p_rate;
72     v_in_fv.p_day_count := v_day_count;
73     v_in_fv.p_annual_basis := v_ann_basis;
74     xtr_mm_covers.future_value(v_in_fv, v_out_fv);
75     p_mat_amt := v_out_fv.p_future_val;
76   END IF;
77   p_int_amt := p_mat_amt - p_consideration;
78   p_price := (p_consideration/p_mat_amt)*100;
79 
80   --calculate Converted Rate
81   IF (p_rate_type <> 'Y') THEN
82     xtr_rate_conversion.discount_to_yield_rate(p_rate,v_day_count,v_ann_basis,
83 						p_conv_rate);
84   ELSE
85     xtr_rate_conversion.yield_to_discount_rate(p_rate,v_day_count,v_ann_basis,
86 						p_conv_rate);
87   END IF;
88 
89   --calculate sensitivities, first Duration
90   v_pvc.EXTEND;
91   v_days.EXTEND;
92   v_pvc(1) := 1;
93   v_days(1) := v_day_count;
94   p_duration := qrm_mm_formulas.duration(v_pvc,v_days,v_ann_basis);
95   --calc Mod Dur, first we need yield rate
96   IF (p_rate_type <> 'Y') THEN
97     v_yield := p_conv_rate;
98   ELSE
99     v_yield := p_rate;
100   END IF;
101 --xtr_risk_debug_pkg.dlog('p_rate_type',p_rate_type);
102   p_mod_dur := qrm_mm_formulas.mod_duration(p_duration,v_yield,1);
103   --calc BPV Yield and Discount
104   p_bpv_y := qrm_mm_formulas.bpv_yr(p_consideration,p_mod_dur);
105   p_bpv_d := qrm_mm_formulas.ni_bpv_dr(p_mat_amt,v_day_count,v_ann_basis);
106   --calc Dollar Duration for Yield and Discount
107   p_dol_dur_y := qrm_mm_formulas.ni_delta_bpv('DOLLAR',p_bpv_y);
108   p_dol_dur_d := qrm_mm_formulas.ni_delta_bpv('DOLLAR',p_bpv_d);
109   --calc convexity
110   p_convexity := qrm_mm_formulas.ni_fra_convexity(v_day_count,v_yield,v_ann_basis);
111 
112   --if currency is null defaults value to XTR Reporting Curr.
113   IF (p_ccy IS NULL) THEN
114     SELECT param_value INTO p_ccy
115 	FROM xtr_pro_param WHERE param_name = 'SYSTEM_FUNCTIONAL_CCY';
116   END IF;
117 
118   IF (g_proc_level>=g_debug_level) THEN
119      xtr_risk_debug_pkg.dpop(null,'QRM_CALCULATORS_P.NI_CALCULATOR');
120   END IF;
121 
122 END ni_calculator;
123 
124 
125 
126 PROCEDURE fx_calculator(p_date_args    IN     SYSTEM.QRM_DATE_TABLE,
127 			p_varchar_args IN OUT NOCOPY SYSTEM.QRM_VARCHAR_TABLE,
128 			p_num_args     IN OUT NOCOPY xtr_md_num_table) IS
129 
130    p_spot_date date := p_date_args(1);
131    p_forward_date date := p_date_args(2);
132 
133    p_indicator varchar2(1) := p_varchar_args(1);
134    p_base_ccy varchar2(15) := p_varchar_args(2);
135    p_contra_ccy varchar2(15) := p_varchar_args(3);
136    p_currency_quote varchar2(20) := p_varchar_args(4);
137    p_interest_quote varchar2(20) := p_varchar_args(5);
138    p_base_curve varchar2(20) := p_varchar_args(6);
139    p_contra_curve varchar2(20) := p_varchar_args(7);
140    p_usd_curve varchar2(20) := p_varchar_args(8);
141    p_base_interpolation varchar2(20) := p_varchar_args(9);
142    p_contra_interpolation varchar2(20) := p_varchar_args(10);
143    p_usd_interpolation varchar2(20) := p_varchar_args(11);
144    p_base_quote_usd varchar2(1) := p_varchar_args(12);
145    p_contra_quote_usd varchar2(1) := p_varchar_args(13);
146    p_base_day_count varchar2(15) := p_varchar_args(14);
147    p_contra_day_count varchar2(15) := p_varchar_args(15);
148    p_usd_day_count varchar2(15) := p_varchar_args(16);
149    p_res_first_base_ccy varchar2(15) := p_varchar_args(17);
150    p_res_first_contra_ccy varchar2(15) := p_varchar_args(18);
151    p_res_sec_base_ccy varchar2(15) := p_varchar_args(19);
152    p_res_sec_contra_ccy varchar2(15) := p_varchar_args(20);
153 
154    p_base_ccy_amt number := p_num_args(1);
155    p_base_spot_bid number := p_num_args(2);
156    p_base_spot_ask number := p_num_args(3);
157    p_contra_spot_bid number := p_num_args(4);
158    p_contra_spot_ask number := p_num_args(5);
159    p_base_int_rate_bid number := p_num_args(6);
160    p_base_int_rate_ask number := p_num_args(7);
161    p_contra_int_rate_bid number := p_num_args(8);
162    p_contra_int_rate_ask number := p_num_args(9);
163    p_usd_int_rate_bid number := p_num_args(10);
164    p_usd_int_rate_ask number := p_num_args(11);
165    p_res_spot_bid number := p_num_args(12);
166    p_res_spot_ask number := p_num_args(13);
167    p_res_first_rate_bid number := p_num_args(14);
168    p_res_first_rate_ask number := p_num_args(15);
169    p_res_first_points_bid number := p_num_args(16);
170    p_res_first_points_ask number := p_num_args(17);
171    p_res_sec_rate_bid number := p_num_args(18);
172    p_res_sec_rate_ask number := p_num_args(19);
173    p_res_sec_points_bid number := p_num_args(20);
174    p_res_sec_points_ask number := p_num_args(21);
175    p_res_fwd_rate_bid number := p_num_args(22);
176    p_res_fwd_rate_ask number := p_num_args(23);
177    p_res_fwd_points_bid number := p_num_args(24);
178    p_res_fwd_points_ask number := p_num_args(25);
179    p_delta_spot_bid number := p_num_args(26);
180    p_delta_spot_ask number := p_num_args(27);
181    p_rho_base_bid number := p_num_args(28);
182    p_rho_base_ask number := p_num_args(29);
183    p_rho_contra_bid number := p_num_args(30);
184    p_rho_contra_ask number := p_num_args(31);
185 
186     p_curve_types SYSTEM.QRM_VARCHAR_TABLE;
187     p_curve_codes SYSTEM.QRM_VARCHAR_TABLE;
188     p_rate_types SYSTEM.QRM_VARCHAR_TABLE;
189     p_base_currencies SYSTEM.QRM_VARCHAR_TABLE;
190     p_contra_currencies SYSTEM.QRM_VARCHAR_TABLE;
191     p_quote_bases SYSTEM.QRM_VARCHAR_TABLE;
192     p_interp_methods SYSTEM.QRM_VARCHAR_TABLE;
193     p_data_sides SYSTEM.QRM_VARCHAR_TABLE;
194     p_day_count_bases SYSTEM.QRM_VARCHAR_TABLE;
195     p_spot_quote_bases SYSTEM.QRM_VARCHAR_TABLE;
196 
197     p_rates_table xtr_md_num_table;
198 
199     p_day_count_base number;
200     p_day_count_contra number;
201     p_day_count_usd number;
202     p_year_basis_base number;
203     p_year_basis_contra number;
204     p_year_basis_usd number;
205 
206     p_bid_rate_comm number;
207     p_ask_rate_comm number;
208     p_bid_rate_base number;
209     p_ask_rate_base number;
210     p_ccy varchar2(15);
211 
212 
213     -- boolean for checking whether usd row is required
214     -- true if neither currency is USD
215     p_neither_usd boolean := (p_base_ccy<>'USD' AND p_contra_ccy<>'USD');
216 
217     -- overwrite system quotation basis against usd when one currency is 'USD'
218     -- want to overwrite for FX Forward
219     p_ow_spot_rates boolean := true;
220 
221     md_in_rec XTR_MARKET_DATA_P.md_from_curve_in_rec_type;
222     md_out_rec XTR_MARKET_DATA_P.md_from_curve_out_rec_type;
223 
224     p_spot_rates xtr_md_num_table := xtr_md_num_table();
225     p_forward_rates xtr_md_num_table := xtr_md_num_table();
226 
227     df_in_rec XTR_RATE_CONVERSION.df_in_rec_type;
228     df_out_rec XTR_RATE_CONVERSION.df_out_rec_type;
229     p_int_rates xtr_md_num_table;
230     p_day_counts SYSTEM.QRM_VARCHAR_TABLE;
231     p_dis_factors xtr_md_num_table := xtr_md_num_table();
232 
233     p_delta xtr_md_num_table;
234     p_rho xtr_md_num_table;
235 
236 BEGIN
237 IF (g_proc_level>=g_debug_level) THEN
238    xtr_risk_debug_pkg.dpush(null,'QRM_CALCULATORS_P.fx_calculator');
239 END IF;
240 
241  IF fnd_msg_pub.count_msg > 0 THEN
242     fnd_msg_pub.Initialize;
243  END IF;
244 
245 -- Use Default Curves
246 -- Do preparation work
247  IF (p_indicator = 'D') THEN
248     IF (g_proc_level>=g_debug_level) THEN
249        xtr_risk_debug_pkg.dpush('fx_calculator: ' || 'Calculation Based On Defaults');
250     END IF;
251 
252     -- ** Default fields ** --
253     p_base_interpolation := 'DEFAULT';
254     p_contra_interpolation := 'DEFAULT';
255     p_usd_interpolation := 'DEFAULT';
256     p_interest_quote := 'BID/ASK';
257     p_base_day_count := 'ACTUAL/ACTUAL';
258     p_contra_day_count := 'ACTUAL/ACTUAL';
259     p_usd_day_count := 'ACTUAL/ACTUAL';
260     --  ****************** --
261 
262     p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD','YIELD','YIELD');
263     p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy,p_contra_ccy,'USD');
264 
265     p_curve_codes := get_curves_from_base(p_curve_types,p_base_currencies,
266 						p_contra_currencies);
267     p_base_curve := p_curve_codes(1);
268     p_contra_curve := p_curve_codes(2);
269     p_usd_curve := null;
270     p_usd_interpolation := null;
271 
272     IF (g_proc_level>=g_debug_level) THEN
273        xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'base curve', p_base_curve);
274        xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'contra curve', p_contra_curve);
275     END IF;
276     -- if neither currency is USD, then a USD curve is needed
277     if (p_neither_usd) then
278 	p_usd_curve := p_curve_codes(3);
279 	p_usd_interpolation := 'DEFAULT';
280 	IF (g_proc_level>=g_debug_level) THEN
281 	   xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'usd required', p_neither_usd);
282 	   xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'usd curve', p_usd_curve);
283 	END IF;
284     end if;
285 
286     -- calculate Rates
287 	-- this follows the calculator table across each row
288         -- first do Spot Rates
289     -- get quotation basis against usd defined in Current System Rates
290     p_spot_quote_bases := get_spot_quotation_basis(p_base_ccy, p_contra_ccy,
291 						   p_ow_spot_rates);
292     p_base_quote_usd := p_spot_quote_bases(1);
293     p_contra_quote_usd := p_spot_quote_bases(2);
294     if (p_base_ccy = 'USD' AND p_contra_ccy <> 'USD') then
295 	p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
296 	p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_contra_ccy, p_contra_ccy);
297 	p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_contra_quote_usd,
298 					   p_contra_quote_usd);
299 	p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
300     elsif (p_contra_ccy = 'USD' AND p_base_ccy <> 'USD') then
301 	p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
302 	p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy, p_base_ccy);
303 	p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_base_quote_usd,p_base_quote_usd);
304 	p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
305     elsif (p_base_ccy <> 'USD' AND p_contra_ccy <> 'USD') then
306     	p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT','SPOT','SPOT');
307     	p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy,p_base_ccy,
311     	p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
308 					   p_contra_ccy, p_contra_ccy);
309     	p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_base_quote_usd, p_base_quote_usd,
310 				       p_contra_quote_usd,p_contra_quote_usd);
312     end if;
313 
314     p_rates_table := get_rates_from_base(p_rate_types, p_base_currencies,
315 					 p_contra_currencies, p_quote_bases,
316 					 p_interp_methods, p_data_sides,
317 					 p_day_count_bases,p_interest_quote,
318 					 p_currency_quote,p_spot_date,
319 					 p_forward_date);
320 
321     if (p_base_ccy = 'USD' AND p_contra_ccy <> 'USD') then
322 	p_base_spot_bid := 1;
323 	p_base_spot_ask := 1;
324     	p_contra_spot_bid := p_rates_table(1);
325     	p_contra_spot_ask := p_rates_table(2);
326     elsif (p_contra_ccy = 'USD' AND p_base_ccy <> 'USD') then
327 	p_base_spot_bid := p_rates_table(1);
328 	p_base_spot_ask := p_rates_table(2);
329 	p_contra_spot_bid := 1;
330 	p_contra_spot_ask := 1;
331     elsif (p_neither_usd) then
332 	p_base_spot_bid := p_rates_table(1);
333 	p_base_spot_ask := p_rates_table(2);
334     	p_contra_spot_bid := p_rates_table(3);
335     	p_contra_spot_ask := p_rates_table(4);
336     end if;
337 
338     -- now do Interest Rates
339     p_rate_types.delete;
340     p_base_currencies.delete;
341     p_data_sides.delete;
342     p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT','DEFAULT',
343 					  'DEFAULT','DEFAULT');
344     p_quote_bases := null;
345     p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD','YIELD','YIELD','YIELD');
346     p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy, p_base_ccy,
347 					   p_contra_ccy, p_contra_ccy);
348     p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
349     p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_base_day_count, p_base_day_count,
350 					   p_contra_day_count,
351 					   p_contra_day_count);
352     if (p_neither_usd) then
353 	p_rate_types.extend(2);
354         p_rate_types(5) := 'YIELD';
355         p_rate_types(6) := 'YIELD';
356 	p_interp_methods.extend(2);
357 	p_interp_methods(5) := 'DEFAULT';
358 	p_interp_methods(6) := 'DEFAULT';
359 	p_base_currencies.extend(2);
360         p_base_currencies(5) := 'USD';
361         p_base_currencies(6) := 'USD';
362 	p_data_sides.extend(2);
363 	p_data_sides(5) := 'BID';
364 	p_data_sides(6) := 'ASK';
365 	p_day_count_bases.extend(2);
366         p_day_count_bases(5) := p_usd_day_count;
367         p_day_count_bases(6) := p_usd_day_count;
368     end if;
369 
370 
371     p_rates_table := get_rates_from_base(p_rate_types, p_base_currencies,
372 					 p_contra_currencies, p_quote_bases,
373 					 p_interp_methods, p_data_sides,
374 					 p_day_count_bases,p_interest_quote,
375 					 p_currency_quote,p_spot_date,
376 					 p_forward_date);
377     p_base_int_rate_bid := p_rates_table(1);
378     p_base_int_rate_ask := p_rates_table(2);
379     p_contra_int_rate_bid := p_rates_table(3);
380     p_contra_int_rate_ask := p_rates_table(4);
381 
382     if (p_neither_usd) then
383 	p_usd_int_rate_bid := p_rates_table(5);
384         p_usd_int_rate_ask := p_rates_table(6);
385     else
386 	p_usd_day_count := null;
387     	p_usd_int_rate_bid := null;
388     	p_usd_int_rate_ask := null;
389     end if;
390 
391     for i IN 1..p_rates_table.count LOOP
392        IF (g_proc_level>=g_debug_level) THEN
393           xtr_risk_debug_pkg.dlog('fx_calculator: ' || p_rate_types(i),p_rates_table(i));
394        END IF;
395     END LOOP;
396   IF (g_proc_level>=g_debug_level) THEN
397      xtr_risk_debug_pkg.dpop('fx_calculator: ' || 'Calculation Based On Defaults');
398   END IF;
399 
400   ELSIF (p_indicator = 'C') then
401      IF (g_proc_level>=g_debug_level) THEN
402         xtr_risk_debug_pkg.dpush('fx_calculator: ' || 'Calculation Based On Curves');
403      END IF;
404 
405     -- ** Default fields ** --
406     p_base_day_count := 'ACTUAL/ACTUAL';
407     p_contra_day_count := 'ACTUAL/ACTUAL';
408     p_usd_day_count := 'ACTUAL/ACTUAL';
409     --  ****************** --
410 
411      -- GET DEFAULT CURVES
412      if (p_base_curve IS null) then
413 	p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
414 	p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy);
415         p_curve_codes := get_curves_from_base(p_curve_types,
416 					      p_base_currencies,
417 					      p_contra_currencies);
418 	p_base_curve := p_curve_codes(1);
419      end if;
420      if (p_contra_curve IS null) then
421 	p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
422 	p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_contra_ccy);
423         p_curve_codes := get_curves_from_base(p_curve_types,
424 					      p_base_currencies,
425 					      p_contra_currencies);
426 	p_contra_curve := p_curve_codes(1);
427     end if;
428 
429     -- USD curve is required, but it is null
430     -- get default USD curve
431     if (p_neither_usd) then
432 	if (p_usd_curve IS null) then
433 	    p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
434 	    p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE('USD');
435 	    p_curve_codes := get_curves_from_base(p_curve_types,
436 					      p_base_currencies,
437 					      p_contra_currencies);
438 	    p_usd_curve := p_curve_codes(1);
439 	end if;
440     -- if one ccy is USD, set usd row curve/interp to null
441     else
445 
442 	p_usd_curve := null;
443 	p_usd_interpolation := null;
444     end if;
446   -- GET DEFAULT RATES based on CURVES
447     -- first do SPOT RATES
448     p_curve_codes := null;
449     p_base_currencies := null;
450     -- get quotation basis against usd defined in Current System Rates
451     p_spot_quote_bases := get_spot_quotation_basis(p_base_ccy, p_contra_ccy,
452 						   p_ow_spot_rates);
453     p_base_quote_usd := p_spot_quote_bases(1);
454     p_contra_quote_usd := p_spot_quote_bases(2);
455     if (p_base_ccy = 'USD' AND p_contra_ccy <> 'USD') then
456     	p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
457 	p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_contra_ccy, p_contra_ccy);
458 	p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_contra_quote_usd,
459 					   p_contra_quote_usd);
460   	p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
461     elsif (p_base_ccy <> 'USD' AND p_contra_ccy = 'USD') then
462 	p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
463 	p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy, p_base_ccy);
464 	p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_base_quote_usd, p_base_quote_usd);
465 	p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
466     elsif (p_neither_usd) then
467 	p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT','SPOT','SPOT');
468     	p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy,p_base_ccy,
469 					   p_contra_ccy,p_contra_ccy);
470     	p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_base_quote_usd, p_base_quote_usd,
471 				      p_contra_quote_usd,p_contra_quote_usd);
472 	p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
473     end if;
474 
475     p_rates_table := get_rates_from_curves(p_rate_types,p_curve_codes,
476 				           p_base_currencies,
477 					   p_contra_currencies,
478 					   p_quote_bases,
479 					   p_interp_methods,
480 					   p_data_sides,
481 					   p_day_count_bases,
482 					   p_interest_quote,
483 					   p_currency_quote,
484 					   p_spot_date, p_forward_date);
485     if (p_contra_ccy = 'USD') then
486         p_base_spot_bid := p_rates_table(1);
487         p_base_spot_ask := p_rates_table(2);
488 	p_contra_spot_bid := 1;
489 	p_contra_spot_ask := 1;
490     elsif (p_base_ccy = 'USD') then
491 	p_base_spot_bid := 1;
492 	p_base_spot_ask := 1;
493 	p_contra_spot_bid := p_rates_table(1);
494 	p_contra_spot_ask := p_rates_table(2);
495     elsif (p_neither_usd) then
496         p_base_spot_bid := p_rates_table(1);
497         p_base_spot_ask := p_rates_table(2);
498 	p_contra_spot_bid := p_rates_table(3);
499 	p_contra_spot_ask := p_rates_table(4);
500     end if;
501 
502     -- now get INTEREST RATES
503     p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD','YIELD','YIELD','YIELD');
504     p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_base_curve,p_base_curve,
505 				       p_contra_curve,p_contra_curve);
506     p_base_currencies.delete;
507     p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy,p_base_ccy,
508 					   p_contra_ccy,p_contra_ccy);
509     p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_base_interpolation,
510 	p_base_interpolation, p_contra_interpolation, p_contra_interpolation);
511 
512     p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
513     p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_base_day_count,p_base_day_count,
514 				p_contra_day_count,p_contra_day_count);
515     p_quote_bases := null;
516     if (p_neither_usd) then
517 	p_rate_types.extend(2);
518 	p_rate_types(5) := 'YIELD';
519         p_rate_types(6) := 'YIELD';
520 	p_curve_codes.extend(2);
521         p_curve_codes(5) := p_usd_curve;
522      	p_curve_codes(6) := p_usd_curve;
523 	p_base_currencies.extend(2);
524 	p_base_currencies(5) := 'USD';
525 	p_base_currencies(6) := 'USD';
526 	p_interp_methods.extend(2);
527         p_interp_methods(5) := p_usd_interpolation;
528         p_interp_methods(6) := p_usd_interpolation;
529 	p_data_sides.extend(2);
530         p_data_sides(5) := 'BID';
531         p_data_sides(6) := 'ASK';
532 	p_day_count_bases.extend(2);
533         p_day_count_bases(5) := p_usd_day_count;
534     	p_day_count_bases(6) := p_usd_day_count;
535     end if;
536 
537     p_rates_table := get_rates_from_curves(p_rate_types,p_curve_codes,
538 					   p_base_currencies,
539 					   p_contra_currencies,
540 					   p_quote_bases,p_interp_methods,
541 					   p_data_sides,p_day_count_bases,
542 					   p_interest_quote,p_currency_quote,
543 					   p_spot_date,
544 					   p_forward_date);
545     p_base_int_rate_bid := p_rates_table(1);
546     p_base_int_rate_ask := p_rates_table(2);
547     p_contra_int_rate_bid := p_rates_table(3);
548     p_contra_int_rate_ask := p_rates_table(4);
549     if (p_neither_usd) then
550 	p_usd_int_rate_bid := p_rates_table(5);
551         p_usd_int_rate_ask := p_rates_table(6);
552     else
553 	p_usd_day_count := null;
554     	p_usd_int_rate_bid := null;
555     	p_usd_int_rate_ask := null;
556     end if;
557   IF (g_proc_level>=g_debug_level) THEN
558      xtr_risk_debug_pkg.dpop('fx_calculator: ' || 'Calculation Based On Curves');
559   END IF;
560 
561   -- 'Calculate Based On Rates' button pressed
562   ELSIF (p_indicator = 'R') then
563   IF (g_proc_level>=g_debug_level) THEN
564      xtr_risk_debug_pkg.dpush('fx_calculator: ' || 'Calculation Based On Rates');
565   END IF;
569 	    p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
566      -- if a spot rate is missing, go to base(defaults) section
567      if (p_base_spot_bid IS null) then
568 	if (p_base_ccy <> 'USD') then
570 	    p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy);
571 	    p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_base_quote_usd);
572 	    p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
573     	    p_rates_table := get_rates_from_curves(p_rate_types,
574 						p_curve_codes,
575 						p_base_currencies,
576 					   	p_contra_currencies,
577 						p_quote_bases,
578 						p_interp_methods,
579 					   	p_data_sides,
580 						p_day_count_bases,
581 						p_interest_quote,
582 					   	p_currency_quote,
583 					   	p_spot_date, p_forward_date);
584     	    p_base_spot_bid := p_rates_table(1);
585 	else
586 	    p_base_spot_bid := 1;
587 	end if;
588 	-- get corresponding base ccy curve
589 
590      end if;
591      if (p_base_spot_ask IS null) then
592 	if (p_base_ccy <> 'USD') then
593 	    p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
594 	    p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy);
595 	    p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_base_quote_usd);
596 	    p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
597     	    p_rates_table := get_rates_from_curves(p_rate_types,
598 						p_curve_codes,
599 						p_base_currencies,
600 					   	p_contra_currencies,
601 						p_quote_bases,
602 						p_interp_methods,
603 					   	p_data_sides,
604 						p_day_count_bases,
605 						p_interest_quote,
606 					   	p_currency_quote,
607 					   	p_spot_date, p_forward_date);
608     	    p_base_spot_ask := p_rates_table(1);
609 	else
610 	    p_base_spot_ask := 1;
611 	end if;
612      end if;
613      if (p_contra_spot_bid IS null) then
614 	if (p_contra_ccy <> 'USD') then
615 	    p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
616 	    p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_contra_ccy);
617 	    p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_contra_quote_usd);
618 	    p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
619     	    p_rates_table := get_rates_from_curves(p_rate_types,
620 						p_curve_codes,
621 						p_base_currencies,
622 					   	p_contra_currencies,
623 						p_quote_bases,
624 						p_interp_methods,
625 					   	p_data_sides,
626 						p_day_count_bases,
627 						p_interest_quote,
628 					   	p_currency_quote,
629 					   	p_spot_date, p_forward_date);
630     	    p_contra_spot_bid := p_rates_table(1);
631 	else
632 	    p_contra_spot_bid := 1;
633 	end if;
634      end if;
635      if (p_contra_spot_ask IS null) then
636 	if (p_contra_ccy <> 'USD') then
637 	    p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
638 	    p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_contra_ccy);
639 	    p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_contra_quote_usd);
640 	    p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
641     	    p_rates_table := get_rates_from_curves(p_rate_types,
642 						p_curve_codes,
643 						p_base_currencies,
644 					   	p_contra_currencies,
645 						p_quote_bases,
646 						p_interp_methods,
647 					   	p_data_sides,
648 						p_day_count_bases,
649 						p_interest_quote,
650 					   	p_currency_quote,
651 					   	p_spot_date, p_forward_date);
652     	    p_contra_spot_ask := p_rates_table(1);
653 	else
654 	    p_contra_spot_ask := 1;
655 	end if;
656      end if;
657 
658      -- if INTEREST RATES are missing, first check if curve section is filled
659      -- if so, use curve;
660      -- else, go to base(defaults) section and default curve in curves section
661      if (p_base_int_rate_bid IS null) then
662 	p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
663 	p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy);
664  	p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
665 	p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_base_day_count);
666 	-- if curve section is null, go to defaults
667 	if (p_base_curve IS null) then
668 	    p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
669 	    p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
670 	    p_curve_codes := get_curves_from_base(p_curve_types,
671 					      p_base_currencies,
672 					      p_contra_currencies);
673 	    -- calculate rate
674 	    p_rates_table := get_rates_from_curves(p_rate_types,
675 		p_curve_codes,p_base_currencies,p_contra_currencies,
676 		p_quote_bases,p_interp_methods,p_data_sides,
677 		p_day_count_bases,p_interest_quote,p_currency_quote,
678 		p_spot_date,p_forward_date);
679 	   -- default curves section
680 	   p_base_curve := p_curve_codes(1);
681 	   IF (g_proc_level>=g_debug_level) THEN
682 	      xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted base curve', p_base_curve);
683 	   END IF;
684 	   p_base_interpolation := p_interp_methods(1);
685 	else
686 	-- curve section not null, use curve
687 	    p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_base_curve);
688 	    p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_base_interpolation);
689 	    -- calculate rate
690 	    p_rates_table := get_rates_from_curves(p_rate_types,
691 		p_curve_codes,p_base_currencies,p_contra_currencies,
692 		p_quote_bases,p_interp_methods,p_data_sides,
693 		p_day_count_bases,p_interest_quote,p_currency_quote,
694 		p_spot_date,p_forward_date);
695 	end if;
696 	p_base_int_rate_bid := p_rates_table(1);
700      end if;
697 	IF (g_proc_level>=g_debug_level) THEN
698 	   xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted base bid rate',p_base_int_rate_bid);
699 	END IF;
701      if (p_base_int_rate_ask IS null) then
702 	p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
703 	p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy);
704  	p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
705 	p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_base_day_count);
706 	-- if curve section is null, go to defaults
707 	if (p_base_curve IS null) then
708 	    p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
709 	    p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
710 	    p_curve_codes := get_curves_from_base(p_curve_types,
711 					      p_base_currencies,
712 					      p_contra_currencies);
713 	    -- calculate rate
714 	    p_rates_table := get_rates_from_curves(p_rate_types,
715 		p_curve_codes,p_base_currencies,p_contra_currencies,
716 		p_quote_bases,p_interp_methods,p_data_sides,
717 		p_day_count_bases,p_interest_quote,p_currency_quote,
718 		p_spot_date,p_forward_date);
719 	   -- default curves section
720 	   p_base_curve := p_curve_codes(1);
721 	   IF (g_proc_level>=g_debug_level) THEN
722 	      xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted base curve', p_base_curve);
723 	   END IF;
724 	   p_base_interpolation := p_interp_methods(1);
725 	else
726 	-- curve section not null, use curve
727 	    p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_base_curve);
728 	    p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_base_interpolation);
729 	    p_rates_table := get_rates_from_curves(p_rate_types,
730 		p_curve_codes,p_base_currencies,p_contra_currencies,
731 		p_quote_bases,p_interp_methods,p_data_sides,
732 		p_day_count_bases,p_interest_quote,p_currency_quote,
733 		p_spot_date,p_forward_date);
734 	end if;
735 	p_base_int_rate_ask := p_rates_table(1);
736 	IF (g_proc_level>=g_debug_level) THEN
737 	   xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted base ask rate',p_base_int_rate_ask);
738 	END IF;
739      end if;
740      if (p_contra_int_rate_bid IS null) then
741 	p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
742 	p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_contra_ccy);
743  	p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
744 	p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_contra_day_count);
745 	-- if curve section is null, go to defaults
746 	if (p_contra_curve IS null) then
747 	    p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
748 	    p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
749 	    p_curve_codes := get_curves_from_base(p_curve_types,
750 					      p_base_currencies,
751 					      p_contra_currencies);
752 	    -- calculate rate
753 	    p_rates_table := get_rates_from_curves(p_rate_types,
754 		p_curve_codes,p_base_currencies,p_contra_currencies,
755 		p_quote_bases,p_interp_methods,p_data_sides,
756 		p_day_count_bases,p_interest_quote,p_currency_quote,
757 		p_spot_date,p_forward_date);
758 	   -- default curves section
759 	   p_contra_curve := p_curve_codes(1);
760 	   IF (g_proc_level>=g_debug_level) THEN
761 	      xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted contra curve', p_contra_curve);
762 	   END IF;
763 	   p_contra_interpolation := p_interp_methods(1);
764 	else
765 	-- curve section not null, use curve
766 	    p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_contra_curve);
767 	    p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_contra_interpolation);
768 	    p_rates_table := get_rates_from_curves(p_rate_types,
769 		p_curve_codes,p_base_currencies,p_contra_currencies,
770 		p_quote_bases,p_interp_methods,p_data_sides,
771 		p_day_count_bases,p_interest_quote,p_currency_quote,
772 		p_spot_date,p_forward_date);
773 	end if;
774 	p_contra_int_rate_bid := p_rates_table(1);
775 	IF (g_proc_level>=g_debug_level) THEN
776 	   xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted contra bid rate',p_contra_int_rate_bid);
777 	END IF;
778      end if;
779      if (p_contra_int_rate_ask IS null) then
780 	p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
781 	p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_contra_ccy);
782  	p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
783 	p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_contra_day_count);
784 	-- if curve section is null, go to defaults
785 	if (p_contra_curve IS null) then
786 	    p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
787 	    p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
788 	    p_curve_codes := get_curves_from_base(p_curve_types,
789 					      p_base_currencies,
790 					      p_contra_currencies);
791 	    -- calculate rate
792 	    p_rates_table := get_rates_from_curves(p_rate_types,
793 		p_curve_codes,p_base_currencies,p_contra_currencies,
794 		p_quote_bases,p_interp_methods,p_data_sides,
795 		p_day_count_bases,p_interest_quote,p_currency_quote,
796 		p_spot_date,p_forward_date);
797 	   -- default curves section
798 	   p_contra_curve := p_curve_codes(1);
799 	   IF (g_proc_level>=g_debug_level) THEN
800 	      xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted contra curve', p_contra_curve);
801 	   END IF;
802 	   p_contra_interpolation := p_interp_methods(1);
803 	else
804 	-- curve section not null, use curve
805 	    p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_contra_curve);
806 	    p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_contra_interpolation);
810 		p_day_count_bases,p_interest_quote,p_currency_quote,
807 	    p_rates_table := get_rates_from_curves(p_rate_types,
808 		p_curve_codes,p_base_currencies,p_contra_currencies,
809 		p_quote_bases,p_interp_methods,p_data_sides,
811 		p_spot_date,p_forward_date);
812 	end if;
813 	p_contra_int_rate_ask := p_rates_table(1);
814 	IF (g_proc_level>=g_debug_level) THEN
815 	   xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted contra ask rate',p_contra_int_rate_ask);
816 	END IF;
817      end if;
818      if (p_neither_usd) then
819 	 if (p_usd_int_rate_bid IS null) then
820 		p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
821 		p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE('USD');
822  		p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
823 		p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_usd_day_count);
824 		-- if curve section is null, go to defaults
825 		if (p_usd_curve IS null) then
826 	    	   p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
827 	    	   p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
828 	    	   p_curve_codes := get_curves_from_base(p_curve_types,
829 					      p_base_currencies,
830 					      p_contra_currencies);
831 	    	   -- calculate rate
832 	    	   p_rates_table := get_rates_from_curves(p_rate_types,
833 			p_curve_codes,p_base_currencies,p_contra_currencies,
834 			p_quote_bases,p_interp_methods,p_data_sides,
835 			p_day_count_bases,p_interest_quote,p_currency_quote,
836 			p_spot_date,p_forward_date);
837 	   	   -- default curves section
838 	   	   p_usd_curve := p_curve_codes(1);
839 	   	   IF (g_proc_level>=g_debug_level) THEN
840 	   	      xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted usd curve', p_usd_curve);
841 	   	   END IF;
842 	   	   p_usd_interpolation := p_interp_methods(1);
843 		else
844 		-- curve section not null, use curve
845 	    	   p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_usd_curve);
846 	    	   p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_usd_interpolation);
847 	    	   p_rates_table := get_rates_from_curves(p_rate_types,
848 		   	p_curve_codes,p_base_currencies,p_contra_currencies,
849 		   	p_quote_bases,p_interp_methods,p_data_sides,
850 			p_day_count_bases,p_interest_quote,p_currency_quote,
851 			p_spot_date,p_forward_date);
852 		end if;
853 		p_usd_int_rate_bid := p_rates_table(1);
854 		IF (g_proc_level>=g_debug_level) THEN
855 		   xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted usd bid rate',p_usd_int_rate_bid);
856 		END IF;
857      	 end if;
858          if (p_usd_int_rate_ask IS null) then
859 		p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
860 		p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE('USD');
861  		p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
862 		p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_usd_day_count);
863 		-- if curve section is null, go to defaults
864 		if (p_usd_curve IS null) then
865 	    	   p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
866 	    	   p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
867 	    	   p_curve_codes := get_curves_from_base(p_curve_types,
868 					      p_base_currencies,
869 					      p_contra_currencies);
870 	    	   -- calculate rate
871 	    	   p_rates_table := get_rates_from_curves(p_rate_types,
872 			p_curve_codes,p_base_currencies,p_contra_currencies,
873 			p_quote_bases,p_interp_methods,p_data_sides,
874 			p_day_count_bases,p_interest_quote,p_currency_quote,
875 			p_spot_date,p_forward_date);
876 	   	   -- default curves section
877 	   	   p_usd_curve := p_curve_codes(1);
878 	   	   IF (g_proc_level>=g_debug_level) THEN
879 	   	      xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted usd curve',p_usd_curve);
880 	   	   END IF;
881    		p_usd_interpolation := p_interp_methods(1);
882 		else
883 		-- curve section not null, use curve
884 	    	   p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_usd_curve);
885 	    	   p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_usd_interpolation);
886 	    	   p_rates_table := get_rates_from_curves(p_rate_types,
887 		   	p_curve_codes,p_base_currencies,p_contra_currencies,
888 		   	p_quote_bases,p_interp_methods,p_data_sides,
889 			p_day_count_bases,p_interest_quote,p_currency_quote,
890 			p_spot_date,p_forward_date);
891 		end if;
892 		p_usd_int_rate_ask := p_rates_table(1);
893 		IF (g_proc_level>=g_debug_level) THEN
894 		   xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted USD ask rate',p_usd_int_rate_ask);
895 		END IF;
896      	end if;
897      else
898 	p_usd_int_rate_bid := null;
899 	p_usd_int_rate_ask := null;
900 	p_usd_day_count := null;
901      end if;
902   IF (g_proc_level>=g_debug_level) THEN
903      xtr_risk_debug_pkg.dpop('fx_calculator: ' || 'Calculation Based On Rates');
904   END IF;
905   END IF;
906 
907  -- ***END OF DEFAULTING SECTION ***--
908  -- ***RESULTS ***--
909  -- now on to calculating results
910    	XTR_CALC_P.calc_days_run_c(p_spot_date, p_forward_date,
911 		p_usd_day_count, null, p_day_count_usd, p_year_basis_usd);
912     	XTR_CALC_P.calc_days_run_c(p_spot_date, p_forward_date,
913 		p_base_day_count, null, p_day_count_base, p_year_basis_base);
914      	XTR_CALC_P.calc_days_run_c(p_spot_date, p_forward_date,
915 		p_contra_day_count, null, p_day_count_contra,
916 		p_year_basis_contra);
917 
918 	if (NOT p_neither_usd) then
919 		if (p_base_ccy = 'USD') then
920 			p_base_spot_bid := 1;
921 			p_base_spot_ask := 1;
922 			p_usd_int_rate_bid := p_base_int_rate_bid;
923 			p_usd_int_rate_ask := p_base_int_rate_ask;
927 			p_contra_spot_bid := 1;
924 			p_day_count_usd := p_day_count_base;
925 			p_year_basis_usd := p_year_basis_base;
926 		elsif (p_contra_ccy = 'USD') then
928 			p_contra_spot_ask := 1;
929 			p_usd_int_rate_bid := p_contra_int_rate_bid;
930 			p_usd_int_rate_ask := p_contra_int_rate_ask;
931 			p_day_count_usd := p_day_count_contra;
932 			p_year_basis_usd := p_year_basis_contra;
933 		end if;
934 	end if;
935 
936    	--cross spot rate
937    	p_spot_rates.extend;
938    	p_spot_rates.extend;
939    	p_spot_rates := xtr_fx_formulas.fx_spot_rate_cv(
940 		p_CURRENCY_CONTRA	  => p_contra_ccy,
941 		p_CURRENCY_BASE		  => p_base_ccy,
942 		p_RATE_CONTRA_BID	  => p_contra_spot_bid,
943 		p_RATE_CONTRA_ASK	  => p_contra_spot_ask,
944 		p_RATE_BASE_BID		  => p_base_spot_bid,
945 		p_RATE_BASE_ASK		  => p_base_spot_ask,
946 		p_QUOTATION_BASIS_CONTRA  => p_contra_quote_usd,
947 		p_QUOTATION_BASIS_BASE	  => p_base_quote_usd);
948    	p_res_spot_bid := p_spot_rates(1);
949    	p_res_spot_ask := p_spot_rates(2);
950 
951 
952      if (p_neither_usd) then
953    	-- forward rates
954    	p_forward_rates.extend;
955    	p_forward_rates.extend;
956      	-- USD/Base Ccy or Base Ccy/USD
957      	if (p_base_quote_usd = 'C') then
958 	   -- USD/Base Ccy
959            p_forward_rates := xtr_fx_formulas.fx_forward_rate_cv(
960 		p_SPOT_RATE_BASE_BID   => null,
961 		p_SPOT_RATE_BASE_ASK   => null,
962 		p_SPOT_RATE_CONTRA_BID => p_base_spot_bid,
963 		p_SPOT_RATE_CONTRA_ASK => p_base_spot_ask,
964 		p_BASE_CURR_INT_RATE_BID   => null,
965 		p_BASE_CURR_INT_RATE_ASK   => null,
966 		p_CONTRA_CURR_INT_RATE_BID => p_base_int_rate_bid,
967 		p_CONTRA_CURR_INT_RATE_ASK => p_base_int_rate_ask,
968 		p_USD_CURR_INT_RATE_BID    => p_usd_int_rate_bid,
969 		p_USD_CURR_INT_RATE_ASK    => p_usd_int_rate_ask,
970 		p_DAY_COUNT_BASE	   => null,
971 		p_DAY_COUNT_CONTRA	   => p_day_count_base,
972 		p_DAY_COUNT_USD		   => p_day_count_usd,
973 		p_ANNUAL_BASIS_BASE	   => null,
974 		p_ANNUAL_BASIS_CONTRA	   => p_year_basis_base,
975 		p_ANNUAL_BASIS_USD	   => p_year_basis_usd,
976 		p_CURRENCY_BASE		   => 'USD',
977 		p_CURRENCY_CONTRA	   => p_base_ccy,
978 		p_QUOTATION_BASIS_BASE	   => null,
979 		p_QUOTATION_BASIS_CONTRA   => p_base_quote_usd);
980 	   p_res_first_base_ccy := 'USD';
981 	   p_res_first_contra_ccy := p_base_ccy;
982      	else
983 	  -- Base Ccy/USD
984           p_forward_rates := xtr_fx_formulas.fx_forward_rate_cv(
985 		p_SPOT_RATE_BASE_BID	   => p_base_spot_bid,
986 		p_SPOT_RATE_BASE_ASK	   => p_base_spot_ask,
987 		p_SPOT_RATE_CONTRA_BID 	   => null,
988 		p_SPOT_RATE_CONTRA_ASK 	   => null,
989 		p_BASE_CURR_INT_RATE_BID   => p_base_int_rate_bid,
990 		p_BASE_CURR_INT_RATE_ASK   => p_base_int_rate_ask,
991 		p_CONTRA_CURR_INT_RATE_BID => null,
992 		p_CONTRA_CURR_INT_RATE_ASK => null,
993 		p_USD_CURR_INT_RATE_BID    => p_usd_int_rate_bid,
994 		p_USD_CURR_INT_RATE_ASK    => p_usd_int_rate_ask,
995 		p_DAY_COUNT_BASE	   => p_day_count_base,
996 		p_DAY_COUNT_CONTRA	   => null,
997 		p_DAY_COUNT_USD		   => p_day_count_usd,
998 		p_ANNUAL_BASIS_BASE	   => p_year_basis_base,
999 		p_ANNUAL_BASIS_CONTRA	   => null,
1000 		p_ANNUAL_BASIS_USD	   => p_year_basis_usd,
1001 		p_CURRENCY_BASE	   	   => p_base_ccy,
1002 		p_CURRENCY_CONTRA	   => 'USD',
1003 		p_QUOTATION_BASIS_BASE     => p_base_quote_usd,
1004 		p_QUOTATION_BASIS_CONTRA   => null);
1005 	   p_res_first_base_ccy := p_base_ccy;
1006 	   p_res_first_contra_ccy := 'USD';
1007         end if;
1008      	p_res_first_rate_bid := p_forward_rates(1);
1009      	p_res_first_rate_ask := p_forward_rates(2);
1010      	p_res_first_points_bid := p_res_first_rate_bid - p_base_spot_bid;
1011      	p_res_first_points_ask := p_res_first_rate_ask - p_base_spot_ask;
1012 
1013     	-- Contra Ccy/USD or USD/Contra Ccy
1014 
1015      	if (p_contra_quote_usd = 'B') then
1016 	    -- Contra Ccy/USD
1017      	    p_forward_rates := xtr_fx_formulas.fx_forward_rate_cv(
1018 		p_SPOT_RATE_BASE_BID	   => p_contra_spot_bid,
1019 		p_SPOT_RATE_BASE_ASK	   => p_contra_spot_ask,
1020 		p_SPOT_RATE_CONTRA_BID 	   => null,
1021 		p_SPOT_RATE_CONTRA_ASK 	   => null,
1022 		p_BASE_CURR_INT_RATE_BID   => p_contra_int_rate_bid,
1023 		p_BASE_CURR_INT_RATE_ASK   => p_contra_int_rate_ask,
1024 		p_CONTRA_CURR_INT_RATE_BID => null,
1025 		p_CONTRA_CURR_INT_RATE_ASK => null,
1026 		p_USD_CURR_INT_RATE_BID    => p_usd_int_rate_bid,
1027 		p_USD_CURR_INT_RATE_ASK    => p_usd_int_rate_ask,
1028 		p_DAY_COUNT_BASE	   => p_day_count_contra,
1029 		p_DAY_COUNT_CONTRA	   => null,
1030 		p_DAY_COUNT_USD		   => p_day_count_usd,
1031 		p_ANNUAL_BASIS_BASE	   => p_year_basis_contra,
1032 		p_ANNUAL_BASIS_CONTRA	   => null,
1033 		p_ANNUAL_BASIS_USD	   => p_year_basis_usd,
1034 		p_CURRENCY_BASE	   	   => p_contra_ccy,
1035 		p_CURRENCY_CONTRA	   => 'USD',
1036 		p_QUOTATION_BASIS_BASE     => p_contra_quote_usd,
1037 		p_QUOTATION_BASIS_CONTRA   => null);
1038 	   p_res_sec_base_ccy := p_contra_ccy;
1039 	   p_res_sec_contra_ccy := 'USD';
1040        else
1041 	   -- USD/Contra Ccy
1042            p_forward_rates := xtr_fx_formulas.fx_forward_rate_cv(
1043 		p_SPOT_RATE_BASE_BID   => null,
1044 		p_SPOT_RATE_BASE_ASK   => null,
1045 		p_SPOT_RATE_CONTRA_BID => p_contra_spot_bid,
1046 		p_SPOT_RATE_CONTRA_ASK => p_contra_spot_ask,
1047 		p_BASE_CURR_INT_RATE_BID   => null,
1048 		p_BASE_CURR_INT_RATE_ASK   => null,
1052 		p_USD_CURR_INT_RATE_ASK    => p_usd_int_rate_ask,
1049 		p_CONTRA_CURR_INT_RATE_BID => p_contra_int_rate_bid,
1050 		p_CONTRA_CURR_INT_RATE_ASK => p_contra_int_rate_ask,
1051 		p_USD_CURR_INT_RATE_BID    => p_usd_int_rate_bid,
1053 		p_DAY_COUNT_BASE	   => null,
1054 		p_DAY_COUNT_CONTRA	   => p_day_count_contra,
1055 		p_DAY_COUNT_USD		   => p_day_count_usd,
1056 		p_ANNUAL_BASIS_BASE	   => null,
1057 		p_ANNUAL_BASIS_CONTRA	   => p_year_basis_contra,
1058 		p_ANNUAL_BASIS_USD	   => p_year_basis_usd,
1059 		p_CURRENCY_BASE		   => 'USD',
1060 		p_CURRENCY_CONTRA	   => p_contra_ccy,
1061 		p_QUOTATION_BASIS_BASE	   => null,
1062 		p_QUOTATION_BASIS_CONTRA   => p_contra_quote_usd);
1063 	  p_res_sec_base_ccy := 'USD';
1064 	  p_res_sec_contra_ccy := p_contra_ccy;
1065        end if;
1066        p_res_sec_rate_bid := p_forward_rates(1);
1067        p_res_sec_rate_ask := p_forward_rates(2);
1068        p_res_sec_points_bid := p_res_sec_rate_bid - p_contra_spot_bid;
1069        p_res_sec_points_ask := p_res_sec_rate_ask - p_contra_spot_ask;
1070 
1071        -- Base Ccy/Contra Ccy forward rate
1072        p_forward_rates := xtr_fx_formulas.fx_spot_rate_cv(
1073 		p_CURRENCY_CONTRA	   => p_contra_ccy,
1074 		p_CURRENCY_BASE		   => p_base_ccy,
1075 		p_RATE_CONTRA_BID	   => p_res_sec_rate_bid,
1076 		p_RATE_CONTRA_ASK 	   => p_res_sec_rate_ask,
1077 		p_RATE_BASE_BID		   => p_res_first_rate_bid,
1078 		p_RATE_BASE_ASK		   => p_res_first_rate_ask,
1079 		p_QUOTATION_BASIS_CONTRA   => p_contra_quote_usd,
1080 		p_QUOTATION_BASIS_BASE     => p_base_quote_usd);
1081        p_res_fwd_rate_bid := p_forward_rates(1);
1082        p_res_fwd_rate_ask := p_forward_rates(2);
1083        p_res_fwd_points_bid := p_res_fwd_rate_bid - p_res_spot_bid;
1084        p_res_fwd_points_ask := p_res_fwd_rate_ask - p_res_spot_ask;
1085    else
1086 	-- one currency is USD
1087 	p_forward_rates.extend;
1088 	p_forward_rates.extend;
1089 
1090 	p_forward_rates := xtr_fx_formulas.fx_forward_rate_cv(
1091 		p_SPOT_RATE_BASE_BID	   => p_base_spot_bid,
1092 		p_SPOT_RATE_BASE_ASK	   => p_base_spot_ask,
1093 		p_SPOT_RATE_CONTRA_BID 	   => p_contra_spot_bid,
1094 		p_SPOT_RATE_CONTRA_ASK 	   => p_contra_spot_ask,
1095 		p_BASE_CURR_INT_RATE_BID   => p_base_int_rate_bid,
1096 		p_BASE_CURR_INT_RATE_ASK   => p_base_int_rate_ask,
1097 		p_CONTRA_CURR_INT_RATE_BID => p_contra_int_rate_bid,
1098 		p_CONTRA_CURR_INT_RATE_ASK => p_contra_int_rate_ask,
1099 		p_USD_CURR_INT_RATE_BID    => p_usd_int_rate_bid,
1100 		p_USD_CURR_INT_RATE_ASK    => p_usd_int_rate_ask,
1101 		p_DAY_COUNT_BASE	   => p_day_count_base,
1102 		p_DAY_COUNT_CONTRA	   => p_day_count_contra,
1103 		p_DAY_COUNT_USD		   => p_day_count_usd,
1104 		p_ANNUAL_BASIS_BASE	   => p_year_basis_base,
1105 		p_ANNUAL_BASIS_CONTRA	   => p_year_basis_contra,
1106 		p_ANNUAL_BASIS_USD	   => p_year_basis_usd,
1107 		p_CURRENCY_BASE	   	   => p_base_ccy,
1108 		p_CURRENCY_CONTRA	   => p_contra_ccy,
1109 		p_QUOTATION_BASIS_BASE     => p_base_quote_usd,
1110 		p_QUOTATION_BASIS_CONTRA   => p_contra_quote_usd);
1111 	p_res_fwd_rate_bid := p_forward_rates(1);
1112 	p_res_fwd_rate_ask := p_forward_rates(2);
1113 	p_res_fwd_points_bid := p_res_fwd_rate_bid - p_res_spot_bid;
1114 	p_res_fwd_points_ask := p_res_fwd_rate_ask - p_res_spot_ask;
1115    end if;
1116 
1117 
1118  --- Sensitivities
1119    -- delta spot
1120    p_int_rates := xtr_md_num_table(p_contra_int_rate_bid,p_contra_int_rate_ask,
1121 				   p_base_int_rate_bid, p_base_int_rate_ask,
1122 				   p_usd_int_rate_bid, p_usd_int_rate_ask);
1123    p_day_counts := SYSTEM.QRM_VARCHAR_TABLE(p_contra_day_count, p_contra_day_count,
1124 				    p_base_day_count, p_base_day_count,
1125 				    p_usd_day_count, p_usd_day_count);
1126    IF (g_proc_level>=g_debug_level) THEN
1127       xtr_risk_debug_pkg.dpush('fx_calculator: ' || 'Calculating Delta Spot');
1128    END IF;
1129    for i IN 1..p_int_rates.count LOOP
1130         df_in_rec.p_indicator := 'T';
1131  	df_in_rec.p_rate := p_int_rates(i);
1132 	df_in_rec.p_spot_date := p_spot_date;
1133 	df_in_rec.p_future_date := p_forward_date;
1134 	df_in_rec.p_day_count_basis := p_day_counts(i);
1135 	xtr_rate_conversion.discount_factor_conv(df_in_rec, df_out_rec);
1136 	p_dis_factors.extend;
1137 	p_dis_factors(i) := df_out_rec.p_result;
1138 	IF (g_proc_level>=g_debug_level) THEN
1139 	   xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'int rate', p_int_rates(i));
1140 	   xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'day count', p_day_counts(i));
1141 	   xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'disc factor', p_dis_factors(i));
1142 	END IF;
1143    end LOOP;
1144    IF (g_proc_level>=g_debug_level) THEN
1145       xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'contra curr', p_contra_ccy);
1146       xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'base curr', p_base_ccy);
1147    END IF;
1148    p_delta := qrm_fx_formulas.fx_forward_delta_spot(p_contra_ccy, p_base_ccy,
1149 					p_dis_factors(1), p_dis_factors(2),
1150 					p_dis_factors(3), p_dis_factors(4),
1151 					p_dis_factors(5), p_dis_factors(6));
1152    p_delta_spot_bid := p_delta(1);
1153    p_delta_spot_ask := p_delta(2);
1154    IF (g_proc_level>=g_debug_level) THEN
1155       xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'delta spot bid', p_delta_spot_bid);
1156       xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'delta spot ask', p_delta_spot_ask);
1157       xtr_risk_debug_pkg.dpop('fx_calculator: ' || 'Calculating Delta Spot');
1158    END IF;
1159 
1160    -- fx forward rho
1161    IF (g_proc_level>=g_debug_level) THEN
1165      	p_SPOT_RATE_BASE_BID 		=> p_base_spot_bid,
1162       xtr_risk_debug_pkg.dpush('fx_calculator: ' || 'Calculating FX Rho');
1163    END IF;
1164    p_rho := qrm_fx_formulas.fx_forward_rho(p_OUT => 'D',
1166  	p_SPOT_RATE_BASE_ASK 		=> p_base_spot_ask,
1167 	p_SPOT_RATE_CONTRA_BID		=> p_contra_spot_bid,
1168 	p_SPOT_RATE_CONTRA_ASK		=> p_contra_spot_ask,
1169 	p_BASE_CURR_INT_RATE_BID	=> p_base_int_rate_bid,
1170 	p_BASE_CURR_INT_RATE_ASK	=> p_base_int_rate_ask,
1171 	p_CONTRA_CURR_INT_RATE_BID	=> p_contra_int_rate_bid,
1172 	p_CONTRA_CURR_INT_RATE_ASK	=> p_contra_int_rate_ask,
1173 	p_USD_CURR_INT_RATE_BID		=> p_usd_int_rate_bid,
1174 	p_USD_CURR_INT_RATE_ASK		=> p_usd_int_rate_ask,
1175 	p_DAY_COUNT_BASE		=> p_day_count_base,
1176 	p_DAY_COUNT_CONTRA		=> p_day_count_contra,
1177 	p_DAY_COUNT_USD			=> p_day_count_usd,
1178 	p_ANNUAL_BASIS_BASE		=> p_year_basis_base,
1179 	p_ANNUAL_BASIS_CONTRA		=> p_year_basis_contra,
1180 	p_ANNUAL_BASIS_USD		=> p_year_basis_usd,
1181 	p_CURRENCY_BASE			=> p_base_ccy,
1182 	p_CURRENCY_CONTRA		=> p_contra_ccy,
1183 	p_QUOTATION_BASIS_BASE		=> p_base_quote_usd,
1184 	p_QUOTATION_BASIS_CONTRA	=> p_contra_quote_usd);
1185    p_rho_base_bid := p_rho(1);
1186    p_rho_base_ask := p_rho(2);
1187    p_rho_contra_bid := p_rho(3);
1188    p_rho_contra_ask := p_rho(4);
1189    IF (g_proc_level>=g_debug_level) THEN
1190       xtr_risk_debug_pkg.dpop('fx_calculator: ' || 'Calculating FX Rho');
1191    END IF;
1192 
1193 
1194    p_varchar_args(1) := p_indicator;
1195    p_varchar_args(2) := p_base_ccy;
1196    p_varchar_args(3) := p_contra_ccy;
1197    p_varchar_args(4) := p_currency_quote;
1198    p_varchar_args(5) := p_interest_quote;
1199    p_varchar_args(6) := p_base_curve;
1200    p_varchar_args(7) := p_contra_curve;
1201    p_varchar_args(8) := p_usd_curve;
1202    p_varchar_args(9) := p_base_interpolation;
1203    p_varchar_args(10) := p_contra_interpolation;
1204    p_varchar_args(11) := p_usd_interpolation;
1205    p_varchar_args(12) := p_base_quote_usd;
1206    p_varchar_args(13) := p_contra_quote_usd;
1207    p_varchar_args(14) := p_base_day_count;
1208    p_varchar_args(15) := p_contra_day_count;
1209    p_varchar_args(16) := p_usd_day_count;
1210    p_varchar_args(17) := p_res_first_base_ccy;
1211    p_varchar_args(18) := p_res_first_contra_ccy;
1212    p_varchar_args(19) := p_res_sec_base_ccy;
1213    p_varchar_args(20) := p_res_sec_contra_ccy;
1214 
1215    p_num_args(1) := p_base_ccy_amt;
1216    p_num_args(2) := p_base_spot_bid;
1217    p_num_args(3) := p_base_spot_ask;
1218    p_num_args(4) := p_contra_spot_bid;
1219    p_num_args(5) := p_contra_spot_ask;
1220    p_num_args(6) := p_base_int_rate_bid;
1221    p_num_args(7) := p_base_int_rate_ask;
1222    p_num_args(8) := p_contra_int_rate_bid;
1223    p_num_args(9) := p_contra_int_rate_ask;
1224    p_num_args(10) := p_usd_int_rate_bid;
1225    p_num_args(11) := p_usd_int_rate_ask;
1226    p_num_args(12) := p_res_spot_bid;
1227    p_num_args(13) := p_res_spot_ask;
1228    p_num_args(14) := p_res_first_rate_bid;
1229    p_num_args(15) := p_res_first_rate_ask;
1230    p_num_args(16) := p_res_first_points_bid;
1231    p_num_args(17) := p_res_first_points_ask;
1232    p_num_args(18) := p_res_sec_rate_bid;
1233    p_num_args(19) := p_res_sec_rate_ask;
1234    p_num_args(20) := p_res_sec_points_bid;
1235    p_num_args(21) := p_res_sec_points_ask;
1236    p_num_args(22) := p_res_fwd_rate_bid;
1237    p_num_args(23) := p_res_fwd_rate_ask;
1238    p_num_args(24) := p_res_fwd_points_bid;
1239    p_num_args(25) := p_res_fwd_points_ask;
1240    p_num_args(26) := p_delta_spot_bid;
1241    p_num_args(27) := p_delta_spot_ask;
1242    p_num_args(28) := p_rho_base_bid;
1243    p_num_args(29) := p_rho_base_ask;
1244    p_num_args(30) := p_rho_contra_bid;
1245    p_num_args(31) := p_rho_contra_ask;
1246 
1247 
1248    IF (g_proc_level>=g_debug_level) THEN--bug3236479
1249       xtr_risk_debug_pkg.dpop(null,'QRM_CALCULATORS_P.fx_calculator');
1250    END IF;
1251 EXCEPTION
1252   WHEN  e_no_int_rates THEN
1253     fnd_msg_pub.add;
1254     IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
1255         	   xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_INT_RATES',
1256 		      'QRM_CALCULATORS_P.FX_CALCULATOR',G_ERROR_LEVEL);
1257     END IF;
1258   WHEN e_no_rate_curve THEN
1259     fnd_msg_pub.add;
1260     IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
1261         	   xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_RATE_CURVE',
1262 		      'QRM_CALCULATORS_P.FX_CALCULATOR',G_ERROR_LEVEL);
1263     END IF;
1264   WHEN e_no_spot_rates THEN
1265     fnd_msg_pub.add;
1266     IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
1267         	   xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_SPOT_RATES',
1268 		      'QRM_CALCULATORS_P.FX_CALCULATOR',G_ERROR_LEVEL);
1269     END IF;
1270 
1271 END fx_calculator;
1272 
1273 
1274 
1275 FUNCTION get_curves_from_base (p_curve_types SYSTEM.QRM_VARCHAR_TABLE,
1276 			       p_base_currencies SYSTEM.QRM_VARCHAR_TABLE,
1277 			       p_contra_currencies SYSTEM.QRM_VARCHAR_TABLE)
1278 	RETURN SYSTEM.QRM_VARCHAR_TABLE IS
1279 
1280 
1281 	-- ** main cursors for defaulting ** --
1282 
1283 	-- for YIELD and IRVOL curves
1284 	CURSOR get_default_curve(p_type VARCHAR2,p_base_ccy VARCHAR2) IS
1285 	  SELECT curve_code
1286 	  FROM xtr_rm_md_curves
1287 	  WHERE type=p_type and authorized_yn='Y' and ccy=p_base_ccy
1288 	  ORDER BY creation_date;
1289 
1290 	-- for FXVOL curves
1294 	FROM xtr_rm_md_curves
1291 	CURSOR get_default_curve_fx(p_type VARCHAR2,p_base_ccy VARCHAR2,
1292 				     p_contra_ccy VARCHAR2) IS
1293 	SELECT curve_code
1295 	WHERE type=p_type and authorized_yn='Y' and
1296 		(ccy=p_base_ccy and contra_ccy=p_contra_ccy) or
1297 		(ccy=p_contra_ccy and contra_ccy=p_base_ccy)
1298 	ORDER BY creation_date;
1299 
1300 	v_curve_code varchar2(20);
1301 	v_curve_codes_table SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
1302 
1303 
1304 BEGIN
1305     IF (g_proc_level>=g_debug_level) THEN
1306        xtr_risk_debug_pkg.dpush(null,'QRM_CALCULATORS_P.get_curves_from_base');
1307     END IF;
1308     if ((p_curve_types.count <> p_base_currencies.count) OR
1309 	((p_contra_currencies IS NOT null) AND
1310  	 ((p_base_currencies.count <> p_contra_currencies.count) OR
1311 	  (p_curve_types.count <> p_contra_currencies.count)))) then
1312 	RAISE_APPLICATION_ERROR
1313                        (-20001,'input tables must be the same size.');
1314     else
1315 	v_curve_codes_table.extend(p_curve_types.count);
1316         FOR i IN 1..p_curve_types.count LOOP
1317 	    IF (g_proc_level>=g_debug_level) THEN
1318 	       xtr_risk_debug_pkg.dlog('get_curves_from_base: ' || 'currency is', p_base_currencies(i));
1319 	    END IF;
1320             if (p_curve_types(i) = 'FXVOL') then
1321 	        OPEN get_default_curve_fx(p_curve_types(i),
1322 					   p_base_currencies(i),
1323 					   p_contra_currencies(i));
1324 	        FETCH get_default_curve_fx INTO v_curve_code;
1325 	        if (get_default_curve_fx%notfound) then
1326     		  FND_MESSAGE.SET_NAME('QRM','QRM_CALC_NO_DEFAULT_CURVE_ERR');
1327     		  FND_MESSAGE.SET_TOKEN('CCY',p_base_currencies(i)||'/'||
1328 					      p_contra_currencies(i));
1329 			raise e_no_rate_curve;
1330 	      	else
1331 			v_curve_codes_table(i) := v_curve_code;
1332 		end if;
1333 		IF (g_proc_level>=g_debug_level) THEN
1334 		   xtr_risk_debug_pkg.dlog('get_curves_from_base: ' || 'found fxvol curve', v_curve_code);
1335 		END IF;
1336 	        CLOSE get_default_curve_fx;
1337             elsif ((p_curve_types(i) = 'YIELD') OR
1338 	           (p_curve_types(i) = 'IRVOL')) then
1339 	        OPEN get_default_curve(p_curve_types(i),p_base_currencies(i));
1340 	        FETCH get_default_curve INTO v_curve_code;
1341 	        if (get_default_curve%notfound) then
1342     		  FND_MESSAGE.SET_NAME('QRM','QRM_CALC_NO_DEFAULT_CURVE_ERR');
1343     		  FND_MESSAGE.SET_TOKEN('CCY',p_base_currencies(i));
1344 			raise e_no_rate_curve;
1345 		else
1346 			v_curve_codes_table(i) := v_curve_code;
1347 	        end if;
1348 		IF (g_proc_level>=g_debug_level) THEN
1349 		   xtr_risk_debug_pkg.dlog('get_curves_from_base: ' || 'found yield/irvol curve', v_curve_code);
1350 		END IF;
1351 	        CLOSE get_default_curve;
1352             end if;
1353   	END LOOP;
1354 	IF (g_proc_level>=g_debug_level) THEN
1355 	   xtr_risk_debug_pkg.dpop(null,'QRM_CALCULATORS_P.get_curves_from_base');
1356 	END IF;
1357         return v_curve_codes_table;
1358     end if;
1359 END get_curves_from_base;
1360 
1361 
1362 
1363 -- also extracts spot rates
1364 FUNCTION get_rates_from_curves 	(p_rate_types SYSTEM.QRM_VARCHAR_TABLE,
1365 				 p_curve_codes SYSTEM.QRM_VARCHAR_TABLE,
1366 				 p_base_currencies SYSTEM.QRM_VARCHAR_TABLE,
1367 				 p_contra_currencies SYSTEM.QRM_VARCHAR_TABLE,
1368 				 p_quote_bases SYSTEM.QRM_VARCHAR_TABLE,
1369 				 p_interp_methods SYSTEM.QRM_VARCHAR_TABLE,
1370 				 p_data_sides SYSTEM.QRM_VARCHAR_TABLE,
1371 				 p_day_count_bases SYSTEM.QRM_VARCHAR_TABLE,
1372 				 p_interest_quote_basis VARCHAR2,
1373 				 p_currency_quote_basis VARCHAR2,
1374 				 p_spot_date DATE,
1375 				 p_future_date DATE)
1376 	RETURN xtr_md_num_table IS
1377 
1378 	v_rounding_factor number := 6;
1379 	v_table_size number := p_rate_types.count;
1380 	v_rate_type varchar2(1);
1381 
1382 	v_rates_table xtr_md_num_table := xtr_md_num_table();
1383 	v_sides_table SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
1384 
1385 	v_in_rec_type XTR_MARKET_DATA_P.md_from_curve_in_rec_type;
1386 	v_out_rec_type XTR_MARKET_DATA_P.md_from_curve_out_rec_type;
1387 
1388 	v_bid_rate_comm number;
1389 	v_ask_rate_comm number;
1390 	v_bid_rate_base number;
1391 	v_ask_rate_base number;
1392 	v_ccy varchar2(15);
1393 	v_curve varchar2(20);
1394 
1395 	-- Cursor for obtaining spot rates in base/commodity unit quotes
1396 	-- for non-USD currencies against USD
1397 	CURSOR get_fx_spot_rates(p_base_ccy VARCHAR2) IS
1398      	    SELECT usd_base_curr_bid_rate bid_rate_comm,
1399 		   usd_base_curr_offer_rate ask_rate_comm,
1400 		   1/usd_base_curr_offer_rate bid_rate_base,
1401 		   1/usd_base_curr_bid_rate ask_rate_base,
1402 		   currency
1403   	    FROM xtr_spot_rates
1404 	    WHERE (rate_date, currency) IN
1405 		(SELECT MAX(rate_date), currency
1406 		 FROM xtr_spot_rates
1407 		 WHERE currency IN (p_base_ccy)
1408 			AND currency <> 'USD'
1409 			AND trunc(rate_date) <= trunc(p_spot_date)
1410 		 GROUP BY currency);
1411 
1412 BEGIN
1413    IF (g_proc_level>=g_debug_level) THEN
1414       xtr_risk_debug_pkg.dpush(null,'QRM_CALCULATORS_P.get_rates_from_curves');
1415    END IF;
1416    IF  (((p_curve_codes IS NOT null) AND
1417          (p_curve_codes.count <> v_table_size)) OR
1418 	(p_rate_types.count <> v_table_size) OR
1419 	((p_base_currencies IS NOT null) AND
1420 	 (p_base_currencies.count <> v_table_size)) OR
1424 	 (p_quote_bases.count <> v_table_size)) OR
1421 	((p_contra_currencies IS NOT null) AND
1422 	 (p_contra_currencies.count <> v_table_size)) OR
1423 	((p_quote_bases IS NOT null) AND
1425 	((p_day_count_bases IS NOT null) AND
1426 	 (p_day_count_bases.count <> v_table_size)) OR
1427 	((p_interp_methods IS NOT null) AND
1428 	 (p_interp_methods.count <> v_table_size)) OR
1429 	((p_data_sides IS NOT null) AND
1430 	 (p_data_sides.count <> v_table_size))) THEN
1431 	RAISE_APPLICATION_ERROR
1432                        (-20001,'input tables must be the same size.');
1433     ELSE
1434     -- now fill up interest rates/volatilities according to curves
1435     -- and spot rates from database
1436 	v_rates_table.extend(p_rate_types.count);
1437         v_sides_table.extend(p_rate_types.count);
1438         FOR i IN 1..p_rate_types.count LOOP
1439 	    if (p_rate_types(i)='SPOT') then
1440 		IF (g_proc_level>=g_debug_level) THEN
1441 		   xtr_risk_debug_pkg.dpush('get_rates_from_curves: ' || 'calculating spot rate');
1442 		END IF;
1443 		-- it is spot taken by spot rate
1444 		-- then do spot rate extraction
1445 		IF (g_proc_level>=g_debug_level) THEN
1446 		   xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'base currency',p_base_currencies(i));
1447 		   xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'currency quote basis', p_currency_quote_basis);
1448 		   xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'quote basis against usd',p_quote_bases(i));
1449 		   xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'data side', p_data_sides(i));
1450 		END IF;
1451 		OPEN get_fx_spot_rates(p_base_currencies(i));
1452 		FETCH get_fx_spot_rates INTO v_bid_rate_comm, v_ask_rate_comm,
1453 					     v_bid_rate_base, v_ask_rate_base,
1454 					     v_ccy;
1455 		if (get_fx_spot_rates%found) then
1456 		---logic for interpreting market data side of Spot Rates---
1457 		    IF (g_proc_level>=g_debug_level) THEN
1458 		       xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'spot rates found',' ');
1459 		    END IF;
1460 		    if (p_currency_quote_basis = 'BID') then
1461 			if (p_quote_bases(i) = 'C') then
1462 			   v_rates_table(i) := round(v_bid_rate_comm,v_rounding_factor);
1463 			   IF (g_proc_level>=g_debug_level) THEN
1464 			      xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'commodity unit quote bid',v_bid_rate_comm);
1465 			   END IF;
1466 			elsif (p_quote_bases(i) = 'B') then
1467 			   v_rates_table(i) := round(v_bid_rate_base, v_rounding_factor);
1468 			   IF (g_proc_level>=g_debug_level) THEN
1469 			      xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'base unit quote bid',v_bid_rate_base);
1470 			   END IF;
1471 			end if;
1472 		    elsif (p_currency_quote_basis = 'ASK') then
1473 			if (p_quote_bases(i) = 'C') then
1474 			   v_rates_table(i) := round(v_ask_rate_comm, v_rounding_factor);
1475 			   IF (g_proc_level>=g_debug_level) THEN
1476 			      xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'commodity unit quote ask',v_ask_rate_comm);
1477 			   END IF;
1478 			elsif (p_quote_bases(i) = 'B') then
1479 			   v_rates_table(i) := round(v_ask_rate_base, v_rounding_factor);
1480 			   IF (g_proc_level>=g_debug_level) THEN
1481 			      xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'base unit quote ask',v_ask_rate_base);
1482 			   END IF;
1483 			end if;
1484 		    elsif (p_currency_quote_basis = 'MID') then
1485 			if (p_quote_bases(i) = 'C') then
1486 			   v_rates_table(i) := round((v_bid_rate_comm+v_ask_rate_comm)/2, v_rounding_factor);
1487 			elsif (p_quote_bases(i) = 'B') then
1488 			   v_rates_table(i) := round((v_bid_rate_base+v_ask_rate_base)/2, v_rounding_factor);
1489 		        end if;
1490 		    elsif (p_currency_quote_basis = 'BID/ASK') then
1491 			IF (g_proc_level>=g_debug_level) THEN
1492 			   xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'currency quote is bid/ask');
1493 			END IF;
1494 			if (p_quote_bases(i) = 'C') then
1495 			IF (g_proc_level>=g_debug_level) THEN
1496 			   xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'quote against usd is C');
1497 			END IF;
1498 			   if (p_data_sides(i) = 'BID') then
1499 			       v_rates_table(i) := round(v_bid_rate_comm, v_rounding_factor);
1500 			       IF (g_proc_level>=g_debug_level) THEN
1501 			          xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'BID/ASK: commodity unit quote bid', v_bid_rate_comm);
1502 			       END IF;
1503 			   elsif (p_data_sides(i) = 'ASK') then
1504 			       v_rates_table(i) := round(v_ask_rate_comm, v_rounding_factor);
1505 			       IF (g_proc_level>=g_debug_level) THEN
1506 			          xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'BID/ASK: commodity unit quote ask', v_ask_rate_comm);
1507 			       END IF;
1508 			   end if;
1509 			elsif (p_quote_bases(i) = 'B') then
1510 			IF (g_proc_level>=g_debug_level) THEN
1511 			   xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'quote against usd is B');
1512 			END IF;
1513 			   if (p_data_sides(i) = 'BID') then
1514 			       v_rates_table(i) := round(v_bid_rate_base, v_rounding_factor);
1515 			       IF (g_proc_level>=g_debug_level) THEN
1516 			          xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'BID/ASK: base unit quote bid', v_bid_rate_base);
1517 			       END IF;
1518 			   elsif (p_data_sides(i) = 'ASK') then
1519 			       v_rates_table(i) := round(v_ask_rate_base, v_rounding_factor);
1520 			       IF (g_proc_level>=g_debug_level) THEN
1521 			          xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'BID/ASK: base unit quote ask', v_bid_rate_base);
1522 			       END IF;
1526 		----------------------------------------------------------
1523 			   end if;
1524 			end if;
1525 		    end if;
1527 		else
1528 	    	    FND_MESSAGE.SET_NAME('QRM','QRM_CALC_NO_DEFAULT_SPOT_ERR');
1529     	    	    FND_MESSAGE.SET_TOKEN('CCY',p_base_currencies(1));
1530 		    raise e_no_spot_rates;
1531 		end if;
1532 		CLOSE get_fx_spot_rates;
1533 		IF (g_proc_level>=g_debug_level) THEN
1534 		   xtr_risk_debug_pkg.dpop('get_rates_from_curves: ' || 'calculating spot rates');
1535 		END IF;
1536 		-- not spot rate, then extract rate/vol from curve
1537 		-- get interest rates/ volatilities for each curve
1538 	   elsif ((p_rate_types(i)='YIELD') OR
1539 		  (p_rate_types(i)='IRVOL') OR
1540 		  (p_rate_types(i)='FXVOL')) then
1541 		IF (g_proc_level>=g_debug_level) THEN
1542 		   xtr_risk_debug_pkg.dpush('get_rates_from_curves: ' || 'calculating curve rates');
1543 		END IF;
1544 		-----logic for interpreting market data side of Int Rates----
1545 		if (p_interest_quote_basis = 'BID') then
1546 		   v_sides_table(i) := 'B';
1547 	  	elsif (p_interest_quote_basis = 'ASK') then
1548 		   v_sides_table(i) := 'A';
1549 		elsif (p_interest_quote_basis = 'MID') then
1550 		   v_sides_table(i) := 'M';
1551 		elsif (p_interest_quote_basis = 'BID/ASK') then
1552 		   if (p_data_sides(i) = 'BID') then
1553 			v_sides_table(i) := 'B';
1554 		   elsif (p_data_sides(i) = 'ASK') then
1555 			v_sides_table(i) := 'A';
1556 		   end if;
1557 		end if;
1558 		------------------------------------------------
1559 		IF (g_proc_level>=g_debug_level) THEN
1560 		   xtr_risk_debug_pkg.dpop('get_rates_from_curves: ' || 'calculating curve rates');
1561 		END IF;
1562 		v_in_rec_type.p_curve_code := p_curve_codes(i);
1563 		v_curve := p_curve_codes(i);
1564 		IF (g_proc_level>=g_debug_level) THEN
1565 		   xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'curve code',p_curve_codes(i));
1566 		END IF;
1567 		v_in_rec_type.p_source := 'C';
1568 		if (p_rate_types(i) = 'YIELD') then
1569 		   v_rate_type := 'Y';
1570 		elsif ((p_rate_types(i) = 'IRVOL')  OR
1571 		       (p_rate_types(i) = 'FXVOL')) then
1572 		   v_rate_type := 'V';
1573 		end if;
1574 		v_in_rec_type.p_indicator := v_rate_type;
1575 		IF (g_proc_level>=g_debug_level) THEN
1576 		   xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'indicator', v_rate_type);
1577 		END IF;
1578 		v_in_rec_type.p_spot_date := p_spot_date;
1579 		IF (g_proc_level>=g_debug_level) THEN
1580 		   xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'spot date', p_spot_date);
1581 		END IF;
1582 		v_in_rec_type.p_future_date := p_future_date;
1583 		IF (g_proc_level>=g_debug_level) THEN
1584 		   xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'future date', p_future_date);
1585 		END IF;
1586 		v_in_rec_type.p_day_count_basis_out := p_day_count_bases(i);
1587 		IF (g_proc_level>=g_debug_level) THEN
1588 		   xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'day count basis', p_day_count_bases(i));
1589 		   xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'interest quote basis', p_interest_quote_basis);
1590 		   xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'data side here',v_sides_table(i));
1591 		END IF;
1592 		v_in_rec_type.p_interpolation_method := p_interp_methods(i);
1593 		IF (g_proc_level>=g_debug_level) THEN
1594 		   xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'interpolation method',p_interp_methods(i));
1595 		END IF;
1596 		v_in_rec_type.p_side := v_sides_table(i);
1597 		v_in_rec_type.p_batch_id := null;
1598 		IF (g_proc_level>=g_debug_level) THEN
1599 		   xtr_risk_debug_pkg.dpush('get_rates_from_curves: ' || 'get md from curve');
1600 		END IF;
1601 		XTR_MARKET_DATA_P.get_md_from_curve(v_in_rec_type,
1602 						    v_out_rec_type);
1603 		v_rates_table(i) := round(v_out_rec_type.p_md_out, v_rounding_factor);
1604 		IF (g_proc_level>=g_debug_level) THEN
1605 		   xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'got rate', v_rates_table(i));
1606 		END IF;
1607 	   end if;
1608 	END LOOP;
1609         IF (g_proc_level>=g_debug_level) THEN
1610 	   xtr_risk_debug_pkg.dpop(null,'QRM_CALCULATORS_P.get_rates_from_curves');
1611         END IF;
1612 	return v_rates_table;
1613     END IF;
1614 
1615     EXCEPTION
1616   	WHEN  xtr_market_data_p.e_mdcs_no_data_found THEN
1617 	  if (v_rate_type = 'Y') then
1618     	    FND_MESSAGE.SET_NAME('QRM','QRM_CALC_NO_DEFAULT_INT_ERR');
1619     	    FND_MESSAGE.SET_TOKEN('CURVE',v_curve);
1620 	    IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
1621         	   xtr_risk_debug_pkg.dlog('EXCEPTION','QRM-CALC_NO_DEFAULT_INT_ERR',
1622 		      'QRM_CALCULATORS_P.GET_RATES_FROM_CURVE',G_ERROR_LEVEL);
1623             END IF;
1624 	    raise e_no_int_rates;
1625 	  else
1626     	    FND_MESSAGE.SET_NAME('QRM','QRM_CALC_NO_DEFAULT_VOL_ERR');
1627     	    FND_MESSAGE.SET_TOKEN('CURVE',v_curve);
1628 	    IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
1629         	   xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_VOL_RATES',
1630 		      'QRM_CALCULATORS_P.GET_RATES_FROM_CURVES',G_ERROR_LEVEL);
1631             END IF;
1632 	    raise e_no_vol_rates;
1633 	  end if;
1634 END get_rates_from_curves;
1635 
1636 
1637 FUNCTION get_rates_from_base      (p_rate_types SYSTEM.QRM_VARCHAR_TABLE,
1638 				   p_base_currencies SYSTEM.QRM_VARCHAR_TABLE,
1639 				   p_contra_currencies SYSTEM.QRM_VARCHAR_TABLE,
1640 				   p_quote_bases  SYSTEM.QRM_VARCHAR_TABLE,
1641 				   p_interp_methods SYSTEM.QRM_VARCHAR_TABLE,
1642 				   p_data_sides SYSTEM.QRM_VARCHAR_TABLE,
1643 				   p_day_count_bases SYSTEM.QRM_VARCHAR_TABLE,
1647 				   p_future_date DATE)
1644 				   p_interest_quote_basis VARCHAR2,
1645 				   p_currency_quote_basis VARCHAR2,
1646 			    	   p_spot_date DATE,
1648 	RETURN xtr_md_num_table IS
1649 
1650 	v_curves_table SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
1651 	--v_sides_table SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
1652 	v_rates_table xtr_md_num_table := xtr_md_num_table();
1653 
1654 	v_rate_type SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
1655 	v_base_ccy SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
1656 	v_contra_ccy SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
1657 	v_curve SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
1658 
1659 	v_in_rec_type XTR_MARKET_DATA_P.md_from_curve_in_rec_type;
1660 	v_out_rec_type XTR_MARKET_DATA_P.md_from_curve_out_rec_type;
1661 
1662 	v_table_size number := p_rate_types.count;
1663 BEGIN
1664     IF (g_proc_level>=g_debug_level) THEN
1665        xtr_risk_debug_pkg.dpush(null,'QRM_CALCULATORS_P.get_rates_from_base');
1666     END IF;
1667     if ((p_base_currencies.count <> v_table_size) OR
1668 	((p_contra_currencies IS NOT null) AND
1669 	 (p_contra_currencies.count <> v_table_size)) OR
1670 	((p_quote_bases IS NOT null) AND
1671 	 (p_quote_bases.count <> v_table_size)) OR
1672 	((p_interp_methods IS NOT null) AND
1673 	 (p_interp_methods.count <> v_table_size)) OR
1674 	((p_data_sides IS NOT null) AND
1675 	 (p_data_sides.count <> v_table_size)) OR
1676 	((p_day_count_bases IS NOT null) AND
1677 	 (p_day_count_bases.count <> v_table_size))) then
1678 	 RAISE_APPLICATION_ERROR
1679                        (-20001,'input tables must be the same size.');
1680       else
1681 	-- first get the corresponding default curve for each rate/rate type
1682 	-- to be extracted
1683 	v_rate_type.extend(1);
1684 	v_base_ccy.extend(1);
1685 	v_contra_ccy.extend(1);
1686 	v_curve.extend(1);
1687 	v_curves_table.extend(v_table_size);
1688 	--v_sides_table.extend(v_table_size);
1689 	v_rates_table.extend(v_table_size);
1690 	FOR i IN 1..v_table_size LOOP
1691 	   if  ((p_rate_types(i) = 'YIELD') OR
1692 	  	(p_rate_types(i) = 'FXVOL') OR
1693 		(p_rate_types(i) = 'IRVOL')) then
1694 		v_rate_type(1) := p_rate_types(i);
1695 		v_base_ccy(1) := p_base_currencies(i);
1696 		if (p_contra_currencies IS NOT null) then
1697 			v_contra_ccy(1) := p_contra_currencies(i);
1698 		end if;
1699 		v_curve := get_curves_from_base(v_rate_type,
1700 						v_base_ccy,
1701 						v_contra_ccy);
1702 		v_curves_table(i) := v_curve(1);
1703                 IF (g_proc_level>=g_debug_level) THEN
1704                    xtr_risk_debug_pkg.dlog('get_rates_from_base: ' || 'curve code', v_curve(1));
1705                 END IF;
1706 
1707 	   elsif (p_rate_types(i) = 'SPOT') then
1708 		-- do spot rate extraction here
1709 		-- but need to fill up space in corresponding tables
1710 		v_curves_table(i) := ' ';
1711 	   end if;
1712 	END LOOP;
1713     end if;
1714 
1715     --- FILL UP RATES table
1716     -- first make sure all tables are same length
1717     if (v_curves_table.count <> v_table_size) then
1718  	 RAISE_APPLICATION_ERROR
1719                        (-20001,'input tables must be the same size.');
1720     else
1721 	-- call get_rates_from_curves
1722  	v_rates_table := get_rates_from_curves(p_rate_types,
1723 					       v_curves_table,
1724 					       p_base_currencies,
1725 					       p_contra_currencies,
1726 					       p_quote_bases,
1727 					       p_interp_methods,
1728 					       p_data_sides,
1729 					       p_day_count_bases,
1730 				 	       p_interest_quote_basis,
1731 					       p_currency_quote_basis,
1732 					       p_spot_date,
1733 					       p_future_date);
1734 
1735     IF (g_proc_level>=g_debug_level) THEN
1736        xtr_risk_debug_pkg.dpop(null,'QRM_CALCULATORS_P.get_rates_from_base');
1737     END IF;
1738     return v_rates_table;
1739     end if;
1740 END get_rates_from_base;
1741 
1742 
1743 
1744 FUNCTION get_spot_quotation_basis(p_base_currency IN VARCHAR2,
1745 				  p_contra_currency IN VARCHAR2,
1746 				  p_overwrite_sys IN BOOLEAN)
1747 
1748 	RETURN SYSTEM.QRM_VARCHAR_TABLE IS
1749 
1750 	p_ccy_a varchar2(15);
1751 	p_ccy_b varchar2(15);
1752 	p_quote_bases SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
1753 
1754         p_no_usd boolean := (p_base_currency <> 'USD' AND
1755 			     p_contra_currency <> 'USD');
1756 
1757 	CURSOR get_quote_basis(p_ccy varchar2) IS
1758 	    SELECT currency_a, currency_b
1759   	    FROM xtr_market_prices
1760 	    WHERE p_ccy IN (currency_a, currency_b) AND term_type='S';
1761 
1762 BEGIN
1763     p_quote_bases.extend;
1764     p_quote_bases.extend;
1765 
1766     if (p_overwrite_sys) then
1767         if (p_base_currency = 'USD') then
1768 	    p_quote_bases(1) := 'C';
1769 	    p_quote_bases(2) := 'C';
1770         elsif (p_contra_currency = 'USD') then
1771 	    p_quote_bases(1) := 'B';
1772 	    p_quote_bases(2) := 'C';
1773 	end if;
1774     end if;
1775     if ((p_no_usd AND p_overwrite_sys) OR (NOT p_overwrite_sys)) then
1776 	OPEN get_quote_basis(p_base_currency);
1777 	FETCH get_quote_basis INTO p_ccy_a, p_ccy_b;
1778 	if (get_quote_basis%found) then
1779 	    if (p_ccy_a = 'USD') then
1780 		p_quote_bases(1) := 'C';
1781 	    elsif (p_ccy_b = 'USD') then
1782 		p_quote_bases(1) := 'B';
1783 	    end if;
1784 	else
1785 	   FND_MESSAGE.SET_NAME('QRM','QRM_CALC_NO_DEFAULT_SPOT_ERR');
1789 	CLOSE get_quote_basis;
1786     	   FND_MESSAGE.SET_TOKEN('CCY',p_base_currency);
1787 	   raise e_no_spot_rates;
1788 	end if;
1790 	OPEN get_quote_basis(p_contra_currency);
1791 	FETCH get_quote_basis INTO p_ccy_a, p_ccy_b;
1792 	if (get_quote_basis%found) then
1793 	    if (p_ccy_a = 'USD') then
1794 		p_quote_bases(2) := 'C';
1795 	    elsif (p_ccy_b = 'USD') then
1796 		p_quote_bases(2) := 'B';
1797 	    end if;
1798 	else
1799 	    FND_MESSAGE.SET_NAME('QRM','QRM_CALC_NO_DEFAULT_SPOT_ERR');
1800     	    FND_MESSAGE.SET_TOKEN('CCY',p_contra_currency);
1801 	    raise e_no_spot_rates;
1802 	end if;
1803 	CLOSE get_quote_basis;
1804      end if;
1805      return p_quote_bases;
1806 END get_spot_quotation_basis;
1807 
1808 
1809 --added by sankim 10/2/01
1810 /*a note about p_indicator
1811 CC:calculate using curves. override any previous rates existing.
1812 CR: calculate using rates with some rates missing, but curve code specified.
1813    default only the missing rates from the specified curve.
1814 R:calculate using rates. all rates are provided so there's no need to default
1815 any rates.
1816 NR: curve and some rates are missing when calculating using rates. a curve
1817 needs to be defaulted and fill in any missing rates.
1818 NC: no curve specified when calculating using curves. a curve needs to be
1819 defaulted and fill in all the rates
1820 */
1821 PROCEDURE fra_pricing(p_indicator IN VARCHAR2,
1822 		      p_settlement_date IN DATE ,
1823                       p_maturity_date IN DATE,
1824                       p_day_count_basis IN VARCHAR2,
1825                       p_spot_date IN DATE,
1826                       p_rate_curve IN OUT NOCOPY VARCHAR2,
1827                       p_quote_basis IN VARCHAR2,
1828                       p_interpolation IN VARCHAR2,
1829                       p_ss_bid IN OUT NOCOPY NUMBER,
1830                       p_ss_ask IN OUT NOCOPY NUMBER,
1831                       p_sm_bid IN OUT NOCOPY NUMBER,
1832                       p_sm_ask IN OUT NOCOPY NUMBER,
1833                       p_holding_period OUT NOCOPY NUMBER,
1834                       p_adjusted_holding_period OUT NOCOPY NUMBER,
1835 		      p_contract_rate_bid OUT NOCOPY NUMBER,
1836 		      p_contract_rate_ask OUT NOCOPY NUMBER) is
1837 v_quote_basis VARCHAR2(20) := p_quote_basis;
1838 v_settlement_date DATE;
1839 v_maturity_date DATE;
1840 v_spot_date DATE;
1841 v_spot_settlement NUMBER;
1842 --number of days from spot to settlement
1843 v_spot_maturity NUMBER;
1844 --number of days from spot to maturity
1845 v_year_count NUMBER;
1846 --variable for year basis
1847 v_ss_bid NUMBER :=p_ss_bid;
1848 v_ss_ask NUMBER :=p_ss_ask;
1849 v_sm_bid NUMBER :=p_sm_bid;
1850 v_sm_ask NUMBER :=p_sm_ask;
1851 v_fra_rec_in XTR_MM_COVERS.INT_FORW_RATE_IN_REC_TYPE;
1852 v_fra_rec_out XTR_MM_COVERS.INT_FORW_RATE_OUT_REC_TYPE;
1853 CURSOR default_currency_cursor is
1854   select param_value from xtr_pro_param
1855       where param_name = 'SYSTEM_FUNCTIONAL_CCY';
1856 v_curve_type SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
1857 v_curve_code SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE(p_rate_curve,p_rate_curve);
1858 v_base_currency SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
1859 v_interpolation SYSTEM.QRM_VARCHAR_TABLE :=
1860           SYSTEM.QRM_VARCHAR_TABLE(p_interpolation,p_interpolation);
1861 v_data_side SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
1862 v_day_count_basis SYSTEM.QRM_VARCHAR_TABLE :=
1863           SYSTEM.QRM_VARCHAR_TABLE(p_day_count_basis,p_day_count_basis);
1864 v_rates XTR_MD_NUM_TABLE := XTR_MD_NUM_TABLE();
1865 v_default_curve SYSTEM.QRM_VARCHAR_TABLE;
1866 BEGIN
1867   --xtr_risk_debug_pkg.start_debug('/sqlcom/out/findv11i','sktest.dbg');
1868   --xtr_risk_debug_pkg.start_debug;
1869   IF (g_proc_level>=g_debug_level) THEN
1870      xtr_risk_debug_pkg.dpush(null,'QRM_CALCULATORS_P.fra_pricing');
1871   END IF;
1872  --if any errors were added before, remove it
1873   IF fnd_msg_pub.count_msg > 0 THEN
1874     fnd_msg_pub.Initialize;
1875   END IF;
1876   v_base_currency.extend;
1877   v_settlement_date:= p_settlement_date;
1878   v_maturity_date:= p_maturity_date;
1879   v_spot_date:= p_spot_date;
1880   IF (g_proc_level>=g_debug_level) THEN
1881      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'p_indicator',p_indicator);
1882      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'v_settlement_date',v_settlement_date);
1883      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'v_maturity_date',v_maturity_date);
1884      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'p_day_count_basis',p_day_count_basis);
1885      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'spot_date',v_spot_date);
1886      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'rate curve',p_rate_curve);
1887      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'quote basis',p_quote_basis);
1888      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'interpolation',p_interpolation);
1889      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'ss bid',p_ss_bid);
1890      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'ss ask',p_ss_ask);
1891      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'sm bid',p_sm_bid);
1892      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'sm ask',p_sm_ask);
1893   END IF;
1894   IF p_indicator = 'NR' or p_indicator = 'NC' THEN
1895   --default a curve
1896   --get the treasury reporting currency
1897     open default_currency_cursor;
1898     fetch default_currency_cursor into v_base_currency(1);
1899     --xtr_risk_debug_pkg.dlog('default curve',p_rate_curve);
1900     close default_currency_cursor;
1904     v_base_currency.extend;
1901   --get the default curve that belong to the treasury reporting currency
1902     v_default_curve:=get_curves_from_base(v_curve_type,v_base_currency,null);
1903     p_rate_curve:=v_default_curve(1);
1905     v_base_currency(2):=v_base_currency(1);
1906     v_curve_type.extend;
1907     v_curve_type(2):='YIELD';
1908     IF v_quote_basis = 'DEFAULT' THEN
1909     --for curve default quote basis, get the actual value
1910       select data_side into v_quote_basis from xtr_rm_md_curves where
1911       curve_code = p_rate_curve;
1912     END IF;
1913     --get spot to settlement rates
1914     IF v_ss_bid is null or v_ss_ask is null or p_indicator = 'NC' THEN
1915       v_rates:=get_rates_from_base(v_curve_type,
1916       v_base_currency, null,null,v_interpolation,v_data_side,v_day_count_basis,
1917       v_quote_basis,null, p_spot_date,p_settlement_date);
1918       IF (g_proc_level>=g_debug_level) THEN
1919          xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'ss bid',v_rates(1));
1920          xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'ss ask',v_rates(2));
1921       END IF;
1922       IF v_ss_bid is null or p_indicator = 'NC' THEN
1923         p_ss_bid := v_rates(1);
1924       END IF;
1925       IF v_ss_ask is null or p_indicator = 'NC' THEN
1926         p_ss_ask := v_rates(2);
1927       END IF;
1928     END IF;
1929     --get spot to maturity rates
1930     IF v_sm_bid is null or v_sm_ask is null or p_indicator = 'NC' THEN
1931       v_rates:=get_rates_from_base(v_curve_type,
1932       v_base_currency, null,null,v_interpolation,v_data_side,v_day_count_basis,
1933       v_quote_basis,null, p_spot_date,p_maturity_date);
1934       IF (g_proc_level>=g_debug_level) THEN
1935          xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'sm bid',v_rates(1));
1936          xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'sm ask',v_rates(2));
1937       END IF;
1938       IF v_sm_bid is null or p_indicator = 'NC' THEN
1939         p_sm_bid := v_rates(1);
1940       END IF;
1941       IF v_sm_ask is null or p_indicator = 'NC' THEN
1942         p_sm_ask := v_rates(2);
1943       END IF;
1944     END IF;
1945   ELSIF p_indicator = 'CC' or p_indicator = 'CR' THEN
1946   -- get rates from curve
1947     IF v_quote_basis = 'DEFAULT' THEN
1948     --for curve default quote basis, get the actual value
1949       select data_side into v_quote_basis from xtr_rm_md_curves where
1950       curve_code = p_rate_curve;
1951     END IF;
1952     v_base_currency.extend;
1953     v_base_currency(2):=v_base_currency(1);
1954     v_curve_type.extend;
1955     v_curve_type(2):='YIELD';
1956     v_rates:=get_rates_from_curves(v_curve_type,v_curve_code,v_base_currency,
1957                 null,null,v_interpolation,v_data_side,v_day_count_basis,
1958                 v_quote_basis,null, p_spot_date,p_settlement_date);
1959     IF v_ss_bid is null or p_indicator = 'CC' THEN
1960       p_ss_bid:=v_rates(1);
1961     END IF;
1962     IF v_ss_ask is null or p_indicator = 'CC' THEN
1963       p_ss_ask:=v_rates(2);
1964     END IF;
1965     v_rates:=get_rates_from_curves(v_curve_type,v_curve_code,v_base_currency,
1966                 null,null,v_interpolation,v_data_side,v_day_count_basis,
1967                 v_quote_basis,null, p_spot_date,p_maturity_date);
1968     IF v_sm_bid is null or p_indicator = 'CC' THEN
1969       p_sm_bid:=v_rates(1);
1970     END IF;
1971     IF v_sm_ask is null or p_indicator = 'CC' THEN
1972       p_sm_ask:=v_rates(2);
1973     END IF;
1974   END IF;
1975   --calculate holding period
1976   XTR_CALC_P.calc_days_run_c(v_settlement_date,v_maturity_date,'ACTUAL/ACTUAL',null,
1977   p_holding_period,v_year_count);
1978   --calculate adjusted holding period
1979   XTR_CALC_P.calc_days_run_c(v_settlement_date,v_maturity_date,p_day_count_basis,
1980   null,p_adjusted_holding_period,v_year_count);
1981   --calculate contract rates
1982   XTR_CALC_P.calc_days_run_c(v_spot_date,v_settlement_date,p_day_count_basis,null,
1983   v_spot_settlement,v_year_count);
1984   XTR_CALC_P.calc_days_run_c(v_spot_date,v_maturity_date,p_day_count_basis,null
1985   ,v_spot_maturity,v_year_count);
1986   IF (g_proc_level>=g_debug_level) THEN
1987      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'ss bid',p_ss_bid);
1988      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'ss ask',p_ss_ask);
1989      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'sm bid',p_sm_bid);
1990      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'sm ask',p_sm_ask);
1991      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'spot maturity',v_spot_maturity);
1992      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'spot settlement',v_spot_settlement);
1993      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'year count',v_year_count);
1994   END IF;
1995 
1996   v_fra_rec_in.p_indicator:= 'Y';
1997   v_fra_rec_in.p_t:=v_spot_settlement;
1998   v_fra_rec_in.p_T1:= v_spot_maturity;
1999   v_fra_rec_in.p_Rt:= p_ss_ask;
2000   v_fra_rec_in.p_RT1:= p_sm_bid;
2001   v_fra_rec_in.p_year_basis:= v_year_count;
2002 
2003 
2004   XTR_MM_COVERS.interest_forward_rate(v_fra_rec_in,v_fra_rec_out);
2005   p_contract_rate_bid:=v_fra_rec_out.p_fra_rate;
2006 
2007   v_fra_rec_in.p_indicator:= 'Y';
2008   v_fra_rec_in.p_t:=v_spot_settlement;
2009   v_fra_rec_in.p_T1:= v_spot_maturity;
2010   v_fra_rec_in.p_Rt:= p_ss_bid;
2011   v_fra_rec_in.p_RT1:= p_sm_ask;
2012   v_fra_rec_in.p_year_basis:= v_year_count;
2013 
2014 
2015 
2016   XTR_MM_COVERS.interest_forward_rate(v_fra_rec_in,v_fra_rec_out);
2017   p_contract_rate_ask:=v_fra_rec_out.p_fra_rate;
2018   IF (g_proc_level>=g_debug_level) THEN
2022      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'sm ask',p_sm_ask);
2019      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'ss bid',p_ss_bid);
2020      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'ss ask',p_ss_ask);
2021      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'sm bid',p_sm_bid);
2023      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'contract bid',p_contract_rate_bid);
2024      xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'contract ask',p_contract_rate_ask);
2025      xtr_risk_debug_pkg.dpop('fra_pricing: ' || 'pricing cover');
2026   END IF;
2027   --xtr_risk_debug_pkg.stop_debug;
2028   IF (g_proc_level>=g_debug_level) THEN
2029      xtr_risk_debug_pkg.dpop(null,'QRM_CALCULATORS_P.fra_pricing');
2030   END IF;
2031 EXCEPTION
2032   WHEN e_no_rate_curve THEN
2033     IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
2034         	   xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_RATE_CURVE',
2035 		      'QRM_CALCULATORS_P.FRA_PRICING',G_ERROR_LEVEL);
2036     END IF;
2037     fnd_msg_pub.add;
2038   WHEN e_no_int_rates THEN
2039     IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
2040         	   xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_INT_RATES',
2041 		      'QRM_CALCULATORS_P.FRA_PRICING',G_ERROR_LEVEL);
2042     END IF;
2043     fnd_msg_pub.add;
2044 END fra_pricing;
2045 
2046 --added by sankim 10/16/01
2047 /*a note about p_indicator
2048 CC:calculate using curves. override any previous rates existing.
2049 CR: calculate using rates with some rates missing, but curve code specified.
2050    default only the missing rates from the specified curve.
2051 R:calculate using rates. all rates are provided so there's no need to default
2052 any rates.
2053 NR: curve and some rates are missing when calculating using rates. a curve
2054 needs to be defaulted and fill in any missing rates.
2055 NC: no curve specified when calculating using curves. a curve needs to be
2056 defaulted and fill in all the rates
2057 */
2058 PROCEDURE fra_settlement(p_indicator IN VARCHAR2,
2059 			 p_settlement_date IN DATE,
2060                          p_maturity_date IN DATE,
2061                          p_face_value IN NUMBER,
2062 			 p_currency IN OUT NOCOPY VARCHAR2,
2063 			 p_contract_rate IN OUT NOCOPY NUMBER,
2064 			 p_day_count_basis IN VARCHAR2,
2065 			 p_deal_subtype IN VARCHAR2,
2066 			 p_calculation_method IN VARCHAR2,
2067                          p_rate_curve IN OUT NOCOPY VARCHAR2,
2068                          p_quote_basis IN VARCHAR2,
2069                          p_interpolation IN VARCHAR2,
2070                          p_settlement_rate IN OUT NOCOPY NUMBER,
2071                          p_holding_period OUT NOCOPY NUMBER,
2072                          p_adjusted_holding_period OUT NOCOPY NUMBER,
2073 			 p_action OUT NOCOPY VARCHAR2,
2074 			 p_settlement_amount OUT NOCOPY NUMBER,
2075 			 p_duration OUT NOCOPY NUMBER,
2076 			 p_convexity OUT NOCOPY NUMBER,
2077 			 p_basis_point_value OUT NOCOPY NUMBER) is
2078 v_quote_basis VARCHAR2(20) := p_quote_basis;
2079 v_settlement_date DATE;
2080 v_maturity_date DATE;
2081 v_spot_date DATE;
2082 v_spot_settlement NUMBER;
2083 --number of days from spot to settlement
2084 v_settlement_maturity NUMBER;
2085 --number of days from settlement to maturity
2086 v_year_count NUMBER;
2087 --variable for year basis
2088 v_settlement_rate NUMBER :=p_settlement_rate;
2089 v_fra_rec_in XTR_MM_COVERS.FRA_SETTLEMENT_IN_REC_TYPE;
2090 v_fra_rec_out XTR_MM_COVERS.FRA_SETTLEMENT_OUT_REC_TYPE;
2091 CURSOR default_currency_cursor is
2092   select param_value from xtr_pro_param
2093       where param_name = 'SYSTEM_FUNCTIONAL_CCY';
2094 v_curve_type SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2095 v_curve_code SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE(p_rate_curve);
2096 v_base_currency SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
2097 v_interpolation SYSTEM.QRM_VARCHAR_TABLE :=
2098           SYSTEM.QRM_VARCHAR_TABLE(p_interpolation);
2099 v_data_side SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE(p_quote_basis);
2100 v_day_count_basis SYSTEM.QRM_VARCHAR_TABLE :=
2101           SYSTEM.QRM_VARCHAR_TABLE(p_day_count_basis);
2102 v_rates XTR_MD_NUM_TABLE := XTR_MD_NUM_TABLE();
2103 v_days_array XTR_MD_NUM_TABLE := XTR_MD_NUM_TABLE();
2104 v_pvc_array XTR_MD_NUM_TABLE := XTR_MD_NUM_TABLE();
2105 v_default_curve SYSTEM.QRM_VARCHAR_TABLE;
2106 v_ss_bid NUMBER;
2107 v_ss_ask NUMBER;
2108 v_sm_bid NUMBER;
2109 v_sm_ask NUMBER;
2110 v_holding_period NUMBER;
2111 v_adjusted_holding_period NUMBER;
2112 v_contract_rate_bid NUMBER;
2113 v_contract_rate_ask NUMBER;
2114 v_rounding_factor NUMBER := 6;
2115 BEGIN
2116   --xtr_risk_debug_pkg.start_debug('/sqlcom/out/findv11i','sktest.dbg');
2117   --xtr_risk_debug_pkg.start_debug;
2118   IF (g_proc_level>=g_debug_level) THEN
2119      xtr_risk_debug_pkg.dpush(null,'QRM_CALCULATORS_P.fra_settlement');
2120   END IF;
2121   --if any errors were added before, remove it
2122   IF fnd_msg_pub.count_msg > 0 THEN
2123     fnd_msg_pub.Initialize;
2124   END IF;
2125   v_base_currency.extend;
2126   v_settlement_date:= p_settlement_date;
2127   v_maturity_date:= p_maturity_date;
2128 
2129   v_spot_date := trunc(sysdate);
2130 
2131 
2132   /*xtr_risk_debug_pkg.dlog('p_indicator',p_indicator);
2133   IF (g_proc_level>=g_debug_level) THEN
2134      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'v_maturity_date',v_maturity_date);
2135      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'p_day_count_basis',p_day_count_basis);
2136      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'spot_date',v_spot_date);
2140      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'ss bid',p_ss_bid);
2137      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'rate curve',p_rate_curve);
2138      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'quote basis',p_quote_basis);
2139      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'interpolation',p_interpolation);
2141      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'ss ask',p_ss_ask);
2142      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'sm bid',p_sm_bid);
2143      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'sm ask',p_sm_ask);
2144   END IF;*/
2145   IF p_currency is NULL THEN
2146   --get the treasury reporting currency if no currency is specified
2147     open default_currency_cursor;
2148     fetch default_currency_cursor into v_base_currency(1);
2149     --xtr_risk_debug_pkg.dlog('default curve',p_rate_curve);
2150     close default_currency_cursor;
2151   ELSE
2152     v_base_currency(1):=p_currency;
2153   END IF;
2154   IF p_indicator = 'NC'or p_indicator = 'NR' THEN
2155   --default a curve
2156   --get the default curve that belong to the currency specified or the treasury
2157   -- reporting currency
2158     v_default_curve:=get_curves_from_base(v_curve_type, v_base_currency,null);
2159     p_rate_curve:=v_default_curve(1);
2160     --get settlement rate
2161     IF v_settlement_rate is null or p_indicator = 'NC' THEN
2162       IF v_spot_date >= v_settlement_date THEN
2163         v_rates:=get_rates_from_base(v_curve_type,
2164         v_base_currency, null,null,v_interpolation,v_data_side,
2165         v_day_count_basis,v_quote_basis,null, v_settlement_date,
2166         p_maturity_date);
2167         --xtr_risk_debug_pkg.dlog('ss bid',v_rates(1));
2168         --xtr_risk_debug_pkg.dlog('ss ask',v_rates(2));
2169         p_settlement_rate:=v_rates(1);
2170       ELSE --calculate forward-forward rate
2171         IF (g_proc_level>=g_debug_level) THEN
2172            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'settle date',p_settlement_date);
2173            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'maturity date',p_maturity_date);
2174            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'day count',p_day_count_basis);
2175            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'spot date',v_spot_date);
2176            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'curve',p_rate_curve);
2177            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'quote basis',p_quote_basis);
2178            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'interp',p_interpolation);
2179            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'ss bid',v_ss_bid);
2180            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'ss ask',v_ss_ask);
2181            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'sm bid',v_sm_bid);
2182            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'sm ask',v_sm_ask);
2183         END IF;
2184         fra_pricing('CC',p_settlement_date,p_maturity_date,p_day_count_basis,
2185         v_spot_date,p_rate_curve,p_quote_basis,p_interpolation,v_ss_bid,
2186         v_ss_ask,v_sm_bid,v_sm_ask,v_holding_period,v_adjusted_holding_period,
2187         v_contract_rate_bid,v_contract_rate_ask);
2188         IF p_quote_basis = 'BID' THEN
2189           p_settlement_rate:= v_contract_rate_bid;
2190         ELSIF p_quote_basis = 'ASK' THEN
2191           p_settlement_rate:= v_contract_rate_ask;
2192         ELSE --mid
2193           p_settlement_rate:= (v_contract_rate_bid+v_contract_rate_ask)/2;
2194         END IF;
2195         p_settlement_rate:= round(p_settlement_rate,v_rounding_factor);
2196       END IF;
2197     END IF;
2198   ELSIF p_indicator = 'CC' or p_indicator = 'CR' THEN
2199   -- get rates from curve
2200     IF v_settlement_rate is null or p_indicator = 'CC'  THEN
2201       IF v_spot_date >= v_settlement_date THEN
2202         v_rates:=get_rates_from_curves(v_curve_type,v_curve_code,
2203                  v_base_currency,null,null,v_interpolation,v_data_side,
2204                  v_day_count_basis,v_quote_basis,null, v_settlement_date,
2205                  p_maturity_date);
2206         /*v_rates:=get_rates_from_curves(v_curve_type,v_curve_code,
2207                  v_base_currency,null,null,v_interpolation,v_data_side,
2208                  v_day_count_basis,v_quote_basis,null, v_spot_date,
2209                  p_maturity_date);*/
2210         p_settlement_rate:=v_rates(1);
2211       ELSE --calculate forward-forward rate
2212         IF (g_proc_level>=g_debug_level) THEN
2213            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'settle date',p_settlement_date);
2214            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'maturity date',p_maturity_date);
2215            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'day count',p_day_count_basis);
2216            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'spot date',v_spot_date);
2217            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'curve',p_rate_curve);
2218            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'quote basis',p_quote_basis);
2219            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'interp',p_interpolation);
2220            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'ss bid',v_ss_bid);
2221            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'ss ask',v_ss_ask);
2222            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'sm bid',v_sm_bid);
2223            xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'sm ask',v_sm_ask);
2224         END IF;
2225         fra_pricing('CC',p_settlement_date,p_maturity_date,p_day_count_basis,
2226         v_spot_date,p_rate_curve,p_quote_basis,p_interpolation,v_ss_bid,
2230           p_settlement_rate:= v_contract_rate_bid;
2227         v_ss_ask,v_sm_bid,v_sm_ask,v_holding_period,v_adjusted_holding_period,
2228         v_contract_rate_bid,v_contract_rate_ask);
2229         IF p_quote_basis = 'BID' THEN
2231         ELSIF p_quote_basis = 'ASK' THEN
2232           p_settlement_rate:= v_contract_rate_ask;
2233         ELSE --mid
2234           p_settlement_rate:= (v_contract_rate_bid+v_contract_rate_ask)/2;
2235         END IF;
2236         p_settlement_rate:= round(p_settlement_rate,v_rounding_factor);
2237       END IF;
2238     END IF;
2239   END IF;
2240   --calculate holding period
2241   XTR_CALC_P.calc_days_run_c(v_settlement_date,v_maturity_date,'ACTUAL/ACTUAL',
2242      null,p_holding_period,v_year_count);
2243   --calculate adjusted holding period
2244   XTR_CALC_P.calc_days_run_c(v_settlement_date,v_maturity_date,
2245           p_day_count_basis,null,p_adjusted_holding_period,v_year_count);
2246   --calculate settlement amount
2247   v_settlement_maturity:= p_adjusted_holding_period;
2248   IF (g_proc_level>=g_debug_level) THEN
2249      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'calc method',p_calculation_method);
2250      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'settle rate',p_settlement_rate);
2251      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'contract rate',p_contract_rate);
2252      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'face value',p_face_value);
2253      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'settlement maturity',v_settlement_maturity);
2254      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'year count',v_year_count);
2255   END IF;
2256 
2257   v_fra_rec_in.p_indicator:= p_calculation_method;
2258   v_fra_rec_in.p_fra_price:= p_contract_rate;
2259   v_fra_rec_in.p_settlement_rate:= p_settlement_rate;
2260   v_fra_rec_in.p_face_value:= p_face_value;
2261   v_fra_rec_in.p_day_count:= v_settlement_maturity;
2262   v_fra_rec_in.p_annual_basis:= v_year_count;
2263   v_fra_rec_in.p_deal_subtype:= null;
2264 
2265 
2266 
2267   XTR_MM_COVERS.fra_settlement_amount(v_fra_rec_in,v_fra_rec_out);
2268   p_settlement_amount:=v_fra_rec_out.p_settlement_amount;
2269   IF (g_proc_level>=g_debug_level) THEN
2270      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'settle amount',p_settlement_amount);
2271   END IF;
2272   --calculate sensitivities of fra
2273   IF v_spot_date< v_settlement_date THEN
2274      -- first, calculate duration
2275     XTR_CALC_P.calc_days_run_c(v_spot_date,v_settlement_date,p_day_count_basis,
2276 null,v_spot_settlement,v_year_count);
2277     IF (g_proc_level>=g_debug_level) THEN
2278        xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'spot_date',v_spot_date);
2279        xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'settlement_date',v_settlement_date);
2280        xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'spot_settlement',v_spot_settlement);
2281     END IF;
2282     v_days_array.extend;
2283     v_days_array(1):=v_spot_settlement;
2284     v_pvc_array.extend;
2285     v_pvc_array(1):=1;
2286     p_duration:=QRM_MM_FORMULAS.duration(v_pvc_array,v_days_array,v_year_count);
2287     IF (g_proc_level>=g_debug_level) THEN
2288        xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'year count',v_year_count);
2289        xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'duration',p_duration);
2290     END IF;
2291     --secondly, calculate convexity
2292     p_convexity:=QRM_MM_FORMULAS.ni_fra_convexity(v_spot_settlement,
2293 					p_settlement_rate,v_year_count);
2294     IF (g_proc_level>=g_debug_level) THEN
2295        xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'settlement rate',p_settlement_rate);
2296        xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'convexity',p_convexity);
2297     END IF;
2298     -- lastly, calculate bpv
2299     --calculate shifted settlement
2300     v_fra_rec_in.p_settlement_rate:=p_settlement_rate+0.01;
2301     XTR_MM_COVERS.fra_settlement_amount(v_fra_rec_in,v_fra_rec_out);
2302     p_basis_point_value:=QRM_MM_FORMULAS.bpv(p_settlement_amount,
2303 					v_fra_rec_out.p_settlement_amount);
2304     IF (g_proc_level>=g_debug_level) THEN
2305        xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'shifted',v_fra_rec_out.p_settlement_amount);
2306        xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'base',p_settlement_amount);
2307        xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'bpv',p_basis_point_value);
2308     END IF;
2309   END IF;
2310   --determine pay or receive
2311   IF p_deal_subtype = 'FUND' THEN
2312     IF p_contract_rate > p_settlement_rate THEN
2313       SELECT description INTO p_action FROM xtr_amount_actions_v WHERE deal_type ='FRA' AND amount_type = 'SETTLE' AND action_code = 'PAY';
2314     ELSIF p_contract_rate < p_settlement_rate THEN
2315       SELECT description INTO p_action FROM xtr_amount_actions_v WHERE deal_type ='FRA' AND amount_type = 'SETTLE' AND action_code = 'REC';
2316     ELSE
2317       p_action:=null;
2318     END IF;
2319   ELSE
2320     IF p_contract_rate > p_settlement_rate THEN
2321       SELECT description INTO p_action FROM xtr_amount_actions_v WHERE deal_type ='FRA' AND amount_type = 'SETTLE' AND action_code = 'REC';
2322     ELSIF p_contract_rate < p_settlement_rate THEN
2323       SELECT description INTO p_action FROM xtr_amount_actions_v WHERE deal_type ='FRA' AND amount_type = 'SETTLE' AND action_code = 'PAY';
2324     ELSE
2325       p_action:=null;
2326     END IF;
2327   END IF;
2328   /*xtr_risk_debug_pkg.dlog('ss bid',p_ss_bid);
2329   IF (g_proc_level>=g_debug_level) THEN
2330      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'ss ask',p_ss_ask);
2331      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'sm bid',p_sm_bid);
2335   END IF;*/
2332      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'sm ask',p_sm_ask);
2333      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'contract bid',p_contract_rate_bid);
2334      xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'contract ask',p_contract_rate_ask);
2336   --xtr_risk_debug_pkg.stop_debug;
2337   --return currency if it wasn't provided
2338   IF p_currency is NULL THEN
2339     p_currency:= v_base_currency(1);
2340   END IF;
2341   IF (g_proc_level>=g_debug_level) THEN
2342      xtr_risk_debug_pkg.dpop(null,'QRM_CALCULATORS_P.fra_settlement');
2343   END IF;
2344 EXCEPTION
2345   WHEN e_no_rate_curve THEN
2346     IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
2347         	   xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_RATE_CURVE',
2348 		      'QRM_CALCULATORS_P.FRA_SETTLEMENT',G_ERROR_LEVEL);
2349     END IF;
2350     fnd_msg_pub.add;
2351   WHEN e_no_int_rates THEN
2352     IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
2353         	   xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_INT_RATES',
2354 		      'QRM_CALCULATORS_P.FRA_SETTLEMENT',G_ERROR_LEVEL);
2355     END IF;
2356     fnd_msg_pub.add;
2357 END fra_settlement;
2358 
2359 
2360 
2361 --added by jbrodsky 11/02/01
2362 
2363 PROCEDURE fxo_calculator(p_date_args    IN     SYSTEM.QRM_DATE_TABLE,
2364 			p_varchar_args IN OUT NOCOPY SYSTEM.QRM_VARCHAR_TABLE,
2365 			p_num_args     IN OUT NOCOPY xtr_md_num_table) IS
2366 
2367 	p_spot_date date := p_date_args(1);
2368 	p_exp_date date := p_date_args(2);
2369 	p_indicator varchar2(1) := p_varchar_args(1);
2370 	p_foreign_ccy varchar2(15) := p_varchar_args(2);
2371 	p_domestic_ccy varchar2(15) := p_varchar_args(3);
2372 	p_currency_quote varchar2(20) := p_varchar_args(4);
2373 	p_interest_quote varchar2(20) := p_varchar_args(5);
2374 	p_foreign_curve varchar2(20) := p_varchar_args(6);
2375 	p_domestic_curve varchar2(20) := p_varchar_args(7);
2376 	p_volatility_curve varchar2(20) := p_varchar_args(8);
2377 	p_foreign_interpolation varchar2(20) := p_varchar_args(9);
2378 	p_domestic_interpolation varchar2(20) := p_varchar_args(10);
2379 	p_volatility_interpolation varchar2(20) := p_varchar_args(11);
2380 	p_foreign_quote_usd varchar2(1) := p_varchar_args(12);
2381 	p_domestic_quote_usd varchar2(1) := p_varchar_args(13);
2382 	p_foreign_day_count varchar2(15) := p_varchar_args(14);
2383 	p_domestic_day_count varchar2(15) := p_varchar_args(15);
2384 	p_implied_vol_call_put varchar2(20):= p_varchar_args(16);
2385 	p_calc_type_indicator varchar2(1):= p_varchar_args(17);
2386    	p_implied_vol_price number := p_num_args(1);
2387 	p_foreign_ccy_amt number := p_num_args(2);
2388    	p_strike_price number:= p_num_args(3);
2389    	p_volatility number:= p_num_args(4);
2390    	p_for_spot_rate_bid number := p_num_args(5);
2391 	p_for_spot_rate_ask number := p_num_args(6);
2392    	p_dom_spot_rate_bid number := p_num_args(7);
2393    	p_dom_spot_rate_ask number := p_num_args(8);
2394    	p_for_int_rate_bid number := p_num_args(9);
2395    	p_for_int_rate_ask number := p_num_args(10);
2396    	p_dom_int_rate_bid number := p_num_args(11);
2397    	p_dom_int_rate_ask number := p_num_args(12);
2398    	p_vol_bid number := p_num_args(13);
2399    	p_vol_ask number := p_num_args(14);
2400 
2401 
2402 	p_res_impl_vol number;
2403 
2404 
2405 	p_res_call_bid number;
2406 	p_res_call_ask number;
2407 	p_res_put_bid number;
2408 	p_res_put_ask number;
2409 	p_res_fxforward_bid number;
2410 	p_res_fxforward_ask number;
2411 	p_res_call_fair_value_bid number;
2412 	p_res_call_fair_value_ask number;
2413 	p_res_put_fair_value_bid number;
2414 	p_res_put_fair_value_ask number;
2415 
2416 	p_res_delta_call_bid number;
2417 	p_res_delta_call_ask number;
2418 	p_res_delta_put_bid number;
2419 	p_res_delta_put_ask number;
2420 	p_res_gamma_bid number;
2421 	p_res_gamma_ask number;
2422 	p_res_theta_call_bid number;
2423 	p_res_theta_call_ask number;
2424 	p_res_theta_put_bid number;
2425 	p_res_theta_put_ask number;
2426 	p_res_vega_bid number;
2427 	p_res_vega_ask number;
2428 	p_res_rho_dom_call_bid number;
2429 	p_res_rho_dom_call_ask number;
2430 	p_res_rho_dom_put_bid number;
2431 	p_res_rho_dom_put_ask number;
2432 	p_res_rho_for_call_bid number;
2433 	p_res_rho_for_call_ask number;
2434 	p_res_rho_for_put_bid number;
2435 	p_res_rho_for_put_ask number;
2436 
2437 	--Inputs for implied volatility calculation
2438 	p_rates_table XTR_MD_NUM_TABLE;
2439 	p_interest_rates XTR_MD_NUM_TABLE;
2440 	p_day_count_bases SYSTEM.QRM_VARCHAR_TABLE;
2441 	p_rate_types SYSTEM.QRM_VARCHAR_TABLE;
2442 	p_compound_freq XTR_MD_NUM_TABLE;
2443 	p_spot_rates XTR_MD_NUM_TABLE;
2444 	p_curve_types SYSTEM.QRM_VARCHAR_TABLE;
2445     	p_curve_codes SYSTEM.QRM_VARCHAR_TABLE;
2446     	p_base_currencies SYSTEM.QRM_VARCHAR_TABLE;
2447     	p_contra_currencies SYSTEM.QRM_VARCHAR_TABLE;
2448     	p_quote_bases SYSTEM.QRM_VARCHAR_TABLE;
2449     	p_interp_methods SYSTEM.QRM_VARCHAR_TABLE;
2450     	p_data_sides SYSTEM.QRM_VARCHAR_TABLE;
2451 
2452 	--indicator of whether either currency is USD
2453 	p_neither_usd boolean := (p_foreign_ccy<>'USD' AND p_domestic_ccy<>'USD');
2454 	-- indicator of whether to overwrite quotation basis against usd
2455    	-- if one currency is USD
2456         p_ow_spot_rates boolean := false;
2457 
2458 	p_unit_price number;
2459 	p_days number;
2460 	p_years number;
2461 	p_option_indicator varchar2(1);
2462 	p_spot_rate number;
2463 
2464 	p_rate_type varchar2(1);
2465 
2469    	p_for_cint_rate_ask number;
2466 
2467 	--Continuous version of rates
2468 	p_for_cint_rate_bid number;
2470    	p_dom_cint_rate_bid number;
2471    	p_dom_cint_rate_ask number;
2472 
2473 	fx_option_price_in  XTR_FX_FORMULAS.GK_OPTION_CV_IN_REC_TYPE;
2474 	fx_option_price_out XTR_FX_FORMULAS.GK_OPTION_CV_OUT_REC_TYPE;
2475 
2476 BEGIN
2477 
2478 
2479 
2480 IF (g_proc_level>=g_debug_level) THEN
2481    xtr_risk_debug_pkg.dpush(null,'QRM_CALCULATORS_P.fxo_calculator');
2482 END IF;
2483 
2484 
2485 
2486         IF fnd_msg_pub.count_msg > 0 THEN
2487              fnd_msg_pub.Initialize;
2488         END IF;
2489 
2490 
2491 	if (p_exp_date-p_spot_date > 365) THEN
2492 		p_rate_type := 'P';
2493 	ELSE
2494 		p_rate_type := 'S';
2495 	END IF;
2496 
2497 
2498 
2499 
2500 	IF (p_calc_type_indicator = 'V') THEN
2501 
2502 		--Default Curve Data
2503 		IF (p_indicator = 'D') THEN
2504 
2505 
2506 			IF (g_proc_level>=g_debug_level) THEN
2507 			   xtr_risk_debug_pkg.dpush('fxo_calculator: ' || 'Calculation Based On Defaults');
2508 			END IF;
2509 
2510 			p_volatility_curve:='';
2511 			p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD','YIELD');
2512     			p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy,p_domestic_ccy);
2513     			p_curve_codes := get_curves_from_base(p_curve_types,p_base_currencies,
2514 						p_contra_currencies);
2515 
2516 			p_foreign_curve := p_curve_codes(1);
2517     			p_domestic_curve := p_curve_codes(2);
2518 
2519 			IF (g_proc_level>=g_debug_level) THEN
2520 			   xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'foreign curve', p_foreign_curve);
2521     			   xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'domestic curve', p_domestic_curve);
2522     			END IF;
2523 
2524 
2525 			  -- since 'Calculate Using Defaults' was pressed, use default interpol.
2526     			p_foreign_interpolation := 'DEFAULT';
2527     			p_domestic_interpolation := 'DEFAULT';
2528 
2529     			-- assume interest rate quote to be bid/ask;
2530     			p_interest_quote := 'BID/ASK';
2531 
2532 		    	-- calculate Rates
2533 			-- this follows the calculator table across each row
2534         		-- first do Spot Rates
2535 
2536 			-- get quotation basis versus usd for our currencies
2537 
2538 			p_quote_bases:=GET_SPOT_QUOTATION_BASIS(p_foreign_ccy, p_domestic_ccy, p_ow_spot_rates);
2539 			p_foreign_quote_usd:= p_quote_bases(1);
2540 			p_domestic_quote_usd:= p_quote_bases(2);
2541 
2542     			if (p_foreign_ccy = 'USD' AND p_domestic_ccy <> 'USD') then
2543 				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
2544 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy, p_domestic_ccy);
2545 				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_quote_usd,
2546 					   p_domestic_quote_usd);
2547 				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
2548     			elsif (p_domestic_ccy = 'USD' AND p_foreign_ccy <> 'USD') then
2549 				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
2550 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy, p_foreign_ccy);
2551 				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd,p_foreign_quote_usd);
2552 				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
2553     			elsif (p_foreign_ccy <> 'USD' AND p_domestic_ccy <> 'USD') then
2554     				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT','SPOT','SPOT');
2555     				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy,p_foreign_ccy,
2556 					p_domestic_ccy, p_domestic_ccy);
2557     				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd, p_foreign_quote_usd,
2558 				       	p_domestic_quote_usd,p_domestic_quote_usd);
2559     				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
2560     			end if;
2561 
2562 			p_rates_table := get_rates_from_base(p_rate_types, p_base_currencies,
2563 					 p_contra_currencies, p_quote_bases,
2564 					 p_interp_methods, p_data_sides,
2565 					 p_day_count_bases,p_interest_quote,
2566 					 p_currency_quote,p_spot_date,
2567 					 p_exp_date);
2568 
2569 			if (p_foreign_ccy = 'USD' AND p_domestic_ccy <> 'USD') then
2570 				p_for_spot_rate_bid := 1;
2571 				p_for_spot_rate_ask := 1;
2572     				p_dom_spot_rate_bid := p_rates_table(1);
2573     				p_dom_spot_rate_ask := p_rates_table(2);
2574     			elsif (p_domestic_ccy = 'USD' AND p_foreign_ccy <> 'USD') then
2575 				p_for_spot_rate_bid := p_rates_table(1);
2576 				p_for_spot_rate_ask := p_rates_table(2);
2577 				p_dom_spot_rate_bid := 1;
2578 				p_dom_spot_rate_ask := 1;
2579     			elsif (p_neither_usd) then
2580 				p_for_spot_rate_bid := p_rates_table(1);
2581 				p_for_spot_rate_ask := p_rates_table(2);
2582     				p_dom_spot_rate_bid := p_rates_table(3);
2583     				p_dom_spot_rate_ask := p_rates_table(4);
2584     			end if;
2585 
2586 
2587 
2588 
2589 			  -- now do Interest Rates
2590     			p_rate_types.delete;
2591     			p_base_currencies.delete;
2592     			p_data_sides.delete;
2593     			p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT','DEFAULT',
2594 					  'DEFAULT','DEFAULT');
2595     			p_quote_bases := null;
2596     			p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD','YIELD','YIELD','YIELD');
2597     			p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy, p_foreign_ccy,
2598 					   p_domestic_ccy, p_domestic_ccy);
2599     			p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
2603 
2600     			p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE('ACTUAL365', 'ACTUAL365',
2601 					   'ACTUAL365',
2602 					   'ACTUAL365');  -- bug 3611158
2604 
2605 
2606 			--Call to get interest rates
2607     			p_rates_table := get_rates_from_base(p_rate_types, p_base_currencies,
2608 					 p_contra_currencies, p_quote_bases,
2609 					 p_interp_methods, p_data_sides,
2610 					 p_day_count_bases,p_interest_quote,
2611 					 p_currency_quote,p_spot_date,
2612 					 p_exp_date);
2613     			p_for_int_rate_bid := p_rates_table(1);
2614     			p_for_int_rate_ask := p_rates_table(2);
2615     			p_dom_int_rate_bid := p_rates_table(3);
2616 			p_dom_int_rate_ask := p_rates_table(4);
2617 
2618 
2619 			--Values set to be passed back as default used
2620 			p_domestic_day_count:='ACTUAL365';
2621 			p_foreign_day_count:='ACTUAL365';
2622 
2623 
2624 
2625   			IF (g_proc_level>=g_debug_level) THEN
2626   			   xtr_risk_debug_pkg.dpop('fxo_calculator: ' || 'Calculation Based On Defaults');
2627   			END IF;
2628 
2629 
2630 
2631 		--Optional Curve Data
2632 		ELSIF (p_indicator = 'C') THEN
2633 			IF (g_proc_level>=g_debug_level) THEN
2634 			   xtr_risk_debug_pkg.dpush('fxo_calculator: ' || 'Calculation Based On Curves');
2635 			END IF;
2636 		    	-- GET DEFAULT CURVES
2637 
2638 
2639 			--If all curves are not input, defaults are gotten
2640 			if (p_foreign_curve IS null) then
2641 				p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2642 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
2643         			p_curve_codes := get_curves_from_base(p_curve_types,
2644 					      p_base_currencies,
2645 					      p_contra_currencies);
2646 				p_foreign_curve := p_curve_codes(1);
2647      			end if;
2648      			if (p_domestic_curve IS null) then
2649 				p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2650 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
2651         			p_curve_codes := get_curves_from_base(p_curve_types,
2652 					      p_base_currencies,
2653 					      p_contra_currencies);
2654 				p_domestic_curve := p_curve_codes(1);
2655     			end if;
2656 
2657   			-- GET DEFAULT RATES based on CURVES
2658     			-- first do SPOT RATES
2659 
2660 
2661 			--curve codes are null on spot rates
2662  			p_curve_codes := null;
2663     			p_base_currencies := null;
2664 		    	-- calculate Rates
2665 			-- this follows the calculator table across each row
2666         		-- first do Spot Rates
2667 			p_quote_bases:=GET_SPOT_QUOTATION_BASIS(p_foreign_ccy, p_domestic_ccy, p_ow_spot_rates);
2668 			p_foreign_quote_usd:= p_quote_bases(1);
2669 			p_domestic_quote_usd:= p_quote_bases(2);
2670 
2671     			if (p_foreign_ccy = 'USD' AND p_domestic_ccy <> 'USD') then
2672 				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
2673 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy, p_domestic_ccy);
2674 				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_quote_usd,
2675 					   p_domestic_quote_usd);
2676 				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
2677     			elsif (p_domestic_ccy = 'USD' AND p_foreign_ccy <> 'USD') then
2678 				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
2679 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy, p_foreign_ccy);
2680 				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd,p_foreign_quote_usd);
2681 				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
2682     			elsif (p_foreign_ccy <> 'USD' AND p_domestic_ccy <> 'USD') then
2683     				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT','SPOT','SPOT');
2684     				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy,p_foreign_ccy,
2685 					p_domestic_ccy, p_domestic_ccy);
2686     				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd, p_foreign_quote_usd,
2687 				       	p_domestic_quote_usd,p_domestic_quote_usd);
2688     				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
2689     			end if;
2690 
2691 
2692 			--Gets spot rates
2693 			p_rates_table := get_rates_from_curves(p_rate_types, p_curve_codes, p_base_currencies,
2694 					 p_contra_currencies, p_quote_bases,
2695 					 p_interp_methods, p_data_sides,
2696 					 p_day_count_bases,p_interest_quote,
2697 					 p_currency_quote,p_spot_date,
2698 					 p_exp_date);
2699 
2700 			if (p_foreign_ccy = 'USD' AND p_domestic_ccy <> 'USD') then
2701 				p_for_spot_rate_bid := 1;
2702 				p_for_spot_rate_ask := 1;
2703     				p_dom_spot_rate_bid := p_rates_table(1);
2704     				p_dom_spot_rate_ask := p_rates_table(2);
2705     			elsif (p_domestic_ccy = 'USD' AND p_foreign_ccy <> 'USD') then
2706 				p_for_spot_rate_bid := p_rates_table(1);
2707 				p_for_spot_rate_ask := p_rates_table(2);
2708 				p_dom_spot_rate_bid := 1;
2709 				p_dom_spot_rate_ask := 1;
2710     			elsif (p_neither_usd) then
2711 				p_for_spot_rate_bid := p_rates_table(1);
2712 				p_for_spot_rate_ask := p_rates_table(2);
2713     				p_dom_spot_rate_bid := p_rates_table(3);
2714     				p_dom_spot_rate_ask := p_rates_table(4);
2715     			end if;
2716 
2717 
2718 
2719 
2720 			  -- now get INTEREST RATES
2721     			p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD','YIELD','YIELD','YIELD');
2722     			p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_curve,p_foreign_curve,
2723 				       p_domestic_curve,p_domestic_curve);
2724     			p_base_currencies.delete;
2728 				p_foreign_interpolation, p_domestic_interpolation, p_domestic_interpolation);
2725     			p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy,p_foreign_ccy,
2726 					   p_domestic_ccy,p_domestic_ccy);
2727     			p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_interpolation,
2729 
2730     			p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
2731     			p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE('ACTUAL365',
2732 			    'ACTUAL365','ACTUAL365','ACTUAL365');
2733     			p_quote_bases := null;
2734 
2735     			p_rates_table := get_rates_from_curves(p_rate_types,p_curve_codes,
2736 					   p_base_currencies,
2737 					   p_contra_currencies,
2738 					   p_quote_bases,p_interp_methods,
2739 					   p_data_sides,p_day_count_bases,
2740 					   p_interest_quote,p_currency_quote,
2741 					   p_spot_date,
2742 					   p_exp_date);
2743     			p_for_int_rate_bid := p_rates_table(1);
2744     			p_for_int_rate_ask := p_rates_table(2);
2745     			p_dom_int_rate_bid := p_rates_table(3);
2746     			p_dom_int_rate_ask := p_rates_table(4);
2747 
2748 
2749 			--Values set to be passed back as default used
2750 			p_domestic_day_count:='ACTUAL365';  -- bug 3611158
2751 			p_foreign_day_count:='ACTUAL365';
2752 
2753   			IF (g_proc_level>=g_debug_level) THEN
2754   			   xtr_risk_debug_pkg.dpop('fxo_calculator: ' || 'Calculation Based On Curves');
2755   			END IF;
2756 
2757 
2758 
2759 
2760 
2761 
2762 		--Optional Rates Data
2763 		ELSIF (p_indicator = 'R') THEN
2764 			IF (g_proc_level>=g_debug_level) THEN
2765 			   xtr_risk_debug_pkg.dpush('fxo_calculator: ' || 'Calculation Based On Rates');
2766 			END IF;
2767      			-- if a spot rate is missing, go to base(defaults) section
2768      			if (p_for_spot_rate_bid IS null) then
2769 				if (p_foreign_ccy <> 'USD') then
2770 	    				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
2771 	    				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
2772 	    				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd);
2773 	    				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
2774     	    				p_rates_table := get_rates_from_curves(p_rate_types,
2775 						p_curve_codes,
2776 						p_base_currencies,
2777 					   	p_contra_currencies,
2778 						p_quote_bases,
2779 						p_interp_methods,
2780 					   	p_data_sides,
2781 						p_day_count_bases,
2782 						p_interest_quote,
2783 					   	p_currency_quote,
2784 					   	p_spot_date, p_exp_date);
2785     	    				p_for_spot_rate_bid := p_rates_table(1);
2786 				else
2787 	    				p_for_spot_rate_bid := 1;
2788 				end if;
2789 			-- get corresponding base ccy curve
2790      			end if;
2791      			if (p_for_spot_rate_ask IS null) then
2792 				if (p_foreign_ccy <> 'USD') then
2793 	    				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
2794 	    				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
2795 	    				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd);
2796 	    				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
2797     	    				p_rates_table := get_rates_from_curves(p_rate_types,
2798 						p_curve_codes,
2799 						p_base_currencies,
2800 					   	p_contra_currencies,
2801 						p_quote_bases,
2802 						p_interp_methods,
2803 					   	p_data_sides,
2804 						p_day_count_bases,
2805 						p_interest_quote,
2806 					   	p_currency_quote,
2807 					   	p_spot_date, p_exp_date);
2808     	    				p_for_spot_rate_ask := p_rates_table(1);
2809 				else
2810 	    				p_for_spot_rate_ask := 1;
2811 				end if;
2812      			end if;
2813      			if (p_dom_spot_rate_bid IS null) then
2814 				if (p_domestic_ccy <> 'USD') then
2815 	    				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
2816 	    				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
2817 	    				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_quote_usd);
2818 	    				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
2819     	    				p_rates_table := get_rates_from_curves(p_rate_types,
2820 						p_curve_codes,
2821 						p_base_currencies,
2822 					   	p_contra_currencies,
2823 						p_quote_bases,
2824 						p_interp_methods,
2825 					   	p_data_sides,
2826 						p_day_count_bases,
2827 						p_interest_quote,
2828 					   	p_currency_quote,
2829 					   	p_spot_date, p_exp_date);
2830     	    				p_dom_spot_rate_bid := p_rates_table(1);
2831 				else
2832 	    				p_dom_spot_rate_bid := 1;
2833 				end if;
2834      			end if;
2835      			if (p_dom_spot_rate_ask IS null) then
2836 				if (p_dom_spot_rate_ask <> 'USD') then
2837 	    				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
2838 	    				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
2839 	    				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_quote_usd);
2840 	    				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
2841     	    				p_rates_table := get_rates_from_curves(p_rate_types,
2842 						p_curve_codes,
2843 						p_base_currencies,
2844 					   	p_contra_currencies,
2845 						p_quote_bases,
2846 						p_interp_methods,
2847 					   	p_data_sides,
2848 						p_day_count_bases,
2849 						p_interest_quote,
2850 					   	p_currency_quote,
2851 					   	p_spot_date, p_exp_date);
2852     	   				p_dom_spot_rate_ask := p_rates_table(1);
2853 				else
2854 	    				p_dom_spot_rate_ask := 1;
2855 				end if;
2856      			end if;
2857 
2861      			if (p_for_int_rate_bid IS null) then
2858  		   	-- if INTEREST RATES are missing, first check if curve section is filled
2859      			-- if so, use curve;
2860      			-- else, go to base(defaults) section and default curve in curves section
2862 				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2863 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
2864  				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
2865 				p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_day_count);
2866 				-- if curve section is null, go to defaults
2867 				if (p_foreign_curve IS null) then
2868 	    				p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2869 	    				p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
2870 	    				p_curve_codes := get_curves_from_base(p_curve_types,
2871 					      p_base_currencies,
2872 					      p_contra_currencies);
2873 	   				-- default curves section
2874 	   				p_foreign_curve := p_curve_codes(1);
2875 	   				p_foreign_interpolation := p_interp_methods(1);
2876 				else
2877 					-- curve section not null, use curve
2878 	    				p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_curve);
2879 	    				p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_interpolation);
2880 				end if;
2881 				-- calculate rate
2882 	    			p_rates_table := get_rates_from_curves(p_rate_types,
2883 					p_curve_codes,p_base_currencies,p_contra_currencies,
2884 					p_quote_bases,p_interp_methods,p_data_sides,
2885 					p_day_count_bases,p_interest_quote,p_currency_quote,
2886 					p_spot_date,p_exp_date);
2887 					p_for_int_rate_bid := p_rates_table(1);
2888 				IF (g_proc_level>=g_debug_level) THEN
2889 				   xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'defaulted foreign bid rate',p_for_int_rate_bid);
2890 				END IF;
2891      			end if;
2892 
2893 			if (p_for_int_rate_ask IS null) then
2894 				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2895 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
2896  				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
2897 				p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_day_count);
2898 				-- if curve section is null, go to defaults
2899 				if (p_foreign_curve IS null) then
2900 	    				p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2901 	    				p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
2902 	    				p_curve_codes := get_curves_from_base(p_curve_types,
2903 					      p_base_currencies,
2904 					      p_contra_currencies);
2905 	   				-- default curves section
2906 	   				p_foreign_curve := p_curve_codes(1);
2907 	   				p_foreign_interpolation := p_interp_methods(1);
2908 				else
2909 					-- curve section not null, use curve
2910 	    				p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_curve);
2911 	    				p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_interpolation);
2912 				end if;
2913 				-- calculate rate
2914 	    			p_rates_table := get_rates_from_curves(p_rate_types,
2915 					p_curve_codes,p_base_currencies,p_contra_currencies,
2916 					p_quote_bases,p_interp_methods,p_data_sides,
2917 					p_day_count_bases,p_interest_quote,p_currency_quote,
2918 					p_spot_date,p_exp_date);
2919 					p_for_int_rate_ask := p_rates_table(1);
2920 				IF (g_proc_level>=g_debug_level) THEN
2921 				   xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'defaulted foreign ask rate',p_for_int_rate_ask);
2922 				END IF;
2923      			end if;
2924 			if (p_dom_int_rate_bid IS null) then
2925 				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2926 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
2927  				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
2928 				p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_day_count);
2929 				-- if curve section is null, go to defaults
2930 				if (p_domestic_curve IS null) then
2931 	    				p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2932 	    				p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
2933 	    				p_curve_codes := get_curves_from_base(p_curve_types,
2934 					      p_base_currencies,
2935 					      p_contra_currencies);
2936 	   				-- default curves section
2937 	   				p_domestic_curve := p_curve_codes(1);
2938 	   				p_domestic_interpolation := p_interp_methods(1);
2939 				else
2940 					-- curve section not null, use curve
2941 	    				p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_curve);
2942 	    				p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_interpolation);
2943 				end if;
2944 				-- calculate rate
2945 	    			p_rates_table := get_rates_from_curves(p_rate_types,
2946 					p_curve_codes,p_base_currencies,p_contra_currencies,
2947 					p_quote_bases,p_interp_methods,p_data_sides,
2948 					p_day_count_bases,p_interest_quote,p_currency_quote,
2949 					p_spot_date,p_exp_date);
2950 					p_dom_int_rate_bid := p_rates_table(1);
2951 				IF (g_proc_level>=g_debug_level) THEN
2952 				   xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'defaulted domestic bid rate',p_dom_int_rate_bid);
2953 				END IF;
2954      			end if;
2955 			if (p_dom_int_rate_ask IS null) then
2956 				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2957 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
2958  				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
2959 				p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_day_count);
2960 				-- if curve section is null, go to defaults
2961 				if (p_domestic_curve IS null) then
2962 	    				p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2963 	    				p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
2964 	    				p_curve_codes := get_curves_from_base(p_curve_types,
2965 					      p_base_currencies,
2969 	   				p_domestic_interpolation := p_interp_methods(1);
2966 					      p_contra_currencies);
2967 	   				-- default curves section
2968 	   				p_domestic_curve := p_curve_codes(1);
2970 				else
2971 					-- curve section not null, use curve
2972 	    				p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_curve);
2973 	    				p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_interpolation);
2974 				end if;
2975 				-- calculate rate
2976 	    			p_rates_table := get_rates_from_curves(p_rate_types,
2977 					p_curve_codes,p_base_currencies,p_contra_currencies,
2978 					p_quote_bases,p_interp_methods,p_data_sides,
2979 					p_day_count_bases,p_interest_quote,p_currency_quote,
2980 					p_spot_date,p_exp_date);
2981 					p_dom_int_rate_ask := p_rates_table(1);
2982 				IF (g_proc_level>=g_debug_level) THEN
2983 				   xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'defaulted domestic ask rate',p_dom_int_rate_bid);
2984 				END IF;
2985      			end if;
2986 
2987 
2988 
2989 
2990   		IF (g_proc_level>=g_debug_level) THEN
2991   		   xtr_risk_debug_pkg.dpop('fxo_calculator: ' || 'Calculation Based On Rates');
2992   		END IF;
2993 
2994 
2995 		END IF;
2996 		p_day_count_bases:=SYSTEM.QRM_VARCHAR_TABLE(p_domestic_day_count, p_foreign_day_count);
2997 
2998 		--Interest rates needed to calculate implied volatility.  Need to verify which
2999 		--side we want bid and ask on.
3000 
3001 
3002 		--Gets Spot rate
3003 		if (p_domestic_ccy = 'USD') THEN
3004 			p_spot_rates:=XTR_FX_FORMULAS.FX_SPOT_RATE_CV(p_domestic_ccy, p_foreign_ccy,
3005 				p_dom_spot_rate_bid, p_dom_spot_rate_ask, p_for_spot_rate_bid,
3006 				p_for_spot_rate_ask, 'C', p_foreign_quote_usd);
3007 		elsif (p_foreign_ccy = 'USD') THEN
3008 			p_spot_rates:=XTR_FX_FORMULAS.FX_SPOT_RATE_CV(p_domestic_ccy, p_foreign_ccy,
3009 				p_dom_spot_rate_bid, p_dom_spot_rate_ask, p_for_spot_rate_bid,
3010 				p_for_spot_rate_ask, p_domestic_quote_usd, 'C');
3011 		else
3012 			p_spot_rates:=XTR_FX_FORMULAS.FX_SPOT_RATE_CV(p_domestic_ccy, p_foreign_ccy,
3013 				p_dom_spot_rate_bid, p_dom_spot_rate_ask, p_for_spot_rate_bid,
3014 				p_for_spot_rate_ask, p_domestic_quote_usd, p_foreign_quote_usd);
3015 		end if;
3016 
3017 
3018 
3019 
3020 
3021 
3022 		if (p_implied_vol_call_put = 'BUYCALL') THEN
3023 			p_interest_rates:=xtr_md_num_table(p_dom_int_rate_ask, p_for_int_rate_bid);
3024 			p_spot_rate:=p_spot_rates(2);
3025 			p_option_indicator:='C';
3026 		elsif (p_implied_vol_call_put = 'BUYPUT') THEN
3027 			p_interest_rates:=xtr_md_num_table(p_dom_int_rate_bid, p_for_int_rate_ask);
3028 			p_spot_rate:=p_spot_rates(1);
3029 			p_option_indicator:='P';
3030 		elsif (p_implied_vol_call_put = 'SELLCALL') THEN
3031 			p_interest_rates:=xtr_md_num_table(p_dom_int_rate_bid, p_for_int_rate_ask);
3032 			p_spot_rate:=p_spot_rates(1);
3033 			p_option_indicator:='C';
3034 		elsif (p_implied_vol_call_put = 'SELLPUT') THEN
3035 			p_interest_rates:=xtr_md_num_table(p_dom_int_rate_ask, p_for_int_rate_bid);
3036 			p_spot_rate:=p_spot_rates(2);
3037 			p_option_indicator:='P';
3038 		END IF;
3039 
3040 		-- sets up rate type for calculate_implied_volatility ('S' for simple)
3041 		p_rate_types:= SYSTEM.QRM_VARCHAR_TABLE(p_rate_type, p_rate_type);
3042 
3043 
3044 		--Must give dummy values to compound freq
3045 		p_compound_freq:=XTR_MD_NUM_TABLE(1, 1);
3046 
3047 
3048 
3049 
3050 
3051 		p_res_impl_vol := QRM_MM_FORMULAS.calculate_implied_volatility('FXO', p_spot_date, p_exp_date, p_interest_rates, p_day_count_bases, p_rate_types, p_compound_freq, p_spot_rate, p_strike_price, p_implied_vol_price, p_option_indicator, null, null);
3052 
3053 
3054 
3055 		p_vol_ask:=p_res_impl_vol;
3056 		p_vol_bid:=p_res_impl_vol;
3057 
3058 
3059 		p_volatility:= p_res_impl_vol;
3060 
3061 	ELSIF (p_calc_type_indicator = 'P') THEN
3062 		--Default Curve Data
3063 		IF (p_indicator = 'D') THEN
3064 
3065 			IF (g_proc_level>=g_debug_level) THEN
3066 			   xtr_risk_debug_pkg.dpush('fxo_calculator: ' || 'Calculation Based On Defaults');
3067 			END IF;
3068 
3069 			p_volatility_curve:='';
3070 			--Only want to set volatility curve if volatility has not been input
3071 			if (p_volatility IS null) THEN
3072 				p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD','YIELD', 'FXVOL');
3073     				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy,p_domestic_ccy, p_foreign_ccy);
3074 				p_contra_currencies:= SYSTEM.QRM_VARCHAR_TABLE(null, null, p_domestic_ccy);
3075     				p_interp_methods:= SYSTEM.QRM_VARCHAR_TABLE('DEFAULT','DEFAULT', 'DEFAULT');
3076 				p_curve_codes := get_curves_from_base(p_curve_types,p_base_currencies,
3077 						p_contra_currencies);
3078 
3079 				p_foreign_curve := p_curve_codes(1);
3080     				p_domestic_curve := p_curve_codes(2);
3081 				p_volatility_curve := p_curve_codes(3);
3082 			else
3083 				p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD','YIELD');
3084     				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy,p_domestic_ccy);
3085 				p_contra_currencies:= SYSTEM.QRM_VARCHAR_TABLE(null, null);
3086     				p_interp_methods:= SYSTEM.QRM_VARCHAR_TABLE('DEFAULT','DEFAULT');
3087 				p_curve_codes := get_curves_from_base(p_curve_types,p_base_currencies,
3088 						p_contra_currencies);
3089 
3090 				p_foreign_curve := p_curve_codes(1);
3091     				p_domestic_curve := p_curve_codes(2);
3092 			end if;
3093 
3094 
3095 			IF (g_proc_level>=g_debug_level) THEN
3099 			END IF;
3096 			   xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'foreign curve', p_foreign_curve);
3097     			   xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'domestic curve', p_domestic_curve);
3098 			   xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'volatility curve', p_volatility_curve);
3100 
3101 			  -- since 'Calculate Using Defaults' was pressed, use default interpol.
3102     			p_foreign_interpolation := 'DEFAULT';
3103     			p_domestic_interpolation := 'DEFAULT';
3104 			p_volatility_interpolation:= 'DEFAULT';
3105 
3106     			-- assume interest rate quote to be bid/ask;
3107     			p_interest_quote := 'BID/ASK';
3108 
3109 		    	-- calculate Rates
3110 			-- this follows the calculator table across each row
3111         		-- first do Spot Rates
3112     			p_quote_bases:=GET_SPOT_QUOTATION_BASIS(p_foreign_ccy, p_domestic_ccy, p_ow_spot_rates);
3113 			p_foreign_quote_usd:= p_quote_bases(1);
3114 			p_domestic_quote_usd:= p_quote_bases(2);
3115 
3116 			if (p_foreign_ccy = 'USD' AND p_domestic_ccy <> 'USD') then
3117 				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
3118 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy, p_domestic_ccy);
3119 				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_quote_usd,
3120 					   p_domestic_quote_usd);
3121 				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
3122 				p_interp_methods:=SYSTEM.QRM_VARCHAR_TABLE('DEFAULT', 'DEFAULT');
3123 				p_contra_currencies:=SYSTEM.QRM_VARCHAR_TABLE(null, null);
3124     			elsif (p_domestic_ccy = 'USD' AND p_foreign_ccy <> 'USD') then
3125 				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
3126 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy, p_foreign_ccy);
3127 				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd,p_foreign_quote_usd);
3128 				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
3129 				p_interp_methods:=SYSTEM.QRM_VARCHAR_TABLE('DEFAULT', 'DEFAULT');
3130 				p_contra_currencies:=SYSTEM.QRM_VARCHAR_TABLE(null, null);
3131     			elsif (p_foreign_ccy <> 'USD' AND p_domestic_ccy <> 'USD') then
3132     				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT','SPOT','SPOT');
3133     				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy,p_foreign_ccy,
3134 					p_domestic_ccy, p_domestic_ccy);
3135     				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd, p_foreign_quote_usd,
3136 				       	p_domestic_quote_usd,p_domestic_quote_usd);
3137     				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
3138 				p_interp_methods:=SYSTEM.QRM_VARCHAR_TABLE('DEFAULT', 'DEFAULT', 'DEFAULT', 'DEFAULT');
3139 				p_contra_currencies:=SYSTEM.QRM_VARCHAR_TABLE(null, null, null, null);
3140     			end if;
3141 
3142 
3143 			p_rates_table := get_rates_from_base(p_rate_types, p_base_currencies,
3144 					 p_contra_currencies, p_quote_bases,
3145 					 p_interp_methods, p_data_sides,
3146 					 p_day_count_bases,p_interest_quote,
3147 					 p_currency_quote,p_spot_date,
3148 					 p_exp_date);
3149 
3150 			if (p_foreign_ccy = 'USD' AND p_domestic_ccy <> 'USD') then
3151 				p_for_spot_rate_bid := 1;
3152 				p_for_spot_rate_ask := 1;
3153     				p_dom_spot_rate_bid := p_rates_table(1);
3154     				p_dom_spot_rate_ask := p_rates_table(2);
3155     			elsif (p_domestic_ccy = 'USD' AND p_foreign_ccy <> 'USD') then
3156 				p_for_spot_rate_bid := p_rates_table(1);
3157 				p_for_spot_rate_ask := p_rates_table(2);
3158 				p_dom_spot_rate_bid := 1;
3159 				p_dom_spot_rate_ask := 1;
3160     			elsif (p_neither_usd) then
3161 				p_for_spot_rate_bid := p_rates_table(1);
3162 				p_for_spot_rate_ask := p_rates_table(2);
3163     				p_dom_spot_rate_bid := p_rates_table(3);
3164     				p_dom_spot_rate_ask := p_rates_table(4);
3165     			end if;
3166 
3167 
3168 
3169 
3170 			  -- now do Interest Rates
3171     			p_rate_types.delete;
3172     			p_base_currencies.delete;
3173     			p_data_sides.delete;
3174     			p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT','DEFAULT',
3175 					  'DEFAULT','DEFAULT');
3176     			p_quote_bases := null;
3177     			p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD','YIELD','YIELD','YIELD');
3178     			p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy, p_foreign_ccy,
3179 					   p_domestic_ccy, p_domestic_ccy);
3180     			p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
3181     			p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE('ACTUAL365',
3182 					'ACTUAL365', 'ACTUAL365', 'ACTUAL365');
3183 
3184 			p_contra_currencies:=SYSTEM.QRM_VARCHAR_TABLE(null, null, null, null);
3185 
3186 			--Call to get interest rates
3187     			p_rates_table := get_rates_from_base(p_rate_types, p_base_currencies,
3188 					 p_contra_currencies, p_quote_bases,
3189 					 p_interp_methods, p_data_sides,
3190 					 p_day_count_bases,p_interest_quote,
3191 					 p_currency_quote,p_spot_date,
3192 					 p_exp_date);
3193     			p_for_int_rate_bid := p_rates_table(1);
3194     			p_for_int_rate_ask := p_rates_table(2);
3195     			p_dom_int_rate_bid := p_rates_table(3);
3196 			p_dom_int_rate_ask := p_rates_table(4);
3197 
3198 
3199 
3200 			--Call to get implied volatility from curve if needed
3201 			if (p_volatility IS null) THEN
3202 				p_rate_types.delete;
3203     				p_base_currencies.delete;
3204     				p_data_sides.delete;
3205 				p_contra_currencies.delete;
3206 				p_interp_methods:= SYSTEM.QRM_VARCHAR_TABLE('DEFAULT','DEFAULT');
3207 				p_rate_types:=SYSTEM.QRM_VARCHAR_TABLE('FXVOL', 'FXVOL');
3208 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy, p_foreign_ccy);
3212 				   'ACTUAL365');
3209 				p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy, p_domestic_ccy);
3210 				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID', 'ASK');
3211 				p_day_count_bases:=SYSTEM.QRM_VARCHAR_TABLE('ACTUAL365',
3213 
3214 
3215 			--Call to get volatility values
3216 				p_rates_table := get_rates_from_base(p_rate_types, p_base_currencies,
3217 					 p_contra_currencies, p_quote_bases,
3218 					 p_interp_methods, p_data_sides,
3219 					 p_day_count_bases,p_interest_quote,
3220 					 p_currency_quote,p_spot_date,
3221 					 p_exp_date);
3222 				p_vol_bid:= p_rates_table(1);
3223 				p_volatility:=p_rates_table(1);
3224 				p_vol_ask:= p_rates_table(2);
3225 
3226 			else
3227 				p_vol_bid:=p_volatility;
3228 				p_vol_ask:=p_volatility;
3229 			end if;
3230 
3231 			--Values set to be passed back as default used
3232 			p_domestic_day_count:='ACTUAL365';
3233 			p_foreign_day_count:='ACTUAL365';
3234 
3235 
3236   			IF (g_proc_level>=g_debug_level) THEN
3237   			   xtr_risk_debug_pkg.dpop('fxo_calculator: ' || 'Calculation Based On Defaults');
3238   			END IF;
3239 
3240 
3241 
3242 
3243 
3244 
3245 
3246 
3247 
3248 		--Optional Curve Data
3249 		ELSIF (p_indicator = 'C') THEN
3250 			IF (g_proc_level>=g_debug_level) THEN
3251 			   xtr_risk_debug_pkg.dpush('fxo_calculator: ' || 'Calculation Based On Curves');
3252 			END IF;
3253 		    	-- GET DEFAULT CURVES
3254 
3255 			--need dummy table of contra currencies
3256 			p_contra_currencies:= SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3257 			--If all curves are not input, defaults are gotten
3258 			if (p_foreign_curve IS null) then
3259 				p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
3260 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
3261 				p_curve_codes := get_curves_from_base(p_curve_types,
3262 					      p_base_currencies,
3263 					      p_contra_currencies);
3264 				p_foreign_curve := p_curve_codes(1);
3265      			end if;
3266      			if (p_domestic_curve IS null) then
3267 				p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
3268 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
3269         			p_curve_codes := get_curves_from_base(p_curve_types,
3270 					      p_base_currencies,
3271 					      p_contra_currencies);
3272 				p_domestic_curve := p_curve_codes(1);
3273 			end if;
3274     			if (p_volatility_curve IS null AND p_volatility IS null) then
3275 				p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('FXVOL');
3276 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
3277 				p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
3278 				p_curve_codes := get_curves_from_base(p_curve_types,
3279 						p_base_currencies,
3280 						p_contra_currencies);
3281 				p_volatility_curve := p_curve_codes(1);
3282 
3283 			end if;
3284 
3285   			-- GET DEFAULT RATES based on CURVES
3286     			-- first do SPOT RATES
3287 			p_quote_bases:=GET_SPOT_QUOTATION_BASIS(p_foreign_ccy, p_domestic_ccy, p_ow_spot_rates);
3288 			p_foreign_quote_usd:= p_quote_bases(1);
3289 			p_domestic_quote_usd:= p_quote_bases(2);
3290 
3291 
3292 			--curve codes are null on spot rates
3293  			p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE('DUMMY', 'DUMMY');
3294     			p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE('DUMMY', 'DUMMY');
3295 			p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT', 'DEFAULT');
3296 			p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE('DUMMY', 'DUMMY');
3297 		    	-- calculate Rates
3298 			-- this follows the calculator table across each row
3299         		-- first do Spot Rates
3300     			if (p_foreign_ccy = 'USD' AND p_domestic_ccy <> 'USD') then
3301 				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
3302 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy, p_domestic_ccy);
3303 				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_quote_usd,
3304 					   p_domestic_quote_usd);
3305 				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
3306     			elsif (p_domestic_ccy = 'USD' AND p_foreign_ccy <> 'USD') then
3307 				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
3308 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy, p_foreign_ccy);
3309 				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd,p_foreign_quote_usd);
3310 				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
3311     			elsif (p_foreign_ccy <> 'USD' AND p_domestic_ccy <> 'USD') then
3312 				p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE('DUMMY', 'DUMMY', 'DUMMY', 'DUMMY');
3313     				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT','SPOT','SPOT');
3314     				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy,p_foreign_ccy,
3315 					p_domestic_ccy, p_domestic_ccy);
3316     				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd, p_foreign_quote_usd,
3317 				       	p_domestic_quote_usd,p_domestic_quote_usd);
3318     				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
3319 				p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE('DUMMY', 'DUMMY', 'DUMMY', 'DUMMY');
3320     				p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE('DUMMY', 'DUMMY', 'DUMMY', 'DUMMY');
3321 				p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT', 'DEFAULT', 'DEFAULT', 'DEFAULT');
3322     			end if;
3323 
3324 
3325 			--Gets spot rates
3326 			p_rates_table := get_rates_from_curves(p_rate_types, p_curve_codes, p_base_currencies,
3327 					 p_contra_currencies, p_quote_bases,
3328 					 p_interp_methods, p_data_sides,
3329 					 p_day_count_bases,p_interest_quote,
3333 			if (p_foreign_ccy = 'USD' AND p_domestic_ccy <> 'USD') then
3330 					 p_currency_quote,p_spot_date,
3331 					 p_exp_date);
3332 
3334 				p_for_spot_rate_bid := 1;
3335 				p_for_spot_rate_ask := 1;
3336     				p_dom_spot_rate_bid := p_rates_table(1);
3337     				p_dom_spot_rate_ask := p_rates_table(2);
3338     			elsif (p_domestic_ccy = 'USD' AND p_foreign_ccy <> 'USD') then
3339 				p_for_spot_rate_bid := p_rates_table(1);
3340 				p_for_spot_rate_ask := p_rates_table(2);
3341 				p_dom_spot_rate_bid := 1;
3342 				p_dom_spot_rate_ask := 1;
3343     			elsif (p_neither_usd) then
3344 				p_for_spot_rate_bid := p_rates_table(1);
3345 				p_for_spot_rate_ask := p_rates_table(2);
3346     				p_dom_spot_rate_bid := p_rates_table(3);
3347     				p_dom_spot_rate_ask := p_rates_table(4);
3348     			end if;
3349 
3350 
3351 
3352 
3353 			  -- now get INTEREST RATES
3354     			p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD','YIELD','YIELD','YIELD');
3355     			p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_curve,p_foreign_curve,
3356 				       p_domestic_curve,p_domestic_curve);
3357     			p_base_currencies.delete;
3358     			p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy,p_foreign_ccy,
3359 					   p_domestic_ccy,p_domestic_ccy);
3360     			p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_interpolation,
3361 				p_foreign_interpolation, p_domestic_interpolation, p_domestic_interpolation);
3362 
3363     			p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
3364     			p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE('ACTUAL365',
3365 				'ACTUAL365','ACTUAL365','ACTUAL365');
3366     			p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE('DUMMY', 'DUMMY', 'DUMMY', 'DUMMY');
3367 			p_contra_currencies:=SYSTEM.QRM_VARCHAR_TABLE('DUMMY', 'DUMMY', 'DUMMY', 'DUMMY');
3368 
3369     			p_rates_table := get_rates_from_curves(p_rate_types,p_curve_codes,
3370 					   p_base_currencies,
3371 					   p_contra_currencies,
3372 					   p_quote_bases,p_interp_methods,
3373 					   p_data_sides,p_day_count_bases,
3374 					   p_interest_quote,p_currency_quote,
3375 					   p_spot_date,
3376 					   p_exp_date);
3377     			p_for_int_rate_bid := p_rates_table(1);
3378     			p_for_int_rate_ask := p_rates_table(2);
3379     			p_dom_int_rate_bid := p_rates_table(3);
3380     			p_dom_int_rate_ask := p_rates_table(4);
3381 
3382 
3383 			--Call to get implied volatility from curve if needed
3384 			if (p_volatility_curve IS null) THEN
3385 				p_vol_bid:=p_volatility;
3386 				p_vol_ask:=p_volatility;
3387 
3388 
3389 			else
3390 
3391 				p_rate_types.delete;
3392     				p_base_currencies.delete;
3393     				p_data_sides.delete;
3394 				p_contra_currencies.delete;
3395 				p_interp_methods:= SYSTEM.QRM_VARCHAR_TABLE('DEFAULT','DEFAULT');
3396 				p_rate_types:=SYSTEM.QRM_VARCHAR_TABLE('FXVOL', 'FXVOL');
3397 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy, p_foreign_ccy);
3398 				p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy, p_domestic_ccy);
3399 				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID', 'ASK');
3400 				p_day_count_bases:=SYSTEM.QRM_VARCHAR_TABLE('30/360', '30/360');
3401 				p_curve_codes:=SYSTEM.QRM_VARCHAR_TABLE(p_volatility_curve, p_volatility_curve);
3402 				p_quote_bases:= SYSTEM.QRM_VARCHAR_TABLE('DUMMY', 'DUMMY');
3403 
3404 				--Call to get volatility values
3405 				p_rates_table := get_rates_from_curves(p_rate_types, p_curve_codes,
3406 					 p_base_currencies,
3407 					 p_contra_currencies, p_quote_bases,
3408 					 p_interp_methods, p_data_sides,
3409 					 p_day_count_bases,p_interest_quote,
3410 					 p_currency_quote,p_spot_date,
3411 					 p_exp_date);
3412 				p_vol_bid:= p_rates_table(1);
3413 				p_volatility:=p_rates_table(1);
3414 				p_vol_ask:= p_rates_table(2);
3415 			end if;
3416 
3417 			--Values set to be passed back as default used
3418 			p_domestic_day_count:='ACTUAL365';
3419 			p_foreign_day_count:='ACTUAL365';
3420 
3421 
3422   			IF (g_proc_level>=g_debug_level) THEN
3423   			   xtr_risk_debug_pkg.dpop('fxo_calculator: ' || 'Calculation Based On Curves');
3424   			END IF;
3425 
3426 
3427 
3428 
3429 
3430 		--Optional Rates Data
3431 		ELSIF (p_indicator = 'R') THEN
3432 			IF (g_proc_level>=g_debug_level) THEN
3433 			   xtr_risk_debug_pkg.dpush('fxo_calculator: ' || 'Calculation Based On Rates');
3434 			END IF;
3435      			-- if a spot rate is missing, go to base(defaults) section
3436      			p_curve_codes:=SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3437 			p_contra_currencies:=SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3438 			p_interp_methods:=SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3439 			if (p_for_spot_rate_bid IS null) then
3440 				if (p_foreign_ccy <> 'USD') then
3441 	    				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
3442 	    				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
3443 	    				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd);
3444 	    				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
3445     	    				p_rates_table := get_rates_from_curves(p_rate_types,
3446 						p_curve_codes,
3447 						p_base_currencies,
3448 					   	p_contra_currencies,
3449 						p_quote_bases,
3450 						p_interp_methods,
3451 					   	p_data_sides,
3452 						p_day_count_bases,
3453 						p_interest_quote,
3454 					   	p_currency_quote,
3455 					   	p_spot_date, p_exp_date);
3456     	    				p_for_spot_rate_bid := p_rates_table(1);
3460 			-- get corresponding base ccy curve
3457 				else
3458 	    				p_for_spot_rate_bid := 1;
3459 				end if;
3461      			end if;
3462      			if (p_for_spot_rate_ask IS null) then
3463 				if (p_foreign_ccy <> 'USD') then
3464 	    				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
3465 	    				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
3466 	    				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd);
3467 	    				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
3468     	    				p_rates_table := get_rates_from_curves(p_rate_types,
3469 						p_curve_codes,
3470 						p_base_currencies,
3471 					   	p_contra_currencies,
3472 						p_quote_bases,
3473 						p_interp_methods,
3474 					   	p_data_sides,
3475 						p_day_count_bases,
3476 						p_interest_quote,
3477 					   	p_currency_quote,
3478 					   	p_spot_date, p_exp_date);
3479     	    				p_for_spot_rate_ask := p_rates_table(1);
3480 				else
3481 	    				p_for_spot_rate_ask := 1;
3482 				end if;
3483      			end if;
3484      			if (p_dom_spot_rate_bid IS null) then
3485 				if (p_domestic_ccy <> 'USD') then
3486 	    				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
3487 	    				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
3488 	    				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_quote_usd);
3489 	    				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
3490     	    				p_rates_table := get_rates_from_curves(p_rate_types,
3491 						p_curve_codes,
3492 						p_base_currencies,
3493 					   	p_contra_currencies,
3494 						p_quote_bases,
3495 						p_interp_methods,
3496 					   	p_data_sides,
3497 						p_day_count_bases,
3498 						p_interest_quote,
3499 					   	p_currency_quote,
3500 					   	p_spot_date, p_exp_date);
3501     	    				p_dom_spot_rate_bid := p_rates_table(1);
3502 				else
3503 					p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
3504 	    				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
3505 	    				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd);
3506 	    				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
3507 	    				p_dom_spot_rate_bid := 1;
3508 				end if;
3509      			end if;
3510      			if (p_dom_spot_rate_ask IS null) then
3511 				if (p_domestic_ccy <> 'USD') then
3512 	    				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
3513 	    				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
3514 	    				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_quote_usd);
3515 	    				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
3516     	    				p_rates_table := get_rates_from_curves(p_rate_types,
3517 						p_curve_codes,
3518 						p_base_currencies,
3519 					   	p_contra_currencies,
3520 						p_quote_bases,
3521 						p_interp_methods,
3522 					   	p_data_sides,
3523 						p_day_count_bases,
3524 						p_interest_quote,
3525 					   	p_currency_quote,
3526 					   	p_spot_date, p_exp_date);
3527     	   				p_dom_spot_rate_ask := p_rates_table(1);
3528 				else
3529 					p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
3530 	    				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
3531 	    				p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd);
3532 	    				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
3533 	    				p_dom_spot_rate_ask := 1;
3534 				end if;
3535      			end if;
3536 
3537  		   	-- if INTEREST RATES are missing, first check if curve section is filled
3538      			-- if so, use curve;
3539      			-- else, go to base(defaults) section and default curve in curves section
3540      			if (p_for_int_rate_bid IS null) then
3541 				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
3542 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
3543 				p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3544 				p_quote_bases:= SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3545  				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
3546 				p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_day_count);
3547 				-- if curve section is null, go to defaults
3548 				if (p_foreign_curve IS null) then
3549 	    				p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
3550 	    				p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
3551 	    				p_curve_codes := get_curves_from_base(p_curve_types,
3552 					      p_base_currencies,
3553 					      p_contra_currencies);
3554 	   				-- default curves section
3555 	   				p_foreign_curve := p_curve_codes(1);
3556 	   				p_foreign_interpolation := p_interp_methods(1);
3557 				else
3558 					-- curve section not null, use curve
3559 	    				p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_curve);
3560 	    				p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_interpolation);
3561 				end if;
3562 				-- calculate rate
3563 	    			p_rates_table := get_rates_from_curves(p_rate_types,
3564 					p_curve_codes,p_base_currencies,p_contra_currencies,
3565 					p_quote_bases,p_interp_methods,p_data_sides,
3566 					p_day_count_bases,p_interest_quote,p_currency_quote,
3567 					p_spot_date,p_exp_date);
3568 				p_for_int_rate_bid := p_rates_table(1);
3569 				IF (g_proc_level>=g_debug_level) THEN
3570 				   xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'defaulted foreign bid rate',p_for_int_rate_bid);
3571 				END IF;
3572      			end if;
3573 
3574 			if (p_for_int_rate_ask IS null) then
3575 				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
3576 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
3580 				p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_day_count);
3577  				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
3578 				p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3579 				p_quote_bases:= SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3581 				-- if curve section is null, go to defaults
3582 				if (p_foreign_curve IS null) then
3583 	    				p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
3584 	    				p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
3585 	    				p_curve_codes := get_curves_from_base(p_curve_types,
3586 					      p_base_currencies,
3587 					      p_contra_currencies);
3588 	   				-- default curves section
3589 	   				p_foreign_curve := p_curve_codes(1);
3590 	   				p_foreign_interpolation := p_interp_methods(1);
3591 				else
3592 					-- curve section not null, use curve
3593 	    				p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_curve);
3594 	    				p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_interpolation);
3595 				end if;
3596 				-- calculate rate
3597 	    			p_rates_table := get_rates_from_curves(p_rate_types,
3598 					p_curve_codes,p_base_currencies,p_contra_currencies,
3599 					p_quote_bases,p_interp_methods,p_data_sides,
3600 					p_day_count_bases,p_interest_quote,p_currency_quote,
3601 					p_spot_date,p_exp_date);
3602 					p_for_int_rate_ask := p_rates_table(1);
3603 				IF (g_proc_level>=g_debug_level) THEN
3604 				   xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'defaulted foreign ask rate',p_for_int_rate_ask);
3605 				END IF;
3606      			end if;
3607 			if (p_dom_int_rate_bid IS null) then
3608 				p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3609 				p_quote_bases:= SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3610 				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
3611 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
3612  				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
3613 				p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_day_count);
3614 				-- if curve section is null, go to defaults
3615 				if (p_domestic_curve IS null) then
3616 	    				p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
3617 	    				p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
3618 	    				p_curve_codes := get_curves_from_base(p_curve_types,
3619 					      p_base_currencies,
3620 					      p_contra_currencies);
3621 	   				-- default curves section
3622 	   				p_domestic_curve := p_curve_codes(1);
3623 	   				p_domestic_interpolation := p_interp_methods(1);
3624 				else
3625 					-- curve section not null, use curve
3626 	    				p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_curve);
3627 	    				p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_interpolation);
3628 				end if;
3629 				-- calculate rate
3630 	    			p_rates_table := get_rates_from_curves(p_rate_types,
3631 					p_curve_codes,p_base_currencies,p_contra_currencies,
3632 					p_quote_bases,p_interp_methods,p_data_sides,
3633 					p_day_count_bases,p_interest_quote,p_currency_quote,
3634 					p_spot_date,p_exp_date);
3635 					p_dom_int_rate_bid := p_rates_table(1);
3636 				IF (g_proc_level>=g_debug_level) THEN
3637 				   xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'defaulted domestic bid rate',p_dom_int_rate_bid);
3638 				END IF;
3639      			end if;
3640 			if (p_dom_int_rate_ask IS null) then
3641 				p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3642 				p_quote_bases:= SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3643 				p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
3644 				p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
3645  				p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
3646 				p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_day_count);
3647 				-- if curve section is null, go to defaults
3648 				if (p_domestic_curve IS null) then
3649 	    				p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
3650 	    				p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
3651 	    				p_curve_codes := get_curves_from_base(p_curve_types,
3652 					      p_base_currencies,
3653 					      p_contra_currencies);
3654 	   				-- default curves section
3655 	   				p_domestic_curve := p_curve_codes(1);
3656 	   				p_domestic_interpolation := p_interp_methods(1);
3657 				else
3658 					-- curve section not null, use curve
3659 	    				p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_curve);
3660 	    				p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_interpolation);
3661 				end if;
3662 				-- calculate rate
3663 	    			p_rates_table := get_rates_from_curves(p_rate_types,
3664 					p_curve_codes,p_base_currencies,p_contra_currencies,
3665 					p_quote_bases,p_interp_methods,p_data_sides,
3666 					p_day_count_bases,p_interest_quote,p_currency_quote,
3667 					p_spot_date,p_exp_date);
3668 				p_dom_int_rate_ask := p_rates_table(1);
3669 				IF (g_proc_level>=g_debug_level) THEN
3670 				   xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'defaulted domestic ask rate',p_dom_int_rate_bid);
3671 				END IF;
3672      			end if;
3673 
3674 			if (p_vol_bid IS null OR p_vol_ask IS null) THEN
3675 
3676 				if (p_volatility_curve IS null) THEN
3677 					if (p_volatility IS null) THEN
3678 						p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('FXVOL');
3679 						p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
3680 						p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
3681 						p_curve_codes := get_curves_from_base(p_curve_types,
3682 						p_base_currencies,
3683 						p_contra_currencies);
3684 						p_volatility_curve := p_curve_codes(1);
3685 
3686 
3687 					else
3688 
3692 						if (p_vol_ask IS null) THEN
3689 						if (p_vol_bid IS null) THEN
3690 							p_vol_bid:=p_volatility;
3691 						end if;
3693 							p_vol_ask:=p_volatility;
3694 						end if;
3695 					end if;
3696 
3697 				end if;
3698 				if (p_volatility_curve IS NOT null) THEN
3699 					p_interp_methods:= SYSTEM.QRM_VARCHAR_TABLE('DEFAULT','DEFAULT');
3700 					p_rate_types:=SYSTEM.QRM_VARCHAR_TABLE('FXVOL', 'FXVOL');
3701 					p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy, p_foreign_ccy);
3702 					p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy, p_domestic_ccy);
3703 					p_quote_bases:= SYSTEM.QRM_VARCHAR_TABLE('DUMMY', 'DUMMY');
3704 					p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID', 'ASK');
3705 					p_day_count_bases:=SYSTEM.QRM_VARCHAR_TABLE('30/360', '30/360');
3706 					p_curve_codes:=SYSTEM.QRM_VARCHAR_TABLE(p_volatility_curve, p_volatility_curve);
3707 
3708 					--Call to get volatility values
3709 					p_rates_table := get_rates_from_curves(p_rate_types, p_curve_codes,
3710 							p_base_currencies,
3711 					 		p_contra_currencies, p_quote_bases,
3712 					 		p_interp_methods, p_data_sides,
3713 					 		p_day_count_bases,p_interest_quote,
3714 					 		p_currency_quote,p_spot_date,
3715 					 		p_exp_date);
3716 
3717 					if (p_vol_bid IS null) THEN
3718 						p_vol_bid:= p_rates_table(1);
3719 					end if;
3720 					if (p_vol_ask IS null) THEN
3721 						p_vol_ask:= p_rates_table(2);
3722 					end if;
3723 					p_volatility:=p_rates_table(1);
3724      				end if;
3725 			else
3726 				p_volatility:=p_vol_bid;
3727 
3728 	     		end if;
3729   		IF (g_proc_level>=g_debug_level) THEN
3730   		   xtr_risk_debug_pkg.dpop('fxo_calculator: ' || 'Calculation Based On Rates');
3731   		END IF;
3732 
3733 		END IF;
3734 
3735 
3736 
3737 
3738 
3739 		--Gets Spot rate
3740 		if (p_domestic_ccy = 'USD') THEN
3741 			p_spot_rates:=XTR_FX_FORMULAS.FX_SPOT_RATE_CV(p_domestic_ccy, p_foreign_ccy,
3742 				p_dom_spot_rate_bid, p_dom_spot_rate_ask, p_for_spot_rate_bid,
3743 				p_for_spot_rate_ask, 'C', p_foreign_quote_usd);
3744 		elsif (p_foreign_ccy = 'USD') THEN
3745 			p_spot_rates:=XTR_FX_FORMULAS.FX_SPOT_RATE_CV(p_domestic_ccy, p_foreign_ccy,
3746 				p_dom_spot_rate_bid, p_dom_spot_rate_ask, p_for_spot_rate_bid,
3747 				p_for_spot_rate_ask, p_domestic_quote_usd, 'C');
3748 		else
3749 			p_spot_rates:=XTR_FX_FORMULAS.FX_SPOT_RATE_CV(p_domestic_ccy, p_foreign_ccy,
3750 				p_dom_spot_rate_bid, p_dom_spot_rate_ask, p_for_spot_rate_bid,
3751 				p_for_spot_rate_ask, p_domestic_quote_usd, p_foreign_quote_usd);
3752 		end if;
3753 
3754 
3755 
3756 		fx_option_price_in.p_SPOT_DATE:= p_spot_date;
3757 		fx_option_price_in.p_MATURITY_DATE := p_exp_date;
3758 		fx_option_price_in.p_RATE_DOM:=p_dom_int_rate_bid;
3759 		fx_option_price_in.p_RATE_TYPE_DOM:=p_rate_type;
3760 		fx_option_price_in.p_COMPOUND_FREQ_DOM:= 1;
3761 		fx_option_price_in.p_DAY_COUNT_BASIS_DOM:=p_domestic_day_count;
3762 		fx_option_price_in.p_RATE_FOR:=p_for_int_rate_ask;
3763 		fx_option_price_in.p_RATE_TYPE_FOR:=p_rate_type;
3764 		fx_option_price_in.p_COMPOUND_FREQ_FOR:= 1;
3765 		fx_option_price_in.p_DAY_COUNT_BASIS_FOR:=p_foreign_day_count;
3766 		fx_option_price_in.p_SPOT_RATE:=p_spot_rates(1);
3767 		fx_option_price_in.p_STRIKE_RATE:=p_strike_price;
3768 		fx_option_price_in.p_VOLATILITY:= p_vol_bid;
3769 
3770 
3771 
3772 
3773 
3774 
3775 
3776 		XTR_FX_FORMULAS.FX_GK_OPTION_PRICE_CV(fx_option_price_in, fx_option_price_out);
3777 		p_res_call_bid:=fx_option_price_out.p_CALL_PRICE;
3778 		p_res_fxforward_bid:=fx_option_price_out.p_FX_FWD_RATE;
3779 
3780 
3781 		fx_option_price_in.p_SPOT_RATE:=p_spot_rates(2);
3782 		fx_option_price_in.p_RATE_DOM:=p_dom_int_rate_ask;
3783 		fx_option_price_in.p_RATE_FOR:=p_for_int_rate_bid;
3784 		XTR_FX_FORMULAS.FX_GK_OPTION_PRICE_CV(fx_option_price_in, fx_option_price_out);
3785 		p_res_put_bid:=fx_option_price_out.p_PUT_PRICE;
3786 
3787 
3788 
3789 
3790 
3791 
3792 		/* need to find what bid/ask sides are needed to calculate different prices */
3793 		fx_option_price_in.p_volatility:= p_vol_ask;
3794 		XTR_FX_FORMULAS.FX_GK_OPTION_PRICE_CV(fx_option_price_in, fx_option_price_out);
3795 		p_res_call_ask:=fx_option_price_out.p_CALL_PRICE;
3796 		p_res_fxforward_ask:=fx_option_price_out.p_FX_FWD_RATE;
3797 
3798 		fx_option_price_in.p_SPOT_RATE:=p_spot_rates(1);
3799 		fx_option_price_in.p_RATE_DOM:=p_dom_int_rate_bid;
3800 		fx_option_price_in.p_RATE_FOR:=p_for_int_rate_ask;
3801 		XTR_FX_FORMULAS.FX_GK_OPTION_PRICE_CV(fx_option_price_in, fx_option_price_out);
3802 		p_res_put_ask:=fx_option_price_out.p_PUT_PRICE;
3803 
3804 
3805 
3806 
3807 
3808 		if (p_foreign_ccy_amt IS null) THEN
3809 			p_foreign_ccy_amt:=1;
3810 		end if;
3811 
3812 		p_res_call_fair_value_bid:=p_res_call_bid*p_foreign_ccy_amt;
3813 		p_res_call_fair_value_ask:=p_res_call_ask*p_foreign_ccy_amt;
3814 		p_res_put_fair_value_bid:=p_res_put_bid*p_foreign_ccy_amt;
3815 		p_res_put_fair_value_ask:=p_res_put_ask*p_foreign_ccy_amt;
3816 
3817 		--Get number of days for sensitivities function
3818 		--p_days := p_exp_date- p_spot_date;
3819 		XTR_CALC_P.calc_days_run_c(p_spot_date,p_exp_date,p_foreign_day_count,
3820 		null,p_days,p_years);
3821 		--Gets number of years
3822 		p_years:=p_days/p_years;
3823 
3824 
3825 
3829 			XTR_RATE_CONVERSION.COMPOUND_TO_CONTINUOUS_RATE(
3826 		--Must convert interest rates into continuous for sensitivities calculations
3827 
3828 		if (p_rate_type = 'P') THEN
3830 						p_for_int_rate_bid, 1, p_for_cint_rate_bid);
3831 			XTR_RATE_CONVERSION.COMPOUND_TO_CONTINUOUS_RATE(
3832 						p_for_int_rate_ask, 1, p_for_cint_rate_ask);
3833 			XTR_RATE_CONVERSION.COMPOUND_TO_CONTINUOUS_RATE(
3834 						p_dom_int_rate_bid, 1, p_dom_cint_rate_bid);
3835 			XTR_RATE_CONVERSION.COMPOUND_TO_CONTINUOUS_RATE(
3836 						p_dom_int_rate_ask, 1, p_dom_cint_rate_ask);
3837 		ELSE
3838 			XTR_RATE_CONVERSION.SIMPLE_TO_CONTINUOUS_RATE(
3839 						p_for_int_rate_bid, p_years, p_for_cint_rate_bid);
3840 			XTR_RATE_CONVERSION.SIMPLE_TO_CONTINUOUS_RATE(
3841 						p_for_int_rate_ask, p_years, p_for_cint_rate_ask);
3842 			XTR_RATE_CONVERSION.SIMPLE_TO_CONTINUOUS_RATE(
3843 						p_dom_int_rate_bid, p_years, p_dom_cint_rate_bid);
3844 			XTR_RATE_CONVERSION.SIMPLE_TO_CONTINUOUS_RATE(
3845 						p_dom_int_rate_ask, p_years, p_dom_cint_rate_ask);
3846 		END IF;
3847 
3848 
3849 
3850 		QRM_FX_FORMULAS.FX_GK_OPTION_SENS(p_days, p_for_cint_rate_bid, p_dom_cint_rate_bid,
3851 						p_spot_rates(1), p_strike_price, p_vol_bid,
3852 						p_res_delta_call_bid, p_res_delta_put_bid,
3853 						p_res_theta_call_bid, p_res_theta_put_bid,
3854 						p_res_rho_dom_call_bid, p_res_rho_dom_put_bid,
3855 						p_res_rho_for_call_bid, p_res_rho_for_put_bid,
3856 							p_res_gamma_bid, p_res_vega_bid);
3857 
3858 		QRM_FX_FORMULAS.FX_GK_OPTION_SENS(p_days, p_for_cint_rate_ask, p_dom_cint_rate_ask,
3859 						p_spot_rates(2), p_strike_price, p_vol_ask,
3860 						p_res_delta_call_ask, p_res_delta_put_ask,
3861 						p_res_theta_call_ask, p_res_theta_put_ask,
3862 						p_res_rho_dom_call_ask, p_res_rho_dom_put_ask,
3863 						p_res_rho_for_call_ask, p_res_rho_for_put_ask,
3864 						p_res_gamma_ask, p_res_vega_ask);
3865 
3866 
3867 
3868 
3869 
3870 
3871 	END IF;
3872 	p_varchar_args(5):= p_interest_quote;
3873 	p_varchar_args(6):= p_foreign_curve;
3874 	p_varchar_args(7):= p_domestic_curve;
3875 	p_varchar_args(8):= p_volatility_curve;
3876 	p_varchar_args(9):=p_foreign_interpolation;
3877 	p_varchar_args(10):= p_domestic_interpolation;
3878 	p_varchar_args(11):=p_volatility_interpolation;
3879 	p_varchar_args(12):=p_foreign_quote_usd;
3880 	p_varchar_args(13):=p_domestic_quote_usd;
3881 	p_varchar_args(14):=p_foreign_day_count;
3882 	p_varchar_args(15):=p_domestic_day_count;
3883    	p_num_args(1):=p_implied_vol_price;
3884 	p_num_args(2):=p_foreign_ccy_amt;
3885    	p_num_args(3):=p_strike_price;
3886    	p_num_args(4):=p_volatility;
3887    	p_num_args(5):=p_for_spot_rate_bid;
3888 	p_num_args(6):=p_for_spot_rate_ask;
3889    	p_num_args(7):=p_dom_spot_rate_bid;
3890    	p_num_args(8):=p_dom_spot_rate_ask;
3891    	p_num_args(9):=p_for_int_rate_bid;
3892    	p_num_args(10):=p_for_int_rate_ask;
3893    	p_num_args(11):=p_dom_int_rate_bid;
3894    	p_num_args(12):=p_dom_int_rate_ask;
3895    	p_num_args(13):=p_vol_bid;
3896    	p_num_args(14):=p_vol_ask;
3897 	p_num_args(15):=p_res_impl_vol;
3898 
3899 
3900 	p_num_args(16):=p_res_call_bid;
3901 	p_num_args(17):=p_res_call_ask;
3902 	p_num_args(18):=p_res_put_bid;
3903 	p_num_args(19):=p_res_put_ask;
3904 	p_num_args(20):=p_res_fxforward_bid;
3905 	p_num_args(21):=p_res_fxforward_ask;
3906 	p_num_args(22):=p_res_call_fair_value_bid;
3907 	p_num_args(23):=p_res_call_fair_value_ask;
3908 	p_num_args(24):=p_res_put_fair_value_bid;
3909 	p_num_args(25):=p_res_put_fair_value_ask;
3910 
3911 	p_num_args(26):=p_res_delta_call_bid;
3912 	p_num_args(27):=p_res_delta_call_ask;
3913 	p_num_args(28):=p_res_delta_put_bid;
3914 	p_num_args(29):=p_res_delta_put_ask;
3915 	p_num_args(30):=p_res_gamma_bid;
3916 	p_num_args(31):=p_res_gamma_ask;
3917 	p_num_args(32):=p_res_theta_call_bid;
3918 	p_num_args(33):=p_res_theta_call_ask;
3919 	p_num_args(34):=p_res_theta_put_bid;
3920 	p_num_args(35):=p_res_theta_put_ask;
3921 	p_num_args(36):=p_res_vega_bid;
3922 	p_num_args(37):=p_res_vega_ask;
3923 	p_num_args(38):=p_res_rho_dom_call_bid;
3924 	p_num_args(39):=p_res_rho_dom_call_ask;
3925 	p_num_args(40):=p_res_rho_dom_put_bid;
3926 	p_num_args(41):=p_res_rho_dom_put_ask;
3927 	p_num_args(42):=p_res_rho_for_call_bid;
3928 	p_num_args(43):=p_res_rho_for_call_ask;
3929 	p_num_args(44):=p_res_rho_for_put_bid;
3930 	p_num_args(45):=p_res_rho_for_put_ask;
3931 
3932 	EXCEPTION
3933   	WHEN e_no_int_rates THEN
3934     		fnd_msg_pub.add;
3935 		IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
3936         	   xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_INT_RATES',
3937 		      'QRM_CALCULATORS_P.FXO_CALCULATOR',G_ERROR_LEVEL);
3938      		END IF;
3939   	WHEN e_no_rate_curve THEN
3940     		fnd_msg_pub.add;
3941 		IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
3942         	   xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_RATE_CURVE',
3943 		      'QRM_CALCULATORS_P.FXO_CALCULATOR',G_ERROR_LEVEL);
3944      		END IF;
3945   	WHEN e_no_spot_rates THEN
3946 	        IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
3947         	   xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_SPOT_RATES',
3948 		      'QRM_CALCULATORS_P.FXO_CALCULATOR',G_ERROR_LEVEL);
3949      		END IF;
3950     		fnd_msg_pub.add;
3951 	WHEN QRM_MM_FORMULAS.e_exceed_vol_upper_bound THEN
3952 	        IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
3953         	   xtr_risk_debug_pkg.dlog('EXCEPTION','E_EXCEED_VOL_UPPER_BOUND',
3954 		      'QRM_CALCULATORS_P.FXO_CALCULATOR',G_ERROR_LEVEL);
3955      		END IF;
3956 		fnd_msg_pub.add;
3957 
3958 	IF (g_proc_level>=g_debug_level) THEN
3959 	   xtr_risk_debug_pkg.dpop(null,'QRM_CALCULATORS_P.fxo_calculator');
3960 	END IF;
3961 
3962 END fxo_calculator;
3963 
3964 END;