DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_FP_CALC_UTILS

Source


1 PACKAGE BODY PA_FP_CALC_UTILS AS
2 --$Header: PAFPCL1B.pls 120.34.12020000.3 2012/07/30 12:33:54 tvala ship $
3 
4     g_module_name VARCHAR2(100) := 'pa.plsql.PA_FP_CALC_UTILS';
5     g_stage          Varchar2(1000);
6     P_PA_DEBUG_MODE varchar2(1) := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
7     g_LAST_UPDATE_DATE  Date  := SYSDATE;
8     g_LAST_UPDATED_BY   Number:= fnd_global.user_id;
9     g_CREATION_DATE Date  := SYSDATE;
10     g_CREATED_BY        Number:= fnd_global.user_id;
11     g_LAST_UPDATE_LOGIN   Number:= fnd_global.login_id;
12     g_rollup_required_flag   Varchar2(10) := 'Y';
13     g_budget_version_id      Number;
14     g_budget_version_type    Varchar2(100);
15     g_budget_version_name    Varchar2(250);
16     g_etc_start_date     Date;
17     g_wp_version_flag        Varchar2(10);
18     g_project_name           pa_projects_all.segment1%type;
19     g_project_id             Number;
20     g_ciid                   Number;
21     g_Plan_Class_Type        Varchar2(50);
22     g_project_currency_code  Varchar2(50);
23     g_projfunc_currency_code  Varchar2(50);
24     g_refresh_rates_flag     Varchar2(10);
25     g_refresh_conv_rates_flag Varchar2(10);
26     g_mass_adjust_flag    Varchar2(10);
27     g_source_context          Varchar2(100);
28     g_apply_progress_flag     Varchar2(10);
29     g_baseline_funding_flag   Varchar2(10);
30     g_approved_revenue_flag   Varchar2(10);
31     g_calling_module          Varchar2(100);
32 
33 	g_time_phase_changed_flag   Varchar2(1) := 'N'; /* Bug fix:4613444 */
34 	g_wp_cost_changed_flag      Varchar2(1) := 'N';
35 
36     g_RsAtrb_RaId_tab       pa_plsql_datatypes.NumTabTyp;
37         g_RsAtrb_TxnCur_tab     pa_plsql_datatypes.Char50TabTyp;
38 
39     g_Rspd_RaId_tab         pa_plsql_datatypes.NumTabTyp;
40         g_Rspd_TxnCur_tab       pa_plsql_datatypes.Char50TabTyp;
41         g_Rspd_Pjcur_tab        pa_plsql_datatypes.Char50TabTyp;
42         g_Rspd_pjf_cur_tab      pa_plsql_datatypes.Char50TabTyp;
43         g_Rspd_SdShrk_Flg_tab       pa_plsql_datatypes.Char1TabTyp;
44         g_Rspd_EdShrk_Flg_tab       pa_plsql_datatypes.Char1TabTyp;
45         g_Rspd_SD_old_tab       pa_plsql_datatypes.DateTabTyp;
46         g_Rspd_SD_new_tab       pa_plsql_datatypes.DateTabTyp;
47         g_Rspd_ED_old_tab       pa_plsql_datatypes.DateTabTyp;
48         g_Rspd_ED_new_tab       pa_plsql_datatypes.DateTabTyp;
49 
50         -- CBS 13653430 changes
51         g_wp_resource_class_flag    VARCHAR2(1) := 'Y';
52 
53     /* cursor to fetch the period details for the given budget version */
54         CURSOR periodDetails(p_budget_version_id Number) IS
55         SELECT DECODE(DECODE(pbv.version_type,
56                         'COST',ppfo.cost_time_phased_code,
57                         'REVENUE',ppfo.revenue_time_phased_code,
58                          ppfo.all_time_phased_code),'G',gsb.period_set_name
59 			  ,'P',pia.period_set_name) period_set_name  --Bug 13362320
60 		  ,gsb.accounted_period_type      accounted_period_type
61                 ,pia.pa_period_type             pa_period_type
62                 ,pbv.version_type               version_type
63                 ,decode(pbv.version_type,
64                         'COST',ppfo.cost_time_phased_code,
65                         'REVENUE',ppfo.revenue_time_phased_code,
66                          ppfo.all_time_phased_code) time_phased_code
67          FROM gl_sets_of_books          gsb
68                 ,pa_implementations_all pia
69                 ,pa_projects_all        ppa
70                 ,pa_budget_versions     pbv
71                 ,pa_proj_fp_options     ppfo
72         WHERE ppa.project_id        = pbv.project_id
73         AND pbv.budget_version_id = ppfo.fin_plan_version_id
74         /* MOAC changes: AND nvl(ppa.org_id,-99)   = nvl(pia.org_id,-99) */
75 	AND  ppa.org_id = pia.org_id
76         AND gsb.set_of_books_id   = pia.set_of_books_id
77         AND pbv.budget_version_id = p_budget_version_id;
78         perdRec         periodDetails%ROWTYPE;
79 
80 
81     /* curosr to select the version level details */
82     CURSOR cur_bvDetails(p_budget_version_id Number) IS
83     SELECT decode(nvl(bv.wp_version_flag,'N'),'Y',NVL(pfo.track_workplan_costs_flag,'N'),'Y') track_workplan_costs_flag
84           ,bv.version_type
85           ,bv.resource_list_id
86           ,bv.approved_rev_plan_type_flag
87           ,nvl(pfo.plan_in_multi_curr_flag,'N') plan_in_multi_curr_flag
88           ,bv.etc_start_date
89           ,nvl(bv.wp_version_flag,'N') wp_version_flag
90           ,decode(bv.version_type,
91                   'COST',NVL(pfo.cost_time_phased_code,'N'),
92                   'REVENUE',NVL(pfo.revenue_time_phased_code,'N'),
93                   NVL(pfo.all_time_phased_code,'N')) time_phased_code
94       ,pp.segment1  project_name
95       ,pp.project_currency_code
96       ,pp.projfunc_currency_code
97       ,bv.version_name
98       ,NVL(pp.baseline_funding_flag,'N') baseline_funding_flag
99         ,bv.project_id
100         ,bv.ci_id ciId
101         ,decode(fpt.plan_class_code,'BUDGET'
102             ,decode(bv.wp_version_flag,'Y','WORKPLAN',fpt.plan_class_code),fpt.plan_class_code) Plan_Class_Type
103         FROM pa_proj_fp_options pfo
104             ,pa_budget_versions bv
105         ,pa_projects_all pp
106         ,pa_fin_plan_types_b fpt
107         WHERE pfo.fin_plan_version_id = bv.budget_version_id
108         AND bv.project_id = pp.project_id
109         AND bv.budget_version_id = p_budget_version_id
110         AND  fpt.fin_plan_type_id = pfo.fin_plan_type_id;
111     bvDetailsRec    cur_bvDetails%ROWTYPE;
112 
113 /**
114 procedure calc_log(p_msg  varchar2) IS
115 
116         pragma autonomous_transaction ;
117 BEGIN
118         --dbms_output.put_line(p_msg);
119         --IF P_PA_DEBUG_MODE = 'Y' Then
120             NULL;
121             INSERT INTO PA_FP_CALCULATE_LOG
122                 (SESSIONID
123                 ,SEQ_NUMBER
124                 ,LOG_MESSAGE)
125             VALUES
126                 (userenv('sessionid')
127                 ,HR.PAY_US_GARN_FEE_RULES_S.nextval
128                 ,substr(P_MSG,1,240)
129                 );
130         --END IF;
131         COMMIT;
132 
133 end calc_log;
134 **/
135 procedure PRINT_MSG(P_MSG  VARCHAR2) is
136 
137 BEGIN
138         --calc_log(P_MSG);
139     --dbms_output.put_line(P_MSG);
140         IF P_PA_DEBUG_MODE = 'Y' Then
141             pa_debug.g_err_stage := substr('LOG:'||p_msg,1,240);
142             PA_DEBUG.write
143                 (x_Module       => g_module_name
144                 ,x_Msg          => pa_debug.g_err_stage
145                 ,x_Log_Level    => 3);
146         END IF;
147         Return;
148 END PRINT_MSG;
149 
150 PROCEDURE Init_plsqlTabs IS
151 
152 BEGIN
153     g_RsAtrb_RaId_tab.delete;
154         g_RsAtrb_TxnCur_tab.delete;
155 
156         g_Rspd_RaId_tab.delete;
157         g_Rspd_TxnCur_tab.delete;
158         g_Rspd_Pjcur_tab.delete;
159         g_Rspd_pjf_cur_tab.delete;
160         g_Rspd_SdShrk_Flg_tab.delete;
161         g_Rspd_EdShrk_Flg_tab.delete;
162         g_Rspd_SD_old_tab.delete;
163         g_Rspd_SD_new_tab.delete;
164         g_Rspd_ED_old_tab.delete;
165         g_Rspd_ED_new_tab.delete;
166 END;
167 FUNCTION IsResMultiCurrency(p_resAsgnId  Number
168             ,p_budget_version_id  Number) RETURN varchar2 IS
169 
170     CURSOR cur_check IS
171     SELECT 'Y'
172     FROM dual
173     WHERE EXISTS ( select null
174             from pa_budget_lines bl
175             where bl.budget_version_id = p_budget_version_id
176             and   bl.resource_assignment_id = p_resAsgnId
177             GROUP BY bl.resource_assignment_id
178             HAVING COUNT(*) > 1
179              );
180 
181     l_exists_flag  Varchar2(1);
182 BEGIN
183     OPEN cur_check;
184     FETCH cur_check INTO l_exists_flag;
185     CLOSE cur_check;
186 
187     RETURN NVL(l_exists_flag,'N');
188 
189 END IsResMultiCurrency;
190 
191 /* bug fix:5726773 */
192  	 /* This API gets the sum of budget line quantity for the given resource assignment id and txn currency
193  	  * combo. This API is used to check whether user try to change amounts only when budget lines exists which makes
194  	  * total sum of quantity is zero. This causes the ORA error:divide-by-zero error
195  	  */
196  	 PROCEDURE get_bl_sum
197  	                 (p_budget_version_id Number
198  	                 ,p_ra_id Number
199  	                 ,p_txn_cur_code Varchar2
200  	                 ,p_source_context  varchar2 default 'RESOURCE_ASSIGNMENT'
201  	                 ,p_start_date date
202  	                 ,p_end_date   date
203  	                 ,x_bl_qty_sum  OUT NOCOPY NUMBER ) IS
204 
205  	     /* bug fix:5726773: Added for supporting neg or zero quantity spread */
206 
207  	     Cursor  cur_asgn_bl_sumchk IS
208  	     SELECT /*+ INDEX(BL PA_BUDGET_LINES_U1) */
209  	         sum(bl.quantity)  bl_sum_quantity
210  	         ,sum(bl.init_quantity) bl_sum_act_quantity
211  	     FroM pa_budget_lines bl
212  	     where bl.resource_assignment_id = p_ra_id
213  	     and bl.txn_currency_code = p_txn_cur_code
214  	     and bl.budget_version_id = p_budget_version_id;
215 
216 
217  	     Cursor  cur_periodic_bl_sumchk IS
218  	     SELECT /*+ INDEX(BL PA_BUDGET_LINES_U1) */
219  	         sum(bl.quantity) bl_sum_quantity
220  	         ,sum(bl.init_quantity) bl_sum_act_quantity
221  	     FroM pa_budget_lines bl
222  	     where bl.resource_assignment_id = p_ra_id
223  	     and bl.txn_currency_code = p_txn_cur_code
224  	     and bl.budget_version_id = p_budget_version_id
225  	     and bl.start_date between p_start_date and p_end_date;
226 
227  	         l_bl_act_sum   Number;
228 
229  	 BEGIN
230  	         x_bl_qty_sum := NULL;
231  	         l_bl_act_sum := NULL;
232 
233  	         If p_source_context = 'BUDGET_LINE' then
234  	                 OPEN cur_periodic_bl_sumchk;
235  	                 FETCH cur_periodic_bl_sumchk INTO x_bl_qty_sum,l_bl_act_sum;
236  	                 CLOSE cur_periodic_bl_sumchk;
237  	         Else
238  	                 OPEN cur_asgn_bl_sumchk;
239  	                 FETCH cur_asgn_bl_sumchk INTO x_bl_qty_sum,l_bl_act_sum;
240  	                 CLOSE cur_asgn_bl_sumchk;
241  	         End If;
242  	         /* Note: nvl should not be added to x_bl_qty_sum, the idea is to check the
243  	          * budget line quantity sum which makes zero */
244  	         x_bl_qty_sum := x_bl_qty_sum - nvl(l_bl_act_sum,0);
245 
246  	 END get_bl_sum;
247 
248 /* Throw an error If budget lines having zero qty and actuals, these lines corrupted budget lines
249  * getting created through the AMG apis and budget generation process. Just abort the process
250 */
251 PROCEDURE Check_ZeroQty_Bls
252                 ( p_budget_version_id  IN NUMBER
253                  ,x_return_status    OUT NOCOPY VARCHAR2
254                 ) IS
255 
256     CURSOR cur_CorruptedBls IS
257     SELECT tmp.resource_assignment_id
258           ,rl.alias resource_name
259           ,tmp.txn_currency_code
260     FROM  pa_fp_spread_calc_tmp tmp
261          ,pa_resource_assignments ra
262          ,pa_resource_list_members rl
263     WHERE tmp.budget_version_id = p_budget_version_id
264     AND   ra.resource_assignment_id = tmp.resource_assignment_id
265     AND   rl.resource_list_member_id = ra.resource_list_member_id
266     AND EXISTS (SELECT NULL
267             FROM pa_budget_lines bl
268                 WHERE  bl.resource_assignment_id = tmp.resource_assignment_id
269             AND  bl.txn_currency_code = tmp.txn_currency_code
270             /* Bug fix: 4294902 :Check zero quantity only for the open periods */
271                 AND   NVL(g_etc_start_date,bl.start_date) BETWEEN bl.start_date and bl.end_date
272                 AND  ((NVL(bl.quantity,0)       = 0
273                   AND (NVL(bl.txn_raw_cost,0)   <> 0
274                 OR NVL(bl.txn_burdened_cost,0)<> 0
275                 OR NVL(bl.txn_revenue,0)    <> 0
276                 OR NVL(bl.init_quantity,0)  <> 0 )
277               )
278             OR
279                     (NVL(bl.init_quantity,0)    = 0
280                          AND (NVL(bl.txn_init_raw_cost,0)   <> 0
281                              OR NVL(bl.txn_init_burdened_cost,0) <> 0
282                              OR NVL(bl.txn_init_revenue,0)  <> 0)
283                         ))
284          );
285 
286     /* This cursor picks all the resource assignments where budget line end date is less than start date */
287     /* Bug fix:4440255 changes will provide the following xplain plan
288      * EXPLAIN PLAN IS:
289      * ================
290      *1:SELECT STATEMENT   :(cost=22,rows=1)
291      * 2:NESTED LOOPS   :(cost=22,rows=1)
292          *  3:NESTED LOOPS   :(cost=21,rows=1)
293          *   4:HASH JOIN SEMI  :(cost=20,rows=1)
294          *    5:TABLE ACCESS BY INDEX ROWID PA_FP_SPREAD_CALC_TMP :(cost=6,rows=82)
295          *      6:INDEX RANGE SCAN PA_FP_SPREAD_CALC_TMP_N2 :(cost=2,rows=33)
296          *    5:TABLE ACCESS BY INDEX ROWID PA_BUDGET_LINES :(cost=13,rows=8)
297          *      6:INDEX RANGE SCAN PA_BUDGET_LINES_N3 :(cost=2,rows=1)
298          *   4:TABLE ACCESS BY INDEX ROWID PA_RESOURCE_ASSIGNMENTS :(cost=1,rows=1)
299          *    5:INDEX UNIQUE SCAN PA_RESOURCE_ASSIGNMENTS_U1 :(cost=,rows=1)
300          *  3:TABLE ACCESS BY INDEX ROWID PA_RESOURCE_LIST_MEMBERS :(cost=1,rows=1)
301          *   4:INDEX UNIQUE SCAN PA_RESOURCE_LIST_MEMBERS_U1 :(cost=,rows=1)
302      **/
303     CURSOR cur_blDatesCheck IS
304     SELECT tmp.resource_assignment_id
305               ,rl.alias resource_name
306           ,tmp.txn_currency_code
307         FROM  pa_fp_spread_calc_tmp tmp
308              ,pa_resource_assignments ra
309              ,pa_resource_list_members rl
310         WHERE tmp.budget_version_id = p_budget_version_id
311         AND   ra.resource_assignment_id = tmp.resource_assignment_id
312         AND   rl.resource_list_member_id = ra.resource_list_member_id
313         AND EXISTS (SELECT /*+ NO_UNNEST INDEX (BL,PA_BUDGET_LINES_U1) */ NULL  -- Bug#4728472
314                     FROM pa_budget_lines bl
315                     WHERE  bl.resource_assignment_id = tmp.resource_assignment_id
316                     AND  bl.txn_currency_code = tmp.txn_currency_code
317             AND  bl.end_date < bl.start_date
318             /* Bug:4440255 : added the following conditions reduces the FTS on pa_budget_lines and cost will reduce from 50 to 22 */
319             AND bl.budget_version_id = tmp.budget_version_id
320             /* end of bug fix:4440255 */
321            );
322 BEGIN
323 
324     x_return_status := 'S';
325     If P_PA_DEBUG_MODE = 'Y' Then
326     	print_msg('Entered Check_ZeroQty_Bls API');
327     End If;
328     /* cache the period details info */
329         perdRec := NULL;
330         OPEN periodDetails(p_budget_version_id);
331         FETCH periodDetails INTO perdRec;
332         CLOSE periodDetails;
333 
334     /* Bug fix: 4296019: As discussed with Ramesh, Mani ,Sakthi and sanjay, removing this check as a short term solution
335          * This corruption needs to be avoided, otherwise data corruption will be carried forward
336     --print_msg('Check for Quantity corruption');
337     FOR i IN  cur_CorruptedBls LOOP
338                 x_return_status := 'E';
339         PA_UTILS.ADD_MESSAGE
340                  (p_app_short_name => 'PA'
341                  ,p_msg_name       => 'PA_FP_ZERO_QTY_BL_CORRUPTED'
342                  ,p_token1         => 'BUDGET_VERSION_NAME'
343                  ,p_value1         =>  g_budget_version_name
344                  ,p_token2         => 'RESOURCE_NAME'
345                  ,p_value2         => i.resource_name
346                  ,p_token3         => 'RESOURCE_ASSIGNMENT'
347                  ,p_value3         => i.resource_assignment_id
348          ,p_token4         => 'TXN_CURRENCY_CODE'
349          ,p_value4         => i.txn_currency_code
350          ,p_token5         => 'Error Message'
351          ,p_value5         => 'Budget Lines Corrupted: Lines with zero/Null quantity exists'
352                  );
353     END LOOP;
354     * End of bug fix: 4296019 **/
355 
356     IF P_PA_DEBUG_MODE = 'Y' Then
357     print_msg('Check for Dates corruption');
358     End If;
359     FOR i IN  cur_blDatesCheck LOOP
360                 x_return_status := 'E';
361                 PA_UTILS.ADD_MESSAGE
362                  (p_app_short_name => 'PA'
363                  ,p_msg_name       => 'PA_FP_BL_DATES_CORRUPTED'
364                  ,p_token1         => 'BUDGET_VERSION_NAME'
365                  ,p_value1         =>  g_budget_version_name
366                  ,p_token2         => 'RESOURCE_NAME'
367                  ,p_value2         => i.resource_name
368                  ,p_token3         => 'RESOURCE_ASSIGNMENT'
369                  ,p_value3         => i.resource_assignment_id
370          ,p_token4         => 'TXN_CURRENCY_CODE'
371                  ,p_value4         => i.txn_currency_code
372                  ,p_token5         => 'Error Message'
373                  ,p_value5         => 'Budget Lines Corrupted: End date is prior to start date'
374                  );
375         END LOOP;
376 
377 EXCEPTION
378         WHEN OTHERS THEN
379                 x_return_status := 'U';
380                 print_msg('Failed in Check_ZeroQty_ActualBlsAPI'||sqlcode||sqlerrm);
381                  fnd_msg_pub.add_exc_msg
382                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
383                  ,p_procedure_name => 'Check_ZeroQty_Bls');
384                 RAISE;
385 END Check_ZeroQty_Bls;
386 
387 /* Bug fix:5309529: This is new API created to pre-process the IN params
388  * table. This avoids additional loop through plsql arrays just to extend the plsql table
389  * Logic:
390  * if param passes value is fnd_api.g_miss_num then user intentionally entered null value from UI or AMG
391  * so null out the param.  if param value passed is null or param is not passed at all,
392  * then copy the db value from budget lines to the param so that user has made no change.
393  * if param value is passed, then retain the param value.
394  */
395 PROCEDURE pre_process_param_values
396 	(p_budget_version_id 		IN NUMBER
397 	,p_resource_assignment		IN NUMBER
398 	,p_txn_currency_code		IN VARCHAR2
399 	,p_txn_currency_override	IN VARCHAR2
400 	,p_bdgt_line_sDate		IN DATE
401 	,p_bdgt_line_eDate		IN DATE
402 	,p_delete_bl_flag               IN VARCHAR2
403 	,p_Qty_miss_num_flag		IN VARCHAR2
404 	,p_bl_quantity			IN NUMBER
405 	,p_bl_init_quantity		IN NUMBER
406 	,x_total_quantity		IN OUT NOCOPY NUMBER
407 	,p_Rw_miss_num_flag		IN VARCHAR2
408 	,p_bl_txn_raw_cost		IN NUMBER
409 	,p_bl_txn_init_raw_cost		IN NUMBER
410 	,x_total_raw_cost		IN OUT NOCOPY NUMBER
411 	,p_Br_miss_num_flag		IN VARCHAR2
412 	,p_bl_txn_burdened_cost		IN NUMBER
413 	,p_bl_txn_init_burdened_cost	IN NUMBER
414 	,x_total_burdened_cost		IN OUT NOCOPY NUMBER
415 	,p_Rv_miss_num_flag		IN VARCHAR2
416 	,p_bl_txn_revenue		IN NUMBER
417 	,p_bl_txn_init_revenue		IN NUMBER
418 	,x_total_revenue		IN OUT NOCOPY NUMBER
419 	,p_cost_rt_miss_num_flag	IN VARCHAR2
420 	,p_bl_etc_cost_rate		IN NUMBER
421 	,p_bl_etc_cost_rate_override	IN NUMBER
422 	,x_raw_cost_rate		IN OUT NOCOPY NUMBER
423 	,x_rw_cost_rate_override	IN OUT NOCOPY NUMBER
424 	,p_burd_rt_miss_num_flag	IN VARCHAR2
425 	,p_bl_etc_burden_rate		IN NUMBER
426 	,p_bl_etc_burden_rate_override	IN NUMBER
427 	,x_b_cost_rate			IN OUT NOCOPY NUMBER
428 	,x_b_cost_rate_override		IN OUT NOCOPY NUMBER
429 	,p_bill_rt_miss_num_flag	IN VARCHAR2
430 	,p_bl_etc_bill_rate		IN NUMBER
431 	,p_bl_etc_bill_rate_override	IN NUMBER
432 	,x_bill_rate			IN OUT NOCOPY NUMBER
433 	,x_bill_rate_override		IN OUT NOCOPY NUMBER
434 	,x_return_status		OUT NOCOPY VARCHAR2
435 	) IS
436 
437 	l_message_name		varchar2(100);
438 	l_invalid_exception	EXCEPTION;
439 BEGIN
440 
441 	x_return_status := 'S';
442         IF p_resource_assignment is NULL OR p_txn_currency_code is NULL Then
443         	--print_msg(to_char(l_stage)||' ERROR Resource assignment or currency NOT passed');
444         	pa_utils.add_message
445         	( p_app_short_name => 'PA',
446         	p_msg_name       => 'PA_FP_CALC_RA_BL_REQ',
447         	p_token1         => 'BUDGET_VERSION_ID',
448         	p_value1         =>  p_budget_version_id,
449         	p_token2         => 'PROJECT_ID',
450         	p_value2         =>  g_project_id);
451         	x_return_status := 'E';
452 		Raise l_invalid_exception;
453         END IF;
454 
455         IF  g_source_context  = 'BUDGET_LINE' THEN
456         	IF p_bdgt_line_sDate is NULL OR p_bdgt_line_eDate is NULL Then
457         	pa_utils.add_message
458         	( p_app_short_name => 'PA'
459         	,p_msg_name       => 'PA_FP_CALC_BL_DATES_REQ'
460         	,p_token1         => 'BUDGET_VERSION_ID'
461         	,p_value1         =>  p_budget_version_id
462         	,p_token2         => 'PROJECT_ID'
463         	,p_value2         =>  g_project_id
464         	,p_token3         =>  'RESOURCE_ASSIGNMENT'
465         	,p_value3         =>  p_resource_assignment
466         	,p_token4         =>  'TXN_CURRENCY'
467         	,p_value4         =>  p_txn_currency_code
468         	);
469         	x_return_status := 'E';
470 		Raise l_invalid_exception;
471         	END IF;
472         END IF;
473 
474 	/* Start of Bug fix:5726773: printing all input parameters  */
475  	         If p_pa_debug_mode = 'Y' Then
476 
477  	             print_msg('p_resource_assignment          => '||p_resource_assignment        );
478  	             print_msg('p_txn_currency_code            => '||p_txn_currency_code );
479  	             print_msg('p_txn_currency_override        => '||p_txn_currency_override     );
480  	             print_msg('p_bdgt_line_sDate              => '||p_bdgt_line_sDate   );
481  	             print_msg('p_bdgt_line_eDate              => '||p_bdgt_line_eDate   );
482  	             print_msg('p_delete_bl_flag               => '||p_delete_bl_flag    );
483  	             print_msg('p_Qty_miss_num_flag            => '||p_Qty_miss_num_flag );
484  	             print_msg('p_bl_quantity                  => '||p_bl_quantity       );
485  	             print_msg('p_bl_init_quantity             => '||p_bl_init_quantity  );
486  	             print_msg('x_total_quantity               => '||x_total_quantity    );
487  	             print_msg('p_Rw_miss_num_flag             => '||p_Rw_miss_num_flag  );
488  	             print_msg('p_bl_txn_raw_cost              => '||p_bl_txn_raw_cost   );
489  	             print_msg('p_bl_txn_init_raw_cost         => '||p_bl_txn_init_raw_cost      );
490  	             print_msg('x_total_raw_cost               => '||x_total_raw_cost    );
491  	             print_msg('p_Br_miss_num_flag             => '||p_Br_miss_num_flag  );
492  	             print_msg('p_bl_txn_burdened_cost         => '||p_bl_txn_burdened_cost      );
493  	             print_msg('p_bl_txn_init_burdened_cost    => '||p_bl_txn_init_burdened_cost );
494  	             print_msg('x_total_burdened_cost          => '||x_total_burdened_cost       );
495  	             print_msg('p_Rv_miss_num_flag             => '||p_Rv_miss_num_flag  );
496  	             print_msg('p_bl_txn_revenue               => '||p_bl_txn_revenue    );
497  	             print_msg('p_bl_txn_init_revenue          => '||p_bl_txn_init_revenue       );
498  	             print_msg('x_total_revenue                => '||x_total_revenue     );
499  	             print_msg('p_cost_rt_miss_num_flag        => '||p_cost_rt_miss_num_flag     );
500  	             print_msg('p_bl_etc_cost_rate             => '||p_bl_etc_cost_rate  );
501  	             print_msg('p_bl_etc_cost_rate_override    => '||p_bl_etc_cost_rate_override );
502  	             print_msg('x_raw_cost_rate                => '||x_raw_cost_rate     );
503  	             print_msg('x_rw_cost_rate_override        => '||x_rw_cost_rate_override     );
504  	             print_msg('p_burd_rt_miss_num_flag        => '||p_burd_rt_miss_num_flag     );
505  	             print_msg('p_bl_etc_burden_rate           => '||p_bl_etc_burden_rate        );
506  	             print_msg('p_bl_etc_burden_rate_override  => '||p_bl_etc_burden_rate_override       );
507  	             print_msg('x_b_cost_rate                  => '||x_b_cost_rate       );
508  	             print_msg('x_b_cost_rate_override         => '||x_b_cost_rate_override      );
509  	             print_msg('p_bill_rt_miss_num_flag        => '||p_bill_rt_miss_num_flag     );
510  	             print_msg('p_bl_etc_bill_rate             => '||p_bl_etc_bill_rate  );
511  	             print_msg('p_bl_etc_bill_rate_override    => '||p_bl_etc_bill_rate_override );
512  	             print_msg('x_bill_rate                    => '||x_bill_rate );
513  	             print_msg('x_bill_rate_override               => '||x_bill_rate_override        );
514 
515  	          End If;
516  	/* End of Bug fix:5726773 */
517 
518         /* Now open up the budget line cursor and follow the logic
519          * if param passes value is fnd_api.g_miss_num then user purposely entered null value from UI or AMG
520          * so null out the param.  if param passed value is null, the copy the value from budget lines
521 	 * so that no change is made from top if param passed value is not null, then retain the param value.
522         */
523 
524 	/* start of quantity param processing */
525         IF NVL(p_Qty_miss_num_flag,'N') = 'Y' Then
526         	x_total_quantity := NULL;
527         Elsif x_total_quantity is NULL Then
528            	IF g_calling_module <> 'FORECAST_GENERATION' Then  /* Bug fix:4211776 */
529                 	x_total_quantity := p_bl_quantity;
530 	   	Else
531 			x_total_quantity := nvl(x_total_quantity,0) + NVL(p_bl_init_quantity,0);
532            	End If;
533 	Else
534 	   	IF g_calling_module <> 'FORECAST_GENERATION' Then  /* Bug fix:4211776 */
535                 	NULL; -- retain parameter value
536            	Else
537                 	x_total_quantity := nvl(x_total_quantity,0) + NVL(p_bl_init_quantity,0);
538            	End If;
539 	End If;
540 
541 	/* start of raw cost param processing */
542 	IF NVL(p_Rw_miss_num_flag,'N') = 'Y' Then
543                   x_total_raw_cost := 0;
544         Elsif x_total_raw_cost is NULL Then
545         	If p_txn_currency_override is NULL Then
546         	   IF g_calling_module <> 'FORECAST_GENERATION' Then /* Bug fix:4211776 */
547         		x_total_raw_cost := p_bl_txn_raw_cost;
548 		   Else
549 			x_total_raw_cost := NVL(x_total_raw_cost,0) + nvl(p_bl_txn_init_raw_cost,0);
550 		   End If;
551         	END IF;
552 	Else
553 		If p_txn_currency_override is NULL Then
554                    IF g_calling_module <> 'FORECAST_GENERATION' Then /* Bug fix:4211776 */
555                         NULL;  -- retain the param value
556                    Else
557                         x_total_raw_cost := NVL(x_total_raw_cost,0) + nvl(p_bl_txn_init_raw_cost,0);
558                    End If;
559                 END IF;
560         End If;
561 
562 	/* start of burden cost param processing */
563         IF NVL(p_Br_miss_num_flag,'N') = 'Y' Then
564             x_total_burdened_cost := 0;
565         Elsif x_total_burdened_cost is NULL Then
566         	If p_txn_currency_override is NULL  Then
567         	   IF g_calling_module <> 'FORECAST_GENERATION' Then /* Bug fix:4211776 */
568         		x_total_burdened_cost := p_bl_txn_burdened_cost;
569 		   Else
570 			x_total_burdened_cost := NVL(x_total_burdened_cost,0)+NVL(p_bl_txn_init_burdened_cost,0);
571 		   End If;
572         	End If;
573 	Else
574         	If p_txn_currency_override is NULL  Then
575                    IF g_calling_module <> 'FORECAST_GENERATION' Then /* Bug fix:4211776 */
576                         NULL; -- retain the param value
577                    Else
578                         x_total_burdened_cost := NVL(x_total_burdened_cost,0)+NVL(p_bl_txn_init_burdened_cost,0);
579                    End If;
580         	End If;
581 	End If;
582 
583 	/* start of revenue param processing */
584         IF NVL(p_Rv_miss_num_flag,'N') = 'Y' Then
585         	x_total_revenue := 0;
586         Elsif x_total_revenue is NULL Then
587         	If p_txn_currency_override is NULL Then
588         	   IF g_calling_module <> 'FORECAST_GENERATION' Then /* Bug fix:4211776 */
589         		x_total_revenue := p_bl_txn_revenue;
590 		   Else
591 			x_total_revenue := NVL(x_total_revenue,0)+NVL(p_bl_txn_init_revenue,0);
592         	   End If;
593         	End If;
594 	Else
595                 If p_txn_currency_override is NULL Then
596                    IF g_calling_module <> 'FORECAST_GENERATION' Then /* Bug fix:4211776 */
597                         NULL; --retain param value
598                    Else
599                         x_total_revenue := NVL(x_total_revenue,0)+NVL(p_bl_txn_init_revenue,0);
600                    End If;
601                 End If;
602         End If;
603 
604 	/* start of cost rate param processing */
605 	IF NVL(p_cost_rt_miss_num_flag,'N') = 'Y' Then
606 		x_raw_cost_rate := NULL;
607 	Elsif x_raw_cost_rate is NULL Then
608 		If p_txn_currency_override is NULL Then
609         	  IF g_calling_module <> 'FORECAST_GENERATION' Then /* Bug fix:4211776 */
610         	    /* Bug fix:4232221 x_raw_cost_rate := NVL(blrec.etc_cost_rate,blrec.txn_standard_cost_rate); */
611         	    x_raw_cost_rate := p_bl_etc_cost_rate;
612         	  End If;
613         	Elsif (p_txn_currency_override is NOT NULL ) Then
614         	--print_msg('Cost rate is passed but override cur exists so null out this and keep override cost rate');
615         	    x_raw_cost_rate := NULL;
616         	End IF;
617 	Else
618                 If p_txn_currency_override is NULL Then
619                     NULL; -- retain param value
620                 Elsif (p_txn_currency_override is NOT NULL ) Then
621                 --print_msg('Cost rate is passed but override cur exists so null out this and keep override cost rate');
622                     x_raw_cost_rate := NULL;
623                 End IF;
624 	End If;
625 
626 	/* start of cost rate override param processing */
627 	IF NVL(p_cost_rt_miss_num_flag,'N') = 'Y' Then
628                 x_rw_cost_rate_override := NULL;
629         Elsif x_rw_cost_rate_override is NULL Then
630 		x_rw_cost_rate_override := NULL;
631 	Else
632 		NULL; -- retain param value
633         End IF;
634 
635 	/* start of burden rate param processing */
636 	If NVL(p_burd_rt_miss_num_flag,'N') = 'Y' Then
637                 x_b_cost_rate := NULL;
638         Elsif x_b_cost_rate is NULL Then
639         	If p_txn_currency_override is NULL Then
640         	   IF g_calling_module <> 'FORECAST_GENERATION' Then /* Bug fix:4211776 */
641         	   /* Bug fix:4232221 x_b_cost_rate := NVL(blrec.etc_burden_rate,blrec.burden_cost_rate); */
642         		x_b_cost_rate :=  p_bl_etc_burden_rate;
643         	   End If;
644 		Elsif (p_txn_currency_override is NOT NULL ) Then
645 			x_b_cost_rate := NULL;
646         	End If;
647 	Else
648 		If p_txn_currency_override is NULL Then
649 			NULL; -- retain param value
650         	ElsIf (p_txn_currency_override is NOT NULL ) Then
651         		print_msg('Burd Cost rate is passed but override cur exists so null out this rate');
652 			x_b_cost_rate := NULL;
653 		End If;
654 	End If;
655 
656 	/* start of burden rate override param processing */
657 	If NVL(p_burd_rt_miss_num_flag,'N') = 'Y' Then
658             	x_b_cost_rate_override := NULL;
659         Elsif x_b_cost_rate_override is NULL Then
660 		x_b_cost_rate_override := NULL;
661 	Else
662 		NULL; -- retain the param value
663         End If;
664 
665 	/* start of bill rate param processing */
666 	IF NVL(p_bill_rt_miss_num_flag,'N') = 'Y' Then
667                	x_bill_rate := NULL;
668 
669        	Elsif x_bill_rate is NULL Then
670        		If p_txn_currency_override is NULL Then
671        		  IF g_calling_module <> 'FORECAST_GENERATION' Then /* Bug fix:4211776 */
672        		   /* Bug fix:4232221 x_bill_rate := NVL(blrec.etc_bill_rate,blrec.txn_standard_bill_rate);*/
673        			x_bill_rate := p_bl_etc_bill_rate;
674        		  End If;
675        		Elsif (p_txn_currency_override is NOT NULL ) Then
676        		  	print_msg('Bill rate is passed but override cur exists so null out this rate');
677        			x_bill_rate := NULL;
678 		End If;
679 	Else
680 		If p_txn_currency_override is NULL Then
681 			NULL; --retain param value
682 		Elsif (p_txn_currency_override is NOT NULL ) Then
683 			x_bill_rate := NULL;
684 		End If;
685 	End If;
686 
687 
688 	/* start of bill rate override param processing */
689 	IF NVL(p_bill_rt_miss_num_flag,'N') = 'Y' Then
690             	x_bill_rate_override := NULL;
691 	Elsif x_bill_rate_override is NULL Then
692 		x_bill_rate_override := NULL;
693 	Else
694 		NULL; -- retain the param value
695         End IF;
696 
697      	/* BUG FIX:4211776 FORECAST GENERATION PROCESS CREATEs BUDGET LINES WITH ACTUALS = PLAN
698 	*PRIOR TO ETC START DATE. Then PASSES ETC VALUES to CALC API
699 	*(but calc api ALWAYS EXPECTS PLAN QTY/AMOUNTS FROM ALL FLOWS).
700 	*IN ORDER TO ACCOMODATE THE FORECAST GENERATION FLOW, ADD BACK THE ACTUAL FROM BL TO PARAM VALUES TO
701 	*ARRIVE AT THE PLAN QTY / AMOUNTS
702 	*/
703         IF g_calling_module = 'FORECAST_GENERATION' Then
704 		If x_total_quantity = 0 then x_total_quantity := NULL; End if;
705 		If x_total_raw_cost = 0 then x_total_raw_cost := NULL; end if;
706 		If x_total_burdened_cost = 0 then x_total_burdened_cost := NULL; end if;
707 		If x_total_revenue = 0 then x_total_revenue := NULL; end if;
708         END IF;
709 
710       	/* Bug fix:4343985 : Logic:
711        	* 1.Always ensure that etc qty is +ve or zero
712        	* 2.Plan quantity must be > or = Actual quantity
713        	* 3.Plan quantity should not be zero when acutals exists
714        	*/
715        	/* Bug fix:5726773: The following condition is removed for enhancement support
716 	 * negative quantity spread
717 	 * IF NVL(p_delete_bl_flag,'N') <> 'Y' Then --{
718 	 * END IF; --}
719 	 *****End of bug fix:5726773 */
720 	--print_msg('End of  pre_process_param_values API');
721 EXCEPTION
722 	WHEN l_invalid_exception Then
723 		print_msg('exception occured inpre_process_param_values['||sqlcode||sqlerrm);
724                 x_return_status := 'E';
725 
726 	WHEN OTHERS THEN
727 		print_msg('exception occured inpre_process_param_values['||sqlcode||sqlerrm);
728 		x_return_status := 'E';
729 		Raise;
730 END pre_process_param_values;
731 
732 /* Bug fix:5309529: This API extends the IN param araays and bulk inserts into spread calc tmp
733  * table. This avoids looping through plsql arrays just to extend the plsql table
734  * Did performance test on pjperf instance. if the number of records in plsql table increases
735  * the time gain is almost half of the original time.
736  * Example:
737  * Num#RAs      Old Code     New Code
738  * --------------------------------------
739  *  1698        1.52 sec     1.01 sec
740  *  8574       13.23 sec     9.25 sec
741  *  10206      15.69 sec    10.99 sec
742  */
743 PROCEDURE insert_calcTmp_records
744 	  ( x_resource_assignment_tab       IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
745                 ,x_delete_budget_lines_tab       IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
746                 ,x_spread_amts_flag_tab          IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
747                 ,x_txn_currency_code_tab         IN  OUT NOCOPY SYSTEM.pa_varchar2_15_tbl_type
748                 ,x_txn_currency_override_tab     IN  OUT NOCOPY SYSTEM.pa_varchar2_15_tbl_type
749                 ,x_total_qty_tab                 IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
750                 ,x_addl_qty_tab                  IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
751                 ,x_total_raw_cost_tab            IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
752                 ,x_addl_raw_cost_tab             IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
753                 ,x_total_burdened_cost_tab       IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
754                 ,x_addl_burdened_cost_tab        IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
755                 ,x_total_revenue_tab             IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
756                 ,x_addl_revenue_tab              IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
757                 ,x_raw_cost_rate_tab             IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
758                 ,x_rw_cost_rate_override_tab     IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
759                 ,x_b_cost_rate_tab               IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
760                 ,x_b_cost_rate_override_tab      IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
761                 ,x_bill_rate_tab                 IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
762                 ,x_bill_rate_override_tab        IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
763                 ,x_line_start_date_tab           IN  OUT NOCOPY SYSTEM.pa_date_tbl_type
764                 ,x_line_end_date_tab             IN  OUT NOCOPY SYSTEM.pa_date_tbl_type
765                 ,x_apply_progress_flag_tab       IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
766                 ,x_spread_curve_id_old_tab       IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
767                 ,x_spread_curve_id_new_tab       IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
768                 ,x_sp_fixed_date_old_tab         IN  OUT NOCOPY SYSTEM.pa_date_tbl_type
769                 ,x_sp_fixed_date_new_tab         IN  OUT NOCOPY SYSTEM.pa_date_tbl_type
770                 ,x_plan_start_date_old_tab       IN  OUT NOCOPY SYSTEM.pa_date_tbl_type
771                 ,x_plan_start_date_new_tab       IN  OUT NOCOPY SYSTEM.pa_date_tbl_type
772                 ,x_plan_end_date_old_tab         IN  OUT NOCOPY SYSTEM.pa_date_tbl_type
773 		,x_plan_end_date_new_tab         IN  OUT NOCOPY SYSTEM.pa_date_tbl_type
774                 ,x_re_spread_flag_tab            IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
775                 ,x_sp_curve_change_flag_tab      IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
776                 ,x_plan_dates_change_flag_tab    IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
777                 ,x_spfix_date_flag_tab           IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
778                 ,x_mfc_cost_change_flag_tab      IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
779                 ,x_mfc_cost_type_id_old_tab      IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
780                 ,x_mfc_cost_type_id_new_tab      IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
781         	,x_rlm_id_change_flag_tab        IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
782         	,x_plan_sdate_shrunk_flag_tab    IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
783                 ,x_plan_edate_shrunk_flag_tab    IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
784                 ,x_mfc_cost_refresh_flag_tab     IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
785         	,x_ra_in_multi_cur_flag_tab      IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
786         	,x_quantity_changed_flag_tab     IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
787                 ,x_raw_cost_changed_flag_tab     IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
788                 ,x_cost_rate_changed_flag_tab    IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
789                 ,x_burden_cost_changed_flag_tab  IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
790                 ,x_burden_rate_changed_flag_tab  IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
791                 ,x_rev_changed_flag_tab          IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
792                 ,x_bill_rate_changed_flag_tab    IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
793                 ,x_multcur_plan_start_date_tab   IN  OUT NOCOPY SYSTEM.pa_date_tbl_type
794                 ,x_multcur_plan_end_date_tab     IN  OUT NOCOPY SYSTEM.pa_date_tbl_type
795                 ,x_fp_task_billable_flag_tab     IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
796                 ,x_cost_rt_miss_num_flag_tab     IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
797                 ,x_burd_rt_miss_num_flag_tab     IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
798                 ,x_bill_rt_miss_num_flag_tab     IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
799                 ,x_Qty_miss_num_flag_tab         IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
800                 ,x_Rw_miss_num_flag_tab          IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
801                 ,x_Br_miss_num_flag_tab          IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
802                 ,x_Rv_miss_num_flag_tab          IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
803                 ,x_rev_only_entry_flag_tab       IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
804                 ,x_return_status                 OUT NOCOPY VARCHAR2
805                 ,x_msg_data                      OUT NOCOPY varchar2
806                 ) IS
807 
808 	CURSOR cur_validate IS
809 	SELECT tmp.resource_assignment_id
810 		,tmp.txn_currency_code
811 		,tmp.start_date
812 	FROM pa_fp_spread_calc_tmp tmp
813 	WHERE tmp.budget_version_id = g_budget_version_id
814 	AND   (tmp.start_date is NULL OR tmp.end_date is NULL);
815 
816 	l_miss_num 	Number := fnd_api.g_miss_num;
817 	l_miss_char	Varchar2(1000) := fnd_api.g_miss_char;
818 	l_miss_date     Date := fnd_api.g_miss_date;
819 	l_numRows       Integer;
820 
821 
822 BEGIN
823 	x_return_status := 'S';
824 	x_msg_data := NULL;
825 	l_numRows := x_resource_assignment_tab.count;
826 	If l_numRows > 0 Then --{
827 		 --extend the tables where plsql tabs are not passed
828 	   	If x_delete_budget_lines_tab.count = 0 Then
829 			x_delete_budget_lines_tab.extend(l_numRows);
830 		End If;
831                 If x_spread_amts_flag_tab.count = 0 Then
832 			x_spread_amts_flag_tab.extend(l_numRows);
833                 End If;
834                 If x_txn_currency_code_tab.count = 0 Then
835 			x_txn_currency_code_tab.extend(l_numRows);
836                 End If;
837                 If x_txn_currency_override_tab.count = 0 Then
838 			x_txn_currency_override_tab.extend(l_numRows);
839                 End If;
840                 If x_total_qty_tab.count = 0 Then
841 			x_total_qty_tab.extend(l_numRows);
842                 End If;
843                 If x_addl_qty_tab.count = 0 Then
844 			x_addl_qty_tab.extend(l_numRows);
845                 End If;
846                 If x_total_raw_cost_tab.count = 0 Then
847 			x_total_raw_cost_tab.extend(l_numRows);
848                 End If;
849                 If x_addl_raw_cost_tab.count = 0 Then
850 			x_addl_raw_cost_tab.extend(l_numRows);
851                 End If;
852                 If x_total_burdened_cost_tab.count = 0 Then
853 			x_total_burdened_cost_tab.extend(l_numRows);
854                 End If;
855                 If x_addl_burdened_cost_tab.count = 0 Then
856 			x_addl_burdened_cost_tab.extend(l_numRows);
857                 End If;
858                 If x_total_revenue_tab.count = 0 Then
859 			x_total_revenue_tab.extend(l_numRows);
860                 End If;
861                 If x_addl_revenue_tab.count = 0 Then
862 			x_addl_revenue_tab.extend(l_numRows);
863                 End If;
864                 If x_raw_cost_rate_tab.count = 0 Then
865 			x_raw_cost_rate_tab.extend(l_numRows);
866                 End If;
867                 If x_rw_cost_rate_override_tab.count = 0 Then
868 			x_rw_cost_rate_override_tab.extend(l_numRows);
869                 End If;
870                 If x_b_cost_rate_tab.count = 0 Then
871 			x_b_cost_rate_tab.extend(l_numRows);
872                 End If;
873                 If x_b_cost_rate_override_tab.count = 0 Then
874 			x_b_cost_rate_override_tab.extend(l_numRows);
875                 End If;
876                 If x_bill_rate_tab.count = 0 Then
877 			x_bill_rate_tab.extend(l_numRows);
878                 End If;
879                 If x_bill_rate_override_tab.count = 0 Then
880 			x_bill_rate_override_tab.extend(l_numRows);
881                 End If;
882                 If x_line_start_date_tab.count = 0 Then
883 			x_line_start_date_tab.extend(l_numRows);
884                 End If;
885                 If x_line_end_date_tab.count = 0 Then
886 			x_line_end_date_tab.extend(l_numRows);
887                 End If;
888                 If x_apply_progress_flag_tab.count = 0 Then
889 			x_apply_progress_flag_tab.extend(l_numRows);
890                 End If;
891                 If x_spread_curve_id_old_tab.count = 0 Then
892 			x_spread_curve_id_old_tab.extend(l_numRows);
893                 End If;
894                 If x_spread_curve_id_new_tab.count = 0 Then
895 			x_spread_curve_id_new_tab.extend(l_numRows);
896                 End If;
897                 If x_sp_fixed_date_old_tab.count = 0 Then
898 			x_sp_fixed_date_old_tab.extend(l_numRows);
899                 End If;
900                 If x_sp_fixed_date_new_tab.count = 0 Then
901 			x_sp_fixed_date_new_tab.extend(l_numRows);
902                 End If;
903                 If x_plan_start_date_old_tab.count = 0 Then
904 			x_plan_start_date_old_tab.extend(l_numRows);
905                 End If;
906                 If x_plan_start_date_new_tab.count = 0 Then
907 			x_plan_start_date_new_tab.extend(l_numRows);
908                 End If;
909                 If x_plan_end_date_old_tab.count = 0 Then
910 			x_plan_end_date_old_tab.extend(l_numRows);
911                 End If;
912                 If x_plan_end_date_new_tab.count = 0 Then
913 			x_plan_end_date_new_tab.extend(l_numRows);
914                 End If;
915                 If x_re_spread_flag_tab.count = 0 Then
916 			x_re_spread_flag_tab.extend(l_numRows);
917                 End If;
918                 If x_sp_curve_change_flag_tab.count = 0 Then
919 			x_sp_curve_change_flag_tab.extend(l_numRows);
920                 End If;
921                 If x_plan_dates_change_flag_tab.count = 0 Then
922 			x_plan_dates_change_flag_tab.extend(l_numRows);
923                 End If;
924                 If x_spfix_date_flag_tab.count = 0 Then
925 			x_spfix_date_flag_tab.extend(l_numRows);
926                 End If;
927 		If x_mfc_cost_change_flag_tab.count = 0 Then
928 			x_mfc_cost_change_flag_tab.extend(l_numRows);
929                 End If;
930                 If x_mfc_cost_type_id_old_tab.count = 0 Then
931 			x_mfc_cost_type_id_old_tab.extend(l_numRows);
932                 End If;
933                 If x_mfc_cost_type_id_new_tab.count = 0 Then
934 			x_mfc_cost_type_id_new_tab.extend(l_numRows);
935                 End If;
936                 If x_rlm_id_change_flag_tab.count = 0 Then
937 			x_rlm_id_change_flag_tab.extend(l_numRows);
938                 End If;
939                 If x_fp_task_billable_flag_tab.count = 0 Then
940 			x_fp_task_billable_flag_tab.extend(l_numRows);
941                 End If;
942                 If x_cost_rt_miss_num_flag_tab.count = 0 Then
943 			x_cost_rt_miss_num_flag_tab.extend(l_numRows);
944                 End If;
945                 If x_burd_rt_miss_num_flag_tab.count = 0 Then
946 			x_burd_rt_miss_num_flag_tab.extend(l_numRows);
947                 End If;
948                 If x_bill_rt_miss_num_flag_tab.count = 0 Then
949 			x_bill_rt_miss_num_flag_tab.extend(l_numRows);
950                 End If;
951                 If x_Qty_miss_num_flag_tab.count = 0 Then
952 			x_Qty_miss_num_flag_tab.extend(l_numRows);
953                 End If;
954                 If x_Rw_miss_num_flag_tab.count = 0 Then
955 			x_Rw_miss_num_flag_tab.extend(l_numRows);
956                 End If;
957                 If x_Br_miss_num_flag_tab.count = 0 Then
958 			x_Br_miss_num_flag_tab.extend(l_numRows);
959                 End If;
960                 If x_Rv_miss_num_flag_tab.count = 0 Then
961 			x_Rv_miss_num_flag_tab.extend(l_numRows);
962                 End If;
963 	   If p_pa_debug_mode = 'Y' Then
964 	   print_msg(' Inserting records into spread calc tmp table');
965 	   End If;
966            FORALL i IN x_resource_assignment_tab.FIRST .. x_resource_assignment_tab.LAST
967                 INSERT INTO pa_fp_spread_calc_tmp
968                         (RESOURCE_ASSIGNMENT_ID --resource_assignment_id
969                          ,DELETE_BL_FLAG          --delete_budget_lines_flag
970                          ,SPREAD_AMTS_FLAG      --spread_amts_flag
971                          ,TXN_CURRENCY_CODE     --txn_currency_code
972                          ,TXN_CURR_CODE_OVERRIDE --txn_currency_override
973                          ,QUANTITY              --total_qty
974                          ,SYSTEM_REFERENCE_NUM1 --addl_qty
975                          ,TXN_RAW_COST          --total_raw_cost
976                          ,SYSTEM_REFERENCE_NUM2 --addl_raw_cost
977                          ,TXN_BURDENED_COST     --total_burdened_cost
978                          ,SYSTEM_REFERENCE_NUM3 --addl_burdened_cost
979                          ,TXN_REVENUE           --total_revenue
980                          ,SYSTEM_REFERENCE_NUM4 --addl_revenue
981                          ,COST_RATE             --raw_cost_rate
982                          ,COST_RATE_OVERRIDE    --rw_cost_rate_override
983                          ,BURDEN_COST_RATE      --b_cost_rate
984                          ,BURDEN_COST_RATE_OVERRIDE --b_cost_rate_override
985                          ,BILL_RATE             --bill_rate
986                          ,BILL_RATE_OVERRIDE    --bill_rate_override
987                          ,START_DATE            --line_start_date
988                          ,END_DATE              --line_end_date
989                          ,APPLY_PROGRESS_FLAG   --apply_progress_flag
990                          ,BUDGET_VERSION_ID     --budget_version_id
991                          ,OLD_SPREAD_CURVE_ID   --x_spread_curve_id_old_tab
992                          ,NEW_SPREAD_CURVE_ID   --x_spread_curve_id_new_tab
993                          ,OLD_SP_FIX_DATE       --x_sp_fixed_date_old_tab
994                          ,NEW_SP_FIX_DATE       --x_sp_fixed_date_new_tab
995                          ,OLD_PLAN_START_DATE   --x_plan_start_date_old_tab
996                          ,NEW_PLAN_START_DATE   --x_plan_start_date_new_tab
997                          ,OLD_PLAN_END_DATE     --x_plan_end_date_old_tab
998                          ,NEW_PLAN_END_DATE     --x_plan_end_date_new_tab
999                          ,RE_SPREAD_AMTS_FLAG   --x_re_spread_flag_tab
1000                          ,SP_CURVE_CHANGE_FLAG  --x_sp_curve_change_flag_tab
1001                          ,PLAN_DATES_CHANGE_FLAG --x_plan_dates_change_flag_tab
1002                          ,SP_FIX_DATE_CHANGE_FLAG --x_spfix_date_flag_tab
1003                          ,MFC_COST_CHANGE_FLAG   --x_mfc_cost_change_flag_tab
1004                          ,OLD_MFC_COST_TYPE_ID   --x_mfc_cost_type_id_old_tab
1005                          ,NEW_MFC_COST_TYPE_ID   --x_mfc_cost_type_id_new_tab
1006              		 ,ETC_START_DATE
1007              		,PROJECT_CURRENCY_CODE
1008              		,PROJFUNC_CURRENCY_CODE
1009              		,RLM_ID_CHANGE_FLAG
1010              		,BUDGET_VERSION_TYPE
1011             		,BILLABLE_FLAG
1012 			,COST_RATE_G_MISS_NUM_FLAG
1013 			,BURDEN_RATE_G_MISS_NUM_FLAG
1014 			,BILL_RATE_G_MISS_NUM_FLAG
1015 			,QUANTITY_G_MISS_NUM_FLAG
1016 			,RAW_COST_G_MISS_NUM_FLAG
1017 			,BURDEN_COST_G_MISS_NUM_FLAG
1018 			,REVENUE_G_MISS_NUM_FLAG
1019                         )
1020                 VALUES (
1021                         x_resource_assignment_tab(i)
1022 			,decode(NVL(g_wp_cost_changed_flag,'N'),'Y',decode(NVL(g_time_phase_changed_flag,'N'),'Y','Y')
1023                          ,decode(NVL(g_time_phase_changed_flag,'N'),'Y','Y'
1024 			  ,decode(g_source_context,'RESOURCE_ASSIGNMENT','N'
1025 			   ,decode(x_delete_budget_lines_tab(i),l_miss_char,'N',NULL,'N'
1026 			    ,x_delete_budget_lines_tab(i)))))
1027                         ,decode(NVL(g_wp_cost_changed_flag,'N'),'Y'
1028  	                  ,decode(NVL(g_time_phase_changed_flag,'N'),'Y','Y','N')
1029  	                    ,decode(NVL(g_time_phase_changed_flag,'N'),'Y','Y','N'))
1030                         ,x_txn_currency_code_tab(i)
1031                         ,decode(x_txn_currency_override_tab(i),l_miss_char,NULL
1032 			  ,NULL,NULL,x_txn_currency_code_tab(i),NULL,x_txn_currency_override_tab(i))
1033                         ,decode(x_total_qty_tab(i),l_miss_num,NULL,x_total_qty_tab(i))
1034                         ,NULL  --x_addl_qty_tab(i)
1035                         ,decode(x_total_raw_cost_tab(i),l_miss_num,0,x_total_raw_cost_tab(i))
1036                         ,NULL --x_addl_raw_cost_tab(i)
1037                         ,decode(x_total_burdened_cost_tab(i),l_miss_num,0,x_total_burdened_cost_tab(i))
1038                         ,NULL  --x_addl_burdened_cost_tab(i)
1039                         ,decode(x_total_revenue_tab(i),l_miss_num,0,x_total_revenue_tab(i))
1040                         ,NULL  --x_addl_revenue_tab(i)
1041                         ,decode(x_raw_cost_rate_tab(i),l_miss_num,NULL,x_raw_cost_rate_tab(i))
1042                         ,decode(x_rw_cost_rate_override_tab(i),l_miss_num,NULL,x_rw_cost_rate_override_tab(i))
1043                         ,decode(x_b_cost_rate_tab(i),l_miss_num,NULL,x_b_cost_rate_tab(i))
1044                         ,decode(x_b_cost_rate_override_tab(i),l_miss_num,NULL,x_b_cost_rate_override_tab(i))
1045                         ,decode(x_bill_rate_tab(i),l_miss_num,NULL,x_bill_rate_tab(i))
1046                         ,decode(x_bill_rate_override_tab(i),l_miss_num,NULL,x_bill_rate_override_tab(i))
1047                         ,decode(g_source_context,'RESOURCE_ASSIGNMENT',NULL
1048 				,decode(x_line_start_date_tab(i),l_miss_date,NULL,x_line_start_date_tab(i)))
1049                         ,decode(g_source_context,'RESOURCE_ASSIGNMENT',NULL
1050 				,decode(x_line_end_date_tab(i),l_miss_date,NULL,x_line_end_date_tab(i)))
1051                         ,NVL(g_apply_progress_flag,'N') --x_apply_progress_flag_tab(i)
1052                         ,g_budget_version_id
1053                         ,decode(x_spread_curve_id_old_tab(i),l_miss_num,NULL,x_spread_curve_id_old_tab(i))
1054                         ,decode(x_spread_curve_id_new_tab(i),l_miss_num,NULL,x_spread_curve_id_new_tab(i))
1055                         ,decode(x_sp_fixed_date_old_tab(i),l_miss_date,NULL,x_sp_fixed_date_old_tab(i))
1056                         ,decode(x_sp_fixed_date_new_tab(i),l_miss_date,NULL,x_sp_fixed_date_new_tab(i))
1057                         ,decode(x_plan_start_date_old_tab(i),l_miss_date,NULL,x_plan_start_date_old_tab(i))
1058                         ,decode(x_plan_start_date_new_tab(i),l_miss_date,NULL,x_plan_start_date_new_tab(i))
1059                         ,decode(x_plan_end_date_old_tab(i),l_miss_date,NULL,x_plan_end_date_old_tab(i))
1060                         ,decode(x_plan_end_date_new_tab(i),l_miss_date,NULL,x_plan_end_date_new_tab(i))
1061                         ,decode(x_re_spread_flag_tab(i),l_miss_char,'N',NULL,'N',x_re_spread_flag_tab(i))
1062                         ,decode(x_sp_curve_change_flag_tab(i),l_miss_char,'N',NULL,'N'
1063 					,x_sp_curve_change_flag_tab(i))
1064                         ,decode(x_plan_dates_change_flag_tab(i),l_miss_char,'N',NULL,'N'
1065 					,x_plan_dates_change_flag_tab(i))
1066                         ,decode(x_spfix_date_flag_tab(i),l_miss_char,'N',NULL,'N'
1067 					,x_spfix_date_flag_tab(i))
1068                         ,decode(x_mfc_cost_change_flag_tab(i),l_miss_char,'N',NULL,'N'
1069 					,x_mfc_cost_change_flag_tab(i))
1070                         ,decode(x_mfc_cost_type_id_old_tab(i),l_miss_num,NULL,x_mfc_cost_type_id_old_tab(i))
1071                         ,decode(x_mfc_cost_type_id_new_tab(i),l_miss_num,NULL,x_mfc_cost_type_id_new_tab(i))
1072             		,g_etc_start_date
1073             		,g_project_currency_code
1074             		,g_projfunc_currency_code
1075             		,decode(x_rlm_id_change_flag_tab(i),l_miss_char,'N',NULL,'N'
1076 				,x_rlm_id_change_flag_tab(i))
1077             		,g_budget_version_type
1078             		,decode(x_fp_task_billable_flag_tab(i),l_miss_char,'D',NULL,'D'
1079 				,x_fp_task_billable_flag_tab(i))
1080 			,decode(x_rw_cost_rate_override_tab(i),l_miss_num,'Y'
1081 				,decode(x_raw_cost_rate_tab(i),l_miss_num,'Y'
1082 				,'N')) -- x_cost_rt_miss_num_flag_tab(i)
1083                 	,decode(x_b_cost_rate_tab(i),l_miss_num,'Y'
1084                           	,decode(x_b_cost_rate_override_tab(i),l_miss_num,'Y'
1085 				,'N'))  --x_burd_rt_miss_num_flag_tab(i)
1086                 	,decode(x_bill_rate_tab(i),l_miss_num,'Y'
1087                         	,decode(x_bill_rate_override_tab(i),l_miss_num,'Y'
1088 				,'N')) --x_bill_rt_miss_num_flag_tab(i)
1089 			,decode(x_total_qty_tab(i),l_miss_num,'Y','N') --x_Qty_miss_num_flag_tab(i)
1090                 	,decode(x_total_raw_cost_tab(i),l_miss_num,'Y','N') --x_Rw_miss_num_flag_tab(i)
1091                 	,decode(x_total_burdened_cost_tab(i),l_miss_num,'Y','N') --x_Br_miss_num_flag_tab(i)
1092                 	,decode(x_total_revenue_tab(i),l_miss_num,'Y','N') --x_Rv_miss_num_flag_tab(i)
1093               );
1094 	     If p_pa_debug_mode = 'Y' Then
1095 		print_msg('Number of records inserted into calctemp:['||sql%rowcount||']');
1096 	     End If;
1097 	     IF  g_source_context  = 'BUDGET_LINE' THEN
1098                 FOR i IN cur_validate LOOP
1099                 pa_utils.add_message
1100                 ( p_app_short_name => 'PA'
1101                 ,p_msg_name       => 'PA_FP_CALC_BL_DATES_REQ'
1102                 ,p_token1         => 'BUDGET_VERSION_ID'
1103                 ,p_value1         =>  g_budget_version_id
1104                 ,p_token2         => 'PROJECT_ID'
1105                 ,p_value2         =>  g_project_id
1106                 ,p_token3         =>  'RESOURCE_ASSIGNMENT'
1107                 ,p_value3         =>  i.resource_assignment_id
1108                 ,p_token4         =>  'TXN_CURRENCY'
1109                 ,p_value4         =>  i.txn_currency_code
1110                 );
1111                 x_return_status := 'E';
1112 		END LOOP;
1113        	     END IF;
1114 
1115 	     /* bug fix: 5726773: For non-timephased records generation process passes 0,0,1 as rate
1116  	      * overrides to indicate that revenue only records exists in cost and revenue together version
1117  	      * During generation process calculate skips most of the code which resets rates, rate baseflags, qty
1118  	      * etc.. In order to minimize the code impact, the following code is added
1119  	      * Logic: populate the fp_gen_rate_tmp table (which is populated by generation process in all flows
1120  	      * except for non-timephase) with rate overrides as 0,0,1 and use these rates to stamp on the budget
1121  	      * lines before calling rate api. so that rate api donot derive rawcost and burden cost
1122  	      */
1123  	                 IF g_calling_module in ('BUDGET_GENERATION','FORECAST_GENERATION')
1124  	                    and perdRec.time_phased_code = 'N' and g_refresh_rates_flag = 'N'
1125  	                    and g_budget_version_type = 'ALL'
1126  	                    and g_source_context = 'RESOURCE_ASSIGNMENT' Then
1127 
1128  	                         INSERT INTO pa_fp_gen_rate_tmp fptmp
1129  	                         (fptmp.target_res_asg_id
1130  	                         ,fptmp.txn_currency_code
1131  	                         ,fptmp.raw_cost_rate
1132  	                         ,fptmp.burdened_cost_rate
1133  	                         ,fptmp.revenue_bill_rate
1134  	                         )
1135  	                         SELECT tmp.resource_assignment_id
1136  	                                 ,tmp.txn_currency_code
1137  	                                 ,tmp.cost_rate_override
1138  	                                 ,tmp.burden_cost_rate_override
1139  	                                 ,tmp.bill_rate_override
1140  	                         FROM pa_fp_spread_calc_tmp tmp
1141  	                         WHERE tmp.budget_version_id = g_budget_version_id
1142  	                         AND tmp.cost_rate_override = 0
1143  	                         AND tmp.burden_cost_rate_override = 0
1144  	                         AND tmp.bill_rate_override = 1
1145  	                         AND NOT EXISTS (select null
1146  	                                         from pa_fp_gen_rate_tmp fptmp1
1147  	                                         where fptmp1.target_res_asg_id = tmp.resource_assignment_id
1148  	                                         and fptmp1.txn_currency_code = tmp.txn_currency_code
1149  	                                         );
1150  	                         print_msg('Number of records inserted into pa_fp_gen_rate_tmp['||sql%rowcount||']');
1151  	     End If;
1152 	End If; --}
1153 
1154 exception
1155 	when others then
1156 		print_msg('Exception occured in insert_calcTmp_records['||sqlerrm||sqlcode||']');
1157 		x_return_status := 'U';
1158 		raise;
1159 
1160 END insert_calcTmp_records;
1161 
1162 PROCEDURE Compare_bdgtLine_Values
1163            (p_budget_version_id             IN  Number
1164            ,p_budget_version_type           IN  Varchar2
1165            ,p_source_context                IN  pa_fp_res_assignments_tmp.source_context%TYPE
1166            ,p_apply_progress_flag           IN  Varchar2 DEFAULT 'N'
1167        ,x_return_status                 OUT NOCOPY Varchar2
1168            ,x_msg_data                      OUT NOCOPY Varchar2
1169            ) IS
1170 
1171     CURSOR cur_bl_vals IS
1172     SELECT tmp2.quantity        bl_quantity
1173                ,tmp2.txn_raw_cost   bl_txn_raw_cost
1174                ,tmp2.txn_burdened_cost  bl_txn_burdened_cost
1175                ,tmp2.txn_revenue    bl_txn_revenue
1176                ,tmp2.init_quantity  bl_init_quantity
1177                ,tmp2.txn_init_raw_cost  bl_txn_init_raw_cost
1178                ,tmp2.txn_init_burdened_cost bl_txn_init_burdened_cost
1179                ,tmp2.txn_init_revenue    bl_txn_init_revenue
1180                ,tmp2.cost_rate       bl_cost_rate
1181                ,tmp2.cost_rate_override  bl_cost_rate_override
1182                ,tmp2.burden_cost_rate    bl_burden_cost_rate
1183                ,tmp2.burden_cost_rate_override  bl_burden_cost_rate_override
1184                ,tmp2.bill_rate      bl_bill_rate
1185                ,tmp2.bill_rate_override bl_bill_rate_override
1186            ,tmp.quantity
1187                ,tmp.txn_raw_cost
1188                ,tmp.txn_burdened_cost
1189                ,tmp.txn_revenue
1190                ,tmp.cost_rate
1191                ,tmp.cost_rate_override
1192                ,tmp.burden_cost_rate
1193                ,tmp.burden_cost_rate_override
1194                ,tmp.bill_rate
1195                ,tmp.bill_rate_override
1196            ,tmp.txn_curr_code_override
1197            ,tmp.rowid
1198            ,tmp.resource_assignment_id
1199            ,tmp.txn_currency_code
1200            ,nvl(ra.rate_based_flag,'N') rate_based_flag
1201 	    /*Bug fix:  */
1202 	   ,tmp2.system_reference_num1         	bl_zero_null_quantity
1203            ,tmp2.system_reference_num2         	bl_zero_null_rawcost
1204            ,tmp2.system_reference_num3     	bl_zero_null_burdencost
1205            ,tmp2.system_reference_num4          bl_zero_null_revenue
1206 	   ,tmp2.system_reference_var1  	avg_zero_null_cost_rate
1207            ,tmp2.system_reference_var2  	avg_zero_null_burden_rate
1208            ,tmp2.system_reference_var3  	avg_zero_null_bill_rate
1209 	   ,NVL(ra.resource_rate_based_flag,'N') resource_rate_based_flag
1210 	   ,tmp2.bill_markup_percentage
1211 	   ,NVL(tmp.cost_rate_g_miss_num_flag,'N') cost_rate_g_miss_num_flag
1212 	   ,NVL(tmp.burden_rate_g_miss_num_flag,'N') burden_rate_g_miss_num_flag
1213 	   ,NVL(tmp.bill_rate_g_miss_num_flag,'N') bill_rate_g_miss_num_flag
1214 	   ,nvl(tmp.raw_cost_g_miss_num_flag,'N') raw_cost_g_miss_num_flag
1215 	   ,nvl(tmp.burden_cost_g_miss_num_flag,'N') burden_cost_g_miss_num_flag
1216 	   ,nvl(tmp.revenue_g_miss_num_flag,'N') revenue_g_miss_num_flag
1217 	   ,nvl(tmp.quantity_g_miss_num_flag,'N') quantity_g_miss_num_flag
1218 	   ,rlm.unit_of_measure resource_uom
1219 	   ,tmp.start_date
1220 	   ,tmp.end_date
1221 	   ,NVL(tmp.delete_bl_flag,'N') delete_bl_flag
1222     FROM pa_fp_spread_calc_tmp tmp
1223         ,pa_fp_spread_calc_tmp2 tmp2
1224         ,pa_resource_assignments ra
1225 	,pa_resource_list_members rlm
1226     WHERE tmp.budget_version_id = p_budget_version_id
1227     AND   ra.resource_assignment_id = tmp.resource_assignment_id
1228     AND   rlm.resource_list_member_id = ra.resource_list_member_id
1229     AND   tmp.resource_assignment_id = tmp2.resource_assignment_id
1230     AND   tmp.txn_currency_code = tmp2.txn_currency_code
1231     AND   ((p_source_context = 'BUDGET_LINE'
1232           and tmp.start_date = tmp2.start_date)
1233           OR
1234           p_source_context <> 'BUDGET_LINE'
1235          );
1236 
1237     l_cntr                  INTEGER;
1238     l_res_Asgn_Id_Tab   pa_plsql_datatypes.NumTabTyp;
1239     l_txn_cur_code_Tab  pa_plsql_datatypes.Char50TabTyp;
1240     l_Start_date_tab    pa_plsql_datatypes.DateTabTyp;
1241     l_end_date_tab      pa_plsql_datatypes.DateTabTyp;
1242     l_rowid_tab     pa_plsql_datatypes.rowIdTabTyp;
1243     l_quantity_ch_flag_tab      pa_plsql_datatypes.Char1TabTyp;
1244     l_rawCost_ch_flag_tab      pa_plsql_datatypes.Char1TabTyp;
1245     l_burdenCost_ch_flag_tab      pa_plsql_datatypes.Char1TabTyp;
1246     l_Revnue_ch_flag_tab      pa_plsql_datatypes.Char1TabTyp;
1247     l_costRt_ch_flag_tab      pa_plsql_datatypes.Char1TabTyp;
1248     l_burdRt_ch_flag_tab      pa_plsql_datatypes.Char1TabTyp;
1249     l_billRt_ch_flag_tab      pa_plsql_datatypes.Char1TabTyp;
1250 
1251     l_resource_assingment_id_tab    pa_plsql_datatypes.NumTabTyp;
1252     l_txn_currency_code_tab         pa_plsql_datatypes.Char50TabTyp;
1253     l_bl_Start_date_tab             pa_plsql_datatypes.DateTabTyp;
1254     l_bl_quantity_tab       pa_plsql_datatypes.NumTabTyp;
1255         l_bl_txn_raw_cost_tab       pa_plsql_datatypes.NumTabTyp;
1256         l_bl_txn_burden_cost_tab    pa_plsql_datatypes.NumTabTyp;
1257         l_bl_txn_revenue_tab        pa_plsql_datatypes.NumTabTyp;
1258         l_bl_init_quantity_tab      pa_plsql_datatypes.NumTabTyp;
1259         l_bl_txn_init_raw_cost_tab  pa_plsql_datatypes.NumTabTyp;
1260         l_bl_txn_init_burden_cost_tab   pa_plsql_datatypes.NumTabTyp;
1261         l_bl_txn_init_revenue_tab   pa_plsql_datatypes.NumTabTyp;
1262         l_bl_cost_rate_tab      pa_plsql_datatypes.NumTabTyp;
1263         l_bl_cost_rate_override_tab pa_plsql_datatypes.NumTabTyp;
1264         l_bl_burden_cost_rate_tab   pa_plsql_datatypes.NumTabTyp;
1265         l_bl_burden_rate_override_tab   pa_plsql_datatypes.NumTabTyp;
1266         l_bl_bill_rate_tab      pa_plsql_datatypes.NumTabTyp;
1267         l_bl_bill_rate_override_tab pa_plsql_datatypes.NumTabTyp;
1268     l_rate_based_flag_tab           pa_plsql_datatypes.Char10TabTyp;
1269     l_res_rate_based_flag_tab           pa_plsql_datatypes.Char10TabTyp;
1270 	l_bl_txn_markup_tab		pa_plsql_datatypes.NumTabTyp;
1271 	l_costRt_g_miss_num_flag_tab   pa_plsql_datatypes.Char1TabTyp;
1272         l_burdRt_g_miss_num_flag_tab   pa_plsql_datatypes.Char1TabTyp;
1273         l_revRt_g_miss_num_flag_tab    pa_plsql_datatypes.Char1TabTyp;
1274 	l_rwCost_g_miss_num_flag_tab   pa_plsql_datatypes.Char1TabTyp;
1275 	l_brdCost_g_miss_num_flag_tab   pa_plsql_datatypes.Char1TabTyp;
1276 	l_revenue_g_miss_num_flag_tab   pa_plsql_datatypes.Char1TabTyp;
1277 	l_resource_uom_tab		pa_plsql_datatypes.Char50TabTyp;
1278 
1279 	l_quantity_tab			pa_plsql_datatypes.NumTabTyp;
1280 	l_raw_cost_tab			pa_plsql_datatypes.NumTabTyp;
1281 	l_burdened_cost_tab		pa_plsql_datatypes.NumTabTyp;
1282 	l_revenue_tab			pa_plsql_datatypes.NumTabTyp;
1283 	l_raw_cost_rate_tab		pa_plsql_datatypes.NumTabTyp;
1284 	l_rw_cost_rate_override_tab	pa_plsql_datatypes.NumTabTyp;
1285 	l_b_cost_rate_tab		pa_plsql_datatypes.NumTabTyp;
1286 	l_b_cost_rate_override_tab	pa_plsql_datatypes.NumTabTyp;
1287 	l_bill_rate_tab			pa_plsql_datatypes.NumTabTyp;
1288 	l_bill_rate_override_tab	pa_plsql_datatypes.NumTabTyp;
1289 
1290 	-- Bug fix:5726773
1291  	l_negQty_Change_flag_tab        pa_plsql_datatypes.Char1TabTyp;
1292  	l_negRawCst_Change_flag_tab     pa_plsql_datatypes.Char1TabTyp;
1293  	l_neg_BurdCst_Change_flag_tab   pa_plsql_datatypes.Char1TabTyp;
1294  	l_neg_revChange_flag_tab        pa_plsql_datatypes.Char1TabTyp;
1295 
1296 	l_return_status 	Varchar2(1);
1297 	skip_record		EXCEPTION;
1298 BEGIN
1299     x_return_status := 'S';
1300     l_return_status := 'S';
1301     x_msg_data := NULL;
1302     IF P_PA_DEBUG_MODE = 'Y' Then
1303     print_msg('Entered Compare_bdgtLine_Values API');
1304     End If;
1305         DELETE FROM pa_fp_spread_calc_tmp2
1306         WHERE budget_version_id = p_budget_version_id;
1307         l_res_Asgn_Id_Tab.delete;
1308         l_txn_cur_code_Tab.delete;
1309         l_start_date_tab.delete;
1310                 l_end_date_tab.delete;
1311         l_rowid_tab.delete;
1312             l_quantity_ch_flag_tab.delete;
1313             l_rawCost_ch_flag_tab.delete;
1314             l_burdenCost_ch_flag_tab.delete;
1315             l_Revnue_ch_flag_tab.delete;
1316             l_costRt_ch_flag_tab.delete;
1317             l_burdRt_ch_flag_tab.delete;
1318             l_billRt_ch_flag_tab.delete;
1319         SELECT  tmp.resource_assignment_id
1320             ,tmp.txn_currency_code
1321             ,decode(p_source_context,'BUDGET_LINE',tmp.start_date,to_date(null))
1322             ,decode(p_source_context,'BUDGET_LINE',tmp.end_date,to_date(null))
1323         BULK COLLECT INTO
1324             l_res_Asgn_Id_Tab
1325             ,l_txn_cur_code_Tab
1326             ,l_start_date_tab
1327                         ,l_end_date_tab
1328         FROM pa_fp_spread_calc_tmp tmp
1329         WHERE tmp.budget_version_id = p_budget_version_id;
1330 
1331         IF l_res_Asgn_Id_Tab.COUNT > 0 Then  --{
1332 	   IF P_PA_DEBUG_MODE = 'Y' Then
1333            print_msg('NumOf Lines inserted['||l_res_Asgn_Id_Tab.count||']');
1334 	   End If;
1335            FORALL i IN  l_res_Asgn_Id_Tab.FIRST .. l_res_Asgn_Id_Tab.LAST
1336             INSERT INTO pa_fp_spread_calc_tmp2
1337                 (BUDGET_VERSION_ID
1338                 ,BUDGET_VERSION_TYPE
1339                 ,RESOURCE_ASSIGNMENT_ID
1340                 ,TXN_CURRENCY_CODE
1341                 ,START_DATE
1342                 ,END_DATE
1343                 )
1344             VALUES (p_budget_version_id
1345                 ,p_budget_version_type
1346                 ,l_res_Asgn_Id_Tab(i)
1347                 ,l_txn_cur_code_Tab(i)
1348                 ,l_start_date_tab(i)
1349                 ,l_end_date_tab(i)
1350                 );
1351 	 IF p_source_context = 'RESOURCE_ASSIGNMENT' Then --{
1352 	        IF P_PA_DEBUG_MODE = 'Y' Then
1353 		print_msg('Inserting records into sprdcalctmp2 for resource assignment context');
1354 		End If;
1355 		FORALL i IN l_res_Asgn_Id_Tab.FIRST .. l_res_Asgn_Id_Tab.LAST
1356 		UPDATE /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP2_N1) */ pa_fp_spread_calc_tmp2 tmp
1357             	SET ( tmp.quantity
1358                 ,tmp.txn_raw_cost
1359                 ,tmp.txn_burdened_cost
1360                 ,tmp.txn_revenue
1361                 ,tmp.init_quantity
1362                 ,tmp.txn_init_raw_cost
1363                 ,tmp.txn_init_burdened_cost
1364                 ,tmp.txn_init_revenue
1365                 ,tmp.cost_rate
1366                 ,tmp.cost_rate_override
1367                 ,tmp.burden_cost_rate
1368                 ,tmp.burden_cost_rate_override
1369                 ,tmp.bill_rate
1370                 ,tmp.bill_rate_override
1371                 ,tmp.system_reference_num1  --quantity
1372                 ,tmp.system_reference_num2  --txnRaw
1373                 ,tmp.system_reference_num3  --txnburd
1374                 ,tmp.system_reference_num4  --txnrev
1375 		,tmp.system_reference_var1  --avg_zero_null_cost_rate
1376                 ,tmp.system_reference_var2  --avg_zero_null_burden_rate
1377                 ,tmp.system_reference_var3  --avg_zero_null_bill_rate
1378 		) =
1379 		(SELECT decode(rtx.total_quantity,0,null,rtx.total_quantity) quantity
1380                 ,decode(rtx.total_txn_raw_cost,0,NULL,rtx.total_txn_raw_cost) txn_raw_cost
1381                 ,decode(rtx.total_txn_burdened_cost,0,NULL,rtx.total_txn_burdened_cost) txn_burdened_cost
1382                 ,decode(rtx.total_txn_revenue,0,NULL,rtx.total_txn_revenue) txn_revenue
1383                 ,decode(rtx.total_init_quantity,0,NULL,rtx.total_init_quantity) init_quantity
1384                 ,decode(rtx.total_txn_init_raw_cost,0,NULL,rtx.total_txn_init_raw_cost) init_raw_cost
1385                 ,decode(rtx.total_txn_init_burdened_cost,0,NULL,rtx.total_txn_init_burdened_cost) init_burdened_cost
1386                 ,decode(rtx.total_txn_init_revenue,0,NULL,rtx.total_txn_init_revenue) init_revenue
1387                 ,rtx.TXN_ETC_RAW_COST_RATE              etc_cost_rate
1388                 ,rtx.TXN_RAW_COST_RATE_OVERRIDE         etc_cost_rate_override
1389                 ,rtx.TXN_ETC_BURDEN_COST_RATE           etc_burden_rate
1390                 ,rtx.TXN_BURDEN_COST_RATE_OVERRIDE      etc_burden_rate_override
1391                 ,rtx.TXN_ETC_BILL_RATE                  etc_bill_rate
1392                 ,rtx.TXN_BILL_RATE_OVERRIDE             etc_bill_rate_override
1393                 ,rtx.total_quantity                     bl_zero_null_quantity
1394                 ,rtx.total_txn_raw_cost                 bl_zero_null_rawcost
1395                 ,rtx.total_txn_burdened_cost            bl_zero_null_burdencost
1396                 ,rtx.total_txn_revenue                  bl_zero_null_revenue
1397 	        ,rtx.TXN_RAW_COST_RATE_OVERRIDE
1398 		,rtx.TXN_BURDEN_COST_RATE_OVERRIDE
1399 		,rtx.TXN_BILL_RATE_OVERRIDE
1400         	FROM pa_resource_asgn_curr rtx
1401         	WHERE rtx.resource_assignment_id = l_res_Asgn_Id_Tab(i)
1402         	AND  rtx.txn_currency_code = l_txn_cur_code_Tab(i)
1403 		)
1404 	     WHERE tmp.resource_assignment_id = l_res_Asgn_Id_Tab(i)
1405              AND  tmp.txn_currency_code = l_txn_cur_code_Tab(i);
1406 
1407 		/* update table with txn markup percentage */
1408 		UPDATE /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP2_N1) */ pa_fp_spread_calc_tmp2 tmp
1409 		SET tmp.bill_markup_percentage = (select AVG(bl.txn_markup_percent)
1410 						  from pa_budget_lines bl
1411 						  where bl.resource_assignment_id = tmp.resource_assignment_id
1412 						  and  bl.txn_currency_code = tmp.txn_currency_code
1413 						 )
1414 		WHERE tmp.budget_version_id = p_budget_version_id
1415 		AND EXISTS ( select null
1416 			     from pa_budget_lines bl1
1417                              where bl1.resource_assignment_id = tmp.resource_assignment_id
1418                              and  bl1.txn_currency_code = tmp.txn_currency_code
1419 			   );
1420 
1421 	 ELSE
1422 	    IF P_PA_DEBUG_MODE = 'Y' Then
1423             print_msg('Updating calcTmp2 with budgetLine values');
1424 	    End If;
1425             FORALL i IN l_res_Asgn_Id_Tab.FIRST .. l_res_Asgn_Id_Tab.LAST
1426                 UPDATE  /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP2_N1) */ pa_fp_spread_calc_tmp2 tmp
1427                 SET (tmp.avg_cost_rate_override
1428                     ,tmp.avg_burden_rate_override
1429                     ,tmp.avg_bill_rate_override
1430 		    /* Bug fix:4693839 */
1431 		    ,tmp.system_reference_var1  --avg_zero_null_cost_rate
1432 		    ,tmp.system_reference_var2  --avg_zero_null_burden_rate
1433 		    ,tmp.system_reference_var3  --avg_zero_null_bill_rate
1434 		    ,tmp.bill_markup_percentage
1435 		    ) =
1436                     (SELECT /*+ INDEX(BLAVGRT PA_BUDGET_LINES_U1) */
1437 				AVG(DECODE((nvl(blavgrt.quantity,0) - nvl(blavgrt.init_quantity,0)),0
1438                                                 ,NULL,blavgrt.txn_cost_rate_override)) avg_txn_cost_rate_override
1439                                          ,AVG(DECODE((nvl(blavgrt.quantity,0) - nvl(blavgrt.init_quantity,0)),0
1440                                                 ,NULL,blavgrt.burden_cost_rate_override))   avg_burden_cost_rate_override
1441                                          ,AVG(DECODE((nvl(blavgrt.quantity,0) - nvl(blavgrt.init_quantity,0)),0
1442                                                 ,NULL,blavgrt.txn_bill_rate_override)) avg_txn_bill_rate_override
1443 				     	,AVG(NVL(blavgrt.txn_cost_rate_override,blavgrt.txn_standard_cost_rate))
1444 				    	,AVG(NVL(blavgrt.burden_cost_rate_override,blavgrt.burden_cost_rate))
1445 					,AVG(NVL(blavgrt.txn_bill_rate_override,blavgrt.txn_standard_bill_rate))
1446 					,AVG(blavgrt.txn_markup_percent)
1447                                     FROM pa_budget_lines blavgrt
1448                                     WHERE blavgrt.budget_version_id = p_budget_version_id
1449                                     AND  blavgrt.resource_assignment_id = tmp.resource_assignment_id
1450                                     AND blavgrt.txn_currency_code      = tmp.txn_currency_code
1451                                     AND ( (tmp.start_date is NULL AND tmp.end_date is NULL )
1452                                         OR
1453                                         (tmp.start_date is NOT NULL AND tmp.end_date is NOT NULL
1454                                         AND blavgrt.start_date BETWEEN tmp.start_date AND tmp.end_date))
1455                                         )
1456                 /* Perf fix: WHERE tmp.budget_version_id = p_budget_version_id to avoid N2 index */
1457                 WHERE tmp.resource_assignment_id = l_res_Asgn_Id_Tab(i)
1458                 AND   tmp.txn_currency_code = l_txn_cur_code_Tab(i)
1459                 AND   ((tmp.start_date is NOT NULL
1460                     and tmp.start_date = l_start_date_tab(i))
1461                       OR tmp.start_date is NULL
1462                       );
1463 
1464            FORALL i IN  l_res_Asgn_Id_Tab.FIRST .. l_res_Asgn_Id_Tab.LAST
1465             UPDATE /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP2_N1) */ pa_fp_spread_calc_tmp2 tmp
1466             SET (tmp.quantity
1467                 ,tmp.txn_raw_cost
1468                 ,tmp.txn_burdened_cost
1469                 ,tmp.txn_revenue
1470                 ,tmp.init_quantity
1471                 ,tmp.txn_init_raw_cost
1472                 ,tmp.txn_init_burdened_cost
1473                 ,tmp.txn_init_revenue
1474                 ,tmp.cost_rate
1475                 ,tmp.cost_rate_override
1476                 ,tmp.burden_cost_rate
1477                 ,tmp.burden_cost_rate_override
1478                 ,tmp.bill_rate
1479                 ,tmp.bill_rate_override
1480 		/* Bug fix:4693839 */
1481 		,tmp.system_reference_num1  --quantity
1482 		,tmp.system_reference_num2  --txnRaw
1483 		,tmp.system_reference_num3  --txnburd
1484 		,tmp.system_reference_num4  --txnrev
1485 		) =
1486                ( SELECT /*+ INDEX(BL PA_BUDGET_LINES_U1) */
1487                 decode(sum(bl.quantity),0,NULL,sum(bl.quantity)) --quantity
1488                 ,decode(sum(bl.txn_raw_cost),0,NULL,sum(bl.txn_raw_cost))  --txn_raw_cost
1489                 ,decode(sum(bl.txn_burdened_cost),0,NULL,sum(bl.txn_burdened_cost)) --txn_burdened_cost
1490                 ,decode(sum(bl.txn_revenue),0,NULL,sum(bl.txn_revenue)) --txn_revenue
1491                 ,decode(sum(bl.init_quantity),0,NULL,sum(bl.init_quantity)) --init_quantity
1492                 ,decode(sum(bl.txn_init_raw_cost),0,NULL,sum(bl.txn_init_raw_cost)) --init_raw_cost
1493                 ,decode(sum(bl.txn_init_burdened_cost),0,NULL,sum(bl.txn_init_burdened_cost)) --init_burdened_cost
1494                 ,decode(sum(bl.txn_init_revenue),0,NULL,sum(bl.txn_init_revenue)) --init_revenue
1495                 ,(sum(( decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,null
1496                          ,decode(nvl(bl.txn_cost_rate_override,nvl(bl.txn_standard_cost_rate,0)),0,null
1497                          ,((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)) * nvl(bl.txn_cost_rate_override,nvl(bl.txn_standard_cost_rate,0)))))))
1498                     / DECODE((sum(decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,null
1499                                 ,decode(nvl(bl.txn_cost_rate_override,nvl(bl.txn_standard_cost_rate,0)),0,null
1500                        		  ,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0))))))
1501 			      ,0,NULL,
1502 			       	(sum(decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,null
1503                                 ,decode(nvl(bl.txn_cost_rate_override,nvl(bl.txn_standard_cost_rate,0)),0,null
1504                                   ,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0))))))
1505 				)
1506                   ) --etc_cost_rate
1507                 ,(sum(decode(tmp.avg_cost_rate_override,NULL,NULL
1508                                ,decode((nvl(bl.quantity,0) - nvl(bl.init_quantity,0)),0,NULL
1509                                 ,decode(nvl(bl.txn_cost_rate_override,nvl(bl.txn_standard_cost_rate,0)),0,NULL
1510                                      ,((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)) * nvl(bl.txn_cost_rate_override,nvl(bl.txn_standard_cost_rate,0)))))))
1511                     / DECODE((sum(decode(tmp.avg_cost_rate_override,NULL,NULL
1512                             ,decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,NULL
1513                               ,decode(nvl(bl.txn_cost_rate_override,nvl(bl.txn_standard_cost_rate,0)),0,null
1514                     	        ,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0)))))))
1515 			 ,0,NULL,
1516 			  (sum(decode(tmp.avg_cost_rate_override,NULL,NULL
1517                             ,decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,NULL
1518                               ,decode(nvl(bl.txn_cost_rate_override,nvl(bl.txn_standard_cost_rate,0)),0,null
1519                                 ,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0)))))))
1520 			 )
1521                  ) --etc_cost_rate_override
1522                 ,(sum(( decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,null
1523                        ,decode(nvl(bl.burden_cost_rate_override,nvl(bl.burden_cost_rate,0)),0,null
1524                            ,((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)) * nvl(bl.burden_cost_rate_override,nvl(bl.burden_cost_rate,0)))))))
1525                    / DECODE((sum(decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,null
1526                         ,decode(nvl(bl.burden_cost_rate_override,nvl(bl.burden_cost_rate,0)),0,null
1527                     	  ,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0))))))
1528 			,0,NULL,
1529 			(sum(decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,null
1530                         ,decode(nvl(bl.burden_cost_rate_override,nvl(bl.burden_cost_rate,0)),0,null
1531                           ,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0))))))
1532 		   	)
1533                  ) --etc_burden_rate
1534                 ,(sum(decode(tmp.avg_burden_rate_override,NULL,NULL
1535                      ,decode((nvl(bl.quantity,0) - nvl(bl.init_quantity,0)),0,NULL
1536                        ,decode(nvl(bl.burden_cost_rate_override,nvl(bl.burden_cost_rate,0)),0,NULL
1537                           ,((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)) * nvl(bl.burden_cost_rate_override,nvl(bl.burden_cost_rate,0)))))))
1538                     / DECODE((sum(decode(tmp.avg_burden_rate_override,NULL,NULL
1539                           ,decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,NULL
1540                             ,decode(nvl(bl.burden_cost_rate_override,nvl(bl.burden_cost_rate,0)),0,NULL
1541                          	,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0)))))))
1542 			,0,NULL,
1543 			(sum(decode(tmp.avg_burden_rate_override,NULL,NULL
1544                           ,decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,NULL
1545                             ,decode(nvl(bl.burden_cost_rate_override,nvl(bl.burden_cost_rate,0)),0,NULL
1546                                 ,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0)))))))
1547 			)
1548                  ) --etc_burden_rate_override
1549                 ,(sum((decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,null
1550                        ,decode(nvl(bl.txn_bill_rate_override,nvl(bl.txn_standard_bill_rate,0)),0,null
1551                          ,((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)) * nvl(bl.txn_bill_rate_override,nvl(bl.txn_standard_bill_rate,0)))))))
1552                    / DECODE((sum(decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,null
1553                        ,decode(nvl(bl.txn_bill_rate_override,nvl(bl.txn_standard_bill_rate,0)),0,null
1554                     	  ,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0))))))
1555 			,0,NULL,
1556 			(sum(decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,null
1557                        ,decode(nvl(bl.txn_bill_rate_override,nvl(bl.txn_standard_bill_rate,0)),0,null
1558                           ,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0))))))
1559 			)
1560                  ) --etc_bill_rate
1561                 ,(sum(decode(tmp.avg_bill_rate_override,NULL,NULL
1562                       , decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,NULL
1563                          ,decode(nvl(bl.txn_bill_rate_override,nvl(bl.txn_standard_bill_rate,0)),0,NULL
1564                             ,((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)) * nvl(bl.txn_bill_rate_override,nvl(bl.txn_standard_bill_rate,0)))))))
1565                    / DECODE((sum(decode(tmp.avg_bill_rate_override,NULL,NULL
1566                         ,decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,NULL
1567                           ,decode(nvl(bl.txn_bill_rate_override,nvl(bl.txn_standard_bill_rate,0)),0,null
1568                       		,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0)))))))
1569 			,0,NULL,
1570 			(sum(decode(tmp.avg_bill_rate_override,NULL,NULL
1571                         ,decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,NULL
1572                           ,decode(nvl(bl.txn_bill_rate_override,nvl(bl.txn_standard_bill_rate,0)),0,null
1573                                 ,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0)))))))
1574 			)
1575                 ) --etc_bill_rate_override
1576 		/* Bug fix:4693839 Currently all the UI page shows null instead of zeros, and when they pass to param value
1577 		 * will be passed null, representing no change, but some other API like AMG etc, may pass zero in param value.
1578 	         * In order to avoid changing all the calling api, this api is modified to handle nulls and zeros carefully */
1579 		,SUM(tmp.quantity)	 	-- bl_zero_null_quantity
1580                 ,SUM(tmp.txn_raw_cost)	   	-- bl_zero_null_rawcost
1581                 ,SUM(tmp.txn_burdened_cost)	-- bl_zero_null_burdencost
1582                 ,SUM(tmp.txn_revenue)		-- bl_zero_null_revenue
1583                 FROM pa_budget_lines bl
1584                 WHERE bl.budget_version_id = p_budget_version_id
1585                 AND  bl.resource_assignment_id = tmp.resource_assignment_id
1586                 AND bl.txn_currency_code      = tmp.txn_currency_code
1587                 AND ( (tmp.start_date is NULL AND tmp.end_date is NULL )
1588                             OR
1589                            (tmp.start_date is NOT NULL AND tmp.end_date is NOT NULL
1590                             AND bl.start_date BETWEEN tmp.start_date AND tmp.end_date)
1591                        )
1592                 )
1593       	/* Perf fix: WHERE tmp.budget_version_id = p_budget_version_id to avoid N2 index */
1594       	WHERE tmp.resource_assignment_id = l_res_Asgn_Id_Tab(i)
1595       	AND   tmp.txn_currency_code = l_txn_cur_code_Tab(i)
1596       	AND   ((tmp.start_date is NOT NULL
1597                   and tmp.start_date = l_start_date_tab(i))
1598                 OR tmp.start_date is NULL
1599               );
1600             --print_msg('Number of budgtLines got updated['||l_res_Asgn_Id_Tab.count||']');
1601 	END IF; --}
1602             /** added this for debug testing
1603             FOR tmp in (select * from pa_fp_spread_calc_tmp2 where budget_version_id = p_budget_version_id) LOOP
1604             print_msg('Res['||tmp.resource_assignment_id||']blTxncur['||tmp.txn_currency_code||'blQty['||tmp.quantity||']');
1605             print_msg('RawCst['||tmp.txn_raw_cost||']BdCst['||tmp.txn_burdened_cost||']Rev['||tmp.txn_revenue||']');
1606             print_msg('cstRt['||tmp.cost_rate||']cstRtOvr['||tmp.cost_rate_override||']BdRt['||tmp.burden_cost_rate||']');
1607             print_msg('BdRtOv['||tmp.burden_cost_rate_override||']BilRt['||tmp.bill_rate||']BilRtOvr['||tmp.bill_rate_override||']');
1608 	    print_msg('init_quantity['||tmp.init_quantity||']txn_init_raw_cost['||tmp.txn_init_raw_cost||']');
1609             END LOOP;
1610             **/
1611             l_cntr := 0;
1612             l_resource_assingment_id_tab.delete;
1613 		l_txn_currency_code_tab.delete;
1614                 l_bl_Start_date_tab.delete;
1615                 l_bl_quantity_tab.delete;
1616                 l_bl_txn_raw_cost_tab.delete;
1617                 l_bl_txn_burden_cost_tab.delete;
1618                 l_bl_txn_revenue_tab.delete;
1619                 l_bl_init_quantity_tab.delete;
1620                 l_bl_txn_init_raw_cost_tab.delete;
1621                 l_bl_txn_init_burden_cost_tab.delete;
1622                 l_bl_txn_init_revenue_tab.delete;
1623                 l_bl_cost_rate_tab.delete;
1624                 l_bl_cost_rate_override_tab.delete;
1625                 l_bl_burden_cost_rate_tab.delete;
1626                 l_bl_burden_rate_override_tab.delete;
1627                 l_bl_bill_rate_tab.delete;
1628                 l_bl_bill_rate_override_tab.delete;
1629             	l_rate_based_flag_tab.delete;
1630 		l_res_rate_based_flag_tab.delete;
1631 		l_bl_txn_markup_tab.delete;
1632 		l_costRt_g_miss_num_flag_tab.delete;
1633                 l_burdRt_g_miss_num_flag_tab.delete;
1634                 l_revRt_g_miss_num_flag_tab.delete;
1635 		l_rwCost_g_miss_num_flag_tab.delete;
1636         	l_brdCost_g_miss_num_flag_tab.delete;
1637         	l_revenue_g_miss_num_flag_tab.delete;
1638 	        l_resource_uom_tab.delete;
1639 		l_quantity_tab.delete;
1640         	l_raw_cost_tab.delete;
1641         	l_burdened_cost_tab.delete;
1642         	l_revenue_tab.delete;
1643         	l_raw_cost_rate_tab.delete;
1644         	l_rw_cost_rate_override_tab.delete;
1645         	l_b_cost_rate_tab.delete;
1646         	l_b_cost_rate_override_tab.delete;
1647         	l_bill_rate_tab.delete;
1648         	l_bill_rate_override_tab.delete;
1649 		--bug fix:5726773
1650  	        l_negQty_Change_flag_tab.delete;
1651  	        l_negRawCst_Change_flag_tab.delete;
1652  	        l_neg_BurdCst_Change_flag_tab.delete;
1653  	        l_neg_revChange_flag_tab.delete;
1654 
1655             FOR i IN cur_bl_vals LOOP
1656 		BEGIN --{
1657                 l_cntr := l_cntr +1;
1658                 l_rowid_tab(l_cntr) := i.rowid;
1659                         l_quantity_ch_flag_tab(l_cntr)  := 'N';
1660                         l_rawCost_ch_flag_tab(l_cntr)  := 'N';
1661                         l_burdenCost_ch_flag_tab(l_cntr)  := 'N';
1662                         l_Revnue_ch_flag_tab(l_cntr)  := 'N';
1663                         l_costRt_ch_flag_tab(l_cntr)  := 'N';
1664                         l_burdRt_ch_flag_tab(l_cntr)  := 'N';
1665                         l_billRt_ch_flag_tab(l_cntr)  := 'N';
1666                 l_resource_assingment_id_tab(l_cntr)    := i.resource_assignment_id;
1667                             l_txn_currency_code_tab(l_cntr)     := i.txn_currency_code;
1668 			l_resource_uom_tab(l_cntr)    := i.resource_uom;
1669                             l_bl_quantity_tab(l_cntr)       := i.bl_quantity;
1670                             l_bl_txn_raw_cost_tab(l_cntr)       := i.bl_txn_raw_cost;
1671                             l_bl_txn_burden_cost_tab(l_cntr)    := i.bl_txn_burdened_cost;
1672                             l_bl_txn_revenue_tab(l_cntr)        := i.bl_txn_revenue;
1673                             l_bl_init_quantity_tab(l_cntr)      := i.bl_init_quantity;
1674                             l_bl_txn_init_raw_cost_tab(l_cntr)      := i.bl_txn_init_raw_cost;
1675                             l_bl_txn_init_burden_cost_tab(l_cntr)   := i.bl_txn_init_burdened_cost;
1676                             l_bl_txn_init_revenue_tab(l_cntr)   := i.bl_txn_init_revenue;
1677                             l_bl_cost_rate_tab(l_cntr)          := i.bl_cost_rate;
1678                             l_bl_cost_rate_override_tab(l_cntr)     := i.bl_cost_rate_override;
1679                             l_bl_burden_cost_rate_tab(l_cntr)   := i.bl_burden_cost_rate;
1680                             l_bl_burden_rate_override_tab(l_cntr)   := i.bl_burden_cost_rate_override;
1681                             l_bl_bill_rate_tab(l_cntr)          := i.bl_bill_rate;
1682                             l_bl_bill_rate_override_tab(l_cntr)     := i.bl_bill_rate_override;
1683                 l_rate_based_flag_tab(l_cntr)       := i.rate_based_flag;
1684                 l_res_rate_based_flag_tab(l_cntr)       := i.resource_rate_based_flag;
1685 		l_bl_txn_markup_tab(l_cntr)       := i.bill_markup_percentage;
1686 		l_costRt_g_miss_num_flag_tab(l_cntr) := i.cost_rate_g_miss_num_flag;
1687                 l_burdRt_g_miss_num_flag_tab(l_cntr) := i.burden_rate_g_miss_num_flag;
1688                 l_revRt_g_miss_num_flag_tab(l_cntr)  := i.bill_rate_g_miss_num_flag;
1689 		l_rwCost_g_miss_num_flag_tab(l_cntr)  := i.raw_cost_g_miss_num_flag;
1690                 l_brdCost_g_miss_num_flag_tab(l_cntr)  := i.burden_cost_g_miss_num_flag;
1691                 l_revenue_g_miss_num_flag_tab(l_cntr)  := i.revenue_g_miss_num_flag;
1692 		-- Bug fix:5726773
1693  	        l_negQty_Change_flag_tab(l_cntr)            := 'N';
1694  	        l_negRawCst_Change_flag_tab(l_cntr)     := 'N';
1695  	        l_neg_BurdCst_Change_flag_tab(l_cntr)        := 'N';
1696  	        l_neg_revChange_flag_tab(l_cntr)            := 'N';
1697 
1698 
1699 		/*Perf Impr:5309529 Added this and removed muliple execution of AvgblRec cursor for param validation*/
1700 		pre_process_param_values
1701         	(p_budget_version_id            => p_budget_version_id
1702         	,p_resource_assignment          => i.resource_assignment_id
1703         	,p_txn_currency_code            => i.txn_currency_code
1704         	,p_txn_currency_override        => i.txn_curr_code_override
1705         	,p_bdgt_line_sDate              => i.start_date
1706         	,p_bdgt_line_eDate              => i.end_date
1707         	,p_delete_bl_flag               => i.delete_bl_flag
1708         	,p_Qty_miss_num_flag            => i.quantity_g_miss_num_flag
1709         	,p_bl_quantity                  => i.bl_quantity
1710         	,p_bl_init_quantity             => i.bl_init_quantity
1711         	,x_total_quantity               => i.quantity
1712         	,p_Rw_miss_num_flag             => i.raw_cost_g_miss_num_flag
1713         	,p_bl_txn_raw_cost              => i.bl_txn_raw_cost
1714         	,p_bl_txn_init_raw_cost         => i.bl_txn_init_raw_cost
1715         	,x_total_raw_cost               => i.txn_raw_cost
1716         	,p_Br_miss_num_flag             => i.burden_cost_g_miss_num_flag
1717         	,p_bl_txn_burdened_cost         => i.bl_txn_burdened_cost
1718         	,p_bl_txn_init_burdened_cost    => i.bl_txn_init_burdened_cost
1719         	,x_total_burdened_cost          => i.txn_burdened_cost
1720         	,p_Rv_miss_num_flag             => i.revenue_g_miss_num_flag
1721         	,p_bl_txn_revenue               => i.bl_txn_revenue
1722         	,p_bl_txn_init_revenue          => i.bl_txn_init_revenue
1723         	,x_total_revenue                => i.txn_revenue
1724         	,p_cost_rt_miss_num_flag        => i.cost_rate_g_miss_num_flag
1725         	,p_bl_etc_cost_rate             => i.bl_cost_rate
1726         	,p_bl_etc_cost_rate_override    => i.bl_cost_rate_override
1727         	,x_raw_cost_rate                => i.cost_rate
1728         	,x_rw_cost_rate_override        => i.cost_rate_override
1729         	,p_burd_rt_miss_num_flag        => i.burden_rate_g_miss_num_flag
1730         	,p_bl_etc_burden_rate           => i.bl_burden_cost_rate
1731         	,p_bl_etc_burden_rate_override  => i.bl_burden_cost_rate_override
1732         	,x_b_cost_rate                  => i.burden_cost_rate
1733         	,x_b_cost_rate_override         => i.burden_cost_rate_override
1734         	,p_bill_rt_miss_num_flag        => i.bill_rate_g_miss_num_flag
1735         	,p_bl_etc_bill_rate             => i.bl_bill_rate
1736         	,p_bl_etc_bill_rate_override    => i.bl_bill_rate_override
1737         	,x_bill_rate                    => i.bill_rate
1738         	,x_bill_rate_override           => i.bill_rate_override
1739         	,x_return_status                => l_return_status
1740         	);
1741 
1742 		If NVL(l_return_status,'S') <> 'S' Then
1743 			x_return_status := l_return_status;
1744 			Raise skip_record;
1745 		End If;
1746 		l_quantity_tab(l_cntr)  		:= i.quantity;
1747                 l_raw_cost_tab(l_cntr)  		:= i.txn_raw_cost;
1748                 l_burdened_cost_tab(l_cntr)  		:= i.txn_burdened_cost;
1749                 l_revenue_tab(l_cntr)  			:= i.txn_revenue;
1750                 l_raw_cost_rate_tab(l_cntr)  		:= i.cost_rate;
1751                 l_rw_cost_rate_override_tab(l_cntr)  	:= i.cost_rate_override;
1752                 l_b_cost_rate_tab(l_cntr)  		:= i.burden_cost_rate;
1753                 l_b_cost_rate_override_tab(l_cntr)  	:= i.burden_cost_rate_override;
1754                 l_bill_rate_tab(l_cntr)  		:= i.bill_rate;
1755                 l_bill_rate_override_tab(l_cntr)  	:= i.bill_rate_override;
1756 		/* end of Perf Impr:5309529 */
1757 
1758 		If g_wp_version_flag = 'Y' Then
1759                   If ((Nvl(i.quantity,0) <> NVL(i.bl_quantity,0)) OR
1760 	            (i.quantity = 0 AND i.bl_zero_null_quantity is NULL)) Then /* Bug fix:4693839 */
1761                     l_quantity_ch_flag_tab(l_cntr)  := 'Y';
1762                   End If;
1763 
1764 		Else
1765 		  If g_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION') and i.resource_rate_based_flag = 'N' Then
1766 			/* ignore change of quantity for non-rate base resources */
1767 			l_quantity_ch_flag_tab(l_cntr)  := 'N';
1768 		  Else
1769 		     If ((Nvl(i.quantity,0) <> NVL(i.bl_quantity,0)) OR
1770                     	(i.quantity = 0 AND i.bl_zero_null_quantity is NULL)) Then /* Bug fix:4693839 */
1771                     	 l_quantity_ch_flag_tab(l_cntr)  := 'Y';
1772 		     End If;
1773                   /*
1774              Bug 6429285
1775              Below if condition will handle a corner case
1776              If a rate based resource is added as non rate based resource assignment
1777              in pa_resource_asgn_curr and pa_budget_lines quantity will be populated
1778              as raw_cost and display_quantity will be null.Now if we want to enter
1779              the quantity same as raw cost (i.e existing quantity) the above if condition will fail because
1780              the user entered quantity is same as what is alreay existing*/
1781 
1782              -- Added condition and i.quantity <> '' as part of fix 7704110
1783              /* Bug 8871025 : skkoppul commented the following condition
1784              If (i.quantity is not null and i.quantity <> '' and i.resource_rate_based_flag = 'Y' and i.rate_based_flag = 'N') Then
1785                     l_quantity_ch_flag_tab(l_cntr)  := 'Y';
1786              END If;
1787              Bug 8871025 : skkoppul end of commented code */
1788              --End 6429285
1789                   End If;
1790 		End if;
1791 
1792 		/* Bug fix:5726773: when quantity is changed from +ve to -ve or -ve to +ve then
1793  	          * initialize the flags. Later in the spread api. place the additional quantity in
1794  	          * in the last existing period. Refer to TAD for detail architecture
1795  	          * Logic: Example shows when to initialize the flags
1796  	          *    ExistingDB value  paramValue   Result
1797  	          *  1.          -10         20          Y
1798  	          *  2.          100         -100        Y
1799  	          *  3.          100         150         N
1800  	          *  4.          0           100         N
1801  	          *  5.          0           -100        N
1802  	          *  6.          10          0           N
1803  	          *  7.          -10         0           N
1804  	        */
1805  	        If l_quantity_ch_flag_tab(l_cntr) = 'Y' Then
1806  	            If nvl(i.bl_zero_null_quantity,0) <> 0 AND Nvl(i.quantity,0) <> 0 Then
1807  	                   If sign(nvl(i.bl_zero_null_quantity,0)) <> sign(Nvl(i.quantity,0)) Then
1808  	                        l_negQty_Change_flag_tab(l_cntr)        := 'Y';
1809  	                   End If;
1810  	            End If;
1811  	        End If;
1812  	        /* end of bug fix:5726773 */
1813 
1814                 If ((NVL(i.txn_raw_cost,0) <> NVL(i.bl_txn_raw_cost,0))
1815 		    OR (i.txn_raw_cost = 0 AND i.bl_zero_null_rawcost is NULL ))  Then /* Bug fix:4693839 */
1816                    /* Bug fix:4293020: Changing the quantity and currency for Non-rate base resource is nulling out the quantity
1817                     * Reason: the below flag setting to y makes the cost is changed and precedence rules will copy the
1818                     * null costs to quantity.
1819                     * fix: When override currency is passed, set the flag based on the user passed amounts in the param.
1820                     * donot retain the costs from the budget lines.
1821                     */
1822                     If (i.txn_curr_code_override is NOT NULL AND NVL(i.txn_raw_cost,0) = 0) Then
1823                     l_rawCost_ch_flag_tab(l_cntr) := 'N';
1824                     Else
1825                     l_rawCost_ch_flag_tab(l_cntr) := 'Y';
1826                     End If;
1827                 End If;
1828 
1829 		/* Bug fix:5726773: */
1830  	            If l_rawCost_ch_flag_tab(l_cntr) = 'Y' Then
1831  	                If nvl(i.bl_zero_null_rawcost,0) <> 0 AND Nvl(i.txn_raw_cost,0) <> 0 Then
1832  	                     If sign(nvl(i.bl_zero_null_rawcost,0)) <> sign(Nvl(i.txn_raw_cost,0)) Then
1833  	                         l_negRawCst_Change_flag_tab(l_cntr)    := 'Y';
1834  	                    End If;
1835  	              End If;
1836  	            End If;
1837  	        /* end of bug fix:5726773 */
1838 
1839                 IF ((nvl(i.txn_burdened_cost,0) <> nvl(i.bl_txn_burdened_cost,0))
1840 		    OR (i.txn_burdened_cost = 0 AND i.bl_zero_null_burdencost is NULL )) Then /* Bug fix:4693839 */
1841                     /* bug fix:4293020 */
1842                     If (i.txn_curr_code_override is NOT NULL AND nvl(i.txn_burdened_cost,0) = 0) Then
1843                     l_burdenCost_ch_flag_tab(l_cntr) := 'N';
1844                     Else
1845                     l_burdenCost_ch_flag_tab(l_cntr) := 'Y';
1846                     End If;
1847                 End If;
1848 
1849 		 /* Bug fix:5726773: */
1850  	             If l_burdenCost_ch_flag_tab(l_cntr) = 'Y' Then
1851  	                 If nvl(i.bl_zero_null_burdencost,0) <> 0 AND Nvl(i.txn_burdened_cost,0) <> 0 Then
1852  	                      If sign(nvl(i.bl_zero_null_burdencost,0)) <> sign(Nvl(i.txn_burdened_cost,0)) Then
1853  	                          l_neg_BurdCst_Change_flag_tab(l_cntr)    := 'Y';
1854  	                      End If;
1855  	                End If;
1856  	             End If;
1857  	         /* end of bug fix:5726773 */
1858 
1859                 IF ((nvl(i.txn_revenue,0) <> nvl(i.bl_txn_revenue,0))
1860 		    OR ( i.txn_revenue = 0 AND i.bl_zero_null_revenue is NULL )) Then /* Bug fix:4693839 */
1861                     /* bug fix:4293020 */
1862                     If (i.txn_curr_code_override is NOT NULL AND nvl(i.txn_revenue,0) = 0) Then
1863                     	l_Revnue_ch_flag_tab(l_cntr) := 'N';
1864                     Else
1865                     	l_Revnue_ch_flag_tab(l_cntr) := 'Y';
1866                     End If;
1867                 End If;
1868 
1869 		/* Bug fix:5726773: */
1870  	            If l_Revnue_ch_flag_tab(l_cntr) = 'Y' Then
1871  	                If nvl(i.bl_zero_null_revenue,0) <> 0 AND Nvl(i.txn_revenue,0) <> 0 Then
1872  	                     If sign(nvl(i.bl_zero_null_revenue,0)) <> sign(Nvl(i.txn_revenue,0)) Then
1873  	                          l_neg_revChange_flag_tab(l_cntr)    := 'Y';
1874  	                     End If;
1875  	               End If;
1876  	            End If;
1877  	       /* end of bug fix:5726773 */
1878 
1879                 /*** Bug fix:4297663 : While comparing the nulls should be handled properly.Add NVLs **/
1880                 If p_source_context = 'BUDGET_LINE' Then
1881 		  If ( NVL(i.cost_rate_override,NVL(i.cost_rate,0)) <>
1882                      	nvl(i.bl_cost_rate_override,NVL(i.bl_cost_rate,0))
1883                      OR (i.cost_rate = 0 AND i.avg_zero_null_cost_rate is NULL) /* Bug fix:4693839 */
1884                      OR (i.cost_rate_override = 0 AND i.avg_zero_null_cost_rate is NULL)) Then
1885 			  print_msg('Setting the cost rate changed flag to Y');
1886                            l_costRt_ch_flag_tab(l_cntr) := 'Y';
1887 		  End If;
1888 		Else -- with new entity changes compare only the rate overrides, as all the calling apis passes
1889 		     -- rate overrides only
1890 		  If i.resource_rate_based_flag = 'Y'
1891 		     AND ( NVL(i.cost_rate_override,nvl(i.bl_cost_rate_override,0)) <> nvl(i.bl_cost_rate_override,0)
1892                      OR (i.cost_rate_override = 0 AND i.avg_zero_null_cost_rate is NULL)) Then
1893 			If i.rate_based_flag = 'N' Then
1894 			   if l_quantity_ch_flag_tab(l_cntr) = 'N' then
1895 				l_costRt_ch_flag_tab(l_cntr) := 'N';
1896 			   else
1897 				l_costRt_ch_flag_tab(l_cntr) := 'Y';
1898 			   End If;
1899 			Else
1900                            l_costRt_ch_flag_tab(l_cntr) := 'Y';
1901 			End If;
1902 		  Else
1903 			l_costRt_ch_flag_tab(l_cntr) := 'N';
1904                   End If;
1905                 End If;
1906 
1907                 If p_source_context = 'BUDGET_LINE' Then
1908 		   If (( NVL(i.burden_cost_rate_override,NVL(i.burden_cost_rate,0)) <>
1909                          NVL(i.bl_burden_cost_rate_override,NVL(i.bl_burden_cost_rate,0)))
1910 		      OR ( i.burden_cost_rate = 0 AND i.avg_zero_null_burden_rate is NULL ) /* Bug fix:4693839 */
1911 		      OR ( i.burden_cost_rate_override = 0 AND i.avg_zero_null_burden_rate is NULL )) Then
1912                            l_burdRt_ch_flag_tab(l_cntr)  := 'Y';
1913 		   End If;
1914 		Else
1915 		  If g_wp_version_flag = 'Y' Then
1916 		     If (( NVL(i.burden_cost_rate_override,NVL(i.bl_burden_cost_rate_override,0)) <>
1917                          NVL(i.bl_burden_cost_rate_override,0))
1918                         OR ( i.burden_cost_rate_override = 0 AND i.avg_zero_null_burden_rate is NULL )) Then
1919                            l_burdRt_ch_flag_tab(l_cntr)  := 'Y';
1920 		     End If;
1921 		  Else
1922 		     If i.resource_rate_based_flag = 'Y'
1923 			AND (( NVL(i.burden_cost_rate_override,NVL(i.bl_burden_cost_rate_override,0)) <>
1924                          NVL(i.bl_burden_cost_rate_override,0))
1925                          OR ( i.burden_cost_rate_override = 0 AND i.avg_zero_null_burden_rate is NULL )) Then
1926 			l_burdRt_ch_flag_tab(l_cntr)  := 'Y';
1927 		     Else
1928 			l_burdRt_ch_flag_tab(l_cntr)  := 'N';
1929 		     End If;
1930 		  End If;
1931                 End If;
1932 
1933                 If p_source_context = 'BUDGET_LINE' Then
1934 		   If ((NVL(i.bill_rate_override,NVL(i.bill_rate,0)) <>
1935                          nvl (i.bl_bill_rate_override,NVL(i.bl_bill_rate,0)))
1936 		     OR (i.bill_rate = 0 AND i.avg_zero_null_bill_rate is NULL ) /* Bug fix:4693839 */
1937 		     OR (i.bill_rate_override = 0 AND i.avg_zero_null_bill_rate is NULL )) Then
1938                            l_billRt_ch_flag_tab(l_cntr) := 'Y';
1939 		   End If;
1940 		Else
1941 		   If i.resource_rate_based_flag = 'Y'
1942 		     AND ((NVL(i.bill_rate_override,NVL(i.bl_bill_rate_override,0)) <>
1943                          nvl (i.bl_bill_rate_override,0))
1944                      OR (i.bill_rate_override = 0 AND i.avg_zero_null_bill_rate is NULL )) Then
1945                            l_billRt_ch_flag_tab(l_cntr) := 'Y';
1946 		   Else
1947 			l_billRt_ch_flag_tab(l_cntr) := 'N';
1948                    End If;
1949                 End If;
1950 
1951                 IF i.txn_curr_code_override is NOT NULL Then
1952                     If i.cost_rate_override is NOT NULL Then
1953                         l_costRt_ch_flag_tab(l_cntr) := 'Y';
1954                     End If;
1955                     If i.burden_cost_rate_override is NOT NULL Then
1956                         l_burdRt_ch_flag_tab(l_cntr)  := 'Y';
1957                     End If;
1958                     If i.bill_rate_override is NOT NULL Then
1959                         l_billRt_ch_flag_tab(l_cntr) := 'Y';
1960                     End If;
1961                 END IF;
1962 		--print_msg('G_MissNumFlgs:Cst['||i.cost_rate_g_miss_num_flag||']');
1963 		--print_msg('Burd['||i.burden_rate_g_miss_num_flag||']Bil['||i.bill_rate_g_miss_num_flag||']');
1964 
1965 	        If g_wp_version_flag = 'Y' Then
1966 		  IF i.rate_based_flag = 'Y' and i.cost_rate_g_miss_num_flag = 'Y' Then
1967 			l_costRt_ch_flag_tab(l_cntr) := 'Y';
1968 		  End If;
1969 
1970 		  IF i.burden_rate_g_miss_num_flag = 'Y' Then
1971                         l_burdRt_ch_flag_tab(l_cntr) := 'Y';
1972                   End If;
1973 		End If;
1974 
1975 		/* handling g miss nums for rates */
1976 		If g_wp_version_flag = 'N' Then --{
1977 		  If i.rate_based_flag = 'Y' Then
1978 		      If NVL(l_rawCost_ch_flag_tab(l_cntr),'N') = 'Y'
1979 			 and l_quantity_ch_flag_tab(l_cntr) = 'Y' Then
1980 			 i.cost_rate_g_miss_num_flag := 'N';
1981 			 l_costRt_g_miss_num_flag_tab(l_cntr) := 'N';
1982 			 l_costRt_ch_flag_tab(l_cntr) := 'N';
1983 		      Elsif NVL(l_rawCost_ch_flag_tab(l_cntr),'N') = 'Y'
1984 			  and i.cost_rate_g_miss_num_flag = 'Y' Then
1985 			 i.cost_rate_g_miss_num_flag := 'N';
1986                          l_costRt_g_miss_num_flag_tab(l_cntr) := 'N';
1987                          l_costRt_ch_flag_tab(l_cntr) := 'N';
1988                       ElsIF i.cost_rate_g_miss_num_flag = 'Y' Then
1989                         l_costRt_ch_flag_tab(l_cntr) := 'Y';
1990                       End If;
1991 
1992 		    If NVL(l_burdenCost_ch_flag_tab(l_cntr),'N') = 'Y'
1993 			and i.burden_rate_g_miss_num_flag = 'Y' Then
1994 			i.burden_rate_g_miss_num_flag := 'N';
1995 			l_burdRt_ch_flag_tab(l_cntr) := 'Y';
1996 			l_burdRt_g_miss_num_flag_tab(l_cntr) := 'N';
1997                     ElsIF i.burden_rate_g_miss_num_flag = 'Y' Then
1998                         l_burdRt_ch_flag_tab(l_cntr) := 'Y';
1999                     End If;
2000 
2001 		    If NVL(l_Revnue_ch_flag_tab(l_cntr),'N') = 'Y'
2002 			and i.bill_rate_g_miss_num_flag = 'Y' Then
2003 			i.bill_rate_g_miss_num_flag := 'N';
2004 			l_billRt_ch_flag_tab(l_cntr) := 'N';
2005 			l_revRt_g_miss_num_flag_tab(l_cntr) := 'N';
2006 		    ElsIF i.bill_rate_g_miss_num_flag = 'Y' Then
2007 			print_msg('setting bill rate change flag to Y due to g_miss_num');
2008                         l_billRt_ch_flag_tab(l_cntr) := 'Y';
2009                     End If;
2010 
2011 		  Else
2012 		     If i.resource_rate_based_flag = 'Y' AND i.rate_based_flag = 'N'  then
2013 			If NVL(l_quantity_ch_flag_tab(l_cntr),'N') = 'Y' Then
2014 				IF i.cost_rate_g_miss_num_flag = 'Y' Then
2015                         		l_costRt_ch_flag_tab(l_cntr) := 'Y';
2016                     		End If;
2017                     		IF i.burden_rate_g_miss_num_flag = 'Y' Then
2018                         		l_burdRt_ch_flag_tab(l_cntr) := 'Y';
2019                     		End If;
2020                     		IF i.bill_rate_g_miss_num_flag = 'Y' Then
2021                         		l_billRt_ch_flag_tab(l_cntr) := 'Y';
2022                     		End If;
2023 		        Else
2024 				l_costRt_ch_flag_tab(l_cntr) := 'N';
2025 				l_burdRt_ch_flag_tab(l_cntr) := 'N';
2026 				l_billRt_ch_flag_tab(l_cntr) := 'N';
2027 			   	l_costRt_g_miss_num_flag_tab(l_cntr) := 'N';
2028 			   	l_burdRt_g_miss_num_flag_tab(l_cntr) := 'N';
2029 			   	l_revRt_g_miss_num_flag_tab(l_cntr) := 'N';
2030 			End If;
2031 		      Elsif i.resource_rate_based_flag = 'N' AND i.rate_based_flag = 'N' Then
2032 				l_costRt_ch_flag_tab(l_cntr) := 'N';
2033                                 l_burdRt_ch_flag_tab(l_cntr) := 'N';
2034                                 l_billRt_ch_flag_tab(l_cntr) := 'N';
2035 				l_costRt_g_miss_num_flag_tab(l_cntr) := 'N';
2036                                 l_burdRt_g_miss_num_flag_tab(l_cntr) := 'N';
2037                                 l_revRt_g_miss_num_flag_tab(l_cntr) := 'N';
2038 		      End If;
2039 		  End If;
2040 		End If; --}
2041 		/* handling g miss nums for the amounts */
2042 	--print_msg('corrected G_MissNumFlgs:Cst['||l_costRt_g_miss_num_flag_tab(l_cntr)||']');
2043 	--print_msg('Burd['||l_burdRt_g_miss_num_flag_tab(l_cntr)||']Bil['||l_revRt_g_miss_num_flag_tab(l_cntr)||']');
2044 	  	EXCEPTION
2045 			WHEN skip_record THEN
2046 				NULL;
2047 		END; --}
2048             END LOOP;
2049 
2050             IF NVL(x_return_status,'S') = 'S' AND l_rowid_tab.COUNT > 0 Then
2051 		IF P_PA_DEBUG_MODE = 'Y' Then
2052                 print_msg('setting the Changed Flags NumofRowsUpd['||l_rowid_tab.COUNT||']');
2053 		End If;
2054 		--/** added this for debug testing
2055 		for i IN l_rowid_tab.FIRST .. l_rowid_tab.LAST loop
2056 		print_msg('Raid['||l_resource_assingment_id_tab(i)||']TxnCur['||l_txn_currency_code_tab(i)||']');
2057 		print_msg('QtyFlag['||l_quantity_ch_flag_tab(i)||']CstFlg['||l_rawCost_ch_flag_tab(i)||']');
2058 		print_msg('CstRtFlg['||l_costRt_ch_flag_tab(i)||']');
2059 		print_msg('BdFlg['||l_burdenCost_ch_flag_tab(i)||']BdRtFlg['||l_burdRt_ch_flag_tab(i)||']');
2060 		print_msg('Rev['||l_Revnue_ch_flag_tab(i)||']BilRtFlg['||l_billRt_ch_flag_tab(i)||']');
2061 		end loop;
2062 		--*/
2063 
2064                 FORALL i IN l_rowid_tab.FIRST .. l_rowid_tab.LAST
2065                    UPDATE  pa_fp_spread_calc_tmp tmp
2066                    SET  tmp.QUANTITY_CHANGED_FLAG      = NVL(l_quantity_ch_flag_tab(i),'N')
2067                     ,tmp.COST_RATE_CHANGED_FLAG   = NVL(l_costRt_ch_flag_tab(i),'N')
2068                     ,tmp.BURDEN_RATE_CHANGED_FLAG = NVL(l_burdRt_ch_flag_tab(i),'N')
2069                     ,tmp.BILL_RATE_CHANGED_FLAG   = NVL(l_billRt_ch_flag_tab(i),'N')
2070                     ,tmp.RAW_COST_CHANGED_FLAG    = NVL(l_rawCost_ch_flag_tab(i),'N')
2071                     ,tmp.BURDEN_COST_CHANGED_FLAG = NVL(l_burdenCost_ch_flag_tab(i),'N')
2072                     ,tmp.REVENUE_CHANGED_FLAG     = NVL(l_Revnue_ch_flag_tab(i),'N')
2073 		    ,tmp.QUANTITY                 = decode(NVL(l_quantity_ch_flag_tab(i),'N'),'Y'
2074 							,l_quantity_tab(i),l_bl_quantity_tab(i))
2075                     ,tmp.BL_QUANTITY          = l_bl_quantity_tab(i)
2076                     ,tmp.BL_TXN_RAW_COST      = l_bl_txn_raw_cost_tab(i)
2077                     ,tmp.BL_TXN_BURDENED_COST     = l_bl_txn_burden_cost_tab(i)
2078                     ,tmp.BL_TXN_REVENUE           = l_bl_txn_revenue_tab(i)
2079                     ,tmp.BL_TXN_INIT_RAW_COST     = l_bl_txn_init_raw_cost_tab(i)
2080                     ,tmp.BL_TXN_INIT_BURDENED_COST = l_bl_txn_init_burden_cost_tab(i)
2081                     ,tmp.BL_TXN_INIT_REVENUE      =l_bl_txn_init_revenue_tab(i)
2082                     ,tmp.BL_INIT_QUANTITY     = l_bl_init_quantity_tab(i)
2083                     ,tmp.BL_COST_RATE         = l_bl_cost_rate_tab(i)
2084                     ,tmp.BL_COST_RATE_OVERRIDE    = l_bl_cost_rate_override_tab(i)
2085                     ,tmp.BL_BURDEN_COST_RATE      = l_bl_burden_cost_rate_tab(i)
2086                     ,tmp.BL_BURDEN_COST_RATE_OVERRIDE = l_bl_burden_rate_override_tab(i)
2087                     ,tmp.BL_BILL_RATE          = l_bl_bill_rate_tab(i)
2088                     ,tmp.BL_BILL_RATE_OVERRIDE     = l_bl_bill_rate_override_tab(i)
2089                     /* Bug fix:4293020 : For rate base resource retain the param value. for non-rate base
2090                      * resource: hard code the cost rate 1 and bill rate to 1 based on the version type
2091                      * Reason: the rates cannot be changed for non-rate base resource
2092                     ,tmp.COST_RATE_OVERRIDE        = decode(l_rate_based_flag_tab(i),'Y',tmp.COST_RATE_OVERRIDE
2093                                            ,decode(g_budget_version_type,'COST',nvl(tmp.COST_RATE_OVERRIDE,1)
2094                                           ,'ALL',nvl(tmp.COST_RATE_OVERRIDE,1),tmp.COST_RATE_OVERRIDE))
2095                     ,tmp.BILL_RATE_OVERRIDE        = decode(l_rate_based_flag_tab(i),'Y',tmp.BILL_RATE_OVERRIDE
2096                                           ,decode(g_budget_version_type,'REVENUE',nvl(tmp.BILL_RATE_OVERRIDE,1)
2097                                          ,tmp.BILL_RATE_OVERRIDE))
2098                     **/
2099                     ,tmp.COST_RATE_OVERRIDE = decode(l_costRt_g_miss_num_flag_tab(i),'Y',NULL
2100 					,decode(NVL(l_costRt_ch_flag_tab(i),'N'),'N',NULL
2101 					,decode(l_rate_based_flag_tab(i),'Y',l_rw_cost_rate_override_tab(i)
2102 					,decode(l_res_rate_based_flag_tab(i),'Y'
2103 						,l_rw_cost_rate_override_tab(i)
2104 						,decode(l_bl_cost_rate_override_tab(i),0,0,1)))))
2105                     ,tmp.BILL_RATE_OVERRIDE = decode(l_revRt_g_miss_num_flag_tab(i),'Y',NULL
2106 					,decode(NVL(l_billRt_ch_flag_tab(i),'N'),'N',NULL
2107 					,decode(l_rate_based_flag_tab(i),'Y',l_bill_rate_override_tab(i)
2108                                         ,decode(g_budget_version_type,'REVENUE'
2109 					,decode(l_res_rate_based_flag_tab(i),'Y',l_bill_rate_override_tab(i),1)
2110 						,'ALL',l_bill_rate_override_tab(i)
2111 						,l_bill_rate_override_tab(i)))))
2112 		    ,tmp.BILL_MARKUP_PERCENTAGE   = decode(l_revRt_g_miss_num_flag_tab(i),'Y',NULL,l_bl_txn_markup_tab(i))
2113 		    ,tmp.burden_cost_rate_override  = decode(l_burdRt_g_miss_num_flag_tab(i),'Y',NULL
2114 						        ,decode(NVL(l_burdRt_ch_flag_tab(i),'N'),'N',NULL
2115 							   ,l_b_cost_rate_override_tab(i)))
2116 		    ,tmp.cost_rate_g_miss_num_flag  = l_costRt_g_miss_num_flag_tab(i)
2117                     ,tmp.burden_rate_g_miss_num_flag = l_burdRt_g_miss_num_flag_tab(i)
2118                     ,tmp.bill_rate_g_miss_num_flag = l_revRt_g_miss_num_flag_tab(i)
2119 		    ,tmp.rate_based_flag	= l_rate_based_flag_tab(i)
2120 		    ,tmp.resource_rate_based_flag = l_res_rate_based_flag_tab(i)
2121 		    ,tmp.resource_uom	= l_resource_uom_tab(i)
2122 		    /* added for perf impr: removed loop and execution of cursor */
2123                     ,tmp.txn_raw_cost = l_raw_cost_tab(i)
2124                     ,tmp.txn_burdened_cost = l_burdened_cost_tab(i)
2125                     ,tmp.txn_revenue = l_revenue_tab(i)
2126                     ,tmp.cost_rate = l_raw_cost_rate_tab(i)
2127                     ,tmp.burden_cost_rate = l_b_cost_rate_tab(i)
2128                     ,tmp.bill_rate = l_bill_rate_tab(i)
2129 		    /* bug fix: 5726773 */
2130  	            ,tmp.NEG_QUANTITY_CHANGE_FLAG  = l_negQty_Change_flag_tab(i)
2131  	            ,tmp.NEG_RAWCOST_CHANGE_FLAG  = l_negRawCst_Change_flag_tab(i)
2132  	            ,tmp.NEG_BURDEN_CHANGE_FALG =  l_neg_BurdCst_Change_flag_tab(i)
2133  	            ,tmp.NEG_REVENUE_CHANGE_FLAG  = l_neg_revChange_flag_tab(i)
2134                    WHERE tmp.rowid = l_rowid_tab(i) ;
2135 
2136             End IF;
2137 
2138         END IF;  --}
2139 	IF P_PA_DEBUG_MODE = 'Y' Then
2140         	print_msg('End of Compare_bdgtLine_Values api ReturnStatus['||x_return_status||']');
2141 	End If;
2142 
2143 EXCEPTION
2144         WHEN OTHERS THEN
2145                 x_return_status := 'U';
2146                 x_msg_data := sqlcode||sqlerrm;
2147                 print_msg('Failed in Compare_bdgtLine_Values API'||x_msg_data);
2148                  fnd_msg_pub.add_exc_msg
2149                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
2150                  ,p_procedure_name => 'Compare_bdgtLine_Values');
2151                 RAISE;
2152 
2153 END Compare_bdgtLine_Values;
2154 
2155 /* IPM Changes: This is the new api created to handle to massag the data before calling the spread
2156  * for non-rate based resources.
2157  * This API sets the rate overrides for a non-rate base resources when any of the planning
2158  * resource attributes such as spread curve, plan dates, etc changes and when user perform
2159  * the distribute(re-spread) action from periodic page.
2160  * Test Cases: When user enters say revenue only for a planning resource
2161  * from periodic page and presses distribute button. The process should distribute revenue only
2162  * it should not derive raw cost or burden cost for all other feilds.
2163  */
2164 
2165 PROCEDURE process_NonRtBsRec_forSprd
2166 		(p_budget_version_id              IN  Number
2167                 ,p_source_context                IN  pa_fp_res_assignments_tmp.source_context%TYPE
2168                 ,x_return_status                 OUT NOCOPY VARCHAR2
2169                 ) IS
2170 
2171         CURSOR cur_NonRtBsRecs IS
2172         SELECT tmp.resource_assignment_id
2173                 ,tmp.txn_currency_code
2174                 ,tmp.start_date
2175                 ,tmp.end_date
2176                 ,ra.resource_rate_based_flag
2177                 ,ra.rate_based_flag
2178                 ,tmp.raw_cost_changed_flag
2179                 ,tmp.burden_cost_changed_flag
2180                 ,tmp.revenue_changed_flag
2181                 ,tmp.revenue_only_entered_flag
2182                 ,tmp.burden_only_entered_flag
2183 		,tmp.bl_txn_raw_cost
2184 		,tmp.bl_txn_burdened_cost
2185 		,tmp.bl_txn_revenue
2186 		,tmp.BL_TXN_INIT_RAW_COST
2187                 ,tmp.BL_TXN_INIT_BURDENED_COST
2188                 ,tmp.BL_TXN_INIT_REVENUE
2189                 ,NVL(tmp.RE_SPREAD_AMTS_FLAG,'N')  re_spread_amts_flag
2190                 ,NVL(tmp.SP_CURVE_CHANGE_FLAG,'N')  sp_curve_change_flag
2191                 ,NVL(tmp.PLAN_DATES_CHANGE_FLAG,'N') plan_dates_change_flag
2192                 ,NVL(tmp.SP_FIX_DATE_CHANGE_FLAG,'N') spfix_date_change_flag
2193                 ,NVL(tmp.MFC_COST_CHANGE_FLAG,'N') mfc_cost_change_flag
2194                 ,NVL(tmp.RLM_ID_CHANGE_FLAG,'N') rlm_id_change_flag
2195                 ,NVL(tmp.system_reference_var1 ,'N') ra_in_multi_cur_flag
2196         FROM pa_fp_spread_calc_tmp tmp
2197                 ,pa_resource_assignments ra
2198         WHERE tmp.budget_version_id = p_budget_version_id
2199         AND   tmp.resource_assignment_id = ra.resource_assignment_id
2200         AND   ra.rate_based_flag = 'N'
2201         AND   ( (NVL(tmp.bl_txn_raw_cost,0) = nvl(tmp.bl_quantity,0)
2202 		and NVL(tmp.bl_txn_raw_cost,0) <> 0 )
2203 	        OR
2204 		(NVL(tmp.bl_txn_revenue,0) = nvl(tmp.bl_quantity,0)
2205 		 and NVL(tmp.bl_txn_revenue,0) <> 0)
2206 	      )
2207 	 and  (nvl(tmp.bl_txn_raw_cost,0) - nvl(tmp.bl_txn_init_raw_cost,0)) <> 0 --Added for bug 6842835
2208 	AND  (NVL(tmp.RE_SPREAD_AMTS_FLAG,'N')  = 'Y'
2209               OR NVL(tmp.SP_CURVE_CHANGE_FLAG,'N')  = 'Y'
2210               OR NVL(tmp.PLAN_DATES_CHANGE_FLAG,'N') = 'Y'
2211               OR NVL(tmp.SP_FIX_DATE_CHANGE_FLAG,'N') = 'Y'
2212               --OR NVL(tmp.MFC_COST_CHANGE_FLAG,'N') = 'Y'
2213               OR NVL(tmp.RLM_ID_CHANGE_FLAG,'N') = 'Y'
2214 	     );
2215 
2216         l_resource_assignment_tab       pa_plsql_datatypes.NumTabTyp;
2217         l_txn_currency_code_tab         pa_plsql_datatypes.Char50TabTyp;
2218         l_start_date_tab                pa_plsql_datatypes.DateTabTyp;
2219         l_end_date_tab                  pa_plsql_datatypes.DateTabTyp;
2220         l_bilRtSetFlag_Tab              pa_plsql_datatypes.Char1TabTyp;
2221         l_resetamts_Tab         pa_plsql_datatypes.Char1TabTyp;
2222         l_bl_resprd_flag_tab            pa_plsql_datatypes.Char1TabTyp;
2223 	l_cost_rate_override_tab        pa_plsql_datatypes.NumTabTyp;
2224 	l_burden_rate_override_tab      pa_plsql_datatypes.NumTabTyp;
2225 	l_bill_rate_override_tab        pa_plsql_datatypes.NumTabTyp;
2226         l_Cntr                          INTEGER := 0;
2227 
2228 
2229 BEGIN
2230         x_return_status := 'S';
2231         l_resource_assignment_tab.delete;
2232         l_txn_currency_code_tab.delete;
2233         l_start_date_tab.delete;
2234         l_end_date_tab.delete;
2235         l_bilRtSetFlag_Tab.delete;
2236         l_bl_resprd_flag_tab.delete;
2237         l_resetAmts_Tab.delete;
2238 	l_cost_rate_override_tab.delete;
2239         l_burden_rate_override_tab.delete;
2240         l_bill_rate_override_tab.delete;
2241         l_Cntr := 0;
2242         IF g_wp_version_flag = 'N' Then
2243 		IF P_PA_DEBUG_MODE = 'Y' Then
2244 		print_msg('Entered process_NonRtBsRec_forSprd API');
2245 		End If;
2246 		FOR i IN cur_NonRtBsRecs LOOP
2247 		   l_Cntr := l_Cntr +1 ;
2248 		   l_resource_assignment_tab(l_Cntr) := i.resource_assignment_id;
2249                    l_txn_currency_code_tab(l_Cntr) := i.txn_currency_code;
2250                    l_start_date_tab(l_Cntr) := i.start_date;
2251                    l_end_date_tab(l_Cntr) := i.end_date;
2252 		   l_cost_rate_override_tab(l_Cntr) := NULL;
2253         	   l_burden_rate_override_tab(l_Cntr) := NULL;
2254         	   l_bill_rate_override_tab(l_Cntr) := NULL;
2255 		   If g_budget_version_type = 'ALL' Then
2256 			If i.bl_txn_raw_cost is NULL Then
2257 			   -- revenue only record
2258 			   l_cost_rate_override_tab(l_Cntr) := 0;
2259 			   l_burden_rate_override_tab(l_Cntr) := 0;
2260 			   l_bill_rate_override_tab(l_Cntr) := 1;
2261 			Else
2262 			   l_cost_rate_override_tab(l_Cntr) := 1;
2263                            l_burden_rate_override_tab(l_Cntr) :=
2264 				(nvl(i.bl_txn_burdened_cost,0) - nvl(i.bl_txn_init_burdened_cost,0))/
2265 				 (nvl(i.bl_txn_raw_cost,0) - nvl(i.bl_txn_init_raw_cost,0));
2266 			   If i.bl_txn_revenue is NOT NULL Then
2267                               l_bill_rate_override_tab(l_Cntr) :=
2268 				(nvl(i.bl_txn_revenue,0) - nvl(i.bl_txn_init_revenue,0))/
2269 				 (nvl(i.bl_txn_raw_cost,0) - nvl(i.bl_txn_init_raw_cost,0));
2270 			   End If;
2271 			End If;
2272 		   Elsif g_budget_version_type = 'COST' Then
2273 			   l_cost_rate_override_tab(l_Cntr) := 1;
2274                            l_burden_rate_override_tab(l_Cntr) :=
2275                                 (nvl(i.bl_txn_burdened_cost,0) - nvl(i.bl_txn_init_burdened_cost,0))/
2276                                  (nvl(i.bl_txn_raw_cost,0) - nvl(i.bl_txn_init_raw_cost,0));
2277 		   Elsif g_budget_version_type = 'REVENUE' Then
2278 			   l_bill_rate_override_tab(l_Cntr) := 1;
2279 		   End If;
2280 		END LOOP;
2281 	End If;
2282 
2283 	If l_resource_assignment_tab.COUNT > 0 Then
2284 		FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
2285                   UPDATE pa_resource_asgn_curr rtx
2286                   SET   rtx.txn_raw_cost_rate_override = l_cost_rate_override_tab(i)
2287                         ,rtx.txn_burden_cost_rate_override = l_burden_rate_override_tab(i)
2288                         ,rtx.txn_bill_rate_override = l_bill_rate_override_tab(i)
2289                    WHERE rtx.resource_assignment_id = l_resource_assignment_tab(i)
2290                    AND rtx.txn_currency_code = l_txn_currency_code_tab(i);
2291 
2292 		FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
2293                 UPDATE pa_budget_lines bl
2294                 SET bl.txn_bill_rate_override = l_bill_rate_override_tab(i)
2295                     ,bl.txn_cost_rate_override = l_cost_rate_override_tab(i)
2296                     ,bl.burden_cost_rate_override = l_burden_rate_override_tab(i)
2297                 WHERE bl.resource_assignment_id = l_resource_assignment_tab(i)
2298                 AND  bl.txn_currency_code = l_txn_currency_code_tab(i);
2299 
2300 		FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
2301                    UPDATE /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP_N1) */ pa_fp_spread_calc_tmp tmp
2302                    SET  tmp.cost_rate_override = l_cost_rate_override_tab(i)
2303 			,tmp.burden_cost_rate_override = l_burden_rate_override_tab(i)
2304 			,tmp.bill_rate_override = l_bill_rate_override_tab(i)
2305                    WHERE tmp.resource_assignment_id = l_resource_assignment_tab(i)
2306                    AND  tmp.txn_currency_code = l_txn_currency_code_tab(i);
2307 
2308 	End If;
2309 
2310 
2311 EXCEPTION
2312         WHEN OTHERS THEN
2313                 x_return_status := 'U';
2314                 print_msg('Failed in process_NonRtBsRec_forSprd'||sqlcode||sqlerrm);
2315                  fnd_msg_pub.add_exc_msg
2316                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
2317                  ,p_procedure_name => 'process_NonRtBsRec_forSprd');
2318                 RAISE;
2319 END process_NonRtBsRec_forSprd;
2320 
2321 
2322 /* This API is newly added to handle the mixture of revenue only in some priodic lines
2323  * and cost and revenue together in some periodic lines for ALL (cost and revenue together)
2324  * version.
2325  * Test Case1: When user enters raw cost or burden cost for a planning resource
2326  *             that has revenue only entered earlier.
2327  * Test case2: When planning resource attribute changes / re-spreads for
2328  *             a mixture of revenue only and cost and revenue lines
2329  */
2330 PROCEDURE pre_process_Revenue_Only_Recs
2331 		(p_budget_version_id              IN  Number
2332                 ,p_source_context                IN  pa_fp_res_assignments_tmp.source_context%TYPE
2333                 ,x_return_status                 OUT NOCOPY VARCHAR2
2334                 ) IS
2335 
2336 	CURSOR cur_RevOnlyRecs IS
2337 	SELECT tmp.resource_assignment_id
2338 		,tmp.txn_currency_code
2339 		,tmp.start_date
2340 		,tmp.end_date
2341 		,ra.resource_rate_based_flag
2342 		,ra.rate_based_flag
2343 		,tmp.raw_cost_changed_flag
2344 		,tmp.burden_cost_changed_flag
2345 		,tmp.revenue_changed_flag
2346 		,tmp.revenue_only_entered_flag
2347 		,tmp.burden_only_entered_flag
2348 		,tmp.txn_raw_cost
2349 		,tmp.txn_burdened_cost
2350 		,tmp.txn_revenue
2351 		,tmp.BL_TXN_INIT_RAW_COST
2352                 ,tmp.BL_TXN_INIT_BURDENED_COST
2353                 ,tmp.BL_TXN_INIT_REVENUE
2354 		,tmp.bl_txn_raw_cost
2355 		,tmp.bl_quantity
2356 		,NVL(tmp.RE_SPREAD_AMTS_FLAG,'N')  re_spread_amts_flag
2357                 ,NVL(tmp.SP_CURVE_CHANGE_FLAG,'N')  sp_curve_change_flag
2358                 ,NVL(tmp.PLAN_DATES_CHANGE_FLAG,'N') plan_dates_change_flag
2359                 ,NVL(tmp.SP_FIX_DATE_CHANGE_FLAG,'N') spfix_date_change_flag
2360                 ,NVL(tmp.MFC_COST_CHANGE_FLAG,'N') mfc_cost_change_flag
2361 		,NVL(tmp.RLM_ID_CHANGE_FLAG,'N') rlm_id_change_flag
2362 		,NVL(tmp.system_reference_var1 ,'N') ra_in_multi_cur_flag
2363 		,NVL(tmp.DELETE_BL_FLAG,'N') delete_bl_flag
2364 	FROM pa_fp_spread_calc_tmp tmp
2365 		,pa_resource_assignments ra
2366 	WHERE tmp.budget_version_id = p_budget_version_id
2367 	AND   tmp.resource_assignment_id = ra.resource_assignment_id
2368 	AND   nvl(ra.rate_based_flag,'N') = 'N'
2369 	AND   NVL(tmp.quantity_changed_flag,'N') = 'N'
2370 	AND   NVL(tmp.bl_txn_raw_cost,0) <> 0
2371 	AND   NVL(tmp.bl_txn_raw_cost,0) <> nvl(tmp.bl_quantity,0)
2372 	AND   NVL(tmp.revenue_only_entered_flag,'N') <> 'Y'
2373 	/*AND   NVL(tmp.RE_SPREAD_AMTS_FLAG,'N')  = 'N'
2374         AND   NVL(tmp.SP_CURVE_CHANGE_FLAG,'N')  = 'N'
2375         AND   NVL(tmp.PLAN_DATES_CHANGE_FLAG,'N') = 'N'
2376         AND   NVL(tmp.SP_FIX_DATE_CHANGE_FLAG,'N') = 'N'
2377         AND   NVL(tmp.RLM_ID_CHANGE_FLAG,'N') = 'N'
2378 	*/
2379 	AND   NVL(tmp.DELETE_BL_FLAG,'N') = 'N'
2380 	AND   EXISTS ( select null
2381 			from pa_budget_lines bl
2382 			where bl.resource_assignment_id = tmp.resource_assignment_id
2383 			and   bl.txn_currency_code = tmp.txn_currency_code
2384 			and   ((p_source_context = 'BUDGET_LINE'
2385 				and bl.start_date between tmp.start_date and tmp.end_date)
2386 				OR
2387 				p_source_context <> 'BUDGET_LINE'
2388 				)
2389 		    );
2390 
2391     	l_resource_assignment_tab   	pa_plsql_datatypes.NumTabTyp;
2392     	l_txn_currency_code_tab     	pa_plsql_datatypes.Char50TabTyp;
2393     	l_start_date_tab             	pa_plsql_datatypes.DateTabTyp;
2394     	l_end_date_tab             	pa_plsql_datatypes.DateTabTyp;
2395 	l_bilRtSetFlag_Tab   		pa_plsql_datatypes.Char1TabTyp;
2396 	l_resetamts_Tab		pa_plsql_datatypes.Char1TabTyp;
2397 	l_bl_resprd_flag_tab            pa_plsql_datatypes.Char1TabTyp;
2398 	l_Cntr				INTEGER := 0;
2399 	l_cost_rate_override_tab        pa_plsql_datatypes.NumTabTyp;
2400         l_burden_rate_override_tab      pa_plsql_datatypes.NumTabTyp;
2401         l_bill_rate_override_tab        pa_plsql_datatypes.NumTabTyp;
2402 
2403 BEGIN
2404 	x_return_status := 'S';
2405 	IF P_PA_DEBUG_MODE = 'Y' Then
2406 	print_msg('1: Inside pre_process_Revenue_Only_Recs api');
2407 	End If;
2408 	l_resource_assignment_tab.delete;
2409         l_txn_currency_code_tab.delete;
2410         l_start_date_tab.delete;
2411         l_end_date_tab.delete;
2412         l_bilRtSetFlag_Tab.delete;
2413 	l_bl_resprd_flag_tab.delete;
2414 	l_resetAmts_Tab.delete;
2415 	l_cost_rate_override_tab.delete;
2416         l_burden_rate_override_tab.delete;
2417         l_bill_rate_override_tab.delete;
2418 	l_Cntr := 0;
2419 	IF g_wp_version_flag = 'N' AND g_budget_version_type = 'ALL' Then
2420 	   FOR i IN cur_RevOnlyRecs LOOP
2421 		--print_msg('inside loop: rawCost['||i.bl_txn_raw_cost||']qty['||i.bl_quantity||']');
2422 		l_Cntr := l_Cntr +1 ;
2423 		If (NVL(i.re_spread_amts_flag,'N' ) = 'Y'
2424                    	OR i.sp_curve_change_flag = 'Y'
2425                		OR i.spfix_date_change_flag = 'Y'
2426                		OR i.rlm_id_change_flag = 'Y'
2427                    	OR (nvl(i.ra_in_multi_cur_flag,'N') = 'N'
2428 			   AND i.plan_dates_change_flag = 'Y') ) Then
2429 			--print_msg('1.1: Resetting Amnts and Rate overrides Resource attribute changes');
2430 			l_resetAmts_Tab(l_Cntr) := 'Y';
2431                         l_resource_assignment_tab(l_Cntr) := i.resource_assignment_id;
2432                         l_txn_currency_code_tab(l_Cntr) := i.txn_currency_code;
2433                         l_start_date_tab(l_Cntr) := i.start_date;
2434                         l_end_date_tab(l_Cntr) := i.end_date;
2435 
2436 		Elsif (NVL(i.raw_cost_changed_flag,'N') = 'Y'
2437 		   OR (nvl(i.burden_cost_changed_flag,'N') = 'Y'
2438 			and nvl(i.burden_only_entered_flag,'N') = 'Y')) Then
2439 			--print_msg('1.2:Resetting bill rates for mix of rev and cost and reve lines ');
2440 			l_bilRtSetFlag_Tab(l_Cntr) := 'Y';
2441 			l_resource_assignment_tab(l_Cntr) := i.resource_assignment_id;
2442 			l_txn_currency_code_tab(l_Cntr) := i.txn_currency_code;
2443 			l_start_date_tab(l_Cntr) := i.start_date;
2444 			l_end_date_tab(l_Cntr) := i.end_date;
2445 			l_bl_resprd_flag_tab(l_Cntr) := 'Y';
2446 			l_cost_rate_override_tab(l_Cntr) := NULL;
2447                    	l_burden_rate_override_tab(l_Cntr) := NULL;
2448                    	l_bill_rate_override_tab(l_Cntr) := NULL;
2449 			If nvl(i.burden_cost_changed_flag,'N') = 'Y' Then
2450 				l_burden_rate_override_tab(l_Cntr) :=
2451 					(NVL(i.txn_burdened_cost,0)-nvl(i.bl_txn_init_burdened_cost,0))/
2452 					(nvl(i.txn_raw_cost,0) - nvl(i.bl_txn_init_raw_cost,0));
2453 			End If;
2454 			If nvl(i.revenue_changed_flag,'N') = 'Y' Then
2455 				l_bill_rate_override_tab(l_Cntr) :=
2456 					(nvl(i.txn_revenue,0) - nvl(i.bl_txn_init_revenue,0))/
2457 					(nvl(i.txn_raw_cost,0) - nvl(i.bl_txn_init_raw_cost,0));
2458 			End If;
2459 		End If;
2460 	   END LOOP;
2461 
2462 	   /* rederive the budget rate overrides on the budget lines to retain the amounts
2463 	    * in case of re spread, planning dates change etc
2464 	    */
2465 	   If p_source_context = 'RESOURCE_ASSIGNMENT' and l_resetAmts_Tab.COUNT > 0 Then --{
2466 		IF P_PA_DEBUG_MODE = 'Y' Then
2467 		print_msg('1.3: Upd Resource asgn cur with rate overrides ');
2468 		End If;
2469 		FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
2470                   UPDATE pa_resource_asgn_curr rtx
2471                   SET   (rtx.txn_raw_cost_rate_override
2472 			,rtx.txn_burden_cost_rate_override
2473 			,rtx.txn_bill_rate_override) =
2474                         (select decode(sum(nvl(bl.txn_raw_cost,0) - nvl(bl.txn_init_raw_cost,0)),0,rtx.txn_raw_cost_rate_override,1)
2475 				,decode(sum(nvl(bl.txn_raw_cost,0) - nvl(bl.txn_init_raw_cost,0)),0,0
2476 					,(sum(nvl(bl.txn_burdened_cost,0) - nvl(bl.txn_init_burdened_cost,0))/
2477 					(sum(nvl(bl.txn_raw_cost,0) - nvl(bl.txn_init_raw_cost,0)))))
2478 				,decode(sum(nvl(bl.txn_revenue,0)-nvl(bl.txn_init_revenue,0)),0,rtx.txn_bill_rate_override
2479 					,(sum(nvl(bl.txn_revenue,0)-nvl(bl.txn_init_revenue,0)))/
2480 					 (sum(nvl(bl.txn_raw_cost,0) - nvl(bl.txn_init_raw_cost,0))))
2481                         from pa_budget_lines bl
2482                         where bl.resource_assignment_id = rtx.resource_assignment_id
2483                         and bl.txn_currency_code = rtx.txn_currency_code
2484                         )
2485                    WHERE rtx.resource_assignment_id = l_resource_assignment_tab(i)
2486                    AND rtx.txn_currency_code = l_txn_currency_code_tab(i)
2487                    AND EXISTS (select null
2488 				from pa_budget_lines bl1
2489 				where bl1.resource_assignment_id = rtx.resource_assignment_id
2490 				and bl1.txn_currency_code = rtx.txn_currency_code
2491 				);
2492 
2493 		/* Now spread the raw cost: so copy raw cost to quantity param */
2494 		IF P_PA_DEBUG_MODE = 'Y' Then
2495 		print_msg('1.4: Update spread calc tmp with quantity = raw cost');
2496 		End If;
2497 		FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
2498                    UPDATE /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP_N1) */ pa_fp_spread_calc_tmp tmp
2499                    SET tmp.quantity =
2500 				(select decode(sum(bl.txn_raw_cost),NULL,sum(bl.txn_revenue),sum(bl.txn_raw_cost))
2501 				from pa_budget_lines bl
2502                         	where bl.resource_assignment_id = tmp.resource_assignment_id
2503                         	and bl.txn_currency_code = tmp.txn_currency_code
2504 				)
2505                    WHERE tmp.resource_assignment_id = l_resource_assignment_tab(i)
2506                    AND  tmp.txn_currency_code = l_txn_currency_code_tab(i)
2507 		   AND EXISTS (select null
2508                                 from pa_budget_lines bl1
2509                                 where bl1.resource_assignment_id = tmp.resource_assignment_id
2510                                 and bl1.txn_currency_code = tmp.txn_currency_code
2511                                 );
2512 
2513 		--print_msg('1.5: update budget lines set override rates to null');
2514 		FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
2515                 UPDATE pa_budget_lines bl
2516                 SET bl.txn_bill_rate_override = null
2517 		    ,bl.burden_cost_rate_override = null
2518                     ,bl.txn_cost_rate_override = 1
2519                 WHERE bl.resource_assignment_id = l_resource_assignment_tab(i)
2520                 AND  bl.txn_currency_code = l_txn_currency_code_tab(i);
2521 	   End If; --} // end of sprd processing
2522 
2523 	   If l_bilRtSetFlag_Tab.count > 0 Then --{
2524 		--print_msg('1.1.1: Update budget lines to set override rates');
2525 		FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
2526 		UPDATE pa_budget_lines bl
2527 		SET bl.txn_bill_rate_override = l_bill_rate_override_tab(i)
2528 			/* bug fix: 5089153 stamp bill rate override only if revenue is changed along with cost
2529 			decode(bl.txn_cost_rate_override,0
2530 			,decode(bl.txn_bill_rate_override,1,l_bill_rate_override_tab(i)
2531 				,nvl(l_bill_rate_override_tab(i),bl.txn_bill_rate_override))
2532 			,decode(bl.txn_bill_rate_override,1,l_bill_rate_override_tab(i)
2533 				,nvl(l_bill_rate_override_tab(i),bl.txn_bill_rate_override))) */
2534 		    ,bl.txn_cost_rate_override = 1
2535 		    ,bl.burden_cost_rate_override =
2536 			decode(bl.txn_cost_rate_override,0,l_burden_rate_override_tab(i)
2537 				,NULL,l_burden_rate_override_tab(i)
2538 				,NVL(l_burden_rate_override_tab(i),bl.burden_cost_rate_override))
2539 		WHERE bl.resource_assignment_id = l_resource_assignment_tab(i)
2540 		AND  bl.txn_currency_code = l_txn_currency_code_tab(i)
2541 		AND  ((p_source_context = 'BUDGET_LINE'
2542                        and bl.start_date between l_start_date_tab(i) and l_end_date_tab(i))
2543                        OR
2544                        p_source_context <> 'BUDGET_LINE'
2545                      );
2546 
2547 		If p_source_context <> 'BUDGET_LINE' Then
2548 		  --print_msg('1.1.2: update resource asgn cur to set rate overrides');
2549 		  FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
2550 		  UPDATE pa_resource_asgn_curr rtx
2551 		  SET (rtx.txn_bill_rate_override
2552 			,rtx.txn_burden_cost_rate_override ) =
2553 			(select decode(rtx.txn_bill_rate_override,NULL
2554 				  ,nvl(l_bill_rate_override_tab(i),rtx.txn_bill_rate_override)
2555 				,decode((nvl(tmp.bl_txn_raw_cost,0)-nvl(tmp.bl_txn_init_raw_cost,0)),0
2556 				 ,nvl(l_bill_rate_override_tab(i),rtx.txn_bill_rate_override)
2557 			          ,((tmp.txn_revenue - nvl(tmp.bl_txn_init_revenue,0))/
2558 				  (nvl(tmp.bl_txn_raw_cost,0)-nvl(tmp.bl_txn_init_raw_cost,0)))))
2559 			  ,decode(nvl(tmp.burden_cost_changed_flag,'N'), 'Y'
2560 					,nvl(l_burden_rate_override_tab(i),rtx.txn_burden_cost_rate_override))
2561 		  	from pa_fp_spread_calc_tmp tmp
2562 			where tmp.resource_assignment_id = rtx.resource_assignment_id
2563 			and tmp.txn_currency_code = rtx.txn_currency_code
2564 			and tmp.raw_cost_changed_flag = 'Y'
2565 			)
2566 		   WHERE rtx.resource_assignment_id = l_resource_assignment_tab(i)
2567 		   AND rtx.txn_currency_code = l_txn_currency_code_tab(i)
2568 		   ;
2569 
2570 		End If;
2571 		--print_msg('1.1.3: update spread calc tmp to rate overrides');
2572 		   FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
2573 		   UPDATE /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP_N1) */ pa_fp_spread_calc_tmp tmp
2574 		   SET tmp.re_spread_amts_flag =
2575 				decode(tmp.re_spread_amts_flag,'Y','Y',l_bl_resprd_flag_tab(i))
2576 			,tmp.delete_bl_flag = decode(tmp.delete_bl_flag,'Y','Y'
2577 				,decode(l_bl_resprd_flag_tab(i),'Y','Y',tmp.delete_bl_flag))
2578 			,tmp.bill_rate_override =
2579 				nvl(l_bill_rate_override_tab(i),tmp.bill_rate_override)
2580 			,tmp.burden_cost_rate_override =
2581 				nvl(l_burden_rate_override_tab(i),tmp.burden_cost_rate_override)
2582 			/* bug fix:5463690 */
2583  	                ,tmp.NEG_QUANTITY_CHANGE_FLAG  = decode(nvl(l_bl_resprd_flag_tab(i),'N'),'Y','N'
2584  	                                                         ,tmp.NEG_QUANTITY_CHANGE_FLAG)
2585  	                ,tmp.NEG_RAWCOST_CHANGE_FLAG = decode(nvl(l_bl_resprd_flag_tab(i),'N'),'Y','N'
2586  	                                                         ,tmp.NEG_RAWCOST_CHANGE_FLAG)
2587  	                ,tmp.NEG_BURDEN_CHANGE_FALG = decode(nvl(l_bl_resprd_flag_tab(i),'N'),'Y','N'
2588  	                                                         ,tmp.NEG_BURDEN_CHANGE_FALG)
2589  	                ,tmp.NEG_REVENUE_CHANGE_FLAG = decode(nvl(l_bl_resprd_flag_tab(i),'N'),'Y','N'
2590  	                                                         ,tmp.NEG_REVENUE_CHANGE_FLAG)
2591 		   WHERE tmp.resource_assignment_id = l_resource_assignment_tab(i)
2592                    AND  tmp.txn_currency_code = l_txn_currency_code_tab(i)
2593                    AND  ((p_source_context = 'BUDGET_LINE'
2594                        and tmp.start_date = l_start_date_tab(i) )
2595                        OR
2596                        p_source_context <> 'BUDGET_LINE'
2597                      );
2598 
2599 	   End If; --}
2600 	End If;
2601 EXCEPTION
2602         WHEN OTHERS THEN
2603                 x_return_status := 'U';
2604                 print_msg('Failed in pre_process_Revenue_Only_RecsAPI'||sqlcode||sqlerrm);
2605                  fnd_msg_pub.add_exc_msg
2606                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
2607                  ,p_procedure_name => 'pre_process_Revenue_Only_Recs');
2608                 RAISE;
2609 END pre_process_Revenue_Only_Recs;
2610 
2611 /* This api is added as an IPM enhancement request: For a rate based planning transaction if no quantity is passed
2612  * then mark the resource as a Non-Rate planning transaction, Again when user enters quantity and or rates
2613  * revert back the Non-rate base to rate base flag
2614  */
2615 PROCEDURE Reset_ratebased_pltrxns(
2616                 p_budget_version_id              IN  Number
2617                 ,p_source_context                IN  pa_fp_res_assignments_tmp.source_context%TYPE
2618                 ,x_return_status                 OUT NOCOPY VARCHAR2
2619                 ) IS
2620 
2621     l_resource_assignment_tab   pa_plsql_datatypes.NumTabTyp;
2622     l_txn_currency_code_tab     pa_plsql_datatypes.Char50TabTyp;
2623     l_start_date_tab             pa_plsql_datatypes.DateTabTyp;
2624     l_end_date_tab               pa_plsql_datatypes.DateTabTyp;
2625     l_period_name_tab            pa_plsql_datatypes.Char50TabTyp;
2626     l_quantity_tab              pa_plsql_datatypes.NumTabTyp;
2627     l_raw_cost_tab              pa_plsql_datatypes.NumTabTyp;
2628     l_burden_cost_tab           pa_plsql_datatypes.NumTabTyp;
2629     l_revenue_tab               pa_plsql_datatypes.NumTabTyp;
2630     l_revenue_only_flag_tab     pa_plsql_datatypes.Char1TabTyp;
2631     l_burden_only_flag_tab     pa_plsql_datatypes.Char1TabTyp;
2632     l_reset_rate_based_flag_tab pa_plsql_datatypes.Char1TabTyp;
2633     l_bd_cost_rate_override_tab pa_plsql_datatypes.NumTabTyp;
2634     l_rw_cost_rate_override_tab pa_plsql_datatypes.NumTabTyp;
2635     l_bill_rate_override_tab    pa_plsql_datatypes.NumTabTyp;
2636     l_mark_non_rate_base_flag   Varchar2(1);
2637     l_exists_flag               Varchar2(1);
2638     l_tbl_counter               Number;
2639     l_start_date            DATE;
2640     l_end_date          DATE;
2641     l_uom_tab			pa_plsql_datatypes.Char30TabTyp;
2642 	l_rwRtSetFlag_Tab	pa_plsql_datatypes.Char1TabTyp;
2643            l_bilRtSetFlag_Tab	pa_plsql_datatypes.Char1TabTyp;
2644 	l_bdRtSetFlag_tab	pa_plsql_datatypes.Char1TabTyp;
2645 	l_reCalcbdRt_Tab	pa_plsql_datatypes.Char1TabTyp;
2646         l_reCalcBilRt_Tab	pa_plsql_datatypes.Char1TabTyp;
2647 	l_costRt_g_miss_num_flag_tab pa_plsql_datatypes.Char1TabTyp;
2648         l_burdRt_g_miss_num_flag_tab pa_plsql_datatypes.Char1TabTyp;
2649         l_revRt_g_miss_num_flag_tab  pa_plsql_datatypes.Char1TabTyp;
2650 
2651     Cursor cur_ra IS
2652     SELECT tmp.resource_assignment_id
2653         ,tmp.txn_currency_code
2654         ,tmp.quantity
2655         ,tmp.txn_raw_cost
2656         ,tmp.txn_burdened_cost
2657         ,tmp.txn_revenue
2658         ,g_budget_version_type  version_type
2659         ,tmp.start_date
2660         ,tmp.end_date
2661         ,rlm.alias
2662         ,g_budget_version_name  version_name
2663         ,tmp.bl_quantity
2664 	,tmp.bl_txn_raw_cost
2665 	,tmp.bl_cost_rate_override bl_rw_cost_rate
2666 	,tmp.bl_burden_cost_rate_override bl_burd_rate
2667 	,tmp.bl_bill_rate_override bl_bill_rate
2668 	,tmp.cost_rate_override
2669 	,tmp.burden_cost_rate_override
2670 	,tmp.bill_rate_override
2671 	,tmp.bl_init_quantity  		init_quantity
2672 	,tmp.bl_txn_init_raw_cost 	txn_init_raw_cost
2673 	,tmp.bl_txn_init_burdened_cost 	txn_init_burdened_cost
2674 	,tmp.bl_txn_init_revenue	txn_init_revenue
2675         ,NVL(ra.resource_rate_based_flag,'N') resource_rate_based_flag
2676 	,NVL(ra.rate_based_flag ,'N') rate_based_flag
2677 	,rlm.unit_of_measure UOM
2678 	,ra.unit_of_measure currentUOM
2679 	,NVL(tmp.quantity_changed_flag,'N') quantity_changed_flag
2680 	,NVL(tmp.cost_rate_changed_flag,'N') cost_rate_changed_flag
2681 	,NVL(tmp.burden_rate_changed_flag,'N') burden_rate_changed_flag
2682 	,NVL(tmp.bill_rate_changed_flag,'N') bill_rate_changed_flag
2683 	,NVL(tmp.raw_cost_changed_flag,'N') raw_cost_changed_flag
2684 	,NVL(tmp.burden_cost_changed_flag,'N') burden_cost_changed_flag
2685 	,NVL(tmp.revenue_changed_flag,'N') revenue_changed_flag
2686     FROM pa_fp_spread_calc_tmp tmp
2687         ,pa_resource_assignments ra
2688         ,pa_resource_list_members rlm
2689     WHERE ra.budget_version_id = p_budget_version_id
2690     AND  ra.resource_assignment_id = tmp.resource_assignment_id
2691     AND  rlm.resource_list_member_id = ra.resource_list_member_id
2692     AND  NVL(ra.rate_based_flag,'N') <> NVL(ra.resource_rate_based_flag,'N')
2693     AND  NVL(ra.resource_rate_based_flag,'N') = 'Y'
2694     ORDER BY tmp.resource_assignment_id,tmp.txn_currency_code;
2695 
2696     Cursor cur_NonRtRas IS
2697     SELECT tmp.resource_assignment_id
2698         ,tmp.txn_currency_code
2699         ,tmp.quantity
2700         ,tmp.txn_raw_cost
2701         ,tmp.txn_burdened_cost
2702         ,tmp.txn_revenue
2703         ,g_budget_version_type  version_type
2704         ,tmp.start_date
2705         ,tmp.end_date
2706         ,rlm.alias
2707         ,g_budget_version_name  version_name
2708         ,tmp.bl_quantity
2709 	,tmp.bl_txn_raw_cost
2710         ,tmp.bl_cost_rate_override bl_rw_cost_rate
2711         ,tmp.bl_burden_cost_rate_override bl_burd_rate
2712 	,tmp.bl_bill_rate_override bl_bill_rate
2713         ,tmp.cost_rate_override
2714         ,tmp.burden_cost_rate_override
2715         ,tmp.bill_rate_override
2716 	,tmp.bl_init_quantity           init_quantity
2717         ,tmp.bl_txn_init_raw_cost       txn_init_raw_cost
2718         ,tmp.bl_txn_init_burdened_cost  txn_init_burdened_cost
2719         ,tmp.bl_txn_init_revenue        txn_init_revenue
2720         ,NVL(ra.resource_rate_based_flag,'N') resource_rate_based_flag
2721         ,NVL(ra.rate_based_flag ,'N') rate_based_flag
2722         ,rlm.unit_of_measure UOM
2723 	,ra.unit_of_measure currentUOM
2724         ,NVL(tmp.quantity_changed_flag,'N') quantity_changed_flag
2725         ,NVL(tmp.cost_rate_changed_flag,'N') cost_rate_changed_flag
2726         ,NVL(tmp.burden_rate_changed_flag,'N') burden_rate_changed_flag
2727         ,NVL(tmp.bill_rate_changed_flag,'N') bill_rate_changed_flag
2728         ,NVL(tmp.raw_cost_changed_flag,'N') raw_cost_changed_flag
2729         ,NVL(tmp.burden_cost_changed_flag,'N') burden_cost_changed_flag
2730         ,NVL(tmp.revenue_changed_flag,'N') revenue_changed_flag
2731 	,tmp.bill_markup_percentage
2732     FROM pa_fp_spread_calc_tmp tmp
2733         ,pa_resource_assignments ra
2734         ,pa_resource_list_members rlm
2735     WHERE ra.budget_version_id = p_budget_version_id
2736     AND  ra.resource_assignment_id = tmp.resource_assignment_id
2737     AND  rlm.resource_list_member_id = ra.resource_list_member_id
2738     AND  NVL(ra.rate_based_flag,'N') = 'N'
2739     AND  ( (tmp.txn_raw_cost is NOT NULL or tmp.txn_revenue is NOT NULL)
2740  	           OR
2741  	        /* added this to pickup the lines where budget line exists and sum raw is zero and sum revenue is zero
2742  	          * and user changed burdened cost only
2743  	        */
2744  	        (nvl(tmp.txn_raw_cost,0)=0 and nvl(tmp.txn_revenue,0) =0 and tmp.txn_burdened_cost is NOT NULL)
2745  	        )
2746     AND  NVL(ra.resource_rate_based_flag,'N') = 'N'
2747     /* bug fix:5726773: commented out this and added exist clause
2748      * reason: when budget line exists and total plan qty is zero, the above cursor fails
2749      * AND  tmp.quantity is not null */
2750  	     AND  EXISTS (select /*+ INDEX(BL PA_BUDGET_LINES_U1) */ null
2751  	                  from pa_budget_lines bl1
2752  	                  where bl1.resource_assignment_id = tmp.resource_assignment_id
2753  	                  and bl1.txn_currency_code = tmp.txn_currency_code
2754  	                  and ((g_source_context = 'BUDGET_LINE'
2755  	                        and bl1.start_date between tmp.start_date and tmp.end_date)
2756  	                         OR
2757  	                        (g_source_context <> 'BUDGET_LINE')
2758  	                      )
2759  	                 )
2760     ORDER BY tmp.resource_assignment_id,tmp.txn_currency_code;
2761 
2762 	l_NonRrtRec_Exists_Exception	EXCEPTION;
2763 	l_NonRrtRec_Exists_Flg		VARCHAR2(1);
2764 
2765 BEGIN
2766 	x_return_status := 'S';
2767 	   l_resource_assignment_tab.delete;
2768            l_txn_currency_code_tab.delete;
2769            l_quantity_tab.delete;
2770            l_raw_cost_tab.delete;
2771            l_burden_cost_tab.delete;
2772            l_revenue_tab.delete;
2773            l_start_date_tab.delete;
2774            l_end_date_tab.delete;
2775            l_revenue_only_flag_tab.delete;
2776 	   l_reset_rate_based_flag_tab.delete;
2777 	   l_bd_cost_rate_override_tab.delete;
2778 	   l_rw_cost_rate_override_tab.delete;
2779 	   l_bill_rate_override_tab.delete;
2780 	   l_uom_tab.delete;
2781 	   l_rwRtSetFlag_Tab.delete;
2782 	   l_bilRtSetFlag_Tab.delete;
2783 	   l_bdRtSetFlag_tab.delete;
2784 	   l_reCalcbdRt_Tab.delete;
2785            l_reCalcBilRt_Tab.delete;
2786 	   l_revenue_only_flag_tab.delete;
2787 	   l_costRt_g_miss_num_flag_tab.delete;
2788            l_burdRt_g_miss_num_flag_tab.delete;
2789            l_revRt_g_miss_num_flag_tab.delete;
2790 	   l_burden_only_flag_tab.delete;
2791 
2792 	  l_tbl_counter := 0;
2793 	   For i IN cur_ra LOOP --{
2794 
2795 		/*
2796 		print_msg('Looping through RAs for Rate Base flg = N and Resource Rate base flag = Y');
2797 		print_msg('OrgRwCst['||i.txn_raw_cost||']Rt['||i.bl_rw_cost_rate||']OrgBurd['||i.txn_burdened_cost||']Rt['||i.bl_burd_rate||']');
2798 		print_msg('OrgRev['||i.txn_revenue||']Rt['||i.bl_bill_rate||']OrgQty['||i.quantity||']');
2799 		print_msg('currentUOM['||i.currentUOM||']ResUOM['||i.UOM||']');
2800 		*/
2801 		l_tbl_counter := l_tbl_counter + 1;
2802 		l_resource_assignment_tab(l_tbl_counter) := i.resource_assignment_id;
2803 		l_txn_currency_code_tab(l_tbl_counter) := i.txn_currency_code;
2804 		l_start_date_tab(l_tbl_counter) := i.start_date;
2805            	l_end_date_tab(l_tbl_counter) := i.end_date;
2806 		l_quantity_tab(l_tbl_counter) := null;
2807 		l_raw_cost_tab(l_tbl_counter) := null;
2808 		l_burden_cost_tab(l_tbl_counter) := null;
2809 		l_revenue_tab(l_tbl_counter) := null;
2810 		l_revenue_only_flag_tab(l_tbl_counter) := 'N';
2811 		l_reset_rate_based_flag_tab(l_tbl_counter) := 'N';
2812 		l_bd_cost_rate_override_tab(l_tbl_counter) := null;
2813            	l_rw_cost_rate_override_tab(l_tbl_counter) := null;
2814            	l_bill_rate_override_tab(l_tbl_counter) := null;
2815 		l_uom_tab(l_tbl_counter) := i.UOM;
2816 		l_rwRtSetFlag_Tab(l_tbl_counter) := 'N';
2817            	l_bilRtSetFlag_Tab(l_tbl_counter) := 'N';
2818 		l_bdRtSetFlag_tab(l_tbl_counter) := 'N';
2819 		l_reCalcbdRt_Tab(l_tbl_counter) := 'N';
2820 		l_reCalcBilRt_Tab(l_tbl_counter) := 'N';
2821 	        l_revenue_only_flag_tab(l_tbl_counter ) := 'N';
2822 		l_costRt_g_miss_num_flag_tab(l_tbl_counter ) := NULL;
2823         	l_burdRt_g_miss_num_flag_tab(l_tbl_counter ) := NULL;
2824         	l_revRt_g_miss_num_flag_tab(l_tbl_counter ) := NULL;
2825 		l_burden_only_flag_tab(l_tbl_counter ) := 'N';
2826 		IF i.version_type = 'COST' Then
2827 		   If i.rate_based_flag = 'N' and i.resource_rate_based_flag = 'Y' Then
2828 			If i.quantity_changed_flag = 'Y' Then
2829       -- CBS: 13721529
2830       IF (g_wp_version_flag = 'Y' AND g_wp_resource_class_flag = 'N' ) THEN
2831   		  IF P_PA_DEBUG_MODE = 'Y' Then
2832           print_msg('Not resetting the rate_based_flag');
2833         END IF;
2834       ELSE
2835 			   l_reset_rate_based_flag_tab(l_tbl_counter) := 'Y';
2836       END IF;
2837 			   IF i.cost_rate_changed_flag = 'Y'
2838 			       and i.raw_cost_changed_flag = 'Y' Then
2839 				If (nvl(i.quantity,0) - nvl(i.init_quantity,0) <> 0 ) Then
2840 			   	   l_rw_cost_rate_override_tab(l_tbl_counter) :=
2841 					(NVL(i.txn_raw_cost,0) - NVL(i.txn_init_raw_cost,0)) /
2842 						(nvl(i.quantity,0) - nvl(i.init_quantity,0));
2843 				End If;
2844 			   ElsIf i.cost_rate_changed_flag = 'N' and i.raw_cost_changed_flag = 'Y' Then
2845 				If (nvl(i.quantity,0) - nvl(i.init_quantity,0) <> 0 ) Then
2846                                    l_rw_cost_rate_override_tab(l_tbl_counter) :=
2847                                         (NVL(i.txn_raw_cost,0) - NVL(i.txn_init_raw_cost,0)) /
2848                                                 (nvl(i.quantity,0) - nvl(i.init_quantity,0));
2849                                 End If;
2850 			   ElsIf i.cost_rate_changed_flag = 'N' and i.raw_cost_changed_flag = 'N' then
2851 				l_rw_cost_rate_override_tab(l_tbl_counter) := NULL;
2852                                 l_rwRtSetFlag_tab(l_tbl_counter) := 'Y';
2853 			   End if;
2854 
2855 			   If i.burden_cost_changed_flag = 'Y' then
2856 				If (nvl(i.quantity,0) - nvl(i.init_quantity,0) <> 0 ) Then
2857                                    l_bd_cost_rate_override_tab(l_tbl_counter) :=
2858                                         (NVL(i.txn_burdened_cost,0) - NVL(i.txn_init_burdened_cost,0)) /
2859                                                 (nvl(i.quantity,0) - nvl(i.init_quantity,0));
2860                                 End If;
2861                            Elsif i.burden_rate_changed_flag = 'N' Then
2862                                 l_bdRtSetFlag_tab(l_tbl_counter) := 'Y';
2863                                 l_bd_cost_rate_override_tab(l_tbl_counter) := NULL;
2864                            End If;
2865 			Else -- quantity dnot changed
2866 			   IF i.raw_cost_changed_flag = 'Y' and i.burden_cost_changed_flag = 'N'  and nvl(i.bl_burd_rate,0) in (1,0) Then
2867 				l_bdRtSetFlag_tab(l_tbl_counter) := 'Y';
2868                                 l_bd_cost_rate_override_tab(l_tbl_counter) := NULL;
2869 			   End If;
2870 			   If i.burden_cost_changed_flag = 'Y' then
2871                                 If (nvl(i.quantity,0) - nvl(i.init_quantity,0) <> 0 ) Then
2872                                    l_bd_cost_rate_override_tab(l_tbl_counter) :=
2873                                         (NVL(i.txn_burdened_cost,0) - NVL(i.txn_init_burdened_cost,0)) /
2874                                                 (nvl(i.quantity,0) - nvl(i.init_quantity,0));
2875                                 End If;
2876                            End If;
2877 
2878 			End If;
2879 		   End If;
2880 		Elsif i.version_type = 'REVENUE' Then
2881 		   If i.rate_based_flag = 'N' and i.resource_rate_based_flag = 'Y' Then
2882 			If i.quantity_changed_flag = 'Y' Then
2883 			   l_reset_rate_based_flag_tab(l_tbl_counter) := 'Y';
2884                            IF i.bill_rate_changed_flag = 'N'
2885 				and i.revenue_changed_flag = 'Y' Then
2886 				If (nvl(i.quantity,0) - nvl(i.init_quantity,0) <> 0 ) Then
2887                            	    l_bill_rate_override_tab(l_tbl_counter) :=
2888 					(nvl(i.txn_revenue,0) - nvl(i.txn_init_revenue,0)) /
2889 					   (nvl(i.quantity,0) - nvl(i.init_quantity,0));
2890 				End If;
2891 			   Elsif i.bill_rate_changed_flag = 'Y' and i.revenue_changed_flag = 'Y' Then
2892 				If (nvl(i.quantity,0) - nvl(i.init_quantity,0) <> 0 ) Then
2893                                     l_bill_rate_override_tab(l_tbl_counter) :=
2894                                         (nvl(i.txn_revenue,0) - nvl(i.txn_init_revenue,0)) /
2895                                            (nvl(i.quantity,0) - nvl(i.init_quantity,0));
2896                                 End If;
2897 			   Elsif i.bill_rate_changed_flag = 'N' and i.revenue_changed_flag = 'N' Then
2898 				l_bilRtSetFlag_tab(l_tbl_counter) := 'Y';
2899 				l_bill_rate_override_tab(l_tbl_counter) := NULL;
2900 			   End If;
2901 			Else -- quantity is not changed
2902 			   If i.bill_rate_changed_flag = 'Y' Then
2903 			   	l_reCalcBilRt_tab(l_tbl_counter) := 'Y';
2904 			   	l_bill_rate_override_tab(l_tbl_counter) := 1;
2905 			   End If;
2906 			End If;
2907 		   End If;
2908 		Elsif i.version_type = 'ALL' then
2909 		   If i.rate_based_flag = 'N' and i.resource_rate_based_flag = 'Y' Then
2910 			If i.quantity_changed_flag = 'Y' Then
2911 				l_reset_rate_based_flag_tab(l_tbl_counter) := 'Y';
2912 				If i.raw_cost_changed_flag = 'Y' Then
2913 				  If (nvl(i.quantity,0) - nvl(i.init_quantity,0) <> 0 ) Then
2914                                    	l_rw_cost_rate_override_tab(l_tbl_counter) :=
2915                                         (NVL(i.txn_raw_cost,0) - NVL(i.txn_init_raw_cost,0)) /
2916                                                 (nvl(i.quantity,0) - nvl(i.init_quantity,0));
2917                                   End If;
2918 				Elsif i.cost_rate_changed_flag = 'N' Then
2919 					l_rw_cost_rate_override_tab(l_tbl_counter) := NULL;
2920 					l_rwRtSetFlag_tab(l_tbl_counter) := 'Y';
2921 				End If;
2922 				If i.burden_cost_changed_flag = 'Y' then
2923 				  If (nvl(i.quantity,0) - nvl(i.init_quantity,0) <> 0 ) Then
2924                                    	l_bd_cost_rate_override_tab(l_tbl_counter) :=
2925                                         (NVL(i.txn_burdened_cost,0) - NVL(i.txn_init_burdened_cost,0)) /
2926                                                 (nvl(i.quantity,0) - nvl(i.init_quantity,0));
2927                                   End If;
2928 				Elsif i.burden_rate_changed_flag = 'N' Then
2929 					l_bdRtSetFlag_tab(l_tbl_counter) := 'Y';
2930 					l_bd_cost_rate_override_tab(l_tbl_counter) := NULL;
2931 				End If;
2932 
2933 				If i.revenue_changed_flag = 'Y' Then
2934 				  If (nvl(i.quantity,0) - nvl(i.init_quantity,0) <> 0 ) Then
2935                                     	l_bill_rate_override_tab(l_tbl_counter) :=
2936                                         (nvl(i.txn_revenue,0) - nvl(i.txn_init_revenue,0)) /
2937                                            (nvl(i.quantity,0) - nvl(i.init_quantity,0));
2938                                   End If;
2939 				Elsif i.bill_rate_changed_flag = 'N' Then
2940 					l_bill_rate_override_tab(l_tbl_counter) := NULL;
2941 					l_bilRtSetFlag_Tab(l_tbl_counter) := 'Y';
2942 				End If;
2943 				/* in case if we donot want calculate raw and burden then open this code
2944 				l_bill_rate_override_tab(l_tbl_counter) := i.txn_revenue / i.quantity;
2945 				if i.cost_rate_changed_flag = 'N' and i.raw_cost_changed_flag = 'N' and i.bl_rw_cost_rate = 0 Then
2946                                       l_rw_cost_rate_override_tab(l_tbl_counter) := 0;
2947 				Else
2948 					l_rw_cost_rate_override_tab(l_tbl_counter) := i.txn_raw_cost / i.quantity;
2949                                 End If;
2950 				*/
2951 
2952 			Elsif i.quantity_changed_flag = 'N' Then
2953 				--print_msg('Qty not changed');
2954 				l_quantity_tab(l_tbl_counter) := i.quantity;
2955 
2956 				If i.resource_rate_based_flag = 'Y' AND i.rate_based_flag = 'N'  then
2957                                 	l_costRt_g_miss_num_flag_tab(l_tbl_counter) := 'N';
2958                                 	l_burdRt_g_miss_num_flag_tab(l_tbl_counter) := 'N';
2959                                 	l_revRt_g_miss_num_flag_tab(l_tbl_counter) := 'N';
2960                       		Elsif i.resource_rate_based_flag = 'N' AND i.rate_based_flag = 'N' Then
2961                                 	l_costRt_g_miss_num_flag_tab(l_tbl_counter) := 'N';
2962                                 	l_burdRt_g_miss_num_flag_tab(l_tbl_counter) := 'N';
2963                                 	l_revRt_g_miss_num_flag_tab(l_tbl_counter) := 'N';
2964                       		End If;
2965 				If i.revenue_changed_flag = 'Y' Then --{
2966 				   --print_msg('Rev changed');
2967 				   If i.raw_cost_changed_flag = 'Y' OR i.burden_cost_changed_flag = 'Y' then
2968 					If i.raw_cost_changed_flag = 'Y' Then
2969 						--print_msg('RawChanged');
2970 						l_quantity_tab(l_tbl_counter) := i.txn_raw_cost;
2971 						l_rw_cost_rate_override_tab(l_tbl_counter) := 1;
2972 						If i.burden_cost_changed_flag = 'N' and nvl(i.bl_burd_rate,0) in (1) Then
2973 						    l_bdRtSetFlag_Tab(l_tbl_counter) := 'Y';
2974 						End If;
2975 					End If;
2976 					If i.burden_cost_changed_flag = 'Y' and i.raw_cost_changed_flag = 'N'
2977 					   and NVL(i.bl_rw_cost_rate,0) = 0 and NVL(i.bl_burd_rate,0) IN (1,0) and i.bl_txn_raw_cost is NULL Then
2978 						--print_msg('burden cost changed');
2979 					    l_quantity_tab(l_tbl_counter) := i.txn_burdened_cost;
2980 					    l_raw_cost_tab(l_tbl_counter) := i.txn_burdened_cost;
2981 					    l_burden_only_flag_tab(l_tbl_counter ) := 'Y';
2982 					     l_rw_cost_rate_override_tab(l_tbl_counter) := 1;
2983 					     l_bd_cost_rate_override_tab(l_tbl_counter) := 1;
2984 					Elsif i.burden_cost_changed_flag = 'Y' and i.bl_rw_cost_rate in (1,0) and i.bl_burd_rate NOT IN (1) Then
2985 					    If (NVL(l_quantity_tab(l_tbl_counter),0)-nvl(i.init_quantity,0) <> 0) Then
2986 						If i.bl_txn_raw_cost is NOT NULL and i.bl_txn_raw_cost = i.bl_quantity Then
2987 					           l_bd_cost_rate_override_tab(l_tbl_counter) :=
2988 							(nvl(i.txn_burdened_cost,0) - nvl(i.txn_init_burdened_cost,0))/
2989 							 (NVL(l_quantity_tab(l_tbl_counter),0)-nvl(i.init_quantity,0));
2990 						Else
2991 						   l_bd_cost_rate_override_tab(l_tbl_counter) :=
2992                                                         (nvl(i.txn_burdened_cost,0) - nvl(i.txn_init_burdened_cost,0))/
2993                                                          (NVL(l_raw_cost_tab(l_tbl_counter),i.bl_txn_raw_cost)-nvl(i.txn_init_raw_cost,0));
2994 						End If;
2995 					    End If;
2996 					End If;
2997 				   End If;
2998 					--l_bill_rate_override_tab(l_tbl_counter) := i.txn_revenue / l_quantity_tab(l_tbl_counter);
2999 				    if i.cost_rate_changed_flag = 'N' and i.raw_cost_changed_flag = 'N' and i.burden_cost_changed_flag = 'N'
3000 					and (i.bl_rw_cost_rate = 0 OR i.bl_txn_raw_cost is NULL )  Then
3001 					l_rw_cost_rate_override_tab(l_tbl_counter) := 0;
3002 				    End If;
3003 				    if i.burden_rate_changed_flag = 'N' and i.burden_cost_changed_flag = 'N'
3004 				       and i.raw_cost_changed_flag = 'N' and i.bl_burd_rate = 0 Then
3005 					l_bd_cost_rate_override_tab(l_tbl_counter) := 0;
3006 
3007 				    /* when burden rate only changed for non-rate base resource ignore the rate */
3008 				    ElsIf g_wp_version_flag = 'N' and i.burden_rate_changed_flag = 'Y' and i.burden_cost_changed_flag = 'N' Then
3009 					l_reCalcbdRt_Tab(l_tbl_counter) := 'Y';
3010 					l_bd_cost_rate_override_tab(l_tbl_counter) := NULL;
3011 				    End If;
3012 
3013 				    If  i.raw_cost_changed_flag = 'N'
3014                                      and i.burden_cost_changed_flag = 'N'
3015                                      and (i.bl_rw_cost_rate = 0 OR i.bl_txn_raw_cost is NULL ) Then
3016                                         l_quantity_tab(l_tbl_counter) := i.txn_revenue;
3017 					l_revenue_only_flag_tab(l_tbl_counter) := 'Y';
3018 					If (NVL(l_quantity_tab(l_tbl_counter),0)-nvl(i.init_quantity,0) <> 0) Then
3019                                         	l_bill_rate_override_tab(l_tbl_counter) :=
3020 						 (nvl(i.txn_revenue,0) - nvl(i.txn_init_revenue,0)) /
3021 						 (NVL(l_quantity_tab(l_tbl_counter),0)-nvl(i.init_quantity,0));
3022 					End If;
3023                                     Else
3024                                         If (NVL(l_quantity_tab(l_tbl_counter),0)-nvl(i.init_quantity,0) <> 0) Then
3025                                                 l_bill_rate_override_tab(l_tbl_counter) :=
3026                                                  (nvl(i.txn_revenue,0) - nvl(i.txn_init_revenue,0)) /
3027                                                  (NVL(l_quantity_tab(l_tbl_counter),0)-nvl(i.init_quantity,0));
3028                                         End If;
3029                                     End If;
3030 				Elsif i.revenue_changed_flag = 'N' Then
3031                                    If i.bill_rate_changed_flag = 'Y' Then
3032                                         l_reCalcBilRt_tab(l_tbl_counter) := 'Y';
3033                                         l_bill_rate_override_tab(l_tbl_counter) := NULL;
3034                                    End If;
3035 				   If (i.raw_cost_changed_flag = 'Y' OR i.burden_cost_changed_flag = 'Y') then --{
3036 					--print_msg('Rev not changed');
3037 					If i.raw_cost_changed_flag = 'Y' Then
3038 						--print_msg('Rawchanged');
3039                                                 l_quantity_tab(l_tbl_counter) := i.txn_raw_cost;
3040 					        l_rw_cost_rate_override_tab(l_tbl_counter) := 1;
3041 						If i.bl_bill_rate = 1 Then
3042                                                 	l_bilRtSetFlag_Tab(l_tbl_counter) := 'Y';
3043                                         	End If;
3044                                                 If i.burden_cost_changed_flag = 'N' and nvl(i.bl_burd_rate,0) in (0,1) Then
3045                                                     l_bdRtSetFlag_Tab(l_tbl_counter) := 'Y';
3046 						/* ignore the burden rate changes for non-rate base resource */
3047 						ElsIf g_wp_version_flag = 'N' and i.burden_rate_changed_flag = 'Y' and i.burden_cost_changed_flag = 'N' then
3048                                         		l_reCalcbdRt_Tab(l_tbl_counter) := 'Y';
3049                                         		l_bd_cost_rate_override_tab(l_tbl_counter) := NULL;
3050                                                 End If;
3051                                         End If;
3052                                         If i.burden_cost_changed_flag = 'Y' and i.raw_cost_changed_flag = 'N'
3053                                            and NVL(i.bl_rw_cost_rate,0) = 0 and NVL(i.bl_burd_rate,0) IN (1,0) and i.bl_txn_raw_cost is NULL Then
3054                                             l_quantity_tab(l_tbl_counter) := i.txn_burdened_cost;
3055                                             l_raw_cost_tab(l_tbl_counter) := i.txn_burdened_cost;
3056 					    l_burden_only_flag_tab(l_tbl_counter ) := 'Y';
3057 					    l_rw_cost_rate_override_tab(l_tbl_counter) := 1;
3058 					    l_bd_cost_rate_override_tab(l_tbl_counter) := 1;
3059 					    If i.bl_bill_rate = 1 Then
3060                                                    l_bilRtSetFlag_Tab(l_tbl_counter) := 'Y';
3061                                             End If;
3062                                         Elsif i.burden_cost_changed_flag = 'Y' and (i.bl_rw_cost_rate in (1,0) )
3063 					       and i.bl_burd_rate NOT IN (1) Then
3064 					    If (NVL(l_quantity_tab(l_tbl_counter),0)-nvl(i.init_quantity,0) <> 0) Then
3065 					       If nvl(l_raw_cost_tab(l_tbl_counter),i.bl_txn_raw_cost) = nvl(l_quantity_tab(l_tbl_counter),0) Then
3066                                             	l_bd_cost_rate_override_tab(l_tbl_counter) :=
3067 						   (nvl(i.txn_burdened_cost,0) - nvl(i.txn_init_burdened_cost,0))/
3068 						    (NVL(l_quantity_tab(l_tbl_counter),0)-nvl(i.init_quantity,0));
3069 					       Else
3070 						l_bd_cost_rate_override_tab(l_tbl_counter) :=
3071                                                    (nvl(i.txn_burdened_cost,0) - nvl(i.txn_init_burdened_cost,0))/
3072                                                     (NVL(l_raw_cost_tab(l_tbl_counter),i.bl_txn_raw_cost)-nvl(i.txn_init_raw_cost,0));
3073 						End If;
3074 					    End If;
3075                                         End If;
3076 				    Elsif g_wp_version_flag = 'N' and i.burden_rate_changed_flag = 'Y' and i.burden_cost_changed_flag = 'N' then
3077 					   /* ignore the burden rate change for non-rate base resource */
3078 					   l_reCalcbdRt_Tab(l_tbl_counter) := 'Y';
3079                                            l_bd_cost_rate_override_tab(l_tbl_counter) := NULL;
3080 				    End If; --}
3081 				End If; --}
3082 		   	End If;
3083 		  End If;
3084 	     End If;
3085 	   End LOOP; --}
3086 
3087 	/* process records for Non rate base when revenue only entered */
3088 	If g_budget_version_type = 'ALL' Then --{
3089 	   FOR i IN cur_NonRtRas LOOP
3090 		l_tbl_counter := l_tbl_counter + 1;
3091                 l_resource_assignment_tab(l_tbl_counter) := i.resource_assignment_id;
3092                 l_txn_currency_code_tab(l_tbl_counter) := i.txn_currency_code;
3093 		l_start_date_tab(l_tbl_counter) := i.start_date;
3094                 l_end_date_tab(l_tbl_counter) := i.end_date;
3095                 l_quantity_tab(l_tbl_counter) := null;
3096                 l_raw_cost_tab(l_tbl_counter) := null;
3097                 l_burden_cost_tab(l_tbl_counter) := null;
3098                 l_revenue_tab(l_tbl_counter) := null;
3099                 l_revenue_only_flag_tab(l_tbl_counter) := 'N';
3100                 l_reset_rate_based_flag_tab(l_tbl_counter) := 'N';
3101                 l_bd_cost_rate_override_tab(l_tbl_counter) := null;
3102                 l_rw_cost_rate_override_tab(l_tbl_counter) := null;
3103                 l_bill_rate_override_tab(l_tbl_counter) := null;
3104                 l_uom_tab(l_tbl_counter) := i.UOM;
3105                 l_rwRtSetFlag_Tab(l_tbl_counter) := 'N';
3106                 l_bilRtSetFlag_Tab(l_tbl_counter) := 'N';
3107                 l_bdRtSetFlag_tab(l_tbl_counter) := 'N';
3108 		l_reCalcbdRt_Tab(l_tbl_counter) := 'N';
3109                 l_reCalcBilRt_Tab(l_tbl_counter) := 'N';
3110 		l_revenue_only_flag_tab(l_tbl_counter ) := 'N';
3111 		l_costRt_g_miss_num_flag_tab(l_tbl_counter ) := NULL;
3112                 l_burdRt_g_miss_num_flag_tab(l_tbl_counter ) := NULL;
3113                 l_revRt_g_miss_num_flag_tab(l_tbl_counter ) := NULL;
3114 		l_burden_only_flag_tab(l_tbl_counter ) := 'N';
3115 		/*
3116 		print_msg('Looping through RAs for Rate Base flg = N and Resource Rate base flag = N');
3117 		print_msg('bdRtflag['||i.burden_cost_changed_flag||']RwFlag['||i.raw_cost_changed_flag||']');
3118 		print_msg('RevFlag['||i.revenue_changed_flag||']');
3119 		print_msg('currentUOM['||i.currentUOM||']ResUOM['||i.UOM||']');
3120 		*/
3121 		If i.rate_based_flag = 'N' and i.resource_rate_based_flag = 'N' Then
3122 			l_quantity_tab(l_tbl_counter) := i.quantity;
3123                         if i.resource_rate_based_flag = 'N' AND i.rate_based_flag = 'N' Then
3124                               l_costRt_g_miss_num_flag_tab(l_tbl_counter) := 'N';
3125                               l_burdRt_g_miss_num_flag_tab(l_tbl_counter) := 'N';
3126                               l_revRt_g_miss_num_flag_tab(l_tbl_counter) := 'N';
3127                         End If;
3128                         If i.raw_cost_changed_flag = 'Y' Then
3129 				l_quantity_tab(l_tbl_counter) := i.txn_raw_cost;
3130 				l_rw_cost_rate_override_tab(l_tbl_counter) := 1;
3131 				If i.burden_cost_changed_flag = 'Y' Then
3132 				  If (NVL(l_quantity_tab(l_tbl_counter),0)-nvl(i.init_quantity,0) <> 0) Then
3133                                        l_bd_cost_rate_override_tab(l_tbl_counter) :=
3134                                          (nvl(i.txn_burdened_cost,0) - nvl(i.txn_init_burdened_cost,0))/
3135                                          (NVL(l_quantity_tab(l_tbl_counter),0)-nvl(i.init_quantity,0));
3136                                   End If;
3137 				Elsif i.burden_cost_changed_flag = 'N' and nvl(i.bl_burd_rate,0) in (0,1) Then
3138 				  l_bdRtSetFlag_tab(l_tbl_counter) := 'Y';
3139 				  l_bd_cost_rate_override_tab(l_tbl_counter) := NULL;
3140 				Elsif g_wp_version_flag = 'N' and i.burden_rate_changed_flag = 'Y' and i.burden_cost_changed_flag = 'N' then
3141                                            /* ignore the burden rate change for non-rate base resource */
3142                                            l_reCalcbdRt_Tab(l_tbl_counter) := 'Y';
3143                                            l_bd_cost_rate_override_tab(l_tbl_counter) := NULL;
3144 				End If;
3145 
3146 				If i.revenue_changed_flag = 'Y' Then
3147 					If (NVL(l_quantity_tab(l_tbl_counter),0)-nvl(i.init_quantity,0) <> 0) Then
3148                                                 l_bill_rate_override_tab(l_tbl_counter) :=
3149                                                  (nvl(i.txn_revenue,0) - nvl(i.txn_init_revenue,0)) /
3150                                                  (NVL(l_quantity_tab(l_tbl_counter),0)-nvl(i.init_quantity,0));
3151                                         End If;
3152 				Elsif i.revenue_changed_flag = 'N' and nvl(i.bl_bill_rate,0) in (1) Then
3153 					l_bill_rate_override_tab(l_tbl_counter) := NULL;
3154 					l_bilRtSetFlag_tab(l_tbl_counter) := 'Y';
3155 				End If;
3156 			End If;
3157 
3158 			If i.burden_cost_changed_flag = 'Y' Then
3159 			    	If i.raw_cost_changed_flag = 'N' and ((NVL(i.bl_rw_cost_rate,0) = 0 and i.bl_txn_raw_cost is NULL) OR (i.txn_init_raw_cost = i.bl_txn_raw_cost) ) Then --Bug 6781055
3160 
3161 					l_quantity_tab(l_tbl_counter) := i.txn_burdened_cost;
3162 					l_raw_cost_tab(l_tbl_counter) := i.txn_burdened_cost;
3163 					l_rw_cost_rate_override_tab(l_tbl_counter) := 1;
3164 			        	l_bd_cost_rate_override_tab(l_tbl_counter) := 1;
3165 					l_burden_only_flag_tab(l_tbl_counter ) := 'Y';
3166 			    	Else
3167 					If (NVL(l_quantity_tab(l_tbl_counter),0)-nvl(i.init_quantity,0) <> 0) Then
3168 					  if NVL(l_raw_cost_tab(l_tbl_counter),i.bl_txn_raw_cost) = NVL(l_quantity_tab(l_tbl_counter),0) Then
3169                                             l_bd_cost_rate_override_tab(l_tbl_counter) :=
3170                                               (nvl(i.txn_burdened_cost,0) - nvl(i.txn_init_burdened_cost,0))/
3171                                               (NVL(l_quantity_tab(l_tbl_counter),0)-nvl(i.init_quantity,0));
3172                                           -- Modified Else to Elsif for Bug# 6784234
3173 					  Elsif (NVL(l_raw_cost_tab(l_tbl_counter),i.bl_txn_raw_cost)-nvl(i.txn_init_raw_cost,0)) <> 0 Then
3174 
3175 					    l_bd_cost_rate_override_tab(l_tbl_counter) :=
3176                                               (nvl(i.txn_burdened_cost,0) - nvl(i.txn_init_burdened_cost,0))/
3177                                               (NVL(l_raw_cost_tab(l_tbl_counter),i.bl_txn_raw_cost)-nvl(i.txn_init_raw_cost,0));
3178 					  End If;
3179                                   	End If;
3180 			    	End If;
3181 
3182 			    	If i.revenue_changed_flag = 'Y' Then
3183                                         If (NVL(l_quantity_tab(l_tbl_counter),0)-nvl(i.init_quantity,0) <> 0) Then
3184                                                 l_bill_rate_override_tab(l_tbl_counter) :=
3185                                                  (nvl(i.txn_revenue,0) - nvl(i.txn_init_revenue,0)) /
3186                                                  (NVL(l_quantity_tab(l_tbl_counter),0)-nvl(i.init_quantity,0));
3187                                         End If;
3188                                 Elsif i.revenue_changed_flag = 'N' and nvl(i.bl_bill_rate,0) in (1) Then
3189                                         l_bill_rate_override_tab(l_tbl_counter) := NULL;
3190                                         l_bilRtSetFlag_tab(l_tbl_counter) := 'Y';
3191                                 End If;
3192 			End If;
3193 
3194 			If i.revenue_changed_flag = 'Y' Then
3195 				If ( (i.bl_rw_cost_rate = 0 OR i.bl_txn_raw_cost is NULL ) OR (i.txn_init_raw_cost = i.bl_txn_raw_cost) ) and NVL(i.bl_burd_rate,0) = 0 --Bug 6781055
3196 				   and i.raw_cost_changed_flag = 'N' and i.burden_cost_changed_flag = 'N' Then
3197                                         -- revenue only entered for pl resource
3198                                         l_quantity_tab(l_tbl_counter) := i.txn_revenue;
3199 					l_revenue_only_flag_tab(l_tbl_counter) := 'Y';
3200 					If i.txn_revenue = 0 then
3201 						l_bill_rate_override_tab(l_tbl_counter) := 0;
3202 					Else
3203 						l_bill_rate_override_tab(l_tbl_counter) := 1;
3204 					End If;
3205 				 Else
3206 					If (NVL(l_quantity_tab(l_tbl_counter),0)-nvl(i.init_quantity,0) <> 0) Then
3207                                                 l_bill_rate_override_tab(l_tbl_counter) :=
3208                                                  (nvl(i.txn_revenue,0) - nvl(i.txn_init_revenue,0)) /
3209                                                  (NVL(l_quantity_tab(l_tbl_counter),0)-nvl(i.init_quantity,0));
3210                                         End If;
3211                                  End If;
3212                                  if i.cost_rate_changed_flag = 'N' and i.raw_cost_changed_flag = 'N'
3213  	                                     and i.bl_rw_cost_rate = 0
3214  	                                     and i.burden_cost_changed_flag = 'N' Then
3215                                         l_rw_cost_rate_override_tab(l_tbl_counter) := 0;
3216                                  End If;
3217                                  if i.burden_rate_changed_flag = 'N' and i.burden_cost_changed_flag = 'N' and i.bl_burd_rate = 0 Then
3218                                        l_bd_cost_rate_override_tab(l_tbl_counter) := 0;
3219 				 Elsif g_wp_version_flag = 'N' and i.burden_rate_changed_flag = 'Y' and i.burden_cost_changed_flag = 'N' Then
3220 					/* ignore the burden rate change for non-rate base resource */
3221                                            l_reCalcbdRt_Tab(l_tbl_counter) := 'Y';
3222                                            l_bd_cost_rate_override_tab(l_tbl_counter) := NULL;
3223                                  End If;
3224 			Else
3225 			    	if i.bill_rate_changed_flag = 'Y' Then
3226                               		l_reCalcBilRt_tab(l_tbl_counter) := 'Y';
3227                               		l_bill_rate_override_tab(l_tbl_counter) := NULL;
3228 				End If;
3229 			End If;
3230 			If g_wp_version_flag = 'N' and i.burden_rate_changed_flag = 'Y' and i.burden_cost_changed_flag = 'N'
3231 				and i.revenue_changed_flag = 'N' and i.raw_cost_changed_flag = 'N' Then
3232                                            /* ignore the burden rate change for non-rate base resource */
3233                                            l_reCalcbdRt_Tab(l_tbl_counter) := 'Y';
3234                                            l_bd_cost_rate_override_tab(l_tbl_counter) := NULL;
3235 			End If;
3236                 End If;
3237 	   END LOOP;
3238 	End If; --}
3239 
3240 	   /* Update the RA and set the rate based flag = Y */
3241        	If x_return_status = 'S' AND l_resource_assignment_tab.COUNT > 0 Then --{
3242 
3243 	/*
3244 	for i in l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST loop
3245 	print_msg('Contxt['||p_source_context||']raid['||l_resource_assignment_tab(i)||']');
3246 	print_msg('txnCur['||l_txn_currency_code_tab(i)||']');
3247 	print_msg('ResetFlg['||l_reset_rate_based_flag_tab(i)||']uom['||l_uom_tab(i)||']Qty['||l_quantity_tab(i)||']');
3248 	print_msg('RwCost['||l_raw_cost_tab(i)||']Rt['||l_rw_cost_rate_override_tab(i)||']');
3249 	print_msg('billRt['||l_bill_rate_override_tab(i)||']');
3250 	print_msg('resetCstFlg['||l_rwRtSetFlag_Tab(i)||']resetBilFlg['||l_bilRtSetFlag_Tab(i)||']');
3251 	print_msg('resetBdRtFlg['||l_bdRtSetFlag_Tab(i)||']');
3252 	print_msg('reCalcBdFlag['||l_reCalcBdRt_tab(i)||']reCalcBilRtFlag['||l_reCalcBilRt_tab(i)||']');
3253 	print_msg('RevOnlyFlg['||l_revenue_only_flag_tab(i)||']');
3254 	end loop;
3255 	*/
3256 	     IF p_source_context = 'RESOURCE_ASSIGNMENT' Then
3257 
3258 		/* before resetting the rate base flag check whenter budget lines exists for this planning
3259 		 * resource with other currency. if so abort the process
3260 		 */
3261 		DELETE FROM pa_fp_spread_calc_tmp2;
3262 		FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
3263 		INSERT INTO pa_fp_spread_calc_tmp2 tmp2
3264 		   	(budget_version_id
3265 			,resource_assignment_id
3266 			,txn_currency_code
3267 			,task_id
3268 			,resource_name
3269 			)
3270 		SELECT /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP_N1) */ p_budget_version_id
3271 			,tmp.resource_assignment_id
3272 			,tmp.txn_currency_code
3273 			,tmp.task_id
3274 			,tmp.resource_name
3275 		FROM pa_fp_spread_calc_tmp tmp
3276 		WHERE tmp.budget_version_id = p_budget_version_id
3277 		AND tmp.resource_assignment_id = l_resource_assignment_tab(i)
3278 		AND tmp.txn_currency_code = l_txn_currency_code_tab(i)
3279 		AND  l_reset_rate_based_flag_tab(i) = 'Y'
3280 		AND EXISTS (select null
3281 				from pa_budget_lines bl
3282 				WHERE tmp.resource_assignment_id = bl.resource_assignment_id
3283 				AND  (tmp.txn_currency_code <> bl.txn_currency_code
3284 				    OR
3285 				    ( tmp.txn_currency_code = bl.txn_currency_code
3286 				      and nvl(bl.init_quantity,0) <> 0 )
3287 				     )
3288 			   );
3289 
3290 	     ELSE  -- source context = BUDGET LINE then
3291 
3292                 DELETE FROM pa_fp_spread_calc_tmp2;
3293                 FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
3294                 INSERT INTO pa_fp_spread_calc_tmp2 tmp2
3295                         (budget_version_id
3296                         ,resource_assignment_id
3297                         ,txn_currency_code
3298                         ,task_id
3299                         ,resource_name
3300                         ,start_date
3301                         ,end_date
3302                         )
3303                 SELECT /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP_N1) */ p_budget_version_id
3304                         ,tmp.resource_assignment_id
3305                         ,tmp.txn_currency_code
3306                         ,tmp.task_id
3307                         ,tmp.resource_name
3308                         ,tmp.start_date
3309                         ,tmp.end_date
3310                 FROM pa_fp_spread_calc_tmp tmp
3311                 WHERE tmp.budget_version_id = p_budget_version_id
3312                 AND tmp.resource_assignment_id = l_resource_assignment_tab(i)
3313                 AND tmp.txn_currency_code = l_txn_currency_code_tab(i)
3314 		AND tmp.start_date = l_start_date_tab(i)
3315                 AND l_reset_rate_based_flag_tab(i) = 'Y'
3316                 AND EXISTS (select null
3317                                 from pa_budget_lines bl
3318                                 WHERE tmp.resource_assignment_id = bl.resource_assignment_id
3319                                 AND  ( (tmp.txn_currency_code <> bl.txn_currency_code)
3320 				      OR (tmp.txn_currency_code = bl.txn_currency_code
3321 					  --and bl.start_date NOT BETWEEN tmp.start_date and tmp.end_date
3322 					  and nvl(bl.init_quantity,0) <> 0  --7185263
3323 					 ))
3324                            );
3325 	     END IF;
3326 
3327 		/* loop through each record add it to stack and then raise error */
3328 		l_NonRrtRec_Exists_Flg := 'N';
3329 		FOR i IN (SELECT tmp2.resource_assignment_id
3330 				,tmp2.txn_currency_code
3331 				,tmp2.task_id
3332 				,tmp2.resource_name
3333 				,tmp2.start_date
3334 			 FROM pa_fp_spread_calc_tmp2 tmp2
3335 			 WHERE tmp2.budget_version_id = p_budget_version_id ) LOOP --{
3336 
3337 			g_stage := 'PA_FP_RATE_BASE_QTY_REQD:RaId['||i.resource_assignment_id||']';
3338 			g_stage := 'Currency['||i.txn_currency_code||']SDate['||i.start_date||']';
3339                 	IF P_PA_DEBUG_MODE = 'Y' Then
3340                 	   print_msg(g_stage);
3341                 	End If;
3342 
3343 			PA_UTILS.ADD_MESSAGE
3344                             (p_app_short_name => 'PA'
3345                             ,p_msg_name       => 'PA_FP_RATE_BASE_RES_QTY_REQD'
3346                             ,p_token1         => 'P_BUDGET_VERSION_NAME'
3347                             ,p_value1         => g_budget_version_name
3348                             ,p_token2         => 'P_RESOURCE_NAME'
3349                             ,p_value2         => i.resource_name
3350                             ,p_token3         => 'P_RESOURCE_ASSIGNMENT'
3351                             ,p_value3         => i.resource_assignment_id
3352                             ,p_token4         => 'P_TXN_CURRENCY_CODE'
3353                             ,p_value4         => i.txn_currency_code
3354                             ,p_token5         => 'P_START_DATE'
3355                             ,p_value5         => i.start_date
3356                             );
3357 
3358 			    x_return_status := 'E';
3359 			    l_NonRrtRec_Exists_Flg := 'Y';
3360 		END LOOP; --}
3361 
3362 		If l_NonRrtRec_Exists_Flg = 'Y' THEN
3363 			x_return_status := 'E';
3364 			g_stage := 'Found Errors during reset Rate base flag validation: Raising Error';
3365                         IF P_PA_DEBUG_MODE = 'Y' Then
3366                            print_msg(g_stage);
3367                         End If;
3368 			RAISE l_NonRrtRec_Exists_Exception;
3369 		End If;
3370 
3371         	g_stage := 'reset_ratebased_pltrxns:104';
3372 		IF P_PA_DEBUG_MODE = 'Y' Then
3373         	print_msg(g_stage);
3374 		End If;
3375     -- CBS 13653430 changes
3376     -- for workplan RC disabled case, rate_based_flag should not be reset.
3377     IF (g_wp_version_flag = 'Y' AND g_wp_resource_class_flag = 'N' ) THEN
3378   		IF P_PA_DEBUG_MODE = 'Y' Then
3379        print_msg('Not resetting the rate_based_flag and UOM');
3380       END IF;
3381     ELSE
3382         	FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
3383             		UPDATE PA_RESOURCE_ASSIGNMENTS ra
3384             		SET ra.rate_based_flag = 'Y'
3385                		,ra.unit_of_measure = l_uom_tab(i)
3386             	WHERE ra.resource_assignment_id = l_resource_assignment_tab(i)
3387 		          AND l_reset_rate_based_flag_tab(i) = 'Y';
3388   		IF P_PA_DEBUG_MODE = 'Y' Then
3389        print_msg('Resetting the rate_based_flag and UOM');
3390       END IF;
3391     END IF;
3392 
3393 		IF P_PA_DEBUG_MODE = 'Y' Then
3394 		print_msg('reset the override rates in new entity');
3395 		End If;
3396 		FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
3397 			UPDATE PA_RESOURCE_ASGN_CURR rtx
3398 			SET rtx.txn_raw_cost_rate_override = decode(l_rwRtSetFlag_Tab(i),'Y',NULL,rtx.txn_raw_cost_rate_override)
3399 			    ,rtx.txn_bill_rate_override = decode(l_bilRtSetFlag_Tab(i),'Y',NULL,rtx.txn_bill_rate_override)
3400 			    ,rtx.txn_burden_cost_rate_override = decode(l_bdRtSetFlag_Tab(i),'Y',NULL,rtx.txn_burden_cost_rate_override)
3401 			WHERE rtx.resource_assignment_id = l_resource_assignment_tab(i)
3402                         AND  rtx.txn_currency_code = l_txn_currency_code_tab(i)
3403 			AND  (l_rwRtSetFlag_Tab(i) = 'Y' OR l_bilRtSetFlag_Tab(i) = 'Y' OR l_bdRtSetFlag_Tab(i) = 'Y' )
3404 			AND ( p_source_context = 'RESOURCE_ASSIGNMENT'
3405 			      OR
3406 			      (p_source_context = 'BUDGET_LINE'
3407 				and l_reset_rate_based_flag_tab(i) = 'Y')
3408 			    );
3409 		IF P_PA_DEBUG_MODE = 'Y' Then
3410 		print_msg('reset the override rates in budgetLines');
3411 		End If;
3412                 FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
3413                         UPDATE PA_BUDGET_LINES bl
3414                         SET bl.txn_cost_rate_override = decode(l_rwRtSetFlag_Tab(i),'Y',NULL,bl.txn_cost_rate_override)
3415                             ,bl.txn_bill_rate_override = decode(l_bilRtSetFlag_Tab(i),'Y',NULL,bl.txn_bill_rate_override)
3416 			    ,bl.burden_cost_rate_override = decode(l_bdRtSetFlag_Tab(i),'Y',NULL,bl.burden_cost_rate_override)
3417                         WHERE bl.resource_assignment_id = l_resource_assignment_tab(i)
3418                         AND  bl.txn_currency_code = l_txn_currency_code_tab(i)
3419 			AND  ((p_source_context = 'BUDGET_LINE'
3420 				and bl.start_date BETWEEN l_start_date_tab(i) and l_end_date_tab(i))
3421 			      OR
3422 				p_source_context <> 'BUDGET_LINE'
3423 			     )
3424                         AND  (l_rwRtSetFlag_Tab(i) = 'Y' OR l_bilRtSetFlag_Tab(i) = 'Y' OR l_bdRtSetFlag_Tab(i) = 'Y');
3425 		IF P_PA_DEBUG_MODE = 'Y' Then
3426         	g_stage := 'reset_ratebased_pltrxns:105';
3427 		End If;
3428         	/* Now update the rollup tmp with the new qty and raw cost */
3429         	print_msg('Updating tmp table  with qty = rawcost or burden cost');
3430         	FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
3431             		UPDATE /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP_N1) */ pa_fp_spread_calc_tmp tmp
3432             		SET tmp.quantity = NVL(l_quantity_tab(i),tmp.quantity)
3433                		,tmp.txn_raw_cost = NVL(l_raw_cost_tab(i),tmp.txn_raw_cost)
3434                		,tmp.cost_rate_override = decode(l_rwRtSetFlag_Tab(i),'Y',NULL,NVL(l_rw_cost_rate_override_tab(i),tmp.cost_rate_override))
3435 			,tmp.bill_rate_override = decode(l_bilRtSetFlag_Tab(i),'Y',NULL,NVL(l_bill_rate_override_tab(i),tmp.bill_rate_override))
3436 			,tmp.burden_cost_rate_override = decode(l_bdRtSetFlag_Tab(i),'Y',NULL
3437 							   ,decode(l_reCalcBdRt_tab(i),'Y',NULL,NVL(l_bd_cost_rate_override_tab(i),tmp.burden_cost_rate_override)))
3438 			,tmp.burden_rate_changed_flag = decode(l_bdRtSetFlag_Tab(i),'Y',tmp.burden_rate_changed_flag
3439 							   ,decode(l_reCalcBdRt_tab(i),'Y','N',tmp.burden_rate_changed_flag))
3440 			,tmp.burden_rate_g_miss_num_flag = decode(l_bdRtSetFlag_Tab(i),'Y',nvl(l_burdRt_g_miss_num_flag_tab(i),tmp.burden_rate_g_miss_num_flag)
3441 								,decode(l_reCalcBdRt_tab(i),'Y','N'
3442 								  ,nvl(l_burdRt_g_miss_num_flag_tab(i), tmp.burden_rate_g_miss_num_flag)))
3443 			,tmp.bill_rate_changed_flag = decode(l_bilRtSetFlag_tab(i),'Y',tmp.bill_rate_changed_flag
3444 								,decode(l_reCalcBilRt_tab(i),'Y','N',tmp.bill_rate_changed_flag))
3445 			,tmp.revenue_only_entered_flag = l_revenue_only_flag_tab(i)
3446                         ,tmp.cost_rate_g_miss_num_flag = NVL(l_costRt_g_miss_num_flag_tab(i),tmp.cost_rate_g_miss_num_flag)
3447                         ,tmp.bill_rate_g_miss_num_flag = NVL(l_revRt_g_miss_num_flag_tab(i),tmp.bill_rate_g_miss_num_flag)
3448 			,tmp.burden_only_entered_flag = l_burden_only_flag_tab(i)
3449 			,(tmp.rate_based_flag
3450                  	 ,tmp.resource_rate_based_flag
3451 			 ,tmp.resource_UOM) =
3452                                         (select nvl(ra.rate_based_flag,'N' )
3453                                                 ,nvl(ra.resource_rate_based_flag,'N')
3454 						,l_uom_tab(i)
3455                                         from pa_resource_assignments ra
3456                                         where ra.resource_assignment_id = tmp.resource_assignment_id)
3457 			/* bug fix:5116157: to store the reset flag so that correct rate base flag and uom can pass to PJI*/
3458 			,tmp.system_reference_var3 = NVL(l_reset_rate_based_flag_tab(i),'N') -- Reset_Rate_Base_Flag
3459 			/* bug fix:5726773 */
3460  	                ,tmp.NEG_QUANTITY_CHANGE_FLAG = decode(nvl(l_reset_rate_based_flag_tab(i),'N'),'Y','N'
3461  	                                                         ,tmp.NEG_QUANTITY_CHANGE_FLAG)
3462  	                ,tmp.NEG_RAWCOST_CHANGE_FLAG = decode(nvl(l_reset_rate_based_flag_tab(i),'N'),'Y','N'
3463  	                                                         ,tmp.NEG_RAWCOST_CHANGE_FLAG)
3464  	                ,tmp.NEG_BURDEN_CHANGE_FALG= decode(nvl(l_reset_rate_based_flag_tab(i),'N'),'Y','N'
3465  	                                                         ,tmp.NEG_BURDEN_CHANGE_FALG)
3466  	                ,tmp.NEG_REVENUE_CHANGE_FLAG = decode(nvl(l_reset_rate_based_flag_tab(i),'N'),'Y','N'
3467  	                                                         ,tmp.NEG_REVENUE_CHANGE_FLAG)
3468             		WHERE tmp.resource_assignment_id = l_resource_assignment_tab(i)
3469             		AND  tmp.txn_currency_code = l_txn_currency_code_tab(i)
3470 			AND  ((p_source_context = 'BUDGET_LINE'
3471                                 and tmp.start_date BETWEEN l_start_date_tab(i) and l_end_date_tab(i))
3472                               OR
3473                                 p_source_context <> 'BUDGET_LINE'
3474                              );
3475 
3476 
3477        	End If; --}
3478     	g_stage := 'reset_ratebased_pltrxns:107';
3479 	IF P_PA_DEBUG_MODE = 'Y' Then
3480     	print_msg('Leaving reset_ratebased_pltrxns with retSts['||x_return_status||']');
3481 	End If;
3482 EXCEPTION
3483 	WHEN l_NonRrtRec_Exists_Exception THEN
3484 		x_return_status := 'E';
3485 		RETURN;
3486         WHEN OTHERS THEN
3487                 x_return_status := 'U';
3488                 print_msg('Failed in Reset_ratebased_pltrxns API'||sqlcode||sqlerrm);
3489                  fnd_msg_pub.add_exc_msg
3490                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
3491                  ,p_procedure_name => 'Reset_ratebased_pltrxns');
3492                 RAISE;
3493 
3494 END Reset_ratebased_pltrxns;
3495 
3496 
3497 /* This api is added as an enhancement request: For a rate based planning transaction if no quantity is passed
3498  * then mark the resource as a Non-Rate planning transaction
3499  * Logic:  For source context Resource assignment: check budget line exists for RAID and Txn cur combo
3500  * If NO budget line exists and passed in param value of quantity is NULL is then
3501  *  mark this transaction as NON-RATE based and copy raw cost to quantity
3502  * For source context Budget Line: check whether the periodic line exists, If not check budget line exists for RA and txn currency
3503  *  If No budget line exists and user has entered mix and match of qty and amounts
3504  *  then throw an error:'Enter quantity for rate based planning transaction'
3505  */
3506 PROCEDURE Check_ratebased_pltrxns(
3507                 p_budget_version_id              IN  Number
3508                 ,p_source_context                IN  pa_fp_res_assignments_tmp.source_context%TYPE
3509                 ,x_return_status                 OUT NOCOPY VARCHAR2
3510                 ) IS
3511 
3512     l_resource_assignment_tab   pa_plsql_datatypes.NumTabTyp;
3513     l_txn_currency_code_tab     pa_plsql_datatypes.Char50TabTyp;
3514     l_start_date_tab             pa_plsql_datatypes.DateTabTyp;
3515     l_end_date_tab               pa_plsql_datatypes.DateTabTyp;
3516     l_period_name_tab            pa_plsql_datatypes.Char50TabTyp;
3517     l_quantity_tab              pa_plsql_datatypes.NumTabTyp;
3518     l_raw_cost_tab              pa_plsql_datatypes.NumTabTyp;
3519     l_burden_cost_tab           pa_plsql_datatypes.NumTabTyp;
3520     l_revenue_tab               pa_plsql_datatypes.NumTabTyp;
3521     l_revenue_only_flag_tab     pa_plsql_datatypes.Char1TabTyp;
3522     l_burden_only_flag_tab      pa_plsql_datatypes.Char1TabTyp;
3523     l_costRt_g_miss_num_flag_tab pa_plsql_datatypes.Char1TabTyp;
3524     l_burdRt_g_miss_num_flag_tab pa_plsql_datatypes.Char1TabTyp;
3525     l_revRt_g_miss_num_flag_tab  pa_plsql_datatypes.Char1TabTyp;
3526 
3527     l_costRt_changed_flag_tab    pa_plsql_datatypes.Char1TabTyp;
3528     l_burdRt_changed_flag_tab    pa_plsql_datatypes.Char1TabTyp;
3529     l_billRt_changed_flag_tab    pa_plsql_datatypes.Char1TabTyp;
3530     l_uom_tab			 pa_plsql_datatypes.Char50TabTyp;
3531     l_mark_non_rate_base_flag   Varchar2(1);
3532     l_exists_flag               Varchar2(1);
3533     l_tbl_counter               Number;
3534     l_start_date            DATE;
3535     l_end_date          DATE;
3536 
3537 
3538 
3539     Cursor cur_ra IS
3540     SELECT tmp.resource_assignment_id
3541         ,tmp.txn_currency_code
3542         ,tmp.quantity
3543         ,tmp.txn_raw_cost
3544         ,tmp.txn_burdened_cost
3545         ,tmp.txn_revenue
3546         ,g_budget_version_type  version_type
3547         ,tmp.start_date
3548         ,tmp.end_date
3549         ,rlm.alias
3550         ,g_budget_version_name  version_name
3551         ,tmp.bl_quantity
3552 	,ra.resource_rate_based_flag
3553 	,rlm.unit_of_measure uom
3554 	/* bug fix:5726773 */
3555  	,to_number(null) bl_sum_qty
3556  	,nvl(tmp.cost_rate_changed_flag,'N') cost_rate_changed_flag
3557  	,nvl(tmp.burden_rate_changed_flag,'N') burden_rate_changed_flag
3558  	,nvl(tmp.bill_rate_changed_flag,'N') bill_rate_changed_flag
3559  	,NVL(tmp.RE_SPREAD_AMTS_FLAG,'N') re_spread_amts_flag
3560  	,NVL(tmp.SP_CURVE_CHANGE_FLAG,'N') sp_curve_change_flag
3561  	,NVL(tmp.PLAN_DATES_CHANGE_FLAG,'N') plan_dates_change_flag
3562  	,NVL(tmp.SP_FIX_DATE_CHANGE_FLAG,'N') sp_fix_date_change_flag
3563  	,NVL(tmp.MFC_COST_CHANGE_FLAG,'N') mfc_cost_change_flag
3564  	,NVL(tmp.RLM_ID_CHANGE_FLAG,'N') rlm_id_change_flag
3565  	,NVL(tmp.delete_bl_flag,'N') delete_bl_flag
3566  	,NVL(tmp.raw_cost_changed_flag,'N') raw_cost_changed_flag
3567  	,NVL(tmp.burden_cost_changed_flag,'N') burden_cost_changed_flag
3568  	,NVL(tmp.revenue_changed_flag,'N') revenue_changed_flag
3569     FROM pa_fp_spread_calc_tmp tmp
3570         ,pa_resource_assignments ra
3571         ,pa_resource_list_members rlm
3572     WHERE ra.budget_version_id = p_budget_version_id
3573     AND  ra.resource_assignment_id = tmp.resource_assignment_id
3574     AND  rlm.resource_list_member_id = ra.resource_list_member_id
3575     AND  NVL(ra.rate_based_flag,'N') = 'Y'
3576         AND  NVL(tmp.quantity,0) = 0
3577     AND NVL(tmp.quantity_changed_flag,'N') = 'N'
3578     ORDER BY tmp.resource_assignment_id,tmp.txn_currency_code;
3579 
3580     Cursor  cur_bl_chk(p_ra_id Number,p_txn_cur_code Varchar2) IS
3581     SELECT 'Y'
3582     FROM dual
3583     WHERE EXISTS (select null
3584             from pa_budget_lines bl
3585                 ,pa_resource_assignments ra
3586             where ra.resource_assignment_id = p_ra_id
3587             and bl.resource_assignment_id = ra.resource_assignment_id
3588             and NVL(ra.rate_based_flag,'N') = 'Y'
3589             /* Bug fix:4083873 and bl.txn_currency_code = p_txn_cur_code */
3590             and bl.budget_version_id = p_budget_version_id
3591              );
3592 
3593     Cursor cur_tmp_chk(p_ra_id Number,p_txn_cur_code Varchar2) IS
3594         SELECT 'Y'
3595         FROM dual
3596         WHERE EXISTS (select null
3597                         from pa_fp_spread_calc_tmp bl
3598                         where bl.resource_assignment_id = p_ra_id
3599                         /* Bug fix:4083873 and bl.txn_currency_code = p_txn_cur_code */
3600             and nvl(bl.quantity,0) <>  0
3601                      );
3602 
3603     /* Bug fix: 4156225 : For a Non-rate base resource If burden cost only entered then copy
3604     * burden cost to raw cost and quantity and set rate override as 1
3605         */
3606     CURSOR cur_NonRtBaseRa IS
3607         SELECT tmp.resource_assignment_id
3608                 ,tmp.txn_currency_code
3609                 ,tmp.quantity
3610                 ,tmp.txn_raw_cost
3611                 ,tmp.txn_burdened_cost
3612                 ,tmp.txn_revenue
3613                 ,tmp.start_date
3614                 ,tmp.end_date
3615         	,tmp.bl_quantity
3616 		,rlm.unit_of_measure uom
3617         FROM pa_fp_spread_calc_tmp tmp
3618         ,pa_resource_assignments ra
3619 	,pa_resource_list_members rlm
3620         WHERE tmp.budget_version_id = p_budget_version_id
3621         AND   ra.resource_assignment_id = tmp.resource_assignment_id
3622 	AND  rlm.resource_list_member_id = ra.resource_list_member_id
3623         AND  NVL(ra.rate_based_flag,'N') = 'N'
3624         AND  ( g_budget_version_type IN ('COST','ALL')
3625         AND NVL(tmp.quantity,0) = 0
3626         AND NVL(tmp.txn_raw_cost,0) = 0
3627         AND ((NVL(tmp.txn_burdened_cost,0) <> 0 )
3628              OR
3629              NVL(tmp.txn_revenue,0) <> 0
3630             )
3631          )
3632     AND NOT EXISTS ( select null
3633             from pa_budget_lines bl
3634             where bl.budget_version_id = p_budget_version_id
3635             and   bl.resource_assignment_id = tmp.resource_assignment_id
3636             and  bl.txn_currency_code = tmp.txn_currency_code
3637             and  (p_source_context <> 'BUDGET_LINE'
3638                  OR
3639                  (p_source_context = 'BUDGET_LINE'
3640                   and bl.start_date between tmp.start_date and tmp.end_date)
3641                  )
3642             );
3643     l_reset_plsql_tab_flag  VARCHAR2(10) := 'N';
3644 
3645     -- bug 4431269: added the followings
3646     -- variables to be used to call process_errors in web adi flow.
3647     l_webadi_task_id                   pa_resource_assignments.task_id%TYPE;
3648     l_webadi_rlm_id                    pa_resource_assignments.resource_list_member_id%TYPE;
3649     l_webAdi_context                   VARCHAR2(250) ;
3650 
3651     /* bug fix:5726773 */
3652     SKIP_RECORD         EXCEPTION;
3653     l_message_name      VARCHAR2(30);
3654     l_lkp_code          VARCHAR2(30);
3655 
3656 BEGIN
3657     x_return_status := 'S';
3658     IF P_PA_DEBUG_MODE = 'Y' Then
3659     print_msg('start of Check_ratebased_pltrxns API');
3660     End If;
3661     g_stage := 'Check_ratebased_pltrxns:100';
3662     l_webAdi_context := PA_FP_WEBADI_PKG.G_FP_WA_CALC_CALLING_CONTEXT;
3663 
3664        l_resource_assignment_tab.delete;
3665            l_txn_currency_code_tab.delete;
3666            l_quantity_tab.delete;
3667            l_raw_cost_tab.delete;
3668            l_burden_cost_tab.delete;
3669            l_revenue_tab.delete;
3670            l_start_date_tab.delete;
3671            l_end_date_tab.delete;
3672 	   l_revenue_only_flag_tab.delete;
3673 	   l_costRt_g_miss_num_flag_tab.delete;
3674            l_burdRt_g_miss_num_flag_tab.delete;
3675            l_revRt_g_miss_num_flag_tab.delete;
3676 	   l_costRt_changed_flag_tab.delete;
3677     	   l_burdRt_changed_flag_tab.delete;
3678     	   l_billRt_changed_flag_tab.delete;
3679 	   l_burden_only_flag_tab.delete;
3680 	   l_uom_tab.delete;
3681     g_stage := 'Check_ratebased_pltrxns:101';
3682     --print_msg('Check for Non-rate resource with qty and raw cost are not passed');
3683     l_tbl_counter := 0;
3684     /* Start of Bug fix:4156225 process rate based resources */
3685     /* Bug fix:4214137 If version type is revenue only then plsql tabs are not populated, hence opening cursor fails with
3686      * ORA-22160: element at index [1] does not exist in Package
3687      * Fix: Open the cursor only if budget version is cost or all */
3688     IF g_budget_version_type IN ('COST','ALL') Then
3689        FOR i IN cur_NonRtBaseRa LOOP
3690 	/*
3691         print_msg('RA['||i.resource_assignment_id||']Cur['||i.txn_currency_code||']');
3692 	print_msg('qty['||i.quantity||']Raw['||i.txn_raw_cost||']brd['||i.txn_burdened_cost||']');
3693 	*/
3694         l_tbl_counter := l_tbl_counter +1;
3695         If p_source_context = 'RESOURCE_ASSIGNMENT' then
3696                         l_start_date := NULL;
3697                         l_end_date := NULL;
3698                 Else
3699                         l_start_date := i.start_date;
3700                         l_end_date := i.end_date;
3701                 End If;
3702         l_resource_assignment_tab(l_tbl_counter) := i.resource_assignment_id;
3703         l_txn_currency_code_tab(l_tbl_counter) := i.txn_currency_code;
3704         l_start_date_tab(l_tbl_counter)        := i.start_date;
3705         l_end_date_tab(l_tbl_counter)        := i.end_date;
3706 	l_uom_tab(l_tbl_counter)        := i.uom;
3707 	l_revenue_only_flag_tab(l_tbl_counter) := 'N';
3708 	l_costRt_g_miss_num_flag_tab(l_tbl_counter ) := NULL;
3709         l_burdRt_g_miss_num_flag_tab(l_tbl_counter ) := NULL;
3710         l_revRt_g_miss_num_flag_tab(l_tbl_counter ) := NULL;
3711 	l_costRt_changed_flag_tab(l_tbl_counter ) := NULL;
3712         l_burdRt_changed_flag_tab(l_tbl_counter ) := NULL;
3713         l_billRt_changed_flag_tab(l_tbl_counter ) := NULL;
3714 	l_burden_only_flag_tab(l_tbl_counter) := 'N';
3715         IF g_budget_version_type in ('COST') Then
3716             --print_msg('Assigning burden cost to quantity');
3717             l_quantity_tab(l_tbl_counter) := i.txn_burdened_cost;
3718             l_raw_cost_tab(l_tbl_counter) := i.txn_burdened_cost;
3719 	    l_burden_only_flag_tab(l_tbl_counter) := 'Y';
3720 	    l_costRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
3721 	    l_costRt_changed_flag_tab(l_tbl_counter ) := 'N';
3722 	    l_burdRt_changed_flag_tab(l_tbl_counter ) := 'N';
3723         Elsif g_budget_version_type in ('ALL') Then
3724             If NVL(i.txn_burdened_cost,0) <> 0 Then
3725                --print_msg('Assigning burden cost to quantity');
3726                l_quantity_tab(l_tbl_counter) := i.txn_burdened_cost;
3727                l_raw_cost_tab(l_tbl_counter) := i.txn_burdened_cost;
3728 		l_burden_only_flag_tab(l_tbl_counter) := 'Y';
3729 	        l_costRt_changed_flag_tab(l_tbl_counter ) := 'N';
3730                 l_burdRt_changed_flag_tab(l_tbl_counter ) := 'N';
3731 		l_billRt_changed_flag_tab(l_tbl_counter ) := 'N';
3732 	       l_costRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
3733         	l_burdRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
3734         	l_revRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
3735             Else
3736                --print_msg('Assigning Revenue to quantity');
3737                 l_quantity_tab(l_tbl_counter) := i.txn_revenue;
3738                 l_raw_cost_tab(l_tbl_counter) := i.txn_revenue;
3739 		l_revenue_only_flag_tab(l_tbl_counter) := 'Y';
3740 		l_costRt_changed_flag_tab(l_tbl_counter ) := 'N';
3741                 l_burdRt_changed_flag_tab(l_tbl_counter ) := 'N';
3742 		l_billRt_changed_flag_tab(l_tbl_counter ) := 'N';
3743 		l_costRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
3744                 l_burdRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
3745                 l_revRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
3746             End If;
3747         End If;
3748        END LOOP;
3749        IF l_resource_assignment_tab.COUNT > 0 Then
3750         g_stage := 'Check_ratebased_pltrxns:102';
3751         --print_msg(g_stage);
3752         l_reset_plsql_tab_flag := 'Y';
3753         FORALL i IN l_resource_assignment_tab.FIRST ..l_resource_assignment_tab.LAST
3754             UPDATE /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP_N1) */ pa_fp_spread_calc_tmp tmp
3755                         SET tmp.quantity = l_quantity_tab(i)
3756                            ,tmp.txn_raw_cost = decode(nvl(tmp.txn_raw_cost,0),0,l_raw_cost_tab(i),tmp.txn_raw_cost)
3757                		   ,tmp.cost_rate_override = decode(l_revenue_only_flag_tab(i),'Y',0,1)
3758 			   ,tmp.burden_cost_rate_override = decode(l_revenue_only_flag_tab(i),'Y',0
3759 						,decode(g_wp_version_flag,'Y',tmp.burden_cost_rate_override
3760 						 , decode(nvl(tmp.burden_cost_changed_flag,'N'),'N',NULL,tmp.burden_cost_rate_override)))
3761 			   ,tmp.revenue_only_entered_flag = l_revenue_only_flag_tab(i)
3762 			   ,tmp.cost_rate_g_miss_num_flag = NVL(l_costRt_g_miss_num_flag_tab(i),tmp.cost_rate_g_miss_num_flag)
3763 			   ,tmp.burden_rate_g_miss_num_flag = nvl(l_burdRt_g_miss_num_flag_tab(i),tmp.burden_rate_g_miss_num_flag)
3764                            ,tmp.bill_rate_g_miss_num_flag = NVL(l_revRt_g_miss_num_flag_tab(i),tmp.bill_rate_g_miss_num_flag)
3765 			   ,tmp.cost_rate_changed_flag = nvl(l_costRt_changed_flag_tab(i),tmp.cost_rate_changed_flag)
3766 			   ,tmp.burden_rate_changed_flag = Nvl(l_burdRt_changed_flag_tab(i),tmp.burden_rate_changed_flag)
3767 			   ,tmp.bill_rate_changed_flag = nvl(l_billRt_changed_flag_tab(i),tmp.bill_rate_changed_flag)
3768 			   ,tmp.burden_only_entered_flag = l_burden_only_flag_tab(i)
3769                         WHERE tmp.resource_assignment_id = l_resource_assignment_tab(i)
3770                         AND  tmp.txn_currency_code = l_txn_currency_code_tab(i)
3771                         AND  ((p_source_context = 'RESOURCE_ASSIGNMENT')
3772                               OR
3773                               (p_source_context = 'BUDGET_LINE'
3774                                and tmp.start_date = l_start_date_tab(i)
3775                                and tmp.end_date = l_end_date_tab(i)
3776                              ));
3777        End If;
3778     END IF;
3779     /* end of bug fix: 4156225 */
3780     IF P_PA_DEBUG_MODE = 'Y' Then
3781     print_msg('Check for Rateresource with qty and raw cost are not passed');
3782     End If;
3783     /* process rate based resources */
3784     l_tbl_counter := 0;
3785     l_resource_assignment_tab.delete;
3786         l_txn_currency_code_tab.delete;
3787         l_quantity_tab.delete;
3788         l_raw_cost_tab.delete;
3789         l_burden_cost_tab.delete;
3790         l_revenue_tab.delete;
3791         l_start_date_tab.delete;
3792         l_end_date_tab.delete;
3793 	l_revenue_only_flag_tab.delete;
3794 	l_costRt_g_miss_num_flag_tab.delete;
3795         l_burdRt_g_miss_num_flag_tab.delete;
3796         l_revRt_g_miss_num_flag_tab.delete;
3797 	l_costRt_changed_flag_tab.delete;
3798            l_burdRt_changed_flag_tab.delete;
3799            l_billRt_changed_flag_tab.delete;
3800 	 l_burden_only_flag_tab.delete;
3801 	 l_uom_tab.delete;
3802     g_stage := 'Check_ratebased_pltrxns:103';
3803 
3804     FOR i IN cur_ra LOOP
3805 	BEGIN  --{ bug fix:5726773
3806       -- bug 4431269: initializing the following variables to null
3807       IF l_webAdi_context = 'WEBADI_CALCULATE' AND
3808          (l_webadi_task_id IS NOT NULL OR l_webadi_rlm_id IS NOT NULL) THEN
3809           l_webadi_task_id := null;
3810           l_webadi_rlm_id  := null;
3811       END IF;
3812 
3813       IF (NVl(i.txn_raw_cost,0) = 0
3814              AND NVL(i.txn_burdened_cost,0) = 0
3815              AND NVL(i.txn_revenue,0) = 0) THEN       --{
3816                  --this is a new record, needs to be skipped
3817                  NULL;
3818       ELSIF (i.re_spread_amts_flag = 'Y'
3819  	                 or i.sp_curve_change_flag = 'Y'
3820  	                 or i.plan_dates_change_flag = 'Y'
3821  	                 or i.sp_fix_date_change_flag = 'Y'
3822  	                 or i.mfc_cost_change_flag = 'Y'
3823  	                 or i.rlm_id_change_flag = 'Y'
3824  	                 or i.delete_bl_flag = 'Y' ) Then
3825  	                 -- Resource attribute changed, so skip this record
3826  	                 NULL;
3827  	       ELSIF ((i.version_type in ('COST','ALL')
3828  	                 and i.raw_cost_changed_flag = 'N'
3829  	                 and i.burden_cost_changed_flag ='N'
3830  	                 and i.revenue_changed_flag = 'N') OR
3831  	              (i.version_type = 'REVENUE' and i.revenue_changed_flag = 'N')) Then
3832  	                 -- amounts are not changed so skip this record
3833  	                 NULL;
3834       ELSE
3835 	-- amounts only changed for a rate based resource
3836  	         IF P_PA_DEBUG_MODE = 'Y' Then
3837  	                 print_msg('amounts only changed for rate based planning resource:'||i.resource_assignment_id);
3838  	         End If;
3839         If p_source_context = 'RESOURCE_ASSIGNMENT' then
3840             l_start_date := NULL;
3841                         l_end_date := NULL;
3842         Else
3843             l_start_date := i.start_date;
3844             l_end_date := i.end_date;
3845         End If;
3846 
3847 	/* bug fix:5726773 */
3848  	         get_bl_sum
3849  	                 (p_budget_version_id => p_budget_version_id
3850  	                 ,p_ra_id        => i.resource_assignment_id
3851  	                 ,p_txn_cur_code => i.txn_currency_code
3852  	                 ,p_source_context  =>p_source_context
3853  	                 ,p_start_date      => l_start_date
3854  	                 ,p_end_date        => l_end_date
3855  	                 ,x_bl_qty_sum  => i.bl_sum_qty );
3856 
3857         If p_source_context = 'BUDGET_LINE' Then
3858             If i.bl_quantity is NULL and  NVL(i.quantity,0) = 0 Then
3859                print_msg('periodic budget lines not exists, now check at least budget line exists for ra ');
3860                l_mark_non_rate_base_flag := 'N';
3861                l_exists_flag := 'N';
3862                OPEN cur_bl_chk(i.resource_assignment_id,i.txn_currency_code);
3863                FETCH cur_bl_chk INTO l_exists_flag;
3864                CLOSE cur_bl_chk;
3865 
3866 	       /*bug fix:5726773 */
3867  	                If i.bl_sum_qty = 0 and l_exists_flag = 'Y' Then
3868  	                  If ((i.version_type in ('COST','ALL') and i.cost_rate_changed_flag = 'Y')
3869  	                      OR (i.version_type = 'REVENUE' and i.bill_rate_changed_flag = 'Y')) Then
3870  	                         print_msg('By passing planning resource record from Check Rate base resource@BUDGET-lINE');
3871  	                         RAISE SKIP_RECORD;
3872  	                  End If;
3873  	                End If;
3874 
3875                If NVL(l_exists_flag,'N') = 'Y' Then
3876                 print_msg('budget line exists and user has entered only the amounts so throw an error');
3877  	                      /*bug fix:5726773 */
3878  	                         If i.bl_sum_qty = 0 and l_exists_flag = 'Y' Then
3879  	                            If g_Plan_Class_Type = 'BUDGET' Then
3880  	                                 l_message_name := 'PA_FP_RATE_BASE_PLAN_QTY_REQD';
3881  	                                 l_lkp_code := 'PA_FP_WA_CAL_NO_QTY_ERR';
3882  	                            Else
3883  	                                 l_message_name := 'PA_FP_RATE_BASE_ETC_QTY_REQD';
3884  	                                 l_lkp_code := 'PA_FP_WA_CAL_NO_ETCQTY_ERR';
3885  	                            End If;
3886  	                         Else
3887  	                                 l_message_name :='PA_FP_RATE_BASE_QTY_REQD';
3888  	                                 l_lkp_code := 'PA_FP_WA_CAL_NO_QTY_ERR';
3889  	                         End If;
3890                     -- bug 4431269: added the following condition
3891                     IF l_webAdi_context = 'WEBADI_CALCULATE' THEN
3892                         -- getting task_id and rlm_id for the corresponding ra_id
3893                         -- only for the invalid records
3894                         SELECT pra.task_id,
3895                                pra.resource_list_member_id
3896                         INTO   l_webadi_task_id,
3897                                l_webadi_rlm_id
3898                         FROM   pa_resource_assignments pra
3899                         WHERE  pra.resource_assignment_id = i.resource_assignment_id
3900                         AND    pra.budget_version_id = p_budget_version_id;
3901                         -- populating the error tables.
3902                         --print_msg('1100.1.1.1:Web ADI context populating errors');
3903                         PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.EXTEND(1);
3904 			--bug fix:5726773 PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
3905                         --(PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).error_code   := 'PA_FP_WA_CAL_NO_QTY_ERR';
3906 			PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
3907 			(PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).error_code := l_lkp_code;
3908  	                         PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
3909  	                           (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).task_id      := l_webadi_task_id;
3910  	                         PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
3911  	                           (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).rlm_id       := l_webadi_rlm_id;
3912  	                         PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
3913  	                           (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).txn_currency := i.txn_currency_code;
3914                     ELSE
3915 
3916                           PA_UTILS.ADD_MESSAGE
3917                             (p_app_short_name => 'PA'
3918                             ,p_msg_name       => l_message_name
3919                             ,p_token1         => 'P_BUDGET_VERSION_NAME'
3920                             ,p_value1         => i.version_name
3921                             ,p_token2         => 'P_RESOURCE_NAME'
3922                             ,p_value2         => i.alias
3923                             ,p_token3         => 'P_RESOURCE_ASSIGNMENT'
3924                             ,p_value3         => i.resource_assignment_id
3925                             );
3926                     END IF;
3927                     x_return_status := 'E';
3928                Else
3929                 l_exists_flag := 'N';
3930                 OPEN cur_tmp_chk(i.resource_assignment_id,i.txn_currency_code);
3931                             FETCH cur_tmp_chk INTO l_exists_flag;
3932                             CLOSE cur_tmp_chk;
3933                 If NVL(l_exists_flag,'N') = 'Y' Then
3934                      print_msg('user has entered mix and match of qty and amounts so throw an error');
3935  	                         /*bug fix:5726773 */
3936  	                         If i.bl_sum_qty = 0 and l_exists_flag = 'Y' Then
3937  	                            If g_Plan_Class_Type = 'BUDGET' Then
3938  	                                 l_message_name := 'PA_FP_RATE_BASE_PLAN_QTY_REQD';
3939  	                                 l_lkp_code := 'PA_FP_WA_CAL_NO_QTY_ERR';
3940  	                            Else
3941  	                                 l_message_name := 'PA_FP_RATE_BASE_ETC_QTY_REQD';
3942  	                                 l_lkp_code := 'PA_FP_WA_CAL_NO_ETCQTY_ERR';
3943  	                            End If;
3944  	                         Else
3945  	                                 l_message_name :='PA_FP_RATE_BASE_QTY_REQD';
3946  	                                 l_lkp_code := 'PA_FP_WA_CAL_NO_QTY_ERR';
3947  	                         End If;
3948                      -- bug 4431269: added the following condition
3949                     IF l_webAdi_context = 'WEBADI_CALCULATE' THEN
3950                         -- getting task_id and rlm_id for the corresponding ra_id
3951                         -- only for the invalid records
3952                         SELECT pra.task_id,
3953                                pra.resource_list_member_id
3954                         INTO   l_webadi_task_id,
3955                                l_webadi_rlm_id
3956                         FROM   pa_resource_assignments pra
3957                         WHERE  pra.resource_assignment_id = i.resource_assignment_id
3958                         AND    pra.budget_version_id = p_budget_version_id;
3959                         -- populating the error tables.
3960                         --print_msg('1100.1.1.1:Web ADI context populating errors');
3961                         PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.EXTEND(1);
3962 			--bug fix:5726773 added new lookup code :l_lkp_code to display based on plan class type
3963 			--PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
3964 			--(PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).error_code   := 'PA_FP_WA_CAL_NO_QTY_ERR';
3965 			PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
3966  	                           (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).error_code := l_lkp_code;
3967  	                         PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
3968  	                           (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).task_id      := l_webadi_task_id;
3969  	                         PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
3970  	                           (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).rlm_id       := l_webadi_rlm_id;
3971  	                         PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
3972  	                           (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).txn_currency := i.txn_currency_code;
3973                     ELSE
3974                                       PA_UTILS.ADD_MESSAGE
3975                                 (p_app_short_name => 'PA'
3976                                         ,p_msg_name       => l_message_name
3977                                         ,p_token1         => 'P_BUDGET_VERSION_NAME'
3978                                         ,p_value1         => i.version_name
3979                                         ,p_token2         => 'P_RESOURCE_NAME'
3980                                         ,p_value2         => i.alias
3981                                         ,p_token3         => 'P_RESOURCE_ASSIGNMENT'
3982                                         ,p_value3         => i.resource_assignment_id
3983                                         );
3984                     END IF;
3985                     x_return_status := 'E';
3986                 Else
3987                     --print_msg('Mark this transaction as Non-Rate based');
3988                     l_mark_non_rate_base_flag := 'Y';
3989                 End If;
3990                End If;
3991             End If;
3992         End If;
3993 
3994         /* Now populate the local plsql tabls to copy the costs to qty and make trx as non-rate base */
3995                 IF ( p_source_context = 'RESOURCE_ASSIGNMENT' OR l_mark_non_rate_base_flag = 'Y' ) Then
3996                         If i.bl_quantity is NULL and  NVL(i.quantity,0) = 0 Then
3997 
3998               /* Check budgetline exists for this resource with other currency */
3999               If p_source_context = 'RESOURCE_ASSIGNMENT' Then
4000                 l_exists_flag := 'N';
4001                             OPEN cur_bl_chk(i.resource_assignment_id,i.txn_currency_code);
4002                             FETCH cur_bl_chk INTO l_exists_flag;
4003                             CLOSE cur_bl_chk;
4004 
4005 			    /*bug fix:5726773 */
4006  	                         If i.bl_sum_qty = 0 and l_exists_flag = 'Y' Then
4007  	                          If ((i.version_type in ('COST','ALL') and i.cost_rate_changed_flag = 'Y')
4008  	                            OR (i.version_type = 'REVENUE' and i.bill_rate_changed_flag = 'Y')) Then
4009  	                               print_msg('By passing planning resource record from Check Rate base resource@BUDGET-lINE');
4010  	                               RAISE SKIP_RECORD;
4011  	                          End If;
4012  	                         End If;
4013 
4014  	                         If i.bl_sum_qty = 0 and l_exists_flag = 'Y' Then
4015  	                            If g_Plan_Class_Type = 'BUDGET' Then
4016  	                                 l_message_name := 'PA_FP_RATE_BASE_PLAN_QTY_REQD';
4017  	                                 l_lkp_code := 'PA_FP_WA_CAL_NO_QTY_ERR';
4018  	                            Else
4019  	                                 l_message_name := 'PA_FP_RATE_BASE_ETC_QTY_REQD';
4020  	                                 l_lkp_code := 'PA_FP_WA_CAL_NO_ETCQTY_ERR';
4021  	                            End If;
4022  	                         Else
4023  	                                 l_message_name :='PA_FP_RATE_BASE_QTY_REQD';
4024  	                                 l_lkp_code := 'PA_FP_WA_CAL_NO_QTY_ERR';
4025  	                         End If;
4026  	                         /* end of bug fix:5726773 */
4027 
4028                             If NVL(l_exists_flag,'N') = 'Y' Then
4029                                       PA_UTILS.ADD_MESSAGE
4030                                 (p_app_short_name => 'PA'
4031                                         ,p_msg_name       => l_message_name
4032                                         ,p_token1         => 'P_BUDGET_VERSION_NAME'
4033                                         ,p_value1         => i.version_name
4034                                         ,p_token2         => 'P_RESOURCE_NAME'
4035                                         ,p_value2         => i.alias
4036                                         ,p_token3         => 'P_RESOURCE_ASSIGNMENT'
4037                                         ,p_value3         => i.resource_assignment_id
4038                                         );
4039                                         x_return_status := 'E';
4040                 End If;
4041                End If;
4042                IF x_return_status = 'S'  Then  --{
4043                                 print_msg('No budget lines exists, User has entered only the amounts for rate based trxn');
4044                                 l_tbl_counter := l_tbl_counter +1;
4045                                 l_resource_assignment_tab(l_tbl_counter) := i.resource_assignment_id;
4046                                 l_txn_currency_code_tab(l_tbl_counter) := i.txn_currency_code;
4047 				l_uom_tab(l_tbl_counter) := i.Uom;
4048                                 l_quantity_tab(l_tbl_counter) := i.quantity;
4049                                 l_raw_cost_tab(l_tbl_counter) := i.txn_raw_cost;
4050                                 l_burden_cost_tab(l_tbl_counter) := i.txn_burdened_cost;
4051                                 l_revenue_tab(l_tbl_counter) := i.txn_revenue;
4052                                 l_start_date_tab(l_tbl_counter) := i.start_date;
4053                                 l_end_date_tab(l_tbl_counter) := i.end_date;
4054 				l_revenue_only_flag_tab(l_tbl_counter) := 'N';
4055 				l_costRt_g_miss_num_flag_tab(l_tbl_counter ) := NULL;
4056                 		l_burdRt_g_miss_num_flag_tab(l_tbl_counter ) := NULL;
4057                 		l_revRt_g_miss_num_flag_tab(l_tbl_counter ) := NULL;
4058 				l_burden_only_flag_tab(l_tbl_counter) := 'N';
4059                                 IF i.version_type = 'ALL' Then
4060                                    If nvl(i.txn_raw_cost,0) = 0
4061                                       and nvl(i.txn_burdened_cost,0) = 0
4062                                       and nvl(i.txn_revenue,0) <> 0 Then
4063                                         -- revenue only entered so copy this to quantity
4064                                         l_quantity_tab(l_tbl_counter) := i.txn_revenue;
4065 					l_revenue_only_flag_tab(l_tbl_counter) := 'Y';
4066 					l_costRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
4067                 			l_burdRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
4068                 			l_revRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
4069 					l_costRt_changed_flag_tab(l_tbl_counter ) := 'N';
4070                 			l_burdRt_changed_flag_tab(l_tbl_counter ) := 'N';
4071                 			l_billRt_changed_flag_tab(l_tbl_counter ) := 'N';
4072                                    Elsif nvl(i.txn_raw_cost,0) = 0
4073                                         and nvl(i.txn_burdened_cost,0) <> 0 Then
4074                                         -- only burden and revenu is entered so copy burden to raw and qty
4075                                         l_quantity_tab(l_tbl_counter) := i.txn_burdened_cost;
4076                                         l_raw_cost_tab(l_tbl_counter) := i.txn_burdened_cost;
4077 					l_burden_only_flag_tab(l_tbl_counter) := 'Y';
4078 					l_costRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
4079                 			l_burdRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
4080                 			l_revRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
4081 					l_costRt_changed_flag_tab(l_tbl_counter ) := 'N';
4082                 			l_burdRt_changed_flag_tab(l_tbl_counter ) := 'N';
4083                 			l_billRt_changed_flag_tab(l_tbl_counter ) := 'N';
4084                                    Elsif nvl(i.txn_raw_cost,0) <> 0 Then
4085                                         l_quantity_tab(l_tbl_counter) := i.txn_raw_cost;
4086 					l_costRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
4087                                         l_burdRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
4088                                         l_revRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
4089 					l_costRt_changed_flag_tab(l_tbl_counter ) := 'N';
4090                 			l_burdRt_changed_flag_tab(l_tbl_counter ) := 'N';
4091                 			l_billRt_changed_flag_tab(l_tbl_counter ) := 'N';
4092                                    End If;
4093                                 Elsif i.version_type = 'COST' Then
4094                                    If nvl(i.txn_raw_cost,0) = 0
4095                                         and nvl(i.txn_burdened_cost,0) <> 0 Then
4096                                         -- only burden cost is entered so copy burden to raw and qty
4097                                         l_quantity_tab(l_tbl_counter) := i.txn_burdened_cost;
4098                                         l_raw_cost_tab(l_tbl_counter) := i.txn_burdened_cost;
4099 					l_burden_only_flag_tab(l_tbl_counter) := 'Y';
4100 					l_costRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
4101                                         l_burdRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
4102                                         l_revRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
4103 					l_costRt_changed_flag_tab(l_tbl_counter ) := 'N';
4104                 			l_burdRt_changed_flag_tab(l_tbl_counter ) := 'N';
4105                 			l_billRt_changed_flag_tab(l_tbl_counter ) := 'N';
4106                                    Elsif nvl(i.txn_raw_cost,0) <> 0 Then
4107                                         l_quantity_tab(l_tbl_counter) := i.txn_raw_cost;
4108 					l_costRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
4109                                         l_burdRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
4110                                         l_revRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
4111 					l_costRt_changed_flag_tab(l_tbl_counter ) := 'N';
4112                 			l_burdRt_changed_flag_tab(l_tbl_counter ) := 'N';
4113                 			l_billRt_changed_flag_tab(l_tbl_counter ) := 'N';
4114                                    End If;
4115                                 Elsif i.version_type = 'REVENUE' Then
4116                                    If  nvl(i.txn_revenue,0) <> 0 Then
4117                                         -- revenue only entered so copy this to quantity
4118                                         l_quantity_tab(l_tbl_counter) := i.txn_revenue;
4119 					l_costRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
4120                                         l_burdRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
4121                                         l_revRt_g_miss_num_flag_tab(l_tbl_counter ) := 'N';
4122 					l_costRt_changed_flag_tab(l_tbl_counter ) := 'N';
4123                 			l_burdRt_changed_flag_tab(l_tbl_counter ) := 'N';
4124                 			l_billRt_changed_flag_tab(l_tbl_counter ) := 'N';
4125                                    End If;
4126                                 End if;
4127                            End If;
4128             End If; --}
4129         End IF;
4130        END IF; --}
4131 
4132        EXCEPTION
4133  	          WHEN SKIP_RECORD then
4134  	                 NULL;
4135  	END; --}
4136     END LOOP;
4137 
4138     IF l_resource_assignment_tab.count > 0 Then
4139        If x_return_status = 'S' Then
4140         g_stage := 'Check_ratebased_pltrxns:104';
4141         l_reset_plsql_tab_flag := 'Y';
4142 
4143         /* bug fix:5088944: When rate base resource changed to Non-rate base then clear out any override rates present */
4144         --print_msg('Updating Resource asgn curr table clear out rate overrides');
4145         FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
4146                 UPDATE pa_resource_asgn_curr rtx
4147                 SET rtx.txn_raw_cost_rate_override = NULL
4148                    ,rtx.txn_burden_cost_rate_override = NULL
4149                    ,rtx.txn_bill_rate_override = NULL
4150                 WHERE rtx.resource_assignment_id = l_resource_assignment_tab(i)
4151                 AND rtx.txn_currency_code = l_txn_currency_code_tab(i)
4152                 AND EXISTS ( select null
4153                                 from pa_resource_assignments ra
4154                                 where ra.rate_based_flag = 'Y'
4155                                 and ra.resource_assignment_id = rtx.resource_assignment_id
4156                         );
4157 
4158         /* update the resource assignments mark it as Non-Rate based */
4159 	IF P_PA_DEBUG_MODE = 'Y' Then
4160         print_msg('Updating RA with Non-Rate base flag');
4161 	End If;
4162         FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
4163             UPDATE PA_RESOURCE_ASSIGNMENTS ra
4164             SET ra.rate_based_flag = 'N'
4165                ,ra.unit_of_measure = 'DOLLARS'
4166             WHERE ra.resource_assignment_id = l_resource_assignment_tab(i);
4167 
4168         g_stage := 'Check_ratebased_pltrxns:105';
4169         /* Now update the rollup tmp with the new qty and raw cost */
4170 	IF P_PA_DEBUG_MODE = 'Y' Then
4171         print_msg('Updating rollup tmp with qty = rawcost or burden cost');
4172 	End If;
4173         FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
4174             UPDATE /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP_N1) */ pa_fp_spread_calc_tmp tmp
4175             SET tmp.quantity = l_quantity_tab(i)
4176                ,tmp.txn_raw_cost = decode(nvl(tmp.txn_raw_cost,0),0,l_raw_cost_tab(i),tmp.txn_raw_cost)
4177 	       ,tmp.cost_rate_override = decode(nvl(l_revenue_only_flag_tab(i),'N'),'Y',0
4178 					   ,decode(nvl(l_burden_only_flag_tab(i),'N'),'Y',1,tmp.cost_rate_override))
4179 	       ,tmp.burden_cost_rate_override = decode(l_revenue_only_flag_tab(i),'Y',0
4180                                                 ,decode(g_wp_version_flag,'Y',tmp.burden_cost_rate_override
4181                                                  , decode(nvl(tmp.burden_cost_changed_flag,'N'),'N',NULL,tmp.burden_cost_rate_override)))
4182 	       ,tmp.revenue_only_entered_flag = l_revenue_only_flag_tab(i)
4183 		,tmp.cost_rate_g_miss_num_flag = NVL(l_costRt_g_miss_num_flag_tab(i),tmp.cost_rate_g_miss_num_flag)
4184                ,tmp.burden_rate_g_miss_num_flag = nvl(l_burdRt_g_miss_num_flag_tab(i),tmp.burden_rate_g_miss_num_flag)
4185                ,tmp.bill_rate_g_miss_num_flag = NVL(l_revRt_g_miss_num_flag_tab(i),tmp.bill_rate_g_miss_num_flag)
4186 		,tmp.cost_rate_changed_flag = nvl(l_costRt_changed_flag_tab(i),tmp.cost_rate_changed_flag)
4187                 ,tmp.burden_rate_changed_flag = Nvl(l_burdRt_changed_flag_tab(i),tmp.burden_rate_changed_flag)
4188                 ,tmp.bill_rate_changed_flag = nvl(l_billRt_changed_flag_tab(i),tmp.bill_rate_changed_flag)
4189 		,tmp.burden_only_entered_flag = l_burden_only_flag_tab(i)
4190 		,(tmp.rate_based_flag
4191 		 ,tmp.resource_rate_based_flag
4192 		 ,tmp.resource_uom) =
4193 					(select nvl(ra.rate_based_flag,'N' )
4194 						,nvl(ra.resource_rate_based_flag,'N')
4195 						,l_uom_tab(i)
4196 					from pa_resource_assignments ra
4197 					where ra.resource_assignment_id = tmp.resource_assignment_id)
4198             WHERE tmp.resource_assignment_id = l_resource_assignment_tab(i)
4199             AND  tmp.txn_currency_code = l_txn_currency_code_tab(i)
4200             AND  ((p_source_context = 'RESOURCE_ASSIGNMENT')
4201                   OR
4202                   (p_source_context = 'BUDGET_LINE'
4203                    and tmp.start_date = l_start_date_tab(i)
4204                    and tmp.end_date = l_end_date_tab(i)
4205                  ));
4206        End If;
4207     END If;
4208     g_stage := 'Check_ratebased_pltrxns:107';
4209 	IF P_PA_DEBUG_MODE = 'Y' Then
4210     	print_msg('Leaving Check_ratebased_pltrxns with retSts['||x_return_status||']');
4211 	End if;
4212         RETURN;
4213 EXCEPTION
4214         WHEN OTHERS THEN
4215                 x_return_status := 'U';
4216                 print_msg('Failed in Check_ratebased_pltrxns API'||sqlcode||sqlerrm);
4217                  fnd_msg_pub.add_exc_msg
4218                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
4219                  ,p_procedure_name => 'Check_ratebased_pltrxns');
4220                 RAISE;
4221 END Check_ratebased_pltrxns;
4222 
4223 /* Bug fix:5483430: This API checks at lease one period exists between planning start and end date
4224  * Logic: If time phase code is GL
4225  *  Check at lease one gl period exists between the planning resource assignment dates
4226  *  If the time phase code is PA
4227  *  Check at least one PA period exists between the planning resource assignment dates
4228  *  If the time phase is none then donot check as the period make no sense for non-time phase budgets
4229  *  For a fixed date spread curve, period must be defined for the sp_fixed_date
4230  */
4231 PROCEDURE Check_GLPA_periods_exists(
4232                         p_budget_verson_id  IN NUMBER
4233                         ,p_time_phase_code  IN VARCHAR2
4234                         ,x_return_status    OUT NOCOPY VARCHAR2
4235                         ,x_msg_data         OUT NOCOPY VARCHAR2
4236                         ) IS
4237 
4238 	CURSOR get_name_and_type_csr IS
4239         SELECT DECODE(p_time_phase_code,'G',gsb.period_set_name
4240 			,'P',pia.period_set_name)   period_set_name -- Bug#13362320
4241                 ,gsb.accounted_period_type	accounted_period_type
4242                 ,pia.pa_period_type		pa_period_type
4243          FROM gl_sets_of_books          gsb
4244                 ,pa_implementations_all pia
4245                 ,pa_projects_all        ppa
4246                 ,pa_budget_versions     pbv
4247                 ,pa_proj_fp_options     ppfo
4248         WHERE ppa.project_id        = pbv.project_id
4249           AND pbv.budget_version_id = ppfo.fin_plan_version_id
4250           AND ppa.org_id   = pia.org_id
4251           AND gsb.set_of_books_id   = pia.set_of_books_id
4252           AND pbv.budget_version_id = p_budget_verson_id;
4253 
4254 	periodDetailsRec 	get_name_and_type_csr%rowtype;
4255 
4256 	CURSOR get_ra_error_details IS
4257 	SELECT ra.resource_assignment_id
4258 		,ra.task_id
4259 		,DECODE(ra.spread_curve_id,6,ra.sp_fixed_date
4260 			,decode(LEAST(NVL(g_etc_start_date,ra.planning_start_date),ra.planning_end_date),ra.planning_end_date,ra.planning_start_date,NVL(g_etc_start_date,ra.planning_start_date))) planning_start_date   --Bug#6936782
4261 		,DECODE(ra.spread_curve_id,6,ra.sp_fixed_date,ra.planning_end_date) planning_end_date
4262 		,tmp.task_name
4263 		,tmp.resource_name
4264 	FROM pa_resource_assignments ra
4265 	    ,pa_fp_spread_calc_tmp tmp
4266 	WHERE ra.budget_version_id = p_budget_verson_id
4267 	AND  ra.resource_assignment_id = tmp.resource_assignment_id
4268 	AND NOT EXISTS
4269 		(SELECT 'No period exist'
4270         	FROM gl_periods gp
4271         	WHERE gp.period_set_name  = periodDetailsRec.period_set_name
4272         	AND gp.period_type        = decode(p_time_phase_code,'G',periodDetailsRec.accounted_period_type
4273 							,'P',periodDetailsRec.pa_period_type)
4274         	AND gp.adjustment_period_flag = 'N'
4275         	AND gp.start_date  <= decode(nvl(ra.spread_curve_id,1),6
4276 					 ,ra.sp_fixed_date,ra.planning_end_date)   -- plan end date
4277         	AND  gp.end_date   >= decode(nvl(ra.spread_curve_id,1),6
4278 					,ra.sp_fixed_date,decode(LEAST(NVL(g_etc_start_date,ra.planning_start_date),ra.planning_end_date),ra.planning_end_date,ra.planning_start_date,NVL(g_etc_start_date,ra.planning_start_date)))
4279 					-- planning start date Bug#6936782
4280 		);
4281 
4282 BEGIN
4283 	x_return_status := 'S';
4284 	x_msg_data := NULL;
4285 	IF p_time_phase_code IN ('G','P') Then
4286 		/* get set of book details from implementation setups */
4287 		OPEN get_name_and_type_csr;
4288 		FETCH get_name_and_type_csr INTO periodDetailsRec;
4289 		IF get_name_and_type_csr%NOTFOUND THEN
4290 			--raise others;
4291 			null;
4292 		END If;
4293 		CLOSE get_name_and_type_csr;
4294 
4295 		/* loop through each record for which no period has been defined in GL / PA
4296 		* populate error message for each planning resource
4297 		*/
4298 		FOR i IN get_ra_error_details LOOP
4299             		x_return_status := 'E';
4300             		PA_UTILS.ADD_MESSAGE
4301             		(p_app_short_name => 'PA'
4302                         ,p_msg_name      => 'PA_FP_PERIODS_IS_NULL'
4303             		,p_token1         => 'L_PROJECT_NAME'
4304                         ,p_value1         => g_project_name
4305                         ,p_token2         => 'L_TASK_NAME'
4306                         ,p_value2         => i.task_name
4307                         ,p_token3         => 'L_RESOURCE_NAME'
4308                         ,p_value3         => i.resource_name
4309                         ,p_token4         => 'L_LINE_START_DATE'
4310                         ,p_value4         => i.planning_start_date
4311                         ,p_token5        => 'L_LINE_END_DATE'
4312                         ,p_value5        => i.planning_end_date
4313             		);
4314 		END LOOP;
4315 	Else
4316 		NULL;
4317 	END If;
4318 	IF P_PA_DEBUG_MODE = 'Y' Then
4319          print_msg('End of Check_GLPA_periods_exists api ReturnStatus['||x_return_status||']');
4320         End If;
4321 
4322 EXCEPTION
4323 
4324         WHEN OTHERS THEN
4325                 x_return_status := 'U';
4326                 print_msg('Failed in Check_GLPA_periods_exists API'||sqlcode||sqlerrm);
4327                  fnd_msg_pub.add_exc_msg
4328                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
4329                  ,p_procedure_name => 'Check_GLPA_periods_exists');
4330                 RAISE;
4331 
4332 END Check_GLPA_periods_exists;
4333 
4334 
4335 /* This API will process the Non-Time phased budget lines */
4336 PROCEDURE process_NonTimePhase_Lines
4337                   (p_budget_version_id         IN Number
4338                   ,p_time_phased_code          IN Varchar2
4339                   ,p_apply_progress_flag       IN Varchar2
4340                   ,p_source_context            IN Varchar2
4341                   ,x_return_status             OUT NOCOPY Varchar2
4342                   ,x_msg_data                  OUT NOCOPY Varchar2
4343                   ) IS
4344 
4345         l_budget_line_id_tab       pa_plsql_datatypes.NumTabTyp;
4346         l_resAsgn_id_tab           pa_plsql_datatypes.NumTabTyp;
4347         l_txn_curr_code_tab        pa_plsql_datatypes.Char50TabTyp;
4348         l_start_date_tab           pa_plsql_datatypes.dateTabTyp;
4349         l_end_date_tab             pa_plsql_datatypes.dateTabTyp;
4350         l_rwCounter                INTEGER;
4351 
4352     CURSOR cur_blCorrupted IS
4353     SELECT tmp.resource_assignment_id
4354           ,tmp.txn_currency_code
4355           ,ra.planning_start_date
4356           ,ra.planning_end_date
4357           ,rl.alias resource_name
4358     FROM  pa_fp_spread_calc_tmp tmp
4359          ,pa_resource_assignments ra
4360          ,pa_resource_list_members rl
4361     WHERE tmp.budget_version_id = p_budget_version_id
4362     AND   ra.resource_assignment_id = tmp.resource_assignment_id
4363     AND   rl.resource_list_member_id = ra.resource_list_member_id
4364     AND   EXISTS ( select null
4365             from pa_budget_lines bl
4366             where bl.budget_version_id = p_budget_version_id
4367             and bl.resource_assignment_id = tmp.resource_assignment_id
4368             and bl.txn_currency_code = tmp.txn_currency_code
4369             group by bl.resource_assignment_id,bl.txn_currency_code
4370             having count(*) > 1
4371              );
4372 
4373     CURSOR cur_NonTimePhLines IS
4374     SELECT /*+ INDEX(BL PA_BUDGET_LINES_U1) */ bl.budget_line_id
4375                 ,bl.resource_assignment_id
4376                 ,bl.txn_currency_code
4377                 ,bl.start_date
4378                 ,bl.end_date
4379                 ,bl.period_name
4380                 ,bl.budget_version_id
4381                 ,bl.quantity bl_quantity
4382                 ,bl.txn_standard_cost_rate
4383                 ,bl.txn_cost_rate_override
4384                 ,bl.txn_raw_cost
4385                 ,bl.burden_cost_rate
4386                 ,bl.burden_cost_rate_override
4387                 ,bl.txn_burdened_cost
4388                 ,bl.txn_standard_bill_rate
4389                 ,bl.txn_bill_rate_override
4390                 ,bl.txn_revenue
4391                 ,bl.project_currency_code
4392                 ,bl.project_raw_cost
4393                 ,bl.project_burdened_cost
4394                 ,bl.project_revenue
4395                 ,bl.projfunc_currency_code
4396                 ,bl.raw_cost
4397                 ,bl.burdened_cost
4398                 ,bl.revenue
4399                 ,bl.cost_rejection_code
4400                 ,bl.burden_rejection_code
4401                 ,bl.revenue_rejection_code
4402                 ,bl.pc_cur_conv_rejection_code
4403                 ,bl.pfc_cur_conv_rejection_code
4404                 ,bl.init_quantity  bl_init_quantity
4405                 ,bl.txn_init_raw_cost
4406                 ,bl.txn_init_burdened_cost
4407                 ,bl.txn_init_revenue
4408                 ,tmp.new_plan_start_date   plan_start_date
4409         ,tmp.new_plan_end_date    plan_end_date
4410         FROM pa_budget_lines bl
4411             ,pa_fp_spread_calc_tmp tmp
4412         WHERE bl.budget_version_id = p_budget_version_id
4413         AND  bl.resource_assignment_id = tmp.resource_assignment_id
4414         AND  bl.txn_currency_code = tmp.txn_currency_code
4415     AND  NVL(tmp.plan_dates_change_flag,'N') = 'Y'
4416     AND  NVL(tmp.system_reference_var1,'N') = 'Y'  --ResourceWithMultiCurrency
4417     AND  ( (bl.start_date <> trunc(tmp.new_plan_start_date))
4418           OR
4419            (bl.end_date <> trunc(tmp.new_plan_end_date))
4420          );
4421 
4422     l_r_budget_line_id_tab          pa_plsql_datatypes.NumTabTyp;
4423         l_r_assignment_id_tab           pa_plsql_datatypes.NumTabTyp;
4424         l_r_txn_currency_code_tab       pa_plsql_datatypes.Char30TabTyp;
4425         l_r_start_date_tab          pa_plsql_datatypes.DateTabTyp;
4426         l_r_end_date_tab            pa_plsql_datatypes.DateTabTyp;
4427         l_r_period_name_tab         pa_plsql_datatypes.Char50TabTyp;
4428         l_r_quantity_tab            pa_plsql_datatypes.NumTabTyp;
4429         l_r_txn_raw_cost_tab            pa_plsql_datatypes.NumTabTyp;
4430         l_r_txn_burdened_cost_tab       pa_plsql_datatypes.NumTabTyp;
4431         l_r_txn_revenue_tab         pa_plsql_datatypes.NumTabTyp;
4432         l_r_project_currency_code_tab       pa_plsql_datatypes.Char30TabTyp;
4433         l_r_project_raw_cost_tab        pa_plsql_datatypes.NumTabTyp;
4434         l_r_project_burdened_cost_tab       pa_plsql_datatypes.NumTabTyp;
4435         l_r_project_revenue_tab         pa_plsql_datatypes.NumTabTyp;
4436         l_r_projfunc_currency_code_tab      pa_plsql_datatypes.Char30TabTyp;
4437         l_r_raw_cost_tab            pa_plsql_datatypes.NumTabTyp;
4438         l_r_burdened_cost_tab           pa_plsql_datatypes.NumTabTyp;
4439         l_r_revenue_tab             pa_plsql_datatypes.NumTabTyp;
4440         l_r_cost_rejection_code_tab     pa_plsql_datatypes.Char30TabTyp;
4441         l_r_burden_rejection_code_tab       pa_plsql_datatypes.Char30TabTyp;
4442         l_r_revenue_rejection_code_tab      pa_plsql_datatypes.Char30TabTyp;
4443         l_r_pc_cur_rejection_code_tab       pa_plsql_datatypes.Char30TabTyp;
4444         l_r_pfc_cur_rejection_code_tab      pa_plsql_datatypes.Char30TabTyp;
4445 
4446 
4447     Procedure InitReturningPlsqlTabls IS
4448 
4449     Begin
4450         l_r_budget_line_id_tab.delete;
4451             l_r_assignment_id_tab.delete;
4452             l_r_txn_currency_code_tab.delete;
4453             l_r_start_date_tab.delete;
4454             l_r_end_date_tab.delete;
4455             l_r_period_name_tab.delete;
4456             l_r_quantity_tab.delete;
4457             l_r_txn_raw_cost_tab.delete;
4458             l_r_txn_burdened_cost_tab.delete;
4459             l_r_txn_revenue_tab.delete;
4460             l_r_project_currency_code_tab.delete;
4461             l_r_project_raw_cost_tab.delete;
4462             l_r_project_burdened_cost_tab.delete;
4463             l_r_project_revenue_tab.delete;
4464             l_r_projfunc_currency_code_tab.delete;
4465             l_r_raw_cost_tab.delete;
4466             l_r_burdened_cost_tab.delete;
4467             l_r_revenue_tab.delete;
4468             l_r_cost_rejection_code_tab.delete;
4469             l_r_burden_rejection_code_tab.delete;
4470             l_r_revenue_rejection_code_tab.delete;
4471             l_r_pc_cur_rejection_code_tab.delete;
4472             l_r_pfc_cur_rejection_code_tab.delete;
4473 
4474     End InitReturningPlsqlTabls;
4475 
4476 
4477 BEGIN
4478     x_return_status := 'S';
4479     x_msg_data      := NULL;
4480 
4481     IF (p_time_phased_code NOT IN ('P','G') AND p_source_context <> 'BUDGET_LINE') Then  --{
4482         FOR i IN cur_blCorrupted LOOP
4483             x_return_status := 'E';
4484             PA_UTILS.ADD_MESSAGE
4485             (p_app_short_name => 'PA'
4486                         ,p_msg_name      => 'PA_FP_MULTI_NON_PERIOD'
4487             ,p_token1         => 'L_PROJECT_NAME'
4488                         ,p_value1         => g_project_name
4489                         ,p_token2         => 'L_TASK_NAME'
4490                         ,p_value2         => null
4491                         ,p_token3         => 'L_RESOURCE_NAME'
4492                         ,p_value3         => i.resource_name
4493                         ,p_token4         => 'L_LINE_START_DATE'
4494                         ,p_value4         => i.planning_start_date
4495                         ,p_token5        => 'L_LINE_END_DATE'
4496                         ,p_value5        => i.planning_end_date
4497             );
4498 
4499         END LOOP;
4500         IF x_return_status = 'S' Then  --{
4501            l_budget_line_id_tab.delete;
4502                l_resAsgn_id_tab.delete;
4503                l_txn_curr_code_tab.delete;
4504                l_start_date_tab.delete;
4505                l_end_date_tab.delete;
4506                l_rwCounter := 0;
4507            FOR i IN cur_NonTimePhLines LOOP
4508                    /* populate the plsql tabs for bulk update of budget lines later */
4509                    l_rwCounter := l_rwCounter + 1;
4510                    l_budget_line_id_tab(l_rwCounter) := i.budget_line_id;
4511                    l_resAsgn_id_tab(l_rwCounter) := i.resource_assignment_id;
4512                    l_txn_curr_code_tab(l_rwCounter) := i.txn_currency_code;
4513                    l_start_date_tab(l_rwCounter) := i.plan_start_date;
4514                    l_end_date_tab(l_rwCounter) := i.plan_end_date;
4515 
4516                    IF (g_rollup_required_flag = 'Y'
4517 		       /* bug fix:5031388
4518                        AND i.cost_rejection_code is NULL
4519                        AND i.burden_rejection_code is NULL
4520                        AND i.revenue_rejection_code is NULL
4521                        AND i.pc_cur_conv_rejection_code is NULL
4522                        AND i.pfc_cur_conv_rejection_code is NULL */
4523 		      	)  Then
4524 
4525                        /* before updating the existing budget line call the reporting API to pass -ve amts */
4526                        PA_FP_CALC_PLAN_PKG.Add_Toreporting_Tabls
4527                        (p_calling_module               => 'CALCULATE_API'
4528                        ,p_activity_code                => 'UPDATE'
4529                        ,p_budget_version_id            => p_budget_version_id
4530                        ,p_budget_line_id               => i.budget_line_id
4531                        ,p_resource_assignment_id       => i.resource_assignment_id
4532                        ,p_start_date                   => i.start_date
4533                        ,p_end_date                     => i.end_date
4534                        ,p_period_name                  => i.period_name
4535                        ,p_txn_currency_code            => i.txn_currency_code
4536                        ,p_quantity                     => i.bl_quantity *-1
4537                        ,p_txn_raw_cost                 => i.txn_raw_cost *-1
4538                        ,p_txn_burdened_cost            => i.txn_burdened_cost *-1
4539                        ,p_txn_revenue                  => i.txn_revenue *-1
4540                        ,p_project_currency_code        => i.project_currency_code
4541                        ,p_project_raw_cost             => i.project_raw_cost *-1
4542                        ,p_project_burdened_cost        => i.project_burdened_cost *-1
4543                        ,p_project_revenue              => i.project_revenue *-1
4544                        ,p_projfunc_currency_code       => i.projfunc_currency_code
4545                        ,p_projfunc_raw_cost            => i.raw_cost *-1
4546                        ,p_projfunc_burdened_cost       => i.burdened_cost *-1
4547                        ,p_projfunc_revenue             => i.revenue *-1
4548 			,p_rep_line_mode               => 'REVERSAL'
4549                        ,x_msg_data                     => x_msg_data
4550                        ,x_return_status                => x_return_status
4551                        );
4552                   End If;
4553               END LOOP;
4554           IF l_budget_line_id_tab.COUNT > 0 THEN  --{
4555             InitReturningPlsqlTabls;
4556             --print_msg('Updating budget lines with planning start and end dates for Non-TimePhase budget');
4557             FORALL i IN l_budget_line_id_tab.FIRST .. l_budget_line_id_tab.LAST
4558             UPDATE PA_BUDGET_LINES bl
4559             SET bl.start_date = NVL(l_start_date_tab(i),bl.start_date)
4560                ,bl.end_date   = NVL(l_end_date_tab(i),bl.end_date)
4561             WHERE bl.budget_version_id = p_budget_version_id
4562             AND  bl.budget_line_id = l_budget_line_id_tab(i)
4563             RETURNING
4564              bl.budget_line_id
4565             ,bl.resource_assignment_id
4566             ,bl.txn_currency_code
4567             ,bl.start_date
4568             ,bl.end_date
4569             ,bl.period_name
4570             ,bl.quantity
4571             ,bl.txn_raw_cost
4572             ,bl.txn_burdened_cost
4573             ,bl.txn_revenue
4574             ,bl.project_currency_code
4575             ,bl.project_raw_cost
4576             ,bl.project_burdened_cost
4577             ,bl.project_revenue
4578             ,bl.projfunc_currency_code
4579             ,bl.raw_cost
4580             ,bl.burdened_cost
4581             ,bl.revenue
4582             ,bl.cost_rejection_code
4583                         ,bl.burden_rejection_code
4584                         ,bl.revenue_rejection_code
4585                         ,bl.pc_cur_conv_rejection_code
4586                         ,bl.pfc_cur_conv_rejection_code
4587             BULK COLLECT INTO
4588                 l_r_budget_line_id_tab
4589                             ,l_r_assignment_id_tab
4590                             ,l_r_txn_currency_code_tab
4591                             ,l_r_start_date_tab
4592                             ,l_r_end_date_tab
4593                             ,l_r_period_name_tab
4594                             ,l_r_quantity_tab
4595                             ,l_r_txn_raw_cost_tab
4596                             ,l_r_txn_burdened_cost_tab
4597                             ,l_r_txn_revenue_tab
4598                             ,l_r_project_currency_code_tab
4599                             ,l_r_project_raw_cost_tab
4600                             ,l_r_project_burdened_cost_tab
4601                             ,l_r_project_revenue_tab
4602                             ,l_r_projfunc_currency_code_tab
4603                             ,l_r_raw_cost_tab
4604                             ,l_r_burdened_cost_tab
4605                             ,l_r_revenue_tab
4606                             ,l_r_cost_rejection_code_tab
4607                             ,l_r_burden_rejection_code_tab
4608                             ,l_r_revenue_rejection_code_tab
4609                             ,l_r_pc_cur_rejection_code_tab
4610                             ,l_r_pfc_cur_rejection_code_tab ;
4611             /* Now pass the +ve values to pji rollup api */
4612             IF g_rollup_required_flag = 'Y' Then  --{
4613             IF l_r_budget_line_id_tab.COUNT > 0 Then
4614                     FOR i IN l_r_budget_line_id_tab.FIRST .. l_r_budget_line_id_tab.LAST LOOP
4615                           IF (g_rollup_required_flag = 'Y'
4616 			   /* bug fix:5031388
4617                            AND l_r_cost_rejection_code_tab(i) is NULL
4618                            AND l_r_burden_rejection_code_tab(i) is NULL
4619                            AND l_r_revenue_rejection_code_tab(i) is NULL
4620                            AND l_r_pc_cur_rejection_code_tab(i) is NULL
4621                            AND l_r_pfc_cur_rejection_code_tab(i) is NULL */
4622 				)  Then
4623 
4624                            /* After updating the budget line dates, pass the +ve values */
4625                            PA_FP_CALC_PLAN_PKG.Add_Toreporting_Tabls
4626                            (p_calling_module               => 'CALCULATE_API'
4627                            ,p_activity_code                => 'UPDATE'
4628                            ,p_budget_version_id            => p_budget_version_id
4629                            ,p_budget_line_id               => l_r_budget_line_id_tab(i)
4630                            ,p_resource_assignment_id       => l_r_assignment_id_tab(i)
4631                            ,p_start_date                   => l_r_start_date_tab(i)
4632                            ,p_end_date                     => l_r_end_date_tab(i)
4633                            ,p_period_name                  => l_r_period_name_tab(i)
4634                            ,p_txn_currency_code            => l_r_txn_currency_code_tab(i)
4635                            ,p_quantity                     => l_r_quantity_tab(i)
4636                            ,p_txn_raw_cost                 => l_r_txn_raw_cost_tab(i)
4637                            ,p_txn_burdened_cost            => l_r_txn_burdened_cost_tab(i)
4638                            ,p_txn_revenue                  => l_r_txn_revenue_tab(i)
4639                            ,p_project_currency_code        => l_r_project_currency_code_tab(i)
4640                            ,p_project_raw_cost             => l_r_project_raw_cost_tab(i)
4641                            ,p_project_burdened_cost        => l_r_project_burdened_cost_tab(i)
4642                            ,p_project_revenue              => l_r_project_revenue_tab(i)
4643                            ,p_projfunc_currency_code       => l_r_projfunc_currency_code_tab(i)
4644                            ,p_projfunc_raw_cost            => l_r_raw_cost_tab(i)
4645                            ,p_projfunc_burdened_cost       => l_r_burdened_cost_tab(i)
4646                            ,p_projfunc_revenue             => l_r_revenue_tab(i)
4647 			   ,p_rep_line_mode               => 'POSITIVE_ENTRY'
4648                            ,x_msg_data                     => x_msg_data
4649                            ,x_return_status                => x_return_status
4650                            );
4651                        End If;
4652                       END LOOP;
4653               END IF;
4654               /* release the buffer */
4655               InitReturningPlsqlTabls;
4656               END If; --}
4657           END IF; --}
4658         END IF; --}
4659     END IF; --}
4660 	IF P_PA_DEBUG_MODE = 'Y' Then
4661          print_msg('End of process_NonTimePhase_Lines api ReturnStatus['||x_return_status||']');
4662 	End If;
4663 
4664 EXCEPTION
4665         WHEN OTHERS THEN
4666                 x_return_status := 'U';
4667                 x_msg_data := sqlcode||sqlerrm;
4668                 print_msg('Failed in process_NonTimePhase_Lines API'||x_msg_data);
4669                  fnd_msg_pub.add_exc_msg
4670                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
4671                  ,p_procedure_name => 'process_NonTimePhase_Lines');
4672                 RAISE;
4673 END process_NonTimePhase_Lines;
4674 
4675 /* This API deletes all the budget lines which falls beyond the planning start and end dates
4676 */
4677 PROCEDURE delete_budget_lines(
4678         p_budget_version_id             IN Number
4679                 ,p_budget_version_type          IN Varchar2
4680                 ,p_rollup_required_flag         IN Varchar2
4681         ,p_process_mode                 IN Varchar2
4682                 ,x_return_status                OUT NOCOPY Varchar2
4683                 ,x_msg_data                     OUT NOCOPY Varchar2
4684                 ) IS
4685         /* This cursor picks all the budget lines which falls beyond the plan dates
4686          * where actual donot exists and deletes the records from pa_budget_lines table
4687          */
4688         CURSOR cur_Delbl_Lines IS
4689         SELECT /*+ INDEX(BL PA_BUDGET_LINES_U1) */ bl.budget_line_id
4690                 ,bl.resource_assignment_id
4691                 ,bl.txn_currency_code
4692                 ,bl.start_date
4693                 ,bl.end_date
4694                 ,bl.period_name
4695                 ,bl.budget_version_id
4696                 ,bl.quantity bl_quantity
4697                 ,bl.txn_standard_cost_rate
4698                 ,bl.txn_cost_rate_override
4699                 ,bl.txn_raw_cost
4700                 ,bl.burden_cost_rate
4701                 ,bl.burden_cost_rate_override
4702                 ,bl.txn_burdened_cost
4703                 ,bl.txn_standard_bill_rate
4704                 ,bl.txn_bill_rate_override
4705                 ,bl.txn_revenue
4706                 ,bl.project_currency_code
4707                 ,bl.project_raw_cost
4708                 ,bl.project_burdened_cost
4709                 ,bl.project_revenue
4710                 ,bl.projfunc_currency_code
4711                 ,bl.raw_cost
4712                 ,bl.burdened_cost
4713                 ,bl.revenue
4714                 ,bl.cost_rejection_code
4715                 ,bl.burden_rejection_code
4716                 ,bl.revenue_rejection_code
4717                 ,bl.pc_cur_conv_rejection_code
4718                 ,bl.pfc_cur_conv_rejection_code
4719                 ,bl.init_quantity  bl_init_quantity
4720                 ,bl.txn_init_raw_cost
4721                 ,bl.txn_init_burdened_cost
4722                 ,bl.txn_init_revenue
4723         ,tmp.start_date  plan_start_date ,tmp.end_date plan_end_date
4724         FROM pa_budget_lines bl
4725             ,pa_fp_rollup_tmp tmp
4726         WHERE bl.budget_version_id = p_budget_version_id
4727         AND  bl.resource_assignment_id = tmp.resource_assignment_id
4728         AND  bl.txn_currency_code = tmp.txn_currency_code
4729     AND  NVL(tmp.processed_flag,'N') = 'Y'
4730     AND  ( NVL(bl.init_quantity,0) = 0
4731         and NVL(bl.txn_init_raw_cost,0) = 0
4732         and NVL(bl.txn_init_burdened_cost,0) = 0
4733         and NVL(bl.txn_init_revenue,0) = 0
4734          )
4735         AND  (( p_process_mode = 'PLAN_START_DATE'
4736         AND NVL(plan_Start_Date_shrunk_flag,'N') = 'Y'
4737             AND bl.end_date  < tmp.start_date )
4738          OR (p_process_mode = 'PLAN_END_DATE'
4739         AND NVL(plan_End_Date_shrunk_flag,'N') = 'Y'
4740         AND bl.start_date > tmp.END_DATE)
4741         );
4742 
4743     l_budget_line_id_tab       pa_plsql_datatypes.NumTabTyp;
4744         l_resAsgn_id_tab           pa_plsql_datatypes.NumTabTyp;
4745         l_txn_curr_code_tab        pa_plsql_datatypes.Char50TabTyp;
4746         l_start_date_tab           pa_plsql_datatypes.dateTabTyp;
4747     l_rwCounter                INTEGER;
4748     l_populate_mrc_tab_flag   Varchar2(10) := 'N';  --MRC Elimination Changes:NVL(PA_FP_CALC_PLAN_PKG.G_populate_mrc_tab_flag,'N');
4749 BEGIN
4750         x_return_status := 'S';
4751         /* Initialize the error stack */
4752     If p_pa_debug_mode = 'Y' Then
4753             pa_debug.init_err_stack('PA_FP_CALC_UTILS.delete_budget_lines');
4754     End If;
4755 
4756     --print_msg('Entered delete_budget_lines api');
4757         /* Initialize the plsql tabs */
4758         l_budget_line_id_tab.delete;
4759         l_resAsgn_id_tab.delete;
4760         l_txn_curr_code_tab.delete;
4761         l_start_date_tab.delete;
4762         l_rwCounter := 0;
4763 
4764         FOR i IN cur_Delbl_Lines LOOP  --{
4765         --print_msg('Loop for bdgetlined['||i.budget_line_id||']curCode['||i.txn_currency_code||']plSd['||i.plan_start_date||']plEd['||i.plan_end_date||']');
4766            /* populate the plsql tabs for bulk update of budget lines later */
4767            l_rwCounter := l_rwCounter + 1;
4768            l_budget_line_id_tab(l_rwCounter) := i.budget_line_id;
4769            l_resAsgn_id_tab(l_rwCounter) := i.resource_assignment_id;
4770            l_txn_curr_code_tab(l_rwCounter) := i.txn_currency_code;
4771            l_start_date_tab(l_rwCounter) := i.start_date;
4772 
4773            IF (p_rollup_required_flag = 'Y'
4774 		/* bug fix:5031388
4775                 AND i.cost_rejection_code is NULL
4776                 AND i.burden_rejection_code is NULL
4777                 AND i.revenue_rejection_code is NULL
4778                 AND i.pc_cur_conv_rejection_code is NULL
4779                 AND i.pfc_cur_conv_rejection_code is NULL */
4780 		 )  Then
4781 
4782                 /* before updating the existing budget line call the reporting API to pass -ve amts */
4783                 PA_FP_CALC_PLAN_PKG.Add_Toreporting_Tabls
4784                 (p_calling_module               => 'CALCULATE_API'
4785                 ,p_activity_code                => 'UPDATE'
4786                 ,p_budget_version_id            => p_budget_version_id
4787                 ,p_budget_line_id               => i.budget_line_id
4788                 ,p_resource_assignment_id       => i.resource_assignment_id
4789                 ,p_start_date                   => i.start_date
4790                 ,p_end_date                     => i.end_date
4791                 ,p_period_name                  => i.period_name
4792                 ,p_txn_currency_code            => i.txn_currency_code
4793                 ,p_quantity                     => i.bl_quantity *-1
4794                 ,p_txn_raw_cost                 => i.txn_raw_cost *-1
4795                 ,p_txn_burdened_cost            => i.txn_burdened_cost *-1
4796                 ,p_txn_revenue                  => i.txn_revenue *-1
4797                 ,p_project_currency_code        => i.project_currency_code
4798                 ,p_project_raw_cost             => i.project_raw_cost *-1
4799                 ,p_project_burdened_cost        => i.project_burdened_cost *-1
4800                 ,p_project_revenue              => i.project_revenue *-1
4801                 ,p_projfunc_currency_code       => i.projfunc_currency_code
4802                 ,p_projfunc_raw_cost            => i.raw_cost *-1
4803                 ,p_projfunc_burdened_cost       => i.burdened_cost *-1
4804                 ,p_projfunc_revenue             => i.revenue *-1
4805 		,p_rep_line_mode               => 'REVERSAL'
4806                 ,x_msg_data                     => x_msg_data
4807                 ,x_return_status                => x_return_status
4808                 );
4809           End If;
4810 
4811       /* Added for MRC enhancements */
4812           IF NVL(l_populate_mrc_tab_flag,'N') = 'Y' Then --{
4813         PA_FP_CALC_PLAN_PKG.populate_MRC_plsqltabs
4814                 (p_calling_module               => 'CALCULATE_API'
4815                 ,p_budget_version_id            => p_budget_version_id
4816                 ,p_budget_line_id               => i.budget_line_id
4817                 ,p_resource_assignment_id       => i.resource_assignment_id
4818                 ,p_start_date                   => i.start_date
4819                 ,p_end_date                     => i.end_date
4820                 ,p_period_name                  => i.period_name
4821                 ,p_txn_currency_code            => i.txn_currency_code
4822                 ,p_quantity                     => i.bl_quantity
4823                 ,p_txn_raw_cost                 => i.txn_raw_cost
4824                 ,p_txn_burdened_cost            => i.txn_burdened_cost
4825                 ,p_txn_revenue                  => i.txn_revenue
4826                 ,p_project_currency_code        => i.project_currency_code
4827                 ,p_project_raw_cost             => i.project_raw_cost
4828                 ,p_project_burdened_cost        => i.project_burdened_cost
4829                 ,p_project_revenue              => i.project_revenue
4830                 ,p_projfunc_currency_code       => i.projfunc_currency_code
4831                 ,p_projfunc_raw_cost            => i.raw_cost
4832                 ,p_projfunc_burdened_cost       => i.burdened_cost
4833                 ,p_projfunc_revenue             => i.revenue
4834         ,p_delete_flag                  => 'Y'
4835                 ,x_msg_data                     => x_msg_data
4836                 ,x_return_status                => x_return_status
4837                 );
4838       End If;
4839 
4840     END LOOP;
4841 
4842     print_msg('Number of budgetLines deleted['||l_budget_line_id_tab.COUNT||']');
4843     /* Now delete the budget lines */
4844     IF l_budget_line_id_tab.COUNT > 0 THEN
4845         FORALL i IN l_budget_line_id_tab.FIRST .. l_budget_line_id_tab.LAST
4846         DELETE FROM PA_BUDGET_LINES bl
4847         WHERE bl.budget_version_id = p_budget_version_id
4848         AND bl.budget_line_id = l_budget_line_id_tab(i);
4849     END IF;
4850 
4851     --print_msg('ReturnStatus['||x_return_status||']');
4852         /* reset the error stack */
4853     If p_pa_debug_mode = 'Y' Then
4854             pa_debug.reset_err_stack;
4855     End If;
4856 
4857 EXCEPTION
4858         WHEN OTHERS THEN
4859                 x_return_status := 'U';
4860                 x_msg_data := sqlcode||sqlerrm;
4861                 print_msg('Failed in delete_budget_lines API'||x_msg_data);
4862         If p_pa_debug_mode = 'Y' Then
4863                     pa_debug.reset_err_stack;
4864         End If;
4865                  fnd_msg_pub.add_exc_msg
4866                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
4867                  ,p_procedure_name => 'delete_budget_lines');
4868                 RAISE;
4869 END delete_budget_lines ;
4870 
4871 /* This API inserts a new budget line with the given quantity for new budget line dates
4872  * If duplicate line exists then updates the existing line by adding the given quantity
4873  */
4874 PROCEDURE insert_budget_lines(
4875         p_budget_version_id             IN Number
4876         ,p_budget_version_type          IN Varchar2
4877         ,p_rollup_required_flag         IN Varchar2
4878         ,x_return_status                OUT NOCOPY Varchar2
4879         ,x_msg_data                     OUT NOCOPY Varchar2
4880         ) IS
4881 
4882     CURSOR cur_Oldbl_Lines IS
4883     SELECT /*+ INDEX(BL PA_BUDGET_LINES_U1) */ bl.budget_line_id
4884         ,bl.resource_assignment_id
4885         ,bl.txn_currency_code
4886         ,bl.start_date
4887         ,bl.end_date
4888         ,bl.period_name
4889         ,bl.budget_version_id
4890         ,bl.quantity bl_quantity
4891         ,bl.txn_standard_cost_rate
4892         ,bl.txn_cost_rate_override
4893         ,bl.txn_raw_cost
4894         ,bl.burden_cost_rate
4895         ,bl.burden_cost_rate_override
4896         ,bl.txn_burdened_cost
4897         ,bl.txn_standard_bill_rate
4898         ,bl.txn_bill_rate_override
4899         ,bl.txn_revenue
4900         ,bl.project_currency_code
4901         ,bl.project_raw_cost
4902         ,bl.project_burdened_cost
4903         ,bl.project_revenue
4904         ,bl.projfunc_currency_code
4905         ,bl.raw_cost
4906         ,bl.burdened_cost
4907         ,bl.revenue
4908         ,bl.cost_rejection_code
4909         ,bl.burden_rejection_code
4910         ,bl.revenue_rejection_code
4911         ,bl.pc_cur_conv_rejection_code
4912         ,bl.pfc_cur_conv_rejection_code
4913         ,bl.init_quantity  bl_init_quantity
4914         ,bl.txn_init_raw_cost
4915         ,bl.txn_init_burdened_cost
4916         ,bl.txn_init_revenue
4917         ,tmp.quantity  fp_quantity
4918     FROM pa_budget_lines bl
4919         ,pa_fp_rollup_tmp tmp
4920     WHERE bl.budget_version_id = p_budget_version_id
4921     AND  bl.resource_assignment_id = tmp.resource_assignment_id
4922     AND  bl.txn_currency_code = tmp.txn_currency_code
4923     AND  bl.start_date = tmp.start_date
4924     AND  NVL(tmp.quantity,0) <> 0 ;
4925 
4926     /* This cursor picks all the records from rollup tmp where budget line donot exists
4927      * and insert these records into budget lines */
4928     CURSOR cur_newtmp_lines IS
4929     SELECT PA_BUDGET_LINES_S.NEXTVAL
4930            ,tmp.resource_assignment_id
4931            ,tmp.txn_currency_code
4932            ,tmp.start_date
4933            ,tmp.end_date
4934         ,tmp.period_name
4935         ,tmp.quantity
4936         ,tmp.project_currency_code
4937         ,tmp.projfunc_currency_code
4938     FROM pa_fp_rollup_tmp tmp
4939     WHERE tmp.budget_version_id = p_budget_version_id
4940     AND NOT EXISTS
4941         (SELECT null
4942         FROM pa_budget_lines bl
4943         WHERE bl.budget_version_id = p_budget_version_id
4944         AND  bl.resource_assignment_id = tmp.resource_assignment_id
4945             AND  bl.txn_currency_code = tmp.txn_currency_code
4946             AND  bl.start_date = tmp.start_date
4947         );
4948 
4949     l_budget_line_id_tab       pa_plsql_datatypes.NumTabTyp;
4950     l_resAsgn_id_tab           pa_plsql_datatypes.NumTabTyp;
4951     l_txn_curr_code_tab        pa_plsql_datatypes.Char50TabTyp;
4952     l_start_date_tab           pa_plsql_datatypes.dateTabTyp;
4953     l_end_date_tab             pa_plsql_datatypes.dateTabTyp;
4954     l_period_name_tab      pa_plsql_datatypes.Char50TabTyp;
4955     l_quantity_tab             pa_plsql_datatypes.NumTabTyp;
4956     l_proj_curr_code_tab       pa_plsql_datatypes.Char50TabTyp;
4957     l_projfunc_curr_code_tab   pa_plsql_datatypes.Char50TabTyp;
4958     l_txn_raw_cost_tab     pa_plsql_datatypes.NumTabTyp;
4959     l_txn_burden_cost_tab      pa_plsql_datatypes.NumTabTyp;
4960     l_txn_revenue_tab      pa_plsql_datatypes.NumTabTyp;
4961 
4962     l_rwCounter        Number;
4963     l_populate_mrc_tab_flag   Varchar2(10) := 'N'; --MRC Elimination changes:NVL(PA_FP_CALC_PLAN_PKG.G_populate_mrc_tab_flag,'N');
4964 
4965 BEGIN
4966 
4967     x_return_status := 'S';
4968     /* Initialize the error stack */
4969     If p_pa_debug_mode = 'Y' Then
4970         pa_debug.init_err_stack('PA_FP_CALC_UTILS.insert_budget_lines');
4971     End If;
4972     --print_msg('Entered insert_budget_lines api');
4973         /* Initialize the plsql tabs */
4974         l_budget_line_id_tab.delete;
4975         l_resAsgn_id_tab.delete;
4976         l_txn_curr_code_tab.delete;
4977         l_start_date_tab.delete;
4978         l_end_date_tab.delete;
4979         l_period_name_tab.delete;
4980         l_quantity_tab.delete;
4981         l_proj_curr_code_tab.delete;
4982         l_projfunc_curr_code_tab.delete;
4983     l_txn_raw_cost_tab.delete;
4984     l_txn_burden_cost_tab.delete;
4985     l_txn_revenue_tab.delete;
4986     l_rwCounter := 0;
4987 
4988     FOR i IN cur_Oldbl_Lines LOOP  --{
4989 
4990        --print_msg('Inside Loop OldbdgtLineId['||i.budget_line_id||']Qty['||i.bl_quantity||']FpQty['||i.fp_quantity||']');
4991        /* populate the plsql tabs for bulk update of budget lines later */
4992        l_rwCounter := l_rwCounter + 1;
4993        l_budget_line_id_tab(l_rwCounter) := i.budget_line_id;
4994        l_resAsgn_id_tab(l_rwCounter) := i.resource_assignment_id;
4995        l_txn_curr_code_tab(l_rwCounter) := i.txn_currency_code;
4996        l_start_date_tab(l_rwCounter) := i.start_date;
4997        l_end_date_tab(l_rwCounter) := i.end_date;
4998        l_period_name_tab(l_rwCounter) := i.period_name;
4999        l_quantity_tab(l_rwCounter) :=  nvl(i.fp_quantity,0);
5000        IF p_budget_version_type in ('ALL','COST') Then
5001             l_txn_raw_cost_tab(l_rwCounter) := pa_currency.round_trans_currency_amt1((((nvl(i.bl_quantity,0)-nvl(i.bl_init_quantity,0) + nvl(i.fp_quantity,0))*
5002                                         nvl(i.txn_cost_rate_override,i.txn_standard_cost_rate)) +nvl(i.txn_init_raw_cost,0)),i.txn_currency_code);
5003                 l_txn_burden_cost_tab(l_rwCounter) := pa_currency.round_trans_currency_amt1((((nvl(i.bl_quantity,0)-nvl(i.bl_init_quantity,0) + nvl(i.fp_quantity,0))*
5004                                         nvl(i.burden_cost_rate_override,i.burden_cost_rate)) + nvl(i.txn_init_burdened_cost,0)),i.txn_currency_code);
5005        ELSE
5006         l_txn_raw_cost_tab(l_rwCounter) := NULL;
5007         l_txn_burden_cost_tab(l_rwCounter) := NULL;
5008        END IF;
5009        IF p_budget_version_type in ('ALL','REVENUE') Then
5010                 l_txn_revenue_tab(l_rwCounter) := pa_currency.round_trans_currency_amt1((((nvl(i.bl_quantity,0)-nvl(i.bl_init_quantity,0) + nvl(i.fp_quantity,0))*
5011                                         nvl(i.txn_bill_rate_override,i.txn_standard_bill_rate)) +nvl(i.txn_init_revenue,0)),i.txn_currency_code);
5012        Else
5013         l_txn_revenue_tab(l_rwCounter) := NULL;
5014        End If;
5015 
5016        IF (p_rollup_required_flag = 'Y'
5017 	/* bug fix:5031388
5018         AND i.cost_rejection_code is NULL
5019         AND i.burden_rejection_code is NULL
5020         AND i.revenue_rejection_code is NULL
5021         AND i.pc_cur_conv_rejection_code is NULL
5022         AND i.pfc_cur_conv_rejection_code is NULL */
5023 	 )  Then
5024 
5025         /* before updating the existing budget line call the reporting API to pass -ve amts */
5026         PA_FP_CALC_PLAN_PKG.Add_Toreporting_Tabls
5027                 (p_calling_module               => 'CALCULATE_API'
5028                 ,p_activity_code                => 'UPDATE'
5029                 ,p_budget_version_id            => p_budget_version_id
5030                 ,p_budget_line_id               => i.budget_line_id
5031                 ,p_resource_assignment_id       => i.resource_assignment_id
5032                 ,p_start_date                   => i.start_date
5033                 ,p_end_date                     => i.end_date
5034                 ,p_period_name                  => i.period_name
5035                 ,p_txn_currency_code            => i.txn_currency_code
5036                 ,p_quantity                     => i.bl_quantity *-1
5037                 ,p_txn_raw_cost                 => i.txn_raw_cost *-1
5038                 ,p_txn_burdened_cost            => i.txn_burdened_cost *-1
5039                 ,p_txn_revenue                  => i.txn_revenue *-1
5040                 ,p_project_currency_code        => i.project_currency_code
5041                 ,p_project_raw_cost             => i.project_raw_cost *-1
5042                 ,p_project_burdened_cost        => i.project_burdened_cost *-1
5043                 ,p_project_revenue              => i.project_revenue *-1
5044                 ,p_projfunc_currency_code       => i.projfunc_currency_code
5045                 ,p_projfunc_raw_cost            => i.raw_cost *-1
5046                 ,p_projfunc_burdened_cost       => i.burdened_cost *-1
5047                 ,p_projfunc_revenue             => i.revenue *-1
5048 		,p_rep_line_mode               => 'REVERSAL'
5049                 ,x_msg_data                     => x_msg_data
5050                 ,x_return_status                => x_return_status
5051                 );
5052       End If;
5053 
5054     END LOOP;  --}
5055 
5056     /* Now bulk update the budget lines */
5057     IF l_budget_line_id_tab.COUNT > 0 THEN
5058         --print_msg('Number of budget Lines updated['||l_budget_line_id_tab.COUNT||']');
5059         FORALL i IN l_budget_line_id_tab.FIRST .. l_budget_line_id_tab.LAST
5060             /* now update the budget lines with new quantity */
5061             UPDATE PA_BUDGET_LINES bl
5062             SET bl.quantity = NVL(bl.quantity,0) + NVL(l_quantity_tab(i),0)
5063                 ,bl.txn_raw_cost =  decode(p_budget_version_type,'REVENUE',bl.txn_raw_cost,l_txn_raw_cost_tab(i))
5064                 ,bl.txn_burdened_cost = decode(p_budget_version_type,'REVENUE',bl.txn_burdened_cost,l_txn_burden_cost_tab(i))
5065                 ,bl.txn_revenue = decode(p_budget_version_type,'COST',bl.txn_revenue,l_txn_revenue_tab(i))
5066             WHERE bl.budget_line_id = l_budget_line_id_tab(i)
5067             AND   bl.budget_version_id = p_budget_version_id ;
5068 
5069         FORALL i IN l_budget_line_id_tab.FIRST .. l_budget_line_id_tab.LAST
5070             UPDATE PA_BUDGET_LINES bl
5071                 SET bl.project_raw_cost = decode(p_budget_version_type,'REVENUE',bl.project_raw_cost
5072                     ,decode(bl.project_currency_code,bl.txn_currency_code,bl.txn_raw_cost
5073                     ,pa_currency.round_trans_currency_amt1((bl.txn_raw_cost * bl.project_cost_exchange_rate ),bl.project_currency_code)))
5074                 ,bl.project_burdened_cost = decode(p_budget_version_type,'REVENUE',bl.project_burdened_cost
5075                     ,decode(bl.project_currency_code,bl.txn_currency_code,bl.txn_burdened_cost
5076                     ,pa_currency.round_trans_currency_amt1((bl.txn_burdened_cost * bl.project_cost_exchange_rate ),bl.project_currency_code)))
5077                 ,bl.project_revenue = decode(p_budget_version_type,'COST',bl.project_revenue
5078                     ,decode(bl.project_currency_code,bl.txn_currency_code,bl.project_revenue
5079                     ,pa_currency.round_trans_currency_amt1((bl.project_revenue*bl.project_rev_exchange_rate ),bl.project_currency_code)))
5080                 ,bl.raw_cost = decode(p_budget_version_type,'REVENUE',bl.raw_cost
5081                     ,decode(bl.projfunc_currency_code,bl.txn_currency_code,bl.txn_raw_cost
5082                                         ,pa_currency.round_trans_currency_amt1((bl.txn_raw_cost * bl.projfunc_cost_exchange_rate ),bl.projfunc_currency_code)))
5083                     ,bl.burdened_cost = decode(p_budget_version_type,'REVENUE',bl.burdened_cost
5084                     ,decode(bl.projfunc_currency_code,bl.txn_currency_code,bl.txn_burdened_cost
5085                                         ,pa_currency.round_trans_currency_amt1((bl.txn_burdened_cost * bl.projfunc_cost_exchange_rate ),bl.projfunc_currency_code)))
5086                     ,bl.revenue = decode(p_budget_version_type,'COST',bl.revenue
5087                     ,decode(bl.projfunc_currency_code,bl.txn_currency_code,bl.project_revenue
5088                                         ,pa_currency.round_trans_currency_amt1((bl.project_revenue*bl.projfunc_rev_exchange_rate ),bl.projfunc_currency_code)))
5089                 WHERE bl.budget_line_id = l_budget_line_id_tab(i)
5090                 AND   bl.budget_version_id = p_budget_version_id ;
5091 
5092     END IF;
5093 
5094     /* after updating the budget lines pass +ve values to pji reporting apis */
5095     IF p_rollup_required_flag = 'Y' OR NVL(l_populate_mrc_tab_flag,'N') = 'Y'  Then
5096        FOR i IN cur_Oldbl_Lines LOOP
5097               IF (p_rollup_required_flag = 'Y'
5098 		/* bug fix:5031388
5099         	AND i.cost_rejection_code is NULL
5100                 AND i.burden_rejection_code is NULL
5101                 AND i.revenue_rejection_code is NULL
5102                 AND i.pc_cur_conv_rejection_code is NULL
5103                 AND i.pfc_cur_conv_rejection_code is NULL */
5104 		)  Then
5105 
5106                 /* before updating the existing budget line call the reporting API to pass -ve amts */
5107                 PA_FP_CALC_PLAN_PKG.Add_Toreporting_Tabls
5108                 (p_calling_module               => 'CALCULATE_API'
5109                 ,p_activity_code                => 'UPDATE'
5110                 ,p_budget_version_id            => p_budget_version_id
5111                 ,p_budget_line_id               => i.budget_line_id
5112                 ,p_resource_assignment_id       => i.resource_assignment_id
5113                 ,p_start_date                   => i.start_date
5114                 ,p_end_date                     => i.end_date
5115                 ,p_period_name                  => i.period_name
5116                 ,p_txn_currency_code            => i.txn_currency_code
5117                 ,p_quantity                     => i.bl_quantity
5118                 ,p_txn_raw_cost                 => i.txn_raw_cost
5119                 ,p_txn_burdened_cost            => i.txn_burdened_cost
5120                 ,p_txn_revenue                  => i.txn_revenue
5121                 ,p_project_currency_code        => i.project_currency_code
5122                 ,p_project_raw_cost             => i.project_raw_cost
5123                 ,p_project_burdened_cost        => i.project_burdened_cost
5124                 ,p_project_revenue              => i.project_revenue
5125                 ,p_projfunc_currency_code       => i.projfunc_currency_code
5126                 ,p_projfunc_raw_cost            => i.raw_cost
5127                 ,p_projfunc_burdened_cost       => i.burdened_cost
5128                 ,p_projfunc_revenue             => i.revenue
5129 		,p_rep_line_mode               => 'POSITIVE_ENTRY'
5130                 ,x_msg_data                     => x_msg_data
5131                 ,x_return_status                => x_return_status
5132                 );
5133           END IF;
5134 
5135       /* Added for MRC enhancements */
5136           IF NVL(l_populate_mrc_tab_flag,'N') = 'Y' Then --{
5137                 PA_FP_CALC_PLAN_PKG.populate_MRC_plsqltabs
5138         	(p_calling_module               => 'CALCULATE_API'
5139                 ,p_budget_version_id            => p_budget_version_id
5140                 ,p_budget_line_id               => i.budget_line_id
5141                 ,p_resource_assignment_id       => i.resource_assignment_id
5142                 ,p_start_date                   => i.start_date
5143                 ,p_end_date                     => i.end_date
5144                 ,p_period_name                  => i.period_name
5145                 ,p_txn_currency_code            => i.txn_currency_code
5146                 ,p_quantity                     => i.bl_quantity
5147                 ,p_txn_raw_cost                 => i.txn_raw_cost
5148                 ,p_txn_burdened_cost            => i.txn_burdened_cost
5149                 ,p_txn_revenue                  => i.txn_revenue
5150                 ,p_project_currency_code        => i.project_currency_code
5151                 ,p_project_raw_cost             => i.project_raw_cost
5152                 ,p_project_burdened_cost        => i.project_burdened_cost
5153                 ,p_project_revenue              => i.project_revenue
5154                 ,p_projfunc_currency_code       => i.projfunc_currency_code
5155                 ,p_projfunc_raw_cost            => i.raw_cost
5156                 ,p_projfunc_burdened_cost       => i.burdened_cost
5157                 ,p_projfunc_revenue             => i.revenue
5158         	,p_delete_flag                  => 'N'
5159                 ,x_msg_data                     => x_msg_data
5160                 ,x_return_status                => x_return_status
5161                 );
5162       End If;
5163        END LOOP;
5164     END IF;
5165 
5166     IF    1 = 1 then --{ no budget line exists so insert a new line
5167         /* Initialize the plsql tabs */
5168         l_budget_line_id_tab.delete;
5169                 l_resAsgn_id_tab.delete;
5170                 l_txn_curr_code_tab.delete;
5171                 l_start_date_tab.delete;
5172                 l_end_date_tab.delete;
5173                 l_period_name_tab.delete;
5174                 l_quantity_tab.delete;
5175                 l_proj_curr_code_tab.delete;
5176                 l_projfunc_curr_code_tab.delete;
5177 
5178         OPEN cur_newtmp_lines;
5179         FETCH cur_newtmp_lines BULK COLLECT INTO
5180             l_budget_line_id_tab
5181                 ,l_resAsgn_id_tab
5182                 ,l_txn_curr_code_tab
5183                 ,l_start_date_tab
5184                 ,l_end_date_tab
5185                 ,l_period_name_tab
5186                 ,l_quantity_tab
5187                 ,l_proj_curr_code_tab
5188                 ,l_projfunc_curr_code_tab;
5189         CLOSE cur_newtmp_lines;
5190 
5191         IF l_budget_line_id_tab.COUNT > 0 THEN  --{
5192             --print_msg('Number of New budget lines inserted ['||l_budget_line_id_tab.COUNT||']');
5193             FORALL i in l_budget_line_id_tab.FIRST .. l_budget_line_id_tab.LAST
5194                 INSERT INTO PA_BUDGET_LINES(
5195                 BUDGET_VERSION_ID
5196                         ,BUDGET_LINE_ID
5197                         ,RESOURCE_ASSIGNMENT_ID
5198                 ,TXN_CURRENCY_CODE
5199                 ,PROJECT_CURRENCY_CODE
5200                     ,PROJFUNC_CURRENCY_CODE
5201                 ,PERIOD_NAME
5202                     ,START_DATE
5203                 ,END_DATE
5204                 ,QUANTITY
5205                     ,LAST_UPDATE_DATE
5206                     ,LAST_UPDATED_BY
5207                     ,CREATION_DATE
5208                     ,CREATED_BY
5209                     ,LAST_UPDATE_LOGIN
5210                 ,QUANTITY_SOURCE
5211                 ,RAW_COST_SOURCE
5212                 ,BURDENED_COST_SOURCE
5213                 ,REVENUE_SOURCE
5214                     )
5215                 SELECT
5216                     p_BUDGET_VERSION_ID
5217                     ,l_budget_line_id_tab(i)
5218                     ,l_resAsgn_id_tab(i)
5219                     ,l_txn_curr_code_tab(i)
5220                     ,l_proj_curr_code_tab(i)
5221                     ,l_projfunc_curr_code_tab(i)
5222                     ,l_period_name_tab(i)
5223                     ,l_start_date_tab(i)
5224                     ,l_end_date_tab(i)
5225                 ,l_quantity_tab(i)
5226                     ,g_LAST_UPDATE_DATE
5227                     ,g_LAST_UPDATED_BY
5228                     ,g_CREATION_DATE
5229                     ,g_CREATED_BY
5230                     ,g_LAST_UPDATE_LOGIN
5231                 ,'SP'
5232                 ,'SP'
5233                 ,'SP'
5234                 ,'SP'
5235             FROM dual
5236             WHERE NVL(l_quantity_tab(i),0) <> 0;
5237 
5238             If p_rollup_required_flag = 'Y' Then
5239             FOR i IN l_budget_line_id_tab.FIRST .. l_budget_line_id_tab.LAST LOOP
5240                  IF NVL(l_quantity_tab(i),0) <> 0 Then
5241                         /* before updating the existing budget line call the reporting API to pass -ve amts */
5242                         PA_FP_CALC_PLAN_PKG.Add_Toreporting_Tabls
5243                         (p_calling_module               => 'CALCULATE_API'
5244                         ,p_activity_code                => 'UPDATE'
5245                         ,p_budget_version_id            => p_budget_version_id
5246                         ,p_budget_line_id               => l_budget_line_id_tab(i)
5247                         ,p_resource_assignment_id       => l_resAsgn_id_tab(i)
5248                         ,p_start_date                   => l_start_date_tab(i)
5249                         ,p_end_date                     => l_end_date_tab(i)
5250                         ,p_period_name                  => l_period_name_tab(i)
5251                         ,p_txn_currency_code            => l_txn_curr_code_tab(i)
5252                         ,p_quantity                     => l_quantity_tab(i)
5253                         ,p_txn_raw_cost                 => null
5254                         ,p_txn_burdened_cost            => null
5255                         ,p_txn_revenue                  => null
5256                         ,p_project_currency_code        => l_proj_curr_code_tab(i)
5257                         ,p_project_raw_cost             => null
5258                         ,p_project_burdened_cost        => null
5259                         ,p_project_revenue              => null
5260                         ,p_projfunc_currency_code       => l_projfunc_curr_code_tab(i)
5261                         ,p_projfunc_raw_cost            => null
5262                         ,p_projfunc_burdened_cost       => null
5263                         ,p_projfunc_revenue             => null
5264 			,p_rep_line_mode               => 'POSITIVE_ENTRY'
5265                         ,x_msg_data                     => x_msg_data
5266                         ,x_return_status                => x_return_status
5267                         );
5268                 END IF;
5269             END LOOP;
5270                 End If;
5271         End If; --}
5272     End If; --}
5273 
5274         /* reset the error stack */
5275     If p_pa_debug_mode = 'Y' Then
5276     	print_msg('RetSts of Insert_budget_lines api['||x_return_status||']');
5277             pa_debug.reset_err_stack;
5278     End If;
5279 
5280 EXCEPTION
5281         WHEN OTHERS THEN
5282                 x_return_status := 'U';
5283                 x_msg_data := sqlcode||sqlerrm;
5284                 print_msg('Failed in insert_budget_lines API'||x_msg_data);
5285         If p_pa_debug_mode = 'Y' Then
5286                     pa_debug.reset_err_stack;
5287         End If;
5288                  fnd_msg_pub.add_exc_msg
5289                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
5290                  ,p_procedure_name => 'insert_budget_lines');
5291                 RAISE;
5292 END insert_budget_lines;
5293 
5294 /* This API populates the plsql tables required for bulk update of process_ResAttribs */
5295 PROCEDURE Populate_ResAttribTabs
5296         (p_resource_assignment_id  IN  Number
5297         ,p_txn_currency_code       IN  Varchar2) IS
5298 
5299 BEGIN
5300     g_RsAtrb_RaId_tab(NVL(g_RsAtrb_RaId_tab.LAST,0)+1) := p_resource_assignment_id;
5301     g_RsAtrb_TxnCur_tab(NVL(g_RsAtrb_TxnCur_tab.LAST,0)+1) := p_txn_currency_code;
5302 
5303 END Populate_ResAttribTabs;
5304 
5305 /* LOGIC: When resource is planned in multiple currencies, changing the resource attributes such as
5306  * spread curve,sp fixed date, mfc cost type, re spread from periodic page spreads the quantity from
5307  * MIN budget line start date to MAX budget line end date
5308  * To ensure this, a reference dates SYSTEM_REFERENCE_DAT1 is populated with MIN blstart date
5309  * and SYSTEM_REFERENCE_DAT2 is populated with MAX blend date
5310  * These dates will be passed to spread api.
5311  */
5312 PROCEDURE process_ResAttribs(
5313                 p_budget_version_id              IN  Number
5314                 ,p_resource_assignment_id_tab    IN  pa_plsql_datatypes.NumTabTyp
5315                 ,p_txn_currency_code_tab         IN  pa_plsql_datatypes.Char50TabTyp
5316                 ,x_return_status                 OUT NOCOPY Varchar2
5317                 ,x_msg_data                      OUT NOCOPY Varchar2 ) IS
5318 
5319 BEGIN
5320     x_return_status := 'S';
5321     x_msg_data      := NULL;
5322     IF p_resource_assignment_id_tab.COUNT > 0 THEN
5323         FORALL i IN p_resource_assignment_id_tab.FIRST .. p_resource_assignment_id_tab.LAST
5324         UPDATE /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP_N1) */ pa_fp_spread_calc_tmp tmp
5325         SET (tmp.SYSTEM_REFERENCE_DAT1
5326             ,tmp.SYSTEM_REFERENCE_DAT2) = (select MIN(bl.start_date),MAX(bl.end_date)
5327                                from pa_budget_lines bl
5328                            where bl.resource_assignment_id = tmp.resource_assignment_id
5329                            and   bl.txn_currency_code = tmp.txn_currency_code)
5330         WHERE tmp.resource_assignment_id = p_resource_assignment_id_tab(i)
5331         AND  tmp.txn_currency_code = p_txn_currency_code_tab(i)
5332         AND  NVL(tmp.system_reference_var1,'N') = 'Y'
5333         AND  tmp.budget_version_id = p_budget_version_id ;
5334             --print_msg('Number of tmp lines updated with MIN and MAX bldates for ResourcePlanned In Multicurr['||sql%rowcount||']');
5335 
5336         /* If planning start date is prior to MIN start date, then qty should be spread from planning start date similarly
5337         * if planning end date is prior to MAX date then qty should be spread to planned end date
5338                 * based on this logic Now update the DAT1 and DAT2 from planning dates
5339         */
5340         FORALL i IN p_resource_assignment_id_tab.FIRST .. p_resource_assignment_id_tab.LAST
5341         UPDATE /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP_N1) */ pa_fp_spread_calc_tmp tmp
5342                 SET (tmp.SYSTEM_REFERENCE_DAT1
5343                     ,tmp.SYSTEM_REFERENCE_DAT2) = (select decode(tmp.SYSTEM_REFERENCE_DAT1,NULL,NULL
5344                                ,decode(sign(trunc(tmp.SYSTEM_REFERENCE_DAT1)-trunc(ra.planning_start_date)),-1
5345                                       ,ra.planning_start_date,tmp.SYSTEM_REFERENCE_DAT1))
5346                             ,decode(tmp.SYSTEM_REFERENCE_DAT2,NULL,NULL
5347                                                            ,decode(sign(trunc(tmp.SYSTEM_REFERENCE_DAT2)-trunc(ra.planning_end_date)),1
5348                                                                       ,ra.planning_end_date,tmp.SYSTEM_REFERENCE_DAT2))
5349                                                    from pa_resource_assignments ra
5350                                                    where ra.resource_assignment_id = tmp.resource_assignment_id
5351                            and ra.budget_version_id = tmp.budget_version_id)
5352                 WHERE tmp.resource_assignment_id = p_resource_assignment_id_tab(i)
5353                 AND  NVL(tmp.system_reference_var1,'N') = 'Y'
5354         AND  tmp.budget_version_id = p_budget_version_id ;
5355             --print_msg('Number of tmp lines updated with DAT1 and DAT2  for ResourcePlanned In Multicurr['||sql%rowcount||']');
5356     END IF;
5357 
5358 EXCEPTION
5359     WHEN OTHERS THEN
5360         x_return_status := 'U';
5361                 x_msg_data := sqlcode||sqlerrm;
5362                 print_msg('Failed in insert_budget_lines API'||x_msg_data);
5363         If p_pa_debug_mode = 'Y' Then
5364                     pa_debug.reset_err_stack;
5365         End If;
5366                  fnd_msg_pub.add_exc_msg
5367                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
5368                  ,p_procedure_name => 'process_ResAttribs');
5369                 RAISE;
5370 
5371 END process_ResAttribs;
5372 
5373 PROCEDURE populate_planDates_Tabs
5374         (p_resource_assignment_id        IN  Number
5375                 ,p_txn_currency_code             IN  Varchar2
5376                 ,p_project_currency_code         IN  Varchar2
5377                 ,p_projfunc_currency_code        IN  Varchar2
5378                 ,p_start_dates_shrunk_flag       IN  Varchar2
5379                 ,p_end_dates_shrunk_flag         IN  Varchar2
5380                 ,p_plan_start_date_old           IN  Date
5381                 ,p_plan_start_date_new           IN  Date
5382                 ,p_plan_end_date_old             IN  Date
5383                 ,p_plan_end_date_new             IN  Date ) IS
5384 
5385 BEGIN
5386     g_Rspd_RaId_tab(NVL(g_Rspd_RaId_tab.LAST,0)+1) := p_resource_assignment_id;
5387         g_Rspd_TxnCur_tab(NVL(g_Rspd_TxnCur_tab.LAST,0)+1) := p_txn_currency_code;
5388     g_Rspd_Pjcur_tab(NVL(g_Rspd_Pjcur_tab.LAST,0)+1) := p_project_currency_code;
5389     g_Rspd_pjf_cur_tab(NVL(g_Rspd_pjf_cur_tab.LAST,0)+1) := p_projfunc_currency_code;
5390     g_Rspd_SdShrk_Flg_tab(NVL(g_Rspd_SdShrk_Flg_tab.LAST,0)+1) := p_start_dates_shrunk_flag;
5391     g_Rspd_EdShrk_Flg_tab(NVL(g_Rspd_EdShrk_Flg_tab.LAST,0)+1) := p_end_dates_shrunk_flag;
5392     g_Rspd_SD_old_tab(NVL(g_Rspd_SD_old_tab.LAST,0)+1) := p_plan_start_date_old;
5393     g_Rspd_SD_new_tab(NVL(g_Rspd_SD_new_tab.LAST,0)+1) := p_plan_start_date_new;
5394     g_Rspd_ED_old_tab(NVL(g_Rspd_ED_old_tab.LAST,0)+1) := p_plan_end_date_old;
5395     g_Rspd_ED_new_tab(NVL(g_Rspd_ED_new_tab.LAST,0)+1) := p_plan_end_date_new;
5396 
5397 END populate_planDates_Tabs;
5398 
5399 /* LOGIC: When both planning start date and end dates are extended then do nothing
5400  * If Planning Start date is shrunk then sum (quantity) of all bdgt lines prior to plan start date
5401  * and then delete all the budgetlines prior to new start date and update a budget line existsing on the new plan start
5402  * date. If no budget line exists then insert a new budget line with the sum (quantity)
5403  *
5404  * IF Planning end date is shrunk, then sum (quantity) all budget line later than new end date
5405  * and then delete all the budget lines later than new plan end date.
5406  * update existing budget line on new plan end with the above sum(quantity), If no budget line exists then
5407  * insert a new budget line
5408  */
5409 PROCEDURE process_planDates_change(
5410         p_budget_version_id              IN  Number
5411         ,x_return_status                 OUT NOCOPY Varchar2
5412         ,x_msg_data                      OUT NOCOPY Varchar2 ) IS
5413 
5414     l_period_type   Varchar2(100);
5415 
5416 BEGIN
5417     x_return_status := 'S';
5418     If p_pa_debug_mode = 'Y' Then
5419         pa_debug.init_err_stack('PA_FP_CALC_UTILS.process_planDates_change');
5420         --print_msg('Entered process_planDates_change api NumLinetoProcess['||g_Rspd_RaId_tab.COUNT||']');
5421     End If;
5422     IF perdRec.time_phased_code = 'P' Then
5423         l_period_type := perdRec.pa_period_type;
5424     Else
5425         l_period_type := perdRec.accounted_period_type;
5426     End If;
5427 
5428     /* reset the rollup tmp table */
5429     -- bug fix:5203868
5430     DELETE FROM pa_fp_rollup_tmp
5431     WHERE budget_version_id = p_budget_version_id;
5432 
5433     IF g_Rspd_RaId_tab.COUNT > 0 Then
5434         /* populate records for start date change */
5435         FORALL i IN g_Rspd_RaId_tab.FIRST .. g_Rspd_RaId_tab.LAST
5436            INSERT INTO pa_fp_rollup_tmp tmp
5437             (resource_assignment_id
5438             ,txn_currency_code
5439             ,start_date
5440             ,end_date
5441             ,period_name
5442             ,project_currency_code
5443             ,projfunc_currency_code
5444             ,quantity
5445             ,plan_Start_Date_shrunk_flag
5446             )
5447            SELECT g_Rspd_RaId_tab(i)
5448             , g_Rspd_TxnCur_tab(i)
5449             , glp1.start_date
5450             , glp1.end_date
5451             , glp1.period_name
5452             , g_Rspd_Pjcur_tab(i)
5453             , g_Rspd_Pjf_cur_tab(i)
5454             , null
5455             ,NVL(g_Rspd_SdShrk_Flg_tab(i),'N')
5456            FROM  gl_periods glp1
5457                WHERE glp1.adjustment_period_flag = 'N'
5458                AND   glp1.period_set_name = perdRec.period_set_name
5459                AND   glp1.period_type = l_period_type
5460                AND   trunc(g_Rspd_SD_new_tab(i)) BETWEEN glp1.start_date and glp1.end_date
5461            AND   NVL(g_Rspd_SdShrk_Flg_tab(i),'N') = 'Y';
5462         --print_msg('Number lines inserted into fp_rollupTmp for StartDateShrunk['||sql%rowcount||']');
5463 
5464         /* Now update the rollup tmp table with the sum of bl line quantities prior to new plan start date*/
5465         UPDATE pa_fp_rollup_tmp tmp
5466         SET tmp.processed_flag = 'Y'
5467            ,tmp.quantity = (SELECT SUM(nvl(bl.quantity,0)-nvl(bl.init_quantity,0))
5468                         FROM  pa_budget_lines bl
5469                         WHERE bl.budget_version_id = p_budget_version_id
5470                         AND   bl.resource_assignment_id = tmp.resource_assignment_id
5471                         AND   bl.txn_currency_code = tmp.txn_currency_code
5472                             AND   bl.end_date < ( tmp.start_date) )
5473         WHERE NVL(tmp.processed_flag,'N') = 'N'
5474         AND  NVL(plan_Start_Date_shrunk_flag,'N') = 'Y';
5475 
5476         /* Delete all the budget lines which falls beyond the plan start date */
5477         delete_budget_lines(
5478                 p_budget_version_id             => p_budget_version_id
5479                 ,p_budget_version_type          => g_budget_version_type
5480                 ,p_rollup_required_flag         => g_rollup_required_flag
5481                 ,p_process_mode                 => 'PLAN_START_DATE'
5482                 ,x_return_status                => x_return_status
5483                 ,x_msg_data                     => x_msg_data
5484                 );
5485 
5486         /* populate records for end date change */
5487                 FORALL i IN g_Rspd_RaId_tab.FIRST .. g_Rspd_RaId_tab.LAST
5488                    INSERT INTO pa_fp_rollup_tmp tmp
5489                         (resource_assignment_id
5490                         ,txn_currency_code
5491                         ,start_date
5492                         ,end_date
5493                         ,period_name
5494                         ,project_currency_code
5495                         ,projfunc_currency_code
5496                         ,quantity
5497             ,plan_End_Date_shrunk_flag
5498                         )
5499                    SELECT g_Rspd_RaId_tab(i)
5500                         , g_Rspd_TxnCur_tab(i)
5501                         , glp1.start_date
5502                         , glp1.end_date
5503                         , glp1.period_name
5504                         , g_Rspd_Pjcur_tab(i)
5505                         , g_Rspd_Pjf_cur_tab(i)
5506                         , null
5507             , NVL(g_Rspd_EdShrk_Flg_tab(i),'N')
5508                    FROM  gl_periods glp1
5509                    WHERE glp1.adjustment_period_flag = 'N'
5510                    AND   glp1.period_set_name = perdRec.period_set_name
5511                    AND   glp1.period_type = l_period_type
5512                    AND   trunc(g_Rspd_ED_new_tab(i)) BETWEEN glp1.start_date and glp1.end_date
5513                    AND   NVL(g_Rspd_EdShrk_Flg_tab(i),'N') = 'Y';
5514 
5515         --print_msg('Number lines inserted into fp_rollupTmp for EndDateShrunk['||sql%rowcount||']');
5516                 /* Now update the rollup tmp table with the sum of bl line quantities later than new plan end date */
5517                 UPDATE pa_fp_rollup_tmp tmp
5518                 SET tmp.processed_flag = 'Y'
5519                    ,tmp.quantity = (SELECT SUM(nvl(bl.quantity,0)-nvl(bl.init_quantity,0))
5520                                     FROM  pa_budget_lines bl
5521                                     WHERE bl.budget_version_id = p_budget_version_id
5522                                     AND   bl.resource_assignment_id = tmp.resource_assignment_id
5523                                     AND   bl.txn_currency_code = tmp.txn_currency_code
5524                                     AND   bl.start_date > ( tmp.end_date) )
5525         WHERE NVL(tmp.processed_flag,'N') = 'N'
5526         AND NVL(plan_End_Date_shrunk_flag,'N') = 'Y' ;
5527 
5528         /* Delete all the budget lines which falls beyond the plan end date */
5529                 delete_budget_lines(
5530                 p_budget_version_id             => p_budget_version_id
5531                 ,p_budget_version_type          => g_budget_version_type
5532                 ,p_rollup_required_flag         => g_rollup_required_flag
5533                 ,p_process_mode                 => 'PLAN_END_DATE'
5534                 ,x_return_status                => x_return_status
5535                 ,x_msg_data                     => x_msg_data
5536                 );
5537 
5538         --print_msg('Calling insert_budget_lines api');
5539         /* Finally update the existing budget line or insert the new budget lines */
5540         insert_budget_lines(
5541                 p_budget_version_id             => p_budget_version_id
5542                 ,p_budget_version_type          => g_budget_version_type
5543                 ,p_rollup_required_flag         => g_rollup_required_flag
5544                 ,x_return_status                => x_return_status
5545                 ,x_msg_data                     => x_msg_data
5546                 );
5547 
5548     END IF;
5549 
5550     --print_msg('ReturnStatus of process_planDates_change ['||x_return_status||']');
5551         /* reset the error stack */
5552     If p_pa_debug_mode = 'Y' Then
5553             pa_debug.reset_err_stack;
5554     End If;
5555 
5556 EXCEPTION
5557         WHEN OTHERS THEN
5558                 x_return_status := 'U';
5559                 x_msg_data := sqlcode||sqlerrm;
5560                 print_msg('Failed in process_planDates_change API'||x_msg_data);
5561         If p_pa_debug_mode = 'Y' Then
5562                     pa_debug.reset_err_stack;
5563         End If;
5564                  fnd_msg_pub.add_exc_msg
5565                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
5566                  ,p_procedure_name => 'process_planDates_change');
5567                 RAISE;
5568 END process_planDates_change;
5569 
5570 PROCEDURE populate_blTxnCurCombo
5571         (p_budget_version_id  IN NUMBER
5572         ,x_return_status    OUT NOCOPY VARCHAR2
5573         ) IS
5574 
5575     l_msg_data      Varchar2(1000);
5576     l_raId_Tab  pa_plsql_datatypes.NumTabTyp;
5577     l_TxnCur_Tab    pa_plsql_datatypes.Char50TabTyp;
5578     l_TmpTxnCur_Tab pa_plsql_datatypes.Char50TabTyp;
5579     l_Qty_Tab   pa_plsql_datatypes.NumTabTyp;
5580 BEGIN
5581     x_return_status := 'S';
5582     /* bulk select all the RA+Txn currency combo from budget lines and later insert these records into tmp table
5583      * for processing
5584      */
5585     If p_pa_debug_mode = 'Y' Then
5586         pa_debug.init_err_stack('PA_FP_CALC_UTILS.populate_blTxnCurCombo');
5587     	print_msg('Entered populate_blTxnCurCombo api');
5588     End If;
5589         SELECT /*+ INDEX(BL PA_BUDGET_LINES_U1) */
5590 	  bl.resource_assignment_id
5591             ,bl.txn_currency_code
5592         BULK COLLECT INTO
5593             l_raId_Tab
5594             ,l_TxnCur_Tab
5595         FROM pa_budget_lines bl
5596              ,pa_fp_spread_calc_tmp tmp
5597         WHERE bl.budget_version_id = p_budget_version_id
5598         AND  bl.resource_assignment_id = tmp.resource_assignment_id
5599         AND  bl.txn_currency_code <> tmp.txn_currency_code
5600         AND  NVL(tmp.system_reference_var1,'N') = 'Y'
5601             AND  ( NVL(tmp.sp_curve_change_flag,'N') = 'Y'
5602                     OR NVL(tmp.plan_dates_change_flag,'N') = 'Y'
5603                     OR NVL(tmp.mfc_cost_change_flag,'N') = 'Y'
5604                     OR NVL(tmp.sp_fix_date_change_flag,'N') = 'Y'
5605             OR NVL(tmp.rlm_id_change_flag,'N') = 'Y'
5606                     )
5607         AND  NOT EXISTS (select null
5608                                 from pa_fp_spread_calc_tmp tmp1
5609                                 where tmp1.budget_version_id = p_budget_version_id
5610                                 and tmp1.resource_assignment_id = tmp.resource_assignment_id
5611                                 and tmp1.txn_currency_code = bl.txn_currency_code
5612                 )
5613         GROUP BY bl.resource_assignment_id
5614                         ,bl.txn_currency_code ;
5615 
5616         --print_msg('Number of ra+txn combo selected from bl['||sql%rowcount||']');
5617 
5618         IF l_raId_Tab.COUNT > 0 THEN
5619             FORALL i IN l_raId_Tab.FIRST .. l_raId_Tab.LAST
5620             INSERT INTO pa_fp_spread_calc_tmp
5621                             (BUDGET_VERSION_ID
5622                 ,BUDGET_VERSION_TYPE
5623                 ,RESOURCE_ASSIGNMENT_ID --resource_assignment_id
5624                             ,TXN_CURRENCY_CODE     --txn_currency_code
5625                 ,SYSTEM_REFERENCE_VAR2
5626                 )
5627             VALUES (p_budget_version_id
5628                 ,g_budget_version_type
5629                 ,l_raId_Tab(i)
5630                 ,l_TxnCur_Tab(i)
5631                 ,'Y'
5632                 );
5633 	    IF P_PA_DEBUG_MODE = 'Y' Then
5634               print_msg('Number of rows inserted ra+txncur into tmp['||sql%rowcount||']');
5635 	    End If;
5636 
5637             /* Now updates the other attributes for the newly inserted rows */
5638             FORALL i IN l_raId_Tab.FIRST .. l_raId_Tab.LAST
5639             UPDATE /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP_N1) */ pa_fp_spread_calc_tmp tmp
5640             SET tmp.quantity = (select sum(bl.quantity)
5641                        from pa_budget_lines bl
5642                        where bl.budget_version_id = tmp.budget_version_id
5643                            and   bl.resource_assignment_id = tmp.resource_assignment_id
5644                        and   bl.txn_currency_code = tmp.txn_currency_code)
5645                 ,tmp.system_reference_var2 = NULL
5646                 ,(tmp.OLD_SPREAD_CURVE_ID   --x_spread_curve_id_old_tab
5647                             ,NEW_SPREAD_CURVE_ID   --x_spread_curve_id_new_tab
5648                             ,OLD_SP_FIX_DATE       --x_sp_fixed_date_old_tab
5649                             ,NEW_SP_FIX_DATE       --x_sp_fixed_date_new_tab
5650                             ,OLD_PLAN_START_DATE   --x_plan_start_date_old_tab
5651                             ,NEW_PLAN_START_DATE   --x_plan_start_date_new_tab
5652                             ,OLD_PLAN_END_DATE     --x_plan_end_date_old_tab
5653                             ,NEW_PLAN_END_DATE     --x_plan_end_date_new_tab
5654                             ,RE_SPREAD_AMTS_FLAG   --x_re_spread_flag_tab
5655                             ,SP_CURVE_CHANGE_FLAG  --x_sp_curve_change_flag_tab
5656                             ,PLAN_DATES_CHANGE_FLAG --x_plan_dates_change_flag_tab
5657                             ,SP_FIX_DATE_CHANGE_FLAG --x_spfix_date_flag_tab
5658                             ,MFC_COST_CHANGE_FLAG   --x_mfc_cost_change_flag_tab
5659                             ,OLD_MFC_COST_TYPE_ID   --x_mfc_cost_type_id_old_tab
5660                             ,NEW_MFC_COST_TYPE_ID   --x_mfc_cost_type_id_new_tab
5661                             ,ETC_START_DATE
5662                             ,PROJECT_CURRENCY_CODE
5663                             ,PROJFUNC_CURRENCY_CODE
5664                 ,SYSTEM_REFERENCE_VAR1
5665                 ,PLAN_START_DATE_SHRUNK_FLAG
5666                 ,PLAN_END_DATE_SHRUNK_FLAG
5667                 ,RLM_ID_CHANGE_FLAG
5668                 ) = (SELECT /*+ INDEX(TMP1 PA_FP_SPREAD_CALC_TMP_N1) */
5669                             tmp1.OLD_SPREAD_CURVE_ID
5670                             ,tmp1.NEW_SPREAD_CURVE_ID
5671                             ,tmp1.OLD_SP_FIX_DATE
5672                             ,tmp1.NEW_SP_FIX_DATE
5673                             ,tmp1.OLD_PLAN_START_DATE
5674                             ,tmp1.NEW_PLAN_START_DATE
5675                             ,tmp1.OLD_PLAN_END_DATE
5676                             ,tmp1.NEW_PLAN_END_DATE
5677                             ,tmp1.RE_SPREAD_AMTS_FLAG
5678                             ,tmp1.SP_CURVE_CHANGE_FLAG
5679                             ,tmp1.PLAN_DATES_CHANGE_FLAG
5680                             ,tmp1.SP_FIX_DATE_CHANGE_FLAG
5681                             ,tmp1.MFC_COST_CHANGE_FLAG
5682                             ,tmp1.OLD_MFC_COST_TYPE_ID
5683                             ,tmp1.NEW_MFC_COST_TYPE_ID
5684                             ,tmp1.ETC_START_DATE
5685                             ,tmp1.PROJECT_CURRENCY_CODE
5686                             ,tmp1.PROJFUNC_CURRENCY_CODE
5687                 ,tmp1.SYSTEM_REFERENCE_VAR1
5688                 ,tmp1.PLAN_START_DATE_SHRUNK_FLAG
5689                 ,tmp1.PLAN_END_DATE_SHRUNK_FLAG
5690                 ,tmp1.RLM_ID_CHANGE_FLAG
5691                 FROM pa_fp_spread_calc_tmp tmp1
5692                 WHERE tmp1.budget_version_id = p_budget_version_id
5693                 AND   tmp1.resource_assignment_id = tmp.resource_assignment_id
5694                 AND  tmp1.txn_currency_code <> tmp.txn_currency_code
5695                 AND  NVL(tmp1.SYSTEM_REFERENCE_VAR2,'N') = 'N'
5696                 AND rownum =1 )
5697             WHERE tmp.budget_version_id = p_budget_version_id
5698             AND  tmp.resource_assignment_id = l_raId_Tab(i)
5699             AND  tmp.txn_currency_code = l_TxnCur_Tab(i)
5700             AND  tmp.SYSTEM_REFERENCE_VAR2 = 'Y';
5701             print_msg('Num of rows updated in tmp ['||sql%rowcount||']');
5702 
5703         END IF;
5704 
5705         /* Note: when planning resource is changed, then ignore all other attribute changes on the RA
5706          * change in the planning resource should be treated as a new RA
5707          */
5708         UPDATE pa_fp_spread_calc_tmp tmp
5709         SET tmp.SP_CURVE_CHANGE_FLAG  = decode(nvl(tmp.rlm_id_change_flag,'N'),'Y','N',tmp.SP_CURVE_CHANGE_FLAG)
5710             ,tmp.PLAN_DATES_CHANGE_FLAG = decode(nvl(tmp.rlm_id_change_flag,'N'),'Y','N',tmp.PLAN_DATES_CHANGE_FLAG)
5711             ,tmp.SP_FIX_DATE_CHANGE_FLAG = decode(nvl(tmp.rlm_id_change_flag,'N'),'Y','N',tmp.SP_FIX_DATE_CHANGE_FLAG)
5712             ,tmp.MFC_COST_CHANGE_FLAG = decode(nvl(tmp.rlm_id_change_flag,'N'),'Y','N',tmp.MFC_COST_CHANGE_FLAG)
5713         WHERE tmp.budget_version_id = p_budget_version_id;
5714         If p_pa_debug_mode = 'Y' Then
5715             pa_debug.reset_err_stack;
5716         End If;
5717 EXCEPTION
5718         WHEN OTHERS THEN
5719                 x_return_status := 'U';
5720                 l_msg_data := sqlcode||sqlerrm;
5721                 print_msg('Failed in populate_blTxnCurCombo API'||l_msg_data);
5722         If p_pa_debug_mode = 'Y' Then
5723                     pa_debug.reset_err_stack;
5724         End if;
5725                  fnd_msg_pub.add_exc_msg
5726                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
5727                  ,p_procedure_name => 'populate_blTxnCurCombo');
5728                 RAISE;
5729 
5730 END populate_blTxnCurCombo;
5731 
5732 PROCEDURE synch_resAttribs(p_budget_version_id Number
5733              ,p_calling_module  IN Varchar2 ) IS
5734 
5735     l_return_status   Varchar2(1);
5736     l_msg_data        Varchar2(1000);
5737 BEGIN
5738     IF P_PA_DEBUG_MODE = 'Y' Then
5739     print_msg('Enetered synch_resAttribs api');
5740 	End If;
5741     IF (p_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION')
5742        and NVL(g_apply_progress_flag,'N') <> 'Y'
5743         and g_source_context = 'RESOURCE_ASSIGNMENT' ) Then  --{
5744                 /* If multiple RA + Txn cur combo is passed, then updates the res attributes whereever it is null */
5745             UPDATE pa_fp_spread_calc_tmp tmp
5746                 SET tmp.RLM_ID_CHANGE_FLAG = decode(tmp.RLM_ID_CHANGE_FLAG,NULL,(select tmp1.RLM_ID_CHANGE_FLAG
5747                                                 from pa_fp_spread_calc_tmp tmp1
5748                                                 where tmp1.resource_assignment_id = tmp.resource_assignment_id
5749                                                 and tmp1.txn_currency_code <> tmp.txn_currency_code
5750                                                 and tmp1.RLM_ID_CHANGE_FLAG is not null
5751                                                 and rownum = 1
5752                                               ),tmp.RLM_ID_CHANGE_FLAG)
5753                    ,tmp.OLD_SPREAD_CURVE_ID = decode(tmp.OLD_SPREAD_CURVE_ID,NULL,(select tmp1.OLD_SPREAD_CURVE_ID
5754                                                 from pa_fp_spread_calc_tmp tmp1
5755                                                 where tmp1.resource_assignment_id = tmp.resource_assignment_id
5756                                                 and tmp1.txn_currency_code <> tmp.txn_currency_code
5757                                                 and tmp1.OLD_SPREAD_CURVE_ID is not null
5758                                                 and rownum = 1
5759                                               ),tmp.OLD_SPREAD_CURVE_ID)
5760                    ,tmp.NEW_SPREAD_CURVE_ID = decode(tmp.NEW_SPREAD_CURVE_ID,NULL,(select tmp1.NEW_SPREAD_CURVE_ID
5761                                                 from pa_fp_spread_calc_tmp tmp1
5762                                                 where tmp1.resource_assignment_id = tmp.resource_assignment_id
5763                                                 and tmp1.txn_currency_code <> tmp.txn_currency_code
5764                                                 and tmp1.NEW_SPREAD_CURVE_ID is not null
5765                                                 and rownum = 1
5766                                               ),tmp.NEW_SPREAD_CURVE_ID)
5767                    ,tmp.OLD_SP_FIX_DATE = decode(tmp.OLD_SP_FIX_DATE,NULL,(select tmp1.OLD_SP_FIX_DATE
5768                                                 from pa_fp_spread_calc_tmp tmp1
5769                                                 where tmp1.resource_assignment_id = tmp.resource_assignment_id
5770                                                 and tmp1.txn_currency_code <> tmp.txn_currency_code
5771                                                 and tmp1.OLD_SP_FIX_DATE is not null
5772                                                 and rownum = 1
5773                                               ),tmp.OLD_SP_FIX_DATE)
5774                    ,tmp.NEW_SP_FIX_DATE = decode(tmp.NEW_SP_FIX_DATE,NULL,(select tmp1.NEW_SP_FIX_DATE
5775                                                 from pa_fp_spread_calc_tmp tmp1
5776                                                 where tmp1.resource_assignment_id = tmp.resource_assignment_id
5777                                                 and tmp1.txn_currency_code <> tmp.txn_currency_code
5778                                                 and tmp1.NEW_SP_FIX_DATE is not null
5779                                                 and rownum = 1
5780                                               ),tmp.NEW_SP_FIX_DATE)
5781                    ,tmp.OLD_MFC_COST_TYPE_ID = decode(tmp.OLD_MFC_COST_TYPE_ID,NULL,(select tmp1.OLD_MFC_COST_TYPE_ID
5782                                                 from pa_fp_spread_calc_tmp tmp1
5783                                                 where tmp1.resource_assignment_id = tmp.resource_assignment_id
5784                                                 and tmp1.txn_currency_code <> tmp.txn_currency_code
5785                                                 and tmp1.OLD_MFC_COST_TYPE_ID is not null
5786                                                 and rownum = 1
5787                                               ),tmp.OLD_MFC_COST_TYPE_ID)
5788                    ,tmp.NEW_MFC_COST_TYPE_ID = decode(tmp.NEW_MFC_COST_TYPE_ID,NULL,(select tmp1.NEW_MFC_COST_TYPE_ID
5789                                                 from pa_fp_spread_calc_tmp tmp1
5790                                                 where tmp1.resource_assignment_id = tmp.resource_assignment_id
5791                                                 and tmp1.txn_currency_code <> tmp.txn_currency_code
5792                                                 and tmp1.NEW_MFC_COST_TYPE_ID is not null
5793                                                 and rownum = 1
5794                                               ),tmp.NEW_MFC_COST_TYPE_ID)
5795                    ,tmp.OLD_PLAN_START_DATE = decode(tmp.OLD_PLAN_START_DATE,NULL,(select tmp1.OLD_PLAN_START_DATE
5796                                                 from pa_fp_spread_calc_tmp tmp1
5797                                                 where tmp1.resource_assignment_id = tmp.resource_assignment_id
5798                                                 and tmp1.txn_currency_code <> tmp.txn_currency_code
5799                                                 and tmp1.OLD_PLAN_START_DATE is not null
5800                                                 and rownum = 1
5801                                               ),tmp.OLD_PLAN_START_DATE)
5802                    ,tmp.OLD_PLAN_END_DATE = decode(tmp.OLD_PLAN_END_DATE,NULL,(select tmp1.OLD_PLAN_END_DATE
5803                                                 from pa_fp_spread_calc_tmp tmp1
5804                                                 where tmp1.resource_assignment_id = tmp.resource_assignment_id
5805                                                 and tmp1.txn_currency_code <> tmp.txn_currency_code
5806                                                 and tmp1.OLD_PLAN_END_DATE is not null
5807                                                 and rownum = 1
5808                                               ),tmp.OLD_PLAN_END_DATE)
5809            ,tmp.NEW_PLAN_START_DATE = decode(tmp.NEW_PLAN_START_DATE,NULL,(select ra.planning_start_date
5810                                                 from pa_resource_assignments ra
5811                                                 where ra.resource_assignment_id = tmp.resource_assignment_id
5812                                               ),tmp.NEW_PLAN_START_DATE)
5813            ,tmp.NEW_PLAN_END_DATE = decode(tmp.NEW_PLAN_END_DATE,NULL,(select ra.planning_end_date
5814                                                 from pa_resource_assignments ra
5815                                                 where ra.resource_assignment_id = tmp.resource_assignment_id
5816                                               ),tmp.NEW_PLAN_END_DATE)
5817             WHERE tmp.budget_version_id = p_budget_version_id;
5818             --print_msg('synch_Upd: NumOfRowUpdated['||sql%rowcount||']');
5819 
5820                    /* set the respective changed flags */
5821 		   /* Bug #5031939: remove budget_version id joins in the sub query */
5822                    UPDATE pa_fp_spread_calc_tmp tmp
5823                    SET tmp.SP_CURVE_CHANGE_FLAG = decode(NVL(tmp.OLD_SPREAD_CURVE_ID,1),NVL(tmp.NEW_SPREAD_CURVE_ID,1),'N','Y')
5824                    ,tmp.PLAN_DATES_CHANGE_FLAG =decode(tmp.OLD_PLAN_START_DATE,NULL,'N'
5825                                                             ,decode(tmp.NEW_PLAN_START_DATE,NULL,'N'
5826                                                              ,decode(tmp.OLD_PLAN_START_DATE,tmp.NEW_PLAN_START_DATE,'N','Y')))
5827                    ,tmp.SP_FIX_DATE_CHANGE_FLAG = decode(tmp.OLD_SP_FIX_DATE,NULL,'N'
5828                                                         ,decode(tmp.NEW_SP_FIX_DATE,NULL,'N'
5829                                                          ,decode(tmp.OLD_SP_FIX_DATE,tmp.NEW_SP_FIX_DATE,'N','Y')))
5830                    ,tmp.MFC_COST_CHANGE_FLAG = decode(NVL(tmp.OLD_MFC_COST_TYPE_ID,-999),NVL(tmp.NEW_MFC_COST_TYPE_ID,-999),'N','Y')
5831                    ,tmp.SYSTEM_REFERENCE_VAR1 = (SELECT 'Y'
5832                                                  FROM dual
5833                                                  WHERE EXISTS ( select null
5834                                                                 from pa_budget_lines bl
5835                                                                 where bl.budget_version_id = tmp.budget_version_id
5836                                                                 and   bl.resource_assignment_id = tmp.resource_assignment_id
5837                                                                 and   bl.txn_currency_code <> tmp.txn_currency_code
5838                                                                 GROUP BY bl.resource_assignment_id,bl.txn_currency_code
5839                                                         ))
5840                    WHERE tmp.budget_version_id = p_budget_version_id;
5841 
5842                    UPDATE pa_fp_spread_calc_tmp tmp
5843                    SET tmp.PLAN_DATES_CHANGE_FLAG = decode(tmp.PLAN_DATES_CHANGE_FLAG,'Y','Y'
5844                                                         ,decode(tmp.OLD_PLAN_END_DATE,NULL,'N'
5845                                                             ,decode(tmp.NEW_PLAN_END_DATE,NULL,'N'
5846                                                              ,decode(tmp.OLD_PLAN_END_DATE,tmp.NEW_PLAN_END_DATE,'N','Y'))))
5847                         ,tmp.system_reference_var1 = NVL(system_reference_var1,'N')
5848                    WHERE tmp.budget_version_id = p_budget_version_id;
5849                    --print_msg('Number of rows updated with resp resAtrbflag['||sql%rowcount||']');
5850 
5851                    UPDATE pa_fp_spread_calc_tmp tmp
5852                    SET tmp.PLAN_START_DATE_SHRUNK_FLAG = decode(tmp.PLAN_DATES_CHANGE_FLAG,'N','N'
5853                                              ,decode(tmp.new_plan_start_date,NULL,'N'
5854                                               ,decode(tmp.old_plan_start_date,NULL,'N'
5855                                                ,decode(sign(trunc(tmp.new_plan_start_date) - trunc(tmp.old_plan_start_date)),1 ,'Y','N'))))
5856                    ,tmp.PLAN_END_DATE_SHRUNK_FLAG = decode(tmp.PLAN_DATES_CHANGE_FLAG,'N','N'
5857                                              ,decode(tmp.new_plan_end_date,NULL,'N'
5858                                                ,decode(tmp.old_plan_end_date,NULL,'N'
5859                                                 ,decode(sign(trunc(tmp.new_plan_end_date) - trunc(tmp.old_plan_end_date)),-1 ,'Y','N'))))
5860                    WHERE tmp.budget_version_id = p_budget_version_id;
5861     END IF; --}
5862 
5863     IF P_PA_DEBUG_MODE = 'Y' Then
5864     print_msg('Out of synch_resAttribs api');
5865     End If;
5866 
5867 EXCEPTION
5868         WHEN OTHERS THEN
5869                 l_return_status := 'U';
5870                 l_msg_data := sqlcode||sqlerrm;
5871                 print_msg('Failed in synch_resAttribs API'||l_msg_data);
5872                  fnd_msg_pub.add_exc_msg
5873                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
5874                  ,p_procedure_name => 'synch_resAttribs ');
5875                 RAISE;
5876 
5877 END synch_resAttribs;
5878 
5879 PROCEDURE synch_ChangedFlags(p_budget_version_id Number
5880             ,p_calling_module   IN Varchar2) IS
5881 
5882     l_msg_data      Varchar2(1000);
5883     l_return_status Varchar2(1);
5884 
5885 BEGIN
5886 	IF P_PA_DEBUG_MODE = 'Y' Then
5887     		print_msg('Enetered synch_ChangedFlags API');
5888 	End If;
5889     IF (p_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION')
5890         and NVL(g_apply_progress_flag,'N') <> 'Y'
5891     and g_source_context = 'RESOURCE_ASSIGNMENT' ) Then  --{
5892 	   /* Bug #5031939: remove budget_version id joins in the sub query */
5893             UPDATE pa_fp_spread_calc_tmp tmp
5894                 SET tmp.SP_CURVE_CHANGE_FLAG = (select 'Y'
5895                             from dual
5896                         where exists (select null
5897                                  from pa_fp_spread_calc_tmp tmp1
5898                                  where tmp1.resource_assignment_id = tmp.resource_assignment_id
5899                                  and tmp1.sp_curve_change_flag = 'Y' ))
5900                    ,tmp.PLAN_DATES_CHANGE_FLAG = (select 'Y'
5901                                                 from dual
5902                                                 where exists (select null
5903                                                              from pa_fp_spread_calc_tmp tmp1
5904                                                              where tmp1.resource_assignment_id = tmp.resource_assignment_id
5905                                                              and tmp1.plan_dates_change_flag = 'Y' ))
5906                    ,tmp.SP_FIX_DATE_CHANGE_FLAG = (select 'Y'
5907                                                 from dual
5908                                                 where exists (select null
5909                                                              from pa_fp_spread_calc_tmp tmp1
5910                                                              where tmp1.resource_assignment_id = tmp.resource_assignment_id
5911                                                              and tmp1.sp_fix_date_change_flag = 'Y' ))
5912                    ,tmp.MFC_COST_CHANGE_FLAG = (select 'Y'
5913                                                 from dual
5914                                                 where exists (select null
5915                                                              from pa_fp_spread_calc_tmp tmp1
5916                                                              where tmp1.resource_assignment_id = tmp.resource_assignment_id
5917                                                              and tmp1.mfc_cost_change_flag = 'Y' ))
5918           ,tmp.PLAN_START_DATE_SHRUNK_FLAG = (select 'Y'
5919                             from dual
5920                             where exists (select null
5921                                 from pa_fp_spread_calc_tmp tmp1
5922                                 where tmp1.resource_assignment_id = tmp.resource_assignment_id
5923                                 and tmp1.plan_start_date_shrunk_flag = 'Y'))
5924           ,tmp.PLAN_END_DATE_SHRUNK_FLAG = (select 'Y'
5925                                                         from dual
5926                                                         where exists (select null
5927                                                                 from pa_fp_spread_calc_tmp tmp1
5928                                                                 where tmp1.resource_assignment_id = tmp.resource_assignment_id
5929                                                                 and tmp1.plan_end_date_shrunk_flag = 'Y'))
5930           ,tmp.RLM_ID_CHANGE_FLAG  = (select 'Y'
5931                                                         from dual
5932                                                         where exists (select null
5933                                                                 from pa_fp_spread_calc_tmp tmp1
5934                                                                 where tmp1.resource_assignment_id = tmp.resource_assignment_id
5935                                                                 and tmp1.rlm_id_change_flag = 'Y'))
5936           ,(tmp.task_id,tmp.resource_name) =
5937                 (select ra.task_id,rlm.alias
5938                  from pa_resource_assignments ra
5939                     ,pa_resource_list_members rlm
5940                  where ra.resource_assignment_id = tmp.resource_assignment_id
5941                  and  rlm.resource_list_member_id = ra.resource_list_member_id
5942                 )
5943           ,tmp.billable_flag = NVL((select decode(NVL(tmp.billable_flag,'D'),'D'
5944 					,decode(NVL(ra.task_id,0),0,'Y',NVL(t.billable_flag,'N')),NVL(tmp.billable_flag,'N'))
5945                       from pa_resource_assignments ra
5946                          ,pa_tasks t
5947                       where ra.resource_assignment_id = tmp.resource_assignment_id
5948                       and   t.task_id(+) = ra.task_id
5949                       ),'N')
5950 	   ,tmp.task_name = (select t.task_name
5951 			     from pa_resource_assignments ra
5952                          	,pa_tasks t
5953                       		where ra.resource_assignment_id = tmp.resource_assignment_id
5954                       		and   t.task_id = ra.task_id
5955 			     )
5956            WHERE tmp.budget_version_id = p_budget_version_id;
5957                 --print_msg('Number of rows updated with resp resAtrbflag['||sql%rowcount||']');
5958 
5959         /* Now set all the resource attributs N when planning resource is changed */
5960                 UPDATE pa_fp_spread_calc_tmp tmp
5961                 SET tmp.SP_CURVE_CHANGE_FLAG = 'N'
5962                    ,tmp.PLAN_DATES_CHANGE_FLAG = 'N'
5963                    ,tmp.SP_FIX_DATE_CHANGE_FLAG = 'N'
5964                    ,tmp.MFC_COST_CHANGE_FLAG = 'N'
5965                    ,tmp.PLAN_START_DATE_SHRUNK_FLAG = 'N'
5966                    ,tmp.PLAN_END_DATE_SHRUNK_FLAG = 'N'
5967                 WHERE tmp.budget_version_id = p_budget_version_id
5968         AND  tmp.RLM_ID_CHANGE_FLAG  = 'Y' ;
5969                 --print_msg('Number of rows updated with resp resAtrbflag['||sql%rowcount||']');
5970 
5971     ELSE
5972         /* This is done to avoid executing the cursors multiple times for passing token values */
5973         UPDATE pa_fp_spread_calc_tmp tmp
5974         SET (tmp.task_id,tmp.resource_name) =
5975                                 (select ra.task_id,rlm.alias
5976                                  from pa_resource_assignments ra
5977                                         ,pa_resource_list_members rlm
5978                                  where ra.resource_assignment_id = tmp.resource_assignment_id
5979                                  and  rlm.resource_list_member_id = ra.resource_list_member_id
5980                                 )
5981                 ,tmp.billable_flag = NVL((select decode(NVL(tmp.billable_flag,'D'),'D'
5982                                         ,decode(NVL(ra.task_id,0),0,'Y',NVL(t.billable_flag,'N')),NVL(tmp.billable_flag,'N'))
5983                       from pa_resource_assignments ra
5984                          ,pa_tasks t
5985                       where ra.resource_assignment_id = tmp.resource_assignment_id
5986                       and   t.task_id(+) = ra.task_id
5987                       ),'N')
5988 		,tmp.task_name = (select t.task_name
5989                              from pa_resource_assignments ra
5990                                 ,pa_tasks t
5991                                 where ra.resource_assignment_id = tmp.resource_assignment_id
5992                                 and   t.task_id = ra.task_id
5993                              )
5994                 WHERE tmp.budget_version_id = p_budget_version_id;
5995 
5996     END IF; --}
5997 EXCEPTION
5998         WHEN OTHERS THEN
5999                 l_return_status := 'U';
6000                 l_msg_data := sqlcode||sqlerrm;
6001                 print_msg('Failed in synch_ChangedFlags API'||l_msg_data);
6002                  fnd_msg_pub.add_exc_msg
6003                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
6004                  ,p_procedure_name => 'synch_ChangedFlags');
6005                 RAISE;
6006 
6007 END synch_ChangedFlags;
6008 
6009 /* This is the main API called from the calculate api. This api populates the tmp table from passed in
6010  * plsql params. and later used this global tmp table for further processing in bulk mode
6011  */
6012 PROCEDURE populate_spreadCalc_Tmp(
6013                 p_budget_version_id              IN  Number
6014         ,p_budget_version_type           IN  Varchar2
6015         ,p_calling_module                IN  Varchar2
6016                 ,p_source_context                IN  Varchar2
6017         ,p_time_phased_code              IN  Varchar2
6018         ,p_apply_progress_flag           IN  Varchar2 DEFAULT 'N'
6019         ,p_rollup_required_flag          IN  Varchar2 DEFAULT 'Y'
6020         ,p_refresh_rates_flag        IN  Varchar2 DEFAULT 'N'
6021             ,p_refresh_conv_rates_flag   IN  Varchar2 DEFAULT 'N'
6022             ,p_mass_adjust_flag      IN  Varchar2 DEFAULT 'N'
6023 	    ,p_time_phase_changed_flag   IN Varchar2 DEFAULT 'N' /* Bug fix:4613444 */
6024 	    	,p_wp_cost_changed_flag   IN Varchar2 DEFAULT 'N' /* Bug fix:4613444 */
6025                 ,x_resource_assignment_tab       IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
6026                 ,x_delete_budget_lines_tab       IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6027                 ,x_spread_amts_flag_tab          IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6028                 ,x_txn_currency_code_tab         IN  OUT NOCOPY SYSTEM.pa_varchar2_15_tbl_type
6029                 ,x_txn_currency_override_tab     IN  OUT NOCOPY SYSTEM.pa_varchar2_15_tbl_type
6030                 ,x_total_qty_tab                 IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
6031                 ,x_addl_qty_tab                  IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
6032                 ,x_total_raw_cost_tab            IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
6033                 ,x_addl_raw_cost_tab             IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
6034                 ,x_total_burdened_cost_tab       IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
6035                 ,x_addl_burdened_cost_tab        IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
6036                 ,x_total_revenue_tab             IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
6037                 ,x_addl_revenue_tab              IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
6038                 ,x_raw_cost_rate_tab             IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
6039                 ,x_rw_cost_rate_override_tab     IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
6040                 ,x_b_cost_rate_tab               IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
6041                 ,x_b_cost_rate_override_tab      IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
6042                 ,x_bill_rate_tab                 IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
6043                 ,x_bill_rate_override_tab        IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
6044                 ,x_line_start_date_tab           IN  OUT NOCOPY SYSTEM.pa_date_tbl_type
6045                 ,x_line_end_date_tab             IN  OUT NOCOPY SYSTEM.pa_date_tbl_type
6046                 ,x_apply_progress_flag_tab       IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6047                 ,x_spread_curve_id_old_tab       IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
6048                 ,x_spread_curve_id_new_tab       IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
6049                 ,x_sp_fixed_date_old_tab         IN  OUT NOCOPY SYSTEM.pa_date_tbl_type
6050                 ,x_sp_fixed_date_new_tab         IN  OUT NOCOPY SYSTEM.pa_date_tbl_type
6051                 ,x_plan_start_date_old_tab       IN  OUT NOCOPY SYSTEM.pa_date_tbl_type
6052                 ,x_plan_start_date_new_tab       IN  OUT NOCOPY SYSTEM.pa_date_tbl_type
6053                 ,x_plan_end_date_old_tab         IN  OUT NOCOPY SYSTEM.pa_date_tbl_type
6054                 ,x_plan_end_date_new_tab         IN  OUT NOCOPY SYSTEM.pa_date_tbl_type
6055                 ,x_re_spread_flag_tab            IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6056                 ,x_sp_curve_change_flag_tab      IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6057                 ,x_plan_dates_change_flag_tab    IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6058                 ,x_spfix_date_flag_tab           IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6059                 ,x_mfc_cost_change_flag_tab      IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6060                 ,x_mfc_cost_type_id_old_tab      IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
6061                 ,x_mfc_cost_type_id_new_tab      IN  OUT NOCOPY SYSTEM.pa_num_tbl_type
6062         ,x_rlm_id_change_flag_tab        IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6063         ,x_plan_sdate_shrunk_flag_tab    IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6064                 ,x_plan_edate_shrunk_flag_tab    IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6065                 ,x_mfc_cost_refresh_flag_tab     IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6066         ,x_ra_in_multi_cur_flag_tab      IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6067         ,x_quantity_changed_flag_tab     IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6068                 ,x_raw_cost_changed_flag_tab     IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6069                 ,x_cost_rate_changed_flag_tab    IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6070                 ,x_burden_cost_changed_flag_tab  IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6071                 ,x_burden_rate_changed_flag_tab  IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6072                 ,x_rev_changed_flag_tab          IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6073                 ,x_bill_rate_changed_flag_tab    IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6074         	,x_multcur_plan_start_date_tab   IN  OUT NOCOPY SYSTEM.pa_date_tbl_type
6075                 ,x_multcur_plan_end_date_tab     IN  OUT NOCOPY SYSTEM.pa_date_tbl_type
6076         	,x_fp_task_billable_flag_tab     IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6077 		,x_cost_rt_miss_num_flag_tab     IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6078                 ,x_burd_rt_miss_num_flag_tab     IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6079                 ,x_bill_rt_miss_num_flag_tab     IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6080                 ,x_Qty_miss_num_flag_tab         IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6081                 ,x_Rw_miss_num_flag_tab          IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6082                 ,x_Br_miss_num_flag_tab          IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6083                 ,x_Rv_miss_num_flag_tab          IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6084                 ,x_rev_only_entry_flag_tab       IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6085 		/* bug fix:5726773 */
6086  	        ,x_neg_Qty_Changflag_tab           IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6087  	        ,x_neg_Raw_Changflag_tab         IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6088  	        ,x_neg_Burd_Changflag_tab          IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6089  	        ,x_neg_rev_Changflag_tab           IN  OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type
6090                 ,x_return_status                 OUT NOCOPY VARCHAR2
6091         ,x_msg_data                      OUT NOCOPY varchar2
6092                 ) IS
6093 
6094     l_stage     Varchar2(1000);
6095 
6096     CURSOR cur_sprdRecs IS
6097     SELECT tmp.resource_assignment_id
6098         ,tmp.txn_currency_code
6099         ,tmp.old_spread_curve_id
6100         ,tmp.new_spread_curve_id
6101         ,tmp.old_sp_fix_date
6102         ,tmp.new_sp_fix_date
6103         ,tmp.old_plan_start_date
6104         ,tmp.new_plan_start_date
6105         ,tmp.old_plan_end_date
6106         ,tmp.new_plan_end_date
6107         ,tmp.re_spread_amts_flag
6108         ,tmp.sp_curve_change_flag
6109         ,tmp.plan_dates_change_flag
6110         ,tmp.sp_fix_date_change_flag
6111         ,tmp.mfc_cost_change_flag
6112         ,tmp.old_mfc_cost_type_id
6113         ,tmp.new_mfc_cost_type_id
6114         ,tmp.etc_start_date
6115         ,tmp.project_currency_code
6116         ,tmp.projfunc_currency_code
6117         ,NVL(tmp.system_reference_var1,'N')  MultiCurrLineFlag
6118         ,NVL(tmp.plan_start_date_shrunk_flag,'N') plan_start_date_shrunk_flag
6119         ,NVL(tmp.plan_end_date_shrunk_flag,'N') plan_end_date_shrunk_flag
6120         ,NVL(tmp.rlm_id_change_flag,'N') rlm_id_change_flag
6121     FROM pa_fp_spread_calc_tmp tmp
6122     WHERE  tmp.budget_version_id = p_budget_version_id
6123     AND    NVL(tmp.system_reference_var1,'N') = 'Y'
6124     AND    NVL(tmp.rlm_id_change_flag,'N') <> 'Y'
6125     AND   (tmp.re_spread_amts_flag  = 'Y'
6126                OR tmp.sp_curve_change_flag  = 'Y'
6127                OR tmp.plan_dates_change_flag  = 'Y'
6128                OR tmp.sp_fix_date_change_flag  = 'Y'
6129                OR tmp.mfc_cost_change_flag = 'Y'
6130         );
6131 
6132 
6133     CURSOR cur_MultipleAdjustments_chk IS
6134     SELECT 'Y'
6135     FROM DUAL
6136     WHERE EXISTS (SELECT 'MultipleLAdjustments'
6137             FROM pa_fp_spread_calc_tmp tmp
6138             WHERE tmp.budget_version_id = p_budget_version_id
6139             AND  ((decode(tmp.OLD_PLAN_START_DATE,NULL,'N'
6140                                  ,decode(tmp.NEW_PLAN_START_DATE,NULL,'N'
6141                                   ,decode(tmp.OLD_PLAN_START_DATE,tmp.NEW_PLAN_START_DATE,'N','Y'))) ='Y')
6142                 OR
6143                 (decode(tmp.OLD_PLAN_END_DATE,NULL,'N'
6144                                  ,decode(tmp.NEW_PLAN_END_DATE,NULL,'N'
6145                                   ,decode(tmp.OLD_PLAN_END_DATE,tmp.NEW_PLAN_END_DATE,'N','Y'))) = 'Y')
6146                  )
6147             GROUP BY tmp.resource_assignment_id
6148             HAVING count(*) > 1
6149              );
6150 
6151     /* This cursor picks all the required info to populate error msg stack */
6152     CURSOR cur_msgStackDetails IS
6153     SELECT tmp.resource_assignment_id
6154         ,rl.alias  resource_name
6155     ,tmp.txn_currency_code
6156         ,tmp.old_plan_start_date
6157         ,tmp.new_plan_start_date
6158         ,tmp.old_plan_end_date
6159         ,tmp.new_plan_end_date
6160         ,tmp.old_spread_curve_id
6161         ,tmp.new_spread_curve_id
6162         ,tmp.old_sp_fix_date
6163         ,tmp.new_sp_fix_date
6164         ,tmp.old_mfc_cost_type_id
6165         ,tmp.new_mfc_cost_type_id
6166     FROM pa_fp_spread_calc_tmp tmp
6167         ,pa_resource_list_members rl
6168         ,pa_resource_assignments ra
6169         WHERE tmp.budget_version_id = p_budget_version_id
6170     AND   ra.resource_assignment_id = tmp.resource_assignment_id
6171     AND   rl.resource_list_member_id = ra.resource_list_member_id
6172     /** Bug fix:  ORA-00979: not a GROUP BY expression in Package PA_FP_CALC_UTILS
6173         AND  ((decode(tmp.OLD_PLAN_START_DATE,NULL,'N'
6174                 ,decode(tmp.NEW_PLAN_START_DATE,NULL,'N'
6175                   ,decode(tmp.OLD_PLAN_START_DATE,tmp.NEW_PLAN_START_DATE,'N','Y'))) ='Y')
6176                OR
6177                (decode(tmp.OLD_PLAN_END_DATE,NULL,'N'
6178                  ,decode(tmp.NEW_PLAN_END_DATE,NULL,'N'
6179                    ,decode(tmp.OLD_PLAN_END_DATE,tmp.NEW_PLAN_END_DATE,'N','Y'))) = 'Y')
6180                )
6181         GROUP BY tmp.resource_assignment_id
6182         HAVING count(*) > 1 ;
6183         *** End of bug fix**/
6184         AND EXISTS (SELECT 'MultipleLAdjustments'
6185                     FROM pa_fp_spread_calc_tmp tmpb
6186                     WHERE tmpb.budget_version_id = tmp.budget_version_id
6187                     AND   tmpb.resource_assignment_id = tmp.resource_assignment_id
6188                     AND  ((decode(tmpb.OLD_PLAN_START_DATE,NULL,'N'
6189                            ,decode(tmpb.NEW_PLAN_START_DATE,NULL,'N'
6190                             ,decode(tmpb.OLD_PLAN_START_DATE,tmpb.NEW_PLAN_START_DATE,'N','Y'))) ='Y')
6191                           OR
6192                            (decode(tmpb.OLD_PLAN_END_DATE,NULL,'N'
6193                             ,decode(tmpb.NEW_PLAN_END_DATE,NULL,'N'
6194                              ,decode(tmpb.OLD_PLAN_END_DATE,tmpb.NEW_PLAN_END_DATE,'N','Y'))) = 'Y')
6195                           )
6196                     GROUP BY tmpb.resource_assignment_id
6197                     HAVING count(*) > 1
6198                     );
6199 
6200     /* This cursor checks that calling api has passed duplicate set of records */
6201     CURSOR cur_chk_dupRecords IS
6202         SELECT tmp.resource_assignment_id
6203                 ,tmp.txn_currency_code
6204         FROM pa_fp_spread_calc_tmp tmp
6205         WHERE tmp.budget_version_id = p_budget_version_id
6206         GROUP BY tmp.resource_assignment_id
6207                 ,tmp.txn_currency_code
6208         HAVING COUNT(*) > 1 ;
6209 
6210     l_plan_start_date_shrunk Varchar2(10) := 'N';
6211         l_plan_end_date_shrunk   Varchar2(10) := 'N';
6212     l_MultipleAdjustments_Flag  Varchar2(10) := 'N';
6213 
6214     l_return_status      Varchar2(1) := 'S';
6215 
6216     FUNCTION IsCacheReqd(p_calling_context VARCHAR2 ) RETURN VARCHAR2 IS
6217 
6218         l_return_flg  Varchar2(1) := 'N';
6219     BEGIN
6220         SELECT 'Y'
6221         INTO l_return_flg
6222         FROM DUAL
6223         WHERE EXISTS (Select null
6224                 from pa_fp_spread_calc_tmp tmp
6225                 where  ( NVL(tmp.sp_curve_change_flag,'N') = 'Y'
6226                             OR NVL(tmp.plan_dates_change_flag,'N') = 'Y'
6227                             OR NVL(tmp.sp_fix_date_change_flag,'N') = 'Y'
6228                     OR NVL(tmp.re_spread_amts_flag,'N') = 'Y'
6229                             OR ( (NVL(tmp.mfc_cost_change_flag,'N') = 'Y'
6230                           AND p_calling_context = 'RATXNCOMBO')
6231                        )
6232                     --OR NVL(tmp.rlm_id_changed_flag,'N') = 'Y'
6233                         ));
6234 
6235         RETURN l_return_flg;
6236     EXCEPTION
6237         WHEN NO_DATA_FOUND THEN
6238             l_return_flg := 'N';
6239             RETURN l_return_flg;
6240     END IsCacheReqd;
6241 
6242 BEGIN
6243         x_return_status := 'S';
6244     l_return_status := 'S';
6245         x_msg_data := NULL;
6246 
6247         /* Initialize the error stack */
6248     If p_pa_debug_mode = 'Y' Then
6249         pa_debug.init_err_stack('PA_FP_CALC_UTILS.populate_spreadCalc_Tmp');
6250     	print_msg(' Entered populate_spreadCalc_Tmp API');
6251     End If;
6252     /* populate tmp table with the data */
6253        Init_plsqlTabs;
6254        DELETE FROM pa_fp_spread_calc_tmp;
6255        DELETE FROM pa_fp_rollup_tmp
6256        WHERE budget_version_id = p_budget_version_id;
6257 
6258        bvDetailsRec := NULL;
6259        OPEN cur_bvDetails(p_budget_version_id);
6260        FETCH cur_bvDetails INTO bvDetailsRec;
6261        CLOSE cur_bvDetails;
6262        /* cache the period details info */
6263  	         perdRec := NULL;
6264  	         OPEN periodDetails(p_budget_version_id);
6265  	         FETCH periodDetails INTO perdRec;
6266  	         CLOSE periodDetails;
6267 
6268        g_rollup_required_flag :=  NVL(p_rollup_required_flag,'N');
6269        g_calling_module       := p_calling_module;
6270        g_budget_version_id    := p_budget_version_id;
6271        g_budget_version_type  := bvDetailsRec.version_type;
6272        g_budget_version_name  := bvDetailsRec.version_name;
6273        g_etc_start_date       := bvDetailsRec.etc_start_date;
6274        g_project_name         := bvDetailsRec.project_name;
6275            g_wp_version_flag      := NVL(bvDetailsRec.wp_version_flag,'N');
6276        g_refresh_rates_flag    := NVL(p_refresh_rates_flag,'N');
6277            g_refresh_conv_rates_flag  := NVL(p_refresh_conv_rates_flag,'N');
6278            g_mass_adjust_flag       := NVL(p_mass_adjust_flag,'N');
6279            g_source_context         := p_source_context;
6280            g_apply_progress_flag    := NVL(p_apply_progress_flag,'N');
6281        g_project_currency_code  := bvDetailsRec.project_currency_code;
6282        g_projfunc_currency_code  := bvDetailsRec.projfunc_currency_code;
6283        g_baseline_funding_flag  := NVL(bvDetailsRec.baseline_funding_flag,'N');
6284        g_approved_revenue_flag  := NVL(bvDetailsRec.approved_rev_plan_type_flag,'N');
6285 	g_project_id    := bvDetailsRec.project_id;
6286         g_ciId          := bvDetailsRec.ciId;
6287         g_plan_class_type :=    bvDetailsRec.plan_class_type;
6288         g_time_phase_changed_flag := NVL(p_time_phase_changed_flag,'N');  /* Bug fix:4613444 */
6289         g_wp_cost_changed_flag    := NVL(p_wp_cost_changed_flag,'N');
6290         -- CBS 13653430 changes
6291           g_wp_resource_class_flag   := PA_PROJECT_STRUCTURE_UTILS.get_resource_class_flag(g_project_id);
6292 
6293 	IF P_PA_DEBUG_MODE = 'Y' Then
6294        		print_msg('populating spread_calc_tmp table from in params');
6295 	End If;
6296 
6297 	/*Start of Perf Impr:5309529: Added this new api as part of perf enhancement */
6298 	  insert_calcTmp_records
6299 		( x_resource_assignment_tab       => x_resource_assignment_tab
6300                 ,x_delete_budget_lines_tab        => x_delete_budget_lines_tab
6301                 ,x_spread_amts_flag_tab           => x_spread_amts_flag_tab
6302                 ,x_txn_currency_code_tab          => x_txn_currency_code_tab
6303                 ,x_txn_currency_override_tab      => x_txn_currency_override_tab
6304                 ,x_total_qty_tab                  => x_total_qty_tab
6305                 ,x_addl_qty_tab                   => x_addl_qty_tab
6306                 ,x_total_raw_cost_tab             => x_total_raw_cost_tab
6307                 ,x_addl_raw_cost_tab              => x_addl_raw_cost_tab
6308                 ,x_total_burdened_cost_tab        => x_total_burdened_cost_tab
6309                 ,x_addl_burdened_cost_tab         => x_addl_burdened_cost_tab
6310                 ,x_total_revenue_tab              => x_total_revenue_tab
6311                 ,x_addl_revenue_tab               => x_addl_revenue_tab
6312                 ,x_raw_cost_rate_tab              => x_raw_cost_rate_tab
6313                 ,x_rw_cost_rate_override_tab      => x_rw_cost_rate_override_tab
6314                 ,x_b_cost_rate_tab                => x_b_cost_rate_tab
6315                 ,x_b_cost_rate_override_tab       => x_b_cost_rate_override_tab
6316                 ,x_bill_rate_tab                  => x_bill_rate_tab
6317                 ,x_bill_rate_override_tab         => x_bill_rate_override_tab
6318                 ,x_line_start_date_tab            => x_line_start_date_tab
6319                 ,x_line_end_date_tab              => x_line_end_date_tab
6320                 ,x_apply_progress_flag_tab        => x_apply_progress_flag_tab
6321                 ,x_spread_curve_id_old_tab        => x_spread_curve_id_old_tab
6322                 ,x_spread_curve_id_new_tab        => x_spread_curve_id_new_tab
6323                 ,x_sp_fixed_date_old_tab          => x_sp_fixed_date_old_tab
6324                 ,x_sp_fixed_date_new_tab          => x_sp_fixed_date_new_tab
6325                 ,x_plan_start_date_old_tab        => x_plan_start_date_old_tab
6326                 ,x_plan_start_date_new_tab        => x_plan_start_date_new_tab
6327                 ,x_plan_end_date_old_tab          => x_plan_end_date_old_tab
6328 		,x_plan_end_date_new_tab          => x_plan_end_date_new_tab
6329                 ,x_re_spread_flag_tab             => x_re_spread_flag_tab
6330                 ,x_sp_curve_change_flag_tab       => x_sp_curve_change_flag_tab
6331                 ,x_plan_dates_change_flag_tab     => x_plan_dates_change_flag_tab
6332                 ,x_spfix_date_flag_tab            => x_spfix_date_flag_tab
6333                 ,x_mfc_cost_change_flag_tab       => x_mfc_cost_change_flag_tab
6334                 ,x_mfc_cost_type_id_old_tab       => x_mfc_cost_type_id_old_tab
6335                 ,x_mfc_cost_type_id_new_tab       => x_mfc_cost_type_id_new_tab
6336         	,x_rlm_id_change_flag_tab         => x_rlm_id_change_flag_tab
6337         	,x_plan_sdate_shrunk_flag_tab     => x_plan_sdate_shrunk_flag_tab
6338                 ,x_plan_edate_shrunk_flag_tab     => x_plan_edate_shrunk_flag_tab
6339                 ,x_mfc_cost_refresh_flag_tab      => x_mfc_cost_refresh_flag_tab
6340         	,x_ra_in_multi_cur_flag_tab       => x_ra_in_multi_cur_flag_tab
6341         	,x_quantity_changed_flag_tab      => x_quantity_changed_flag_tab
6342                 ,x_raw_cost_changed_flag_tab      => x_raw_cost_changed_flag_tab
6343                 ,x_cost_rate_changed_flag_tab     => x_cost_rate_changed_flag_tab
6344                 ,x_burden_cost_changed_flag_tab   => x_burden_cost_changed_flag_tab
6345                 ,x_burden_rate_changed_flag_tab   => x_burden_rate_changed_flag_tab
6346                 ,x_rev_changed_flag_tab           => x_rev_changed_flag_tab
6347                 ,x_bill_rate_changed_flag_tab     => x_bill_rate_changed_flag_tab
6348                 ,x_multcur_plan_start_date_tab    => x_multcur_plan_start_date_tab
6349                 ,x_multcur_plan_end_date_tab      => x_multcur_plan_end_date_tab
6350                 ,x_fp_task_billable_flag_tab      => x_fp_task_billable_flag_tab
6351                 ,x_cost_rt_miss_num_flag_tab      => x_cost_rt_miss_num_flag_tab
6352                 ,x_burd_rt_miss_num_flag_tab      => x_burd_rt_miss_num_flag_tab
6353                 ,x_bill_rt_miss_num_flag_tab      => x_bill_rt_miss_num_flag_tab
6354                 ,x_Qty_miss_num_flag_tab          => x_Qty_miss_num_flag_tab
6355                 ,x_Rw_miss_num_flag_tab           => x_Rw_miss_num_flag_tab
6356                 ,x_Br_miss_num_flag_tab           => x_Br_miss_num_flag_tab
6357                 ,x_Rv_miss_num_flag_tab           => x_Rv_miss_num_flag_tab
6358                 ,x_rev_only_entry_flag_tab        => x_rev_only_entry_flag_tab
6359                 ,x_return_status                  => l_return_status
6360                 ,x_msg_data                       => x_msg_data
6361 		);
6362 		IF l_return_status <> 'S' Then
6363 			x_return_status := 'E';
6364 		End If;
6365 	   /* end of Perf Impr:5309529 */
6366 	   /*******
6367            FORALL i IN x_resource_assignment_tab.FIRST .. x_resource_assignment_tab.LAST
6368                 INSERT INTO pa_fp_spread_calc_tmp
6369                         (RESOURCE_ASSIGNMENT_ID --resource_assignment_id
6370                          ,DELETE_BL_FLAG          --delete_budget_lines_flag
6371                          ,SPREAD_AMTS_FLAG      --spread_amts_flag
6372                          ,TXN_CURRENCY_CODE     --txn_currency_code
6373                          ,TXN_CURR_CODE_OVERRIDE --txn_currency_override
6374                          ,QUANTITY              --total_qty
6375                          ,SYSTEM_REFERENCE_NUM1 --addl_qty
6376                          ,TXN_RAW_COST          --total_raw_cost
6377                          ,SYSTEM_REFERENCE_NUM2 --addl_raw_cost
6378                          ,TXN_BURDENED_COST     --total_burdened_cost
6379                          ,SYSTEM_REFERENCE_NUM3 --addl_burdened_cost
6380                          ,TXN_REVENUE           --total_revenue
6381                          ,SYSTEM_REFERENCE_NUM4 --addl_revenue
6382                          ,COST_RATE             --raw_cost_rate
6383                          ,COST_RATE_OVERRIDE    --rw_cost_rate_override
6384                          ,BURDEN_COST_RATE      --b_cost_rate
6385                          ,BURDEN_COST_RATE_OVERRIDE --b_cost_rate_override
6386                          ,BILL_RATE             --bill_rate
6387                          ,BILL_RATE_OVERRIDE    --bill_rate_override
6388                          ,START_DATE            --line_start_date
6389                          ,END_DATE              --line_end_date
6390                          ,APPLY_PROGRESS_FLAG   --apply_progress_flag
6391                          ,BUDGET_VERSION_ID     --budget_version_id
6392                          ,OLD_SPREAD_CURVE_ID   --x_spread_curve_id_old_tab
6393                          ,NEW_SPREAD_CURVE_ID   --x_spread_curve_id_new_tab
6394                          ,OLD_SP_FIX_DATE       --x_sp_fixed_date_old_tab
6395                          ,NEW_SP_FIX_DATE       --x_sp_fixed_date_new_tab
6396                          ,OLD_PLAN_START_DATE   --x_plan_start_date_old_tab
6397                          ,NEW_PLAN_START_DATE   --x_plan_start_date_new_tab
6398                          ,OLD_PLAN_END_DATE     --x_plan_end_date_old_tab
6399                          ,NEW_PLAN_END_DATE     --x_plan_end_date_new_tab
6400                          ,RE_SPREAD_AMTS_FLAG   --x_re_spread_flag_tab
6401                          ,SP_CURVE_CHANGE_FLAG  --x_sp_curve_change_flag_tab
6402                          ,PLAN_DATES_CHANGE_FLAG --x_plan_dates_change_flag_tab
6403                          ,SP_FIX_DATE_CHANGE_FLAG --x_spfix_date_flag_tab
6404                          ,MFC_COST_CHANGE_FLAG   --x_mfc_cost_change_flag_tab
6405                          ,OLD_MFC_COST_TYPE_ID   --x_mfc_cost_type_id_old_tab
6406                          ,NEW_MFC_COST_TYPE_ID   --x_mfc_cost_type_id_new_tab
6407              ,ETC_START_DATE
6408              ,PROJECT_CURRENCY_CODE
6409              ,PROJFUNC_CURRENCY_CODE
6410              ,RLM_ID_CHANGE_FLAG
6411              ,BUDGET_VERSION_TYPE
6412             ,BILLABLE_FLAG
6413 			,COST_RATE_G_MISS_NUM_FLAG
6414 			,BURDEN_RATE_G_MISS_NUM_FLAG
6415 			,BILL_RATE_G_MISS_NUM_FLAG
6416 			,QUANTITY_G_MISS_NUM_FLAG
6417 			,RAW_COST_G_MISS_NUM_FLAG
6418 			,BURDEN_COST_G_MISS_NUM_FLAG
6419 			,REVENUE_G_MISS_NUM_FLAG
6420                         )
6421                 VALUES (
6422                         x_resource_assignment_tab(i)
6423                         ,x_delete_budget_lines_tab(i)
6424                         ,x_spread_amts_flag_tab(i)
6425                         ,x_txn_currency_code_tab(i)
6426                         ,x_txn_currency_override_tab(i)
6427                         ,x_total_qty_tab(i)
6428                         ,x_addl_qty_tab(i)
6429                         ,x_total_raw_cost_tab(i)
6430                         ,x_addl_raw_cost_tab(i)
6431                         ,x_total_burdened_cost_tab(i)
6432                         ,x_addl_burdened_cost_tab(i)
6433                         ,x_total_revenue_tab(i)
6434                         ,x_addl_revenue_tab(i)
6435                         ,x_raw_cost_rate_tab(i)
6436                         ,x_rw_cost_rate_override_tab(i)
6437                         ,x_b_cost_rate_tab(i)
6438                         ,x_b_cost_rate_override_tab(i)
6439                         ,x_bill_rate_tab(i)
6440                         ,x_bill_rate_override_tab(i)
6441                         ,x_line_start_date_tab(i)
6442                         ,x_line_end_date_tab(i)
6443                         ,x_apply_progress_flag_tab(i)
6444                         ,g_budget_version_id
6445                         ,x_spread_curve_id_old_tab(i)
6446                         ,x_spread_curve_id_new_tab(i)
6447                         ,x_sp_fixed_date_old_tab(i)
6448                         ,x_sp_fixed_date_new_tab(i)
6449                         ,x_plan_start_date_old_tab(i)
6450                         ,x_plan_start_date_new_tab(i)
6451                         ,x_plan_end_date_old_tab(i)
6452                         ,x_plan_end_date_new_tab(i)
6453                         ,x_re_spread_flag_tab(i)
6454                         ,x_sp_curve_change_flag_tab(i)
6455                         ,x_plan_dates_change_flag_tab(i)
6456                         ,x_spfix_date_flag_tab(i)
6457                         ,x_mfc_cost_change_flag_tab(i)
6458                         ,x_mfc_cost_type_id_old_tab(i)
6459                         ,x_mfc_cost_type_id_new_tab(i)
6460             		,g_etc_start_date
6461             		,g_project_currency_code
6462             		,g_projfunc_currency_code
6463             		,x_rlm_id_change_flag_tab(i)
6464             		,g_budget_version_type
6465             		,x_fp_task_billable_flag_tab(i)
6466 			,x_cost_rt_miss_num_flag_tab(i)
6467                 	,x_burd_rt_miss_num_flag_tab(i)
6468                 	,x_bill_rt_miss_num_flag_tab(i)
6469 			,x_Qty_miss_num_flag_tab(i)
6470                 	,x_Rw_miss_num_flag_tab(i)
6471                 	,x_Br_miss_num_flag_tab(i)
6472                 	,x_Rv_miss_num_flag_tab(i)
6473               );
6474 	 ************/
6475 	IF P_PA_DEBUG_MODE = 'Y' Then
6476         print_msg('Number of rows populated['||sql%rowcount||']');
6477 	End If;
6478 
6479         /* Bug fix: 3841644 Added the following check to validate the duplicate records sent by calling API */
6480                 IF g_source_context = 'RESOURCE_ASSIGNMENT'
6481 		   AND NVL(g_time_phase_changed_flag,'N') = 'N' Then
6482             	   FOR i IN cur_chk_dupRecords LOOP
6483                         --print_msg('Duplicate Resource Assignments sent for Calcaulate API');
6484                         pa_utils.add_message
6485                         ( p_app_short_name => 'PA'
6486                         ,p_msg_name       => 'PA_FP_DUPRES_RECORDS'
6487                         ,p_token1       => 'RESOURCE_ID'
6488                         ,p_value1       => i.resource_assignment_id
6489                         ,p_token2       => 'TXN_CURRENCY_CODE'
6490                         ,p_value2       => i.txn_currency_code
6491                         ,p_token3       => 'BUDGET_VERSION_ID'
6492                         ,p_value3       => p_budget_version_id
6493                         );
6494                         --print_msg('ResId['||i.resource_assignment_id||']txnCur['||i.txn_currency_code||']');
6495                         l_return_status := 'E';
6496             		x_return_status := 'E';
6497                     END LOOP;
6498         End If;
6499 
6500     IF p_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION') Then  --{
6501             IF NVL(l_return_status,'S') = 'S'
6502  	                 AND g_source_context = 'RESOURCE_ASSIGNMENT'
6503  	                 AND NVL(g_time_phase_changed_flag,'N') = 'N' Then
6504                    /* Check that If User changes the plan dates for same resource more than once then abort the process */
6505                    OPEN cur_MultipleAdjustments_chk;
6506                    FETCH cur_MultipleAdjustments_chk INTO l_MultipleAdjustments_flag;
6507                    CLOSE cur_MultipleAdjustments_chk;
6508 
6509                    print_msg('Check MultipleLinesAdjustmentFlag['||l_MultipleAdjustments_flag||']');
6510                    IF NVL(l_MultipleAdjustments_flag,'N') = 'Y' THEN
6511                         l_return_status := 'E';
6512                         x_return_status := 'E';
6513 			IF P_PA_DEBUG_MODE = 'Y' Then
6514                         print_msg('Multiple adjustments found for the single resource');
6515 			End If;
6516                         FOR i IN cur_msgStackDetails LOOP
6517                          l_stage := 'RaId['||i.resource_assignment_id||']TxnCur['||i.txn_currency_code||']oldSD[';
6518                          l_stage := l_stage||i.old_plan_start_date||']NewSD['||i.new_plan_start_date;
6519                          l_stage := l_stage||']oldED['||i.old_plan_end_date||']newED['||i.new_plan_end_date||']';
6520                          --print_msg(l_stage);
6521                             PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA'
6522                                 ,p_msg_name      => 'PA_FP_RA_MULTI_ADJUSTMENT'
6523                                 ,p_token1        => 'L_RESOURCE_NAME'
6524                                 ,p_value1        =>  i.resource_name
6525                                 ,p_token2        => 'L_OLD_START_DATE'
6526                                 ,p_value2        =>  i.old_plan_start_date
6527                                 ,p_token3        => 'L_NEW_START_DATE'
6528                                 ,p_value3        => i.new_plan_start_date
6529                                 ,p_token4        => 'L_OLD_END_DATE'
6530                                 ,p_value4        => i.old_plan_end_date
6531                                 ,p_token5        => 'L_NEW_END_DATE'
6532                                 ,p_value5        =>  i.new_plan_end_date
6533                                 );
6534                         END LOOP;
6535                    END IF;
6536            END IF;
6537         END IF;  --}
6538 
6539         IF ( g_refresh_rates_flag = 'N'
6540              AND g_refresh_conv_rates_flag = 'N'
6541 	     AND NVL(g_time_phase_changed_flag,'N') = 'N'
6542              AND g_mass_adjust_flag = 'N') Then  --{
6543 
6544           If NVL(l_return_status,'S') = 'S' Then
6545             /* Bug fix:4221650,4221590 : AMG apis are creating budget lines with null quantity and calling calculate API
6546              * to spread the amounts. The existing line distribution methods spreads the quantiy based on the exisiting plan quantity
6547                      * since budget line donot have any quantity, the spread fails to create a budget lines
6548                      * This is happening through MSP/AMG flow
6549              * call to pji api is not required as these corrupted lines was not passed to pji
6550              */
6551                 /* Bug fix:4272944 Starts */
6552             IF ( NVL(g_baseline_funding_flag,'N') = 'Y'
6553             AND NVL(g_baseline_funding_flag,'N') = 'Y' ) THEN
6554                 --print_msg('Bug fix:4272944: DONOT DELETE AUTOBASELINE zero qty budget lines');
6555                 null;
6556                 /* Bug fix:4272944 Ends */
6557             ELSIF x_resource_assignment_tab.COUNT > 0 THEN
6558 	     IF P_PA_DEBUG_MODE = 'Y' Then
6559              print_msg('Delete zero Quantity budget lines where actuals donot exists');
6560 	     End If;
6561              FORALL i IN x_resource_assignment_tab.FIRST .. x_resource_assignment_tab.LAST
6562              DELETE FROM pa_budget_lines bl
6563              WHERE bl.budget_version_id = p_budget_version_id
6564              AND  bl.resource_assignment_id = x_resource_assignment_tab(i)
6565              AND  NVL(bl.quantity,0)            = 0
6566              AND (NVL(bl.init_quantity,0)       = 0
6567               and NVL(bl.txn_raw_cost,0)        = 0
6568                           and NVL(bl.txn_burdened_cost,0)   = 0
6569                           and NVL(bl.txn_revenue,0)         = 0
6570                   and NVL(bl.txn_init_raw_cost,0)   = 0
6571               and NVL(bl.txn_init_burdened_cost,0)  = 0
6572               and NVL(bl.txn_init_revenue,0)    = 0
6573              );
6574 	     IF P_PA_DEBUG_MODE = 'Y' Then
6575             	print_msg('Number of lines deleted['||sql%rowcount||']');
6576 	     End If;
6577             END IF;
6578 
6579             IF NVL(l_return_status,'S') = 'S' Then
6580                 /* Now update the Rate/Amount/Qty changed flags on the Tmp table */
6581 		IF P_PA_DEBUG_MODE = 'Y' Then
6582                 print_msg('Calling Compare_bdgtLine_Values Api');
6583 		End If;
6584                 Compare_bdgtLine_Values
6585             	    (p_budget_version_id             => p_budget_version_id
6586                     ,p_budget_version_type           => p_budget_version_type
6587                     ,p_source_context                => p_source_context
6588                     ,p_apply_progress_flag           => p_apply_progress_flag
6589             ,x_return_status                 => l_return_status
6590             ,x_msg_data                      => x_msg_data
6591             );
6592                 If l_return_status <> 'S' Then
6593                 x_return_status := 'E';
6594                 End If;
6595             End If;
6596         END IF;  --}
6597 
6598         /* If multiple RA + Txn cur combo is passed, then updates the res attributes whereever it is null */
6599 	IF P_PA_DEBUG_MODE = 'Y' Then
6600         print_msg('Calling synchronize resource attributes api');
6601 	End If;
6602         synch_resAttribs(p_budget_version_id => p_budget_version_id
6603                 ,p_calling_module    => p_calling_module );
6604 
6605         /* now synchronize all the flags */
6606 	IF P_PA_DEBUG_MODE = 'Y' Then
6607         print_msg('calling synchronize changed flag api');
6608 	End If;
6609         synch_ChangedFlags(p_budget_version_id => p_budget_version_id
6610                    ,p_calling_module    => p_calling_module );
6611 
6612         IF ( g_refresh_rates_flag = 'N'
6613                      AND g_refresh_conv_rates_flag = 'N'
6614                      AND g_mass_adjust_flag = 'N'
6615 		AND NVL(g_time_phase_changed_flag,'N') = 'N'
6616              AND g_apply_progress_flag = 'N' ) THEN  --{
6617 
6618          IF (l_return_status = 'S'
6619              AND bvDetailsRec.Wp_Version_Flag <> 'Y'
6620              AND IsCacheReqd(p_calling_context => 'RATXNCOMBO') = 'Y'
6621              AND p_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION')) Then
6622            /* Now populate the tmp table with other RA +Txn currnecy combo for resource planned in multi currency */
6623 	   IF P_PA_DEBUG_MODE = 'Y' Then
6624            print_msg('Calling populate_blTxnCurCombo api');
6625 	   End If;
6626            populate_blTxnCurCombo
6627                    (p_budget_version_id     => p_budget_version_id
6628                    ,x_return_status             => l_return_status
6629                    );
6630 	   IF P_PA_DEBUG_MODE = 'Y' Then
6631            print_msg('RetSts after populate_blTxnCurCombo ['||l_return_status||']');
6632 	   End If;
6633            If l_return_status <> 'S' Then
6634             x_return_status := l_return_status;
6635             x_msg_data := sqlcode||sqlerrm ;
6636            End If;
6637          End IF;
6638 
6639 	    /* Ipm changes */
6640 	    If l_return_status = 'S' AND NVL(g_apply_progress_flag,'N') <> 'Y' Then --{
6641 	       If p_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION') Then
6642 		IF P_PA_DEBUG_MODE = 'Y' Then
6643             	print_msg('Calling Reset_ratebased_pltrxns API');
6644 		End If;
6645             	Reset_ratebased_pltrxns(
6646                     p_budget_version_id              => p_budget_version_id
6647                     ,p_source_context                => p_source_context
6648                     ,x_return_status                 => l_return_status
6649                     );
6650 		IF P_PA_DEBUG_MODE = 'Y' Then
6651             	print_msg('RetSts of Reset_ratebased_pltrxns API ['||l_return_status||']');
6652 		End If;
6653             	If l_return_status <> 'S' Then
6654                             x_return_status := 'E';
6655             	End If;
6656 	       End If;
6657 
6658 		If l_return_status = 'S' and p_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION') Then
6659 			IF P_PA_DEBUG_MODE = 'Y' Then
6660 			print_msg('Calling process_NonRtBsRec_forSprd API');
6661 			End If;
6662 			process_NonRtBsRec_forSprd
6663 			(p_budget_version_id              => p_budget_version_id
6664                     	,p_source_context                => p_source_context
6665                     	,x_return_status                 => l_return_status
6666                     	);
6667 			IF P_PA_DEBUG_MODE = 'Y' Then
6668                         print_msg('RetSts of process_NonRtBsRec_forSprd API ['||l_return_status||']');
6669 			End If;
6670                         If l_return_status <> 'S' Then
6671                             x_return_status := 'E';
6672                         End If;
6673                 End If;
6674 
6675 
6676 		If p_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION') and
6677 		   g_budget_version_type = 'ALL' and l_return_status = 'S' Then
6678 		   IF P_PA_DEBUG_MODE = 'Y' Then
6679 		   print_msg('Calling pre_process_Revenue_Only_Recs API');
6680 		   End If;
6681 		   pre_process_Revenue_Only_Recs
6682                     (p_budget_version_id              => p_budget_version_id
6683                     ,p_source_context                => p_source_context
6684                     ,x_return_status                 => l_return_status
6685                     );
6686 			IF P_PA_DEBUG_MODE = 'Y' Then
6687                 	print_msg('RetSts of pre_process_Revenue_Only_Recs API ['||l_return_status||']');
6688 			End If;
6689                 	If l_return_status <> 'S' Then
6690                             x_return_status := 'E';
6691                 	End If;
6692 		End If;
6693 
6694             If l_return_status = 'S' AND NVL(g_apply_progress_flag,'N') <> 'Y' Then
6695 	    IF P_PA_DEBUG_MODE = 'Y' Then
6696             print_msg('Calling Check_ratebased_pltrxns API');
6697 	    End If;
6698             Check_ratebased_pltrxns(
6699                     p_budget_version_id              => p_budget_version_id
6700                     ,p_source_context                => p_source_context
6701                     ,x_return_status                 => l_return_status
6702                     );
6703 	    IF P_PA_DEBUG_MODE = 'Y' Then
6704             print_msg('RetSts of Check_ratebased_pltrxns API ['||l_return_status||']');
6705 	    End If;
6706             If l_return_status <> 'S' Then
6707                             x_return_status := 'E';
6708                         End If;
6709             End If;
6710           End If;
6711         END IF; --}
6712 	END IF; --}
6713 
6714         /** added this for debug purpose
6715         FOR i IN (select * from pa_fp_spread_calc_tmp ) LOOP
6716             print_msg('Ra['||i.resource_assignment_id||']TxnCur['||i.txn_currency_code||']');
6717             print_msg('respFlag['||i.re_spread_amts_flag||']');
6718                     print_msg('spCurvFlag['||i.sp_curve_change_flag||']');
6719                     print_msg('PlanDtFlag['||i.plan_dates_change_flag||']');
6720                     print_msg('SpFixDtFlag['||i.sp_fix_date_change_flag||']');
6721                     print_msg('mfcCstFlag['||i.mfc_cost_change_flag||']');
6722             print_msg('RlmIdChangFlag['||i.rlm_id_change_flag||']');
6723 
6724         END LOOP;
6725         **/
6726 
6727         /* Now process the resource attribute changes */
6728         IF (l_return_status = 'S'
6729              AND g_refresh_rates_flag = 'N'
6730                      AND g_refresh_conv_rates_flag = 'N'
6731                      AND g_mass_adjust_flag = 'N'
6732                      AND g_apply_progress_flag = 'N'
6733 		AND NVL(g_time_phase_changed_flag,'N') = 'N'
6734              AND p_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION')
6735              AND perdRec.time_phased_code IN ('G','P')) Then --{
6736 
6737             FOR i IN cur_sprdRecs LOOP  --{
6738 	    /**
6739             print_msg('ResMultiCurLineFlag['||i.MultiCurrLineFlag||']');
6740             print_msg('Looping for RA['||i.resource_assignment_id||']Txncur['||i.txn_currency_code||']');
6741             print_msg('oldplsd['||i.old_plan_start_date||']newplsd['||i.new_plan_start_date||']');
6742 	    print_msg('oldpled['||i.old_plan_end_date||']');
6743             print_msg('newpled['||i.new_plan_end_date||']SdShrunkFlg['||i.plan_start_date_shrunk_flag||']');
6744 	    print_msg('EDshrkFlg['||i.plan_end_date_shrunk_flag||']');
6745 	    **/
6746             IF (i.MultiCurrLineFlag = 'Y' AND bvDetailsRec.Wp_Version_Flag <> 'Y')  Then
6747                /* process planning dates change */
6748                IF (NVL(i.re_spread_amts_flag,'N') = 'N'
6749                     AND (i.plan_end_date_shrunk_flag = 'Y' OR i.plan_start_date_shrunk_flag = 'Y')) THEN
6750 
6751                 populate_planDates_Tabs(
6752                         p_resource_assignment_id        => i.resource_assignment_id
6753                         ,p_txn_currency_code             => i.txn_currency_code
6754                 ,p_project_currency_code         => i.project_currency_code
6755                 ,p_projfunc_currency_code        => i.projfunc_currency_code
6756                         ,p_start_dates_shrunk_flag       => i.plan_start_date_shrunk_flag
6757                         ,p_end_dates_shrunk_flag         => i.plan_end_date_shrunk_flag
6758                         ,p_plan_start_date_old           => i.old_plan_start_date
6759                         ,p_plan_start_date_new           => i.new_plan_start_date
6760                         ,p_plan_end_date_old             => i.old_plan_end_date
6761                         ,p_plan_end_date_new             => i.new_plan_end_date
6762                 );
6763 
6764                End If;
6765 
6766                /* Process spread curve change */
6767                IF (NVL(i.sp_curve_change_flag,'N') = 'Y'
6768                 OR NVL(i.sp_fix_date_change_flag,'N') = 'Y'
6769                 --OR NVL(i.mfc_cost_change_flag,'N') = 'Y'
6770                 OR NVL(i.re_spread_amts_flag,'N') = 'Y'
6771                 OR NVL(i.rlm_id_change_flag,'N') = 'Y' ) THEN
6772 
6773                 Populate_ResAttribTabs(
6774                                 p_resource_assignment_id        => i.resource_assignment_id
6775                                 ,p_txn_currency_code             => i.txn_currency_code
6776                                 );
6777 
6778                END IF;
6779 
6780             END IF; -- end of MultiCurrLineFlag
6781            END LOOP; --}
6782            /* process tmp table for planning dates change*/
6783            IF g_Rspd_RaId_Tab.COUNT > 0 Then
6784 	    IF P_PA_DEBUG_MODE = 'Y' Then
6785             print_msg('Calling process_planDates_change api');
6786 	    End If;
6787             process_planDates_change(
6788                         p_budget_version_id              => p_budget_version_id
6789                         ,x_return_status                 => l_return_status
6790                         ,x_msg_data                      => x_msg_data
6791                 );
6792 	    IF P_PA_DEBUG_MODE = 'Y' Then
6793             print_msg('returnStatus of process_planDates_change api['||l_return_status||']');
6794 	    End If;
6795             If l_return_status <> 'S' Then
6796                 x_return_status := l_return_status;
6797             End If;
6798            END IF;
6799            /* process tmp table for other res attribute changes flag */
6800            IF g_RsAtrb_RaId_tab.COUNT > 0 THEN
6801 	    IF P_PA_DEBUG_MODE = 'Y' Then
6802             print_msg('Calling process_ResAttribs api');
6803 	    End if;
6804             process_ResAttribs(
6805                         p_budget_version_id              => p_budget_version_id
6806                         ,p_resource_assignment_id_tab    => g_RsAtrb_RaId_tab
6807                         ,p_txn_currency_code_tab         => g_RsAtrb_Txncur_Tab
6808                         ,x_return_status                 => l_return_status
6809                         ,x_msg_data                      => x_msg_data
6810                 );
6811 	    IF P_PA_DEBUG_MODE = 'Y' Then
6812             print_msg('returnStatus of process_ResAttribs api['||l_return_status||']');
6813 	    End If;
6814                         If l_return_status <> 'S' Then
6815                                 x_return_status := l_return_status;
6816                         End If;
6817            END IF;
6818         END IF;  --}
6819 
6820         IF ( l_return_status = 'S'
6821              AND g_refresh_rates_flag = 'N'
6822                      AND g_refresh_conv_rates_flag = 'N'
6823                      AND g_mass_adjust_flag = 'N'
6824                      AND g_apply_progress_flag = 'N'
6825 		AND NVL(g_time_phase_changed_flag,'N') = 'N'
6826              AND perdRec.time_phased_code NOT IN ('G','P')
6827              AND p_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION') ) Then --{
6828 		IF P_PA_DEBUG_MODE = 'Y' Then
6829             print_msg('Calling process_NonTimePhase_Lines API ');
6830 		End If;
6831             process_NonTimePhase_Lines
6832                 (p_budget_version_id            => p_budget_version_id
6833                 ,p_time_phased_code             => perdRec.time_phased_code
6834                                 ,p_apply_progress_flag          => p_apply_progress_flag
6835                                 ,p_source_context               => p_source_context
6836                                 ,x_return_status                => l_return_status
6837                                 ,x_msg_data                     => x_msg_data
6838                                 );
6839 		IF P_PA_DEBUG_MODE = 'Y' Then
6840             print_msg('returnStatus of process_NonTimePhase_Lines api['||l_return_status||']');
6841 		End If;
6842                         If l_return_status <> 'S' Then
6843                                 x_return_status := l_return_status;
6844                         End If;
6845         END IF;  --}
6846 
6847         IF (l_return_status = 'S'
6848            AND g_refresh_rates_flag = 'N'
6849                    AND g_refresh_conv_rates_flag = 'N'
6850                    AND g_mass_adjust_flag = 'N'
6851                    AND g_apply_progress_flag = 'N'
6852 		AND NVL(g_time_phase_changed_flag,'N') = 'N'
6853            AND p_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION')) Then --{
6854            IF IsCacheReqd(p_calling_context => 'RATES') = 'Y' Then
6855                     /* cache all the override rates and currency conversion attributes */
6856 		IF P_PA_DEBUG_MODE = 'Y' Then
6857             		print_msg('Calling cache_rates API');
6858 		End If;
6859                     cache_rates(
6860                         p_budget_verson_id              => p_budget_version_id
6861                 ,p_apply_progress_flag          => p_apply_progress_flag
6862                         ,p_source_context               => p_source_context
6863                         ,x_return_status                => l_return_status
6864                         ,x_msg_data                     => x_msg_data
6865                             );
6866 		IF P_PA_DEBUG_MODE = 'Y' Then
6867             		print_msg('returnSts of cache_rates api['||l_return_status||']');
6868 		End If;
6869             IF l_return_status <> 'S' Then
6870                 x_return_status := l_return_status;
6871             End If;
6872            END IF;
6873         END IF; --}
6874 
6875         /* Bug fix:5483430 */
6876         IF (l_return_status = 'S'
6877            AND g_refresh_rates_flag = 'N'
6878            AND g_refresh_conv_rates_flag = 'N'
6879            AND g_mass_adjust_flag = 'N'
6880            AND g_apply_progress_flag = 'N'
6881            AND NVL(g_time_phase_changed_flag,'N') = 'N'
6882            AND perdRec.time_phased_code IN ('G','P')
6883            AND g_source_context = 'RESOURCE_ASSIGNMENT'
6884            AND p_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION')) Then --{
6885                 IF P_PA_DEBUG_MODE = 'Y' Then
6886                         print_msg('Calling Check_GLPA_periods_exists ');
6887                 End If;
6888                 Check_GLPA_periods_exists(
6889                         p_budget_verson_id  => p_budget_version_id
6890                         ,p_time_phase_code  => perdRec.time_phased_code
6891                         ,x_return_status    => l_return_status
6892                         ,x_msg_data         => x_msg_data
6893                         );
6894                 IF P_PA_DEBUG_MODE = 'Y' Then
6895                         print_msg('returnSts of Check_GLPA_periods_exists ['||l_return_status||']');
6896                 End If;
6897         END If;
6898         /* end of bug:5483430 */
6899 
6900         /* Now reset the plsql indexes. Ideally this is not requires we can use the tmp table
6901         * this requires lot of code changes in the calculate api. due to time constraint
6902                 * avoiding this and populating the plsql table */
6903                 SELECT tmp.RESOURCE_ASSIGNMENT_ID --resource_assignment_id
6904                          ,tmp.DELETE_BL_FLAG          --delete_budget_lines_flag
6905                          ,tmp.SPREAD_AMTS_FLAG      --spread_amts_flag
6906                          ,tmp.TXN_CURRENCY_CODE     --txn_currency_code
6907                          ,tmp.TXN_CURR_CODE_OVERRIDE --txn_currency_override
6908                          ,tmp.QUANTITY              --total_qty
6909                          ,tmp.SYSTEM_REFERENCE_NUM1 --addl_qty
6910                          ,tmp.TXN_RAW_COST          --total_raw_cost
6911                          ,tmp.SYSTEM_REFERENCE_NUM2 --addl_raw_cost
6912                          ,tmp.TXN_BURDENED_COST     --total_burdened_cost
6913                          ,tmp.SYSTEM_REFERENCE_NUM3 --addl_burdened_cost
6914                          ,tmp.TXN_REVENUE           --total_revenue
6915                          ,tmp.SYSTEM_REFERENCE_NUM4 --addl_revenue
6916                          ,tmp.COST_RATE             --raw_cost_rate
6917                          ,tmp.COST_RATE_OVERRIDE    --rw_cost_rate_override
6918                          ,tmp.BURDEN_COST_RATE      --b_cost_rate
6919                          ,tmp.BURDEN_COST_RATE_OVERRIDE --b_cost_rate_override
6920                          ,tmp.BILL_RATE             --bill_rate
6921                          ,tmp.BILL_RATE_OVERRIDE    --bill_rate_override
6922                          ,tmp.START_DATE            --line_start_date
6923                          ,tmp.END_DATE              --line_end_date
6924                          ,tmp.APPLY_PROGRESS_FLAG   --apply_progress_flag
6925                          ,tmp.OLD_SPREAD_CURVE_ID   --x_spread_curve_id_old_tab
6926                          ,tmp.NEW_SPREAD_CURVE_ID   --x_spread_curve_id_new_tab
6927                          ,tmp.OLD_SP_FIX_DATE       --x_sp_fixed_date_old_tab
6928                          ,tmp.NEW_SP_FIX_DATE       --x_sp_fixed_date_new_tab
6929                          ,tmp.OLD_PLAN_START_DATE   --x_plan_start_date_old_tab
6930                          ,tmp.NEW_PLAN_START_DATE   --x_plan_start_date_new_tab
6931                          ,tmp.OLD_PLAN_END_DATE     --x_plan_end_date_old_tab
6932                          ,tmp.NEW_PLAN_END_DATE     --x_plan_end_date_new_tab
6933                          ,NVL(tmp.RE_SPREAD_AMTS_FLAG,'N')   --x_re_spread_flag_tab
6934                          ,NVL(tmp.SP_CURVE_CHANGE_FLAG,'N')  --x_sp_curve_change_flag_tab
6935                          ,NVL(tmp.PLAN_DATES_CHANGE_FLAG,'N') --x_plan_dates_change_flag_tab
6936                          ,NVL(tmp.SP_FIX_DATE_CHANGE_FLAG,'N') --x_spfix_date_flag_tab
6937                          ,NVL(tmp.MFC_COST_CHANGE_FLAG,'N')   --x_mfc_cost_change_flag_tab
6938                          ,tmp.OLD_MFC_COST_TYPE_ID   --x_mfc_cost_type_id_old_tab
6939                          ,tmp.NEW_MFC_COST_TYPE_ID   --x_mfc_cost_type_id_new_tab
6940              ,NVL(tmp.RLM_ID_CHANGE_FLAG,'N')
6941              ,NVL(tmp.plan_start_date_shrunk_flag,'N')
6942              ,NVL(tmp.plan_end_date_shrunk_flag,'N')
6943              ,NVL(tmp.mfc_cost_refresh_flag,'N')
6944              ,NVL(tmp.system_reference_var1 ,'N') --ResourceWithMultiCurrency
6945              ,NVL(tmp.quantity_changed_flag,'N')
6946                      ,NVL(tmp.raw_cost_changed_flag,'N')
6947                      ,NVL(tmp.cost_rate_changed_flag,'N')
6948                      ,NVL(tmp.burden_cost_changed_flag,'N')
6949                      ,NVL(tmp.burden_rate_changed_flag,'N')
6950                      ,NVL(tmp.revenue_changed_flag,'N')
6951                      ,NVL(tmp.bill_rate_changed_flag,'N')
6952              ,tmp.system_reference_dat1  --newPlanStartDate for resPlannedIn Multicur
6953              ,tmp.system_reference_dat2  --newPlanEndDate for resPlannedIn Multicur
6954 			,NVL(tmp.COST_RATE_G_MISS_NUM_FLAG,'N')
6955                         ,NVL(tmp.BURDEN_RATE_G_MISS_NUM_FLAG,'N')
6956                         ,NVL(tmp.BILL_RATE_G_MISS_NUM_FLAG,'N')
6957 			,NVL(tmp.revenue_only_entered_flag,'N')
6958 			,NVL(tmp.QUANTITY_G_MISS_NUM_FLAG,'N')
6959                        ,NVL(tmp.RAW_COST_G_MISS_NUM_FLAG,'N')
6960                        ,NVL(tmp.BURDEN_COST_G_MISS_NUM_FLAG,'N')
6961                       ,NVL(tmp.REVENUE_G_MISS_NUM_FLAG,'N')
6962 		      /* bug fix:5726773 */
6963  	              ,NVL(tmp.NEG_QUANTITY_CHANGE_FLAG,'N') -- negQtyChangeflag
6964  	              ,NVL(tmp.NEG_RAWCOST_CHANGE_FLAG,'N') -- negRawCostChangeFlag
6965  	              ,NVL(tmp.NEG_BURDEN_CHANGE_FALG,'N') -- negBurdChangeFlag
6966  	              ,NVL(tmp.NEG_REVENUE_CHANGE_FLAG,'N') -- negRevChangeFlag
6967                 BULK COLLECT INTO
6968                         x_resource_assignment_tab
6969                         ,x_delete_budget_lines_tab
6970                         ,x_spread_amts_flag_tab
6971                         ,x_txn_currency_code_tab
6972                         ,x_txn_currency_override_tab
6973                         ,x_total_qty_tab
6974                         ,x_addl_qty_tab
6975                         ,x_total_raw_cost_tab
6976                         ,x_addl_raw_cost_tab
6977                         ,x_total_burdened_cost_tab
6978                         ,x_addl_burdened_cost_tab
6979                         ,x_total_revenue_tab
6980                         ,x_addl_revenue_tab
6981                         ,x_raw_cost_rate_tab
6982                         ,x_rw_cost_rate_override_tab
6983                         ,x_b_cost_rate_tab
6984                         ,x_b_cost_rate_override_tab
6985                         ,x_bill_rate_tab
6986                         ,x_bill_rate_override_tab
6987                         ,x_line_start_date_tab
6988                         ,x_line_end_date_tab
6989                         ,x_apply_progress_flag_tab
6990                         ,x_spread_curve_id_old_tab
6991                         ,x_spread_curve_id_new_tab
6992                         ,x_sp_fixed_date_old_tab
6993                         ,x_sp_fixed_date_new_tab
6994                         ,x_plan_start_date_old_tab
6995                         ,x_plan_start_date_new_tab
6996                         ,x_plan_end_date_old_tab
6997                         ,x_plan_end_date_new_tab
6998                         ,x_re_spread_flag_tab
6999                         ,x_sp_curve_change_flag_tab
7000                         ,x_plan_dates_change_flag_tab
7001                         ,x_spfix_date_flag_tab
7002                         ,x_mfc_cost_change_flag_tab
7003                         ,x_mfc_cost_type_id_old_tab
7004                         ,x_mfc_cost_type_id_new_tab
7005             ,x_rlm_id_change_flag_tab
7006             ,x_plan_sdate_shrunk_flag_tab
7007                     ,x_plan_edate_shrunk_flag_tab
7008                     ,x_mfc_cost_refresh_flag_tab
7009             ,x_ra_in_multi_cur_flag_tab
7010             ,x_quantity_changed_flag_tab
7011                     ,x_raw_cost_changed_flag_tab
7012                     ,x_cost_rate_changed_flag_tab
7013                     ,x_burden_cost_changed_flag_tab
7014                     ,x_burden_rate_changed_flag_tab
7015                     ,x_rev_changed_flag_tab
7016                     ,x_bill_rate_changed_flag_tab
7017             ,x_multcur_plan_start_date_tab
7018                     ,x_multcur_plan_end_date_tab
7019 		,x_cost_rt_miss_num_flag_tab
7020                 ,x_burd_rt_miss_num_flag_tab
7021                 ,x_bill_rt_miss_num_flag_tab
7022 		,x_rev_only_entry_flag_tab
7023 		,x_Qty_miss_num_flag_tab
7024                 ,x_Rw_miss_num_flag_tab
7025                 ,x_Br_miss_num_flag_tab
7026                 ,x_Rv_miss_num_flag_tab
7027 		/* bug fix:5726773 */
7028  	        ,x_neg_Qty_Changflag_tab
7029  	        ,x_neg_Raw_Changflag_tab
7030  	        ,x_neg_Burd_Changflag_tab
7031  	        ,x_neg_rev_Changflag_tab
7032                 FROM PA_FP_SPREAD_CALC_TMP tmp
7033                 WHERE tmp.budget_version_id = p_budget_version_id;
7034 
7035     x_return_status := l_return_status;
7036 
7037         /* reset the error stack */
7038     If p_pa_debug_mode = 'Y' Then
7039     	print_msg('RetSts of the populate_spreadTmp_OvrRates ['||x_return_status||']');
7040         pa_debug.reset_err_stack;
7041     End If;
7042 
7043 EXCEPTION
7044         WHEN OTHERS THEN
7045                 x_return_status := 'U';
7046                 x_msg_data := sqlcode||sqlerrm;
7047                 print_msg('Failed in populate_spreadTmp_OvrRates API'||x_msg_data);
7048          fnd_msg_pub.add_exc_msg
7049                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
7050                  ,p_procedure_name => 'populate_spreadCalc_Tmp ');
7051         If p_pa_debug_mode = 'Y' Then
7052                     pa_debug.reset_err_stack;
7053         End If;
7054                 RAISE;
7055 
7056 END  populate_spreadCalc_Tmp ;
7057 
7058 /* This API caches the override rates,currency conversion attributes, DFFs and other attributes from budget lines to
7059  * tmp2 table. later after spread, for that matching RA+TXN+START DATE periodic lines the attributes will be stamped back
7060  * This is required in order to avoid loosing manual periodic overrides during resource attribute changes
7061  */
7062 PROCEDURE cache_rates(
7063         p_budget_verson_id              IN  Number
7064         ,p_apply_progress_flag          IN Varchar2
7065                 ,p_source_context                IN  pa_fp_res_assignments_tmp.source_context%TYPE
7066         ,x_return_status                 OUT NOCOPY varchar2
7067         ,x_msg_data                      OUT NOCOPY varchar2
7068              ) IS
7069 
7070     l_rowcount    Number;
7071 
7072     CURSOR cur_ovr_rts IS
7073     SELECT tmp.resource_assignment_id
7074         ,tmp.txn_currency_code
7075         ,tmp.cost_rate_override
7076         ,tmp.burden_cost_rate_override
7077         ,tmp.bill_rate_override
7078         ,tmp.budget_version_type
7079         ,tmp.quantity_changed_flag
7080         ,tmp.cost_rate_changed_flag
7081         ,tmp.burden_rate_changed_flag
7082         ,tmp.bill_rate_changed_flag
7083         ,tmp.mfc_cost_change_flag
7084     FROM pa_fp_spread_calc_tmp tmp
7085     WHERE tmp.budget_version_id = p_budget_verson_id
7086     AND   nvl(tmp.rlm_id_change_flag,'N') <> 'Y'
7087     AND   (tmp.cost_rate_override is NOT NULL
7088         OR tmp.burden_cost_rate_override is NOT NULL
7089         OR tmp.bill_rate_override is NOT NULL
7090         OR tmp.mfc_cost_change_flag = 'Y' );
7091 BEGIN
7092     /* Initialize the error stack */
7093     If p_pa_debug_mode = 'Y' Then
7094         pa_debug.init_err_stack('PA_FP_CALC_UTILS.cache_rates');
7095     End If;
7096     x_return_status := 'S';
7097     x_msg_data := NULL;
7098 
7099     INSERT INTO pa_fp_spread_calc_tmp1
7100             (RESOURCE_ASSIGNMENT_ID --resource_assignment_id
7101                          ,BUDGET_VERSION_ID     --budget_version_id
7102              ,BUDGET_VERSION_TYPE
7103              ,BUDGET_LINE_ID
7104                          ,TXN_CURRENCY_CODE     --txn_currency_code
7105                          ,TXN_CURR_CODE_OVERRIDE --txn_currency_override
7106                          ,QUANTITY              --total_qty
7107                          ,TXN_RAW_COST          --total_raw_cost
7108                          ,TXN_BURDENED_COST     --total_burdened_cost
7109                          ,TXN_REVENUE           --total_revenue
7110                          ,COST_RATE             --raw_cost_rate
7111                          ,COST_RATE_OVERRIDE    --rw_cost_rate_override
7112                          ,BURDEN_COST_RATE      --b_cost_rate
7113                          ,BURDEN_COST_RATE_OVERRIDE --b_cost_rate_override
7114                          ,BILL_RATE             --bill_rate
7115                          ,BILL_RATE_OVERRIDE    --bill_rate_override
7116                          ,START_DATE            --line_start_date
7117                          ,END_DATE              --line_end_date
7118              ,PERIOD_NAME
7119             ,PROJECT_CURRENCY_CODE
7120             ,PROJFUNC_CURRENCY_CODE
7121             ,PROJECT_COST_RATE_TYPE
7122             ,PROJECT_COST_EXCHANGE_RATE
7123             ,PROJECT_COST_RATE_DATE_TYPE
7124             ,PROJECT_COST_RATE_DATE
7125             ,PROJECT_REV_RATE_TYPE
7126             ,PROJECT_REV_EXCHANGE_RATE
7127             ,PROJECT_REV_RATE_DATE_TYPE
7128             ,PROJECT_REV_RATE_DATE
7129             ,PROJFUNC_COST_RATE_TYPE
7130             ,PROJFUNC_COST_EXCHANGE_RATE
7131             ,PROJFUNC_COST_RATE_DATE_TYPE
7132             ,PROJFUNC_COST_RATE_DATE
7133             ,PROJFUNC_REV_RATE_TYPE
7134             ,PROJFUNC_REV_EXCHANGE_RATE
7135             ,PROJFUNC_REV_RATE_DATE_TYPE
7136             ,PROJFUNC_REV_RATE_DATE
7137             ,CHANGE_REASON_CODE
7138             ,DESCRIPTION
7139             ,ATTRIBUTE_CATEGORY
7140             ,ATTRIBUTE1
7141             ,ATTRIBUTE2
7142             ,ATTRIBUTE3
7143             ,ATTRIBUTE4
7144             ,ATTRIBUTE5
7145             ,ATTRIBUTE6
7146             ,ATTRIBUTE7
7147             ,ATTRIBUTE8
7148             ,ATTRIBUTE9
7149             ,ATTRIBUTE10
7150             ,ATTRIBUTE11
7151             ,ATTRIBUTE12
7152             ,ATTRIBUTE13
7153             ,ATTRIBUTE14
7154             ,ATTRIBUTE15
7155             ,RAW_COST_SOURCE
7156             ,BURDENED_COST_SOURCE
7157             ,QUANTITY_SOURCE
7158             ,REVENUE_SOURCE
7159             ,PM_PRODUCT_CODE
7160             ,PM_BUDGET_LINE_REFERENCE
7161             ,CODE_COMBINATION_ID
7162             ,CCID_GEN_STATUS_CODE
7163             ,CCID_GEN_REJ_MESSAGE
7164             ,BORROWED_REVENUE
7165             ,TP_REVENUE_IN
7166             ,TP_REVENUE_OUT
7167             ,REVENUE_ADJ
7168             ,LENT_RESOURCE_COST
7169             ,TP_COST_IN
7170             ,TP_COST_OUT
7171             ,COST_ADJ
7172             ,UNASSIGNED_TIME_COST
7173             ,UTILIZATION_PERCENT
7174             ,UTILIZATION_HOURS
7175             ,UTILIZATION_ADJ
7176             ,CAPACITY
7177             ,HEAD_COUNT
7178             ,HEAD_COUNT_ADJ
7179             ,BUCKETING_PERIOD_CODE
7180             ,TXN_DISCOUNT_PERCENTAGE
7181             ,TRANSFER_PRICE_RATE
7182             ,BL_CREATED_BY
7183             ,BL_CREATION_DATE
7184             ,mfc_cost_change_flag
7185             )
7186         SELECT /*+ INDEX(BL PA_BUDGET_LINES_U1) */
7187             bl.RESOURCE_ASSIGNMENT_ID --resource_assignment_id
7188                          ,bl.BUDGET_VERSION_ID     --budget_version_id
7189              ,tmp.BUDGET_VERSION_TYPE
7190              ,bl.BUDGET_LINE_ID
7191                          ,bl.TXN_CURRENCY_CODE     --txn_currency_code
7192                          ,tmp.TXN_CURR_CODE_OVERRIDE --txn_currency_override
7193                          ,bl.QUANTITY              --total_qty
7194                          ,bl.TXN_RAW_COST          --total_raw_cost
7195                          ,bl.TXN_BURDENED_COST     --total_burdened_cost
7196                          ,bl.TXN_REVENUE           --total_revenue
7197                          ,bl.TXN_STANDARD_COST_RATE             --raw_cost_rate
7198                          ,bl.TXN_COST_RATE_OVERRIDE    --rw_cost_rate_override
7199                          ,bl.BURDEN_COST_RATE      --b_cost_rate
7200                          ,bl.BURDEN_COST_RATE_OVERRIDE --b_cost_rate_override
7201                          ,bl.TXN_STANDARD_BILL_RATE             --bill_rate
7202                          ,bl.TXN_BILL_RATE_OVERRIDE    --bill_rate_override
7203                          ,bl.START_DATE            --line_start_date
7204                          ,bl.END_DATE              --line_end_date
7205             ,bl.PERIOD_NAME
7206             ,bl.PROJECT_CURRENCY_CODE
7207             ,bl.PROJFUNC_CURRENCY_CODE
7208             ,bl.PROJECT_COST_RATE_TYPE
7209             ,bl.PROJECT_COST_EXCHANGE_RATE
7210             ,bl.PROJECT_COST_RATE_DATE_TYPE
7211             ,bl.PROJECT_COST_RATE_DATE
7212             ,bl.PROJECT_REV_RATE_TYPE
7213             ,bl.PROJECT_REV_EXCHANGE_RATE
7214             ,bl.PROJECT_REV_RATE_DATE_TYPE
7215             ,bl.PROJECT_REV_RATE_DATE
7216             ,bl.PROJFUNC_COST_RATE_TYPE
7217             ,bl.PROJFUNC_COST_EXCHANGE_RATE
7218             ,bl.PROJFUNC_COST_RATE_DATE_TYPE
7219             ,bl.PROJFUNC_COST_RATE_DATE
7220             ,bl.PROJFUNC_REV_RATE_TYPE
7221             ,bl.PROJFUNC_REV_EXCHANGE_RATE
7222             ,bl.PROJFUNC_REV_RATE_DATE_TYPE
7223             ,bl.PROJFUNC_REV_RATE_DATE
7224             ,bl.CHANGE_REASON_CODE
7225             ,bl.DESCRIPTION
7226             ,bl.ATTRIBUTE_CATEGORY
7227             ,bl.ATTRIBUTE1
7228             ,bl.ATTRIBUTE2
7229             ,bl.ATTRIBUTE3
7230             ,bl.ATTRIBUTE4
7231             ,bl.ATTRIBUTE5
7232             ,bl.ATTRIBUTE6
7233             ,bl.ATTRIBUTE7
7234             ,bl.ATTRIBUTE8
7235             ,bl.ATTRIBUTE9
7236             ,bl.ATTRIBUTE10
7237             ,bl.ATTRIBUTE11
7238             ,bl.ATTRIBUTE12
7239             ,bl.ATTRIBUTE13
7240             ,bl.ATTRIBUTE14
7241             ,bl.ATTRIBUTE15
7242             ,bl.RAW_COST_SOURCE
7243             ,bl.BURDENED_COST_SOURCE
7244             ,bl.QUANTITY_SOURCE
7245             ,bl.REVENUE_SOURCE
7246             ,bl.PM_PRODUCT_CODE
7247             ,bl.PM_BUDGET_LINE_REFERENCE
7248             ,bl.CODE_COMBINATION_ID
7249             ,bl.CCID_GEN_STATUS_CODE
7250             ,bl.CCID_GEN_REJ_MESSAGE
7251             ,bl.BORROWED_REVENUE
7252             ,bl.TP_REVENUE_IN
7253             ,bl.TP_REVENUE_OUT
7254             ,bl.REVENUE_ADJ
7255             ,bl.LENT_RESOURCE_COST
7256             ,bl.TP_COST_IN
7257             ,bl.TP_COST_OUT
7258             ,bl.COST_ADJ
7259             ,bl.UNASSIGNED_TIME_COST
7260             ,bl.UTILIZATION_PERCENT
7261             ,bl.UTILIZATION_HOURS
7262             ,bl.UTILIZATION_ADJ
7263             ,bl.CAPACITY
7264             ,bl.HEAD_COUNT
7265             ,bl.HEAD_COUNT_ADJ
7266             ,bl.BUCKETING_PERIOD_CODE
7267             ,bl.TXN_DISCOUNT_PERCENTAGE
7268             ,bl.TRANSFER_PRICE_RATE
7269             ,bl.CREATED_BY
7270             ,bl.CREATION_DATE
7271             ,tmp.mfc_cost_change_flag
7272         FROM PA_BUDGET_LINES bl
7273             ,PA_FP_SPREAD_CALC_TMP tmp
7274         WHERE bl.budget_version_id = p_budget_verson_id
7275         AND   bl.budget_version_id = tmp.budget_version_id
7276         AND   bl.resource_assignment_id = tmp.resource_assignment_id
7277         AND   bl.txn_currency_code = tmp.txn_currency_code
7278         AND   ((tmp.ETC_START_DATE is NOT NULL
7279             AND bl.end_date >= tmp.ETC_START_DATE)
7280             OR
7281             tmp.ETC_START_DATE is NULL
7282               )
7283         AND  NVL(tmp.RLM_ID_CHANGE_FLAG,'N') <> 'Y'
7284         AND   (NVL(tmp.SP_CURVE_CHANGE_FLAG,'N') = 'Y'
7285             OR NVL(tmp.SP_FIX_DATE_CHANGE_FLAG,'N') = 'Y'
7286             OR NVL(tmp.PLAN_DATES_CHANGE_FLAG,'N') = 'Y'
7287             OR NVL(tmp.MFC_COST_CHANGE_FLAG,'N') = 'Y'
7288             OR NVL(tmp.RE_SPREAD_AMTS_FLAG,'N') = 'Y'
7289               );
7290     l_rowcount := sql%rowcount;
7291     IF P_PA_DEBUG_MODE = 'Y' Then
7292     print_msg('Number of rows cached['||l_rowcount||']');
7293     End If;
7294 
7295     /* Now update the override rates If any passed from the Page */
7296     FOR i IN cur_ovr_rts LOOP
7297 	/*
7298         print_msg('mfcCostFlag['||i.mfc_cost_change_flag||'Ver['||i.budget_version_type||']');
7299         print_msg('costRtChFlag['||i.cost_rate_changed_flag||']Rt['||i.cost_rate_override||']');
7300         print_msg('burRtOvr['||i.burden_cost_rate_override||']');
7301 	*/
7302         UPDATE /*+ INDEX(TMP1 PA_FP_SPREAD_CALC_TMP1_N1) */  pa_fp_spread_calc_tmp1 tmp1
7303         SET tmp1.cost_rate_override = decode(i.budget_version_type,'REVENUE',tmp1.cost_rate_override
7304                         ,decode(nvl(i.cost_rate_changed_flag,'N')
7305                           ,'Y',decode(i.mfc_cost_change_flag,'Y'
7306                            ,decode(nvl(i.cost_rate_override,0),0,NULL,i.cost_rate_override),i.cost_rate_override)
7307                           ,'N',decode(i.mfc_cost_change_flag,'Y'
7308                                ,decode(nvl(i.cost_rate_override,0),0,NULL,i.cost_rate_override),tmp1.cost_rate_override)))
7309            ,tmp1.burden_cost_rate_override = decode(i.budget_version_type,'REVENUE',tmp1.burden_cost_rate_override
7310                         ,decode(nvl(i.burden_rate_changed_flag,'N')
7311                          ,'Y',decode(i.mfc_cost_change_flag,'Y'
7312                                                    ,decode(nvl(i.burden_cost_rate_override,0),0,NULL,i.burden_cost_rate_override),i.burden_cost_rate_override)
7313                          ,'N',decode(i.mfc_cost_change_flag,'Y'
7314                                                        ,decode(nvl(i.burden_cost_rate_override,0),0,NULL,i.burden_cost_rate_override),tmp1.burden_cost_rate_override)))
7315            ,tmp1.bill_rate_override = decode(i.budget_version_type,'COST',tmp1.bill_rate_override
7316                         ,decode(nvl(i.bill_rate_changed_flag,'N')
7317                                                   ,'Y',decode(i.mfc_cost_change_flag,'Y'
7318                                                    ,decode(nvl(i.bill_rate_override,0),0,NULL,i.bill_rate_override),i.bill_rate_override)
7319                                                   ,'N',decode(i.mfc_cost_change_flag,'Y'
7320                                                        ,decode(nvl(i.bill_rate_override,0),0,NULL,i.bill_rate_override),tmp1.bill_rate_override)))
7321         WHERE tmp1.budget_version_id = p_budget_verson_id
7322         AND  tmp1.resource_assignment_id = i.resource_assignment_id
7323         AND  tmp1.txn_currency_code = i.txn_currency_code ;
7324 
7325         l_rowcount := sql%rowcount;
7326 	IF P_PA_DEBUG_MODE = 'Y' Then
7327         print_msg('Number of cached rows updated['||l_rowcount||']');
7328 	End If;
7329 
7330     END LOOP;
7331 
7332     /* reset the error stack */
7333     If p_pa_debug_mode = 'Y' Then
7334         pa_debug.reset_err_stack;
7335     End If;
7336 
7337 EXCEPTION
7338     WHEN OTHERS THEN
7339                 x_return_status := 'U';
7340                 x_msg_data := sqlcode||sqlerrm;
7341         print_msg('Failed in cache_rates API'||x_msg_data);
7342          fnd_msg_pub.add_exc_msg
7343                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
7344                  ,p_procedure_name => 'cache_rates');
7345         If p_pa_debug_mode = 'Y' Then
7346             pa_debug.reset_err_stack;
7347         End If;
7348                 RAISE;
7349 
7350 END cache_rates;
7351 
7352 /* This API copies the override rates, currency conversion attributes, DFF attributes from cache to rollup tmp lines
7353  * so the after spread, the old values are retained
7354  */
7355 PROCEDURE copy_BlAttributes(
7356                 p_budget_verson_id               IN  Number
7357                 ,p_source_context                IN  Varchar2
7358                 ,p_calling_module                IN  Varchar2
7359                 ,p_apply_progress_flag           IN Varchar2
7360                 ,x_return_status                 OUT NOCOPY varchar2
7361                 ,x_msg_data                      OUT NOCOPY varchar2
7362                  ) IS
7363 
7364     CURSOR fptmpDetails IS
7365                 /* Bug Fix 4332086
7366                 Whenever currency is overridden along with a change in quantity in the workplan flow
7367                 in Update Task Details page, the following piece of code gets executed.
7368 
7369                 This code caches several attributes from pa_budget_lines table and will use them in the
7370                 later part of the flow, thus causing the above bug. When ever currency code is overwritten
7371                 we need to use the new currency's conversion attributes, but where as this code will use
7372                 old currency's conversion attributes.
7373 
7374                 As a part of the fix the following cursor is rewritten to cache old attrs only if the
7375                 currency code is not overwritten
7376 
7377     SELECT tmp.rowid
7378               ,tmp.resource_assignment_id
7379               ,tmp.txn_currency_code
7380               ,tmp.start_date
7381               ,tmp.end_date
7382               ,tmp.period_name
7383               ,decode(cache.Budget_version_type ,'ALL'
7384             , decode(cache.txn_curr_code_override,NULL
7385                 ,decode(NVL(cache.mfc_cost_change_flag,'N'),'Y'
7386                 ,cache.cost_rate_override,NVL(cache.cost_rate_override,tmp.rw_cost_rate_override))
7387                     ,cache.cost_rate_override)
7388                         ,'COST',decode(cache.txn_curr_code_override,NULL
7389                             ,decode(NVL(cache.mfc_cost_change_flag,'N'),'Y'
7390                                  ,cache.cost_rate_override,NVL(cache.cost_rate_override,tmp.rw_cost_rate_override))
7391                                       ,cache.cost_rate_override)
7392                  ,tmp.rw_cost_rate_override) cost_rate_override
7393               ,decode(cache.Budget_version_type ,'ALL', decode(cache.txn_curr_code_override,NULL
7394                        ,decode(NVL(cache.mfc_cost_change_flag,'N'),'Y'
7395                ,cache.burden_cost_rate_override,NVL(cache.burden_cost_rate_override,tmp.burden_cost_rate_override))
7396                     ,cache.burden_cost_rate_override)
7397                        ,'COST',decode(cache.txn_curr_code_override,NULL
7398                            ,decode(NVL(cache.mfc_cost_change_flag,'N'),'Y'
7399                                ,cache.burden_cost_rate_override,NVL(cache.burden_cost_rate_override,tmp.burden_cost_rate_override))
7400                                   ,cache.burden_cost_rate_override)
7401             ,tmp.burden_cost_rate_override) burden_rate_override
7402               ,decode(cache.budget_version_type ,'ALL',decode(cache.txn_curr_code_override,NULL
7403                         ,decode(NVL(cache.mfc_cost_change_flag,'N'),'Y'
7404                 ,cache.bill_rate_override,NVL(cache.bill_rate_override,tmp.bill_rate_override))
7405                     ,cache.bill_rate_override)
7406                         ,'REVENUE',decode(cache.txn_curr_code_override,NULL
7407                            ,decode(NVL(cache.mfc_cost_change_flag,'N'),'Y'
7408                               ,cache.bill_rate_override,NVL(cache.bill_rate_override,tmp.bill_rate_override))
7409                                   ,cache.bill_rate_override)
7410                              ,tmp.bill_rate_override) bill_rate_override
7411               ,decode(cache.txn_currency_code,tmp.txn_currency_code,cache.PROJECT_COST_RATE_TYPE
7412                 ,tmp.PROJECT_COST_RATE_TYPE) PROJECT_COST_RATE_TYPE
7413               ,decode(cache.txn_currency_code,tmp.txn_currency_code
7414                 ,cache.PROJECT_COST_EXCHANGE_RATE,tmp.PROJECT_COST_EXCHANGE_RATE) PROJECT_COST_EXCHANGE_RATE
7415               ,decode(cache.txn_currency_code,tmp.txn_currency_code
7416                 ,cache.PROJECT_COST_RATE_DATE_TYPE,tmp.PROJECT_COST_RATE_DATE_TYPE) PROJECT_COST_RATE_DATE_TYPE
7417               ,decode(cache.txn_currency_code,tmp.txn_currency_code
7418                 ,cache.PROJECT_COST_RATE_DATE,tmp.PROJECT_COST_RATE_DATE) PROJECT_COST_RATE_DATE
7419               ,decode(cache.txn_currency_code,tmp.txn_currency_code
7420                 ,cache.PROJECT_REV_RATE_TYPE,tmp.PROJECT_REV_RATE_TYPE) PROJECT_REV_RATE_TYPE
7421               ,decode(cache.txn_currency_code,tmp.txn_currency_code
7422                 ,cache.PROJECT_REV_EXCHANGE_RATE,tmp.PROJECT_REV_EXCHANGE_RATE) PROJECT_REV_EXCHANGE_RATE
7423               ,decode(cache.txn_currency_code,tmp.txn_currency_code
7424                 ,cache.PROJECT_REV_RATE_DATE_TYPE,tmp.PROJECT_REV_RATE_DATE_TYPE) PROJECT_REV_RATE_DATE_TYPE
7425               ,decode(cache.txn_currency_code,tmp.txn_currency_code
7426                 ,cache.PROJECT_REV_RATE_DATE,tmp.PROJECT_REV_RATE_DATE) PROJECT_REV_RATE_DATE
7427               ,decode(cache.txn_currency_code,tmp.txn_currency_code
7428                 ,cache.PROJFUNC_COST_RATE_TYPE,tmp.PROJFUNC_COST_RATE_TYPE) PROJFUNC_COST_RATE_TYPE
7429               ,decode(cache.txn_currency_code,tmp.txn_currency_code
7430                 ,cache.PROJFUNC_COST_EXCHANGE_RATE,tmp.PROJFUNC_COST_EXCHANGE_RATE) PROJFUNC_COST_EXCHANGE_RATE
7431               ,decode(cache.txn_currency_code,tmp.txn_currency_code
7432                 ,cache.PROJFUNC_COST_RATE_DATE_TYPE,tmp.PROJFUNC_COST_RATE_DATE_TYPE) PROJFUNC_COST_RATE_DATE_TYPE
7433               ,decode(cache.txn_currency_code,tmp.txn_currency_code
7434                 ,cache.PROJFUNC_COST_RATE_DATE,tmp.PROJFUNC_COST_RATE_DATE) PROJFUNC_COST_RATE_DATE
7435               ,decode(cache.txn_currency_code,tmp.txn_currency_code
7436                 ,cache.PROJFUNC_REV_RATE_TYPE,tmp.PROJFUNC_REV_RATE_TYPE) PROJFUNC_REV_RATE_TYPE
7437               ,decode(cache.txn_currency_code,tmp.txn_currency_code
7438                 ,cache.PROJFUNC_REV_EXCHANGE_RATE,tmp.PROJFUNC_REV_EXCHANGE_RATE) PROJFUNC_REV_EXCHANGE_RATE
7439               ,decode(cache.txn_currency_code,tmp.txn_currency_code
7440                 ,cache.PROJFUNC_REV_RATE_DATE_TYPE,tmp.PROJFUNC_REV_RATE_DATE_TYPE) PROJFUNC_REV_RATE_DATE_TYPE
7441               ,decode(cache.txn_currency_code,tmp.txn_currency_code
7442                 ,cache.PROJFUNC_REV_RATE_DATE,tmp.PROJFUNC_REV_RATE_DATE) PROJFUNC_REV_RATE_DATE
7443               */
7444                 SELECT tmp.rowid
7445               ,tmp.resource_assignment_id
7446               ,tmp.txn_currency_code
7447               ,tmp.start_date
7448               ,tmp.end_date
7449               ,tmp.period_name
7450               ,DECODE(cache.txn_curr_code_override,NULL,
7451                decode(cache.Budget_version_type ,'ALL'
7452                 ,decode(cache.txn_curr_code_override,NULL
7453                 ,decode(NVL(cache.mfc_cost_change_flag,'N'),'Y'
7454                 ,cache.cost_rate_override,NVL(cache.cost_rate_override,tmp.rw_cost_rate_override))
7455                     ,cache.cost_rate_override)
7456                         ,'COST',decode(cache.txn_curr_code_override,NULL
7457                             ,decode(NVL(cache.mfc_cost_change_flag,'N'),'Y'
7458                                  ,cache.cost_rate_override,NVL(cache.cost_rate_override,tmp.rw_cost_rate_override))
7459                                       ,cache.cost_rate_override)
7460                  ,tmp.rw_cost_rate_override),NULL) cost_rate_override
7461              ,DECODE(cache.txn_curr_code_override,NULL,
7462                decode(cache.Budget_version_type ,'ALL', decode(cache.txn_curr_code_override,NULL
7463                        ,decode(NVL(cache.mfc_cost_change_flag,'N'),'Y'
7464                ,cache.burden_cost_rate_override,NVL(cache.burden_cost_rate_override,tmp.burden_cost_rate_override))
7465                     ,cache.burden_cost_rate_override)
7466                        ,'COST',decode(cache.txn_curr_code_override,NULL
7467                            ,decode(NVL(cache.mfc_cost_change_flag,'N'),'Y'
7468                                ,cache.burden_cost_rate_override,NVL(cache.burden_cost_rate_override,tmp.burden_cost_rate_override))
7469                                   ,cache.burden_cost_rate_override)
7470             ,tmp.burden_cost_rate_override),NULL) burden_rate_override
7471             ,DECODE(cache.txn_curr_code_override,NULL,
7472              decode(cache.budget_version_type ,'ALL',decode(cache.txn_curr_code_override,NULL
7473                         ,decode(NVL(cache.mfc_cost_change_flag,'N'),'Y'
7474                 ,cache.bill_rate_override,NVL(cache.bill_rate_override,tmp.bill_rate_override))
7475                     ,cache.bill_rate_override)
7476                         ,'REVENUE',decode(cache.txn_curr_code_override,NULL
7477                            ,decode(NVL(cache.mfc_cost_change_flag,'N'),'Y'
7478                               ,cache.bill_rate_override,NVL(cache.bill_rate_override,tmp.bill_rate_override))
7479                                   ,cache.bill_rate_override)
7480                              ,tmp.bill_rate_override),NULL) bill_rate_override
7481                --Bug 4224464. Changed the decode below to handle the G_MISS_XXX values for curreny conversion attributes.
7482             ,DECODE(cache.txn_curr_code_override,
7483                                          NULL,decode(cache.txn_currency_code,
7484                                                         tmp.txn_currency_code,decode(cache.PROJECT_COST_RATE_TYPE,
7485                                                                                         NULL,tmp.PROJECT_COST_RATE_TYPE,
7486                                                                                         FND_API.G_MISS_CHAR, NULL,
7487                                                                                         cache.PROJECT_COST_RATE_TYPE),
7488                                                         tmp.PROJECT_COST_RATE_TYPE),
7489                                          NULL) PROJECT_COST_RATE_TYPE
7490             ,DECODE(cache.txn_curr_code_override,
7491                                          NULL,decode(cache.txn_currency_code,
7492                                                         tmp.txn_currency_code,decode(cache.PROJECT_COST_EXCHANGE_RATE,
7493                                                                                         NULL,tmp.PROJECT_COST_EXCHANGE_RATE,
7494                                                                                         FND_API.G_MISS_NUM, NULL,
7495                                                                                         cache.PROJECT_COST_EXCHANGE_RATE),
7496                                                         tmp.PROJECT_COST_EXCHANGE_RATE),
7497                                          NULL) PROJECT_COST_EXCHANGE_RATE
7498             ,DECODE(cache.txn_curr_code_override,
7499                                          NULL,decode(cache.txn_currency_code,
7500                                                         tmp.txn_currency_code,decode(cache.PROJECT_COST_RATE_DATE_TYPE,
7501                                                                                         NULL,tmp.PROJECT_COST_RATE_DATE_TYPE,
7502                                                                                         FND_API.G_MISS_CHAR, NULL,
7503                                                                                         cache.PROJECT_COST_RATE_DATE_TYPE),
7504                                                         tmp.PROJECT_COST_RATE_DATE_TYPE),
7505                                          NULL) PROJECT_COST_RATE_DATE_TYPE
7506             ,DECODE(cache.txn_curr_code_override,
7507                                          NULL,decode(cache.txn_currency_code,
7508                                                         tmp.txn_currency_code,decode(cache.PROJECT_COST_RATE_DATE,
7509                                                                                         NULL,tmp.PROJECT_COST_RATE_DATE,
7510                                                                                         FND_API.G_MISS_DATE, NULL,
7511                                                                                         cache.PROJECT_COST_RATE_DATE),
7512                                                         tmp.PROJECT_COST_RATE_DATE),
7513                                          NULL) PROJECT_COST_RATE_DATE
7514             ,DECODE(cache.txn_curr_code_override,
7515                                          NULL,decode(cache.txn_currency_code,
7516                                                         tmp.txn_currency_code,decode(cache.PROJECT_REV_RATE_TYPE,
7517                                                                                         NULL,tmp.PROJECT_REV_RATE_TYPE,
7518                                                                                         FND_API.G_MISS_CHAR, NULL,
7519                                                                                         cache.PROJECT_REV_RATE_TYPE),
7520                                                         tmp.PROJECT_REV_RATE_TYPE),
7521                                          NULL) PROJECT_REV_RATE_TYPE
7522             ,DECODE(cache.txn_curr_code_override,
7523                                          NULL,decode(cache.txn_currency_code,
7524                                                         tmp.txn_currency_code,decode(cache.PROJECT_REV_EXCHANGE_RATE,
7525                                                                                         NULL,tmp.PROJECT_REV_EXCHANGE_RATE,
7526                                                                                         FND_API.G_MISS_NUM, NULL,
7527                                                                                         cache.PROJECT_REV_EXCHANGE_RATE),
7528                                                         tmp.PROJECT_REV_EXCHANGE_RATE),
7529                                          NULL) PROJECT_REV_EXCHANGE_RATE
7530             ,DECODE(cache.txn_curr_code_override,
7531                                          NULL,decode(cache.txn_currency_code,
7532                                                         tmp.txn_currency_code,decode(cache.PROJECT_REV_RATE_DATE_TYPE,
7533                                                                                         NULL,tmp.PROJECT_REV_RATE_DATE_TYPE,
7534                                                                                         FND_API.G_MISS_CHAR, NULL,
7535                                                                                         cache.PROJECT_REV_RATE_DATE_TYPE),
7536                                                         tmp.PROJECT_REV_RATE_DATE_TYPE),
7537                                          NULL) PROJECT_REV_RATE_DATE_TYPE
7538             ,DECODE(cache.txn_curr_code_override,
7539                                          NULL,decode(cache.txn_currency_code,
7540                                                         tmp.txn_currency_code,decode(cache.PROJECT_REV_RATE_DATE,
7541                                                                                         NULL,tmp.PROJECT_REV_RATE_DATE,
7542                                                                                         FND_API.G_MISS_DATE, NULL,
7543                                                                                         cache.PROJECT_REV_RATE_DATE),
7544                                                         tmp.PROJECT_REV_RATE_DATE),
7545                                          NULL) PROJECT_REV_RATE_DATE
7546             ,DECODE(cache.txn_curr_code_override,
7547                                          NULL,decode(cache.txn_currency_code,
7548                                                         tmp.txn_currency_code,decode(cache.PROJFUNC_COST_RATE_TYPE,
7549                                                                                         NULL,tmp.PROJFUNC_COST_RATE_TYPE,
7550                                                                                         FND_API.G_MISS_CHAR, NULL,
7551                                                                                         cache.PROJFUNC_COST_RATE_TYPE),
7552                                                         tmp.PROJFUNC_COST_RATE_TYPE),
7553                                          NULL) PROJFUNC_COST_RATE_TYPE
7554             ,DECODE(cache.txn_curr_code_override,
7555                                          NULL,decode(cache.txn_currency_code,
7556                                                         tmp.txn_currency_code,decode(cache.PROJFUNC_COST_EXCHANGE_RATE,
7557                                                                                         NULL,tmp.PROJFUNC_COST_EXCHANGE_RATE,
7558                                                                                         FND_API.G_MISS_NUM, NULL,
7559                                                                                         cache.PROJFUNC_COST_EXCHANGE_RATE),
7560                                                         tmp.PROJFUNC_COST_EXCHANGE_RATE),
7561                                          NULL) PROJFUNC_COST_EXCHANGE_RATE
7562             ,DECODE(cache.txn_curr_code_override,
7563                                          NULL,decode(cache.txn_currency_code,
7564                                                         tmp.txn_currency_code,decode(cache.PROJFUNC_COST_RATE_DATE_TYPE,
7565                                                                                         NULL,tmp.PROJFUNC_COST_RATE_DATE_TYPE,
7566                                                                                         FND_API.G_MISS_CHAR, NULL,
7567                                                                                         cache.PROJFUNC_COST_RATE_DATE_TYPE),
7568                                                         tmp.PROJFUNC_COST_RATE_DATE_TYPE),
7569                                          NULL) PROJFUNC_COST_RATE_DATE_TYPE
7570             ,DECODE(cache.txn_curr_code_override,
7571                                          NULL,decode(cache.txn_currency_code,
7572                                                         tmp.txn_currency_code,decode(cache.PROJFUNC_COST_RATE_DATE,
7573                                                                                         NULL,tmp.PROJFUNC_COST_RATE_DATE,
7574                                                                                         FND_API.G_MISS_DATE, NULL,
7575                                                                                         cache.PROJFUNC_COST_RATE_DATE),
7576                                                         tmp.PROJFUNC_COST_RATE_DATE),
7577                                          NULL) PROJFUNC_COST_RATE_DATE
7578             ,DECODE(cache.txn_curr_code_override,
7579                                          NULL,decode(cache.txn_currency_code,
7580                                                         tmp.txn_currency_code,decode(cache.PROJFUNC_REV_RATE_TYPE,
7581                                                                                         NULL,tmp.PROJFUNC_REV_RATE_TYPE,
7582                                                                                         FND_API.G_MISS_CHAR, NULL,
7583                                                                                         cache.PROJFUNC_REV_RATE_TYPE),
7584                                                         tmp.PROJFUNC_REV_RATE_TYPE),
7585                                          NULL) PROJFUNC_REV_RATE_TYPE
7586             ,DECODE(cache.txn_curr_code_override,
7587                                          NULL,decode(cache.txn_currency_code,
7588                                                         tmp.txn_currency_code,decode(cache.PROJFUNC_REV_EXCHANGE_RATE,
7589                                                                                         NULL,tmp.PROJFUNC_REV_EXCHANGE_RATE,
7590                                                                                         FND_API.G_MISS_NUM, NULL,
7591                                                                                         cache.PROJFUNC_REV_EXCHANGE_RATE),
7592                                                         tmp.PROJFUNC_REV_EXCHANGE_RATE),
7593                                          NULL) PROJFUNC_REV_EXCHANGE_RATE
7594             ,DECODE(cache.txn_curr_code_override,
7595                                          NULL,decode(cache.txn_currency_code,
7596                                                         tmp.txn_currency_code,decode(cache.PROJFUNC_REV_RATE_DATE_TYPE,
7597                                                                                         NULL,tmp.PROJFUNC_REV_RATE_DATE_TYPE,
7598                                                                                         FND_API.G_MISS_CHAR, NULL,
7599                                                                                         cache.PROJFUNC_REV_RATE_DATE_TYPE),
7600                                                         tmp.PROJFUNC_REV_RATE_DATE_TYPE),
7601                                          NULL) PROJFUNC_REV_RATE_DATE_TYPE
7602             ,DECODE(cache.txn_curr_code_override,
7603                                          NULL,decode(cache.txn_currency_code,
7604                                                         tmp.txn_currency_code,decode(cache.PROJFUNC_REV_RATE_DATE,
7605                                                                                         NULL,tmp.PROJFUNC_REV_RATE_DATE,
7606                                                                                         FND_API.G_MISS_DATE, NULL,
7607                                                                                         cache.PROJFUNC_REV_RATE_DATE),
7608                                                         tmp.PROJFUNC_REV_RATE_DATE),
7609                                          NULL) PROJFUNC_REV_RATE_DATE
7610         FROM  pa_fp_rollup_tmp tmp
7611               ,pa_fp_spread_calc_tmp1 cache
7612         WHERE  tmp.budget_version_id = p_budget_verson_id
7613         AND    tmp.budget_version_id = cache.budget_version_id
7614         AND    tmp.resource_assignment_id = cache.resource_assignment_id
7615         AND    tmp.txn_currency_code = cache.txn_currency_code
7616         AND    tmp.start_date = cache.start_date
7617         ;
7618 
7619     /* This cursor picks budget line attributes which needs to be retained after spread
7620          * though the currency code changes */
7621         CURSOR blAttribDetails IS
7622         SELECT tmp.rowid
7623               /*Bug 4224464. Changed the decode below for dff's, change reason code,PM_PRODUCT_CODE,PM_BUDGET_LINE_REFERENCE
7624                 and description columns to handle the the G_MISS_XXX values for these columns*/
7625          , decode(cache.CHANGE_REASON_CODE   ,null, bl.change_reason_code, FND_API.G_MISS_CHAR, null, cache.CHANGE_REASON_CODE)
7626          , decode(cache.DESCRIPTION          ,null, bl.DESCRIPTION, FND_API.G_MISS_CHAR, null, cache.DESCRIPTION)
7627          , decode(cache.ATTRIBUTE_CATEGORY   ,null, bl.ATTRIBUTE_CATEGORY, FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE_CATEGORY)
7628          , decode(cache.ATTRIBUTE1           ,null, bl.ATTRIBUTE1,  FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE1)
7629          , decode(cache.ATTRIBUTE2           ,null, bl.ATTRIBUTE2,  FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE2)
7630          , decode(cache.ATTRIBUTE3           ,null, bl.ATTRIBUTE3,  FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE3)
7631          , decode(cache.ATTRIBUTE4           ,null, bl.ATTRIBUTE4,  FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE4)
7632          , decode(cache.ATTRIBUTE5           ,null, bl.ATTRIBUTE5,  FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE5)
7633          , decode(cache.ATTRIBUTE6           ,null, bl.ATTRIBUTE6,  FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE6)
7634          , decode(cache.ATTRIBUTE7           ,null, bl.ATTRIBUTE7,  FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE7)
7635          , decode(cache.ATTRIBUTE8           ,null, bl.ATTRIBUTE8,  FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE8)
7636          , decode(cache.ATTRIBUTE9           ,null, bl.ATTRIBUTE9,  FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE9)
7637          , decode(cache.ATTRIBUTE10          ,null, bl.ATTRIBUTE10, FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE10)
7638          , decode(cache.ATTRIBUTE11          ,null, bl.ATTRIBUTE11, FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE11)
7639          , decode(cache.ATTRIBUTE12          ,null, bl.ATTRIBUTE12, FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE12)
7640          , decode(cache.ATTRIBUTE13          ,null, bl.ATTRIBUTE13, FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE13)
7641          , decode(cache.ATTRIBUTE14          ,null, bl.ATTRIBUTE14, FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE14)
7642          , decode(cache.ATTRIBUTE15          ,null, bl.ATTRIBUTE15, FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE15)
7643          , cache.RAW_COST_SOURCE
7644          , cache.BURDENED_COST_SOURCE
7645          , cache.QUANTITY_SOURCE
7646          , cache.REVENUE_SOURCE
7647          , decode(cache.PM_PRODUCT_CODE  ,null,bl.PM_PRODUCT_CODE, FND_API.G_MISS_CHAR, null, cache.PM_PRODUCT_CODE)
7648          , decode(cache.PM_BUDGET_LINE_REFERENCE ,null,bl.PM_BUDGET_LINE_REFERENCE, FND_API.G_MISS_CHAR, null, cache.PM_BUDGET_LINE_REFERENCE)
7649          , cache.CODE_COMBINATION_ID
7650          , cache.CCID_GEN_STATUS_CODE
7651          , cache.CCID_GEN_REJ_MESSAGE
7652          , cache.BORROWED_REVENUE
7653          , cache.TP_REVENUE_IN
7654          , cache.TP_REVENUE_OUT
7655          , cache.REVENUE_ADJ
7656          , cache.LENT_RESOURCE_COST
7657          , cache.TP_COST_IN
7658          , cache.TP_COST_OUT
7659          , cache.COST_ADJ
7660          , cache.UNASSIGNED_TIME_COST
7661          , cache.UTILIZATION_PERCENT
7662          , cache.UTILIZATION_HOURS
7663          , cache.UTILIZATION_ADJ
7664          , cache.CAPACITY
7665          , cache.HEAD_COUNT
7666          , cache.HEAD_COUNT_ADJ
7667          , cache.BUCKETING_PERIOD_CODE
7668          , cache.TXN_DISCOUNT_PERCENTAGE
7669          , cache.TRANSFER_PRICE_RATE
7670          , cache.BL_CREATED_BY
7671          , cache.BL_CREATION_DATE
7672         FROM  pa_fp_rollup_tmp tmp
7673               ,pa_fp_spread_calc_tmp1 cache
7674               ,pa_budget_lines bl
7675         WHERE  tmp.budget_version_id = p_budget_verson_id
7676     AND    tmp.budget_version_id = cache.budget_version_id
7677         AND    tmp.resource_assignment_id = cache.resource_assignment_id
7678     AND    tmp.txn_currency_code = cache.txn_currency_code
7679     AND    tmp.start_date = cache.start_date
7680     and    cache.budget_version_id = bl.budget_version_id(+)    --Bug 4224464. Added the join with pa_budget_lines
7681         AND    cache.resource_assignment_id = bl.resource_assignment_id(+)
7682     AND    cache.txn_currency_code = bl.txn_currency_code(+)
7683     AND    cache.start_date = bl.start_date(+);
7684 
7685 
7686     l_rowid_tab                     pa_plsql_datatypes.RowidTabTyp;
7687         l_resource_assignment_id_tab    pa_plsql_datatypes.IdTabTyp;
7688         l_txn_currency_code_tab         pa_plsql_datatypes.Char50TabTyp;
7689         l_start_date_tab                pa_plsql_datatypes.DateTabTyp;
7690         l_end_date_tab                  pa_plsql_datatypes.DateTabTyp;
7691         l_period_name_tab               pa_plsql_datatypes.Char50TabTyp;
7692         l_cost_rate_override_tab        pa_plsql_datatypes.NumTabTyp;
7693         l_burden_rate_override_tab      pa_plsql_datatypes.NumTabTyp;
7694         l_bill_rate_override_tab        pa_plsql_datatypes.NumTabTyp;
7695         l_PROJECT_COST_RATE_TYPE_tab    pa_plsql_datatypes.Char50TabTyp;
7696         l_PROJECT_COST_EXG_RATE_tab     pa_plsql_datatypes.NumTabTyp;
7697         l_PROJECT_COST_DATE_TYPE_tab    pa_plsql_datatypes.Char50TabTyp;
7698         l_PROJECT_COST_RATE_DATE_tab    pa_plsql_datatypes.DateTabTyp;
7699         l_PROJECT_REV_RATE_TYPE_tab     pa_plsql_datatypes.Char50TabTyp;
7700         l_PROJECT_REV_EXG_RATE_tab      pa_plsql_datatypes.NumTabTyp;
7701         l_PROJECT_REV_DATE_TYPE_tab     pa_plsql_datatypes.Char50TabTyp;
7702         l_PROJECT_REV_RATE_DATE_tab     pa_plsql_datatypes.DateTabTyp;
7703         l_PROJFUNC_COST_RATE_TYPE_tab   pa_plsql_datatypes.Char50TabTyp;
7704         l_PROJFUNC_COST_EXG_RATE_tab    pa_plsql_datatypes.NumTabTyp;
7705         l_PROJFUNC_COST_DATE_TYPE_tab   pa_plsql_datatypes.Char50TabTyp;
7706         l_PROJFUNC_COST_RATE_DATE_tab   pa_plsql_datatypes.DateTabTyp;
7707         l_PROJFUNC_REV_RATE_TYPE_tab    pa_plsql_datatypes.Char50TabTyp;
7708         l_PROJFUNC_REV_EXG_RATE_tab     pa_plsql_datatypes.NumTabTyp;
7709         l_PROJFUNC_REV_DATE_TYPE_tab    pa_plsql_datatypes.Char50TabTyp;
7710         l_PROJFUNC_REV_RATE_DATE_tab    pa_plsql_datatypes.DateTabTyp;
7711     l_CHANGE_REASON_CODE_tab        pa_plsql_datatypes.Char30TabTyp;
7712     l_DESCRIPTION_tab               pa_plsql_datatypes.Char250TabTyp;
7713     l_ATTRIBUTE_CATEGORY_tab        pa_plsql_datatypes.Char30TabTyp;
7714     l_ATTRIBUTE1_tab                pa_plsql_datatypes.Char150TabTyp;
7715     l_ATTRIBUTE2_tab                pa_plsql_datatypes.Char150TabTyp;
7716     l_ATTRIBUTE3_tab                pa_plsql_datatypes.Char150TabTyp;
7717     l_ATTRIBUTE4_tab                pa_plsql_datatypes.Char150TabTyp;
7718     l_ATTRIBUTE5_tab                pa_plsql_datatypes.Char150TabTyp;
7719     l_ATTRIBUTE6_tab                pa_plsql_datatypes.Char150TabTyp;
7720     l_ATTRIBUTE7_tab                pa_plsql_datatypes.Char150TabTyp;
7721     l_ATTRIBUTE8_tab                pa_plsql_datatypes.Char150TabTyp;
7722     l_ATTRIBUTE9_tab                pa_plsql_datatypes.Char150TabTyp;
7723     l_ATTRIBUTE10_tab               pa_plsql_datatypes.Char150TabTyp;
7724     l_ATTRIBUTE11_tab               pa_plsql_datatypes.Char150TabTyp;
7725     l_ATTRIBUTE12_tab               pa_plsql_datatypes.Char150TabTyp;
7726     l_ATTRIBUTE13_tab               pa_plsql_datatypes.Char150TabTyp;
7727     l_ATTRIBUTE14_tab               pa_plsql_datatypes.Char150TabTyp;
7728     l_ATTRIBUTE15_tab               pa_plsql_datatypes.Char150TabTyp;
7729     l_RAW_COST_SOURCE_tab           pa_plsql_datatypes.Char5TabTyp;
7730     l_BURDENED_COST_SOURCE_tab      pa_plsql_datatypes.Char5TabTyp;
7731     l_QUANTITY_SOURCE_tab           pa_plsql_datatypes.Char5TabTyp;
7732     l_REVENUE_SOURCE_tab            pa_plsql_datatypes.Char5TabTyp;
7733     l_PM_PRODUCT_CODE_tab           pa_plsql_datatypes.Char30TabTyp;
7734     l_PM_BUDGET_LINE_REFERENCE_tab  pa_plsql_datatypes.Char30TabTyp;
7735     l_CODE_COMBINATION_ID_tab       pa_plsql_datatypes.NumTabTyp;
7736     l_CCID_GEN_STATUS_CODE_tab      pa_plsql_datatypes.Char1TabTyp;
7737     l_CCID_GEN_REJ_MESSAGE_tab      pa_plsql_datatypes.Char2000TabTyp;
7738     l_BORROWED_REVENUE_tab          pa_plsql_datatypes.NumTabTyp;
7739     l_TP_REVENUE_IN_tab             pa_plsql_datatypes.NumTabTyp;
7740     l_TP_REVENUE_OUT_tab            pa_plsql_datatypes.NumTabTyp;
7741     l_REVENUE_ADJ_tab               pa_plsql_datatypes.NumTabTyp;
7742     l_LENT_RESOURCE_COST_tab        pa_plsql_datatypes.NumTabTyp;
7743     l_TP_COST_IN_tab                pa_plsql_datatypes.NumTabTyp;
7744     l_TP_COST_OUT_tab               pa_plsql_datatypes.NumTabTyp;
7745     l_COST_ADJ_tab                  pa_plsql_datatypes.NumTabTyp;
7746     l_UNASSIGNED_TIME_COST_tab      pa_plsql_datatypes.NumTabTyp;
7747     l_UTILIZATION_PERCENT_tab       pa_plsql_datatypes.NumTabTyp;
7748     l_UTILIZATION_HOURS_tab         pa_plsql_datatypes.NumTabTyp;
7749     l_UTILIZATION_ADJ_tab           pa_plsql_datatypes.NumTabTyp;
7750     l_CAPACITY_tab                  pa_plsql_datatypes.NumTabTyp;
7751     l_HEAD_COUNT_tab                pa_plsql_datatypes.NumTabTyp;
7752     l_HEAD_COUNT_ADJ_tab            pa_plsql_datatypes.NumTabTyp;
7753     l_BUCKETING_PERIOD_CODE_tab     pa_plsql_datatypes.Char30TabTyp;
7754     l_TXN_DISCOUNT_PERCENTAGE_tab   pa_plsql_datatypes.NumTabTyp;
7755     l_TRANSFER_PRICE_RATE_tab       pa_plsql_datatypes.NumTabTyp;
7756     l_BL_CREATED_BY_tab     pa_plsql_datatypes.NumTabTyp;
7757     l_BL_CREATION_DATE_tab          pa_plsql_datatypes.DateTabTyp;
7758 
7759     PROCEDURE INIT_PLSQL_TABS IS
7760 
7761     BEGIN
7762                 l_rowid_tab.delete;
7763                 l_resource_assignment_id_tab.delete;
7764                 l_txn_currency_code_tab.delete;
7765                 l_start_date_tab.delete;
7766                 l_end_date_tab.delete;
7767                 l_period_name_tab.delete;
7768                 l_cost_rate_override_tab.delete;
7769                 l_burden_rate_override_tab.delete;
7770                 l_bill_rate_override_tab.delete;
7771                 l_PROJECT_COST_RATE_TYPE_tab.delete;
7772                 l_PROJECT_COST_EXG_RATE_tab.delete;
7773                 l_PROJECT_COST_DATE_TYPE_tab.delete;
7774                 l_PROJECT_COST_RATE_DATE_tab.delete;
7775                 l_PROJECT_REV_RATE_TYPE_tab.delete;
7776                 l_PROJECT_REV_EXG_RATE_tab.delete;
7777                 l_PROJECT_REV_DATE_TYPE_tab.delete;
7778                 l_PROJECT_REV_RATE_DATE_tab.delete;
7779                 l_PROJFUNC_COST_RATE_TYPE_tab.delete;
7780                 l_PROJFUNC_COST_EXG_RATE_tab.delete;
7781                 l_PROJFUNC_COST_DATE_TYPE_tab.delete;
7782                 l_PROJFUNC_COST_RATE_DATE_tab.delete;
7783                 l_PROJFUNC_REV_RATE_TYPE_tab.delete;
7784                 l_PROJFUNC_REV_EXG_RATE_tab.delete;
7785                 l_PROJFUNC_REV_DATE_TYPE_tab.delete;
7786                 l_PROJFUNC_REV_RATE_DATE_tab.delete;
7787         l_CHANGE_REASON_CODE_tab.delete;
7788         l_DESCRIPTION_tab.delete;
7789         l_ATTRIBUTE_CATEGORY_tab.delete;
7790         l_ATTRIBUTE1_tab.delete;
7791         l_ATTRIBUTE2_tab.delete;
7792         l_ATTRIBUTE3_tab.delete;
7793         l_ATTRIBUTE4_tab.delete;
7794         l_ATTRIBUTE5_tab.delete;
7795         l_ATTRIBUTE6_tab.delete;
7796         l_ATTRIBUTE7_tab.delete;
7797         l_ATTRIBUTE8_tab.delete;
7798         l_ATTRIBUTE9_tab.delete;
7799         l_ATTRIBUTE10_tab.delete;
7800         l_ATTRIBUTE11_tab.delete;
7801         l_ATTRIBUTE12_tab.delete;
7802         l_ATTRIBUTE13_tab.delete;
7803         l_ATTRIBUTE14_tab.delete;
7804         l_ATTRIBUTE15_tab.delete;
7805         l_RAW_COST_SOURCE_tab.delete;
7806         l_BURDENED_COST_SOURCE_tab.delete;
7807         l_QUANTITY_SOURCE_tab.delete;
7808         l_REVENUE_SOURCE_tab.delete;
7809         l_PM_PRODUCT_CODE_tab.delete;
7810         l_PM_BUDGET_LINE_REFERENCE_tab.delete;
7811         l_CODE_COMBINATION_ID_tab.delete;
7812         l_CCID_GEN_STATUS_CODE_tab.delete;
7813         l_CCID_GEN_REJ_MESSAGE_tab.delete;
7814         l_BORROWED_REVENUE_tab.delete;
7815         l_TP_REVENUE_IN_tab.delete;
7816         l_TP_REVENUE_OUT_tab.delete;
7817         l_REVENUE_ADJ_tab.delete;
7818         l_LENT_RESOURCE_COST_tab.delete;
7819         l_TP_COST_IN_tab.delete;
7820         l_TP_COST_OUT_tab.delete;
7821         l_COST_ADJ_tab.delete;
7822         l_UNASSIGNED_TIME_COST_tab.delete;
7823         l_UTILIZATION_PERCENT_tab.delete;
7824         l_UTILIZATION_HOURS_tab.delete;
7825         l_UTILIZATION_ADJ_tab.delete;
7826         l_CAPACITY_tab.delete;
7827         l_HEAD_COUNT_tab.delete;
7828         l_HEAD_COUNT_ADJ_tab.delete;
7829         l_BUCKETING_PERIOD_CODE_tab.delete;
7830         l_TXN_DISCOUNT_PERCENTAGE_tab.delete;
7831         l_TRANSFER_PRICE_RATE_tab.delete;
7832         l_BL_CREATED_BY_tab.delete;
7833         l_BL_CREATION_DATE_tab.delete;
7834 
7835     END INIT_PLSQL_TABS;
7836 BEGIN
7837         /* Initialize the out variables */
7838         x_return_status := 'S';
7839         x_msg_data := NULL;
7840     If p_pa_debug_mode = 'Y' Then
7841         pa_debug.init_err_stack('PA_FP_CALC_UTILS.copy_BlAttributes');
7842     End If;
7843     IF p_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION') Then  --{
7844 	IF P_PA_DEBUG_MODE = 'Y' Then
7845         print_msg('Entered copy_BlAttributes API');
7846 	End If;
7847         INIT_PLSQL_TABS;
7848                 OPEN fptmpDetails;
7849                 FETCH fptmpDetails BULK COLLECT INTO
7850                         l_rowid_tab
7851                         ,l_resource_assignment_id_tab
7852                         ,l_txn_currency_code_tab
7853                         ,l_start_date_tab
7854                         ,l_end_date_tab
7855                         ,l_period_name_tab
7856                         ,l_cost_rate_override_tab
7857                         ,l_burden_rate_override_tab
7858                         ,l_bill_rate_override_tab
7859                         ,l_PROJECT_COST_RATE_TYPE_tab
7860                         ,l_PROJECT_COST_EXG_RATE_tab
7861                         ,l_PROJECT_COST_DATE_TYPE_tab
7862                         ,l_PROJECT_COST_RATE_DATE_tab
7863                         ,l_PROJECT_REV_RATE_TYPE_tab
7864                         ,l_PROJECT_REV_EXG_RATE_tab
7865                         ,l_PROJECT_REV_DATE_TYPE_tab
7866                         ,l_PROJECT_REV_RATE_DATE_tab
7867                         ,l_PROJFUNC_COST_RATE_TYPE_tab
7868                         ,l_PROJFUNC_COST_EXG_RATE_tab
7869                         ,l_PROJFUNC_COST_DATE_TYPE_tab
7870                         ,l_PROJFUNC_COST_RATE_DATE_tab
7871                         ,l_PROJFUNC_REV_RATE_TYPE_tab
7872                         ,l_PROJFUNC_REV_EXG_RATE_tab
7873                         ,l_PROJFUNC_REV_DATE_TYPE_tab
7874                         ,l_PROJFUNC_REV_RATE_DATE_tab;
7875                 CLOSE fptmpDetails;
7876                 IF l_rowid_tab.COUNT > 0 THEN
7877                         --print_msg('Number of rows fetched['||l_rowid_tab.COUNT||']');
7878                         FORALL i IN  l_rowid_tab.FIRST .. l_rowid_tab.LAST
7879                         UPDATE pa_fp_rollup_tmp tmp
7880                         SET tmp.rw_cost_rate_override = l_cost_rate_override_tab(i)
7881                            ,tmp.burden_cost_rate_override = l_burden_rate_override_tab(i)
7882                            ,tmp.bill_rate_override = l_bill_rate_override_tab(i)
7883                            ,tmp.PROJECT_COST_RATE_TYPE = l_PROJECT_COST_RATE_TYPE_tab(i)
7884                            ,tmp.PROJECT_COST_EXCHANGE_RATE = l_PROJECT_COST_EXG_RATE_tab(i)
7885                            ,tmp.PROJECT_COST_RATE_DATE_TYPE = l_PROJECT_COST_DATE_TYPE_tab(i)
7886                            ,tmp.PROJECT_COST_RATE_DATE   = l_PROJECT_COST_RATE_DATE_tab(i)
7887                            ,tmp.PROJECT_REV_RATE_TYPE    = l_PROJECT_REV_RATE_TYPE_tab(i)
7888                            ,tmp.PROJECT_REV_EXCHANGE_RATE  = l_PROJECT_REV_EXG_RATE_tab(i)
7889                            ,tmp.PROJECT_REV_RATE_DATE_TYPE = l_PROJECT_REV_DATE_TYPE_tab(i)
7890                            ,tmp.PROJECT_REV_RATE_DATE   = l_PROJECT_REV_RATE_DATE_tab(i)
7891                            ,tmp.PROJFUNC_COST_RATE_TYPE   = l_PROJFUNC_COST_RATE_TYPE_tab(i)
7892                            ,tmp.PROJFUNC_COST_EXCHANGE_RATE  = l_PROJFUNC_COST_EXG_RATE_tab(i)
7893                            ,tmp.PROJFUNC_COST_RATE_DATE_TYPE  = l_PROJFUNC_COST_DATE_TYPE_tab(i)
7894                            ,tmp.PROJFUNC_COST_RATE_DATE     = l_PROJFUNC_COST_RATE_DATE_tab(i)
7895                            ,tmp.PROJFUNC_REV_RATE_TYPE    = l_PROJFUNC_REV_RATE_TYPE_tab(i)
7896                            ,tmp.PROJFUNC_REV_EXCHANGE_RATE  = l_PROJFUNC_REV_EXG_RATE_tab(i)
7897                            ,tmp.PROJFUNC_REV_RATE_DATE_TYPE   = l_PROJFUNC_REV_DATE_TYPE_tab(i)
7898                            ,tmp.PROJFUNC_REV_RATE_DATE = l_PROJFUNC_REV_RATE_DATE_tab(i)
7899             WHERE tmp.rowid = l_rowid_tab(i);
7900                         --print_msg('Number of rows updated['||sql%rowcount||']');
7901                 END IF;
7902 
7903         --print_msg('Fetching budget Line Attributes such as DFFs details from cache ');
7904         INIT_PLSQL_TABS;
7905                 OPEN blAttribDetails;
7906                 FETCH blAttribDetails BULK COLLECT INTO
7907                         l_rowid_tab
7908             ,l_CHANGE_REASON_CODE_tab
7909             ,l_DESCRIPTION_tab
7910             ,l_ATTRIBUTE_CATEGORY_tab
7911             ,l_ATTRIBUTE1_tab
7912             ,l_ATTRIBUTE2_tab
7913             ,l_ATTRIBUTE3_tab
7914             ,l_ATTRIBUTE4_tab
7915             ,l_ATTRIBUTE5_tab
7916             ,l_ATTRIBUTE6_tab
7917             ,l_ATTRIBUTE7_tab
7918             ,l_ATTRIBUTE8_tab
7919             ,l_ATTRIBUTE9_tab
7920             ,l_ATTRIBUTE10_tab
7921             ,l_ATTRIBUTE11_tab
7922             ,l_ATTRIBUTE12_tab
7923             ,l_ATTRIBUTE13_tab
7924             ,l_ATTRIBUTE14_tab
7925             ,l_ATTRIBUTE15_tab
7926             ,l_RAW_COST_SOURCE_tab
7927             ,l_BURDENED_COST_SOURCE_tab
7928             ,l_QUANTITY_SOURCE_tab
7929             ,l_REVENUE_SOURCE_tab
7930             ,l_PM_PRODUCT_CODE_tab
7931             ,l_PM_BUDGET_LINE_REFERENCE_tab
7932             ,l_CODE_COMBINATION_ID_tab
7933             ,l_CCID_GEN_STATUS_CODE_tab
7934             ,l_CCID_GEN_REJ_MESSAGE_tab
7935             ,l_BORROWED_REVENUE_tab
7936             ,l_TP_REVENUE_IN_tab
7937             ,l_TP_REVENUE_OUT_tab
7938             ,l_REVENUE_ADJ_tab
7939             ,l_LENT_RESOURCE_COST_tab
7940             ,l_TP_COST_IN_tab
7941             ,l_TP_COST_OUT_tab
7942             ,l_COST_ADJ_tab
7943             ,l_UNASSIGNED_TIME_COST_tab
7944             ,l_UTILIZATION_PERCENT_tab
7945             ,l_UTILIZATION_HOURS_tab
7946             ,l_UTILIZATION_ADJ_tab
7947             ,l_CAPACITY_tab
7948             ,l_HEAD_COUNT_tab
7949             ,l_HEAD_COUNT_ADJ_tab
7950             ,l_BUCKETING_PERIOD_CODE_tab
7951             ,l_TXN_DISCOUNT_PERCENTAGE_tab
7952             ,l_TRANSFER_PRICE_RATE_tab
7953             ,l_BL_CREATED_BY_tab
7954                     ,l_BL_CREATION_DATE_tab;
7955                 CLOSE blAttribDetails;
7956                 IF l_rowid_tab.COUNT > 0 THEN
7957                         --print_msg('Number of blAttrib rows fetched['||l_rowid_tab.COUNT||']');
7958                         FORALL i IN  l_rowid_tab.FIRST .. l_rowid_tab.LAST
7959                         UPDATE pa_fp_rollup_tmp tmp
7960                         SET tmp.CHANGE_REASON_CODE = l_CHANGE_REASON_CODE_tab(i)
7961                ,tmp.DESCRIPTION = l_DESCRIPTION_tab(i)
7962                ,tmp.ATTRIBUTE_CATEGORY = l_ATTRIBUTE_CATEGORY_tab(i)
7963                ,tmp.ATTRIBUTE1 = l_ATTRIBUTE1_tab(i)
7964                ,tmp.ATTRIBUTE2 = l_ATTRIBUTE2_tab(i)
7965                ,tmp.ATTRIBUTE3 = l_ATTRIBUTE3_tab(i)
7966                ,tmp.ATTRIBUTE4 = l_ATTRIBUTE4_tab(i)
7967                ,tmp.ATTRIBUTE5 = l_ATTRIBUTE5_tab(i)
7968                ,tmp.ATTRIBUTE6 = l_ATTRIBUTE6_tab(i)
7969                ,tmp.ATTRIBUTE7 = l_ATTRIBUTE7_tab(i)
7970                ,tmp.ATTRIBUTE8 = l_ATTRIBUTE8_tab(i)
7971                ,tmp.ATTRIBUTE9 = l_ATTRIBUTE9_tab(i)
7972                ,tmp.ATTRIBUTE10 = l_ATTRIBUTE10_tab(i)
7973                ,tmp.ATTRIBUTE11 = l_ATTRIBUTE11_tab(i)
7974                ,tmp.ATTRIBUTE12 = l_ATTRIBUTE12_tab(i)
7975                ,tmp.ATTRIBUTE13 = l_ATTRIBUTE13_tab(i)
7976                ,tmp.ATTRIBUTE14 = l_ATTRIBUTE14_tab(i)
7977                ,tmp.ATTRIBUTE15 = l_ATTRIBUTE15_tab(i)
7978                ,tmp.RAW_COST_SOURCE = nvl(l_RAW_COST_SOURCE_tab(i),tmp.RAW_COST_SOURCE)
7979                ,tmp.BURDENED_COST_SOURCE = nvl(l_BURDENED_COST_SOURCE_tab(i),tmp.BURDENED_COST_SOURCE)
7980                ,tmp.QUANTITY_SOURCE = nvl(l_QUANTITY_SOURCE_tab(i),tmp.QUANTITY_SOURCE)
7981                ,tmp.REVENUE_SOURCE = nvl(l_REVENUE_SOURCE_tab(i),tmp.REVENUE_SOURCE)
7982                ,tmp.PM_PRODUCT_CODE = l_PM_PRODUCT_CODE_tab(i)
7983                ,tmp.PM_BUDGET_LINE_REFERENCE = l_PM_BUDGET_LINE_REFERENCE_tab(i)
7984                ,tmp.CODE_COMBINATION_ID = nvl(l_CODE_COMBINATION_ID_tab(i),tmp.CODE_COMBINATION_ID)
7985                ,tmp.CCID_GEN_STATUS_CODE = nvl(l_CCID_GEN_STATUS_CODE_tab(i),tmp.CCID_GEN_STATUS_CODE)
7986                ,tmp.CCID_GEN_REJ_MESSAGE = nvl(l_CCID_GEN_REJ_MESSAGE_tab(i),tmp.CCID_GEN_REJ_MESSAGE)
7987                ,tmp.BORROWED_REVENUE = nvl(l_BORROWED_REVENUE_tab(i),tmp.BORROWED_REVENUE)
7988                ,tmp.TP_REVENUE_IN = nvl(l_TP_REVENUE_IN_tab(i),tmp.TP_REVENUE_IN)
7989                ,tmp.TP_REVENUE_OUT = nvl(l_TP_REVENUE_OUT_tab(i),tmp.TP_REVENUE_OUT)
7990                ,tmp.REVENUE_ADJ  = nvl(l_REVENUE_ADJ_tab(i),tmp.REVENUE_ADJ)
7991                ,tmp.LENT_RESOURCE_COST = nvl(l_LENT_RESOURCE_COST_tab(i),tmp.LENT_RESOURCE_COST)
7992                ,tmp.TP_COST_IN   = nvl(l_TP_COST_IN_tab(i),tmp.TP_COST_IN)
7993                ,tmp.TP_COST_OUT = nvl(l_TP_COST_OUT_tab(i),tmp.TP_COST_OUT)
7994                ,tmp.COST_ADJ = nvl(l_COST_ADJ_tab(i),tmp.COST_ADJ)
7995                ,tmp.UNASSIGNED_TIME_COST = nvl(l_UNASSIGNED_TIME_COST_tab(i),tmp.UNASSIGNED_TIME_COST)
7996                ,tmp.UTILIZATION_PERCENT = nvl(l_UTILIZATION_PERCENT_tab(i),tmp.UTILIZATION_PERCENT)
7997                ,tmp.UTILIZATION_HOURS = nvl(l_UTILIZATION_HOURS_tab(i),tmp.UTILIZATION_HOURS)
7998                ,tmp.UTILIZATION_ADJ = nvl(l_UTILIZATION_ADJ_tab(i),tmp.UTILIZATION_ADJ)
7999                ,tmp.CAPACITY = nvl(l_CAPACITY_tab(i),tmp.CAPACITY)
8000                ,tmp.HEAD_COUNT = nvl(l_HEAD_COUNT_tab(i),tmp.HEAD_COUNT)
8001                ,tmp.HEAD_COUNT_ADJ =nvl(l_HEAD_COUNT_ADJ_tab(i),tmp.HEAD_COUNT_ADJ)
8002                ,tmp.BUCKETING_PERIOD_CODE = nvl(l_BUCKETING_PERIOD_CODE_tab(i),tmp.BUCKETING_PERIOD_CODE)
8003                ,tmp.TXN_DISCOUNT_PERCENTAGE = nvl(l_TXN_DISCOUNT_PERCENTAGE_tab(i),tmp.TXN_DISCOUNT_PERCENTAGE)
8004                ,tmp.TRANSFER_PRICE_RATE = nvl(l_TRANSFER_PRICE_RATE_tab(i),tmp.TRANSFER_PRICE_RATE)
8005                ,tmp.BL_CREATED_BY   = nvl(l_BL_CREATED_BY_tab(i),tmp.BL_CREATED_BY)
8006                ,tmp.BL_CREATION_DATE   = NVL(l_BL_CREATION_DATE_tab(i),tmp.BL_CREATION_DATE)
8007                         WHERE tmp.rowid = l_rowid_tab(i);
8008             --print_msg('Number of rows updated['||sql%rowcount||']');
8009 
8010                 END IF;
8011         /* release the buffer */
8012         INIT_PLSQL_TABS;
8013         END IF;  --}
8014     --print_msg('End of copy_BlAttributes retSts['||x_return_status||']');
8015     If p_pa_debug_mode = 'Y' Then
8016         pa_debug.reset_err_stack;
8017     End If;
8018 EXCEPTION
8019         WHEN OTHERS THEN
8020                 x_return_status := 'U';
8021                 x_msg_data := SQLCODE||SQLERRM;
8022         fnd_msg_pub.add_exc_msg
8023                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
8024                  ,p_procedure_name => 'copy_BlAttributes');
8025         If p_pa_debug_mode = 'Y' Then
8026                     pa_debug.reset_err_stack;
8027         End If;
8028                 RAISE;
8029 
8030 END copy_BlAttributes;
8031 
8032 /*This API is added to check the duplicate records sent in plsql tables for calculate api
8033  *If there are any duplicates (resource assignment and txn currency combination ) then
8034  * delete one of the record and proceed, instead of throwing an error
8035  * Logic used: Instead of looping through the plsql table in amg mode, the number of rows may be 1000
8036  * then loop through the plsql table will not scale the performance.
8037  * so use the tmp table, First dump all the records into tmp table then chk duplicate rows exists, then
8038  * delete the record from the tmp table finally assign the values from tmp to plsql tables.so that
8039  * the plsql index need not be manintained.
8040  */
8041 PROCEDURE Validate_duplicate_records (
8042                 p_budget_version_id              IN  Number
8043                 ,p_source_context                IN  VARCHAR2
8044         ,p_calling_module                IN  VARCHAR2
8045                 ,x_return_status                 OUT NOCOPY VARCHAR2
8046         ) IS
8047 
8048     l_duplicate_record_exists  varchar2(10) := 'N';
8049 
8050         CURSOR cur_chk_dupRecords IS
8051         SELECT tmp.resource_assignment_id
8052                 ,tmp.txn_currency_code
8053             ,tmp.start_date
8054         FROM pa_fp_spread_calc_tmp tmp
8055     WHERE  tmp.budget_version_id = p_budget_version_id
8056         GROUP BY tmp.resource_assignment_id
8057                 ,tmp.txn_currency_code
8058         ,tmp.start_date
8059         HAVING COUNT(*) > 1 ;
8060 
8061 BEGIN
8062     x_return_status := 'S';
8063     print_msg('Inside Validate_duplicate_records Api');
8064     g_stage := 'Validate_duplicate_records:100';
8065 
8066     IF p_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION') Then --{
8067        g_stage := 'Validate_duplicate_records:101';
8068        l_duplicate_record_exists := 'N';
8069        FOR i IN cur_chk_dupRecords LOOP
8070 		/*
8071                 print_msg('Duplicate Resource Assignments sent for Calcaulate API');
8072                 print_msg('ResId['||i.resource_assignment_id||']txnCur['||i.txn_currency_code||']');
8073 		*/
8074         l_duplicate_record_exists := 'Y';
8075         IF NVL(p_source_context,'RESOURCE_ASSIGNMENT') = 'RESOURCE_ASSIGNMENT' Then
8076             g_stage := 'Validate_duplicate_records:102';
8077             DELETE FROM pa_fp_spread_calc_tmp tmp1
8078             WHERE tmp1.resource_assignment_id = i.resource_assignment_id
8079             AND  tmp1.txn_currency_code = i.txn_currency_code
8080             AND tmp1.rowid NOT IN  (select min(rowid) from pa_fp_spread_calc_tmp tmp2
8081                             where tmp1.resource_assignment_id = tmp2.resource_assignment_id
8082                     and   tmp1.txn_currency_code = tmp2.txn_currency_code
8083                     group by tmp2.resource_assignment_id,tmp2.txn_currency_code
8084                     having count(*) > 1
8085                     )
8086             /* added this to make sure that even if code is executed multiple times this should delete the correct combo */
8087             /* this code is not required if not executed twice for the same combo*/
8088                         AND EXISTS  (select 'Y' from pa_fp_spread_calc_tmp tmp2
8089                                      where tmp1.resource_assignment_id = tmp2.resource_assignment_id
8090                                      and   tmp1.txn_currency_code = tmp2.txn_currency_code
8091                                      group by tmp2.resource_assignment_id,tmp2.txn_currency_code
8092                                      having count(*) > 1
8093                                  );
8094         Elsif NVL(p_source_context,'RESOURCE_ASSIGNMENT') = 'BUDGET_LINE' Then
8095             g_stage := 'Validate_duplicate_records:103';
8096                         DELETE FROM pa_fp_spread_calc_tmp tmp1
8097                         WHERE tmp1.resource_assignment_id = i.resource_assignment_id
8098                         AND  tmp1.txn_currency_code = i.txn_currency_code
8099             AND  tmp1.start_date = i.start_date
8100                         AND tmp1.rowid NOT IN  (select min(tmp2.rowid) from pa_fp_spread_calc_tmp tmp2
8101                                 where tmp1.resource_assignment_id = tmp2.resource_assignment_id
8102                                         and   tmp1.txn_currency_code = tmp2.txn_currency_code
8103                     and   tmp1.start_date = tmp2.start_date
8104                                         group by tmp2.resource_assignment_id,tmp2.txn_currency_code,tmp2.start_date
8105                                         having count(*) > 1
8106                                         )
8107                        AND EXISTS  (select 'Y' from pa_fp_spread_calc_tmp tmp2
8108                                     where tmp1.resource_assignment_id = tmp2.resource_assignment_id
8109                                     and   tmp1.txn_currency_code = tmp2.txn_currency_code
8110                                     and   tmp1.start_date = tmp2.start_date
8111                                     group by tmp2.resource_assignment_id,tmp2.txn_currency_code,tmp2.start_date
8112                                     having count(*) > 1
8113                                     );
8114         End If;
8115         --print_msg('Number of duplicate records deleted['||sql%rowcount||']');
8116            END LOOP;
8117     END IF; --}
8118     g_stage := 'End of Validate_duplicate_records:105';
8119     RETURN;
8120 EXCEPTION
8121     WHEN OTHERS THEN
8122         x_return_status := 'U';
8123         RAISE;
8124 
8125 END Validate_duplicate_records;
8126 
8127 /* Bug fix: 4184159 The following API will update the budget lines in bulk. This API uses oracle 9i feature of SQL%BULKEXCEPTION
8128  * during bulk update fails due to dup_val_on_index exception, the process the rejected rows.
8129  * Earlier the api was updating the budget line inside a loop for each row. this was causing the performance bottle neck
8130  * This API must be called at the end of calculate API, It copies the value from rollup tmp to budget lines.
8131  */
8132 PROCEDURE BLK_update_budget_lines
8133     (p_budget_version_id              IN  NUMBER
8134     ,p_calling_module                  IN VARCHAR2 DEFAULT 'UPDATE_PLAN_TRANSACTION'-- Added for Bug#5395732
8135     ,x_return_status                 OUT NOCOPY VARCHAR2
8136         ,x_msg_count                     OUT NOCOPY NUMBER
8137         ,x_msg_data                      OUT NOCOPY VARCHAR2) IS
8138 
8139     l_debug_mode        VARCHAR2(30);
8140     l_stage             NUMBER;
8141     l_populate_mrc_tab_flag   Varchar2(10) := 'N'; --MRC Elimination Changes:NVL(PA_FP_CALC_PLAN_PKG.G_populate_mrc_tab_flag,'N');
8142     l_existing_bl_id                pa_budget_lines.budget_line_id%TYPE;
8143 
8144         l_bl_raId_tab               pa_plsql_datatypes.NumTabTyp;
8145         l_bl_sDate_tab              pa_plsql_datatypes.dateTabTyp;
8146     l_bl_edate_tab              pa_plsql_datatypes.dateTabTyp;
8147     l_bl_period_name_tab            pa_plsql_datatypes.char30TabTyp;
8148         l_bl_budget_line_id_tab         pa_plsql_datatypes.NumTabTyp;
8149         l_bl_txn_curcode_tab            pa_plsql_datatypes.char30TabTyp;
8150         l_bl_quantity_tab               pa_plsql_datatypes.NumTabTyp;
8151         l_bl_pjfc_raw_cost_tab          pa_plsql_datatypes.NumTabTyp;
8152     l_bl_pjfc_burden_cost_tab       pa_plsql_datatypes.NumTabTyp;
8153     l_bl_pjfc_revenue_tab           pa_plsql_datatypes.NumTabTyp;
8154     l_bl_cost_rejection_tab         pa_plsql_datatypes.char30TabTyp;
8155     l_bl_rev_rejection_tab          pa_plsql_datatypes.char30TabTyp;
8156     l_bl_burden_rejection_tab       pa_plsql_datatypes.char30TabTyp;
8157     l_bl_pfc_cur_rejection_tab      pa_plsql_datatypes.char30TabTyp;
8158     l_bl_pc_cur_rejection_tab       pa_plsql_datatypes.char30TabTyp;
8159     l_bl_pfc_curcode_tab            pa_plsql_datatypes.char30TabTyp;
8160         l_bl_pfc_cost_rate_type_tab     pa_plsql_datatypes.char100TabTyp;
8161         l_bl_pfc_cost_exchng_rate_tab       pa_plsql_datatypes.NumTabTyp;
8162         l_bl_pfc_cost_date_type_tab     pa_plsql_datatypes.char100TabTyp;
8163         l_bl_pfc_cost_date_tab          pa_plsql_datatypes.dateTabTyp;
8164         l_bl_pfc_rev_rate_type_tab      pa_plsql_datatypes.char100TabTyp;
8165         l_bl_pfc_rev_exchange_rate_tab      pa_plsql_datatypes.NumTabTyp;
8166         l_bl_pfc_rev_date_type_tab      pa_plsql_datatypes.char100TabTyp;
8167         l_bl_pfc_rev_date_tab           pa_plsql_datatypes.dateTabTyp;
8168         l_bl_pc_cur_code_tab            pa_plsql_datatypes.char30TabTyp;
8169         l_bl_pc_cost_rate_type_tab      pa_plsql_datatypes.char100TabTyp;
8170         l_bl_pc_cost_exchange_rate_tab      pa_plsql_datatypes.NumTabTyp;
8171         l_bl_pc_cost_date_type_tab      pa_plsql_datatypes.char100TabTyp;
8172         l_bl_pc_cost_date_tab           pa_plsql_datatypes.dateTabTyp;
8173         l_bl_project_raw_cost_tab       pa_plsql_datatypes.NumTabTyp;
8174         l_bl_project_burdened_cost_tab      pa_plsql_datatypes.NumTabTyp;
8175         l_bl_pc_rev_rate_type_tab       pa_plsql_datatypes.char100TabTyp;
8176         l_bl_pc_rev_exchange_rate_tab       pa_plsql_datatypes.NumTabTyp;
8177         l_bl_pc_rev_date_type_tab       pa_plsql_datatypes.char100TabTyp;
8178         l_bl_pc_rev_date_tab            pa_plsql_datatypes.dateTabTyp;
8179         l_bl_project_revenue_tab        pa_plsql_datatypes.NumTabTyp;
8180         l_bl_txn_raw_cost_tab           pa_plsql_datatypes.NumTabTyp;
8181         l_bl_txn_burdened_cost_tab      pa_plsql_datatypes.NumTabTyp;
8182         l_bl_txn_revenue_tab            pa_plsql_datatypes.NumTabTyp;
8183         l_bl_init_quantity_tab          pa_plsql_datatypes.NumTabTyp;
8184         l_bl_txn_init_raw_cost_tab      pa_plsql_datatypes.NumTabTyp;
8185         l_bl_txn_init_burden_cost_tab       pa_plsql_datatypes.NumTabTyp;
8186         l_bl_txn_init_revenue_tab       pa_plsql_datatypes.NumTabTyp;
8187         l_bl_pfc_init_raw_cost_tab      pa_plsql_datatypes.NumTabTyp;
8188         l_bl_pfc_init_burden_cost_tab       pa_plsql_datatypes.NumTabTyp;
8189         l_bl_pfc_init_revenue_tab       pa_plsql_datatypes.NumTabTyp;
8190         l_bl_pc_init_raw_cost_tab       pa_plsql_datatypes.NumTabTyp;
8191         l_bl_pc_init_burden_cost_tab        pa_plsql_datatypes.NumTabTyp;
8192         l_bl_pc_init_revenue_tab        pa_plsql_datatypes.NumTabTyp;
8193         l_bl_markup_percentage_tab      pa_plsql_datatypes.NumTabTyp;
8194         l_bl_bill_rate_tab          pa_plsql_datatypes.NumTabTyp;
8195         l_bl_cost_rate_tab          pa_plsql_datatypes.NumTabTyp;
8196         l_bl_cost_rate_override_tab     pa_plsql_datatypes.NumTabTyp;
8197         l_bl_burden_cost_rate_tab       pa_plsql_datatypes.NumTabTyp;
8198         l_bl_bill_rate_override_tab     pa_plsql_datatypes.NumTabTyp;
8199         l_bl_burden_rate_override_tab       pa_plsql_datatypes.NumTabTyp;
8200         l_bl_compiled_set_id_tab        pa_plsql_datatypes.NumTabTyp;
8201     l_bl_version_type_tab           pa_plsql_datatypes.char100TabTyp;
8202     l_bl_final_txn_cur_code_tab     pa_plsql_datatypes.char100TabTyp;
8203     l_bl_CHANGE_REASON_CODE_tab     pa_plsql_datatypes.char2000TabTyp;
8204         l_bl_DESCRIPTION_tab            pa_plsql_datatypes.char2000TabTyp;
8205         l_bl_ATTRIBUTE_CATEGORY_tab         pa_plsql_datatypes.char30TabTyp;
8206         l_bl_ATTRIBUTE1_tab             pa_plsql_datatypes.Char150TabTyp;
8207         l_bl_ATTRIBUTE2_tab         pa_plsql_datatypes.Char150TabTyp;
8208         l_bl_ATTRIBUTE3_tab             pa_plsql_datatypes.Char150TabTyp;
8209         l_bl_ATTRIBUTE4_tab             pa_plsql_datatypes.Char150TabTyp;
8210         l_bl_ATTRIBUTE5_tab             pa_plsql_datatypes.Char150TabTyp;
8211         l_bl_ATTRIBUTE6_tab             pa_plsql_datatypes.Char150TabTyp;
8212         l_bl_ATTRIBUTE7_tab             pa_plsql_datatypes.Char150TabTyp;
8213         l_bl_ATTRIBUTE8_tab             pa_plsql_datatypes.Char150TabTyp;
8214         l_bl_ATTRIBUTE9_tab             pa_plsql_datatypes.Char150TabTyp;
8215         l_bl_ATTRIBUTE10_tab            pa_plsql_datatypes.Char150TabTyp;
8216         l_bl_ATTRIBUTE11_tab            pa_plsql_datatypes.Char150TabTyp;
8217         l_bl_ATTRIBUTE12_tab            pa_plsql_datatypes.Char150TabTyp;
8218         l_bl_ATTRIBUTE13_tab            pa_plsql_datatypes.Char150TabTyp;
8219         l_bl_ATTRIBUTE14_tab            pa_plsql_datatypes.Char150TabTyp;
8220         l_bl_ATTRIBUTE15_tab            pa_plsql_datatypes.Char150TabTyp;
8221         l_bl_RAW_COST_SOURCE_tab        pa_plsql_datatypes.Char5TabTyp;
8222         l_bl_BURDENED_COST_SOURCE_tab       pa_plsql_datatypes.Char5TabTyp;
8223         l_bl_QUANTITY_SOURCE_tab        pa_plsql_datatypes.Char5TabTyp;
8224         l_bl_REVENUE_SOURCE_tab         pa_plsql_datatypes.Char5TabTyp;
8225         l_bl_PM_PRODUCT_CODE_tab        pa_plsql_datatypes.char30TabTyp;
8226         l_bl_PM_LINE_REFERENCE_tab      pa_plsql_datatypes.char30TabTyp;
8227         l_bl_CODE_COMBINATION_ID_tab        pa_plsql_datatypes.NumTabTyp;
8228         l_bl_CCID_GEN_STATUS_CODE_tab       pa_plsql_datatypes.Char1TabTyp;
8229         l_bl_CCID_GEN_REJ_MESSAGE_tab       pa_plsql_datatypes.Char150TabTyp;
8230         l_bl_BORROWED_REVENUE_tab       pa_plsql_datatypes.NumTabTyp;
8231         l_bl_TP_REVENUE_IN_tab          pa_plsql_datatypes.NumTabTyp;
8232         l_bl_TP_REVENUE_OUT_tab         pa_plsql_datatypes.NumTabTyp;
8233         l_bl_REVENUE_ADJ_tab            pa_plsql_datatypes.NumTabTyp;
8234         l_bl_LENT_RESOURCE_COST_tab         pa_plsql_datatypes.NumTabTyp;
8235         l_bl_TP_COST_IN_tab             pa_plsql_datatypes.NumTabTyp;
8236         l_bl_TP_COST_OUT_tab            pa_plsql_datatypes.NumTabTyp;
8237         l_bl_COST_ADJ_tab           pa_plsql_datatypes.NumTabTyp;
8238         l_bl_UNASSIGNED_TIME_COST_tab       pa_plsql_datatypes.NumTabTyp;
8239         l_bl_UTILIZATION_PERCENT_tab        pa_plsql_datatypes.NumTabTyp;
8240         l_bl_UTILIZATION_HOURS_tab      pa_plsql_datatypes.NumTabTyp;
8241         l_bl_UTILIZATION_ADJ_tab        pa_plsql_datatypes.NumTabTyp;
8242         l_bl_CAPACITY_tab           pa_plsql_datatypes.NumTabTyp;
8243         l_bl_HEAD_COUNT_tab             pa_plsql_datatypes.NumTabTyp;
8244         l_bl_HEAD_COUNT_ADJ_tab         pa_plsql_datatypes.NumTabTyp;
8245         l_bl_BUCKETING_PERIOD_CODE_tab      pa_plsql_datatypes.char30TabTyp;
8246         l_bl_TXN_DISCOUNT_PERCENT_tab       pa_plsql_datatypes.NumTabTyp;
8247         l_bl_TRANSFER_PRICE_RATE_tab        pa_plsql_datatypes.NumTabTyp;
8248         l_bl_BL_CREATED_BY_tab          pa_plsql_datatypes.NumTabTyp;
8249         l_bl_BL_CREATION_DATE_tab       pa_plsql_datatypes.DateTabTyp;
8250 	l_rate_base_flag_tab            pa_plsql_datatypes.Char1TabTyp;
8251 
8252 
8253     CURSOR Cur_RollupLines IS
8254         SELECT /*+ INDEX(B PA_BUDGET_LINES_U2) */ r.resource_assignment_id
8255           ,b.start_date
8256       ,b.end_date
8257       ,b.period_name
8258           ,r.budget_line_id
8259           ,r.txn_currency_code                                  txn_currency_code
8260           ,case when r.quantity = 0 and r.init_quantity = 0 then null else r.quantity end  quantity
8261           ,DECODE(r.projfunc_raw_cost,0,NULL,r.projfunc_raw_cost)           projfunc_raw_cost
8262           ,DECODE(r.projfunc_burdened_cost,0,NULL,r.projfunc_burdened_cost) projfunc_burdened_cost
8263           ,DECODE(r.projfunc_revenue,0,NULL,r.projfunc_revenue)             projfunc_revenue
8264           ,r.cost_rejection_code
8265           ,r.revenue_rejection_code
8266           ,r.burden_rejection_code
8267           ,r.pfc_cur_conv_rejection_code
8268           ,r.pc_cur_conv_rejection_code
8269           ,r.projfunc_currency_code
8270           ,r.projfunc_cost_rate_type
8271           ,r.projfunc_cost_exchange_rate
8272           ,r.projfunc_cost_rate_date_type
8273           ,r.projfunc_cost_rate_date
8274           ,r.projfunc_rev_rate_type
8275           ,r.projfunc_rev_exchange_rate
8276           ,r.projfunc_rev_rate_date_type
8277           ,r.projfunc_rev_rate_date
8278           ,r.project_currency_code
8279           ,r.project_cost_rate_type
8280           ,r.project_cost_exchange_rate
8281           ,r.project_cost_rate_date_type
8282           ,r.project_cost_rate_date
8283           ,DECODE(r.project_raw_cost,0,NULL,r.project_raw_cost)             project_raw_cost
8284           ,DECODE(r.project_burdened_cost,0,NULL,r.project_burdened_cost)   project_burdened_cost
8285           ,r.project_rev_rate_type
8286           ,r.project_rev_exchange_rate
8287           ,r.project_rev_rate_date_type
8288           ,r.project_rev_rate_date
8289           ,DECODE(r.project_revenue,0,NULL,r.project_revenue)               project_revenue
8290           ,case when r.txn_raw_cost = 0 and r.txn_init_raw_cost = 0 then null else r.txn_raw_cost end txn_raw_cost
8291           ,case when r.txn_burdened_cost = 0 and r.txn_init_burdened_cost = 0 then null else r.txn_burdened_cost end txn_burdened_cost
8292           ,case when r.txn_revenue = 0 and r.init_revenue = 0 then null else  r.txn_revenue end txn_revenue
8293           ,DECODE(r.init_quantity,0,NULL,r.init_quantity)                   init_quantity
8294           ,DECODE(r.txn_init_raw_cost,0,NULL,r.txn_init_raw_cost)           txn_init_raw_cost
8295           ,DECODE(r.txn_init_burdened_cost,0,NULL,r.txn_init_burdened_cost) txn_init_burdened_cost
8296           ,DECODE(r.txn_init_revenue,0,NULL,r.txn_init_revenue)             txn_init_revenue
8297           ,DECODE(b.init_raw_cost,0,NULL,b.init_raw_cost)                   init_raw_cost
8298           ,DECODE(b.init_burdened_cost,0,NULL,b.init_burdened_cost)         init_burdened_cost
8299           ,DECODE(b.init_revenue,0,NULL,b.init_revenue)                     init_revenue
8300           ,DECODE(b.project_init_raw_cost,0,NULL,b.project_init_raw_cost)   project_init_raw_cost
8301           ,DECODE(b.project_init_burdened_cost,0,NULL,b.project_init_burdened_cost) project_init_burdened_cost
8302           ,DECODE(b.project_init_revenue,0,NULL,b.project_init_revenue)     project_init_revenue
8303           ,r.bill_markup_percentage
8304           ,DECODE(r.bill_rate,0,NULL,r.bill_rate)                           bill_rate
8305           ,DECODE(r.cost_rate,0,NULL,r.cost_rate)                           cost_rate
8306           --,DECODE(r.rw_cost_rate_override,0,NULL,r.rw_cost_rate_override)   rw_cost_rate_override
8307           ,DECODE(r.rw_cost_rate_override,0,0,NULL,NULL,r.rw_cost_rate_override)   rw_cost_rate_override
8308           ,DECODE(r.burden_cost_rate,0,NULL,r.burden_cost_rate)             burden_cost_rate
8309           --,DECODE(r.bill_rate_override,0,NULL,r.bill_rate_override)         bill_rate_override
8310           ,DECODE(r.bill_rate_override,0,0,NULL,NULL,r.bill_rate_override)         bill_rate_override
8311           --,DECODE(r.burden_cost_rate_override,0,NULL,r.burden_cost_rate_override)   burden_cost_rate_override
8312           ,DECODE(r.burden_cost_rate_override,0,0,NULL,NULL,r.burden_cost_rate_override)   burden_cost_rate_override
8313           ,r.cost_ind_compiled_set_id
8314       ,g_budget_version_type  version_type
8315 	,r.final_txn_curr_code final_txn_currency_code
8316         /* bug fix:5014538: Added nvl to retain the exisiting budget line attribs */
8317         ,nvl(r.CHANGE_REASON_CODE,b.CHANGE_REASON_CODE)                 CHANGE_REASON_CODE
8318           ,nvl(r.DESCRIPTION,b.DESCRIPTION)                             DESCRIPTION
8319           ,nvl(r.ATTRIBUTE_CATEGORY,b.ATTRIBUTE_CATEGORY)               ATTRIBUTE_CATEGORY
8320           ,nvl(r.ATTRIBUTE1,b.ATTRIBUTE1)                               ATTRIBUTE1
8321           ,nvl(r.ATTRIBUTE2,b.ATTRIBUTE2)                               ATTRIBUTE2
8322           ,nvl(r.ATTRIBUTE3,b.ATTRIBUTE3)                               ATTRIBUTE3
8323           ,nvl(r.ATTRIBUTE4,b.ATTRIBUTE4)                               ATTRIBUTE4
8324           ,nvl(r.ATTRIBUTE5,b.ATTRIBUTE5)                               ATTRIBUTE5
8325           ,nvl(r.ATTRIBUTE6,b.ATTRIBUTE6)                               ATTRIBUTE6
8326           ,nvl(r.ATTRIBUTE7,b.ATTRIBUTE7)                               ATTRIBUTE7
8327           ,nvl(r.ATTRIBUTE8,b.ATTRIBUTE8)                               ATTRIBUTE8
8328           ,nvl(r.ATTRIBUTE9,b.ATTRIBUTE9)                               ATTRIBUTE9
8329           ,nvl(r.ATTRIBUTE10,b.ATTRIBUTE10)                             ATTRIBUTE10
8330           ,nvl(r.ATTRIBUTE11,b.ATTRIBUTE11)                             ATTRIBUTE11
8331           ,nvl(r.ATTRIBUTE12,b.ATTRIBUTE12)                             ATTRIBUTE12
8332           ,nvl(r.ATTRIBUTE13,b.ATTRIBUTE13)                             ATTRIBUTE13
8333           ,nvl(r.ATTRIBUTE14,b.ATTRIBUTE14)                             ATTRIBUTE14
8334           ,nvl(r.ATTRIBUTE15,b.ATTRIBUTE15)                             ATTRIBUTE15
8335           ,r.RAW_COST_SOURCE
8336           ,r.BURDENED_COST_SOURCE
8337           ,r.QUANTITY_SOURCE
8338           ,r.REVENUE_SOURCE
8339 	  ,nvl(r.PM_PRODUCT_CODE,b.PM_PRODUCT_CODE)                     PM_PRODUCT_CODE
8340           ,nvl(r.PM_BUDGET_LINE_REFERENCE,b.PM_BUDGET_LINE_REFERENCE)   PM_BUDGET_LINE_REFERENCE
8341           ,nvl(r.CODE_COMBINATION_ID,b.CODE_COMBINATION_ID)             CODE_COMBINATION_ID
8342           ,nvl(r.CCID_GEN_STATUS_CODE,b.CCID_GEN_STATUS_CODE)           CCID_GEN_STATUS_CODE
8343           ,nvl(r.CCID_GEN_REJ_MESSAGE,b.CCID_GEN_REJ_MESSAGE)           CCID_GEN_REJ_MESSAGE
8344           ,nvl(r.BORROWED_REVENUE,b.BORROWED_REVENUE)                   BORROWED_REVENUE
8345           ,nvl(r.TP_REVENUE_IN,b.TP_REVENUE_IN)                         TP_REVENUE_IN
8346           ,nvl(r.TP_REVENUE_OUT,b.TP_REVENUE_OUT)                       TP_REVENUE_OUT
8347           ,nvl(r.REVENUE_ADJ,b.REVENUE_ADJ)                             REVENUE_ADJ
8348           ,nvl(r.LENT_RESOURCE_COST,b.LENT_RESOURCE_COST)               LENT_RESOURCE_COST
8349           ,nvl(r.TP_COST_IN,b.TP_COST_IN)                               TP_COST_IN
8350           ,nvl(r.TP_COST_OUT,b.TP_COST_OUT)                             TP_COST_OUT
8351           ,nvl(r.COST_ADJ,b.COST_ADJ)                                   COST_ADJ
8352           ,nvl(r.UNASSIGNED_TIME_COST,b.UNASSIGNED_TIME_COST)           UNASSIGNED_TIME_COST
8353           ,nvl(r.UTILIZATION_PERCENT,b.UTILIZATION_PERCENT)             UTILIZATION_PERCENT
8354           ,nvl(r.UTILIZATION_HOURS,b.UTILIZATION_HOURS)                 UTILIZATION_HOURS
8355           ,nvl(r.UTILIZATION_ADJ,b.UTILIZATION_ADJ)                     UTILIZATION_ADJ
8356           ,nvl(r.CAPACITY,b.CAPACITY)                                   CAPACITY
8357           ,nvl(r.HEAD_COUNT,b.HEAD_COUNT)                               HEAD_COUNT
8358           ,nvl(r.HEAD_COUNT_ADJ,b.HEAD_COUNT_ADJ)                       HEAD_COUNT_ADJ
8359           ,nvl(r.BUCKETING_PERIOD_CODE,b.BUCKETING_PERIOD_CODE)         BUCKETING_PERIOD_CODE
8360           ,nvl(r.TXN_DISCOUNT_PERCENTAGE,b.TXN_DISCOUNT_PERCENTAGE)     TXN_DISCOUNT_PERCENTAGE
8361           ,nvl(r.TRANSFER_PRICE_RATE,b.TRANSFER_PRICE_RATE)             TRANSFER_PRICE_RATE
8362           ,r.BL_CREATED_BY
8363           ,r.BL_CREATION_DATE
8364           ,NVL(ra.rate_based_flag,'N')
8365 	FROM pa_fp_rollup_tmp r
8366            ,pa_budget_lines  b
8367            ,pa_resource_assignments ra
8368         WHERE r.budget_line_id = b.budget_line_id
8369         AND  b.budget_version_id = p_budget_version_id
8370         AND  b.budget_version_id = r.budget_version_id  --Bug 7520706
8371         AND  ra.budget_version_id = r.budget_version_id  --Bug 7520706
8372         AND r.resource_assignment_id = ra.resource_assignment_id
8373         ORDER by r.resource_assignment_id,r.start_date,decode(b.txn_currency_code,r.txn_currency_code,0,1)
8374     ;
8375 
8376 
8377     /* This cursor is used only for before and after updated the budget line values */
8378     CURSOR cur_blAmts IS
8379     SELECT bl.budget_line_id
8380          ,bl.txn_raw_cost
8381          ,bl.txn_burdened_cost
8382          ,bl.txn_revenue
8383          ,bl.project_raw_cost
8384          ,bl.project_burdened_cost
8385          ,bl.project_revenue
8386          ,bl.raw_cost      projfunc_raw_cost
8387          ,bl.burdened_cost projfunc_burdened_cost
8388          ,bl.revenue       projfunc_revenue
8389          ,bl.quantity
8390      ,bl.start_date
8391      ,bl.end_date
8392      ,bl.period_name
8393      ,bl.resource_assignment_id
8394      ,bl.txn_currency_code
8395      ,bl.project_currency_code
8396      ,bl.projfunc_currency_code
8397         FROM pa_budget_lines bl
8398         ,pa_fp_rollup_tmp r
8399     WHERE  bl.budget_version_id = p_budget_version_id
8400     AND  bl.budget_line_id = r.budget_line_id
8401     AND  NVL(r.processed_flag,'Y') <> 'N';
8402 	/* bug fix:5031388
8403     	AND  bl.cost_rejection_code         IS NULL
8404         AND  bl.revenue_rejection_code      IS NULL
8405         AND  bl.burden_rejection_code       IS NULL
8406         AND  bl.pfc_cur_conv_rejection_code IS NULL
8407         AND  bl.pc_cur_conv_rejection_code  IS NULL
8408 	*/
8409 
8410     /* This cursor is used for passing values to rollup api for dupVal rejected bl rows */
8411     CURSOR cur_ExistingblAmts IS
8412         SELECT bl.budget_line_id
8413          ,bl.txn_raw_cost
8414          ,bl.txn_burdened_cost
8415          ,bl.txn_revenue
8416          ,bl.project_raw_cost
8417          ,bl.project_burdened_cost
8418          ,bl.project_revenue
8419          ,bl.raw_cost      projfunc_raw_cost
8420          ,bl.burdened_cost projfunc_burdened_cost
8421          ,bl.revenue       projfunc_revenue
8422          ,bl.quantity
8423          ,bl.start_date
8424          ,bl.end_date
8425          ,bl.period_name
8426          ,bl.resource_assignment_id
8427          ,bl.txn_currency_code
8428          ,bl.project_currency_code
8429          ,bl.projfunc_currency_code
8430         FROM pa_budget_lines bl
8431         ,pa_fp_spread_calc_tmp2 tmp2
8432         WHERE  bl.budget_version_id = p_budget_version_id
8433     AND  tmp2.budget_version_id = bl.budget_version_id
8434     AND  tmp2.resource_assignment_id = bl.resource_assignment_id
8435     AND  tmp2.txn_currency_code = bl.txn_currency_code
8436     AND  tmp2.start_date = bl.start_date;
8437 	/* bug fix:5031388
8438         AND  bl.cost_rejection_code         IS NULL
8439         AND  bl.revenue_rejection_code      IS NULL
8440         AND  bl.burden_rejection_code       IS NULL
8441         AND  bl.pfc_cur_conv_rejection_code IS NULL
8442         AND  bl.pc_cur_conv_rejection_code  IS NULL
8443 	*/
8444 
8445 
8446     l_err_error_code_tab           pa_plsql_datatypes.char30TabTyp;
8447         l_err_budget_line_id_tab       pa_plsql_datatypes.NumTabTyp;
8448         l_err_raId_tab                 pa_plsql_datatypes.NumTabTyp;
8449         l_err_txn_cur_tab              pa_plsql_datatypes.char30TabTyp;
8450         l_err_sdate_tab                pa_plsql_datatypes.DateTabTyp;
8451         l_err_quantity_tab             pa_plsql_datatypes.NumTabTyp;
8452         l_err_cost_rate_tab            pa_plsql_datatypes.NumTabTyp;
8453         l_err_cost_rate_ovr_tab        pa_plsql_datatypes.NumTabTyp;
8454         l_err_burden_rate_tab          pa_plsql_datatypes.NumTabTyp;
8455         l_err_burden_rate_ovr_tab      pa_plsql_datatypes.NumTabTyp;
8456         l_err_compiled_set_id_tab      pa_plsql_datatypes.NumTabTyp;
8457         l_err_bill_rate_tab            pa_plsql_datatypes.NumTabTyp;
8458         l_err_bill_rate_ovr_tab        pa_plsql_datatypes.NumTabTyp;
8459         l_err_markup_percent_tab       pa_plsql_datatypes.NumTabTyp;
8460         l_err_cost_rejection_tab       pa_plsql_datatypes.char30TabTyp;
8461         l_err_revenue_rejection_tab    pa_plsql_datatypes.char30TabTyp;
8462         l_err_burden_rejection_tab     pa_plsql_datatypes.char30TabTyp;
8463         l_err_pfc_cur_rejection_tab    pa_plsql_datatypes.char30TabTyp;
8464         l_err_pc_cur_rejection_tab     pa_plsql_datatypes.char30TabTyp;
8465 
8466     CURSOR cur_errorBdgtLines IS
8467     SELECT tmp1.budget_line_id
8468           ,tmp1.resource_assignment_id
8469           ,tmp1.txn_currency_code
8470           ,tmp1.start_date
8471           ,tmp1.end_date
8472           ,tmp1.quantity
8473           ,tmp1.cost_rate
8474           ,tmp1.cost_rate_override
8475           ,tmp1.burden_cost_rate
8476           ,tmp1.burden_cost_rate_override
8477           ,tmp1.bill_rate
8478           ,tmp1.bill_rate_override
8479           ,tmp1.cost_ind_compiled_set_id
8480           ,tmp1.bill_markup_percentage
8481           ,tmp1.cost_rejection_code
8482           ,tmp1.revenue_rejection_code
8483           ,tmp1.burden_rejection_code
8484           ,tmp1.pfc_cur_conv_rejection_code
8485           ,tmp1.pc_cur_conv_rejection_code
8486           ,tmp1.system_reference_num1  Existing_budget_line_id
8487     FROM pa_fp_spread_calc_tmp1 tmp1
8488     WHERE tmp1.budget_version_id = p_budget_version_id;
8489 
8490     l_del_budget_line_id_tab        pa_plsql_datatypes.NumTabTyp;
8491     CURSOR cur_delBlLines IS
8492     SELECT tmp1.budget_line_id
8493     FROM pa_fp_spread_calc_tmp1 tmp1
8494         WHERE tmp1.budget_version_id = p_budget_version_id;
8495 
8496 
8497     CURSOR cur_Tmp2ExblAmts(p_budget_line_id Number) IS
8498         SELECT tmp2.budget_line_id  existing_budget_line_id
8499      ,tmp2.cost_rate        existing_cost_rate
8500      ,tmp2.cost_rate_override   existing_cost_rate_ovride
8501      ,tmp2.burden_cost_rate     existing_burden_rate
8502      ,tmp2.burden_cost_rate_override existing_burden_rate_ovride
8503      ,tmp2.bill_rate        existing_bill_rate
8504      ,tmp2.bill_rate_override   existing_bill_rate_ovride
8505      ,tmp2.bill_markup_percentage   existing_markup_percentage
8506      ,tmp2.system_reference_num1    existing_compile_set_id
8507         FROM pa_fp_spread_calc_tmp2 tmp2
8508         WHERE  tmp2.budget_version_id = p_budget_version_id
8509         AND  tmp2.budget_line_id = p_budget_line_id;
8510     ExBlRec   cur_Tmp2ExblAmts%ROWTYPE;
8511 
8512 
8513     l_last_updated_by               NUMBER := FND_GLOBAL.user_id;
8514     l_last_login_id                 NUMBER := FND_GLOBAL.login_id;
8515     l_sysdate                       DATE   := SYSDATE;
8516     l_rep_budget_line_id_tab        pa_plsql_datatypes.NumTabTyp;
8517     l_rep_txn_raw_cost_tab          pa_plsql_datatypes.NumTabTyp;
8518         l_rep_txn_burdened_cost_tab     pa_plsql_datatypes.NumTabTyp;
8519         l_rep_txn_revenue_tab           pa_plsql_datatypes.NumTabTyp;
8520         l_rep_prj_raw_cost_tab          pa_plsql_datatypes.NumTabTyp;
8521         l_rep_prj_burdened_cost_tab     pa_plsql_datatypes.NumTabTyp;
8522         l_rep_prj_revenue_tab           pa_plsql_datatypes.NumTabTyp;
8523         l_rep_pfc_raw_cost_tab          pa_plsql_datatypes.NumTabTyp;
8524         l_rep_pfc_burdened_cost_tab     pa_plsql_datatypes.NumTabTyp;
8525         l_rep_pfc_revenue_tab           pa_plsql_datatypes.NumTabTyp;
8526         l_rep_quantity_tab              pa_plsql_datatypes.NumTabTyp;
8527         l_rep_start_date_tab            pa_plsql_datatypes.DateTabTyp;
8528         l_rep_end_date_tab              pa_plsql_datatypes.DateTabTyp;
8529         l_rep_period_name_tab           pa_plsql_datatypes.Char30TabTyp;
8530         l_rep_resAss_id_tab             pa_plsql_datatypes.NumTabTyp;
8531         l_rep_txn_curr_code_tab         pa_plsql_datatypes.Char30TabTyp;
8532         l_rep_prj_curr_code_tab         pa_plsql_datatypes.Char30TabTyp;
8533         l_rep_pfc_curr_code_tab         pa_plsql_datatypes.Char30TabTyp;
8534         l_rep_called_flag_tab       pa_plsql_datatypes.Char30TabTyp;
8535     l_rep_cost_rejection_tab    pa_plsql_datatypes.Char30TabTyp;
8536         l_rep_burden_rejection_tab  pa_plsql_datatypes.Char30TabTyp;
8537         l_rep_revenue_rejection_tab pa_plsql_datatypes.Char30TabTyp;
8538         l_rep_pfc_cur_rejection_tab pa_plsql_datatypes.Char30TabTyp;
8539         l_rep_pc_cur_rejection_tab  pa_plsql_datatypes.Char30TabTyp;
8540 
8541     l_exception_return_status   Varchar2(1) := 'S';
8542         v_NumErrors         Number := 0;
8543     V_INDEX_POSITION                Number := 0;
8544     v_error_code                    Number := 0;
8545     l_x_cntr            Number := 0;
8546 
8547     l_msg_index_out                 NUMBER;
8548         l_return_status                 Varchar2(100);
8549         l_error_msg_code        Varchar2(100);
8550         l_rep_called_flag           Varchar2(10);
8551     l_rep_return_status             Varchar2(10);
8552     l_rep_msg_data              Varchar2(1000);
8553     l_bl_upd_markup_percentage  Number;
8554         l_bl_upd_bill_rate      Number;
8555         l_bl_upd_cost_rate      Number;
8556         l_bl_upd_burden_rate        Number;
8557         l_bl_upd_bill_rate_ovride   Number;
8558         l_bl_upd_cost_rate_ovride   Number;
8559         l_bl_upd_burden_rate_ovride Number;
8560         l_bl_upd_compile_set_id     Number;
8561 
8562     l_tmp2_budget_line_id_tab   pa_plsql_datatypes.NumTabTyp;
8563     l_tmp2_raId_tab         pa_plsql_datatypes.NumTabTyp;
8564     l_tmp2_sdate_tab        pa_plsql_datatypes.DateTabTyp;
8565     l_tmp2_txn_curr_code_tab    pa_plsql_datatypes.Char30TabTyp;
8566         l_tmp2_quantity_tab     pa_plsql_datatypes.NumTabTyp;
8567         l_tmp2_cost_rejection_tab   pa_plsql_datatypes.Char30TabTyp;
8568         l_tmp2_revenue_rejection_tab    pa_plsql_datatypes.Char30TabTyp;
8569         l_tmp2_burden_rejection_tab pa_plsql_datatypes.Char30TabTyp;
8570         l_tmp2_pfc_cur_rejection_tab    pa_plsql_datatypes.Char30TabTyp;
8571         l_tmp2_pc_cur_rejection_tab pa_plsql_datatypes.Char30TabTyp;
8572         l_tmp2_markup_percent_tab   pa_plsql_datatypes.NumTabTyp;
8573         l_tmp2_bill_rate_tab        pa_plsql_datatypes.NumTabTyp;
8574         l_tmp2_cost_rate_tab        pa_plsql_datatypes.NumTabTyp;
8575         l_tmp2_burden_rate_tab      pa_plsql_datatypes.NumTabTyp;
8576         l_tmp2_bill_rate_ovr_tab    pa_plsql_datatypes.NumTabTyp;
8577         l_tmp2_cost_rate_ovr_tab    pa_plsql_datatypes.NumTabTyp;
8578         l_tmp2_burden_rate_ovr_tab  pa_plsql_datatypes.NumTabTyp;
8579         l_tmp2_compile_set_id_tab   pa_plsql_datatypes.NumTabTyp;
8580 	l_tmp2_rate_based_flag_tab  pa_plsql_datatypes.Char1TabTyp;
8581 
8582     PROCEDURE InitPlsqlTabs IS
8583 
8584     BEGIN
8585         print_msg('Entered InitPlsqlTabs API');
8586 
8587         /* initialize these plsql tables for bulk exception records*/
8588         l_err_error_code_tab.delete;
8589             l_err_budget_line_id_tab.delete;
8590             l_err_raId_tab.delete;
8591             l_err_txn_cur_tab.delete;
8592             l_err_sdate_tab.delete;
8593             l_err_quantity_tab.delete;
8594             l_err_cost_rate_tab.delete;
8595             l_err_cost_rate_ovr_tab.delete;
8596             l_err_burden_rate_tab.delete;
8597             l_err_burden_rate_ovr_tab.delete;
8598             l_err_compiled_set_id_tab.delete;
8599             l_err_bill_rate_tab.delete;
8600             l_err_bill_rate_ovr_tab.delete;
8601             l_err_markup_percent_tab.delete;
8602             l_err_cost_rejection_tab.delete;
8603             l_err_revenue_rejection_tab.delete;
8604             l_err_burden_rejection_tab.delete;
8605             l_err_pfc_cur_rejection_tab.delete;
8606             l_err_pc_cur_rejection_tab.delete;
8607 
8608         /* Initialize these plsql tables for budget Lies which needs to updated in bulk after exception
8609         * records */
8610         l_tmp2_budget_line_id_tab.delete;
8611                 l_tmp2_raId_tab.delete;
8612                 l_tmp2_sdate_tab.delete;
8613                 l_tmp2_txn_curr_code_tab.delete;
8614                 l_tmp2_quantity_tab.delete;
8615                 l_tmp2_cost_rejection_tab.delete;
8616                 l_tmp2_revenue_rejection_tab.delete;
8617                 l_tmp2_burden_rejection_tab.delete;
8618                 l_tmp2_pfc_cur_rejection_tab.delete;
8619                 l_tmp2_pc_cur_rejection_tab.delete;
8620                 l_tmp2_markup_percent_tab.delete;
8621                 l_tmp2_bill_rate_tab.delete;
8622                 l_tmp2_cost_rate_tab.delete;
8623                 l_tmp2_burden_rate_tab.delete;
8624                 l_tmp2_bill_rate_ovr_tab.delete;
8625                 l_tmp2_cost_rate_ovr_tab.delete;
8626                 l_tmp2_burden_rate_ovr_tab.delete;
8627                 l_tmp2_compile_set_id_tab.delete;
8628 		l_tmp2_rate_based_flag_tab.delete;
8629 
8630         /* Initialize these plsql tables for main rollup rec processing*/
8631             l_bl_raId_tab.delete;
8632             l_bl_sDate_tab.delete;
8633         l_bl_edate_tab.delete;
8634         l_bl_period_name_tab.delete;
8635             l_bl_budget_line_id_tab.delete;
8636             l_bl_txn_curcode_tab.delete;
8637             l_bl_quantity_tab.delete;
8638             l_bl_pjfc_raw_cost_tab.delete;
8639         l_bl_pjfc_burden_cost_tab.delete;
8640         l_bl_pjfc_revenue_tab.delete;
8641         l_bl_cost_rejection_tab.delete;
8642         l_bl_rev_rejection_tab.delete;
8643         l_bl_burden_rejection_tab.delete;
8644         l_bl_pfc_cur_rejection_tab.delete;
8645         l_bl_pc_cur_rejection_tab.delete;
8646         l_bl_pfc_curcode_tab.delete;
8647             l_bl_pfc_cost_rate_type_tab.delete;
8648             l_bl_pfc_cost_exchng_rate_tab.delete;
8649             l_bl_pfc_cost_date_type_tab.delete;
8650             l_bl_pfc_cost_date_tab.delete;
8651             l_bl_pfc_rev_rate_type_tab.delete;
8652             l_bl_pfc_rev_exchange_rate_tab.delete;
8653             l_bl_pfc_rev_date_type_tab.delete;
8654             l_bl_pfc_rev_date_tab.delete;
8655             l_bl_pc_cur_code_tab.delete;
8656             l_bl_pc_cost_rate_type_tab.delete;
8657             l_bl_pc_cost_exchange_rate_tab.delete;
8658             l_bl_pc_cost_date_type_tab.delete;
8659             l_bl_pc_cost_date_tab.delete;
8660             l_bl_project_raw_cost_tab.delete;
8661             l_bl_project_burdened_cost_tab.delete;
8662             l_bl_pc_rev_rate_type_tab.delete;
8663             l_bl_pc_rev_exchange_rate_tab.delete;
8664             l_bl_pc_rev_date_type_tab.delete;
8665             l_bl_pc_rev_date_tab.delete;
8666             l_bl_project_revenue_tab.delete;
8667             l_bl_txn_raw_cost_tab.delete;
8668             l_bl_txn_burdened_cost_tab.delete;
8669             l_bl_txn_revenue_tab.delete;
8670             l_bl_init_quantity_tab.delete;
8671             l_bl_txn_init_raw_cost_tab.delete;
8672             l_bl_txn_init_burden_cost_tab.delete;
8673             l_bl_txn_init_revenue_tab.delete;
8674             l_bl_pfc_init_raw_cost_tab.delete;
8675             l_bl_pfc_init_burden_cost_tab.delete;
8676             l_bl_pfc_init_revenue_tab.delete;
8677             l_bl_pc_init_raw_cost_tab.delete;
8678             l_bl_pc_init_burden_cost_tab.delete;
8679             l_bl_pc_init_revenue_tab.delete;
8680             l_bl_markup_percentage_tab.delete;
8681             l_bl_bill_rate_tab.delete;
8682             l_bl_cost_rate_tab.delete;
8683             l_bl_cost_rate_override_tab.delete;
8684             l_bl_burden_cost_rate_tab.delete;
8685             l_bl_bill_rate_override_tab.delete;
8686             l_bl_burden_rate_override_tab.delete;
8687             l_bl_compiled_set_id_tab.delete;
8688         l_bl_version_type_tab.delete;
8689         l_bl_final_txn_cur_code_tab.delete;
8690         l_bl_CHANGE_REASON_CODE_tab.delete;
8691             l_bl_DESCRIPTION_tab.delete;
8692             l_bl_ATTRIBUTE_CATEGORY_tab.delete;
8693             l_bl_ATTRIBUTE1_tab.delete;
8694             l_bl_ATTRIBUTE2_tab.delete;
8695             l_bl_ATTRIBUTE3_tab.delete;
8696             l_bl_ATTRIBUTE4_tab.delete;
8697             l_bl_ATTRIBUTE5_tab.delete;
8698             l_bl_ATTRIBUTE6_tab.delete;
8699             l_bl_ATTRIBUTE7_tab.delete;
8700             l_bl_ATTRIBUTE8_tab.delete;
8701             l_bl_ATTRIBUTE9_tab.delete;
8702             l_bl_ATTRIBUTE10_tab.delete;
8703             l_bl_ATTRIBUTE11_tab.delete;
8704             l_bl_ATTRIBUTE12_tab.delete;
8705             l_bl_ATTRIBUTE13_tab.delete;
8706             l_bl_ATTRIBUTE14_tab.delete;
8707             l_bl_ATTRIBUTE15_tab.delete;
8708             l_bl_RAW_COST_SOURCE_tab.delete;
8709             l_bl_BURDENED_COST_SOURCE_tab.delete;
8710             l_bl_QUANTITY_SOURCE_tab.delete;
8711             l_bl_REVENUE_SOURCE_tab.delete;
8712             l_bl_PM_PRODUCT_CODE_tab.delete;
8713             l_bl_PM_LINE_REFERENCE_tab.delete;
8714             l_bl_CODE_COMBINATION_ID_tab.delete;
8715             l_bl_CCID_GEN_STATUS_CODE_tab.delete;
8716             l_bl_CCID_GEN_REJ_MESSAGE_tab.delete;
8717             l_bl_BORROWED_REVENUE_tab.delete;
8718             l_bl_TP_REVENUE_IN_tab.delete;
8719             l_bl_TP_REVENUE_OUT_tab.delete;
8720             l_bl_REVENUE_ADJ_tab.delete;
8721             l_bl_LENT_RESOURCE_COST_tab.delete;
8722             l_bl_TP_COST_IN_tab.delete;
8723             l_bl_TP_COST_OUT_tab.delete;
8724             l_bl_COST_ADJ_tab.delete;
8725             l_bl_UNASSIGNED_TIME_COST_tab.delete;
8726             l_bl_UTILIZATION_PERCENT_tab.delete;
8727             l_bl_UTILIZATION_HOURS_tab.delete;
8728             l_bl_UTILIZATION_ADJ_tab.delete;
8729             l_bl_CAPACITY_tab.delete;
8730             l_bl_HEAD_COUNT_tab.delete;
8731             l_bl_HEAD_COUNT_ADJ_tab.delete;
8732             l_bl_BUCKETING_PERIOD_CODE_tab.delete;
8733             l_bl_TXN_DISCOUNT_PERCENT_tab.delete;
8734             l_bl_TRANSFER_PRICE_RATE_tab.delete;
8735             l_bl_BL_CREATED_BY_tab.delete;
8736             l_bl_BL_CREATION_DATE_tab.delete;
8737 	    l_rate_base_flag_tab.delete;
8738     END InitPlsqlTabs;
8739 
8740     PROCEDURE Populate_tmp2Plsql_tab IS
8741 
8742     BEGIN
8743         print_msg('Entered Populate_tmp2Plsql_tab API');
8744         SELECT tmp2.budget_line_id
8745             ,tmp2.resource_assignment_id
8746             ,tmp2.start_date
8747             ,tmp2.txn_currency_code
8748             ,tmp2.quantity
8749             ,tmp2.system_reference_var1   --tmp2.cost_rejection_code
8750             ,tmp2.system_reference_var2   --tmp2.revenue_rejection_code
8751             ,tmp2.system_reference_var3   --tmp2.burden_rejection_code
8752             ,tmp2.system_reference_var4   --tmp2.pfc_cur_conv_rejection_code
8753             ,tmp2.system_reference_var5   --tmp2.pc_cur_conv_rejection_code
8754             ,tmp2.bill_markup_percentage
8755             ,tmp2.bill_rate
8756             ,tmp2.cost_rate
8757             ,tmp2.burden_cost_rate
8758                     ,tmp2.bill_rate_override
8759                     ,tmp2.cost_rate_override
8760                     ,tmp2.burden_cost_rate_override
8761                     ,tmp2.system_reference_num1  --tmp2.compile_set_id
8762 		,NVL(ra.rate_based_flag,'N') /* bug fix: 4900436 */
8763         BULK COLLECT INTO
8764             l_tmp2_budget_line_id_tab
8765             ,l_tmp2_raId_tab
8766             ,l_tmp2_sdate_tab
8767             ,l_tmp2_txn_curr_code_tab
8768                     ,l_tmp2_quantity_tab
8769                     ,l_tmp2_cost_rejection_tab
8770                     ,l_tmp2_revenue_rejection_tab
8771                     ,l_tmp2_burden_rejection_tab
8772                     ,l_tmp2_pfc_cur_rejection_tab
8773                     ,l_tmp2_pc_cur_rejection_tab
8774                     ,l_tmp2_markup_percent_tab
8775                     ,l_tmp2_bill_rate_tab
8776                     ,l_tmp2_cost_rate_tab
8777                     ,l_tmp2_burden_rate_tab
8778                     ,l_tmp2_bill_rate_ovr_tab
8779                     ,l_tmp2_cost_rate_ovr_tab
8780                     ,l_tmp2_burden_rate_ovr_tab
8781                     ,l_tmp2_compile_set_id_tab
8782 		    ,l_tmp2_rate_based_flag_tab /* bug fix: 4900436 */
8783 	FROM pa_fp_spread_calc_tmp2 tmp2
8784             ,pa_resource_assignments ra
8785         WHERE tmp2.budget_version_id = p_budget_version_id
8786         AND ra.resource_assignment_id = tmp2.resource_assignment_id;
8787     END Populate_tmp2Plsql_tab;
8788 
8789     /* This API will round off the rounding difference for the last budget line in pa_budget_lines
8790     * 	when a new currency line is added to the already existing resource assignment.
8791     * Bug #13788196
8792     */
8793 
8794     PROCEDURE Update_rounding_diff_bl(
8795 		p_budget_version_id              IN  NUMBER
8796              ,p_calling_module                IN  VARCHAR2 DEFAULT NULL
8797              ,x_return_status                 OUT NOCOPY VARCHAR2
8798              ,x_msg_count                     OUT NOCOPY NUMBER
8799              ,x_msg_data                      OUT NOCOPY VARCHAR2
8800 	) IS
8801 
8802 
8803     CURSOR cur_round_discrepancy_blines IS
8804     SELECT resource_assignment_id
8805                 ,txn_currency_code
8806                 ,MAX(start_date)
8807                 ,SUM(quantity)
8808                 ,SUM(init_quantity)
8809                 ,SUM(txn_raw_cost)  rounded_txn_raw_cost
8810                 ,SUM(txn_init_raw_cost)
8811                 ,SUM(txn_burdened_cost) rounded_txn_burdened_cost
8812                 ,SUM(txn_init_burdened_cost)
8813                 ,SUM(txn_revenue) rounded_txn_revenue
8814                 ,SUM(txn_init_revenue)
8815                 ,SUM(decode((nvl(bl.txn_init_raw_cost,0) + (
8816                                         (nvl(bl.quantity,0) - nvl(bl.init_quantity,0)) *
8817                                         (nvl(bl.txn_cost_rate_override,nvl(txn_standard_cost_rate,0))))),0,NULL,
8818                     (nvl(bl.txn_init_raw_cost,0) + (
8819                     (nvl(bl.quantity,0) - nvl(bl.init_quantity,0)) *
8820                     (nvl(bl.txn_cost_rate_override,nvl(txn_standard_cost_rate,0)))))   )) unrounded_txn_raw_cost
8821                 ,SUM(decode((nvl(bl.txn_init_burdened_cost,0) + (
8822                                         (nvl(bl.quantity,0) - nvl(bl.init_quantity,0)) *
8823                                         (nvl(bl.burden_cost_rate_override,nvl(burden_cost_rate,0))))),0,NULL,
8824                                         (nvl(bl.txn_init_burdened_cost,0) + (
8825                                         (nvl(bl.quantity,0) - nvl(bl.init_quantity,0)) *
8826                                         (nvl(bl.burden_cost_rate_override,nvl(burden_cost_rate,0))))))) unrounded_txn_burdened_cost
8827                 ,SUM(decode((nvl(bl.txn_init_raw_cost,0) + (
8828                                         (nvl(bl.quantity,0) - nvl(bl.init_quantity,0)) *
8829                                         (nvl(bl.txn_bill_rate_override,nvl(txn_standard_bill_rate,0))))),0,NULL,
8830                                         (nvl(bl.txn_init_raw_cost,0) + (
8831                                         (nvl(bl.quantity,0) - nvl(bl.init_quantity,0)) *
8832                                         (nvl(bl.txn_bill_rate_override,nvl(txn_standard_bill_rate,0))))))) unrounded_txn_revenue
8833         ,to_number(NULL) diff_raw_cost
8834         ,to_number(NULL) diff_burden_cost
8835         ,to_number(NULL) diff_revenue
8836         FROM pa_budget_lines bl
8837     WHERE bl.budget_version_id = p_budget_version_id
8838     AND  nvl(quantity,0) <> 0
8839     GROUP BY resource_assignment_id
8840              ,txn_currency_code ;
8841 
8842 
8843 
8844     l_return_status    varchar2(10);
8845     l_msg_count        Number;
8846     l_msg_data         varchar2(240);
8847 
8848 
8849         l_resource_assignment_tab       pa_plsql_datatypes.NumTabTyp;
8850         l_txn_currency_code_tab         pa_plsql_datatypes.Char50TabTyp;
8851         l_start_date_tab                pa_plsql_datatypes.DateTabTyp;
8852         l_quantity_tab                  pa_plsql_datatypes.NumTabTyp;
8853         l_init_quantity_tab             pa_plsql_datatypes.NumTabTyp;
8854         l_txn_raw_cost_tab              pa_plsql_datatypes.NumTabTyp;
8855         l_txn_init_raw_cost_tab         pa_plsql_datatypes.NumTabTyp;
8856         l_txn_burdened_cost_tab         pa_plsql_datatypes.NumTabTyp;
8857         l_txn_init_burdened_cost_tab    pa_plsql_datatypes.NumTabTyp;
8858         l_txn_revenue_tab               pa_plsql_datatypes.NumTabTyp;
8859         l_txn_init_revenue_tab          pa_plsql_datatypes.NumTabTyp;
8860         l_unrounded_txn_raw_cost_tab    pa_plsql_datatypes.NumTabTyp;
8861         l_unround_txn_burden_cost_tab   pa_plsql_datatypes.NumTabTyp;
8862         l_unrounded_txn_revenue_tab pa_plsql_datatypes.NumTabTyp;
8863         l_rounded_txn_raw_cost_tab  pa_plsql_datatypes.NumTabTyp;
8864         l_rounded_txn_burden_cost_tab   pa_plsql_datatypes.NumTabTyp;
8865         l_rounded_txn_revenue_tab   pa_plsql_datatypes.NumTabTyp;
8866         l_diff_raw_cost_tab         pa_plsql_datatypes.NumTabTyp;
8867     	 l_diff_burden_cost_tab      pa_plsql_datatypes.NumTabTyp;
8868         l_diff_revenue_tab      pa_plsql_datatypes.NumTabTyp;
8869 
8870 
8871   BEGIN
8872     /* initialize the out variables */
8873     x_return_status := 'S';
8874     x_msg_count     := 0;
8875     x_msg_data      := NULL;
8876         l_return_status := 'S';
8877     l_msg_count := 0;
8878     l_msg_data      := NULL;
8879     IF p_pa_debug_mode = 'Y' Then
8880             pa_debug.init_err_stack('PA_FP_CALC_UTILS.Update_rounding_diff_bl');
8881     End If;
8882 
8883     g_stage := 'Update_rounding_diff_bl:100';
8884     pa_debug.g_err_stage := 'Entered Update_rounding_diff_bl API';
8885 
8886     --print_msg(pa_debug.g_err_stage);
8887         /* initialize the plsql tabs */
8888 
8889             l_resource_assignment_tab.delete;
8890             l_txn_currency_code_tab.delete;
8891             l_start_date_tab.delete;
8892             l_quantity_tab.delete;
8893             l_init_quantity_tab.delete;
8894             l_txn_raw_cost_tab.delete;
8895             l_txn_init_raw_cost_tab.delete;
8896             l_txn_burdened_cost_tab.delete;
8897             l_txn_init_burdened_cost_tab.delete;
8898             l_txn_revenue_tab.delete;
8899             l_txn_init_revenue_tab.delete;
8900             l_unrounded_txn_raw_cost_tab.delete;
8901             l_unround_txn_burden_cost_tab.delete;
8902             l_unrounded_txn_revenue_tab.delete;
8903             l_rounded_txn_raw_cost_tab.delete;
8904             l_rounded_txn_burden_cost_tab.delete;
8905             l_rounded_txn_revenue_tab.delete ;
8906             l_diff_raw_cost_tab.delete;
8907             l_diff_burden_cost_tab.delete;
8908             l_diff_revenue_tab.delete;
8909 
8910         OPEN cur_round_discrepancy_blines;
8911         FETCH cur_round_discrepancy_blines BULK COLLECT INTO
8912 		     l_resource_assignment_tab
8913                     ,l_txn_currency_code_tab
8914                     ,l_start_date_tab
8915                     ,l_quantity_tab
8916                     ,l_init_quantity_tab
8917 					,l_rounded_txn_raw_cost_tab
8918 					,l_txn_init_raw_cost_tab
8919 					,l_rounded_txn_burden_cost_tab
8920 					,l_txn_init_burdened_cost_tab
8921 					,l_rounded_txn_revenue_tab
8922 					,l_txn_init_revenue_tab
8923 					,l_unrounded_txn_raw_cost_tab
8924                     ,l_unround_txn_burden_cost_tab
8925                     ,l_unrounded_txn_revenue_tab
8926                     ,l_diff_raw_cost_tab
8927                     ,l_diff_burden_cost_tab
8928                     ,l_diff_revenue_tab;
8929         CLOSE cur_round_discrepancy_blines;
8930         g_stage := 'Update_rounding_diff_bl:101';
8931 
8932        IF l_resource_assignment_tab.COUNT > 0 Then
8933             FOR i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST LOOP
8934                 l_diff_raw_cost_tab(i) := nvl(l_unrounded_txn_raw_cost_tab(i),0) - nvl(l_rounded_txn_raw_cost_tab(i),0);
8935                 l_diff_burden_cost_tab(i) := nvl(l_unround_txn_burden_cost_tab(i),0) - nvl(l_rounded_txn_burden_cost_tab(i),0);
8936                 l_diff_revenue_tab(i)  := nvl(l_unrounded_txn_revenue_tab(i),0) - nvl(l_rounded_txn_revenue_tab(i),0);
8937 
8938                 l_diff_raw_cost_tab(i) := pa_currency.round_trans_currency_amt1(l_diff_raw_cost_tab(i),l_txn_currency_code_tab(i));
8939                 l_diff_burden_cost_tab(i) := pa_currency.round_trans_currency_amt1(l_diff_burden_cost_tab(i),l_txn_currency_code_tab(i));
8940                 l_diff_revenue_tab(i)  := pa_currency.round_trans_currency_amt1(l_diff_revenue_tab(i),l_txn_currency_code_tab(i));
8941             END LOOP;
8942 
8943              g_stage := 'Update_rounding_diff_bl:102';
8944             print_msg('Updating pa_budget_line last line with the rounding difference amount');
8945 			print_msg('Total number of resource assignments with the rounding difference amount : '||l_resource_assignment_tab.COUNT);
8946             FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
8947             UPDATE  pa_budget_lines tmp
8948                         SET tmp.txn_raw_cost = 	DECODE((nvl(tmp.txn_raw_cost,0)+NVL(l_diff_raw_cost_tab(i),0)),0,NULL
8949                                                                         ,(nvl(tmp.txn_raw_cost,0)+NVL(l_diff_raw_cost_tab(i),0)))
8950                         ,tmp.txn_burdened_cost = DECODE((nvl(tmp.txn_burdened_cost,0)+NVL(l_diff_burden_cost_tab(i),0)),0,NULL
8951                                                       ,(nvl(tmp.txn_burdened_cost,0)+NVL(l_diff_burden_cost_tab(i),0)))
8952                         ,tmp.txn_revenue = DECODE((nvl(tmp.txn_revenue,0)+NVL(l_diff_revenue_tab(i),0)),0,NULL
8953                                                                           ,(nvl(tmp.txn_revenue,0)+NVL(l_diff_revenue_tab(i),0)))
8954                         ,tmp.attribute15 = 'RoundingDiscrepancyLine'
8955                         WHERE tmp.resource_assignment_id = l_resource_assignment_tab(i)
8956 						AND   tmp.budget_version_id = p_budget_version_id
8957                         AND   tmp.txn_currency_code = l_txn_currency_code_tab(i)
8958                         AND   tmp.start_date = l_start_date_tab(i)
8959                         AND   (NVL(l_diff_raw_cost_tab(i),0) <> 0 OR NVL(l_diff_burden_cost_tab(i),0) <> 0 OR NVL(l_diff_revenue_tab(i),0) <> 0);
8960 
8961             g_stage := 'Update_rounding_diff_bl:103';
8962             --print_msg('Number of lines updated['||sql%rowcount||']');
8963         END IF;
8964 
8965       x_return_status := l_return_status;
8966       x_msg_count     := l_msg_count;
8967       x_msg_data  := l_msg_data;
8968       g_stage := 'Update_rounding_diff_bl:104';
8969       -- reset error stack
8970       IF p_pa_debug_mode = 'Y' Then
8971        	print_msg('End of Update_rounding_diff_bl API return Sts['||x_return_status||']');
8972              pa_debug.reset_err_stack;
8973       End If;
8974 
8975     EXCEPTION
8976          WHEN OTHERS THEN
8977                 print_msg('Failed in Update_rounding_diff_bl API ['||sqlcode||sqlerrm);
8978                 x_return_status := 'U';
8979                 x_msg_data := sqlcode||sqlerrm;
8980                 fnd_msg_pub.add_exc_msg
8981                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
8982                  ,p_procedure_name => 'Update_rounding_diff_bl' );
8983                 print_msg('Failed in Update_rounding_diff_bl substr(SQLERRM,1,240) => '|| substr(SQLERRM,1,240));
8984         IF p_pa_debug_mode = 'Y' Then
8985             pa_debug.reset_err_stack;
8986         End If;
8987          RAISE;
8988     END Update_rounding_diff_bl;
8989 
8990 
8991     /* This API will inserts the bulk exceptions records into tmp1 table
8992     * later this tmp1 table will be used for populating tmp2 table with budget line
8993     * details in bulk
8994     */
8995     PROCEDURE Populate_blkExcpRecs
8996                         (p_budget_version_id            IN Number
8997                         ,p_err_error_code_tab           IN pa_plsql_datatypes.char30TabTyp
8998                         ,p_err_budget_line_id_tab       IN pa_plsql_datatypes.NumTabTyp
8999                         ,p_err_raId_tab                 IN pa_plsql_datatypes.NumTabTyp
9000                         ,p_err_txn_cur_tab              IN pa_plsql_datatypes.char30TabTyp
9001                         ,p_err_sdate_tab                IN pa_plsql_datatypes.DateTabTyp
9002                         ,p_err_quantity_tab             IN pa_plsql_datatypes.NumTabTyp
9003                         ,p_err_cost_rate_tab            IN pa_plsql_datatypes.NumTabTyp
9004                         ,p_err_cost_rate_ovr_tab        IN pa_plsql_datatypes.NumTabTyp
9005                         ,p_err_burden_rate_tab          IN pa_plsql_datatypes.NumTabTyp
9006                         ,p_err_burden_rate_ovr_tab      IN pa_plsql_datatypes.NumTabTyp
9007                         ,p_err_compiled_set_id_tab      IN pa_plsql_datatypes.NumTabTyp
9008                         ,p_err_bill_rate_tab            IN pa_plsql_datatypes.NumTabTyp
9009                         ,p_err_bill_rate_ovr_tab        IN pa_plsql_datatypes.NumTabTyp
9010                         ,p_err_markup_percent_tab       IN pa_plsql_datatypes.NumTabTyp
9011                         ,p_err_cost_rejection_tab       IN pa_plsql_datatypes.char30TabTyp
9012                         ,p_err_revenue_rejection_tab    IN pa_plsql_datatypes.char30TabTyp
9013                         ,p_err_burden_rejection_tab     IN pa_plsql_datatypes.char30TabTyp
9014                         ,p_err_pfc_cur_rejection_tab    IN pa_plsql_datatypes.char30TabTyp
9015                         ,p_err_pc_cur_rejection_tab     IN pa_plsql_datatypes.char30TabTyp
9016                         ,x_return_status                OUT NOCOPY VARCHAR2
9017                         ) IS
9018     BEGIN
9019         x_return_status := 'S';
9020         print_msg('Entered Populate_blkExcpRecs API');
9021         DELETE FROM PA_FP_SPREAD_CALC_TMP1;
9022         FORALL i IN p_err_error_code_tab.FIRST .. p_err_error_code_tab.LAST
9023             INSERT INTO PA_FP_SPREAD_CALC_TMP1 tmp
9024         (tmp.budget_line_id
9025          ,tmp.budget_version_id
9026                  ,tmp.resource_assignment_id
9027                  ,tmp.txn_currency_code
9028                  ,tmp.start_date
9029                  ,tmp.quantity
9030                  ,tmp.cost_rate
9031                  ,tmp.cost_rate_override
9032                  ,tmp.burden_cost_rate
9033                  ,tmp.burden_cost_rate_override
9034                  ,tmp.cost_ind_compiled_set_id
9035                  ,tmp.bill_rate
9036                  ,tmp.bill_rate_override
9037                  ,tmp.bill_markup_percentage
9038                  ,tmp.cost_rejection_code
9039                  ,tmp.revenue_rejection_code
9040                  ,tmp.burden_rejection_code
9041                  ,tmp.pfc_cur_conv_rejection_code
9042                  ,tmp.pc_cur_conv_rejection_code
9043         )
9044             SELECT p_err_budget_line_id_tab(i)
9045          ,p_budget_version_id
9046                  ,p_err_raId_tab(i)
9047                  ,p_err_txn_cur_tab(i)
9048                  ,p_err_sdate_tab(i)
9049                  ,p_err_quantity_tab(i)
9050                  ,p_err_cost_rate_tab(i)
9051                  ,p_err_cost_rate_ovr_tab(i)
9052                  ,p_err_burden_rate_tab(i)
9053                  ,p_err_burden_rate_ovr_tab(i)
9054                  ,p_err_compiled_set_id_tab(i)
9055                  ,p_err_bill_rate_tab(i)
9056                  ,p_err_bill_rate_ovr_tab(i)
9057                  ,p_err_markup_percent_tab(i)
9058                  ,p_err_cost_rejection_tab(i)
9059                  ,p_err_revenue_rejection_tab(i)
9060                  ,p_err_burden_rejection_tab(i)
9061                  ,p_err_pfc_cur_rejection_tab(i)
9062                  ,p_err_pc_cur_rejection_tab(i)
9063         FROM DUAL
9064         WHERE p_err_error_code_tab(i) = 1 ;
9065          print_msg('Number of rows inserted ['||sql%rowcount||']');
9066             print_msg('Leaving populate spread calc tmp1 API with retSts['||x_return_status||']');
9067 
9068     EXCEPTION
9069             WHEN OTHERS THEN
9070                     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9071                     fnd_msg_pub.add_exc_msg
9072                     ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
9073                     ,p_procedure_name => 'Populate_blkExcpRecs' );
9074                     print_msg('Exception from Populate_blkExcpRecs ['||substr(SQLERRM,1,240));
9075                     RAISE;
9076 
9077     END Populate_blkExcpRecs;
9078 
9079     /* This API will populate exisiting budget line details(Dup val on index records) into
9080     * into tmp2 table. Later this table will be used for bulk update of budget lines
9081     * and rollup tmp tables
9082     */
9083     PROCEDURE Populate_ExistingBlRecs
9084                         (p_budget_version_id            IN Number
9085                         ,x_return_status                OUT NOCOPY Varchar2
9086                         ) IS
9087     BEGIN
9088             x_return_status := 'S';
9089         print_msg('Entered Populate_ExistingBlRecs API');
9090             DELETE FROM PA_FP_SPREAD_CALC_TMP2;
9091                 INSERT INTO PA_FP_SPREAD_CALC_TMP2 tmp
9092                 (tmp.budget_line_id
9093                  ,tmp.budget_version_id
9094                  ,tmp.resource_assignment_id
9095                  ,tmp.txn_currency_code
9096                  ,tmp.start_date
9097                  ,tmp.quantity
9098                  ,tmp.cost_rate
9099                  ,tmp.cost_rate_override
9100                  ,tmp.burden_cost_rate
9101                  ,tmp.burden_cost_rate_override
9102                  ,tmp.system_reference_num1  --tmp.compiled_set_id
9103                  ,tmp.bill_rate
9104                  ,tmp.bill_rate_override
9105                  ,tmp.bill_markup_percentage
9106                  ,tmp.system_reference_var1  --tmp.cost_rejection_code
9107                  ,tmp.system_reference_var2  --tmp.revenue_rejection_code
9108                  ,tmp.system_reference_var3  --tmp.burden_rejection_code
9109                  ,tmp.system_reference_var4  --tmp.pfc_cur_conv_rejection_code
9110                  ,tmp.system_reference_var5  --tmp.pc_cur_conv_rejection_code
9111              ,tmp.project_currency_code
9112              ,tmp.projfunc_currency_code
9113                 )
9114             SELECT bl.budget_line_id
9115                  ,bl.budget_version_id
9116                  ,bl.resource_assignment_id
9117                  ,bl.txn_currency_code
9118                  ,bl.start_date
9119                  ,bl.quantity
9120                  ,bl.txn_standard_cost_rate
9121                  ,bl.txn_cost_rate_override
9122                  ,bl.burden_cost_rate
9123                  ,bl.burden_cost_rate_override
9124                  ,bl.cost_ind_compiled_set_id
9125                  ,bl.txn_standard_bill_rate
9126                  ,bl.txn_bill_rate_override
9127                  ,bl.txn_markup_percent
9128                  ,bl.cost_rejection_code
9129                  ,bl.revenue_rejection_code
9130                  ,bl.burden_rejection_code
9131                  ,bl.pfc_cur_conv_rejection_code
9132                  ,bl.pc_cur_conv_rejection_code
9133              ,bl.project_currency_code
9134              ,bl.projfunc_currency_code
9135                 FROM pa_budget_lines bl
9136                 WHERE bl.budget_version_id = p_budget_version_id
9137             AND EXISTS (select  null
9138             From pa_fp_spread_calc_tmp1 tmp1
9139             where tmp1.budget_version_id = p_budget_version_id
9140             and  tmp1.resource_assignment_id = bl.resource_assignment_id
9141             and  tmp1.txn_currency_code = bl.txn_currency_code
9142             and  tmp1.start_date = bl.start_date
9143             );
9144         print_msg('Number of lines inserted['||sql%Rowcount||']');
9145 
9146         /* Now store the existing budget line id on tmp1 table to read the values
9147         * from both tables */
9148         UPDATE pa_fp_spread_calc_tmp1 tmp1
9149         SET tmp1.system_reference_num1 = (select tmp2.budget_line_id
9150                       from pa_fp_spread_calc_tmp2 tmp2
9151                       where tmp2.budget_version_id = p_budget_version_id
9152                       and tmp2.resource_assignment_id = tmp1.resource_assignment_id
9153                       and  tmp2.txn_currency_code = tmp1.txn_currency_code
9154                       and  tmp2.start_date = tmp1.start_date
9155                      )
9156         WHERE tmp1.budget_version_id = p_budget_version_id;
9157         print_msg('Number of lines updated['||sql%Rowcount||']');
9158             print_msg('Leaving populate spread calc tmp2 API with retSts['||x_return_status||']');
9159 
9160     EXCEPTION
9161             WHEN OTHERS THEN
9162                     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9163                     fnd_msg_pub.add_exc_msg
9164                     ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
9165                     ,p_procedure_name => 'Populate_ExistingBlRecs' );
9166                     print_msg('Exception from Populate_ExistingBlRecs api['|| substr(SQLERRM,1,240));
9167                     RAISE;
9168 
9169     END Populate_ExistingBlRecs;
9170 
9171 BEGIN
9172 
9173         x_return_status := FND_API.G_RET_STS_SUCCESS;
9174         l_return_status := 'S';
9175     If p_pa_debug_mode = 'Y' Then
9176             pa_debug.init_err_stack('PA_FP_CALC_PLAN_PKG.BLK_update_budget_lines');
9177     End If;
9178 	IF P_PA_DEBUG_MODE = 'Y' Then
9179         print_msg('Entered PA_FP_CALC_PLAN_PKG.BLK_update_budget_lines');
9180 	End If;
9181         l_stage             := 4000;
9182     InitPlsqlTabs;
9183     OPEN Cur_RollupLines;
9184     FETCH Cur_RollupLines BULK COLLECT INTO
9185             l_bl_raId_tab
9186             ,l_bl_sDate_tab
9187         ,l_bl_edate_tab
9188         ,l_bl_period_name_tab
9189             ,l_bl_budget_line_id_tab
9190             ,l_bl_txn_curcode_tab
9191             ,l_bl_quantity_tab
9192             ,l_bl_pjfc_raw_cost_tab
9193         ,l_bl_pjfc_burden_cost_tab
9194         ,l_bl_pjfc_revenue_tab
9195         ,l_bl_cost_rejection_tab
9196         ,l_bl_rev_rejection_tab
9197         ,l_bl_burden_rejection_tab
9198         ,l_bl_pfc_cur_rejection_tab
9199         ,l_bl_pc_cur_rejection_tab
9200         ,l_bl_pfc_curcode_tab
9201             ,l_bl_pfc_cost_rate_type_tab
9202             ,l_bl_pfc_cost_exchng_rate_tab
9203             ,l_bl_pfc_cost_date_type_tab
9204             ,l_bl_pfc_cost_date_tab
9205             ,l_bl_pfc_rev_rate_type_tab
9206             ,l_bl_pfc_rev_exchange_rate_tab
9207             ,l_bl_pfc_rev_date_type_tab
9208             ,l_bl_pfc_rev_date_tab
9209             ,l_bl_pc_cur_code_tab
9210             ,l_bl_pc_cost_rate_type_tab
9211             ,l_bl_pc_cost_exchange_rate_tab
9212             ,l_bl_pc_cost_date_type_tab
9213             ,l_bl_pc_cost_date_tab
9214             ,l_bl_project_raw_cost_tab
9215             ,l_bl_project_burdened_cost_tab
9216             ,l_bl_pc_rev_rate_type_tab
9217             ,l_bl_pc_rev_exchange_rate_tab
9218             ,l_bl_pc_rev_date_type_tab
9219             ,l_bl_pc_rev_date_tab
9220             ,l_bl_project_revenue_tab
9221             ,l_bl_txn_raw_cost_tab
9222             ,l_bl_txn_burdened_cost_tab
9223             ,l_bl_txn_revenue_tab
9224             ,l_bl_init_quantity_tab
9225             ,l_bl_txn_init_raw_cost_tab
9226             ,l_bl_txn_init_burden_cost_tab
9227             ,l_bl_txn_init_revenue_tab
9228             ,l_bl_pfc_init_raw_cost_tab
9229             ,l_bl_pfc_init_burden_cost_tab
9230             ,l_bl_pfc_init_revenue_tab
9231             ,l_bl_pc_init_raw_cost_tab
9232             ,l_bl_pc_init_burden_cost_tab
9233             ,l_bl_pc_init_revenue_tab
9234             ,l_bl_markup_percentage_tab
9235             ,l_bl_bill_rate_tab
9236             ,l_bl_cost_rate_tab
9237             ,l_bl_cost_rate_override_tab
9238             ,l_bl_burden_cost_rate_tab
9239             ,l_bl_bill_rate_override_tab
9240             ,l_bl_burden_rate_override_tab
9241             ,l_bl_compiled_set_id_tab
9242         ,l_bl_version_type_tab
9243         ,l_bl_final_txn_cur_code_tab
9244         ,l_bl_CHANGE_REASON_CODE_tab
9245             ,l_bl_DESCRIPTION_tab
9246             ,l_bl_ATTRIBUTE_CATEGORY_tab
9247             ,l_bl_ATTRIBUTE1_tab
9248             ,l_bl_ATTRIBUTE2_tab
9249             ,l_bl_ATTRIBUTE3_tab
9250             ,l_bl_ATTRIBUTE4_tab
9251             ,l_bl_ATTRIBUTE5_tab
9252             ,l_bl_ATTRIBUTE6_tab
9253             ,l_bl_ATTRIBUTE7_tab
9254             ,l_bl_ATTRIBUTE8_tab
9255             ,l_bl_ATTRIBUTE9_tab
9256             ,l_bl_ATTRIBUTE10_tab
9257             ,l_bl_ATTRIBUTE11_tab
9258             ,l_bl_ATTRIBUTE12_tab
9259             ,l_bl_ATTRIBUTE13_tab
9260             ,l_bl_ATTRIBUTE14_tab
9261             ,l_bl_ATTRIBUTE15_tab
9262             ,l_bl_RAW_COST_SOURCE_tab
9263             ,l_bl_BURDENED_COST_SOURCE_tab
9264             ,l_bl_QUANTITY_SOURCE_tab
9265             ,l_bl_REVENUE_SOURCE_tab
9266             ,l_bl_PM_PRODUCT_CODE_tab
9267             ,l_bl_PM_LINE_REFERENCE_tab
9268             ,l_bl_CODE_COMBINATION_ID_tab
9269             ,l_bl_CCID_GEN_STATUS_CODE_tab
9270             ,l_bl_CCID_GEN_REJ_MESSAGE_tab
9271             ,l_bl_BORROWED_REVENUE_tab
9272             ,l_bl_TP_REVENUE_IN_tab
9273             ,l_bl_TP_REVENUE_OUT_tab
9274             ,l_bl_REVENUE_ADJ_tab
9275             ,l_bl_LENT_RESOURCE_COST_tab
9276             ,l_bl_TP_COST_IN_tab
9277             ,l_bl_TP_COST_OUT_tab
9278             ,l_bl_COST_ADJ_tab
9279             ,l_bl_UNASSIGNED_TIME_COST_tab
9280             ,l_bl_UTILIZATION_PERCENT_tab
9281             ,l_bl_UTILIZATION_HOURS_tab
9282             ,l_bl_UTILIZATION_ADJ_tab
9283             ,l_bl_CAPACITY_tab
9284             ,l_bl_HEAD_COUNT_tab
9285             ,l_bl_HEAD_COUNT_ADJ_tab
9286             ,l_bl_BUCKETING_PERIOD_CODE_tab
9287             ,l_bl_TXN_DISCOUNT_PERCENT_tab
9288             ,l_bl_TRANSFER_PRICE_RATE_tab
9289             ,l_bl_BL_CREATED_BY_tab
9290             ,l_bl_BL_CREATION_DATE_tab
9291 	    ,l_rate_base_flag_tab;
9292     CLOSE Cur_RollupLines;
9293 
9294     IF l_bl_budget_line_id_tab.COUNT > 0 THEN  --{
9295            <<NEW_BUDGET_LINE>>
9296 	IF P_PA_DEBUG_MODE = 'Y' Then
9297         print_msg('Entered NEW_BUDGET_LINE block');
9298 	End If;
9299         BEGIN
9300             /* Call the update reporting line by passing -ve amounts of the existsing budgetline
9301              * before update and +ve amounts of budget line after update. so that the delta passing to the reporting
9302              * will be always in synch with the budget lines
9303                      */
9304                 IF NVL(g_rollup_required_flag,'N') = 'Y'  THEN
9305             FOR blRec IN cur_blAmts LOOP
9306               IF blRec.budget_line_id is NOT NULL Then
9307                     --print_msg('Getting Budget line Amts for budget_line_id => '||to_char(blrec.budget_line_id));
9308                     l_stage := 4028;
9309                 --print_msg('Calling Add_Toreporting_Tabls api by old -ve amts of bl['||(blRec.quantity * -1)||']Cur['||blRec.txn_currency_code||']');
9310                 PA_FP_CALC_PLAN_PKG.Add_Toreporting_Tabls
9311                         (p_calling_module               => 'CALCULATE_API'
9312                         ,p_activity_code                => 'UPDATE'
9313                         ,p_budget_version_id            => p_budget_version_id
9314                         ,p_budget_line_id               => blRec.budget_line_id
9315                         ,p_resource_assignment_id       => blRec.resource_assignment_id
9316                         ,p_start_date                   => blRec.start_date
9317                         ,p_end_date                     => blRec.end_date
9318                         ,p_period_name                  => blRec.period_name
9319                         ,p_txn_currency_code            => blRec.txn_currency_code
9320                         ,p_quantity                     => blRec.quantity * -1
9321                         ,p_txn_raw_cost                 => blRec.txn_raw_cost * -1
9322                         ,p_txn_burdened_cost            => blRec.txn_burdened_cost * -1
9323                         ,p_txn_revenue                  => blRec.txn_revenue * -1
9324                         ,p_project_currency_code        => blRec.project_currency_code
9325                         ,p_project_raw_cost             => blRec.project_raw_cost * -1
9326                         ,p_project_burdened_cost        => blRec.project_burdened_cost * -1
9327                         ,p_project_revenue              => blRec.project_revenue * -1
9328                         ,p_projfunc_currency_code       => blRec.projfunc_currency_code
9329                         ,p_projfunc_raw_cost            => blRec.projfunc_raw_cost * -1
9330                         ,p_projfunc_burdened_cost       => blRec.projfunc_burdened_cost * -1
9331                         ,p_projfunc_revenue             => blRec.projfunc_revenue * -1
9332 			,p_rep_line_mode               => 'REVERSAL'
9333                 	,x_msg_data                     => l_rep_msg_data
9334                         ,x_return_status                => l_rep_return_status
9335                         );
9336                 --print_msg('After Calling update_reporting_from_b_lines for BdLine['||blRec.budget_line_id||']');
9337                 --print_msg('RtSts['||l_rep_return_status||']x_msgData['||l_rep_msg_data||']');
9338                     IF l_rep_return_status <> 'S' Then
9339                     l_error_msg_code := l_rep_msg_data;
9340                     EXIT;
9341                 END IF;
9342                    END IF;
9343              END LOOP;
9344           END IF ; -- g_rollup requried = Y
9345 
9346             /* update budget line with the new currency and amounts If there budget line is already with
9347         * the same currency the update will fail with duplicate value on index.
9348         * in such case update the existing budget line and overrwrite all the amounts
9349         * with the new bugdetlines
9350         */
9351        /* Bug # 14359804 :Reverted the code fix done for Bug 13981795  */
9352 
9353         --print_msg('Bulk updating budget lines');
9354         /* Now Bulk Update the budget Lines */
9355         FORALL i IN l_bl_budget_line_id_tab.FIRST .. l_bl_budget_line_id_tab.LAST  SAVE EXCEPTIONS
9356             UPDATE pa_budget_lines bl
9357         SET bl.txn_currency_code             = l_bl_txn_curcode_tab(i)
9358                  ,bl.quantity                        = l_bl_quantity_tab(i)
9359 		 /* Bug fix:4900436 */
9360                  ,bl.display_quantity                = decode(g_wp_version_flag,'Y',l_bl_quantity_tab(i)
9361                                                          ,Decode(l_rate_base_flag_tab(i),'N',NULL,l_bl_quantity_tab(i)))
9362                  /* End of bug fix:4900436 */
9363                  ,bl.raw_cost                        = l_bl_pjfc_raw_cost_tab(i)
9364                  ,bl.burdened_cost                   = l_bl_pjfc_burden_cost_tab(i)
9365                  ,bl.revenue                         = l_bl_pjfc_revenue_tab(i)
9366                  ,bl.cost_rejection_code             = l_bl_cost_rejection_tab(i)
9367                  ,bl.revenue_rejection_code          = l_bl_rev_rejection_tab(i)
9368                  ,bl.burden_rejection_code           = l_bl_burden_rejection_tab(i)
9369                  ,bl.pfc_cur_conv_rejection_code     = l_bl_pfc_cur_rejection_tab(i)
9370                  ,bl.pc_cur_conv_rejection_code      = l_bl_pc_cur_rejection_tab(i)
9371                  ,bl.projfunc_currency_code          = l_bl_pfc_curcode_tab(i)
9372                  ,bl.projfunc_cost_rate_type         = l_bl_pfc_cost_rate_type_tab(i)
9373                  ,bl.projfunc_cost_exchange_rate     = l_bl_pfc_cost_exchng_rate_tab(i)
9374                  ,bl.projfunc_cost_rate_date_type    = l_bl_pfc_cost_date_type_tab(i)
9375                  ,bl.projfunc_cost_rate_date         = l_bl_pfc_cost_date_tab(i)
9376                  ,bl.projfunc_rev_rate_type          = l_bl_pfc_rev_rate_type_tab(i)
9377                  ,bl.projfunc_rev_exchange_rate      = l_bl_pfc_rev_exchange_rate_tab(i)
9378                  ,bl.projfunc_rev_rate_date_type     = l_bl_pfc_rev_date_type_tab(i)
9379                  ,bl.projfunc_rev_rate_date          = l_bl_pfc_rev_date_tab(i)
9380                  ,bl.project_currency_code           = l_bl_pc_cur_code_tab(i)
9381                  ,bl.project_cost_rate_type          = l_bl_pc_cost_rate_type_tab(i)
9382                  ,bl.project_cost_exchange_rate      = l_bl_pc_cost_exchange_rate_tab(i)
9383                  ,bl.project_cost_rate_date_type     = l_bl_pc_cost_date_type_tab(i)
9384                  ,bl.project_cost_rate_date          = l_bl_pc_cost_date_tab(i)
9385                  ,bl.project_raw_cost                = l_bl_project_raw_cost_tab(i)
9386                  ,bl.project_burdened_cost           = l_bl_project_burdened_cost_tab(i)
9387                  ,bl.project_rev_rate_type           = l_bl_pc_rev_rate_type_tab(i)
9388                  ,bl.project_rev_exchange_rate       = l_bl_pc_rev_exchange_rate_tab(i)
9389                  ,bl.project_rev_rate_date_type      = l_bl_pc_rev_date_type_tab(i)
9390                  ,bl.project_rev_rate_date           = l_bl_pc_rev_date_tab(i)
9391                  ,bl.project_revenue                 = l_bl_project_revenue_tab(i)
9392                  ,bl.txn_raw_cost                    = l_bl_txn_raw_cost_tab(i)
9393                  ,bl.txn_burdened_cost               = l_bl_txn_burdened_cost_tab(i)
9394                  ,bl.txn_revenue                     = l_bl_txn_revenue_tab(i)
9395                  ,bl.txn_markup_percent              = l_bl_markup_percentage_tab(i)
9396                  ,bl.txn_standard_bill_rate          = l_bl_bill_rate_tab(i)
9397                  ,bl.txn_standard_cost_rate          = l_bl_cost_rate_tab(i)
9398                  ,bl.txn_cost_rate_override          = l_bl_cost_rate_override_tab(i)
9399                  ,bl.burden_cost_rate                = l_bl_burden_cost_rate_tab(i)
9400                  ,bl.txn_bill_rate_override          = l_bl_bill_rate_override_tab(i)
9401                  ,bl.burden_cost_rate_override       = l_bl_burden_rate_override_tab(i)
9402                  ,bl.cost_ind_compiled_set_id        = l_bl_compiled_set_id_tab(i)
9403                  ,bl.last_update_date                = l_sysdate           ---sysdate
9404                  ,bl.last_updated_by                 = l_last_updated_by   ---fnd_global.user_id
9405                  ,bl.last_update_login               = l_last_login_id     ---fnd_global.login_id
9406                  ,bl.CHANGE_REASON_CODE = l_bl_CHANGE_REASON_CODE_tab(i)     /*Bug4224464 Removed the nvl checks from dff's
9407                   ,change reason code, PM_PRODUCT_CODE, PM_BUDGET_LINE_REFERENCE, and description columns. The cursor
9408                   definitions in copy_blattributes have been modified to handle the G_MISS_XXX values for these columns.*/
9409                  ,bl.DESCRIPTION = l_bl_DESCRIPTION_tab(i)
9410                  ,bl.ATTRIBUTE_CATEGORY = l_bl_ATTRIBUTE_CATEGORY_tab(i)
9411                  ,bl.ATTRIBUTE1 = l_bl_ATTRIBUTE1_tab(i)
9412                  ,bl.ATTRIBUTE2 = l_bl_ATTRIBUTE2_tab(i)
9413                  ,bl.ATTRIBUTE3 = l_bl_ATTRIBUTE3_tab(i)
9414                  ,bl.ATTRIBUTE4 = l_bl_ATTRIBUTE4_tab(i)
9415                  ,bl.ATTRIBUTE5 = l_bl_ATTRIBUTE5_tab(i)
9416                  ,bl.ATTRIBUTE6 = l_bl_ATTRIBUTE6_tab(i)
9417                  ,bl.ATTRIBUTE7 = l_bl_ATTRIBUTE7_tab(i)
9418                  ,bl.ATTRIBUTE8 = l_bl_ATTRIBUTE8_tab(i)
9419                  ,bl.ATTRIBUTE9 = l_bl_ATTRIBUTE9_tab(i)
9420                  ,bl.ATTRIBUTE10 = l_bl_ATTRIBUTE10_tab(i)
9421                  ,bl.ATTRIBUTE11 = l_bl_ATTRIBUTE11_tab(i)
9422                  ,bl.ATTRIBUTE12 = l_bl_ATTRIBUTE12_tab(i)
9423                  ,bl.ATTRIBUTE13 = l_bl_ATTRIBUTE13_tab(i)
9424                  ,bl.ATTRIBUTE14 = l_bl_ATTRIBUTE14_tab(i)
9425                  ,bl.ATTRIBUTE15 = l_bl_ATTRIBUTE15_tab(i)
9426                  ,bl.RAW_COST_SOURCE = nvl(l_bl_RAW_COST_SOURCE_tab(i),bl.RAW_COST_SOURCE)
9427                  ,bl.BURDENED_COST_SOURCE = nvl(l_bl_BURDENED_COST_SOURCE_tab(i),bl.BURDENED_COST_SOURCE)
9428                  ,bl.QUANTITY_SOURCE = nvl(l_bl_QUANTITY_SOURCE_tab(i),bl.QUANTITY_SOURCE)
9429                  ,bl.REVENUE_SOURCE = nvl(l_bl_REVENUE_SOURCE_tab(i),bl.REVENUE_SOURCE)
9430                  ,bl.PM_PRODUCT_CODE = l_bl_PM_PRODUCT_CODE_tab(i)
9431                  ,bl.PM_BUDGET_LINE_REFERENCE = l_bl_PM_LINE_REFERENCE_tab(i)
9432                  ,bl.CODE_COMBINATION_ID = nvl(l_bl_CODE_COMBINATION_ID_tab(i),bl.CODE_COMBINATION_ID)
9433                  ,bl.CCID_GEN_STATUS_CODE = nvl(l_bl_CCID_GEN_STATUS_CODE_tab(i),bl.CCID_GEN_STATUS_CODE)
9434                  ,bl.CCID_GEN_REJ_MESSAGE = nvl(l_bl_CCID_GEN_REJ_MESSAGE_tab(i),bl.CCID_GEN_REJ_MESSAGE)
9435                  ,bl.BORROWED_REVENUE = nvl(l_bl_BORROWED_REVENUE_tab(i),bl.BORROWED_REVENUE)
9436                  ,bl.TP_REVENUE_IN = nvl(l_bl_TP_REVENUE_IN_tab(i),bl.TP_REVENUE_IN)
9437                  ,bl.TP_REVENUE_OUT = nvl(l_bl_TP_REVENUE_OUT_tab(i),bl.TP_REVENUE_OUT)
9438                  ,bl.REVENUE_ADJ  = nvl(l_bl_REVENUE_ADJ_tab(i),bl.REVENUE_ADJ)
9439                  ,bl.LENT_RESOURCE_COST = nvl(l_bl_LENT_RESOURCE_COST_tab(i),bl.LENT_RESOURCE_COST)
9440                  ,bl.TP_COST_IN   = nvl(l_bl_TP_COST_IN_tab(i),bl.TP_COST_IN)
9441                  ,bl.TP_COST_OUT = nvl(l_bl_TP_COST_OUT_tab(i),bl.TP_COST_OUT)
9442                  ,bl.COST_ADJ = nvl(l_bl_COST_ADJ_tab(i),bl.COST_ADJ)
9443                  ,bl.UNASSIGNED_TIME_COST = nvl(l_bl_UNASSIGNED_TIME_COST_tab(i),bl.UNASSIGNED_TIME_COST)
9444                  ,bl.UTILIZATION_PERCENT = nvl(l_bl_UTILIZATION_PERCENT_tab(i),bl.UTILIZATION_PERCENT)
9445                  ,bl.UTILIZATION_HOURS = nvl(l_bl_UTILIZATION_HOURS_tab(i),bl.UTILIZATION_HOURS)
9446                  ,bl.UTILIZATION_ADJ = nvl(l_bl_UTILIZATION_ADJ_tab(i),bl.UTILIZATION_ADJ)
9447                  ,bl.CAPACITY = nvl(l_bl_CAPACITY_tab(i),bl.CAPACITY)
9448                  ,bl.HEAD_COUNT = nvl(l_bl_HEAD_COUNT_tab(i),bl.HEAD_COUNT)
9449                  ,bl.HEAD_COUNT_ADJ =nvl(l_bl_HEAD_COUNT_ADJ_tab(i),bl.HEAD_COUNT_ADJ)
9450                  ,bl.BUCKETING_PERIOD_CODE = nvl(l_bl_BUCKETING_PERIOD_CODE_tab(i),bl.BUCKETING_PERIOD_CODE)
9451                  ,bl.TXN_DISCOUNT_PERCENTAGE = nvl(l_bl_TXN_DISCOUNT_PERCENT_tab(i),bl.TXN_DISCOUNT_PERCENTAGE)
9452                  ,bl.TRANSFER_PRICE_RATE = nvl(l_bl_TRANSFER_PRICE_RATE_tab(i),bl.TRANSFER_PRICE_RATE)
9453                  ,bl.CREATED_BY   = nvl(l_bl_BL_CREATED_BY_tab(i),bl.CREATED_BY)
9454                  ,bl.CREATION_DATE   = nvl(l_bl_BL_CREATION_DATE_tab(i),bl.CREATION_DATE)
9455             WHERE bl.budget_line_id  = l_bl_budget_line_id_tab(i);
9456         /* Bug fix: returning clause is taking more time performance hit so commenting it out
9457         RETURNING bl.budget_line_id
9458                         ,bl.txn_raw_cost
9459                         ,bl.txn_burdened_cost
9460                         ,bl.txn_revenue
9461                         ,bl.project_raw_cost
9462                         ,bl.project_burdened_cost
9463                         ,bl.project_revenue
9464                         ,bl.raw_cost      --projfunc_raw_cost
9465                         ,bl.burdened_cost --projfunc_burdened_cost
9466                         ,bl.revenue       --projfunc_revenue
9467                         ,bl.quantity
9468                         ,bl.start_date
9469                         ,bl.end_date
9470                         ,bl.period_name
9471                         ,bl.resource_assignment_id
9472                         ,bl.txn_currency_code
9473                         ,bl.project_currency_code
9474                         ,bl.projfunc_currency_code
9475                         ,bl.cost_rejection_code
9476                         ,bl.burden_rejection_code
9477                         ,bl.revenue_rejection_code
9478                         ,bl.pfc_cur_conv_rejection_code
9479                         ,bl.pc_cur_conv_rejection_code
9480         BULK COLLECT INTO
9481                         l_rep_budget_line_id_tab
9482                         ,l_rep_txn_raw_cost_tab
9483                         ,l_rep_txn_burdened_cost_tab
9484                         ,l_rep_txn_revenue_tab
9485                         ,l_rep_prj_raw_cost_tab
9486                         ,l_rep_prj_burdened_cost_tab
9487                         ,l_rep_prj_revenue_tab
9488                         ,l_rep_pfc_raw_cost_tab
9489                         ,l_rep_pfc_burdened_cost_tab
9490                         ,l_rep_pfc_revenue_tab
9491                         ,l_rep_quantity_tab
9492                         ,l_rep_start_date_tab
9493                         ,l_rep_end_date_tab
9494                         ,l_rep_period_name_tab
9495                         ,l_rep_resAss_id_tab
9496                         ,l_rep_txn_curr_code_tab
9497                         ,l_rep_prj_curr_code_tab
9498                         ,l_rep_pfc_curr_code_tab
9499                         ,l_rep_cost_rejection_tab
9500                         ,l_rep_burden_rejection_tab
9501                         ,l_rep_revenue_rejection_tab
9502                         ,l_rep_pfc_cur_rejection_tab
9503                         ,l_rep_pc_cur_rejection_tab ;
9504          ***/
9505         --print_msg('Number of rows bulk updated ['||sql%rowcount||']');
9506         /* now pass the +ve values for the updated budget lines based on the processed flag from the tmp table */
9507                 IF NVL(g_rollup_required_flag,'N') = 'Y'  THEN
9508                   FOR blRec IN cur_blAmts LOOP
9509                    IF blRec.budget_line_id is NOT NULL Then
9510                        --print_msg('Getting Budget line Amts for budget_line_id => '||to_char(blrec.budget_line_id));
9511                        l_stage := 4022;
9512                        --print_msg('Calling Add_Toreporting_Tabls api by sending old +ve amts of bl['||(blRec.quantity)||']Cur['||blRec.txn_currency_code||']');
9513                        PA_FP_CALC_PLAN_PKG.Add_Toreporting_Tabls
9514                        (p_calling_module               => 'CALCULATE_API'
9515                        ,p_activity_code                => 'UPDATE'
9516                        ,p_budget_version_id            => p_budget_version_id
9517                        ,p_budget_line_id               => blRec.budget_line_id
9518                        ,p_resource_assignment_id       => blRec.resource_assignment_id
9519                        ,p_start_date                   => blRec.start_date
9520                        ,p_end_date                     => blRec.end_date
9521                        ,p_period_name                  => blRec.period_name
9522                        ,p_txn_currency_code            => blRec.txn_currency_code
9523                        ,p_quantity                     => blRec.quantity
9524                        ,p_txn_raw_cost                 => blRec.txn_raw_cost
9525                        ,p_txn_burdened_cost            => blRec.txn_burdened_cost
9526                        ,p_txn_revenue                  => blRec.txn_revenue
9527                        ,p_project_currency_code        => blRec.project_currency_code
9528                        ,p_project_raw_cost             => blRec.project_raw_cost
9529                        ,p_project_burdened_cost        => blRec.project_burdened_cost
9530                        ,p_project_revenue              => blRec.project_revenue
9531                        ,p_projfunc_currency_code       => blRec.projfunc_currency_code
9532                        ,p_projfunc_raw_cost            => blRec.projfunc_raw_cost
9533                        ,p_projfunc_burdened_cost       => blRec.projfunc_burdened_cost
9534                        ,p_projfunc_revenue             => blRec.projfunc_revenue
9535 		       ,p_rep_line_mode               => 'POSITIVE_ENTRY'
9536                        ,x_msg_data                     => l_rep_msg_data
9537                        ,x_return_status                => l_rep_return_status
9538                        );
9539                        --print_msg('After Calling update_reporting_from_b_lines for BdLine['||blRec.budget_line_id||']');
9540                        --print_msg('RtSts['||l_rep_return_status||']x_msgData['||l_rep_msg_data||']');
9541                        IF l_rep_return_status <> 'S' Then
9542                             l_error_msg_code := l_rep_msg_data;
9543                             EXIT;
9544                        END IF;
9545                     END IF;
9546                    END LOOP;
9547                 END IF ; -- g_rollup requried = Y
9548         /* Note If there is any dup val on index exception then control goes to exception portion
9549         * so the same call has to make in the exception portion alos */
9550             --print_msg('End of bulk budget Lines update ');
9551 
9552         EXCEPTION
9553           WHEN OTHERS THEN
9554         print_msg('Entered bulk exception portion');
9555         /* Now process the exceptions lines one-by-one */
9556         l_exception_return_status := 'S';
9557             v_NumErrors := SQL%BULK_EXCEPTIONS.COUNT;
9558         l_x_cntr := 0;
9559         FOR v_Count IN 1..v_NumErrors LOOP   --{
9560             l_x_cntr := l_x_cntr +1;
9561                 v_index_position  :=SQL%BULK_EXCEPTIONS(v_Count).error_index;
9562                 v_error_code      :=SQL%BULK_EXCEPTIONS(v_Count).error_code;
9563             l_err_error_code_tab(l_x_cntr)  := SQL%BULK_EXCEPTIONS(v_Count).error_code;
9564             l_err_budget_line_id_tab(l_x_cntr)  := l_bl_budget_line_id_tab(v_index_position);
9565             l_err_raId_tab(l_x_cntr)        := l_bl_raId_Tab(v_index_position);
9566             l_err_txn_cur_tab(l_x_cntr)     := l_bl_txn_curcode_tab(v_index_position);
9567             l_err_sdate_tab(l_x_cntr)       := l_bl_sdate_tab(v_index_position);
9568             l_err_quantity_tab(l_x_cntr)    := l_bl_quantity_tab(v_index_position);
9569             l_err_cost_rate_tab(l_x_cntr)   := l_bl_cost_rate_tab(v_index_position);
9570             l_err_cost_rate_ovr_tab(l_x_cntr)   := l_bl_cost_rate_override_tab(v_index_position);
9571             l_err_burden_rate_tab(l_x_cntr)     := l_bl_burden_cost_rate_tab(v_index_position);
9572             l_err_burden_rate_ovr_tab(l_x_cntr) := l_bl_burden_rate_override_tab(v_index_position);
9573             l_err_compiled_set_id_tab(l_x_cntr) := l_bl_compiled_set_id_tab(v_index_position);
9574             l_err_bill_rate_tab(l_x_cntr)   := l_bl_bill_rate_tab(v_index_position);
9575             l_err_bill_rate_ovr_tab(l_x_cntr)   := l_bl_bill_rate_override_tab(v_index_position);
9576             l_err_markup_percent_tab(l_x_cntr)  := l_bl_markup_percentage_tab(v_index_position);
9577             l_err_cost_rejection_tab(l_x_cntr)  := l_bl_cost_rejection_tab(v_index_position);
9578             l_err_revenue_rejection_tab(l_x_cntr) :=l_bl_rev_rejection_tab(v_index_position);
9579             l_err_burden_rejection_tab(l_x_cntr) := l_bl_burden_rejection_tab(v_index_position);
9580             l_err_pfc_cur_rejection_tab(l_x_cntr) := l_bl_pfc_cur_rejection_tab(v_index_position);
9581             l_err_pc_cur_rejection_tab(l_x_cntr) := l_bl_pc_cur_rejection_tab(v_index_position);
9582 
9583                 If v_error_code <> 1 then -- 1 means unique constraint voilation.
9584             l_exception_return_status := 'U';
9585             l_return_status := 'U';
9586             x_return_status := l_exception_return_status;
9587             l_error_msg_code := SQLERRM(0 - SQL%BULK_EXCEPTIONS(v_Count).error_code);
9588             -- add error message to stack and finall raise the error
9589             PA_UTILS.ADD_MESSAGE
9590                         (p_app_short_name => 'PA'
9591             ,p_msg_name       => v_error_code||'-'||l_error_msg_code
9592                     ,p_token1         => 'G_PROJECT_NAME'
9593                     ,p_value1         => g_project_name
9594                     ,p_token2         => 'G_RESOURCE_ASSIGNMENT_ID'
9595                     ,p_value2         => l_err_raId_tab(l_x_cntr)
9596                     ,p_token3         => 'G_TXN_CURRENCY_CODE'
9597                     ,p_value3         => l_err_txn_cur_tab(l_x_cntr)
9598             ,p_token4         => 'G_BUDGET_LINE_ID'
9599             ,p_value4         => l_err_budget_line_id_tab(l_x_cntr)
9600             );
9601             End If;
9602 
9603         END LOOP; --}
9604         END ;
9605 
9606         /* Now process the exception records in bulk */
9607        <<EXISTING_BUDGET_LINES>>
9608         IF l_exception_return_status = 'S' AND l_err_error_code_tab.COUNT > 0 THEN --{
9609 	IF P_PA_DEBUG_MODE = 'Y' Then
9610         print_msg('Entered EXISTING_BUDGET_LINES block:NUM ROWS UPTD['||l_rep_budget_line_id_tab.COUNT||']REJECTED['||l_err_budget_line_id_tab.COUNT||']');
9611 	End If;
9612 
9613         /*We should pass the +ve values for the updated rows. having returning clause in the bulk update returns the
9614                  * rejected records with the updated values, so the returning clause cannot be used. In order to pass the correct bl values
9615                  * update the rollup tmp processed flag with N for the rejected records */
9616         FORALL i IN l_err_error_code_tab.FIRST .. l_err_error_code_tab.LAST
9617         UPDATE PA_FP_ROLLUP_TMP tmp
9618         SET tmp.processed_flag = 'N'
9619         WHERE tmp.budget_line_id = l_err_budget_line_id_tab(i);
9620                 /* now pass the +ve values for the updated budget lines based on the processed flag from the tmp table */
9621                 IF NVL(g_rollup_required_flag,'N') = 'Y'  THEN
9622                   FOR blRec IN cur_blAmts LOOP
9623                    IF blRec.budget_line_id is NOT NULL Then
9624                        --print_msg('Getting Budget line Amts for budget_line_id => '||to_char(blrec.budget_line_id));
9625                        l_stage := 4028;
9626                        --print_msg('Calling Add_Toreporting_Tabls api by sending old +ve amts of bl['||(blRec.quantity)||']Cur['||blRec.txn_currency_code||']');
9627                        PA_FP_CALC_PLAN_PKG.Add_Toreporting_Tabls
9628                        (p_calling_module               => 'CALCULATE_API'
9629                        ,p_activity_code                => 'UPDATE'
9630                        ,p_budget_version_id            => p_budget_version_id
9631                        ,p_budget_line_id               => blRec.budget_line_id
9632                        ,p_resource_assignment_id       => blRec.resource_assignment_id
9633                        ,p_start_date                   => blRec.start_date
9634                        ,p_end_date                     => blRec.end_date
9635                        ,p_period_name                  => blRec.period_name
9636                        ,p_txn_currency_code            => blRec.txn_currency_code
9637                        ,p_quantity                     => blRec.quantity
9638                        ,p_txn_raw_cost                 => blRec.txn_raw_cost
9639                        ,p_txn_burdened_cost            => blRec.txn_burdened_cost
9640                        ,p_txn_revenue                  => blRec.txn_revenue
9641                        ,p_project_currency_code        => blRec.project_currency_code
9642                        ,p_project_raw_cost             => blRec.project_raw_cost
9643                        ,p_project_burdened_cost        => blRec.project_burdened_cost
9644                        ,p_project_revenue              => blRec.project_revenue
9645                        ,p_projfunc_currency_code       => blRec.projfunc_currency_code
9646                        ,p_projfunc_raw_cost            => blRec.projfunc_raw_cost
9647                        ,p_projfunc_burdened_cost       => blRec.projfunc_burdened_cost
9648                        ,p_projfunc_revenue             => blRec.projfunc_revenue
9649 		       	,p_rep_line_mode               => 'REVERSAL'  -- special case passing reversal of reversal entries
9650                        ,x_msg_data                     => l_rep_msg_data
9651                        ,x_return_status                => l_rep_return_status
9652                        );
9653                        --print_msg('After Calling update_reporting_from_b_lines for BdLine['||blRec.budget_line_id||']');
9654                        --print_msg('RtSts['||l_rep_return_status||']x_msgData['||l_rep_msg_data||']');
9655                        IF l_rep_return_status <> 'S' Then
9656                             l_error_msg_code := l_rep_msg_data;
9657                             EXIT;
9658                        END IF;
9659                     END IF;
9660                    END LOOP;
9661                 END IF ; -- g_rollup requried = Y
9662                 /* Note If there is any dup val on index exception then control comes here. so partly updated budget lines
9663                 * must be passed to rollup api with +ve values */
9664         /* Now populate tmp1 table with bulk exception records */
9665         --print_msg('Calling Populate_blkExcpRecs ');
9666         Populate_blkExcpRecs
9667             (p_budget_version_id        => p_budget_version_id
9668             ,p_err_error_code_tab       =>l_err_error_code_tab
9669             ,p_err_budget_line_id_tab   =>l_err_budget_line_id_tab
9670                         ,p_err_raId_tab         =>l_err_raId_tab
9671                         ,p_err_txn_cur_tab      =>l_err_txn_cur_tab
9672                         ,p_err_sdate_tab        =>l_err_sdate_tab
9673                         ,p_err_quantity_tab     =>l_err_quantity_tab
9674                         ,p_err_cost_rate_tab        =>l_err_cost_rate_tab
9675                         ,p_err_cost_rate_ovr_tab    =>l_err_cost_rate_ovr_tab
9676                         ,p_err_burden_rate_tab      =>l_err_burden_rate_tab
9677                         ,p_err_burden_rate_ovr_tab  =>l_err_burden_rate_ovr_tab
9678                         ,p_err_compiled_set_id_tab  =>l_err_compiled_set_id_tab
9679                         ,p_err_bill_rate_tab        =>l_err_bill_rate_tab
9680                         ,p_err_bill_rate_ovr_tab    =>l_err_bill_rate_ovr_tab
9681                         ,p_err_markup_percent_tab   =>l_err_markup_percent_tab
9682                         ,p_err_cost_rejection_tab   =>l_err_cost_rejection_tab
9683                         ,p_err_revenue_rejection_tab    =>l_err_revenue_rejection_tab
9684                         ,p_err_burden_rejection_tab =>l_err_burden_rejection_tab
9685                         ,p_err_pfc_cur_rejection_tab    =>l_err_pfc_cur_rejection_tab
9686                         ,p_err_pc_cur_rejection_tab =>l_err_pc_cur_rejection_tab
9687             ,x_return_status        => x_return_status
9688             );
9689 
9690         /* Now populate the tmp2 with exisiting budget line details */
9691         --print_msg('Calling Populate_ExistingBlRecs ');
9692         Populate_ExistingBlRecs
9693             (p_budget_version_id            => p_budget_version_id
9694             ,x_return_status                => x_return_status
9695                         );
9696 
9697         /* Before updating the existing budgetLines, we need to pass the -ve entries to rollup api */
9698         IF NVL(g_rollup_required_flag,'N') = 'Y'  THEN
9699                      FOR blRec IN cur_ExistingblAmts LOOP
9700                           IF blRec.budget_line_id is NOT NULL Then
9701                             --print_msg('Getting Budget line Amts for budget_line_id => '||to_char(blrec.budget_line_id));
9702                             l_stage := 4028;
9703                             --print_msg('Calling Add_Toreporting_Tabls by old -ve amts of bl['||(blRec.quantity *-1)||']Cur['||blRec.txn_currency_code||']');
9704                             PA_FP_CALC_PLAN_PKG.Add_Toreporting_Tabls
9705                                 (p_calling_module               => 'CALCULATE_API'
9706                                 ,p_activity_code                => 'UPDATE'
9707                                 ,p_budget_version_id            => p_budget_version_id
9708                                 ,p_budget_line_id               => blRec.budget_line_id
9709                                 ,p_resource_assignment_id       => blRec.resource_assignment_id
9710                                 ,p_start_date                   => blRec.start_date
9711                                 ,p_end_date                     => blRec.end_date
9712                                 ,p_period_name                  => blRec.period_name
9713                                 ,p_txn_currency_code            => blRec.txn_currency_code
9714                                 ,p_quantity                     => blRec.quantity * -1
9715                                 ,p_txn_raw_cost                 => blRec.txn_raw_cost * -1
9716                                 ,p_txn_burdened_cost            => blRec.txn_burdened_cost * -1
9717                                 ,p_txn_revenue                  => blRec.txn_revenue * -1
9718                                 ,p_project_currency_code        => blRec.project_currency_code
9719                                 ,p_project_raw_cost             => blRec.project_raw_cost * -1
9720                                 ,p_project_burdened_cost        => blRec.project_burdened_cost * -1
9721                                 ,p_project_revenue              => blRec.project_revenue * -1
9722                                 ,p_projfunc_currency_code       => blRec.projfunc_currency_code
9723                                 ,p_projfunc_raw_cost            => blRec.projfunc_raw_cost * -1
9724                                 ,p_projfunc_burdened_cost       => blRec.projfunc_burdened_cost * -1
9725                                 ,p_projfunc_revenue             => blRec.projfunc_revenue * -1
9726 				,p_rep_line_mode               => 'REVERSAL'
9727                                 ,x_msg_data                     => l_rep_msg_data
9728                                 ,x_return_status                => l_rep_return_status
9729                                 );
9730                             --print_msg('After Calling update_reporting_from_b_lines for BdLine['||blRec.budget_line_id||']');
9731                             --print_msg('RtSts['||l_rep_return_status||']x_msgData['||l_rep_msg_data||']');
9732                             IF l_rep_return_status <> 'S' Then
9733                                  l_error_msg_code := l_rep_msg_data;
9734                                  EXIT;
9735                             END IF;
9736                        END IF;
9737                    END LOOP;
9738                END IF ; -- g_rollup requried = Y
9739 
9740            /* Now process the exception records. update the tmp2 with the final quantity , rates and rejections
9741                 * and then finally in one bulk update the budget lines */
9742            FOR newRec IN cur_errorBdgtLines LOOP
9743 
9744         print_msg('Updating the budgetline with Existsing bl['||newRec.Existing_budget_line_id||']');
9745         OPEN cur_Tmp2ExblAmts(newRec.Existing_budget_line_id);
9746         FETCH cur_Tmp2ExblAmts INTO ExBlRec;
9747         CLOSE cur_Tmp2ExblAmts;
9748 
9749         /* Rounding enhancements:  While updating budget lines, instead of deriving the override rate use the following logic
9750          * to derive the rates and amounts
9751          * OldBdgetLine                NewBdgtLine              Resultant
9752          * --------------------------------------------------------------------------------------
9753          * 1.Ovrride rate exists      Ovrride rate exists   Use New BdgtLine Override rate
9754          * 2.Ovrride rate exists      No Override rate          Use Old BdgtLine Override rate
9755                  * 3.No Override rate         Ovrride rate exists       Use New BdgtLine Override rate
9756          * 4.No Override rate         No Override rate      Use New BdgtLine rate
9757          * ---------------------------------------------------------------------------------------
9758          */
9759 
9760         If newRec.cost_rate_override is NOT NULL Then
9761             l_bl_upd_cost_rate := newRec.cost_rate_override;
9762             l_bl_upd_cost_rate_ovride := newRec.cost_rate_override;
9763         Elsif ExBlRec.existing_cost_rate_ovride IS NOT NULL Then
9764             l_bl_upd_cost_rate := ExBlRec.existing_cost_rate_ovride;
9765                         l_bl_upd_cost_rate_ovride := ExBlRec.existing_cost_rate_ovride;
9766         Else
9767             l_bl_upd_cost_rate := newRec.cost_rate;
9768                         l_bl_upd_cost_rate_ovride := NULL;
9769         End If;
9770 
9771         If newRec.burden_cost_rate_override is NOT NULL Then
9772             l_bl_upd_burden_rate := newRec.burden_cost_rate_override;
9773             l_bl_upd_burden_rate_ovride := newRec.burden_cost_rate_override;
9774             l_bl_upd_compile_set_id := newRec.cost_ind_compiled_set_id;
9775         Elsif ExBlRec.existing_burden_rate_ovride is NOT NULL Then
9776             l_bl_upd_burden_rate := ExBlRec.existing_burden_rate_ovride;
9777                         l_bl_upd_burden_rate_ovride := ExBlRec.existing_burden_rate_ovride;
9778             l_bl_upd_compile_set_id := ExBlRec.existing_compile_set_id;
9779         Else
9780             l_bl_upd_burden_rate := newRec.burden_cost_rate;
9781                         l_bl_upd_burden_rate_ovride := NULL;
9782             l_bl_upd_compile_set_id := newRec.cost_ind_compiled_set_id;
9783         End If;
9784 
9785         If newRec.bill_rate_override is NOT NULL Then
9786             l_bl_upd_bill_rate := newRec.bill_rate_override;
9787             l_bl_upd_bill_rate_ovride := newRec.bill_rate_override;
9788             l_bl_upd_markup_percentage := newRec.bill_markup_percentage;
9789         Elsif ExBlRec.existing_bill_rate_ovride is NOT NULL Then
9790             l_bl_upd_bill_rate := ExBlRec.existing_bill_rate_ovride;
9791                         l_bl_upd_bill_rate_ovride :=ExBlRec.existing_bill_rate_ovride;
9792             l_bl_upd_markup_percentage := ExBlRec.existing_markup_percentage;
9793         Else
9794             l_bl_upd_bill_rate := newRec.bill_rate;
9795                         l_bl_upd_bill_rate_ovride := NULL;
9796             l_bl_upd_markup_percentage := newRec.bill_markup_percentage;
9797         End If;
9798 
9799 
9800             UPDATE pa_fp_spread_calc_tmp2 tmp2
9801         SET tmp2.txn_currency_code              = newRec.txn_currency_code
9802                  ,tmp2.quantity                         = nvl(tmp2.quantity,0) + newRec.quantity
9803                  ,tmp2.system_reference_var1        = newRec.cost_rejection_code
9804                  ,tmp2.system_reference_var2        = newRec.revenue_rejection_code
9805                  ,tmp2.system_reference_var3        = newRec.burden_rejection_code
9806                  ,tmp2.system_reference_var4        = newRec.pfc_cur_conv_rejection_code
9807                  ,tmp2.system_reference_var5        = newRec.pc_cur_conv_rejection_code
9808                  ,tmp2.bill_markup_percentage           = l_bl_upd_markup_percentage
9809                  ,tmp2.bill_rate                = l_bl_upd_bill_rate
9810                  ,tmp2.cost_rate                = l_bl_upd_cost_rate
9811                  ,tmp2.burden_cost_rate                 = l_bl_upd_burden_rate
9812                  ,tmp2.bill_rate_override           = l_bl_upd_bill_rate_ovride
9813                  ,tmp2.cost_rate_override           = l_bl_upd_cost_rate_ovride
9814                  ,tmp2.burden_cost_rate_override        = l_bl_upd_burden_rate_ovride
9815                  ,tmp2.system_reference_num1            = l_bl_upd_compile_set_id
9816             WHERE tmp2.budget_line_id  = ExBlRec.Existing_budget_line_id;
9817 
9818          END LOOP;
9819 
9820 
9821          /* Now update the budgetLines in bulk from tmp2 table */
9822          Populate_tmp2Plsql_tab;
9823          IF l_tmp2_budget_line_id_tab.COUNT > 0 THEN --{
9824         --print_msg('Bulk updating dup val index exception rows');
9825         FORALL i IN l_tmp2_budget_line_id_tab.FIRST .. l_tmp2_budget_line_id_tab.LAST
9826         UPDATE pa_budget_lines bl
9827                 SET bl.txn_currency_code             = l_tmp2_txn_curr_code_tab(i)
9828                  ,bl.quantity                        = l_tmp2_quantity_tab(i)
9829 		 /* Bug fix:4900436 */
9830                  ,bl.display_quantity                = decode(g_wp_version_flag,'Y',l_tmp2_quantity_tab(i)
9831                                                          ,decode(NVL(l_tmp2_rate_based_flag_tab(i),'N'),'N',NULL
9832 							   	,l_tmp2_quantity_tab(i)))
9833                  /* Bug fix:4900436 */
9834                  ,bl.cost_rejection_code             = l_tmp2_cost_rejection_tab(i)
9835                  ,bl.revenue_rejection_code          = l_tmp2_revenue_rejection_tab(i)
9836                  ,bl.burden_rejection_code           = l_tmp2_burden_rejection_tab(i)
9837                  ,bl.pfc_cur_conv_rejection_code     = l_tmp2_pfc_cur_rejection_tab(i)
9838                  ,bl.pc_cur_conv_rejection_code      = l_tmp2_pc_cur_rejection_tab(i)
9839                  ,bl.txn_markup_percent              = l_tmp2_markup_percent_tab(i)
9840                  ,bl.txn_standard_bill_rate          = l_tmp2_bill_rate_tab(i)
9841                  ,bl.txn_standard_cost_rate          = l_tmp2_cost_rate_tab(i)
9842                  ,bl.burden_cost_rate                = l_tmp2_burden_rate_tab(i)
9843                  ,bl.txn_bill_rate_override          = l_tmp2_bill_rate_ovr_tab(i)
9844                  ,bl.txn_cost_rate_override          = l_tmp2_cost_rate_ovr_tab(i)
9845                  ,bl.burden_cost_rate_override       = l_tmp2_burden_rate_ovr_tab(i)
9846                  ,bl.cost_ind_compiled_set_id        = l_tmp2_compile_set_id_tab(i)
9847                  ,bl.last_update_date                = l_sysdate
9848                  ,bl.last_updated_by                 = l_last_updated_by
9849                  ,bl.last_update_login               = l_last_login_id
9850                 WHERE bl.budget_line_id  = l_tmp2_budget_line_id_tab(i);
9851 
9852             --print_msg(' Num Of rows UPDATED ['||sql%rowcount||']');
9853         FORALL i IN l_tmp2_budget_line_id_tab.FIRST .. l_tmp2_budget_line_id_tab.LAST
9854                 UPDATE pa_budget_lines bl
9855                 SET bl.txn_raw_cost = decode((nvl(bl.txn_init_raw_cost,0) + pa_currency.round_trans_currency_amt1(
9856                                         (nvl(bl.quantity,0) - nvl(bl.init_quantity,0)) *
9857                                         (nvl(bl.txn_cost_rate_override,nvl(txn_standard_cost_rate,0))),bl.txn_currency_code)),0,NULL,
9858                     (nvl(bl.txn_init_raw_cost,0) + pa_currency.round_trans_currency_amt1(
9859                     (nvl(bl.quantity,0) - nvl(bl.init_quantity,0)) *
9860                     (nvl(bl.txn_cost_rate_override,nvl(txn_standard_cost_rate,0))),bl.txn_currency_code)))
9861            ,bl.txn_burdened_cost = decode((nvl(bl.txn_init_burdened_cost,0) + pa_currency.round_trans_currency_amt1(
9862                                         (nvl(bl.quantity,0) - nvl(bl.init_quantity,0)) *
9863                                         (nvl(bl.burden_cost_rate_override,nvl(burden_cost_rate,0))),bl.txn_currency_code)),0,NULL,
9864                                         (nvl(bl.txn_init_burdened_cost,0) + pa_currency.round_trans_currency_amt1(
9865                                         (nvl(bl.quantity,0) - nvl(bl.init_quantity,0)) *
9866                                         (nvl(bl.burden_cost_rate_override,nvl(burden_cost_rate,0))),bl.txn_currency_code)))
9867            ,bl.txn_revenue = decode((nvl(bl.txn_init_raw_cost,0) + pa_currency.round_trans_currency_amt1(
9868                                         (nvl(bl.quantity,0) - nvl(bl.init_quantity,0)) *
9869                                         (nvl(bl.txn_bill_rate_override,nvl(txn_standard_bill_rate,0))),bl.txn_currency_code)),0,NULL,
9870                                         (nvl(bl.txn_init_raw_cost,0) + pa_currency.round_trans_currency_amt1(
9871                                         (nvl(bl.quantity,0) - nvl(bl.init_quantity,0)) *
9872                                         (nvl(bl.txn_bill_rate_override,nvl(txn_standard_bill_rate,0))),bl.txn_currency_code)))
9873                 WHERE bl.budget_line_id  = l_tmp2_budget_line_id_tab(i);
9874 
9875 			/* Call This API to round off the rounding difference for the last budget line in pa_budget_lines
9876                       * when a new currency line is added to the already existing resource assignment.
9877                       * Bug #13788196 */
9878 
9879 			Update_rounding_diff_bl
9880 				(   p_budget_version_id         => p_budget_version_id
9881 				   ,p_calling_module            => p_calling_module
9882       				   ,x_return_status             => l_return_status
9883 			          ,x_msg_count                 => x_msg_count
9884 				   ,x_msg_data                  => x_msg_data
9885 				);
9886 
9887         /* Call the pc and pfc conv attributes for this budget line */
9888             FOR exBlId IN l_tmp2_budget_line_id_tab.FIRST .. l_tmp2_budget_line_id_tab.LAST LOOP
9889             --print_msg('Calling pa_fp_multi_currency_pkg.convert_txn_currency api()');
9890                     pa_fp_multi_currency_pkg.convert_txn_currency
9891                         ( p_budget_version_id         => g_budget_version_id
9892              ,p_budget_line_id            => l_tmp2_budget_line_id_tab(exBlId)
9893                          ,p_source_context            => 'BUDGET_LINE'
9894                          ,p_entire_version            => 'Y'
9895                          ,p_calling_module              => p_calling_module -- Added for Bug#5395732
9896                          ,x_return_status             => l_return_status
9897                          ,x_msg_count                 => x_msg_count
9898                          ,x_msg_data                  => x_msg_data
9899                          );
9900             -- Note the return status of converttxn currn need not checked as the rejections will be stamped on budgetLines
9901                     --print_msg('End of convert_txn_currency api retSts['||l_return_status||']');
9902         END LOOP;
9903 
9904            /* Now delete the exception records from budget lines */
9905         InitPlsqlTabs;
9906         l_del_budget_line_id_tab.delete;
9907         OPEN cur_delBlLines;
9908         FETCH cur_delBlLines BULK COLLECT INTO l_del_budget_line_id_tab;
9909         CLOSE cur_delBlLines;
9910         IF l_del_budget_line_id_tab.COUNT > 0 THEN  --{
9911         /* MRC enhancements */
9912         IF NVL(l_populate_mrc_tab_flag,'N') = 'Y' Then
9913             FORALL i IN l_del_budget_line_id_tab.FIRST .. l_del_budget_line_id_tab.LAST
9914             UPDATE pa_fp_rollup_tmp tmp
9915             SET tmp.delete_flag = 'Y'
9916         WHERE tmp.budget_line_id = l_del_budget_line_id_tab(i);
9917         END IF;
9918 
9919         /* Now delete the duplval budget lines */
9920             FORALL i IN l_del_budget_line_id_tab.FIRST .. l_del_budget_line_id_tab.LAST
9921                 DELETE FROM pa_budget_lines bl
9922                 WHERE bl.budget_line_id = l_del_budget_line_id_tab(i);
9923          END IF; --}
9924 
9925     /* MRC ehancements changes: */
9926     IF NVL(l_populate_mrc_tab_flag,'N') = 'Y' AND l_tmp2_budget_line_id_tab.COUNT > 0 THEN --{
9927 	/* update rollup data with existing budget lines data */
9928         FORALL exBlId IN l_tmp2_budget_line_id_tab.FIRST .. l_tmp2_budget_line_id_tab.LAST
9929         UPDATE pa_fp_rollup_tmp tmp
9930         SET ( tmp.quantity
9931              ,tmp.txn_raw_cost
9932              ,tmp.txn_burdened_cost
9933              ,tmp.txn_revenue
9934              ,tmp.project_raw_cost
9935              ,tmp.project_burdened_cost
9936              ,tmp.project_revenue
9937              ,tmp.projfunc_raw_cost
9938              ,tmp.projfunc_burdened_cost
9939              ,tmp.projfunc_revenue
9940              ,tmp.project_cost_rate_type
9941              ,tmp.project_cost_exchange_rate
9942              ,tmp.project_cost_rate_date_type
9943              ,tmp.project_cost_rate_date
9944              ,tmp.project_rev_rate_type
9945              ,tmp.project_rev_exchange_rate
9946              ,tmp.project_rev_rate_date_type
9947              ,tmp.project_rev_rate_date
9948              ,tmp.projfunc_cost_rate_type
9949              ,tmp.projfunc_cost_exchange_rate
9950              ,tmp.projfunc_cost_rate_date_type
9951              ,tmp.projfunc_cost_rate_date
9952              ,tmp.projfunc_rev_rate_type
9953              ,tmp.projfunc_rev_exchange_rate
9954              ,tmp.projfunc_rev_rate_date_type
9955              ,tmp.projfunc_rev_rate_date
9956            ) =
9957           (SELECT bl.quantity
9958               ,bl.txn_raw_cost
9959               ,bl.txn_burdened_cost
9960               ,bl.txn_revenue
9961               ,bl.project_raw_cost
9962               ,bl.project_burdened_cost
9963               ,bl.project_revenue
9964               ,bl.raw_cost
9965               ,bl.burdened_cost
9966               ,bl.revenue
9967               ,bl.project_cost_rate_type
9968               ,bl.project_cost_exchange_rate
9969               ,bl.project_cost_rate_date_type
9970               ,bl.project_cost_rate_date
9971               ,bl.project_rev_rate_type
9972               ,bl.project_rev_exchange_rate
9973               ,bl.project_rev_rate_date_type
9974               ,bl.project_rev_rate_date
9975               ,bl.projfunc_cost_rate_type
9976               ,bl.projfunc_cost_exchange_rate
9977               ,bl.projfunc_cost_rate_date_type
9978               ,bl.projfunc_cost_rate_date
9979               ,bl.projfunc_rev_rate_type
9980               ,bl.projfunc_rev_exchange_rate
9981               ,bl.projfunc_rev_rate_date_type
9982               ,bl.projfunc_rev_rate_date
9983           FROM pa_budget_lines bl
9984           WHERE bl.budget_line_id = tmp.budget_line_id
9985           )
9986         WHERE tmp.budget_line_id = l_tmp2_budget_line_id_tab(exBlId);
9987 
9988 	/* Copy the rows from budget lines to rollup tmp when existing budget line id doesnot exists in rollup tmp */
9989 	FORALL exBlId IN l_tmp2_budget_line_id_tab.FIRST .. l_tmp2_budget_line_id_tab.LAST
9990         INSERT INTO  pa_fp_rollup_tmp tmp
9991             ( tmp.budget_line_id
9992 	     ,tmp.budget_version_id
9993 	     ,tmp.resource_assignment_id
9994 	     ,tmp.txn_currency_code
9995 	     ,tmp.start_date
9996 	     ,tmp.end_date
9997 	     ,tmp.period_name
9998 	     ,tmp.quantity
9999              ,tmp.txn_raw_cost
10000              ,tmp.txn_burdened_cost
10001              ,tmp.txn_revenue
10002              ,tmp.project_raw_cost
10003              ,tmp.project_burdened_cost
10004              ,tmp.project_revenue
10005              ,tmp.projfunc_raw_cost
10006              ,tmp.projfunc_burdened_cost
10007              ,tmp.projfunc_revenue
10008              ,tmp.project_cost_rate_type
10009              ,tmp.project_cost_exchange_rate
10010              ,tmp.project_cost_rate_date_type
10011              ,tmp.project_cost_rate_date
10012              ,tmp.project_rev_rate_type
10013              ,tmp.project_rev_exchange_rate
10014              ,tmp.project_rev_rate_date_type
10015              ,tmp.project_rev_rate_date
10016              ,tmp.projfunc_cost_rate_type
10017              ,tmp.projfunc_cost_exchange_rate
10018              ,tmp.projfunc_cost_rate_date_type
10019              ,tmp.projfunc_cost_rate_date
10020              ,tmp.projfunc_rev_rate_type
10021              ,tmp.projfunc_rev_exchange_rate
10022              ,tmp.projfunc_rev_rate_date_type
10023              ,tmp.projfunc_rev_rate_date
10024            )
10025 	SELECT bl.budget_line_id
10026 	     ,bl.budget_version_id
10027              ,bl.resource_assignment_id
10028              ,bl.txn_currency_code
10029              ,bl.start_date
10030              ,bl.end_date
10031              ,bl.period_name
10032 	     ,bl.quantity
10033              ,bl.txn_raw_cost
10034              ,bl.txn_burdened_cost
10035              ,bl.txn_revenue
10036              ,bl.project_raw_cost
10037              ,bl.project_burdened_cost
10038              ,bl.project_revenue
10039              ,bl.raw_cost
10040              ,bl.burdened_cost
10041              ,bl.revenue
10042              ,bl.project_cost_rate_type
10043              ,bl.project_cost_exchange_rate
10044              ,bl.project_cost_rate_date_type
10045              ,bl.project_cost_rate_date
10046              ,bl.project_rev_rate_type
10047              ,bl.project_rev_exchange_rate
10048              ,bl.project_rev_rate_date_type
10049              ,bl.project_rev_rate_date
10050              ,bl.projfunc_cost_rate_type
10051              ,bl.projfunc_cost_exchange_rate
10052              ,bl.projfunc_cost_rate_date_type
10053              ,bl.projfunc_cost_rate_date
10054              ,bl.projfunc_rev_rate_type
10055              ,bl.projfunc_rev_exchange_rate
10056              ,bl.projfunc_rev_rate_date_type
10057              ,bl.projfunc_rev_rate_date
10058           FROM pa_budget_lines bl
10059           WHERE bl.budget_line_id = l_tmp2_budget_line_id_tab(exBlId)
10060 	  AND NOT EXISTS ( SELECT NULL
10061 			   FROM PA_FP_ROLLUP_TMP tmp1
10062 			   WHERE tmp1.budget_line_id = l_tmp2_budget_line_id_tab(exBlId)
10063 			);
10064 
10065     END IF; --}
10066 
10067         /* Now pass the +ve values for the updated existing budget Lines */
10068         IF NVL(g_rollup_required_flag,'N') = 'Y'  THEN
10069                      FOR blRec IN cur_ExistingblAmts LOOP
10070                           IF blRec.budget_line_id is NOT NULL Then
10071                                 l_stage := 4028;
10072                                 --print_msg('Calling ExistAdd_Toreporting_Tabls api by New +ve amts of bl qty['||blRec.quantity||']cur['||blRec.txn_currency_code||']');
10073                                 PA_FP_CALC_PLAN_PKG.Add_Toreporting_Tabls
10074                                 (p_calling_module               => 'CALCULATE_API'
10075                                 ,p_activity_code                => 'UPDATE'
10076                                 ,p_budget_version_id            => p_budget_version_id
10077                                 ,p_budget_line_id               => blRec.budget_line_id
10078                                 ,p_resource_assignment_id       => blRec.resource_assignment_id
10079                                 ,p_start_date                   => blRec.start_date
10080                                 ,p_end_date                     => blRec.end_date
10081                                 ,p_period_name                  => blRec.period_name
10082                                 ,p_txn_currency_code            => blRec.txn_currency_code
10083                                 ,p_quantity                     => blRec.quantity
10084                                 ,p_txn_raw_cost                 => blRec.txn_raw_cost
10085                                 ,p_txn_burdened_cost            => blRec.txn_burdened_cost
10086                                 ,p_txn_revenue                  => blRec.txn_revenue
10087                                 ,p_project_currency_code        => blRec.project_currency_code
10088                                 ,p_project_raw_cost             => blRec.project_raw_cost
10089                                 ,p_project_burdened_cost        => blRec.project_burdened_cost
10090                                 ,p_project_revenue              => blRec.project_revenue
10091                                 ,p_projfunc_currency_code       => blRec.projfunc_currency_code
10092                                 ,p_projfunc_raw_cost            => blRec.projfunc_raw_cost
10093                                 ,p_projfunc_burdened_cost       => blRec.projfunc_burdened_cost
10094                                 ,p_projfunc_revenue             => blRec.projfunc_revenue
10095 				,p_rep_line_mode                => 'POSITIVE_ENTRY'
10096                                 ,x_msg_data                     => l_rep_msg_data
10097                                 ,x_return_status                => l_rep_return_status
10098                                 );
10099                                 --print_msg('After Calling update_reporting_from_b_lines for BdLine['||blRec.budget_line_id||']');
10100                                 --print_msg('RtSts['||l_rep_return_status||']x_msgData['||l_rep_msg_data||']');
10101                                 IF l_rep_return_status <> 'S' Then
10102                                         l_error_msg_code := l_rep_msg_data;
10103                                         EXIT;
10104                                 END IF;
10105                        END IF;
10106                    END LOOP;
10107                END IF ; -- g_rollup requried = Y
10108          END IF; --}
10109        END IF; --}  -- end of existing budget Line
10110 
10111        /* Now release the buffer */
10112        InitPlsqlTabs;
10113     END IF; --}  -- end of New budget Line
10114     x_return_status := l_return_status;
10115         print_msg('Leaving BLK_update_budget_lines:x_return_status : '||x_return_status);
10116     If p_pa_debug_mode = 'Y' Then
10117             pa_debug.reset_err_stack;
10118     End If;
10119 
10120 EXCEPTION
10121     WHEN OTHERS THEN
10122             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10123         x_msg_data := SQLCODE||SQLERRM;
10124             fnd_msg_pub.add_exc_msg
10125             ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
10126                 ,p_procedure_name => 'BLK_update_budget_lines' );
10127             pa_debug.g_err_stage := 'Stage : '||to_char(l_stage)||' '||substr(SQLERRM,1,240);
10128             l_stage := 4120;
10129             print_msg(to_char(l_stage)||' substr(SQLERRM,1,240) => '|| substr(SQLERRM,1,240));
10130         If p_pa_debug_mode = 'Y' Then
10131                 pa_debug.reset_err_stack;
10132         End If;
10133             RAISE;
10134 
10135 END BLK_update_budget_lines;
10136 
10137 
10138 /*Bug 4224464.This procedure update_dffcols would be called to insert into pa_fp_rollup_tmp
10139  * all those budget lines which are not already present in pa_fp_rollup_tmp.
10140  * These lines would be the ones with no changes to qty/amnt and rate columns.
10141  * The lines with changes to qty/amnt and rate columns would not be processed by this API
10142  * as earlier call to copy_blattributes would have handled theselines  Also using the
10143  * same signature for this API as used for copy_blattributes above.
10144  */
10145 PROCEDURE update_dffcols(
10146                  p_budget_verson_id               IN  Number
10147                 ,p_source_context                 IN  Varchar2
10148                 ,p_calling_module                 IN  Varchar2
10149                 ,p_apply_progress_flag            IN Varchar2
10150                 ,x_return_status                  OUT NOCOPY varchar2
10151                 ,x_msg_count                      OUT NOCOPY NUMBER
10152                 ,x_msg_data                       OUT NOCOPY varchar2
10153                  ) IS
10154 
10155         /* This cursor picks budget line attributes which needs to be retained and updated even if there was no change detected by
10156            core calculate api flow -- that is, no qty/amt/rate changed */
10157         CURSOR blAttribDetails IS
10158         SELECT /*+ INDEX(BL PA_BUDGET_LINES_U1) */ cache.resource_assignment_id
10159               ,cache.start_date
10160               ,cache.period_name
10161               ,cache.end_Date
10162               ,cache.budget_version_id
10163               ,bl.budget_line_id
10164               ,bl.quantity
10165               ,bl.txn_raw_cost
10166               ,bl.txn_burdened_cost
10167               ,bl.txn_revenue
10168               ,bl.init_quantity
10169               ,bl.txn_init_raw_cost
10170               ,bl.txn_init_burdened_cost
10171               ,bl.txn_init_revenue
10172               ,bl.txn_cost_rate_override
10173               ,bl.burden_cost_rate_override
10174               ,bl.txn_bill_rate_override
10175               ,bl.raw_cost
10176               ,bl.burdened_cost
10177               ,bl.revenue
10178               ,bl.cost_rejection_code
10179               ,bl.revenue_rejection_code
10180               ,bl.burden_rejection_code
10181               ,bl.project_raw_cost
10182               ,bl.project_burdened_cost
10183               ,bl.project_revenue
10184               ,bl.txn_markup_percent
10185               ,bl.txn_standard_bill_rate
10186               ,bl.txn_standard_cost_rate
10187               ,bl.burden_cost_rate
10188               ,bl.cost_ind_compiled_set_id
10189               ,bl.init_raw_cost
10190               ,bl.init_burdened_cost
10191               ,bl.init_revenue
10192               ,bl.project_init_raw_cost
10193               ,bl.project_init_burdened_cost
10194               ,bl.project_init_revenue
10195               ,cache.txn_currency_code
10196               ,cache.projfunc_currency_code
10197               ,cache.PROJECT_CURRENCY_CODE
10198               ,decode(cache.PROJECT_COST_RATE_TYPE,      null, bl.PROJECT_COST_RATE_TYPE, FND_API.G_MISS_CHAR, null, cache.PROJECT_COST_RATE_TYPE)
10199               ,decode(cache.PROJECT_COST_EXCHANGE_RATE,  null, bl.project_cost_exchange_rate, FND_API.G_MISS_NUM, null, cache.PROJECT_COST_EXCHANGE_RATE)
10200               ,decode(cache.PROJECT_COST_RATE_DATE_TYPE, null, bl.project_cost_rate_date_type, FND_API.G_MISS_CHAR, null, cache.PROJECT_COST_RATE_DATE_TYPE)
10201               ,decode(cache.PROJECT_COST_RATE_DATE,      null, bl.project_cost_rate_date, FND_API.G_MISS_DATE, null, cache.PROJECT_COST_RATE_DATE)
10202               ,decode(cache.PROJECT_REV_RATE_TYPE,       null, bl.project_rev_rate_type, FND_API.G_MISS_CHAR, null, cache.PROJECT_REV_RATE_TYPE)
10203               ,decode(cache.PROJECT_REV_EXCHANGE_RATE,   null, bl.project_rev_exchange_rate, FND_API.G_MISS_NUM, null, cache.PROJECT_REV_EXCHANGE_RATE)
10204               ,decode(cache.PROJECT_REV_RATE_DATE_TYPE,  null, bl.project_rev_rate_date_type, FND_API.G_MISS_CHAR, null, cache.PROJECT_REV_RATE_DATE_TYPE)
10205               ,decode(cache.PROJECT_REV_RATE_DATE,       null, bl.project_rev_rate_date, FND_API.G_MISS_DATE, null, cache.PROJECT_REV_RATE_DATE)
10206               ,decode(cache.PROJFUNC_COST_RATE_TYPE,     null, bl.projfunc_cost_rate_type, FND_API.G_MISS_CHAR, null, cache.PROJFUNC_COST_RATE_TYPE)
10207               ,decode(cache.PROJFUNC_COST_EXCHANGE_RATE, null, bl.projfunc_cost_exchange_rate, FND_API.G_MISS_NUM, null, cache.PROJFUNC_COST_EXCHANGE_RATE)
10208               ,decode(cache.PROJFUNC_COST_RATE_DATE_TYPE,null, bl.projfunc_cost_rate_date_type, FND_API.G_MISS_CHAR, null, cache.PROJFUNC_COST_RATE_DATE_TYPE)
10209               ,decode(cache.PROJFUNC_COST_RATE_DATE,     null, bl.projfunc_cost_rate_date, FND_API.G_MISS_DATE, null, cache.PROJFUNC_COST_RATE_DATE)
10210               ,decode(cache.PROJFUNC_REV_RATE_TYPE,      null, bl.projfunc_rev_rate_type, FND_API.G_MISS_CHAR, null, cache.PROJFUNC_REV_RATE_TYPE)
10211               ,decode(cache.PROJFUNC_REV_EXCHANGE_RATE,  null, bl.projfunc_rev_exchange_rate, FND_API.G_MISS_NUM, null, cache.PROJFUNC_REV_EXCHANGE_RATE)
10212               ,decode(cache.PROJFUNC_REV_RATE_DATE_TYPE, null, bl.projfunc_rev_rate_date_type, FND_API.G_MISS_CHAR, null, cache.PROJFUNC_REV_RATE_DATE_TYPE)
10213               ,decode(cache.PROJFUNC_REV_RATE_DATE,      null, bl.projfunc_rev_rate_date, FND_API.G_MISS_DATE, null, cache.PROJFUNC_REV_RATE_DATE)
10214               ,decode(cache.CHANGE_REASON_CODE,          null, bl.change_reason_code, FND_API.G_MISS_CHAR, null, cache.CHANGE_REASON_CODE)
10215               ,decode(cache.DESCRIPTION          ,null, bl.DESCRIPTION, FND_API.G_MISS_CHAR, null, cache.DESCRIPTION)
10216               ,decode(cache.ATTRIBUTE_CATEGORY   ,null, bl.ATTRIBUTE_CATEGORY, FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE_CATEGORY)
10217               ,decode(cache.ATTRIBUTE1           ,null, bl.ATTRIBUTE1,  FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE1)
10218               ,decode(cache.ATTRIBUTE2           ,null, bl.ATTRIBUTE2,  FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE2)
10219               ,decode(cache.ATTRIBUTE3           ,null, bl.ATTRIBUTE3,  FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE3)
10220               ,decode(cache.ATTRIBUTE4           ,null, bl.ATTRIBUTE4,  FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE4)
10221               ,decode(cache.ATTRIBUTE5           ,null, bl.ATTRIBUTE5,  FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE5)
10222               ,decode(cache.ATTRIBUTE6           ,null, bl.ATTRIBUTE6,  FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE6)
10223               ,decode(cache.ATTRIBUTE7           ,null, bl.ATTRIBUTE7,  FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE7)
10224               ,decode(cache.ATTRIBUTE8           ,null, bl.ATTRIBUTE8,  FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE8)
10225               ,decode(cache.ATTRIBUTE9           ,null, bl.ATTRIBUTE9,  FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE9)
10226               ,decode(cache.ATTRIBUTE10          ,null, bl.ATTRIBUTE10, FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE10)
10227               ,decode(cache.ATTRIBUTE11          ,null, bl.ATTRIBUTE11, FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE11)
10228               ,decode(cache.ATTRIBUTE12          ,null, bl.ATTRIBUTE12, FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE12)
10229               ,decode(cache.ATTRIBUTE13          ,null, bl.ATTRIBUTE13, FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE13)
10230               ,decode(cache.ATTRIBUTE14          ,null, bl.ATTRIBUTE14, FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE14)
10231               ,decode(cache.ATTRIBUTE15          ,null, bl.ATTRIBUTE15, FND_API.G_MISS_CHAR, null, cache.ATTRIBUTE15)
10232               ,cache.RAW_COST_SOURCE
10233               ,cache.BURDENED_COST_SOURCE
10234               ,cache.QUANTITY_SOURCE
10235               ,cache.REVENUE_SOURCE
10236               , decode(cache.PM_PRODUCT_CODE  ,null,bl.PM_PRODUCT_CODE, FND_API.G_MISS_CHAR, null, cache.PM_PRODUCT_CODE)
10237               , decode(cache.PM_BUDGET_LINE_REFERENCE ,null,bl.PM_BUDGET_LINE_REFERENCE, FND_API.G_MISS_CHAR, null, cache.PM_BUDGET_LINE_REFERENCE)
10238               , cache.CODE_COMBINATION_ID
10239               , cache.CCID_GEN_STATUS_CODE
10240               , cache.CCID_GEN_REJ_MESSAGE
10241               , cache.BORROWED_REVENUE
10242               , cache.TP_REVENUE_IN
10243               , cache.TP_REVENUE_OUT
10244               , cache.REVENUE_ADJ
10245               , cache.LENT_RESOURCE_COST
10246               , cache.TP_COST_IN
10247               , cache.TP_COST_OUT
10248               , cache.COST_ADJ
10249               , cache.UNASSIGNED_TIME_COST
10250               , cache.UTILIZATION_PERCENT
10251               , cache.UTILIZATION_HOURS
10252               , cache.UTILIZATION_ADJ
10253               , cache.CAPACITY
10254               , cache.HEAD_COUNT
10255               , cache.HEAD_COUNT_ADJ
10256               , cache.BUCKETING_PERIOD_CODE
10257               , cache.TXN_DISCOUNT_PERCENTAGE
10258               , cache.TRANSFER_PRICE_RATE
10259               , cache.BL_CREATED_BY
10260               , cache.BL_CREATION_DATE
10261               FROM   pa_fp_spread_calc_tmp1 cache, pa_budget_lines bl
10262               WHERE  cache.budget_version_id = p_budget_verson_id
10263               AND    cache.budget_version_id = bl.budget_version_id
10264               AND    cache.resource_assignment_id = bl.resource_assignment_id
10265               AND    cache.txn_currency_code = bl.txn_currency_code
10266               AND    cache.start_date = bl.start_date
10267             /*If a new budget line (not exists in pa_budget_lines) is attempted to be created with all amts/qty/rate as null but
10268              * with dffs/mc/change reason, from amg flow, that budget line would not be selected due to the join with pa_budget_lines.
10269              * This is only intended as budget lines with null amts/qty are not maintained in pa_budget_lines any more.
10270              */
10271               AND    NOT EXISTS (SELECT 'X' FROM pa_fp_rollup_tmp  tmp WHERE tmp.budget_version_id = cache.budget_version_id
10272               AND    tmp.resource_assignment_id = cache.resource_assignment_id
10273               AND    tmp.txn_currency_code = cache.txn_currency_code
10274               AND    tmp.start_date = cache.start_date);
10275 
10276         l_resource_assignment_id_tab     pa_plsql_datatypes.Num15TabTyp;
10277         l_start_date_tab                 pa_plsql_datatypes.DateTabTyp;
10278         l_period_name_tab                pa_plsql_datatypes.Char50TabTyp;
10279         l_end_date_tab                   pa_plsql_datatypes.DateTabTyp;
10280         l_budget_line_id_tab             pa_plsql_datatypes.Num15TabTyp;
10281         l_quantity_tab                   pa_plsql_datatypes.NumTabTyp;
10282         l_txn_raw_cost_tab               pa_plsql_datatypes.NumTabTyp;
10283         l_txn_burdened_cost_tab          pa_plsql_datatypes.NumTabTyp;
10284         l_txn_revenue_tab                pa_plsql_datatypes.NumTabTyp;
10285         l_init_quantity_tab              pa_plsql_datatypes.NumTabTyp;
10286         l_txn_init_raw_cost_tab          pa_plsql_datatypes.NumTabTyp;
10287         l_txn_init_burdened_cost_tab     pa_plsql_datatypes.NumTabTyp;
10288         l_txn_init_revenue_tab           pa_plsql_datatypes.NumTabTyp;
10289         l_cost_rate_override_tab         pa_plsql_datatypes.NumTabTyp;
10290         l_burden_rate_override_tab       pa_plsql_datatypes.NumTabTyp;
10291         l_bill_rate_override_tab         pa_plsql_datatypes.NumTabTyp;
10292         l_pjfc_raw_cost_tab              pa_plsql_datatypes.NumTabTyp;
10293         l_pjfc_burden_cost_tab           pa_plsql_datatypes.NumTabTyp;
10294         l_pjfc_revenue_tab               pa_plsql_datatypes.NumTabTyp;
10295         l_cost_rejection_tab             pa_plsql_datatypes.Char30TabTyp;
10296         l_rev_rejection_tab              pa_plsql_datatypes.Char30TabTyp;
10297         l_burden_rejection_tab           pa_plsql_datatypes.Char30TabTyp;
10298         l_project_raw_cost_tab           pa_plsql_datatypes.NumTabTyp;
10299         l_project_burdened_cost_tab      pa_plsql_datatypes.NumTabTyp;
10300         l_project_revenue_tab            pa_plsql_datatypes.NumTabTyp;
10301         l_markup_percentage_tab          pa_plsql_datatypes.NumTabTyp;
10302         l_bill_rate_tab                  pa_plsql_datatypes.NumTabTyp;
10303         l_cost_rate_tab                  pa_plsql_datatypes.NumTabTyp;
10304         l_burden_cost_rate_tab           pa_plsql_datatypes.NumTabTyp;
10305         l_compiled_set_id_tab            pa_plsql_datatypes.Num15TabTyp;
10306         l_init_raw_cost_tab              pa_plsql_datatypes.NumTabTyp;
10307         l_init_burdened_cost_tab         pa_plsql_datatypes.NumTabTyp;
10308         l_init_revenue_tab               pa_plsql_datatypes.NumTabTyp;
10309         l_project_init_raw_cost_tab      pa_plsql_datatypes.NumTabTyp;
10310         l_prjct_init_burdened_cost_tab   pa_plsql_datatypes.NumTabTyp;
10311         l_project_init_revenue_tab       pa_plsql_datatypes.NumTabTyp;
10312         l_txn_currency_code_tab          pa_plsql_datatypes.Char50TabTyp;
10313         l_projfunc_currency_code_tab     pa_plsql_datatypes.Char15TabTyp;
10314         l_PROJECT_CURRENCY_CODE_tab      pa_plsql_datatypes.Char15TabTyp;
10315         l_PROJECT_COST_RATE_TYPE_tab     pa_plsql_datatypes.Char50TabTyp;
10316         l_PROJECT_COST_EXG_RATE_tab      pa_plsql_datatypes.NumTabTyp;
10317         l_PROJECT_COST_DATE_TYPE_tab     pa_plsql_datatypes.Char50TabTyp;
10318         l_PROJECT_COST_RATE_DATE_tab     pa_plsql_datatypes.DateTabTyp;
10319         l_PROJECT_REV_RATE_TYPE_tab      pa_plsql_datatypes.Char50TabTyp;
10320         l_PROJECT_REV_EXG_RATE_tab       pa_plsql_datatypes.NumTabTyp;
10321         l_PROJECT_REV_DATE_TYPE_tab      pa_plsql_datatypes.Char50TabTyp;
10322         l_PROJECT_REV_RATE_DATE_tab      pa_plsql_datatypes.DateTabTyp;
10323         l_PROJFUNC_COST_RATE_TYPE_tab    pa_plsql_datatypes.Char50TabTyp;
10324         l_PROJFUNC_COST_EXG_RATE_tab     pa_plsql_datatypes.NumTabTyp;
10325         l_PROJFUNC_COST_DATE_TYPE_tab    pa_plsql_datatypes.Char50TabTyp;
10326         l_PROJFUNC_COST_RATE_DATE_tab    pa_plsql_datatypes.DateTabTyp;
10327         l_PROJFUNC_REV_RATE_TYPE_tab     pa_plsql_datatypes.Char50TabTyp;
10328         l_PROJFUNC_REV_EXG_RATE_tab      pa_plsql_datatypes.NumTabTyp;
10329         l_PROJFUNC_REV_DATE_TYPE_tab     pa_plsql_datatypes.Char50TabTyp;
10330         l_PROJFUNC_REV_RATE_DATE_tab     pa_plsql_datatypes.DateTabTyp;
10331         l_CHANGE_REASON_CODE_tab         pa_plsql_datatypes.Char30TabTyp;
10332         l_DESCRIPTION_tab                pa_plsql_datatypes.Char250TabTyp;
10333         l_ATTRIBUTE_CATEGORY_tab         pa_plsql_datatypes.Char30TabTyp;
10334         l_ATTRIBUTE1_tab                 pa_plsql_datatypes.Char150TabTyp;
10335         l_ATTRIBUTE2_tab                 pa_plsql_datatypes.Char150TabTyp;
10336         l_ATTRIBUTE3_tab                 pa_plsql_datatypes.Char150TabTyp;
10337         l_ATTRIBUTE4_tab                 pa_plsql_datatypes.Char150TabTyp;
10338         l_ATTRIBUTE5_tab                 pa_plsql_datatypes.Char150TabTyp;
10339         l_ATTRIBUTE6_tab                 pa_plsql_datatypes.Char150TabTyp;
10340         l_ATTRIBUTE7_tab                 pa_plsql_datatypes.Char150TabTyp;
10341         l_ATTRIBUTE8_tab                 pa_plsql_datatypes.Char150TabTyp;
10342         l_ATTRIBUTE9_tab                 pa_plsql_datatypes.Char150TabTyp;
10343         l_ATTRIBUTE10_tab                pa_plsql_datatypes.Char150TabTyp;
10344         l_ATTRIBUTE11_tab                pa_plsql_datatypes.Char150TabTyp;
10345         l_ATTRIBUTE12_tab                pa_plsql_datatypes.Char150TabTyp;
10346         l_ATTRIBUTE13_tab                pa_plsql_datatypes.Char150TabTyp;
10347         l_ATTRIBUTE14_tab                pa_plsql_datatypes.Char150TabTyp;
10348         l_ATTRIBUTE15_tab                pa_plsql_datatypes.Char150TabTyp;
10349         l_RAW_COST_SOURCE_tab            pa_plsql_datatypes.Char2TabTyp;
10350         l_BURDENED_COST_SOURCE_tab       pa_plsql_datatypes.Char2TabTyp;
10351         l_QUANTITY_SOURCE_tab            pa_plsql_datatypes.Char2TabTyp;
10352         l_REVENUE_SOURCE_tab             pa_plsql_datatypes.Char2TabTyp;
10353         l_PM_PRODUCT_CODE_tab            pa_plsql_datatypes.Char30TabTyp;
10354         l_PM_BUDGET_LINE_REFERENCE_tab   pa_plsql_datatypes.Char30TabTyp;
10355         l_CODE_COMBINATION_ID_tab        pa_plsql_datatypes.Num15TabTyp;
10356         l_CCID_GEN_STATUS_CODE_tab       pa_plsql_datatypes.Char1TabTyp;
10357         l_CCID_GEN_REJ_MESSAGE_tab       pa_plsql_datatypes.Char2000TabTyp;
10358         l_BORROWED_REVENUE_tab           pa_plsql_datatypes.NumTabTyp;
10359         l_TP_REVENUE_IN_tab              pa_plsql_datatypes.NumTabTyp;
10360         l_TP_REVENUE_OUT_tab             pa_plsql_datatypes.NumTabTyp;
10361         l_REVENUE_ADJ_tab                pa_plsql_datatypes.NumTabTyp;
10362         l_LENT_RESOURCE_COST_tab         pa_plsql_datatypes.NumTabTyp;
10363         l_TP_COST_IN_tab                 pa_plsql_datatypes.NumTabTyp;
10364         l_TP_COST_OUT_tab                pa_plsql_datatypes.NumTabTyp;
10365         l_COST_ADJ_tab                   pa_plsql_datatypes.NumTabTyp;
10366         l_UNASSIGNED_TIME_COST_tab       pa_plsql_datatypes.NumTabTyp;
10367         l_UTILIZATION_PERCENT_tab        pa_plsql_datatypes.NumTabTyp;
10368         l_UTILIZATION_HOURS_tab          pa_plsql_datatypes.NumTabTyp;
10369         l_UTILIZATION_ADJ_tab            pa_plsql_datatypes.NumTabTyp;
10370         l_CAPACITY_tab                   pa_plsql_datatypes.NumTabTyp;
10371         l_HEAD_COUNT_tab                 pa_plsql_datatypes.NumTabTyp;
10372         l_HEAD_COUNT_ADJ_tab             pa_plsql_datatypes.NumTabTyp;
10373         l_BUCKETING_PERIOD_CODE_tab      pa_plsql_datatypes.Char30TabTyp;
10374         l_TXN_DISCOUNT_PERCENTAGE_tab    pa_plsql_datatypes.NumTabTyp;
10375         l_TRANSFER_PRICE_RATE_tab        pa_plsql_datatypes.NumTabTyp;
10376         l_BL_CREATED_BY_tab              pa_plsql_datatypes.NumTabTyp;
10377         l_BL_CREATION_DATE_tab           pa_plsql_datatypes.DateTabTyp;
10378 
10379         l_budget_version_id_tab          pa_plsql_datatypes.Num15TabTyp;
10380 
10381     PROCEDURE INIT_PLSQL_TABS IS
10382     BEGIN
10383                         l_resource_assignment_id_tab.delete;
10384             l_start_date_tab.delete;
10385             l_period_name_tab.delete;
10386             l_end_date_tab.delete;
10387             l_budget_line_id_tab.delete;
10388             l_quantity_tab.delete;
10389                     l_txn_raw_cost_tab.delete;
10390                         l_txn_burdened_cost_tab.delete;
10391                     l_txn_revenue_tab.delete;
10392                     l_init_quantity_tab.delete;
10393                     l_txn_init_raw_cost_tab.delete;
10394                     l_txn_init_burdened_cost_tab.delete;
10395                     l_txn_init_revenue_tab.delete;
10396                     l_cost_rate_override_tab.delete;
10397             l_burden_rate_override_tab.delete;
10398             l_bill_rate_override_tab.delete;
10399             l_pjfc_raw_cost_tab.delete;
10400             l_pjfc_burden_cost_tab.delete;
10401             l_pjfc_revenue_tab.delete;
10402             l_cost_rejection_tab.delete;
10403             l_rev_rejection_tab.delete;
10404             l_burden_rejection_tab.delete;
10405             l_project_raw_cost_tab.delete;
10406             l_project_burdened_cost_tab.delete;
10407             l_project_revenue_tab.delete;
10408             l_markup_percentage_tab.delete;
10409             l_bill_rate_tab.delete;
10410             l_cost_rate_tab.delete;
10411             l_burden_cost_rate_tab.delete;
10412             l_compiled_set_id_tab.delete;
10413             l_init_raw_cost_tab.delete;
10414             l_init_burdened_cost_tab.delete;
10415             l_init_revenue_tab.delete;
10416             l_project_init_raw_cost_tab.delete;
10417             l_prjct_init_burdened_cost_tab.delete;
10418             l_project_init_revenue_tab.delete;
10419             l_txn_currency_code_tab.delete;
10420             l_projfunc_currency_code_tab.delete;
10421             l_PROJECT_CURRENCY_CODE_tab.delete;
10422             l_PROJECT_COST_RATE_TYPE_tab.delete;
10423             l_PROJECT_COST_EXG_RATE_tab.delete;
10424             l_PROJECT_COST_DATE_TYPE_tab.delete;
10425             l_PROJECT_COST_RATE_DATE_tab.delete;
10426             l_PROJECT_REV_RATE_TYPE_tab.delete;
10427             l_PROJECT_REV_EXG_RATE_tab.delete;
10428             l_PROJECT_REV_DATE_TYPE_tab.delete;
10429             l_PROJECT_REV_RATE_DATE_tab.delete;
10430             l_PROJFUNC_COST_RATE_TYPE_tab.delete;
10431             l_PROJFUNC_COST_EXG_RATE_tab.delete;
10432             l_PROJFUNC_COST_DATE_TYPE_tab.delete;
10433             l_PROJFUNC_COST_RATE_DATE_tab.delete;
10434             l_PROJFUNC_REV_RATE_TYPE_tab.delete;
10435             l_PROJFUNC_REV_EXG_RATE_tab.delete;
10436             l_PROJFUNC_REV_DATE_TYPE_tab.delete;
10437             l_PROJFUNC_REV_RATE_DATE_tab.delete;
10438             l_CHANGE_REASON_CODE_tab.delete;
10439             l_DESCRIPTION_tab.delete;
10440             l_ATTRIBUTE_CATEGORY_tab.delete;
10441             l_ATTRIBUTE1_tab.delete;
10442             l_ATTRIBUTE2_tab.delete;
10443             l_ATTRIBUTE3_tab.delete;
10444             l_ATTRIBUTE4_tab.delete;
10445             l_ATTRIBUTE5_tab.delete;
10446             l_ATTRIBUTE6_tab.delete;
10447             l_ATTRIBUTE7_tab.delete;
10448             l_ATTRIBUTE8_tab.delete;
10449             l_ATTRIBUTE9_tab.delete;
10450             l_ATTRIBUTE10_tab.delete;
10451             l_ATTRIBUTE11_tab.delete;
10452             l_ATTRIBUTE12_tab.delete;
10453             l_ATTRIBUTE13_tab.delete;
10454             l_ATTRIBUTE14_tab.delete;
10455             l_ATTRIBUTE15_tab.delete;
10456             l_RAW_COST_SOURCE_tab.delete;
10457             l_BURDENED_COST_SOURCE_tab.delete;
10458             l_QUANTITY_SOURCE_tab.delete;
10459             l_REVENUE_SOURCE_tab.delete;
10460             l_PM_PRODUCT_CODE_tab.delete;
10461             l_PM_BUDGET_LINE_REFERENCE_tab.delete;
10462             l_CODE_COMBINATION_ID_tab.delete;
10463             l_CCID_GEN_STATUS_CODE_tab.delete;
10464             l_CCID_GEN_REJ_MESSAGE_tab.delete;
10465             l_BORROWED_REVENUE_tab.delete;
10466             l_TP_REVENUE_IN_tab.delete;
10467             l_TP_REVENUE_OUT_tab.delete;
10468             l_REVENUE_ADJ_tab.delete;
10469             l_LENT_RESOURCE_COST_tab.delete;
10470             l_TP_COST_IN_tab.delete;
10471             l_TP_COST_OUT_tab.delete;
10472             l_COST_ADJ_tab.delete;
10473             l_UNASSIGNED_TIME_COST_tab.delete;
10474             l_UTILIZATION_PERCENT_tab.delete;
10475             l_UTILIZATION_HOURS_tab.delete;
10476             l_UTILIZATION_ADJ_tab.delete;
10477             l_CAPACITY_tab.delete;
10478             l_HEAD_COUNT_tab.delete;
10479             l_HEAD_COUNT_ADJ_tab.delete;
10480             l_BUCKETING_PERIOD_CODE_tab.delete;
10481             l_TXN_DISCOUNT_PERCENTAGE_tab.delete;
10482             l_TRANSFER_PRICE_RATE_tab.delete;
10483             l_BL_CREATED_BY_tab.delete;
10484             l_BL_CREATION_DATE_tab.delete;
10485             l_budget_version_id_tab.delete;
10486     END INIT_PLSQL_TABS;
10487 BEGIN
10488         /* Initialize the out variables */
10489         x_return_status := 'S';
10490         x_msg_data := NULL;
10491         x_msg_count := fnd_msg_pub.count_msg;
10492         If p_pa_debug_mode = 'Y' Then
10493                 pa_debug.init_err_stack('PA_FP_CALC_UTILS.update_dffcols');
10494         End If;
10495         IF p_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION') Then  --{
10496                 INIT_PLSQL_TABS;
10497                 --print_msg('Fetching budget Line Attributes such as DFFs details from cache ');
10498                 OPEN blAttribDetails;
10499                 FETCH blAttribDetails BULK COLLECT INTO
10500                          l_resource_assignment_id_tab
10501                         ,l_start_date_tab
10502                         ,l_period_name_tab
10503                         ,l_end_date_tab
10504                         ,l_budget_version_id_tab
10505                         ,l_budget_line_id_tab
10506                         ,l_quantity_tab
10507                         ,l_txn_raw_cost_tab
10508                         ,l_txn_burdened_cost_tab
10509                         ,l_txn_revenue_tab
10510                         ,l_init_quantity_tab
10511                         ,l_txn_init_raw_cost_tab
10512                         ,l_txn_init_burdened_cost_tab
10513                         ,l_txn_init_revenue_tab
10514                         ,l_cost_rate_override_tab
10515                         ,l_burden_rate_override_tab
10516                         ,l_bill_rate_override_tab
10517                         ,l_pjfc_raw_cost_tab
10518                         ,l_pjfc_burden_cost_tab
10519                         ,l_pjfc_revenue_tab
10520                         ,l_cost_rejection_tab
10521                         ,l_rev_rejection_tab
10522                         ,l_burden_rejection_tab
10523                         ,l_project_raw_cost_tab
10524                         ,l_project_burdened_cost_tab
10525                         ,l_project_revenue_tab
10526                         ,l_markup_percentage_tab
10527                         ,l_bill_rate_tab
10528                         ,l_cost_rate_tab
10529                         ,l_burden_cost_rate_tab
10530                         ,l_compiled_set_id_tab
10531                         ,l_init_raw_cost_tab
10532                         ,l_init_burdened_cost_tab
10533                         ,l_init_revenue_tab
10534                         ,l_project_init_raw_cost_tab
10535                         ,l_prjct_init_burdened_cost_tab
10536                         ,l_project_init_revenue_tab
10537                         ,l_txn_currency_code_tab
10538                         ,l_projfunc_currency_code_tab
10539                         ,l_PROJECT_CURRENCY_CODE_tab
10540                         ,l_PROJECT_COST_RATE_TYPE_tab
10541                         ,l_PROJECT_COST_EXG_RATE_tab
10542                         ,l_PROJECT_COST_DATE_TYPE_tab
10543                         ,l_PROJECT_COST_RATE_DATE_tab
10544                         ,l_PROJECT_REV_RATE_TYPE_tab
10545                         ,l_PROJECT_REV_EXG_RATE_tab
10546                         ,l_PROJECT_REV_DATE_TYPE_tab
10547                         ,l_PROJECT_REV_RATE_DATE_tab
10548                         ,l_PROJFUNC_COST_RATE_TYPE_tab
10549                         ,l_PROJFUNC_COST_EXG_RATE_tab
10550                         ,l_PROJFUNC_COST_DATE_TYPE_tab
10551                         ,l_PROJFUNC_COST_RATE_DATE_tab
10552                         ,l_PROJFUNC_REV_RATE_TYPE_tab
10553                         ,l_PROJFUNC_REV_EXG_RATE_tab
10554                         ,l_PROJFUNC_REV_DATE_TYPE_tab
10555                         ,l_PROJFUNC_REV_RATE_DATE_tab
10556                         ,l_CHANGE_REASON_CODE_tab
10557                         ,l_DESCRIPTION_tab
10558                         ,l_ATTRIBUTE_CATEGORY_tab
10559                         ,l_ATTRIBUTE1_tab
10560                         ,l_ATTRIBUTE2_tab
10561                         ,l_ATTRIBUTE3_tab
10562                         ,l_ATTRIBUTE4_tab
10563                         ,l_ATTRIBUTE5_tab
10564                         ,l_ATTRIBUTE6_tab
10565                         ,l_ATTRIBUTE7_tab
10566                         ,l_ATTRIBUTE8_tab
10567                         ,l_ATTRIBUTE9_tab
10568                         ,l_ATTRIBUTE10_tab
10569                         ,l_ATTRIBUTE11_tab
10570                         ,l_ATTRIBUTE12_tab
10571                         ,l_ATTRIBUTE13_tab
10572                         ,l_ATTRIBUTE14_tab
10573                         ,l_ATTRIBUTE15_tab
10574                         ,l_RAW_COST_SOURCE_tab
10575                         ,l_BURDENED_COST_SOURCE_tab
10576                         ,l_QUANTITY_SOURCE_tab
10577                         ,l_REVENUE_SOURCE_tab
10578                         ,l_PM_PRODUCT_CODE_tab
10579                         ,l_PM_BUDGET_LINE_REFERENCE_tab
10580                         ,l_CODE_COMBINATION_ID_tab
10581                         ,l_CCID_GEN_STATUS_CODE_tab
10582                         ,l_CCID_GEN_REJ_MESSAGE_tab
10583                         ,l_BORROWED_REVENUE_tab
10584                         ,l_TP_REVENUE_IN_tab
10585                         ,l_TP_REVENUE_OUT_tab
10586                         ,l_REVENUE_ADJ_tab
10587                         ,l_LENT_RESOURCE_COST_tab
10588                         ,l_TP_COST_IN_tab
10589                         ,l_TP_COST_OUT_tab
10590                         ,l_COST_ADJ_tab
10591                         ,l_UNASSIGNED_TIME_COST_tab
10592                         ,l_UTILIZATION_PERCENT_tab
10593                         ,l_UTILIZATION_HOURS_tab
10594                         ,l_UTILIZATION_ADJ_tab
10595                         ,l_CAPACITY_tab
10596                         ,l_HEAD_COUNT_tab
10597                         ,l_HEAD_COUNT_ADJ_tab
10598                         ,l_BUCKETING_PERIOD_CODE_tab
10599                         ,l_TXN_DISCOUNT_PERCENTAGE_tab
10600                         ,l_TRANSFER_PRICE_RATE_tab
10601                         ,l_BL_CREATED_BY_tab
10602                         ,l_BL_CREATION_DATE_tab;
10603                 CLOSE blAttribDetails;
10604                 --print_msg('Number of blAttrib rows fetched['||l_resource_assignment_id_tab.COUNT||']');
10605 
10606                 IF l_resource_assignment_id_tab.COUNT > 0 THEN
10607                         --print_msg('Number of blAttrib rows fetched['||l_resource_assignment_id_tab.COUNT||']');
10608 
10609                         FORALL i IN  l_resource_assignment_id_tab.FIRST .. l_resource_assignment_id_tab.LAST
10610                         INSERT INTO pa_fp_rollup_tmp tmp
10611             (
10612              budget_version_id
10613             ,resource_assignment_id
10614             ,start_date
10615             ,period_name
10616             ,end_date
10617             ,budget_line_id
10618             ,quantity
10619             ,txn_raw_cost
10620             ,txn_burdened_cost
10621             ,txn_revenue
10622             ,init_quantity
10623             ,txn_init_raw_cost
10624             ,txn_init_burdened_cost
10625             ,txn_init_revenue
10626             ,rw_cost_rate_override
10627             ,burden_cost_rate_override
10628             ,bill_rate_override
10629             ,projfunc_raw_cost
10630             ,projfunc_burdened_cost
10631             ,projfunc_revenue
10632             ,cost_rejection_code
10633             ,revenue_rejection_code
10634             ,burden_rejection_code
10635             ,project_raw_cost
10636             ,project_burdened_cost
10637             ,project_revenue
10638             ,bill_markup_percentage
10639             ,bill_rate
10640             ,cost_rate
10641             ,burden_cost_rate
10642             ,cost_ind_compiled_set_id
10643             ,init_raw_cost
10644             ,init_burdened_cost
10645             ,init_revenue
10646             ,project_init_raw_cost
10647             ,project_init_burdened_cost
10648             ,project_init_revenue
10649             ,txn_currency_code
10650             ,projfunc_currency_code
10651             ,project_currency_code
10652             ,project_cost_rate_type
10653             ,project_cost_exchange_rate
10654             ,project_cost_rate_date_type
10655             ,project_cost_rate_date
10656             ,project_rev_rate_type
10657             ,project_rev_exchange_rate
10658             ,project_rev_rate_date_type
10659             ,project_rev_rate_date
10660             ,projfunc_cost_rate_type
10661             ,projfunc_cost_exchange_rate
10662             ,projfunc_cost_rate_date_type
10663             ,projfunc_cost_rate_date
10664             ,projfunc_rev_rate_type
10665             ,projfunc_rev_exchange_rate
10666             ,projfunc_rev_rate_date_type
10667             ,projfunc_rev_rate_date
10668             ,CHANGE_REASON_CODE
10669             ,DESCRIPTION
10670             ,ATTRIBUTE_CATEGORY
10671             ,ATTRIBUTE1
10672             ,ATTRIBUTE2
10673             ,ATTRIBUTE3
10674             ,ATTRIBUTE4
10675             ,ATTRIBUTE5
10676             ,ATTRIBUTE6
10677             ,ATTRIBUTE7
10678             ,ATTRIBUTE8
10679             ,ATTRIBUTE9
10680             ,ATTRIBUTE10
10681             ,ATTRIBUTE11
10682             ,ATTRIBUTE12
10683             ,ATTRIBUTE13
10684             ,ATTRIBUTE14
10685             ,ATTRIBUTE15
10686             ,RAW_COST_SOURCE
10687             ,BURDENED_COST_SOURCE
10688             ,QUANTITY_SOURCE
10689             ,REVENUE_SOURCE
10690             ,PM_PRODUCT_CODE
10691             ,PM_BUDGET_LINE_REFERENCE
10692             ,CODE_COMBINATION_ID
10693             ,CCID_GEN_STATUS_CODE
10694             ,CCID_GEN_REJ_MESSAGE
10695             ,BORROWED_REVENUE
10696             ,TP_REVENUE_IN
10697             ,TP_REVENUE_OUT
10698             ,REVENUE_ADJ
10699             ,LENT_RESOURCE_COST
10700             ,TP_COST_IN
10701             ,TP_COST_OUT
10702             ,COST_ADJ
10703             ,UNASSIGNED_TIME_COST
10704             ,UTILIZATION_PERCENT
10705             ,UTILIZATION_HOURS
10706             ,UTILIZATION_ADJ
10707             ,CAPACITY
10708             ,HEAD_COUNT
10709             ,HEAD_COUNT_ADJ
10710             ,BUCKETING_PERIOD_CODE
10711             ,TXN_DISCOUNT_PERCENTAGE
10712             ,TRANSFER_PRICE_RATE
10713             ,BL_CREATED_BY
10714             ,BL_CREATION_DATE
10715             )
10716             VALUES
10717             (
10718              l_budget_version_id_tab(i)
10719             ,l_resource_assignment_id_tab(i)
10720             ,l_start_date_tab(i)
10721             ,l_period_name_tab(i)
10722             ,l_end_date_tab(i)
10723             ,l_budget_line_id_tab(i)
10724             ,l_quantity_tab(i)
10725             ,l_txn_raw_cost_tab(i)
10726             ,l_txn_burdened_cost_tab(i)
10727             ,l_txn_revenue_tab(i)
10728             ,l_init_quantity_tab(i)
10729             ,l_txn_init_raw_cost_tab(i)
10730             ,l_txn_init_burdened_cost_tab(i)
10731             ,l_txn_init_revenue_tab(i)
10732             ,l_cost_rate_override_tab(i)
10733             ,l_burden_rate_override_tab(i)
10734             ,l_bill_rate_override_tab(i)
10735             ,l_pjfc_raw_cost_tab(i)
10736             ,l_pjfc_burden_cost_tab(i)
10737             ,l_pjfc_revenue_tab(i)
10738             ,l_cost_rejection_tab(i)
10739             ,l_rev_rejection_tab(i)
10740             ,l_burden_rejection_tab(i)
10741             ,l_project_raw_cost_tab(i)
10742             ,l_project_burdened_cost_tab(i)
10743             ,l_project_revenue_tab(i)
10744             ,l_markup_percentage_tab(i)
10745             ,l_bill_rate_tab(i)
10746             ,l_cost_rate_tab(i)
10747             ,l_burden_cost_rate_tab(i)
10748             ,l_compiled_set_id_tab(i)
10749             ,l_init_raw_cost_tab(i)
10750             ,l_init_burdened_cost_tab(i)
10751             ,l_init_revenue_tab(i)
10752             ,l_project_init_raw_cost_tab(i)
10753             ,l_prjct_init_burdened_cost_tab(i)
10754             ,l_project_init_revenue_tab(i)
10755             ,l_txn_currency_code_tab(i)
10756             ,l_projfunc_currency_code_tab(i)
10757             ,l_PROJECT_CURRENCY_CODE_tab(i)
10758             ,l_PROJECT_COST_RATE_TYPE_tab(i)
10759             ,l_PROJECT_COST_EXG_RATE_tab(i)
10760             ,l_PROJECT_COST_DATE_TYPE_tab(i)
10761             ,l_PROJECT_COST_RATE_DATE_tab(i)
10762             ,l_PROJECT_REV_RATE_TYPE_tab(i)
10763             ,l_PROJECT_REV_EXG_RATE_tab(i)
10764             ,l_PROJECT_REV_DATE_TYPE_tab(i)
10765             ,l_PROJECT_REV_RATE_DATE_tab(i)
10766             ,l_PROJFUNC_COST_RATE_TYPE_tab(i)
10767             ,l_PROJFUNC_COST_EXG_RATE_tab(i)
10768             ,l_PROJFUNC_COST_DATE_TYPE_tab(i)
10769             ,l_PROJFUNC_COST_RATE_DATE_tab(i)
10770             ,l_PROJFUNC_REV_RATE_TYPE_tab(i)
10771             ,l_PROJFUNC_REV_EXG_RATE_tab(i)
10772             ,l_PROJFUNC_REV_DATE_TYPE_tab(i)
10773             ,l_PROJFUNC_REV_RATE_DATE_tab(i)
10774             ,l_CHANGE_REASON_CODE_tab(i)
10775             ,l_DESCRIPTION_tab(i)
10776             ,l_ATTRIBUTE_CATEGORY_tab(i)
10777             ,l_ATTRIBUTE1_tab(i)
10778             ,l_ATTRIBUTE2_tab(i)
10779             ,l_ATTRIBUTE3_tab(i)
10780             ,l_ATTRIBUTE4_tab(i)
10781             ,l_ATTRIBUTE5_tab(i)
10782             ,l_ATTRIBUTE6_tab(i)
10783             ,l_ATTRIBUTE7_tab(i)
10784             ,l_ATTRIBUTE8_tab(i)
10785             ,l_ATTRIBUTE9_tab(i)
10786             ,l_ATTRIBUTE10_tab(i)
10787             ,l_ATTRIBUTE11_tab(i)
10788             ,l_ATTRIBUTE12_tab(i)
10789             ,l_ATTRIBUTE13_tab(i)
10790             ,l_ATTRIBUTE14_tab(i)
10791             ,l_ATTRIBUTE15_tab(i)
10792             ,l_RAW_COST_SOURCE_tab(i)
10793             ,l_BURDENED_COST_SOURCE_tab(i)
10794             ,l_QUANTITY_SOURCE_tab(i)
10795             ,l_REVENUE_SOURCE_tab(i)
10796             ,l_PM_PRODUCT_CODE_tab(i)
10797             ,l_PM_BUDGET_LINE_REFERENCE_tab(i)
10798             ,l_CODE_COMBINATION_ID_tab(i)
10799             ,l_CCID_GEN_STATUS_CODE_tab(i)
10800             ,l_CCID_GEN_REJ_MESSAGE_tab(i)
10801             ,l_BORROWED_REVENUE_tab(i)
10802             ,l_TP_REVENUE_IN_tab(i)
10803             ,l_TP_REVENUE_OUT_tab(i)
10804             ,l_REVENUE_ADJ_tab(i)
10805             ,l_LENT_RESOURCE_COST_tab(i)
10806             ,l_TP_COST_IN_tab(i)
10807             ,l_TP_COST_OUT_tab(i)
10808             ,l_COST_ADJ_tab(i)
10809             ,l_UNASSIGNED_TIME_COST_tab(i)
10810             ,l_UTILIZATION_PERCENT_tab(i)
10811             ,l_UTILIZATION_HOURS_tab(i)
10812             ,l_UTILIZATION_ADJ_tab(i)
10813             ,l_CAPACITY_tab(i)
10814             ,l_HEAD_COUNT_tab(i)
10815             ,l_HEAD_COUNT_ADJ_tab(i)
10816             ,l_BUCKETING_PERIOD_CODE_tab(i)
10817             ,l_TXN_DISCOUNT_PERCENTAGE_tab(i)
10818             ,l_TRANSFER_PRICE_RATE_tab(i)
10819             ,l_BL_CREATED_BY_tab(i)
10820             ,l_BL_CREATION_DATE_tab(i) );
10821             --print_msg('Number of rows updated['||sql%rowcount||']');
10822                 END IF;
10823         /* release the buffer */
10824         INIT_PLSQL_TABS;
10825         END IF;  --}
10826 
10827         x_msg_count := fnd_msg_pub.count_msg;
10828     --print_msg('End of update_dffcols retSts['||x_return_status||']');
10829     If p_pa_debug_mode = 'Y' Then
10830         pa_debug.reset_err_stack;
10831     End If;
10832 
10833 EXCEPTION
10834         WHEN OTHERS THEN
10835                 x_return_status := 'U';
10836                 x_msg_data := SQLCODE||SQLERRM;
10837         fnd_msg_pub.add_exc_msg
10838                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
10839                  ,p_procedure_name => 'update_dffcols');
10840         If p_pa_debug_mode = 'Y' Then
10841                     pa_debug.reset_err_stack;
10842         End If;
10843                 RAISE;
10844 
10845 END update_dffcols;
10846 
10847 /*Bug:4272944: Added new procedure to insert zero qty budget lines from pa_fp_spread_calc_tmp1 to
10848 *pa_budget_lines. This fix is done specific to Funding of Autobase line is failing.
10849 *donot populate or use pa_fp_spread_calc_tmp1 table for any other purpose.
10850 *Note: Calling API may populate this table only for AMG/MSP/Autobaseline purpose.
10851 */
10852 PROCEDURE InsertFunding_ReqdLines
10853 	( p_budget_verson_id               IN  Number
10854          ,p_source_context                 IN  Varchar2
10855          ,p_calling_module                 IN  Varchar2
10856          ,p_apply_progress_flag            IN  Varchar2
10857 	 ,p_approved_rev_flag              IN  Varchar2
10858 	 ,p_autoBaseLine_flag              IN  Varchar2
10859          ,x_return_status                  OUT NOCOPY varchar2
10860          ) IS
10861 
10862 	CURSOR cur_tmp1Recs IS
10863 	SELECT tmp.resource_assignment_id
10864 		,tmp.txn_currency_code
10865 		,tmp.start_date
10866 		,tmp.end_date
10867 		,tmp.period_name
10868 		,pa_budget_lines_s.nextval
10869 	FROM  pa_fp_spread_calc_tmp1 tmp
10870 	WHERE tmp.budget_version_id = p_budget_verson_id;
10871 
10872 	l_bl_source		VARCHAR2(10) := 'AB';  --'indicates lines created for funding auto baseline'
10873 	l_resource_assignment_id_tab     pa_plsql_datatypes.Num15TabTyp;
10874 	l_txn_cur_code_tab		 pa_plsql_datatypes.Char30TabTyp;
10875         l_start_date_tab                 pa_plsql_datatypes.DateTabTyp;
10876         l_end_date_tab                   pa_plsql_datatypes.DateTabTyp;
10877         l_period_name_tab                pa_plsql_datatypes.Char50TabTyp;
10878         l_budget_line_id_tab             pa_plsql_datatypes.Num15TabTyp;
10879         l_quantity_tab                   pa_plsql_datatypes.NumTabTyp;
10880 	l_exception_return_status  Varchar2(1);
10881 	l_error_msg_code  Varchar2(1000);
10882 	v_NumErrors 	Number;
10883 	l_x_cntr	Number;
10884 	v_index_position  Number;
10885 	v_error_code      Number;
10886 	l_err_error_code_tab    	pa_plsql_datatypes.Char80TabTyp;
10887 	l_err_budget_line_id_tab	pa_plsql_datatypes.IdTabTyp;
10888 	l_err_raId_tab			pa_plsql_datatypes.IdTabTyp;
10889 	l_err_txn_cur_tab		pa_plsql_datatypes.Char80TabTyp;
10890 	l_err_sdate_tab			pa_plsql_datatypes.DateTabTyp;
10891 	l_err_edate_tab			pa_plsql_datatypes.DateTabTyp;
10892 
10893 
10894 	PROCEDURE INIT_PLSQL_TABS IS
10895     	BEGIN
10896             l_resource_assignment_id_tab.delete;
10897 	    l_txn_cur_code_tab.delete;
10898             l_start_date_tab.delete;
10899             l_end_date_tab.delete;
10900             l_period_name_tab.delete;
10901 	    l_budget_line_id_tab.delete;
10902 	    l_err_error_code_tab.delete;
10903             l_err_budget_line_id_tab.delete;
10904             l_err_raId_tab.delete;
10905             l_err_txn_cur_tab.delete;
10906             l_err_sdate_tab.delete;
10907             l_err_edate_tab.delete;
10908 	END;
10909 BEGIN
10910 
10911 	x_return_status := 'S';
10912 	IF NVL(p_approved_rev_flag,'N') = 'Y' AND NVL(p_autoBaseLine_flag,'N') = 'Y' Then
10913 		Init_plsql_tabs;
10914 		OPEN cur_tmp1Recs;
10915 		FETCH cur_tmp1Recs BULK COLLECT INTO
10916 			l_resource_assignment_id_tab
10917             		,l_txn_cur_code_tab
10918             		,l_start_date_tab
10919             		,l_end_date_tab
10920             		,l_period_name_tab
10921             		,l_budget_line_id_tab;
10922 		CLOSE cur_tmp1Recs;
10923 		--print_msg('Number of lines present in calc_tmp1 table inserted by calling api ['||l_budget_line_id_tab.COUNT||']');
10924 		IF l_budget_line_id_tab.COUNT > 0 THEN --{
10925 		 BEGIN  --{
10926 
10927 		  FORALL i IN l_budget_line_id_tab.FIRST .. l_budget_line_id_tab.LAST
10928 			INSERT INTO PA_BUDGET_LINES bl
10929             		(bl.BUDGET_LINE_ID
10930 			,bl.RESOURCE_ASSIGNMENT_ID --resource_assignment_id
10931                          ,bl.BUDGET_VERSION_ID     --budget_version_id
10932                          ,bl.TXN_CURRENCY_CODE     --txn_currency_code
10933                          ,bl.QUANTITY              --total_qty
10934                          ,bl.TXN_RAW_COST          --total_raw_cost
10935                          ,bl.TXN_BURDENED_COST     --total_burdened_cost
10936                          ,bl.TXN_REVENUE           --total_revenue
10937                          ,bl.TXN_STANDARD_COST_RATE             --raw_cost_rate
10938                          ,bl.TXN_COST_RATE_OVERRIDE    --rw_cost_rate_override
10939                          ,bl.BURDEN_COST_RATE      --b_cost_rate
10940                          ,bl.BURDEN_COST_RATE_OVERRIDE --b_cost_rate_override
10941                          ,bl.TXN_STANDARD_BILL_RATE             --bill_rate
10942                          ,bl.TXN_BILL_RATE_OVERRIDE    --bill_rate_override
10943                          ,bl.START_DATE            --line_start_date
10944                          ,bl.END_DATE              --line_end_date
10945             		 ,bl.PERIOD_NAME
10946             		 ,bl.PROJECT_CURRENCY_CODE
10947             		 ,bl.PROJFUNC_CURRENCY_CODE
10948             		 ,bl.PROJECT_COST_RATE_TYPE
10949             		 ,bl.PROJECT_COST_EXCHANGE_RATE
10950             		 ,bl.PROJECT_COST_RATE_DATE_TYPE
10951             		 ,bl.PROJECT_COST_RATE_DATE
10952             		 ,bl.PROJECT_REV_RATE_TYPE
10953             		 ,bl.PROJECT_REV_EXCHANGE_RATE
10954             		 ,bl.PROJECT_REV_RATE_DATE_TYPE
10955             		 ,bl.PROJECT_REV_RATE_DATE
10956             		 ,bl.PROJFUNC_COST_RATE_TYPE
10957             		 ,bl.PROJFUNC_COST_EXCHANGE_RATE
10958             		 ,bl.PROJFUNC_COST_RATE_DATE_TYPE
10959             		 ,bl.PROJFUNC_COST_RATE_DATE
10960             		 ,bl.PROJFUNC_REV_RATE_TYPE
10961             		 ,bl.PROJFUNC_REV_EXCHANGE_RATE
10962             		 ,bl.PROJFUNC_REV_RATE_DATE_TYPE
10963             		 ,bl.PROJFUNC_REV_RATE_DATE
10964             		 ,bl.CHANGE_REASON_CODE
10965             		 ,bl.DESCRIPTION
10966             		 ,bl.ATTRIBUTE_CATEGORY
10967             		 ,bl.ATTRIBUTE1
10968             		 ,bl.ATTRIBUTE2
10969             		,bl.ATTRIBUTE3
10970             		,bl.ATTRIBUTE4
10971             		,bl.ATTRIBUTE5
10972             		,bl.ATTRIBUTE6
10973             		,bl.ATTRIBUTE7
10974             		,bl.ATTRIBUTE8
10975             		,bl.ATTRIBUTE9
10976             		,bl.ATTRIBUTE10
10977             		,bl.ATTRIBUTE11
10978             		,bl.ATTRIBUTE12
10979             		,bl.ATTRIBUTE13
10980             		,bl.ATTRIBUTE14
10981             		,bl.ATTRIBUTE15
10982             		,bl.RAW_COST_SOURCE
10983             		,bl.BURDENED_COST_SOURCE
10984             		,bl.QUANTITY_SOURCE
10985             		,bl.REVENUE_SOURCE
10986             		,bl.PM_PRODUCT_CODE
10987             		,bl.PM_BUDGET_LINE_REFERENCE
10988             		,bl.CODE_COMBINATION_ID
10989             		,bl.CCID_GEN_STATUS_CODE
10990             		,bl.CCID_GEN_REJ_MESSAGE
10991             		,bl.BORROWED_REVENUE
10992             		,bl.TP_REVENUE_IN
10993             		,bl.TP_REVENUE_OUT
10994             		,bl.REVENUE_ADJ
10995             		,bl.LENT_RESOURCE_COST
10996             		,bl.TP_COST_IN
10997             		,bl.TP_COST_OUT
10998             		,bl.COST_ADJ
10999             		,bl.UNASSIGNED_TIME_COST
11000             		,bl.UTILIZATION_PERCENT
11001 			,bl.UTILIZATION_HOURS
11002             		,bl.UTILIZATION_ADJ
11003             		,bl.CAPACITY
11004             		,bl.HEAD_COUNT
11005             		,bl.HEAD_COUNT_ADJ
11006             		,bl.BUCKETING_PERIOD_CODE
11007             		,bl.TXN_DISCOUNT_PERCENTAGE
11008             		,bl.TRANSFER_PRICE_RATE
11009             		,bl.CREATED_BY
11010             		,bl.CREATION_DATE
11011 			,bl.LAST_UPDATED_BY
11012 			,bl.LAST_UPDATE_LOGIN
11013 			,bl.LAST_UPDATE_DATE
11014 				)
11015             		SELECT /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP1_N1) */ l_budget_line_id_tab(i)
11016 			 ,tmp.RESOURCE_ASSIGNMENT_ID --resource_assignment_id
11017                          ,tmp.BUDGET_VERSION_ID     --budget_version_id
11018                          ,tmp.TXN_CURRENCY_CODE     --txn_currency_code
11019                          ,tmp.QUANTITY              --total_qty
11020                          ,tmp.TXN_RAW_COST          --total_raw_cost
11021                          ,tmp.TXN_BURDENED_COST     --total_burdened_cost
11022                          ,tmp.TXN_REVENUE           --total_revenue
11023                          ,tmp.COST_RATE             --raw_cost_rate
11024                          ,tmp.COST_RATE_OVERRIDE    --rw_cost_rate_override
11025                          ,tmp.BURDEN_COST_RATE      --b_cost_rate
11026                          ,tmp.BURDEN_COST_RATE_OVERRIDE --b_cost_rate_override
11027                          ,tmp.BILL_RATE             --bill_rate
11028                          ,tmp.BILL_RATE_OVERRIDE    --bill_rate_override
11029                          ,tmp.START_DATE            --line_start_date
11030                          ,tmp.END_DATE              --line_end_date
11031              		,tmp.PERIOD_NAME
11032             		,tmp.PROJECT_CURRENCY_CODE
11033             		,tmp.PROJFUNC_CURRENCY_CODE
11034             		,tmp.PROJECT_COST_RATE_TYPE
11035             		,tmp.PROJECT_COST_EXCHANGE_RATE
11036             		,tmp.PROJECT_COST_RATE_DATE_TYPE
11037             		,tmp.PROJECT_COST_RATE_DATE
11038             		,tmp.PROJECT_REV_RATE_TYPE
11039             		,tmp.PROJECT_REV_EXCHANGE_RATE
11040             		,tmp.PROJECT_REV_RATE_DATE_TYPE
11041             		,tmp.PROJECT_REV_RATE_DATE
11042             		,tmp.PROJFUNC_COST_RATE_TYPE
11043             		,tmp.PROJFUNC_COST_EXCHANGE_RATE
11044             		,tmp.PROJFUNC_COST_RATE_DATE_TYPE
11045             		,tmp.PROJFUNC_COST_RATE_DATE
11046             		,tmp.PROJFUNC_REV_RATE_TYPE
11047             		,tmp.PROJFUNC_REV_EXCHANGE_RATE
11048             		,tmp.PROJFUNC_REV_RATE_DATE_TYPE
11049             		,tmp.PROJFUNC_REV_RATE_DATE
11050             		,tmp.CHANGE_REASON_CODE
11051             		,tmp.DESCRIPTION
11052             		,tmp.ATTRIBUTE_CATEGORY
11053             		,tmp.ATTRIBUTE1
11054             		,tmp.ATTRIBUTE2
11055             		,tmp.ATTRIBUTE3
11056             		,tmp.ATTRIBUTE4
11057             		,tmp.ATTRIBUTE5
11058             		,tmp.ATTRIBUTE6
11059             		,tmp.ATTRIBUTE7
11060             		,tmp.ATTRIBUTE8
11061             		,tmp.ATTRIBUTE9
11062             		,tmp.ATTRIBUTE10
11063             		,tmp.ATTRIBUTE11
11064             		,tmp.ATTRIBUTE12
11065             		,tmp.ATTRIBUTE13
11066             		,tmp.ATTRIBUTE14
11067             		,tmp.ATTRIBUTE15
11068             		,NVL(tmp.RAW_COST_SOURCE,l_bl_source)
11069             		,NVL(tmp.BURDENED_COST_SOURCE,l_bl_source)
11070             		,NVL(tmp.QUANTITY_SOURCE,l_bl_source)
11071             		,NVL(tmp.REVENUE_SOURCE,l_bl_source)
11072             		,tmp.PM_PRODUCT_CODE
11073             		,tmp.PM_BUDGET_LINE_REFERENCE
11074             		,tmp.CODE_COMBINATION_ID
11075             		,tmp.CCID_GEN_STATUS_CODE
11076             		,tmp.CCID_GEN_REJ_MESSAGE
11077             		,tmp.BORROWED_REVENUE
11078             		,tmp.TP_REVENUE_IN
11079             		,tmp.TP_REVENUE_OUT
11080             		,tmp.REVENUE_ADJ
11081             		,tmp.LENT_RESOURCE_COST
11082             		,tmp.TP_COST_IN
11083             		,tmp.TP_COST_OUT
11084             		,tmp.COST_ADJ
11085             		,tmp.UNASSIGNED_TIME_COST
11086             		,tmp.UTILIZATION_PERCENT
11087             		,tmp.UTILIZATION_HOURS
11088             		,tmp.UTILIZATION_ADJ
11089             		,tmp.CAPACITY
11090             		,tmp.HEAD_COUNT
11091             		,tmp.HEAD_COUNT_ADJ
11092             		,tmp.BUCKETING_PERIOD_CODE
11093             		,tmp.TXN_DISCOUNT_PERCENTAGE
11094             		,tmp.TRANSFER_PRICE_RATE
11095             		,tmp.BL_CREATED_BY
11096             		,tmp.BL_CREATION_DATE
11097 			,tmp.BL_CREATED_BY  --last updated by
11098 			,tmp.BL_CREATED_BY  -- lastupdate login
11099 			,trunc(sysdate)    -- last update dated
11100         		FROM PA_FP_SPREAD_CALC_TMP1 tmp
11101         		WHERE  tmp.resource_assignment_id = l_resource_assignment_id_tab(i)
11102         		AND   tmp.txn_currency_code =	l_txn_cur_code_tab(i)
11103 			AND   tmp.start_date = 	l_start_date_tab(i);
11104 
11105 		 EXCEPTION
11106 			WHEN OTHERS THEN
11107         			print_msg('Entered AutoBaseline bulk exception portion');
11108         			/* Now process the exceptions lines one-by-one */
11109         			l_exception_return_status := 'S';
11110             			v_NumErrors := SQL%BULK_EXCEPTIONS.COUNT;
11111         			l_x_cntr := 0;
11112         			FOR v_Count IN 1..v_NumErrors LOOP   --{
11113             			  l_x_cntr := l_x_cntr +1;
11114                 		  v_index_position  :=SQL%BULK_EXCEPTIONS(v_Count).error_index;
11115                 		  v_error_code      :=SQL%BULK_EXCEPTIONS(v_Count).error_code;
11116             			  l_err_error_code_tab(l_x_cntr)  := SQL%BULK_EXCEPTIONS(v_Count).error_code;
11117             			  l_err_budget_line_id_tab(l_x_cntr)  := l_budget_line_id_tab(v_index_position);
11118             			  l_err_raId_tab(l_x_cntr) := l_resource_assignment_id_tab(v_index_position);
11119             			  l_err_txn_cur_tab(l_x_cntr) := l_txn_cur_code_tab(v_index_position);
11120             			  l_err_sdate_tab(l_x_cntr)   := l_start_date_tab(v_index_position);
11121 				  l_err_edate_tab(l_x_cntr)   := l_end_date_tab(v_index_position);
11122 				  If v_error_code <> 1 then -- 1 means unique constraint voilation.
11123             				l_exception_return_status := 'U';
11124             				x_return_status := l_exception_return_status;
11125             				l_error_msg_code := SQLERRM(0 - SQL%BULK_EXCEPTIONS(v_Count).error_code);
11126 					print_msg('ErrorRaId['||l_err_raId_tab(l_x_cntr)||']TxnCur['||l_err_txn_cur_tab(l_x_cntr)||']');
11127 				        print_msg('SD['||l_err_sdate_tab(l_x_cntr)||']ED['||l_err_edate_tab(l_x_cntr)||']ErrorCode['||l_error_msg_code);
11128             				PA_UTILS.ADD_MESSAGE
11129                         		(p_app_short_name => 'PA'
11130             				,p_msg_name       => v_error_code||'-'||l_error_msg_code
11131                     			,p_token1         => 'G_PROJECT_NAME'
11132                     			,p_value1         => g_project_name
11133                     			,p_token2         => 'G_RESOURCE_ASSIGNMENT_ID'
11134                     			,p_value2         => l_err_raId_tab(l_x_cntr)
11135                     			,p_token3         => 'G_TXN_CURRENCY_CODE'
11136                     			,p_value3         => l_err_txn_cur_tab(l_x_cntr)
11137             				,p_token4         => 'G_BUDGET_LINE_ID'
11138             				,p_value4         => l_err_budget_line_id_tab(l_x_cntr)
11139             				);
11140             			  End If;
11141 			        END LOOP; --}
11142 				x_return_status := l_exception_return_status;
11143 		 END; --}
11144 		END IF; --} end of l_budget_line_id_tab.COUNT > 0
11145 	END IF;
11146 	Init_plsql_tabs;
11147 	IF P_PA_DEBUG_MODE = 'Y' Then
11148 	print_msg('Return Status of InsertFunding_ReqdLines api ['||x_return_status||']');
11149 	End If;
11150 EXCEPTION
11151 
11152  	WHEN OTHERS THEN
11153                 x_return_status := 'U';
11154                 print_msg('Error occured in InsertFunding_ReqdLines['|| SQLCODE||SQLERRM);
11155         	fnd_msg_pub.add_exc_msg
11156                 ( p_pkg_name       => 'PA_FP_CALC_UTILS'
11157                  ,p_procedure_name => 'InsertFunding_ReqdLines');
11158                 RAISE;
11159 
11160 END InsertFunding_ReqdLines;
11161 
11162 
11163 END PA_FP_CALC_UTILS;