[Home] [Help]
PACKAGE BODY: APPS.FARX_MCR
Source
1 PACKAGE BODY FARX_MCR AS
2 /* $Header: FARXMCRB.pls 120.5 2009/04/09 05:55:06 deemitta ship $ */
3
4
5 -- Mass change record from fa_mass_changes table.
6 mc_rec FA_MASS_CHG_UTILS_PKG.mass_change_rec_type;
7
8 -- Table of asset records.
9 -- (Stores book_type_code as well, and thus one asset will appear multiple
10 -- times if the asset belongs to multiple books.)
11 a_tbl FA_MASS_CHG_UTILS_PKG.asset_tbl_type;
12
13 -- Index into the asset table, a_tbl.
14 a_index NUMBER := 0;
15
16 -- Number of assets(disregaring book_type_code) stored in a_tbl.
17 -- Reset at every 200 assets.
18 g_asset_count NUMBER := 0;
19
20 /* a_index <> g_asset_count if asset belongs to more than one book. */
21
22 g_print_debug boolean := fa_cache_pkg.fa_print_debug;
23
24
25 /*============================================================================+
26 | PROCEDURE Review_Change |
27 +=============================================================================*/
28
29 PROCEDURE Review_Change(
30 X_Mass_Change_Id IN NUMBER,
31 X_RX_Flag IN VARCHAR2 := 'NO',
32 retcode OUT NOCOPY NUMBER,
33 errbuf OUT NOCOPY VARCHAR2) IS
34
35 -- cursor to fetch the current and review status
36 CURSOR get_status IS
37 SELECT lu_rev.meaning,
41 WHERE lu_rev.lookup_type = 'MASS_TRX_STATUS' AND
38 lu_curr.meaning
39 FROM fa_lookups lu_rev,
40 fa_lookups lu_curr
42 lu_rev.lookup_code = 'COMPLETED'
43 AND lu_curr.lookup_type = 'MASS_TRX_STATUS' AND
44 lu_curr.lookup_code = mc_rec.status;
45
46 -- cursor to get category flexfield structure.
47 CURSOR get_cat_flex_struct IS
48 SELECT category_flex_structure
49 FROM fa_system_controls;
50
51 -- cursor to fetch mass change record from fa_mass_change
52 CURSOR mass_change IS
53 SELECT mc.mass_change_id,
54 mc.book_type_code,
55 mc.transaction_date_entered,
56 mc.concurrent_request_id,
57 mc.status,
58 mc.asset_type,
59 mc.category_id,
60 mc.from_asset_number,
61 mc.to_asset_number,
62 mc.from_date_placed_in_service,
63 mc.to_date_placed_in_service,
64 mc.from_convention,
65 mc.to_convention,
66 mc.from_method_code,
67 mc.to_method_code,
68 mc.from_life_in_months,
69 mc.to_life_in_months,
70 mc.from_bonus_rule,
71 mc.to_bonus_rule,
72 mc.date_effective,
73 mc.from_basic_rate,
74 mc.to_basic_rate,
75 mc.from_adjusted_rate,
76 mc.to_adjusted_rate,
77 mc.from_production_capacity,
78 mc.to_production_capacity,
79 mc.from_uom,
80 mc.to_uom,
81 mc.from_group_association,
82 mc.to_group_association,
83 mc.from_group_asset_id,
84 mc.to_group_asset_id,
85 gad1.asset_number,
86 gad2.asset_number,
87 mc.change_fully_rsvd_assets,
88 mc.amortize_flag,
89 mc.created_by,
90 mc.creation_date,
91 mc.last_updated_by,
92 mc.last_update_login,
93 mc.last_update_date,
94 mc.from_salvage_type,
95 mc.to_salvage_type,
96 mc.from_percent_salvage_value,
97 mc.to_percent_salvage_value,
98 mc.from_salvage_value,
99 mc.to_salvage_value,
100 mc.from_deprn_limit_type,
101 mc.to_deprn_limit_type,
102 mc.from_deprn_limit,
103 mc.to_deprn_limit,
104 mc.from_deprn_limit_amount,
105 mc.to_deprn_limit_amount
106 FROM fa_mass_changes mc,
107 fa_additions_b gad1,
108 fa_additions_b gad2
109 WHERE mass_change_id = X_Mass_Change_Id
110 AND mc.from_group_asset_id = gad1.asset_id(+)
111 AND mc.to_group_asset_id = gad2.asset_id(+);
112
113 -- asset-book records that were changed by mass change
114
115 CURSOR mass_change_assets IS
116 SELECT ad.asset_id,
117 ad.asset_number,
118 ad.description,
119 ad.asset_type,
120 bk1.book_type_code,
121 ad.asset_category_id,
122 NULL,
123 bk1.prorate_convention_code,
124 bk2.prorate_convention_code,
125 bk1.deprn_method_code,
126 bk2.deprn_method_code,
127 bk1.life_in_months,
128 bk2.life_in_months,
129 NULL,
130 NULL,
131 bk1.basic_rate,
132 bk2.basic_rate,
133 NULL,
134 NULL,
135 bk1.adjusted_rate,
136 bk2.adjusted_rate,
137 NULL,
138 NULL,
139 bk1.bonus_rule,
140 bk2.bonus_rule,
141 bk1.production_capacity,
142 bk2.production_capacity,
143 bk1.unit_of_measure,
144 bk2.unit_of_measure,
145 gad1.asset_number,
146 gad2.asset_number,
147 bk1.salvage_type,
148 bk2.salvage_type,
149 bk1.percent_salvage_value,
150 bk2.percent_salvage_value,
151 bk1.salvage_value,
152 bk2.salvage_value,
153 bk1.deprn_limit_type,
154 bk2.deprn_limit_type,
155 bk1.allowed_deprn_limit,
156 bk2.allowed_deprn_limit,
157 bk1.allowed_deprn_limit_amount,
158 bk2.allowed_deprn_limit_amount
159 FROM fa_books bk1,
160 fa_books bk2,
161 fa_additions ad,
162 fa_additions_b gad1,
163 fa_additions_b gad2,
164 fa_transaction_headers th
165 WHERE th.mass_transaction_id = mc_rec.mass_change_id
166 AND th.member_transaction_header_id is null -- exclude the spawned adjustments on groups
167 AND ad.asset_id = th.asset_id
168 AND bk1.asset_id = th.asset_id
169 AND bk2.asset_id = th.asset_id
170 AND bk1.book_type_code = th.book_type_code
171 AND bk2.book_type_code = th.book_type_code
172 AND bk1.transaction_header_id_out = th.transaction_header_id
173 AND bk2.transaction_header_id_in = th.transaction_header_id
174 AND bk1.group_asset_id = gad1.asset_id(+)
175 AND bk2.group_asset_id = gad2.asset_id(+)
176 ORDER BY ad.asset_number;
177
181 h_request_id NUMBER;
178 -- to store th.transaction_header_id in the cursor above.
179 h_mch_thid NUMBER(15);
180
182 h_msg_count NUMBER;
183 h_msg_data VARCHAR2(2000) := NULL;
184 -- Bug#6870987 Resetting Variable size.
185 h_review_status_d VARCHAR2(50);
186 h_current_status_d VARCHAR2(50);
187 h_cat_flex_struct NUMBER;
188 h_cat_segs FA_RX_SHARED_PKG.Seg_Array;
189 h_category_id NUMBER(15) := NULL;
190 h_concat_cat VARCHAR2(1000);
191 h_debug_flag VARCHAR2(20) := 'NO';
192
193 -- to keep track of the last asset id that entered the mass_change_assets
194 -- cursor loop.
195 h_last_asset NUMBER(15) := NULL;
196
197 -- indicates whether the book information was found. used only when
198 -- redefault option was set to YES.
199 h_bk_info_found BOOLEAN;
200
201 -- exception raised from this module and child modules.
202 mchg_failure EXCEPTION;
203
204 -- Commit results per every 200 assets.
205 h_commit_level NUMBER := 200;
206 -- Bug#6870987 Resetting Variable size.
207 /* do not need these variables as per bug 8402286
208 need to remove large rollback segment
209 rbs_name VARCHAR2(60);
210 sql_stmt VARCHAR2(500);
211 */
212
213 BEGIN
214
215 -- Initialize message stacks.
216 FA_SRVR_MSG.Init_Server_Message;
217 FA_DEBUG_PKG.Initialize;
218
219 /* Bug 8402286 removing LARGE ROLLBACK SEGMENT
220 -- Set large rollback segment.
221 fnd_profile.get('FA_LARGE_ROLLBACK_SEGMENT', rbs_name);
222 IF (rbs_name is not null) THEN
223 sql_stmt := 'Set Transaction Use Rollback Segment '|| rbs_name;
224 execute immediate sql_stmt;
225 END IF;
226 */
227 -- Initialize global variables.
228 -- (These are session specific variables, and thus values need to
229 -- be re-initialized.)
230 a_tbl.delete;
231 a_index := 0;
232 g_asset_count := 0;
233
234 -- Get concurrent request id for the mass change review request.
235 -- h_request_id is used when request_id is inserted into the interface
236 -- table, fa_mass_changes_itf.
237 -- Need to fetch request id from fnd_global package instead of fa_mass_changes
238 -- table, since fa_mass_changes table stores the latest request id for
239 -- the Preview or Run requests only.
240 h_request_id := fnd_global.conc_request_id;
241
242 -- Fetch mass changes record information.
243 OPEN mass_change;
244 FETCH mass_change INTO
245 mc_rec.mass_change_id,
246 mc_rec.book_type_code,
247 mc_rec.transaction_date_entered,
248 mc_rec.concurrent_request_id,
249 mc_rec.status,
250 mc_rec.asset_type,
251 mc_rec.category_id,
252 mc_rec.from_asset_number,
253 mc_rec.to_asset_number,
254 mc_rec.from_date_placed_in_service,
255 mc_rec.to_date_placed_in_service,
256 mc_rec.from_convention,
257 mc_rec.to_convention,
258 mc_rec.from_method_code,
259 mc_rec.to_method_code,
260 mc_rec.from_life_in_months,
261 mc_rec.to_life_in_months,
262 mc_rec.from_bonus_rule,
263 mc_rec.to_bonus_rule,
264 mc_rec.date_effective,
265 mc_rec.from_basic_rate,
266 mc_rec.to_basic_rate,
267 mc_rec.from_adjusted_rate,
268 mc_rec.to_adjusted_rate,
269 mc_rec.from_production_capacity,
270 mc_rec.to_production_capacity,
271 mc_rec.from_uom,
272 mc_rec.to_uom,
273 mc_rec.from_group_association,
274 mc_rec.to_group_association,
275 mc_rec.from_group_asset_id,
276 mc_rec.to_group_asset_id,
277 mc_rec.from_group_asset_number,
278 mc_rec.to_group_asset_number,
279 mc_rec.change_fully_rsvd_assets,
280 mc_rec.amortize_flag,
281 mc_rec.created_by,
282 mc_rec.creation_date,
283 mc_rec.last_updated_by,
284 mc_rec.last_update_login,
285 mc_rec.last_update_date,
286 mc_rec.from_salvage_type,
287 mc_rec.to_salvage_type,
288 mc_rec.from_percent_salvage_value,
289 mc_rec.to_percent_salvage_value,
290 mc_rec.from_salvage_value,
291 mc_rec.to_salvage_value,
292 mc_rec.from_deprn_limit_type,
293 mc_rec.to_deprn_limit_type,
294 mc_rec.from_deprn_limit,
295 mc_rec.to_deprn_limit,
296 mc_rec.from_deprn_limit_amount,
297 mc_rec.to_deprn_limit_amount;
298 CLOSE mass_change;
299
300 if not(fa_cache_pkg.fazcbc(X_book => mc_rec.book_type_code)) then
301 raise mchg_failure;
302 end if;
303
304 g_print_debug := fa_cache_pkg.fa_print_debug;
305
306 -- Set debug flag.
307 IF (g_print_debug) THEN
308 h_debug_flag := 'YES';
309 END IF;
310
311 /*===========================================================================
312 Delete rows previously inserted into the interface table with the same
313 request id, if there is any.
314 ===========================================================================*/
318
315 DELETE FROM fa_mass_changes_itf
316 WHERE request_id = h_request_id;
317 COMMIT;
319 /*===========================================================================
320 Check to make sure current status is 'COMPLETED'
321 ===========================================================================*/
322 OPEN get_status;
323 FETCH get_status INTO h_review_status_d, h_current_status_d;
324 CLOSE get_status;
325
326 if g_print_debug then
327 fa_debug_pkg.add('FARX_CR.Review_Change',
328 'After fetching status',
329 '');
330 end if;
331
332 IF (h_review_status_d <> h_current_status_d) THEN
333 -- Re-using message for mass changes program.
334 FA_SRVR_MSG.Add_Message(
335 CALLING_FN => 'FARX_RR.Review_Change',
336 NAME => 'FA_MASSRCL_WRONG_STATUS',
337 TOKEN1 => 'CURRENT',
338 VALUE1 => h_current_status_d,
339 TOKEN2 => 'RUNNING',
340 VALUE2 => h_review_status_d);
341 -- Review will complete with error status.
342 RAISE mchg_failure;
343 END IF;
344
345 /*===========================================================================
346 Insert review records into the interface table.
347 ===========================================================================*/
348
349 if g_print_debug then
350 fa_debug_pkg.add('FARX_CR.Review_Change',
351 'getting cat structure',
352 '');
353 end if;
354
355
356 /* Get category flex structure. */
357 OPEN get_cat_flex_struct;
358 FETCH get_cat_flex_struct INTO h_cat_flex_struct;
359 CLOSE get_cat_flex_struct;
360
361 OPEN mass_change_assets;
362
363 LOOP
364
365 if g_print_debug then
366 fa_debug_pkg.add('FARX_CR.Review_Change',
367 'in loop',
368 '');
369 end if;
370
371 -- Fetch the asset-book pair into the pl/sql table.
372 a_index := a_index + 1;
373
374 FETCH mass_change_assets INTO
375 a_tbl(a_index).asset_id,
376 a_tbl(a_index).asset_number,
377 a_tbl(a_index).description,
378 a_tbl(a_index).asset_type,
379 a_tbl(a_index).book_type_code,
380 a_tbl(a_index).category_id,
381 a_tbl(a_index).category,
382 a_tbl(a_index).from_convention,
383 a_tbl(a_index).to_convention,
384 a_tbl(a_index).from_method,
385 a_tbl(a_index).to_method,
386 a_tbl(a_index).from_life_in_months,
387 a_tbl(a_index).to_life_in_months,
388 a_tbl(a_index).from_life,
389 a_tbl(a_index).to_life,
390 a_tbl(a_index).from_basic_rate,
391 a_tbl(a_index).to_basic_rate,
392 a_tbl(a_index).from_basic_rate_pct,
393 a_tbl(a_index).to_basic_rate_pct,
394 a_tbl(a_index).from_adjusted_rate,
395 a_tbl(a_index).to_adjusted_rate,
396 a_tbl(a_index).from_adjusted_rate_pct,
397 a_tbl(a_index).to_adjusted_rate_pct,
398 a_tbl(a_index).from_bonus_rule,
399 a_tbl(a_index).to_bonus_rule,
400 a_tbl(a_index).from_capacity,
401 a_tbl(a_index).to_capacity,
402 a_tbl(a_index).from_unit_of_measure,
403 a_tbl(a_index).to_unit_of_measure,
404 a_tbl(a_index).from_group_asset_number,
405 a_tbl(a_index).to_group_asset_number,
406 a_tbl(a_index).from_salvage_type,
407 a_tbl(a_index).to_salvage_type,
408 a_tbl(a_index).from_percent_salvage_value,
409 a_tbl(a_index).to_percent_salvage_value,
410 a_tbl(a_index).from_salvage_value,
411 a_tbl(a_index).to_salvage_value,
412 a_tbl(a_index).from_deprn_limit_type,
413 a_tbl(a_index).to_deprn_limit_type,
414 a_tbl(a_index).from_deprn_limit,
415 a_tbl(a_index).to_deprn_limit,
416 a_tbl(a_index).from_deprn_limit_amount,
417 a_tbl(a_index).to_deprn_limit_amount;
418 EXIT WHEN mass_change_assets%NOTFOUND;
419
420 -- Get category in concatenated string format.
421 FA_RX_SHARED_PKG.Concat_Category(
422 struct_id => h_cat_flex_struct,
423 ccid => a_tbl(a_index).category_id,
424 concat_string => a_tbl(a_index).category,
425 segarray => h_cat_segs);
426 h_concat_cat := a_tbl(a_index).category;
427
428 -- Convert formats for certain fields.
429
430 -- life...
431 -- Need to get the substring from the second position, since
432 -- to_char conversion with the format, always attaches extra space
433 -- at the beginning of the string.
434
435 IF a_tbl(a_index).From_Life_In_Months IS NOT NULL THEN
436 a_tbl(a_index).From_Life := lpad(to_char(trunc(a_tbl(a_index).From_Life_In_Months/12)), 3)||'.'||
437 substr(to_char(mod(a_tbl(a_index).From_Life_In_Months, 12), '00'), 2, 2);
438 ELSE
439 a_tbl(a_index).From_Life := NULL;
440 END IF;
441
442 IF a_tbl(a_index).To_Life_In_Months IS NOT NULL THEN
443 a_tbl(a_index).To_Life := lpad(to_char(trunc(a_tbl(a_index).To_Life_In_Months/12)), 3)||'.'||
444 substr(to_char(mod(a_tbl(a_index).To_Life_In_Months, 12), '00'), 2, 2);
445 ELSE
446 a_tbl(a_index).To_Life := NULL;
447 END IF;
448
449 -- rates...
450 -- May use the following format in report output:
454 IF a_tbl(a_index).From_Basic_Rate IS NOT NULL THEN
451 -- substr(to_char(round(a_tbl(a_index).From_Basic_Rate*100, 2), '999.99'), 2, 6) or
452 -- lpad(to_char(round(a_tbl(a_index).From_Basic_Rate*100, 2)), 6)
453
455 a_tbl(a_index).From_Basic_Rate_Pct := round(a_tbl(a_index).From_Basic_Rate*100, 2);
456 ELSE
457 a_tbl(a_index).From_Basic_Rate_Pct := NULL;
458 END IF;
459
460 IF a_tbl(a_index).To_Basic_Rate IS NOT NULL THEN
461 a_tbl(a_index).To_Basic_Rate_Pct := round(a_tbl(a_index).To_Basic_Rate*100, 2);
462 ELSE
463 a_tbl(a_index).To_Basic_Rate_Pct := NULL;
464 END IF;
465
466 IF a_tbl(a_index).From_Adjusted_Rate IS NOT NULL THEN
467 a_tbl(a_index).From_Adjusted_Rate_Pct := round(a_tbl(a_index).From_Adjusted_Rate*100, 2);
468 ELSE
469 a_tbl(a_index).From_Adjusted_Rate_Pct := NULL;
470 END IF;
471
472 IF a_tbl(a_index).To_Adjusted_Rate IS NOT NULL THEN
473 a_tbl(a_index).To_Adjusted_Rate_Pct := round(a_tbl(a_index).To_Adjusted_Rate*100, 2);
474 ELSE
475 a_tbl(a_index).To_Adjusted_Rate_Pct := NULL;
476 END IF;
477
478
479
480
481 -- Update last asset processed and the asset count.
482 IF (a_tbl(a_index).asset_id <> h_last_asset OR
483 h_last_asset IS NULL) THEN
484 h_last_asset := a_tbl(a_index).asset_id;
485 g_asset_count := g_asset_count + 1;
486 END IF;
487
488 /* Insert asset records into the interface table, FA_MASS_CHANGES_ITF,
489 at every 200 assets and re-initialize the counter and the asset table. */
490 -- If the 200th asset belongs to more than one book, only the information
491 -- for the first book of this asset will be inserted into the table.
492 -- The rest will be taken care of in the next insertion.
493
494 IF (g_asset_count = h_commit_level) THEN
495 FOR i IN 1 .. a_index LOOP
496 FA_MASS_CHG_UTILS_PKG.Insert_Itf(
497 X_Report_Type => 'REVIEW',
498 X_Request_Id => h_request_id,
499 X_Mass_Change_Id => X_Mass_Change_Id,
500 X_Asset_Rec => a_tbl(i),
501 X_Last_Update_Date => mc_rec.last_update_date,
502 X_Last_Updated_By => mc_rec.last_updated_by,
503 X_Created_By => mc_rec.created_by,
504 X_Creation_Date => mc_rec.creation_date,
505 X_Last_Update_Login => mc_rec.last_update_login,
506 p_log_level_rec => null
507 );
508 END LOOP;
509
510 a_tbl.delete;
511 g_asset_count := 0;
512 a_index := 0;
513 -- Also re-initialize h_last_asset so that g_asset_count
514 -- is incremented to 1 at the next loop entry as in the former
515 -- insertion.
516 h_last_asset := NULL;
517 COMMIT WORK;
518
519 END IF;
520
521 END LOOP;
522
523 CLOSE mass_change_assets;
524
525 /* Insert the remaining asset records into the interface table. */
526 -- Up to a_index - 1, to account for the extra increment taken for a_index
527 -- when no more rows were found in the cursor loop.
528 FOR i IN 1 .. (a_index - 1) LOOP
529 FA_MASS_CHG_UTILS_PKG.Insert_Itf(
530 X_Report_Type => 'REVIEW',
531 X_Request_Id => h_request_id,
532 X_Mass_Change_Id => X_Mass_Change_Id,
533 X_Asset_Rec => a_tbl(i),
534 X_Last_Update_Date => mc_rec.last_update_date,
535 X_Last_Updated_By => mc_rec.last_updated_by,
536 X_Created_By => mc_rec.created_by,
537 X_Creation_Date => mc_rec.creation_date,
538 X_Last_Update_Login => mc_rec.last_update_login,
539 p_log_level_rec => null
540 );
541
542 END LOOP;
543
544 a_tbl.delete;
545 g_asset_count := 0;
546 a_index := 0;
547
548 fa_rx_conc_mesg_pkg.log('');
549 fnd_message.set_name('OFA', 'FA_MASSRCL_CHG_RVW');
550 h_msg_data := fnd_message.get;
551 fa_rx_conc_mesg_pkg.log(h_msg_data);
552 fa_rx_conc_mesg_pkg.log('');
553 COMMIT WORK;
554
555
556 FND_MSG_PUB.Count_And_Get(
557 p_count => h_msg_count,
558 p_data => h_msg_data);
559 FA_SRVR_MSG.Write_Msg_Log(
560 msg_count => h_msg_count,
561 msg_data => h_msg_data);
562 IF (h_debug_flag = 'YES') THEN
563 FA_DEBUG_PKG.Write_Debug_Log;
564 END IF;
565
566 errbuf := ''; -- No error.
567 retcode := 0; -- Completed normally.
568
569 EXCEPTION
570 WHEN mchg_failure THEN
571 retcode := 2; -- Completed with error.
572
573 -- Reset global variable values.
574 a_tbl.delete;
575 a_index := 0;
576 g_asset_count := 0;
577 /* A fatal error has occurred. Rollback transaction. */
578 ROLLBACK WORK;
579 /* Delete rows inserted into the interface table. */
580 DELETE FROM fa_mass_changes_itf
581 WHERE request_id = h_request_id;
582 /* Commit changes. */
583 COMMIT WORK;
584 /* Retrieve message log and write result to log and output. */
585
586 IF (X_RX_Flag = 'YES') THEN
587 FND_MSG_PUB.Count_And_Get(
588 p_count => h_msg_count,
589 p_data => h_msg_data);
590 FA_SRVR_MSG.Write_Msg_Log(
591 msg_count => h_msg_count,
592 msg_data => h_msg_data);
593 IF (h_debug_flag = 'YES') THEN
594 FA_DEBUG_PKG.Write_Debug_Log;
595 END IF;
596 END IF;
597 WHEN OTHERS THEN
598 retcode := 2; -- Completed with error.
599 IF SQLCODE <> 0 THEN
600 FA_SRVR_MSG.Add_SQL_Error(CALLING_FN => 'FARX_RP.Review_Change');
601 END IF;
602
603 -- Reset global variable values.
604 a_tbl.delete;
605 a_index := 0;
606 g_asset_count := 0;
607 --g_total_assets := 0;
608 /* A fatal error has occurred. Rollback transaction. */
609 ROLLBACK WORK;
610 /* Delete rows inserted into the interface table. */
611 DELETE FROM fa_mass_changes_itf
612 WHERE request_id = h_request_id;
613 /* Commit changes. */
614 COMMIT WORK;
615 /* Retrieve message log and write result to log and output. */
616 IF (X_RX_Flag = 'YES') THEN
617 FND_MSG_PUB.Count_And_Get(
618 p_count => h_msg_count,
619 p_data => h_msg_data);
620 FA_SRVR_MSG.Write_Msg_Log(
621 msg_count => h_msg_count,
622 msg_data => h_msg_data);
623 IF (h_debug_flag = 'YES') THEN
624 FA_DEBUG_PKG.Write_Debug_Log;
625 END IF;
626 END IF;
627
628 END Review_Change;
629
630 END FARX_MCR;