[Home] [Help]
PACKAGE BODY: APPS.IGI_IAC_REVAL_ENGINE
Source
1 PACKAGE BODY IGI_IAC_REVAL_ENGINE AS
2 -- $Header: igiiareb.pls 120.10.12000000.1 2007/08/01 16:16:58 npandya ship $
3
4 --===========================FND_LOG.START=====================================
5
6 g_state_level NUMBER := FND_LOG.LEVEL_STATEMENT;
7 g_proc_level NUMBER := FND_LOG.LEVEL_PROCEDURE;
8 g_event_level NUMBER := FND_LOG.LEVEL_EVENT;
9 g_excep_level NUMBER := FND_LOG.LEVEL_EXCEPTION;
10 g_error_level NUMBER := FND_LOG.LEVEL_ERROR;
11 g_unexp_level NUMBER := FND_LOG.LEVEL_UNEXPECTED;
12 g_path VARCHAR2(100) := 'IGI.PLSQL.igiiareb.IGI_IAC_REVAL_ENGINE.';
13
14 --===========================FND_LOG.END=======================================
15
16 l_rec igi_iac_revaluation_rates%rowtype; -- create this for quicker access via sql navigator
17
18 procedure do_round ( p_amount in out NOCOPY number, p_book_type_code in varchar2) is
19 l_amount number := p_amount;
20 l_amount_old number := p_amount;
21 l_path varchar2(150) := g_path||'do_round';
22 begin
23 IF IGI_IAC_COMMON_UTILS.Iac_Round(X_Amount => l_amount, X_Book => p_book_type_code)
24 THEN
25 p_amount := l_amount;
26 ELSE
27 p_amount := round( l_amount, 2);
28 END IF;
29 exception when others then
30 p_amount := l_amount_old;
31 igi_iac_debug_pkg.debug_unexpected_msg(l_path);
32 Raise;
33 end;
34
35 procedure do_round ( p_info in out NOCOPY IGI_IAC_TYPES.iac_reval_output_asset ) is
36 p_info_old IGI_IAC_TYPES.iac_reval_output_asset;
37 l_path varchar2(150) := g_path||'do_round';
38 begin
39 p_info_old := p_info;
40
41 do_round( p_info.adjusted_cost , p_info.book_type_code ) ;
42 do_round( p_info.operating_acct , p_info.book_type_code ) ;
43 do_round( p_info.deprn_amount , p_info.book_type_code ) ;
44 do_round( p_info.backlog_deprn_reserve , p_info.book_type_code ) ;
45 do_round( p_info.deprn_reserve , p_info.book_type_code ) ;
46 do_round( p_info.general_fund , p_info.book_type_code ) ;
47 do_round( p_info.reval_reserve , p_info.book_type_code ) ;
48 do_round( p_info.net_book_value , p_info.book_type_code ) ;
49
50 exception when others then
51 p_info := p_info_old;
52 igi_iac_debug_pkg.debug_unexpected_msg(l_path);
53 Raise;
54 end;
55
56 procedure display ( p_info in IGI_IAC_TYPES.iac_reval_output_asset ) IS
57 l_path varchar2(150) := g_path||'display';
58 begin
59 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'++++++++++++++++++++++++++++++++++++++++++++++++');
60 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,' Adjusted cost '||p_info.adjusted_cost);
61 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,' Operating Acc '||p_info.operating_acct);
62 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,' Deprn amount '||p_info.deprn_amount );
63 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,' Backlog '||p_info.backlog_deprn_reserve);
64 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,' Deprn Reserve '||p_info.deprn_reserve);
65 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,' General Fund '||p_info.general_fund);
66 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,' Reval Reserve '||p_info.reval_reserve );
67 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,' NBV '||p_info.net_book_value );
68 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,' current rate '||p_info.current_reval_factor);
69 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,' cumulve rate '||p_info.cumulative_reval_factor);
70 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'++++++++++++++++++++++++++++++++++++++++++++++++');
71 end;
72
73 Function Calculations ( p_iac_reval_params in out NOCOPY IGI_IAC_TYPES.iac_reval_params
74 , p_second_set in boolean
75 )
76 RETURN BOOLEAN IS
77 p_iac_reval_params_old IGI_IAC_TYPES.iac_reval_params;
78 l_reval_prev IGI_IAC_TYPES.iac_reval_output_asset;
79 l_reval_curr IGI_IAC_TYPES.iac_reval_output_asset;
80 l_reval_mvmt IGI_IAC_TYPES.iac_reval_output_asset;
81 l_curr_rate number := 0;
82 l_prev_rate number := 0;
83 l_tran_rate number := 0;
84 l_py_factor number := 0;
85 l_salvage_value_correction number :=0;
86 l_salvage_value_correction_ytd number :=0;
87 l_path varchar2(150) := g_path||'Calculations';
88 BEGIN
89 p_iac_reval_params_old := p_iac_reval_params;
90
91 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'begin calculations');
92 if not p_second_set then
93 l_curr_rate := p_iac_reval_params.reval_curr_rate_info_first.cumulative_reval_factor;
94 l_prev_rate := p_iac_reval_params.reval_prev_rate_info.cumulative_reval_factor;
95
96 else
97 l_curr_rate := p_iac_reval_params.reval_curr_rate_info_next.cumulative_reval_factor;
98 l_prev_rate := p_iac_reval_params.reval_prev_rate_info.cumulative_reval_factor;
99 end if;
100 l_tran_rate := l_curr_rate/ l_prev_rate;
101
102 l_py_factor := p_iac_reval_params.fa_asset_info.deprn_periods_prior_year /
103 p_iac_reval_params.fa_asset_info.deprn_periods_elapsed
104 ;
105 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'+calculations : l_curr_rate '|| l_curr_rate);
106 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'+calculations : l_prev_rate '|| l_prev_rate);
107 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'+calculations : l_tran_rate '|| l_tran_rate);
108
109 /* Apply the prev cumm rate to the fa info */
110 l_reval_prev := p_iac_reval_params.reval_input_asset;
111 l_reval_curr := p_iac_reval_params.reval_input_asset;
112
113 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,' + calculations : deprn Resreve '|| p_iac_reval_params.fa_asset_info.deprn_reserve);
114 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'+ calculations : YTD '|| p_iac_reval_params.fa_asset_info.Ytd_deprn);
115
116 if (p_iac_reval_params.reval_control.first_time_flag) then
117 l_reval_prev.adjusted_cost := ( l_prev_rate * p_iac_reval_params.fa_asset_info.cost )
118 - p_iac_reval_params.fa_asset_info.cost ;
119 if l_curr_rate >= 1 and l_prev_rate >= 1 then
120 l_reval_prev.operating_acct := 0;
121 else
122 l_reval_prev.operating_acct := l_reval_prev.adjusted_cost ;
123 end if;
124
125 p_iac_reval_params.reval_asset_params.prev_ytd_deprn := ( l_prev_rate * p_iac_reval_params.fa_asset_info.ytd_deprn)
126 - p_iac_reval_params.fa_asset_info.ytd_deprn;
127 l_reval_prev.backlog_deprn_reserve := (l_prev_rate - 1) *
128 ( p_iac_reval_params.fa_asset_info.deprn_reserve -
129 p_iac_reval_params.fa_asset_info.ytd_deprn)
130
131 /*) -
132 ( p_iac_reval_params.fa_asset_info.deprn_reserve -
133 p_iac_reval_params.fa_asset_info.ytd_deprn)*/ ;
134 if l_reval_prev.adjusted_cost >= 0 then
135 l_reval_prev.general_fund := p_iac_reval_params.reval_asset_params.prev_ytd_deprn ;
136 l_reval_prev.reval_reserve := l_reval_prev.adjusted_cost - l_reval_prev.backlog_deprn_reserve
137 - l_reval_prev.general_fund ;
138 else
139 l_reval_prev.reval_reserve := 0 ;
140 l_reval_prev.general_fund := 0 ;
141 end if;
142
143 l_reval_prev.deprn_reserve := ( l_prev_rate * p_iac_reval_params.fa_asset_info.deprn_reserve)
144 - p_iac_reval_params.fa_asset_info.deprn_reserve
145 - l_reval_prev.backlog_deprn_reserve;
146
147
148 l_reval_prev.net_book_value := l_reval_prev.adjusted_cost - l_reval_prev.deprn_reserve
149 - l_reval_prev.backlog_deprn_reserve;
150 else
151 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'+calculations : not the first time');
152 p_iac_reval_params.reval_asset_params.prev_ytd_deprn := ( l_prev_rate * p_iac_reval_params.fa_asset_info.ytd_deprn)
153 - p_iac_reval_params.fa_asset_info.ytd_deprn;
154 end if;
155
156 /* Display prev record */
157 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'++++++++++++++++++++++++++++++++++++++++++++++++');
158 if p_second_set then
159 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'+++++++++++ SECOND SET : START +++++++++++');
160 else
161 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'++++++++++++ FIRST SET : START +++++++++++');
162 end if;
163 Do_round( l_reval_prev );
164 Display( l_reval_prev );
165 /* Apply the curr cumm rate to the fa info */
166 l_reval_curr.adjusted_cost := ( l_curr_rate * p_iac_reval_params.fa_asset_info.cost )
167 - p_iac_reval_params.fa_asset_info.cost;
168
169 IF p_iac_reval_params.fa_asset_info.period_counter_fully_reserved IS NOT NULL
170 AND p_iac_reval_params.reval_asset_params.period_counter > p_iac_reval_params.fa_asset_info.last_period_counter THEN
171 l_reval_curr.deprn_amount := 0;
172 l_reval_prev.deprn_amount := 0;
173 ELSE
174 l_reval_curr.deprn_amount := ( l_curr_rate * p_iac_reval_params.fa_asset_info.deprn_amount)
175 - p_iac_reval_params.fa_asset_info.deprn_amount;
176 END IF;
177
178 if p_second_set then
179 p_iac_reval_params.reval_asset_params.curr_ytd_deprn_next
180 := ( l_curr_rate * p_iac_reval_params.fa_asset_info.ytd_deprn)
181 - p_iac_reval_params.fa_asset_info.ytd_deprn;
182 p_iac_reval_params.reval_asset_params.ytd_deprn_mvmt :=
183 p_iac_reval_params.reval_asset_params.curr_ytd_deprn_next -
184 p_iac_reval_params.reval_asset_params.prev_ytd_deprn ;
185 else
186 p_iac_reval_params.reval_asset_params.curr_ytd_deprn_first
187 := ( l_curr_rate * p_iac_reval_params.fa_asset_info.ytd_deprn)
188 - p_iac_reval_params.fa_asset_info.ytd_deprn;
189 p_iac_reval_params.reval_asset_params.ytd_deprn_mvmt :=
190 p_iac_reval_params.reval_asset_params.curr_ytd_deprn_first -
191 p_iac_reval_params.reval_asset_params.prev_ytd_deprn ;
192 end if;
193 /* Backlog = movement in current revaluation * gross pyrs acc deprn
194 */
195 if l_py_factor <> 0 then
196 declare
197 l_blog number;
198 begin
199
200 l_blog := ( p_iac_reval_params.fa_asset_info.deprn_reserve -
201 p_iac_reval_params.fa_asset_info.ytd_deprn) *
202 ( l_curr_rate - l_prev_rate );
203 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'+current period backlog is '|| l_blog);
204 l_reval_curr.backlog_deprn_reserve := l_blog + l_reval_prev.backlog_deprn_reserve;
205 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'+cumulative backlog is '|| l_reval_curr.backlog_deprn_reserve);
206 end;
207 else
208 l_reval_curr.backlog_deprn_reserve := 0;
209 end if;
210
211 if l_curr_rate >= 1 and l_prev_rate >= 1 then
212 l_reval_curr.general_fund := l_reval_prev.general_fund +
213 p_iac_reval_params.reval_asset_params.ytd_deprn_mvmt ;
214
215 l_reval_curr.reval_reserve := l_reval_curr.adjusted_cost - l_reval_curr.backlog_deprn_reserve
216 - l_reval_curr.general_fund - l_reval_curr.operating_acct;
217 else
218 l_reval_curr.reval_reserve := 0;
219 l_reval_curr.operating_acct := l_reval_curr.adjusted_cost - l_reval_curr.backlog_deprn_reserve
220 - l_reval_curr.general_fund ;
221 end if;
222
223 l_reval_curr.deprn_reserve := ( l_curr_rate * p_iac_reval_params.fa_asset_info.deprn_reserve)
224 - p_iac_reval_params.fa_asset_info.deprn_reserve
225 - l_reval_curr.backlog_deprn_reserve;
226
227 l_reval_curr.net_book_value := l_reval_curr.adjusted_cost - l_reval_curr.deprn_reserve
228 - l_reval_curr.backlog_deprn_reserve;
229 Do_round( p_info => l_reval_curr );
230 /* put the differences in the asset mvmt table */
231 -- note accounting entries are created from this mvmt table --
232 if p_iac_reval_params.reval_control.first_time_flag then
233 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'+first time flag is set.');
234 l_reval_mvmt := l_reval_curr;
235 else
236 l_reval_mvmt.adjusted_cost := l_reval_curr.adjusted_cost - l_reval_prev.adjusted_cost;
237 l_reval_mvmt.operating_acct := l_reval_curr.operating_acct - l_reval_prev.operating_acct;
238 l_reval_mvmt.deprn_amount := l_reval_curr.deprn_amount - l_reval_prev.deprn_amount;
239 l_reval_mvmt.backlog_deprn_reserve := l_reval_curr.backlog_deprn_reserve
240 - l_reval_prev.backlog_deprn_reserve;
241 l_reval_mvmt.deprn_reserve := l_reval_curr.deprn_reserve - l_reval_prev.deprn_reserve;
242 l_reval_mvmt.general_fund := l_reval_curr.general_fund - l_reval_prev.general_fund;
243 l_reval_mvmt.reval_reserve := l_reval_curr.reval_reserve - l_reval_prev.reval_reserve;
244 l_reval_mvmt.net_book_value := 0;
245 end if;
246 /* display results to the log file */
247 Do_round ( p_info => l_reval_mvmt );
248 if p_second_set then
249 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'+++++++++++ SECOND SET : REVAL MVMT ++++++++');
250 else
251 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'+++++++++++ FIRST SET : REVAL MVMT ++++++++');
252 end if;
253
254 Display ( p_info => l_reval_mvmt );
255 if p_second_set then
256 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'+++++++++++ SECOND SET : REVAL END ++++++++');
257 else
258 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'+++++++++++ FIRST SET : REVAL END ++++++++');
259 end if;
260 Display ( p_info => l_reval_curr );
261 if p_iac_reval_params.reval_control.first_time_flag then
262 p_iac_reval_params.reval_input_asset := l_reval_prev ;
263 end if;
264 p_iac_reval_params.reval_output_asset := l_reval_curr ;
265 p_iac_reval_params.reval_output_asset.cumulative_reval_factor := l_curr_rate;
266 p_iac_reval_params.reval_output_asset.current_reval_factor := l_tran_rate;
267 p_iac_reval_params.reval_output_asset_mvmt := l_reval_mvmt ;
268 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'end calculations');
269 return TRUE;
270
271 exception when others then
272 p_iac_reval_params := p_iac_reval_params_old;
273 igi_iac_debug_pkg.debug_unexpected_msg(l_path);
274 return FALSE;
275 END;
276
277 Function First_set_calculations ( p_iac_reval_params in out NOCOPY IGI_IAC_TYPES.iac_reval_params )
278 RETURN BOOLEAN IS
279 p_iac_reval_params_old IGI_IAC_TYPES.iac_reval_params;
280 l_path varchar2(150) := g_path||'First_set_calculations';
281 BEGIN
282
283 p_iac_reval_params_old := p_iac_reval_params;
284
285 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'begin first set calculations');
286 IF NOT Calculations ( p_iac_reval_params => p_iac_reval_params, p_second_set => false )
287 THEN
288 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'error first set calculations');
289 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'end first set calculations');
290 return false;
291 END IF;
292 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'end first set calculations');
293 return TRUE;
294 exception when others then
295 p_iac_reval_params := p_iac_reval_params_old;
296 igi_iac_debug_pkg.debug_unexpected_msg(l_path);
297 return FALSE;
298 END;
299
300 Function Next_set_calculations ( p_iac_reval_params in out NOCOPY IGI_IAC_TYPES.iac_reval_params )
301 RETURN BOOLEAN IS
302 p_iac_reval_params_old IGI_IAC_TYPES.iac_reval_params;
303 l_path varchar2(150) := g_path||'Next_set_calculations';
304 BEGIN
305
306 p_iac_reval_params_old := p_iac_reval_params;
307
308 IF NOT Calculations ( p_iac_reval_params => p_iac_reval_params, p_second_set => true )
309 THEN
310 igi_iac_debug_pkg.debug_other_string(g_error_level,l_path,'error next set calculations');
311 igi_iac_debug_pkg.debug_other_string(g_error_level,l_path,'end next set calculations');
312 return false;
313 END IF;
314 return TRUE;
315 exception when others then
316 p_iac_reval_params := p_iac_reval_params_old;
317 igi_iac_debug_pkg.debug_unexpected_msg(l_path);
318 return FALSE;
319 END;
320 /*
321 -- Get the rate information and then call Set_Calculations : FIRST and NEXT
322 */
323
324 Function Prepare_calculations ( p_iac_reval_params in out NOCOPY IGI_IAC_TYPES.iac_reval_params )
325 RETURN BOOLEAN IS
326 p_iac_reval_params_old IGI_IAC_TYPES.iac_reval_params;
327 l_path varchar2(150) := g_path||'Prepare_calculations';
328 BEGIN
329
330 p_iac_reval_params_old := p_iac_reval_params;
331
332 -- first split ratios (if revaluation is mixed!)
333 IF NOT IGI_IAC_REVAL_UTILITIES.split_rates
334 ( fp_asset_id => p_iac_reval_params.reval_asset_params.asset_id
335 , fp_book_type_code => p_iac_reval_params.reval_asset_params.book_type_code
336 , fp_revaluation_id => p_iac_reval_params.reval_asset_params.revaluation_id
337 , fp_period_counter => p_iac_reval_params.reval_asset_params.period_counter
338 , fp_current_factor => p_iac_reval_params.reval_asset_params.revaluation_rate
339 , fp_reval_type => p_iac_reval_params.reval_asset_rules.revaluation_type
340 , fp_first_time_flag => p_iac_reval_params.reval_control.first_time_flag
341 , fp_mixed_scenario => p_iac_reval_params.reval_control.mixed_scenario
342 , fp_reval_prev_rate_info => p_iac_reval_params.reval_prev_rate_info
343 , fp_reval_curr_rate_info_first => p_iac_reval_params.reval_curr_rate_info_first
344 , fp_reval_curr_rate_info_next => p_iac_reval_params.reval_curr_rate_info_next
345 )
346 THEN
347 igi_iac_debug_pkg.debug_other_string(g_error_level,l_path,'Unable to split rates!');
348 return FALSE;
349 END IF;
350
351 return TRUE;
352 exception when others then
353 p_iac_reval_params := p_iac_reval_params_old;
354 igi_iac_debug_pkg.debug_unexpected_msg(l_path);
355 return FALSE;
356 END;
357
358 function swap ( fp_reval_params1 IN IGI_IAC_TYPES.iac_reval_params
359 , fp_reval_params2 OUT NOCOPY IGI_IAC_TYPES.iac_reval_params
360 )
361 return boolean is
362 fp_reval_params2_old IGI_IAC_TYPES.iac_reval_params;
363 l_path varchar2(150) := g_path||'swap';
364 begin
365
366 if fp_reval_params1.reval_control.mixed_scenario then
367 igi_iac_debug_pkg.debug_other_string(g_state_level,l_path,'+intializing for the second set of calculations');
368 fp_reval_params2 := fp_reval_params1;
369 fp_reval_params2.reval_control.first_time_flag := false;
370 fp_reval_params2.reval_input_asset := fp_reval_params1.reval_output_asset;
371 fp_reval_params2.reval_output_asset := fp_reval_params1.reval_output_asset;
372 fp_reval_params2.reval_output_asset_mvmt.net_book_value := 0;
373 fp_reval_params2.reval_output_asset_mvmt.adjusted_cost := 0;
374 fp_reval_params2.reval_output_asset_mvmt.operating_acct := 0;
375 fp_reval_params2.reval_output_asset_mvmt.reval_reserve := 0;
376 fp_reval_params2.reval_output_asset_mvmt.deprn_amount := 0;
377 fp_reval_params2.reval_output_asset_mvmt.deprn_reserve := 0;
378 fp_reval_params2.reval_output_asset_mvmt.backlog_deprn_reserve := 0;
379 fp_reval_params2.reval_output_asset_mvmt.general_fund := 0;
380 fp_reval_params2.reval_output_asset_mvmt.current_reval_factor := 1;
381 fp_reval_params2.reval_output_asset_mvmt.cumulative_reval_factor := 1;
382 fp_reval_params2.reval_prev_rate_info := fp_reval_params1.reval_curr_rate_info_first;
383 fp_reval_params2.reval_asset_params.prev_ytd_deprn := fp_reval_params1.reval_asset_params.prev_ytd_deprn ;
384 fp_reval_params2.reval_asset_params.prev_ytd_opacc := fp_reval_params1.reval_asset_params.prev_ytd_opacc;
385 end if;
386 return true;
387 exception when others then
388 fp_reval_params2 := fp_reval_params2_old;
389 igi_iac_debug_pkg.debug_unexpected_msg(l_path);
390 return FALSE;
391 end;
392
393 END;
394
395