DBA Data[Home] [Help]

PACKAGE BODY: APPS.FA_REC_PVT_PKG1

Source


1 PACKAGE BODY FA_REC_PVT_PKG1 AS
2 /* $Header: FAXVRC1B.pls 120.6 2009/03/27 04:44:05 bridgway ship $ */
3 
4 --
5 -- FUNCTION Validate_Reclass_Basic
6 --
7 
8 
9 FUNCTION Validate_Reclass_Basic(
10 	p_asset_id		IN	NUMBER,
11 	p_old_category_id	IN	NUMBER,
12 	p_new_category_id	IN	NUMBER,
13 	p_mr_req_id		IN	NUMBER,
14 	x_old_cat_type		IN OUT NOCOPY VARCHAR2
15 	, p_log_level_rec        IN     FA_API_TYPES.log_level_rec_type)	RETURN BOOLEAN IS
16 BEGIN
17           if (p_log_level_rec.statement_level) then
18                fa_debug_pkg.add('FARX_RP.Preview_Reclass',
19 	       'Starting Validate_reclass_basic',
20 	        p_asset_id, p_log_level_rec => p_log_level_rec);
21 	  end if;
22 
23     /* Otherwise, mass reclass.  Just silently skip validation and transaction
24        engine if old and new categories are the same.
25        Redefault will be skipped as well. */
26     -- This check is now handled by Mass Reclass Program.
27     /*
28     IF (p_old_category_id = p_new_category_id) THEN
29 	-- The rest can be skipped.
30 	RETURN (TRUE);
31     END IF;
32     */
33 
34     /* Check if an asset is retired in any book, or if a retirement is pending. */
35     IF NOT Check_Retirements(p_asset_id => p_asset_id,
36                              p_log_level_rec => p_log_level_rec) THEN
37           if (p_log_level_rec.statement_level) then
38                fa_debug_pkg.add('FARX_RP.Preview_Reclass',
39 	       'Check_retirments skipped asset:',
40 	        p_asset_id, p_log_level_rec => p_log_level_rec);
41 	  end if;
42 
43 	FA_SRVR_MSG.Add_Message(
44 		CALLING_FN => 'FA_REC_PVT_PKG1.Validate_Reclass_Basic', p_log_level_rec => p_log_level_rec);
45 	RETURN (FALSE);
46     END IF;
47 
48     /* Check if category chage is feasible. */
49     IF NOT Validate_Category_Change(
50 		p_asset_id 		=> p_asset_id,
51 		p_old_category_id	=> p_old_category_id,
52 		p_new_category_id	=> p_new_category_id,
53 		p_mr_req_id		=> p_mr_req_id,
54 		x_old_cat_type		=> x_old_cat_type,
55                 p_log_level_rec         => p_log_level_rec
56 		)
57     THEN
58           if (p_log_level_rec.statement_level) then
59                fa_debug_pkg.add('FARX_RP.Preview_Reclass',
60 	       'Validate_Category_Change skipped asset:',
61 	        p_asset_id, p_log_level_rec => p_log_level_rec);
62 	  end if;
63 
64 	FA_SRVR_MSG.Add_Message(
65 		CALLING_FN => 'FA_REC_PVT_PKG1.Validate_Reclass_Basic', p_log_level_rec => p_log_level_rec);
66 	RETURN (FALSE);
67     END IF;
68 
69           if (p_log_level_rec.statement_level) then
70                fa_debug_pkg.add('FARX_RP.Preview_Reclass',
71 	       'Validate_reclass_basic successful:',
72 	        p_asset_id, p_log_level_rec => p_log_level_rec);
73 	  end if;
74 
75     RETURN (TRUE);
76 
77     /* May add validations for FA_ADDITIONS items in the future for single reclass.
78        It is not necessary to add validations for these items, since mass reclass
79        won't need validations for these items.  May borrow validation engine from
80        ADDITIONS validation engine in the future. */
81 
82 EXCEPTION
83     WHEN OTHERS THEN
84    	FA_SRVR_MSG.Add_SQL_Error(
85 		CALLING_FN => 'FA_REC_PVT_PKG1.Validate_Reclass_Basic', p_log_level_rec => p_log_level_rec);
86         RETURN (FALSE);
87 END Validate_Reclass_Basic;
88 
89 
90 --
91 -- FUNCTION Check_Retirements
92 --
93 
94 FUNCTION Check_Retirements(
95 	p_asset_id		IN	NUMBER
96 	, p_log_level_rec        IN     FA_API_TYPES.log_level_rec_type)	RETURN BOOLEAN IS
97 	l_is_retired		NUMBER := 0;
98 	l_pending_retirements	NUMBER := 0;
99 	faurcl_error		EXCEPTION;
100 BEGIN
101     /* Check if the asset is fully retired in any book. */
102     -- Use the existing function in FA_ASSET_RECLASS_PKG.
103     SELECT count(*)
104       INTO l_is_retired
105       FROM FA_BOOKS   BK,
106            FA_BOOK_CONTROLS BC
107      WHERE
108            BK.ASSET_ID = p_asset_id AND
109            BK.PERIOD_COUNTER_FULLY_RETIRED IS NOT NULL AND
110            BK.DATE_INEFFECTIVE IS NULL AND
111            BK.BOOK_TYPE_CODE = BC.BOOK_TYPE_CODE AND
112            BC.DATE_INEFFECTIVE IS NULL;
113 
114     IF l_is_retired > 0 THEN
115        FA_SRVR_MSG.Add_Message(
116          CALLING_FN => 'FA_REC_PVT_PKG1.Check_Retirements',
117          NAME => 'FA_REC_RETIRED'
118          , p_log_level_rec => p_log_level_rec);
119        RETURN (FALSE);
120     END IF;
121 
122     /* Check if there is any pending retirements for the asset. */
123     SELECT count(1) INTO l_pending_retirements
124     FROM fa_retirements
125     WHERE asset_id = p_asset_id
126     AND status IN ('PENDING', 'REINSTATE')
127     AND rownum < 2;
128 
129     IF (l_pending_retirements > 0) THEN
130 	FA_SRVR_MSG.Add_Message(
131 		CALLING_FN => 'FA_REC_PVT_PKG1.Check_Retirements',
132 		NAME => 'FA_RET_PENDING_RETIREMENTS', p_log_level_rec => p_log_level_rec);
133 	RETURN (FALSE);
134     END IF;
135 
136     RETURN (TRUE);
137 EXCEPTION
138     WHEN faurcl_error THEN
139 	FA_SRVR_MSG.Add_Message(
140 		CALLING_FN => 'FA_REC_PVT_PKG1.Check_Retirements', p_log_level_rec => p_log_level_rec);
141 	RETURN (FALSE);
142     WHEN OTHERS THEN
143    	FA_SRVR_MSG.Add_SQL_Error(
144 		CALLING_FN => 'FA_REC_PVT_PKG1.Check_Retirements', p_log_level_rec => p_log_level_rec);
145         RETURN (FALSE);
146 END Check_Retirements;
147 
148 
149 --
150 -- FUNCTION Validate_Category_Change
151 --
152 
153 FUNCTION Validate_Category_Change(
154         p_asset_id              IN      NUMBER,
155         p_old_category_id       IN      NUMBER,
156         p_new_category_id       IN      NUMBER,
157 	p_mr_req_id		IN	NUMBER,
158 	x_old_cat_type		IN OUT NOCOPY VARCHAR2
159         , p_log_level_rec        IN     FA_API_TYPES.log_level_rec_type)       RETURN BOOLEAN IS
160 	l_asset_type	VARCHAR2(11);
161 	l_old_cap_flag	VARCHAR2(3);
162 	l_new_cat_type	VARCHAR2(30);
163 	l_lease_id	NUMBER(15) := NULL;
164 	l_check_count1	NUMBER := 0;
165 	l_check_count2 	NUMBER := 0;
166 	l_ah_units	NUMBER := 0;
167 	l_dh_units	NUMBER := 0;
168 	CURSOR get_asset_type IS
169 	    SELECT asset_type FROM FA_ADDITIONS
170     	    WHERE asset_id = p_asset_id;
171 	CURSOR get_old_cat_info IS
172 	    SELECT capitalize_flag, category_type
173     	    FROM FA_CATEGORIES WHERE category_id = p_old_category_id;
174 	CURSOR get_lease_id IS
175 	    SELECT lease_id FROM FA_ADDITIONS
176 	    WHERE asset_id = p_asset_id;
177 	CURSOR get_ah_units IS
178 	    SELECT units FROM FA_ASSET_HISTORY
179 	    WHERE asset_id = p_asset_id
180 	    AND date_ineffective IS NULL;
181 	CURSOR get_dh_units IS
182 	    SELECT sum(units_assigned) FROM FA_DISTRIBUTION_HISTORY
183 	    WHERE asset_id = p_asset_id
184 	    AND date_ineffective is NULL;
185 BEGIN
186     -- Check from transction approval per asset.  Units in asset history and
187     -- distribution history must match.
188     OPEN get_ah_units;
189     FETCH get_ah_units INTO l_ah_units;
190     CLOSE get_ah_units;
191 
192     OPEN get_dh_units;
193     FETCH get_dh_units INTO l_dh_units;
194     CLOSE get_dh_units;
195 
196     IF (l_ah_units <> l_dh_units) THEN
197 	FA_SRVR_MSG.Add_Message(
198         	CALLING_FN  =>  'FA_REC_PVT_PKG1.Validate_Category_Change',
199                 NAME        =>  'FA_SHARED_UNITS_UNBAL', p_log_level_rec => p_log_level_rec);
200 	RETURN (FALSE);
201     END IF;
202 
203     -- Make sure the new category is defined in all the books the asset belongs to.
204     -- Get the number of books in which the new category is defined for the asset.
205     SELECT count(*) INTO l_check_count1
206     FROM FA_CATEGORY_BOOKS cb, FA_BOOKS bk, fa_book_controls bc
207     WHERE bk.asset_id = p_asset_id
208     AND bk.date_ineffective IS NULL
209     AND bk.book_type_code = cb.book_type_code
210     AND cb.category_id = p_new_category_id
211     AND bc.book_type_code = bk.book_type_code
212     AND nvl(bc.date_ineffective,sysdate) >= sysdate;
213 
214     -- Get the total number of books the asset belongs to.
215     SELECT count(*) INTO l_check_count2
216     FROM FA_BOOKS bk, FA_BOOK_CONTROLS bc
217     WHERE bk.asset_id = p_asset_id
218     AND bk.date_ineffective IS NULL
219     AND bk.book_type_code = bc.book_type_code
220     AND nvl(bc.date_ineffective,sysdate) >= sysdate;
221 
222 
223     IF (l_check_count1 <> l_check_count2) THEN
224           if (p_log_level_rec.statement_level) then
225                fa_debug_pkg.add('FARX_RP.Preview_Reclass',
226 	       'Validate_category_change skipped asset:',
227 	        p_asset_id, p_log_level_rec => p_log_level_rec);
228 
229                fa_debug_pkg.add('FARX_RP.Preview_Reclass',
230 	       'You may need to define all books your asset belongs to, ',
231 	        'for the new category. See Setup Categories form.', p_log_level_rec => p_log_level_rec);
232 	  end if;
233 
234 	FA_SRVR_MSG.Add_Message(
235 		CALLING_FN => 'FA_REC_PVT_PKG1.Validate_Category_Change',
236 		NAME => 'FA_REC_CAT_BOOK_NOT_SETUP', p_log_level_rec => p_log_level_rec);
237 		/* Message text:
238 		   'The new category is not defined in at least one of the depreciation
239 		    books the asset belongs to.' */
240 	RETURN (FALSE);
241     END IF;
242 
243     OPEN get_asset_type;
244     FETCH get_asset_type INTO l_asset_type;
245     CLOSE get_asset_type;
246 
247     OPEN get_old_cat_info;
248     FETCH get_old_cat_info INTO l_old_cap_flag, x_old_cat_type;
249     CLOSE get_old_cat_info;
250 
251     IF x_old_cat_type = 'LEASE' THEN
252        OPEN get_lease_id;
253        FETCH get_lease_id INTO l_lease_id;
254        CLOSE get_lease_id;
255     END IF;
256 
257     -- x_old_cat_type value returned from Val_Reclass.
258     IF NOT FA_DET_ADD_PKG.Val_Reclass(
259 		X_Old_Cat_Id		=> p_old_category_id,
260 		X_New_Cat_Id		=> p_new_category_id,
261 		X_Asset_Id		=> p_asset_id,
262 		X_Asset_Type		=> l_asset_type,
263 		X_Old_Cap_Flag		=> l_old_cap_flag,
264 		X_Old_Cat_Type		=> x_old_cat_type,
265 		X_New_Cat_Type		=> l_new_cat_type,
266 		X_Lease_Id		=> l_lease_id,
267 		X_Calling_Fn		=> 'FA_REC_PVT_PKG1.Validate_Category_Change'
268 		, p_log_level_rec => p_log_level_rec)
269     THEN
270 	FA_SRVR_MSG.Add_Message(
271 		CALLING_FN => 'FA_REC_PVT_PKG1.Validate_Category_Change', p_log_level_rec => p_log_level_rec);
272 	RETURN (FALSE);
273     END IF;
274 
275     RETURN (TRUE);
276 
277 EXCEPTION
278     WHEN OTHERS THEN
279 	FA_SRVR_MSG.Add_SQL_Error(
280 		CALLING_FN => 'FA_REC_PVT_PKG1.Validate_Category_Change', p_log_level_rec => p_log_level_rec);
281         RETURN (FALSE);
282 END Validate_Category_Change;
283 
284 /*===================================================================================+
285 | FUNCTION Check_Trans_Date
286 |
287 +====================================================================================*/
288 
289 FUNCTION Check_Trans_Date(
290         p_asset_id         IN   NUMBER,
291         p_book_type_code   IN   VARCHAR2,
292         p_trans_date       IN   DATE, p_log_level_rec        IN     FA_API_TYPES.log_level_rec_type)       RETURN BOOLEAN IS
293 
294         prior_trans_date        DATE;
295         prior_date_effective    DATE;
296         check_another_trans     NUMBER := 0;
297         CURSOR get_prior_trans_date IS
298             SELECT      max(transaction_date_entered)
299             FROM        FA_TRANSACTION_HEADERS
300             WHERE       asset_id = p_asset_id
301             AND         book_type_code = p_book_type_code
302             AND         transaction_type_code not like '%/VOID';
303 
304         CURSOR get_prior_date_effective IS
305             SELECT      max(date_effective)
306             FROM        FA_TRANSACTION_HEADERS
307             WHERE       asset_id = p_asset_id
308             AND         book_type_code = p_book_type_code;
309 BEGIN
310     /*  Logic from FA_BOOKS_VAL5.Amortization_Start_Date from FAXASSET. */
311     -- Check another transaction between transaction date and current period.
312     OPEN get_prior_trans_date;
313     FETCH get_prior_trans_date INTO prior_trans_date;
314     CLOSE get_prior_trans_date;
315 
316     IF (p_trans_date < prior_trans_date) THEN
317         FA_SRVR_MSG.Add_Message(
318             CALLING_FN => 'FA_REC_PVT_PKG5.Check_Trans_Date',
319             NAME => 'FA_SHARED_OTHER_TRX_FOLLOW', p_log_level_rec => p_log_level_rec);
320         RETURN (FALSE);
321     END IF;
322 
323     OPEN get_prior_date_effective;
324     FETCH get_prior_date_effective INTO prior_date_effective;
325     CLOSE get_prior_date_effective;
326 
327     SELECT count(1) INTO check_another_trans
328     FROM FA_DEPRN_PERIODS pdp, FA_DEPRN_PERIODS adp
329     WHERE pdp.book_type_code = p_book_type_code
330     AND pdp.book_type_code = adp.book_type_code
331     AND pdp.period_counter > adp.period_counter
332     AND prior_date_effective between pdp.period_open_date
333             and nvl(pdp.period_close_date, to_date('31-12-4712','DD-MM-YYYY'))
334     AND p_trans_date between
335             adp.calendar_period_open_date and adp.calendar_period_close_date;
336 
337     IF (check_another_trans > 0) THEN
338         FA_SRVR_MSG.Add_Message(
339             CALLING_FN => 'FA_REC_PVT_PKG5.Check_Trans_Date',
340             NAME => 'FA_SHARED_OTHER_TRX_FOLLOW', p_log_level_rec => p_log_level_rec);
341         RETURN (FALSE);
342     END IF;
343 
344     RETURN (TRUE);
345 
346 EXCEPTION
347     WHEN OTHERS THEN
348         FA_SRVR_MSG.Add_SQL_Error(
349                 CALLING_FN =>  'FA_REC_PVT_PKG5.Check_Trans_Date', p_log_level_rec => p_log_level_rec);
350         RETURN (FALSE);
351 END Check_Trans_Date;
352 
353 
354 END FA_REC_PVT_PKG1;