4
1 PACKAGE BODY xtr_market_data_interface_p AS
2 /* $Header: xtrmdtrb.pls 120.8.12010000.2 2010/01/28 11:26:47 nipant ship $ */
3 --------------------------------------------------------------------------------------------------------------------
5 /* archive_rates
6 This procedure updates the history table
7 parameters
8 p_called_from_trigger-is it called from the db trigger?
9 p_ask_price,p_bid_price- file quote of ask and bid, computed from what's in mdi
10 the rest - comes directly from mp
11 */
12 PROCEDURE archive_rates(p_called_from_trigger IN BOOLEAN,
13 p_ask_price IN NUMBER,
14 p_bid_price IN NUMBER,
15 p_currency_a IN VARCHAR2,
16 p_currency_b IN VARCHAR2,
17 p_nos_of_days IN NUMBER,
18 p_ric_code IN VARCHAR2,
19 p_term_length IN NUMBER,
20 p_term_type IN VARCHAR2,
21 p_term_year IN NUMBER,
22 -- p_last_download_time IN DATE) IS
23 p_last_download_time IN DATE,
24 p_day_count_basis IN VARCHAR2) IS
25 --
26 v_hce NUMBER;
27 v_old_base_hce_rate NUMBER;
28 v_mid_usd_rate NUMBER;
29 v_home_ccy VARCHAR2(15);
30 v_basis VARCHAR2(1);
31 v_rounding_factor NUMBER;
32 v_usd_hce_rate NUMBER;
33 v_row_exists NUMBER;
34 --
35 CURSOR home_ccy_cursor IS
36 SELECT p.param_value, b.usd_quoted_spot, b.divide_or_multiply
37 FROM xtr_pro_param p,
38 xtr_master_currencies b
39 WHERE p.param_name = 'SYSTEM_FUNCTIONAL_CCY'
40 AND b.currency = p.param_value;
41 --
42 CURSOR rnd_factor_cursor (p_currency VARCHAR2) IS
43 SELECT rounding_factor
44 FROM xtr_master_currencies_v
45 WHERE currency = p_currency;
46 --
47 CURSOR c_interest_date_stamp (p_currency VARCHAR2,
48 p_ric_code VARCHAR2,
49 p_rate_date DATE) IS
50 SELECT 1
51 FROM xtr_interest_period_rates
52 WHERE currency = p_currency
53 AND unique_period_id = p_ric_code
54 AND rate_date = p_rate_date;
55 --
56 CURSOR c_spot_date_stamp (p_currency VARCHAR2,
57 p_rate_date DATE) IS
58 SELECT 1
59 FROM xtr_spot_rates
60 WHERE currency = p_currency
61 AND rate_date = p_rate_date;
62 --
63 BEGIN
64 -- Check if No Spot Rates exist for this currency
65 -- if not found ensure at least one row is inserted before the Archive Freq
66 -- takes effect
67 OPEN home_ccy_cursor;
68 FETCH home_ccy_cursor INTO v_home_ccy,v_old_base_hce_rate,v_basis;
69 CLOSE home_ccy_cursor;
70 IF v_home_ccy ='USD' then
71 v_old_base_hce_rate :=1;
72 END IF;
73
74 /* ======================= */
75 /* 2. not in ('S','W','F') */
76 /* ======================= */
77 IF Nvl(p_term_type,'S') <>'S' then
78 --
79 OPEN c_interest_date_stamp(p_currency_a, p_ric_code,
80 p_last_download_time);
81 FETCH c_interest_date_stamp INTO v_row_exists;
82 CLOSE c_interest_date_stamp;
83 -- If date stamp already exists in table (v_row_exists = 1),
84 -- do not insert, just update
85 IF Nvl(v_row_exists,0)<>1 THEN
86 INSERT INTO xtr_interest_period_rates
87 (currency,contra_option_ccy,unique_period_id,period_code,rate_date,
88 bid_rate,spread,offer_rate,term_type,day_count_basis)
89 VALUES
90 (p_currency_a,p_currency_b,p_ric_code,p_nos_of_days,
91 p_last_download_time,p_bid_price,p_ask_price - p_bid_price,
92 p_ask_price,p_term_type,p_day_count_basis);
93 ELSE
94 UPDATE xtr_interest_period_rates
95 SET contra_option_ccy = p_currency_b,
96 period_code = p_nos_of_days,
97 bid_rate = p_bid_price,
98 spread = p_ask_price - p_bid_price,
99 offer_rate = p_ask_price,
100 term_type = p_term_type,
101 day_count_basis = p_day_count_basis
102 WHERE currency = p_currency_a
103 AND unique_period_id = p_ric_code
104 AND rate_date = p_last_download_time;
105 END IF;
106 --
107 /* -- table not currently used
108 UPDATE xtr_yield_curve_details
109 SET bid_price = p_bid_price,
110 ask_price = p_ask_price,
111 movement_indicator = p_movement_indicator,
112 rate_date = p_last_download_time
113 WHERE currency = p_currency_a
114 AND term_type = p_term_type
115 AND term_length = p_term_length
116 AND Nvl(term_year,1111) = Nvl(p_term_year,1111);
117 */
118 --
119 ELSIF Nvl(p_term_type,'^') = 'S' then
120 /* ==================== */
121 /* 3. Update Spot Rates */
122 /* ==================== */
123 IF Nvl(p_currency_a,'$#$')='USD' OR Nvl(p_currency_b,'$#$')='USD' then
124 IF Nvl(p_currency_a,'$#$') <>'USD' then
125 -- Put the Rate in USD terms by first inversing
126 v_mid_usd_rate := (1 / ((p_bid_price + p_ask_price) / 2)); /* bug#2366624, rravunny */
127 ELSE
128 -- The Rate is in USD terms
129 v_mid_usd_rate := ((p_bid_price + p_ask_price) / 2); /* bug#2366624, rravunny */
130 END IF;
131 --
132 IF Nvl(p_currency_a,'$#$') <> 'USD' then
133 -- Currency A <> 'USD' ie AUD/USD, GBP/USD
134 IF (v_home_ccy <> p_currency_a AND v_home_ccy <> p_currency_b) OR v_home_ccy='USD' then --- add OR
135 --
136 IF p_called_from_trigger THEN
137 OPEN rnd_factor_cursor(p_currency_a);
141 SET current_spot_rate = (p_bid_price + p_ask_price) / 2,
138 FETCH rnd_factor_cursor INTO v_rounding_factor;
139 CLOSE rnd_factor_cursor;
140 UPDATE xtr_master_currencies
142 hce_rate = (v_mid_usd_rate / v_old_base_hce_rate),
143 usd_quoted_spot = Decode(currency,'USD',1,(v_mid_usd_rate)), /* bug#2366624, rravunny */
144 spot_date = p_last_download_time,
145 rate_date = p_last_download_time
146 WHERE currency = p_currency_a;
147 END IF;
148 --
149 v_hce := (v_mid_usd_rate / v_old_base_hce_rate); /* bug#2366624, rravunny */
150 ELSE
151 v_hce := 1;
152 END IF;
153 --
154 OPEN c_spot_date_stamp(p_currency_a, p_last_download_time);
155 FETCH c_spot_date_stamp INTO v_row_exists;
156 CLOSE c_spot_date_stamp;
157 -- If date stamp already exists in table (v_row_exists = 1),
158 -- do not insert, just update
159 IF Nvl(v_row_exists,0)<>1 THEN
160 INSERT INTO xtr_spot_rates
161 (currency,rate_date,bid_rate_against_usd,
162 spread_against_usd,offer_rate_against_usd,
163 usd_base_curr_bid_rate,usd_base_curr_offer_rate,
164 hce_rate,unique_period_id)
165 VALUES
166 (p_currency_a,p_last_download_time,p_bid_price,
167 p_ask_price-p_bid_price,p_ask_price,
168 1/p_ask_price,1/p_bid_price,
169 v_hce,p_ric_code);
170 ELSE
171 UPDATE xtr_spot_rates
172 SET bid_rate_against_usd = p_bid_price,
173 spread_against_usd = p_ask_price-p_bid_price,
174 offer_rate_against_usd = p_ask_price,
175 usd_base_curr_bid_rate = 1/p_ask_price,
176 usd_base_curr_offer_rate = 1/p_bid_price,
177 hce_rate = v_hce,
178 unique_period_id = p_ric_code
179 WHERE currency = p_currency_a
180 AND rate_date = p_last_download_time;
181 END IF;
182 --
183 ELSE
184 -- Currency A = 'USD' eg USD/DEM, USD/JPY etc
185 IF (v_home_ccy <> p_currency_a AND v_home_ccy <> p_currency_b) OR v_home_ccy='USD' then
186 --
187 IF p_called_from_trigger THEN
188 OPEN rnd_factor_cursor(p_currency_b);
189 FETCH rnd_factor_cursor INTO v_rounding_factor;
190 CLOSE rnd_factor_cursor;
191 UPDATE xtr_master_currencies
192 SET current_spot_rate = (p_bid_price + p_ask_price) / 2,
193 hce_rate = (v_mid_usd_rate / v_old_base_hce_rate),
194 usd_quoted_spot = Decode(currency,'USD',1,(v_mid_usd_rate)), /* bug#2366624, rravunny */
195 spot_date = p_last_download_time,
196 rate_date = p_last_download_time
197 WHERE currency = p_currency_b;
198 END IF;
199 --
200 v_hce := (v_mid_usd_rate / v_old_base_hce_rate); /* bug#2366624, rravunny */
201 ELSE
202 v_hce := 1;
203 END IF;
204 --
205 OPEN c_spot_date_stamp(p_currency_b, p_last_download_time);
206 FETCH c_spot_date_stamp INTO v_row_exists;
207 CLOSE c_spot_date_stamp;
208 -- If date stamp already exists in table (v_row_exists = 1),
209 -- do not insert, just update
210 IF Nvl(v_row_exists,0)<>1 THEN
211 INSERT INTO xtr_spot_rates
212 (currency,rate_date,bid_rate_against_usd,
213 spread_against_usd,offer_rate_against_usd,
214 usd_base_curr_bid_rate,usd_base_curr_offer_rate,
215 hce_rate,unique_period_id)
216 VALUES
217 (p_currency_b,p_last_download_time,p_bid_price,
218 p_ask_price - p_bid_price,
219 p_ask_price,p_bid_price,p_ask_price,
220 v_hce,p_ric_code);
221 ELSE
222 UPDATE xtr_spot_rates
223 SET bid_rate_against_usd = p_bid_price,
224 spread_against_usd = p_ask_price - p_bid_price,
225 offer_rate_against_usd = p_ask_price,
226 usd_base_curr_bid_rate = p_bid_price,
227 usd_base_curr_offer_rate = p_ask_price,
228 hce_rate = v_hce,
229 unique_period_id = p_ric_code
230 WHERE currency = p_currency_b
231 AND rate_date = p_last_download_time;
232 END IF;
233 --
234 END IF;
235 /* =================================================== */
236 /* 4. Compare home_ccy with currency_A and currrency_B */
237 /* =================================================== */
238 IF v_home_ccy = p_currency_a OR v_home_ccy = p_currency_b then
239 -- ie updating home currency where currency = 'USD'
240 -- note the following if statement (using basis for home ccy) is to ensure
241 -- that the hce for usd is quoted in the home ccy basis.
242 IF v_basis = '*' then
243 v_usd_hce_rate := ((p_bid_price + p_ask_price) / 2); /* bug#2366624, rravunny */
244 ELSE
245 -- need to put hce rate back in home ccy terms for the usd
246 v_usd_hce_rate := (1 / ((p_bid_price + p_ask_price)/2)); /* bug#2366624, rravunny */
247 END IF;
248 --
249 IF p_called_from_trigger THEN
253 usd_quoted_spot = 1,
250 UPDATE xtr_master_currencies
251 SET current_spot_rate = 1,
252 hce_rate = Decode(v_home_ccy,'USD',1,v_usd_hce_rate),
254 spot_date = p_last_download_time,
255 rate_date = p_last_download_time
256 WHERE currency = 'USD';
257 END IF;
258 --
259 /* ====== */
260 /* 5. Add */
261 /* ====== */
262 IF v_home_ccy <>'USD' then
263 --
264 IF p_called_from_trigger THEN
265 UPDATE xtr_master_currencies
266 SET current_spot_rate = ((p_bid_price + p_ask_price) / 2), /* bug#2366624, rravunny */
267 usd_quoted_spot = (v_mid_usd_rate), /* bug#2366624, rravunny */
268 hce_rate = 1,
269 spot_date = p_last_download_time,
270 rate_date = p_last_download_time
271 WHERE currency = v_home_ccy;
272 -- ie updating home currency therefore ALL hce rates need updating for each currency
273 UPDATE xtr_master_currencies_v a
274 SET hce_rate = (usd_quoted_spot / v_mid_usd_rate),
275 spot_date = p_last_download_time,
276 rate_date = p_last_download_time
277 WHERE currency <> v_home_ccy
278 AND currency <> 'USD'
279 AND usd_quoted_spot IS NOT NULL;
280 END IF;
281 --
282 -- Insert USD 'DUMMY' Row ie this is used by USD deals to enable them to pick
283 -- the HCE RATE.
284 OPEN c_spot_date_stamp('USD', p_last_download_time);
285 FETCH c_spot_date_stamp INTO v_row_exists;
286 CLOSE c_spot_date_stamp;
287 -- If date stamp already exists in table (v_row_exists = 1),
288 -- do not insert, just update
289 IF Nvl(v_row_exists,0)<>1 THEN
290 INSERT INTO xtr_spot_rates
291 (currency,rate_date,bid_rate_against_usd,spread_against_usd,
292 offer_rate_against_usd,usd_base_curr_bid_rate,
293 usd_base_curr_offer_rate,hce_rate,unique_period_id)
294 VALUES
295 ('USD',p_last_download_time,1,0,1,1,1,
296 v_usd_hce_rate,'USD REF ROW');
297 ELSE
298 UPDATE xtr_spot_rates
299 SET bid_rate_against_usd = 1,
300 spread_against_usd = 0,
301 offer_rate_against_usd = 1,
302 usd_base_curr_bid_rate = 1,
303 usd_base_curr_offer_rate = 1,
304 hce_rate = v_usd_hce_rate,
305 unique_period_id = 'USD REF ROW'
306 WHERE currency = 'USD'
307 AND rate_date = p_last_download_time;
308 END IF;
309 --
310 END IF; /* 5 */
311 END IF; /* 4 */
312 END IF; /* 3 */
313 END IF; /* 2 */
314 END archive_rates;
315
316
317
318 /* transfer_mp
319 This procedure does the actual transfer from mdi to mp
320 parameters
321 p_ref- the reference number from xtr_data_feed_codes based on the source and external ref code of mdi
322 p_ask,p_bid- file quote of ask and bid, computed from what's in mdi
323 p_rowid- the rowid of the mdi record we are dealing with currently
324 */
325
326 PROCEDURE transfer_mp(p_ref IN NUMBER,p_ask IN NUMBER, p_bid IN NUMBER,
327 p_rowid IN ROWID ) IS
328 --
329 v_now DATE;
330 --
331 BEGIN
332 SELECT NVL(datetime,SYSDATE)INTO v_now FROM xtr_market_data_interface where
333 rowid=p_rowid;
334 IF v_now > sysdate THEN
335 v_now := sysdate;
336 END IF;
337 UPDATE XTR_MARKET_PRICES
338 SET ASK_PRICE= p_ask, BID_PRICE= p_bid,LAST_DOWNLOAD_TIME=v_now
339 WHERE XTR_MARKET_PRICES.REF_NUMBER = p_ref;
340 UPDATE XTR_MARKET_DATA_INTERFACE
341 SET LAST_UPDATED_BY = FND_GLOBAL.user_id, LAST_UPDATED_DATE= sysdate
342 WHERE XTR_MARKET_DATA_INTERFACE.ROWID = p_rowid;
343 END transfer_mp;
344
345
346
347 /* calc_ask_bid
348 This procedure calculates the correct ask and bid values based on ask, bid, mid, and spread that are alredy stored in mdi
349 parameters
350 p_ref- the reference number from xtr_data_feed_codes based on the source and external ref code of mdi
351 p_ask,p_bid,p_mid,p_spread- file quote of ask, bid,mid, and spread that's in mdi
352 p_code- code scheme that lets you know which values are missing based on its code
353 */
354 PROCEDURE calc_ask_bid(p_ref IN NUMBER, p_ask IN OUT NOCOPY NUMBER,
355 p_bid IN OUT NOCOPY NUMBER,p_mid IN NUMBER, p_spread IN NUMBER, p_code IN NUMBER) IS
356 --
357 v_pspread NUMBER;
358 --
359 BEGIN
360 /* v_code scheme
361 1 is added to v_code if ask is missing
362 2 is added to v_code if bid is missing
363 4 is added to v_code if mid is missing
364 8 is added to v_code if spread is missing
365 the combinations of those codes will enable to programmer to uniquely identify which items are missing */
366 IF (p_code <> 0) AND (p_code<> 4) AND (p_code<> 8) AND (p_code<> 12) THEN
367 -- if ask or bid are missing
368 IF (p_code = 1) THEN -- just ask missing
369 p_ask:=2*p_mid-p_bid;
370 ELSIF (p_code = 2) THEN -- just bid missing
371 p_bid:= 2*p_mid-p_ask;
372 ELSIF (p_code = 3) THEN -- ask and bid missing
373 p_ask:= (2*p_mid+p_spread)/2;
374 p_bid:= (2*p_mid-p_spread)/2;
375 ELSIF (p_code = 5) THEN -- mid and ask missing
379 ELSIF (p_code = 9) THEN -- ask and spread missing
376 p_ask:=p_bid+p_spread;
377 ELSIF (p_code = 6) THEN--bid and mid missing
378 p_bid:= p_ask-p_spread;
380 p_ask:=2*p_mid-p_bid;
381 ELSIF (p_code = 10) THEN -- bid and spread missing
382 p_bid:= 2*p_mid-p_ask;
383 ELSIF (p_code = 11) THEN -- ask, bid, and spread missing
384 SELECT NVL(ASK_PRICE-BID_PRICE,0) INTO v_pspread
385 FROM XTR_MARKET_PRICES WHERE REF_NUMBER= p_ref;
386 p_ask:= (2*p_mid+v_pspread)/2;
387 p_bid:= (2*p_mid-v_pspread)/2;
388 ELSIF (p_code = 13) THEN-- ask, mid, and spread missing
389 SELECT NVL(ASK_PRICE-BID_PRICE,0) INTO v_pspread
390 FROM XTR_MARKET_PRICES WHERE REF_NUMBER= p_ref;
391 p_ask:= p_bid+v_pspread;
392 ELSIF (p_code = 14) THEN-- bid, mid, and spread missing
393 SELECT NVL(ASK_PRICE-BID_PRICE,0) INTO v_pspread
394 FROM XTR_MARKET_PRICES WHERE REF_NUMBER= p_ref;
395 p_bid:=p_ask-v_pspread;
396 END IF;
397 END IF;
398 END calc_ask_bid;
399
400
401
402 /* q_quote_compare
403 This function compares file quote computed from mdi and system quote that's
404 already in mp. It returns true if they are not equal and returns true if they
405 are equal. It was created so that sql statements could be used inside of if
406 structure. It first computes file quote based on data in mdi
407 parameters
408 p_source,p_external_ref_code- souce and ext_ref_code of what's in mdi. These combined enables you to find unique row in data feed codes
409 p_ask,p_bid,p_mid,p_spread- file quote of ask,bid,mid, and spread that's in mdi
410 p_code-used to call calc_ask_bid proc
411 */
412 FUNCTION q_quote_compare(p_source IN VARCHAR2,
413 p_external_ref_code IN VARCHAR2,p_ask IN OUT NOCOPY NUMBER,
414 p_bid IN OUT NOCOPY NUMBER,p_mid IN NUMBER, p_spread IN NUMBER, p_code IN NUMBER)
415 RETURN BOOLEAN IS
416 --
417 v_fask NUMBER;
418 v_fbid NUMBER;-- temporary storage for ask and bid
419 v_fref NUMBER;
420 --
421 BEGIN
422 SELECT REF_NUMBER INTO v_fref FROM XTR_DATA_FEED_CODES
423 WHERE SOURCE = p_source AND EXTERNAL_REF_CODE = p_external_ref_code;
424 SELECT ASK_PRICE INTO v_fask FROM XTR_MARKET_PRICES
425 WHERE REF_NUMBER = v_fref;
426 SELECT BID_PRICE INTO v_fbid FROM XTR_MARKET_PRICES
427 WHERE REF_NUMBER = v_fref;
428 calc_ask_bid(v_fref,p_ask,p_bid,p_mid,p_spread,p_code);
429 IF (v_fask<> p_ask) OR (v_fbid<> p_bid) OR (v_fask IS NULL) OR
430 (v_fbid IS NULL)
431 THEN
432 RETURN TRUE;
433 ELSE
434 RETURN FALSE;
435 END IF;
436 END q_quote_compare;
437
438
439
440 /* q_code_check
441 This function checks if mdi.source and mdi.external_ref_code not found in data feed codes or corresponding ric code not found in mp
442 returns true if not found. returns false if found
443 parameters
444 p_source, p_external_ref_code-source and ext ref code in mdi
445 */
446 FUNCTION q_code_check(p_source IN VARCHAR2,
447 p_external_ref_code IN VARCHAR2) RETURN BOOLEAN IS
448 --
449 CURSOR c1_cursor IS
450 SELECT REF_NUMBER FROM XTR_DATA_FEED_CODES
451 WHERE SOURCE = p_source AND EXTERNAL_REF_CODE = p_external_ref_code;
452 CURSOR c2_cursor IS
453 SELECT RIC_CODE FROM XTR_MARKET_PRICES
454 WHERE REF_NUMBER = ( SELECT REF_NUMBER FROM XTR_DATA_FEED_CODES
455 WHERE SOURCE = p_source AND EXTERNAL_REF_CODE = p_external_ref_code);
456 v_fref NUMBER;
457 v_fric VARCHAR2(20);
458 --
459 BEGIN
460 OPEN c1_cursor;
461 FETCH c1_cursor INTO v_fref;
462 IF c1_cursor%NOTFOUND THEN
463 CLOSE c1_cursor;
464 RETURN TRUE;
465 ELSE
466 OPEN c2_cursor;
467 FETCH c2_cursor INTO v_fric;
468 IF c2_cursor%NOTFOUND THEN
469 CLOSE c1_cursor;
470 CLOSE c2_cursor;
471 RETURN TRUE;
472 ELSE
473 CLOSE c1_cursor;
474 CLOSE c2_cursor;
475 RETURN FALSE;
476 END IF;
477 END IF;
478 END q_code_check;
479
480
481
482 /* q_date_check
483 This function checks if mdi.datetime<mp.last_download_time
484 returns true if that is the case. returns false otherwise
485 parameters
486 p_date-datetime in mdi
487 p_source, p_external_ref_code-source and ext ref code in mdi
488 */
489 FUNCTION q_date_check(p_date IN DATE, p_source IN VARCHAR2,
490 p_external_ref_code IN VARCHAR2) RETURN BOOLEAN IS
491 --
492 v_fref NUMBER;
493 v_date DATE;
494 --
495 BEGIN
496 SELECT REF_NUMBER INTO v_fref FROM XTR_DATA_FEED_CODES
497 WHERE SOURCE = p_source AND EXTERNAL_REF_CODE = p_external_ref_code;
498 SELECT LAST_DOWNLOAD_TIME INTO v_date FROM XTR_MARKET_PRICES
499 WHERE REF_NUMBER= v_fref;
500 IF (p_date< v_date) THEN
501 RETURN TRUE;
502 ELSE
503 RETURN FALSE;
504 END IF;
505 END q_date_check;
506
507
508
509 /*put_header
510 This procedure puts the header(titles) for the log messages. It is invoked only if there are errors
511 */
512 PROCEDURE put_header IS
513 --
514 v_source_h VARCHAR2(100);
515 v_ext_ref_h VARCHAR2(100);
516 v_bid_h VARCHAR2(100);
517 v_ask_h VARCHAR2(100);
518 v_mid_h VARCHAR2(100);
519 v_spread_h VARCHAR2(100);
520 v_date_h VARCHAR2(100);
521 v_trans_stat_h VARCHAR2(100);
522 --
523 BEGIN
524 SELECT text INTO v_source_h FROM xtr_sys_languages_vl WHERE
525 module_name='XTRMDTRP' AND canvas_type='TEXT' AND ITEM_NAME = 'P_SOURCE';
526 SELECT text INTO v_ext_ref_h FROM xtr_sys_languages_vl WHERE
530 module_name='XTRMDTRP' AND canvas_type='TEXT' AND ITEM_NAME = 'P_BID';
527 module_name='XTRMDTRP' AND canvas_type='TEXT' AND ITEM_NAME =
528 'P_EXTERNAL_REF_CODE';
529 SELECT text INTO v_bid_h FROM xtr_sys_languages_vl WHERE
531 SELECT text INTO v_ask_h FROM xtr_sys_languages_vl WHERE
532 module_name='XTRMDTRP' AND canvas_type='TEXT' AND ITEM_NAME = 'P_ASK';
533 SELECT text INTO v_mid_h FROM xtr_sys_languages_vl WHERE
534 module_name='XTRMDTRP' AND canvas_type='TEXT' AND ITEM_NAME = 'P_MID';
535 SELECT text INTO v_spread_h FROM xtr_sys_languages_vl WHERE
536 module_name='XTRMDTRP' AND canvas_type='TEXT' AND ITEM_NAME = 'P_SPREAD';
537 SELECT text INTO v_date_h FROM xtr_sys_languages_vl WHERE
538 module_name='XTRMDTRP' AND canvas_type='TEXT' AND ITEM_NAME = 'P_DATE';
539 SELECT text INTO v_trans_stat_h FROM xtr_sys_languages_vl WHERE
540 module_name='XTRMDTRP' AND canvas_type='TEXT' AND ITEM_NAME =
541 'P_TRANSFER_STATUS';
542 FND_FILE.PUT_LINE(FND_FILE.LOG,v_source_h ||', '||v_ext_ref_h||', '
543 ||v_bid_h||', '||v_ask_h||', '||v_mid_h||', '||v_spread_h||', '
544 ||v_date_h||', '||v_trans_stat_h);
545 END put_header;
546
547
548
549 /*market_data_transfer_cp
550 This is a dummy procedure that simply calls market_data_transfer. It is called by the concurrent program
551 */
552 PROCEDURE market_data_transfer_cp(
553 errbuf OUT NOCOPY VARCHAR2,
554 retcode OUT NOCOPY VARCHAR2,
555 p_upd_date_missing IN VARCHAR2,
556 p_upd_history IN VARCHAR2)
557 IS
558 --
559 --
560 BEGIN
561 market_data_transfer(p_upd_date_missing,p_upd_history);
562 END market_data_transfer_cp;
563
564
565
566 /* market_data_transfer
567 *
568 * transfers market data from the XTR_MARKET_DATA_INTERFACE table
569 * to the current (or historic) rates table within Treasury.
570 * For each record in the XTR_MARKET_DATA_INTERFACE table, this procedure
571 * attempts to make the transfer and writes a return code back
572 * on the interface table corresponding to the status of the transfer.
573 * For successful transfers, the corresponding Reference Code is also
574 * recorded on the interface table.
575 *
576 * The Return Code and Description are stored in FND_LOOKUPS where the
577 * lookup_type = 'XTR_MDTSF_RTN_CODES'
578 */
579 PROCEDURE market_data_transfer (p_upd_date_missing IN VARCHAR2,
580 p_upd_history IN VARCHAR2) IS
581 --
582 CURSOR each_row_cursor IS
583 SELECT rowid, source,external_ref_code,ask,bid,datetime,mid,spread,
584 return_code,ref_code,created_by,creation_date,last_updated_by,
585 last_updated_date,last_updated_login
586 FROM XTR_MARKET_DATA_INTERFACE
587 WHERE RETURN_CODE IS NULL;
588 v_counter NUMBER DEFAULT 0;
589 e_inv EXCEPTION;
590 -- invalid parameter exception
591 v_ask NUMBER;
592 v_bid NUMBER;
593 v_ref NUMBER;
594 v_ric VARCHAR2(20);
595 v_currency_a VARCHAR2(15);
596 v_currency_b VARCHAR2(15);
597 v_nos_of_days NUMBER;
598 v_term_length NUMBER;
599 v_term_type VARCHAR2(1);
600 v_term_year NUMBER;
601 v_code NUMBER ;
602 v_day_count_basis XTR_INTEREST_PERIOD_RATES.DAY_COUNT_BASIS%TYPE;
603 /* v_code scheme
604 1 is added to v_code if ask is missing
605 2 is added to v_code if bid is missing
606 4 is added to v_code if mid is missing
607 8 is added to v_code if spread is missing
608 the combinations of those codes will enable to programmer to uniquely identify which items are missing */
609 v_trans_stat VARCHAR2(240);
610 v_e_count NUMBER; --number of rows with errors
611
612 --bug 2588763
613 type currency_list_type is table of xtr_market_prices.currency_a%type index by binary_integer;
614 v_currency_a_list currency_list_type;
615 v_currency_b_list currency_list_type;
616
617 --
618 BEGIN
619 IF NOT(((p_upd_date_missing = 'A') OR (p_upd_date_missing = 'N') OR
620 (p_upd_date_missing = 'C')) AND ((p_upd_history = 'Y') OR
621 (p_upd_history = 'N'))) THEN
622 RAISE e_inv;
623 END IF;
624 -- check parameter integrity
625 LOCK TABLE XTR_MARKET_DATA_INTERFACE,XTR_MARKET_PRICES IN EXCLUSIVE MODE
626 NOWAIT;
627
628 -- bug 2588763 - get list of all currencies that will be updated
629 select distinct mp.currency_a
630 bulk collect into v_currency_a_list
631 from xtr_market_prices mp,
632 xtr_data_feed_codes dfc,
633 xtr_market_data_interface mdi
634 where mp.ric_code=dfc.ric_code
635 and dfc.source = mdi.source
636 and dfc.external_ref_code = mdi.external_ref_code
637 and mp.term_type = 'S'
638 and mp.currency_a is not null
639 and mp.currency_a <> 'USD'
640 and nvl(mp.currency_b,'USD')='USD'
641 and mdi.return_code is null;
642
643 select distinct mp.currency_b
644 bulk collect into v_currency_b_list
645 from xtr_market_prices mp,
646 xtr_data_feed_codes dfc,
647 xtr_market_data_interface mdi
648 where mp.ric_code=dfc.ric_code
649 and dfc.source = mdi.source
650 and dfc.external_ref_code = mdi.external_ref_code
651 and mp.currency_b is not null
652 and mp.currency_b <> 'USD'
653 and nvl(mp.currency_a,'USD')='USD'
654 and not exists
655 (select i_mp.currency_b
656 from xtr_market_prices i_mp,
657 xtr_data_feed_codes i_dfc,
658 xtr_market_data_interface i_mdi
659 where i_mp.ric_code = i_dfc.ric_code
660 and i_dfc.source = i_mdi.source
664 and i_mdi.return_code is null)
661 and i_dfc.external_ref_code = i_mdi.external_ref_code
662 and i_mp.term_type = 'S'
663 and i_mp.currency_a = mp.currency_b
665 and mdi.return_code is null;
666
667 -- lock the tables
668 v_counter := 0;
669 v_e_count:= 0;
670 FOR v_mdi_rec IN each_row_cursor LOOP
671 v_code:=0;
672 v_counter:=v_counter+1;
673 IF (v_mdi_rec.ASK IS NOT NULL) THEN
674 v_ask:=v_mdi_rec.ASK ;
675 ELSE
676 v_code:=v_code+1;
677 END IF;
678 IF (v_mdi_rec.BID IS NOT NULL) THEN
679 v_bid:=v_mdi_rec.BID ;
680 ELSE
681 v_code:=v_code+2;
682 END IF;
683 IF (v_mdi_rec.MID IS NULL) THEN
684 v_code:=v_code+4;
685 END IF;
686 IF (v_mdi_rec.SPREAD IS NULL) THEN
687 v_code:=v_code+8;
688 END IF;
689
690 IF (v_mdi_rec.SOURCE IS NULL) OR (v_mdi_rec.EXTERNAL_REF_CODE IS NULL) OR
691 ((v_mdi_rec.ASK IS NULL) AND (v_mdi_rec.BID IS NULL) AND
692 (v_mdi_rec.MID IS NULL)) THEN
693 --XTRMDT special logic fails
694 UPDATE XTR_MARKET_DATA_INTERFACE
695 SET RETURN_CODE = 90,LAST_UPDATED_BY = FND_GLOBAL.user_id,
696 LAST_UPDATED_DATE= SYSDATE WHERE rowid =v_mdi_rec.rowid;
697
698 --Print error to concurrent log
699 v_e_count := v_e_count + 1;
700 IF v_e_count = 1 THEN
701 put_header;
702 END IF;
703
704 SELECT description INTO v_trans_stat FROM fnd_lookups WHERE
705 lookup_type= 'XTR_MDTSF_RTN_CODES'AND lookup_code= '90';
706 FND_FILE.PUT_LINE(FND_FILE.LOG,v_mdi_rec.source||', '||
707 v_mdi_rec.external_ref_code||', '||v_mdi_rec.bid||', '||v_mdi_rec.ask
708 ||', '||v_mdi_rec.mid||', '||v_mdi_rec.spread||', '
709 ||v_mdi_rec.datetime||', '||v_trans_stat||' [90]');
710
711 ELSIF q_code_check(v_mdi_rec.source,v_mdi_rec.external_ref_code) THEN
712 UPDATE XTR_MARKET_DATA_INTERFACE
713 SET RETURN_CODE = 50 ,LAST_UPDATED_BY = FND_GLOBAL.user_id,
714 LAST_UPDATED_DATE= SYSDATE WHERE ROWID = v_mdi_rec.rowid;
715 --Print error to concurrent log
716 v_e_count := v_e_count + 1;
717 IF v_e_count = 1 THEN
718 put_header;
719 END IF;
720 SELECT description INTO v_trans_stat FROM fnd_lookups WHERE
721 lookup_type= 'XTR_MDTSF_RTN_CODES'AND lookup_code= '50';
722 FND_FILE.PUT_LINE(FND_FILE.LOG,v_mdi_rec.source||', '||
723 v_mdi_rec.external_ref_code||', '||v_mdi_rec.bid||', '||v_mdi_rec.ask
724 ||', '||v_mdi_rec.mid||', '||v_mdi_rec.spread||', '
725 ||v_mdi_rec.datetime||', '||v_trans_stat||' [50]');
726
727 ELSIF v_mdi_rec.DATETIME IS NULL THEN
728 IF (p_upd_date_missing = 'N') THEN
729 -- UPD_DATE_MISSING = Never
730 UPDATE XTR_MARKET_DATA_INTERFACE
731 SET RETURN_CODE = 60,LAST_UPDATED_BY = FND_GLOBAL.user_id,
732 LAST_UPDATED_DATE= SYSDATE WHERE ROWID = v_mdi_rec.rowid;
733 --Print error to concurrent log
734 v_e_count := v_e_count + 1;
735 IF v_e_count = 1 THEN
736 put_header;
737 END IF;
738 SELECT description INTO v_trans_stat FROM fnd_lookups WHERE
739 lookup_type= 'XTR_MDTSF_RTN_CODES'AND lookup_code= '60';
740 FND_FILE.PUT_LINE(FND_FILE.LOG,v_mdi_rec.source||', '||
741 v_mdi_rec.external_ref_code||', '||v_mdi_rec.bid||', '||v_mdi_rec.ask
742 ||', '||v_mdi_rec.mid||', '||v_mdi_rec.spread||', '
743 ||v_mdi_rec.datetime||', '||v_trans_stat||' [60]');
744
745 ELSIF (p_upd_date_missing = 'A') OR (q_quote_compare(v_mdi_rec.source,
746 v_mdi_rec.external_ref_code,v_ask,v_bid,v_mdi_rec.mid,v_mdi_rec.spread,
747 v_code)) THEN
748 --UPD_DATE_MISSING = Always OR File Quote <> System Quote
749 SELECT REF_NUMBER INTO v_ref FROM XTR_DATA_FEED_CODES
750 WHERE SOURCE = v_mdi_rec.source
751 AND EXTERNAL_REF_CODE = v_mdi_rec.external_ref_code;
752 SELECT RIC_CODE INTO v_ric FROM XTR_MARKET_PRICES
753 WHERE REF_NUMBER = v_ref;
754 calc_ask_bid(v_ref,v_ask,v_bid,v_mdi_rec.mid,v_mdi_rec.spread,v_code);
755
756 --transfer to mp
757 transfer_mp(v_ref, v_ask, v_bid, v_mdi_rec.rowid);
758 UPDATE XTR_MARKET_DATA_INTERFACE
759 SET REF_CODE = v_ric, RETURN_CODE = 20,
760 LAST_UPDATED_BY = FND_GLOBAL.user_id, LAST_UPDATED_DATE= SYSDATE
761 WHERE ROWID = v_mdi_rec.rowid;
762 ELSE
763 UPDATE XTR_MARKET_DATA_INTERFACE
764 SET RETURN_CODE = 70,LAST_UPDATED_BY = FND_GLOBAL.user_id,
765 LAST_UPDATED_DATE= SYSDATE WHERE ROWID = v_mdi_rec.rowid;
766 --Print error to concurrent log
767 v_e_count := v_e_count + 1;
768 IF v_e_count = 1 THEN
769 put_header;
770 END IF;
771 SELECT description INTO v_trans_stat FROM fnd_lookups WHERE
772 lookup_type= 'XTR_MDTSF_RTN_CODES'AND lookup_code= '70';
773 FND_FILE.PUT_LINE(FND_FILE.LOG,v_mdi_rec.source||', '||
774 v_mdi_rec.external_ref_code||', '||v_mdi_rec.bid||', '||v_mdi_rec.ask
775 ||', '||v_mdi_rec.mid||', '||v_mdi_rec.spread||', '
776 ||v_mdi_rec.datetime||', '||v_trans_stat||' [70]');
777 END IF;
778 ELSIF(q_date_check(v_mdi_rec.DATETIME,v_mdi_rec.source,
779 v_mdi_rec.external_ref_code)) THEN
780 --IF (UPD_HISTORY = N)
781 IF (p_upd_history = 'N') THEN
782 UPDATE XTR_MARKET_DATA_INTERFACE
783 SET RETURN_CODE = 80 ,LAST_UPDATED_BY = FND_GLOBAL.user_id,
784 LAST_UPDATED_DATE= SYSDATE WHERE ROWID = v_mdi_rec.rowid;
785 --Print error to concurrent log
786 v_e_count := v_e_count + 1;
787 IF v_e_count = 1 THEN
788 put_header;
789 END IF;
790 SELECT description INTO v_trans_stat FROM fnd_lookups WHERE
791 lookup_type= 'XTR_MDTSF_RTN_CODES'AND lookup_code= '80';
792 FND_FILE.PUT_LINE(FND_FILE.LOG,v_mdi_rec.source||', '||
793 v_mdi_rec.external_ref_code||', '||v_mdi_rec.bid||', '||v_mdi_rec.ask
794 ||', '||v_mdi_rec.mid||', '||v_mdi_rec.spread||', '
795 ||v_mdi_rec.datetime||', '||v_trans_stat||' [80]');
796 ELSE
797 SELECT REF_NUMBER INTO v_ref FROM XTR_DATA_FEED_CODES
798 WHERE SOURCE = v_mdi_rec.source
799 AND EXTERNAL_REF_CODE = v_mdi_rec.external_ref_code;
800 SELECT RIC_CODE INTO v_ric FROM XTR_MARKET_PRICES
801 WHERE REF_NUMBER = v_ref;
802 calc_ask_bid(v_ref,v_ask,v_bid,v_mdi_rec.mid,v_mdi_rec.spread,v_code);
803 /*
804 SELECT CURRENCY_A INTO v_currency_a FROM XTR_MARKET_PRICES
805 WHERE REF_NUMBER = v_ref;
806 SELECT CURRENCY_B INTO v_currency_b FROM XTR_MARKET_PRICES
807 WHERE REF_NUMBER = v_ref;
808 SELECT NOS_OF_DAYS INTO v_nos_of_days FROM XTR_MARKET_PRICES
809 WHERE REF_NUMBER = v_ref;
810 SELECT TERM_LENGTH INTO v_term_length FROM XTR_MARKET_PRICES
811 WHERE REF_NUMBER = v_ref;
812 SELECT TERM_TYPE INTO v_term_type FROM XTR_MARKET_PRICES
813 WHERE REF_NUMBER = v_ref;
814 SELECT TERM_YEAR INTO v_term_year FROM XTR_MARKET_PRICES
815 WHERE REF_NUMBER = v_ref;
816 */
817 SELECT currency_a, currency_b, nos_of_days, term_length, term_type,
818 term_type, term_year, day_count_basis
819 INTO v_currency_a, v_currency_b, v_nos_of_days, v_term_length,
820 v_term_type, v_term_type, v_term_year, v_day_count_basis
821 FROM xtr_market_prices
822 WHERE ref_number = v_ref;
823
824 --transfer to history table
825 archive_rates(FALSE,v_ask,v_bid,v_currency_a,v_currency_b,
826 v_nos_of_days,v_ric,v_term_length,v_term_type,v_term_year,
827 v_mdi_rec.datetime,v_day_count_basis);
828 UPDATE XTR_MARKET_DATA_INTERFACE
829 SET REF_CODE = v_ric, RETURN_CODE= 40 ,
830 LAST_UPDATED_BY = FND_GLOBAL.user_id, LAST_UPDATED_DATE= SYSDATE
831 WHERE ROWID = v_mdi_rec.rowid;
832 END IF;
833 ELSE
834 SELECT REF_NUMBER INTO v_ref FROM XTR_DATA_FEED_CODES
835 WHERE SOURCE = v_mdi_rec.source
836 AND EXTERNAL_REF_CODE = v_mdi_rec.external_ref_code;
837 SELECT RIC_CODE INTO v_ric FROM XTR_MARKET_PRICES
838 WHERE REF_NUMBER = v_ref;
839 calc_ask_bid(v_ref,v_ask,v_bid,v_mdi_rec.mid,v_mdi_rec.spread,v_code);
840 --transfer to mp
841 transfer_mp( v_ref,v_ask, v_bid,v_mdi_rec.rowid);
842 UPDATE XTR_MARKET_DATA_INTERFACE
843 SET REF_CODE = v_ric, RETURN_CODE = 10,
844 LAST_UPDATED_BY = FND_GLOBAL.user_id, LAST_UPDATED_DATE= SYSDATE
845 WHERE ROWID = v_mdi_rec.rowid;
846 END IF;
847
848 IF v_counter = 50 THEN
849 COMMIT;
850 v_counter:= 0;
851 -- lock the tables again because it was released by commit statement
852 LOCK TABLE XTR_MARKET_DATA_INTERFACE,XTR_MARKET_PRICES
853 IN EXCLUSIVE MODE NOWAIT;
854 END IF;
855 END LOOP;
856
857 COMMIT;
858
859 -- bug 2588763, update cross rates
860 for i in 1..v_currency_a_list.count loop
861 XTR_fps2_P.calc_cross_rate(v_currency_a_list(i),null);
862 end loop;
863 for i in 1..v_currency_b_list.count loop
864 XTR_fps2_P.calc_cross_rate(v_currency_b_list(i),null);
865 END LOOP;
866
867 EXCEPTION
868 WHEN e_inv THEN
869 FND_FILE.put_line(FND_FILE.LOG,'invalid parameter error. You must enter A,N, or C for the first parameter and Y or N for the second');
870
871 END market_data_transfer;
872
873
874 PROCEDURE upload_rates_to_gl_cp(errbuf OUT NOCOPY VARCHAR2,
875 retcode OUT NOCOPY VARCHAR2,
876 p_rel_abs IN VARCHAR2,
877 p_abs_start_date IN VARCHAR2,
878 p_abs_end_date IN VARCHAR2,
879 p_rel_end_date IN NUMBER,
880 p_rel_start_date IN NUMBER,
881 p_rate_calc IN VARCHAR2,
882 p_bid_mid_ask IN VARCHAR2,
883 p_conv_type IN VARCHAR2,
884 p_overwrite IN VARCHAR2) IS
885
886 t_currencies dbms_sql.varchar2_table;
887 t_bids dbms_sql.number_table;
888 t_offers dbms_sql.number_table;
889 t_mul_or_div dbms_sql.varchar2_table;
890 v_start_date DATE;
891 v_end_date DATE;
892 v_errbuf VARCHAR2(80);
893 v_retcode VARCHAR2(80);
894 p_batch_number_v VARCHAR2(40) DEFAULT NULL; --Bug 9300833
895
896 CURSOR get_from_usd_quote_avg(p_ref_date DATE) is
897 SELECT outer.currency quote_currency,
898 AVG(outer.bid_rate_against_usd) bid_rate_against_usd,
899 AVG(outer.offer_rate_against_usd) offer_rate_against_usd,
900 mc.divide_or_multiply
901 FROM xtr_spot_rates outer,
902 xtr_master_currencies mc
903 WHERE outer.currency <> 'USD'
904 AND outer.rate_date >= p_ref_date
905 AND outer.rate_date <= (p_ref_date+1)
906 AND outer.currency = mc.currency
907 GROUP BY outer.currency,mc.divide_or_multiply
908 UNION ALL
909 SELECT outer.currency quote_currency,
913 FROM xtr_spot_rates outer,
910 outer.bid_rate_against_usd,
911 outer.offer_rate_against_usd,
912 mc.divide_or_multiply
914 xtr_master_currencies mc
915 WHERE outer.currency <> 'USD'
916 AND outer.currency = mc.currency
917 AND NOT EXISTS (SELECT 1
918 FROM xtr_spot_rates inner
919 WHERE outer.currency = inner.currency
920 AND rate_date >= p_ref_date
921 AND rate_date <= (p_ref_date+1))
922 AND outer.rate_date = (SELECT max(rate_date)
923 FROM xtr_spot_rates inner
924 WHERE outer.currency = inner.currency
925 AND rate_date < p_ref_date)
926 ORDER BY quote_currency;
927
928 CURSOR get_from_usd_quote_eod(p_ref_date DATE) is
929 SELECT outer.currency,
930 outer.bid_rate_against_usd,
931 outer.offer_rate_against_usd,
932 mc.divide_or_multiply
933 FROM xtr_spot_rates outer,
934 xtr_master_currencies mc
935 WHERE outer.currency <> 'USD'
936 AND outer.currency = mc.currency
937 AND outer.rate_date = (SELECT max(rate_date)
938 FROM xtr_spot_rates inner
939 WHERE outer.currency = inner.currency
940 AND rate_date <= (p_ref_date+1))
941 ORDER BY outer.currency;
942
943 cursor get_failed_imports(p_start_date DATE,p_end_date DATE) is
944 SELECT DECODE(FROM_CURRENCY,'USD',TO_CURRENCY,FROM_CURRENCY) CURRENCY,NVL(ERROR_CODE,'VALIDATION_FAILURE') ERROR_CODE
945 FROM gl_daily_rates_interface
946 WHERE MODE_FLAG in ('X','F')
947 AND FROM_CONVERSION_DATE=p_start_date
948 AND TO_CONVERSION_DATE=p_end_date
949 AND USER_ID=fnd_global.user_id
950 ORDER BY MODE_FLAG,TO_CURRENCY;
951
952
953 Procedure Put_Log(Avr_Buff In Varchar2) is
954 Begin
955 Fnd_File.Put_Line(Fnd_file.LOG,Avr_Buff);
956 End;
957 PROCEDURE populate_rate(p_currency VARCHAR2,
958 p_date DATE,
959 p_bid_rate NUMBER,
960 p_offer_rate NUMBER,
961 p_mul_or_div VARCHAR2) IS
962
963 p_insert_into_gl BOOLEAN:=TRUE;
964 p_rate NUMBER;
965 p_dummy NUMBER;
966 p_mode_flag VARCHAR2(1);
967 p_from_currency VARCHAR2(15);
968 p_to_currency VARCHAR2(15);
969 CURSOR get_is_no_upload IS
970 SELECT 1
971 FROM xtr_master_currencies
972 WHERE currency = p_currency
973 AND gl_no_upload='Y'
974 AND ROWNUM=1;
975 BEGIN
976 OPEN get_is_no_upload;
977 FETCH get_is_no_upload INTO p_dummy;
978 IF get_is_no_upload%FOUND THEN
979 p_insert_into_gl:=FALSE;
980 END IF;
981 CLOSE get_is_no_upload;
982 if (p_overwrite='N') then
983 p_mode_flag:='N';
984 else
985 p_mode_flag:='T';
986 end if;
987
988 IF (p_insert_into_gl) THEN
989 if (p_bid_mid_ask='ASK') then
990 p_rate:=p_offer_rate;
991 elsif (p_bid_mid_ask='BID') then
992 p_rate:=p_bid_rate;
993 else
994 p_rate:=(p_offer_rate+p_bid_rate)/2;
995 end if;
996 if p_mul_or_div='*' then
997 p_from_currency := p_currency;
998 p_to_currency := 'USD';
999 else
1000 p_from_currency := 'USD';
1001 p_to_currency := p_currency;
1002 end if;
1003
1004 put_log(rpad(p_currency,15)||rpad(p_rate,15)||rpad(1/p_rate,15));
1005
1006 insert into gl_daily_rates_interface(
1007 FROM_CURRENCY,
1008 TO_CURRENCY,
1009 FROM_CONVERSION_DATE,
1010 TO_CONVERSION_DATE,
1011 USER_CONVERSION_TYPE,
1012 CONVERSION_RATE,
1013 MODE_FLAG,
1014 INVERSE_CONVERSION_RATE,
1015 USER_ID)
1016 values(
1017 p_from_currency,
1018 p_to_currency,
1019 p_date,
1020 p_date,
1021 p_conv_type,
1022 p_rate,
1023 p_mode_flag,
1024 null,
1025 fnd_global.user_id);
1026
1027 END IF;
1028 END populate_rate;
1029
1030 BEGIN
1031 retcode:='0';
1032 IF (p_rel_abs='R') THEN
1033 v_end_date := TRUNC(SYSDATE)-p_rel_end_date;
1034 v_start_date := TRUNC(SYSDATE)-p_rel_start_date;
1035 ELSIF (p_rel_abs='A') THEN
1036 v_end_date := fnd_date.canonical_to_date(p_abs_end_date);
1037 v_start_date := fnd_date.canonical_to_date(p_abs_start_date);
1038 END IF;
1039
1040 IF ( v_start_date is null
1041 or v_end_date is null
1042 or p_bid_mid_ask is null
1043 or p_bid_mid_ask not in ('BID','MID','ASK')
1044 or v_start_date > v_end_date
1045 ) THEN
1046 put_log(fnd_message.get_string('XTR','XTR_1328'));
1047 retcode:='2';
1048 END IF;
1049
1050 if (retcode<>'2') then
1051
1052 for i in 0..(v_end_date-v_start_date) loop
1053
1054 fnd_message.set_name('XTR','XTR_GL_UPLOAD_RATES');
1055 fnd_message.set_token('RATE_TYPE',p_conv_type);
1056 fnd_message.set_token('RATE_DATE',v_start_date+i);
1057 put_log(fnd_message.get);
1058 put_log(rpad(' ',15)||rpad(fnd_message.get_string('XTR','XTR_RATE_QUOTE'),30,'-'));
1059 put_log(rpad(fnd_message.get_string('XTR','XTR_CURRENCY_PROMPT'),15)||rpad(fnd_message.get_string('XTR','XTR_BASE_UNIT'),15)||rpad(fnd_message.get_string('XTR','XTR_CONTRA_UNIT'),15));
1060
1061 IF (p_rate_calc='DAY_AVG') THEN
1062 OPEN get_from_usd_quote_avg(v_start_date+i);
1063 FETCH get_from_usd_quote_avg BULK COLLECT INTO t_currencies,t_bids,t_offers,t_mul_or_div;
1064 CLOSE get_from_usd_quote_avg;
1065 ELSE
1066 OPEN get_from_usd_quote_eod(v_start_date+i);
1067 FETCH get_from_usd_quote_eod BULK COLLECT INTO t_currencies,t_bids,t_offers,t_mul_or_div;
1068 CLOSE get_from_usd_quote_eod;
1069 END IF;
1070
1071 FOR j IN 1..t_currencies.COUNT LOOP
1072 populate_rate(t_currencies(j),v_start_date+i,t_bids(j),t_offers(j),t_mul_or_div(j));
1073 END LOOP;
1074 put_log(' ');
1075
1076 end loop;
1077
1078 --GL_CRM_UTILITIES_PKG.daily_rates_import(v_errbuf,v_retcode);
1079 GL_CRM_UTILITIES_PKG.daily_rates_import(v_errbuf,v_retcode, p_batch_number_v); --BUG 9300833
1080
1081 for c_error in get_failed_imports(v_start_date,v_end_date) loop
1082 if (retcode='0') then
1083 retcode:='1';
1084 put_log(' ');
1085 put_log(fnd_message.get_string('XTR','XTR_GL_UPLOAD_RATES_FAIL'));
1086 put_log(rpad(fnd_message.get_string('XTR','XTR_CURRENCY_PROMPT'),15)||rpad(fnd_message.get_string('XTR','XTR_ERROR'),30));
1087 put_log(rpad('-',45,'-'));
1088 end if;
1089 put_log(rpad(c_error.currency,15)||rpad(c_error.error_code,30));
1090 end loop;
1091
1092 delete from gl_daily_rates_interface
1093 where MODE_FLAG in ('X','F')
1094 and USER_ID=fnd_global.user_id
1095 and FROM_CONVERSION_DATE=TO_CONVERSION_DATE
1096 and FROM_CONVERSION_DATE>=v_start_date
1097 and FROM_CONVERSION_DATE<=v_end_date;
1098
1099 END IF;
1100 END upload_rates_to_gl_cp;
1101
1102 --------------------------------------------------------------------------------------------------------------------
1103 END xtr_market_data_interface_p;