DBA Data[Home] [Help]

PACKAGE BODY: APPS.FA_ADJUSTMENT_PUB

Source


1 PACKAGE BODY FA_ADJUSTMENT_PUB as
2 /* $Header: FAPADJB.pls 120.54.12010000.8 2009/02/05 09:21:15 mswetha ship $   */
3 
4 --*********************** Global constants ******************************--
5 
6 G_PKG_NAME      CONSTANT   varchar2(30) := 'FA_ADJUSTMENT_PUB';
7 G_API_NAME      CONSTANT   varchar2(30) := 'Adjustment API';
8 G_API_VERSION   CONSTANT   number       := 1.0;
9 
10 g_log_level_rec            fa_api_types.log_level_rec_type;
11 
12 
13 --*********************** Private functions ******************************--
14 
15 -- private declaration for books (mrc) wrapper
16 
17 g_cip_cost    number  := 0;
18 g_cost        number  := 0;
19 
20 FUNCTION do_all_books
21    (px_trans_rec               IN OUT NOCOPY FA_API_TYPES.trans_rec_type,
22     px_asset_hdr_rec           IN OUT NOCOPY FA_API_TYPES.asset_hdr_rec_type,
23     p_asset_desc_rec           IN     FA_API_TYPES.asset_desc_rec_type,
24     p_asset_type_rec           IN     FA_API_TYPES.asset_type_rec_type,
25     p_asset_cat_rec            IN     FA_API_TYPES.asset_cat_rec_type,
26     p_asset_fin_rec_adj        IN     FA_API_TYPES.asset_fin_rec_type,
27     px_inv_trans_rec           IN OUT NOCOPY FA_API_TYPES.inv_trans_rec_type,
28     px_inv_tbl                 IN OUT NOCOPY FA_API_TYPES.inv_tbl_type,
29     p_asset_deprn_rec_adj      IN     FA_API_TYPES.asset_deprn_rec_type,
30     p_group_reclass_options_rec IN    FA_API_TYPES.group_reclass_options_rec_type,
31     p_log_level_rec            IN     FA_API_TYPES.log_level_rec_type default null) RETURN BOOLEAN;
32 
33 
34 --*********************** Public procedures ******************************--
35 
36 PROCEDURE do_adjustment
37    (p_api_version              IN     NUMBER,
38     p_init_msg_list            IN     VARCHAR2 := FND_API.G_FALSE,
39     p_commit                   IN     VARCHAR2 := FND_API.G_FALSE,
40     p_validation_level         IN     NUMBER   := FND_API.G_VALID_LEVEL_FULL,
41     p_calling_fn               IN     VARCHAR2,
42     x_return_status               OUT NOCOPY VARCHAR2,
43     x_msg_count                   OUT NOCOPY NUMBER,
44     x_msg_data                    OUT NOCOPY VARCHAR2,
45 
46     px_trans_rec               IN OUT NOCOPY FA_API_TYPES.trans_rec_type,
47     px_asset_hdr_rec           IN OUT NOCOPY FA_API_TYPES.asset_hdr_rec_type,
48     p_asset_fin_rec_adj        IN     FA_API_TYPES.asset_fin_rec_type,
49     x_asset_fin_rec_new           OUT NOCOPY FA_API_TYPES.asset_fin_rec_type,
50     x_asset_fin_mrc_tbl_new       OUT NOCOPY FA_API_TYPES.asset_fin_tbl_type,
51     px_inv_trans_rec           IN OUT NOCOPY FA_API_TYPES.inv_trans_rec_type,
52     px_inv_tbl                 IN OUT NOCOPY FA_API_TYPES.inv_tbl_type,
53     p_asset_deprn_rec_adj      IN     FA_API_TYPES.asset_deprn_rec_type,
54     x_asset_deprn_rec_new         OUT NOCOPY FA_API_TYPES.asset_deprn_rec_type,
55     x_asset_deprn_mrc_tbl_new     OUT NOCOPY FA_API_TYPES.asset_deprn_tbl_type,
56     p_group_reclass_options_rec IN    FA_API_TYPES.group_reclass_options_rec_type) IS
57 
58    l_reporting_flag          varchar2(1);
59    l_inv_count               number := 0;
60    l_deprn_count             number := 0;
61    l_count                   number := 0;
62 
63    l_asset_fin_rec_adj       FA_API_TYPES.asset_fin_rec_type   := p_asset_fin_rec_adj;
64    l_asset_fin_mrc_tbl_adj   FA_API_TYPES.asset_fin_tbl_type;
65    l_asset_deprn_rec_adj     FA_API_TYPES.asset_deprn_rec_type;
66    l_asset_deprn_mrc_tbl_adj FA_API_TYPES.asset_deprn_tbl_type;
67 
68    l_asset_fin_rec_new       FA_API_TYPES.asset_fin_rec_type   := p_asset_fin_rec_adj;
69    l_asset_fin_mrc_tbl_new   FA_API_TYPES.asset_fin_tbl_type;
70    l_asset_deprn_rec_new     FA_API_TYPES.asset_deprn_rec_type;
71    l_asset_deprn_mrc_tbl_new FA_API_TYPES.asset_deprn_tbl_type;
72 
73    l_asset_desc_rec          FA_API_TYPES.asset_desc_rec_type;
74    l_asset_type_rec          FA_API_TYPES.asset_type_rec_type;
75    l_asset_cat_rec           FA_API_TYPES.asset_cat_rec_type;
76 
77    -- used to store original sob info upon entry into api
78    l_orig_set_of_books_id    number;
79    l_orig_currency_context   varchar2(64);
80 
81    -- used for tax books when doing cip-in-tax or autocopy
82    l_trans_rec               FA_API_TYPES.trans_rec_type;
83    l_asset_hdr_rec           FA_API_TYPES.asset_hdr_rec_type;
84    l_tax_book_tbl            FA_CACHE_PKG.fazctbk_tbl_type;
85    l_tax_index               NUMBER;  -- index for tax loop
86 
87    -- Bug 6665510: FP: Japan Tax Reform Project
88    l_deprn_method_code       varchar2(12);
89    l_life_in_months          number(4);
90 
91    l_calling_fn              VARCHAR2(35) := 'fa_adjustment_pub.do_adjustment';
92    adj_err                   EXCEPTION;
93 
94 
95 BEGIN
96 
97    SAVEPOINT do_adjustment;
98    if (not g_log_level_rec.initialized) then
99       if (NOT fa_util_pub.get_log_level_rec (
100                 x_log_level_rec =>  g_log_level_rec
101       )) then
102          raise adj_err;
103       end if;
104    end if;
105 
106    g_cip_cost := 0;
107 
108    -- Initialize message list if p_init_msg_list is set to TRUE.
109    if (fnd_api.to_boolean(p_init_msg_list)) then
110         -- initialize error message stack.
111         fa_srvr_msg.init_server_message;
112 
113         -- initialize debug message stack.
114         fa_debug_pkg.initialize;
115    end if;
116 
117    -- Check version of the API
118    -- Standard call to check for API call compatibility.
119    if NOT fnd_api.compatible_api_call (
120           G_API_VERSION,
121           p_api_version,
122           G_API_NAME,
123           G_PKG_NAME) then
124       x_return_status := FND_API.G_RET_STS_ERROR;
125       raise adj_err;
126    end if;
127 
128    -- call the cache for the primary transaction book
129    if NOT fa_cache_pkg.fazcbc(X_book => px_asset_hdr_rec.book_type_code,
130                               p_log_level_rec              => g_log_level_rec) then
131       raise adj_err;
132    end if;
133 
134    px_asset_hdr_rec.set_of_books_id := fa_cache_pkg.fazcbc_record.set_of_books_id;
135 
136    -- verify the asset exist in the book already
137    if not FA_ASSET_VAL_PVT.validate_asset_book
138               (p_transaction_type_code      => 'ADJUSTMENT',
139                p_book_type_code             => px_asset_hdr_rec.book_type_code,
140                p_asset_id                   => px_asset_hdr_rec.asset_id,
141                p_calling_fn                 => l_calling_fn,
142                p_log_level_rec              => g_log_level_rec) then
143       raise adj_err;
144    end if;
145 
146    -- get the current info for the primary book
147 
148    fnd_profile.get ('GL_SET_OF_BKS_ID',l_orig_set_of_books_id);
149    l_orig_currency_context :=  SUBSTRB(USERENV('CLIENT_INFO'),45,10);
150 
151    fnd_profile.put('GL_SET_OF_BKS_ID', px_asset_hdr_rec.set_of_books_id);
152    fnd_client_info.set_currency_context (px_asset_hdr_rec.set_of_books_id);
153 
154    -- Account for transaction submitted from a responsibility
155    -- that is not tied to a SOB_ID by getting the value from
156    -- the book struct
157 
158    -- Get the book type code P,R or N
159    if not fa_cache_pkg.fazcsob
160       (X_set_of_books_id   => px_asset_hdr_rec.set_of_books_id,
161        X_mrc_sob_type_code => l_reporting_flag,
162        p_log_level_rec              => g_log_level_rec) then
163       raise adj_err;
164    end if;
165 
166    --  Error out if the program is submitted from the Reporting Responsibility
167    --  No transaction permitted directly on reporting books.
168 
169    IF l_reporting_flag = 'R' THEN
170       fa_srvr_msg.add_message
171           (calling_fn => l_calling_fn,
172            name => 'MRC_OSP_INVALID_BOOK_TYPE'
173            ,p_log_level_rec => g_log_level_rec);
174       raise adj_err;
175    END IF;
176 
177    -- end initial MRC validation
178 
179 
180    -- pop the structs for the non-fin information needed for trx
181 
182    if not FA_UTIL_PVT.get_asset_desc_rec
183           (p_asset_hdr_rec         => px_asset_hdr_rec,
184            px_asset_desc_rec       => l_asset_desc_rec,
185            p_log_level_rec              => g_log_level_rec) then
186       raise adj_err;
187    end if;
188 
189    if not FA_UTIL_PVT.get_asset_cat_rec
190           (p_asset_hdr_rec         => px_asset_hdr_rec,
191            px_asset_cat_rec        => l_asset_cat_rec,
192            p_date_effective        => null,
193            p_log_level_rec              => g_log_level_rec) then
194       raise adj_err;
195    end if;
196 
197    if not FA_UTIL_PVT.get_asset_type_rec
198           (p_asset_hdr_rec         => px_asset_hdr_rec,
199            px_asset_type_rec       => l_asset_type_rec,
200            p_date_effective        => null,
201            p_log_level_rec              => g_log_level_rec) then
202       raise adj_err;
203    end if;
204 
205    -- SLA Uptake
206    -- since we're doing away with voids, set the trx type here
207 
208    if (l_asset_type_rec.asset_type = 'CIP') then
209       px_trans_rec.transaction_type_code := 'CIP ADJUSTMENT';
210    elsif (l_asset_type_rec.asset_type = 'GROUP') then
211       px_trans_rec.transaction_type_code:= 'GROUP ADJUSTMENT';
212    else
213       px_trans_rec.transaction_type_code := 'ADJUSTMENT';
214    end if;
215 
216    -- don't see a reason to pop the dist info here since it's static
217    -- and should be needed by the calc engine
218 
219    l_inv_count   := px_inv_tbl.count;
220 
221    -- Bug 6665510: FP: Japan Tax Reform Project (Start)
222    select deprn_method_code,
223           life_in_months
224    into l_deprn_method_code,
225         l_life_in_months
226    from fa_books
227    where book_type_code = px_asset_hdr_rec.book_type_code
228    and asset_id = px_asset_hdr_rec.asset_id
229    and transaction_header_id_out is null;
230 
231    /*if (p_log_level_rec.statement_level) then
232       fa_debug_pkg.add('pub adj api', 'l_deprn_method_code', l_deprn_method_code, p_log_level_rec);
233       fa_debug_pkg.add('pub adj api', 'l_life_in_months', l_life_in_months, p_log_level_rec);
234    end if; */
235 
236    if not fa_cache_pkg.fazccmt (
237       X_method  => l_deprn_method_code,
238       X_life    => l_life_in_months) then
239       raise adj_err;
240    end if;
241 
242    /* if (p_log_level_rec.statement_level) then
243       fa_debug_pkg.add('pub adj api', 'fa_cache_pkg.fazccmt_record.guarantee_rate_method_flag', fa_cache_pkg.fazccmt_record.guarantee_rate_method_flag, p_log_level_rec);
244    end if; */
245 
246    if (nvl(fa_cache_pkg.fazccmt_record.guarantee_rate_method_flag,'NO') = 'YES') and
247        nvl(l_asset_fin_rec_adj.group_asset_id,
248            FND_API.G_MISS_NUM) <> FND_API.G_MISS_NUM then
249        fa_srvr_msg.add_message
250           (calling_fn => l_calling_fn,
251            name => 'FA_GROUP_NOT_AVAILABLE');
252        raise adj_err;
253    end if;
254    -- Bug 6665510: FP: Japan Tax Reform Project (End)
255 
256    -- do not allow manual cost changes on cip assets in corp
257    -- cost adjustments must be doen via invoices
258 
259    if (fa_cache_pkg.fazcbc_record.book_class = 'CORPORATE' and
260        l_asset_type_rec.asset_type = 'CIP' and
261        nvl(p_asset_fin_rec_adj.cost, 0) <> 0) then
262       fa_srvr_msg.add_message
263           (calling_fn => l_calling_fn,
264            name       => 'FA_BOOK_NO_CIP_COST_CHANGE'
265            ,p_log_level_rec => g_log_level_rec);
266       raise adj_err;
267    end if;
268 
269    -- do not allow manual cost changes on cip assets in tax
270    -- except when api is called from the cip-in-tax gateway
271 
272    if (fa_cache_pkg.fazcbc_record.book_class = 'TAX' and
273         l_asset_type_rec.asset_type = 'CIP' and
274         p_calling_fn NOT IN ('fa_ciptax_api_pkg.cip_adj','FA_RECLASS_PVT.do_redefault'
275 ))
276 then
277       fa_srvr_msg.add_message
278           (calling_fn => l_calling_fn,
279            name       => 'FA_BOOK_NO_CIP_COST_CHANGE'
280            ,p_log_level_rec => g_log_level_rec);
281       raise adj_err;
282    end if;
283 
284 
285    -- do not allow cost adjustment on group assets
286 
287    if (l_asset_type_rec.asset_type = 'GROUP' and
288        nvl(p_asset_fin_rec_adj.cost, 0) <> 0) then
289       fa_srvr_msg.add_message
290           (calling_fn => l_calling_fn,
291            name       => 'FA_BOOK_NO_GROUP_COST_CHANGE'
292            ,p_log_level_rec => g_log_level_rec);
293       raise adj_err;
294    end if;
295 
296    -- nor invoice related adjustments
297    if (l_asset_type_rec.asset_type = 'GROUP' and
298        px_inv_tbl.count <> 0) then
299       fa_srvr_msg.add_message
300           (calling_fn => l_calling_fn,
301            name       => 'FA_BOOK_NO_GROUP_COST_CHANGE'
302            ,p_log_level_rec => g_log_level_rec);
303       raise adj_err;
304    end if;
305 
306 
307 
308    -- set the trx type to ADJUSTMENT or CIP ADJUSTMENT
309    -- is reset in the private api for period of addition
310 
311    if (l_asset_type_rec.asset_type = 'CIP') then
312       px_trans_rec.transaction_type_code := 'CIP ADJUSTMENT';
313    elsif (l_asset_type_rec.asset_type = 'GROUP') then
314       px_trans_rec.transaction_type_code := 'GROUP ADJUSTMENT';
315       if (nvl(px_trans_rec.transaction_key, 'XX') <> 'SG') then
316          px_trans_rec.transaction_key       := 'GJ';
317       end if;
318    else
319       px_trans_rec.transaction_type_code := 'ADJUSTMENT';
320    end if;
321 
322    -- default the trx_subtype to EXPENSED if null (AMORTIZED for group)
323    if (l_asset_type_rec.asset_type = 'GROUP' and
324        px_trans_rec.transaction_subtype is null) then
325       px_trans_rec.transaction_subtype := 'AMORTIZED';
326    elsif (px_trans_rec.transaction_subtype is null) then
327       px_trans_rec.transaction_subtype := 'EXPENSED';
328    end if;
329 
330    -- we need the thid first for inserting clearing into adjustments
331    -- SLA: do not populate when this is called from an invoice transfer
332    -- and the id was already populated
333 
334    if (nvl(px_inv_trans_rec.transaction_type, 'X') <> 'INVOICE TRANSFER') then
335       select fa_transaction_headers_s.nextval
336         into px_trans_rec.transaction_header_id
337         from dual;
338    end if;
339 
340    -- also check if this is the period of addition - use absolute mode for adjustments
341    -- we will only clear cost outside period of addition
342    if not FA_ASSET_VAL_PVT.validate_period_of_addition
343              (p_asset_id            => px_asset_hdr_rec.asset_id,
344               p_book                => px_asset_hdr_rec.book_type_code,
345               p_mode                => 'ABSOLUTE',
346               px_period_of_addition => px_asset_hdr_rec.period_of_addition,
347               p_log_level_rec              => g_log_level_rec) then
348       raise adj_err;
349    end if;
350 
351    -- call the mrc wrapper for the transaction book
352 
353    if not do_all_books
354       (px_trans_rec               => px_trans_rec,
355        px_asset_hdr_rec           => px_asset_hdr_rec ,
356        p_asset_desc_rec           => l_asset_desc_rec ,
357        p_asset_type_rec           => l_asset_type_rec ,
358        p_asset_cat_rec            => l_asset_cat_rec ,
359        p_asset_fin_rec_adj        => p_asset_fin_rec_adj,
360        px_inv_trans_rec           => px_inv_trans_rec,
361        px_inv_tbl                 => px_inv_tbl,
362        p_asset_deprn_rec_adj      => p_asset_deprn_rec_adj,
363        p_group_reclass_options_rec=> p_group_reclass_options_rec,
364        p_log_level_rec              => g_log_level_rec)then
365       raise adj_err;
366    end if;
367 
368    -- If book is a corporate book, process cip assets and autocopy
369 
370    if (fa_cache_pkg.fazcbc_record.book_class = 'CORPORATE') then
371 
372       -- BUG# 2792134
373       -- null out the fin_rec table as well as deprn
374       -- cost and mrc cost will be rederived using corp values
375 
376       l_asset_fin_rec_adj := null;
377       l_asset_fin_mrc_tbl_adj.delete;
378 
379       l_asset_fin_rec_adj.cost := G_cost;
380       -- excluding salvage changes for now
384 
381       -- nothing else should apply to tax (method, etc, and remain the same)
382 
383       -- do not continue if there are no changes to process
385       if (nvl(l_asset_fin_rec_adj.cost, 0) = 0) then
386          null;
387       else
388          -- null out the deprn_adj table as we do not want to autocopy
389          -- any deprn info to tax books
390 
391          l_asset_deprn_rec_adj := null;
392 
393          l_trans_rec                       := px_trans_rec;
394          l_asset_hdr_rec                   := px_asset_hdr_rec;
395 
396          if not fa_cache_pkg.fazctbk
397                    (x_corp_book    => px_asset_hdr_rec.book_type_code,
398                     x_asset_type   => l_asset_type_rec.asset_type,
399                     x_tax_book_tbl => l_tax_book_tbl,
400                     p_log_level_rec              => g_log_level_rec) then
401             raise adj_err;
402          end if;
403 
404          for l_tax_index in 1..l_tax_book_tbl.count loop
405 
406             -- verify that the asset exists in the tax book
407             -- if not just bypass it
408 
409             if not (FA_ASSET_VAL_PVT.validate_asset_book
410                     (p_transaction_type_code      => 'ADJUSTMENT',
411                      p_book_type_code             => l_tax_book_tbl(l_tax_index),
412                      p_asset_id                   => px_asset_hdr_rec.asset_id,
413                      p_calling_fn                 => l_calling_fn,
414                      p_log_level_rec              => g_log_level_rec)) then
415                null;
416             else
417 
418                -- cache the book information for the tax book
419                if (NOT fa_cache_pkg.fazcbc(X_book => l_tax_book_tbl(l_tax_index),
420                       p_log_level_rec              => g_log_level_rec)) then
421                   raise adj_err;
422                end if;
423 
424                -- NOTE!!!!
425                -- May need to set the transaction date, trx_type, subtype here as well
426                -- based on the open period and settings for each tax book in the loop
427 
428                l_asset_hdr_rec.book_type_code           := l_tax_book_tbl(l_tax_index);
429                l_asset_hdr_rec.set_of_books_id          := fa_cache_pkg.fazcbc_record.set_of_books_id;
430                l_trans_rec.source_transaction_header_id := px_trans_rec.transaction_header_id;
431                l_trans_rec.transaction_header_id        := null;
432 
433                -- set the gl sob info for the primary tax book
434                fnd_profile.put('GL_SET_OF_BKS_ID', l_asset_hdr_rec.set_of_books_id);
435                fnd_client_info.set_currency_context (l_asset_hdr_rec.set_of_books_id);
436 
437                -- SLA: we need the thid or each tax book as well
438                -- note that we do it here rather than do_all
439                -- books because of invoice impacts in corp above
440                select fa_transaction_headers_s.nextval
441                  into l_trans_rec.transaction_header_id
442                  from dual;
443 
444               if not do_all_books
445                 (px_trans_rec               => l_trans_rec,              -- tax
446                  px_asset_hdr_rec           => l_asset_hdr_rec ,         -- tax
447                  p_asset_desc_rec           => l_asset_desc_rec ,
448                  p_asset_type_rec           => l_asset_type_rec ,
449                  p_asset_cat_rec            => l_asset_cat_rec ,
450                  p_asset_fin_rec_adj        => l_asset_fin_rec_adj,
451                  px_inv_trans_rec           => px_inv_trans_rec,
452                  px_inv_tbl                 => px_inv_tbl,
453                  p_asset_deprn_rec_adj      => l_asset_deprn_rec_adj,
454                  p_group_reclass_options_rec=> p_group_reclass_options_rec,
455                  p_log_level_rec              => g_log_level_rec) then
456                 raise adj_err;
457               end if;
458 
459            end if; -- exists in tax book
460 
461          end loop; -- tax books
462 
463       end if; -- cost change
464 
465    end if; -- corporate book
466 
467    -- commit if p_commit is TRUE.
468    if (fnd_api.to_boolean (p_commit)) then
469         COMMIT WORK;
470    end if;
471 
472    x_return_status :=  FND_API.G_RET_STS_SUCCESS;
473 
474 
475 EXCEPTION
476 
477    when adj_err then
478       ROLLBACK TO do_adjustment;
479 
480       fnd_profile.put('GL_SET_OF_BKS_ID', l_orig_set_of_books_id);
481       fnd_client_info.set_currency_context (l_orig_currency_context);
482 
483       fa_srvr_msg.add_message(calling_fn => l_calling_fn
484             ,p_log_level_rec => g_log_level_rec);
485 
486       -- do not retrieve / clear messaging when this is being called
487       -- from reclass api - allow calling util to dump them
488       if (p_calling_fn <> 'FA_RECLASS_PVT.do_redefault'  and
489           p_calling_fn <> 'fa_inv_xfr_pub.do_transfer') then
490          FND_MSG_PUB.count_and_get (
491             p_count => x_msg_count,
492             p_data  => x_msg_data
493          );
494       end if;
495 
496       x_return_status :=  FND_API.G_RET_STS_ERROR;
497 
498    when others then
499       ROLLBACK TO do_adjustment;
500 
501       fnd_profile.put('GL_SET_OF_BKS_ID', l_orig_set_of_books_id);
502       fnd_client_info.set_currency_context (l_orig_currency_context);
503 
504       fa_srvr_msg.add_sql_error(
508       -- do not retrieve / clear messaging when this is being called
505               calling_fn => l_calling_fn
506               ,p_log_level_rec => g_log_level_rec);
507 
509       -- from reclass api - allow calling util to dump them
510       if (p_calling_fn <> 'FA_RECLASS_PVT.do_redefault'  and
511           p_calling_fn <> 'fa_inv_xfr_pub.do_transfer') then
512          FND_MSG_PUB.count_and_get (
513             p_count => x_msg_count,
514             p_data  => x_msg_data
515          );
516       end if;
517 
518       x_return_status :=  FND_API.G_RET_STS_ERROR;
519 
520 END do_adjustment;
521 
522 -----------------------------------------------------------------------------
523 
524 -- Books (MRC) Wrapper - called from public API above
525 --
526 -- For non mrc books, this just calls the private API with provided params
527 -- For MRC, it processes the primary and then loops through each reporting
528 -- book calling the private api for each.
529 
530 
531 FUNCTION do_all_books
532    (px_trans_rec               IN OUT NOCOPY FA_API_TYPES.trans_rec_type,
533     px_asset_hdr_rec           IN OUT NOCOPY FA_API_TYPES.asset_hdr_rec_type,
534     p_asset_desc_rec           IN     FA_API_TYPES.asset_desc_rec_type,
535     p_asset_type_rec           IN     FA_API_TYPES.asset_type_rec_type,
536     p_asset_cat_rec            IN     FA_API_TYPES.asset_cat_rec_type,
537     p_asset_fin_rec_adj        IN     FA_API_TYPES.asset_fin_rec_type,
538     px_inv_trans_rec           IN OUT NOCOPY FA_API_TYPES.inv_trans_rec_type,
539     px_inv_tbl                 IN OUT NOCOPY FA_API_TYPES.inv_tbl_type,
540     p_asset_deprn_rec_adj      IN     FA_API_TYPES.asset_deprn_rec_type,
541     p_group_reclass_options_rec IN    FA_API_TYPES.group_reclass_options_rec_type,
542     p_log_level_rec            IN     FA_API_TYPES.log_level_rec_type default null) RETURN BOOLEAN IS
543 
544    -- used for calling private api for reporting books
545    l_asset_hdr_rec            FA_API_TYPES.asset_hdr_rec_type;
546    l_asset_fin_rec_adj        FA_API_TYPES.asset_fin_rec_type;
547    l_asset_deprn_rec_adj      FA_API_TYPES.asset_deprn_rec_type;
548    l_asset_fin_mrc_tbl_adj    FA_API_TYPES.asset_fin_tbl_type;
549    l_asset_deprn_mrc_tbl_adj  FA_API_TYPES.asset_deprn_tbl_type;
550 
551    -- used to store the primary info for later use in mrc calcs
552    l_asset_fin_rec_adj_init   FA_API_TYPES.asset_fin_rec_type;
553    l_asset_deprn_rec_adj_init FA_API_TYPES.asset_deprn_rec_type;
554 
555    -- used for retrieving "old" and "new" structs from private api calls
556    l_asset_fin_rec_old        FA_API_TYPES.asset_fin_rec_type;
557    l_asset_fin_rec_new        FA_API_TYPES.asset_fin_rec_type;
558    l_asset_deprn_rec_old      FA_API_TYPES.asset_deprn_rec_type;
559    l_asset_deprn_rec_new      FA_API_TYPES.asset_deprn_rec_type;
560 
561    -- used for group reclass api call
562    l_group_rcl_trans_rec       FA_API_TYPES.trans_rec_type;
563    l_group_rcl_options_rec     FA_API_TYPES.group_reclass_options_rec_type;
564 
565    l_reporting_flag          varchar2(1);
566 
567    l_period_rec               FA_API_TYPES.period_rec_type;
568    l_sob_tbl                  FA_CACHE_PKG.fazcrsob_sob_tbl_type;
569 
570    -- used for local runs
571    l_responsibility_id       number;
572    l_application_id          number;
573 
574    -- used for get_rate
575    l_deprn_ratio             number;
576    l_exchange_date           date;
577    l_rate                    number;
578    l_result_code             varchar2(15);
579 
580    l_old_primary_cost        number;
581    l_new_primary_cost        number;
582 
583    l_complete                varchar2(1);
584    l_result_code1            varchar2(15);
585 
586    l_index_fin               number;
587    l_index_dep               number;
588 
589    l_exchange_rate           number;
590    l_avg_rate                number;
591    l_inv_rate_sum            number := 0;
592    l_inv_rate_index          number;
593    l_rate_count              number := 0;
594    l_expense_amount          number := 0;
595    l_transaction_date        date;
596    adj_row             FA_ADJUST_TYPE_PKG.fa_adj_row_struct;
597 
598    -- used for new group stuff
599    l_src_trans_rec              fa_api_types.trans_rec_type;
600    l_src_asset_hdr_rec          fa_api_types.asset_hdr_rec_type;
601    l_src_asset_desc_rec         fa_api_types.asset_desc_rec_type;
602    l_src_asset_type_rec         fa_api_types.asset_type_rec_type;
603    l_src_asset_cat_rec          fa_api_types.asset_cat_rec_type;
604    l_src_asset_fin_rec_old      fa_api_types.asset_fin_rec_type;
605    l_src_asset_fin_rec_adj      fa_api_types.asset_fin_rec_type;
606    l_src_asset_fin_rec_new      fa_api_types.asset_fin_rec_type;
607    l_src_asset_deprn_rec_old    fa_api_types.asset_deprn_rec_type;
608    l_src_asset_deprn_rec_adj    fa_api_types.asset_deprn_rec_type;
609    l_src_asset_deprn_rec_new    fa_api_types.asset_deprn_rec_type;
610 
611    l_dest_trans_rec              fa_api_types.trans_rec_type;
612    l_dest_asset_hdr_rec          fa_api_types.asset_hdr_rec_type;
613    l_dest_asset_desc_rec         fa_api_types.asset_desc_rec_type;
614    l_dest_asset_type_rec         fa_api_types.asset_type_rec_type;
615    l_dest_asset_cat_rec          fa_api_types.asset_cat_rec_type;
616    l_dest_asset_fin_rec_old      fa_api_types.asset_fin_rec_type;
617    l_dest_asset_fin_rec_adj      fa_api_types.asset_fin_rec_type;
618    l_dest_asset_fin_rec_new      fa_api_types.asset_fin_rec_type;
622 
619    l_dest_asset_deprn_rec_old    fa_api_types.asset_deprn_rec_type;
620    l_dest_asset_deprn_rec_adj    fa_api_types.asset_deprn_rec_type;
621    l_dest_asset_deprn_rec_new    fa_api_types.asset_deprn_rec_type;
623    l_max_reclass_date            DATE;
624    l_max_ret_date                DATE;
625    h_deprn_exp_acct              varchar2(30);
626 
627    /* Japan Tax Phase3 extended deprn flags */
628    l_extended_flag               boolean := FALSE;
629    l_set_extend_flag             boolean := FALSE;
630    l_reset_extend_flag           boolean := FALSE;
631 
632    /* Bug 6950629: For contract_id adjustment */
633    l_contract_change_flag         boolean := FALSE;
634    l_validate_flag                boolean := FALSE;
635 
636 
637    cursor c_get_max_reclass_date (p_asset_id       number,
638                                   p_book_type_code varchar2) is
639    select dest_amortization_start_date
640      from fa_trx_references
641     where member_asset_id = p_asset_id
642       and book_type_code  = p_book_type_code
643     order by dest_amortization_start_date desc;
644 
645    cursor c_get_overlapping_ret (p_asset_id       number,
646                                  p_book_type_code varchar2) is
647    select transaction_date_entered
648      from fa_transaction_headers
649     where asset_id       = p_asset_id
650       and book_type_code = p_book_type_code
651       and transaction_type_code in
652            ('PARTIAL RETIREMENT','REINSTATEMENT'
653            )
654     order by transaction_date_entered desc;
655 
656    -- Japan Tax phase3
657    -- Cursor to fetch original deprn info before last extended
658    -- Fetch only one row to get the latest one.
659    CURSOR c_extend_get_original_deprn (p_asset_id       number,
660                                        p_book_type_code varchar2) is
661       select bk_old.deprn_method_code,
662              bk_old.life_in_months,
663              bk_old.basic_rate,
664              bk_old.adjusted_rate,
665              bk_old.allowed_deprn_limit,
666              bk_old.deprn_limit_type,
667              bk_old.allowed_deprn_limit_amount
668       from fa_books bk_old, fa_books bk_extnd
669       where bk_old.book_type_code = p_book_type_code and
670             bk_old.asset_id = p_asset_id and
671             bk_old.extended_depreciation_period is null and
672             bk_extnd.book_type_code = p_book_type_code and
673             bk_extnd.asset_id = p_asset_id and
674             bk_extnd.extended_depreciation_period is not null and
675             bk_extnd.transaction_header_id_in = bk_old.transaction_header_id_out
676       order by bk_extnd.transaction_header_id_in desc;
677 
678    -- Japan Tax phase3
679    l_extend_calendar_pod date;
680    l_extend_calendar_pcd date;
681 
682   --Bug# 7613544
683    cursor c_get_context_date(c_book_type_code varchar2) is
684    select   greatest(calendar_period_open_date,
685             least(sysdate, calendar_period_close_date))
686    from     fa_deprn_periods
687    where    book_type_code = c_book_type_code
688    and      period_close_date is null;
689 
690    cursor c_get_method_info(c_method_code varchar2) is
691       select rate_source_rule,rule_name
692             from fa_methods mt,fa_deprn_basis_rules dbr
693       where mt.method_code = c_method_code
694       and mt.deprn_basis_rule_id = dbr.deprn_basis_rule_id(+);
695 
696    l_trx_date           date;
697    l_rate_source_rule varchar2(30);
698    l_rule_name varchar2(120);
699 
700   --Bug# 7613544 end
701 
702    l_calling_fn                  varchar2(30) := 'fa_adjustment_pub.do_all_books';
703    adj_err                       EXCEPTION;
704 
705    --Bug7627286
706    l_deprn_amount             NUMBER;
707 
708 BEGIN
709 
710    --Bug7627286
711    --Call the function to check if deprn has been run for the period
712    -- and also to fetch the deprn amount
713    if not FA_UTIL_PVT.check_deprn_run
714       (X_book              => px_asset_hdr_rec.book_type_code,
715        X_asset_id          => px_asset_hdr_rec.asset_id,
716        X_deprn_amount      => l_deprn_amount,
717        p_log_level_rec     => p_log_level_rec) then
718          null;
719    end if;
720 
721 
722    -- BUG# 2247404 and 2230178 - call regardless if from a mass request
723    if not FA_TRX_APPROVAL_PKG.faxcat
724           (X_book              => px_asset_hdr_rec.book_type_code,
725            X_asset_id          => px_asset_hdr_rec.asset_id,
726            X_trx_type          => px_trans_rec.transaction_type_code,
727            X_trx_date          => px_trans_rec.transaction_date_entered,
728            X_init_message_flag => 'NO',
729            p_log_level_rec     => p_log_level_rec) then
730       raise adj_err;
731    end if;
732 
733    -- check if this is the period of addition - use absolute mode for adjustments
734 
735    if not FA_ASSET_VAL_PVT.validate_period_of_addition
736              (p_asset_id            => px_asset_hdr_rec.asset_id,
737               p_book                => px_asset_hdr_rec.book_type_code,
738               p_mode                => 'ABSOLUTE',
739               px_period_of_addition => px_asset_hdr_rec.period_of_addition,
740               p_log_level_rec     => p_log_level_rec) then
741       raise adj_err;
742    end if;
743 
744    -- load the period struct for current period info
748            x_period_rec     => l_period_rec,
745    if not FA_UTIL_PVT.get_period_rec
746           (p_book           => px_asset_hdr_rec.book_type_code,
747            p_effective_date => NULL,
749            p_log_level_rec     => p_log_level_rec) then
750       raise adj_err;
751    end if;
752 
753    -- moving subtype/date logic into the mrc loop after getting fin_rec_old
754 
755    -- verify asset is not fully retired
756    if fa_asset_val_pvt.validate_fully_retired
757           (p_asset_id          => px_asset_hdr_rec.asset_id,
758            p_book              => px_asset_hdr_rec.book_type_code,
759            p_log_level_rec     => p_log_level_rec) then
760       fa_srvr_msg.add_message
761           (name      => 'FA_REC_RETIRED',
762            calling_fn => l_calling_fn
763            ,p_log_level_rec => p_log_level_rec);
764       raise adj_err;
765    end if;
766 
767 
768    -- call the sob cache to get the table of sob_ids
769    if not FA_CACHE_PKG.fazcrsob
770           (x_book_type_code => px_asset_hdr_rec.book_type_code,
771            x_sob_tbl        => l_sob_tbl,
772            p_log_level_rec => p_log_level_rec) then
773       raise adj_err;
774    end if;
775 
776    -- set up the local asset_header and sob_id
777    l_asset_hdr_rec                 := px_asset_hdr_rec;
778 
779    -- loop through each book starting with the primary and
780    -- call the private API for each
781    FOR l_sob_index in 0..l_sob_tbl.count LOOP
782 
783       if (l_sob_index = 0) then
784          l_reporting_flag := 'P';
785       else
786          l_reporting_flag := 'R';
787          l_asset_hdr_rec.set_of_books_id := l_sob_tbl(l_sob_index);
788 
789          -- set the sob_id and currency context
790          fnd_profile.put('GL_SET_OF_BKS_ID', l_sob_tbl(l_sob_index));
791          fnd_client_info.set_currency_context (to_char(l_sob_tbl(l_sob_index)));
792 
793       end if;
794 
795       -- call the cache to set the sob_id used for rounding and other lower
796       -- level code for each book.
797       if NOT fa_cache_pkg.fazcbcs(X_book => px_asset_hdr_rec.book_type_code,
798                                   p_log_level_rec => p_log_level_rec) then
799          raise adj_err;
800       end if;
801 
802       -- load the old structs
803       if not FA_UTIL_PVT.get_asset_fin_rec
804               (p_asset_hdr_rec         => px_asset_hdr_rec,
805                px_asset_fin_rec        => l_asset_fin_rec_old,
806                p_transaction_header_id => NULL,
807                p_mrc_sob_type_code     => l_reporting_flag,
808                p_log_level_rec     => p_log_level_rec) then raise adj_err;
809       end if;
810 
811       -- HH
812       -- Validate disabled_flag
813       if (p_asset_type_rec.asset_type = 'GROUP') then
814 
815          if not FA_ASSET_VAL_PVT.validate_disabled_flag
816                   (p_group_asset_id => px_asset_hdr_rec.asset_id,
817                    p_book_type_code => px_asset_hdr_rec.book_type_code,
818                    p_old_flag       => l_asset_fin_rec_old.disabled_flag,
819                    p_new_flag       => p_asset_fin_rec_adj.disabled_flag,
820                    p_log_level_rec     => p_log_level_rec) then
821             raise adj_err;
822          end if;
823 
824          /* Bug#7693266- Validate salvage_type or deprn_limit_type change of group */
825          if not FA_ASSET_VAL_PVT.validate_sal_deprn_sum
826                ( p_asset_hdr_rec         => px_asset_hdr_rec,
827                  p_asset_fin_rec_old     => l_asset_fin_rec_old,
828                  p_asset_fin_rec_adj     => p_asset_fin_rec_adj ) then
829 
830              raise adj_err;
831          end if;
832 
833       end if; -- end HH
834 
835       if (l_sob_index = 0) then
836          l_old_primary_cost := l_asset_fin_rec_old.cost;
837          l_asset_fin_rec_adj  := p_asset_fin_rec_adj;
838 
839          l_transaction_date := greatest(l_period_rec.calendar_period_open_date,
840                                         least(sysdate,l_period_rec.calendar_period_close_date));
841          --HH group ed.
842          --set trx key.
843          if px_trans_rec.transaction_type_code = 'GROUP ADJUSTMENT' then
844            if ((nvl(p_asset_fin_rec_adj.disabled_flag,'Y')='N') and
845                (nvl(l_asset_fin_rec_old.disabled_flag, 'N')='Y')) then
846                       px_trans_rec.transaction_key :='GE';
847            elsif ((nvl(p_asset_fin_rec_adj.disabled_flag,'N')='Y') and
848                   (nvl(l_asset_fin_rec_old.disabled_flag, 'N')='N')) then
849                          px_trans_rec.transaction_key :='GD';
850            end if;
851          end if; --end HH.
852 
853          -- BUG# 3046621
854          -- for group members (or previous members) force
855          -- the amort start date to be populated
856 
857          if (px_trans_rec.transaction_subtype = 'EXPENSED') then
858             if (l_asset_fin_rec_old.group_asset_id is not null or
859                 nvl(p_asset_fin_rec_adj.group_asset_id,
860                     FND_API.G_MISS_NUM) <> FND_API.G_MISS_NUM) then
861                px_trans_rec.transaction_subtype := 'AMORTIZED';
862             end if;
863          end if;
864 
865          /* Japan Tax Phase3 Set the extended deprn flags */
866          -- Possible values of extended_deprn_flag are 'Y', 'N', 'D', null and FND_API.G_MISS_CHAR
867          -- l_asset_fin_rec_adj.extended_deprn_flag = null means no change
871             if (nvl(l_asset_fin_rec_adj.extended_deprn_flag,'X') in ('N','D',FND_API.G_MISS_CHAR)) then
868          -- = FND_API.G_MISS_CHAR means make it null
869          if (nvl(l_asset_fin_rec_old.extended_deprn_flag,'N') = 'Y') then
870             l_extended_flag := TRUE;
872                l_reset_extend_flag := TRUE;
873                l_extended_flag := FALSE; -- Bug 6774428 don't need validations when resetting
874             end if;
875          elsif ((nvl(l_asset_fin_rec_adj.extended_deprn_flag,'N') = 'Y') and
876                 (nvl(l_asset_fin_rec_old.extended_deprn_flag,'D') in ('D','N'))) then
877             l_set_extend_flag := TRUE;
878          end if;
879 
880          -- Bug 7488766 Validation for extended deprn on group/member
881          if (l_set_extend_flag) then
882             if ( p_asset_type_rec.asset_type = 'GROUP' ) OR
883              (l_asset_fin_rec_old.group_asset_id is not null or
884               nvl(p_asset_fin_rec_adj.group_asset_id,
885               FND_API.G_MISS_NUM) <> FND_API.G_MISS_NUM) then
886 
887                fa_srvr_msg.add_message(calling_fn => l_calling_fn,name =>'FA_GROUP_ASSET_EXTD_DEPRN_NOT_ALLOWED');
888                raise adj_err;
889             end if;
890          end if;
891 
892          if (px_trans_rec.transaction_subtype = 'EXPENSED') then
893 
894             /* Japan Tax Phase3 don't call validate_exp_after_amort for the
895                extended transaction */
896             if (not l_set_extend_flag) then
897                if not FA_ASSET_VAL_PVT.validate_exp_after_amort
898                          (p_asset_id      => px_asset_hdr_rec.asset_id,
899                           p_book          => px_asset_hdr_rec.book_type_code,
900                           p_extended_flag => l_extended_flag,
901                           p_log_level_rec     => p_log_level_rec
902                          ) then raise adj_err;
903                end if;
904 
905             -- Japan Tax phase3
906             -- trx_date_entered for the extended transaction should be
907             -- corrresponding to extended_depreciation_period
908             elsif (l_asset_fin_rec_adj.extended_depreciation_period is not null) then
909                BEGIN
910 
911                   -- Assuming that extended_deprn_period will always be first
912                   -- period of some fiscal year
913                   /* Bug6962731 - changed the fiscal_year calculation */
914                   select cp.start_date,
915                          cp.end_date
916                   into   l_extend_calendar_pod,
917                          l_extend_calendar_pcd
918                   from   fa_book_controls bc,
919                          fa_fiscal_year fy,
920                          fa_calendar_types ct,
921                          fa_calendar_periods cp
922                   where  bc.book_type_code = px_asset_hdr_rec.book_type_code and
923                          bc.deprn_calendar = ct.calendar_type and
924                          cp.calendar_type = ct.calendar_type and
925                          bc.fiscal_year_name = ct.fiscal_year_name and
926                          fy.fiscal_year_name = ct.fiscal_year_name and
927                          cp.period_num = 1 and
928                          fy.fiscal_year = round (
929                                   (l_asset_fin_rec_adj.extended_depreciation_period - cp.period_num)/
930                                                  ct.number_per_fiscal_year) and
931                          cp.start_date = fy.start_date;
932 
933                EXCEPTION
934                   WHEN OTHERS THEN
935                      if (p_log_level_rec.statement_level) then
936                         fa_debug_pkg.add(l_calling_fn, 'Japan Tax:0 Exception in ', 'trx_date_entered'
937                                          ,p_log_level_rec => p_log_level_rec);
938                      end if;
939                      raise adj_err;
940                END;
941 
942                l_transaction_date := greatest(l_extend_calendar_pod,
943                                               least(sysdate,l_extend_calendar_pcd));
944                if (p_log_level_rec.statement_level) then
945                   fa_debug_pkg.add(l_calling_fn, 'Japan Tax:0 l_transaction_date', l_transaction_date
946                                    ,p_log_level_rec => p_log_level_rec);
947                end if;
948             end if;
949 
950             -- trx_date for all expensed transactions will be last date of open period
951             px_trans_rec.transaction_date_entered := l_transaction_date;
952             px_trans_rec.amortization_start_date := NULL;
953 
954          else
955 
956             -- might want to try to determine user intent here
957             -- if they populate amort_start_date instead of trx_date
958             if (px_trans_rec.amortization_start_date is not null) then
959                px_trans_rec.transaction_date_entered := px_trans_rec.amortization_start_date;
960             else
961 
962               --Bug# 7613544 to default amortization start date for energy if not provided.
963               OPEN c_get_method_info(nvl(p_asset_fin_rec_adj.deprn_method_code,
964                                         l_asset_fin_rec_old.deprn_method_code));
965               FETCH c_get_method_info INTO l_rate_source_rule,l_rule_name ;
966               CLOSE c_get_method_info;
967 
968               if( l_rate_source_rule = 'PRODUCTION' AND l_rule_name = 'ENERGY PERIOD END BALANCE') then
969                 open  c_get_context_date(px_asset_hdr_rec.book_type_code);
973               end if;
970                 fetch c_get_context_date into l_trx_date ;
971                 close c_get_context_date;
972                  px_trans_rec.transaction_date_entered := trunc(l_trx_date);
974               --Bug# 7613544 end
975 
976                if (px_trans_rec.transaction_date_entered is null) then
977                   if (p_asset_type_rec.asset_type = 'GROUP') and
978                      (px_asset_hdr_rec.period_of_addition = 'Y') then
979                      px_trans_rec.transaction_date_entered :=
980                          nvl(p_asset_fin_rec_adj.date_placed_in_service,
981                              l_asset_fin_rec_old.date_placed_in_service);
982                   else
983                      px_trans_rec.transaction_date_entered := l_transaction_date;
984                   end if;
985                end if;
986                px_trans_rec.amortization_start_date := px_trans_rec.transaction_date_entered;
987             end if;
988 
989             -- adding this for group, cip-in-tax, and autocopy...
990             -- basically if future date is passed, automatically set to
991             -- the current period (this accomidates the cip-in-tax and autocopy loops)
992 
993             if (px_trans_rec.transaction_date_entered > l_period_rec.calendar_period_close_date) then
994                px_trans_rec.amortization_start_date  := l_transaction_date;
995                px_trans_rec.transaction_date_entered :=
996                   px_trans_rec.amortization_start_date;
997             end if;
998 
999          end if;
1000 
1001          -- BUG# 3549470
1002          -- remove time stamps from the dates
1003 
1004          px_trans_rec.transaction_date_entered :=
1005             to_date(to_char(px_trans_rec.transaction_date_entered, 'DD/MM/YYYY'),'DD/MM/YYYY');
1006 
1007          px_trans_rec.amortization_start_date :=
1008             to_date(to_char(px_trans_rec.amortization_start_date, 'DD/MM/YYYY'),'DD/MM/YYYY');
1009 
1010 
1011 
1012          -- call the invoice api which will return a populated fin_rec_adj
1013          -- for the delta cost, etc.   invoice engine will alter the gl sob
1014          -- and currency context from the above setting as it processes primary
1015          -- and reporting, but will reset them at temrination back to primary.
1016 
1017          if (fa_cache_pkg.fazcbc_record.book_class = 'CORPORATE') then
1018 
1019             if (px_inv_trans_rec.transaction_type is not null) then
1020 
1021                if not FA_INVOICE_PVT.invoice_engine
1022                    (px_trans_rec              => px_trans_rec,
1023                     px_asset_hdr_rec          => px_asset_hdr_rec,
1024                     p_asset_desc_rec          => p_asset_desc_rec,
1025                     p_asset_type_rec          => p_asset_type_rec,
1026                     p_asset_cat_rec           => p_asset_cat_rec,
1027                     p_asset_fin_rec_adj       => p_asset_fin_rec_adj,
1028                     x_asset_fin_rec_new       => l_asset_fin_rec_adj,
1029                     x_asset_fin_mrc_tbl_new   => l_asset_fin_mrc_tbl_adj,
1030                     px_inv_trans_rec          => px_inv_trans_rec,
1031                     px_inv_tbl                => px_inv_tbl,
1032                     x_asset_deprn_rec_new     => l_asset_deprn_rec_adj,
1033                     x_asset_deprn_mrc_tbl_new => l_asset_deprn_mrc_tbl_adj,
1034                     p_calling_fn              => l_calling_fn,
1035                     p_log_level_rec     => p_log_level_rec) then
1036                  raise adj_err;
1037                end if;
1038 
1039                G_cip_cost := l_asset_fin_rec_adj.cip_cost;
1040                G_cost     := l_asset_fin_rec_adj.cost;
1041 
1042             else
1043 
1044                G_cip_cost := 0;
1045                G_cost     := 0;
1046 
1047                l_asset_fin_rec_adj          := p_asset_fin_rec_adj;
1048                l_asset_deprn_rec_adj        := p_asset_deprn_rec_adj;
1049 
1050             end if; -- invoice based
1051 
1052          else
1053 
1054             -- this is not an invoice scenario and we need to set up the deprn
1055             -- amounts directly from the struct passed in
1056 
1057             -- also insure delta_cip cost is null as this can only be changed
1058             -- via the specific invoice transactions
1059 
1060             l_asset_fin_rec_adj          := p_asset_fin_rec_adj;
1061             l_asset_deprn_rec_adj        := p_asset_deprn_rec_adj;
1062 
1063          end if; -- corp
1064 
1065          if (p_asset_type_rec.asset_type <> 'CIP') then
1066             l_asset_fin_rec_adj.cip_cost := 0;
1067          elsif (nvl(fa_cache_pkg.fazcbc_record.allow_cip_dep_group_flag, 'N') = 'Y') then
1068             l_asset_fin_rec_adj.cip_cost := g_cip_cost;
1069          else
1070             l_asset_fin_rec_adj.cip_cost := l_asset_fin_rec_adj.cost;
1071          end if;
1072 
1073          -- store the calculated values for future use in the mrc loop
1074          l_asset_fin_rec_adj_init   := l_asset_fin_rec_adj;
1075          l_asset_deprn_rec_adj_init := l_asset_deprn_rec_adj;
1076 
1077          /* Japan Tax phase3 -- Do not allow transactions on
1078             assets in extended depreciation */
1079          if (l_extended_flag) then
1080             if not FA_ASSET_VAL_PVT.validate_extended_asset
1081                     (p_asset_hdr_rec         => px_asset_hdr_rec,
1082                      p_asset_fin_rec_old     => l_asset_fin_rec_old,
1086          end if;
1083                      p_asset_fin_rec_adj     => l_asset_fin_rec_adj
1084                  ) then raise adj_err;
1085             end if;
1087 
1088       end if;
1089 
1090       --
1091       --Bug: 4698440 - Check certain adjs to extended life assets.
1092       --This presumably could have been added to validate_adjustment, but that skips
1093       --over invoice-related changes.  So, putting here for now.  It can be moved in future
1094       --if necessary.
1095       --
1096       IF ((l_asset_fin_rec_old.period_counter_life_complete is not null) AND
1097                                (l_asset_fin_rec_old.period_Counter_fully_reserved is null)) THEN
1098          IF (nvl(l_asset_fin_rec_old.cost, 0)
1099                  <> nvl(l_asset_fin_rec_adj.cost, 0) OR
1100              nvl(l_asset_fin_rec_old.salvage_value, 0)
1101                  <> nvl(l_asset_fin_rec_adj.salvage_value,0) OR
1102              nvl(l_asset_fin_rec_old.ceiling_name,'NONE')
1103                  <> nvl(l_asset_fin_rec_adj.ceiling_name,'NONE') OR
1104              nvl(l_asset_fin_rec_old.reval_ceiling,0)
1105                  <> nvl(l_asset_fin_rec_adj.reval_ceiling,0) OR
1106              nvl(l_asset_fin_rec_old.deprn_method_code,'NONE')
1107                   <> nvl(l_asset_fin_rec_adj.deprn_method_code,'NONE') OR
1108              nvl(l_asset_fin_rec_old.date_placed_in_service,'NONE')
1109                   <> nvl(l_asset_fin_rec_adj.date_placed_in_service,'NONE') OR
1110              nvl(l_asset_fin_rec_old.prorate_convention_code, 'NONE')
1111                   <> nvl(l_asset_fin_rec_adj.prorate_convention_code, 'NONE') OR
1112              nvl(l_asset_fin_rec_old.life_in_months,0)
1113                   <> nvl(l_asset_fin_rec_adj.life_in_months ,0) OR
1114              nvl(l_asset_fin_rec_old.depreciate_flag,'NONE') <>
1115                      nvl(l_asset_fin_rec_adj.depreciate_flag,'NONE') OR
1116              nvl(l_asset_fin_rec_old.bonus_rule,'NONE') <>
1117                      nvl(l_asset_fin_rec_adj.bonus_rule,'NONE') OR
1118              nvl(l_asset_fin_rec_old.production_capacity,0) <>
1119                      nvl(l_asset_fin_rec_adj.production_capacity,0)) THEN
1120 
1121              fa_srvr_msg.add_message(calling_fn => 'fa_adjustment_pub.do_all_books',
1122                                                           name =>'FA_NO_TRX_WHEN_LIFE_COMPLETE');
1123              raise adj_err;
1124          END IF;
1125       END IF;
1126 
1127       if not FA_UTIL_PVT.get_asset_deprn_rec
1128               (p_asset_hdr_rec         => px_asset_hdr_rec ,
1129                px_asset_deprn_rec      => l_asset_deprn_rec_old,
1130                p_period_counter        => NULL,
1131                p_mrc_sob_type_code     => l_reporting_flag,
1132                p_log_level_rec     => p_log_level_rec) then raise adj_err;
1133       end if;
1134       -- Bug2887954: Following delete stmts are relocated from
1135       --  above (just before get_asset_fin_rec)
1136       --
1137       -- remove any previously calculated catchup expense for
1138       -- group assets when initial reserve adjustment is being
1139       -- performed
1140 
1141       -- SLA uptake
1142       -- this needs rework - see DLD section on adj api
1143       -- we can't delete lines which are accounted for by extract
1144       -- need to either auto reverse them or restict
1145       --
1146       -- ***REVISIT***
1147 
1148       if (p_asset_type_rec.asset_type = 'GROUP' and
1149           px_asset_hdr_rec.period_of_addition = 'Y' and
1150           nvl(p_asset_deprn_rec_adj.deprn_reserve, 0) <> 0) then
1151 /* Added the below code to reverse the DEPRN EXPENSE
1152   when reserve is manually adjusted in period of addition
1153   bug 4439919 */
1154 
1155         adj_row.account :=
1156                       fa_cache_pkg.fazccb_record.DEPRN_EXPENSE_ACCT;
1157         adj_row.account_type := 'DEPRN_EXPENSE_ACCT';
1158         adj_row.gen_ccid_flag := TRUE;
1159         adj_row.debit_credit_flag := 'CR';
1160         adj_row.selection_mode := fa_std_types.FA_AJ_ACTIVE;
1161         adj_row.last_update_date := sysdate;
1162         adj_row.period_counter_created := l_period_rec.period_counter;
1163         adj_row.asset_id := px_asset_hdr_rec.asset_id;
1164         adj_row.period_counter_adjusted := l_period_rec.period_counter;
1165         adj_row.book_type_code := px_asset_hdr_rec.book_type_code;
1166         adj_row.source_type_code := 'DEPRECIATION';
1167         adj_row.transaction_header_id := px_trans_rec.transaction_header_id;
1168         adj_row.adjustment_type := 'EXPENSE';
1169 
1170          if (l_reporting_flag = 'R') then
1171            adj_row.mrc_sob_type_code := 0;
1172            begin
1173             select sum(decode(debit_credit_flag,'DR',adjustment_amount,-1*adjustment_amount))
1174             into l_expense_amount
1175             from fa_adjustments_mrc_v
1176              where asset_id = px_asset_hdr_rec.asset_id
1177                and book_type_code = px_asset_hdr_rec.book_type_code
1178                and source_type_code = 'DEPRECIATION'
1179                and adjustment_type = 'EXPENSE';
1180            exception
1181               when no_data_found then
1182                   null;
1183            end;
1184 /*
1185             delete from fa_adjustments_mrc_v
1186              where asset_id = px_asset_hdr_rec.asset_id
1187                and book_type_code = px_asset_hdr_rec.book_type_code
1188                and source_type_code = 'DEPRECIATION'
1189                and adjustment_type = 'EXPENSE';
1190 */
1191          else
1192            adj_row.mrc_sob_type_code := 1;
1196             from fa_adjustments
1193            begin
1194             select sum(decode(debit_credit_flag,'DR',adjustment_amount,-1*adjustment_amount))
1195             into l_expense_amount
1197              where asset_id = px_asset_hdr_rec.asset_id
1198                and book_type_code = px_asset_hdr_rec.book_type_code
1199                and source_type_code = 'DEPRECIATION'
1200                and adjustment_type = 'EXPENSE';
1201            exception
1202                when no_data_found then
1203                    null;
1204            end;
1205 /*
1206             delete from fa_adjustments
1207              where asset_id = px_asset_hdr_rec.asset_id
1208                and book_type_code = px_asset_hdr_rec.book_type_code
1209                and source_type_code = 'DEPRECIATION'
1210                and adjustment_type = 'EXPENSE';
1211 */
1212          end if;
1213          adj_row.adjustment_amount := l_expense_amount;
1214             if adj_row.adjustment_amount <> 0 then
1215 
1216              if (NOT FA_INS_ADJUST_PKG.faxinaj(adj_row,
1217                                        sysdate,
1218                                        fnd_global.user_id,
1219                                        fnd_global.login_id
1220                                        )) then
1221 
1222                  fa_srvr_msg.add_message(calling_fn => l_calling_fn);
1223                  return(FALSE);
1224                end if;
1225 
1226             end if;
1227       end if;
1228 
1229       -- load the adj structs
1230       if (l_sob_index = 0) then
1231 
1232          -- set the primary structs
1233          l_group_rcl_options_rec := p_group_reclass_options_rec;
1234 
1235          -- validate changes are being made and are valid
1236          /* Bug 6950629 -> Contract_id adjustment change */
1237 
1238          l_validate_flag := fa_adjustment_pvt.validate_adjustment
1239                 (p_inv_trans_rec           => px_inv_trans_rec,
1240                  p_trans_rec               => px_trans_rec,
1241                  p_asset_type_rec          => p_asset_type_rec,
1242                  p_asset_fin_rec_old       => l_asset_fin_rec_old,
1243                  p_asset_fin_rec_adj       => l_asset_fin_rec_adj,
1244                  p_asset_deprn_rec_old     => l_asset_deprn_rec_old,
1245                  p_asset_deprn_rec_adj     => l_asset_deprn_rec_adj);
1246 
1247          if (nvl(l_asset_fin_rec_old.contract_id, FND_API.G_MISS_NUM) <>
1248              nvl(p_asset_fin_rec_adj.contract_id,
1249              nvl(l_asset_fin_rec_old.contract_id, FND_API.G_MISS_NUM)) ) and
1250              not l_validate_flag then
1251 
1252                   l_contract_change_flag := TRUE;
1253                   l_asset_fin_rec_adj.contract_change_flag := TRUE;
1254 
1255          end if;
1256 
1257          if not l_contract_change_flag and not l_validate_flag then
1258                   raise adj_err;
1259          end if;
1260 
1261 
1262                   /* if not fa_adjustment_pvt.validate_adjustment
1263                 (p_inv_trans_rec           => px_inv_trans_rec,
1264                  p_trans_rec               => px_trans_rec,
1265                  p_asset_type_rec          => p_asset_type_rec,
1266                  p_asset_fin_rec_old       => l_asset_fin_rec_old,
1267                  p_asset_fin_rec_adj       => l_asset_fin_rec_adj,
1268                  p_asset_deprn_rec_old     => l_asset_deprn_rec_old,
1269                  p_asset_deprn_rec_adj     => l_asset_deprn_rec_adj,
1270                  p_log_level_rec     => p_log_level_rec) then
1271             raise adj_err;
1272          end if; */
1273         -- End of bug#6950629
1274 
1275 
1276          -- populate the trx_reference_id when group change occurs
1277 --         if (nvl(l_asset_fin_rec_old.group_asset_id, -99) <>
1278 --                     nvl(p_asset_fin_rec_adj.group_asset_id, -99)) then
1279          if (l_asset_fin_rec_old.group_asset_id is null and
1280              nvl(p_asset_fin_rec_adj.group_asset_id, FND_API.G_MISS_NUM) <> FND_API.G_MISS_NUM) or
1281             (l_asset_fin_rec_old.group_asset_id <> p_asset_fin_rec_adj.group_asset_id) then
1282             select fa_trx_references_s.nextval
1283               into px_trans_rec.trx_reference_id
1284               from dual;
1285          end if;
1286 
1287          -- BUG# 2877651
1288          -- if this is or was a amember asset, force amortized subtype
1289          if (px_trans_rec.transaction_subtype = 'EXPENSED' and
1290              (l_asset_fin_rec_old.group_asset_id is not null or
1291               nvl(p_asset_fin_rec_adj.group_asset_id, FND_API.G_MISS_NUM) <> FND_API.G_MISS_NUM)) then
1292             px_trans_rec.transaction_subtype      := 'AMORTIZED';
1293             px_trans_rec.amortization_start_date  := to_date(to_char(l_transaction_date,'DD/MM/YYYY'),'DD/MM/YYYY');
1294             px_trans_rec.transaction_date_entered := px_trans_rec.amortization_start_date;
1295          end if;
1296 
1297       else
1298 
1299          -- get the latest average rate (used conditionally in some cases below)
1300          if not fa_mc_util_pvt.get_latest_rate
1301                 (p_asset_id            => l_asset_hdr_rec.asset_id,
1302                  p_book_type_code      => l_asset_hdr_rec.book_type_code,
1303                  p_set_of_books_id     => l_asset_hdr_rec.set_of_books_id,
1304                  px_rate               => l_exchange_rate,
1305                  px_avg_exchange_rate  => l_avg_rate,
1306                  p_log_level_rec     => p_log_level_rec) then
1307             raise adj_err;
1308          end if;
1309 
1313          -- was involved, the amounts were already calculated and populated in the mrc
1310          -- process the reporting books by getting the rate and applying to the corp amount
1311          -- if the transaction was not originating from an invoice transaction.  In such a
1312          -- a case, we must get the exchange rate and convert the amounts.  If an invoice
1314          -- pl/sql tables and we just need to copy them into the local variables.
1315 
1316          if (px_inv_trans_rec.transaction_type is null or
1317              fa_cache_pkg.fazcbc_record.book_class = 'TAX') then
1318 
1319             -- Get the associated rate for the adjustment when the invoice table is
1320             -- not populated.  If this is a transaction being copied form corp to tax
1321             -- (masscp, cip-in-tax, autocopy), then we will always get the rate for
1322             -- the corp trx and use that -  unless the corp is not mrc enabled
1323 
1324             if ((px_trans_rec.source_transaction_header_id is not null) and
1325                 (fa_cache_pkg.fazcbc_record.book_class = 'TAX')) then
1326                 -- get the exchange rate from the corporate transaction
1327                if not FA_MC_UTIL_PVT.get_existing_rate
1328                      (p_set_of_books_id        => l_sob_tbl(l_sob_index),
1329                       p_transaction_header_id  => px_trans_rec.source_transaction_header_id,
1330                       px_rate                  => l_rate,
1331                       px_avg_exchange_rate     => l_avg_rate,
1332                       p_log_level_rec     => p_log_level_rec) then
1333 
1334                   -- no rate found for corp - reporting option may not exist on corp
1335                   -- get the current average rate for the adjustment
1336                   l_exchange_date    := px_trans_rec.transaction_date_entered;
1337 
1338                   if not FA_MC_UTIL_PVT.get_trx_rate
1339                             (p_prim_set_of_books_id       => fa_cache_pkg.fazcbc_record.set_of_books_id,
1340                              p_reporting_set_of_books_id  => l_sob_tbl(l_sob_index),
1341                              px_exchange_date             => l_exchange_date,
1342                              p_book_type_code             => px_asset_hdr_rec.book_type_code,
1343                              px_rate                      => l_rate,
1344                              p_log_level_rec     => p_log_level_rec)then
1345                      raise adj_err;
1346                   end if;
1347                end if;
1348 
1349             elsif (px_asset_hdr_rec.period_of_addition <> 'Y') then
1350 
1351                -- get the current average rate for the addition
1352                l_exchange_date    := px_trans_rec.transaction_date_entered;
1353 
1354                if not FA_MC_UTIL_PVT.get_trx_rate
1355                       (p_prim_set_of_books_id       => fa_cache_pkg.fazcbc_record.set_of_books_id,
1356                        p_reporting_set_of_books_id  => l_sob_tbl(l_sob_index),
1357                        px_exchange_date             => l_exchange_date,
1358                        p_book_type_code             => px_asset_hdr_rec.book_type_code,
1359                        px_rate                      => l_rate,
1360                        p_log_level_rec     => p_log_level_rec)then
1361                   raise adj_err;
1362                end if;
1363             else -- period of addition, set to existing rate
1364                l_rate := l_exchange_rate;
1365 
1366             end if;  -- copied trx from corp
1367 
1368             l_exchange_rate := l_rate;
1369 
1370             if (g_log_level_rec.statement_level) then
1371                fa_debug_pkg.add('do_all_books', 'l_exchange_rate', l_exchange_rate
1372                               ,p_log_level_rec => p_log_level_rec);
1373                fa_debug_pkg.add('do_all_books', 'l_asset_fin_rec_adj_init.cost', l_asset_fin_rec_adj_init.cost
1374                               ,p_log_level_rec => p_log_level_rec);
1375             end if;
1376 
1377             -- Set the initial mrc struct equal to the primary structs
1378             --
1379             -- Note: it may be better to actually modify our API's to return
1380             -- the new structs so that we can just due a direct copy and avoid
1381             -- most of the calculation logic for performance reasons.
1382 
1383             l_asset_fin_rec_adj       := l_asset_fin_rec_adj_init;
1384             l_asset_deprn_rec_adj     := l_asset_deprn_rec_adj_init;
1385             l_group_rcl_options_rec   := p_group_reclass_options_rec;
1386 
1387             -- set the SOB info
1388             l_asset_fin_rec_adj.set_of_books_id       := l_sob_tbl(l_sob_index);
1389             l_asset_deprn_rec_adj.set_of_books_id     := l_sob_tbl(l_sob_index);
1390 
1391             -- convert the non-derived financial amounts using the retrieved rate
1392             -- all other amounts will be handled by the calculation engines (rec cost, etc)
1393 
1394             -- BUG# 2966849
1395             -- when a manual cost adjustment to 0 is done, ignore
1396             -- daily rates and enforce reporting cost to 0 as well
1397             if (l_asset_fin_rec_adj_init.cost = -l_old_primary_cost and
1398                 l_old_primary_cost <> 0) then
1399                l_asset_fin_rec_adj.cost               := -l_asset_fin_rec_old.cost;
1400                l_asset_fin_rec_adj.unrevalued_cost    := -l_asset_fin_rec_old.unrevalued_cost;
1401                l_asset_fin_rec_adj.salvage_value      := -l_asset_fin_rec_old.salvage_value;
1402                l_asset_fin_rec_adj.original_cost      := l_asset_fin_rec_adj_init.original_cost   * l_rate;
1406                l_asset_fin_rec_adj.unrevalued_cost    := l_asset_fin_rec_adj_init.unrevalued_cost * l_rate;
1403                l_asset_fin_rec_adj.cip_cost           := l_asset_fin_rec_adj_init.cip_cost        * l_rate;
1404             else
1405                l_asset_fin_rec_adj.cost               := l_asset_fin_rec_adj_init.cost            * l_rate;
1407                l_asset_fin_rec_adj.salvage_value      := l_asset_fin_rec_adj_init.salvage_value   * l_rate;
1408                l_asset_fin_rec_adj.original_cost      := l_asset_fin_rec_adj_init.original_cost   * l_rate;
1409                l_asset_fin_rec_adj.cip_cost           := l_asset_fin_rec_adj_init.cip_cost        * l_rate;
1410             end if;
1411 
1412             l_group_rcl_options_rec.reserve_amount           := p_group_reclass_options_rec.reserve_amount           * l_rate;
1413             l_group_rcl_options_rec.source_exp_amount        := p_group_reclass_options_rec.source_exp_amount        * l_rate;
1414             l_group_rcl_options_rec.destination_exp_amount   := p_group_reclass_options_rec.destination_exp_amount   * l_rate;
1415             l_group_rcl_options_rec.source_eofy_reserve      := p_group_reclass_options_rec.source_eofy_reserve      * l_rate;
1416             l_group_rcl_options_rec.destination_eofy_reserve := p_group_reclass_options_rec.destination_eofy_reserve * l_rate;
1417 
1418             -- round the converted amounts using faxrnd
1419             -- note that precision here doesn't matter since the calculatation engine
1420             -- will take the finally amount and round with faxrnd (book and sob specific)
1421 
1422             -- round the amounts
1423             if not fa_utils_pkg.faxrnd
1424                          (x_amount => l_asset_fin_rec_adj.cost,
1425                           x_book   => px_asset_hdr_rec.book_type_code,
1426                           p_log_level_rec     => p_log_level_rec) then raise adj_err;
1427             end if;
1428 
1429             if not fa_utils_pkg.faxrnd
1430                          (x_amount => l_asset_fin_rec_adj.unrevalued_cost,
1431                           x_book   => px_asset_hdr_rec.book_type_code,
1432                           p_log_level_rec     => p_log_level_rec) then raise adj_err;
1433             end if;
1434 
1435             if not fa_utils_pkg.faxrnd
1436                          (x_amount => l_asset_fin_rec_adj.salvage_value,
1437                           x_book   => px_asset_hdr_rec.book_type_code,
1438                           p_log_level_rec     => p_log_level_rec) then raise adj_err;
1439             end if;
1440 
1441             if not fa_utils_pkg.faxrnd
1442                          (x_amount => l_asset_fin_rec_adj.original_cost,
1443                           x_book   => px_asset_hdr_rec.book_type_code,
1444                           p_log_level_rec     => p_log_level_rec) then raise adj_err;
1445             end if;
1446 
1447             if not fa_utils_pkg.faxrnd
1448                          (x_amount => l_asset_fin_rec_adj.cip_cost,
1449                           x_book   => px_asset_hdr_rec.book_type_code,
1450                           p_log_level_rec     => p_log_level_rec) then raise adj_err;
1451             end if;
1452 
1453 
1454             if not fa_utils_pkg.faxrnd
1455                          (x_amount => l_group_rcl_options_rec.reserve_amount,
1456                           x_book   => px_asset_hdr_rec.book_type_code,
1457                           p_log_level_rec     => p_log_level_rec) then raise adj_err;
1458             end if;
1459 
1460             if not fa_utils_pkg.faxrnd
1461                          (x_amount => l_group_rcl_options_rec.source_exp_amount,
1462                           x_book   => px_asset_hdr_rec.book_type_code,
1463                           p_log_level_rec     => p_log_level_rec) then raise adj_err;
1464             end if;
1465 
1466             if not fa_utils_pkg.faxrnd
1467                          (x_amount => l_group_rcl_options_rec.destination_exp_amount,
1468                           x_book   => px_asset_hdr_rec.book_type_code,
1469                           p_log_level_rec     => p_log_level_rec) then raise adj_err;
1470             end if;
1471 
1472             if not fa_utils_pkg.faxrnd
1473                          (x_amount => l_group_rcl_options_rec.source_eofy_reserve,
1474                           x_book   => px_asset_hdr_rec.book_type_code,
1475                           p_log_level_rec     => p_log_level_rec) then raise adj_err;
1476             end if;
1477 
1478             if not fa_utils_pkg.faxrnd
1479                          (x_amount => l_group_rcl_options_rec.destination_eofy_reserve,
1480                           x_book   => px_asset_hdr_rec.book_type_code,
1481                           p_log_level_rec     => p_log_level_rec) then raise adj_err;
1482             end if;
1483 
1484 
1485          else  -- invoice based trx, copy from the already populated mrc parameters
1486 
1487             if (g_log_level_rec.statement_level) then
1488                fa_debug_pkg.add('do_all_books', 'in', 'mrc logic for invoice'
1489                               ,p_log_level_rec => p_log_level_rec);
1490             end if;
1491 
1492             -- find the indexes for the SOB_ID being processed in this loop
1493 
1494             for i in 1..l_asset_fin_mrc_tbl_adj.count loop
1495                 if (l_asset_fin_mrc_tbl_adj(i).set_of_books_id = l_sob_tbl(l_sob_index)) then
1496                    l_index_fin := i;
1497                    exit;
1498                 end if;
1499             end loop;
1500 
1501             if (l_asset_deprn_mrc_tbl_adj.exists(1)) then
1502 
1506                end if;
1503                if (g_log_level_rec.statement_level) then
1504                   fa_debug_pkg.add('do_all_books', 'finding', 'mrc deprn rec'
1505                                     ,p_log_level_rec => p_log_level_rec);
1507 
1508                for i in 1..l_asset_deprn_mrc_tbl_adj.count loop
1509                    if (l_asset_deprn_mrc_tbl_adj(i).set_of_books_id = l_sob_tbl(l_sob_index)) then
1510                       l_index_dep := i;
1511                       exit;
1512                    end if;
1513                end loop;
1514 
1515             end if;
1516 
1517             if ((l_index_fin is null) or
1518                 (l_asset_deprn_mrc_tbl_adj.exists(1) and l_index_dep is null)) then
1519                raise adj_err;
1520             end if;
1521 
1522             l_asset_fin_rec_adj          := l_asset_fin_mrc_tbl_adj(l_index_fin);
1523             if (l_asset_deprn_mrc_tbl_adj.exists(1)) then
1524                l_asset_deprn_rec_adj     := l_asset_deprn_mrc_tbl_adj(l_index_dep);
1525             end if;
1526 
1527             if (g_log_level_rec.statement_level) then
1528                fa_debug_pkg.add('do_all_books', 'l_asset_deprn_rec_adj.deprn_reserve for mrc',
1529                                 l_asset_deprn_rec_adj.deprn_reserve ,p_log_level_rec => p_log_level_rec);
1530             end if;
1531 
1532             if (l_asset_fin_rec_adj_init.cost <> 0) then
1533                 l_exchange_rate := l_asset_fin_rec_adj.cost /
1534                                    l_asset_fin_rec_adj_init.cost;
1535             else
1536                 -- R12: replacing this with imbedded array
1537                 -- for i in 1..px_inv_rate_tbl.count loop
1538                 --     l_inv_rate_sum := l_inv_rate_sum +
1539                 --                       px_inv_rate_tbl(i).exchange_rate;
1540                 -- end loop;
1541 
1542                 l_rate_count  := 0;
1543 
1544                 for i in 1..px_inv_tbl.count loop
1545                    for l_inv_rate_index in 1..px_inv_tbl(i).inv_rate_tbl.count loop
1546                        l_rate_count   := l_rate_count + 1;
1547 
1548                        l_inv_rate_sum := l_inv_rate_sum +
1549                                           px_inv_tbl(i).inv_rate_tbl(l_inv_rate_index).exchange_rate;
1550                    end loop;
1551                 end loop;
1552 
1553                 -- Fix for Bug #2551273.  To avoid divide by zero error
1554                 -- only do this when the inv_rate_tbl has been populated,
1555                 -- otherwise, it will default to the previous exchange_rate
1556                 if (l_rate_count > 0) then
1557                    l_exchange_rate := l_inv_rate_sum / l_rate_count;
1558                 end if;
1559 
1560             end if;
1561 
1562          end if; --manual or invoice transaction
1563 
1564          -- in period of addition, we need to insure the proportion
1565          -- of reserve to cost is equal between primary and reporting
1566          if (l_asset_fin_rec_adj_init.cost <> 0) then
1567             l_deprn_ratio := l_asset_fin_rec_adj.cost /
1568                              l_asset_fin_rec_adj_init.cost;
1569          else
1570             l_deprn_ratio := l_exchange_rate;
1571          end if;
1572 
1573          if (g_log_level_rec.statement_level) then
1574             fa_debug_pkg.add('do_all_books', 'l_deprn_ratio', l_deprn_ratio ,p_log_level_rec => p_log_level_rec);
1575             fa_debug_pkg.add('do_all_books', 'l_asset_deprn_rec_adj_init.deprn_reserve',
1576                              l_asset_deprn_rec_adj_init.deprn_reserve ,p_log_level_rec => p_log_level_rec);
1577          end if;
1578 
1579          l_asset_deprn_rec_adj.deprn_reserve       := l_asset_deprn_rec_adj_init.deprn_reserve * l_deprn_ratio;
1580          l_asset_deprn_rec_adj.ytd_deprn           := l_asset_deprn_rec_adj_init.ytd_deprn * l_deprn_ratio;
1581          l_asset_deprn_rec_adj.bonus_deprn_reserve := l_asset_deprn_rec_adj_init.bonus_deprn_reserve * l_deprn_ratio;
1582          l_asset_deprn_rec_adj.bonus_ytd_deprn     := l_asset_deprn_rec_adj_init.bonus_ytd_deprn * l_deprn_ratio;
1583          l_asset_deprn_rec_adj.reval_deprn_reserve := l_asset_deprn_rec_adj_init.reval_deprn_reserve * l_deprn_ratio;
1584 
1585          l_group_rcl_options_rec.reserve_amount           := p_group_reclass_options_rec.reserve_amount           * l_deprn_ratio;
1586          l_group_rcl_options_rec.source_exp_amount        := p_group_reclass_options_rec.source_exp_amount        * l_deprn_ratio;
1587          l_group_rcl_options_rec.destination_exp_amount   := p_group_reclass_options_rec.destination_exp_amount   * l_deprn_ratio;
1588          l_group_rcl_options_rec.source_eofy_reserve      := p_group_reclass_options_rec.source_eofy_reserve      * l_deprn_ratio;
1589          l_group_rcl_options_rec.destination_eofy_reserve := p_group_reclass_options_rec.destination_eofy_reserve * l_deprn_ratio;
1590 
1591          -- round the amounts
1592          if not fa_utils_pkg.faxrnd
1593                       (x_amount => l_asset_deprn_rec_adj.deprn_reserve,
1594                        x_book   => px_asset_hdr_rec.book_type_code,
1595                        p_log_level_rec     => p_log_level_rec) then raise adj_err;
1596          end if;
1597 
1598          if not fa_utils_pkg.faxrnd
1599                       (x_amount => l_asset_deprn_rec_adj.ytd_deprn,
1600                        x_book   => px_asset_hdr_rec.book_type_code,
1601                        p_log_level_rec     => p_log_level_rec) then raise adj_err;
1602          end if;
1603 
1604          if not fa_utils_pkg.faxrnd
1605                       (x_amount => l_asset_deprn_rec_adj.bonus_deprn_reserve,
1609 
1606                        x_book   => px_asset_hdr_rec.book_type_code,
1607                        p_log_level_rec     => p_log_level_rec) then raise adj_err;
1608          end if;
1610          if not fa_utils_pkg.faxrnd
1611                       (x_amount => l_asset_deprn_rec_adj.bonus_ytd_deprn,
1612                        x_book   => px_asset_hdr_rec.book_type_code,
1613                        p_log_level_rec     => p_log_level_rec) then raise adj_err;
1614          end if;
1615 
1616          if not fa_utils_pkg.faxrnd
1617                       (x_amount => l_asset_deprn_rec_adj.reval_deprn_reserve,
1618                        x_book   => px_asset_hdr_rec.book_type_code,
1619                        p_log_level_rec     => p_log_level_rec) then raise adj_err;
1620          end if;
1621 
1622          if not fa_utils_pkg.faxrnd
1623                       (x_amount => l_group_rcl_options_rec.reserve_amount,
1624                        x_book   => px_asset_hdr_rec.book_type_code,
1625                        p_log_level_rec     => p_log_level_rec) then raise adj_err;
1626          end if;
1627 
1628          if not fa_utils_pkg.faxrnd
1629                       (x_amount => l_group_rcl_options_rec.source_exp_amount,
1630                        x_book   => px_asset_hdr_rec.book_type_code,
1631                        p_log_level_rec     => p_log_level_rec) then raise adj_err;
1632          end if;
1633 
1634          if not fa_utils_pkg.faxrnd
1635                       (x_amount => l_group_rcl_options_rec.destination_exp_amount,
1636                        x_book   => px_asset_hdr_rec.book_type_code,
1637                        p_log_level_rec     => p_log_level_rec) then raise adj_err;
1638          end if;
1639 
1640          if not fa_utils_pkg.faxrnd
1641                       (x_amount => l_group_rcl_options_rec.source_eofy_reserve,
1642                        x_book   => px_asset_hdr_rec.book_type_code,
1643                        p_log_level_rec     => p_log_level_rec) then raise adj_err;
1644          end if;
1645 
1646          if not fa_utils_pkg.faxrnd
1647                       (x_amount => l_group_rcl_options_rec.destination_eofy_reserve,
1648                        x_book   => px_asset_hdr_rec.book_type_code,
1649                        p_log_level_rec     => p_log_level_rec) then raise adj_err;
1650          end if;
1651 
1652       end if;  -- primary of reporting
1653 
1654       -- Fix for Bug #3499223
1655       -- For Polish, we need additional changes here, so we know if the
1656       -- transaction is an adjustment if deprn catchup is needed.
1657       -- First find out if we have a polish mechanism here
1658       if (p_asset_type_rec.asset_type <> 'GROUP') and
1659          (nvl(l_asset_fin_rec_new.deprn_method_code,
1660               l_asset_fin_rec_adj.deprn_method_code) is not null) and
1661          (fa_cache_pkg.fazccmt (
1662          X_method                => nvl(l_asset_fin_rec_new.deprn_method_code,
1663                                         l_asset_fin_rec_adj.deprn_method_code),
1664          X_life                  => nvl(l_asset_fin_rec_new.life_in_months,
1665                                         l_asset_fin_rec_adj.life_in_months),
1666          p_log_level_rec     => p_log_level_rec
1667       )) then
1668          if (fa_cache_pkg.fazccmt_record.deprn_basis_rule_id is not null) then
1669             if (fa_cache_pkg.fazcdbr_record.polish_rule in (
1670                      FA_STD_TYPES.FAD_DBR_POLISH_1,
1671                      FA_STD_TYPES.FAD_DBR_POLISH_2,
1672                      FA_STD_TYPES.FAD_DBR_POLISH_3,
1673                      FA_STD_TYPES.FAD_DBR_POLISH_4,
1674                      FA_STD_TYPES.FAD_DBR_POLISH_5
1675                      )) then
1676 
1677                  fa_polish_pvt.calling_mode := 'ADJUSTMENT';
1678                  fa_polish_pvt.amortization_start_date :=
1679                     px_trans_rec.amortization_start_date;
1680                  fa_polish_pvt.adjustment_amount := l_asset_fin_rec_adj.cost;
1681             end if;
1682          end if;
1683       end if;
1684 
1685       -- Japan Tax phase3 Start
1686       if (l_set_extend_flag) then
1687 
1688          if (p_log_level_rec.statement_level) then
1689             fa_debug_pkg.add(l_calling_fn, 'Japan Tax:1 Setting l_asset_fin_rec_adj values', 'TRUE...'
1690                              ,p_log_level_rec => p_log_level_rec);
1691          end if;
1692 
1693          l_asset_fin_rec_adj.deprn_method_code := 'JP-STL-EXTND'; -- New STL method with life 60 months
1694          l_asset_fin_rec_adj.life_in_months := 60;
1695          l_asset_fin_rec_adj.basic_rate := null;
1696          l_asset_fin_rec_adj.adjusted_rate := null;
1697          l_asset_fin_rec_adj.allowed_deprn_limit := null;
1698          l_asset_fin_rec_adj.deprn_limit_type := 'AMT';
1699          l_asset_fin_rec_adj.allowed_deprn_limit_amount := 1; -- Memorandum price
1700 
1701          px_trans_rec.transaction_key := 'ES';
1702 
1703       elsif (l_reset_extend_flag) then
1704 
1705          if (p_log_level_rec.statement_level) then
1706             fa_debug_pkg.add(l_calling_fn, 'Japan Tax:2 Resetting l_asset_fin_rec_adj values', 'TRUE...'
1707                              ,p_log_level_rec => p_log_level_rec);
1708          end if;
1709 
1710          open c_extend_get_original_deprn(l_asset_hdr_rec.asset_id, l_asset_hdr_rec.book_type_code);
1711          FETCH c_extend_get_original_deprn
1712          INTO  l_asset_fin_rec_adj.deprn_method_code,
1713                l_asset_fin_rec_adj.life_in_months,
1714                l_asset_fin_rec_adj.basic_rate,
1718                l_asset_fin_rec_adj.allowed_deprn_limit_amount;
1715                l_asset_fin_rec_adj.adjusted_rate,
1716                l_asset_fin_rec_adj.allowed_deprn_limit,
1717                l_asset_fin_rec_adj.deprn_limit_type,
1719          close c_extend_get_original_deprn;
1720          l_asset_fin_rec_adj.extended_depreciation_period := FND_API.G_MISS_NUM;
1721 
1722          px_trans_rec.transaction_key := 'ER';
1723       end if;
1724       -- Japan Tax phase3  end
1725 
1726       -- call the private API for primary or reporting using the local variables for sob related info
1727 
1728       --Bug7627286
1729       --Add the rolled back deprn amount to the adj rec
1730       if ((px_asset_hdr_rec.period_of_addition = 'Y')
1731            and ((nvl(l_asset_deprn_rec_adj.deprn_reserve,0) <> 0)
1732            or (nvl(l_asset_deprn_rec_adj.ytd_deprn,0) <> 0))) then
1733                  l_asset_deprn_rec_adj.deprn_reserve := l_asset_deprn_rec_adj.deprn_reserve + nvl(l_deprn_amount,0);
1734                  l_asset_deprn_rec_adj.ytd_deprn := l_asset_deprn_rec_adj.ytd_deprn + nvl(l_deprn_amount,0);
1735       end if;
1736 
1737       if (g_log_level_rec.statement_level) then
1738          fa_debug_pkg.add('do_all_books', 'l_asset_fin_rec_adj.cost', l_asset_fin_rec_adj.cost
1739                   ,p_log_level_rec => p_log_level_rec);
1740       end if;
1741 
1742       if not FA_ADJUSTMENT_PVT.do_adjustment
1743             (px_trans_rec              => px_trans_rec,
1744              px_asset_hdr_rec          => l_asset_hdr_rec ,           -- mrc
1745              p_asset_desc_rec          => p_asset_desc_rec ,
1746              p_asset_type_rec          => p_asset_type_rec ,
1747              p_asset_cat_rec           => p_asset_cat_rec ,
1748              p_asset_fin_rec_old       => l_asset_fin_rec_old,    -- mrc
1749              p_asset_fin_rec_adj       => l_asset_fin_rec_adj,    -- mrc
1750              x_asset_fin_rec_new       => l_asset_fin_rec_new,    -- mrc
1751              p_inv_trans_rec           => px_inv_trans_rec,
1752              p_asset_deprn_rec_old     => l_asset_deprn_rec_old,  -- mrc
1753              p_asset_deprn_rec_adj     => l_asset_deprn_rec_adj,  -- mrc
1754              x_asset_deprn_rec_new     => l_asset_deprn_rec_new,  -- mrc
1755              p_period_rec              => l_period_rec,
1756              p_mrc_sob_type_code       => l_reporting_flag,
1757              p_group_reclass_options_rec => l_group_rcl_options_rec,
1758              p_calling_fn              => l_calling_fn,
1759              p_log_level_rec => p_log_level_rec)then
1760             raise adj_err;
1761      end if;
1762 
1763      if (l_sob_index <> 0) then
1764          -- if there was a cost change rederive average rate, otherwise use the prior one
1765          -- which has been derived above
1766 
1767          if (l_new_primary_cost <> 0) then
1768             l_avg_rate      := l_asset_fin_rec_new.cost /
1769                                l_new_primary_cost;
1770          end if;
1771 
1772          -- insert the books_rates record
1773 
1774          MC_FA_UTILITIES_PKG.insert_books_rates
1775               (p_set_of_books_id              => l_asset_hdr_rec.set_of_books_id,
1776                p_asset_id                     => l_asset_hdr_rec.asset_id,
1777                p_book_type_code               => l_asset_hdr_rec.book_type_code,
1778                p_transaction_header_id        => px_trans_rec.transaction_header_id,
1779                p_invoice_transaction_id       => px_inv_trans_rec.invoice_transaction_id,
1780                p_exchange_date                => px_trans_rec.transaction_date_entered,
1781                p_cost                         => l_asset_fin_rec_adj_init.cost,
1782                p_exchange_rate                => l_exchange_rate,
1783                p_avg_exchange_rate            => l_avg_rate,
1784                p_last_updated_by              => px_trans_rec.who_info.last_updated_by,
1785                p_last_update_date             => px_trans_rec.who_info.last_update_date,
1786                p_last_update_login            => px_trans_rec.who_info.last_update_login,
1787                p_complete                     => 'Y',
1788                p_trigger                      => 'adj api',
1789                p_currency_code                => l_asset_hdr_rec.set_of_books_id,
1790                p_log_level_rec     => p_log_level_rec);
1791 
1792       else
1793         l_new_primary_cost := l_asset_fin_rec_new.cost;
1794       end if;
1795 
1796       if (g_log_level_rec.statement_level) then
1797          fa_debug_pkg.add('do_all_books', 'before', 'group logic'
1798                   ,p_log_level_rec => p_log_level_rec);
1799       end if;
1800 
1801 
1802       -- call the group api
1803       if (l_asset_fin_rec_old.group_asset_id is not null or
1804           l_asset_fin_rec_new.group_asset_id is not null) then
1805 
1806          if (g_log_level_rec.statement_level) then
1807             fa_debug_pkg.add('do_all_books', 'entering', 'group logic'
1808                         ,p_log_level_rec => p_log_level_rec);
1809          end if;
1810 
1811          if (l_sob_index = 0) then
1812 
1813             -- set up the group recs
1814 
1815             l_src_asset_hdr_rec          := px_asset_hdr_rec;
1816             l_dest_asset_hdr_rec         := px_asset_hdr_rec;
1817 
1818             l_src_asset_hdr_rec.asset_id  := l_asset_fin_rec_old.group_asset_id;
1819             l_dest_asset_hdr_rec.asset_id := l_asset_fin_rec_new.group_asset_id;
1820 
1821             -- get src info
1825                            (p_asset_hdr_rec         => l_src_asset_hdr_rec,
1822             if (l_asset_fin_rec_old.group_asset_id is not null) then
1823 
1824                if not FA_UTIL_PVT.get_asset_desc_rec
1826                             px_asset_desc_rec       => l_src_asset_desc_rec,
1827                             p_log_level_rec     => p_log_level_rec) then
1828                   raise adj_err;
1829                end if;
1830 
1831                if not FA_UTIL_PVT.get_asset_cat_rec
1832                            (p_asset_hdr_rec         => l_src_asset_hdr_rec,
1833                             px_asset_cat_rec        => l_src_asset_cat_rec,
1834                             p_date_effective        => null,
1835                             p_log_level_rec     => p_log_level_rec) then
1836                   raise adj_err;
1837                end if;
1838 
1839                if not FA_UTIL_PVT.get_asset_type_rec
1840                            (p_asset_hdr_rec         => l_src_asset_hdr_rec,
1841                             px_asset_type_rec       => l_src_asset_type_rec,
1842                             p_date_effective        => null,
1843                             p_log_level_rec     => p_log_level_rec) then
1844                   raise adj_err;
1845                end if;
1846 
1847                if not FA_ASSET_VAL_PVT.validate_period_of_addition
1848                            (p_asset_id            => l_src_asset_hdr_rec.asset_id,
1849                             p_book                => l_src_asset_hdr_rec.book_type_code,
1850                             p_mode                => 'ABSOLUTE',
1851                             px_period_of_addition => l_src_asset_hdr_rec.period_of_addition,
1852                             p_log_level_rec     => p_log_level_rec) then
1853                   raise adj_err;
1854                end if;
1855 
1856                -- call transaction approval for source asset (dest is done below)
1857                if not FA_TRX_APPROVAL_PKG.faxcat
1858                           (X_book              => l_src_asset_hdr_rec.book_type_code,
1859                            X_asset_id          => l_src_asset_hdr_rec.asset_id,
1860                            X_trx_type          => 'ADJUSTMENT',
1861                            X_trx_date          => px_trans_rec.transaction_date_entered,
1862                            X_init_message_flag => 'NO',
1863                            p_log_level_rec     => p_log_level_rec) then
1864                   raise adj_err;
1865                end if;
1866 
1867             end if;  -- old group asset id not null
1868 
1869             if (l_asset_fin_rec_new.group_asset_id is not null and
1870                 nvl(l_asset_fin_rec_old.group_asset_id, -99) <> l_asset_fin_rec_new.group_asset_id) then
1871 
1872                -- get dest info
1873                if not FA_UTIL_PVT.get_asset_desc_rec
1874                            (p_asset_hdr_rec         => l_dest_asset_hdr_rec,
1875                             px_asset_desc_rec       => l_dest_asset_desc_rec,
1876                             p_log_level_rec     => p_log_level_rec) then
1877                   raise adj_err;
1878                end if;
1879 
1880                if not FA_UTIL_PVT.get_asset_cat_rec
1881                            (p_asset_hdr_rec         => l_dest_asset_hdr_rec,
1882                             px_asset_cat_rec        => l_dest_asset_cat_rec,
1883                             p_date_effective        => null,
1884                             p_log_level_rec     => p_log_level_rec) then
1885                   raise adj_err;
1886                end if;
1887 
1888                if not FA_UTIL_PVT.get_asset_type_rec
1889                            (p_asset_hdr_rec         => l_dest_asset_hdr_rec,
1890                             px_asset_type_rec       => l_dest_asset_type_rec,
1891                             p_date_effective        => null,
1892                             p_log_level_rec     => p_log_level_rec) then
1893                   raise adj_err;
1894                end if;
1895 
1896                if not FA_ASSET_VAL_PVT.validate_period_of_addition
1897                            (p_asset_id            => l_dest_asset_hdr_rec.asset_id,
1898                             p_book                => l_dest_asset_hdr_rec.book_type_code,
1899                             p_mode                => 'ABSOLUTE',
1900                             px_period_of_addition => l_dest_asset_hdr_rec.period_of_addition,
1901                             p_log_level_rec     => p_log_level_rec) then
1902                   raise adj_err;
1903                end if;
1904 
1905             end if;  -- new group asset id not null
1906 
1907          end if;  -- primary book
1908 
1909 
1910          if (nvl(l_asset_fin_rec_old.group_asset_id, -99) = nvl(l_asset_fin_rec_new.group_asset_id, -99)) then
1911 --            nvl(l_asset_fin_rec_new.member_rollup_flag,'N') <> 'Y' then
1912 
1913             if (g_log_level_rec.statement_level) then
1914                fa_debug_pkg.add('do_all_books', 'entering', 'group adj logic'
1915                               ,p_log_level_rec => p_log_level_rec);
1916             end if;
1917 
1918             if (l_sob_index = 0) then
1919                l_src_trans_rec                              := px_trans_rec;
1920                l_src_trans_rec.transaction_type_code        := 'GROUP ADJUSTMENT';
1921                l_src_trans_rec.member_transaction_header_id := px_trans_rec.transaction_header_id;
1922                l_src_trans_rec.transaction_subtype          := 'AMORTIZED';
1926                   l_src_trans_rec.transaction_key              := 'MN';
1923                if (nvl(px_inv_trans_rec.transaction_type, 'X') = 'INVOICE DEP') then
1924                   l_src_trans_rec.transaction_key              := 'MD';
1925                elsif (nvl(px_inv_trans_rec.transaction_type, 'X') = 'INVOICE NO DEP') then
1927                else
1928                   l_src_trans_rec.transaction_key              := 'MJ';
1929                end if;
1930 
1931                if (NOT fa_trx_approval_pkg.faxcat
1932                            (X_book              => l_src_asset_hdr_rec.book_type_code,
1933                             X_asset_id          => l_src_asset_hdr_rec.asset_id,
1934                             X_trx_type          => l_src_trans_rec.transaction_type_code,
1935                             X_trx_date          => l_src_trans_rec.transaction_date_entered,
1936                             X_init_message_flag => 'NO',
1937                             p_log_level_rec     => p_log_level_rec)) then
1938                   raise adj_err;
1939                end if;
1940 
1941                select fa_transaction_headers_s.nextval
1942                  into l_src_trans_rec.transaction_header_id
1943                  from dual;
1944 
1945             end if;
1946 
1947 
1948             -- load the old structs
1949             if not FA_UTIL_PVT.get_asset_fin_rec
1950                     (p_asset_hdr_rec         => l_src_asset_hdr_rec,
1951                      px_asset_fin_rec        => l_src_asset_fin_rec_old,
1952                      p_transaction_header_id => NULL,
1953                      p_mrc_sob_type_code     => l_reporting_flag,
1954                      p_log_level_rec     => p_log_level_rec) then raise adj_err;
1955             end if;
1956 
1957             if not FA_UTIL_PVT.get_asset_deprn_rec
1958                     (p_asset_hdr_rec         => l_src_asset_hdr_rec ,
1959                      px_asset_deprn_rec      => l_src_asset_deprn_rec_old,
1960                      p_period_counter        => NULL,
1961                      p_mrc_sob_type_code     => l_reporting_flag,
1962                      p_log_level_rec     => p_log_level_rec) then raise adj_err;
1963             end if;
1964 
1965             if (g_log_level_rec.statement_level) then
1966                fa_debug_pkg.add('do_all_books', 'group adj: cip_cost', l_asset_fin_rec_adj.cip_cost
1967                                 ,p_log_level_rec => p_log_level_rec);
1968                fa_debug_pkg.add('do_all_books', 'group adj: cost', l_asset_fin_rec_adj.cost
1969                                  ,p_log_level_rec => p_log_level_rec);
1970             end if;
1971 
1972             -- copy the delta cost if any into the group's fin_rec
1973             if (p_asset_type_rec.asset_type = 'CIP') then
1974 
1975                if (fa_cache_pkg.fazcbc_record.allow_cip_dep_group_flag = 'Y') then
1976                   l_src_asset_fin_rec_adj.cip_cost := nvl(l_asset_fin_rec_adj.cip_cost, 0);
1977                   l_src_asset_fin_rec_adj.cost     := nvl(l_asset_fin_rec_adj.cost, 0) - nvl(l_asset_fin_rec_adj.cip_cost, 0);
1978                else
1979                   l_src_asset_fin_rec_adj.cip_cost := nvl(l_asset_fin_rec_adj.cost, 0);
1980                end if;
1981             else
1982                l_src_asset_fin_rec_adj.cost := l_asset_fin_rec_adj.cost;
1983                l_src_asset_fin_rec_adj.salvage_value := nvl(l_asset_fin_rec_new.salvage_value, 0) -
1984                                                         nvl(l_asset_fin_rec_old.salvage_value, 0);
1985                l_src_asset_fin_rec_adj.allowed_deprn_limit_amount :=
1986                                           nvl(l_asset_fin_rec_new.allowed_deprn_limit_amount, 0) -
1987                                           nvl(l_asset_fin_rec_old.allowed_deprn_limit_amount, 0);
1988             end if;
1989 
1990             if not FA_ADJUSTMENT_PVT.do_adjustment
1991                      (px_trans_rec              => l_src_trans_rec,
1992                       px_asset_hdr_rec          => l_src_asset_hdr_rec,
1993                       p_asset_desc_rec          => l_src_asset_desc_rec,
1994                       p_asset_type_rec          => l_src_asset_type_rec,
1995                       p_asset_cat_rec           => l_src_asset_cat_rec,
1996                       p_asset_fin_rec_old       => l_src_asset_fin_rec_old,
1997                       p_asset_fin_rec_adj       => l_src_asset_fin_rec_adj,
1998                       x_asset_fin_rec_new       => l_src_asset_fin_rec_new,
1999                       p_inv_trans_rec           => px_inv_trans_rec,
2000                       p_asset_deprn_rec_old     => l_src_asset_deprn_rec_old,
2001                       p_asset_deprn_rec_adj     => l_src_asset_deprn_rec_adj,
2002                       x_asset_deprn_rec_new     => l_src_asset_deprn_rec_new,
2003                       p_period_rec              => l_period_rec,
2004                       p_mrc_sob_type_code       => l_reporting_flag,
2005                       p_group_reclass_options_rec => l_group_rcl_options_rec,
2006                       p_calling_fn              => l_calling_fn,
2007                       p_log_level_rec => p_log_level_rec)then
2008                raise adj_err;
2009             end if;
2010 
2011 --         else  -- group reclass is occuring
2012            elsif (nvl(l_asset_fin_rec_old.group_asset_id, -99) <> nvl(l_asset_fin_rec_new.group_asset_id, -99)) then
2013 
2014             if (g_log_level_rec.statement_level) then
2015                fa_debug_pkg.add('do_all_books', 'entering', 'group reclass logic'
2016                               ,p_log_level_rec => p_log_level_rec);
2017             end if;
2018 
2019             if (l_sob_index = 0) then
2020                -- call transaction approval for destination asset (src was done above)
2021                if not FA_TRX_APPROVAL_PKG.faxcat
2022                        (X_book              => l_dest_asset_hdr_rec.book_type_code,
2023                         X_asset_id          => l_dest_asset_hdr_rec.asset_id,
2024                         X_trx_type          => 'ADJUSTMENT',
2025                         X_trx_date          => px_trans_rec.transaction_date_entered,
2026                         X_init_message_flag => 'NO',
2027                         p_log_level_rec     => p_log_level_rec) then
2028                   raise adj_err;
2029                end if;
2030 
2031                -- BUG# 3188779
2032                -- moving reclass overlap logic here from val_amort_start code
2033                -- Checking Max Reclass Date and restrict
2034                -- any transaction beyond the date.
2035                OPEN c_get_max_reclass_date(p_asset_id       => px_asset_hdr_rec.asset_id,
2036                                            p_book_type_code => px_asset_hdr_rec.book_type_code);
2037                FETCH c_get_max_reclass_date INTO l_max_reclass_date;
2038                CLOSE c_get_max_reclass_date;
2039 
2040                if (l_max_reclass_date is not null and
2041                    px_trans_rec.amortization_start_date < l_max_reclass_date) then
2042                   fa_srvr_msg.add_message(
2043                      calling_fn => l_calling_fn,
2044                      name       => 'FA_NO_TRX_BEFORE_RECLASS',
2048 
2045                      p_log_level_rec => p_log_level_rec);
2046                   raise adj_err;
2047                end if;
2049                OPEN c_get_overlapping_ret (p_asset_id       => px_asset_hdr_rec.asset_id,
2050                                            p_book_type_code => px_asset_hdr_rec.book_type_code);
2054                if (l_max_ret_date is not null and
2051                FETCH c_get_overlapping_ret INTO l_max_ret_date;
2052                CLOSE c_get_overlapping_ret;
2053 
2055                    px_trans_rec.amortization_start_date < l_max_ret_date) then
2056                   fa_srvr_msg.add_message(
2057                      calling_fn => l_calling_fn,
2058                      name       => 'FA_OTHER_TRX_FOLLOW'
2059                      ,p_log_level_rec => p_log_level_rec);
2060                   raise adj_err;
2061                end if;
2062 
2063                -- default the trx_type if needed
2064                if (l_group_rcl_options_rec.group_reclass_type is null) then
2065                   l_group_rcl_options_rec.group_reclass_type := 'CALC';
2066                end if;
2067 
2068                l_src_trans_rec.trx_reference_id  := px_trans_rec.trx_reference_id;
2069                l_dest_trans_rec.trx_reference_id := px_trans_rec.trx_reference_id;
2070 
2071             end if;
2072 
2073             if (g_log_level_rec.statement_level) then
2074                fa_debug_pkg.add('do_all_books', 'l_src_asset_cat',
2075                                  l_src_asset_cat_rec.category_id
2076                                 ,p_log_level_rec => p_log_level_rec);
2077                fa_debug_pkg.add('do_all_books', 'l_dest_asset_cat',
2078                                  l_dest_asset_cat_rec.category_id
2079                                  ,p_log_level_rec => p_log_level_rec);
2080             end if;
2081 
2082             -- need to reclass, call the wrapper
2083             if not fa_group_reclass2_pvt.do_group_reclass
2084                      (p_trans_rec               => px_trans_rec,
2085                       p_asset_hdr_rec           => px_asset_hdr_rec,
2086                       p_asset_desc_rec          => p_asset_desc_rec,
2087                       p_asset_type_rec          => p_asset_type_rec,
2088                       p_asset_cat_rec           => p_asset_cat_rec,
2092                       p_src_asset_type_rec      => l_src_asset_type_rec,
2089                       px_src_trans_rec          => l_src_trans_rec,
2090                       px_src_asset_hdr_rec      => l_src_asset_hdr_rec,
2091                       p_src_asset_desc_rec      => l_src_asset_desc_rec,
2093                       p_src_asset_cat_rec       => l_src_asset_cat_rec,
2094                       px_dest_trans_rec         => l_dest_trans_rec,
2095                       px_dest_asset_hdr_rec     => l_dest_asset_hdr_rec,
2096                       p_dest_asset_desc_rec     => l_dest_asset_desc_rec,
2097                       p_dest_asset_type_rec     => l_dest_asset_type_rec,
2098                       p_dest_asset_cat_rec      => l_dest_asset_cat_rec,
2099                       p_asset_fin_rec_old       => l_asset_fin_rec_old,
2100                       p_asset_fin_rec_adj       => l_asset_fin_rec_adj,
2101                       p_asset_fin_rec_new       => l_asset_fin_rec_new,
2102                       p_asset_deprn_rec_old     => l_asset_deprn_rec_old,
2103                       p_asset_deprn_rec_adj     => l_asset_deprn_rec_adj,
2104                       p_asset_deprn_rec_new     => l_asset_deprn_rec_new,
2105                       px_group_reclass_options_rec => l_group_rcl_options_rec,
2106                       p_period_rec              => l_period_rec,
2107                       p_mrc_sob_type_code       => l_reporting_flag,
2111             end if;  -- do_adjustment
2108                       p_calling_fn              => l_calling_fn,
2109                       p_log_level_rec => p_log_level_rec)then
2110                raise adj_err;
2112          end if;     -- end adjustment or group reclass
2113       end if;           -- group_asset_ids not null
2114 
2115       if (l_sob_index = 0) then
2116 
2117          -- set the primary structs
2118          -- no need anymore - using locals anyway
2119          -- Code hook for IAC
2120 
2121          if (FA_IGI_EXT_PKG.IAC_Enabled) then
2122             if not FA_IGI_EXT_PKG.Do_Adjustment(
2123                         p_trans_rec               => px_trans_rec,
2124                         p_asset_hdr_rec           => px_asset_hdr_rec,
2125                         p_asset_cat_rec           => p_asset_cat_rec,
2126                         p_asset_desc_rec          => p_asset_desc_rec,
2127                         p_asset_type_rec          => p_asset_type_rec,
2128                         p_asset_fin_rec           => l_asset_fin_rec_new,
2129                         p_asset_deprn_rec         => l_asset_deprn_rec_new,
2130                         p_calling_function        => l_calling_fn) then
2131                raise adj_err;
2132             end if;
2133          end if; -- (FA_IGI_EXT_PKG.IAC_Enabled)
2134 
2135          if cse_fa_integration_grp.is_oat_enabled then
2136             if not cse_fa_integration_grp.adjustment(
2137                          p_trans_rec          =>  px_trans_rec,
2138                          p_asset_hdr_rec      =>  px_asset_hdr_rec,
2139                          p_asset_fin_rec_adj  =>  l_asset_fin_rec_adj,
2140                          p_inv_tbl            =>  px_inv_tbl) then
2141                raise ADJ_ERR;
2142             end if;
2143          end if;
2144 
2145 
2146       end if;    -- primary book
2147 
2148    end loop;     -- sob loop
2149 
2150 
2151    -- Depreciation Override
2152    -- Bug #2688789
2153    --     removed thid from where clause.
2154    fa_std_types.deprn_override_trigger_enabled:= FALSE;
2155    UPDATE FA_DEPRN_OVERRIDE
2156       SET status = 'POSTED'
2157     WHERE used_by = 'ADJUSTMENT'
2158       AND status = 'SELECTED';
2159 --        transaction_header_id = px_trans_rec.transaction_header_id ;
2160    fa_std_types.deprn_override_trigger_enabled:= TRUE;
2161    -- End of Depreciation Override
2162 
2163 
2164    -- reset the gl sob info back to the primary book so fazcbc cache is ok
2165    fnd_profile.put('GL_SET_OF_BKS_ID', px_asset_hdr_rec.set_of_books_id);
2166    fnd_client_info.set_currency_context (px_asset_hdr_rec.set_of_books_id);
2167 
2168    return true;
2169 
2170 EXCEPTION
2171 
2172    WHEN ADJ_ERR THEN
2173       fa_srvr_msg.add_message(calling_fn => l_calling_fn
2174             ,p_log_level_rec => p_log_level_rec);
2175       return FALSE;
2176 
2177    WHEN OTHERS THEN
2178       fa_srvr_msg.add_sql_error(calling_fn => l_calling_fn
2179             ,p_log_level_rec => p_log_level_rec);
2180       return FALSE;
2181 
2182 END do_all_books;
2183 
2184 -----------------------------------------------------------------------------
2185 
2186 END FA_ADJUSTMENT_PUB;