DBA Data[Home] [Help]

PACKAGE BODY: APPS.FA_ADJUSTMENT_PUB

Source


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