[Home] [Help]
PACKAGE BODY: APPS.FA_GAINLOSS_DPR_PKG
Source
1 PACKAGE BODY FA_GAINLOSS_DPR_PKG AS
2 /* $Header: fagdprb.pls 120.19.12020000.3 2013/01/24 13:34:30 mswetha ship $*/
3
4 -- +++++ Global Varialbes +++++
5
6 FUNCTION fagcrsv(dpr fa_STD_TYPES.dpr_struct,
7 d_cal varchar2,
8 p_cal varchar2,
9 x_last_period out nocopy boolean, p_log_level_rec IN FA_API_TYPES.log_level_rec_type) return boolean is
10
11 l_pds_in_last_yr integer;
12 l_lst_pd_ctr integer;
13 l_y_dp_begin integer;
14 l_rate_pers_per_yr integer;
15 l_pers_per_yr number;
16 l_lst_fy integer; -- last fiscal year
17 l_lst_per integer; -- last period of life
18 l_prorate integer;
19 dummynum number;
20 l_count number;
21 l_fy_name varchar2(30); -- Bug 5179236
22 l_cur_pdctr number;
23
24 fagcrsv_err exception;
25
26 begin
27
28 x_last_period := FALSE;
29 l_cur_pdctr := fa_cache_pkg.fazcdp_record.period_counter;
30
31 l_fy_name := fa_cache_pkg.fazcbc_record.fiscal_year_name;
32 if not fa_cache_pkg.fazccp (p_cal, l_fy_name,
33 dpr.prorate_jdate, l_prorate, l_y_dp_begin, dummynum, p_log_level_rec => p_log_level_rec) then
34 return (FALSE);
35 end if;
36
37 if not fa_cache_pkg.fazcct (d_cal, p_log_level_rec => p_log_level_rec) then
38 return (FALSE);
39 end if;
40 l_pers_per_yr := fa_cache_pkg.fazcct_record.NUMBER_PER_FISCAL_YEAR;
41
42 if not fa_cache_pkg.fazcct (p_cal, p_log_level_rec => p_log_level_rec) then
43 return (FALSE);
44 end if;
45 l_rate_pers_per_yr := fa_cache_pkg.fazcct_record.NUMBER_PER_FISCAL_YEAR;
46
47 l_lst_per := l_prorate - 2 +
48 mod(floor(dpr.life * l_rate_pers_per_yr/12),l_rate_pers_per_yr) +1 ;
49
50 l_lst_fy := (l_y_dp_begin + floor ((dpr.life - 1) / 12));
51
52 if l_lst_per < l_prorate then
53 l_lst_fy := l_lst_fy + 1;
54 end if;
55
56 l_pds_in_last_yr :=
57 ceil ( l_pers_per_yr * l_lst_per / l_rate_pers_per_yr );
58 l_lst_pd_ctr := l_lst_fy * l_pers_per_yr + l_pds_in_last_yr;
59
60 if l_lst_pd_ctr = l_cur_pdctr then
61 x_last_period := TRUE;
62 end if;
63
64 return TRUE;
65
66 exception
67 when fagcrsv_err then
68 fa_srvr_msg.add_message(
69 calling_fn => 'fa_gainloss_dpr_pkg.fagcrsv', p_log_level_rec => p_log_level_rec);
70 return(FALSE);
71 end;
72
73
74
75 /*============================================================================
76 | NAME fagcdp |
77 | |
78 | FUNCTION Calculates depreciation needed given a range of period |
79 | |
80 | RETURN VALUES - deprn_rate_ptr : Depreciation taken per period |
81 | |
82 | HISTORY 1/12/89 R Rumanang Created |
83 | 6/23/89 R RUmanang Standarized |
84 | 5/1/90 R Rumanang Fill in dpr->calendar_type |
85 | 04/12/91 M Chan Modified for MPL 9 |
86 | 01/04/97 S Behura Rewrote in PL/SQL |
87 | 08/10/97 S Behura Rewrote in PL/SQL (10.7) |
88 |============================================================================*/
89
90 FUNCTION fagcdp (dpr in out nocopy fa_std_types.dpr_struct,
91 deprn_amt in out nocopy number,
92 bonus_deprn_amt in out nocopy number,
93 impairment_amt in out nocopy number,
94 reval_deprn_amt in out nocopy number,
95 reval_amort in out nocopy number,
96 deprn_start_date in out nocopy date, d_cal in out nocopy varchar2,
97 p_cal in out nocopy varchar2, v_start number, v_end number,
98 prorate_fy number, dsd_fy number, prorate_jdate number,
99 deprn_start_jdate number,
100 retirement_id number default null, p_log_level_rec IN FA_API_TYPES.log_level_rec_type) RETURN BOOLEAN IS
101
102 fagcdp_err exception;
103
104 dummy fa_std_types.dpr_arr_type;
105 dpr_out fa_std_types.dpr_out_struct;
106 l_last_period boolean;
107
108 -- Added for bug 5954528
109 l_life_end_date date;
110 l_pcal_life_end_date date;
111 l_pcal_ret_end_date date;
112 l_pers_per_yr number;
113 -- End bug fix 5954528
114 --Bug5887343
115 l_transaction_header_id_in number;
116 l_transaction_header_id_out number;
117
118 Cursor c_get_trxn_id is
119 select transaction_header_id_in,transaction_header_id_out
120 from fa_retirements
121 where book_type_code=dpr.book
122 and asset_id=dpr.asset_id
123 and retirement_id=retirement_id;
124
125 l_rate_change_flag varchar2(1);
126
127 Cursor c_rate_change_flag is
128 select 'Y'
129 from fa_books fbks1,
130 fa_books fbks2
131 where fbks1.book_type_code = dpr.book
132 and fbks1.asset_id = dpr.asset_id
133 and fbks2.book_type_code = fbks1.book_type_code
134 and fbks2.asset_id = fbks2.asset_id
135 and fbks1.transaction_header_id_in between l_transaction_header_id_in and nvl(l_transaction_header_id_out,l_transaction_header_id_in)
136 and fbks2.transaction_header_id_in between l_transaction_header_id_in and nvl(l_transaction_header_id_out,l_transaction_header_id_in)
137 and fbks2.transaction_header_id_in = fbks1.transaction_header_id_out
138 -- Bug 6983060: For Jp-250DB methods rate_in_use should be used
139 -- and fbks2.adjusted_rate <> fbks1.adjusted_rate ;
140 and nvl(fbks2.adjusted_rate, nvl(fbks2.rate_in_use, -999)) <>
141 nvl(fbks1.adjusted_rate, nvl(fbks1.rate_in_use, -999)) ;
142
143 l_adjusted_rate1 number;
144 l_adjusted_rate2 number;
145 l_deprn_method_code1 varchar2(48);
146 l_transaction_id1 number;
147 l_transaction_id2 number;
148 l_deprn_method_code2 varchar2(48);
149
150 -- Bug 6983060 :
151 l_life_in_months1 number;
152 l_life_in_months2 number;
153 Cursor c_rate_details is
154 select fbks1.adjusted_rate,fbks1.transaction_header_id_in,fbks1.deprn_method_code,
155 fbks2.adjusted_rate,fbks2.transaction_header_id_in,fbks2.deprn_method_code,
156 fbks1.life_in_months, fbks2.life_in_months -- Bug 6983060: Fetch life also
157 from fa_books fbks1,
158 fa_books fbks2
159 where fbks1.book_type_code=dpr.book
160 and fbks1.asset_id=dpr.asset_id
161 and fbks2.book_type_code =fbks1.book_type_code
162 and fbks2.asset_id =fbks2.asset_id
163 and fbks1.transaction_header_id_in between l_transaction_header_id_in and l_transaction_header_id_out
164 and fbks2.transaction_header_id_in between l_transaction_header_id_in and l_transaction_header_id_out
165 and fbks2.transaction_header_id_in = fbks1.transaction_header_id_out
166 -- Bug 6983060: For Jp-250DB methods rate_in_use should be used
167 -- and fbks2.adjusted_rate <> fbks1.adjusted_rate;
168 and nvl(fbks2.adjusted_rate, nvl(fbks2.rate_in_use, -999)) <>
169 nvl(fbks1.adjusted_rate, nvl(fbks1.rate_in_use, -999)) ;
170
171
172
173 l_prd_num number;
174 l_count number;
175 l_end_prd_num number;
176
177 Cursor c_get_period_details(x_transaction_id number) is
178 select fdp.period_num
179 from fa_transaction_headers fth,
180 fa_deprn_periods fdp
181 where fth.transaction_header_id= x_transaction_id
182 and fdp.book_type_code = dpr.book
183 and fth.transaction_date_entered
184 between fdp.calendar_period_open_date and nvl(fdp.calendar_period_close_date,sysdate);
185 BEGIN <<FAGCDP>>
186
187 dpr.deprn_start_jdate := deprn_start_jdate;
188
189 if (prorate_fy <> dsd_fy) then
190 dpr.deprn_start_jdate := prorate_jdate;
191 end if;
192
193 if v_start = 0 then -- If start is zero, calculate the whole deprn
194 dpr.p_cl_begin := 1;
195 /* It is O.K. to assign 1 to dpr->p_cl_begin, because the deprn
196 engine is smart enough to skip over periods before the deprn
197 start period */
198 else
199 dpr.p_cl_begin := v_start;
200 end if;
201
202 dpr.p_cl_end := v_end;
203 --Bug5887343
204 --Added the following code
205 if not fa_cache_pkg.fazcct (d_cal, p_log_level_rec => p_log_level_rec) then
206 return (FALSE);
207 end if;
208
209 IF retirement_id is null then
210 if not FA_CDE_PKG.faxcde(dpr,
211 dummy,
212 dpr_out,
213 fa_std_types.FA_DPR_NORMAL,
214 p_log_level_rec => p_log_level_rec) then
215
216 fa_srvr_msg.add_message(
217 calling_fn => 'fa_gainloss_dpr_pkg.fagcdp',
218 name => 'FA_RET_DEPRN_ERROR',
219 token1 => 'MODULE',
220 value1 => 'FAXCDE', p_log_level_rec => p_log_level_rec);
221
222 raise fagcdp_err;
223 end if;
224
225 deprn_amt := dpr_out.deprn_exp;
226 bonus_deprn_amt := dpr_out.bonus_deprn_exp;
227 impairment_amt := dpr_out.impairment_exp;
228 reval_deprn_amt := dpr_out.reval_exp;
229 reval_amort := dpr_out.reval_amo;
230
231 else
232
233 open c_get_trxn_id;
234 fetch c_get_trxn_id into l_transaction_header_id_in,l_transaction_header_id_out;
235
236 open c_rate_change_flag;
237 fetch c_rate_change_flag into l_rate_change_flag;
238 if c_rate_change_flag%NOTFOUND then
239 l_rate_change_flag := 'N';
240 end if;
241 close c_rate_change_flag;
242
243 if l_rate_change_flag = 'N' then
244 if not FA_CDE_PKG.faxcde(dpr, dummy, dpr_out,
245 fa_std_types.FA_DPR_NORMAL, p_log_level_rec => p_log_level_rec) then
246
247 fa_srvr_msg.add_message(
248 calling_fn => 'fa_gainloss_dpr_pkg.fagcdp',
249 name => 'FA_RET_DEPRN_ERROR',
250 token1 => 'MODULE',
251 value1 => 'FAXCDE', p_log_level_rec => p_log_level_rec);
252
253 raise fagcdp_err;
254 end if;
255
256 deprn_amt := dpr_out.deprn_exp;
257 bonus_deprn_amt := dpr_out.bonus_deprn_exp;
258 impairment_amt := dpr_out.impairment_exp;
259 reval_deprn_amt := dpr_out.reval_exp;
260 reval_amort := dpr_out.reval_amo;
261
262 else
263
264 l_end_prd_num := dpr.p_cl_end;
265 open c_rate_details;
266 l_count := 1;
267
268 loop
269 fetch c_rate_details
270 into l_adjusted_rate1,
271 l_transaction_id1,
272 l_deprn_method_code1,
273 l_adjusted_rate2,
274 l_transaction_id2,
275 l_deprn_method_code2,
276 l_life_in_months1, -- Bug 6983060
277 l_life_in_months2; -- Bug 6983060
278 exit when c_rate_details%NOTFOUND;
279
280 open c_get_period_details(l_transaction_id2);
281 fetch c_get_period_details into l_prd_num;
282
283 if l_count > 1 then
284 dpr.p_cl_begin := dpr.p_cl_end + 1;
285 dpr.p_cl_end := l_prd_num - 1;
286
287 else
288 dpr.p_cl_end := l_prd_num - 1;
289 end if;
290
291 dpr.adj_rate := l_adjusted_rate1;
292 dpr.method_code := l_deprn_method_code1;
293
294 -- Bug 6983060 : Populate Life also for JP-250 DB method
295 dpr.life := l_life_in_months1;
296
297 if not FA_CDE_PKG.faxcde(dpr, dummy, dpr_out,
298 fa_std_types.FA_DPR_NORMAL, p_log_level_rec => p_log_level_rec) then
299
300 fa_srvr_msg.add_message(
301 calling_fn => 'fa_gainloss_dpr_pkg.fagcdp',
302 name => 'FA_RET_DEPRN_ERROR',
303 token1 => 'MODULE',
304 value1 => 'FAXCDE', p_log_level_rec => p_log_level_rec);
305
306 raise fagcdp_err;
307 end if;
308
309 deprn_amt := nvl(deprn_amt,0) + dpr_out.deprn_exp;
310 bonus_deprn_amt := nvl(bonus_deprn_amt,0) + dpr_out.bonus_deprn_exp;
311 impairment_amt := nvl(impairment_amt,0) + dpr_out.impairment_exp;
312 reval_deprn_amt := nvl(reval_deprn_amt,0) + dpr_out.reval_exp;
313 reval_amort := nvl(reval_amort,0) + dpr_out.reval_amo;
314
315 close c_get_period_details;
316 l_count := l_count +1;
317 end loop;
318
319 close c_rate_details;
320
321 dpr.p_cl_begin := dpr.p_cl_end + 1;
322 dpr.p_cl_end := l_end_prd_num;
323 dpr.adj_rate := l_adjusted_rate2;
324 dpr.method_code := l_deprn_method_code2;
325 -- Bug 6983060 : Populate Life also for JP-250 DB method
326 dpr.life := l_life_in_months2;
327
328 if not FA_CDE_PKG.faxcde(dpr, dummy, dpr_out,
329 fa_std_types.FA_DPR_NORMAL, p_log_level_rec => p_log_level_rec) then
330
331 fa_srvr_msg.add_message(
332 calling_fn => 'fa_gainloss_dpr_pkg.fagcdp',
333 name => 'FA_RET_DEPRN_ERROR',
334 token1 => 'MODULE',
335 value1 => 'FAXCDE', p_log_level_rec => p_log_level_rec);
336
337 raise fagcdp_err;
338 end if;
339
340 deprn_amt := deprn_amt + dpr_out.deprn_exp;
341 bonus_deprn_amt := bonus_deprn_amt + dpr_out.bonus_deprn_exp;
342 impairment_amt := impairment_amt + dpr_out.impairment_exp;
343 reval_deprn_amt := reval_deprn_amt + dpr_out.reval_exp;
344 reval_amort := reval_amort + dpr_out.reval_amo;
345 end if;
346 close c_get_trxn_id;
347 end if;
348 --Bug5887343 ends
349
350 if not fa_cache_pkg.fazccmt
351 (X_method => dpr.method_code,
352 X_life => dpr.life,
353 p_log_level_rec => p_log_level_rec) then
354 raise fagcdp_err;
355 end if;
356
357 /* Bug#16058843: Need not call last period logic if asset is not fully rsvd */
358 if (fa_cache_pkg.fazccmt_record.rate_source_rule = 'CALCULATED') and (dpr_out.full_rsv_flag) then
359 if not fagcrsv(dpr => dpr,
360 d_cal => d_cal,
361 p_cal => p_cal,
362 x_last_period => l_last_period,
363 p_log_level_rec => p_log_level_rec) then
364 raise fagcdp_err;
365 end if;
366
367 -- Bug fix 5954528 (Added code to determine whether retirement is performed in last period
368 -- of asset's life as per prorate calendar or not and accordingly calculated deprn_amt for daily prorate calendar)
369
370 -- Bug 14773574, we calculate last period of assets life by different method
371 -- so no need to include extended assets here
372 if l_last_period and dpr.method_code <> 'JP-STL-EXTND' then
373
374 if not fa_cache_pkg.fazcct (p_cal, p_log_level_rec => p_log_level_rec) then
375 return (FALSE);
376 end if;
377
378 l_pers_per_yr := fa_cache_pkg.fazcct_record.NUMBER_PER_FISCAL_YEAR;
379
380 if (p_log_level_rec.statement_level) then
381 fa_debug_pkg.add ('FAGDCP', 'l_pers_per_yr', l_pers_per_yr, p_log_level_rec => p_log_level_rec);
382 end if;
383
384 if l_pers_per_yr <> 365 then
385 deprn_amt := dpr.adj_rec_cost - dpr.deprn_rsv;
386 else
387
388 if (p_log_level_rec.statement_level) then
389 fa_debug_pkg.add ('FAGDCP', 'deprn_amt', deprn_amt, p_log_level_rec => p_log_level_rec);
390 fa_debug_pkg.add ('FAGDCP', 'dpr.prorate_date', dpr.prorate_date, p_log_level_rec => p_log_level_rec);
391 fa_debug_pkg.add ('FAGDCP', 'dpr.ret_prorate_jdate', dpr.ret_prorate_jdate, p_log_level_rec => p_log_level_rec);
392 end if;
393
394 l_life_end_date := add_months(dpr.prorate_date,dpr.life);
395
396 select end_date
397 into l_pcal_life_end_date
398 from fa_calendar_periods
399 where calendar_type = p_cal
400 and l_life_end_date between start_date and end_date;
401
402 select end_date
403 into l_pcal_ret_end_date
404 from fa_calendar_periods
405 where calendar_type = p_cal
406 and to_date(dpr.ret_prorate_jdate,'j') between start_date and end_date;
407
408 if (l_pcal_life_end_date <= l_pcal_ret_end_date) then
409 deprn_amt := dpr.adj_rec_cost - dpr.deprn_rsv;
410 end if; -- if (l_pcal_life_end_date <= l_pcal_ret_end_date) then
411
412 if (p_log_level_rec.statement_level) then
413 fa_debug_pkg.add ('FAGDCP', 'l_life_end_date', l_life_end_date, p_log_level_rec => p_log_level_rec);
414 fa_debug_pkg.add ('FAGDCP', 'l_pcal_life_end_date', l_pcal_life_end_date, p_log_level_rec => p_log_level_rec);
415 fa_debug_pkg.add ('FAGDCP', 'l_pcal_ret_end_date', l_pcal_ret_end_date, p_log_level_rec => p_log_level_rec);
416 fa_debug_pkg.add ('FAGDCP', 'deprn_amt', deprn_amt, p_log_level_rec => p_log_level_rec);
417 end if;
418
419 end if; -- if p_pers_per_yr <> 365 then
420
421 end if; -- if l_last_period then
422 -- End of bug fix 5954528
423
424 end if;
425
426 if (p_log_level_rec.statement_level) then
427 fa_debug_pkg.add ('FAGDCP', 'final deprn_amt', deprn_amt, p_log_level_rec => p_log_level_rec);
428 end if;
429
430
431
432 return(TRUE);
433
434 EXCEPTION
435
436 when fagcdp_err then
437
438 fa_srvr_msg.add_message(
439 calling_fn => 'fa_gainloss_dpr_pkg.fagcdp', p_log_level_rec => p_log_level_rec);
440
441 return(FALSE);
442
443 END FAGCDP;
444
445 /*============================================================================
446 | NAME CALC_CATCHUP |
447 | |
448 | FUNCTION Calculates depreciation needed given a range of period |
449 | |
450 | |
451 |============================================================================*/
452 FUNCTION CALC_CATCHUP(
453 ret FA_RET_TYPES.RET_STRUCT,
454 BK FA_RET_TYPES.BOOK_STRUCT,
455 DPR FA_STD_TYPES.DPR_STRUCT,
456 calc_catchup BOOLEAN,
457 x_deprn_exp OUT NOCOPY NUMBER,
458 x_bonus_deprn_exp OUT NOCOPY NUMBER,
459 x_impairment_exp OUT NOCOPY NUMBER,
460 x_asset_fin_rec_new OUT NOCOPY FA_API_TYPES.asset_fin_rec_type,
461 p_log_level_rec IN FA_API_TYPES.log_level_rec_type) RETURN BOOLEAN IS
462
463 l_calling_fn VARCHAR2(50) := 'FA_GAINLOSS_DPR_PKG.CALC_CATCHUP';
464
465
466 CURSOR c_get_rein_thid IS
467 select nvl(transaction_header_id_out, transaction_header_id_in) -- Bug# 5074257
468 from fa_retirements
469 where retirement_id = ret.retirement_id;
470
471 CURSOR c_get_trans_rec(c_thid number) IS
472 select transaction_type_code
473 , transaction_date_entered
474 , transaction_name
475 , source_transaction_header_id
476 , mass_reference_id
477 , transaction_subtype
478 , transaction_key
479 , amortization_start_date
480 , calling_interface
481 , mass_transaction_id
482 , fa_std_types.FA_NO_OVERRIDE
483 , member_transaction_header_id
484 , trx_reference_id
485 from fa_transaction_headers
486 where transaction_header_id = c_thid;
487
488 CURSOR c_get_ret_amounts IS
489 select outbk.salvage_value - inbk.salvage_value
490 , nvl(outbk.allowed_deprn_limit_amount, 0) -
491 nvl(inbk.allowed_deprn_limit_amount, 0),
492 outbk.unrevalued_cost - inbk.unrevalued_cost
493 from fa_books inbk
494 , fa_books outbk
495 where inbk.transaction_header_id_in = ret.th_id_in
496 and outbk.asset_id = ret.asset_id
497 and outbk.book_type_code = ret.book
498 and outbk.transaction_header_id_out = ret.th_id_in;
499
500 CURSOR c_get_ret_amounts_mrc IS
501 select outbk.salvage_value - inbk.salvage_value
502 , nvl(outbk.allowed_deprn_limit_amount, 0) -
503 nvl(inbk.allowed_deprn_limit_amount, 0),
504 outbk.unrevalued_cost - inbk.unrevalued_cost
505 from fa_mc_books inbk
506 , fa_mc_books outbk
507 where inbk.transaction_header_id_in = ret.th_id_in
508 and inbk.set_of_books_id = ret.set_of_books_id
509 and outbk.set_of_books_id = ret.set_of_books_id
510 and outbk.asset_id = ret.asset_id
511 and outbk.book_type_code = ret.book
512 and outbk.transaction_header_id_out = ret.th_id_in;
513
514 CURSOR c_get_rsv_ret IS
515 select sum(decode(debit_credit_flag, 'CR', -1, 1) * adjustment_amount)
516 from fa_adjustments
517 where asset_id = ret.asset_id
518 and book_type_code = ret.book
519 and source_type_code = 'RETIREMENT'
520 and adjustment_type = 'RESERVE'
521 and transaction_header_id = ret.th_id_in;
522
523 CURSOR c_get_rsv_ret_mrc IS
524 select sum(decode(debit_credit_flag, 'CR', -1, 1) * adjustment_amount)
525 from fa_mc_adjustments
526 where asset_id = ret.asset_id
527 and book_type_code = ret.book
528 and source_type_code = 'RETIREMENT'
529 and adjustment_type = 'RESERVE'
530 and set_of_books_id = ret.set_of_books_id
531 and transaction_header_id = ret.th_id_in;
532
533 -- Bug 5381824 Cursor to get the prorated transaction
534 -- date based on retirement prorate convention
535 CURSOR c_get_retire_prorate (c_thid number,
536 c_trx_date date ) IS
537 select con.prorate_date
538 from fa_retirements ret,
539 fa_conventions con
540 where ret.transaction_header_id_in = c_thid
541 and con.prorate_convention_code = ret.RETIREMENT_PRORATE_CONVENTION
542 and c_trx_date between con.start_date and con.end_date ;
543
544 CURSOR c_mc_get_retire_prorate (c_thid number,
545 c_trx_date date ) IS
546 select con.prorate_date
547 from fa_mc_retirements ret,
548 fa_conventions con
549 where ret.transaction_header_id_in = c_thid
550 and con.prorate_convention_code = ret.RETIREMENT_PRORATE_CONVENTION
551 and set_of_books_id = ret.set_of_books_id
552 and c_trx_date between con.start_date and con.end_date ;
553
554 -- Bug 5381824 end
555
556 l_asset_hdr_rec FA_API_TYPES.asset_hdr_rec_type;
557 l_asset_desc_rec FA_API_TYPES.asset_desc_rec_type;
558 l_asset_cat_rec FA_API_TYPES.asset_cat_rec_type;
559 l_asset_type_rec FA_API_TYPES.asset_type_rec_type;
560
561 l_trans_rec FA_API_TYPES.trans_rec_type;
562 l_asset_fin_rec_old FA_API_TYPES.asset_fin_rec_type;
563 l_asset_fin_rec_adj FA_API_TYPES.asset_fin_rec_type;
564 l_asset_deprn_rec FA_API_TYPES.asset_deprn_rec_type;
565 l_asset_deprn_rec_adj FA_API_TYPES.asset_deprn_rec_type;
566 l_period_rec FA_API_TYPES.period_rec_type;
567
568 l_mrc_sob_type_code VARCHAR2(1);
569
570 l_salvage_value NUMBER;
571 l_deprn_limit_amount NUMBER;
572 l_reserve_retired NUMBER := 0;
573
574 l_running_mode NUMBER := fa_std_types.FA_DPR_CATCHUP;
575
576 calc_err EXCEPTION;
577 BEGIN
578
579 l_asset_hdr_rec.asset_id := ret.asset_id;
580 l_asset_hdr_rec.book_type_code := ret.book;
581 --l_asset_hdr_rec.set_of_books_id := fa_cache_pkg.fazcbc_record.set_of_books_id;
582 l_asset_hdr_rec.set_of_books_id := ret.set_of_books_id;
583 l_mrc_sob_type_code := ret.mrc_sob_type_code;
584
585 OPEN c_get_rein_thid;
586 FETCH c_get_rein_thid INTO l_trans_rec.transaction_header_id;
587 CLOSE c_get_rein_thid;
588
589 OPEN c_get_trans_rec(l_trans_rec.transaction_header_id);
590 FETCH c_get_trans_rec INTO l_trans_rec.transaction_type_code
591 , l_trans_rec.transaction_date_entered
592 , l_trans_rec.transaction_name
593 , l_trans_rec.source_transaction_header_id
594 , l_trans_rec.mass_reference_id
595 , l_trans_rec.transaction_subtype
596 , l_trans_rec.transaction_key
597 , l_trans_rec.amortization_start_date
598 , l_trans_rec.calling_interface
599 , l_trans_rec.mass_transaction_id
600 , l_trans_rec.deprn_override_flag
601 , l_trans_rec.member_transaction_header_id
602 , l_trans_rec.trx_reference_id;
603 CLOSE c_get_trans_rec;
604
605 if not FA_UTIL_PVT.get_asset_cat_rec (
606 p_asset_hdr_rec => l_asset_hdr_rec,
607 px_asset_cat_rec => l_asset_cat_rec,
608 p_date_effective => NULL, p_log_level_rec => p_log_level_rec) then
609 raise calc_err;
610 end if;
611
612 if not fa_util_pvt.get_asset_desc_rec (
613 p_asset_hdr_rec => l_asset_hdr_rec,
614 px_asset_desc_rec => l_asset_desc_rec, p_log_level_rec => p_log_level_rec) then
615 raise calc_err;
616 end if;
617
618 if not FA_UTIL_PVT.get_asset_type_rec (
619 p_asset_hdr_rec => l_asset_hdr_rec,
620 px_asset_type_rec => l_asset_type_rec,
621 p_date_effective => null, p_log_level_rec => p_log_level_rec) then
622 raise calc_err;
623 end if;
624
625 if not fa_util_pvt.get_asset_fin_rec (
626 p_asset_hdr_rec => l_asset_hdr_rec,
627 px_asset_fin_rec => l_asset_fin_rec_old,
628 p_mrc_sob_type_code => l_mrc_sob_type_code, p_log_level_rec => p_log_level_rec) then
629 raise calc_err;
630 end if;
631
632 if (l_mrc_sob_type_code = 'R') then
633 OPEN c_get_ret_amounts_mrc;
634 FETCH c_get_ret_amounts_mrc
635 INTO l_asset_fin_rec_adj.salvage_value,
636 l_asset_fin_rec_adj.allowed_deprn_limit_amount,
637 l_asset_fin_rec_adj.unrevalued_cost;
638 CLOSE c_get_ret_amounts_mrc;
639 else
640 OPEN c_get_ret_amounts;
641 FETCH c_get_ret_amounts
642 INTO l_asset_fin_rec_adj.salvage_value,
643 l_asset_fin_rec_adj.allowed_deprn_limit_amount,
644 l_asset_fin_rec_adj.unrevalued_cost;
645 CLOSE c_get_ret_amounts;
646 end if;
647
648 if (p_log_level_rec.statement_level) then
649 fa_debug_pkg.add(l_calling_fn, '+ + ret.cost_retired', ret.cost_retired, p_log_level_rec => p_log_level_rec);
650 fa_debug_pkg.add(l_calling_fn, '+ + l_asset_fin_rec_old.cost (1)', l_asset_fin_rec_old.cost);
651 fa_debug_pkg.add(l_calling_fn, '+ + x_asset_fin_rec_new.cost (1)', x_asset_fin_rec_new.cost);
652 end if;
653
654 x_asset_fin_rec_new := l_asset_fin_rec_old;
655 l_asset_fin_rec_adj.cost := ret.cost_retired;
656 x_asset_fin_rec_new.cost := x_asset_fin_rec_new.cost + ret.cost_retired;
657 x_asset_fin_rec_new.unrevalued_cost := x_asset_fin_rec_new.unrevalued_cost + l_asset_fin_rec_adj.unrevalued_cost;
658
659 if (p_log_level_rec.statement_level) then
660 fa_debug_pkg.add(l_calling_fn, '+ + x_asset_fin_rec_new.cost (2)', x_asset_fin_rec_new.cost);
661 end if;
662
663 -- BUG# 3371210
664 -- replacing the original code here with calls to common calc apis
665
666 if not fa_asset_calc_pvt.calc_salvage_value
667 (p_trans_rec => l_trans_rec,
668 p_asset_hdr_rec => l_asset_hdr_rec,
669 p_asset_type_rec => l_asset_type_rec,
670 p_asset_fin_rec_old => l_asset_fin_rec_old,
671 p_asset_fin_rec_adj => l_asset_fin_rec_adj,
672 px_asset_fin_rec_new => x_asset_fin_rec_new,
673 p_mrc_sob_type_code => l_mrc_sob_type_code, p_log_level_rec => p_log_level_rec) then
674 raise calc_err;
675 end if;
676
677 x_asset_fin_rec_new.recoverable_cost := x_asset_fin_rec_new.cost - x_asset_fin_rec_new.salvage_value;
678
679 if not fa_asset_calc_pvt.calc_deprn_limit_adj_rec_cost
680 (p_asset_hdr_rec => l_asset_hdr_rec,
681 p_asset_type_rec => l_asset_type_rec,
682 p_asset_fin_rec_old => l_asset_fin_rec_old,
683 p_asset_fin_rec_adj => l_asset_fin_rec_adj,
684 px_asset_fin_rec_new => x_asset_fin_rec_new,
685 p_mrc_sob_type_code => l_mrc_sob_type_code, p_log_level_rec => p_log_level_rec) then
686 raise calc_err;
687 end if;
688
689 if not fa_util_pvt.get_asset_deprn_rec (
690 p_asset_hdr_rec => l_asset_hdr_rec,
691 px_asset_deprn_rec => l_asset_deprn_rec,
692 p_mrc_sob_type_code => l_mrc_sob_type_code, p_log_level_rec => p_log_level_rec) then
693 raise calc_err;
694 end if;
695
696 if not FA_UTIL_PVT.get_period_rec (
697 p_book => l_asset_hdr_rec.book_type_code,
698 x_period_rec => l_period_rec, p_log_level_rec => p_log_level_rec) then
699 raise calc_err;
700 end if;
701
702 if (l_mrc_sob_type_code = 'R') then
703 OPEN c_get_rsv_ret_mrc;
704 FETCH c_get_rsv_ret_mrc INTO l_reserve_retired;
705 CLOSE c_get_rsv_ret_mrc;
706 else
707 OPEN c_get_rsv_ret;
708 FETCH c_get_rsv_ret INTO l_reserve_retired;
709 CLOSE c_get_rsv_ret;
710 end if;
711
712 l_asset_deprn_rec_adj.deprn_reserve := l_reserve_retired;
713
714 if (p_log_level_rec.statement_level) then
715 fa_debug_pkg.add(l_calling_fn, '+ + l_reserve_retired', l_reserve_retired, p_log_level_rec => p_log_level_rec);
716 fa_debug_pkg.add(l_calling_fn, '+ + l_asset_deprn_rec_adj.deprn_reserve', l_asset_deprn_rec_adj.deprn_reserve, p_log_level_rec => p_log_level_rec);
717 end if;
718
719
720 -- Bug 5381824 Get the prorated transaction date
721 -- based on retirement prorate convention.
722 if (l_mrc_sob_type_code = 'R') then
723 OPEN c_mc_get_retire_prorate(l_trans_rec.transaction_header_id, l_trans_rec.transaction_date_entered);
724 FETCH c_mc_get_retire_prorate INTO l_trans_rec.transaction_date_entered;
725 CLOSE c_mc_get_retire_prorate;
726 else
727 OPEN c_get_retire_prorate(l_trans_rec.transaction_header_id, l_trans_rec.transaction_date_entered);
728 FETCH c_get_retire_prorate INTO l_trans_rec.transaction_date_entered;
729 CLOSE c_get_retire_prorate;
730 end if;
731
732
733 -- Bug 5738004
734 if dpr.calc_catchup then
735 l_running_mode := fa_std_types.FA_DPR_CATCHUP;
736 else
737 l_running_mode := fa_std_types.FA_DPR_NORMAL;
738 end if;
739
740 -- BUG# 3371210
741 -- replacing the original code here with calls to common calc apis
742
743 if not FA_AMORT_PVT.faxama
744 (px_trans_rec => l_trans_rec,
745 p_asset_hdr_rec => l_asset_hdr_rec,
746 p_asset_desc_rec => l_asset_desc_rec,
747 p_asset_cat_rec => l_asset_cat_rec,
748 p_asset_type_rec => l_asset_type_rec,
749 p_asset_fin_rec_old => l_asset_fin_rec_old,
750 p_asset_fin_rec_adj => l_asset_fin_rec_adj,
751 px_asset_fin_rec_new => x_asset_fin_rec_new,
752 p_asset_deprn_rec => l_asset_deprn_rec,
753 p_asset_deprn_rec_adj => l_asset_deprn_rec_adj,
754 p_period_rec => l_period_rec,
755 p_mrc_sob_type_code => l_mrc_sob_type_code,
756 p_running_mode => l_running_mode,
757 p_used_by_revaluation => null,
758 x_deprn_exp => x_deprn_exp,
759 x_bonus_deprn_exp => x_bonus_deprn_exp,
760 x_impairment_exp => x_impairment_exp,
761 p_log_level_rec => p_log_level_rec) then
762 if (p_log_level_rec.statement_level) then
763 fa_debug_pkg.add(l_calling_fn, 'End', 'Success', p_log_level_rec => p_log_level_rec);
764 end if;
765
766 raise calc_err;
767 end if;
768
769
770
771 return TRUE;
772
773 EXCEPTION
774 when calc_err then
775 fa_srvr_msg.add_message(calling_fn => 'fa_gainloss_dpr_pkg.CALC_CATCHUP', p_log_level_rec => p_log_level_rec);
776 return FALSE;
777
778 when OTHERS then
779 fa_srvr_msg.add_message(calling_fn => 'fa_gainloss_dpr_pkg.CALC_CATCHUP(OTHERS)',
780 p_log_level_rec => p_log_level_rec);
781 return FALSE;
782
783 END CALC_CATCHUP;
784
785 END FA_GAINLOSS_DPR_PKG; -- End of Package RDPR