[Home] [Help]
PACKAGE BODY: APPS.FII_BUDGET_FORECAST_C
Source
1 PACKAGE BODY FII_BUDGET_FORECAST_C AS
2 /* $Header: FIIBUUPB.pls 120.59 2007/09/11 09:10:41 wywong ship $ */
3
4 g_retcode VARCHAR2(20) := NULL;
5 g_phase VARCHAR2(120);
6
7 /************************************************************************
8 PRIVATE FUNCIONTS
9 ************************************************************************/
10
11 -------------------------------------------------------------------------------
12
13 -- Procedure
14 -- Purge_All
15 -- Purpose
16 -- This routine will purge all records for the given plan type
17 -- from FII_BUDGET_BASE. Then it will reset the truncation
18 -- flag and profile option setting in FII_CHANGE_LOG.
19 -- History
20 -- 06-20-02 S Kung Created
21 -- Arguments
22 -- None
23 -- Example
24 -- result := FII_BUDGET_FORECAST_C.Purge_All;
25 -- Notes
26 --
27 FUNCTION Purge_All RETURN BOOLEAN IS
28 FIIBUUP_fatal_err EXCEPTION;
29
30 BEGIN
31
32 IF (FIIBUUP_DEBUG) THEN
33 FII_MESSAGE.Func_Ent('FII_BUDGET_FORECAST_C.Purge_All');
34 END IF;
35
36 -- Purge all records from FII_BUDGET_BASE for the specified plan type
37 IF (FIIBUUP_DEBUG) THEN
38 FII_MESSAGE.Write_Log
39 (msg_name => 'FII_ROUTINE',
40 token_num => 2,
41 t1 => 'ROUTINE',
42 v1 => 'Purge_All()',
43 t2 => 'ACTION',
44 v2 => 'Purging all records from FII_BUDGET_BASE...');
45 END IF;
46
47 g_phase := 'delete from FII_BUDGET_BASE';
48 DELETE from FII_BUDGET_BASE
49 WHERE plan_type_code = FIIBUUP_PURGE_PLAN_TYPE;
50
51 IF (FIIBUUP_DEBUG) THEN
52 FII_MESSAGE.Write_Log
53 (msg_name => 'FII_DEL_REC',
54 token_num => 2,
55 t1 => 'NUM',
56 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
57 t2 => 'TABLE',
58 v2 => 'FII_BUDGET_BASE');
59 END IF;
60
61 -- Reset truncation indicator back to normal and
62 -- update FII_CHANGE_LOG to reflect latest profile setting
63 IF (FIIBUUP_DEBUG) THEN
64 FII_MESSAGE.Write_Log
65 (msg_name => 'FII_ROUTINE',
66 token_num => 2,
67 t1 => 'ROUTINE',
68 v1 => 'Purge_All()',
69 t2 => 'ACTION',
70 v2 => 'Resetting FII_CHANGE_LOG...');
71 END IF;
72
73 g_phase := 'Update FII_CHANGE_LOG';
74 IF (FIIBUUP_PURGE_PLAN_TYPE = 'B') THEN
75 UPDATE FII_CHANGE_LOG
76 SET item_value = 'N',
77 last_update_date = SYSDATE,
78 last_updated_by = FIIBUUP_USER_ID,
79 last_update_login = FIIBUUP_LOGIN_ID
80 WHERE log_item = 'TRUNCATE_BUDGET';
81
82 IF (FIIBUUP_DEBUG) THEN
83 FII_MESSAGE.Write_Log
84 (msg_name => 'FII_UPD_REC',
85 token_num => 2,
86 t1 => 'NUM',
87 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
88 t2 => 'TABLE',
89 v2 => 'FII_CHANGE_LOG');
90 END IF;
91
92 UPDATE FII_CHANGE_LOG
93 SET item_value = FIIBUUP_BUDGET_TIME_UNIT,
94 last_update_date = SYSDATE,
95 last_updated_by = FIIBUUP_USER_ID,
96 last_update_login = FIIBUUP_LOGIN_ID
97 WHERE log_item = 'BUDGET_TIME_UNIT';
98
99 IF (FIIBUUP_DEBUG) THEN
100 FII_MESSAGE.Write_Log
101 (msg_name => 'FII_UPD_REC',
102 token_num => 2,
103 t1 => 'NUM',
104 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
105 t2 => 'TABLE',
106 v2 => 'FII_CHANGE_LOG');
107 END IF;
108
109 ELSIF (FIIBUUP_PURGE_PLAN_TYPE = 'F') THEN
110 UPDATE FII_CHANGE_LOG
111 SET item_value = 'N',
112 last_update_date = SYSDATE,
113 last_updated_by = FIIBUUP_USER_ID,
114 last_update_login = FIIBUUP_LOGIN_ID
115 WHERE log_item = 'TRUNCATE_FORECAST';
116
117 IF (FIIBUUP_DEBUG) THEN
118 FII_MESSAGE.Write_Log
119 (msg_name => 'FII_UPD_REC',
120 token_num => 2,
121 t1 => 'NUM',
122 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
123 t2 => 'TABLE',
124 v2 => 'FII_CHANGE_LOG');
125 END IF;
126
127 UPDATE FII_CHANGE_LOG
128 SET item_value = FIIBUUP_FORECAST_TIME_UNIT,
129 last_update_date = SYSDATE,
130 last_updated_by = FIIBUUP_USER_ID,
131 last_update_login = FIIBUUP_LOGIN_ID
132 WHERE log_item = 'FORECAST_TIME_UNIT';
133
134 IF (FIIBUUP_DEBUG) THEN
135 FII_MESSAGE.Write_Log
136 (msg_name => 'FII_UPD_REC',
137 token_num => 2,
138 t1 => 'NUM',
139 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
140 t2 => 'TABLE',
141 v2 => 'FII_CHANGE_LOG');
142 END IF;
143
144 END IF;
145
146 -- Commit everything to database before returning
147 FND_CONCURRENT.Af_Commit;
148
149 IF (FIIBUUP_DEBUG) THEN
150 FII_MESSAGE.Func_Succ('FII_BUDGET_FORECAST_C.Purge_All');
151 END IF;
152 RETURN TRUE;
153
154 -- Exception handling
155 EXCEPTION
156 WHEN FIIBUUP_fatal_err THEN
157
158 FND_CONCURRENT.Af_Rollback;
159
160 FII_MESSAGE.Write_Log
161 (msg_name => 'FII_ERR_ENC_ROUT',
162 token_num => 1,
163 t1 => 'ROUTINE_NAME',
164 v1 => 'FII_BUDGET_FORECAST_C.Purge_All()');
165
166
167 FII_MESSAGE.Func_Fail
168 (func_name =>'FII_BUDGET_FORECAST_C.Purge_All');
169
170 fii_util.put_line ('Phase: ' || g_phase ||
171 'Error: ' || sqlerrm);
172
173 RETURN FALSE;
174
175 WHEN OTHERS THEN
176
177 FND_CONCURRENT.Af_Rollback;
178
179 FII_MESSAGE.Write_Log
180 (msg_name => 'FII_ERROR',
181 token_num => 2,
182 t1 => 'FUNCTION',
183 v1 => 'FII_BUDGET_FORECAST_C.Purge_All()',
184 t2 => 'SQLERRMC',
185 v2 => SQLERRM);
186
187 FII_MESSAGE.Func_Fail
188 (func_name => 'FII_BUDGET_FORECAST_C.Purge_All');
189
190 fii_util.put_line ('Phase: ' || g_phase ||
191 'Error: ' || sqlerrm);
192
193 RETURN FALSE;
194
195 END Purge_All;
196
197 -------------------------------------------------------------------------------
198
199 -- Procedure
200 -- Purge_Partial
201 -- Purpose
202 -- This routine will purge all records for the given plan type
203 -- in a given time period from FII_BUDGET_BASE.
204 -- History
205 -- 06-20-02 S Kung Created
206 -- Arguments
207 -- None
208 -- Example
209 -- result := FII_BUDGET_FORECAST_C.Purge_Partial;
210 -- Notes
211 --
212 FUNCTION Purge_Partial RETURN BOOLEAN IS
213 FIIBUUP_fatal_err EXCEPTION;
214 l_time_period_valid BOOLEAN := TRUE;
215 l_purge_time_id NUMBER(15) := NULL;
216 l_purge_period_type_id NUMBER(15) := NULL;
217 l_sqlstmt VARCHAR2(5000) := NULL;
218
219 BEGIN
220
221 IF (FIIBUUP_DEBUG) THEN
222 FII_MESSAGE.Func_Ent('FII_BUDGET_FORECAST_C.Purge_Partial');
223 END IF;
224
225 -- Check if the specified time period is valid
226 IF (FIIBUUP_DEBUG) THEN
227 FII_MESSAGE.Write_Log
228 (msg_name => 'FII_ROUTINE',
229 token_num => 2,
230 t1 => 'ROUTINE',
231 v1 => 'Purge_Partial()',
232 t2 => 'ACTION',
233 v2 => 'Check if time period is valid...');
234 END IF;
235
236 g_phase := 'Get time information';
237 IF (FIIBUUP_PURGE_TIME_UNIT = 'D') THEN
238 BEGIN
239 SELECT report_date_julian
240 INTO l_purge_time_id
241 FROM FII_TIME_DAY
242 WHERE report_date = FIIBUUP_PURGE_DATE;
243 EXCEPTION
244 WHEN NO_DATA_FOUND THEN
245 l_time_period_valid := FALSE;
246 END;
247
248 l_purge_period_type_id := 1;
249
250 ELSIF (FIIBUUP_PURGE_TIME_UNIT = 'P') THEN
251 BEGIN
252 SELECT ent_period_id
253 INTO l_purge_time_id
254 FROM FII_TIME_ENT_PERIOD
255 WHERE name = FIIBUUP_PURGE_TIME_PERIOD;
256 EXCEPTION
257 WHEN NO_DATA_FOUND THEN
258 l_time_period_valid := FALSE;
259 END;
260
261 l_purge_period_type_id := 32;
262
263 ELSIF (FIIBUUP_PURGE_TIME_UNIT = 'Q') THEN
264 BEGIN
265 SELECT ent_qtr_id
266 INTO l_purge_time_id
267 FROM FII_TIME_ENT_QTR
268 WHERE name = FIIBUUP_PURGE_TIME_PERIOD;
269 EXCEPTION
270 WHEN NO_DATA_FOUND THEN
271 l_time_period_valid := FALSE;
272 END;
273
274 l_purge_period_type_id := 64;
275
276 ELSIF (FIIBUUP_PURGE_TIME_UNIT = 'Y') THEN
277 BEGIN
278 SELECT ent_year_id
279 INTO l_purge_time_id
280 FROM FII_TIME_ENT_YEAR
281 WHERE name = FIIBUUP_PURGE_TIME_PERIOD;
282 EXCEPTION
283 WHEN NO_DATA_FOUND THEN
284 l_time_period_valid := FALSE;
285 END;
286
287 l_purge_period_type_id := 128;
288
289 END IF;
290
291 g_phase := 'Build SQL statement';
292 -- First, subtract the purge amount from their respective rollup records
293 l_sqlstmt := 'UPDATE FII_BUDGET_BASE b ' ||
294 'SET (b.prim_amount_g, b.sec_amount_g, ' ||
295 'b.prim_amount_total, b.sec_amount_total, '||
296 'b.last_update_date, b.last_updated_by, ' ||
297 'b.last_update_login) = ' ||
298 '(SELECT (b.prim_amount_g-SUM(b2.prim_amount_g)), ' ||
299 '(b.sec_amount_g-SUM(b2.sec_amount_g)), '||
300 '(b.prim_amount_total-SUM(b2.prim_amount_total)), '||
301 '(b.sec_amount_total-SUM(b2.sec_amount_total)), '||
302 'SYSDATE, ' ||
303 ':user_id, :login_id ' ||
304 'FROM FII_BUDGET_BASE b2 ' ||
305 'WHERE b2.plan_type_code = b.plan_type_code ' ||
306 'AND b2.ledger_id = b.ledger_id '||
307 'AND b2.company_id = b.company_id '||
308 'AND b2.cost_center_id = b.cost_center_id '||
309 'AND b2.fin_category_id = b.fin_category_id ' ||
310 'AND NVL(b2.category_id, -1) = NVL(b.category_id, -1) ' ||
311 'AND b2.user_dim1_id = b.user_dim1_id '||
312 'AND b2.time_id = :l_purge_time_id ' ||
313 'AND b2.period_type_id = :l_purge_period_type_id '||
314 'AND b2.plan_type_code = :plan_type_code '||
315 'AND NVL(b2.version_date, :global_start_date) = NVL(b.version_date, :global_start_date)) ' ||
316 'WHERE b.time_id IN ' ;
317
318 IF (FIIBUUP_PURGE_TIME_UNIT = 'D') THEN
319
320 -- Bug fix 2653837
321 -- Added new conditions to account for WEEK
322
323 l_sqlstmt := l_sqlstmt ||
324 '(SELECT DECODE(glrm.multiplier, 1, d.week_id, ' ||
325 '2, d.ent_period_id, 3, d.ent_qtr_id, 4, d.ent_year_id) ' ||
326 'FROM GL_ROW_MULTIPLIERS glrm, FII_TIME_DAY d ' ||
327 'WHERE glrm.multiplier BETWEEN 1 AND 4 ' ||
328 'AND d.report_date_julian = :l_purge_time_id) ';
329
330 ELSIF (FIIBUUP_PURGE_TIME_UNIT = 'P') THEN
331 l_sqlstmt := l_sqlstmt ||
332 '(ROUND(:l_purge_time_id/100), ROUND(:l_purge_time_id/1000)) ';
333 ELSIF (FIIBUUP_PURGE_TIME_UNIT = 'Q') THEN
334 l_sqlstmt := l_sqlstmt ||
335 '(ROUND(:l_purge_time_id/10)) ';
336 END IF; -- No need to perform subtraction if purging yearly data
337
338 l_sqlstmt := l_sqlstmt ||
339 'AND (b.plan_type_code, ' ||
340 'b.ledger_id, '||
341 'b.company_id, '||
342 'b.cost_center_id, '||
343 'b.fin_category_id, ' ||
344 'NVL(b.category_id, -1), '||
345 'b.user_dim1_id, '||
346 'NVL(b.version_date, :global_start_date)) IN ' ||
347 '(SELECT b3.plan_type_code, ' ||
348 'b3.ledger_id, '||
349 'b3.company_id, '||
350 'b3.cost_center_id, '||
351 'b3.fin_category_id, ' ||
352 'NVL(b3.category_id, -1), '||
353 'b3.user_dim1_id, ' ||
354 'NVL(b3.version_date, :global_start_date) ' ||
355 'FROM FII_BUDGET_BASE b3 ' ||
356 'WHERE b3.plan_type_code = :plan_type_code ' ||
357 'AND b3.time_id = :l_purge_time_id ' ||
358 'AND b3.period_type_id = :l_purge_period_type_id) ';
359
360 IF (FIIBUUP_DEBUG) THEN
361
362 -- FND_FILE.put_line(FND_FILE.LOG, l_sqlstmt);
363
364 FII_MESSAGE.Write_Log
365 (msg_name => 'FII_ROUTINE_VAL',
366 token_num => 3 ,
367 t1 => 'ROUTINE',
368 v1 => 'FII_BUDGET_FORECAST_C.Purge_Partial()',
369 t2 => 'VARIABLE',
370 v2 => 'l_sqlstmt',
371 t3 => 'VALUE',
372 v3 => l_sqlstmt);
373
374 FII_MESSAGE.Write_Log
375 (msg_name => 'FII_ROUTINE_VAL',
376 token_num => 3 ,
377 t1 => 'ROUTINE',
378 v1 => 'FII_BUDGET_FORECAST_C.Purge_Partial()',
379 t2 => 'VARIABLE',
380 v2 => 'LENGTH(l_sqlstmt)',
381 t3 => 'VALUE',
382 v3 => TO_CHAR(LENGTH(l_sqlstmt)));
383
384 FII_MESSAGE.Write_Log
385 (msg_name => 'FII_ROUTINE',
386 token_num => 2,
387 t1 => 'ROUTINE',
388 v1 => 'Purge_Partial()',
389 t2 => 'ACTION',
390 v2 => 'Subtracting purged amounts from rollup...');
391 END IF;
392
393 g_phase := 'Execute the built sql statement';
394 IF (FIIBUUP_PURGE_TIME_UNIT IN ('D', 'Q')) THEN
395 EXECUTE IMMEDIATE l_sqlstmt
396 USING FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID, l_purge_time_id,
397 l_purge_period_type_id, FIIBUUP_PURGE_PLAN_TYPE,
398 FIIBUUP_GLOBAL_START_DATE, FIIBUUP_GLOBAL_START_DATE,
399 l_purge_time_id,
400 FIIBUUP_GLOBAL_START_DATE, FIIBUUP_GLOBAL_START_DATE,
401 FIIBUUP_PURGE_PLAN_TYPE,
402 l_purge_time_id, l_purge_period_type_id;
403 ELSIF (FIIBUUP_PURGE_TIME_UNIT = 'P') THEN
404 EXECUTE IMMEDIATE l_sqlstmt
405 USING FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID, l_purge_time_id,
406 l_purge_period_type_id, FIIBUUP_PURGE_PLAN_TYPE,
407 FIIBUUP_GLOBAL_START_DATE, FIIBUUP_GLOBAL_START_DATE,
408 l_purge_time_id, l_purge_time_id,
409 FIIBUUP_GLOBAL_START_DATE, FIIBUUP_GLOBAL_START_DATE,
410 FIIBUUP_PURGE_PLAN_TYPE, l_purge_time_id, l_purge_period_type_id;
411 END IF;
412
413 IF (FIIBUUP_DEBUG) THEN
414 FII_MESSAGE.Write_Log
415 (msg_name => 'FII_UPD_REC',
416 token_num => 2,
417 t1 => 'NUM',
418 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
419 t2 => 'TABLE',
420 v2 => 'FII_BUDGET_BASE');
421 END IF;
422
423 -- Next, purge records
424 IF (FIIBUUP_DEBUG) THEN
425 FII_MESSAGE.Write_Log
426 (msg_name => 'FII_ROUTINE',
427 token_num => 2,
428 t1 => 'ROUTINE',
429 v1 => 'Purge_Partial()',
430 t2 => 'ACTION',
431 v2 => 'Purging records from FII_BUDGET_BASE...');
432 END IF;
433
434 g_phase := 'Delete from FII_BUDGET_BASE';
435 DELETE from FII_BUDGET_BASE
436 WHERE plan_type_code = FIIBUUP_PURGE_PLAN_TYPE
437 AND ( (time_id = l_purge_time_id
438 AND period_type_id = l_purge_period_type_id)
439 OR (prim_amount_g = 0));
440
441 IF (FIIBUUP_DEBUG) THEN
442 FII_MESSAGE.Write_Log
443 (msg_name => 'FII_DEL_REC',
444 token_num => 2,
445 t1 => 'NUM',
446 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
447 t2 => 'TABLE',
448 v2 => 'FII_BUDGET_BASE');
449 END IF;
450
451 -- Commit all work
452 FND_CONCURRENT.Af_Commit;
453
454 IF (FIIBUUP_DEBUG) THEN
455 FII_MESSAGE.Func_Succ('FII_BUDGET_FORECAST_C.Purge_Partial');
456 END IF;
457 RETURN TRUE;
458
459 -- Exception handling
460 EXCEPTION
461 WHEN FIIBUUP_fatal_err THEN
462
463 FND_CONCURRENT.Af_Rollback;
464
465 FII_MESSAGE.Write_Log
466 (msg_name => 'FII_ERR_ENC_ROUT',
467 token_num => 1,
468 t1 => 'ROUTINE_NAME',
469 v1 => 'FII_BUDGET_FORECAST_C.Purge_Partial()');
470
471 FII_MESSAGE.Func_Fail
472 (func_name =>'FII_BUDGET_FORECAST_C.Purge_Partial');
473
474 fii_util.put_line ('Phase: ' || g_phase ||
475 'Error: ' || sqlerrm);
476
477 RETURN FALSE;
478
479 WHEN OTHERS THEN
480
481 FND_CONCURRENT.Af_Rollback;
482
483 FII_MESSAGE.Write_Log
484 (msg_name => 'FII_ERROR',
485 token_num => 2,
486 t1 => 'FUNCTION',
487 v1 => 'FII_BUDGET_FORECAST_C.Purge_Partial()',
488 t2 => 'SQLERRMC',
489 v2 => SQLERRM);
490
491 FII_MESSAGE.Func_Fail
492 (func_name => 'FII_BUDGET_FORECAST_C.Purge_Partial');
493
494 fii_util.put_line ('Phase: ' || g_phase ||
495 'Error: ' || sqlerrm);
496
497 RETURN FALSE;
498
499 END Purge_Partial;
500
501 -------------------------------------------------------------------------------
502
503 -- Procedure
504 -- Purge_Eff_Date
505 -- Purpose
506 -- This routine will purge budget or forecast records with version_date
507 -- equal to or greater then the given version date.
508 -- Arguments
509 -- None
510 -- Example
511 -- result := FII_BUDGET_FORECAST_C.Purge_Eff_Date(version_date);
512 -- Notes
513 --
514 FUNCTION Purge_Eff_Date (version_date DATE) RETURN BOOLEAN IS
515 FIIBUUP_fatal_err EXCEPTION;
516 l_tmpstmt VARCHAR2(1000);
517
518 BEGIN
519
520 IF (FIIBUUP_DEBUG) THEN
521 FII_MESSAGE.Func_Ent('FII_BUDGET_FORECAST_C.Purge_Eff_Date');
522 END IF;
523
524 -- Purge all records from FII_BUDGET_BASE for the specified effective
525 -- dates. All records with the same dimensions on and after the effective
526 -- date will be purged.
527 IF (FIIBUUP_DEBUG) THEN
528 FII_MESSAGE.Write_Log
529 (msg_name => 'FII_ROUTINE',
530 token_num => 2,
531 t1 => 'ROUTINE',
532 v1 => 'Purge_Eff_Date()',
533 t2 => 'ACTION',
534 v2 => 'Purging records from FII_BUDGET_BASE for ' ||
535 version_date ||'...');
536 END IF;
537
538 g_phase := 'delete from FII_BUDGET_BASE';
539 l_tmpstmt :=
540 ' DELETE from FII_BUDGET_BASE b'||
541 ' WHERE b.plan_type_code = :plan_type '||
542 ' AND (b.ledger_id, b.company_id, b.cost_center_id, '||
543 'b.fin_category_id, b.category_id, '||
544 ' b.user_dim1_id) IN '||
545 ' (SELECT b2.ledger_id, b2.company_id, b2.cost_center_id, '||
546 ' b2.fin_category_id, b2.category_id, '||
547 ' b2.user_dim1_id '||
548 ' FROM FII_BUDGET_BASE b2 '||
549 ' WHERE b2.version_date >= trunc(:version_date)) '||
550 ' AND b.version_date >= trunc(:version_date) ';
551
552 -- Print out the dynamic SQL statements if running in debug mode
553 IF (FIIBUUP_DEBUG) THEN
554 FII_MESSAGE.Write_Log
555 (msg_name => 'FII_ROUTINE_VAL',
556 token_num => 3 ,
557 t1 => 'ROUTINE',
558 v1 => 'FII_BUDGET_FORECAST_C.purge_eff_date()',
559 t2 => 'VARIABLE',
560 v2 => 'l_tmpstmt',
561 t3 => 'VALUE',
562 v3 => l_tmpstmt);
563
564 FII_MESSAGE.Write_Log
565 (msg_name => 'FII_ROUTINE_VAL',
566 token_num => 3 ,
567 t1 => 'ROUTINE',
568 v1 => 'FII_BUDGET_FORECAST_C.purge_eff_date()',
569 t2 => 'VARIABLE',
570 v2 => 'LENGTH(l_tmpstmt)',
571 t3 => 'VALUE',
572 v3 => TO_CHAR(LENGTH(l_tmpstmt)));
573 END IF;
574
575 EXECUTE IMMEDIATE l_tmpstmt
576 USING FIIBUUP_PURGE_PLAN_TYPE, version_date, version_date;
577
578 IF (FIIBUUP_DEBUG) THEN
579 FII_MESSAGE.Write_Log
580 (msg_name => 'FII_DEL_REC',
581 token_num => 2,
582 t1 => 'NUM',
583 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
584 t2 => 'TABLE',
585 v2 => 'FII_BUDGET_BASE');
586 END IF;
587
588 -- Reset truncation indicator back to normal and
589 -- update FII_CHANGE_LOG to reflect latest profile setting
590 IF (FIIBUUP_DEBUG) THEN
591 FII_MESSAGE.Write_Log
592 (msg_name => 'FII_ROUTINE',
593 token_num => 2,
594 t1 => 'ROUTINE',
595 v1 => 'Purge_Eff_Date()',
596 t2 => 'ACTION',
597 v2 => 'Resetting FII_CHANGE_LOG...');
598 END IF;
599
600 g_phase := 'Update FII_CHANGE_LOG';
601 IF (FIIBUUP_PURGE_PLAN_TYPE = 'B') THEN
602 UPDATE FII_CHANGE_LOG
603 SET item_value = 'N',
604 last_update_date = SYSDATE,
605 last_updated_by = FIIBUUP_USER_ID,
606 last_update_login = FIIBUUP_LOGIN_ID
607 WHERE log_item = 'TRUNCATE_BUDGET';
608
609 IF (FIIBUUP_DEBUG) THEN
610 FII_MESSAGE.Write_Log
611 (msg_name => 'FII_UPD_REC',
612 token_num => 2,
613 t1 => 'NUM',
614 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
615 t2 => 'TABLE',
616 v2 => 'FII_CHANGE_LOG');
617 END IF;
618
619 UPDATE FII_CHANGE_LOG
620 SET item_value = FIIBUUP_BUDGET_TIME_UNIT,
621 last_update_date = SYSDATE,
622 last_updated_by = FIIBUUP_USER_ID,
623 last_update_login = FIIBUUP_LOGIN_ID
624 WHERE log_item = 'BUDGET_TIME_UNIT';
625
626 IF (FIIBUUP_DEBUG) THEN
627 FII_MESSAGE.Write_Log
628 (msg_name => 'FII_UPD_REC',
629 token_num => 2,
630 t1 => 'NUM',
631 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
632 t2 => 'TABLE',
633 v2 => 'FII_CHANGE_LOG');
634 END IF;
635
636 ELSIF (FIIBUUP_PURGE_PLAN_TYPE = 'F') THEN
637 UPDATE FII_CHANGE_LOG
638 SET item_value = 'N',
639 last_update_date = SYSDATE,
640 last_updated_by = FIIBUUP_USER_ID,
641 last_update_login = FIIBUUP_LOGIN_ID
642 WHERE log_item = 'TRUNCATE_FORECAST';
643
644 IF (FIIBUUP_DEBUG) THEN
645 FII_MESSAGE.Write_Log
646 (msg_name => 'FII_UPD_REC',
647 token_num => 2,
648 t1 => 'NUM',
649 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
650 t2 => 'TABLE',
651 v2 => 'FII_CHANGE_LOG');
652 END IF;
653
654 UPDATE FII_CHANGE_LOG
655 SET item_value = FIIBUUP_FORECAST_TIME_UNIT,
656 last_update_date = SYSDATE,
657 last_updated_by = FIIBUUP_USER_ID,
658 last_update_login = FIIBUUP_LOGIN_ID
659 WHERE log_item = 'FORECAST_TIME_UNIT';
660
661 IF (FIIBUUP_DEBUG) THEN
662 FII_MESSAGE.Write_Log
663 (msg_name => 'FII_UPD_REC',
664 token_num => 2,
665 t1 => 'NUM',
666 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
667 t2 => 'TABLE',
668 v2 => 'FII_CHANGE_LOG');
669 END IF;
670
671 END IF;
672
673 -- Commit everything to database before returning
674 FND_CONCURRENT.Af_Commit;
675
676 IF (FIIBUUP_DEBUG) THEN
677 FII_MESSAGE.Func_Succ('FII_BUDGET_FORECAST_C.Purge_Eff_Date');
678 END IF;
679 RETURN TRUE;
680
681 -- Exception handling
682 EXCEPTION
683 WHEN FIIBUUP_fatal_err THEN
684
685 FND_CONCURRENT.Af_Rollback;
686
687 FII_MESSAGE.Write_Log
688 (msg_name => 'FII_ERR_ENC_ROUT',
689 token_num => 1,
690 t1 => 'ROUTINE_NAME',
691 v1 => 'FII_BUDGET_FORECAST_C.Purge_Eff_Date()');
692
693
694 FII_MESSAGE.Func_Fail
695 (func_name =>'FII_BUDGET_FORECAST_C.Purge_Eff_Date');
696
697 fii_util.put_line ('Phase: ' || g_phase ||
698 'Error: ' || sqlerrm);
699
700 RETURN FALSE;
701
702 WHEN OTHERS THEN
703
704 FND_CONCURRENT.Af_Rollback;
705
706 FII_MESSAGE.Write_Log
707 (msg_name => 'FII_ERROR',
708 token_num => 2,
709 t1 => 'FUNCTION',
710 v1 => 'FII_BUDGET_FORECAST_C.Purge_Eff_Date()',
711 t2 => 'SQLERRMC',
712 v2 => SQLERRM);
713
714 FII_MESSAGE.Func_Fail
715 (func_name => 'FII_BUDGET_FORECAST_C.Purge_Eff_Date');
716
717 fii_util.put_line ('Phase: ' || g_phase ||
718 'Error: ' || sqlerrm);
719
720 RETURN FALSE;
721
722 END Purge_Eff_Date;
723
724
725 -------------------------------------------------------------------------------
726 --
727 -- Procedure
728 -- Psi_Insert_Stg()
729 -- Purpose
730 -- This routine is used to extract budget data from gl_je_headers/lines
731 -- and insert them into fii_budget_stg.
732 -- Arguments
733 -- None
734 -- Example
735 -- result := FII_BUDGET_FORECAST_C.Psi_Insert_Stg
736 -- Notes
737 -- Returns a boolean indicating if execution completes successfully
738 --
739 FUNCTION Psi_Insert_Stg RETURN BOOLEAN IS
740 FIIBUUP_fatal_err EXCEPTION;
741 l_sqlstmt VARCHAR2(10000);
742 l_udd1_enabled_flag VARCHAR2(1);
743
744 BEGIN
745
746 IF (FIIBUUP_DEBUG) THEN
747 FII_MESSAGE.Func_Ent('FII_BUDGET_FORECAST_C.Psi_Insert_Stg');
748 END IF;
749
750 -- PSI Budget Extraction will always extract budget data from scratch
751 g_phase := 'Truncate the staging table FII_BUDGET_BASE';
752 FII_UTIL.truncate_table ('FII_BUDGET_STG', 'FII', g_retcode);
753
754 -- Check if UDD1 is enabled or not
755 SELECT DBI_ENABLED_FLAG
756 INTO l_udd1_enabled_flag
757 FROM FII_FINANCIAL_DIMENSIONS
758 WHERE dimension_short_name = 'FII_USER_DEFINED_1';
759
760 g_phase := 'PSI Insert Staging';
761
762 ------------------------------------------------------------------------
763 -- Insert data from gl_je_lines into staging table.
764 -- We'll pick up data from the set of books/companies set up in FDS
765 -- where the functional currency = global primary currency.
766 ------------------------------------------------------------------------
767 l_sqlstmt :=
768 ' INSERT /*+ append parallel(fii_budget_stg)*/ INTO FII_BUDGET_STG'||
769 ' ( plan_type_code, day, year,'||
770 ' ledger_id, company_id, cost_center_id, fin_category_id,category_id, '||
771 ' user_dim1_id, user_dim2_id, prim_amount_g, prim_amount_total, '||
772 ' baseline_amount_prim, posted_date, budget_version_id, '||
773 ' code_combination_id, last_update_date, '||
774 ' last_updated_by, creation_date, created_by, last_update_login ) ' ||
775 ' SELECT /*+ ORDERED use_nl(line) use_hash(fcta) parallel(v1) '||
776 ' parallel(fin) parallel(slga2) '||
777 ' parallel(fslg2) use_hash(v1,line,fin,slga2,fslg2)'||
778 ' swap_join_inputs(fin) '||
779 ' swap_join_inputs(slga2) '||
780 ' swap_join_inputs(fslg2) pq_distribute(fin,none,broadcast)*/'||
781 ' b2.plan_type_code, to_number(to_char(line.effective_date, ''J'')),999,'||
782 ' line.ledger_id, fin.company_id, fin.cost_center_id, '||
783 ' fin.natural_account_id, NVL(fin.prod_category_id, -1), ';
784
785 IF (l_udd1_enabled_flag = 'N') THEN
786 l_sqlstmt := l_sqlstmt || ':user_dim1_id, :user_dim2_id, ';
787 ELSE
788 l_sqlstmt := l_sqlstmt || 'fin.user_dim1_id, :user_dim2_id, ';
789 END IF;
790
791 l_sqlstmt := l_sqlstmt ||
792 ' decode(fcta.fin_cat_type_code, ''R'', 1, -1) * '||
793 ' decode(v1.budget_version_id, '||
794 ' b2.budget_version_id, '||
795 ' sum(NVL(line.accounted_cr,0) - NVL(line.accounted_dr,0)), '||
796 ' 0), '||
797 ' decode(fcta.fin_cat_type_code, ''R'', 1, -1) * '||
798 ' decode(v1.budget_version_id, '||
799 ' b2.budget_version_id, '||
800 ' sum(NVL(line.accounted_cr,0) - NVL(line.accounted_dr,0)), '||
801 ' 0), '||
802 ' decode(fcta.fin_cat_type_code, ''R'', 1, -1) * '||
803 ' decode(v1.budget_version_id, '||
804 ' b2.base_budget_version_id, '||
805 ' sum(NVL(line.accounted_cr,0) - NVL(line.accounted_dr,0)), '||
806 ' 0), '||
807 ' v1.posted_date, v1.budget_version_id, '||
808 ' line.code_combination_id, sysdate, :user_id, sysdate, :user_id, :login_id '||
809 ' FROM ( '||
810 ' SELECT /*+ no_merge ordered parallel(jeh) parallel(per) '||
811 ' parallel(fset) use_hash(jeh,per,fset) */ '||
812 ' distinct jeh.ledger_id, jeh.je_header_id, '||
813 ' trunc(p2.start_date) posted_date, '||
814 ' jeh.budget_version_id, jeh.default_effective_date '||
815 ' FROM gl_je_headers jeh, gl_periods p2,'||
816 ' (SELECT /*+ parallel(p) parallel(s) use_hash(s) use_hash(p) */ '||
817 ' p.period_name, s.ledger_id, '||
818 ' b.budget_version_id, '||
819 ' b.base_budget_version_id, '||
820 ' s.period_set_name, s.accounted_period_type '||
821 ' FROM gl_periods p, gl_ledgers_public_v s, '||
822 ' fii_slg_budget_asgns b, fii_source_ledger_groups slg '||
823 ' WHERE slg.usage_code = ''DBI'' '||
824 ' AND b.source_ledger_group_id = slg.source_ledger_group_id '||
825 ' AND s.ledger_id = b.ledger_id '||
826 ' AND p.start_date <= b.to_period_end_date '||
827 ' AND p.end_date >= b.from_period_start_date '||
828 ' AND p.period_set_name = s.period_set_name '||
829 ' AND p.period_type = s.accounted_period_type) per, '||
830 ' (SELECT /*+ full(fslg) parallel(sob) */ DISTINCT '||
831 ' slga.ledger_id, '||
832 ' DECODE(slga.je_rule_set_id, NULL, ''-1'', '||
833 ' rule.JE_SOURCE_NAME) je_source_name, '||
834 ' DECODE(slga.je_rule_set_id, NULL, ''-1'', '||
835 ' rule.JE_CATEGORY_NAME) je_category_name, '||
836 ' slba.budget_version_id, '||
837 ' slba.base_budget_version_id '||
838 ' FROM fii_slg_assignments slga, '||
839 ' gl_je_inclusion_rules rule, '||
840 ' fii_slg_budget_asgns slba, '||
841 ' fii_source_ledger_groups fslg, '||
842 ' gl_ledgers_public_v sob '||
843 ' WHERE slga.je_rule_set_id = rule.je_rule_set_id (+) '||
844 ' AND slga.source_ledger_group_id = fslg.source_ledger_group_id '||
845 ' AND fslg.usage_code = ''DBI'' '||
846 ' AND sob.ledger_id = slga.ledger_id '||
847 ' AND sob.currency_code = :prim_curr '||
848 ' AND slba.ledger_id = slga.ledger_id '||
849 ' AND slba.source_ledger_group_id = slga.source_ledger_group_id) fset'||
850 ' WHERE jeh.ledger_id = fset.ledger_id '||
851 ' AND (jeh.je_source = fset.je_source_name OR fset.je_source_name = ''-1'') '||
852 ' AND (jeh.je_category = fset.je_category_name OR fset.je_category_name = ''-1'') '||
853 ' AND jeh.budget_version_id in (fset.budget_version_id, '||
854 ' fset.base_budget_version_id)'||
855 ' AND jeh.currency_code = :prim_curr '||
856 ' AND jeh.period_name = per.period_name '||
857 ' AND jeh.ledger_id = per.ledger_id '||
858 ' AND jeh.budget_version_id in ( per.budget_version_id, '||
859 ' per.base_budget_version_id) '||
860 ' AND jeh.status = ''P'' '||
861 ' AND jeh.actual_flag = ''B'' '||
862 ' AND p2.period_set_name = per.period_set_name '||
863 ' AND p2.period_type = per.accounted_period_type '||
864 ' AND p2.adjustment_period_flag = ''N'' '||
865 ' AND jeh.posted_date between p2.start_date and p2.end_date '||
866 ' ) v1, '||
867 ' gl_je_lines line, '||
868 ' fii_gl_ccid_dimensions fin, '||
869 ' fii_slg_assignments slga2, '||
870 ' fii_source_ledger_groups fslg2, '||
871 ' fii_slg_budget_asgns b2, '||
872 ' fii_fin_cat_type_assgns fcta '||
873 ' WHERE v1.je_header_id = line.je_header_id '||
874 ' AND line.code_combination_id = fin.code_combination_id '||
875 ' AND ( fin.company_id = slga2.bal_seg_value_id OR'||
876 ' slga2.bal_seg_value_id = -1 ) '||
877 ' AND fin.chart_of_accounts_id = slga2.chart_of_accounts_id '||
878 ' AND line.ledger_id = slga2.ledger_id '||
879 ' AND slga2.source_ledger_group_id = fslg2.source_ledger_group_id '||
880 ' AND b2.source_ledger_group_id = fslg2.source_ledger_group_id '||
881 ' AND v1.default_effective_date between b2.from_period_start_date '||
882 ' and b2.to_period_end_date '||
883 ' AND fslg2.usage_code = ''DBI'' '||
884 ' AND v1.ledger_id = slga2.ledger_id '||
885 ' AND fcta.fin_category_id = fin.natural_account_id '||
886 ' AND fcta.fin_cat_type_code IN (''EXP'', ''R'') '||
887 ' GROUP BY '||
888 ' v1.posted_date, line.effective_date, '||
889 ' fin.company_id, fin.cost_center_id, fin.natural_account_id, '||
890 ' NVL(fin.prod_category_id, -1), ';
891
892 IF (l_udd1_enabled_flag = 'N') THEN
893 l_sqlstmt := l_sqlstmt || ':user_dim1_id, :user_dim2_id, ';
894 ELSE
895 l_sqlstmt := l_sqlstmt || 'fin.user_dim1_id, :user_dim2_id, ';
896 END IF;
897
898 l_sqlstmt := l_sqlstmt ||
899 ' v1.budget_version_id, b2.budget_version_id, '||
900 ' b2.base_budget_version_id, '||
901 ' fcta.fin_cat_type_code, '||
902 ' line.code_combination_id, line.ledger_id, b2.plan_type_code ';
903
904 -- Print out the dynamic SQL statements if running in debug mode
905 IF (FIIBUUP_DEBUG) THEN
906 fii_util.put_line('l_sqlstmt = '|| l_sqlstmt);
907
908 FII_MESSAGE.Write_Log
909 (msg_name => 'FII_ROUTINE_VAL',
910 token_num => 3 ,
911 t1 => 'ROUTINE',
912 v1 => 'FII_BUDGET_FORECAST_C.Psi_Insert_Stg()',
913 t2 => 'VARIABLE',
914 v2 => 'LENGTH(l_sqlstmt)',
915 t3 => 'VALUE',
916 v3 => TO_CHAR(LENGTH(l_sqlstmt)));
917 END IF;
918
919 -- Execute statement
920 IF (l_udd1_enabled_flag = 'N') THEN
921 EXECUTE IMMEDIATE l_sqlstmt
922 USING FIIBUUP_UNASSIGNED_UDD_ID, FIIBUUP_UNASSIGNED_UDD_ID,
923 FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID,
924 FIIBUUP_PRIM_CURR_CODE, FIIBUUP_PRIM_CURR_CODE,
925 FIIBUUP_UNASSIGNED_UDD_ID, FIIBUUP_UNASSIGNED_UDD_ID;
926 ELSE
927 EXECUTE IMMEDIATE l_sqlstmt
928 USING FIIBUUP_UNASSIGNED_UDD_ID,
929 FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID,
930 FIIBUUP_PRIM_CURR_CODE, FIIBUUP_PRIM_CURR_CODE,
931 FIIBUUP_UNASSIGNED_UDD_ID;
932 END IF;
933
934 IF (FIIBUUP_DEBUG) THEN
935 fii_util.put_line('Inserted '||SQL%ROWCOUNT||
936 ' rows into fii_budget_stg');
937 END IF;
938
939 -- Need to commit after inserting data into base in parallel mode
940 FND_CONCURRENT.Af_Commit;
941
942 -- Psi_Insert_Stg is completed, return with success.
943 IF (FIIBUUP_DEBUG) THEN
944 FII_MESSAGE.Write_Log
945 (msg_name => 'FII_ROUTINE',
946 token_num => 2,
947 t1 => 'ROUTINE',
948 v1 => 'Psi_Insert_Stg()',
949 t2 => 'ACTION',
950 v2 => 'PSI Insert Stage completed successfully...');
951 END IF;
952
953 IF (FIIBUUP_DEBUG) THEN
954 FII_MESSAGE.Func_Succ('FII_BUDGET_FORECAST_C.Psi_Insert_Stg');
955 END IF;
956 RETURN TRUE;
957
958 -- Exception handling
959 EXCEPTION
960 WHEN FIIBUUP_fatal_err THEN
961 FND_CONCURRENT.Af_Rollback;
962
963 FII_MESSAGE.Write_Log
964 (msg_name => 'FII_ERR_ENC_ROUT',
965 token_num => 1,
966 t1 => 'ROUTINE_NAME',
967 v1 => 'FII_BUDGET_FORECAST_C.Psi_Insert_Stg()');
968
969 FII_MESSAGE.Func_Fail
970 (func_name =>'FII_BUDGET_FORECAST_C.Psi_Insert_Stg');
971
972 fii_util.put_line ('Phase: ' || g_phase ||
973 'Error: ' || sqlerrm);
974 RETURN FALSE;
975
976 WHEN OTHERS THEN
977 FND_CONCURRENT.Af_Rollback;
978
979 FII_MESSAGE.Write_Log
980 (msg_name => 'FII_ERROR',
981 token_num => 2,
982 t1 => 'FUNCTION',
983 v1 => 'FII_BUDGET_FORECAST_C.Psi_Insert_Stg()',
984 t2 => 'SQLERRMC',
985 v2 => SQLERRM);
986
987 FII_MESSAGE.Func_Fail
988 (func_name => 'FII_BUDGET_FORECAST_C.Psi_Insert_Stg');
989
990 fii_util.put_line ('Phase: ' || g_phase ||
991 'Error: ' || sqlerrm);
992 RETURN FALSE;
993
994 END Psi_Insert_Stg;
995
996 -------------------------------------------------------------------------------
997 --
998 -- Procedure
999 -- Psi_Carry_Forward()
1000 -- Purpose
1001 -- This routine is used to extract budget data that is carried forward
1002 -- to the new fiscal year from gl_balances. These carry forward amounts
1003 -- are updated in gl_balances directly without any journals.
1004 -- Arguments
1005 -- None
1006 -- Example
1007 -- result := FII_BUDGET_FORECAST_C.Psi_Carry_Forward
1008 -- Notes
1009 -- Returns a boolean indicating if execution completes successfully
1010 --
1011 FUNCTION Psi_Carry_Forward RETURN BOOLEAN IS
1012 FIIBUUP_fatal_err EXCEPTION;
1013 l_sqlstmt VARCHAR2(10000);
1014 l_udd1_enabled_flag VARCHAR2(1);
1015
1016 BEGIN
1017
1018 IF (FIIBUUP_DEBUG) THEN
1019 FII_MESSAGE.Func_Ent('FII_BUDGET_FORECAST_C.Psi_Carry_Forward');
1020 END IF;
1021
1022 -- Check if UDD1 is enabled or not
1023 SELECT DBI_ENABLED_FLAG
1024 INTO l_udd1_enabled_flag
1025 FROM FII_FINANCIAL_DIMENSIONS
1026 WHERE dimension_short_name = 'FII_USER_DEFINED_1';
1027
1028 g_phase := 'PSI Carry Forward';
1029
1030 ------------------------------------------------------------------------
1031 -- Insert data from gl_balances into staging table.
1032 -- We'll pick up data from the set of books/companies set up in FDS
1033 -- where the functional currency = global primary currency and
1034 -- begin_balance_dr/begin_balance_cr is not zero.
1035 ------------------------------------------------------------------------
1036 l_sqlstmt :=
1037 ' INSERT /*+ append parallel(fii_budget_stg)*/ INTO FII_BUDGET_STG'||
1038 ' ( plan_type_code, day, year,'||
1039 ' ledger_id, company_id, cost_center_id, fin_category_id,category_id, '||
1040 ' user_dim1_id, user_dim2_id, prim_amount_g, prim_amount_total, '||
1041 ' baseline_amount_prim, posted_date, budget_version_id, '||
1042 ' code_combination_id, last_update_date, '||
1043 ' last_updated_by, creation_date, created_by, last_update_login ) ' ||
1044 ' SELECT /*+ parallel(sob) parallel(p) pq_distribute(p hash,hash) '||
1045 ' parallel(slga) use_hash(fslg,b,fin) parallel(b) '||
1046 ' pq_distribute(b hash,hash) '||
1047 ' parallel(fin) parallel(fcta) pq_distribute(fin hash,hash) */'||
1048 ' slba.plan_type_code, to_number(to_char(p.start_date, ''J'')), 999,'||
1049 ' b.ledger_id, fin.company_id, fin.cost_center_id, '||
1050 ' fin.natural_account_id, NVL(fin.prod_category_id, -1), ';
1051
1052 IF (l_udd1_enabled_flag = 'N') THEN
1053 l_sqlstmt := l_sqlstmt || ':user_dim1_id, :user_dim2_id, ';
1054 ELSE
1055 l_sqlstmt := l_sqlstmt || 'fin.user_dim1_id, :user_dim2_id, ';
1056 END IF;
1057
1058 l_sqlstmt := l_sqlstmt ||
1059 ' decode(fcta.fin_cat_type_code, ''R'', 1, -1) * '||
1060 ' decode(b.budget_version_id, '||
1061 ' slba.budget_version_id, '||
1062 ' sum(NVL(b.begin_balance_cr,0) - NVL(b.begin_balance_dr,0)), '||
1063 ' 0), '||
1064 ' decode(fcta.fin_cat_type_code, ''R'', 1, -1) * '||
1065 ' decode(b.budget_version_id, '||
1066 ' slba.budget_version_id, '||
1067 ' sum(NVL(b.begin_balance_cr,0) - NVL(b.begin_balance_dr,0)), '||
1068 ' 0), '||
1069 ' decode(fcta.fin_cat_type_code, ''R'', 1, -1) * '||
1070 ' decode(b.budget_version_id, '||
1071 ' slba.base_budget_version_id, '||
1072 ' sum(NVL(b.begin_balance_cr,0) - NVL(b.begin_balance_dr,0)), '||
1073 ' 0), '||
1074 ' p.start_date, b.budget_version_id, '||
1075 ' b.code_combination_id, sysdate, :user_id, sysdate, :user_id, :login_id '||
1076 ' FROM FII_SOURCE_LEDGER_GROUPS fslg, '||
1077 ' FII_SLG_ASSIGNMENTS slga, '||
1078 ' FII_SLG_BUDGET_ASGNS slba, '||
1079 ' FII_GL_CCID_DIMENSIONS fin, '||
1080 ' FII_FIN_CAT_TYPE_ASSGNS fcta, '||
1081 ' GL_BALANCES b, '||
1082 ' GL_PERIODS p, '||
1083 ' GL_LEDGERS_PUBLIC_V sob '||
1084 ' WHERE fslg.usage_code = ''DBI'' '||
1085 ' AND slga.source_ledger_group_id = fslg.source_ledger_group_id '||
1086 ' AND slba.source_ledger_group_id = slga.source_ledger_group_id '||
1087 ' AND slba.ledger_id = slga.ledger_id '||
1088 ' AND sob.ledger_id = slba.ledger_id '||
1089 ' AND p.period_set_name = sob.period_set_name '||
1090 ' AND p.period_type = sob.accounted_period_type '||
1091 ' AND p.period_num = 1 '||
1092 ' AND p.start_date <= slba.to_period_end_date '||
1093 ' AND p.end_date >= slba.from_period_start_date '||
1094 ' AND b.actual_flag = ''B'' '||
1095 ' AND b.period_name = p.period_name '||
1096 ' AND b.ledger_id = slga.ledger_id '||
1097 ' AND (b.budget_version_id = slba.budget_version_id OR '||
1098 ' b.budget_version_id = slba.base_budget_version_id) '||
1099 ' AND b.currency_code = :prim_curr '||
1100 ' AND (b.begin_balance_dr <> 0 OR b.begin_balance_cr <> 0) '||
1101 ' AND b.code_combination_id = fin.code_combination_id '||
1102 ' AND (fin.company_id = slga.bal_seg_value_id OR '||
1103 ' slga.bal_seg_value_id = -1) '||
1104 ' AND fin.chart_of_accounts_id = slga.chart_of_accounts_id '||
1105 ' AND fcta.fin_category_id = fin.natural_account_id '||
1106 ' AND fcta.fin_cat_type_code in (''EXP'', ''R'') '||
1107 ' GROUP BY '||
1108 ' slba.plan_type_code, p.start_date, b.ledger_id, '||
1109 ' fin.company_id, fin.cost_center_id, fin.natural_account_id, '||
1110 ' NVL(fin.prod_category_id, -1), ';
1111
1112 IF (l_udd1_enabled_flag = 'N') THEN
1113 l_sqlstmt := l_sqlstmt || ':user_dim1_id, :user_dim2_id, ';
1114 ELSE
1115 l_sqlstmt := l_sqlstmt || 'fin.user_dim1_id, :user_dim2_id, ';
1116 END IF;
1117
1118 l_sqlstmt := l_sqlstmt ||
1119 ' fcta.fin_cat_type_code, b.budget_version_id, slba.budget_version_id, '||
1120 ' slba.base_budget_version_id, b.code_combination_id ';
1121
1122 -- Print out the dynamic SQL statements if running in debug mode
1123 IF (FIIBUUP_DEBUG) THEN
1124 fii_util.put_line('l_sqlstmt = '|| l_sqlstmt);
1125
1126 FII_MESSAGE.Write_Log
1127 (msg_name => 'FII_ROUTINE_VAL',
1128 token_num => 3 ,
1129 t1 => 'ROUTINE',
1130 v1 => 'FII_BUDGET_FORECAST_C.Psi_Carry_Forward()',
1131 t2 => 'VARIABLE',
1132 v2 => 'LENGTH(l_sqlstmt)',
1133 t3 => 'VALUE',
1134 v3 => TO_CHAR(LENGTH(l_sqlstmt)));
1135 END IF;
1136
1137 -- Execute statement
1138 IF (l_udd1_enabled_flag = 'N') THEN
1139 EXECUTE IMMEDIATE l_sqlstmt
1140 USING FIIBUUP_UNASSIGNED_UDD_ID, FIIBUUP_UNASSIGNED_UDD_ID,
1141 FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID,
1142 FIIBUUP_PRIM_CURR_CODE,
1143 FIIBUUP_UNASSIGNED_UDD_ID, FIIBUUP_UNASSIGNED_UDD_ID;
1144 ELSE
1145 EXECUTE IMMEDIATE l_sqlstmt
1146 USING FIIBUUP_UNASSIGNED_UDD_ID,
1147 FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID,
1148 FIIBUUP_PRIM_CURR_CODE,
1149 FIIBUUP_UNASSIGNED_UDD_ID;
1150 END IF;
1151
1152 IF (FIIBUUP_DEBUG) THEN
1153 fii_util.put_line('Inserted '||SQL%ROWCOUNT||
1154 ' rows into fii_budget_stg');
1155 END IF;
1156
1157 -- Need to commit after inserting data into base in parallel mode
1158 FND_CONCURRENT.Af_Commit;
1159
1160 -- Psi_Carry_Forward is completed, return with success.
1161 IF (FIIBUUP_DEBUG) THEN
1162 FII_MESSAGE.Write_Log
1163 (msg_name => 'FII_ROUTINE',
1164 token_num => 2,
1165 t1 => 'ROUTINE',
1166 v1 => 'Psi_Carry_Forward()',
1167 t2 => 'ACTION',
1168 v2 => 'PSI Carry Forward completed successfully...');
1169 END IF;
1170
1171 IF (FIIBUUP_DEBUG) THEN
1172 FII_MESSAGE.Func_Succ('FII_BUDGET_FORECAST_C.Psi_Carry_Forward');
1173 END IF;
1174 RETURN TRUE;
1175
1176 -- Exception handling
1177 EXCEPTION
1178 WHEN FIIBUUP_fatal_err THEN
1179 FND_CONCURRENT.Af_Rollback;
1180
1181 FII_MESSAGE.Write_Log
1182 (msg_name => 'FII_ERR_ENC_ROUT',
1183 token_num => 1,
1184 t1 => 'ROUTINE_NAME',
1185 v1 => 'FII_BUDGET_FORECAST_C.Psi_Carry_Forward()');
1186
1187 FII_MESSAGE.Func_Fail
1188 (func_name =>'FII_BUDGET_FORECAST_C.Psi_Carry_Forward');
1189
1190 fii_util.put_line ('Phase: ' || g_phase ||
1191 'Error: ' || sqlerrm);
1192 RETURN FALSE;
1193
1194 WHEN OTHERS THEN
1195 FND_CONCURRENT.Af_Rollback;
1196
1197 FII_MESSAGE.Write_Log
1198 (msg_name => 'FII_ERROR',
1199 token_num => 2,
1200 t1 => 'FUNCTION',
1201 v1 => 'FII_BUDGET_FORECAST_C.Psi_Carry_Forward()',
1202 t2 => 'SQLERRMC',
1203 v2 => SQLERRM);
1204
1205 FII_MESSAGE.Func_Fail
1206 (func_name => 'FII_BUDGET_FORECAST_C.Psi_Carry_Forward');
1207
1208 fii_util.put_line ('Phase: ' || g_phase ||
1209 'Error: ' || sqlerrm);
1210 RETURN FALSE;
1211
1212 END Psi_Carry_Forward;
1213
1214
1215 -------------------------------------------------------------------------------
1216 --
1217 -- Procedure
1218 -- Psi_Rollup()
1219 -- Purpose
1220 -- This routine will rollup budget data extracted from gl_je_headers/lines
1221 -- along the time dimension.
1222 -- Arguments
1223 -- None
1224 -- Example
1225 -- result := FII_BUDGET_FORECAST_C.Psi_Rollup;
1226 -- Notes
1227 -- Returns a boolean indicating if execution completes successfully
1228 --
1229 FUNCTION Psi_Rollup RETURN BOOLEAN IS
1230 FIIBUUP_fatal_err EXCEPTION;
1231 l_sqlstmt VARCHAR2(10000);
1232
1233 BEGIN
1234
1235 IF (FIIBUUP_DEBUG) THEN
1236 FII_MESSAGE.Func_Ent('FII_BUDGET_FORECAST_C.Psi_Rollup');
1237 END IF;
1238
1239 g_phase := 'PSI Rollup';
1240
1241 ------------------------------------------------------------------------
1242 -- Rollup data in fii_budget_stg along time dimension
1243 ------------------------------------------------------------------------
1244 l_sqlstmt :=
1245 ' INSERT /*+ append parallel(fii_budget_stg) */ INTO fii_budget_stg '||
1246 ' ( plan_type_code, period, quarter, year, ledger_id, '||
1247 ' company_id, cost_center_id, fin_category_id, category_id, '||
1248 ' user_dim1_id, user_dim2_id, prim_amount_g, '||
1249 ' prim_amount_total, baseline_amount_prim, '||
1250 ' posted_date, code_combination_id, budget_version_id, last_update_date, '||
1251 ' last_updated_by, creation_date, created_by, last_update_login) '||
1252 ' SELECT * FROM ( '||
1253 ' SELECT /*+ parallel(b) parallel(fday) use_hash(fday) */ '||
1254 ' b.plan_type_code, '||
1255 ' fday.ent_period_id, fday.ent_qtr_id, fday.ent_year_id, '||
1256 ' b.ledger_id, b.company_id, b.cost_center_id, '||
1257 ' b.fin_category_id, b.category_id, b.user_dim1_id, '||
1258 ' b.user_dim2_id, '||
1259 ' SUM(b.prim_amount_g) prim_amount_g, '||
1260 ' SUM(b.prim_amount_total) prim_amount_total, '||
1261 ' SUM(b.baseline_amount_prim )baseline_amount_prim, '||
1262 ' b.posted_date, b.code_combination_id, b.budget_version_id, '||
1263 ' b.last_update_date, b.last_updated_by, '||
1264 ' b.creation_date, b.created_by, b.last_update_login '||
1265 ' FROM fii_budget_stg b, '||
1266 ' fii_time_day fday '||
1267 ' WHERE b.day = fday.report_date_julian '||
1268 ' GROUP BY '||
1269 ' b.plan_type_code, b.ledger_id, b.company_id, b.cost_center_id, '||
1270 ' b.fin_category_id, b.category_id, b.user_dim1_id, b.user_dim2_id,'||
1271 ' b.posted_date, b.code_combination_id, b.budget_version_id, '||
1272 ' b.last_update_date, b.last_updated_by, '||
1273 ' b.creation_date, b.created_by, b.last_update_login, '||
1274 ' ROLLUP (fday.ent_year_id, '||
1275 ' fday.ent_qtr_id, '||
1276 ' fday.ent_period_id )) '||
1277 ' WHERE ent_year_id IS NOT NULL ';
1278
1279 -- Print out the dynamic SQL statements if running in debug mode
1280 IF (FIIBUUP_DEBUG) THEN
1281 fii_util.put_line('l_sqlstmt = '|| l_sqlstmt);
1282
1283 FII_MESSAGE.Write_Log
1284 (msg_name => 'FII_ROUTINE_VAL',
1285 token_num => 3 ,
1286 t1 => 'ROUTINE',
1287 v1 => 'FII_BUDGET_FORECAST_C.Psi_Rollup()',
1288 t2 => 'VARIABLE',
1289 v2 => 'LENGTH(l_sqlstmt)',
1290 t3 => 'VALUE',
1291 v3 => TO_CHAR(LENGTH(l_sqlstmt)));
1292 END IF;
1293
1294 -- Execute statement
1295 EXECUTE IMMEDIATE l_sqlstmt;
1296
1297 IF (FIIBUUP_DEBUG) THEN
1298 fii_util.put_line('Inserted '||SQL%ROWCOUNT||
1299 ' rows into fii_budget_stg');
1300 END IF;
1301
1302 -- Need to commit
1303 FND_CONCURRENT.Af_Commit;
1304
1305 -- PSI Budget Extraction is completed, return with success.
1306 IF (FIIBUUP_DEBUG) THEN
1307 FII_MESSAGE.Write_Log
1308 (msg_name => 'FII_ROUTINE',
1309 token_num => 2,
1310 t1 => 'ROUTINE',
1311 v1 => 'Psi_Rollup()',
1312 t2 => 'ACTION',
1313 v2 => 'PSI Rollup completed successfully...');
1314 END IF;
1315
1316 IF (FIIBUUP_DEBUG) THEN
1317 FII_MESSAGE.Func_Succ('FII_BUDGET_FORECAST_C.Psi_Rollup');
1318 END IF;
1319 RETURN TRUE;
1320
1321 -- Exception handling
1322 EXCEPTION
1323 WHEN FIIBUUP_fatal_err THEN
1324 FND_CONCURRENT.Af_Rollback;
1325
1326 FII_MESSAGE.Write_Log
1327 (msg_name => 'FII_ERR_ENC_ROUT',
1328 token_num => 1,
1329 t1 => 'ROUTINE_NAME',
1330 v1 => 'FII_BUDGET_FORECAST_C.Psi_Rollup()');
1331
1332 FII_MESSAGE.Func_Fail
1333 (func_name =>'FII_BUDGET_FORECAST_C.Psi_Rollup');
1334
1335 fii_util.put_line ('Phase: ' || g_phase ||
1336 'Error: ' || sqlerrm);
1337 RETURN FALSE;
1338
1339 WHEN OTHERS THEN
1340 FND_CONCURRENT.Af_Rollback;
1341
1342 FII_MESSAGE.Write_Log
1343 (msg_name => 'FII_ERROR',
1344 token_num => 2,
1345 t1 => 'FUNCTION',
1346 v1 => 'FII_BUDGET_FORECAST_C.Psi_Rollup()',
1347 t2 => 'SQLERRMC',
1348 v2 => SQLERRM);
1349
1350 FII_MESSAGE.Func_Fail
1351 (func_name => 'FII_BUDGET_FORECAST_C.Psi_Rollup');
1352
1353 fii_util.put_line ('Phase: ' || g_phase ||
1354 'Error: ' || sqlerrm);
1355 RETURN FALSE;
1356
1357 END Psi_Rollup;
1358
1359 -------------------------------------------------------------------------------
1360 --
1361 -- Procedure
1362 -- Psi_DeleteDiff()
1363 -- Purpose
1364 -- This routine will delete budget data with time/dimension combination
1365 -- that exists in fii_budget_base but not in fii_budget_stg (new data).
1366 -- Arguments
1367 -- None
1368 -- Example
1369 -- result := FII_BUDGET_FORECAST_C.Psi_DeleteDiff;
1370 -- Notes
1371 -- Returns a boolean indicating if execution completes successfully
1372 --
1373 FUNCTION Psi_DeleteDiff RETURN BOOLEAN IS
1374 FIIBUUP_fatal_err EXCEPTION;
1375 l_sqlstmt VARCHAR2(10000);
1376
1377 BEGIN
1378
1379 IF (FIIBUUP_DEBUG) THEN
1380 FII_MESSAGE.Func_Ent('FII_BUDGET_FORECAST_C.Psi_DeleteDiff');
1381 END IF;
1382
1383 g_phase := 'PSI DeleteDiff';
1384
1385 ------------------------------------------------------------------------
1386 -- Delete rows from fii_budget_base if time/dimension combination does
1387 -- not exists in the new data in fii_budget_stg.
1388 ------------------------------------------------------------------------
1389 l_sqlstmt :=
1390 ' DELETE FROM fii_budget_base '||
1391 ' WHERE ( plan_type_code, '||
1392 ' time_id, '||
1393 ' period_type_id, '||
1394 ' ledger_id, '||
1395 ' company_id, '||
1396 ' cost_center_id, '||
1397 ' NVL(company_cost_center_org_id, -1), '||
1398 ' fin_category_id, '||
1399 ' category_id, '||
1400 ' user_dim1_id, '||
1401 ' user_dim2_id, '||
1402 ' posted_date, '||
1403 ' prim_amount_g, '||
1404 ' baseline_amount_prim) '||
1405 ' IN (SELECT plan_type_code, '||
1406 ' time_id, '||
1407 ' period_type_id, '||
1408 ' ledger_id, '||
1409 ' company_id, '||
1410 ' cost_center_id, '||
1411 ' NVL(company_cost_center_org_id, -1), '||
1412 ' fin_category_id, '||
1413 ' category_id, '||
1414 ' user_dim1_id, '||
1415 ' user_dim2_id, '||
1416 ' posted_date, '||
1417 ' prim_amount_g, '||
1418 ' baseline_amount_prim '||
1419 ' FROM fii_budget_base '||
1420 ' MINUS '||
1421 ' SELECT plan_type_code, '||
1422 ' nvl(day, nvl(period, nvl(quarter, year))), '||
1423 ' decode(day, null, '||
1424 ' decode(period, null, '||
1425 ' decode(quarter, null, 128, 64), 32), 1), '||
1426 ' ledger_id, '||
1427 ' company_id, '||
1428 ' cost_center_id, '||
1429 ' NVL(company_cost_center_org_id, -1), '||
1430 ' fin_category_id, '||
1431 ' category_id, '||
1432 ' user_dim1_id, '||
1433 ' user_dim2_id, '||
1434 ' posted_date, '||
1435 ' sum(prim_amount_g), '||
1436 ' sum(baseline_amount_prim) '||
1437 ' FROM fii_budget_stg '||
1438 ' GROUP BY plan_type_code, '||
1439 ' nvl(day, nvl(period, nvl(quarter, year))), '||
1440 ' decode(day, null, '||
1441 ' decode(period, null, '||
1442 ' decode(quarter, null, 128, 64), 32), 1), '||
1443 ' ledger_id, '||
1444 ' company_id, '||
1445 ' cost_center_id, '||
1446 ' NVL(company_cost_center_org_id, -1), '||
1447 ' fin_category_id, '||
1448 ' category_id, '||
1449 ' user_dim1_id, '||
1450 ' user_dim2_id, '||
1451 ' posted_date) ';
1452
1453 -- Print out the dynamic SQL statements if running in debug mode
1454 IF (FIIBUUP_DEBUG) THEN
1455 fii_util.put_line('l_sqlstmt = '|| l_sqlstmt);
1456
1457 FII_MESSAGE.Write_Log
1458 (msg_name => 'FII_ROUTINE_VAL',
1459 token_num => 3 ,
1460 t1 => 'ROUTINE',
1461 v1 => 'FII_BUDGET_FORECAST_C.Psi_DeleteDiff()',
1462 t2 => 'VARIABLE',
1463 v2 => 'LENGTH(l_sqlstmt)',
1464 t3 => 'VALUE',
1465 v3 => TO_CHAR(LENGTH(l_sqlstmt)));
1466 END IF;
1467
1468 -- Execute statement
1469 EXECUTE IMMEDIATE l_sqlstmt;
1470
1471 IF (FIIBUUP_DEBUG) THEN
1472 fii_util.put_line('Deleted '||SQL%ROWCOUNT||
1473 ' rows from fii_budget_base');
1474 END IF;
1475
1476 -- Need to commit
1477 FND_CONCURRENT.Af_Commit;
1478
1479 -- PSI Budget Extraction is completed, return with success.
1480 IF (FIIBUUP_DEBUG) THEN
1481 FII_MESSAGE.Write_Log
1482 (msg_name => 'FII_ROUTINE',
1483 token_num => 2,
1484 t1 => 'ROUTINE',
1485 v1 => 'Psi_DeleteDiff()',
1486 t2 => 'ACTION',
1487 v2 => 'PSI DeleteDiff completed successfully...');
1488 END IF;
1489
1490 IF (FIIBUUP_DEBUG) THEN
1491 FII_MESSAGE.Func_Succ('FII_BUDGET_FORECAST_C.Psi_DeleteDiff');
1492 END IF;
1493 RETURN TRUE;
1494
1495 -- Exception handling
1496 EXCEPTION
1497 WHEN FIIBUUP_fatal_err THEN
1498 FND_CONCURRENT.Af_Rollback;
1499
1500 FII_MESSAGE.Write_Log
1501 (msg_name => 'FII_ERR_ENC_ROUT',
1502 token_num => 1,
1503 t1 => 'ROUTINE_NAME',
1504 v1 => 'FII_BUDGET_FORECAST_C.Psi_DeleteDiff()');
1505
1506 FII_MESSAGE.Func_Fail
1507 (func_name =>'FII_BUDGET_FORECAST_C.Psi_DeleteDiff');
1508
1509 fii_util.put_line ('Phase: ' || g_phase ||
1510 'Error: ' || sqlerrm);
1511 RETURN FALSE;
1512
1513 WHEN OTHERS THEN
1514 FND_CONCURRENT.Af_Rollback;
1515
1516 FII_MESSAGE.Write_Log
1517 (msg_name => 'FII_ERROR',
1518 token_num => 2,
1519 t1 => 'FUNCTION',
1520 v1 => 'FII_BUDGET_FORECAST_C.Psi_DeleteDiff()',
1521 t2 => 'SQLERRMC',
1522 v2 => SQLERRM);
1523
1524 FII_MESSAGE.Func_Fail
1525 (func_name => 'FII_BUDGET_FORECAST_C.Psi_DeleteDiff');
1526
1527 fii_util.put_line ('Phase: ' || g_phase ||
1528 'Error: ' || sqlerrm);
1529 RETURN FALSE;
1530
1531 END Psi_DeleteDiff;
1532
1533 -------------------------------------------------------------------------------
1534 --
1535 -- Procedure
1536 -- Psi_Insert_Base()
1537 -- Purpose
1538 -- This routine will merge new/modified budget data from fii_budget_stg
1539 -- into fii_budget_base.
1540 -- Arguments
1541 -- None
1542 -- Example
1543 -- result := FII_BUDGET_FORECAST_C.Psi_Insert_Base;
1544 -- Notes
1545 -- Returns a boolean indicating if execution completes successfully
1546 --
1547 FUNCTION Psi_Insert_Base RETURN BOOLEAN IS
1548 FIIBUUP_fatal_err EXCEPTION;
1549 l_sqlstmt VARCHAR2(10000);
1550
1551 BEGIN
1552
1553 IF (FIIBUUP_DEBUG) THEN
1554 FII_MESSAGE.Func_Ent('FII_BUDGET_FORECAST_C.Psi_Insert_Base');
1555 END IF;
1556
1557 g_phase := 'PSI Insert Base';
1558
1559 ------------------------------------------------------------------------
1560 -- Insert new/modified budget data in fii_budget_stg into fii_budget_base
1561 ------------------------------------------------------------------------
1562 -- Bug 5004852: Changed to populate company_cost_center_org_id as well
1563 -- Bug 4943332: Added hints suggested by the performance team
1564 l_sqlstmt :=
1565 ' INSERT /*+ append parallel(b)*/ INTO fii_budget_base b '||
1566 ' ( plan_type_code, time_id, period_type_id, '||
1567 ' prim_amount_g, prim_amount_total, '||
1568 ' baseline_amount_prim, ledger_id, company_cost_center_org_id, '||
1569 ' company_id, cost_center_id, fin_category_id, category_id, '||
1570 ' user_dim1_id, user_dim2_id, posted_date, '||
1571 ' creation_date, created_by, last_update_date, '||
1572 ' last_updated_by, last_update_login, version_date ) '||
1573 ' SELECT /*+ parallel(stg) */ plan_type_code, '||
1574 ' nvl(day, nvl(period, nvl(quarter, year))), '||
1575 ' decode(day, null, '||
1576 ' decode(period, null, '||
1577 ' decode(quarter, null, 128, 64), 32), 1), '||
1578 ' sum(prim_amount_g), sum(prim_amount_total), '||
1579 ' sum(baseline_amount_prim), '||
1580 ' ledger_id, '||
1581 ' company_cost_center_org_id, '||
1582 ' company_id, '||
1583 ' cost_center_id, '||
1584 ' fin_category_id, '||
1585 ' category_id, '||
1586 ' user_dim1_id, '||
1587 ' user_dim2_id, '||
1588 ' trunc(posted_date), '||
1589 ' sysdate, :user_id, sysdate, :user_id, :login_id, '||
1590 ' :ver_date '||
1591 ' FROM fii_budget_stg '||
1592 ' GROUP BY plan_type_code, '||
1593 ' nvl(day, nvl(period, nvl(quarter, year))), '||
1594 ' decode(day, null, '||
1595 ' decode(period, null, '||
1596 ' decode(quarter, null, 128, 64), 32), 1), '||
1597 ' ledger_id, '||
1598 ' company_cost_center_org_id, '||
1599 ' company_id, '||
1600 ' cost_center_id, '||
1601 ' fin_category_id, '||
1602 ' category_id, '||
1603 ' user_dim1_id, '||
1604 ' user_dim2_id, '||
1605 ' posted_date '||
1606 ' MINUS '||
1607 'SELECT /*+ parallel(b1) */ plan_type_code, '||
1608 ' time_id, '||
1609 ' period_type_id, '||
1610 ' prim_amount_g, '||
1611 ' prim_amount_total, '||
1612 ' baseline_amount_prim, '||
1613 ' ledger_id, '||
1614 ' company_cost_center_org_id, '||
1615 ' company_id, '||
1616 ' cost_center_id, '||
1617 ' fin_category_id, '||
1618 ' category_id, '||
1619 ' user_dim1_id, '||
1620 ' user_dim2_id, '||
1621 ' trunc(posted_date), '||
1622 ' sysdate, :user_id, sysdate, :user_id, :login_id, '||
1623 ' :ver_date '||
1624 ' FROM fii_budget_base ';
1625
1626 -- Print out the dynamic SQL statements if running in debug mode
1627 IF (FIIBUUP_DEBUG) THEN
1628 fii_util.put_line('l_sqlstmt = '|| l_sqlstmt);
1629
1630 FII_MESSAGE.Write_Log
1631 (msg_name => 'FII_ROUTINE_VAL',
1632 token_num => 3 ,
1633 t1 => 'ROUTINE',
1634 v1 => 'FII_BUDGET_FORECAST_C.Psi_Insert_Base()',
1635 t2 => 'VARIABLE',
1636 v2 => 'LENGTH(l_sqlstmt)',
1637 t3 => 'VALUE',
1638 v3 => TO_CHAR(LENGTH(l_sqlstmt)));
1639 END IF;
1640
1641 -- Execute statement
1642 EXECUTE IMMEDIATE l_sqlstmt
1643 USING FIIBUUP_USER_ID, FIIBUUP_USER_ID,
1644 FIIBUUP_LOGIN_ID, FIIBUUP_GLOBAL_START_DATE,
1645 FIIBUUP_USER_ID, FIIBUUP_USER_ID,
1646 FIIBUUP_LOGIN_ID, FIIBUUP_GLOBAL_START_DATE;
1647
1648 IF (FIIBUUP_DEBUG) THEN
1649 fii_util.put_line('Inserted '||SQL%ROWCOUNT||
1650 ' rows into fii_budget_base');
1651 END IF;
1652
1653 -- Need to commit
1654 FND_CONCURRENT.Af_Commit;
1655
1656 -- PSI Budget Extraction is completed, return with success.
1657 IF (FIIBUUP_DEBUG) THEN
1658 FII_MESSAGE.Write_Log
1659 (msg_name => 'FII_ROUTINE',
1660 token_num => 2,
1661 t1 => 'ROUTINE',
1662 v1 => 'Psi_Insert_Base()',
1663 t2 => 'ACTION',
1664 v2 => 'PSI Merge completed successfully...');
1665 END IF;
1666
1667 IF (FIIBUUP_DEBUG) THEN
1668 FII_MESSAGE.Func_Succ('FII_BUDGET_FORECAST_C.Psi_Insert_Base');
1669 END IF;
1670 RETURN TRUE;
1671
1672 -- Exception handling
1673 EXCEPTION
1674 WHEN FIIBUUP_fatal_err THEN
1675 FND_CONCURRENT.Af_Rollback;
1676
1677 FII_MESSAGE.Write_Log
1678 (msg_name => 'FII_ERR_ENC_ROUT',
1679 token_num => 1,
1680 t1 => 'ROUTINE_NAME',
1681 v1 => 'FII_BUDGET_FORECAST_C.Psi_Insert_Base()');
1682
1683 FII_MESSAGE.Func_Fail
1684 (func_name =>'FII_BUDGET_FORECAST_C.Psi_Insert_Base');
1685
1686 fii_util.put_line ('Phase: ' || g_phase ||
1687 'Error: ' || sqlerrm);
1688 RETURN FALSE;
1689
1690 WHEN OTHERS THEN
1691 FND_CONCURRENT.Af_Rollback;
1692
1693 FII_MESSAGE.Write_Log
1694 (msg_name => 'FII_ERROR',
1695 token_num => 2,
1696 t1 => 'FUNCTION',
1697 v1 => 'FII_BUDGET_FORECAST_C.Psi_Insert_Base()',
1698 t2 => 'SQLERRMC',
1699 v2 => SQLERRM);
1700
1701 FII_MESSAGE.Func_Fail
1702 (func_name => 'FII_BUDGET_FORECAST_C.Psi_Insert_Base');
1703
1704 fii_util.put_line ('Phase: ' || g_phase ||
1705 'Error: ' || sqlerrm);
1706 RETURN FALSE;
1707
1708 END Psi_Insert_Base;
1709
1710 -------------------------------------------------------------------------------
1711 --
1712 -- Procedure
1713 -- Psi_Budget_Extract()
1714 -- Purpose
1715 -- When the profile 'INDUSTRY' = 'G', i.e. public sector install, this
1716 -- routine will be called to extract budget data from gl_je_headers/lines.
1717 -- Arguments
1718 -- None
1719 -- Example
1720 -- result := FII_BUDGET_FORECAST_C.Psi_Budget_Extract;
1721 -- Notes
1722 -- Returns a boolean indicating if execution completes successfully
1723 --
1724 PROCEDURE Psi_Budget_Extract (retcode IN OUT NOCOPY VARCHAR2) IS
1725 FIIBUUP_fatal_err EXCEPTION;
1726 l_sqlstmt VARCHAR2(10000);
1727 l_sob_name VARCHAR2(30);
1728 l_currency_code VARCHAR2(15);
1729 l_acct VARCHAR2(350);
1730 l_budget_name VARCHAR2(15);
1731 l_print_hdr1 BOOLEAN := FALSE;
1732 l_row_exists NUMBER;
1733
1734 CURSOR sobCursor (global_prim_curr VARCHAR2) IS
1735 SELECT DISTINCT sob.name, sob.currency_code
1736 FROM fii_slg_assignments slga,
1737 fii_source_ledger_groups fslg,
1738 gl_ledgers_public_v sob
1739 WHERE sob.ledger_id = slga.ledger_id
1740 AND slga.source_ledger_group_id = fslg.source_ledger_group_id
1741 AND fslg.usage_code = 'DBI'
1742 AND sob.currency_code NOT IN (global_prim_curr);
1743
1744 CURSOR dupCursor IS
1745 SELECT /*+ parallel(bud) parallel(stg3) */
1746 DISTINCT acct.concatenated_segments,
1747 bud.budget_name
1748 FROM gl_code_combinations_kfv acct,
1749 gl_budget_versions bud,
1750 (SELECT code_combination_id, count(*)
1751 FROM (SELECT /*+ parallel(stg) */ stg.code_combination_id,
1752 stg.budget_version_id
1753 FROM fii_budget_stg stg
1754 GROUP BY stg.code_combination_id, stg.budget_version_id)
1755 GROUP BY code_combination_id
1756 HAVING COUNT(*) > 1) stg2,
1757 fii_budget_stg stg3
1758 WHERE acct.code_combination_id = stg2.code_combination_id
1759 AND stg3.code_combination_id = stg2.code_combination_id
1760 AND bud.budget_version_id = stg3.budget_version_id
1761 ORDER BY acct.concatenated_segments, bud.budget_name;
1762
1763 CURSOR BaselineAmtCursor IS
1764 SELECT distinct sob.name from (
1765 SELECT nvl(day, nvl(period, nvl(quarter, year))) time_id,
1766 decode(day, null, decode(period, null,
1767 decode(quarter, null, 128, 64), 32), 1) period_type_id,
1768 ledger_id, company_id, cost_center_id, fin_category_id,
1769 category_id, user_dim1_id, user_dim2_id, posted_date,
1770 baseline_amount_prim
1771 FROM fii_budget_stg
1772 MINUS
1773 SELECT time_id, period_type_id,
1774 ledger_id, company_id, cost_center_id, fin_category_id,
1775 category_id, user_dim1_id, user_dim2_id, posted_date,
1776 baseline_amount_prim
1777 FROM fii_budget_base) v,
1778 gl_ledgers_public_v sob
1779 WHERE sob.ledger_id = v.ledger_id;
1780
1781 -- Bug 5004852: Added to select the company_cost_center_org_id for the
1782 -- company_id and cost_center_id of FII_BUDGET_STG
1783 CURSOR ccc_org_cursor IS
1784 SELECT DISTINCT NVL(cccorg.ccc_org_id, -1),
1785 stg.company_id, stg.cost_center_id
1786 FROM FII_CCC_MGR_GT cccorg,
1787 FII_BUDGET_STG stg
1788 WHERE cccorg.company_id (+) = stg.company_id
1789 AND cccorg.cost_center_id (+) = stg.cost_center_id;
1790
1791 -- Bug 5004852: Added the new record types and variables required
1792 TYPE num_type IS TABLE OF NUMBER;
1793 TYPE ccc_org_rec IS RECORD(l_ccc_org_id num_type,
1794 l_com_id num_type,
1795 l_cc_id num_type);
1796 l_ccc_org_rec CCC_ORG_REC;
1797 l_status VARCHAR2(1);
1798 BEGIN
1799
1800 IF (FIIBUUP_DEBUG) THEN
1801 FII_MESSAGE.Func_Ent('FII_BUDGET_FORECAST_C.Psi_Budget_Extract');
1802 END IF;
1803
1804 -- Alter session comments recommendated by the performance team
1805 EXECUTE IMMEDIATE 'ALTER SESSION ENABLE PARALLEL DML';
1806 EXECUTE IMMEDIATE 'ALTER SESSION SET HASH_AREA_SIZE = 100000000';
1807 EXECUTE IMMEDIATE 'ALTER SESSION SET SORT_AREA_SIZE = 100000000';
1808
1809 retcode := 'S';
1810
1811 ------------------------------------------------------------------------
1812 -- Validate SOB currencies
1813 -- We'll check that all set of books set up in FDS has their functional
1814 -- currency = global primary currency. If not, we'll print the set of
1815 -- book names and its functional currency in the output file.
1816 ------------------------------------------------------------------------
1817 g_phase := 'Validate functional currencies';
1818
1819 IF (FIIBUUP_DEBUG) THEN
1820 FII_MESSAGE.Write_Log
1821 (msg_name => 'FII_ROUTINE',
1822 token_num => 2,
1823 t1 => 'ROUTINE',
1824 v1 => 'Psi_Budget_Extract()',
1825 t2 => 'ACTION',
1826 v2 => 'Validating functional currencies are global...');
1827 END IF;
1828
1829 l_print_hdr1 := FALSE;
1830
1831 FOR rec_csr IN sobCursor(FIIBUUP_PRIM_CURR_CODE) LOOP
1832 l_sob_name := rec_csr.name;
1833 l_currency_code := rec_csr.currency_code;
1834 IF (NOT l_print_hdr1) THEN
1835 -- Set the return code so the program will ends with warning.
1836 retcode := 'W';
1837
1838 FII_UTIL.Write_Output (' ');
1839 FII_MESSAGE.Write_Log (msg_name => 'FII_INV_FUNC_CURR_CODE',
1840 token_num => 0);
1841 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
1842 token_num => 0);
1843 FII_MESSAGE.Write_Output (msg_name => 'FII_INV_FUNC_CURR_CODE',
1844 token_num => 0);
1845 l_print_hdr1 := TRUE;
1846 END IF;
1847
1848 FII_UTIL.Write_Output (l_sob_name || ' (' || l_currency_code || ')');
1849 END LOOP;
1850
1851 ------------------------------------------------------------------------
1852 -- Insert budget data into FII_BUDGET_STG from gl_je_headers/lines
1853 ------------------------------------------------------------------------
1854 IF (NOT FII_BUDGET_FORECAST_C.Psi_Insert_Stg) THEN
1855 raise FIIBUUP_fatal_err;
1856 END IF;
1857
1858 ------------------------------------------------------------------------
1859 -- Insert carry forward budget data into FII_BUDGET_STG from gl_balances
1860 ------------------------------------------------------------------------
1861 IF (NOT FII_BUDGET_FORECAST_C.Psi_Carry_Forward) THEN
1862 raise FIIBUUP_fatal_err;
1863 END IF;
1864
1865 ------------------------------------------------------------------------
1866 -- Check if a code combination is used across different budget.
1867 -- If so, print a warning message in the output file.
1868 ------------------------------------------------------------------------
1869 g_phase := 'Validate code combination';
1870 l_print_hdr1 := FALSE;
1871
1872 FOR rec_csr IN dupCursor LOOP
1873 l_acct := rec_csr.concatenated_segments;
1874 l_budget_name := rec_csr.budget_name;
1875
1876 IF (NOT l_print_hdr1) THEN
1877 FII_UTIL.Write_Output (' ');
1878 FII_MESSAGE.Write_Log (msg_name => 'FII_CCID_ACROSS_BUDGETS',
1879 token_num => 0);
1880 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
1881 token_num => 0);
1882 FII_MESSAGE.Write_Output
1883 (msg_name => 'FII_CCID_ACROSS_BUDGETS',
1884 token_num => 0);
1885 l_print_hdr1 := TRUE;
1886 END IF;
1887
1888 FII_UTIL.Write_Output (l_acct|| ' ' || l_budget_name );
1889 END LOOP;
1890
1891 ------------------------------------------------------------------------
1892 -- Rollup budget data along time dimension
1893 ------------------------------------------------------------------------
1894 IF (NOT FII_BUDGET_FORECAST_C.Psi_Rollup) THEN
1895 raise FIIBUUP_fatal_err;
1896 END IF;
1897
1898 ------------------------------------------------------------------------
1899 -- Check if baseline amounts has changed. If so, print a warning message.
1900 ------------------------------------------------------------------------
1901 g_phase := 'Validate baseline amounts';
1902 l_print_hdr1 := FALSE;
1903
1904 FOR rec_csr IN BaselineAmtCursor LOOP
1905 l_sob_name := rec_csr.name;
1906
1907 IF (NOT l_print_hdr1) THEN
1908 retcode := 'W';
1909 FII_UTIL.Write_Output (' ');
1910 FII_MESSAGE.Write_Log (msg_name => 'FII_PSI_BASELINE_CHANGED',
1911 token_num => 0);
1912 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
1913 token_num => 0);
1914 FII_MESSAGE.Write_Output (msg_name => 'FII_PSI_BASELINE_CHANGED',
1915 token_num => 0);
1916 l_print_hdr1 := TRUE;
1917
1918 END IF;
1919 FII_UTIL.Write_Output (l_sob_name);
1920 END LOOP;
1921
1922 ------------------------------------------------------------------------
1923 -- Delete time/dimension combination not exists in new data in fii_budget_stg
1924 ------------------------------------------------------------------------
1925 IF (NOT FII_BUDGET_FORECAST_C.Psi_DeleteDiff) THEN
1926 raise FIIBUUP_fatal_err;
1927 END IF;
1928
1929 -- Bug 5004852: Populate CCC - Mgr mappings temp table before opening the
1930 -- ccc_org_cursor to select company_cost_center_org_id
1931 g_phase := 'Populate the temp table FII_CCC_MGR_GT';
1932 l_status := null;
1933
1934 FII_GL_EXTRACTION_UTIL.LOAD_CCC_MGR (l_status);
1935
1936 IF l_status = -1 then
1937 fii_util.write_log('Error in FII_GL_EXTRACTION_UTIL.LOAD_CCC_MGR ...');
1938 fii_util.write_log('Table FII_CCC_MGR_GT is not populated');
1939 raise NO_DATA_FOUND;
1940 END IF;
1941
1942 -- Bug 5004852: Populate company_cost_center_org_id in fii_budget_stg
1943 -- before inserting data into fii_budget_base
1944 g_phase := 'Open ccc_org_cursor to cache the CCC ORG IDs';
1945
1946 OPEN ccc_org_cursor;
1947 FETCH ccc_org_cursor BULK COLLECT INTO l_ccc_org_rec.l_ccc_org_id,
1948 l_ccc_org_rec.l_com_id,
1949 l_ccc_org_rec.l_cc_id;
1950
1951 g_phase := 'Populate CCC Org IDs of FII_BUDGET_STG';
1952
1953 FORALL i in l_ccc_org_rec.l_cc_id.FIRST .. l_ccc_org_rec.l_cc_id.LAST
1954 UPDATE fii_budget_stg stg
1955 SET stg.company_cost_center_org_id = l_ccc_org_rec.l_ccc_org_id(i)
1956 WHERE stg.company_id = l_ccc_org_rec.l_com_id(i)
1957 AND stg.cost_center_id = l_ccc_org_rec.l_cc_id(i);
1958
1959 CLOSE ccc_org_cursor;
1960
1961 ------------------------------------------------------------------------
1962 -- Merge data in fii_budget_stg into fii_budget_base
1963 ------------------------------------------------------------------------
1964 IF (NOT FII_BUDGET_FORECAST_C.Psi_Insert_Base) THEN
1965 raise FIIBUUP_fatal_err;
1966 END IF;
1967
1968 ------------------------------------------------------------------------
1969 -- Check if there is any budget data in base table. If not, print a
1970 -- warning message.
1971 ------------------------------------------------------------------------
1972 g_phase := 'Validate any budget data exists in base table';
1973 BEGIN
1974 -- Bug fix 4943332: Change to return 1 if any row exists
1975 SELECT 1
1976 INTO l_row_exists
1977 FROM fii_budget_base
1978 WHERE rownum = 1;
1979 EXCEPTION
1980 WHEN NO_DATA_FOUND THEN
1981 FII_MESSAGE.Write_Log (msg_name => 'FII_PSI_NO_RECS', token_num => 0);
1982 retcode := 'W';
1983 END;
1984
1985 -- PSI Budget Extraction is completed, return with success.
1986 IF (FIIBUUP_DEBUG) THEN
1987 FII_MESSAGE.Write_Log
1988 (msg_name => 'FII_ROUTINE',
1989 token_num => 2,
1990 t1 => 'ROUTINE',
1991 v1 => 'Psi_Budget_Extract()',
1992 t2 => 'ACTION',
1993 v2 => 'PSI Budget Extraction completed successfully...');
1994 END IF;
1995
1996 IF (FIIBUUP_DEBUG) THEN
1997 FII_MESSAGE.Func_Succ('FII_BUDGET_FORECAST_C.Psi_Budget_Extract');
1998 END IF;
1999
2000 -- Exception handling
2001 EXCEPTION
2002 WHEN FIIBUUP_fatal_err THEN
2003
2004 FND_CONCURRENT.Af_Rollback;
2005
2006 FII_MESSAGE.Write_Log
2007 (msg_name => 'FII_ERR_ENC_ROUT',
2008 token_num => 1,
2009 t1 => 'ROUTINE_NAME',
2010 v1 => 'FII_BUDGET_FORECAST_C.Psi_Budget_Extract()');
2011
2012 FII_MESSAGE.Func_Fail
2013 (func_name =>'FII_BUDGET_FORECAST_C.Psi_Budget_Extract');
2014
2015 fii_util.put_line ('Phase: ' || g_phase ||
2016 'Error: ' || sqlerrm);
2017
2018 retcode := 'E';
2019
2020 WHEN OTHERS THEN
2021
2022 FND_CONCURRENT.Af_Rollback;
2023
2024 FII_MESSAGE.Write_Log
2025 (msg_name => 'FII_ERROR',
2026 token_num => 2,
2027 t1 => 'FUNCTION',
2028 v1 => 'FII_BUDGET_FORECAST_C.Psi_Budget_Extract()',
2029 t2 => 'SQLERRMC',
2030 v2 => SQLERRM);
2031
2032 FII_MESSAGE.Func_Fail
2033 (func_name => 'FII_BUDGET_FORECAST_C.Psi_Budget_Extract');
2034
2035 fii_util.put_line ('Phase: ' || g_phase ||
2036 'Error: ' || sqlerrm);
2037
2038 retcode := 'E';
2039
2040 END Psi_Budget_Extract;
2041
2042 -------------------------------------------------------------------------------
2043 --
2044 -- Procedure
2045 -- Id_Convert()
2046 -- Purpose
2047 -- Perform value to ID conversion on dimensional columns
2048 -- This is for cases when user upload data to fii_budget_interface directly
2049 -- and they insert flex values for the dimensional columns.
2050 -- Arguments
2051 -- None
2052 -- Example
2053 -- result := FII_BUDGET_FORECAST_C.Id_Convert;
2054 -- Notes
2055 -- Returns a boolean indicating if execution completes successfully
2056 --
2057 FUNCTION Id_Convert RETURN BOOLEAN IS
2058 FIIBUUP_fatal_err EXCEPTION;
2059
2060 CURSOR sob_cursor IS
2061 SELECT DISTINCT nvl(f.ledger_id, i.ledger_id),
2062 nvl(i.ledger, '-1')
2063 FROM FII_BUDGET_INTERFACE i,
2064 (SELECT DISTINCT sob.ledger_id, int.ledger
2065 FROM FII_BUDGET_INTERFACE int,
2066 GL_LEDGERS_PUBLIC_V sob
2067 WHERE (sob.ledger_id = int.ledger_id OR
2068 sob.name = int.ledger)) f
2069 WHERE i.ledger = f.ledger(+);
2070
2071 CURSOR co_cursor IS
2072 SELECT DISTINCT nvl(f.flex_value_id, i.company_id),
2073 nvl(i.company, '-1'), f.ledger_id
2074 FROM FII_BUDGET_INTERFACE i,
2075 (SELECT DISTINCT fv.flex_value_id, int.company, int.ledger_id
2076 FROM FII_BUDGET_INTERFACE int,
2077 FII_DIM_MAPPING_RULES r,
2078 FND_FLEX_VALUES fv,
2079 GL_LEDGERS_PUBLIC_V sob
2080 WHERE r.dimension_short_name = 'FII_COMPANIES'
2081 AND r.chart_of_accounts_id = sob.chart_of_accounts_id
2082 AND (sob.ledger_id = int.ledger_id OR
2083 sob.name = int.ledger)
2084 AND fv.flex_value_set_id = r.FLEX_VALUE_SET_ID1
2085 AND int.company = fv.flex_value) f
2086 WHERE i.company = f.company(+);
2087
2088 CURSOR cc_cursor IS
2089 SELECT DISTINCT nvl(f.flex_value_id, i.cost_center_id),
2090 nvl(i.cost_center, '-1'), f.ledger_id
2091 FROM FII_BUDGET_INTERFACE i,
2092 (SELECT DISTINCT fv.flex_value_id, int.cost_center, int.ledger_id
2093 FROM FII_BUDGET_INTERFACE int,
2094 FII_DIM_MAPPING_RULES r,
2095 FND_FLEX_VALUES fv,
2096 GL_LEDGERS_PUBLIC_V sob
2097 WHERE r.dimension_short_name = 'HRI_CL_ORGCC'
2098 AND r.chart_of_accounts_id = sob.chart_of_accounts_id
2099 AND (sob.ledger_id = int.ledger_id OR
2100 sob.name = int.ledger)
2101 AND fv.flex_value_set_id = r.FLEX_VALUE_SET_ID1
2102 AND int.cost_center = fv.flex_value) f
2103 WHERE i.cost_center = f.cost_center(+);
2104
2105 CURSOR ccc_org_cursor IS
2106 SELECT DISTINCT NVL(cccorg.ccc_org_id, -1),
2107 int.company_id, int.cost_center_id
2108 FROM FII_CCC_MGR_GT cccorg,
2109 FII_BUDGET_INTERFACE int
2110 WHERE cccorg.company_id (+) = int.company_id
2111 AND cccorg.cost_center_id (+) = int.cost_center_id
2112 AND int.company_cost_center_org_id IS NULL;
2113
2114 CURSOR fc_cursor IS
2115 SELECT DISTINCT nvl(f.flex_value_id, i.fin_category_id),
2116 nvl(i.fin_item, '-1'), f.ledger_id
2117 FROM FII_BUDGET_INTERFACE i,
2118 (SELECT DISTINCT fv.flex_value_id, int.fin_item, int.ledger_id
2119 FROM FII_DIM_MAPPING_RULES r,
2120 FII_BUDGET_INTERFACE int,
2121 FND_FLEX_VALUES fv,
2122 GL_LEDGERS_PUBLIC_V sob
2123 WHERE r.dimension_short_name = 'GL_FII_FIN_ITEM'
2124 AND r.chart_of_accounts_id = sob.chart_of_accounts_id
2125 AND (sob.ledger_id = int.ledger_id OR
2126 sob.name = int.ledger)
2127 AND fv.flex_value_set_id = r.FLEX_VALUE_SET_ID1
2128 AND int.fin_item = fv.flex_value) f
2129 WHERE i.fin_item = f.fin_item(+);
2130
2131 -- Cursor used for User-Defined Dimension dimension
2132 CURSOR udd1_cursor IS
2133 SELECT DISTINCT nvl(f.flex_value_id, FIIBUUP_UNASSIGNED_UDD_ID),
2134 nvl(i.user_dim1, 'UNASSIGNED'), f.ledger_id
2135 FROM FII_BUDGET_INTERFACE i,
2136 (SELECT DISTINCT fv.flex_value_id, int.user_dim1 , int.ledger_id
2137 FROM FII_DIM_MAPPING_RULES r,
2138 FII_BUDGET_INTERFACE int,
2139 FND_FLEX_VALUES fv,
2140 GL_LEDGERS_PUBLIC_V sob
2141 WHERE r.dimension_short_name = 'FII_USER_DEFINED_1'
2142 AND r.chart_of_accounts_id = sob.chart_of_accounts_id
2143 AND (sob.ledger_id = int.ledger_id OR
2144 sob.name = int.ledger)
2145 AND fv.flex_value_set_id = r.flex_value_set_id1
2146 AND int.user_dim1 = fv.flex_value) f
2147 WHERE i.user_dim1 = f.user_dim1(+);
2148
2149 -- Cursor used for Product Category dimension
2150 CURSOR prod_cat_cursor IS
2151 SELECT DISTINCT m.category_id, int.product_code
2152 FROM mtl_categories_tl m, fii_budget_interface int
2153 WHERE m.description = int.product_code
2154 AND m.language = userenv('LANG');
2155
2156 TYPE num_type IS TABLE OF NUMBER;
2157 TYPE value_type IS TABLE OF VARCHAR2(150);
2158
2159 -- Table for storing flex value id to value mapping
2160 TYPE id_val_rec IS RECORD(
2161 l_id num_type,
2162 l_value value_type,
2163 l_ledger_id num_type );
2164
2165 -- Table for finding ccc_org_id
2166 TYPE ccc_org_rec IS RECORD(
2167 l_ccc_org_id num_type,
2168 l_com_id num_type,
2169 l_cc_id num_type);
2170
2171 l_id_val_rec ID_VAL_REC;
2172 l_ccc_org_rec CCC_ORG_REC;
2173 l_udd1_enabled_flag VARCHAR2(1);
2174 l_status VARCHAR2(1) := null;
2175
2176 BEGIN
2177 IF (FIIBUUP_DEBUG) THEN
2178 FII_MESSAGE.Func_Ent('FII_BUDGET_FORECAST_C.Id_Convert');
2179 END IF;
2180
2181 ----------------------------------------------------
2182 -- Populate CCC - Mgr mappings temp table
2183 ----------------------------------------------------
2184 g_phase := 'Call program that populates CCC - Mgr mappings temp table.';
2185 FII_GL_EXTRACTION_UTIL.LOAD_CCC_MGR (l_status);
2186
2187 IF l_status = -1 then
2188 fii_util.write_log('Error in FII_GL_EXTRACTION_UTIL.LOAD_CCC_MGR ...');
2189 fii_util.write_log('Table FII_CCC_MGR_GT is not populated');
2190 raise NO_DATA_FOUND;
2191 END IF;
2192
2193 g_phase := 'Value to ID Conversion';
2194
2195 -- Store value to ID mappings for the ledger dimension
2196
2197 OPEN sob_cursor;
2198 FETCH sob_cursor BULK COLLECT INTO l_id_val_rec.l_id, l_id_val_rec.l_value;
2199
2200 FORALL i in l_id_val_rec.l_id.FIRST .. l_id_val_rec.l_id.LAST
2201 UPDATE fii_budget_interface int
2202 SET int.ledger_id = l_id_val_rec.l_id(i)
2203 WHERE int.ledger = l_id_val_rec.l_value(i);
2204
2205 CLOSE sob_cursor;
2206
2207 -- Store value to ID mappings for the company dimension
2208 OPEN co_cursor;
2209 FETCH co_cursor BULK COLLECT INTO l_id_val_rec.l_id,
2210 l_id_val_rec.l_value,
2211 l_id_val_rec.l_ledger_id;
2212
2213 FORALL i in l_id_val_rec.l_id.FIRST .. l_id_val_rec.l_id.LAST
2214 UPDATE fii_budget_interface int
2215 SET int.company_id = l_id_val_rec.l_id(i)
2216 WHERE int.company = l_id_val_rec.l_value(i)
2217 AND int.ledger_id = l_id_val_rec.l_ledger_id(i);
2218
2219 CLOSE co_cursor;
2220
2221 -- Store value to ID mappings for the cost center dimension
2222 OPEN cc_cursor;
2223 FETCH cc_cursor BULK COLLECT INTO l_id_val_rec.l_id,
2224 l_id_val_rec.l_value,
2225 l_id_val_rec.l_ledger_id;
2226
2227 FORALL i in l_id_val_rec.l_id.FIRST .. l_id_val_rec.l_id.LAST
2228 UPDATE fii_budget_interface int
2229 SET int.cost_center_id = l_id_val_rec.l_id(i)
2230 WHERE int.cost_center = l_id_val_rec.l_value(i)
2231 AND int.ledger_id = l_id_val_rec.l_ledger_id(i);
2232
2233 CLOSE cc_cursor;
2234
2235 -- Now we should have the company IDs and cost center IDs in the
2236 -- interface table. Now find out the ccc org IDs.
2237 OPEN ccc_org_cursor;
2238 FETCH ccc_org_cursor BULK COLLECT INTO l_ccc_org_rec.l_ccc_org_id,
2239 l_ccc_org_rec.l_com_id,
2240 l_ccc_org_rec.l_cc_id;
2241
2242 IF (l_ccc_org_rec.l_cc_id.FIRST IS NOT NULL) THEN
2243 FORALL i in l_ccc_org_rec.l_cc_id.FIRST .. l_ccc_org_rec.l_cc_id.LAST
2244 UPDATE fii_budget_interface int
2245 SET int.company_cost_center_org_id = l_ccc_org_rec.l_ccc_org_id(i)
2246 WHERE int.company_id = l_ccc_org_rec.l_com_id(i)
2247 AND int.cost_center_id = l_ccc_org_rec.l_cc_id(i);
2248 END IF;
2249
2250 CLOSE ccc_org_cursor;
2251
2252 -- Store value to ID mappings for the financial category dimension
2253 OPEN fc_cursor;
2254 FETCH fc_cursor BULK COLLECT INTO l_id_val_rec.l_id,
2255 l_id_val_rec.l_value,
2256 l_id_val_rec.l_ledger_id;
2257
2258 FORALL i in l_id_val_rec.l_id.FIRST .. l_id_val_rec.l_id.LAST
2259 UPDATE fii_budget_interface int
2260 SET int.fin_category_id = l_id_val_rec.l_id(i)
2261 WHERE int.fin_item = l_id_val_rec.l_value(i)
2262 AND int.ledger_id = l_id_val_rec.l_ledger_id(i);
2263 CLOSE fc_cursor;
2264
2265 -- Process UDD1 Dimension
2266 -- Check if UDD1 is enabled or not
2267
2268 SELECT DBI_ENABLED_FLAG
2269 INTO l_udd1_enabled_flag
2270 FROM FII_FINANCIAL_DIMENSIONS
2271 WHERE dimension_short_name = 'FII_USER_DEFINED_1';
2272
2273 IF (l_udd1_enabled_flag = 'Y') THEN
2274 -- UDD1 is enabled. Perform value to ID conversion.
2275 OPEN udd1_cursor;
2276 FETCH udd1_cursor BULK COLLECT INTO l_id_val_rec.l_id,
2277 l_id_val_rec.l_value,
2278 l_id_val_rec.l_ledger_id;
2279
2280 FORALL i in l_id_val_rec.l_id.FIRST .. l_id_val_rec.l_id.LAST
2281 UPDATE fii_budget_interface int
2282 SET (int.user_dim1_id, int.user_dim1,
2283 int.user_dim2_id, int.user_dim2) =
2284 (SELECT l_id_val_rec.l_id(i), l_id_val_rec.l_value(i),
2285 FIIBUUP_UNASSIGNED_UDD_ID, 'UNASSIGNED' from dual)
2286 WHERE NVL(int.user_dim1, 'UNASSIGNED') = l_id_val_rec.l_value(i)
2287 AND int.ledger_id = l_id_val_rec.l_ledger_id(i);
2288
2289 CLOSE udd1_cursor;
2290
2291 ELSE
2292 -- UDD1 is disabled. Update user_dim1 to UNASSIGNED and user_dim1_id to
2293 -- the pre-seeded unassigned ID.
2294 UPDATE fii_budget_interface int
2295 SET (int.user_dim1_id, int.user_dim1, int.user_dim2_id, int.user_dim2) =
2296 (SELECT FIIBUUP_UNASSIGNED_UDD_ID, 'UNASSIGNED',
2297 FIIBUUP_UNASSIGNED_UDD_ID, 'UNASSIGNED' from dual);
2298
2299 END IF;
2300
2301 -- Process Product Category Dimension
2302 OPEN prod_cat_cursor;
2303 FETCH prod_cat_cursor BULK COLLECT INTO l_id_val_rec.l_id,
2304 l_id_val_rec.l_value;
2305
2306 IF (l_id_val_rec.l_id.FIRST IS NOT NULL) THEN
2307 FORALL i in l_id_val_rec.l_id.FIRST .. l_id_val_rec.l_id.LAST
2308 UPDATE fii_budget_interface int
2309 SET int.prod_category_id = l_id_val_rec.l_id(i)
2310 WHERE int.product_code = l_id_val_rec.l_value(i);
2311 END IF;
2312
2313 CLOSE prod_cat_cursor;
2314
2315 -- Value to ID conversion is completed, return with success.
2316 IF (FIIBUUP_DEBUG) THEN
2317 FII_MESSAGE.Write_Log
2318 (msg_name => 'FII_ROUTINE',
2319 token_num => 2,
2320 t1 => 'ROUTINE',
2321 v1 => 'Id_Convert()',
2322 t2 => 'ACTION',
2323 v2 => 'Value to ID Conversion completed successfully...');
2324 END IF;
2325
2326 IF (FIIBUUP_DEBUG) THEN
2327 FII_MESSAGE.Func_Succ('FII_BUDGET_FORECAST_C.Id_Convert');
2328 END IF;
2329 RETURN TRUE;
2330
2331 -- Exception handling
2332 EXCEPTION
2333 WHEN FIIBUUP_fatal_err THEN
2334
2335 FND_CONCURRENT.Af_Rollback;
2336
2337 FII_MESSAGE.Write_Log
2338 (msg_name => 'FII_ERR_ENC_ROUT',
2339 token_num => 1,
2340 t1 => 'ROUTINE_NAME',
2341 v1 => 'FII_BUDGET_FORECAST_C.Id_Convert()');
2342
2343 FII_MESSAGE.Func_Fail
2344 (func_name =>'FII_BUDGET_FORECAST_C.Id_Convert');
2345
2346 fii_util.put_line ('Phase: ' || g_phase ||
2347 'Error: ' || sqlerrm);
2348
2349 RETURN FALSE;
2350
2351 WHEN OTHERS THEN
2352
2353 FND_CONCURRENT.Af_Rollback;
2354
2355 FII_MESSAGE.Write_Log
2356 (msg_name => 'FII_ERROR',
2357 token_num => 2,
2358 t1 => 'FUNCTION',
2359 v1 => 'FII_BUDGET_FORECAST_C.Id_Convert()',
2360 t2 => 'SQLERRMC',
2361 v2 => SQLERRM);
2362
2363 FII_MESSAGE.Func_Fail
2364 (func_name => 'FII_BUDGET_FORECAST_C.Id_Convert');
2365
2366 fii_util.put_line ('Phase: ' || g_phase ||
2367 'Error: ' || sqlerrm);
2368
2369 RETURN FALSE;
2370
2371 END Id_convert;
2372 -------------------------------------------------------------------------------
2373 --
2374 -- Procedure
2375 -- Validate
2376 -- Purpose
2377 -- Validate all data in FII_BUDGET_INTERFACE and reports any
2378 -- violations found:
2379 --
2380 -- 1. Validate records are either for budgets or forecast
2381 -- 2. Check if any record is missing any time period information
2382 -- 3. Validate that the time dimension provided in the interface table
2383 -- is valid in the global calendar and time granularity is at the
2384 -- same level as the profile
2385 -- 4. Validate that company information is provided
2386 -- Validate that company is defined as leaf nodes in vs setup in FDS
2387 -- 5. Validate that cost center information is provided
2388 -- Validate that cost center is defined as leaf nodes in vs setup in FDS
2389 -- 6. Validate that fin cat ID is provided and valid in vs setup in FDS
2390 -- 7. Validate that prod category ID is provided and is valid
2391 -- 8. Validate that user defined dim1 is provided if udd1 enabled and
2392 -- it is valid in vs setup in FDS
2393 -- 9. Validate conversion rates is provided if only primary amount is given
2394 -- and primary and secondary currency are not the same.
2395 -- Also validate that conversion rates are positive and non-zero.
2396 -- 10. Validate only one record exists for the time/dimension combination
2397 -- 11. Validate version date is equal to or greater than global start date.
2398 -- Also validate that it is greater than or equal to the latest version
2399 -- date for the period/dimension combination.
2400 --
2401 -- Arguments
2402 -- None
2403 -- Example
2404 -- result := FII_BUDGET_FORECAST_C.Validate;
2405 -- Notes
2406 -- Returns a boolean indicating if execution completes successfully
2407 PROCEDURE Validate (retcode IN OUT NOCOPY VARCHAR2) IS
2408 TYPE anyCursor IS REF CURSOR;
2409 FIIBUUP_fatal_err EXCEPTION;
2410 l_sqlstmt VARCHAR2(5000);
2411 l_print_hdr1 BOOLEAN := FALSE;
2412 l_print_hdr2 BOOLEAN := FALSE;
2413 l_violations_found BOOLEAN := FALSE;
2414 l_timeUnitCursor anyCursor;
2415 l_plan_code VARCHAR2(1) := NULL;
2416 l_time_unit VARCHAR2(100) := NULL;
2417 l_prim_amount_g NUMBER;
2418 l_ledger VARCHAR2(150);
2419 l_ledger_id NUMBER(15);
2420 l_com VARCHAR2(150);
2421 l_com_id NUMBER(15);
2422 l_cc VARCHAR2(150);
2423 l_cc_id NUMBER(15);
2424 l_fin_item VARCHAR2(150);
2425 l_fin_cat_id NUMBER(15);
2426 l_prod_cat_id NUMBER(15);
2427 l_prod_code VARCHAR2(150);
2428 l_udd1 VARCHAR2(150);
2429 l_udd1_id NUMBER(15);
2430 l_ver_date DATE;
2431 P_MTC_STRUCTURE_ID NUMBER(15);
2432 l_count NUMBER(15);
2433 l_pcat_enabled_flag VARCHAR2(1);
2434
2435 -- This is the cursor to print out invalid plan_type_code
2436 CURSOR planCursor IS
2437 SELECT plan_type_code, prim_amount_g
2438 FROM FII_BUDGET_INTERFACE
2439 WHERE plan_type_code NOT IN ('B', 'F')
2440 FOR UPDATE OF STATUS_CODE;
2441
2442 -- This is the cursor to print out records with null time
2443 CURSOR csr_null_time_1 IS
2444 SELECT plan_type_code, prim_amount_g
2445 FROM FII_BUDGET_INTERFACE
2446 WHERE report_time_period IS NULL
2447 FOR UPDATE OF STATUS_CODE;
2448
2449 CURSOR csr_null_time_2 IS
2450 SELECT plan_type_code, prim_amount_g
2451 FROM FII_BUDGET_INTERFACE
2452 WHERE plan_type_code = 'B'
2453 AND report_time_period IS NULL
2454 FOR UPDATE OF STATUS_CODE;
2455
2456 CURSOR csr_null_time_3 IS
2457 SELECT plan_type_code, prim_amount_g
2458 FROM FII_BUDGET_INTERFACE
2459 WHERE plan_type_code = 'F'
2460 AND report_time_period IS NULL
2461 FOR UPDATE OF STATUS_CODE;
2462
2463 -- This is the cursor that print out all null ledger
2464 CURSOR csr_null_ledger_id IS
2465 SELECT plan_type_code, prim_amount_g
2466 FROM FII_BUDGET_INTERFACE
2467 WHERE ledger IS NULL
2468 AND ledger_id IS NULL
2469 FOR UPDATE OF STATUS_CODE;
2470
2471 -- Validate that the ledger_id provided are valid and
2472 -- set up in FDS
2473 CURSOR ledgerCursor IS
2474 SELECT b.ledger, b.ledger_id
2475 FROM FII_BUDGET_INTERFACE b
2476 WHERE (b.ledger IS NOT NULL AND b.ledger_id IS NULL) OR
2477 (nvl(b.ledger_id, -1) NOT IN (
2478 SELECT ledger_id
2479 FROM FII_SLG_ASSIGNMENTS))
2480 FOR UPDATE OF STATUS_CODE;
2481
2482 -- This is the cursor that print out all null company id
2483 CURSOR csr_null_com_id IS
2484 SELECT plan_type_code, prim_amount_g
2485 FROM FII_BUDGET_INTERFACE
2486 WHERE company IS NULL
2487 AND company_id IS NULL
2488 FOR UPDATE OF STATUS_CODE;
2489
2490 -- This is the cursor that validates all company_id provided are
2491 -- from the value sets of the BSVs of the ledgers setup in FDS
2492 CURSOR comCursor IS
2493 SELECT b.company, b.company_id
2494 FROM FII_BUDGET_INTERFACE b
2495 WHERE (b.company IS NOT NULL AND b.company_id IS NULL) OR
2496 NOT EXISTS (
2497 SELECT '1'
2498 FROM FND_FLEX_VALUES fv,
2499 FND_ID_FLEX_SEGMENTS fs,
2500 FII_DIM_MAPPING_RULES mr,
2501 FND_SEGMENT_ATTRIBUTE_VALUES b
2502 WHERE fs.application_id = 101
2503 AND fs.id_flex_code = 'GL#'
2504 AND fs.id_flex_num = mr.chart_of_accounts_id
2505 -- AND fs.application_column_name = mr.application_column_name1
2506 -- AND mr.dimension_short_name = 'FII_COMPANIES'
2507 AND fs.application_id = b.application_id
2508 AND fs.id_flex_code = b.id_flex_code
2509 AND fs.id_flex_num = b.id_flex_num
2510 AND fs.application_column_name = b.application_column_name
2511 AND b.attribute_value = 'Y'
2512 AND b.segment_attribute_type = 'GL_BALANCING'
2513 AND fv.flex_value_set_id = fs.flex_value_set_id
2514 AND fv.summary_flag = 'N'
2515 AND (nvl(b.company_id, -1) = fv.flex_value_id ))
2516 FOR UPDATE OF STATUS_CODE;
2517
2518 -- This is the cursor that print out all null cost_center_id
2519 CURSOR csr_null_cc_id IS
2520 SELECT plan_type_code, prim_amount_g
2521 FROM FII_BUDGET_INTERFACE
2522 WHERE cost_center IS NULL
2523 AND cost_center_id IS NULL
2524 FOR UPDATE OF STATUS_CODE;
2525
2526 -- This is the cursor that validates all cost_center_id provided are
2527 -- from the value sets of the cost center segment of ledgers setup in FDS
2528 CURSOR ccCursor IS
2529 SELECT b.cost_center, b.cost_center_id
2530 FROM FII_BUDGET_INTERFACE b
2531 WHERE (b.cost_center IS NOT NULL and b.cost_center_id IS NULL) OR
2532 NOT EXISTS (
2533 SELECT '1'
2534 FROM FND_FLEX_VALUES fv,
2535 FND_ID_FLEX_SEGMENTS fs,
2536 FII_DIM_MAPPING_RULES mr,
2537 FND_SEGMENT_ATTRIBUTE_VALUES b
2538 WHERE fs.application_id = 101
2539 AND fs.id_flex_code = 'GL#'
2540 AND fs.id_flex_num = mr.chart_of_accounts_id
2541 -- AND fs.application_column_name = mr.application_column_name1
2542 -- AND mr.dimension_short_name = 'HRI_CL_ORGCC'
2543 AND fs.application_id = b.application_id
2544 AND fs.id_flex_code = b.id_flex_code
2545 AND fs.id_flex_num = b.id_flex_num
2546 AND fs.application_column_name = b.application_column_name
2547 AND b.attribute_value = 'Y'
2548 AND b.segment_attribute_type = 'FA_COST_CTR'
2549 AND fv.flex_value_set_id = fs.flex_value_set_id
2550 AND fv.summary_flag = 'N'
2551 AND (nvl(b.cost_center_id, -1) = fv.flex_value_id ))
2552 FOR UPDATE OF STATUS_CODE;
2553
2554 -- This is the cursor that print out all null fin_category_id
2555 CURSOR csr_null_fin_cat_id IS
2556 SELECT plan_type_code, prim_amount_g
2557 FROM FII_BUDGET_INTERFACE
2558 WHERE fin_item IS NULL
2559 AND fin_category_id IS NULL
2560 FOR UPDATE OF STATUS_CODE;
2561
2562 -- This is the cursor that validates all fin_category_id
2563 -- provided are indeed defined in the system.
2564 CURSOR fincatCursor IS
2565 SELECT b.fin_item, b.fin_category_id
2566 FROM FII_BUDGET_INTERFACE b
2567 WHERE (b.fin_item IS NOT NULL AND b.fin_category_id IS NULL) OR
2568 NOT EXISTS (
2569 SELECT '1'
2570 FROM fnd_flex_values fv,
2571 fnd_id_flex_segments fs,
2572 fnd_segment_attribute_values b,
2573 fii_dim_mapping_rules mr
2574 WHERE fs.application_id = 101
2575 AND fs.id_flex_code = 'GL#'
2576 AND fs.id_flex_num = mr.chart_of_accounts_id
2577 -- AND fs.application_column_name = mr.application_column_name1
2578 -- AND mr.dimension_short_name = 'GL_FII_FIN_ITEM'
2579 AND fs.application_id = b.application_id
2580 AND fs.id_flex_code = b.id_flex_code
2581 AND fs.id_flex_num = b.id_flex_num
2582 AND fs.application_column_name = b.application_column_name
2583 AND b.attribute_value = 'Y'
2584 AND b.segment_attribute_type = 'GL_ACCOUNT'
2585 AND fv.flex_value_set_id = fs.flex_value_set_id
2586 AND (nvl(b.fin_category_id, -1) = fv.flex_value_id))
2587 FOR UPDATE OF b.STATUS_CODE;
2588
2589 -- This is the cursor that validates all product categories
2590 -- provided are indeed defined in the system.
2591 CURSOR prodCursor IS
2592 SELECT b.product_code, b.prod_category_id
2593 FROM FII_BUDGET_INTERFACE b
2594 WHERE (b.prod_category_id IS NULL AND b.product_code IS NOT NULL) OR
2595 (b.prod_category_id NOT IN
2596 (SELECT mck.category_id
2597 FROM MTL_CATEGORIES_KFV mck
2598 WHERE mck.structure_id = p_mtc_structure_id))
2599 FOR UPDATE OF b.STATUS_CODE;
2600
2601 -- This is the cursor that validates all user_dim1_id
2602 -- provided are indeed defined in the system.
2603 CURSOR udd1Cursor IS
2604 SELECT b.user_dim1, b.user_dim1_id
2605 FROM FII_BUDGET_INTERFACE b
2606 WHERE (b.user_dim1 IS NOT NULL AND b.user_dim1_id IS NULL) OR
2607 (nvl(b.user_dim1_id, -1) NOT IN (
2608 SELECT fv.flex_value_id
2609 FROM fnd_flex_values fv,
2610 fnd_id_flex_segments fs,
2611 fii_dim_mapping_rules mr
2612 WHERE fs.application_id = 101
2613 AND fs.id_flex_code = 'GL#'
2614 AND fs.id_flex_num = mr.chart_of_accounts_id
2615 AND fs.application_column_name = mr.application_column_name1
2616 AND mr.dimension_short_name = 'FII_USER_DEFINED_1'
2617 AND fv.flex_value_set_id = fs.flex_value_set_id
2618 UNION
2619 SELECT FIIBUUP_UNASSIGNED_UDD_ID from DUAL))
2620 FOR UPDATE OF b.STATUS_CODE;
2621
2622 -- This is the cursor that validates conversion rates are present
2623 -- for any record with only the primary global amount provided, and
2624 -- the primary global currency is different from the secondary global
2625 -- currency. It also validates that the conversion rate is positive
2626 -- and non-zero.
2627 CURSOR rateCursor IS
2628 SELECT plan_type_code, prim_amount_g
2629 FROM FII_BUDGET_INTERFACE
2630 WHERE FIIBUUP_SEC_CURR_CODE is NOT NULL
2631 AND sec_amount_g is NULL
2632 AND (conversion_rate is NULL OR conversion_rate <= 0)
2633 FOR UPDATE OF STATUS_CODE;
2634
2635 -- This is the cursor that checks if more than one records exist
2636 -- with the same plan_type_code/period/ledger_id/company_id/cost_center_id/
2637 -- fin_category_id/prod_category_id/user_dim1_id/version_date combination
2638 CURSOR dupRecordCursor IS
2639 SELECT plan_type_code, trunc(version_date),
2640 report_time_period,
2641 ledger_id, company_id, cost_center_id, fin_category_id,
2642 prod_category_id, user_dim1_id
2643 FROM FII_BUDGET_INTERFACE
2644 GROUP BY plan_type_code, trunc(version_date),
2645 report_time_period,
2646 ledger_id, company_id, cost_center_id, fin_category_id,
2647 prod_category_id, user_dim1_id
2648 HAVING count(prim_amount_g) > 1
2649 ORDER BY 1;
2650
2651 -- This is the cursor that validates version date is on or after global
2652 -- start date. Also,, version date in interface is greater than or equal
2653 -- to the latest effective date for the time/dimension combination in
2654 -- the base table.
2655 CURSOR verDateCursorPer IS
2656 SELECT i.plan_type_code, trunc(i.version_date),
2657 i.report_time_period, i.ledger_id,
2658 i.company_id, i.cost_center_id, i.fin_category_id,
2659 i.prod_category_id, i.user_dim1_id
2660 FROM FII_BUDGET_INTERFACE i
2661 WHERE ((trunc(i.version_date) < FIIBUUP_GLOBAL_START_DATE) OR
2662 (trunc(i.version_date) <
2663 (SELECT MAX(b.version_date)
2664 FROM FII_BUDGET_BASE b, FII_TIME_ENT_PERIOD p
2665 WHERE p.name = i.report_time_period
2666 AND b.time_id = p.ent_period_id
2667 AND b.ledger_id = i.ledger_id
2668 AND b.company_id = i.company_id
2669 AND b.cost_center_id = i.cost_center_id
2670 AND b.fin_category_id = i.fin_category_id
2671 AND NVL(b.category_id, -1) = NVL(i.prod_category_id, -1)
2672 AND b.user_dim1_id = i.user_dim1_id
2673 AND trunc(b.upload_date) <> trunc(i.upload_date))))
2674 GROUP BY i.plan_type_code, trunc(i.version_date), i.report_time_period,
2675 i.ledger_id, i.company_id, i.cost_center_id, i.fin_category_id,
2676 i.prod_category_id, i.user_dim1_id;
2677
2678 CURSOR verDateCursorQtr IS
2679 SELECT i.plan_type_code, trunc(i.version_date),
2680 i.report_time_period, i.ledger_id,
2681 i.company_id, i.cost_center_id, i.fin_category_id,
2682 i.prod_category_id, i.user_dim1_id
2683 FROM FII_BUDGET_INTERFACE i
2684 WHERE ((trunc(i.version_date) < FIIBUUP_GLOBAL_START_DATE) OR
2685 (trunc(i.version_date) <
2686 (SELECT MAX(b.version_date)
2687 FROM FII_BUDGET_BASE b, FII_TIME_ENT_QTR q
2688 WHERE q.name = i.report_time_period
2689 AND b.time_id = q.ent_qtr_id
2690 AND b.ledger_id = i.ledger_id
2691 AND b.company_id = i.company_id
2692 AND b.cost_center_id = i.cost_center_id
2693 AND b.fin_category_id = i.fin_category_id
2694 AND NVL(b.category_id, -1) = NVL(i.prod_category_id, -1)
2695 AND b.user_dim1_id = i.user_dim1_id
2696 AND trunc(b.upload_date) <> trunc(i.upload_date))))
2697 GROUP BY i.plan_type_code, trunc(i.version_date), i.report_time_period,
2698 i.ledger_id, i.company_id, i.cost_center_id, i.fin_category_id,
2699 i.prod_category_id, i.user_dim1_id;
2700
2701 CURSOR verDateCursorYr IS
2702 SELECT i.plan_type_code, trunc(i.version_date),
2703 i.report_time_period, i.ledger_id,
2704 i.company_id, i.cost_center_id, i.fin_category_id,
2705 i.prod_category_id, i.user_dim1_id
2706 FROM FII_BUDGET_INTERFACE i
2707 WHERE ((trunc(i.version_date) < FIIBUUP_GLOBAL_START_DATE) OR
2708 (trunc(i.version_date) <
2709 (SELECT MAX(b.version_date)
2710 FROM FII_BUDGET_BASE b, FII_TIME_ENT_YEAR y
2711 WHERE y.name = i.report_time_period
2712 AND b.time_id = y.ent_year_id
2713 AND b.ledger_id = i.ledger_id
2714 AND b.company_id = i.company_id
2715 AND b.cost_center_id = i.cost_center_id
2716 AND b.fin_category_id = i.fin_category_id
2717 AND NVL(b.category_id, -1) = NVL(i.prod_category_id, -1)
2718 AND b.user_dim1_id = i.user_dim1_id
2719 AND trunc(b.upload_date) <> trunc(i.upload_date))))
2720 GROUP BY i.plan_type_code, trunc(i.version_date), i.report_time_period,
2721 i.ledger_id, i.company_id, i.cost_center_id, i.fin_category_id,
2722 i.prod_category_id, i.user_dim1_id;
2723
2724 l_err_count NUMBER;
2725
2726 BEGIN
2727
2728 IF (FIIBUUP_DEBUG) THEN
2729 FII_MESSAGE.Func_Ent('FII_BUDGET_FORECAST_C.Validate');
2730 END IF;
2731
2732 retcode := 'S';
2733
2734 --Remove records with non-null status_code from the interface table
2735 IF (FIIBUUP_DEBUG) THEN
2736 FII_UTIL.Write_Log ('Removing last processed records from the interface table');
2737 END IF;
2738
2739 g_phase := 'Delete from FII_BUDGET_INTERFACE for not-null status_code';
2740 delete from FII_BUDGET_INTERFACE
2741 where status_code is not NULL;
2742
2743 -- Update records as 'VALIDATED' and set the upload date to sysdate
2744 IF (FIIBUUP_DEBUG) THEN
2745 FII_UTIL.Write_Log ('Updating new records in the interface table');
2746 END IF;
2747
2748 g_phase := 'Update all other records to status_code = VALIDATED and upload_date = sysdate';
2749 update FII_BUDGET_INTERFACE
2750 set (status_code, upload_date) = (SELECT 'VALIDATED', sysdate from dual);
2751
2752 -- Bug fix 4943332: We don't need to count the rows of FII_BUDGET_INTERFACE
2753 -- as we can get the row count updated by previuos SQL
2754 IF (SQL%ROWCOUNT = 0) THEN
2755 FII_MESSAGE.Write_Log (msg_name => 'FII_BUD_NO_RECS', token_num => 0);
2756 retcode := 'W';
2757 RETURN;
2758 END IF;
2759
2760 -----------------------------------------------------------------------
2761 -- 1. Validate records are either for budgets or forecast
2762 -----------------------------------------------------------------------
2763 l_print_hdr1 := FALSE;
2764
2765 -- Validates that all plan_type_code are valid
2766 FOR rec_csr IN planCursor LOOP
2767 l_plan_code := rec_csr.plan_type_code;
2768 l_prim_amount_g := rec_csr.prim_amount_g;
2769 IF (NOT l_print_hdr1) THEN
2770 FII_UTIL.Write_Output (' ');
2771 FII_MESSAGE.Write_Log (msg_name => 'FII_INV_PLAN_TYPE_CODE',
2772 token_num => 0);
2773 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
2774 token_num => 0);
2775 FII_MESSAGE.Write_Output
2776 (msg_name => 'FII_INV_PLAN_TYPE_CODE',
2777 token_num => 0);
2778 FII_MESSAGE.Write_Output
2779 (msg_name => 'FII_BUDGET_RECORD_TAB',
2780 token_num => 0);
2781 l_print_hdr1 := TRUE;
2782 END IF;
2783
2784 FII_UTIL.Write_Output (l_plan_code || ' ' || l_prim_amount_g);
2785
2786 UPDATE FII_BUDGET_INTERFACE
2787 SET status_code = 'ERROR'
2788 WHERE CURRENT OF planCursor;
2789 End Loop;
2790
2791 -----------------------------------------------------------------------
2792 -- 2. Check if any record is missing any time period information
2793 -----------------------------------------------------------------------
2794 g_phase := 'Check if any record is missing time period information';
2795 IF (FIIBUUP_DEBUG) THEN
2796 FII_MESSAGE.Write_Log
2797 (msg_name => 'FII_ROUTINE',
2798 token_num => 2,
2799 t1 => 'ROUTINE',
2800 v1 => 'Validate()',
2801 t2 => 'ACTION',
2802 v2 => 'Checking for missing time units...');
2803 END IF;
2804
2805 l_print_hdr1 := FALSE;
2806 IF (FIIBUUP_BUDGET_TIME_UNIT = FIIBUUP_FORECAST_TIME_UNIT) THEN
2807
2808 For rec_csr IN csr_null_time_1 LOOP
2809 l_plan_code := rec_csr.plan_type_code;
2810 l_prim_amount_g := rec_csr.prim_amount_g;
2811 IF (NOT l_print_hdr1) THEN
2812 FII_UTIL.Write_Output (' ');
2813 FII_MESSAGE.Write_Log (msg_name => 'FII_MISS_TIME_BUD_FRC',
2814 token_num => 0);
2815 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
2816 token_num => 0);
2817 FII_MESSAGE.Write_Output
2818 (msg_name => 'FII_MISS_TIME_BUD_FRC',
2819 token_num => 0);
2820 FII_MESSAGE.Write_Output
2821 (msg_name => 'FII_BUDGET_RECORD_TAB',
2822 token_num => 0);
2823 l_print_hdr1 := TRUE;
2824 END IF;
2825
2826 FII_UTIL.Write_Output (l_plan_code || ' ' || l_prim_amount_g);
2827
2828 UPDATE FII_BUDGET_INTERFACE
2829 SET Status_Code = 'ERROR'
2830 WHERE CURRENT OF csr_null_time_1;
2831 End Loop;
2832
2833 ELSE
2834 -- Validate budget data
2835 For rec_csr IN csr_null_time_2 LOOP
2836 l_plan_code := rec_csr.plan_type_code;
2837 l_prim_amount_g := rec_csr.prim_amount_g;
2838 IF (NOT l_print_hdr1) THEN
2839 FII_UTIL.Write_Output (' ');
2840 FII_MESSAGE.Write_Log (msg_name => 'FII_MISS_TIME_BUD',
2841 token_num => 0);
2842 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
2843 token_num => 0);
2844 FII_MESSAGE.Write_Output
2845 (msg_name => 'FII_MISS_TIME_BUD',
2846 token_num => 0);
2847 FII_MESSAGE.Write_Output
2848 (msg_name => 'FII_BUDGET_RECORD_TAB',
2849 token_num => 0);
2850 l_print_hdr1 := TRUE;
2851 END IF;
2852
2853 FII_UTIL.Write_Output (l_plan_code || ' ' || l_prim_amount_g);
2854
2855 UPDATE FII_BUDGET_INTERFACE
2856 SET Status_Code = 'ERROR'
2857 WHERE CURRENT OF csr_null_time_2;
2858 End Loop;
2859
2860 -- Validate forecast data
2861 l_print_hdr1 := FALSE;
2862
2863 For rec_csr IN csr_null_time_3 LOOP
2864 l_plan_code := rec_csr.plan_type_code;
2865 l_prim_amount_g := rec_csr.prim_amount_g;
2866 IF (NOT l_print_hdr1) THEN
2867 FII_UTIL.Write_Output (' ');
2868 FII_MESSAGE.Write_Log (msg_name => 'FII_MISS_TIME_FRC',
2869 token_num => 0);
2870 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
2871 token_num => 0);
2872 FII_MESSAGE.Write_Output
2873 (msg_name => 'FII_MISS_TIME_FRC',
2874 token_num => 0);
2875 FII_MESSAGE.Write_Output
2876 (msg_name => 'FII_BUDGET_RECORD_TAB',
2877 token_num => 0);
2878 l_print_hdr1 := TRUE;
2879 END IF;
2880
2881 FII_UTIL.Write_Output (l_plan_code || ' ' || l_prim_amount_g);
2882
2883 UPDATE FII_BUDGET_INTERFACE
2884 SET Status_Code = 'ERROR'
2885 WHERE CURRENT OF csr_null_time_3;
2886 End Loop;
2887 END IF;
2888
2889 -----------------------------------------------------------------------
2890 -- 3. Validate that the time dimension provided in the interface table
2891 -- is valid in the global calendar and time granularity is at the
2892 -- same level as the profile
2893 -----------------------------------------------------------------------
2894 g_phase := 'Validate that all time unit references are valid';
2895 l_print_hdr1 := FALSE;
2896 IF (FIIBUUP_DEBUG) THEN
2897 FII_MESSAGE.Write_Log
2898 (msg_name => 'FII_ROUTINE',
2899 token_num => 2,
2900 t1 => 'ROUTINE',
2901 v1 => 'Validate()',
2902 t2 => 'ACTION',
2903 v2 => 'Validating all time units specified...');
2904 END IF;
2905
2906 l_sqlstmt := 'SELECT p1.report_time_period TIME ' ||
2907 'FROM (SELECT distinct report_time_period ' ||
2908 ' FROM FII_BUDGET_INTERFACE' ||
2909 ' WHERE report_time_period is not NULL';
2910
2911 IF (FIIBUUP_BUDGET_TIME_UNIT = FIIBUUP_FORECAST_TIME_UNIT) THEN
2912 l_sqlstmt := l_sqlstmt || ' ) p1, ';
2913 ELSE
2914 l_sqlstmt := l_sqlstmt || ' AND plan_type_code = ''B'') p1, ';
2915 END IF;
2916
2917 IF (FIIBUUP_BUDGET_TIME_UNIT = 'P') THEN
2918 l_sqlstmt := l_sqlstmt || 'FII_TIME_ENT_PERIOD b ';
2919 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Q') THEN
2920 l_sqlstmt := l_sqlstmt || 'FII_TIME_ENT_QTR b ';
2921 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Y') THEN
2922 l_sqlstmt := l_sqlstmt || 'FII_TIME_ENT_YEAR b ';
2923 END IF;
2924
2925 l_sqlstmt := l_sqlstmt ||
2926 'WHERE b.name(+) = p1.report_time_period ' ||
2927 'AND b.rowid is NULL ';
2928
2929 l_sqlstmt := l_sqlstmt || 'ORDER BY TIME';
2930
2931 -- Print out the dynamic SQL statement if running in debug mode
2932 IF (FIIBUUP_DEBUG) THEN
2933 FII_MESSAGE.Write_Log
2934 (msg_name => 'FII_ROUTINE_VAL',
2935 token_num => 3 ,
2936 t1 => 'ROUTINE',
2937 v1 => 'FII_BUDGET_FORECAST_C.Validate()',
2938 t2 => 'VARIABLE',
2939 v2 => 'l_sqlstmt',
2940 t3 => 'VALUE',
2941 v3 => l_sqlstmt);
2942
2943 FII_MESSAGE.Write_Log
2944 (msg_name => 'FII_ROUTINE_VAL',
2945 token_num => 3 ,
2946 t1 => 'ROUTINE',
2947 v1 => 'FII_BUDGET_FORECAST_C.Validate()',
2948 t2 => 'VARIABLE',
2949 v2 => 'LENGTH(l_sqlstmt)',
2950 t3 => 'VALUE',
2951 v3 => TO_CHAR(LENGTH(l_sqlstmt)));
2952 END IF;
2953
2954 IF (NOT l_timeUnitCursor%ISOPEN) THEN
2955 OPEN l_timeUnitCursor FOR l_sqlstmt;
2956 END IF;
2957
2958 LOOP
2959 FETCH l_timeUnitCursor INTO l_time_unit;
2960 EXIT WHEN l_timeUnitCursor%NOTFOUND;
2961
2962 l_violations_found := TRUE;
2963
2964 IF (NOT l_print_hdr1) THEN
2965 FII_UTIL.Write_Output (' ');
2966 FII_MESSAGE.Write_Log (msg_name => 'FII_INV_RPT_TIME_BUD',
2967 token_num => 0);
2968 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
2969 token_num => 0);
2970 FII_MESSAGE.Write_Output
2971 (msg_name => 'FII_INV_RPT_TIME_BUD',
2972 token_num => 0);
2973 l_print_hdr1 := TRUE;
2974 END IF;
2975
2976
2977 -- Print out individual invalid reporting time period
2978 FII_MESSAGE.Write_Output
2979 (msg_name => 'FII_TIM_PRD',
2980 token_num => 1,
2981 t1 => 'TIME_PERIOD',
2982 v1 => l_time_unit);
2983
2984 --Update the Status_Code to 'ERROR'
2985
2986 Update FII_BUDGET_INTERFACE
2987 Set Status_Code = 'ERROR'
2988 Where report_time_period = l_time_unit;
2989
2990 END LOOP;
2991
2992 CLOSE l_timeUnitCursor;
2993 l_sqlstmt := NULL;
2994 l_print_hdr1 := FALSE;
2995
2996 -- Build the another statement to verify forecast time periods
2997 -- if profile setting for
2998 -- forecast is different from that for budget
2999 IF (FIIBUUP_BUDGET_TIME_UNIT <> FIIBUUP_FORECAST_TIME_UNIT) THEN
3000
3001 l_sqlstmt := 'SELECT p2.report_time_period TIME ' ||
3002 'FROM (SELECT distinct report_time_period ' ||
3003 ' FROM FII_BUDGET_INTERFACE ' ||
3004 ' WHERE report_time_period is not NULL ' ||
3005 ' AND plan_type_code = ''F'') p2, ';
3006
3007 IF (FIIBUUP_FORECAST_TIME_UNIT = 'P') THEN
3008 l_sqlstmt := l_sqlstmt || 'FII_TIME_ENT_PERIOD f ';
3009 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Q') THEN
3010 l_sqlstmt := l_sqlstmt || 'FII_TIME_ENT_QTR f ';
3011 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Y') THEN
3012 l_sqlstmt := l_sqlstmt || 'FII_TIME_ENT_YEAR f ';
3013 END IF;
3014
3015 l_sqlstmt := l_sqlstmt ||
3016 'WHERE f.name(+) = p2.report_time_period ' ||
3017 'AND f.rowid is NULL ';
3018
3019 l_sqlstmt := l_sqlstmt || 'ORDER BY TIME';
3020
3021 -- Print out the dynamic SQL statement if running in debug mode
3022 IF (FIIBUUP_DEBUG) THEN
3023 FII_MESSAGE.Write_Log
3024 (msg_name => 'FII_ROUTINE_VAL',
3025 token_num => 3 ,
3026 t1 => 'ROUTINE',
3027 v1 => 'FII_BUDGET_FORECAST_C.Validate()',
3028 t2 => 'VARIABLE',
3029 v2 => 'l_sqlstmt',
3030 t3 => 'VALUE',
3031 v3 => l_sqlstmt);
3032
3033 FII_MESSAGE.Write_Log
3034 (msg_name => 'FII_ROUTINE_VAL',
3035 token_num => 3 ,
3036 t1 => 'ROUTINE',
3037 v1 => 'FII_BUDGET_FORECAST_C.Validate()',
3038 t2 => 'VARIABLE',
3039 v2 => 'LENGTH(l_sqlstmt)',
3040 t3 => 'VALUE',
3041 v3 => TO_CHAR(LENGTH(l_sqlstmt)));
3042 END IF;
3043
3044 IF (NOT l_timeUnitCursor%ISOPEN) THEN
3045 OPEN l_timeUnitCursor FOR l_sqlstmt;
3046 END IF;
3047
3048 LOOP
3049 FETCH l_timeUnitCursor INTO l_time_unit;
3050 EXIT WHEN l_timeUnitCursor%NOTFOUND;
3051
3052 l_violations_found := TRUE;
3053
3054 -- Print header information to output file.
3055 IF (NOT l_print_hdr1) THEN
3056 FII_UTIL.Write_Output (' ');
3057 FII_MESSAGE.Write_Log (msg_name => 'FII_INV_RPT_TIME_FRC',
3058 token_num => 0);
3059 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
3060 token_num => 0);
3061 FII_MESSAGE.Write_Output
3062 (msg_name => 'FII_INV_RPT_TIME_FRC',
3063 token_num => 0);
3064 l_print_hdr1 := TRUE;
3065 END IF;
3066
3067 -- Print out individual invalid reporting time period
3068 FII_MESSAGE.Write_Output
3069 (msg_name => 'FII_TIM_PRD',
3070 token_num => 1,
3071 t1 => 'TIME_PERIOD',
3072 v1 => l_time_unit);
3073
3074 --Update the Status_Code to 'ERROR'
3075 Update FII_BUDGET_INTERFACE
3076 Set Status_Code = 'ERROR'
3077 Where report_time_period = l_time_unit;
3078
3079 END LOOP;
3080
3081 CLOSE l_timeUnitCursor;
3082 l_sqlstmt := NULL;
3083 l_print_hdr1 := FALSE;
3084 l_print_hdr2 := FALSE;
3085
3086 END IF;
3087
3088 -----------------------------------------------------------------------
3089 -- Validate that ledger information is provided
3090 -----------------------------------------------------------------------
3091 g_phase := 'Validate ledger';
3092 IF (FIIBUUP_DEBUG) THEN
3093 FII_MESSAGE.Write_Log
3094 (msg_name => 'FII_ROUTINE',
3095 token_num => 2,
3096 t1 => 'ROUTINE',
3097 v1 => 'Validate()',
3098 t2 => 'ACTION',
3099 v2 => 'Validating all ledger is specified ...');
3100 END IF;
3101
3102 --Check if ledger/ledger_id is null
3103 FOR rec_csr IN csr_null_ledger_id LOOP
3104 l_plan_code := rec_csr.plan_type_code;
3105 l_prim_amount_g := rec_csr.prim_amount_g;
3106 IF (NOT l_print_hdr1) THEN
3107 FII_UTIL.Write_Output (' ');
3108 FII_MESSAGE.Write_Log (msg_name => 'FII_MISS_LEDGER_ID_BUD',
3109 token_num => 0);
3110 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
3111 token_num => 0);
3112 FII_MESSAGE.Write_Output
3113 (msg_name => 'FII_MISS_LEDGER_ID_BUD',
3114 token_num => 0);
3115
3116 FII_MESSAGE.Write_Output
3117 (msg_name => 'FII_BUDGET_RECORD_TAB',
3118 token_num => 0);
3119 l_print_hdr1 := TRUE;
3120 END IF;
3121
3122 FII_UTIL.Write_Output (l_plan_code || ' ' || l_prim_amount_g);
3123
3124 UPDATE FII_BUDGET_INTERFACE
3125 SET status_code = 'ERROR'
3126 WHERE CURRENT OF csr_null_ledger_id;
3127 END LOOP;
3128 l_print_hdr1 := FALSE;
3129
3130 -----------------------------------------------------------------------
3131 -- 4. Validate that company information is provided
3132 -----------------------------------------------------------------------
3133 g_phase := 'Validate company id';
3134 IF (FIIBUUP_DEBUG) THEN
3135 FII_MESSAGE.Write_Log
3136 (msg_name => 'FII_ROUTINE',
3137 token_num => 2,
3138 t1 => 'ROUTINE',
3139 v1 => 'Validate()',
3140 t2 => 'ACTION',
3141 v2 => 'Validating all company specified and valid...');
3142 END IF;
3143
3144 --Check if company_id is null
3145 FOR rec_csr IN csr_null_com_id LOOP
3146 l_plan_code := rec_csr.plan_type_code;
3147 l_prim_amount_g := rec_csr.prim_amount_g;
3148 IF (NOT l_print_hdr1) THEN
3149 FII_UTIL.Write_Output (' ');
3150 FII_MESSAGE.Write_Log (msg_name => 'FII_MISS_CO_ID_BUD',
3151 token_num => 0);
3152 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
3153 token_num => 0);
3154 FII_MESSAGE.Write_Output
3155 (msg_name => 'FII_MISS_CO_ID_BUD',
3156 token_num => 0);
3157
3158 FII_MESSAGE.Write_Output
3159 (msg_name => 'FII_BUDGET_RECORD_TAB',
3160 token_num => 0);
3161 l_print_hdr1 := TRUE;
3162 END IF;
3163
3164 FII_UTIL.Write_Output (l_plan_code || ' ' || l_prim_amount_g);
3165
3166 UPDATE FII_BUDGET_INTERFACE
3167 SET status_code = 'ERROR'
3168 WHERE CURRENT OF csr_null_com_id;
3169 END LOOP;
3170 l_print_hdr1 := FALSE;
3171
3172 -----------------------------------------------------------------------
3173 -- 5. Validate that cost center information is provided
3174 -----------------------------------------------------------------------
3175 g_phase := 'Validate cost center id';
3176 IF (FIIBUUP_DEBUG) THEN
3177 FII_MESSAGE.Write_Log
3178 (msg_name => 'FII_ROUTINE',
3179 token_num => 2,
3180 t1 => 'ROUTINE',
3181 v1 => 'Validate()',
3182 t2 => 'ACTION',
3183 v2 => 'Validating all cost center specified and valid...');
3184 END IF;
3185
3186 --Check if cost_center_id is null
3187 FOR rec_csr IN csr_null_cc_id LOOP
3188 l_plan_code := rec_csr.plan_type_code;
3189 l_prim_amount_g := rec_csr.prim_amount_g;
3190 IF (NOT l_print_hdr1) THEN
3191 FII_UTIL.Write_Output (' ');
3192 FII_MESSAGE.Write_Log (msg_name => 'FII_MISS_CC_ID_BUD',
3193 token_num => 0);
3194 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
3195 token_num => 0);
3196 FII_MESSAGE.Write_Output
3197 (msg_name => 'FII_MISS_CC_ID_BUD',
3198 token_num => 0);
3199
3200 FII_MESSAGE.Write_Output
3201 (msg_name => 'FII_BUDGET_RECORD_TAB',
3202 token_num => 0);
3203 l_print_hdr1 := TRUE;
3204 END IF;
3205
3206 FII_UTIL.Write_Output (l_plan_code || ' ' || l_prim_amount_g);
3207
3208 UPDATE FII_BUDGET_INTERFACE
3209 SET status_code = 'ERROR'
3210 WHERE CURRENT OF csr_null_cc_id;
3211 END LOOP;
3212
3213 l_print_hdr1 := FALSE;
3214
3215 -----------------------------------------------------------------------
3216 -- 6. Validate that fin cat ID is provided
3217 -----------------------------------------------------------------------
3218 -- Validate fin category id
3219 g_phase := 'Validate fin category id';
3220 IF (FIIBUUP_DEBUG) THEN
3221 FII_MESSAGE.Write_Log
3222 (msg_name => 'FII_ROUTINE',
3223 token_num => 2,
3224 t1 => 'ROUTINE',
3225 v1 => 'Validate()',
3226 t2 => 'ACTION',
3227 v2 => 'Validating all financial category specified...');
3228 END IF;
3229
3230 --Check if fin_category_id is null
3231 FOR rec_csr IN csr_null_fin_cat_id LOOP
3232 l_plan_code := rec_csr.plan_type_code;
3233 l_prim_amount_g := rec_csr.prim_amount_g;
3234 IF (NOT l_print_hdr1) THEN
3235 FII_UTIL.Write_Output (' ');
3236 FII_MESSAGE.Write_Log (msg_name => 'FII_MISS_FIN_CAT_ID_BUD',
3237 token_num => 0);
3238 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
3239 token_num => 0);
3240 FII_MESSAGE.Write_Output
3241 (msg_name => 'FII_MISS_FIN_CAT_ID_BUD',
3242 token_num => 0);
3243
3244 FII_MESSAGE.Write_Output
3245 (msg_name => 'FII_BUDGET_RECORD_TAB',
3246 token_num => 0);
3247 l_print_hdr1 := TRUE;
3248 END IF;
3249
3250 FII_UTIL.Write_Output (l_plan_code || ' ' || l_prim_amount_g);
3251
3252 UPDATE FII_BUDGET_INTERFACE
3253 SET Status_Code = 'ERROR'
3254 WHERE CURRENT OF csr_null_fin_cat_id;
3255 End Loop;
3256 l_print_hdr1 := FALSE;
3257
3258 -----------------------------------------------------------------------
3259 -- We have validated that company, cost center and fin category
3260 -- ID or values are provided. Now do value to ID conversion for
3261 -- all dimension values.
3262 -----------------------------------------------------------------------
3263 g_phase := 'Value to ID conversion';
3264
3265 -- Bug fix 4943332: Changed to return 1 if any error row exists
3266 BEGIN
3267 SELECT 1
3268 INTO l_err_count
3269 FROM FII_BUDGET_INTERFACE
3270 WHERE status_code = 'ERROR'
3271 AND rownum = 1;
3272 EXCEPTION
3273 WHEN NO_DATA_FOUND THEN
3274 l_err_count := 0;
3275 END;
3276
3277 IF (l_err_count > 0) THEN
3278 FII_MESSAGE.Write_Log (msg_name => 'FII_MISS_MANDATORY_DIM',
3279 token_num => 0);
3280 raise FIIBUUP_fatal_err;
3281 END IF;
3282
3283 IF(NOT FII_BUDGET_FORECAST_C.Id_Convert) THEN
3284 raise FIIBUUP_fatal_err;
3285 END IF;
3286
3287 -----------------------------------------------------------------------
3288 -- Validate that ledger is defined as leaf nodes in vs setup in FDS
3289 -----------------------------------------------------------------------
3290 g_phase := 'Validate ledger id are valid';
3291 IF (FIIBUUP_DEBUG) THEN
3292 FII_MESSAGE.Write_Log
3293 (msg_name => 'FII_ROUTINE',
3294 token_num => 2,
3295 t1 => 'ROUTINE',
3296 v1 => 'Validate()',
3297 t2 => 'ACTION',
3298 v2 => 'Validating all ledger specified are valid...');
3299 END IF;
3300
3301 -- Validates that all ledger IDs are defined
3302 FOR rec_csr IN ledgerCursor LOOP
3303 l_ledger_id := rec_csr.ledger_id;
3304 l_ledger := rec_csr.ledger;
3305 l_violations_found := TRUE;
3306
3307 -- print header information into output file
3308 IF (NOT l_print_hdr1) THEN
3309 FII_UTIL.Write_Output (' ');
3310 FII_MESSAGE.Write_Log (msg_name => 'FII_INV_LEDGER_ID_DATA',
3311 token_num => 0);
3312 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
3313 token_num => 0);
3314 FII_MESSAGE.Write_Output
3315 (msg_name => 'FII_INV_LEDGER_ID_DATA',
3316 token_num => 0);
3317
3318 l_print_hdr1 := TRUE;
3319 END IF;
3320
3321 -- print out individual invalid ledger id
3322 FII_UTIL.Write_Output (l_ledger_id || ' ' || l_ledger);
3323
3324 UPDATE FII_BUDGET_INTERFACE
3325 SET status_code = 'ERROR'
3326 WHERE CURRENT OF ledgerCursor;
3327
3328 END LOOP;
3329 l_print_hdr1 := FALSE;
3330
3331 -----------------------------------------------------------------------
3332 -- Validate that company is defined as leaf nodes in vs setup in FDS
3333 -----------------------------------------------------------------------
3334 g_phase := 'Validate company id are valid';
3335 IF (FIIBUUP_DEBUG) THEN
3336 FII_MESSAGE.Write_Log
3337 (msg_name => 'FII_ROUTINE',
3338 token_num => 2,
3339 t1 => 'ROUTINE',
3340 v1 => 'Validate()',
3341 t2 => 'ACTION',
3342 v2 => 'Validating all company specified are valid...');
3343 END IF;
3344
3345 -- Validates that all company IDs are defined
3346 FOR rec_csr IN comCursor LOOP
3347 l_com_id := rec_csr.company_id;
3348 l_com := rec_csr.company;
3349 l_violations_found := TRUE;
3350
3351 -- print header information into output file
3352 IF (NOT l_print_hdr1) THEN
3353 FII_UTIL.Write_Output (' ');
3354 FII_MESSAGE.Write_Log (msg_name => 'FII_INV_CO_ID_DATA',
3355 token_num => 0);
3356 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
3357 token_num => 0);
3358 FII_MESSAGE.Write_Output
3359 (msg_name => 'FII_INV_CO_ID_DATA',
3360 token_num => 0);
3361
3362 l_print_hdr1 := TRUE;
3363 END IF;
3364
3365 -- print out individual invalid company id
3366 FII_UTIL.Write_Output (l_com_id || ' ' || l_com);
3367
3368 UPDATE FII_BUDGET_INTERFACE
3369 SET status_code = 'ERROR'
3370 WHERE CURRENT OF comCursor;
3371
3372 END LOOP;
3373 l_print_hdr1 := FALSE;
3374
3375 -----------------------------------------------------------------------
3376 -- Validate that cost center is defined as leaf nodes in vs setup in FDS
3377 -----------------------------------------------------------------------
3378 g_phase := 'Validate cost center are valid';
3379 IF (FIIBUUP_DEBUG) THEN
3380 FII_MESSAGE.Write_Log
3381 (msg_name => 'FII_ROUTINE',
3382 token_num => 2,
3383 t1 => 'ROUTINE',
3384 v1 => 'Validate()',
3385 t2 => 'ACTION',
3386 v2 => 'Validating all cost center specified are valid...');
3387 END IF;
3388
3389 -- Validates that all cost center IDs are defined
3390 FOR rec_csr IN ccCursor LOOP
3391 l_cc_id := rec_csr.cost_center_id;
3392 l_cc := rec_csr.cost_center;
3393 l_violations_found := TRUE;
3394
3395 -- print header information into output file
3396 IF (NOT l_print_hdr1) THEN
3397 FII_UTIL.Write_Output (' ');
3398 FII_MESSAGE.Write_Log (msg_name => 'FII_INV_CC_ID_DATA',
3399 token_num => 0);
3400 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
3401 token_num => 0);
3402 FII_MESSAGE.Write_Output
3403 (msg_name => 'FII_INV_CC_ID_DATA',
3404 token_num => 0);
3405
3406 l_print_hdr1 := TRUE;
3407 END IF;
3408
3409 -- print out individual invalid cost center id
3410 FII_UTIL.Write_Output (l_cc_id || ' ' || l_cc);
3411
3412 UPDATE FII_BUDGET_INTERFACE
3413 SET status_code = 'ERROR'
3414 WHERE CURRENT OF ccCursor;
3415
3416 END LOOP;
3417 l_print_hdr1 := FALSE;
3418
3419 -----------------------------------------------------------------------
3420 -- Validates that all financial categories are defined
3421 -----------------------------------------------------------------------
3422 g_phase := 'Validate financial categories are valid';
3423 IF (FIIBUUP_DEBUG) THEN
3424 FII_MESSAGE.Write_Log
3425 (msg_name => 'FII_ROUTINE',
3426 token_num => 2,
3427 t1 => 'ROUTINE',
3428 v1 => 'Validate()',
3429 t2 => 'ACTION',
3430 v2 => 'Validating all financial categories specified are valid...');
3431 END IF;
3432
3433 FOR rec_csr IN fincatCursor LOOP
3434 l_fin_cat_id := rec_csr.fin_category_id;
3435 l_fin_item := rec_csr.fin_item;
3436 l_violations_found := TRUE;
3437
3438 -- print header information into output file
3439 IF (NOT l_print_hdr1) THEN
3440 FII_UTIL.Write_Output (' ');
3441 FII_MESSAGE.Write_Log (msg_name => 'FII_INV_FIN_CAT_ID_DATA',
3442 token_num => 0);
3443 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
3444 token_num => 0);
3445 FII_MESSAGE.Write_Output
3446 (msg_name => 'FII_INV_FIN_CAT_ID_DATA',
3447 token_num => 0);
3448
3449 l_print_hdr1 := TRUE;
3450 END IF;
3451
3452 -- print out individual invalid financial category id
3453 FII_UTIL.Write_Output (l_fin_cat_id || ' ' || l_fin_item);
3454
3455 UPDATE FII_BUDGET_INTERFACE
3456 SET status_code = 'ERROR'
3457 WHERE CURRENT OF fincatCursor;
3458
3459 END LOOP;
3460 l_print_hdr1 := FALSE;
3461
3462 -----------------------------------------------------------------------
3463 -- 7. Validate that prod category ID is provided and is valid
3464 -----------------------------------------------------------------------
3465 -- Validates that all product categories are defined
3466 g_phase := 'Validates that all product categories are defined (1)';
3467
3468 -- Check if product category dimension is enabled or not.
3469 SELECT DBI_ENABLED_FLAG
3470 INTO l_pcat_enabled_flag
3471 FROM FII_FINANCIAL_DIMENSIONS
3472 WHERE dimension_short_name = 'ENI_ITEM_VBH_CAT';
3473
3474 IF (l_pcat_enabled_flag = 'Y') THEN
3475 SELECT structure_id INTO p_mtc_structure_id
3476 FROM MTL_CATEGORY_SETS_VL
3477 WHERE category_set_id = ENI_DENORM_HRCHY.get_category_set_id;
3478
3479 g_phase := 'Validates that all product categories are defined (2)';
3480 FOR rec_csr IN prodCursor LOOP
3481 l_prod_cat_id := rec_csr.prod_category_id;
3482 l_prod_code := rec_csr.product_code;
3483 l_violations_found := TRUE;
3484
3485 -- print header information into output file
3486 IF (NOT l_print_hdr1) THEN
3487 FII_UTIL.Write_Output (' ');
3488 FII_MESSAGE.Write_Log (msg_name => 'FII_INV_PROD_CAT_ID_DATA',
3489 token_num => 0);
3490 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
3491 token_num => 0);
3492 FII_MESSAGE.Write_Output
3493 (msg_name => 'FII_INV_PROD_CAT_ID_DATA',
3494 token_num => 0);
3495
3496 l_print_hdr1 := TRUE;
3497 END IF;
3498
3499 -- print out individual invalid product category id
3500 FII_UTIL.Write_Output (l_prod_cat_id || ' ' || l_prod_code);
3501
3502 UPDATE FII_BUDGET_INTERFACE
3503 SET Status_Code = 'ERROR'
3504 WHERE CURRENT OF prodCursor;
3505
3506 END LOOP;
3507 l_print_hdr1 := FALSE;
3508 END IF;
3509
3510 -----------------------------------------------------------------------
3511 -- 8. Validate that user defined dim1 is provided if udd1 enabled and
3512 -- it is valid in vs setup in FDS
3513 -----------------------------------------------------------------------
3514 -- Validate user_dim1_id
3515 g_phase := 'Validate user dimension 1 id';
3516 IF (FIIBUUP_DEBUG) THEN
3517 FII_MESSAGE.Write_Log
3518 (msg_name => 'FII_ROUTINE',
3519 token_num => 2,
3520 t1 => 'ROUTINE',
3521 v1 => 'Validate()',
3522 t2 => 'ACTION',
3523 v2 => 'Validating all user defined dimension1 specified...');
3524 END IF;
3525
3526 -- Validates that all user defined dimension 1 are defined
3527 FOR rec_csr IN udd1Cursor LOOP
3528 l_udd1_id := rec_csr.user_dim1_id;
3529 l_udd1 := rec_csr.user_dim1;
3530 l_violations_found := TRUE;
3531
3532 -- print header information into output file
3533 IF (NOT l_print_hdr1) THEN
3534 FII_UTIL.Write_Output (' ');
3535 FII_MESSAGE.Write_Log (msg_name => 'FII_INV_UDD1_ID_DATA',
3536 token_num => 0);
3537 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
3538 token_num => 0);
3539 FII_MESSAGE.Write_Output
3540 (msg_name => 'FII_INV_UDD1_ID_DATA',
3541 token_num => 0);
3542
3543 l_print_hdr1 := TRUE;
3544 END IF;
3545
3546 -- print out individual invalid user defined dimension 1 ID
3547 FII_UTIL.Write_Output (l_udd1_id || ' ' || l_udd1);
3548
3549 UPDATE FII_BUDGET_INTERFACE
3550 SET status_code = 'ERROR'
3551 WHERE CURRENT OF udd1Cursor;
3552
3553 END LOOP;
3554 l_print_hdr1 := FALSE;
3555
3556 -----------------------------------------------------------------------
3557 -- 9. Validate conversion rates is provided if only primary amount is given
3558 -- and primary and secondary currency are not the same.
3559 -- Also validate that conversion rates are positive and non-zero.
3560 -----------------------------------------------------------------------
3561 -- If the primary and secondary global currencies are different,
3562 -- validates all conversion rate information.
3563 g_phase := 'Validate currency rate';
3564 IF (FIIBUUP_PRIM_CURR_CODE <> FIIBUUP_SEC_CURR_CODE) THEN
3565 IF (FIIBUUP_DEBUG) THEN
3566 FII_MESSAGE.Write_Log
3567 (msg_name => 'FII_ROUTINE',
3568 token_num => 2,
3569 t1 => 'ROUTINE',
3570 v1 => 'Validate()',
3571 t2 => 'ACTION',
3572 v2 => 'Validating required conversion rates...');
3573 END IF;
3574
3575 --print out all records with bad conversion rate information
3576 For rec_csr IN rateCursor LOOP
3577 l_plan_code := rec_csr.plan_type_code;
3578 l_prim_amount_g := rec_csr.prim_amount_g;
3579 IF (NOT l_print_hdr1) THEN
3580 FII_UTIL.Write_Output (' ');
3581 FII_MESSAGE.Write_Log (msg_name => 'FII_CUR_GLB_PRM',
3582 token_num => 0);
3583 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
3584 token_num => 0);
3585 FII_MESSAGE.Write_Output
3586 (msg_name => 'FII_CUR_GLB_PRM',
3587 token_num => 0);
3588 FII_MESSAGE.Write_Output
3589 (msg_name => 'FII_BUDGET_RECORD_TAB',
3590 token_num => 0);
3591 l_print_hdr1 := TRUE;
3592 END IF;
3593
3594 FII_UTIL.Write_Output (l_plan_code || ' ' || l_prim_amount_g);
3595
3596 UPDATE FII_BUDGET_INTERFACE
3597 SET Status_Code = 'ERROR'
3598 WHERE CURRENT OF rateCursor;
3599 End Loop;
3600 l_print_hdr1 := FALSE;
3601
3602 END IF;
3603
3604 -----------------------------------------------------------------------
3605 -- 10. Validate only one record exists for the time/dimension combination
3606 -----------------------------------------------------------------------
3607 g_phase := 'Validate duplicate records';
3608 IF (FIIBUUP_DEBUG) THEN
3609 FII_MESSAGE.Write_Log
3610 (msg_name => 'FII_ROUTINE',
3611 token_num => 2,
3612 t1 => 'ROUTINE',
3613 v1 => 'Validate()',
3614 t2 => 'ACTION',
3615 v2 => 'Validating duplicate upload information...');
3616 END IF;
3617
3618 IF (NOT dupRecordCursor%ISOPEN) THEN
3619 OPEN dupRecordCursor;
3620 END IF;
3621
3622 LOOP
3623 FETCH dupRecordCursor INTO l_plan_code, l_ver_date, l_time_unit,
3624 l_ledger_id, l_com_id, l_cc_id, l_fin_cat_id,
3625 l_prod_cat_id, l_udd1_id;
3626 EXIT WHEN dupRecordCursor%NOTFOUND;
3627 l_violations_found := TRUE;
3628
3629 -- Print header information to output file.
3630 IF (l_plan_code = 'B' AND (NOT l_print_hdr1)) THEN
3631 FII_UTIL.Write_Output (' ');
3632 FII_MESSAGE.Write_Log (msg_name => 'FII_BUD_MLTP_REC',
3633 token_num => 0);
3634 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
3635 token_num => 0);
3636 FII_MESSAGE.Write_Output
3637 (msg_name => 'FII_BUD_MLTP_REC',
3638 token_num => 0);
3639
3640 l_print_hdr1 := TRUE;
3641 ELSIF (l_plan_code = 'F' AND (NOT l_print_hdr2)) THEN
3642 FII_MESSAGE.Write_Log (msg_name => 'FII_FRC_MLTP_REC',
3643 token_num => 0);
3644 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
3645 token_num => 0);
3646 FII_MESSAGE.Write_Output
3647 (msg_name => 'FII_FRC_MLTP_REC',
3648 token_num => 0);
3649 l_print_hdr2 := TRUE;
3650 END IF;
3651
3652 -- Print out individual duplicate record
3653 FII_UTIL.Write_Output (l_ver_date || ' ' ||
3654 l_time_unit || ' ' ||
3655 l_ledger_id || ' ' ||
3656 l_com_id || ' ' ||
3657 l_cc_id || ' ' ||
3658 l_fin_cat_id || ' ' ||
3659 l_prod_cat_id || ' ' ||
3660 l_udd1_id);
3661
3662 --Update the Status_Code
3663 UPDATE FII_BUDGET_INTERFACE
3664 SET status_code = 'ERROR'
3665 WHERE plan_type_code = l_plan_code
3666 AND ledger_id = l_ledger_id
3667 AND company_id = l_com_id
3668 AND cost_center_id = l_cc_id
3669 AND fin_category_id = l_fin_cat_id
3670 AND nvl(prod_category_id, -999) = nvl(l_prod_cat_id, -999)
3671 AND user_dim1_id = l_udd1_id;
3672
3673 END LOOP;
3674 CLOSE dupRecordCursor;
3675 l_print_hdr1 := FALSE;
3676 l_print_hdr2 := FALSE;
3677
3678 -----------------------------------------------------------------------
3679 -- 11. Validate version date is equal to or greater than global start date.
3680 -- Also validate that it is greater than or equal to the latest version
3681 -- date for the period/dimension combination.
3682 -----------------------------------------------------------------------
3683 g_phase := 'Validate version dates';
3684 IF (FIIBUUP_DEBUG) THEN
3685 FII_MESSAGE.Write_Log
3686 (msg_name => 'FII_ROUTINE',
3687 token_num => 2,
3688 t1 => 'ROUTINE',
3689 v1 => 'Validate()',
3690 t2 => 'ACTION',
3691 v2 => 'Validating version dates...');
3692 END IF;
3693
3694 IF (FIIBUUP_BUDGET_TIME_UNIT = 'P' OR FIIBUUP_FORECAST_TIME_UNIT = 'P') THEN
3695 OPEN verDateCursorPer;
3696 LOOP
3697 FETCH verDateCursorPer INTO l_plan_code, l_ver_date, l_time_unit,
3698 l_ledger_id, l_com_id, l_cc_id, l_fin_cat_id,
3699 l_prod_cat_id, l_udd1_id;
3700 EXIT WHEN verDateCursorPer%NOTFOUND;
3701 l_violations_found := TRUE;
3702
3703 -- Print header information to output file.
3704 IF (l_plan_code = 'B' AND (NOT l_print_hdr1)) THEN
3705 FII_UTIL.Write_Output (' ');
3706 FII_MESSAGE.Write_Log (msg_name => 'FII_BUD_INV_VER_DATE',
3707 token_num => 0);
3708 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
3709 token_num => 0);
3710 FII_MESSAGE.Write_Output
3711 (msg_name => 'FII_BUD_INV_VER_DATE',
3712 token_num => 0);
3713
3714 l_print_hdr1 := TRUE;
3715 ELSIF (l_plan_code = 'F' AND (NOT l_print_hdr2)) THEN
3716 FII_MESSAGE.Write_Log (msg_name => 'FII_FRC_INV_VER_DATE',
3717 token_num => 0);
3718 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
3719 token_num => 0);
3720 FII_MESSAGE.Write_Output
3721 (msg_name => 'FII_FRC_INV_VER_DATE',
3722 token_num => 0);
3723 l_print_hdr2 := TRUE;
3724 END IF;
3725
3726 -- Print out individual record with invalid version date
3727 FII_UTIL.Write_Output (l_ver_date || ' ' ||
3728 l_time_unit || ' ' ||
3729 l_ledger_id || ' ' ||
3730 l_com_id || ' ' ||
3731 l_cc_id || ' ' ||
3732 l_fin_cat_id || ' ' ||
3733 l_prod_cat_id || ' ' ||
3734 l_udd1_id);
3735
3736 --Update the Status_Code
3737 UPDATE FII_BUDGET_INTERFACE
3738 SET status_code = 'ERROR'
3739 WHERE plan_type_code = l_plan_code
3740 AND trunc(version_date) = trunc(l_ver_date)
3741 AND report_time_period = l_time_unit
3742 AND ledger_id = l_ledger_id
3743 AND company_id = l_com_id
3744 AND cost_center_id = l_cc_id
3745 AND fin_category_id = l_fin_cat_id
3746 AND nvl(prod_category_id, -999) = nvl(l_prod_cat_id, -999)
3747 AND user_dim1_id = l_udd1_id;
3748
3749 END LOOP;
3750 CLOSE verDateCursorPer;
3751 END IF;
3752
3753 IF (FIIBUUP_BUDGET_TIME_UNIT = 'Q' OR FIIBUUP_FORECAST_TIME_UNIT = 'Q') THEN
3754 OPEN verDateCursorQtr;
3755 LOOP
3756 FETCH verDateCursorQtr INTO l_plan_code, l_ver_date, l_time_unit,
3757 l_ledger_id, l_com_id, l_cc_id, l_fin_cat_id,
3758 l_prod_cat_id, l_udd1_id;
3759 EXIT WHEN verDateCursorQtr%NOTFOUND;
3760 l_violations_found := TRUE;
3761
3762 -- Print header information to output file.
3763 IF (l_plan_code = 'B' AND (NOT l_print_hdr1)) THEN
3764 FII_UTIL.Write_Output (' ');
3765 FII_MESSAGE.Write_Log (msg_name => 'FII_BUD_INV_VER_DATE',
3766 token_num => 0);
3767 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
3768 token_num => 0);
3769 FII_MESSAGE.Write_Output
3770 (msg_name => 'FII_BUD_INV_VER_DATE',
3771 token_num => 0);
3772
3773 l_print_hdr1 := TRUE;
3774 ELSIF (l_plan_code = 'F' AND (NOT l_print_hdr2)) THEN
3775 FII_MESSAGE.Write_Log (msg_name => 'FII_FRC_INV_VER_DATE',
3776 token_num => 0);
3777 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
3778 token_num => 0);
3779 FII_MESSAGE.Write_Output
3780 (msg_name => 'FII_FRC_INV_VER_DATE',
3781 token_num => 0);
3782 l_print_hdr2 := TRUE;
3783 END IF;
3784
3785 -- Print out individual record with invalid version date
3786 FII_UTIL.Write_Output (l_ver_date || ' ' ||
3787 l_time_unit || ' ' ||
3788 l_ledger_id || ' ' ||
3789 l_com_id || ' ' ||
3790 l_cc_id || ' ' ||
3791 l_fin_cat_id || ' ' ||
3792 l_prod_cat_id || ' ' ||
3793 l_udd1_id);
3794
3795 --Update the Status_Code
3796 UPDATE FII_BUDGET_INTERFACE
3797 SET status_code = 'ERROR'
3798 WHERE plan_type_code = l_plan_code
3799 AND trunc(version_date) = trunc(l_ver_date)
3800 AND report_time_period = l_time_unit
3801 AND ledger_id = l_ledger_id
3802 AND company_id = l_com_id
3803 AND cost_center_id = l_cc_id
3804 AND fin_category_id = l_fin_cat_id
3805 AND nvl(prod_category_id, -999) = nvl(l_prod_cat_id, -999)
3806 AND user_dim1_id = l_udd1_id;
3807
3808 END LOOP;
3809 CLOSE verDateCursorQtr;
3810 END IF;
3811
3812 IF (FIIBUUP_BUDGET_TIME_UNIT = 'Y' OR FIIBUUP_FORECAST_TIME_UNIT = 'Y') THEN
3813 OPEN verDateCursorYr;
3814 LOOP
3815 FETCH verDateCursorYr INTO l_plan_code, l_ver_date, l_time_unit,
3816 l_ledger_id, l_com_id, l_cc_id, l_fin_cat_id,
3817 l_prod_cat_id, l_udd1_id;
3818 EXIT WHEN verDateCursorYr%NOTFOUND;
3819 l_violations_found := TRUE;
3820
3821 -- Print header information to output file.
3822 IF (l_plan_code = 'B' AND (NOT l_print_hdr1)) THEN
3823 FII_UTIL.Write_Output (' ');
3824 FII_MESSAGE.Write_Log (msg_name => 'FII_BUD_INV_VER_DATE',
3825 token_num => 0);
3826 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
3827 token_num => 0);
3828 FII_MESSAGE.Write_Output
3829 (msg_name => 'FII_BUD_INV_VER_DATE',
3830 token_num => 0);
3831
3832 l_print_hdr1 := TRUE;
3833 ELSIF (l_plan_code = 'F' AND (NOT l_print_hdr2)) THEN
3834 FII_MESSAGE.Write_Log (msg_name => 'FII_FRC_INV_VER_DATE',
3835 token_num => 0);
3836 FII_MESSAGE.Write_Log (msg_name => 'FII_REFER_TO_OUTPUT',
3837 token_num => 0);
3838 FII_MESSAGE.Write_Output
3839 (msg_name => 'FII_FRC_INV_VER_DATE',
3840 token_num => 0);
3841 l_print_hdr2 := TRUE;
3842 END IF;
3843
3844 -- Print out individual record with invalid version date
3845 FII_UTIL.Write_Output (l_ver_date || ' ' ||
3846 l_time_unit || ' ' ||
3847 l_ledger_id || ' ' ||
3848 l_com_id || ' ' ||
3849 l_cc_id || ' ' ||
3850 l_fin_cat_id || ' ' ||
3851 l_prod_cat_id || ' ' ||
3852 l_udd1_id);
3853
3854 --Update the Status_Code
3855 UPDATE FII_BUDGET_INTERFACE
3856 SET status_code = 'ERROR'
3857 WHERE plan_type_code = l_plan_code
3858 AND trunc(version_date) = trunc(l_ver_date)
3859 AND report_time_period = l_time_unit
3860 AND ledger_id = l_ledger_id
3861 AND company_id = l_com_id
3862 AND cost_center_id = l_cc_id
3863 AND fin_category_id = l_fin_cat_id
3864 AND nvl(prod_category_id, -999) = nvl(l_prod_cat_id, -999)
3865 AND user_dim1_id = l_udd1_id;
3866
3867 END LOOP;
3868 CLOSE verDateCursorYr;
3869 END IF;
3870
3871 -- We need to commit here for status_code
3872 FND_CONCURRENT.Af_Commit;
3873
3874 -- Bug fix 4943332: Changed to return 1 if any error row exists
3875 BEGIN
3876 SELECT 1
3877 INTO l_count
3878 FROM FII_BUDGET_INTERFACE
3879 WHERE status_code = 'ERROR'
3880 AND rownum = 1;
3881 EXCEPTION
3882 WHEN NO_DATA_FOUND THEN
3883 l_count := 0;
3884 END;
3885
3886 IF l_count > 0 THEN
3887 FII_UTIL.Write_Log ('There is invalid data in the interface table...');
3888 FII_MESSAGE.Func_Succ('FII_BUDGET_FORECAST_C.Validate');
3889 retcode := 'E';
3890 RETURN;
3891 END IF;
3892
3893 -- All validations have passed, return with success.
3894 IF (FIIBUUP_DEBUG) THEN
3895 FII_MESSAGE.Write_Log
3896 (msg_name => 'FII_ROUTINE',
3897 token_num => 2,
3898 t1 => 'ROUTINE',
3899 v1 => 'Validate()',
3900 t2 => 'ACTION',
3901 v2 => 'All validations completed successfully...');
3902 END IF;
3903
3904 IF (FIIBUUP_DEBUG) THEN
3905 FII_MESSAGE.Func_Succ('FII_BUDGET_FORECAST_C.Validate');
3906 END IF;
3907 RETURN;
3908
3909 -- Exception handling
3910 EXCEPTION
3911 WHEN FIIBUUP_fatal_err THEN
3912 FND_CONCURRENT.Af_Rollback;
3913
3914 FII_MESSAGE.Write_Log
3915 (msg_name => 'FII_ERR_ENC_ROUT',
3916 token_num => 1,
3917 t1 => 'ROUTINE_NAME',
3918 v1 => 'FII_BUDGET_FORECAST_C.Validate()');
3919
3920 FII_MESSAGE.Func_Fail
3921 (func_name =>'FII_BUDGET_FORECAST_C.Validate');
3922
3923 fii_util.put_line ('Phase: ' || g_phase ||
3924 'Error: ' || sqlerrm);
3925 retcode := 'E';
3926 RETURN;
3927
3928 WHEN OTHERS THEN
3929 FND_CONCURRENT.Af_Rollback;
3930
3931 FII_MESSAGE.Write_Log
3932 (msg_name => 'FII_ERROR',
3933 token_num => 2,
3934 t1 => 'FUNCTION',
3935 v1 => 'FII_BUDGET_FORECAST_C.Validate()',
3936 t2 => 'SQLERRMC',
3937 v2 => SQLERRM);
3938
3939 FII_MESSAGE.Func_Fail
3940 (func_name => 'FII_BUDGET_FORECAST_C.Validate');
3941
3942 fii_util.put_line ('Phase: ' || g_phase ||
3943 'Error: ' || sqlerrm);
3944 retcode := 'E';
3945 RETURN;
3946 END Validate;
3947
3948 -------------------------------------------------------------------------------
3949 --
3950 -- Procedure
3951 -- Prior_version
3952 --
3953 -- Purpose
3954 -- Given the version_date in the parameter, this procedure will determine
3955 -- the type of data we have in the interface table and assign a data_type
3956 -- to the row for further processing. If we have a prior version for the
3957 -- period/dimension combination, the procedure also find out the latest
3958 -- version of such combination in the base table and store it in the
3959 -- prior_version_date column.
3960 --
3961 -- Arguments
3962 -- version_date
3963 -- Example
3964 -- result := FII_BUDGET_FORECAST_C.Prior_version(version_date);
3965 -- Notes
3966 -- Returns a boolean indicating if execution completes successfully
3967 FUNCTION Prior_version (version_date DATE) RETURN BOOLEAN IS
3968 FIIBUUP_fatal_err EXCEPTION;
3969 l_tmpstmt VARCHAR2(1000);
3970 l_bud_sqlstmt VARCHAR2(32000);
3971 l_fc_sqlstmt VARCHAR2(32000);
3972 l_bud_join_col_name VARCHAR2(30) := NULL;
3973 l_fc_join_col_name VARCHAR2(30) := NULL;
3974 l_bud_time_tab_name VARCHAR2(30) := NULL;
3975 l_fc_time_tab_name VARCHAR2(30) := NULL;
3976
3977 BEGIN
3978
3979 IF (FIIBUUP_DEBUG) THEN
3980 FII_MESSAGE.Func_Ent(
3981 'FII_BUDGET_FORECAST_C.Prior_version - version_date = ' ||
3982 version_date);
3983 END IF;
3984
3985 -- Determine which time column should be used
3986 IF (FIIBUUP_BUDGET_TIME_UNIT = 'P') THEN
3987 l_bud_join_col_name := 'ent_period_id ';
3988 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Q') THEN
3989 l_bud_join_col_name := 'ent_qtr_id ';
3990 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Y') THEN
3991 l_bud_join_col_name := 'ent_year_id ';
3992 END IF;
3993
3994 IF (FIIBUUP_FORECAST_TIME_UNIT = 'P') THEN
3995 l_fc_join_col_name := 'ent_period_id ';
3996 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Q') THEN
3997 l_fc_join_col_name := 'ent_qtr_id ';
3998 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Y') THEN
3999 l_fc_join_col_name := 'ent_year_id ';
4000 END IF;
4001
4002 -- Determine which time table should be used
4003 IF (FIIBUUP_BUDGET_TIME_UNIT = 'P') THEN
4004 l_bud_time_tab_name := 'FII_TIME_ENT_PERIOD t';
4005 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Q') THEN
4006 l_bud_time_tab_name := 'FII_TIME_ENT_QTR t';
4007 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Y') THEN
4008 l_bud_time_tab_name := 'FII_TIME_ENT_YEAR t';
4009 END IF;
4010
4011 IF (FIIBUUP_FORECAST_TIME_UNIT = 'P') THEN
4012 l_fc_time_tab_name := 'FII_TIME_ENT_PERIOD t';
4013 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Q') THEN
4014 l_fc_time_tab_name := 'FII_TIME_ENT_QTR t';
4015 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Y') THEN
4016 l_fc_time_tab_name := 'FII_TIME_ENT_YEAR t';
4017 END IF;
4018
4019 -- The statment for prior_version needs to be built dynamically
4020 -- because of the variable time period involved.
4021 g_phase := 'Build the SQL statement';
4022
4023 -- Start building the SQL statement
4024 l_tmpstmt := 'INSERT INTO FII_BUDGET_DELTAS ' ||
4025 ' (plan_type_code, version_date, time_id, '||
4026 ' ledger_id, company_id, '||
4027 ' cost_center_id, fin_category_id, prod_category_id, '||
4028 ' user_dim1_id, data_type, '||
4029 ' prior_version_date, orig_prim_amount_total, '||
4030 ' orig_prim_amount_g, orig_sec_amount_total, '||
4031 ' orig_sec_amount_g, last_update_date, last_updated_by, '||
4032 ' creation_date, created_by, last_update_login ) '||
4033
4034 ----------------------------------------------------------------------------
4035 -- Case 1: Version date is provided and time/dimension combination does not
4036 -- exist in base table.
4037 ----------------------------------------------------------------------------
4038 'SELECT '||
4039 ' bi.plan_type_code, trunc(bi.version_date), ';
4040
4041 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || 't.' ||
4042 l_bud_join_col_name || ', ';
4043 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || 't.' ||
4044 l_fc_join_col_name || ', ';
4045
4046 l_tmpstmt := ' bi.ledger_id, bi.company_id, bi.cost_center_id, ' ||
4047 ' bi.fin_category_id, bi.prod_category_id, '||
4048 ' bi.user_dim1_id, -1, NULL, '||
4049 ' NULL, NULL, NULL, NULL, '||
4050 ' SYSDATE, :user_id, SYSDATE, :user_id, :login_id '||
4051 'FROM FII_BUDGET_INTERFACE bi, ';
4052
4053 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || l_bud_time_tab_name;
4054 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || l_fc_time_tab_name;
4055
4056 l_tmpstmt := ' WHERE trunc(bi.version_date) = trunc(:version_date) ' ||
4057 'AND bi.report_time_period = t.name '||
4058 'AND NOT EXISTS ('||
4059 'SELECT 1 '||
4060 'FROM FII_BUDGET_BASE bb, ';
4061
4062 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || l_bud_time_tab_name || '2 ';
4063 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || l_fc_time_tab_name || '2 ';
4064
4065 l_tmpstmt := ' WHERE bi.plan_type_code = bb.plan_type_code '||
4066 ' AND bi.report_time_period = t2.name ';
4067
4068 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
4069 ' AND t2.' || l_bud_join_col_name || '= bb.time_id ';
4070
4071 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
4072 ' AND t2.' || l_fc_join_col_name || '= bb.time_id ';
4073
4074 l_tmpstmt := 'AND bi.ledger_id = bb.ledger_id '||
4075 'AND bi.company_id = bb.company_id '||
4076 'AND bi.cost_center_id = bb.cost_center_id '||
4077 'AND bi.fin_category_id = bb.fin_category_id '||
4078 'AND NVL(bi.prod_category_id, 0) = NVL(bb.category_id, 0) '||
4079 'AND bi.user_dim1_id = bb.user_dim1_id) ';
4080
4081 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
4082 ' AND bi.plan_type_code = ''B'' ';
4083 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
4084 ' AND bi.plan_type_code = ''F'' ';
4085
4086 ----------------------------------------------------------------------
4087 -- Case 2: When version_date in interface > version_date in base
4088 -- and the same version_date does not exist in base
4089 ----------------------------------------------------------------------
4090 l_tmpstmt := ' UNION ALL ' ||
4091 ' SELECT bi.plan_type_code, trunc(bi.version_date), ';
4092
4093 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || 't.' ||
4094 l_bud_join_col_name ||', ';
4095 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || 't.' ||
4096 l_fc_join_col_name ||', ';
4097
4098 l_tmpstmt := ' bi.ledger_id, '||
4099 ' bi.company_id, bi.cost_center_id, bi.fin_category_id, '||
4100 ' bi.prod_category_id, bi.user_dim1_id, '||
4101 ' -2, max(bb.version_date), NULL, NULL, NULL, NULL, '||
4102 ' SYSDATE, :user_id, SYSDATE, :user_id, :login_id '||
4103 ' FROM FII_BUDGET_INTERFACE bi, '||
4104 ' FII_BUDGET_BASE bb, ';
4105
4106 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || l_bud_time_tab_name;
4107 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || l_fc_time_tab_name;
4108
4109 l_tmpstmt := ' WHERE trunc(bi.version_date) = trunc(:version_date) '||
4110 'AND bi.report_time_period = t.name ';
4111
4112 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
4113 ' AND t.' || l_bud_join_col_name || '= bb.time_id ';
4114 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
4115 ' AND t.' || l_fc_join_col_name || '= bb.time_id ';
4116
4117 l_tmpstmt := 'AND bb.version_date < trunc(bi.version_date) '||
4118 'AND bb.no_version_flag = ''N'' ' ||
4119 'AND NOT EXISTS ( '||
4120 'SELECT 1 '||
4121 'FROM FII_BUDGET_BASE bb2, ';
4122
4123 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || l_bud_time_tab_name || '2 ';
4124 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || l_fc_time_tab_name || '2 ';
4125
4126 l_tmpstmt := 'WHERE trunc(bi.version_date) = trunc(:version_date) '||
4127 'AND bi.plan_type_code = bb2.plan_type_code ' ||
4128 'AND bi.report_time_period = t2.name ';
4129
4130 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
4131 ' AND t2.' || l_bud_join_col_name || '= bb2.time_id ';
4132 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
4133 ' AND t2.' || l_fc_join_col_name || '= bb2.time_id ';
4134
4135 l_tmpstmt:= 'AND bb2.version_date = trunc(bi.version_date) '||
4136 'AND bb2.no_version_flag = ''N'' '||
4137 'AND bi.ledger_id = bb2.ledger_id '||
4138 'AND bi.company_id = bb2.company_id '||
4139 'AND bi.cost_center_id = bb2.cost_center_id '||
4140 'AND bi.fin_category_id = bb2.fin_category_id '||
4141 'AND NVL(bi.prod_category_id,0) = NVL(bb2.category_id,0) '||
4142 'AND bi.user_dim1_id = bb2.user_dim1_id) '||
4143 'AND bi.plan_type_code = bb.plan_type_code '||
4144 'AND bi.ledger_id = bb.ledger_id '||
4145 'AND bi.company_id = bb.company_id '||
4146 'AND bi.cost_center_id = bb.cost_center_id '||
4147 'AND bi.fin_category_id = bb.fin_category_id '||
4148 'AND NVL(bi.prod_category_id, 0) = NVL (bb.category_id, 0) '||
4149 'AND bi.user_dim1_id = bb.user_dim1_id ';
4150
4151 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
4152 'AND bi.plan_type_code = ''B'' ';
4153 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
4154 'AND bi.plan_type_code = ''F'' ';
4155
4156 l_tmpstmt := 'GROUP BY bi.plan_type_code, trunc(bi.version_date), ';
4157
4158 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || 't.' ||
4159 l_bud_join_col_name || ', ';
4160 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || 't.' ||
4161 l_fc_join_col_name || ', ' ;
4162
4163 l_tmpstmt := ' bi.fin_category_id, bi.ledger_id, bi.company_id, '||
4164 ' bi.cost_center_id, '||
4165 ' bi.prod_category_id, bi.user_dim1_id ';
4166
4167 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt;
4168 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt;
4169
4170 ----------------------------------------------------------------------
4171 -- Case 3: Version date is provided and the same version/time/dimension
4172 -- combination exists in base table with no_version_flag = 'N'.
4173 -- Both records are updated on the same day.
4174 ----------------------------------------------------------------------
4175 l_tmpstmt := ' UNION ALL ' ||
4176 ' SELECT bi.plan_type_code, trunc(bi.version_date), ';
4177
4178 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || 't.' ||
4179 l_bud_join_col_name ||', ';
4180 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || 't.' ||
4181 l_fc_join_col_name ||', ';
4182
4183 l_tmpstmt := ' bi.ledger_id, '||
4184 ' bi.company_id, bi.cost_center_id, bi.fin_category_id, '||
4185 ' bi.prod_category_id, bi.user_dim1_id, '||
4186 ' -3, NULL, bb.prim_amount_total, bb.prim_amount_g, '||
4187 ' bb.sec_amount_total, bb.sec_amount_g, '||
4188 ' SYSDATE, :user_id, SYSDATE, :user_id, :login_id '||
4189 ' FROM FII_BUDGET_INTERFACE bi, FII_BUDGET_BASE bb, ';
4190
4191 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || l_bud_time_tab_name;
4192 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || l_fc_time_tab_name;
4193
4194 l_tmpstmt := ' WHERE trunc(bi.version_date) = trunc(:version_date) '||
4195 'AND bi.report_time_period = t.name ' ||
4196 'AND bb.no_version_flag = ''N'' ';
4197
4198 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
4199 ' AND bb.time_id = t.' || l_bud_join_col_name ;
4200 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
4201 ' AND bb.time_id = t.' || l_fc_join_col_name;
4202
4203 l_tmpstmt := 'AND bb.plan_type_code = bi.plan_type_code ';
4204
4205 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
4206 'AND bi.plan_type_code = ''B'' ';
4207 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
4208 'AND bi.plan_type_code = ''F'' ';
4209
4210 l_tmpstmt := 'AND bb.version_date = trunc(bi.version_date) '||
4211 'AND bb.ledger_id = bi.ledger_id '||
4212 'AND bb.company_id = bi.company_id '||
4213 'AND bb.cost_center_id = bi.cost_center_id '||
4214 'AND bb.fin_category_id = bi.fin_category_id '||
4215 'AND NVL(bb.category_id, 0) = NVL(bi.prod_category_id, 0) '||
4216 'AND bb.user_dim1_id = bi.user_dim1_id '||
4217 'AND bb.prim_amount_total != bi.prim_amount_g '||
4218 'AND nvl(bb.sec_amount_total,0) != nvl(bi.sec_amount_g,0) '||
4219 'AND EXISTS ( '||
4220 -- Make sure the same version/time/dimension combination
4221 -- record was uploaded on the same date
4222 'SELECT 1 '||
4223 'FROM ';
4224
4225 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || l_bud_time_tab_name;
4226 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || l_fc_time_tab_name;
4227
4228 l_tmpstmt := ' WHERE bi.report_time_period = t.name ' ||
4229 ' AND bi.ledger_id = bb.ledger_id '||
4230 ' AND bi.company_id = bb.company_id '||
4231 ' AND bi.cost_center_id = bb.cost_center_id '||
4232 ' AND bi.fin_category_id = bb.fin_category_id '||
4233 ' AND NVL(bi.prod_category_id,0)=NVL(bb.category_id, 0) '||
4234 ' AND bi.user_dim1_id = bb.user_dim1_id ';
4235
4236 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
4237 ' AND t.' || l_bud_join_col_name || '= bb.time_id ' ||
4238 ' AND TRUNC(bi.upload_date) = TRUNC(bb.upload_date))';
4239 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
4240 ' AND t.' || l_fc_join_col_name || '= bb.time_id ' ||
4241 ' AND TRUNC(bi.upload_date) = TRUNC(bb.upload_date))';
4242
4243 ----------------------------------------------------------------------------
4244 -- Case 4: Version date is provided and time/dimension combination exists
4245 -- in base table with no_version_flag = 'Y'
4246 ----------------------------------------------------------------------------
4247 l_tmpstmt := ' UNION ALL ' ||
4248 ' SELECT bi.plan_type_code, trunc(bi.version_date), ';
4249
4250 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || 't.' ||
4251 l_bud_join_col_name ||', ';
4252 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || 't.' ||
4253 l_fc_join_col_name ||', ';
4254
4255 l_tmpstmt := ' bi.ledger_id, '||
4256 ' bi.company_id, bi.cost_center_id, bi.fin_category_id, '||
4257 ' bi.prod_category_id, bi.user_dim1_id, '||
4258 ' -4, bb2.version_date, bb2.prim_amount_total, '||
4259 ' bb2.prim_amount_g, '||
4260 ' bb2.sec_amount_total, bb2.sec_amount_g, '||
4261 ' SYSDATE, :user_id, SYSDATE, :user_id, :login_id '||
4262 ' FROM FII_BUDGET_INTERFACE bi, FII_BUDGET_BASE bb2, ';
4263
4264 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || l_bud_time_tab_name;
4265 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || l_fc_time_tab_name;
4266
4267 l_tmpstmt :=
4268 ',(SELECT v.name, v.plan_type_code, v.ledger_id, v.company_id, '||
4269 ' v.cost_center_id, v.fin_category_id, v.category_id, '||
4270 ' v.user_dim1_id, v.version_date '||
4271 ' FROM ( '||
4272 ' SELECT t.name, bb.plan_type_code, bb.ledger_id, bb.company_id, '||
4273 ' bb.cost_center_id, bb.fin_category_id, bb.category_id, '||
4274 ' bb.user_dim1_id, bb.version_date, '||
4275 ' rank() over (partition by t.name, bb.plan_type_code, '||
4276 ' bb.ledger_id, bb.company_id, '||
4277 ' bb.cost_center_id,bb.fin_category_id, '||
4278 ' bb.category_id, bb.user_dim1_id'||
4279 ' order by bb.version_date desc) Rank '||
4280 ' FROM FII_BUDGET_BASE bb, ';
4281
4282 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || l_bud_time_tab_name;
4283 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || l_fc_time_tab_name;
4284
4285 l_tmpstmt := ', fii_budget_interface bi '||
4286 ' WHERE bi.report_time_period = t.name '||
4287 ' AND bb.no_version_flag = ''Y'' ';
4288
4289 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
4290 ' AND t.' || l_bud_join_col_name || '= bb.time_id ';
4291 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
4292 ' AND t.' || l_fc_join_col_name || '= bb.time_id ';
4293
4294 l_tmpstmt :=
4295 ' AND bi.plan_type_code = bb.plan_type_code '||
4296 ' AND bi.ledger_id = bb.ledger_id '||
4297 ' AND bi.company_id = bb.company_id '||
4298 ' AND bi.cost_center_id = bb.cost_center_id '||
4299 ' AND bi.fin_category_id = bb.fin_category_id '||
4300 ' AND NVL(bi.prod_category_id, 0) = NVL(bb.category_id, 0) '||
4301 ' AND NVL(bi.user_dim1_id, 0) = NVL(bb.user_dim1_id, 0)) v '||
4302 ' WHERE v.rank = 1) cver '||
4303 ' WHERE trunc(bi.version_date) = trunc(:version_date) '||
4304 'AND bi.report_time_period = t.name ';
4305
4306 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
4307 ' AND bb2.time_id = t.' || l_bud_join_col_name ;
4308 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
4309 ' AND bb2.time_id = t.' || l_fc_join_col_name;
4310
4311 l_tmpstmt := 'AND bb2.no_version_flag = ''Y'' '||
4312 'AND bb2.plan_type_code = bi.plan_type_code ';
4313
4314 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
4315 'AND bi.plan_type_code = ''B'' ';
4316 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
4317 'AND bi.plan_type_code = ''F'' ';
4318
4319 l_tmpstmt := 'AND bb2.ledger_id = bi.ledger_id '||
4320 'AND bb2.company_id = bi.company_id '||
4321 'AND bb2.cost_center_id = bi.cost_center_id '||
4322 'AND bb2.fin_category_id = bi.fin_category_id '||
4323 'AND NVL(bi.prod_category_id,0) = NVL(bb2.category_id, 0) '||
4324 'AND bi.user_dim1_id = bb2.user_dim1_id '||
4325 'AND bb2.prim_amount_total != bi.prim_amount_g '||
4326 'AND nvl(bb2.sec_amount_total,0)!= nvl(bi.sec_amount_g,0) '||
4327 'AND bi.report_time_period = cver.name '||
4328 'AND bi.plan_type_code = cver.plan_type_code '||
4329 'AND bi.ledger_id = cver.ledger_id '||
4330 'AND bi.company_id = cver.company_id '||
4331 'AND bi.cost_center_id = cver.cost_center_id '||
4332 'AND bi.fin_category_id = cver.fin_category_id '||
4333 'AND nvl(bi.prod_category_id, 0)=nvl(cver.category_id, 0) '||
4334 'AND bi.user_dim1_id = cver.user_dim1_id '||
4335 'AND bb2.version_date = cver.version_date ';
4336
4337 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt;
4338 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt;
4339
4340 -- Print out the dynamic SQL statements if running in debug mode
4341 IF (FIIBUUP_DEBUG) THEN
4342 fii_util.put_line('l_bud_sqlstmt = '|| l_bud_sqlstmt);
4343
4344 FII_MESSAGE.Write_Log
4345 (msg_name => 'FII_ROUTINE_VAL',
4346 token_num => 3 ,
4347 t1 => 'ROUTINE',
4348 v1 => 'FII_BUDGET_FORECAST_C.Prior_version()',
4349 t2 => 'VARIABLE',
4350 v2 => 'LENGTH(l_bud_sqlstmt)',
4351 t3 => 'VALUE',
4352 v3 => TO_CHAR(LENGTH(l_bud_sqlstmt)));
4353
4354 fii_util.put_line('l_fc_sqlstmt = '|| l_fc_sqlstmt);
4355
4356 FII_MESSAGE.Write_Log
4357 (msg_name => 'FII_ROUTINE_VAL',
4358 token_num => 3 ,
4359 t1 => 'ROUTINE',
4360 v1 => 'FII_BUDGET_FORECAST_C.Prior_version()',
4361 t2 => 'VARIABLE',
4362 v2 => 'LENGTH(l_fc_sqlstmt)',
4363 t3 => 'VALUE',
4364 v3 => TO_CHAR(LENGTH(l_fc_sqlstmt)));
4365 END IF;
4366
4367 -- Execute both statements for budget and forecast
4368 EXECUTE IMMEDIATE l_bud_sqlstmt
4369 USING FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID, version_date,
4370 FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID, version_date,
4371 version_date,
4372 FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID, version_date,
4373 FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID, version_date;
4374
4375 IF (FIIBUUP_DEBUG) THEN
4376 fii_util.put_line('Inserted '||SQL%ROWCOUNT||
4377 ' budget rows into fii_budget_deltas');
4378 END IF;
4379
4380 EXECUTE IMMEDIATE l_fc_sqlstmt
4381 USING FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID, version_date,
4382 FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID, version_date,
4383 version_date,
4384 FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID, version_date,
4385 FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID, version_date;
4386
4387 IF (FIIBUUP_DEBUG) THEN
4388 fii_util.put_line('Inserted '||SQL%ROWCOUNT||
4389 ' forecast rows into fii_budget_deltas');
4390 END IF;
4391
4392 -- Prior_version completed, return with success
4393 IF (FIIBUUP_DEBUG) THEN
4394 FII_MESSAGE.Write_Log
4395 (msg_name => 'FII_ROUTINE',
4396 token_num => 2,
4397 t1 => 'ROUTINE',
4398 v1 => 'Prior_version()',
4399 t2 => 'ACTION',
4400 v2 => 'Prior_version done...');
4401 END IF;
4402
4403 FND_CONCURRENT.Af_Commit;
4404
4405 IF (FIIBUUP_DEBUG) THEN
4406 FII_MESSAGE.Func_Succ('FII_BUDGET_FORECAST_C.Prior_version' ||
4407 version_date);
4408 END IF;
4409 RETURN TRUE;
4410
4411 EXCEPTION
4412 WHEN FIIBUUP_fatal_err THEN
4413 FND_CONCURRENT.Af_Rollback;
4414
4415 FII_MESSAGE.Write_Log
4416 (msg_name => 'FII_ERR_ENC_ROUT',
4417 token_num => 1,
4418 t1 => 'ROUTINE_NAME',
4419 v1 => 'FII_BUDGET_FORECAST_C.Prior_version()');
4420
4421 FII_MESSAGE.Func_Fail
4422 (func_name => 'FII_BUDGET_FORECAST_C.Prior_version');
4423
4424 fii_util.put_line ('Phase: ' || g_phase ||
4425 'Error: ' || sqlerrm);
4426 RETURN FALSE;
4427
4428 WHEN OTHERS THEN
4429 FND_CONCURRENT.Af_Rollback;
4430
4431 -- SQL error occurs. Print out the error
4432 FII_MESSAGE.Write_Log(msg_name => 'FII_ERROR',
4433 token_num => 2,
4434 t1 => 'FUNCTION',
4435 v1 => 'FII_BUDGET_FORECAST_C.Prior_version',
4436 t2 => 'SQLERRMC',
4437 v2 => SQLERRM);
4438
4439 FII_MESSAGE.Func_Fail
4440 (func_name => 'FII_BUDGET_FORECAST_C.Prior_version' || version_date);
4441
4442 fii_util.put_line ('Phase: ' || g_phase ||
4443 'Error: ' || sqlerrm);
4444 RETURN FALSE;
4445 END Prior_version;
4446
4447 -------------------------------------------------------------------------------
4448 --
4449 -- Procedure
4450 -- Prior_version
4451 --
4452 -- Purpose
4453 -- This procedure will determine the type of data we have in the interface
4454 -- table and assign a data_type to the row for further processing.
4455 -- This is similar to prior_version(version_date) except that this one is
4456 -- intended for cases without version date.
4457 --
4458 -- Arguments
4459 -- version_date
4460 -- Example
4461 -- result := FII_BUDGET_FORECAST_C.Prior_version;
4462 -- Notes
4463 -- Returns a boolean indicating if execution completes successfully
4464 FUNCTION Prior_version RETURN BOOLEAN IS
4465 FIIBUUP_fatal_err EXCEPTION;
4466 l_tmpstmt VARCHAR2(1000);
4467 l_bud_sqlstmt VARCHAR2(5000);
4468 l_fc_sqlstmt VARCHAR2(5000);
4469 l_bud_join_col_name VARCHAR2(30) := NULL;
4470 l_fc_join_col_name VARCHAR2(30) := NULL;
4471 l_bud_time_tab_name VARCHAR2(30) := NULL;
4472 l_fc_time_tab_name VARCHAR2(30) := NULL;
4473
4474 BEGIN
4475
4476 IF (FIIBUUP_DEBUG) THEN
4477 FII_MESSAGE.Func_Ent('FII_BUDGET_FORECAST_C.Prior_version');
4478 END IF;
4479
4480 -- Determine which time column should be used
4481 IF (FIIBUUP_BUDGET_TIME_UNIT = 'P') THEN
4482 l_bud_join_col_name := 'ent_period_id ';
4483 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Q') THEN
4484 l_bud_join_col_name := 'ent_qtr_id ';
4485 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Y') THEN
4486 l_bud_join_col_name := 'ent_year_id ';
4487 END IF;
4488
4489 IF (FIIBUUP_FORECAST_TIME_UNIT = 'P') THEN
4490 l_fc_join_col_name := 'ent_period_id ';
4491 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Q') THEN
4492 l_fc_join_col_name := 'ent_qtr_id ';
4493 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Y') THEN
4494 l_fc_join_col_name := 'ent_year_id ';
4495 END IF;
4496
4497 -- Determine which time table should be used
4498 IF (FIIBUUP_BUDGET_TIME_UNIT = 'P') THEN
4499 l_bud_time_tab_name := 'FII_TIME_ENT_PERIOD t';
4500 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Q') THEN
4501 l_bud_time_tab_name := 'FII_TIME_ENT_QTR t';
4502 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Y') THEN
4503 l_bud_time_tab_name := 'FII_TIME_ENT_YEAR t';
4504 END IF;
4505
4506 IF (FIIBUUP_FORECAST_TIME_UNIT = 'P') THEN
4507 l_fc_time_tab_name := 'FII_TIME_ENT_PERIOD t';
4508 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Q') THEN
4509 l_fc_time_tab_name := 'FII_TIME_ENT_QTR t';
4510 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Y') THEN
4511 l_fc_time_tab_name := 'FII_TIME_ENT_YEAR t';
4512 END IF;
4513
4514 -- The statment for prior_version needs to be built dynamically
4515 -- because of the variable time period involved.
4516 g_phase := 'Build the SQL statement';
4517
4518 -- Start building the SQL statement
4519 l_tmpstmt := 'INSERT INTO FII_BUDGET_DELTAS ' ||
4520 ' (plan_type_code, version_date, time_id, '||
4521 ' ledger_id, company_id, '||
4522 ' cost_center_id, fin_category_id, prod_category_id, '||
4523 ' user_dim1_id, data_type, '||
4524 ' prior_version_date, orig_prim_amount_total, '||
4525 ' orig_prim_amount_g, orig_sec_amount_total, '||
4526 ' orig_sec_amount_g, last_update_date, last_updated_by, '||
4527 ' creation_date, created_by, last_update_login ) '||
4528
4529 ----------------------------------------------------------------------------
4530 -- Case 5: Version date is NULL and time/dimension combination does not
4531 -- exist in base table
4532 ----------------------------------------------------------------------------
4533 'SELECT bi.plan_type_code, '||
4534 ' trunc(bi.version_date), ';
4535
4536 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || 't.' ||
4537 l_bud_join_col_name || ', ';
4538 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || 't.' ||
4539 l_fc_join_col_name || ', ';
4540
4541 l_tmpstmt := ' bi.ledger_id, bi.company_id, '||
4542 ' bi.cost_center_id, '||
4543 ' bi.fin_category_id, '||
4544 ' bi.prod_category_id, '||
4545 ' bi.user_dim1_id, '||
4546 ' -5, NULL, NULL, NULL, NULL, NULL, '||
4547 ' SYSDATE, :user_id, SYSDATE, :user_id, :login_id '||
4548 ' FROM FII_BUDGET_INTERFACE bi, ';
4549
4550 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || l_bud_time_tab_name;
4551 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || l_fc_time_tab_name;
4552
4553 l_tmpstmt := ' WHERE trunc(bi.version_date) IS NULL '||
4554 ' AND bi.report_time_period = t.name ';
4555
4556 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
4557 'AND bi.plan_type_code = ''B'' ';
4558 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
4559 'AND bi.plan_type_code = ''F'' ';
4560
4561 l_tmpstmt := ' AND NOT EXISTS ( '||
4562 ' SELECT 1 '||
4563 ' FROM FII_BUDGET_BASE bb, ';
4564
4565 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || l_bud_time_tab_name || '2 ';
4566 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || l_fc_time_tab_name || '2 ';
4567
4568 l_tmpstmt := ' WHERE bi.report_time_period = t2.name ';
4569
4570 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
4571 ' AND t2.' || l_bud_join_col_name || ' = bb.time_id ';
4572 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
4573 ' AND t2.' || l_fc_join_col_name || ' = bb.time_id ';
4574
4575 l_tmpstmt := ' AND bi.plan_type_code = bb.plan_type_code '||
4576 ' AND bi.ledger_id = bb.ledger_id '||
4577 ' AND bi.company_id = bb.company_id '||
4578 ' AND bi.cost_center_id = bb.cost_center_id '||
4579 ' AND bi.fin_category_id = bb.fin_category_id '||
4580 ' AND NVL(bi.prod_category_id, 0)=NVL(bb.category_id, 0) '||
4581 ' AND bi.user_dim1_id = bb.user_dim1_id) ';
4582
4583 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt;
4584 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt;
4585
4586 ----------------------------------------------------------------------------
4587 -- Case 6: Version date is NULL and time/dimension combination exists in base
4588 ----------------------------------------------------------------------------
4589 l_tmpstmt := 'UNION ALL ' ||
4590 'SELECT bi.plan_type_code, '||
4591 'trunc(bi.version_date), ';
4592
4593 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || 't.' ||
4594 l_bud_join_col_name || ', ';
4595 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || 't.' ||
4596 l_fc_join_col_name || ', ';
4597
4598 l_tmpstmt := ' bi.ledger_id, bi.company_id, '||
4599 ' bi.cost_center_id, '||
4600 ' bi.fin_category_id, '||
4601 ' bi.prod_category_id, '||
4602 ' bi.user_dim1_id, '||
4603 ' -6, bb2.version_date, bb2.prim_amount_total, '||
4604 ' bb2.prim_amount_g, bb2.sec_amount_total, '||
4605 ' bb2.sec_amount_g, '||
4606 ' SYSDATE, :user_id, SYSDATE, :user_id, :login_id '||
4607 ' FROM FII_BUDGET_INTERFACE bi, ';
4608
4609 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || l_bud_time_tab_name || ', ';
4610 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || l_fc_time_tab_name || ', ';
4611
4612 l_tmpstmt :=
4613 ' FII_BUDGET_BASE bb2, '||
4614 ' (SELECT v.name, v.plan_type_code, v.ledger_id, v.company_id, '||
4615 ' v.cost_center_id, v.fin_category_id, v.category_id, '||
4616 ' v.user_dim1_id, v.version_date '||
4617 ' FROM ( '||
4618 ' SELECT t.name, bb.plan_type_code, bb.ledger_id, bb.company_id, '||
4619 ' bb.cost_center_id, bb.fin_category_id, bb.category_id, '||
4620 ' bb.user_dim1_id, bb.version_date, '||
4621 ' rank() over (partition by t.name, bb.plan_type_code, '||
4622 ' bb.ledger_id, bb.company_id, '||
4623 ' bb.cost_center_id,bb.fin_category_id, '||
4624 ' bb.category_id, bb.user_dim1_id'||
4625 ' order by bb.version_date desc) Rank '||
4626 ' FROM FII_BUDGET_BASE bb, ';
4627
4628 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || l_bud_time_tab_name;
4629 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || l_fc_time_tab_name;
4630
4631 l_tmpstmt := ', fii_budget_interface bi '||
4632 ' WHERE bi.report_time_period = t.name ';
4633
4634 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
4635 ' AND t.' || l_bud_join_col_name || '= bb.time_id ';
4636 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
4637 ' AND t.' || l_fc_join_col_name || '= bb.time_id ';
4638
4639 l_tmpstmt :=
4640 ' AND bi.plan_type_code = bb.plan_type_code '||
4641 ' AND bi.ledger_id = bb.ledger_id '||
4642 ' AND bi.company_id = bb.company_id '||
4643 ' AND bi.cost_center_id = bb.cost_center_id '||
4644 ' AND bi.fin_category_id = bb.fin_category_id '||
4645 ' AND NVL(bi.prod_category_id, 0) = NVL(bb.category_id, 0) '||
4646 ' AND NVL(bi.user_dim1_id, 0) = NVL(bb.user_dim1_id, 0)) v '||
4647 ' WHERE v.rank = 1) cver '||
4648 'WHERE trunc(bi.version_date) IS NULL '||
4649 'AND bi.report_time_period = t.name ';
4650
4651 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
4652 ' AND bb2.time_id = t.' || l_bud_join_col_name ||
4653 ' AND bi.plan_type_code = ''B'' ';
4654 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
4655 'AND bb2.time_id = t.' || l_fc_join_col_name ||
4656 ' AND bi.plan_type_code = ''F'' ';
4657
4658 l_tmpstmt := --'AND bb2.no_version_flag = ''Y'' '||
4659 'AND bb2.plan_type_code = bi.plan_type_code '||
4660 'AND bb2.ledger_id = bi.ledger_id '||
4661 'AND bb2.company_id = bi.company_id '||
4662 'AND bb2.cost_center_id = bi.cost_center_id '||
4663 'AND bb2.fin_category_id = bi.fin_category_id '||
4664 'AND NVL(bi.prod_category_id, 0) = NVL(bb2.category_id, 0) '||
4665 'AND bi.user_dim1_id = bb2.user_dim1_id '||
4666 'AND bb2.prim_amount_total != bi.prim_amount_g '||
4667 'AND nvl(bb2.sec_amount_total,0) != nvl(bi.sec_amount_g,0) '||
4668 'AND bi.report_time_period = cver.name '||
4669 'AND bi.plan_type_code = cver.plan_type_code '||
4670 'AND bi.ledger_id = cver.ledger_id '||
4671 'AND bi.company_id = cver.company_id '||
4672 'AND bi.cost_center_id = cver.cost_center_id '||
4673 'AND bi.fin_category_id = cver.fin_category_id '||
4674 'AND nvl(bi.prod_category_id, 0)=nvl(cver.category_id, 0) '||
4675 'AND bi.user_dim1_id = cver.user_dim1_id '||
4676 'AND bb2.version_date = cver.version_date ';
4677
4678 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt;
4679 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt;
4680
4681 -- Print out the dynamic SQL statements if running in debug mode
4682 IF (FIIBUUP_DEBUG) THEN
4683
4684 fii_util.put_line('l_bud_sqlstmt = '|| l_bud_sqlstmt);
4685
4686 FII_MESSAGE.Write_Log
4687 (msg_name => 'FII_ROUTINE_VAL',
4688 token_num => 3 ,
4689 t1 => 'ROUTINE',
4690 v1 => 'FII_BUDGET_FORECAST_C.Prior_version()',
4691 t2 => 'VARIABLE',
4692 v2 => 'LENGTH(l_bud_sqlstmt)',
4693 t3 => 'VALUE',
4694 v3 => TO_CHAR(LENGTH(l_bud_sqlstmt)));
4695
4696 fii_util.put_line('l_fc_sqlstmt = '|| l_fc_sqlstmt);
4697
4698 FII_MESSAGE.Write_Log
4699 (msg_name => 'FII_ROUTINE_VAL',
4700 token_num => 3 ,
4701 t1 => 'ROUTINE',
4702 v1 => 'FII_BUDGET_FORECAST_C.Prior_version()',
4703 t2 => 'VARIABLE',
4704 v2 => 'LENGTH(l_fc_sqlstmt)',
4705 t3 => 'VALUE',
4706 v3 => TO_CHAR(LENGTH(l_fc_sqlstmt)));
4707 END IF;
4708
4709 -- Execute both statements for budget and forecast
4710 EXECUTE IMMEDIATE l_bud_sqlstmt
4711 USING FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID,
4712 FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID;
4713
4714 IF (FIIBUUP_DEBUG) THEN
4715 fii_util.put_line('Inserted '||SQL%ROWCOUNT||
4716 ' budget rows into fii_budget_deltas');
4717 END IF;
4718
4719 EXECUTE IMMEDIATE l_fc_sqlstmt
4720 USING FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID,
4721 FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID;
4722
4723 IF (FIIBUUP_DEBUG) THEN
4724 fii_util.put_line('Inserted '||SQL%ROWCOUNT||
4725 ' forecast rows into fii_budget_deltas');
4726 END IF;
4727
4728 -- Prior_version completed, return with success
4729 IF (FIIBUUP_DEBUG) THEN
4730 FII_MESSAGE.Write_Log
4731 (msg_name => 'FII_ROUTINE',
4732 token_num => 2,
4733 t1 => 'ROUTINE',
4734 v1 => 'Prior_version()',
4735 t2 => 'ACTION',
4736 v2 => 'Prior_version done...');
4737 END IF;
4738
4739 FND_CONCURRENT.Af_Commit;
4740
4741 IF (FIIBUUP_DEBUG) THEN
4742 FII_MESSAGE.Func_Succ('FII_BUDGET_FORECAST_C.Prior_version');
4743 END IF;
4744 RETURN TRUE;
4745
4746 EXCEPTION
4747 WHEN FIIBUUP_fatal_err THEN
4748 FND_CONCURRENT.Af_Rollback;
4749
4750 FII_MESSAGE.Write_Log
4751 (msg_name => 'FII_ERR_ENC_ROUT',
4752 token_num => 1,
4753 t1 => 'ROUTINE_NAME',
4754 v1 => 'FII_BUDGET_FORECAST_C.Prior_version()');
4755
4756 FII_MESSAGE.Func_Fail
4757 (func_name => 'FII_BUDGET_FORECAST_C.Prior_version');
4758
4759 fii_util.put_line ('Phase: ' || g_phase ||
4760 'Error: ' || sqlerrm);
4761 RETURN FALSE;
4762
4763 WHEN OTHERS THEN
4764 FND_CONCURRENT.Af_Rollback;
4765
4766 -- SQL error occurs. Print out the error
4767 FII_MESSAGE.Write_Log(msg_name => 'FII_ERROR',
4768 token_num => 2,
4769 t1 => 'FUNCTION',
4770 v1 => 'FII_BUDGET_FORECAST_C.Prior_version',
4771 t2 => 'SQLERRMC',
4772 v2 => SQLERRM);
4773
4774 FII_MESSAGE.Func_Fail
4775 (func_name => 'FII_BUDGET_FORECAST_C.Prior_version');
4776
4777 fii_util.put_line ('Phase: ' || g_phase ||
4778 'Error: ' || sqlerrm);
4779 RETURN FALSE;
4780 END Prior_version;
4781
4782 -------------------------------------------------------------------------------
4783 --
4784 -- Procedure
4785 -- Stage
4786 --
4787 -- Purpose
4788 -- This routine populates data into fii_budget_stg.
4789 -- Arguments
4790 -- version_date
4791 -- Example
4792 -- result := FII_BUDGET_FORECAST_C.Stage(version_date);
4793 -- Notes
4794 -- Returns a boolean indicating if execution completes successfully
4795 FUNCTION Stage (version_date DATE) RETURN BOOLEAN IS
4796 FIIBUUP_fatal_err EXCEPTION;
4797 l_tmpstmt VARCHAR2(3000);
4798 l_bud_sqlstmt VARCHAR2(5000);
4799 l_fc_sqlstmt VARCHAR2(5000);
4800 l_bud_join_col_name VARCHAR2(30) := NULL;
4801 l_fc_join_col_name VARCHAR2(30) := NULL;
4802 l_bud_time_tab_name VARCHAR2(30) := NULL;
4803 l_fc_time_tab_name VARCHAR2(30) := NULL;
4804 l_bud_stg_col_name VARCHAR2(30) := NULL;
4805 l_fc_stg_col_name VARCHAR2(30) := NULL;
4806
4807 BEGIN
4808
4809 IF (FIIBUUP_DEBUG) THEN
4810 FII_MESSAGE.Func_Ent('FII_BUDGET_FORECAST_C.stage - version_date = ' ||
4811 version_date);
4812 END IF;
4813
4814 -- Determine which time column should be used for staging
4815 IF (FIIBUUP_BUDGET_TIME_UNIT = 'P') THEN
4816 l_bud_stg_col_name := 'PERIOD';
4817 l_bud_join_col_name := 'ent_period_id ';
4818 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Q') THEN
4819 l_bud_stg_col_name := 'QUARTER';
4820 l_bud_join_col_name := 'ent_qtr_id ';
4821 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Y') THEN
4822 l_bud_stg_col_name := 'YEAR';
4823 l_bud_join_col_name := 'ent_year_id ';
4824 END IF;
4825
4826 IF (FIIBUUP_FORECAST_TIME_UNIT = 'P') THEN
4827 l_fc_stg_col_name := 'PERIOD';
4828 l_fc_join_col_name := 'ent_period_id ';
4829 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Q') THEN
4830 l_fc_stg_col_name := 'QUARTER';
4831 l_fc_join_col_name := 'ent_qtr_id ';
4832 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Y') THEN
4833 l_fc_stg_col_name := 'YEAR';
4834 l_fc_join_col_name := 'ent_year_id ';
4835 END IF;
4836
4837 -- Determine which time table should be used
4838 IF (FIIBUUP_BUDGET_TIME_UNIT = 'P') THEN
4839 l_bud_time_tab_name := 'FII_TIME_ENT_PERIOD t';
4840 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Q') THEN
4841 l_bud_time_tab_name := 'FII_TIME_ENT_QTR t';
4842 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Y') THEN
4843 l_bud_time_tab_name := 'FII_TIME_ENT_YEAR t';
4844 END IF;
4845
4846 IF (FIIBUUP_FORECAST_TIME_UNIT = 'P') THEN
4847 l_fc_time_tab_name := 'FII_TIME_ENT_PERIOD t';
4848 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Q') THEN
4849 l_fc_time_tab_name := 'FII_TIME_ENT_QTR t';
4850 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Y') THEN
4851 l_fc_time_tab_name := 'FII_TIME_ENT_YEAR t';
4852 END IF;
4853
4854 -- The statment for stage needs to be built dynamically
4855 -- because of the variable time period involved.
4856 g_phase := 'Build the SQL statement';
4857
4858 -- Start building the SQL statement
4859 l_bud_sqlstmt := ' INSERT INTO FII_BUDGET_STG ( ' ||
4860 ' version_date, ' || l_bud_stg_col_name || ', ';
4861
4862 l_fc_sqlstmt := ' INSERT INTO FII_BUDGET_STG ( ' ||
4863 ' version_date, ' || l_fc_stg_col_name || ', ';
4864
4865 l_tmpstmt := ' plan_type_code, creation_date, created_by, '||
4866 ' last_update_date, last_updated_by, last_update_login, '||
4867 ' ledger_id, company_cost_center_org_id, '||
4868 ' company_id, cost_center_id, fin_category_id, '||
4869 ' category_id, user_dim1_id, user_dim2_id, '||
4870 ' prim_amount_total, prim_amount_g, '||
4871 ' sec_amount_total, sec_amount_g, overwrite_version_date, '||
4872 ' data_type, no_version_flag ) '||
4873 ' SELECT ';
4874
4875 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt;
4876 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt;
4877
4878 IF (version_date IS NOT NULL) THEN
4879 l_tmpstmt := ' decode(d.data_type, -4, d.prior_version_date, '||
4880 ' trunc(i.version_date)), ';
4881 ELSE
4882 l_tmpstmt := ' decode(d.data_type, -5, :global_start_date, '||
4883 ' d.prior_version_date), ';
4884 END IF;
4885
4886 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
4887 ' t.' || l_bud_join_col_name || ', ';
4888 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
4889 ' t.' || l_fc_join_col_name || ', ';
4890
4891 l_tmpstmt := ' i.plan_type_code, '||
4892 ' SYSDATE, :user_id, SYSDATE, :user_id, :login_id, '||
4893 ' i.ledger_id, i.company_cost_center_org_id, '||
4894 ' i.company_id, i.cost_center_id, i.fin_category_id, '||
4895 ' i.prod_category_id, i.user_dim1_id, i.user_dim2_id, '||
4896 ' i.prim_amount_g, ';
4897
4898 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt;
4899 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt;
4900
4901 IF (version_date IS NOT NULL) THEN
4902 l_tmpstmt := ' DECODE (d.data_type, '||
4903 ' -1, i.prim_amount_g, '||
4904 ' -2, i.prim_amount_g - b.prim_amount_total, '||
4905 ' i.prim_amount_g - d.orig_prim_amount_total + d.orig_prim_amount_g '||
4906 '), ';
4907 ELSE
4908 l_tmpstmt := ' DECODE (d.data_type, '||
4909 ' -5, i.prim_amount_g, '||
4910 ' i.prim_amount_g - d.orig_prim_amount_total + d.orig_prim_amount_g '||
4911 ' ), ';
4912 END IF;
4913
4914 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt;
4915 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt;
4916
4917 l_tmpstmt := ' DECODE(i.conversion_rate, '||
4918 ' NULL, i.sec_amount_g, '||
4919 ' DECODE(:sec_curr_code, '||
4920 ' :prim_curr_code, i.prim_amount_g, '||
4921 ' ROUND((i.prim_amount_g*i.conversion_rate)/:l_mau)*:l_mau)), ';
4922
4923 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt;
4924 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt;
4925
4926 IF (version_date IS NOT NULL) THEN
4927 l_tmpstmt := ' DECODE (d.data_type, '||
4928 ' -1, DECODE(i.conversion_rate, '||
4929 ' NULL, i.sec_amount_g, '||
4930 ' DECODE(:sec_curr_code, :prim_curr_code, i.prim_amount_g, '||
4931 ' ROUND((i.prim_amount_g*i.conversion_rate)/:l_mau)*:l_mau)), '||
4932 ' -2, DECODE(i.conversion_rate, '||
4933 'NULL, i.sec_amount_g,'||
4934 ' DECODE(:sec_curr_code, :prim_curr_code, i.prim_amount_g, '||
4935 ' ROUND((i.prim_amount_g*i.conversion_rate)/:l_mau)*:l_mau)) - b.sec_amount_total, '||
4936 ' DECODE(i.conversion_rate, '||
4937 ' NULL, i.sec_amount_g, '||
4938 ' DECODE(:sec_curr, :prim_curr, i.prim_amount_g, '||
4939 ' ROUND((i.prim_amount_g*i.conversion_rate)/:l_mau)*:l_mau)) '||
4940 ' - d.orig_sec_amount_total + d.orig_sec_amount_g '||
4941 '), '||
4942 ' DECODE(d.data_type, -4, trunc(i.version_date), NULL), '||
4943 ' d.data_type, ''N'' '||
4944 'FROM FII_BUDGET_INTERFACE i, FII_BUDGET_DELTAS d, FII_BUDGET_BASE b, ';
4945
4946 ELSE
4947 l_tmpstmt := ' DECODE (d.data_type, '||
4948 ' -5, DECODE(i.conversion_rate, '||
4949 ' NULL, i.sec_amount_g, '||
4950 ' DECODE(:sec_curr_code, :prim_curr_code, i.prim_amount_g, '||
4951 ' ROUND((i.prim_amount_g*i.conversion_rate)/:l_mau)*:l_mau)), '||
4952 ' DECODE(i.conversion_rate, '||
4953 ' NULL, i.sec_amount_g, '||
4954 ' DECODE(:sec_curr_code, :prim_curr_code, i.prim_amount_g, '||
4955 ' ROUND((i.prim_amount_g*i.conversion_rate)/:l_mau)*:l_mau)) '||
4956 ' - d.orig_sec_amount_total + d.orig_sec_amount_g '||
4957 ' ),'||
4958 ' DECODE(d.data_type, -6, trunc(i.version_date), NULL), '||
4959 ' d.data_type,'||
4960 ' ''Y'' '||
4961 'FROM FII_BUDGET_INTERFACE i, FII_BUDGET_DELTAS d, FII_BUDGET_BASE b,';
4962 END IF;
4963
4964 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || l_bud_time_tab_name ||
4965 ' WHERE d.time_id = t.' || l_bud_join_col_name;
4966
4967 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || l_fc_time_tab_name ||
4968 ' WHERE d.time_id = t.' || l_fc_join_col_name;
4969
4970 IF (version_date IS NOT NULL) THEN
4971 l_tmpstmt := ' AND trunc(d.version_date) = trunc(i.version_date) '||
4972 ' AND d.data_type in (-1, -2, -3, -4) '||
4973 ' AND trunc(i.version_date) = trunc(:version_date) ';
4974 ELSE
4975 l_tmpstmt := ' AND d.version_date IS NULL '||
4976 ' AND d.data_type in (-5, -6) '||
4977 ' AND i.version_date IS NULL ';
4978 END IF;
4979
4980 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
4981 'AND i.plan_type_code = ''B'' ';
4982 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
4983 'AND i.plan_type_code = ''F'' ';
4984
4985
4986 l_tmpstmt := ' AND i.plan_type_code(+) = d.plan_type_code '||
4987 ' AND i.ledger_id(+) = d.ledger_id '||
4988 ' AND i.company_id(+) = d.company_id '||
4989 ' AND i.cost_center_id(+) = d.cost_center_id '||
4990 ' AND i.fin_category_id(+) = d.fin_category_id '||
4991 ' AND nvl(i.prod_category_id(+),-1)= nvl(d.prod_category_id,-1) '||
4992 ' AND i.user_dim1_id(+) = d.user_dim1_id '||
4993 ' AND t.name = i.report_time_period '||
4994 ' AND b.version_date(+) = trunc(d.prior_version_date) '||
4995 ' AND b.plan_type_code(+) = decode(d.data_type, -2, d.plan_type_code, NULL) '||
4996 ' AND b.time_id(+) = d.time_id '||
4997 ' AND b.ledger_id(+) = d.ledger_id '||
4998 ' AND b.company_id(+) = d.company_id '||
4999 ' AND b.cost_center_id(+) = d.cost_center_id '||
5000 ' AND b.fin_category_id(+) = d.fin_category_id '||
5001 ' AND NVL(b.category_id(+), -1) = NVL(d.prod_category_id, -1) '||
5002 ' AND b.user_dim1_id(+) = d.user_dim1_id ';
5003
5004 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt;
5005 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt;
5006
5007 -- Print out the dynamic SQL statements if running in debug mode
5008 IF (FIIBUUP_DEBUG) THEN
5009 fii_util.put_line('l_bud_sqlstmt = '|| l_bud_sqlstmt);
5010
5011 FII_MESSAGE.Write_Log
5012 (msg_name => 'FII_ROUTINE_VAL',
5013 token_num => 3 ,
5014 t1 => 'ROUTINE',
5015 v1 => 'FII_BUDGET_FORECAST_C.stage()',
5016 t2 => 'VARIABLE',
5017 v2 => 'LENGTH(l_bud_sqlstmt)',
5018 t3 => 'VALUE',
5019 v3 => TO_CHAR(LENGTH(l_bud_sqlstmt)));
5020
5021 fii_util.put_line('l_fc_sqlstmt = '|| l_fc_sqlstmt);
5022
5023 FII_MESSAGE.Write_Log
5024 (msg_name => 'FII_ROUTINE_VAL',
5025 token_num => 3 ,
5026 t1 => 'ROUTINE',
5027 v1 => 'FII_BUDGET_FORECAST_C.stage()',
5028 t2 => 'VARIABLE',
5029 v2 => 'LENGTH(l_fc_sqlstmt)',
5030 t3 => 'VALUE',
5031 v3 => TO_CHAR(LENGTH(l_fc_sqlstmt)));
5032 END IF;
5033
5034 IF (FIIBUUP_DEBUG) THEN
5035 FII_MESSAGE.Write_Log
5036 (msg_name => 'FII_ROUTINE',
5037 token_num => 2,
5038 t1 => 'ROUTINE',
5039 v1 => 'Stage()',
5040 t2 => 'ACTION',
5041 v2 => 'Staging budget records...');
5042 END IF;
5043
5044 g_phase := 'Execute the built SQL l_bud_sqlstmt';
5045 IF (version_date IS NOT NULL) THEN
5046 EXECUTE IMMEDIATE l_bud_sqlstmt
5047 USING FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID,
5048 FIIBUUP_SEC_CURR_CODE, FIIBUUP_PRIM_CURR_CODE,
5049 FIIBUUP_SEC_CURR_MAU, FIIBUUP_SEC_CURR_MAU,
5050 FIIBUUP_SEC_CURR_CODE, FIIBUUP_PRIM_CURR_CODE,
5051 FIIBUUP_SEC_CURR_MAU, FIIBUUP_SEC_CURR_MAU,
5052 FIIBUUP_SEC_CURR_CODE, FIIBUUP_PRIM_CURR_CODE,
5053 FIIBUUP_SEC_CURR_MAU, FIIBUUP_SEC_CURR_MAU,
5054 FIIBUUP_SEC_CURR_CODE, FIIBUUP_PRIM_CURR_CODE,
5055 FIIBUUP_SEC_CURR_MAU, FIIBUUP_SEC_CURR_MAU, version_date;
5056 ELSE
5057 EXECUTE IMMEDIATE l_bud_sqlstmt
5058 USING FIIBUUP_GLOBAL_START_DATE,
5059 FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID,
5060 FIIBUUP_SEC_CURR_CODE, FIIBUUP_PRIM_CURR_CODE,
5061 FIIBUUP_SEC_CURR_MAU, FIIBUUP_SEC_CURR_MAU,
5062 FIIBUUP_SEC_CURR_CODE, FIIBUUP_PRIM_CURR_CODE,
5063 FIIBUUP_SEC_CURR_MAU, FIIBUUP_SEC_CURR_MAU,
5064 FIIBUUP_SEC_CURR_CODE, FIIBUUP_PRIM_CURR_CODE,
5065 FIIBUUP_SEC_CURR_MAU, FIIBUUP_SEC_CURR_MAU;
5066 END IF;
5067
5068 IF (FIIBUUP_DEBUG) THEN
5069 FII_MESSAGE.Write_log
5070 (msg_name => 'FII_INST_REC',
5071 token_num => 2,
5072 t1 => 'NUM',
5073 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
5074 t2 => 'TABLE',
5075 v2 => 'FII_BUDGET_STG');
5076 END IF;
5077
5078 IF (FIIBUUP_DEBUG) THEN
5079 FII_MESSAGE.Write_Log
5080 (msg_name => 'FII_ROUTINE',
5081 token_num => 2,
5082 t1 => 'ROUTINE',
5083 v1 => 'Stage()',
5084 t2 => 'ACTION',
5085 v2 => 'Staging forecast records...');
5086 END IF;
5087
5088 g_phase := 'Execute the built SQL l_fc_sqlstmt';
5089 IF (version_date IS NOT NULL) THEN
5090 EXECUTE IMMEDIATE l_fc_sqlstmt
5091 USING FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID,
5092 FIIBUUP_SEC_CURR_CODE, FIIBUUP_PRIM_CURR_CODE,
5093 FIIBUUP_SEC_CURR_MAU, FIIBUUP_SEC_CURR_MAU,
5094 FIIBUUP_SEC_CURR_CODE, FIIBUUP_PRIM_CURR_CODE,
5095 FIIBUUP_SEC_CURR_MAU, FIIBUUP_SEC_CURR_MAU,
5096 FIIBUUP_SEC_CURR_CODE, FIIBUUP_PRIM_CURR_CODE,
5097 FIIBUUP_SEC_CURR_MAU, FIIBUUP_SEC_CURR_MAU,
5098 FIIBUUP_SEC_CURR_CODE, FIIBUUP_PRIM_CURR_CODE,
5099 FIIBUUP_SEC_CURR_MAU, FIIBUUP_SEC_CURR_MAU, version_date;
5100 ELSE
5101 EXECUTE IMMEDIATE l_fc_sqlstmt
5102 USING FIIBUUP_GLOBAL_START_DATE,
5103 FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID,
5104 FIIBUUP_SEC_CURR_CODE, FIIBUUP_PRIM_CURR_CODE,
5105 FIIBUUP_SEC_CURR_MAU, FIIBUUP_SEC_CURR_MAU,
5106 FIIBUUP_SEC_CURR_CODE, FIIBUUP_PRIM_CURR_CODE,
5107 FIIBUUP_SEC_CURR_MAU, FIIBUUP_SEC_CURR_MAU,
5108 FIIBUUP_SEC_CURR_CODE, FIIBUUP_PRIM_CURR_CODE,
5109 FIIBUUP_SEC_CURR_MAU, FIIBUUP_SEC_CURR_MAU;
5110 END IF;
5111
5112 IF (FIIBUUP_DEBUG) THEN
5113 FII_MESSAGE.Write_log
5114 (msg_name => 'FII_INST_REC',
5115 token_num => 2,
5116 t1 => 'NUM',
5117 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
5118 t2 => 'TABLE',
5119 v2 => 'FII_BUDGET_STG');
5120 END IF;
5121
5122 -- stage completed, return with success
5123 IF (FIIBUUP_DEBUG) THEN
5124 FII_MESSAGE.Write_Log
5125 (msg_name => 'FII_ROUTINE',
5126 token_num => 2,
5127 t1 => 'ROUTINE',
5128 v1 => 'stage()',
5129 t2 => 'ACTION',
5130 v2 => 'Staging done...');
5131 END IF;
5132
5133 FND_CONCURRENT.Af_Commit;
5134
5135 IF (FIIBUUP_DEBUG) THEN
5136 FII_MESSAGE.Func_Succ('FII_BUDGET_FORECAST_C.stage');
5137 END IF;
5138 RETURN TRUE;
5139
5140 EXCEPTION
5141 WHEN FIIBUUP_fatal_err THEN
5142 FND_CONCURRENT.Af_Rollback;
5143
5144 FII_MESSAGE.Write_Log
5145 (msg_name => 'FII_ERR_ENC_ROUT',
5146 token_num => 1,
5147 t1 => 'ROUTINE_NAME',
5148 v1 => 'FII_BUDGET_FORECAST_C.stage()');
5149
5150 FII_MESSAGE.Func_Fail
5151 (func_name => 'FII_BUDGET_FORECAST_C.stage');
5152
5153 fii_util.put_line ('Phase: ' || g_phase ||
5154 'Error: ' || sqlerrm);
5155 RETURN FALSE;
5156
5157 WHEN OTHERS THEN
5158 FND_CONCURRENT.Af_Rollback;
5159
5160 -- SQL error occurs. Print out the error
5161 FII_MESSAGE.Write_Log(msg_name => 'FII_ERROR',
5162 token_num => 2,
5163 t1 => 'FUNCTION',
5164 v1 => 'FII_BUDGET_FORECAST_C.stage',
5165 t2 => 'SQLERRMC',
5166 v2 => SQLERRM);
5167
5168 FII_MESSAGE.Func_Fail
5169 (func_name => 'FII_BUDGET_FORECAST_C.stage');
5170
5171 fii_util.put_line ('Phase: ' || g_phase ||
5172 'Error: ' || sqlerrm);
5173 RETURN FALSE;
5174 END Stage;
5175
5176 --------------------------------------------------------------------------------
5177 --
5178 -- Procedure
5179 -- Adjust_Amount
5180 --
5181 -- Purpose
5182 -- This routine determines the adjustments we need to make to the rolled
5183 -- up time dimension for cases where we are overwriting existing records
5184 -- in fii_budget_base.
5185 -- Arguments
5186 -- version_date
5187 -- Example
5188 -- result := FII_BUDGET_FORECAST_C.Adjust_Amount;
5189 -- Notes
5190 -- Returns a boolean indicating if execution completes successfully
5191 FUNCTION Adjust_Amount RETURN BOOLEAN IS
5192 FIIBUUP_fatal_err EXCEPTION;
5193 l_tmpstmt VARCHAR2(3000);
5194 l_bud_sqlstmt VARCHAR2(5000) := NULL;
5195 l_fc_sqlstmt VARCHAR2(5000) := NULL;
5196 l_bud_join_col_name VARCHAR2(30) := NULL;
5197 l_fc_join_col_name VARCHAR2(30) := NULL;
5198 l_bud_time_tab_name VARCHAR2(30) := NULL;
5199 l_fc_time_tab_name VARCHAR2(30) := NULL;
5200 l_bud_stg_col_name VARCHAR2(30) := NULL;
5201 l_fc_stg_col_name VARCHAR2(30) := NULL;
5202
5203 BEGIN
5204
5205 IF (FIIBUUP_DEBUG) THEN
5206 FII_MESSAGE.Func_Ent('FII_BUDGET_FORECAST_C.adjust_amount');
5207 END IF;
5208
5209 -- Determine which time column should be used for staging
5210 IF (FIIBUUP_BUDGET_TIME_UNIT = 'P') THEN
5211 l_bud_stg_col_name := 'PERIOD';
5212 l_bud_join_col_name := 'ent_period_id ';
5213 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Q') THEN
5214 l_bud_stg_col_name := 'QUARTER';
5215 l_bud_join_col_name := 'ent_qtr_id ';
5216 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Y') THEN
5217 l_bud_stg_col_name := 'YEAR';
5218 l_bud_join_col_name := 'ent_year_id ';
5219 END IF;
5220
5221 IF (FIIBUUP_FORECAST_TIME_UNIT = 'P') THEN
5222 l_fc_stg_col_name := 'PERIOD';
5223 l_fc_join_col_name := 'ent_period_id ';
5224 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Q') THEN
5225 l_fc_stg_col_name := 'QUARTER';
5226 l_fc_join_col_name := 'ent_qtr_id ';
5227 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Y') THEN
5228 l_fc_stg_col_name := 'YEAR';
5229 l_fc_join_col_name := 'ent_year_id ';
5230 END IF;
5231
5232 -- Determine which time table should be used
5233 IF (FIIBUUP_BUDGET_TIME_UNIT = 'P') THEN
5234 l_bud_time_tab_name := 'FII_TIME_ENT_PERIOD t';
5235 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Q') THEN
5236 l_bud_time_tab_name := 'FII_TIME_ENT_QTR t';
5237 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Y') THEN
5238 l_bud_time_tab_name := 'FII_TIME_ENT_YEAR t';
5239 END IF;
5240
5241 IF (FIIBUUP_FORECAST_TIME_UNIT = 'P') THEN
5242 l_fc_time_tab_name := 'FII_TIME_ENT_PERIOD t';
5243 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Q') THEN
5244 l_fc_time_tab_name := 'FII_TIME_ENT_QTR t';
5245 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Y') THEN
5246 l_fc_time_tab_name := 'FII_TIME_ENT_YEAR t';
5247 END IF;
5248
5249 -- The statment for stage needs to be built dynamically for
5250 -- budget and forecast
5251 g_phase := 'Build the SQL statement';
5252
5253 -- Start building the SQL statement
5254 l_tmpstmt :=
5255 'INSERT INTO FII_BUDGET_BASE_T '||
5256 ' (plan_type_code, version_date, overwrite_version_date, '||
5257 ' no_version_flag, '||
5258 ' data_type, prim_amount_total, sec_amount_total, '||
5259 ' prim_amount_g, sec_amount_g, creation_date, created_by, '||
5260 ' last_update_date, last_updated_by, last_update_login, '||
5261 ' ledger_id, company_cost_center_org_id, '||
5262 ' company_id, cost_center_id, fin_category_id, '||
5263 ' category_id, user_dim1_id, user_dim2_id, '||
5264 ' time_id, period_type_id, day, week, period, quarter, year '||
5265 ' )'||
5266 ' SELECT '||
5267 ' b.plan_type_code, s.version_date, s.overwrite_version_date, '||
5268 ' s.no_version_flag, s.data_type, '||
5269 ' s.prim_amount_total - b.prim_amount_total, '||
5270 ' s.sec_amount_total - b.sec_amount_total, '||
5271 ' s.prim_amount_g - b.prim_amount_g, '||
5272 ' s.sec_amount_g - b.sec_amount_g, b.creation_date, '||
5273 ' b.created_by, '||
5274 ' b.last_update_date, b.last_updated_by, b.last_update_login, '||
5275 ' b.ledger_id, s.company_cost_center_org_id, '||
5276 ' b.company_id, b.cost_center_id, b.fin_category_id, '||
5277 ' b.category_id, b.user_dim1_id, b.user_dim2_id, '||
5278 ' b.time_id, b.period_type_id, '||
5279 ' s.day, s.week, s.period, s.quarter, s.year '||
5280 ' FROM FII_BUDGET_BASE b, FII_BUDGET_STG s '||
5281 ' WHERE b.plan_type_code = s. plan_type_code '||
5282 ' AND b.ledger_id = s.ledger_id '||
5283 ' AND b.company_id = s.company_id '||
5284 ' AND b.cost_center_id = s.cost_center_id '||
5285 ' AND b.fin_category_id = s.fin_category_id '||
5286 ' AND NVL(b.category_id, -1) = NVL(s.category_id, -1) '||
5287 ' AND b.user_dim1_id = s.user_dim1_id '||
5288 ' AND b.version_date = s.version_date '||
5289 ' AND s.data_type in (-3, -4, -6) '||
5290 ' AND b.time_id = NVL(s.day, NVL(s.week, '||
5291 'NVL(s.period, NVL(s.quarter, s.year)))) '||
5292 ' AND b.period_type_id = '||
5293 'DECODE(s.day, null, '||
5294 ' DECODE(s.week, null, DECODE(s.period, null, '||
5295 ' DECODE(s.quarter, null, 128, 64), 32), 16), 1) ';
5296
5297 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
5298 ' AND s.plan_type_code = ''B'' ';
5299 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
5300 ' AND s.plan_type_code = ''F'' ';
5301
5302 -- Print out the dynamic SQL statements if running in debug mode
5303 IF (FIIBUUP_DEBUG) THEN
5304 fii_util.put_line('l_bud_sqlstmt = '|| l_bud_sqlstmt);
5305
5306 FII_MESSAGE.Write_Log
5307 (msg_name => 'FII_ROUTINE_VAL',
5308 token_num => 3 ,
5309 t1 => 'ROUTINE',
5310 v1 => 'FII_BUDGET_FORECAST_C.adjust_amount()',
5311 t2 => 'VARIABLE',
5312 v2 => 'LENGTH(l_bud_sqlstmt)',
5313 t3 => 'VALUE',
5314 v3 => TO_CHAR(LENGTH(l_bud_sqlstmt)));
5315
5316 fii_util.put_line('l_fc_sqlstmt = '|| l_fc_sqlstmt);
5317
5318 FII_MESSAGE.Write_Log
5319 (msg_name => 'FII_ROUTINE_VAL',
5320 token_num => 3 ,
5321 t1 => 'ROUTINE',
5322 v1 => 'FII_BUDGET_FORECAST_C.adjust_amount()',
5323 t2 => 'VARIABLE',
5324 v2 => 'LENGTH(l_fc_sqlstmt)',
5325 t3 => 'VALUE',
5326 v3 => TO_CHAR(LENGTH(l_fc_sqlstmt)));
5327 END IF;
5328
5329 IF (FIIBUUP_DEBUG) THEN
5330 FII_MESSAGE.Write_Log
5331 (msg_name => 'FII_ROUTINE',
5332 token_num => 2,
5333 t1 => 'ROUTINE',
5334 v1 => 'adjust_amount()',
5335 t2 => 'ACTION',
5336 v2 => 'Adjusting budget amounts...');
5337 END IF;
5338
5339 g_phase := 'Execute the built SQL l_bud_sqlstmt';
5340 EXECUTE IMMEDIATE l_bud_sqlstmt;
5341
5342 IF (FIIBUUP_DEBUG) THEN
5343 FII_MESSAGE.Write_log
5344 (msg_name => 'FII_INST_REC',
5345 token_num => 2,
5346 t1 => 'NUM',
5347 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
5348 t2 => 'TABLE',
5349 v2 => 'FII_BUDGET_BASE_T');
5350 END IF;
5351
5352 IF (FIIBUUP_DEBUG) THEN
5353 FII_MESSAGE.Write_Log
5354 (msg_name => 'FII_ROUTINE',
5355 token_num => 2,
5356 t1 => 'ROUTINE',
5357 v1 => 'Adjust_Amount()',
5358 t2 => 'ACTION',
5359 v2 => 'Adjust forecast records...');
5360 END IF;
5361
5362 g_phase := 'Execute the built SQL l_fc_sqlstmt';
5363 EXECUTE IMMEDIATE l_fc_sqlstmt;
5364
5365 IF (FIIBUUP_DEBUG) THEN
5366 FII_MESSAGE.Write_log
5367 (msg_name => 'FII_INST_REC',
5368 token_num => 2,
5369 t1 => 'NUM',
5370 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
5371 t2 => 'TABLE',
5372 v2 => 'FII_BUDGET_BASE_T');
5373 END IF;
5374
5375 l_bud_sqlstmt := NULL;
5376 l_fc_sqlstmt := NULL;
5377
5378 -- Roll up adjustments along time dimension
5379 l_tmpstmt :=
5380 ' INSERT INTO FII_BUDGET_BASE_T ( '||
5381 ' version_date, overwrite_version_date, no_version_flag, '||
5382 ' data_type, period, quarter, year, plan_type_code, '||
5383 ' creation_date, created_by, last_update_date, last_updated_by, '||
5384 ' last_update_login, ledger_id, company_cost_center_org_id, '||
5385 ' company_id, cost_center_id, '||
5386 ' fin_category_id, '||
5387 ' category_id, user_dim1_id, user_dim2_id, prim_amount_total, '||
5388 ' prim_amount_g, sec_amount_total, sec_amount_g) '||
5389 ' SELECT '||
5390 ' s.version_date, s.overwrite_version_date, s.no_version_flag, '||
5391 ' s.data_type, to_number(NULL), ';
5392
5393 IF (FIIBUUP_BUDGET_TIME_UNIT = 'P') THEN
5394 l_bud_sqlstmt := l_tmpstmt || ' t.ent_qtr_id, t.ent_year_id, ';
5395 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Q') THEN
5396 l_bud_sqlstmt := l_tmpstmt || ' to_number(NULL), t.ent_year_id, ';
5397 END IF;
5398
5399 IF (FIIBUUP_FORECAST_TIME_UNIT = 'P') THEN
5400 l_fc_sqlstmt := l_tmpstmt || ' t.ent_qtr_id, t.ent_year_id, ';
5401 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Q') THEN
5402 l_fc_sqlstmt := l_tmpstmt || ' to_number(NULL), t.ent_year_id, ';
5403 END IF;
5404
5405 l_tmpstmt :=
5406 ' s.plan_type_code, sysdate, :user_id, sysdate, '||
5407 ' :user_id, :login_id, '||
5408 ' s.ledger_id, s.company_cost_center_org_id, '||
5409 ' s.company_id, s.cost_center_id, s.fin_category_id, '||
5410 ' s.category_id, s.user_dim1_id, s.user_dim2_id, '||
5411 ' sum(s.prim_amount_total), sum(s.prim_amount_g), '||
5412 ' sum(s.sec_amount_total), sum(s.sec_amount_g) '||
5413 ' FROM FII_BUDGET_BASE_T s, ';
5414
5415 IF (FIIBUUP_BUDGET_TIME_UNIT <> 'Y') THEN
5416 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || l_bud_time_tab_name ||
5417 ' WHERE s.plan_type_code = ''B'' ' ||
5418 ' AND s.' || l_bud_stg_col_name || ' = t.' ||
5419 l_bud_join_col_name;
5420 END IF;
5421
5422 IF (FIIBUUP_FORECAST_TIME_UNIT <> 'Y') THEN
5423 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || l_fc_time_tab_name ||
5424 ' WHERE s.plan_type_code = ''F'' ' ||
5425 ' AND s.' || l_fc_stg_col_name || ' = t.' ||
5426 l_fc_join_col_name;
5427 END IF;
5428
5429 l_tmpstmt :=
5430 ' GROUP BY s.version_date, s.overwrite_version_date, '||
5431 ' s.no_version_flag, '||
5432 ' s.data_type, s.plan_type_code, '||
5433 ' sysdate, :user_di, sysdate, :user_id, :login_id, '||
5434 ' s.ledger_id, s.company_cost_center_org_id, '||
5435 ' s.company_id, s.cost_center_id, s.fin_category_id, '||
5436 ' s.category_id, s.user_dim1_id, s.user_dim2_id, ';
5437
5438 IF (FIIBUUP_BUDGET_TIME_UNIT = 'P') THEN
5439 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
5440 ' t.ent_year_id, ROLLUP(t.ent_qtr_id) ';
5441 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Q') THEN
5442 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || ' t.ent_year_id ';
5443 END IF;
5444
5445 IF (FIIBUUP_FORECAST_TIME_UNIT = 'P') THEN
5446 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
5447 ' t.ent_year_id, ROLLUP(t.ent_qtr_id) ';
5448 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Q') THEN
5449 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || ' t.ent_year_id ';
5450 END IF;
5451
5452 -- Print out the dynamic SQL statements if running in debug mode
5453 IF (FIIBUUP_DEBUG) THEN
5454 fii_util.put_line('l_bud_sqlstmt = '|| l_bud_sqlstmt);
5455
5456 FII_MESSAGE.Write_Log
5457 (msg_name => 'FII_ROUTINE_VAL',
5458 token_num => 3 ,
5459 t1 => 'ROUTINE',
5460 v1 => 'FII_BUDGET_FORECAST_C.adjust_amount()',
5461 t2 => 'VARIABLE',
5462 v2 => 'LENGTH(l_bud_sqlstmt)',
5463 t3 => 'VALUE',
5464 v3 => TO_CHAR(LENGTH(l_bud_sqlstmt)));
5465
5466 fii_util.put_line('l_fc_sqlstmt = '|| l_fc_sqlstmt);
5467
5468 FII_MESSAGE.Write_Log
5469 (msg_name => 'FII_ROUTINE_VAL',
5470 token_num => 3 ,
5471 t1 => 'ROUTINE',
5472 v1 => 'FII_BUDGET_FORECAST_C.adjust_amount()',
5473 t2 => 'VARIABLE',
5474 v2 => 'LENGTH(l_fc_sqlstmt)',
5475 t3 => 'VALUE',
5476 v3 => TO_CHAR(LENGTH(l_fc_sqlstmt)));
5477 END IF;
5478
5479 IF (FIIBUUP_BUDGET_TIME_UNIT <> 'Y') THEN
5480 g_phase := 'Execute the built SQL l_bud_sqlstmt';
5481
5482 IF (FIIBUUP_DEBUG) THEN
5483 FII_MESSAGE.Write_Log
5484 (msg_name => 'FII_ROUTINE',
5485 token_num => 2,
5486 t1 => 'ROUTINE',
5487 v1 => 'adjust_amount()',
5488 t2 => 'ACTION',
5489 v2 => 'Adjusting budget amounts...');
5490 END IF;
5491
5492 EXECUTE IMMEDIATE l_bud_sqlstmt
5493 USING FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID,
5494 FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID;
5495
5496 IF (FIIBUUP_DEBUG) THEN
5497 FII_MESSAGE.Write_log
5498 (msg_name => 'FII_INST_REC',
5499 token_num => 2,
5500 t1 => 'NUM',
5501 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
5502 t2 => 'TABLE',
5503 v2 => 'FII_BUDGET_BASE_T');
5504 END IF;
5505 END IF;
5506
5507 IF (FIIBUUP_FORECAST_TIME_UNIT <> 'Y') THEN
5508 g_phase := 'Execute the built SQL l_fc_sqlstmt';
5509
5510 IF (FIIBUUP_DEBUG) THEN
5511 FII_MESSAGE.Write_Log
5512 (msg_name => 'FII_ROUTINE',
5513 token_num => 2,
5514 t1 => 'ROUTINE',
5515 v1 => 'Adjust_Amount()',
5516 t2 => 'ACTION',
5517 v2 => 'Adjusting forecast amounts...');
5518 END IF;
5519
5520 EXECUTE IMMEDIATE l_fc_sqlstmt
5521 USING FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID,
5522 FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID;
5523 END IF;
5524
5525 IF (FIIBUUP_DEBUG) THEN
5526 FII_MESSAGE.Write_log
5527 (msg_name => 'FII_INST_REC',
5528 token_num => 2,
5529 t1 => 'NUM',
5530 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
5531 t2 => 'TABLE',
5532 v2 => 'FII_BUDGET_BASE_T');
5533 END IF;
5534
5535 -- adjust_amount completed, return with success
5536 IF (FIIBUUP_DEBUG) THEN
5537 FII_MESSAGE.Write_Log
5538 (msg_name => 'FII_ROUTINE',
5539 token_num => 2,
5540 t1 => 'ROUTINE',
5541 v1 => 'adjust_amount()',
5542 t2 => 'ACTION',
5543 v2 => 'adjust_amount done...');
5544 END IF;
5545
5546 FND_CONCURRENT.Af_Commit;
5547
5548 IF (FIIBUUP_DEBUG) THEN
5549 FII_MESSAGE.Func_Succ('FII_BUDGET_FORECAST_C.adjust_amount');
5550 END IF;
5551 RETURN TRUE;
5552
5553 EXCEPTION
5554 WHEN FIIBUUP_fatal_err THEN
5555 FND_CONCURRENT.Af_Rollback;
5556
5557 FII_MESSAGE.Write_Log
5558 (msg_name => 'FII_ERR_ENC_ROUT',
5559 token_num => 1,
5560 t1 => 'ROUTINE_NAME',
5561 v1 => 'FII_BUDGET_FORECAST_C.adjust_amount()');
5562
5563 FII_MESSAGE.Func_Fail
5564 (func_name => 'FII_BUDGET_FORECAST_C.adjsut_stage');
5565
5566 fii_util.put_line ('Phase: ' || g_phase ||
5567 'Error: ' || sqlerrm);
5568 RETURN FALSE;
5569
5570 WHEN OTHERS THEN
5571 FND_CONCURRENT.Af_Rollback;
5572
5573 -- SQL error occurs. Print out the error
5574 FII_MESSAGE.Write_Log(msg_name => 'FII_ERROR',
5575 token_num => 2,
5576 t1 => 'FUNCTION',
5577 v1 => 'FII_BUDGET_FORECAST_C.adjust_amount',
5578 t2 => 'SQLERRMC',
5579 v2 => SQLERRM);
5580
5581 FII_MESSAGE.Func_Fail
5582 (func_name => 'FII_BUDGET_FORECAST_C.adjust_amount');
5583
5584 fii_util.put_line ('Phase: ' || g_phase ||
5585 'Error: ' || sqlerrm);
5586 RETURN FALSE;
5587
5588 END Adjust_Amount;
5589
5590 -------------------------------------------------------------------------------
5591 --
5592 -- Procedure
5593 -- Rollup_Stage
5594 --
5595 -- Purpose
5596 -- Rollup records in fii_budget_stg along time dimension.
5597 -- Arguments
5598 -- version_date
5599 -- Example
5600 -- result := FII_BUDGET_FORECAST_C.Rollup_Stage;
5601 -- Notes
5602 -- Returns a boolean indicating if execution completes successfully
5603 FUNCTION Rollup_Stage RETURN BOOLEAN IS
5604 FIIBUUP_fatal_err EXCEPTION;
5605 l_tmpstmt VARCHAR2(3000);
5606 l_bud_sqlstmt VARCHAR2(5000);
5607 l_fc_sqlstmt VARCHAR2(5000);
5608 l_bud_join_col_name VARCHAR2(30) := NULL;
5609 l_fc_join_col_name VARCHAR2(30) := NULL;
5610 l_bud_time_tab_name VARCHAR2(30) := NULL;
5611 l_fc_time_tab_name VARCHAR2(30) := NULL;
5612 l_bud_stg_col_name VARCHAR2(30) := NULL;
5613 l_fc_stg_col_name VARCHAR2(30) := NULL;
5614
5615 BEGIN
5616
5617 IF (FIIBUUP_DEBUG) THEN
5618 FII_MESSAGE.Func_Ent('FII_BUDGET_FORECAST_C.rollup_stage');
5619 END IF;
5620
5621 -- Determine which time column should be used for staging
5622 IF (FIIBUUP_BUDGET_TIME_UNIT = 'P') THEN
5623 l_bud_stg_col_name := 'PERIOD';
5624 l_bud_join_col_name := 'ent_period_id ';
5625 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Q') THEN
5626 l_bud_stg_col_name := 'QUARTER';
5627 l_bud_join_col_name := 'ent_qtr_id ';
5628 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Y') THEN
5629 l_bud_stg_col_name := 'YEAR';
5630 l_bud_join_col_name := 'ent_year_id ';
5631 END IF;
5632
5633 IF (FIIBUUP_FORECAST_TIME_UNIT = 'P') THEN
5634 l_fc_stg_col_name := 'PERIOD';
5635 l_fc_join_col_name := 'ent_period_id ';
5636 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Q') THEN
5637 l_fc_stg_col_name := 'QUARTER';
5638 l_fc_join_col_name := 'ent_qtr_id ';
5639 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Y') THEN
5640 l_fc_stg_col_name := 'YEAR';
5641 l_fc_join_col_name := 'ent_year_id ';
5642 END IF;
5643
5644 -- Determine which time table should be used
5645 IF (FIIBUUP_BUDGET_TIME_UNIT = 'P') THEN
5646 l_bud_time_tab_name := 'FII_TIME_ENT_PERIOD t';
5647 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Q') THEN
5648 l_bud_time_tab_name := 'FII_TIME_ENT_QTR t';
5649 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Y') THEN
5650 l_bud_time_tab_name := 'FII_TIME_ENT_YEAR t';
5651 END IF;
5652
5653 IF (FIIBUUP_FORECAST_TIME_UNIT = 'P') THEN
5654 l_fc_time_tab_name := 'FII_TIME_ENT_PERIOD t';
5655 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Q') THEN
5656 l_fc_time_tab_name := 'FII_TIME_ENT_QTR t';
5657 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Y') THEN
5658 l_fc_time_tab_name := 'FII_TIME_ENT_YEAR t';
5659 END IF;
5660
5661 -- The statment for stage needs to be built dynamically for
5662 -- budget and forecast
5663 g_phase := 'Build the SQL statement';
5664
5665 -- Start building the SQL statement
5666 l_tmpstmt :=
5667 ' INSERT INTO FII_BUDGET_STG ( '||
5668 ' version_date, period, quarter, year, plan_type_code, '||
5669 ' creation_date, created_by, last_update_date, '||
5670 ' last_updated_by, last_update_login, ledger_id, '||
5671 ' company_cost_center_org_id, company_id, '||
5672 ' cost_center_id, fin_category_id, category_id, '||
5673 ' user_dim1_id, user_dim2_id, no_version_flag, '||
5674 ' overwrite_version_date, data_type, prim_amount_total, '||
5675 ' prim_amount_g, sec_amount_total, sec_amount_g) '||
5676 ' SELECT '||
5677 ' s.version_date, to_number(NULL), ';
5678
5679 IF (FIIBUUP_BUDGET_TIME_UNIT = 'P') THEN
5680 l_bud_sqlstmt := l_tmpstmt || ' t.ent_qtr_id, t.ent_year_id, ';
5681 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Q') THEN
5682 l_bud_sqlstmt := l_tmpstmt || ' to_number(NULL), t.ent_year_id, ';
5683 END IF;
5684
5685 IF (FIIBUUP_FORECAST_TIME_UNIT = 'P') THEN
5686 l_fc_sqlstmt := l_tmpstmt ||
5687 ' t.ent_qtr_id, t.ent_year_id, ';
5688 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Q') THEN
5689 l_fc_sqlstmt := l_tmpstmt ||
5690 ' to_number(NULL), t.ent_year_id, ';
5691 END IF;
5692
5693 l_tmpstmt :=
5694 ' s.plan_type_code, sysdate, :user_id, sysdate, '||
5695 ' :user_id, :login_id, '||
5696 ' s.ledger_id, s.company_cost_center_org_id, '||
5697 ' s.company_id, s.cost_center_id, s.fin_category_id, '||
5698 ' s.category_id, s.user_dim1_id, s.user_dim2_id, '||
5699 ' s.no_version_flag, s.overwrite_version_date, s.data_type, '||
5700 ' SUM(s.prim_amount_total), SUM(s.prim_amount_g), '||
5701 ' SUM(s.sec_amount_total), SUM(s.sec_amount_g) '||
5702 ' FROM FII_BUDGET_STG s, ';
5703
5704 IF (FIIBUUP_BUDGET_TIME_UNIT <> 'Y') THEN
5705 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || l_bud_time_tab_name ||
5706 ' WHERE s.plan_type_code = ''B'' ' ||
5707 ' AND s.' || l_bud_stg_col_name || ' = t.' ||
5708 l_bud_join_col_name;
5709 END IF;
5710
5711 IF (FIIBUUP_FORECAST_TIME_UNIT <> 'Y') THEN
5712 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || l_fc_time_tab_name ||
5713 ' WHERE s.plan_type_code = ''F'' ' ||
5714 ' AND s.' || l_fc_stg_col_name || ' = t.' ||
5715 l_fc_join_col_name;
5716 END IF;
5717
5718 l_tmpstmt :=
5719 ' AND s.data_type in (-1, -2, -5) '||
5720 ' GROUP BY s.version_date, s.plan_type_code, sysdate, :user_id, '||
5721 ' sysdate, :user_id, :log_id, s.ledger_id, '||
5722 ' s.company_cost_center_org_id, s.company_id, s.cost_center_id, '||
5723 ' s.fin_category_id, s.category_id, s.user_dim1_id, s.user_dim2_id, '||
5724 ' s.no_version_flag, '||
5725 ' s.overwrite_version_date, s.data_type, ';
5726
5727 IF (FIIBUUP_BUDGET_TIME_UNIT = 'P') THEN
5728 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
5729 ' t.ent_year_id, ROLLUP(t.ent_qtr_id) ';
5730 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Q') THEN
5731 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || ' t.ent_year_id ';
5732 END IF;
5733
5734 IF (FIIBUUP_FORECAST_TIME_UNIT = 'P') THEN
5735 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
5736 ' t.ent_year_id, ROLLUP(t.ent_qtr_id) ';
5737 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Q') THEN
5738 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || ' t.ent_year_id ';
5739 END IF;
5740
5741 -- Print out the dynamic SQL statements if running in debug mode
5742 IF (FIIBUUP_DEBUG) THEN
5743 fii_util.put_line('l_bud_sqlstmt = '|| l_bud_sqlstmt);
5744
5745 FII_MESSAGE.Write_Log
5746 (msg_name => 'FII_ROUTINE_VAL',
5747 token_num => 3 ,
5748 t1 => 'ROUTINE',
5749 v1 => 'FII_BUDGET_FORECAST_C.rollup_stage()',
5750 t2 => 'VARIABLE',
5751 v2 => 'LENGTH(l_bud_sqlstmt)',
5752 t3 => 'VALUE',
5753 v3 => TO_CHAR(LENGTH(l_bud_sqlstmt)));
5754
5755 fii_util.put_line('l_fc_sqlstmt = '|| l_fc_sqlstmt);
5756
5757 FII_MESSAGE.Write_Log
5758 (msg_name => 'FII_ROUTINE_VAL',
5759 token_num => 3 ,
5760 t1 => 'ROUTINE',
5761 v1 => 'FII_BUDGET_FORECAST_C.rollup_stage()',
5762 t2 => 'VARIABLE',
5763 v2 => 'LENGTH(l_fc_sqlstmt)',
5764 t3 => 'VALUE',
5765 v3 => TO_CHAR(LENGTH(l_fc_sqlstmt)));
5766 END IF;
5767
5768 IF (FIIBUUP_DEBUG) THEN
5769 FII_MESSAGE.Write_Log
5770 (msg_name => 'FII_ROUTINE',
5771 token_num => 2,
5772 t1 => 'ROUTINE',
5773 v1 => 'rollup_stage()',
5774 t2 => 'ACTION',
5775 v2 => 'Rolling up staging records...');
5776 END IF;
5777
5778 g_phase := 'Execute the built SQL l_bud_sqlstmt';
5779
5780 IF (FIIBUUP_BUDGET_TIME_UNIT <> 'Y') THEN
5781 EXECUTE IMMEDIATE l_bud_sqlstmt
5782 USING FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID,
5783 FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID;
5784 END IF;
5785
5786 IF (FIIBUUP_DEBUG) THEN
5787 FII_MESSAGE.Write_log
5788 (msg_name => 'FII_INST_REC',
5789 token_num => 2,
5790 t1 => 'NUM',
5791 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
5792 t2 => 'TABLE',
5793 v2 => 'FII_BUDGET_STG');
5794 END IF;
5795
5796 IF (FIIBUUP_DEBUG) THEN
5797 FII_MESSAGE.Write_Log
5798 (msg_name => 'FII_ROUTINE',
5799 token_num => 2,
5800 t1 => 'ROUTINE',
5801 v1 => 'Rollup_Stage()',
5802 t2 => 'ACTION',
5803 v2 => 'Rolling up staging budget records...');
5804 END IF;
5805
5806 g_phase := 'Execute the built SQL l_fc_sqlstmt';
5807 IF (FIIBUUP_FORECAST_TIME_UNIT <> 'Y') THEN
5808 EXECUTE IMMEDIATE l_fc_sqlstmt
5809 USING FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID,
5810 FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID;
5811 END IF;
5812
5813 IF (FIIBUUP_DEBUG) THEN
5814 FII_MESSAGE.Write_log
5815 (msg_name => 'FII_INST_REC',
5816 token_num => 2,
5817 t1 => 'NUM',
5818 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
5819 t2 => 'TABLE',
5820 v2 => 'FII_BUDGET_STG');
5821 END IF;
5822
5823 IF (FIIBUUP_DEBUG) THEN
5824 FII_MESSAGE.Write_Log
5825 (msg_name => 'FII_ROUTINE',
5826 token_num => 2,
5827 t1 => 'ROUTINE',
5828 v1 => 'Rollup_Stage()',
5829 t2 => 'ACTION',
5830 v2 => 'Rolling up staging forecast records...');
5831 END IF;
5832
5833 -- rollup_stage completed, return with success
5834 IF (FIIBUUP_DEBUG) THEN
5835 FII_MESSAGE.Write_Log
5836 (msg_name => 'FII_ROUTINE',
5837 token_num => 2,
5838 t1 => 'ROUTINE',
5839 v1 => 'rollup_stage()',
5840 t2 => 'ACTION',
5841 v2 => 'rollup_stage done...');
5842 END IF;
5843
5844 FND_CONCURRENT.Af_Commit;
5845
5846 IF (FIIBUUP_DEBUG) THEN
5847 FII_MESSAGE.Func_Succ('FII_BUDGET_FORECAST_C.rollup_stage');
5848 END IF;
5849 RETURN TRUE;
5850
5851 EXCEPTION
5852 WHEN FIIBUUP_fatal_err THEN
5853 FND_CONCURRENT.Af_Rollback;
5854
5855 FII_MESSAGE.Write_Log
5856 (msg_name => 'FII_ERR_ENC_ROUT',
5857 token_num => 1,
5858 t1 => 'ROUTINE_NAME',
5859 v1 => 'FII_BUDGET_FORECAST_C.rollup_stage()');
5860
5861 FII_MESSAGE.Func_Fail
5862 (func_name => 'FII_BUDGET_FORECAST_C.rollup_stage');
5863
5864 fii_util.put_line ('Phase: ' || g_phase ||
5865 'Error: ' || sqlerrm);
5866 RETURN FALSE;
5867
5868 WHEN OTHERS THEN
5869 FND_CONCURRENT.Af_Rollback;
5870
5871 -- SQL error occurs. Print out the error
5872 FII_MESSAGE.Write_Log(msg_name => 'FII_ERROR',
5873 token_num => 2,
5874 t1 => 'FUNCTION',
5875 v1 => 'FII_BUDGET_FORECAST_C.rollup_stage',
5876 t2 => 'SQLERRMC',
5877 v2 => SQLERRM);
5878
5879 FII_MESSAGE.Func_Fail
5880 (func_name => 'FII_BUDGET_FORECAST_C.rollup_stage');
5881
5882 fii_util.put_line ('Phase: ' || g_phase ||
5883 'Error: ' || sqlerrm);
5884 RETURN FALSE;
5885
5886 END Rollup_Stage;
5887
5888 -------------------------------------------------------------------------------
5889 --
5890 -- Procedure
5891 -- Adjust_Stage
5892 --
5893 -- Purpose
5894 -- For cases where we are overwriting existing records in fii_budget_base,
5895 -- we'll add the adjustment records we need to make to the rolled up
5896 -- time dimension into fii_budget_stg.
5897 -- Arguments
5898 -- version_date
5899 -- Example
5900 -- result := FII_BUDGET_FORECAST_C.Adjust_Stage;
5901 -- Notes
5902 -- Returns a boolean indicating if execution completes successfully
5903 FUNCTION Adjust_Stage RETURN BOOLEAN IS
5904 FIIBUUP_fatal_err EXCEPTION;
5905 l_tmpstmt VARCHAR2(3000);
5906 l_bud_sqlstmt VARCHAR2(5000);
5907 l_fc_sqlstmt VARCHAR2(5000);
5908
5909 BEGIN
5910
5911 IF (FIIBUUP_DEBUG) THEN
5912 FII_MESSAGE.Func_Ent('FII_BUDGET_FORECAST_C.adjust_stage');
5913 END IF;
5914
5915 -- The statment for stage needs to be built dynamically for
5916 -- budget and forecast
5917 g_phase := 'Build the SQL statement';
5918
5919 -- Start building the SQL statement
5920 l_tmpstmt :=
5921 ' INSERT INTO FII_BUDGET_STG ( '||
5922 ' version_date, period, quarter, year, plan_type_code, '||
5923 ' creation_date, created_by, last_update_date, '||
5924 ' last_updated_by, last_update_login, ledger_id, '||
5925 ' company_cost_center_org_id, company_id, '||
5926 ' cost_center_id, fin_category_id, category_id, '||
5927 ' user_dim1_id, user_dim2_id, prim_amount_total, '||
5928 ' prim_amount_g, sec_amount_total, sec_amount_g, '||
5929 ' data_type, overwrite_version_date, no_version_flag ) '||
5930 ' SELECT '||
5931 ' version_date, period, quarter, year, plan_type_code, '||
5932 ' creation_date, created_by, last_update_date, '||
5933 ' last_updated_by, last_update_login, ledger_id, '||
5934 ' company_cost_center_org_id, company_id, '||
5935 ' cost_center_id, fin_category_id, category_id, '||
5936 ' user_dim1_id, user_dim2_id, prim_amount_total, '||
5937 ' prim_amount_g, sec_amount_total, sec_amount_g, '||
5938 ' data_type, overwrite_version_date, no_version_flag '||
5939 ' FROM FII_BUDGET_BASE_T ';
5940
5941 IF (FIIBUUP_BUDGET_TIME_UNIT = 'P') THEN
5942 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
5943 ' WHERE period IS NULL AND plan_type_code = ''B'' ';
5944 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Q') THEN
5945 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt ||
5946 ' WHERE quarter IS NULL AND plan_type_code = ''B'' ';
5947 END IF;
5948
5949 IF (FIIBUUP_FORECAST_TIME_UNIT = 'P') THEN
5950 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
5951 ' WHERE period IS NULL AND plan_type_code = ''F'' ';
5952 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Q') THEN
5953 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt ||
5954 ' WHERE quarter IS NULL AND plan_type_code = ''F'' ';
5955 END IF;
5956
5957 -- Print out the dynamic SQL statements if running in debug mode
5958 IF (FIIBUUP_DEBUG) THEN
5959 fii_util.put_line('l_bud_sqlstmt = '|| l_bud_sqlstmt);
5960
5961 FII_MESSAGE.Write_Log
5962 (msg_name => 'FII_ROUTINE_VAL',
5963 token_num => 3 ,
5964 t1 => 'ROUTINE',
5965 v1 => 'FII_BUDGET_FORECAST_C.adjust_stage()',
5966 t2 => 'VARIABLE',
5967 v2 => 'LENGTH(l_bud_sqlstmt)',
5968 t3 => 'VALUE',
5969 v3 => TO_CHAR(LENGTH(l_bud_sqlstmt)));
5970
5971 fii_util.put_line('l_fc_sqlstmt = '|| l_fc_sqlstmt);
5972
5973 FII_MESSAGE.Write_Log
5974 (msg_name => 'FII_ROUTINE_VAL',
5975 token_num => 3 ,
5976 t1 => 'ROUTINE',
5977 v1 => 'FII_BUDGET_FORECAST_C.adjust_stage()',
5978 t2 => 'VARIABLE',
5979 v2 => 'LENGTH(l_fc_sqlstmt)',
5980 t3 => 'VALUE',
5981 v3 => TO_CHAR(LENGTH(l_fc_sqlstmt)));
5982 END IF;
5983
5984 IF (FIIBUUP_BUDGET_TIME_UNIT <> 'Y') THEN
5985 IF (FIIBUUP_DEBUG) THEN
5986 FII_MESSAGE.Write_Log
5987 (msg_name => 'FII_ROUTINE',
5988 token_num => 2,
5989 t1 => 'ROUTINE',
5990 v1 => 'adjust_stage()',
5991 t2 => 'ACTION',
5992 v2 => 'Adjusting budget staging records...');
5993 END IF;
5994
5995 g_phase := 'Execute the built SQL l_bud_sqlstmt';
5996 EXECUTE IMMEDIATE l_bud_sqlstmt;
5997
5998 IF (FIIBUUP_DEBUG) THEN
5999 FII_MESSAGE.Write_log
6000 (msg_name => 'FII_INST_REC',
6001 token_num => 2,
6002 t1 => 'NUM',
6003 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
6004 t2 => 'TABLE',
6005 v2 => 'FII_BUDGET_STG');
6006 END IF;
6007 END IF;
6008
6009 IF (FIIBUUP_FORECAST_TIME_UNIT <> 'Y') THEN
6010 IF (FIIBUUP_DEBUG) THEN
6011 FII_MESSAGE.Write_Log
6012 (msg_name => 'FII_ROUTINE',
6013 token_num => 2,
6014 t1 => 'ROUTINE',
6015 v1 => 'Adjust_Stage()',
6016 t2 => 'ACTION',
6017 v2 => 'Adjusting forecast staging records...');
6018 END IF;
6019
6020 g_phase := 'Execute the built SQL l_fc_sqlstmt';
6021 EXECUTE IMMEDIATE l_fc_sqlstmt;
6022
6023 IF (FIIBUUP_DEBUG) THEN
6024 FII_MESSAGE.Write_log
6025 (msg_name => 'FII_INST_REC',
6026 token_num => 2,
6027 t1 => 'NUM',
6028 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
6029 t2 => 'TABLE',
6030 v2 => 'FII_BUDGET_STG');
6031 END IF;
6032 END IF;
6033
6034 -- adjust_stage completed, return with success
6035 IF (FIIBUUP_DEBUG) THEN
6036 FII_MESSAGE.Write_Log
6037 (msg_name => 'FII_ROUTINE',
6038 token_num => 2,
6039 t1 => 'ROUTINE',
6040 v1 => 'adjust_stage()',
6041 t2 => 'ACTION',
6042 v2 => 'adjust_stage done...');
6043 END IF;
6044
6045 IF (FIIBUUP_DEBUG) THEN
6046 FII_MESSAGE.Func_Succ('FII_BUDGET_FORECAST_C.adjust_stage');
6047 END IF;
6048 RETURN TRUE;
6049
6050 EXCEPTION
6051 WHEN FIIBUUP_fatal_err THEN
6052 FND_CONCURRENT.Af_Rollback;
6053
6054 FII_MESSAGE.Write_Log
6055 (msg_name => 'FII_ERR_ENC_ROUT',
6056 token_num => 1,
6057 t1 => 'ROUTINE_NAME',
6058 v1 => 'FII_BUDGET_FORECAST_C.adjust_stage()');
6059
6060 FII_MESSAGE.Func_Fail
6061 (func_name => 'FII_BUDGET_FORECAST_C.adjsut_stage');
6062
6063 fii_util.put_line ('Phase: ' || g_phase ||
6064 'Error: ' || sqlerrm);
6065 RETURN FALSE;
6066
6067 WHEN OTHERS THEN
6068 FND_CONCURRENT.Af_Rollback;
6069
6070 -- SQL error occurs. Print out the error
6071 FII_MESSAGE.Write_Log(msg_name => 'FII_ERROR',
6072 token_num => 2,
6073 t1 => 'FUNCTION',
6074 v1 => 'FII_BUDGET_FORECAST_C.adjust_stage',
6075 t2 => 'SQLERRMC',
6076 v2 => SQLERRM);
6077
6078 FII_MESSAGE.Func_Fail
6079 (func_name => 'FII_BUDGET_FORECAST_C.adjust_stage');
6080
6081 fii_util.put_line ('Phase: ' || g_phase ||
6082 'Error: ' || sqlerrm);
6083 RETURN FALSE;
6084
6085 END Adjust_Stage;
6086
6087 -------------------------------------------------------------------------------
6088 --
6089 -- Procedure
6090 -- Merge
6091 --
6092 -- Purpose
6093 -- This routine will add new records or update existing records with
6094 -- the new amounts into fii_budget_base.
6095 -- Arguments
6096 -- version_date
6097 -- Example
6098 -- result := FII_BUDGET_FORECAST_C.Merge;
6099 -- Notes
6100 -- Returns a boolean indicating if execution completes successfully
6101 FUNCTION Merge RETURN BOOLEAN IS
6102 FIIBUUP_fatal_err EXCEPTION;
6103 l_tmpstmt VARCHAR2(5000);
6104 l_bud_sqlstmt VARCHAR2(5000);
6105 l_fc_sqlstmt VARCHAR2(5000);
6106 l_per_type_id NUMBER;
6107
6108 BEGIN
6109
6110 IF (FIIBUUP_DEBUG) THEN
6111 FII_MESSAGE.Func_Ent('FII_BUDGET_FORECAST_C.merge');
6112 END IF;
6113
6114 -- The statment for stage needs to be built dynamically for
6115 -- budget and forecast
6116 g_phase := 'Build the SQL statement';
6117
6118 -- Start building the SQL statement
6119 l_tmpstmt :=
6120 ' MERGE /*+ PARALLEL(b)*/ INTO FII_BUDGET_BASE b '||
6121 ' USING '||
6122 ' (SELECT /*+ PARALLEL(stg)*/ '||
6123 ' version_date, plan_type_code, '||
6124 ' NVL(period, NVL(quarter, year)) time_id, '||
6125 ' DECODE(period, '||
6126 ' null, DECODE(quarter, '||
6127 ' null, 128, 64), 32) PERIOD_TYPE_ID, '||
6128 ' ledger_id, company_cost_center_org_id, '||
6129 ' company_id, cost_center_id, fin_category_id, '||
6130 ' category_id, user_dim1_id, user_dim2_id, '||
6131 ' no_version_flag, sum(prim_amount_total) PRIM_AMOUNT_TOTAL, '||
6132 ' sum(sec_amount_total) SEC_AMOUNT_TOTAL, '||
6133 ' sum(prim_amount_g) PRIM_AMOUNT_G, '||
6134 ' sum(sec_amount_g) SEC_AMOUNT_G '||
6135 ' FROM FII_BUDGET_STG stg ' ||
6136 ' WHERE plan_type_code = :plan_type_code '||
6137 ' GROUP BY version_date, plan_type_code, '||
6138 ' NVL(period, NVL(quarter, year)), '||
6139 ' DECODE(period, '||
6140 ' null, DECODE(quarter, '||
6141 ' null, 128, 64), 32), '||
6142 ' ledger_id, company_cost_center_org_id, '||
6143 ' company_id, cost_center_id, fin_category_id, '||
6144 ' category_id, user_dim1_id, user_dim2_id, '||
6145 ' no_version_flag) s '||
6146 ' ON( b.plan_type_code = s.plan_type_code '||
6147 ' AND b.time_id = s.time_id '||
6148 ' AND b.period_type_id = s.period_type_id '||
6149 ' AND b.version_date = s.version_date '||
6150 ' AND b.ledger_id = s.ledger_id '||
6151 ' AND b.company_id = s.company_id '||
6152 ' AND b.cost_center_id = s.cost_center_id '||
6153 ' AND b.fin_category_id = s.fin_category_id '||
6154 ' AND NVL(b.category_id, -1) = NVL(s.category_id, -1) '||
6155 ' AND b.user_dim1_id = s.user_dim1_id '||
6156 ' AND b.user_dim2_id = s.user_dim2_id) '||
6157 ' WHEN MATCHED THEN UPDATE SET ' ||
6158 ' b.prim_amount_total = decode(b.period_type_id, '||
6159 ' :per_type_id, s.prim_amount_total, '||
6160 ' b.prim_amount_total + s.prim_amount_total), '||
6161 ' b.prim_amount_g = decode(b.period_type_id, '||
6162 ' :per_type_id, s.prim_amount_g, '||
6163 ' b.prim_amount_g + s.prim_amount_g), '||
6164 ' b.sec_amount_total = decode(b.period_type_id, '||
6165 ' :per_type_id, s.sec_amount_total, '||
6166 ' b.sec_amount_total + s.sec_amount_total), '||
6167 ' b.sec_amount_g = decode(b.period_type_id, '||
6168 ' :per_type_id, s.sec_amount_g, '||
6169 ' b.sec_amount_g + s.sec_amount_g), '||
6170 ' b.no_version_flag = s.no_version_flag, '||
6171 ' b.company_cost_center_org_id = s.company_cost_center_org_id, '||
6172 ' b.last_update_date = SYSDATE, '||
6173 ' b.last_updated_by = :user_id, '||
6174 ' b.last_update_login = :login_id, '||
6175 ' b.upload_date = SYSDATE '||
6176 ' WHEN NOT MATCHED THEN INSERT '||
6177 ' (b.version_date, b.plan_type_code, b.time_id, b.period_type_id,'||
6178 ' b.ledger_id, b.company_cost_center_org_id, '||
6179 ' b.company_id, b.cost_center_id, b.fin_category_id, '||
6180 ' b.category_id, '||
6181 ' b.user_dim1_id, b.user_dim2_id, '||
6182 ' b.prim_amount_total, b.prim_amount_g, '||
6183 ' b.sec_amount_total, b.sec_amount_g, b.no_version_flag, '||
6184 ' b.creation_date, b.created_by, '||
6185 ' b.last_update_date, b.last_updated_by, b.last_update_login, '||
6186 ' b.upload_date, b.posted_date) '||
6187 ' VALUES '||
6188 ' (s.version_date, s.plan_type_code, s.time_id, s.period_type_id, '||
6189 ' s.ledger_id, s.company_cost_center_org_id, '||
6190 ' s.company_id, s.cost_center_id, s.fin_category_id, '||
6191 ' s.category_id, '||
6192 ' s.user_dim1_id, s.user_dim2_id, '||
6193 ' s.prim_amount_total, s.prim_amount_g, '||
6194 ' s.sec_amount_total, s.sec_amount_g, s.no_version_flag, '||
6195 ' SYSDATE, :user_id, SYSDATE, '||
6196 ' :user_id, :login_id, SYSDATE, :default_posted_date) ';
6197
6198
6199 -- Print out the dynamic SQL statements if running in debug mode
6200 IF (FIIBUUP_DEBUG) THEN
6201 fii_util.put_line('merge stmt = '|| l_tmpstmt );
6202
6203 FII_MESSAGE.Write_Log
6204 (msg_name => 'FII_ROUTINE_VAL',
6205 token_num => 3 ,
6206 t1 => 'ROUTINE',
6207 v1 => 'FII_BUDGET_FORECAST_C.merge()',
6208 t2 => 'VARIABLE',
6209 v2 => 'LENGTH(l_tmpstmt)',
6210 t3 => 'VALUE',
6211 v3 => TO_CHAR(LENGTH(l_tmpstmt)));
6212
6213 END IF;
6214
6215 IF (FIIBUUP_DEBUG) THEN
6216 FII_MESSAGE.Write_Log
6217 (msg_name => 'FII_ROUTINE',
6218 token_num => 2,
6219 t1 => 'ROUTINE',
6220 v1 => 'merge()',
6221 t2 => 'ACTION',
6222 v2 => 'Merging budget records into fii_budget_base...');
6223 END IF;
6224
6225 g_phase := 'Execute the built SQL l_tmpstmt';
6226 IF (FIIBUUP_BUDGET_TIME_UNIT = 'P') THEN
6227 l_per_type_id := 32;
6228 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Q') THEN
6229 l_per_type_id := 64;
6230 ELSIF (FIIBUUP_BUDGET_TIME_UNIT = 'Y') THEN
6231 l_per_type_id := 128;
6232 END IF;
6233
6234 EXECUTE IMMEDIATE l_tmpstmt
6235 USING 'B', l_per_type_id, l_per_type_id, l_per_type_id, l_per_type_id,
6236 FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID,
6237 FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID,
6238 FIIBUUP_GLOBAL_START_DATE;
6239
6240 IF (FIIBUUP_DEBUG) THEN
6241 FII_MESSAGE.Write_log
6242 (msg_name => 'FII_INST_REC',
6243 token_num => 2,
6244 t1 => 'NUM',
6245 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
6246 t2 => 'TABLE',
6247 v2 => 'FII_BUDGET_BASE');
6248 END IF;
6249
6250 IF (FIIBUUP_DEBUG) THEN
6251 FII_MESSAGE.Write_Log
6252 (msg_name => 'FII_ROUTINE',
6253 token_num => 2,
6254 t1 => 'ROUTINE',
6255 v1 => 'merge()',
6256 t2 => 'ACTION',
6257 v2 => 'Merging forecast records into fii_budget_base...');
6258 END IF;
6259
6260 -- Bug 4674640: Added commit after enabling parallel dml
6261 FND_CONCURRENT.Af_Commit;
6262
6263 g_phase := 'Execute the built SQL l_tmpstmt';
6264 IF (FIIBUUP_FORECAST_TIME_UNIT = 'P') THEN
6265 l_per_type_id := 32;
6266 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Q') THEN
6267 l_per_type_id := 64;
6268 ELSIF (FIIBUUP_FORECAST_TIME_UNIT = 'Y') THEN
6269 l_per_type_id := 128;
6270 END IF;
6271
6272 EXECUTE IMMEDIATE l_tmpstmt
6273 USING 'F', l_per_type_id, l_per_type_id, l_per_type_id, l_per_type_id,
6274 FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID,
6275 FIIBUUP_USER_ID, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID,
6276 FIIBUUP_GLOBAL_START_DATE;
6277
6278 IF (FIIBUUP_DEBUG) THEN
6279 FII_MESSAGE.Write_log
6280 (msg_name => 'FII_INST_REC',
6281 token_num => 2,
6282 t1 => 'NUM',
6283 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
6284 t2 => 'TABLE',
6285 v2 => 'FII_BUDGET_BASE');
6286 END IF;
6287
6288 FND_CONCURRENT.Af_Commit;
6289
6290 IF (FIIBUUP_DEBUG) THEN
6291 FII_MESSAGE.Func_Succ('FII_BUDGET_FORECAST_C.merge');
6292 END IF;
6293 RETURN TRUE;
6294
6295 EXCEPTION
6296 WHEN FIIBUUP_fatal_err THEN
6297 FND_CONCURRENT.Af_Rollback;
6298
6299 FII_MESSAGE.Write_Log
6300 (msg_name => 'FII_ERR_ENC_ROUT',
6301 token_num => 1,
6302 t1 => 'ROUTINE_NAME',
6303 v1 => 'FII_BUDGET_FORECAST_C.merge()');
6304
6305 FII_MESSAGE.Func_Fail
6306 (func_name => 'FII_BUDGET_FORECAST_C.merge');
6307
6308 fii_util.put_line ('Phase: ' || g_phase ||
6309 'Error: ' || sqlerrm);
6310 RETURN FALSE;
6311
6312 WHEN OTHERS THEN
6313 FND_CONCURRENT.Af_Rollback;
6314
6315 -- SQL error occurs. Print out the error
6316 FII_MESSAGE.Write_Log(msg_name => 'FII_ERROR',
6317 token_num => 2,
6318 t1 => 'FUNCTION',
6319 v1 => 'FII_BUDGET_FORECAST_C.merge',
6320 t2 => 'SQLERRMC',
6321 v2 => SQLERRM);
6322
6323 FII_MESSAGE.Func_Fail
6324 (func_name => 'FII_BUDGET_FORECAST_C.merge');
6325
6326 fii_util.put_line ('Phase: ' || g_phase ||
6327 'Error: ' || sqlerrm);
6328 RETURN FALSE;
6329
6330 END Merge;
6331
6332 --------------------------------------------------------------------------------
6333 --
6334 -- Procedure
6335 -- Adjust_Ver_Date
6336 --
6337 -- Purpose
6338 -- This routine update the version_date of the record which has a version
6339 -- date in the current upload but did not have a version date in prior
6340 -- upload.
6341 -- Arguments
6342 -- version_date
6343 -- Example
6344 -- result := FII_BUDGET_FORECAST_C.Adjust_Ver_Date;
6345 -- Notes
6346 -- Returns a boolean indicating if execution completes successfully
6347 FUNCTION Adjust_Ver_Date RETURN BOOLEAN IS
6348 FIIBUUP_fatal_err EXCEPTION;
6349 l_tmpstmt VARCHAR2(3000);
6350 l_bud_sqlstmt VARCHAR2(5000);
6351 l_fc_sqlstmt VARCHAR2(5000);
6352
6353 BEGIN
6354
6355 IF (FIIBUUP_DEBUG) THEN
6356 FII_MESSAGE.Func_Ent('FII_BUDGET_FORECAST_C.adjust_ver_date');
6357 END IF;
6358
6359 -- The statment for stage needs to be built dynamically for
6360 -- budget and forecast
6361 g_phase := 'Build the SQL statement';
6362
6363 -- Start building the SQL statement
6364 l_tmpstmt :=
6365 ' UPDATE FII_BUDGET_BASE b '||
6366 ' SET (b.version_date, b.no_version_flag) = '||
6367 ' (SELECT MAX(s.overwrite_version_date), MAX(s.no_version_flag) '||
6368 ' FROM FII_BUDGET_STG s '||
6369 ' WHERE ';
6370
6371 l_bud_sqlstmt := l_tmpstmt || ' s.plan_type_code = ''B'' ';
6372 l_fc_sqlstmt := l_tmpstmt || ' s.plan_type_code = ''F'' ';
6373
6374 l_tmpstmt :=
6375 ' AND s.version_date = b.version_date '||
6376 ' AND s.ledger_id = b.ledger_id '||
6377 ' AND s.company_id = b.company_id '||
6378 ' AND s.cost_center_id = b.cost_center_id '||
6379 ' AND s.fin_category_id = b.fin_category_id '||
6380 ' AND s.user_dim1_id = b.user_dim1_id '||
6381 ' AND s.version_date = b.version_date '||
6382 ' AND s.data_type = -4) '||
6383 ' WHERE (b.plan_type_code, b.time_id, b.period_type_id, b.ledger_id, '||
6384 ' b.company_id, b.cost_center_id, b.fin_category_id, b.category_id, '||
6385 ' b.user_dim1_id, b.user_dim2_id, b.version_date'||
6386 ' ) IN ( '||
6387 ' SELECT s2.plan_type_code, '||
6388 ' NVL(s2.period, NVL(s2.quarter, s2.year)), '||
6389 ' DECODE(period, null, DECODE(quarter, null, 128, 64), 32), '||
6390 ' ledger_id, company_id, cost_center_id, fin_category_id, '||
6391 ' category_id, user_dim1_id, user_dim2_id, version_date '||
6392 ' FROM fii_budget_stg s2 '||
6393 ' WHERE data_type = -4) ';
6394
6395 l_bud_sqlstmt := l_bud_sqlstmt || l_tmpstmt || ' AND b.plan_type_code = ''B'' ';
6396 l_fc_sqlstmt := l_fc_sqlstmt || l_tmpstmt || ' AND b.plan_type_code = ''F'' ';
6397
6398 -- Print out the dynamic SQL statements if running in debug mode
6399 IF (FIIBUUP_DEBUG) THEN
6400 fii_util.put_line('adjust_ver_date l_bud_sqlstmt = '|| l_bud_sqlstmt);
6401
6402 FII_MESSAGE.Write_Log
6403 (msg_name => 'FII_ROUTINE_VAL',
6404 token_num => 3 ,
6405 t1 => 'ROUTINE',
6406 v1 => 'FII_BUDGET_FORECAST_C.adjust_ver_date()',
6407 t2 => 'VARIABLE',
6408 v2 => 'LENGTH(l_bud_sqlstmt)',
6409 t3 => 'VALUE',
6410 v3 => TO_CHAR(LENGTH(l_bud_sqlstmt)));
6411
6412 fii_util.put_line('adjust_ver_date l_fc_sqlstmt = '|| l_fc_sqlstmt);
6413
6414 FII_MESSAGE.Write_Log
6415 (msg_name => 'FII_ROUTINE_VAL',
6416 token_num => 3 ,
6417 t1 => 'ROUTINE',
6418 v1 => 'FII_BUDGET_FORECAST_C.adjust_ver_date()',
6419 t2 => 'VARIABLE',
6420 v2 => 'LENGTH(l_fc_sqlstmt)',
6421 t3 => 'VALUE',
6422 v3 => TO_CHAR(LENGTH(l_fc_sqlstmt)));
6423
6424 END IF;
6425
6426 IF (FIIBUUP_DEBUG) THEN
6427 FII_MESSAGE.Write_Log
6428 (msg_name => 'FII_ROUTINE',
6429 token_num => 2,
6430 t1 => 'ROUTINE',
6431 v1 => 'adjust_ver_date()',
6432 t2 => 'ACTION',
6433 v2 => 'Adjusting verion dates for budgets...');
6434 END IF;
6435
6436 g_phase := 'Execute the built SQL l_bud_sqlstmt';
6437 EXECUTE IMMEDIATE l_bud_sqlstmt;
6438
6439 IF (FIIBUUP_DEBUG) THEN
6440 FII_MESSAGE.Write_log
6441 (msg_name => 'FII_INST_REC',
6442 token_num => 2,
6443 t1 => 'NUM',
6444 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
6445 t2 => 'TABLE',
6446 v2 => 'FII_BUDGET_BASE');
6447 END IF;
6448
6449 IF (FIIBUUP_DEBUG) THEN
6450 FII_MESSAGE.Write_Log
6451 (msg_name => 'FII_ROUTINE',
6452 token_num => 2,
6453 t1 => 'ROUTINE',
6454 v1 => 'adjust_ver_date()',
6455 t2 => 'ACTION',
6456 v2 => 'Adjusting verion dates for forecasts...');
6457 END IF;
6458
6459 g_phase := 'Execute the built SQL l_fc_sqlstmt';
6460 EXECUTE IMMEDIATE l_fc_sqlstmt;
6461
6462 IF (FIIBUUP_DEBUG) THEN
6463 FII_MESSAGE.Write_log
6464 (msg_name => 'FII_INST_REC',
6465 token_num => 2,
6466 t1 => 'NUM',
6467 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
6468 t2 => 'TABLE',
6469 v2 => 'FII_BUDGET_BASE');
6470 END IF;
6471
6472 FND_CONCURRENT.Af_Commit;
6473
6474 IF (FIIBUUP_DEBUG) THEN
6475 FII_MESSAGE.Func_Succ('FII_BUDGET_FORECAST_C.adjust_ver_date');
6476 END IF;
6477 RETURN TRUE;
6478
6479 EXCEPTION
6480 WHEN FIIBUUP_fatal_err THEN
6481 FND_CONCURRENT.Af_Rollback;
6482
6483 FII_MESSAGE.Write_Log
6484 (msg_name => 'FII_ERR_ENC_ROUT',
6485 token_num => 1,
6486 t1 => 'ROUTINE_NAME',
6487 v1 => 'FII_BUDGET_FORECAST_C.adjust_ver_date()');
6488
6489 FII_MESSAGE.Func_Fail
6490 (func_name => 'FII_BUDGET_FORECAST_C.adjust_ver_date');
6491
6492 fii_util.put_line ('Phase: ' || g_phase ||
6493 'Error: ' || sqlerrm);
6494 RETURN FALSE;
6495
6496 WHEN OTHERS THEN
6497 FND_CONCURRENT.Af_Rollback;
6498
6499 -- SQL error occurs. Print out the error
6500 FII_MESSAGE.Write_Log(msg_name => 'FII_ERROR',
6501 token_num => 2,
6502 t1 => 'FUNCTION',
6503 v1 =>'FII_BUDGET_FORECAST_C.adjust_ver_date',
6504 t2 => 'SQLERRMC',
6505 v2 => SQLERRM);
6506
6507 FII_MESSAGE.Func_Fail
6508 (func_name => 'FII_BUDGET_FORECAST_C.adjust_ver_date');
6509
6510 fii_util.put_line ('Phase: ' || g_phase ||
6511 'Error: ' || sqlerrm);
6512 RETURN FALSE;
6513
6514 END Adjust_Ver_Date;
6515
6516 /************************************************************************
6517 PUBLIC PROCEDURES
6518 ************************************************************************/
6519
6520 -------------------------------------------------------------------------------
6521
6522 -- Procedure
6523 -- Main
6524 -- Purpose
6525 -- This is the main routine of the DBI budget upload program
6526 -- History
6527 -- 05-03-02 S Kung Created
6528 -- Arguments
6529 -- X_Mode: Mode of Operation. Either U (Upload) or P (Purge)
6530 -- X_Plan_Type : Plan type to operate on. Either B (Budget)
6531 -- or F (Forecast). Used only in Purge.
6532 -- X_Time_Unit : Either D (Daily), P (Period), Q (Quarter), Y (Year),
6533 -- or A (All). Used only in Purge.
6534 -- X_Date : Purge date
6535 -- X_Time_Period : Purge period (Other than date)
6536 -- X_Debug : Debug mode indicator
6537 -- Example
6538 -- result := FII_BUDGET_FORECAST_C.Main;
6539 -- Notes
6540 --
6541 PROCEDURE Main(X_Mode VARCHAR2,
6542 X_Plan_Type VARCHAR2,
6543 X_Time_Unit VARCHAR2,
6544 X_Purge_Date VARCHAR2,
6545 X_Purge_Time_Period VARCHAR2,
6546 X_Purge_Eff_Date VARCHAR2,
6547 X_Debug VARCHAR2) IS
6548 FIIBUUP_fatal_err EXCEPTION;
6549 l_ret_status BOOLEAN;
6550 l_ret_code VARCHAR2(1);
6551 l_int_count NUMBER;
6552 l_prev_bud_time_unit VARCHAR2(1) := NULL;
6553 l_prev_fc_time_unit VARCHAR2(1) := NULL;
6554 l_time_unit_changed BOOLEAN := FALSE;
6555 l_drop_bud_data VARCHAR2(1);
6556 l_drop_fc_data VARCHAR2(1);
6557
6558 l_status VARCHAR2(30);
6559 l_industry VARCHAR2(30);
6560 l_fii_schema VARCHAR2(30);
6561 l_version_date DATE;
6562 l_null_ver_date_flag VARCHAR2(1);
6563 l_budget_source VARCHAR2(15);
6564 l_industry_profile VARCHAR2(1);
6565 l_psi_bud_from_bal VARCHAR2(1);
6566 l_vs_id NUMBER;
6567 l_ret_num NUMBER;
6568
6569 CURSOR ver_date_cur IS
6570 SELECT DISTINCT trunc(version_date)
6571 FROM fii_budget_interface
6572 WHERE trunc(version_date) IS NOT NULL
6573 ORDER BY trunc(version_date);
6574
6575 CURSOR null_ver_date IS
6576 SELECT 'Y'
6577 FROM fii_budget_interface
6578 WHERE version_date IS NULL;
6579
6580 BEGIN
6581 l_drop_bud_data := 'N';
6582 l_drop_fc_data := 'N';
6583
6584 IF FND_PROFILE.value('FII_DEBUG_MODE') = 'Y' THEN
6585 FII_MESSAGE.Func_Ent('FII_BUDGET_FORECAST_C.Main');
6586 END IF;
6587
6588 -- Determine if process will be run in debug mode
6589 IF (NVL(X_Debug, 'N') <> 'N') THEN
6590 FIIBUUP_DEBUG := TRUE;
6591 ELSE
6592 FIIBUUP_DEBUG := FALSE;
6593 IF FND_PROFILE.value('FII_DEBUG_MODE') = 'Y' then
6594 FIIBUUP_DEBUG := TRUE;
6595 END IF;
6596 END IF;
6597
6598 -- Turn trace on if process is run in debug mode
6599 IF (FIIBUUP_DEBUG) THEN
6600
6601 -- Program running in debug mode, turning trace on
6602 FII_MESSAGE.Write_Log(msg_name => 'FII_CONC_PRG_DEBUG',
6603 token_num => 0);
6604
6605 EXECUTE IMMEDIATE 'ALTER SESSION SET SQL_TRACE TRUE';
6606
6607 END IF;
6608
6609 -- Find out if this is commercial or government install
6610 l_industry_profile := FND_PROFILE.value('INDUSTRY');
6611
6612 IF (FIIBUUP_DEBUG) THEN
6613 FII_MESSAGE.Write_Log
6614 (msg_name => 'FII_ROUTINE_VAL',
6615 token_num => 3 ,
6616 t1 => 'ROUTINE',
6617 v1 => 'FII_BUDGET_FORECAST_C.Main()',
6618 t2 => 'VARIABLE',
6619 v2 => 'Industry',
6620 t3 => 'VALUE',
6621 v3 => l_industry_profile);
6622 END IF;
6623
6624 --
6625 -- Enhancement 6397914: Added an option for PSI customers to optionally
6626 -- extract their budget data from gl_balances.
6627 --
6628 -- If Industry = 'G', and 'FII: Budget Data from GL Balances' is set to 'YES',
6629 -- then we'll call 'FII_GL_BUDGET_EXTRACTION() to extract budget data from
6630 -- GL BALANACES.
6631 -- This behavior will be same as if Industry = 'C' and budget source = 'GL'.
6632
6633 IF (X_Mode = 'U' AND l_industry_profile = 'G') THEN
6634 -- If the Industry = 'G', find out if we should retrieve the
6635 -- budget data from GL_BALANCES
6636
6637 l_psi_bud_from_bal := FND_PROFILE.value('FII_PSI_BUDGET_FROM_BAL');
6638
6639 IF (FIIBUUP_DEBUG) THEN
6640 FII_MESSAGE.Write_Log
6641 (msg_name => 'FII_ROUTINE_VAL',
6642 token_num => 3 ,
6643 t1 => 'ROUTINE',
6644 v1 => 'FII_BUDGET_FORECAST_C.Main()',
6645 t2 => 'VARIABLE',
6646 v2 => 'FII: Budget Data from GL Balances',
6647 t3 => 'VALUE',
6648 v3 => l_psi_bud_from_bal);
6649 END IF;
6650
6651 -- If the FII: Budget Data from GL Balances profile is turned on,
6652 -- then we'll retrive budget data from gl_balances.
6653 -- This is the same behavior when Industry = 'C' and
6654 -- budget source = 'GL'.
6655 -- Otherwise, if the profile is not turned on, we'll call
6656 -- Psi_Budget_Extract() and extract the budget data from budget journals.
6657
6658 IF (l_psi_bud_from_bal = 'Y') THEN
6659
6660 FII_GL_BUDGET_EXTRACTION.main(l_ret_code);
6661
6662 IF (l_ret_code = 'E') THEN
6663 -- GL Budget Extraction program has failed.
6664 raise FIIBUUP_fatal_err;
6665 ELSIF (l_ret_code = 'W') THEN
6666 -- GL Budget Extraction program ends with warnings.
6667 l_ret_status := FND_CONCURRENT.Set_Completion_Status
6668 (status => 'WARNING', message => NULL);
6669
6670 RETURN;
6671 ELSE
6672 -- GL Budget Extraction program completes successfully.
6673 IF (FIIBUUP_DEBUG) THEN
6674 FII_MESSAGE.Func_Succ(func_name => 'FII_BUDGET_FORECAST_C.Main');
6675 END IF;
6676
6677 l_ret_status := FND_CONCURRENT.Set_Completion_Status
6678 (status => 'COMPLETE', message => NULL);
6679
6680 RETURN;
6681 END IF;
6682 END IF;
6683 END IF;
6684
6685 IF (X_Mode = 'U' AND l_industry_profile = 'C') THEN
6686 -- Call Budget Upload or GL Budget Extraction depending on profile
6687 l_budget_source := FND_PROFILE.value('FII_BUDGET_SOURCE');
6688
6689 IF (FIIBUUP_DEBUG) THEN
6690 FII_MESSAGE.Write_Log
6691 (msg_name => 'FII_ROUTINE_VAL',
6692 token_num => 3 ,
6693 t1 => 'ROUTINE',
6694 v1 => 'FII_BUDGET_FORECAST_C.Main()',
6695 t2 => 'VARIABLE',
6696 v2 => 'Budget Source',
6697 t3 => 'VALUE',
6698 v3 => l_budget_source);
6699 END IF;
6700
6701 -- If profile is set to GL, call the GL Budget Extraction program
6702 IF l_budget_source = 'GL' THEN
6703 FII_GL_BUDGET_EXTRACTION.main(l_ret_code);
6704
6705 IF (l_ret_code = 'E') THEN
6706 -- GL Budget Extraction program has failed.
6707 raise FIIBUUP_fatal_err;
6708 ELSIF (l_ret_code = 'W') THEN
6709 -- GL Budget Extraction program ends with warnings.
6710 l_ret_status := FND_CONCURRENT.Set_Completion_Status
6711 (status => 'WARNING', message => NULL);
6712
6713 RETURN;
6714 ELSE
6715 -- GL Budget Extraction program completes successfully.
6716 IF (FIIBUUP_DEBUG) THEN
6717 FII_MESSAGE.Func_Succ(func_name => 'FII_BUDGET_FORECAST_C.Main');
6718 END IF;
6719
6720 l_ret_status := FND_CONCURRENT.Set_Completion_Status
6721 (status => 'COMPLETE', message => NULL);
6722
6723 RETURN;
6724 END IF;
6725 END IF;
6726
6727 -- Make sure that profile option value is set to WEBADI
6728 IF l_budget_source <> 'WEBADI' THEN
6729 FII_MESSAGE.Write_Log
6730 (msg_name => 'FII_BUDGET_DATA_SOURCE_ERROR',
6731 token_num => 0);
6732
6733 raise FIIBUUP_fatal_err;
6734 END IF;
6735 END IF;
6736
6737 -- Check if all input parameters are valid
6738 IF (NVL(X_Mode, 'X') <> 'U' AND NVL(X_Mode, 'X') <> 'P') THEN
6739 FII_MESSAGE.Write_Log
6740 (msg_name => 'FII_INV_OPER',
6741 token_num => 0);
6742
6743 raise FIIBUUP_fatal_err;
6744 ELSIF (X_Mode = 'P') THEN
6745 -- Running in Purge mode, check for plan_type
6746 IF ( ( X_Plan_Type is NULL
6747 OR X_Plan_Type NOT IN ('B', 'F'))
6748 OR ( X_Time_Unit is NULL
6749 OR X_Time_Unit NOT IN ('D', 'P', 'Q', 'Y', 'A'))) THEN
6750 FII_MESSAGE.Write_Log
6751 (msg_name => 'FII_INV_PAR_PURG',
6752 token_num => 0);
6753
6754 raise FIIBUUP_fatal_err;
6755 END IF;
6756
6757 FIIBUUP_PURGE_PLAN_TYPE := X_Plan_Type;
6758 FIIBUUP_PURGE_TIME_UNIT := X_Time_Unit;
6759 FIIBUUP_PURGE_TIME_PERIOD := X_Purge_Time_Period;
6760 FIIBUUP_PURGE_DATE :=
6761 TO_DATE(X_Purge_Date, 'YYYY/MM/DD HH24:MI:SS');
6762 FIIBUUP_PURGE_EFF_DATE :=
6763 TO_DATE(X_Purge_Eff_Date, 'YYYY/MM/DD HH24:MI:SS');
6764 END IF;
6765
6766 /* fix by ilavenil, gather statistics on fii_budget_interface*/
6767 IF (FND_INSTALLATION.GET_APP_INFO('FII', l_status, l_industry,
6768 l_fii_schema)) THEN
6769 FND_STATS.GATHER_TABLE_STATS(
6770 OWNNAME => l_fii_schema,
6771 TABNAME => 'FII_BUDGET_INTERFACE');
6772
6773 -- Bug 4674640: Should enable parallel dml after calling
6774 -- gather stats
6775 execute immediate 'alter session enable parallel dml';
6776 END IF;
6777
6778 g_phase := 'Get all set up information';
6779 BEGIN
6780 -- Get all set up information
6781 FIIBUUP_PRIM_CURR_CODE :=
6782 BIS_COMMON_PARAMETERS.get_currency_code;
6783
6784 FIIBUUP_SEC_CURR_CODE :=
6785 BIS_COMMON_PARAMETERS.get_secondary_currency_code;
6786
6787 FIIBUUP_PRIM_CURR_MAU := FII_CURRENCY.get_mau_primary;
6788 FIIBUUP_SEC_CURR_MAU := FII_CURRENCY.get_mau_secondary;
6789 FIIBUUP_USER_ID := FND_GLOBAL.User_Id;
6790 FIIBUUP_LOGIN_ID := FND_GLOBAL.Login_Id;
6791 FIIBUUP_REQ_ID := FND_GLOBAL.Conc_Request_Id;
6792
6793 FIIBUUP_GLOBAL_START_DATE :=
6794 TO_DATE(FND_PROFILE.Value('BIS_GLOBAL_START_DATE'),'MM/DD/YYYY');
6795 FIIBUUP_BUDGET_TIME_UNIT :=
6796 FND_PROFILE.Value('FII_BUDGET_TIME_UNIT');
6797 FIIBUUP_FORECAST_TIME_UNIT :=
6798 FND_PROFILE.Value('FII_FORECAST_TIME_UNIT');
6799
6800 IF (FIIBUUP_BUDGET_TIME_UNIT is NULL) THEN
6801 -- Print out log message and use default
6802 IF (FIIBUUP_DEBUG) THEN
6803 FII_MESSAGE.Write_Log
6804 (msg_name => 'FII_INV_PRF_OPT',
6805 token_num => 2,
6806 t1 => 'PROFILE_NAME',
6807 v1 => 'FII_BUDGET_TIME_UNIT',
6808 t2 => 'DEFAULT',
6809 V2 => 'P');
6810 END IF;
6811
6812 FIIBUUP_BUDGET_TIME_UNIT := 'P';
6813 END IF;
6814
6815 IF (FIIBUUP_FORECAST_TIME_UNIT is NULL) THEN
6816 -- Print out log message and use default
6817 IF (FIIBUUP_DEBUG) THEN
6818 FII_MESSAGE.Write_Log
6819 (msg_name => 'FII_INV_PRF_OPT',
6820 token_num => 2,
6821 t1 => 'PROFILE_NAME',
6822 v1 => 'FII_FORECAST_TIME_UNIT',
6823 t2 => 'DEFAULT',
6824 v2 => 'P');
6825 END IF;
6826
6827 FIIBUUP_FORECAST_TIME_UNIT := 'P';
6828 END IF;
6829
6830 EXCEPTION
6831 WHEN OTHERS THEN
6832 RAISE FIIBUUP_fatal_err;
6833 END;
6834
6835 -- If any of the above values is not set, error out
6836 -- Bug fix 2650924
6837 -- Note that we will not error out when secondary currency
6838 -- is not set. This is because the secondary currency is
6839 -- optional
6840 IF (FIIBUUP_USER_ID is NULL OR
6841 FIIBUUP_LOGIN_ID is NULL OR
6842 FIIBUUP_REQ_ID is NULL OR
6843 FIIBUUP_PRIM_CURR_CODE is NULL OR
6844 FIIBUUP_PRIM_CURR_MAU is NULL OR
6845 FIIBUUP_BUDGET_TIME_UNIT is NULL OR
6846 FIIBUUP_FORECAST_TIME_UNIT is NULL) THEN
6847
6848 -- Fail to initialize
6849 FII_MESSAGE.Write_Log (msg_name => 'FII_FAIL_INT_PAR_CON_PRG',
6850 token_num => 0);
6851
6852 RAISE FIIBUUP_fatal_err;
6853 END IF;
6854
6855 -- Print program run information
6856 IF (FIIBUUP_DEBUG) THEN
6857
6858 FII_MESSAGE.Write_Log
6859 (msg_name => 'FII_ROUTINE_VAL',
6860 token_num => 3 ,
6861 t1 => 'ROUTINE',
6862 v1 => 'FII_BUDGET_FORECAST_C.Main()',
6863 t2 => 'VARIABLE',
6864 v2 => 'Operation Mode',
6865 t3 => 'VALUE',
6866 v3 => X_Mode);
6867
6868 FII_MESSAGE.Write_Log
6869 (msg_name => 'FII_ROUTINE_VAL',
6870 token_num => 3 ,
6871 t1 => 'ROUTINE',
6872 v1 => 'FII_BUDGET_FORECAST_C.Main()',
6873 t2 => 'VARIABLE',
6874 v2 => 'Plan Type',
6875 t3 => 'VALUE',
6876 v3 => NVL(FIIBUUP_PURGE_PLAN_TYPE, 'N/A'));
6877
6878 FII_MESSAGE.Write_Log
6879 (msg_name => 'FII_ROUTINE_VAL',
6880 token_num => 3 ,
6881 t1 => 'ROUTINE',
6882 v1 => 'FII_BUDGET_FORECAST_C.Main()',
6883 t2 => 'VARIABLE',
6884 v2 => 'Purge Time Unit',
6885 t3 => 'VALUE',
6886 v3 => NVL(FIIBUUP_PURGE_TIME_UNIT, 'N/A'));
6887
6888 FII_MESSAGE.Write_Log
6889 (msg_name => 'FII_ROUTINE_VAL',
6890 token_num => 3 ,
6891 t1 => 'ROUTINE',
6892 v1 => 'FII_BUDGET_FORECAST_C.Main()',
6893 t2 => 'VARIABLE',
6894 v2 => 'Purge Date',
6895 t3 => 'VALUE',
6896 v3 => NVL(TO_CHAR(FIIBUUP_PURGE_DATE, 'YYYY/MM/DD HH24:MI:SS'), 'N/A'));
6897
6898 FII_MESSAGE.Write_Log
6899 (msg_name => 'FII_ROUTINE_VAL',
6900 token_num => 3 ,
6901 t1 => 'ROUTINE',
6902 v1 => 'FII_BUDGET_FORECAST_C.Main()',
6903 t2 => 'VARIABLE',
6904 v2 => 'Purge Period',
6905 t3 => 'VALUE',
6906 v3 => NVL(FIIBUUP_PURGE_TIME_PERIOD, 'N/A'));
6907
6908 FII_MESSAGE.Write_Log
6909 (msg_name => 'FII_ROUTINE_VAL',
6910 token_num => 3 ,
6911 t1 => 'ROUTINE',
6912 v1 => 'FII_BUDGET_FORECAST_C.Main()',
6913 t2 => 'VARIABLE',
6914 v2 => 'Purge Effective Date',
6915 t3 => 'VALUE',
6916 v3 => NVL(TO_CHAR(FIIBUUP_PURGE_EFF_DATE, 'YYYY/MM/DD HH24:MI:SS'), 'N/A'));
6917
6918 FII_MESSAGE.Write_Log
6919 (msg_name => 'FII_ROUTINE_VAL',
6920 token_num => 3 ,
6921 t1 => 'ROUTINE',
6922 v1 => 'FII_BUDGET_FORECAST_C.Main()',
6923 t2 => 'VARIABLE',
6924 v2 => 'Debug Mode',
6925 t3 => 'VALUE',
6926 v3 => NVL(X_Debug, 'N'));
6927
6928 FII_MESSAGE.Write_Log
6929 (msg_name => 'FII_ROUTINE_VAL',
6930 token_num => 3 ,
6931 t1 => 'ROUTINE',
6932 v1 => 'FII_BUDGET_FORECAST_C.Main()',
6933 t2 => 'VARIABLE',
6934 v2 => 'Primary Global Currency',
6935 t3 => 'VALUE',
6936 v3 => NVL(FIIBUUP_PRIM_CURR_CODE, 'NULL'));
6937
6938 FII_MESSAGE.Write_Log
6939 (msg_name => 'FII_ROUTINE_VAL',
6940 token_num => 3 ,
6941 t1 => 'ROUTINE',
6942 v1 => 'FII_BUDGET_FORECAST_C.Main()',
6943 t2 => 'VARIABLE',
6944 v2 => 'Secondary Global Currency',
6945 t3 => 'VALUE',
6946 v3 => NVL(FIIBUUP_SEC_CURR_CODE, 'NULL'));
6947
6948 FII_MESSAGE.Write_Log
6949 (msg_name => 'FII_ROUTINE_VAL',
6950 token_num => 3 ,
6951 t1 => 'ROUTINE',
6952 v1 => 'FII_BUDGET_FORECAST_C.Main()',
6953 t2 => 'VARIABLE',
6954 v2 => 'Budget Time Unit',
6955 t3 => 'VALUE',
6956 v3 => FIIBUUP_BUDGET_TIME_UNIT);
6957
6958 FII_MESSAGE.Write_Log
6959 (msg_name => 'FII_ROUTINE_VAL',
6960 token_num => 3 ,
6961 t1 => 'ROUTINE',
6962 v1 => 'FII_BUDGET_FORECAST_C.Main()',
6963 t2 => 'VARIABLE',
6964 v2 => 'Forecast Time Unit',
6965 t3 => 'VALUE',
6966 v3 => FIIBUUP_FORECAST_TIME_UNIT);
6967
6968 END IF;
6969
6970 -- Then, get prior time unit setting from FII_CHANGE_LOG
6971 IF (FIIBUUP_DEBUG) THEN
6972 FII_MESSAGE.Write_Log
6973 (msg_name => 'FII_ROUTINE',
6974 token_num => 2,
6975 t1 => 'ROUTINE',
6976 v1 => 'Main()',
6977 t2 => 'ACTION',
6978 v2 => 'Checking prior time unit settings...');
6979 END IF;
6980
6981 -- Find out the unassigned ID we should use for UDD1 and UDD2
6982 FII_GL_EXTRACTION_UTIL.get_unassigned_id(FIIBUUP_UNASSIGNED_UDD_ID,
6983 l_vs_id, l_ret_num);
6984
6985 IF(l_ret_num = -1) THEN
6986 RAISE FIIBUUP_fatal_err;
6987 END IF;
6988
6989 -- Done gathering setup info. If this is a government install,
6990 -- and we are running budget upload, call psi_budget_extract
6991 IF (X_Mode = 'U' AND l_industry_profile = 'G') THEN
6992 -- Call the PSI Budget Extraction routine since this is a
6993 -- government install
6994
6995 FII_BUDGET_FORECAST_C.Psi_Budget_Extract(l_ret_code);
6996
6997 -- Bug 4674640: Added gather stats for the budget base table
6998 FND_STATS.gather_table_stats
6999 (ownname => l_fii_schema,
7000 tabname => 'FII_BUDGET_BASE');
7001
7002 execute immediate 'alter session enable parallel dml';
7003
7004 IF (l_ret_code = 'E') THEN
7005 -- PSI Budget Extraction program has failed.
7006 raise FIIBUUP_fatal_err;
7007
7008 ELSIF (l_ret_code = 'W') THEN
7009 -- PSI Budget Extraction program ends with warnings.
7010 l_ret_status := FND_CONCURRENT.Set_Completion_Status
7011 (status => 'WARNING', message => NULL);
7012
7013 RETURN;
7014
7015 ELSE
7016 IF (FIIBUUP_DEBUG) THEN
7017 FII_MESSAGE.Func_Succ(func_name => 'FII_BUDGET_FORECAST_C.Main');
7018 END IF;
7019
7020 l_ret_status := FND_CONCURRENT.Set_Completion_Status
7021 (status => 'COMPLETE', message => NULL);
7022 RETURN;
7023 END IF;
7024 END IF;
7025
7026 g_phase := 'Get prior time unit setting from FII_CHANGE_LOG';
7027 BEGIN
7028 SELECT l.item_value
7029 INTO l_prev_bud_time_unit
7030 FROM FII_CHANGE_LOG l
7031 WHERE l.log_item = 'BUDGET_TIME_UNIT';
7032 EXCEPTION
7033 WHEN NO_DATA_FOUND THEN
7034 INSERT INTO FII_CHANGE_LOG
7035 (log_item, item_value, creation_date, created_by,
7036 last_update_date, last_updated_by, last_update_login)
7037 VALUES
7038 ('BUDGET_TIME_UNIT', FIIBUUP_BUDGET_TIME_UNIT, SYSDATE,
7039 FIIBUUP_USER_ID, SYSDATE, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID);
7040
7041 l_prev_bud_time_unit := FIIBUUP_BUDGET_TIME_UNIT;
7042 END;
7043
7044 BEGIN
7045 SELECT l.item_value
7046 INTO l_prev_fc_time_unit
7047 FROM FII_CHANGE_LOG l
7048 WHERE l.log_item = 'FORECAST_TIME_UNIT';
7049 EXCEPTION
7050 WHEN NO_DATA_FOUND THEN
7051 INSERT INTO FII_CHANGE_LOG
7052 (log_item, item_value, creation_date, created_by,
7053 last_update_date, last_updated_by, last_update_login)
7054 VALUES
7055 ('FORECAST_TIME_UNIT', FIIBUUP_FORECAST_TIME_UNIT, SYSDATE,
7056 FIIBUUP_USER_ID, SYSDATE, FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID);
7057
7058 l_prev_fc_time_unit := FIIBUUP_FORECAST_TIME_UNIT;
7059 END;
7060
7061 -- Print FII_CHANGE_LOG information
7062 IF (FIIBUUP_DEBUG) THEN
7063 FII_MESSAGE.Write_Log
7064 (msg_name => 'FII_ROUTINE_VAL',
7065 token_num => 3 ,
7066 t1 => 'ROUTINE',
7067 v1 => 'FII_BUDGET_FORECAST_C.Main()',
7068 t2 => 'VARIABLE',
7069 v2 => 'l_prev_bud_time_unit',
7070 t3 => 'VALUE',
7071 v3 => l_prev_bud_time_unit);
7072
7073 FII_MESSAGE.Write_Log
7074 (msg_name => 'FII_ROUTINE_VAL',
7075 token_num => 3 ,
7076 t1 => 'ROUTINE',
7077 v1 => 'FII_BUDGET_FORECAST_C.Main()',
7078 t2 => 'VARIABLE',
7079 v2 => 'l_prev_fc_time_unit',
7080 t3 => 'VALUE',
7081 v3 => l_prev_fc_time_unit);
7082 END IF;
7083
7084 g_phase := 'Check FII_CHANGE_LOG and see if truncation is needed';
7085 IF (X_Mode = 'U') THEN
7086
7087 -- First, get from the FII_CHANGE_LOG and see if truncation is
7088 -- needed
7089 IF (FIIBUUP_DEBUG) THEN
7090 FII_MESSAGE.Write_Log
7091 (msg_name => 'FII_ROUTINE',
7092 token_num => 2,
7093 t1 => 'ROUTINE',
7094 v1 => 'Main()',
7095 t2 => 'ACTION',
7096 v2 => 'Check for truncate flags...');
7097 END IF;
7098
7099 BEGIN
7100 SELECT l1.item_value
7101 INTO l_drop_bud_data
7102 FROM FII_CHANGE_LOG l1
7103 WHERE l1.log_item = 'TRUNCATE_BUDGET';
7104 EXCEPTION
7105 WHEN NO_DATA_FOUND THEN
7106 NULL;
7107 END;
7108
7109 BEGIN
7110 SELECT l1.item_value
7111 INTO l_drop_fc_data
7112 FROM FII_CHANGE_LOG l1
7113 WHERE l1.log_item = 'TRUNCATE_FORECAST';
7114 EXCEPTION
7115 WHEN NO_DATA_FOUND THEN
7116 NULL;
7117 END;
7118
7119 -- Here, we will do the following for both budget and forecast:
7120 -- 1) If the prior time unit setting is different from the
7121 -- current setting, tell users that truncation is needed
7122 -- and error out.
7123 -- 2) If the prior and current time unit setting is identical,
7124 -- but the truncation flag is set to Y, we assume that users
7125 -- have restored to the prior time unit setting and truncation
7126 -- is no longer needed. In this case, we reset the truncation
7127 -- flag back to N.
7128
7129 IF (NVL(l_prev_bud_time_unit, FIIBUUP_BUDGET_TIME_UNIT) <>
7130 FIIBUUP_BUDGET_TIME_UNIT) THEN
7131
7132 IF (FIIBUUP_DEBUG) THEN
7133 FII_MESSAGE.Write_Log
7134 (msg_name => 'FII_ROUTINE',
7135 token_num => 2,
7136 t1 => 'ROUTINE',
7137 v1 => 'Main()',
7138 t2 => 'ACTION',
7139 v2 =>
7140 'Budget time unit has changed, set FII_CHANGE_LOG...');
7141 END IF;
7142
7143 g_phase := 'Indicate in FII_CHANGE_LOG - budget needs to be dropped';
7144
7145 MERGE INTO FII_CHANGE_LOG l1
7146 USING
7147 (SELECT 'TRUNCATE_BUDGET' log_item from DUAL) l2
7148 ON (l1.log_item = l2.log_item)
7149 WHEN MATCHED THEN UPDATE SET
7150 item_value = 'Y',
7151 last_update_date = SYSDATE,
7152 last_updated_by = FIIBUUP_USER_ID,
7153 last_update_login = FIIBUUP_LOGIN_ID
7154 WHEN NOT MATCHED THEN INSERT
7155 (l1.log_item, l1.item_value, l1.creation_date,
7156 l1.created_by, l1.last_update_date, l1.last_updated_by,
7157 l1.last_update_login)
7158 VALUES
7159 ('TRUNCATE_BUDGET', 'Y', SYSDATE, FIIBUUP_USER_ID, SYSDATE,
7160 FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID);
7161
7162 -- Print out message
7163 IF (FIIBUUP_DEBUG) THEN
7164 FII_MESSAGE.Write_Log
7165 (msg_name => 'FII_UPD_REC',
7166 token_num => 2,
7167 t1 => 'NUM',
7168 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
7169 t2 => 'TABLE',
7170 v2 => 'FII_CHANGE_LOG');
7171
7172 FII_MESSAGE.Write_Log
7173 (msg_name => 'FII_INV_BUD_TIM_UNIT',
7174 token_num => 0);
7175 END IF;
7176
7177 l_time_unit_changed := TRUE;
7178 END IF;
7179
7180 IF (l_drop_bud_data = 'Y') THEN
7181 g_phase := 'Since prior and current time unit setting is identical, reset truncation flag to N';
7182
7183 UPDATE FII_CHANGE_LOG
7184 SET item_value = 'N',
7185 last_update_date = SYSDATE,
7186 last_updated_by = FIIBUUP_USER_ID,
7187 last_update_login = FIIBUUP_LOGIN_ID
7188 WHERE log_item = 'TRUNCATE_BUDGET';
7189
7190 IF (FIIBUUP_DEBUG) THEN
7191 FII_MESSAGE.Write_Log
7192 (msg_name => 'FII_UPD_REC',
7193 token_num => 2,
7194 t1 => 'NUM',
7195 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
7196 t2 => 'TABLE',
7197 v2 => 'FII_CHANGE_LOG');
7198 END IF;
7199
7200 END IF;
7201
7202 IF (NVL(l_prev_fc_time_unit, FIIBUUP_FORECAST_TIME_UNIT) <>
7203 FIIBUUP_FORECAST_TIME_UNIT) THEN
7204
7205 g_phase := 'Indicate in FII_CHANGE_LOG that forecast needs to be dropped';
7206
7207 IF (FIIBUUP_DEBUG) THEN
7208 FII_MESSAGE.Write_Log
7209 (msg_name => 'FII_ROUTINE',
7210 token_num => 2,
7211 t1 => 'ROUTINE',
7212 v1 => 'Main()',
7213 t2 => 'ACTION',
7214 v2 =>
7215 'Forecast time unit has changed, set FII_CHANGE_LOG...');
7216 END IF;
7217
7218 MERGE INTO FII_CHANGE_LOG l1
7219 USING
7220 (SELECT 'TRUNCATE_FORECAST' log_item from DUAL) l2
7221 ON (l1.log_item = l2.log_item)
7222 WHEN MATCHED THEN UPDATE SET
7223 item_value = 'Y',
7224 last_update_date = SYSDATE,
7225 last_updated_by = FIIBUUP_USER_ID,
7226 last_update_login = FIIBUUP_LOGIN_ID
7227 WHEN NOT MATCHED THEN INSERT
7228 (l1.log_item, l1.item_value, l1.creation_date,
7229 l1.created_by, l1.last_update_date, l1.last_updated_by,
7230 l1.last_update_login)
7231 VALUES
7232 ('TRUNCATE_FORECAST', 'Y', SYSDATE, FIIBUUP_USER_ID, SYSDATE,
7233 FIIBUUP_USER_ID, FIIBUUP_LOGIN_ID);
7234
7235 -- Print out message
7236 IF (FIIBUUP_DEBUG) THEN
7237 FII_MESSAGE.Write_Log
7238 (msg_name => 'FII_UPD_REC',
7239 token_num => 2,
7240 t1 => 'NUM',
7241 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
7242 t2 => 'TABLE',
7243 v2 => 'FII_CHANGE_LOG');
7244
7245 FII_MESSAGE.Write_Log
7246 (msg_name => 'FII_INV_FRC_TIM_UNIT',
7247 token_num => 0);
7248 END IF;
7249
7250 l_time_unit_changed := TRUE;
7251 END IF;
7252
7253 IF (l_drop_fc_data = 'Y') THEN
7254 g_phase := 'Prior and current time unit setting are identical, reset truncation flag to N';
7255
7256 UPDATE FII_CHANGE_LOG
7257 SET item_value = 'N',
7258 last_update_date = SYSDATE,
7259 last_updated_by = FIIBUUP_USER_ID,
7260 last_update_login = FIIBUUP_LOGIN_ID
7261 WHERE log_item = 'TRUNCATE_BUDGET';
7262
7263 IF (FIIBUUP_DEBUG) THEN
7264 FII_MESSAGE.Write_Log
7265 (msg_name => 'FII_UPD_REC',
7266 token_num => 2,
7267 t1 => 'NUM',
7268 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
7269 t2 => 'TABLE',
7270 v2 => 'FII_CHANGE_LOG');
7271 END IF;
7272
7273 END IF;
7274
7275 FND_CONCURRENT.Af_Commit;
7276
7277 IF (l_time_unit_changed) THEN
7278 raise FIIBUUP_fatal_err;
7279 END IF;
7280
7281 IF (FIIBUUP_DEBUG) THEN
7282 FII_MESSAGE.Write_Log
7283 (msg_name => 'FII_ROUTINE',
7284 token_num => 2,
7285 t1 => 'ROUTINE',
7286 v1 => 'Main()',
7287 t2 => 'ACTION',
7288 v2 => 'Truncating FII_BUDGET_DELTAS...');
7289 END IF;
7290
7291 g_phase := 'Truncate the staging table FII_BUDGET_DELTAS';
7292 FII_UTIL.truncate_table ('FII_BUDGET_DELTAS', 'FII', g_retcode);
7293
7294 IF (FIIBUUP_DEBUG) THEN
7295 FII_MESSAGE.Write_Log
7296 (msg_name => 'FII_ROUTINE',
7297 token_num => 2,
7298 t1 => 'ROUTINE',
7299 v1 => 'Main()',
7300 t2 => 'ACTION',
7301 v2 => 'Truncating FII_BUDGET_BASE_T...');
7302 END IF;
7303
7304 g_phase := 'Truncate the staging table FII_BUDGET_BASE_T';
7305 FII_UTIL.truncate_table ('FII_BUDGET_BASE_T', 'FII', g_retcode);
7306
7307 IF (FIIBUUP_DEBUG) THEN
7308 FII_MESSAGE.Write_Log
7309 (msg_name => 'FII_ROUTINE',
7310 token_num => 2,
7311 t1 => 'ROUTINE',
7312 v1 => 'Main()',
7313 t2 => 'ACTION',
7314 v2 => 'Truncating FII_BUDGET_STG...');
7315 END IF;
7316
7317 g_phase := 'Truncate the staging table FII_BUDGET_STG';
7318 FII_UTIL.truncate_table ('FII_BUDGET_STG', 'FII', g_retcode);
7319
7320 FND_CONCURRENT.Af_Commit;
7321
7322 -- Check if there is anything to upload. If nothing,
7323 -- exit normally.
7324
7325 -- Bug fix 4943332: Changed to return 1 if any row exists
7326 BEGIN
7327 SELECT 1
7328 INTO l_int_count
7329 FROM FII_BUDGET_INTERFACE
7330 WHERE rownum = 1;
7331 EXCEPTION
7332 WHEN NO_DATA_FOUND THEN
7333 l_int_count := 0;
7334 END;
7335
7336 IF (l_int_count = 0) THEN
7337 IF (FIIBUUP_DEBUG) THEN
7338 FII_MESSAGE.Func_Succ(func_name => 'FII_BUDGET_FORECAST_C.Main');
7339 END IF;
7340
7341 l_ret_status := FND_CONCURRENT.Set_Completion_Status
7342 (status => 'COMPLETE', message => NULL);
7343
7344 RETURN;
7345 END IF;
7346
7347 -- Lock down FII_BUDGET_INTERFACE before processing.
7348 -- This is to prevent users from uploading new records into the
7349 -- interface while program is running.
7350 IF (FIIBUUP_DEBUG) THEN
7351 FII_MESSAGE.Write_Log
7352 (msg_name => 'FII_ROUTINE',
7353 token_num => 2,
7354 t1 => 'ROUTINE',
7355 v1 => 'Main()',
7356 t2 => 'ACTION',
7357 v2 => 'Locking down FII_BUDGET_INTERFACE...');
7358 END IF;
7359
7360 g_phase := 'Locking down FII_BUDGET_INTERFACE';
7361 EXECUTE IMMEDIATE
7362 'Lock Table FII_BUDGET_INTERFACE in exclusive mode nowait';
7363
7364 -- Start upload process
7365 FII_BUDGET_FORECAST_C.Validate(l_ret_code);
7366
7367 -- If Validate() ends with error or warning, we should stop here.
7368 IF (l_ret_code = 'E') THEN
7369 -- Validate has failed.
7370 raise FIIBUUP_fatal_err;
7371
7372 ELSIF (l_ret_code = 'W') THEN
7373 -- Validate ends with warnings.
7374 IF (FIIBUUP_DEBUG) THEN
7375 FII_MESSAGE.Func_Succ(func_name => 'FII_BUDGET_FORECAST_C.Main');
7376 END IF;
7377
7378 l_ret_status := FND_CONCURRENT.Set_Completion_Status
7379 (status => 'WARNING', message => NULL);
7380 RETURN;
7381 END IF;
7382
7383 -- Bug 4255345: Delete data from base table when ledgers are no longer
7384 -- set up in FDS
7385 /* Bug 4655730: Commented out this delete statement due to performance issue
7386 and also deleting ledgers from FDS is a corner case. We'll have a long
7387 term fix for this tracked in bug 4660166.
7388
7389 g_phase := 'Delete from FII_BUDGET_BASE when ledgers are no longer set up';
7390
7391 IF (FIIBUUP_DEBUG) THEN
7392 FII_MESSAGE.Write_Log
7393 (msg_name => 'FII_ROUTINE',
7394 token_num => 2,
7395 t1 => 'ROUTINE',
7396 v1 => 'Main()',
7397 t2 => 'ACTION',
7398 v2 => 'Deleting records from FII_BUDGET_BASE for ledgers that is no longer set up in FDS...');
7399 END IF;
7400
7401 DELETE FROM fii_budget_base
7402 WHERE ledger_id IN (
7403 SELECT DISTINCT ledger_id
7404 FROM fii_budget_base
7405 WHERE ledger_id NOT IN (SELECT ledger_id
7406 FROM fii_slg_assignments ));
7407
7408 IF (FIIBUUP_DEBUG) THEN
7409 FII_MESSAGE.Write_Log
7410 (msg_name => 'FII_DEL_REC',
7411 token_num => 2,
7412 t1 => 'NUM',
7413 v1 => TO_CHAR(NVL(SQL%ROWCOUNT, 0)),
7414 t2 => 'TABLE',
7415 v2 => 'FII_BUDGET_BASE');
7416 END IF;
7417 */
7418 -- Process NULL version dates
7419 l_null_ver_date_flag := 'N';
7420 OPEN null_ver_date;
7421 FETCH null_ver_date INTO l_null_ver_date_flag;
7422 CLOSE null_ver_date;
7423
7424 IF (l_null_ver_date_flag = 'Y') THEN
7425 IF(NOT FII_BUDGET_FORECAST_C.Prior_version) THEN
7426 raise FIIBUUP_fatal_err;
7427 END IF;
7428
7429 IF(NOT FII_BUDGET_FORECAST_C.Stage(NULL)) THEN
7430 raise FIIBUUP_fatal_err;
7431 END IF;
7432
7433 IF(NOT FII_BUDGET_FORECAST_C.Adjust_Amount) THEN
7434 raise FIIBUUP_fatal_err;
7435 END IF;
7436
7437 IF(NOT FII_BUDGET_FORECAST_C.rollup_Stage) THEN
7438 raise FIIBUUP_fatal_err;
7439 END IF;
7440
7441 IF(NOT FII_BUDGET_FORECAST_C.adjust_Stage) THEN
7442 raise FIIBUUP_fatal_err;
7443 END IF;
7444
7445 IF(NOT FII_BUDGET_FORECAST_C.merge) THEN
7446 raise FIIBUUP_fatal_err;
7447 END IF;
7448
7449 IF(NOT FII_BUDGET_FORECAST_C.adjust_ver_date) THEN
7450 raise FIIBUUP_fatal_err;
7451 END IF;
7452
7453 END IF;
7454
7455 -- Process other version_dates in interface in ascending order
7456 OPEN ver_date_cur;
7457 LOOP
7458 FETCH ver_date_cur INTO l_version_date;
7459 EXIT WHEN ver_date_cur%NOTFOUND;
7460
7461 IF (FIIBUUP_DEBUG) THEN
7462 FII_MESSAGE.Write_Log
7463 (msg_name => 'FII_ROUTINE',
7464 token_num => 2,
7465 t1 => 'ROUTINE',
7466 v1 => 'Main()',
7467 t2 => 'ACTION',
7468 v2 => 'Truncating FII_BUDGET_DELTAS...');
7469 END IF;
7470
7471 g_phase := 'Truncate the staging table FII_BUDGET_DELTAS';
7472 FII_UTIL.truncate_table ('FII_BUDGET_DELTAS', 'FII', g_retcode);
7473
7474 IF (FIIBUUP_DEBUG) THEN
7475 FII_MESSAGE.Write_Log
7476 (msg_name => 'FII_ROUTINE',
7477 token_num => 2,
7478 t1 => 'ROUTINE',
7479 v1 => 'Main()',
7480 t2 => 'ACTION',
7481 v2 => 'Truncating FII_BUDGET_BASE_T...');
7482 END IF;
7483
7484 g_phase := 'Truncate the staging table FII_BUDGET_BASE_T';
7485 FII_UTIL.truncate_table ('FII_BUDGET_BASE_T', 'FII', g_retcode);
7486
7487 IF (FIIBUUP_DEBUG) THEN
7488 FII_MESSAGE.Write_Log
7489 (msg_name => 'FII_ROUTINE',
7490 token_num => 2,
7491 t1 => 'ROUTINE',
7492 v1 => 'Main()',
7493 t2 => 'ACTION',
7494 v2 => 'Truncating FII_BUDGET_STG...');
7495 END IF;
7496
7497 g_phase := 'Truncate the staging table FII_BUDGET_STG';
7498 FII_UTIL.truncate_table ('FII_BUDGET_STG', 'FII', g_retcode);
7499
7500 IF(NOT FII_BUDGET_FORECAST_C.Prior_version(l_version_date)) THEN
7501 raise FIIBUUP_fatal_err;
7502 END IF;
7503
7504 IF(NOT FII_BUDGET_FORECAST_C.Stage(l_version_date)) THEN
7505 raise FIIBUUP_fatal_err;
7506 END IF;
7507
7508 IF(NOT FII_BUDGET_FORECAST_C.Adjust_Amount) THEN
7509 raise FIIBUUP_fatal_err;
7510 END IF;
7511
7512 IF(NOT FII_BUDGET_FORECAST_C.Rollup_Stage) THEN
7513 raise FIIBUUP_fatal_err;
7514 END IF;
7515
7516 IF(NOT FII_BUDGET_FORECAST_C.Adjust_Stage) THEN
7517 raise FIIBUUP_fatal_err;
7518 END IF;
7519
7520 IF(NOT FII_BUDGET_FORECAST_C.merge) THEN
7521 raise FIIBUUP_fatal_err;
7522 END IF;
7523
7524 IF(NOT FII_BUDGET_FORECAST_C.adjust_ver_date) THEN
7525 raise FIIBUUP_fatal_err;
7526 END IF;
7527
7528 END LOOP;
7529 CLOSE ver_date_cur;
7530
7531 ELSIF (X_Mode = 'P') THEN
7532 IF (FIIBUUP_PURGE_EFF_DATE IS NOT NULL) THEN
7533 IF(NOT FII_BUDGET_FORECAST_C.purge_eff_date(FIIBUUP_PURGE_EFF_DATE)) THEN
7534 raise FIIBUUP_fatal_err;
7535 END IF;
7536
7537 ELSE
7538
7539 IF (FIIBUUP_PURGE_TIME_UNIT = 'A') THEN
7540 IF (NOT Purge_All) THEN
7541 raise FIIBUUP_fatal_err;
7542 END IF;
7543 ELSE
7544
7545 -- Check if purge time unit is the same as the profile.
7546 -- If not, error out.
7547 IF ((FIIBUUP_PURGE_PLAN_TYPE = 'B' AND
7548 FIIBUUP_PURGE_TIME_UNIT <> l_prev_bud_time_unit) OR
7549 (FIIBUUP_PURGE_PLAN_TYPE = 'F' AND
7550 FIIBUUP_PURGE_TIME_UNIT <> l_prev_fc_time_unit)) THEN
7551
7552 FII_MESSAGE.Write_Log
7553 (msg_name => 'FII_INV_PAR_PURG',
7554 token_num => 0);
7555
7556 raise FIIBUUP_fatal_err;
7557 END IF;
7558
7559 IF (NOT Purge_Partial) THEN
7560 raise FIIBUUP_fatal_err;
7561 END IF;
7562 END IF;
7563 END IF;
7564 END IF;
7565
7566 FND_CONCURRENT.Af_Commit;
7567
7568 -- Bug 4674640: Added gather stats for the budget base table
7569 FND_STATS.gather_table_stats
7570 (ownname => l_fii_schema,
7571 tabname => 'FII_BUDGET_BASE');
7572
7573 execute immediate 'alter session enable parallel dml';
7574
7575 IF (FIIBUUP_DEBUG) THEN
7576 FII_MESSAGE.Func_Succ(func_name => 'FII_BUDGET_FORECAST_C.Main');
7577 END IF;
7578
7579 l_ret_status := FND_CONCURRENT.Set_Completion_Status
7580 (status => 'COMPLETE', message => NULL);
7581
7582 EXCEPTION
7583 WHEN FIIBUUP_fatal_err THEN
7584
7585 FND_CONCURRENT.Af_Rollback;
7586
7587 FII_MESSAGE.Write_Log
7588 (msg_name => 'FII_ERR_ENC_ROUT',
7589 token_num => 1,
7590 t1 => 'ROUTINE_NAME',
7591 v1 => 'FII_BUDGET_FORECAST_C.Main()');
7592
7593 FII_MESSAGE.Func_Fail(func_name => 'FII_BUDGET_FORECAST_C.Main');
7594
7595 fii_util.put_line ('Phase: ' || g_phase ||
7596 'Error: ' || sqlerrm);
7597
7598 l_ret_status := FND_CONCURRENT.Set_Completion_Status
7599 (status => 'ERROR', message => substr(sqlerrm,1,180));
7600
7601 WHEN OTHERS THEN
7602
7603 FND_CONCURRENT.Af_Rollback;
7604
7605 FII_MESSAGE.Write_Log(msg_name => 'FII_ERROR',
7606 token_num => 2,
7607 t1 => 'FUNCTION',
7608 v1 => 'FII_BUDGET_FORECAST_C.Main()',
7609 t2 => 'SQLERRMC',
7610 v2 => SQLERRM);
7611
7612 FII_MESSAGE.Func_Fail(func_name => 'FII_BUDGET_FORECAST_C.Main');
7613
7614 fii_util.put_line ('Phase: ' || g_phase ||
7615 'Error: ' || sqlerrm);
7616
7617 l_ret_status := FND_CONCURRENT.Set_Completion_Status
7618 (status => 'ERROR', message => substr(sqlerrm,1,180));
7619 END Main;
7620
7621 -------------------------------------------------------------------------------
7622
7623 --
7624 -- Procedure
7625 -- Upload
7626 -- Purpose
7627 -- This is the concurrent job version of the Upload program. This will
7628 -- be used when submitting the program through forms.
7629 -- History
7630 -- 05-03-02 S Kung Created
7631 -- Arguments
7632 -- X_Debug: Debug Mode indicator
7633 -- Example
7634 -- result := FII_BUDGET_FORECAST_C.Upload(errbuf, retcode);
7635 -- Notes
7636 --
7637 PROCEDURE Upload(errbuf OUT NOCOPY VARCHAR2,
7638 retcode OUT NOCOPY VARCHAR2,
7639 X_Debug VARCHAR2) IS
7640 BEGIN
7641 FII_BUDGET_FORECAST_C.Main(X_Mode => 'U',
7642 X_Debug => X_Debug);
7643
7644 EXCEPTION
7645 WHEN OTHERS THEN
7646 errbuf := SQLERRM;
7647 retcode := '2';
7648 app_exception.raise_exception;
7649 END Upload;
7650
7651 -------------------------------------------------------------------------------
7652
7653 --
7654 -- Procedure
7655 -- Purge
7656 -- Purpose
7657 -- This is the concurrent job version of the Purge program. This will be
7658 -- used when submitting the program through forms.
7659 -- History
7660 -- 05-03-02 S Kung Created
7661 -- Arguments
7662 -- X_Plan_Type : Plan type to operate on. Either B (Budget)
7663 -- or F (Forecast). Used only in Purge.
7664 -- X_Time_Unit : Either D (Daily), P (Period), Q (Quarter), Y (Year),
7665 -- or A (All). Used only in Purge.
7666 -- X_Date : Purge date
7667 -- X_Time_Period : Purge period (other than date)
7668 -- X_Purge_Eff_Date : Purge effective date
7669 -- X_Debug : Debug mode indicator
7670 -- Example
7671 -- result := FII_BUDGET_FORECAST_C.Purge
7672 -- (errbuf, retcode, 'B', 'P', 'Jan-01');
7673 --
7674 PROCEDURE Purge(errbuf OUT NOCOPY VARCHAR2,
7675 retcode OUT NOCOPY VARCHAR2,
7676 X_Plan_Type VARCHAR2,
7677 X_Time_Unit VARCHAR2,
7678 X_Purge_Date VARCHAR2,
7679 X_Purge_Time_Period VARCHAR2,
7680 X_Purge_Eff_Date VARCHAR2,
7681 X_Debug VARCHAR2) IS
7682 BEGIN
7683
7684 FII_BUDGET_FORECAST_C.Main(X_Mode => 'P',
7685 X_Plan_Type => X_Plan_Type,
7686 X_Time_Unit => X_Time_Unit,
7687 X_Purge_Date => X_Purge_Date,
7688 X_Purge_Time_Period => X_Purge_Time_Period,
7689 X_Purge_Eff_Date => X_Purge_Eff_Date,
7690 X_Debug => X_Debug);
7691
7692 EXCEPTION
7693 WHEN OTHERS THEN
7694 errbuf := SQLERRM;
7695 retcode := '2';
7696 app_exception.raise_exception;
7697 END Purge;
7698
7699 -------------------------------------------------------------------------------
7700
7701 END FII_BUDGET_FORECAST_C;