DBA Data[Home] [Help]

PACKAGE BODY: APPS.FA_MC_UTIL_PVT

Source


4 g_release                  number  := fa_cache_pkg.fazarel_release;
1 PACKAGE BODY FA_MC_UTIL_PVT as
2 /* $Header: FAVMCUB.pls 120.13.12020000.3 2012/12/11 10:22:03 spooyath ship $   */
3 
5 
6 FUNCTION get_existing_rate
7    (p_set_of_books_id        IN      number,
8     p_transaction_header_id  IN      number,
9     px_rate                  IN OUT NOCOPY number,
10     px_avg_exchange_rate        OUT NOCOPY number
11    , p_log_level_rec        IN     FA_API_TYPES.log_level_rec_type) RETURN BOOLEAN IS
12 
13    l_reporting_currency_code varchar2(15);
14 
15    l_exchange_rate           number;
16    l_avg_exchange_rate       number;
17    l_complete                varchar2(1);
18    l_result_code             varchar2(15);
19 
20    -- Bug 15868325
21    cursor c_get_sob_corp_cur is
22    select glcr.ledger_id
23    from   gl_ledgers gltr,
24           fa_mc_book_controls mcbc,
25           gl_ledgers glcr
26    where  gltr.ledger_id = p_set_of_books_id
27    and    gltr.currency_code = glcr.currency_code
28    and    gltr.chart_of_accounts_id = glcr.chart_of_accounts_id
29    and    gltr.ledger_id <> glcr.ledger_id
30    and    mcbc.book_type_code = fa_cache_pkg.fazcbc_record.distribution_source_book
31    and    glcr.ledger_id = mcbc.set_of_books_id;
32 
33    l_found_in_corp           number := 0;
34    l_set_of_books_id         number;
35 
36    l_calling_fn              varchar2(35) := 'fa_mc_util_pvt.get_existing_rate';
37    calc_err                  EXCEPTION;
38 
39 BEGIN
40 
41    l_reporting_currency_code := gl_mc_currency_pkg.get_currency_code (
42                                     p_set_of_books_id          => p_set_of_books_id);
43 
44    -- Bug 15868325 :  For tax book, if the exchange_rate is not available
45    -- for the sob_id in the corp book. Get the ledger_id from the corp
46    -- which has the same currency and use the rate from that ledger_id
47 
48    l_set_of_books_id := p_set_of_books_id;
49    if fa_cache_pkg.fazcbc_record.book_class = 'TAX' then
50 
51       if (p_log_level_rec.statement_level) then
52          fa_debug_pkg.add(l_calling_fn,'Get rate for tax book: ',
53                           fa_cache_pkg.fazcbc_record.book_type_code, p_log_level_rec => p_log_level_rec);
54       end if;
55 
56       select count(1)
57       into   l_found_in_corp
58       FROM   fa_mc_books_rates
59       WHERE  set_of_books_id = p_set_of_books_id
60       AND    transaction_header_id = p_transaction_header_id;
61 
62       if l_found_in_corp = 0 then
63 
64          if (p_log_level_rec.statement_level) then
65             fa_debug_pkg.add(l_calling_fn,'Fetching cur ',
66                              'c_get_sob_corp_cur', p_log_level_rec => p_log_level_rec);
67          end if;
68 
69          open  c_get_sob_corp_cur;
70          fetch c_get_sob_corp_cur into l_set_of_books_id;
71          close c_get_sob_corp_cur;
72 
73          if (p_log_level_rec.statement_level) then
77 
74             fa_debug_pkg.add(l_calling_fn,'After l_set_of_books_id ',
75                              l_set_of_books_id, p_log_level_rec => p_log_level_rec);
76          end if;
78       end if;
79    end if;
80    -- Bug 15868325 : End
81 
82    if (p_log_level_rec.statement_level) then
83       fa_debug_pkg.add(l_calling_fn,'Calling get_rate for ',
84                        l_set_of_books_id, p_log_level_rec => p_log_level_rec);
85    end if;
86 
87    -- get the exchange rate from the corporate transaction
88    MC_FA_UTILITIES_PKG.get_rate
89          (p_set_of_books_id        => l_set_of_books_id,
90           p_transaction_header_id  => p_transaction_header_id,
91           p_currency_code          => l_reporting_currency_code,
92           p_exchange_rate          => l_exchange_rate,
93           p_avg_exchange_rate      => l_avg_exchange_rate,
94           p_complete               => l_complete,
95           p_result_code            => l_result_code, p_log_level_rec => p_log_level_rec);
96 
97    if (l_result_code <> 'FOUND') then
98        raise calc_err;
99    end if;
100 
101    px_rate              := l_exchange_rate;
102    px_avg_exchange_rate := l_avg_exchange_rate;
103 
104    return true;
105 
106 EXCEPTION
107    when calc_err then
108       fa_srvr_msg.add_message(calling_fn => 'fa_mc_util_pvt.get_existing_rate',  p_log_level_rec => p_log_level_rec);
109       return false;
110 
111    when others then
112       fa_srvr_msg.add_sql_error(calling_fn => 'fa_mc_util_pvt.get_existing_rate',  p_log_level_rec => p_log_level_rec);
113       return false;
114 
115 END get_existing_rate;
116 
117 ----------------------------------------------------------------------------------------
118 
119 FUNCTION get_trx_rate
120    (p_prim_set_of_books_id       IN     number,
121     p_reporting_set_of_books_id  IN     number,
122     px_exchange_date             IN OUT NOCOPY date,
123     p_book_type_code             IN     varchar2,
124     px_rate                      IN OUT NOCOPY number
125    , p_log_level_rec        IN     FA_API_TYPES.log_level_rec_type) RETURN BOOLEAN IS
126 
127    l_exchange_date           date;
128    l_primary_currency_code   varchar2(15);
129    l_conversion_type         gl_daily_conversion_types.conversion_type%TYPE;
130    l_result_code             varchar2(15);
131    l_exchange_rate           number;
132    l_denominator_rate        number;
133    l_numerator_rate          number;
134 
135    l_reporting_currency_code varchar2(15);
136    l_fixed_rate              boolean;
137    l_relation                varchar2(15);
138    l_trans_date              date;
139    --Secondary_changes
140    l_secondary_sob_id         number;
141    l_application_id           number;
142 
143    calc_err   EXCEPTION;
144 
145 BEGIN
146 
147             if (p_log_level_rec.statement_level) then
148                fa_debug_pkg.add('get_trx',
149                      'getting',
150                      'currency code - primary', p_log_level_rec => p_log_level_rec);
151             end if;
152 
153 
154    l_primary_currency_code := gl_mc_currency_pkg.get_currency_code (
155                                     p_set_of_books_id          => p_prim_set_of_books_id);
156 
157 
158             if (p_log_level_rec.statement_level) then
159                fa_debug_pkg.add('get_trx',
160                      'getting',
161                      'currency code - reporting', p_log_level_rec => p_log_level_rec);
162             end if;
163 
164    l_reporting_currency_code := gl_mc_currency_pkg.get_currency_code (
165                                     p_set_of_books_id          => p_reporting_set_of_books_id);
166 
167             if (p_log_level_rec.statement_level) then
168                fa_debug_pkg.add('get_trx',
169                      'getting',
170                      'exchange_rate', p_log_level_rec => p_log_level_rec);
171             end if;
172 
173 
174    l_trans_date := px_exchange_date;
175    l_secondary_sob_id := FA_XLA_EVENTS_PVT.get_secondary_sob_id(p_book_type_code);
176    if(l_secondary_sob_id is not null) and  (p_prim_set_of_books_id <> p_reporting_set_of_books_id)then
177       l_application_id := 101;
178    else
179       l_application_id := 140;
180    end if;
181    gl_mc_currency_pkg.get_rate(
182          p_primary_set_of_books_id   => p_prim_set_of_books_id,
183          p_reporting_set_of_books_id => p_reporting_set_of_books_id,
184          p_trans_date                => l_trans_date,
185          p_trans_currency_code       => l_primary_currency_code,
186          p_trans_conversion_type     => l_conversion_type,
187          p_trans_conversion_date     => px_exchange_date,
188          p_trans_conversion_rate     => l_exchange_rate,
189          p_application_id            => l_application_id,
190          p_org_id                    => NULL,
191          p_fa_book_type_code         => p_book_type_code,
192          p_je_source_name            => NULL,
193          p_je_category_name          => NULL,
194          p_result_code               => l_result_code,
195          p_denominator_rate          => l_denominator_rate,
196          p_numerator_rate            => l_numerator_rate);
197 
198             if (p_log_level_rec.statement_level) then
199                fa_debug_pkg.add('get_trx',
200                      'getting',
201                      'relation', p_log_level_rec => p_log_level_rec);
202             end if;
203 
204 
205     gl_currency_api.get_relation(
206          x_from_currency             => l_primary_currency_code,
207          x_to_currency               => l_reporting_currency_code,
211 
208          x_effective_date            => px_exchange_date,
209          x_fixed_rate                => l_fixed_rate,
210          x_relationship              => l_relation);
212             if (p_log_level_rec.statement_level) then
213                fa_debug_pkg.add('get_trx',
214                      'done getting',
215                      'relation', p_log_level_rec => p_log_level_rec);
216             end if;
217 
218 
219     if l_fixed_rate then
220        px_rate := l_numerator_rate / l_denominator_rate;
221     else
222        px_rate := l_exchange_rate;
223     end if;
224 
225     return true;
226 
227 EXCEPTION
228    when calc_err then
229       fa_srvr_msg.add_message(calling_fn => 'fa_mc_util_pvt.get_trx_rate',  p_log_level_rec => p_log_level_rec);
230       return false;
231 
232    when others then
233       fa_srvr_msg.add_sql_error(calling_fn => 'fa_mc_util_pvt.get_trx_rate',  p_log_level_rec => p_log_level_rec);
234       return false;
235 
236 END get_trx_rate;
237 
238 -----------------------------------------------------------------------------
239 
240 FUNCTION get_latest_rate
241    (p_asset_id                   IN     number,
242     p_book_type_code             IN     varchar2,
243     p_set_of_books_id            IN     number,
244     px_rate                         OUT NOCOPY number,
245     px_avg_exchange_rate            OUT NOCOPY number
246    , p_log_level_rec        IN     FA_API_TYPES.log_level_rec_type) RETURN BOOLEAN IS
247 
248 BEGIN
249 
250    select br1.exchange_rate,
251           br1.avg_exchange_rate
252      into px_rate,
253           px_avg_exchange_rate
254      from fa_mc_books_rates br1
255     where br1.asset_id              = p_asset_id
256       and br1.book_type_code        = p_book_type_code
257       and br1.set_of_books_id       = p_set_of_books_id
258       and br1.transaction_header_id =
259           (select max(br2.transaction_header_id)
260              from fa_mc_books_rates br2
261             where br2.asset_id        = p_asset_id
262               and br2.book_type_code  = p_book_type_code
263               and br2.set_of_books_id = p_set_of_books_id);
264 
265    return true;
266 
267 EXCEPTION
268 
269    when others then
270       fa_srvr_msg.add_sql_error(calling_fn => 'fa_mc_util_pvt.get_latest_rate',  p_log_level_rec => p_log_level_rec);
271       return false;
272 
273 END get_latest_rate;
274 
275 -----------------------------------------------------------------------------
276 
277 FUNCTION get_invoice_rate
278    (p_inv_rec                    IN     FA_API_TYPES.inv_rec_type,
279     p_book_type_code             IN     varchar2,
280     p_set_of_books_id            IN     number,
281     px_exchange_date             IN OUT NOCOPY date,
282     px_inv_rate_rec              IN OUT NOCOPY FA_API_TYPES.inv_rate_rec_type
283    , p_log_level_rec        IN     FA_API_TYPES.log_level_rec_type) RETURN boolean IS
284 
285    -- new variables for merging mrc trigger logic
286    l_exchange_date              DATE;
287    l_inv_exchange_date          DATE;
288    l_mc_inv_exchange_date       DATE;
289    l_exchange_rate              NUMBER;
290    l_inv_exchange_rate          NUMBER;
291    l_mc_inv_exchange_rate       NUMBER;
292    l_current_asset_cost         NUMBER;
293    l_result_code                VARCHAR2(15);
294    l_inv_currency_code          fnd_currencies.currency_code%TYPE;
295    l_mc_inv_currency_code       fnd_currencies.currency_code%TYPE;
296    l_exchange_rate_type         gl_daily_conversion_types.conversion_type%TYPE;
297    l_inv_exchange_rate_type     gl_daily_conversion_types.conversion_type%TYPE;
298    l_mc_inv_exchange_rate_type  gl_daily_conversion_types.conversion_type%TYPE;
299    l_denominator_rate           NUMBER;
300    l_numerator_rate             NUMBER;
301    l_line_base_amount           NUMBER;
302    l_mc_line_base_amount        NUMBER;
303    l_prj_fixed_assets_cost	NUMBER;
304 
305    l_currency_code              fnd_currencies.currency_code%TYPE;
306    l_primary_currency_code      fnd_currencies.currency_code%TYPE;
307    l_primary_sob_id             NUMBER;
308 
309 
310    l_trans_date                 date;
311 
312    l_calling_fn                 varchar2(35) := 'fa_mc_util_pvt.get_invoice_rate';
313 
314    -- exceptions
315    error_found                  exception;
316 
317 BEGIN
318 
319    l_primary_sob_id := fa_cache_pkg.fazcbc_record.set_of_books_id;
320    l_result_code := 'NOT_FOUND';
321 
322    -- first check if this is a split line and if so,
323    -- attempt to get the rate from the parent.  if it
324    -- doesn't exist, we'll just enter the main logic below
325 
326    if (p_inv_rec.split_merged_code = 'SC') then
327 
328       BEGIN
329          l_result_code := 'FOUND';
330 
331          select decode(rate.exchange_rate,0,
332                         decode(ad.fixed_assets_cost,0,0,
333                               (rate.fixed_assets_cost/ad.fixed_assets_cost)
334                         ), rate.exchange_rate
335                       )
336            into l_exchange_rate
337            from fa_mc_mass_rates rate,
338                 fa_mass_additions ad
339           where rate.mass_addition_id = p_inv_rec.split_parent_mass_additions_id
340             and rate.mass_addition_id = ad.mass_addition_id
341             and rate.set_of_books_id  = p_set_of_books_id;
342 
343          if (p_log_level_rec.statement_level) then
344             fa_debug_pkg.add(l_calling_fn,
345                   'Exchange rate for parent due to SC ',
346                   l_exchange_rate, p_log_level_rec => p_log_level_rec);
347          end if;
351               -- this can happen when a reporting book is
348 
349       EXCEPTION
350          when NO_DATA_FOUND then
352               -- associated to a FA book but not in AP
353               l_result_code := 'NOT_FOUND';
354          when OTHERS then
355               fa_srvr_msg.add_sql_error(
356                  calling_fn => l_calling_fn,
357                  p_log_level_rec          => p_log_level_rec);
358               raise error_found;
359       END;
360 
361    end if;
362 
363    -- if rate not found from split logic above
364 
365    if (l_result_code = 'NOT_FOUND') then
366 
367       BEGIN
368 
369          -- get the currency codes first
370          if (p_inv_rec.feeder_system_name = 'ORACLE PAYABLES' or
371              p_inv_rec.feeder_system_name = 'ORACLE PROJECTS') then
372 
373             if (p_log_level_rec.statement_level) then
374                fa_debug_pkg.add(l_calling_fn,
375                      'getting',
376                      'currency code - reporting', p_log_level_rec => p_log_level_rec);
377             end if;
378 
379             l_currency_code         := gl_mc_currency_pkg.get_currency_code (
380                                            p_set_of_books_id          => p_set_of_books_id);
381 
382             if (p_log_level_rec.statement_level) then
383                fa_debug_pkg.add(l_calling_fn,
384                      'getting',
385                      'currency code - primary', p_log_level_rec => p_log_level_rec);
386             end if;
387 
388             l_primary_currency_code := gl_mc_currency_pkg.get_currency_code (
389                                            p_set_of_books_id          => l_primary_sob_id);
390 
391          end if;
392 
393          if (p_log_level_rec.statement_level) then
394             fa_debug_pkg.add(l_calling_fn,
395                   'feeder system name',
396                   p_inv_rec.feeder_system_name, p_log_level_rec => p_log_level_rec);
397          end if;
398 
399          if (p_inv_rec.feeder_system_name = 'ORACLE PAYABLES' and
400              G_release = 11) then
401 
402             BEGIN
403                l_result_code := 'FOUND';
404                -- l_mc_inv_currency_code is the transaction currency
405                -- of the invoice in AP
406                -- l_mc_inv_exchange_rate is the exchange rate used to
407                -- convert from transaction currency to reporting currency
408                -- l_result_code will be set to NOT_FOUND if no match
409                -- for invoice is found in ap_mc_invoice_dists
410                -- which means that reporting book is not set up as
411                -- conversion option for AP for the primary book in GL
412 
413                BEGIN
414                   select a.invoice_currency_code,
415                          nvl(b.exchange_rate, 1),
416                          nvl(b.exchange_date, a.invoice_date),
417                          b.exchange_rate_type,
418                          nvl(b.base_amount,   b.amount)
419                     into l_mc_inv_currency_code,
420                          l_mc_inv_exchange_rate,
421                          l_mc_inv_exchange_date,
422                          l_mc_inv_exchange_rate_type,
423                          l_mc_line_base_amount
424                     from ap_invoices_all a,
425                          ap_mc_invoice_dists b
426                    where a.invoice_id               = p_inv_rec.invoice_id
427                      and a.invoice_id               = b.invoice_id
428                      and b.distribution_line_number = p_inv_rec.ap_distribution_line_number
429                      and b.set_of_books_id          = p_set_of_books_id;
430 
431                EXCEPTION
432                   when NO_DATA_FOUND then
433                        -- this can happen when a reporting book is
434                        -- associated to a FA book but not in AP
435                        l_result_code := 'NOT_FOUND';
436 
437                   when OTHERS then
438                        fa_srvr_msg.add_message(
439                           calling_fn => l_calling_fn,
440                           name       => 'FA_MRC_SLT_MC_RECS',
441                           token1     => 'TABLE',
442                           value1     => 'ap_mc_invoice_dists',
443                           token2     => 'TRIGGER',
444                           value2     => 'fa_mc_mass_additions_aiud', p_log_level_rec => p_log_level_rec);
445                        raise error_found;
446                END;
447 
448                BEGIN
449 
450                   -- l_inv_exchange_rate is the exchange rate from
451                   -- transaction currency in AP to functional currency
452                   -- in AP when transaction is in a foreign currency
453 
454                   select a.invoice_currency_code,
455                          nvl(b.exchange_rate, 1),
456                          nvl(b.exchange_date, a.invoice_date),
457                          b.exchange_rate_type,
458                          nvl(b.base_amount, b.amount)
459                     into l_inv_currency_code,
460                          l_inv_exchange_rate,
461                          l_inv_exchange_date,
462                          l_inv_exchange_rate_type,
463                          l_line_base_amount
464                     from ap_invoices_all a,
465                          ap_invoice_distributions_all b
466                    where a.invoice_id               = p_inv_rec.invoice_id
467                      and a.invoice_id               = b.invoice_id
471                   when OTHERS then
468                      and b.distribution_line_number = p_inv_rec.ap_distribution_line_number;
469 
470                EXCEPTION
472                        fa_srvr_msg.add_message(
473                           calling_fn => l_calling_fn,
474                           name       => 'FA_MRC_SLT_INV_INFO',
475                           token1     => 'TRIGGER',
476                           value1     => 'fa_mc_mass_additions_aiud',
477                           token2     => 'INVOICE_ID',
478                           value2     => to_char(p_inv_rec.invoice_id),
479                           token3     => 'DISTRIBUTION_LINE_NUMBER',
480                           value3     => to_char(p_inv_rec.ap_distribution_line_number),
481                           p_log_level_rec => p_log_level_rec);
482                        raise error_found;
483                END;
484 
485                if (l_result_code = 'FOUND') then
486                   -- found invoice in ap_mc_invoice_dists for this reporting book
487 
488                   if (l_line_base_amount = 0) then
489                      l_exchange_rate := 1;
490                   else
491                      l_exchange_rate := (l_mc_line_base_amount/
492                                          l_line_base_amount);
493                   end if;
494                else
495                   -- invoice not found in ap_mc_invoice_dists table for reporting book
496                   if (l_inv_currency_code <> l_currency_code) then
497 
498                      l_exchange_date      := l_inv_exchange_date;
499                      l_exchange_rate      := l_inv_exchange_rate;
500                      l_exchange_rate_type := l_inv_exchange_rate_type;
501 
502                      gl_mc_currency_pkg.get_rate(
503                         l_primary_sob_id, -- v_rsob.primary_set_of_books_id,
504                         p_set_of_books_id, -- v_rsob.set_of_books_id
505                         l_inv_exchange_date,
506                         l_inv_currency_code,
507                         l_exchange_rate_type,
508                         l_exchange_date,
509                         l_exchange_rate,
510                         140,
511                         null,
512                         p_book_type_code,
513                         null,
514                         null,
515                         l_result_code,
516                         l_denominator_rate,
517                         l_numerator_rate);
518 
519                      -- bug 2095221 not inverting when get_rate have been called.
520                      -- bug 2533988 reverting change for 2095221
521 
522                      l_exchange_rate := l_exchange_rate /
523                                         l_inv_exchange_rate;
524                   else
525                      l_exchange_rate := 1 / l_inv_exchange_rate;
526                   end if;
527                end if; -- end of if l_result_code = FOUND
528             END;
529 
530          elsif (p_inv_rec.feeder_system_name = 'ORACLE PROJECTS') then
531 
532             l_result_code := 'FOUND';
533 -- bug 4583014
534 --            if (p_inv_rec.merged_code = 'MP' OR
535 --                l_primary_currency_code = l_currency_code) then
536 --               l_exchange_rate := 1;
537 
538             if ((p_inv_rec.merged_code = 'MP'
539 			and p_inv_rec.fixed_assets_cost = 0) OR
540                 	l_primary_currency_code = l_currency_code) then
541                l_exchange_rate := 1;
542 -- end bug
543             else
544                BEGIN
545                   select current_asset_cost
546                     into l_current_asset_cost
547                     from pa_mc_prj_ast_lines_all
548                    where project_asset_line_id = p_inv_rec.project_asset_line_id
549                      and set_of_books_id       = p_set_of_books_id;
550 
551 -- bug 4583014 changing if
552 --                  if (p_inv_rec.fixed_assets_cost = 0) then
553 
554                   if (p_inv_rec.fixed_assets_cost = 0 or nvl(l_current_asset_cost,0)  = 0 ) then
555                       l_exchange_rate := 1;
556                   else
557 
558 		      if p_inv_rec.split_code = 'SC' then
559                          -- BUG# 3892604
560                          -- get value from PA when not found
561 			 select current_asset_cost
562 			 into l_prj_fixed_assets_cost
563 			 from pa_project_asset_lines_all
564                          where project_asset_line_id = p_inv_rec.project_asset_line_id;
565 		      else
566 			 l_prj_fixed_assets_cost := p_inv_rec.fixed_assets_cost;
567 		      end if;
568 
569                       l_exchange_rate := l_current_asset_cost /
570 					      NVL(l_prj_fixed_assets_cost,1);
571 
572                    end if;
573 
574                EXCEPTION
575                   when NO_DATA_FOUND then
576                        l_result_code := 'NOT_FOUND';
577                   when OTHERS then
578                        fa_srvr_msg.add_message(
579                           calling_fn => l_calling_fn,
580                           name       => 'FA_MRC_SLT_MC_RECS',
581                           token1     => 'TABLE',
582                           value1     => 'pa_mc_prj_ast_lines_all',
583                           token2     => 'TRIGGER',
584                           value2     => 'fa_mc_mass_additions_aiud', p_log_level_rec => p_log_level_rec);
585                        raise error_found;
586                END;
587 
588                if (l_result_code = 'NOT_FOUND') then
589 
590                   -- NOTE: the old mrc trigger used sysdate here,
591                   -- but as this will be called at post not insert
592                   -- this is not consistent.  need to investigate
593                   -- using another date in the table
594                   --  ( i.e. creation_date/create_batch_date/invoice_date/last_update_date/dpis )
595 
596                   l_exchange_date      := SYSDATE;
597                   l_exchange_rate      := NULL;
598                   l_exchange_rate_type := NULL;
599                   l_trans_date         := l_exchange_date;
600 
601                   gl_mc_currency_pkg.get_rate(
602                      l_primary_sob_id,       -- v_rsob.primary_set_of_books_id,
603                      p_set_of_books_id,      -- v_rsob.set_of_books_id,
604                      l_trans_date,           -- change / verify
605                      l_primary_currency_code,
606                      l_exchange_rate_type,
607                      l_exchange_date,
608                      l_exchange_rate,
609                      140,
610                      null,
611                      p_book_type_code,
612                      null,
613                      null,
614                      l_result_code,
615                      l_denominator_rate,
616                      l_numerator_rate);
617                end if;
618             end if; -- end if mp / currency code
619 
620          else
621             -- if the rate is not provided for non-ap and non-pa lines,
622             -- derive and load it...  this is needed for quick/detail adds
623             -- and source line additions as well as for flexibility
624 
625             -- also the R12 logic for all lines
626 
627 if (p_log_level_rec.statement_level) then
628    fa_debug_pkg.add('X','p sob', l_primary_sob_id, p_log_level_rec => p_log_level_rec);
629    fa_debug_pkg.add('X','r sob', p_set_of_books_id, p_log_level_rec => p_log_level_rec);
630    fa_debug_pkg.add('X','p date', px_exchange_date, p_log_level_rec => p_log_level_rec);
631    fa_debug_pkg.add('X','p book', p_book_type_code, p_log_level_rec => p_log_level_rec);
632 
633 end if;
634 
635             if not get_trx_rate
636                       (p_prim_set_of_books_id       => l_primary_sob_id,
637                        p_reporting_set_of_books_id  => p_set_of_books_id,
638                        px_exchange_date             => px_exchange_date,
639                        p_book_type_code             => p_book_type_code,
640                        px_rate                      => l_exchange_rate,
641                        p_log_level_rec              => p_log_level_rec) then
642                raise error_found;
643             end if;
644 
645          end if; -- 11i/ap/pa/other
646       END;       -- BEGIN block for invoices
647    end if;       -- if found (for split)
648 
649    -- assign the exchange rate back to the record
650    px_inv_rate_rec.exchange_rate := l_exchange_rate;
651 
652    return true;
653 
654 EXCEPTION
655 
656    when error_found then
657       fa_srvr_msg.add_message(calling_fn => l_calling_fn, p_log_level_rec => p_log_level_rec);
658       return false;
659 
660    when others then
661       fa_srvr_msg.add_sql_error(calling_fn => l_calling_fn, p_log_level_rec => p_log_level_rec);
662       return false;
663 
664 
665 END get_invoice_rate;
666 
667 END FA_MC_UTIL_PVT;