DBA Data[Home] [Help]

PACKAGE BODY: APPS.FA_INV_XFR_PUB

Source


1 PACKAGE BODY FA_INV_XFR_PUB as
2 /* $Header: FAPIXFRB.pls 120.30.12020000.3 2012/11/30 12:12:51 spooyath ship $   */
3 
4 --*********************** Global constants ******************************--
5 
6 G_PKG_NAME      CONSTANT   varchar2(30) := 'FA_UNPLANNED_PUB';
7 G_API_NAME      CONSTANT   varchar2(30) := 'Unplanned API';
8 G_API_VERSION   CONSTANT   number       := 1.0;
9 
10 g_log_level_rec fa_api_types.log_level_rec_type;
11 g_release       number  := fa_cache_pkg.fazarel_release;
12 
13 --*********************** Private procedures ******************************--
14 
15 FUNCTION do_all_books
16            (p_src_trans_rec          IN FA_API_TYPES.trans_rec_type,
17             p_src_asset_hdr_rec      IN FA_API_TYPES.asset_hdr_rec_type,
18             p_dest_trans_rec         IN FA_API_TYPES.trans_rec_type,
19             p_dest_asset_hdr_rec     IN FA_API_TYPES.asset_hdr_rec_type,
20             p_period_counter         IN NUMBER,
21             p_ccid                   IN NUMBER,
22             p_src_asset_type         IN VARCHAR2,
23             p_dest_asset_type        IN VARCHAR2,
24             p_src_current_units      IN NUMBER,
25             p_dest_current_units     IN NUMBER,
26             p_calling_fn             IN varchar2
27 , p_log_level_rec        IN     FA_API_TYPES.log_level_rec_type) return boolean;
28 
29 --*********************** Public procedures ******************************--
30 
31 PROCEDURE do_transfer
32    (p_api_version             IN     NUMBER,
33     p_init_msg_list           IN     VARCHAR2 := FND_API.G_FALSE,
34     p_commit                  IN     VARCHAR2 := FND_API.G_FALSE,
35     p_validation_level        IN     NUMBER   := FND_API.G_VALID_LEVEL_FULL,
36     p_calling_fn              IN     VARCHAR2 := NULL,
37     x_return_status              OUT NOCOPY VARCHAR2,
38     x_msg_count                  OUT NOCOPY NUMBER,
39     x_msg_data                   OUT NOCOPY VARCHAR2,
40     px_src_trans_rec          IN OUT NOCOPY FA_API_TYPES.trans_rec_type,
41     px_src_asset_hdr_rec      IN OUT NOCOPY FA_API_TYPES.asset_hdr_rec_type,
42     px_dest_trans_rec         IN OUT NOCOPY FA_API_TYPES.trans_rec_type,
43     px_dest_asset_hdr_rec     IN OUT NOCOPY FA_API_TYPES.asset_hdr_rec_type,
44     p_inv_tbl                 IN     FA_API_TYPES.inv_tbl_type) IS
45 
46    -- used for sob cache
47    l_mrc_sob_type_code              varchar2(1);
48 
49    -- shared
50    l_inv_trans_rec                  FA_API_TYPES.inv_trans_rec_type;
51    l_return_status                  VARCHAR2(1);
52    l_return_status_bool             boolean;
53    l_group_reclass_options_rec      FA_API_TYPES.group_reclass_options_rec_type;
54 
55    -- source
56    l_src_asset_fin_rec_adj          FA_API_TYPES.asset_fin_rec_type;
57    l_src_asset_fin_rec_new          FA_API_TYPES.asset_fin_rec_type;
58    l_src_asset_fin_mrc_tbl_new      FA_API_TYPES.asset_fin_tbl_type;
59    l_src_inv_tbl                    FA_API_TYPES.inv_tbl_type;
60    l_src_asset_deprn_rec_adj        FA_API_TYPES.asset_deprn_rec_type;
61    l_src_asset_deprn_rec_new        FA_API_TYPES.asset_deprn_rec_type;
62    l_src_asset_deprn_mrc_tbl_new    FA_API_TYPES.asset_deprn_tbl_type;
63 
64    -- destination
65    l_dest_asset_fin_rec_adj         FA_API_TYPES.asset_fin_rec_type;
66    l_dest_asset_fin_rec_new         FA_API_TYPES.asset_fin_rec_type;
67    l_dest_asset_fin_mrc_tbl_new     FA_API_TYPES.asset_fin_tbl_type;
68    l_dest_inv_tbl                   FA_API_TYPES.inv_tbl_type;
69    l_dest_asset_deprn_rec_adj       FA_API_TYPES.asset_deprn_rec_type;
70    l_dest_asset_deprn_rec_new       FA_API_TYPES.asset_deprn_rec_type;
71    l_dest_asset_deprn_mrc_tbl_new   FA_API_TYPES.asset_deprn_tbl_type;
72 
73    l_src_asset_type_rec             FA_API_TYPES.asset_type_rec_type;
74    l_dest_asset_type_rec            FA_API_TYPES.asset_type_rec_type;
75 
76    l_from_asset_type     varchar2(15);
77    l_to_asset_type       varchar2(15);
78    l_from_current_units  number;
79    l_to_current_units    number;
80 
81    l_period_rec          FA_API_TYPES.period_rec_type;
82    l_transaction_date    date;
83 
84    l_clearing_ccid    number;
85    l_interco_impact   boolean;
86 
87    l_rowid               varchar2(40);
88 
89    l_current_period_counter         NUMBER;
90    l_calling_fn                     VARCHAR2(35) := 'fa_inv_xfr_pub.do_transfer';
91    inv_xfr_err                      EXCEPTION;
92 
93    -- Bug 8862296 Changes start here
94    l_source_group_asset_id       NUMBER;
95    l_dest_group_asset_id         NUMBER;
96 
97    --Secondary
98    l_secondary_sob_id             number;
99    l_secondary_src_trans_rec          FA_API_TYPES.trans_rec_type;
100    l_secondary_dest_trans_rec          FA_API_TYPES.trans_rec_type;
101    l_secondary_src_asset_hdr_rec      FA_API_TYPES.asset_hdr_rec_type;
102    l_secondary_dest_asset_hdr_rec      FA_API_TYPES.asset_hdr_rec_type;
103 
104    CURSOR C_GET_SOURCE_GROUP IS
105    SELECT BK.GROUP_ASSET_ID
106      FROM FA_BOOKS BK,FA_DEPRN_PERIODS DP
107     WHERE BK.ASSET_ID = PX_SRC_ASSET_HDR_REC.ASSET_ID
108       AND BK.BOOK_TYPE_CODE = PX_SRC_ASSET_HDR_REC.BOOK_TYPE_CODE
109       AND BK.DATE_INEFFECTIVE IS NULL
110       AND BK.GROUP_ASSET_ID IS NOT NULL
111       AND DP.BOOK_TYPE_CODE = BK.BOOK_TYPE_CODE
112       AND DP.PERIOD_CLOSE_DATE IS NULL
113       AND DP.CALENDAR_PERIOD_OPEN_DATE > PX_SRC_TRANS_REC.AMORTIZATION_START_DATE;
114 
115    CURSOR C_GET_DEST_GROUP IS
116    SELECT BK.GROUP_ASSET_ID
117      FROM FA_BOOKS BK,FA_DEPRN_PERIODS DP
118     WHERE BK.ASSET_ID = PX_DEST_ASSET_HDR_REC.ASSET_ID
119       AND BK.BOOK_TYPE_CODE = PX_DEST_ASSET_HDR_REC.BOOK_TYPE_CODE
120       AND BK.DATE_INEFFECTIVE IS NULL
121       AND BK.GROUP_ASSET_ID IS NOT NULL
122       AND DP.BOOK_TYPE_CODE = BK.BOOK_TYPE_CODE
123       AND DP.PERIOD_CLOSE_DATE IS NULL
124       AND DP.CALENDAR_PERIOD_OPEN_DATE > PX_DEST_TRANS_REC.AMORTIZATION_START_DATE;
125    -- Bug 8862296 Changes end here
126 
127 BEGIN
128 
129    SAVEPOINT do_transfer;
130    if (not g_log_level_rec.initialized) then
131       if (NOT fa_util_pub.get_log_level_rec (
132                 x_log_level_rec =>  g_log_level_rec
133       )) then
134          raise inv_xfr_err;
135       end if;
136    end if;
137 
138    -- Initialize message list if p_init_msg_list is set to TRUE.
139    if (fnd_api.to_boolean(p_init_msg_list)) then
140         -- initialize error message stack.
141         fa_srvr_msg.init_server_message;
142 
143         -- initialize debug message stack.
144         fa_debug_pkg.initialize;
145    end if;
146 
147    -- Check version of the API
148    -- Standard call to check for API call compatibility.
149    if NOT fnd_api.compatible_api_call (
150           G_API_VERSION,
151           p_api_version,
152           G_API_NAME,
153           G_PKG_NAME
154          ) then
155       x_return_status := FND_API.G_RET_STS_ERROR;
156       raise inv_xfr_err;
157    end if;
158 
159    -- get /validate the corporate books for each asset error on mismatch
160    -- do not allow transfer between books
161 
162    -- set up sob/mrc info
163    -- call the cache for the primary transaction book
164    if (NOT fa_cache_pkg.fazcbc(X_book => px_src_asset_hdr_rec.book_type_code, p_log_level_rec => g_log_level_rec)) then
165       raise inv_xfr_err;
166    end if;
167 
168    px_src_asset_hdr_rec.set_of_books_id := fa_cache_pkg.fazcbc_record.set_of_books_id;
169    px_src_asset_hdr_rec.set_of_books_id := fa_cache_pkg.fazcbc_record.set_of_books_id;
170 
171    -- reset the global here in case cache was not initialized at
172    -- time this package was instantiated
173    g_release := fa_cache_pkg.fazarel_release;
174 
175    --  Account for transaction submitted from a responsibility
176    --  that is not tied to a SOB_ID by getting the value from
177    --  the book struct
178 
179    -- Get the book type code P,R or N
180    if not fa_cache_pkg.fazcsob
181            (X_set_of_books_id   => px_src_asset_hdr_rec.set_of_books_id,
182             X_mrc_sob_type_code => l_mrc_sob_type_code, p_log_level_rec => g_log_level_rec) then
183       raise inv_xfr_err;
184    end if;
185 
186    --  Error out if the program is submitted from the Reporting Responsibility
187    --  No transaction permitted directly on reporting books.
188 
189    IF l_mrc_sob_type_code = 'R' THEN
190       fa_srvr_msg.add_message
191           (NAME       => 'MRC_OSP_INVALID_BOOK_TYPE',
192            CALLING_FN => l_calling_fn, p_log_level_rec => g_log_level_rec);
193       raise inv_xfr_err;
194    END IF;
195 
196    -- end initial MRC validation
197 
198 
199    -- additional validation migrated from the external transfers program
200    -- do not allow transfers between books
201    if (px_src_asset_hdr_rec.book_type_code <>
202        px_dest_asset_hdr_rec.book_type_code) then
203       fa_srvr_msg.add_message(
204          calling_fn  => l_calling_fn,
205          name        => 'FA_TFRINV_NOT_BTWN_BOOKS',
206          token1      => 'BOOK',
207          value1      => px_dest_asset_hdr_rec.book_type_code, p_log_level_rec => g_log_level_rec);
208       raise inv_xfr_err;
209    end if;
210 
211    -- From and To Asset Ids Identical
212    if (px_src_asset_hdr_rec.asset_id = px_dest_asset_hdr_rec.asset_id) then
213       fa_srvr_msg.add_message(
214          calling_fn  => l_calling_fn,
215          name        => 'FA_TFRINV_NOT_SAME_ASSET', p_log_level_rec => g_log_level_rec);
216       raise inv_xfr_err;
217    end if;
218 
219    l_inv_trans_rec.transaction_type := 'INVOICE TRANSFER';
220 
221 
222    FA_INVOICE_TRANSACTIONS_PKG.Insert_Row
223      (X_Rowid                     => l_rowid,
224       X_Invoice_Transaction_Id    => l_inv_trans_rec.invoice_transaction_id ,
225       X_Book_Type_Code            => px_src_asset_hdr_rec.book_type_code,
226       X_Transaction_Type          => l_inv_trans_rec.transaction_type,
227       X_Date_Effective            => sysdate,
228       X_Calling_Fn                => l_calling_fn
229      ,p_log_level_rec => g_log_level_rec);
230 
231    -- if we wish to validate any info such as same subtype
232    -- on both assets we should do it here.   Currently,
233    -- all trx/amort info will default from the adjustment api
234    -- for each asset and we will allow transfer between
235    -- different asset types as well as expensing one side
236    -- while amortizing the other
237 
238 
239    -- set up the invoice tables for the source and destination assets
240    -- initially src i sset the parameter, then we load the inv_indicator
241    -- for each row.  Then we set the destination table to the same values
242    -- and subsequently null out source line id and flip the sign of fa cost
243    -- and repopulate the indicator which gets nulls our for some reason
244 
245    l_src_inv_tbl              := p_inv_tbl;
246 
247    for l_inv_index in 1..l_src_inv_tbl.count loop
248 
249       if not FA_UTIL_PVT.get_inv_rec
250          (px_inv_rec          => l_src_inv_tbl(l_inv_index),
251           p_mrc_sob_type_code => 'P',
252           p_set_of_books_id   => null,
253           p_log_level_rec => g_log_level_rec) then raise inv_xfr_err;
254       end if;
255 
256       -- BUG#
257       -- handle payables cost here...
258       if (p_inv_tbl(l_inv_index).payables_cost is null) then
259          if (l_src_inv_tbl(l_inv_index).fixed_assets_cost <> 0) then
260             l_src_inv_tbl(l_inv_index).payables_cost := l_src_inv_tbl(l_inv_index).payables_cost *
261                                                          (p_inv_tbl(l_inv_index).fixed_assets_cost/
262                                                           l_src_inv_tbl(l_inv_index).fixed_assets_cost);
263          else
264             l_src_inv_tbl(l_inv_index).payables_cost := 0;
265          end if;
266       else
267          l_dest_inv_tbl(l_inv_index).payables_cost := p_inv_tbl(l_inv_index).payables_cost;
268       end if;
269 
270       if (p_inv_tbl(l_inv_index).fixed_assets_cost is null) then
271          fa_srvr_msg.add_message(
272             calling_fn  => l_calling_fn,
273             name        => 'FA_TFRINV_NONE_TFR_COST', p_log_level_rec => g_log_level_rec);
274       end if;
275 
276       l_src_inv_tbl(l_inv_index).fixed_assets_cost := p_inv_tbl(l_inv_index).fixed_assets_cost;
277 
278       -- added for SLA
279       l_src_inv_tbl(l_inv_index).source_dest_code     := 'SOURCE';
280 
281    end loop;
282 
283    if (g_log_level_rec.statement_level) then
284        fa_debug_pkg.add(l_calling_fn,
285                         'l_src_inv_tbl.count',
286                          l_src_inv_tbl.count, p_log_level_rec => g_log_level_rec);
287        fa_debug_pkg.add(l_calling_fn,
288                         'inv_tbl(1).payables_cost',
289                          p_inv_tbl(1).payables_cost);
290    end if;
291 
292 
293    l_dest_inv_tbl             := l_src_inv_tbl;
294 
295    for l_inv_index in 1..l_dest_inv_tbl.count loop
296 
297       -- BUG#
298       -- handle the payables cost here too...
299       -- in previous releases, full transfers resulted in all payables cost
300       -- moving to the destination asset where as partial transfers resulted
301       -- in all payables cost remaining in the source.  To get around the
302       -- discrepancies created by the large differences in the amounts going
303       -- to the different (flexbuil) accounts for this, a subsequent update
304       -- was done to insure accounts matched.  However, now that we're allowing
305       -- this to occur between assets which are depreciated and those which aren't
306       -- this isn't sufficient.
307       --
308       -- new behavior will transfer an equal proportion of the payables cost
309       -- any descrepancies between the two will be spread based on the
310       -- fixed assets cost with the differences having same ratios
311       --
312 
313       if (p_inv_tbl(l_inv_index).payables_cost is null) then
314          if (l_dest_inv_tbl(l_inv_index).fixed_assets_cost <> 0) then
315             l_dest_inv_tbl(l_inv_index).payables_cost := -l_src_inv_tbl(l_inv_index).payables_cost *
316                                                          (l_src_inv_tbl(l_inv_index).fixed_assets_cost/
317                                                           l_dest_inv_tbl(l_inv_index).fixed_assets_cost);
318          else
319             l_dest_inv_tbl(l_inv_index).payables_cost := 0;
320          end if;
321       else
322          l_dest_inv_tbl(l_inv_index).payables_cost := -p_inv_tbl(l_inv_index).payables_cost ;
323       end if;
324 
325 
326       l_dest_inv_tbl(l_inv_index).fixed_assets_cost := -l_src_inv_tbl(l_inv_index).fixed_assets_cost;
327       l_dest_inv_tbl(l_inv_index).prior_source_line_id :=  l_dest_inv_tbl(l_inv_index).source_line_id;
328       l_dest_inv_tbl(l_inv_index).source_line_id    := null;
329 
330 
331       if (g_log_level_rec.statement_level) then
332           fa_debug_pkg.add(l_calling_fn,
333                            'l_src_inv_tbl(' || to_char(l_inv_index) || ').source_line_id',
334                             l_src_inv_tbl(l_inv_index).source_line_id);
335           fa_debug_pkg.add(l_calling_fn,
336                            'l_src_inv_tbl(' || to_char(l_inv_index) || ').inv_indicator',
337                             l_src_inv_tbl(l_inv_index).inv_indicator);
338           fa_debug_pkg.add(l_calling_fn,
339                            'l_src_inv_tbl(' || to_char(l_inv_index) || ').fixed_assets_cost',
340                             l_src_inv_tbl(l_inv_index).fixed_assets_cost);
341 
342           fa_debug_pkg.add(l_calling_fn,
343                            'l_dest_inv_tbl(' || to_char(l_inv_index) || ').source_line_id',
344                            l_dest_inv_tbl(l_inv_index).source_line_id);
345           fa_debug_pkg.add(l_calling_fn,
346                            'l_dest_inv_tbl(' || to_char(l_inv_index) || ').inv_indicator',
347                             l_dest_inv_tbl(l_inv_index).inv_indicator);
348           fa_debug_pkg.add(l_calling_fn,
349                            'l_dest_inv_tbl(' || to_char(l_inv_index) || ').fixed_assets_cost',
350                             l_dest_inv_tbl(l_inv_index).fixed_assets_cost);
351       end if;
352 
353 
354    end loop;
355 
356 
357    -- SLA: for inter asset transfers of the same asset type,
358    --      we need to create the event here - since the THIDs are the unique
359    --      identifiers, we need to derive them first
360    --
361    -- CORRECTION: we will now roll non-like type transfer into cap event
362 
363    select asset_type,
364           current_units
365      into l_from_asset_type,
366           l_from_current_units
367      from fa_additions_b
368     where asset_id = px_src_asset_hdr_rec.asset_id;
369 
370    select asset_type,
371           current_units
372      into l_to_asset_type,
373           l_to_current_units
374      from fa_additions_b
375     where asset_id = px_dest_asset_hdr_rec.asset_id;
376 
377 
378    l_src_asset_type_rec.asset_type := l_from_asset_type;
379    l_dest_asset_type_rec.asset_type := l_to_asset_type;
380 
381    -- Also need to load the date here to make it available to the event api
382    -- load the period struct for current period info
383    if not FA_UTIL_PVT.get_period_rec
384           (p_book           => px_src_asset_hdr_rec.book_type_code,
385            p_effective_date => NULL,
386            x_period_rec     => l_period_rec,
387            p_log_level_rec => g_log_level_rec) then
388       raise inv_xfr_err;
389    end if;
390 
391 
392    l_transaction_date := greatest(l_period_rec.calendar_period_open_date,
393                                   least(sysdate,l_period_rec.calendar_period_close_date));
394 
395    if (px_src_trans_rec.transaction_subtype = 'AMORTIZED') then
396       px_src_trans_rec.transaction_date_entered :=
397          nvl(px_src_trans_rec.amortization_start_date, l_transaction_date);
398    else
399       px_src_trans_rec.transaction_date_entered := l_transaction_date;
400    end if;
401 
402    if (px_dest_trans_rec.transaction_subtype = 'AMORTIZED') then
403       px_dest_trans_rec.transaction_date_entered :=
404          nvl(px_dest_trans_rec.amortization_start_date, l_transaction_date);
405    else
406       px_dest_trans_rec.transaction_date_entered := l_transaction_date;
407    end if;
408 
409    px_src_trans_rec.transaction_date_entered :=
410       to_date(to_char(px_src_trans_rec.transaction_date_entered, 'DD/MM/YYYY'),'DD/MM/YYYY');
411 
412    px_dest_trans_rec.transaction_date_entered :=
413       to_date(to_char(px_dest_trans_rec.transaction_date_entered, 'DD/MM/YYYY'),'DD/MM/YYYY');
414 
415    -- fetch value for the trx_reference_id from sequence
416    -- insure we load the trx_ref_idinto dest th row too!!!
417 
418    select fa_trx_references_s.nextval
419      into px_src_trans_rec.trx_reference_id
420      from dual;
421 
422    px_dest_trans_rec.trx_reference_id :=
423       px_src_trans_rec.trx_reference_id;
424 
425    px_src_trans_rec.transaction_key  := 'IT';
426    px_dest_trans_rec.transaction_key := 'IT';
427 
428    -- ER 14644811 : Call trx approval for both src and dest
429    if not FA_TRX_APPROVAL_PKG.faxcat
430           (X_book              => px_src_asset_hdr_rec.book_type_code,
431            X_asset_id          => px_src_asset_hdr_rec.asset_id,
432            X_trx_type          => px_src_trans_rec.transaction_type_code,
433            X_trx_date          => px_src_trans_rec.transaction_date_entered,
434            X_init_message_flag => 'NO'
435           , p_log_level_rec => g_log_level_rec) then
436       raise inv_xfr_err;
437    end if;
438 
439    if not FA_TRX_APPROVAL_PKG.faxcat
440           (X_book              => px_dest_asset_hdr_rec.book_type_code,
441            X_asset_id          => px_dest_asset_hdr_rec.asset_id,
442            X_trx_type          => px_dest_trans_rec.transaction_type_code,
443            X_trx_date          => px_dest_trans_rec.transaction_date_entered,
444            X_init_message_flag => 'NO'
445           , p_log_level_rec => g_log_level_rec) then
446       raise inv_xfr_err;
447    end if;
448 
449    -- Populate th_id and who_info after calling faxcat
450    select fa_transaction_headers_s.nextval
451      into px_src_trans_rec.transaction_header_id
452      from dual;
453 
454    select fa_transaction_headers_s.nextval
455      into px_dest_trans_rec.transaction_header_id
456      from dual;
457 
458    px_src_trans_rec.who_info.creation_date := sysdate;
459    px_src_trans_rec.who_info.last_update_date := sysdate;
460    -- ER 14644811 : End
461 
462    if not FA_XLA_EVENTS_PVT.create_dual_transaction_event
463               (p_asset_hdr_rec_src      => px_src_asset_hdr_rec,
464                p_asset_hdr_rec_dest     => px_dest_asset_hdr_rec,
465                p_asset_type_rec_src     => l_src_asset_type_rec,
466                p_asset_type_rec_dest    => l_dest_asset_type_rec,
467                px_trans_rec_src         => px_src_trans_rec,
468                px_trans_rec_dest        => px_dest_trans_rec,
469                p_event_status           => NULL,
470                p_calling_fn             => l_calling_fn,
471                p_log_level_rec => g_log_level_rec) then
472       raise inv_xfr_err;
473    end if;
474     /*=================================================================
475     Secondary Changes Start
476     If primary and secondary sob_id is different then we need to
477     create/update/delete event for secondary ledger*/
478    l_secondary_sob_id := FA_XLA_EVENTS_PVT.get_secondary_sob_id(px_src_asset_hdr_rec.book_type_code);
479    if(l_secondary_sob_id > 0) then
480        l_secondary_src_asset_hdr_rec         :=  px_src_asset_hdr_rec;
481        l_secondary_dest_asset_hdr_rec       := px_dest_asset_hdr_rec;
482        l_secondary_src_trans_rec                := px_src_trans_rec;
483        l_secondary_dest_trans_rec              :=  px_dest_trans_rec;
484 
485        l_secondary_src_asset_hdr_rec.set_of_books_id    :=  l_secondary_sob_id;
486        l_secondary_dest_asset_hdr_rec.set_of_books_id  :=  l_secondary_sob_id;
487 
488        if not FA_XLA_EVENTS_PVT.create_dual_transaction_event
489                   (p_asset_hdr_rec_src      => l_secondary_src_asset_hdr_rec,
490                    p_asset_hdr_rec_dest     => l_secondary_dest_asset_hdr_rec,
491                    p_asset_type_rec_src     => l_src_asset_type_rec,
492                    p_asset_type_rec_dest    => l_dest_asset_type_rec,
493                    px_trans_rec_src         => l_secondary_src_trans_rec,
494                    px_trans_rec_dest        => l_secondary_dest_trans_rec,
495                    p_event_status           => NULL,
496                    p_calling_fn             => l_calling_fn,
497                    p_log_level_rec => g_log_level_rec) then
498           raise inv_xfr_err;
499        end if;
500    end if;
501     /*Secondary Changes End
502     ==================================================================*/
503    -- insert the transaction link record
504    --   (sequence will be used in table handler)
505    -- note that not all values are 100% here as the adjustment
506    -- API could reset the subtype, etc
507 
508    fa_trx_references_pkg.insert_row
509       (X_Rowid                          => l_rowid,
510        X_Trx_Reference_Id               => px_src_trans_rec.trx_reference_id,
511        X_Book_Type_Code                 => px_src_asset_hdr_rec.book_type_code,
512        X_Src_Asset_Id                   => px_src_asset_hdr_rec.asset_id,
513        X_Src_Transaction_Header_Id      => px_src_trans_rec.transaction_header_id,
514        X_Dest_Asset_Id                  => px_dest_asset_hdr_rec.asset_id,
515        X_Dest_Transaction_Header_Id     => px_dest_trans_rec.transaction_header_id,
516        X_Member_Asset_Id                => null,
517        X_Member_Transaction_Header_Id   => null,
518        X_Transaction_Type               => 'INVOICE TRANSFER',
519        X_Src_Transaction_Subtype        => px_src_trans_rec.transaction_subtype,
520        X_Dest_Transaction_Subtype       => px_dest_trans_rec.transaction_subtype,
521        X_Src_Amortization_Start_Date    => px_src_trans_rec.amortization_start_date,
522        X_Dest_Amortization_Start_Date   => px_dest_trans_rec.amortization_start_date,
523        X_Reserve_Transfer_Amount        => null,
524        X_Src_Expense_Amount             => null,
525        X_Dest_Expense_Amount            => null,
526        X_Src_Eofy_Reserve               => null,
527        X_Dest_Eofy_Reserve              => null,
528        X_event_id                    => px_src_trans_rec.event_id,
529        X_Invoice_Transaction_Id      => l_inv_trans_rec.invoice_transaction_id,
530        X_Creation_Date                  => px_src_trans_rec.who_info.creation_date,
531        X_Created_By                     => px_src_trans_rec.who_info.created_by,
532        X_Last_Update_Date               => px_src_trans_rec.who_info.last_update_date,
533        X_Last_Updated_By                => px_src_trans_rec.who_info.last_updated_by,
534        X_Last_Update_Login              => px_src_trans_rec.who_info.last_update_login,
535        X_Return_Status                  => l_return_status_bool,
536        X_Calling_Fn                     => l_calling_fn,
537        p_log_level_rec => g_log_level_rec);
538 
539    -- Bug 8862296 Changes start here.
540    OPEN C_GET_SOURCE_GROUP;
541    FETCH C_GET_SOURCE_GROUP into l_source_group_asset_id;
542    CLOSE C_GET_SOURCE_GROUP;
543 
544    OPEN C_GET_DEST_GROUP;
545    FETCH C_GET_DEST_GROUP into l_dest_group_asset_id;
546    CLOSE C_GET_DEST_GROUP;
547    -- Bug 8862296 Changes end here
548 
549    -- call the adjustment api's first for src
550    -- then for destination if successful
551    -- if either fails we rollback everything
552 
553    FA_ADJUSTMENT_PUB.do_adjustment
554             (p_api_version             => 1.0,
555              p_init_msg_list           => FND_API.G_FALSE,
556              p_commit                  => FND_API.G_FALSE,
557              p_validation_level        => FND_API.G_VALID_LEVEL_FULL,
558              x_return_status           => l_return_status,
559              x_msg_count               => x_msg_count,
560              x_msg_data                => x_msg_data,
561              p_calling_fn              => l_calling_fn,
562              px_trans_rec              => px_src_trans_rec,
563              px_asset_hdr_rec          => px_src_asset_hdr_rec,
564              p_asset_fin_rec_adj       => l_src_asset_fin_rec_adj,
565              x_asset_fin_rec_new       => l_src_asset_fin_rec_new,
566              x_asset_fin_mrc_tbl_new   => l_src_asset_fin_mrc_tbl_new,
567              px_inv_trans_rec          => l_inv_trans_rec,
568              px_inv_tbl                => l_src_inv_tbl,
569              p_asset_deprn_rec_adj     => l_src_asset_deprn_rec_adj,
570              x_asset_deprn_rec_new     => l_src_asset_deprn_rec_new,
571              x_asset_deprn_mrc_tbl_new => l_src_asset_deprn_mrc_tbl_new,
572              p_group_reclass_options_rec => l_group_reclass_options_rec
573             );
574 
575    if (l_return_status <> FND_API.G_RET_STS_SUCCESS) then
576       raise inv_xfr_err;
577    end if;
578 
579    /* Bug 8862296: The following IF condition is to make sure that do_inv_sub_transfer
580       will be called from Process Group Adjustment if Source Group and Destination Group
581       are same, and calling interface is FAXASSET. Thus we are differing destination asset
582       adjustment till Process Group Adjustment for source is completed. If this is current
583       period amortization then cursors to fetch group assets will return null value and
584       following condition fails and we will process destination here itself.*/
585    if (l_source_group_asset_id = l_dest_group_asset_id and px_dest_trans_rec.calling_interface = 'FAXASSET') then
586       null;
587    else
588       -- copy in the invoice thid and copy the exchange rate info
589       -- was already populated from the invoice engine for src
590 
591       -- R12: table is now nested so copy it in the rec
592       --  also note the outcoming values for cost in this array
593       --  will be for the delta amounts (new amounts for new line)
594 
595       for i in 1..l_dest_inv_tbl.count loop
596           l_dest_inv_tbl(i).inv_rate_tbl :=  l_src_inv_tbl(i).inv_rate_tbl;
597       end loop;
598 
599       -- ER 14644811 : Redefault who_info for the dest transaction
600       px_dest_trans_rec.who_info.creation_date := sysdate;
601       px_dest_trans_rec.who_info.last_update_date := sysdate;
602 
603       if not do_inv_sub_transfer(p_src_trans_rec      => px_src_trans_rec,
604                                  p_src_asset_hdr_rec  => px_src_asset_hdr_rec,
605                                  p_dest_trans_rec     => px_dest_trans_rec,
606                                  p_dest_asset_hdr_rec => px_dest_asset_hdr_rec,
607                                  p_inv_tbl            => l_dest_inv_tbl,
608                                  p_inv_trans_rec      => l_inv_trans_rec,
609                                  p_log_level_rec      => g_log_level_rec) then
610          raise inv_xfr_err;
611       end if;
612    end if;
613 
614    -- commit if p_commit is TRUE.
615    if (fnd_api.to_boolean (p_commit)) then
616         COMMIT WORK;
617    end if;
618 
619    x_return_status := FND_API.G_RET_STS_SUCCESS;
620 
621 EXCEPTION
622    -- no need to call dump_debug_messages since they are already
623    -- loaded from adjustment api
624    when No_Data_Found then
625 
626       ROLLBACK to do_transfer;
627 
628       fa_srvr_msg.add_message(
629 		CALLING_FN  => l_calling_fn,
630             NAME       => 'FA_TFRINV_NO_COST_CLR', p_log_level_rec => g_log_level_rec);
631 
632       FND_MSG_PUB.count_and_get (
633          p_count => x_msg_count,
634          p_data  => x_msg_data
635       );
636 
637       x_return_status := FND_API.G_RET_STS_ERROR;
638 
639    when inv_xfr_err then
640       ROLLBACK to do_transfer;
641 
642       fa_srvr_msg.add_message(
643                calling_fn => l_calling_fn, p_log_level_rec => g_log_level_rec);
644 
645       FND_MSG_PUB.count_and_get (
646          p_count => x_msg_count,
647          p_data  => x_msg_data
648       );
649 
650       x_return_status := FND_API.G_RET_STS_ERROR;
651 
652    when others then
653       ROLLBACK to do_transfer;
654 
655       fa_srvr_msg.add_sql_error(
656                calling_fn => l_calling_fn, p_log_level_rec => g_log_level_rec);
657 
658       FND_MSG_PUB.count_and_get (
659          p_count => x_msg_count,
660          p_data  => x_msg_data
661       );
662 
663       x_return_status := FND_API.G_RET_STS_ERROR;
664 
665 END do_transfer;
666 
667 ---------------------------------------------------------------------------
668 
669 FUNCTION do_all_books
670            (p_src_trans_rec          IN FA_API_TYPES.trans_rec_type,
671             p_src_asset_hdr_rec      IN FA_API_TYPES.asset_hdr_rec_type,
672             p_dest_trans_rec         IN FA_API_TYPES.trans_rec_type,
673             p_dest_asset_hdr_rec     IN FA_API_TYPES.asset_hdr_rec_type,
674             p_period_counter         IN NUMBER,
675             p_ccid                   IN NUMBER,
676             p_src_asset_type         IN VARCHAR2,
677             p_dest_asset_type        IN VARCHAR2,
678             p_src_current_units      IN NUMBER,
679             p_dest_current_units     IN NUMBER,
680             p_calling_fn             IN varchar2
681 , p_log_level_rec        IN     FA_API_TYPES.log_level_rec_type) return boolean is
682 
683    l_src_interco_amount  number;
684    l_src_cost_amount     number;
685 
686    l_interco_amount      number;
687    l_cost_amount         number;
688    l_delta_amount        number;
689 
690    l_reporting_flag      varchar2(1);
691    l_sob_index           number;
692    l_sob_tbl             FA_CACHE_PKG.fazcrsob_sob_tbl_type;
693 
694    l_adj                 fa_adjust_type_pkg.fa_adj_row_struct;
695    l_set_of_books_id     number;
696 
697    cursor c_total_amount
698          (p_asset_id       number,
699           p_book_type_code varchar2,
700           p_period_counter number,
701           p_thid           number,
702           p_adj_type       varchar2) is
703       select sum(decode(adjustment_type,
704                         'INTERCO AR', decode(debit_credit_flag,
705                                              'DR', adjustment_amount,
706                                                    -adjustment_amount),
707                         'INTERCO AP', decode(debit_credit_flag,
708                                              'CR', adjustment_amount,
709                                                    -adjustment_amount),
710                         decode(debit_credit_flag,
711                                'CR', adjustment_amount,
712                                      -adjustment_amount)))
713         from fa_adjustments
714        where asset_id               = p_asset_id
715          and book_type_code         = p_book_type_code
716          and period_counter_created = p_period_counter
717          and transaction_header_id  = p_thid
718          and adjustment_type        like p_adj_type;
719 
720   cursor c_total_amount_mrc
721          (p_asset_id       number,
722           p_book_type_code varchar2,
723           p_period_counter number,
724           p_thid           number,
725           p_adj_type       varchar2) is
726       select sum(decode(adjustment_type,
727                         'INTERCO AR', decode(debit_credit_flag,
728                                              'DR', adjustment_amount,
729                                                    -adjustment_amount),
730                         'INTERCO AP', decode(debit_credit_flag,
731                                              'CR', adjustment_amount,
732                                                    -adjustment_amount),
733                         decode(debit_credit_flag,
734                                'CR', adjustment_amount,
735                                      -adjustment_amount)))
736         from fa_mc_adjustments
737        where asset_id               = p_asset_id
738          and book_type_code         = p_book_type_code
739          and period_counter_created = p_period_counter
740          and transaction_header_id  = p_thid
741          and adjustment_type        like p_adj_type
742          and set_of_books_id        = l_set_of_books_id;
743 
744    l_calling_fn                     VARCHAR2(35) := 'fa_inv_xfr_pub.do_all_books';
745    inv_xfr_err                      EXCEPTION;
746 
747 
748 begin
749 
750    if (p_log_level_rec.statement_level) then
751       fa_debug_pkg.add(l_calling_fn,
752                        'calling',
753                        'fazcrsob', p_log_level_rec => p_log_level_rec);
754    end if;
755 
756 
757    -- call the sob cache to get the table of sob_ids
758    if not FA_CACHE_PKG.fazcrsob
759           (x_book_type_code => p_src_asset_hdr_rec.book_type_code,
760            x_sob_tbl        => l_sob_tbl, p_log_level_rec => p_log_level_rec) then
761       raise inv_xfr_err;
762    end if;
763 
764    if (p_log_level_rec.statement_level) then
765       fa_debug_pkg.add(l_calling_fn,
766                        'looping through',
767                        'set of books', p_log_level_rec => p_log_level_rec);
768    end if;
769 
770    FOR l_sob_index in 0..l_sob_tbl.count LOOP
771 
772       if (l_sob_index = 0) then
773          l_reporting_flag := 'P';
774          l_set_of_books_id := fa_cache_pkg.fazcbc_record.set_of_books_id;
775       else
776          l_reporting_flag := 'R';
777          l_set_of_books_id := l_sob_tbl(l_sob_index);
778       end if;
779 
780       if (p_log_level_rec.statement_level) then
781          fa_debug_pkg.add(l_calling_fn,
782                           'processing',
783                           'cursor to get sum of amounts', p_log_level_rec => p_log_level_rec);
784       end if;
785 
786       -- get the interco and cost totals
787       if (l_sob_index = 0) then
788          open c_total_amount
789                 (p_asset_id       => p_src_asset_hdr_rec.asset_id,
790                  p_book_type_code => p_src_asset_hdr_rec.book_type_code,
791                  p_period_counter => p_period_counter,
792                  p_thid           => p_src_trans_rec.transaction_header_id,
793                  p_adj_type       => '%INTERCO%');
794          fetch c_total_amount into l_interco_amount;
795          close c_total_amount;
796 
797          open c_total_amount
798                 (p_asset_id       => p_src_asset_hdr_rec.asset_id,
799                  p_book_type_code => p_src_asset_hdr_rec.book_type_code,
800                  p_period_counter => p_period_counter,
801                  p_thid           => p_src_trans_rec.transaction_header_id,
802                  p_adj_type       => '%COST%');
803          fetch c_total_amount into l_cost_amount;
804          close c_total_amount;
805       else
806          open c_total_amount_mrc
807                 (p_asset_id       => p_src_asset_hdr_rec.asset_id,
808                  p_book_type_code => p_src_asset_hdr_rec.book_type_code,
809                  p_period_counter => p_period_counter,
810                  p_thid           => p_src_trans_rec.transaction_header_id,
811                  p_adj_type       => '%INTERCO%');
812          fetch c_total_amount_mrc into l_interco_amount;
813          close c_total_amount_mrc;
814 
815          open c_total_amount_mrc
816                 (p_asset_id       => p_src_asset_hdr_rec.asset_id,
817                  p_book_type_code => p_src_asset_hdr_rec.book_type_code,
818                  p_period_counter => p_period_counter,
819                  p_thid           => p_src_trans_rec.transaction_header_id,
820                  p_adj_type       => '%COST%');
821          fetch c_total_amount_mrc into l_cost_amount;
822          close c_total_amount_mrc;
823       end if;
824 
825       l_delta_amount := l_cost_amount - l_interco_amount;
826 
827       if (p_log_level_rec.statement_level) then
828          fa_debug_pkg.add(l_calling_fn,
829                           'src cost amount',
830                            l_cost_amount, p_log_level_rec => p_log_level_rec);
831          fa_debug_pkg.add(l_calling_fn,
832                           'src interco amount',
833                            l_interco_amount, p_log_level_rec => p_log_level_rec);
834          fa_debug_pkg.add(l_calling_fn,
835                           'l_delta_amount',
836                            l_delta_amount, p_log_level_rec => p_log_level_rec);
837       end if;
838 
839       if (l_delta_amount <> 0) then
840 
841          -- insert the difference as clearing to the ccid found above
842          -- first the source
843 
844          if (p_log_level_rec.statement_level) then
845             fa_debug_pkg.add(l_calling_fn,
846                              'setting up',
847                              'adj struct for src', p_log_level_rec => p_log_level_rec);
848          end if;
849 
850 
851          l_adj.transaction_header_id    := p_src_trans_rec.transaction_header_id;
852          l_adj.asset_id                 := p_src_asset_hdr_rec.asset_id;
853          l_adj.book_type_code           := p_src_asset_hdr_rec.book_type_code;
854          l_adj.period_counter_created   := fa_cache_pkg.fazcbc_record.last_period_counter + 1;
855          l_adj.period_counter_adjusted  := fa_cache_pkg.fazcbc_record.last_period_counter + 1;
856          l_adj.current_units            := p_src_current_units;
857          l_adj.selection_mode           := FA_ADJUST_TYPE_PKG.FA_AJ_ACTIVE;
858          l_adj.selection_thid           := 0;
859          l_adj.selection_retid          := 0;
860          l_adj.leveling_flag            := TRUE;
861          l_adj.last_update_date         := p_src_trans_rec.who_info.last_update_date;
862 
863          l_adj.flush_adj_flag           := FALSE;
864          l_adj.gen_ccid_flag            := FALSE;
865          l_adj.annualized_adjustment    := 0;
866          l_adj.asset_invoice_id         := 0;
867          l_adj.code_combination_id      := p_ccid;
868          l_adj.distribution_id          := 0;
869 
870          l_adj.deprn_override_flag      := '';
871 
872          if (p_src_asset_type = 'CIP') then
873             l_adj.source_type_code      := 'CIP ADJUSTMENT';
874          else
875             l_adj.source_type_code      := 'ADJUSTMENT';
876          end if;
877 
878          l_adj.adjustment_type          := 'COST CLEARING';
879 
880          if l_delta_amount > 0 then
881             l_adj.debit_credit_flag     := 'DR';
882             l_adj.adjustment_amount     := l_delta_amount;
883          else
884             l_adj.debit_credit_flag     := 'CR';
885             l_adj.adjustment_amount     := -l_delta_amount;
886          end if;
887 
888          l_adj.mrc_sob_type_code        := l_reporting_flag ;
889          l_adj.set_of_books_id          := l_set_of_books_id;
890 
891          if not FA_INS_ADJUST_PKG.faxinaj
892                    (l_adj,
893                     p_src_trans_rec.who_info.last_update_date,
894                     p_src_trans_rec.who_info.last_updated_by,
895                     p_src_trans_rec.who_info.last_update_login, p_log_level_rec => p_log_level_rec) then
896             raise inv_xfr_err;
897          end if;
898 
899          -- then the destination
900          if (p_log_level_rec.statement_level) then
901             fa_debug_pkg.add(l_calling_fn,
902                              'setting up',
903                              'adj struct for dest', p_log_level_rec => p_log_level_rec);
904          end if;
905 
906          l_adj.transaction_header_id    := p_dest_trans_rec.transaction_header_id;
907          l_adj.asset_id                 := p_dest_asset_hdr_rec.asset_id;
908          l_adj.book_type_code           := p_dest_asset_hdr_rec.book_type_code;
909          l_adj.period_counter_created   := fa_cache_pkg.fazcbc_record.last_period_counter + 1;
910          l_adj.period_counter_adjusted  := fa_cache_pkg.fazcbc_record.last_period_counter + 1;
911          l_adj.current_units            := p_dest_current_units;
912          l_adj.selection_mode           := FA_ADJUST_TYPE_PKG.FA_AJ_ACTIVE;
913          l_adj.selection_thid           := 0;
914          l_adj.selection_retid          := 0;
915          l_adj.leveling_flag            := TRUE;
916          l_adj.last_update_date         := p_dest_trans_rec.who_info.last_update_date;
917 
918          l_adj.flush_adj_flag           := TRUE;
919          l_adj.gen_ccid_flag            := FALSE;
920          l_adj.annualized_adjustment    := 0;
921          l_adj.asset_invoice_id         := 0;
922          l_adj.code_combination_id      := p_ccid;
923          l_adj.distribution_id          := 0;
924 
925          l_adj.deprn_override_flag      := '';
926 
927          if (p_dest_asset_type = 'CIP') then
928             l_adj.source_type_code      := 'CIP ADJUSTMENT';
929          else
930             l_adj.source_type_code      := 'ADJUSTMENT';
931          end if;
932 
933          l_adj.adjustment_type          := 'COST CLEARING';
934 
935          if l_delta_amount > 0 then
936             l_adj.debit_credit_flag     := 'CR';
937             l_adj.adjustment_amount     := l_delta_amount;
938          else
939             l_adj.debit_credit_flag     := 'DR';
940             l_adj.adjustment_amount     := -l_delta_amount;
941          end if;
942 
943          l_adj.mrc_sob_type_code        := l_reporting_flag ;
944          l_adj.set_of_books_id          := l_set_of_books_id;
945 
946          if not FA_INS_ADJUST_PKG.faxinaj
947                    (l_adj,
948                     p_src_trans_rec.who_info.last_update_date,
949                     p_src_trans_rec.who_info.last_updated_by,
950                     p_src_trans_rec.who_info.last_update_login, p_log_level_rec => p_log_level_rec) then
951             raise inv_xfr_err;
952          end if;
953 
954 
955       end if;
956 
957    END LOOP;
958 
959    return true;
960 
961 exception
962    when inv_xfr_err then
963       fa_srvr_msg.add_message(calling_fn => l_calling_fn, p_log_level_rec => p_log_level_rec);
964       return false;
965 
966    when others then
967       fa_srvr_msg.add_sql_error(calling_fn => l_calling_fn, p_log_level_rec => p_log_level_rec);
968       return false;
969 
970 end do_all_books;
971 
972 -- Bug 8862296 Changes start here.
973 FUNCTION do_inv_sub_transfer
974            (p_src_trans_rec          IN FA_API_TYPES.trans_rec_type,
975             p_src_asset_hdr_rec      IN FA_API_TYPES.asset_hdr_rec_type,
976             p_dest_trans_rec         IN FA_API_TYPES.trans_rec_type,
977             p_dest_asset_hdr_rec     IN FA_API_TYPES.asset_hdr_rec_type,
978             p_inv_tbl                IN FA_API_TYPES.inv_tbl_type,
979             p_inv_trans_rec          IN FA_API_TYPES.inv_trans_rec_type,
980             p_log_level_rec          IN FA_API_TYPES.log_level_rec_type) return boolean IS
981 
982    x_msg_count                      NUMBER;
983    x_msg_data                       VARCHAR2(1000);
984    l_calling_fn                     VARCHAR2(35) := 'fa_inv_xfr_pub.do_inv_sub_transfer';
985 
986    l_src_trans_rec                  FA_API_TYPES.trans_rec_type := p_src_trans_rec;
987    l_src_asset_hdr_rec              FA_API_TYPES.asset_hdr_rec_type := p_src_asset_hdr_rec;
988    l_dest_trans_rec                 FA_API_TYPES.trans_rec_type := p_dest_trans_rec;
989    l_dest_asset_hdr_rec             FA_API_TYPES.asset_hdr_rec_type := p_dest_asset_hdr_rec;
990    l_inv_tbl                        FA_API_TYPES.inv_tbl_type := p_inv_tbl;
991    l_inv_trans_rec                  FA_API_TYPES.inv_trans_rec_type := p_inv_trans_rec;
992 
993    l_dest_asset_fin_rec_adj         FA_API_TYPES.asset_fin_rec_type;
994    l_dest_asset_fin_rec_new         FA_API_TYPES.asset_fin_rec_type;
995    l_dest_asset_fin_mrc_tbl_new     FA_API_TYPES.asset_fin_tbl_type;
996    l_dest_asset_deprn_rec_adj       FA_API_TYPES.asset_deprn_rec_type;
997    l_dest_asset_deprn_rec_new       FA_API_TYPES.asset_deprn_rec_type;
998    l_dest_asset_deprn_mrc_tbl_new   FA_API_TYPES.asset_deprn_tbl_type;
999    l_group_reclass_options_rec      FA_API_TYPES.group_reclass_options_rec_type;
1000 
1001    l_from_asset_type     varchar2(15);
1002    l_to_asset_type       varchar2(15);
1003    l_from_current_units  number;
1004    l_to_current_units    number;
1005 
1006    l_clearing_ccid       number;
1007    l_interco_impact      boolean;
1008 
1009    l_current_period_counter         NUMBER;
1010    l_return_status                  VARCHAR2(1);
1011 
1012    inv_xfr_err                      EXCEPTION;
1013 
1014 BEGIN
1015 
1016    if (p_log_level_rec.statement_level) then
1017        fa_debug_pkg.add(l_calling_fn,'Before Calling Do_Adjustment for','DESTINATION', p_log_level_rec => p_log_level_rec);
1018    end if;
1019 
1020    -- call do_adjustment for dest asset
1021    FA_ADJUSTMENT_PUB.do_adjustment
1022             (p_api_version             => 1.0,
1023              p_init_msg_list           => FND_API.G_FALSE,
1024              p_commit                  => FND_API.G_FALSE,
1025              p_validation_level        => FND_API.G_VALID_LEVEL_FULL,
1026              x_return_status           => l_return_status,
1027              x_msg_count               => x_msg_count,
1028              x_msg_data                => x_msg_data,
1029              p_calling_fn              => l_calling_fn,
1030              px_trans_rec              => l_dest_trans_rec,
1031              px_asset_hdr_rec          => l_dest_asset_hdr_rec,
1032              p_asset_fin_rec_adj       => l_dest_asset_fin_rec_adj,
1033              x_asset_fin_rec_new       => l_dest_asset_fin_rec_new,
1034              x_asset_fin_mrc_tbl_new   => l_dest_asset_fin_mrc_tbl_new,
1035              px_inv_trans_rec          => l_inv_trans_rec,
1036              px_inv_tbl                => l_inv_tbl,
1037              p_asset_deprn_rec_adj     => l_dest_asset_deprn_rec_adj,
1038              x_asset_deprn_rec_new     => l_dest_asset_deprn_rec_new,
1039              x_asset_deprn_mrc_tbl_new => l_dest_asset_deprn_mrc_tbl_new,
1040              p_group_reclass_options_rec => l_group_reclass_options_rec
1041             );
1042 
1043    if (l_return_status <> FND_API.G_RET_STS_SUCCESS) then
1044       raise inv_xfr_err;
1045    end if;
1046 
1047    if not FA_ASSET_VAL_PVT.validate_period_of_addition
1048                            (p_asset_id            => l_src_asset_hdr_rec.asset_id,
1049                             p_book                => l_src_asset_hdr_rec.book_type_code,
1050                             p_mode                => 'ABSOLUTE',
1051                             px_period_of_addition => l_src_asset_hdr_rec.period_of_addition,
1052                             p_log_level_rec       => p_log_level_rec) then
1053       raise inv_xfr_err;
1054    end if;
1055    if not FA_ASSET_VAL_PVT.validate_period_of_addition
1056                            (p_asset_id            => l_dest_asset_hdr_rec.asset_id,
1057                             p_book                => l_dest_asset_hdr_rec.book_type_code,
1058                             p_mode                => 'ABSOLUTE',
1059                             px_period_of_addition => l_dest_asset_hdr_rec.period_of_addition,
1060                             p_log_level_rec       => p_log_level_rec) then
1061       raise inv_xfr_err;
1062    end if;
1063 
1064    if (p_log_level_rec.statement_level) then
1065        fa_debug_pkg.add(l_calling_fn,'src.period_of_addition',l_src_asset_hdr_rec.period_of_addition, p_log_level_rec => p_log_level_rec);
1066        fa_debug_pkg.add(l_calling_fn,'dest.period_of_addition',l_dest_asset_hdr_rec.period_of_addition, p_log_level_rec => p_log_level_rec);
1067        fa_debug_pkg.add(l_calling_fn,'src.thid',l_src_trans_rec.transaction_header_id, p_log_level_rec => p_log_level_rec);
1068        fa_debug_pkg.add(l_calling_fn,'dest.thid',l_dest_trans_rec.transaction_header_id, p_log_level_rec => p_log_level_rec);
1069    end if;
1070 
1071    -- only fire the intercompany logic for 11i
1072    if (g_release = 11 ) then
1073       if not FA_INTERCO_PVT.validate_inv_interco
1074           (p_src_asset_hdr_rec    => l_src_asset_hdr_rec,
1075            p_src_trans_rec        => l_src_trans_rec,
1076            p_dest_asset_hdr_rec   => l_dest_asset_hdr_rec,
1077            p_dest_trans_rec       => l_dest_trans_rec,
1078            p_calling_fn           => l_calling_fn,
1079            x_interco_impact       => l_interco_impact, p_log_level_rec => p_log_level_rec) then
1080          raise inv_xfr_err;
1081       end if;
1082    end if;
1083 
1084    if (p_log_level_rec.statement_level) then
1085       if (l_interco_impact) then
1086          fa_debug_pkg.add(l_calling_fn,'intercompany impact','TRUE', p_log_level_rec => p_log_level_rec);
1087       else
1088          fa_debug_pkg.add(l_calling_fn,'intercompany impact','FALSE', p_log_level_rec => p_log_level_rec);
1089       end if;
1090    end if;
1091 
1092    select asset_type,current_units
1093      into l_from_asset_type,l_from_current_units
1094      from fa_additions_b
1095     where asset_id = l_src_asset_hdr_rec.asset_id;
1096 
1097    select asset_type,current_units
1098      into l_to_asset_type,l_to_current_units
1099      from fa_additions_b
1100     where asset_id = l_dest_asset_hdr_rec.asset_id;
1101 
1102    if ((l_dest_asset_hdr_rec.period_of_addition = 'N' and
1103         l_src_asset_hdr_rec.period_of_addition  = 'N' and
1104         l_from_asset_type = l_to_asset_type)
1105         or g_release <> 11) then
1106 
1107       if not fa_cache_pkg.fazcbc(X_book => l_src_asset_hdr_rec.book_type_code,
1108                                  p_log_level_rec => p_log_level_rec) then
1109          raise inv_xfr_err;
1110       end if;
1111 
1112       l_current_period_counter := fa_cache_pkg.fazcbc_record.last_period_counter + 1;
1113 
1114       delete from fa_adjustments
1115        where asset_id              in (l_src_asset_hdr_rec.asset_id,l_dest_asset_hdr_rec.asset_id)
1116          and book_type_code         = l_src_asset_hdr_rec.book_type_code
1117          and period_counter_created = l_current_period_counter
1118          and transaction_header_id in (l_dest_trans_rec.transaction_header_id,l_src_trans_rec.transaction_header_id)
1119          and adjustment_type        = 'COST CLEARING';
1120 
1121       delete from fa_mc_adjustments
1122        where asset_id              in (l_src_asset_hdr_rec.asset_id,l_dest_asset_hdr_rec.asset_id)
1123          and book_type_code         = l_src_asset_hdr_rec.book_type_code
1124          and period_counter_created = l_current_period_counter
1125          and transaction_header_id in (l_dest_trans_rec.transaction_header_id,l_src_trans_rec.transaction_header_id)
1126          and adjustment_type        = 'COST CLEARING';
1127 
1128       -- only fire the intercompany logic for pre-R12
1129       if (l_interco_impact and g_release = 11) then
1130          if not fa_interco_pvt.do_all_books(p_src_trans_rec      => l_src_trans_rec,
1131                                             p_src_asset_hdr_rec  => l_src_asset_hdr_rec,
1132                                             p_dest_trans_rec     => l_dest_trans_rec,
1133                                             p_dest_asset_hdr_rec => l_dest_asset_hdr_rec,
1134                                             p_calling_fn         => l_calling_fn,
1135                                             p_log_level_rec      => p_log_level_rec) then
1136             raise inv_xfr_err;
1137          end if;
1138       end if;
1139 
1140    elsif (l_dest_asset_hdr_rec.period_of_addition = 'N' and l_src_asset_hdr_rec.period_of_addition  = 'N') then
1141 
1142       SELECT CODE_COMBINATION_ID
1143         INTO l_clearing_ccid
1144         FROM FA_ADJUSTMENTS
1145        WHERE ASSET_ID              = l_src_asset_hdr_rec.asset_id
1146          AND BOOK_TYPE_CODE        = l_src_asset_hdr_rec.book_type_code
1147          AND TRANSACTION_HEADER_ID = l_src_trans_rec.transaction_header_id
1148          AND ADJUSTMENT_TYPE       = 'COST CLEARING'
1149          AND ROWNUM                < 2;
1150 
1151       if (l_interco_impact) then
1152 
1153          l_current_period_counter := fa_cache_pkg.fazcbc_record.last_period_counter + 1;
1154 
1155          delete from fa_adjustments
1156           where asset_id              in (l_src_asset_hdr_rec.asset_id,l_dest_asset_hdr_rec.asset_id)
1157             and book_type_code         = l_src_asset_hdr_rec.book_type_code
1158             and period_counter_created = l_current_period_counter
1159             and transaction_header_id in (l_dest_trans_rec.transaction_header_id,l_src_trans_rec.transaction_header_id)
1160             and adjustment_type        = 'COST CLEARING';
1161 
1162          delete from fa_mc_adjustments
1163           where asset_id              in (l_src_asset_hdr_rec.asset_id,l_dest_asset_hdr_rec.asset_id)
1164             and book_type_code         = l_src_asset_hdr_rec.book_type_code
1165             and period_counter_created = l_current_period_counter
1166             and transaction_header_id in (l_dest_trans_rec.transaction_header_id,l_src_trans_rec.transaction_header_id)
1167             and adjustment_type        = 'COST CLEARING';
1168 
1169          if not fa_interco_pvt.do_all_books(p_src_trans_rec      => l_src_trans_rec,
1170                                             p_src_asset_hdr_rec  => l_src_asset_hdr_rec,
1171                                             p_dest_trans_rec     => l_dest_trans_rec,
1172                                             p_dest_asset_hdr_rec => l_dest_asset_hdr_rec,
1173                                             p_calling_fn         => l_calling_fn,
1174                                             p_log_level_rec      => p_log_level_rec) then
1175             raise inv_xfr_err;
1176          end if;
1177 
1178          if not do_all_books(p_src_trans_rec      => l_src_trans_rec,
1179                              p_src_asset_hdr_rec  => l_src_asset_hdr_rec,
1180                              p_dest_trans_rec     => l_dest_trans_rec,
1181                              p_dest_asset_hdr_rec => l_dest_asset_hdr_rec,
1182                              p_period_counter     => l_current_period_counter,
1183                              p_ccid               => l_clearing_ccid,
1184                              p_src_asset_type     => l_from_asset_type,
1185                              p_dest_asset_type    => l_to_asset_type,
1186                              p_src_current_units  => l_from_current_units,
1187                              p_dest_current_units => l_to_current_units,
1188                              p_calling_fn         => l_calling_fn,
1189                              p_log_level_rec      => p_log_level_rec) then
1190             raise inv_xfr_err;
1191          end if;
1192 
1193       else
1194 
1195          UPDATE FA_ADJUSTMENTS
1196             SET CODE_COMBINATION_ID   = l_clearing_ccid,
1197                 DEBIT_CREDIT_FLAG     = DECODE(DEBIT_CREDIT_FLAG, 'CR','DR','CR'),
1198                 ADJUSTMENT_AMOUNT     = -1 * ADJUSTMENT_AMOUNT
1199           WHERE ASSET_ID              = l_src_asset_hdr_rec.asset_id
1200             AND BOOK_TYPE_CODE        = l_src_asset_hdr_rec.book_type_code
1201             AND TRANSACTION_HEADER_ID = l_src_trans_rec.transaction_header_id
1202             AND ADJUSTMENT_TYPE       = 'COST CLEARING';
1203 
1204          UPDATE FA_MC_ADJUSTMENTS
1205             SET CODE_COMBINATION_ID   = l_clearing_ccid,
1206                 DEBIT_CREDIT_FLAG     = DECODE(DEBIT_CREDIT_FLAG, 'CR','DR','CR'),
1207                 ADJUSTMENT_AMOUNT     = -1 * ADJUSTMENT_AMOUNT
1208          WHERE ASSET_ID               = l_src_asset_hdr_rec.asset_id
1209             AND BOOK_TYPE_CODE        = l_src_asset_hdr_rec.book_type_code
1210             AND TRANSACTION_HEADER_ID = l_src_trans_rec.transaction_header_id
1211             AND ADJUSTMENT_TYPE       = 'COST CLEARING';
1212 
1213          UPDATE FA_ADJUSTMENTS
1214             SET CODE_COMBINATION_ID   = l_clearing_ccid,
1215                 DEBIT_CREDIT_FLAG     = DECODE(DEBIT_CREDIT_FLAG, 'CR','DR','CR'),
1216                 ADJUSTMENT_AMOUNT     = -1 * ADJUSTMENT_AMOUNT
1217           WHERE ASSET_ID              = l_dest_asset_hdr_rec.asset_id
1218             AND BOOK_TYPE_CODE        = l_dest_asset_hdr_rec.book_type_code
1219             AND TRANSACTION_HEADER_ID = l_dest_trans_rec.transaction_header_id
1220             AND ADJUSTMENT_TYPE       = 'COST CLEARING';
1221 
1222          UPDATE FA_MC_ADJUSTMENTS
1223             SET CODE_COMBINATION_ID   = l_clearing_ccid,
1224                 DEBIT_CREDIT_FLAG     = DECODE(DEBIT_CREDIT_FLAG, 'CR','DR','CR'),
1225                 ADJUSTMENT_AMOUNT     = -1 * ADJUSTMENT_AMOUNT
1226           WHERE ASSET_ID              = l_dest_asset_hdr_rec.asset_id
1227             AND BOOK_TYPE_CODE        = l_dest_asset_hdr_rec.book_type_code
1228             AND TRANSACTION_HEADER_ID = l_dest_trans_rec.transaction_header_id
1229             AND ADJUSTMENT_TYPE       = 'COST CLEARING';
1230 
1231       end if; -- interco impact
1232    end if; -- asset type and period of addition
1233 
1234    -- SLA: update the source_dest_code accordingly
1235    -- ideally would do this for cost in FAVIATB.pls but no good way to do so
1236    update fa_adjustments
1237       set source_dest_code = decode(transaction_header_Id,l_src_trans_rec.transaction_header_id, 'SOURCE','DEST')
1238    where transaction_header_id in (l_src_trans_rec.transaction_header_id,l_dest_trans_rec.transaction_header_id);
1239 
1240    update fa_mc_adjustments
1241       set source_dest_code =decode(transaction_header_Id,l_src_trans_rec.transaction_header_id, 'SOURCE','DEST')
1242    where transaction_header_id in (l_src_trans_rec.transaction_header_id,l_dest_trans_rec.transaction_header_id);
1243 
1244    -- Cannot Transfer Lines between expensed and Non Expensed Assets */
1245    if ((l_from_asset_type =  'EXPENSED' and l_to_asset_type <> 'EXPENSED') OR
1246        (l_from_asset_type <> 'EXPENSED' and l_to_asset_type  = 'EXPENSED')) THEN
1247       fa_srvr_msg.add_message(calling_fn      => l_calling_fn,
1248                               name            => 'FA_TFRINV_NO_EXP_NONEXP',
1249                               p_log_level_rec => p_log_level_rec);
1250       raise inv_xfr_err;
1251    end if;
1252 
1253    return true;
1254 
1255 exception
1256    when inv_xfr_err then
1257 
1258       fa_srvr_msg.add_sql_error(calling_fn      => l_calling_fn,
1259                                 p_log_level_rec => p_log_level_rec);
1260 
1261       FND_MSG_PUB.count_and_get (p_count => x_msg_count,
1262                                  p_data  => x_msg_data);
1263 
1264       return false;
1265 
1266    when others then
1267 
1268       fa_srvr_msg.add_sql_error(calling_fn      => l_calling_fn,
1269                                 p_log_level_rec => p_log_level_rec);
1270 
1271       FND_MSG_PUB.count_and_get (p_count => x_msg_count,
1272                                  p_data  => x_msg_data);
1273 
1274       return false;
1275 
1276 END do_inv_sub_transfer;
1277 -- Bug 8862296 Changes end here.
1278 
1279 END FA_INV_XFR_PUB;