DBA Data[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;