DBA Data[Home] [Help]

PACKAGE BODY: APPS.FA_GAINLOSS_RET_PKG

Source


1 PACKAGE BODY FA_GAINLOSS_RET_PKG AS
2 /* $Header: fagretb.pls 120.13.12010000.1 2008/07/28 13:21:55 appldev ship $*/
3 
4 g_print_debug boolean := fa_cache_pkg.fa_print_debug;
5 
6 /*===========================================================================
7 | NAME		fagfpc					    		    |
8 |									    |
9 | FUNCTION	Determines the number of periods need to be catchup.        |
10 |		A negative number corresponds to the case where the period  |
11 |		number of the DATE EFFECTIVE of the retirement is less than |
12 |		the current period number. A positive number corresponds to |
13 |		teh reverse case. If retirement prorate date is in current  |
14 |		period, then # of periods catchup is zero.		    |
15 |									    |
16 | HISTORY	1/12/89		R Rumanang	Created			    |
17 |               8/22/90         R Rumanang      add prorate_calendar        |
18 |		04/12/91	M Chan		Modified for MPL 9	    |
19 |		01/08/97	S Behura	Rewrote in PL/SQL	    |
20 |===========================================================================*/
21  -- Bug6187408 Added cpdnum_set
22 FUNCTION fagfpc(book in varchar2, ret_p_date in date,
23 		cpdnum number, cpd_fiscal_year number,
24 		p_cal in out nocopy varchar2, d_cal in out varchar2,
25 		pdspyr number, pds_catchup in out nocopy number,
26 		startdp in out nocopy number, enddp in out number,
27 		startpp in out nocopy number, endpp in out number,
28 		fiscal_year_name in out nocopy varchar2,
29 		cpdnum_set varchar2,
30 		p_log_level_rec        IN     FA_API_TYPES.log_level_rec_type default null) RETURN BOOLEAN IS
31 
32     fagfpc_err		exception;
33 
34     dummy		number;
35     ret_pro_mth 	number;
36     ret_pro_fy		number;
37     fiscal_year		number;
38     ret_p_period_num	number;
39     ret_p_jdate		number;
40     p_pds_per_yr        integer;
41 
42 
43     h_startpp		integer;
44     h_endpp		integer;
45     h_ret_p_jstartdate	integer;
46     h_p_cal		varchar2(21);
47     h_d_cal		varchar2(21);
48     h_fiscal_year_name	varchar2(31);
49     h_ret_p_date	date;
50     h_cpp_jstartdate    number;
51     h_cpdnum		number;
52     h_book		varchar2(15);
53     h_cpd_fy		number;
54 
55     l_calling_fn        varchar2(80) := 'fa_gainloss_ret_pkg.fagfpc';
56 
57     BEGIN <<FAGFPC>>
58 
59        h_d_cal := d_cal;
60        h_p_cal := p_cal;
61        h_fiscal_year_name := fiscal_year_name;
62        h_ret_p_date := ret_p_date;
63        h_book := book;
64        h_cpdnum := cpdnum;
65        h_cpd_fy := cpd_fiscal_year;
66 
67        ret_p_jdate := to_char(ret_p_date, 'J');
68 
69        if not fa_cache_pkg.fazccp(d_cal, fiscal_year_name, ret_p_jdate,
70 		         ret_p_period_num, fiscal_year, dummy
71 ,p_log_level_rec => p_log_level_rec) then
72           fa_srvr_msg.add_message(calling_fn => l_calling_fn
73                     ,p_log_level_rec => p_log_level_rec);
74           raise fagfpc_err;
75        end if;
76 
77        if not fa_GAINLOSS_MIS_PKG.faggfy(ret_p_date, p_cal,
78 						ret_pro_mth, ret_pro_fy,
79                					fiscal_year_name
80                					,p_log_level_rec => p_log_level_rec) then
81 
82           fa_srvr_msg.add_message(
83              calling_fn => 'fa_gainloss_ret_pkg.fagfpc',
84              name       => 'FA_RET_GENERIC_ERROR',
85              token1     => 'MODULE',
86              value1     => 'FAGGFY',
87              token2     => 'INFO',
88              value2     => 'Retirement Prorate Date',
89              token3     => 'ASSET',
90              value3     => NULL
91              ,p_log_level_rec => p_log_level_rec);
92 
93 	  return(FALSE);
94 
95        end if;
96 
97        -- Get the number of periods per year in the rate calendar
98        if not fa_cache_pkg.fazcct(p_cal) then
99           fa_srvr_msg.add_message(calling_fn => 'fa_gainloss_ret_pkg.fagfpc'
100                     ,p_log_level_rec => p_log_level_rec);
101           raise fagfpc_err;
102        end if;
103 
104        p_pds_per_yr := fa_cache_pkg.fazcct_record.number_per_fiscal_year;
105 
106 
107        begin
108 
109 	-- Bug6187408
110 	-- Added the condition to check for daily prorate assets
111        if cpdnum_set = 'N' then
112                 SELECT  to_number (to_char (cp.start_date, 'J'))
113                 INTO    h_cpp_jstartdate
114                 FROM    fa_deprn_periods dp,
115                         fa_calendar_periods cp,
116                         fa_fiscal_year fy
117                 WHERE   cp.calendar_type = h_d_cal
118                 AND     fy.fiscal_year_name = h_fiscal_year_name
119                 AND     fy.fiscal_year = h_cpd_fy
120                 AND     dp.fiscal_year = fy.fiscal_year
121                 AND     dp.book_type_code = h_book
122                 AND     dp.period_num = h_cpdnum
123                 AND     dp.period_name = cp.period_name
124                 AND     dp.period_num = cp.period_num;
125          end if;
126           EXCEPTION
127              when no_data_found then
128                 raise fagfpc_err;
129           end;
130 
131 
132        -- getting start prorate period num
133 
134        begin
135        -- Bug6187408
136 	-- Added the condition to check for daily prorate assets
137         if cpdnum_set = 'N' then
138           SELECT  period_num
139           INTO    h_startpp
140           FROM    fa_calendar_periods
141           WHERE   calendar_type = h_p_cal
142           AND     to_date (h_cpp_jstartdate,'J')
143         		between start_date and end_date;
144         else
145 		h_startpp := h_cpdnum;
146 	end if;
147 
148         EXCEPTION
149              when no_data_found then
150                 raise fagfpc_err;
151        end;
152 
153 
154       --  getting end prorate period num
155 
156        begin
157           SELECT  period_num
158           INTO    h_endpp
159           FROM    fa_calendar_periods
160           WHERE   calendar_type = h_p_cal
161           AND     trunc(h_ret_p_date)
162         		between start_date and end_date;
163           EXCEPTION
164              when no_data_found then
165                 raise fagfpc_err;
166        end;
167 
168        startpp := h_startpp;
169        endpp := h_endpp;
170 
171     /* Retirement cannot accross fiscal year, thus it always happen in current
172        fiscal year. However, retirement_prorate_convention may cause the
173        prorate_date  in the next year (ie: FOLLOWING-MONTH.)
174     */
175 
176        pds_catchup :=  (((ret_pro_fy * p_pds_per_yr) +  h_endpp) -
177                          ((cpd_fiscal_year * p_pds_per_yr) + h_startpp));
178 
179 -- Bug6187408
180 -- Added the condition to check for daily prorate assets
181 if cpdnum_set = 'N' then
182 
183        startdp := cpdnum;
184        enddp :=  cpdnum;
185 end if;
186        return(TRUE);
187 
188        EXCEPTION
189 
190           when others then
191              fa_srvr_msg.add_sql_error(calling_fn => l_calling_fn
192                           ,p_log_level_rec => p_log_level_rec);
193              return FALSE;
194 
195     END FAGFPC;
196 
197 /*==========================================================================
198 |  NAME         faggrv                                                     |
199 |                                                                          |
200 |  FUNCTION     Gets current depreciation reserve after adjsuted with      |
201 |               total adjustments so far for this period. For TAX          |
202 |               retirement, we need to look for if there is any tax        |
203 |               adjustment or not.                                         |
204 |                                                                          |
205 |  HISTORY      9/9/89     R Rumanang     Created                          |
206 |               9/5/90     R Rumanang     Updated for Tax Reserve          |
207 |                                         Adjustment                       |
208 |               04/11/91   M Chan         Rewrite for MPL 9 to speed up the|
209 |                                         retirement program.              |
210 |               01/08/97   S Behura       Rewrote into PL/SQL              |
211 |               08/11/97   S Behura       Rewrote into PL/SQL(10.7)        |
212 |==========================================================================*/
213 
214 FUNCTION faggrv(asset_id number, book in varchar2, cpd_ctr number,
215                 adj_rsv in out nocopy number, reval_adj_rsv in out number,
216                 prior_fy_exp in out nocopy number, ytd_deprn in out number,
217 		bonus_rsv in out nocopy number,
218 		bonus_ytd_deprn	in out nocopy number,
219 		prior_fy_bonus_exp in out nocopy number,
220                 mrc_sob_type_code in varchar2,
221 		p_log_level_rec        IN     FA_API_TYPES.log_level_rec_type default null) RETURN BOOLEAN IS
222 
223     faggrv_err          exception;
224 
225     dpr_row             fa_STD_TYPES.fa_deprn_row_struct;
226     h_success		boolean;
227 
228     l_calling_fn        varchar2(80) := 'fa_gainloss_ret_pkg.faggrv';
229 
230     BEGIN <<FAGGRV>>
231 
232        if p_log_level_rec.statement_level then fa_debug_pkg.add(l_calling_fn, 'IN FAGGRV', '', p_log_level_rec); end if;
233 
234        if p_log_level_rec.statement_level then
235             fa_debug_pkg.add
236               (fname   => l_calling_fn,
237                element => 'Getting depreciation reserve adjustments',
238                value   => ''
239                ,p_log_level_rec => p_log_level_rec);
240        end if;
241 
242        /*  we need to take into account about the CREDIT, because Reinstatement
243        of a retirement will put up a CR of reserve. h_tot_adjustment holds
244        the value of adjustment to reserve + expense for this period */
245 
246        dpr_row.asset_id := asset_id;
247        dpr_row.book := book;
248        dpr_row.dist_id := 0;
249        dpr_row.period_ctr := cpd_ctr;
250        dpr_row.mrc_sob_type_code := mrc_sob_type_code;
251 
252        FA_QUERY_BALANCES_PKG.query_balances_int (
253                   X_DPR_ROW => dpr_row,
254                   X_RUN_MODE => 'STANDARD',
255                   X_DEBUG => FALSE,
256                   X_SUCCESS => H_SUCCESS,
257                   X_CALLING_FN => l_calling_fn,
258                   X_TRANSACTION_HEADER_ID => -1
259                   ,p_log_level_rec => p_log_level_rec);
260 
261        if dpr_row.period_ctr <> 0 then
262              adj_rsv := dpr_row.deprn_rsv;
263              reval_adj_rsv := dpr_row.reval_rsv;
264 	     bonus_rsv := dpr_row.bonus_deprn_rsv;
265 	     bonus_ytd_deprn := dpr_row.bonus_ytd_deprn;
266 
267              /*** Copy dpr_row.prior_fy_exp to prior_fy_exp. ***/
268 	     prior_fy_exp := dpr_row.prior_fy_exp;
269 	     prior_fy_bonus_exp := dpr_row.prior_fy_bonus_exp;
270 	     ytd_deprn := dpr_row.ytd_deprn;
271        else
272              -- faggrv: no values found in query fin info function
273              fa_srvr_msg.add_message(calling_fn => l_calling_fn
274                           ,p_log_level_rec => p_log_level_rec);
275              raise faggrv_err;
276         end if;
277 
278         return(TRUE);
279 
280        EXCEPTION
281 
282           when faggrv_err then
283              fa_srvr_msg.add_sql_error(calling_fn => l_calling_fn
284                           ,p_log_level_rec => p_log_level_rec);
285              return FALSE;
286 
287           when others then
288              fa_srvr_msg.add_sql_error(calling_fn => l_calling_fn
289                           ,p_log_level_rec => p_log_level_rec);
290              return FALSE;
291 
292 
293     END FAGGRV;
294 
295 /*=============================================================================
296 |                                                                             |
297 |  NAME         fagret                                                        |
298 |                                                                             |
299 |  FUNCTION     This function does the retirement process based on the        |
300 |               retirement structure and book information.                    |
301 |               Briefly, it determines the number of periods need to be       |
302 |               catchup based on the DATE_EFFECTIVE of the retirement and the |
303 |               current period START_DATE. The number of periods catchup is   |
304 |               determined by substracting the current period number from     |
305 |               the period number of DATE_EFFECTIVE. If the number is         |
306 |               positive, then we need to calculate the depreciation amount   |
307 |               needs to be taken each period; otherwise, we don't need to    |
308 |               determine the depreciation rate since we can obtain the       |
309 |               deprn_amount need to be taken from the previous records in    |
310 |               deprn_summary and deprn_detail.                               |
311 |                                                                             |
312 |  HISTORY      1/12/89   R Rumanang    Created                               |
313 |               6/23/89   R Rumanang    Standarized                           |
314 |               8/30/89   R Rumanang    Add calls to fagprv, etc as part      |
315 |                                       of the GL interface project.          |
316 |               9/08/89   R Rumanang    When capitalize_flag is NO, just set  |
317 |                                       the retirment to PROCESSED.           |
318 |               04/08/91  M Chan        Rewrite the module so that it will    |
319 |                                       handle the retirement process in a    |
320 |                                       better way.                           |
321 |               01/08/97  S Behura      Rewrote into PL/SQL                   |
322 |               08/11/97  S Behura      Rewrote into PL/SQL(10.7)             |
323 |============================================================================*/
324 
325 FUNCTION fagret(ret in out nocopy fa_RET_TYPES.ret_struct,
326                 bk in out nocopy fa_RET_TYPES.book_struct,
327                 dpr in out nocopy fa_STD_TYPES.dpr_struct, today in date,
328                 cpd_ctr number, cpdnum number, retpdnum in out nocopy number,
329                 user_id number,
330 		p_log_level_rec        IN     FA_API_TYPES.log_level_rec_type default null) Return BOOLEAN IS
331     fagret_err          exception;
332 
333     -- Cursors and variables added for bug4343087
334     CURSOR c_get_new_bk is
335        select adjusted_cost
336             , salvage_value
337             , recoverable_cost
338             , adjusted_recoverable_cost
339             , reval_amortization_basis
340             , old_adjusted_cost
341        from   fa_books
342        where  asset_id = ret.asset_id
343        and    book_type_code = ret.book
344        and    transaction_header_id_out is null;
345 
346     CURSOR c_get_new_mc_bk is
347        select adjusted_cost
348             , salvage_value
349             , recoverable_cost
350             , adjusted_recoverable_cost
351             , reval_amortization_basis
352             , old_adjusted_cost
353        from   fa_books_mrc_v
354        where  asset_id = ret.asset_id
355        and    book_type_code = ret.book
356        and    transaction_header_id_out is null;
357 
358     l_temp_deprn_amt       number;
359     l_temp_bonus_deprn_amt number;
360     l_temp_reval_deprn_amt number;
361     l_temp_reval_amort     number;
362     -- End of Cursors and variables added for bug4343087
363 
364     periods_catchup     number;
365     start_pd            number;
366     end_pd              number;
367     start_ppd           number;
368     end_ppd             number;
369     deprn_amt           number;
370     bonus_deprn_amt	number;
371     bonus_deprn_reserve number;
372     bonus_ytd_deprn	number;
373     deprn_reserve       number;
374     reval_deprn_amt     number;
375     reval_amort         number;
376     reval_reserve       number;
377     prior_fy_exp        number;
378     prior_fy_bonus_exp	number;
379     ytd_deprn           number;
380     jdate_retired       number;
381     ret_prorate_jdate   number;
382     cost_frac           number;
383 
384     d_cost_retired      number;
385     d_current_cost      number;
386     d_cost_frac         number;
387 
388     h_date_retired	date;
389     h_ret_prorate_date	date;
390     h_jdate_retired	number;
391     h_ret_prorate_jdate	number;
392 
393 
394     l_asset_hdr_rec         FA_API_TYPES.asset_hdr_rec_type;
395     l_asset_deprn_rec_old   FA_API_TYPES.asset_deprn_rec_type;
396 
397     -- Bug 4639408
398     l_temp_deprn_reserve number;
399 
400     h_end_pd             number;    -- bug fix 6259953
401     h_fiscal_year       number;     -- bug fix 6259953
402 
403     l_calling_fn        varchar2(80) := 'fa_gainloss_ret_pkg.fagret';
404     --Bug6187408
405   --Added new cursor and variable to check for retirement in period of addition
406   h_cpdnum     number; --Bug6187408
407   prd_flag varchar2(1);
408   cpdnum_set varchar2(1);
409   cursor c_prd_flag is
410   select 'Y'
411   from fa_calendar_periods fcp1,
412        fa_calendar_periods  fcp2,
413        fa_book_controls fbc
414   where to_date (dpr.prorate_jdate,'J') BETWEEN fcp1.start_date and fcp1.end_date
415 		and fbc.book_type_code = dpr.book
416                 and fcp1.calendar_type = fbc.deprn_calendar
417                 and to_date (decode( dpr.jdate_retired,0,null,dpr.jdate_retired),'J') BETWEEN fcp2.start_date and fcp2.end_date
418                 and fcp2.calendar_type=fcp1.calendar_type
419 		and fcp1.period_name=fcp2.period_name;
420 
421     BEGIN <<FAGRET>>
422 
423 
424        deprn_amt := 0;
425        deprn_reserve := 0;
426        bonus_deprn_amt := 0;
427        bonus_deprn_reserve := 0;
428        reval_deprn_amt := 0;
429        reval_amort := 0;
430        reval_reserve := 0;
431        prior_fy_exp := 0;
432        prior_fy_bonus_exp := 0;
433        ytd_deprn := 0;
434        cost_frac := 0;
435        bonus_ytd_deprn := 0;
436 
437        if (bk.current_cost is null or bk.current_cost = 0) then
438           cost_frac := 0;
439        else
440           cost_frac := ret.cost_retired / bk.current_cost;
441        end if;
442 
443        --Commented out the following to avoid rounding of
444        --Cost_Frac. Bug no 1050284
445 
446        -- CHECK: SNARAYAN. may need to round cost frac to 8 digits
447 
448        /* if not EFA_utilities.faxrnd(cost_frac, ret.book, cost_frac) then
449                                'Call faxrnd to round cost_frac in fagret');
450        end if;*/
451 
452 
453        if (bk.group_asset_id is not null) then
454           l_asset_hdr_rec.asset_id := bk.group_asset_id;
455           l_asset_hdr_rec.book_type_code := ret.book;
456           l_asset_hdr_rec.set_of_books_id := fa_cache_pkg.fazcbc_record.set_of_books_id;
457 
458           if not fa_util_pvt.get_asset_deprn_rec (
459                    p_asset_hdr_rec         => l_asset_hdr_rec,
460                    px_asset_deprn_rec      => l_asset_deprn_rec_old,
461                    p_mrc_sob_type_code     => ret.mrc_sob_type_code
462                    ,p_log_level_rec => p_log_level_rec) then
463              fa_srvr_msg.add_message(
464                 calling_fn => l_calling_fn,
465                 name       => 'FA_RET_GENERIC_ERROR',
466                 token1     => 'MODULE',
467                 value1     => 'get_asset_deprn_rec',
468                 token2     => 'INFO',
469                 value2     => 'old deprn',
470                 token3     => 'ASSET',
471                 value3     => ret.asset_number
472                 ,p_log_level_rec => p_log_level_rec);
473 
474              return false;
475           end if;
476        end if;
477 
478        if p_log_level_rec.statement_level then fa_debug_pkg.add(l_calling_fn, 'in fagret1 ', '', p_log_level_rec); end if;
479 
480        if not faggrv(ret.asset_id, ret.book, cpd_ctr, deprn_reserve,
481                      reval_reserve, prior_fy_exp, ytd_deprn,
482 		     bonus_deprn_reserve, bonus_ytd_deprn,
483                      prior_fy_bonus_exp,
484                      ret.mrc_sob_type_code
485                      ,p_log_level_rec => p_log_level_rec) then
486 
487           fa_srvr_msg.add_message(
488              calling_fn => l_calling_fn,
489              name       => 'FA_RET_GENERIC_ERROR',
490              token1     => 'MODULE',
491              value1     => 'FAGGRV',
492              token2     => 'INFO',
493              value2     => 'reserve',
494              token3     => 'ASSET',
495              value3     => ret.asset_number
496              ,p_log_level_rec => p_log_level_rec);
497 
498           return(FALSE);
499 
500        end if;
501 
502        if p_log_level_rec.statement_level then fa_debug_pkg.add(l_calling_fn, 'in fagret2', '', p_log_level_rec); end if;
503 
504        dpr.deprn_rsv := deprn_reserve;
505        dpr.reval_rsv := reval_reserve;
506        dpr.prior_fy_exp := prior_fy_exp;
507        dpr.ytd_deprn := ytd_deprn;
508        dpr.bonus_deprn_rsv := bonus_deprn_reserve;
509        dpr.bonus_ytd_deprn := bonus_ytd_deprn;
510        dpr.prior_fy_bonus_exp := prior_fy_bonus_exp;
511 
512        dpr.rsv_known_flag := TRUE;
513 
514     --Bug6187408
515     -- Get the number of periods per year in the rate calendar
516        if not fa_cache_pkg.fazcct(bk.p_cal) then
517           fa_srvr_msg.add_message(calling_fn => 'fa_gainloss_ret_pkg.fagret'
518                     ,p_log_level_rec => p_log_level_rec);
519           raise fagret_err;
520        end if;
521        h_cpdnum := cpdnum;
522        open c_prd_flag;
523        fetch c_prd_flag into prd_flag;
524        if c_prd_flag%NOTFOUND then
525 	  prd_flag := 'N';
526        end if;
527        close c_prd_flag;
528         if fa_cache_pkg.fazcct_record.number_per_fiscal_year = 365 and prd_flag = 'Y' then
529 
530 		start_pd := cpdnum;
531 	        end_pd := cpdnum;
532 		cpdnum_set := 'Y';
533 
534 	       SELECT  facp.period_num
535 	       INTO    h_cpdnum
536 	       FROM    fa_calendar_periods facp
537 	       WHERE   facp.calendar_type = bk.p_cal
538 	       AND    ( facp.start_date = bk.prorate_date
539 	       OR      facp.end_date = bk.prorate_date );
540 	 else
541 	    cpdnum_set := 'N';
542          end if;
543 --Bug6187408
544 --Passing h_cpdnum instead of cpdnum and added cpdnum_set flag
545        if not fagfpc(ret.book, bk.ret_prorate_date, h_cpdnum,
546                      bk.cpd_fiscal_year, bk.p_cal, bk.d_cal,
547                      bk.pers_per_yr, periods_catchup,
548                      start_pd, end_pd, start_ppd, end_ppd,
549                      bk.fiscal_year_name,
550 		     cpdnum_set
551                      ,p_log_level_rec => p_log_level_rec) then
552 
553           fa_srvr_msg.add_message(
554              calling_fn => l_calling_fn,
555              name       => 'FA_RET_GENERIC_ERROR',
556              token1     => 'MODULE',
557              value1     => 'FAGFPC',
558              token2     => 'INFO',
559              value2     => 'catchup period',
560              token3     => 'ASSET',
561              value3     => ret.asset_number
562              ,p_log_level_rec => p_log_level_rec);
563 
564           return(FALSE);
565 
566        end if;
567 
568        if p_log_level_rec.statement_level then fa_debug_pkg.add(l_calling_fn, 'in fagret3', '', p_log_level_rec); end if;
569 
570     /* If it's capitalize and also depreciate, we will calculate
571        depreciation; otherwise, we will skip it
572     */
573 
574        jdate_retired := to_char(ret.date_retired, 'J');
575        h_jdate_retired := to_char(ret.date_retired, 'J');
576        ret_prorate_jdate := to_char(bk.ret_prorate_date, 'J');
577        h_ret_prorate_jdate := to_char(bk.ret_prorate_date, 'J');
578 
579        dpr.jdate_retired := jdate_retired;
580        dpr.ret_prorate_jdate := ret_prorate_jdate;
581 
582        if start_pd = 0 then /* If start is zero, calculate the whole deprn*/
583           dpr.p_cl_begin := 1;
584         /* It is O.K. to assign 1 to dpr->p_cl_begin, because the deprn
585        engine is smart enough to skip over periods before the deprn
586        start period */
587 
588        else
589           dpr.p_cl_begin := start_pd;
590        end if;
591 
592        dpr.p_cl_end := end_pd;
593 
594        deprn_amt := 0;
595 
596        if bk.capitalize and bk.depreciate and (ret.wip_asset is null or
597                                                ret.wip_asset <= 0) then
598           -- Bug#4867806: if (periods_catchup > 0) and (not bk.fully_reserved) then
599           -- bk.depr_first_year_ret=> 0:1=No:Yes; Need to back out expense when bk.depr_first_year_ret=0 (No)
600           if (periods_catchup > 0 or bk.depr_first_year_ret = 0) and (not bk.fully_reserved) then
601 
602              if p_log_level_rec.statement_level then fa_debug_pkg.add(l_calling_fn, 'in fagret3.1', '', p_log_level_rec); end if;
603 
604 	     -- bug 6259953 (Added logic to correctly set end_pd and dpr.y_end if retirement
605 	      -- prorate date falls in subsequent periods/years)
606              if (periods_catchup > 0) then
607 
608                 begin
609                    select period_num
610                    into h_end_pd
611                    from fa_calendar_periods cp
612                    where calendar_type = dpr.calendar_type
613                    and bk.ret_prorate_date between start_date and end_date;
614 
615                    select fiscal_year
616                    into h_fiscal_year
617                    from fa_fiscal_year
618                    where fiscal_year_name = fa_cache_pkg.fazcbc_record.fiscal_year_name
619                    and  bk.ret_prorate_date between start_date and end_date;
620 
621                 exception
622                    when others then
623                       h_end_pd := end_pd;
624                       h_fiscal_year := dpr.y_end;
625                 end;
626 
627                 end_pd := h_end_pd;
628                 dpr.y_end := h_fiscal_year;
629 
630                 if g_print_debug then
631 		   fa_debug_pkg.add(l_calling_fn, 'End period', end_pd);
632 		   fa_debug_pkg.add(l_calling_fn, 'End fiscal year', dpr.y_end);
633 		end if;
634 
635 
636 	     end if;
637              -- End bug 6259953
638 
639              if not FA_GAINLOSS_DPR_PKG.fagcdp(dpr, deprn_amt,
640 				bonus_deprn_amt,
641 				reval_deprn_amt,
642                                 reval_amort, bk.deprn_start_date,
643                                 bk.d_cal, bk.p_cal, start_pd, end_pd,
644                                 bk.prorate_fy, bk.dsd_fy, bk.prorate_jdate,
645                                 bk.deprn_start_jdate
646                                 ,p_log_level_rec => p_log_level_rec) then
647 
648                 fa_srvr_msg.add_message(
649                   calling_fn => l_calling_fn,
650                   name       => 'FA_RET_GENERIC_ERROR',
651                   token1     => 'MODULE',
652                   value1     => 'FAGCDP',
653                   token2     => 'INFO',
654                   value2     => 'depreciation number',
655                   token3     => 'ASSET',
656                   value3     => ret.asset_number
657                   ,p_log_level_rec => p_log_level_rec);
658 
659                 return(FALSE);
660 
661              end if;
662 
663              if p_log_level_rec.statement_level then fa_debug_pkg.add(l_calling_fn, 'in fagret3.2', '', p_log_level_rec); end if;
664 
665              -- Bug4343087:
666              -- In order to find correct catchup amount without rounding
667              -- error we need to find expense before retirement(before) and
668              -- after retirement(after) and then subtract after amount from before.
669              -- Following portion of code finds after amounts and then subtract
670              -- before amount that is found in previous fagcdp call.
671              if p_log_level_rec.statement_level then
672                 fa_debug_pkg.add (l_calling_fn, 'before deprn_amt', deprn_amt
673                                 ,p_log_level_rec => p_log_level_rec);
674                 fa_debug_pkg.add (l_calling_fn, 'before bonus_deprn_amt', bonus_deprn_amt
675                                 ,p_log_level_rec => p_log_level_rec);
676                 fa_debug_pkg.add (l_calling_fn, 'before reval_deprn_amt', reval_deprn_amt
677                                 ,p_log_level_rec => p_log_level_rec);
678                 fa_debug_pkg.add (l_calling_fn, 'before reval_amort', reval_amort
679                                 ,p_log_level_rec => p_log_level_rec);
680              end if;
681 
682              -- Store before amount
683              l_temp_deprn_amt       := deprn_amt;
684              l_temp_bonus_deprn_amt := bonus_deprn_amt;
685              l_temp_reval_deprn_amt := reval_deprn_amt;
686              l_temp_reval_amort     := reval_amort;
687 
688              -- Get after fin ncial info for calling fagcdp
689              if (ret.mrc_sob_type_code = 'R') then
690                 open c_get_new_mc_bk;
691                 fetch c_get_new_mc_bk into dpr.adj_cost
692                                          , dpr.salvage_value
693                                          , dpr.rec_cost
694                                          , dpr.adj_rec_cost
695                                          , dpr.reval_amo_basis
696                                          , dpr.old_adj_cost;
697                 close c_get_new_mc_bk;
698              else
699                 open c_get_new_bk;
700                 fetch c_get_new_bk into dpr.adj_cost
701                                          , dpr.salvage_value
702                                          , dpr.rec_cost
703                                          , dpr.adj_rec_cost
704                                          , dpr.reval_amo_basis
705                                          , dpr.old_adj_cost;
706                 close c_get_new_bk;
707              end if;
708 
709              -- fix for 4639408
710              dpr.deprn_rsv := cost_frac * deprn_reserve;
711              if not FA_UTILS_PKG.faxrnd(dpr.deprn_rsv, ret.book) then
712                 fa_srvr_msg.add_message(calling_fn => l_calling_fn);
713                 return FALSE;
714              end if;
715              dpr.deprn_rsv := deprn_reserve - dpr.deprn_rsv;
716              -- end fix for 4639408
717 
718              if p_log_level_rec.statement_level then
719                 fa_debug_pkg.add (l_calling_fn, 'calling function', 'FA_GAINLOSS_DPR_PKG.fagcdp'
720                                 ,p_log_level_rec => p_log_level_rec);
721              end if;
722 
723              -- Find new expense using after amounts
724              if not FA_GAINLOSS_DPR_PKG.fagcdp(dpr, deprn_amt,
725                                 bonus_deprn_amt,
726                                 reval_deprn_amt,
727                                 reval_amort, bk.deprn_start_date,
728                                 bk.d_cal, bk.p_cal, start_pd, end_pd,
729                                 bk.prorate_fy, bk.dsd_fy, bk.prorate_jdate,
730                                 bk.deprn_start_jdate
731                                 ,p_log_level_rec => p_log_level_rec) then
732 
733                 if p_log_level_rec.statement_level then
734                    fa_debug_pkg.add (l_calling_fn, 'calling FA_GAINLOSS_DPR_PKG.fagcdp', 'FAILED'
735                                       ,p_log_level_rec => p_log_level_rec);
736                 end if;
737 
738                 fa_srvr_msg.add_message(
739                   calling_fn => l_calling_fn,
740                   name       => 'FA_RET_GENERIC_ERROR',
741                   token1     => 'MODULE',
742                   value1     => 'FAGCDP',
743                   token2     => 'INFO',
744                   value2     => 'depreciation number',
745                   token3     => 'ASSET',
746                   value3     => ret.asset_number
747                   ,p_log_level_rec => p_log_level_rec);
748 
749                 return(FALSE);
750 
751              end if;
752 
753              if p_log_level_rec.statement_level then
754                 fa_debug_pkg.add (l_calling_fn, 'after deprn_amt', deprn_amt
755                                 ,p_log_level_rec => p_log_level_rec);
756                 fa_debug_pkg.add (l_calling_fn, 'after bonus_deprn_amt', bonus_deprn_amt
757                                 ,p_log_level_rec => p_log_level_rec);
758                 fa_debug_pkg.add (l_calling_fn, 'after reval_deprn_amt', reval_deprn_amt
759                                 ,p_log_level_rec => p_log_level_rec);
760                 fa_debug_pkg.add (l_calling_fn, 'after reval_amort', reval_amort
761                                 ,p_log_level_rec => p_log_level_rec);
762              end if;
763 
764              -- Find catchup amount by subtracting before from after amounts.
765              deprn_amt       := l_temp_deprn_amt - deprn_amt;
766              bonus_deprn_amt := l_temp_bonus_deprn_amt - bonus_deprn_amt;
767              reval_deprn_amt := l_temp_reval_deprn_amt - reval_deprn_amt;
768              reval_amort     := l_temp_reval_amort - reval_amort;
769 
770              if p_log_level_rec.statement_level then
771                 fa_debug_pkg.add (l_calling_fn, 'final deprn_amt', deprn_amt
772                                 ,p_log_level_rec => p_log_level_rec);
773                 fa_debug_pkg.add (l_calling_fn, 'final bonus_deprn_amt', bonus_deprn_amt
774                                 ,p_log_level_rec => p_log_level_rec);
775                 fa_debug_pkg.add (l_calling_fn, 'final reval_deprn_amt', reval_deprn_amt
776                                 ,p_log_level_rec => p_log_level_rec);
777                 fa_debug_pkg.add (l_calling_fn, 'final reval_amort', reval_amort
778                                 ,p_log_level_rec => p_log_level_rec);
779              end if;
780 
781              -- Bug fix 6113545 (Commenting the below four lines)
782 	     /*deprn_amt := deprn_amt * cost_frac;
783 	     bonus_deprn_amt := bonus_deprn_amt * cost_frac;
784              reval_deprn_amt := reval_deprn_amt * cost_frac;
785              reval_amort := reval_amort * cost_frac;*/
786 	     -- End of bug fix 6113545
787 
788              /* BUG# 2482031: rounding issue - YYOON */
789              if not FA_UTILS_PKG.faxrnd(x_amount => deprn_amt
790                                        ,x_book   => ret.book
791                                        ,p_log_level_rec => p_log_level_rec) then
792                                            return FALSE;
793              end if;
794 
795 
796              if not FA_UTILS_PKG.faxrnd(x_amount => bonus_deprn_amt
797                                        ,x_book   => ret.book
798                                        ,p_log_level_rec => p_log_level_rec) then
799                                            return FALSE;
800              end if;
801 
802              if not FA_UTILS_PKG.faxrnd(x_amount => reval_deprn_amt
803                                        ,x_book   => ret.book
804                                        ,p_log_level_rec => p_log_level_rec) then
805                                            return FALSE;
806              end if;
807 
808              if not FA_UTILS_PKG.faxrnd(x_amount => reval_amort
809                                        ,x_book   => ret.book
810                                        ,p_log_level_rec => p_log_level_rec) then
811                                            return FALSE;
812              end if;
813 
814           end if;
815 
816           if p_log_level_rec.statement_level then fa_debug_pkg.add(l_calling_fn, 'in fagret3.3', '', p_log_level_rec); end if;
817 
818           if not FA_GAINLOSS_UPD_PKG.fagpdp(ret, bk, dpr, today,
819 				periods_catchup, cpd_ctr,
820                              	cpdnum, cost_frac, deprn_amt,
821 				bonus_deprn_amt,
822                              	reval_deprn_amt, reval_amort,
823                                 reval_reserve, user_id
824                                ,p_log_level_rec => p_log_level_rec) then
825 
826                 fa_srvr_msg.add_message(
827                   calling_fn => l_calling_fn,
828                   name       => 'FA_RET_INSERT_ERROR',
829                   token1     => 'MODULE',
830                   value1     => 'FAGPDP',
831                   token2     => 'ACTION',
832                   value2     => 'insert',
833                   token3     => 'TYPE',
834                   value3     => 'Depreciation',
835                   token4     => 'ASSET',
836                   value4     => ret.asset_number
837                   ,p_log_level_rec => p_log_level_rec);
838 
839                 return(FALSE);
840 
841           end if;
842 
843           if p_log_level_rec.statement_level then fa_debug_pkg.add(l_calling_fn, 'in fagret3.4', '', p_log_level_rec); end if;
844 
845        end if; -- end of - if bk.capitalize
846 
847        if (ret.wip_asset is NULL or ret.wip_asset <= 0) then
848 
849           if not FA_GAINLOSS_UPD_PKG.fagprv(ret, bk, cpd_ctr,
850 			cost_frac, today, user_id,
851                         deprn_amt, reval_deprn_amt, reval_amort,
852                         deprn_reserve, reval_reserve,
853 			bonus_deprn_amt, bonus_deprn_reserve
854                        ,p_log_level_rec => p_log_level_rec) then
855 
856              fa_srvr_msg.add_message(
857                   calling_fn => l_calling_fn,
858                   name       => 'FA_RET_INSERT_ERROR',
859                   token1     => 'MODULE',
860                   value1     => 'FAGPRV',
861                   token2     => 'ACTION',
862                   value2     => 'insert',
863                   token3     => 'TYPE',
864                   value3     => 'Depreciation Reserve',
865                   token4     => 'ASSET',
866                   value4     => ret.asset_number
867                   ,p_log_level_rec => p_log_level_rec);
868 
869              return(FALSE);
870 
871           end if; -- end of - if not rupd.fagprv
872 
873        end if; -- end of - if (ret.wip_asset
874 
875        if not FA_GAINLOSS_UPD_PKG.fagpct(ret, bk, cpd_ctr, today,
876 						user_id
877 						,p_log_level_rec => p_log_level_rec) then
878 
879           fa_srvr_msg.add_message(
880                   calling_fn => l_calling_fn,
881                   name       => 'FA_RET_INSERT_ERROR',
882                   token1     => 'MODULE',
883                   value1     => 'FAGPCT',
884                   token2     => 'ACTION',
885                   value2     => 'insert',
886                   token3     => 'TYPE',
887                   value3     => 'Cost',
888                   token4     => 'ASSET',
889                   value4     => ret.asset_number
890                   ,p_log_level_rec => p_log_level_rec);
891 
892           return(FALSE);
893 
894        end if;
895 
896        dpr.y_begin := bk.prorate_fy;
897        dpr.y_end := bk.cpd_fiscal_year;
898 
899        if retpdnum = 1 then
900 
901           dpr.y_end := bk.cpd_fiscal_year - 1;
902           retpdnum := bk.pers_per_yr;
903 
904        else
905 
906           retpdnum := retpdnum - 1;
907 
908        end if;
909 
910        if dpr.y_end < bk.prorate_fy then
911 
912           retpdnum := 0;                        /* Special value assigned */
913 
914        end if;
915 
916        if p_log_level_rec.statement_level then fa_debug_pkg.add(l_calling_fn, 'in fagret6', '', p_log_level_rec); end if;
917 
918        if not FA_GAINLOSS_UPD_PKG.fagurt(ret, bk, cpd_ctr, dpr,
919 				cost_frac, retpdnum,
920                               	today, user_id
921                                ,p_log_level_rec => p_log_level_rec) then
922 
923           fa_srvr_msg.add_message(
924                   calling_fn => l_calling_fn,
925                   name       => 'FA_RET_INSERT_ERROR',
926                   token1     => 'MODULE',
927                   value1     => 'FAGURT',
928                   token2     => 'ACTION',
929                   value2     => 'make',
930                   token3     => 'TYPE',
931                   value3     => 'table',
932                   token4     => 'ASSET',
933                   value4     => ret.asset_number
934                   ,p_log_level_rec => p_log_level_rec);
935 
936           return(FALSE);
937 
938        end if; -- end of - if not rupd.fagurt
939 
940        if p_log_level_rec.statement_level then fa_debug_pkg.add(l_calling_fn, 'in fagret999', '', p_log_level_rec); end if;
941 
942        if (bk.group_asset_id is not null) then
943           -- +++++ Process Group Asse +++++
944           if not FA_RETIREMENT_PVT.Do_Retirement_in_CGL(
945                   p_ret                 => ret,
946                   p_bk                  => bk,
947                   p_dpr                 => dpr,
948                   p_asset_deprn_rec_old => l_asset_deprn_rec_old,
949                   p_mrc_sob_type_code   => ret.mrc_sob_type_code,
950                   p_calling_fn          => l_calling_fn
951                   ,p_log_level_rec => p_log_level_rec) then
952 
953              fa_srvr_msg.add_message(calling_fn => l_calling_fn,
954                                   name       => 'FA_RET_INSERT_ERROR',
955                                   token1     => 'MODULE',
956                                   value1     => 'FA_RETIREMENT_PVT.Do_Retirement_in_CGL',
957                                   token2     => 'ACTION',
958                                   value2     => 'make',
959                                   token3     => 'TYPE',
960                                   value3     => 'table',
961                                   token4     => 'ASSET',
962                                   value4     => ret.asset_number
963 ,p_log_level_rec => p_log_level_rec);
964              return false;
965           end if;
966        end if; -- (bk.group_asset_id is not null)
967 
968        return(TRUE);
969 
970     EXCEPTION
971 
972           when others then
973              fa_srvr_msg.add_sql_error(calling_fn => l_calling_fn
974                           ,p_log_level_rec => p_log_level_rec);
975              return FALSE;
976 
977 
978     END FAGRET;
979 
980 
981 
982 END FA_GAINLOSS_RET_PKG;    -- End of Package EFA_RRET