DBA Data[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