DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_FP_CALC_PLAN_PKG

Source


1 PACKAGE BODY PA_FP_CALC_PLAN_PKG AS
2 --$Header: PAFPCALB.pls 120.37.12020000.6 2013/03/13 23:42:58 srakitin ship $
3 
4   g_module_name VARCHAR2(100) := 'pa.plsql.PA_FP_CALC_PLAN_PKG';
5   P_PA_DEBUG_MODE varchar2(1) := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
6 
7   skip_record EXCEPTION;
8   g_stage                            Varchar2(1000);
9   g_rowcount                         NUMBER;
10   g_budget_version_id                pa_resource_assignments.budget_version_id%TYPE;
11   g_project_currency_code            Varchar2(30);
12   g_projfunc_currency_code           Varchar2(30);
13   g_fp_budget_version_type           pa_budget_versions.version_type%TYPE;
14   g_project_id                       pa_resource_assignments.project_id%TYPE;
15   g_task_id                          pa_resource_assignments.task_id%TYPE;
16   g_time_phased_code                 VARCHAR2(100) := null;
17   g_resource_list_member_id          pa_resource_assignments.resource_list_member_id%TYPE;
18   g_bv_resource_list_id              pa_budget_versions.resource_list_id%TYPE;
19   g_resource_id                      NUMBER := to_number(null);
20   g_bv_approved_rev_flag             pa_budget_versions.approved_rev_plan_type_flag%TYPE;
21   g_fp_multi_curr_enabled            pa_proj_fp_options.plan_in_multi_curr_flag%TYPE;
22   g_project_name                     pa_projects_all.name%TYPE;
23   g_task_name                        pa_proj_elements.name%TYPE;
24   g_resource_name                    pa_resource_list_members.alias%TYPE;
25   g_spread_required_flag             VARCHAR2(1) := 'N';
26   g_rollup_required_flag             VARCHAR2(1) := 'Y';
27   g_wp_version_flag                  pa_budget_versions.wp_version_flag%TYPE;
28   g_proj_structure_ver_id            NUMBER;
29   g_ra_bl_txn_currency_code          pa_budget_lines.txn_currency_code%TYPE := NULL;
30   g_line_start_date                  pa_fp_res_assignments_tmp.line_start_date%TYPE;
31   g_line_end_date                    pa_fp_res_assignments_tmp.line_end_date%TYPE;
32   g_source_context                   pa_fp_res_assignments_tmp.source_context%TYPE;
33   g_clientExtn_api_call_flag         VARCHAR2(1) :=  'Y' ;
34   g_session_time                     VARCHAR2(30);
35   g_owner_name               Varchar2(100);
36   g_Plan_Class_Type                 VARCHAR2(100);
37     G_AGR_CONV_REQD_FLAG        VARCHAR2(30) := 'N';
38     G_AGR_CURRENCY_CODE         VARCHAR2(30);
39     --G_APPLY_PROGRESS_FLAG         VARCHAR2(30) := 'N';
40     G_TRACK_WP_COSTS_FLAG           VARCHAR2(30) := 'Y';
41     G_refresh_conv_rates_flag       VARCHAR2(30) := 'N';
42         G_refresh_rates_flag            VARCHAR2(30) := 'N';
43         G_mass_adjust_flag              VARCHAR2(30) := 'N';
44     G_MRC_installed_flag            VARCHAR2(30) := 'N';
45     G_revenue_generation_method     VARCHAR2(30) := NULL;
46     G_proj_rev_rate_type        VARCHAR2(100):= NULL;
47         G_proj_rev_exchange_rate    NUMBER       := NULL;
48     G_CiId              NUMBER       := NULL;
49     G_baseline_funding_flag         VARCHAR2(10) := 'N';
50     G_calling_module            VARCHAR2(100);
51     G_conv_rates_required_flag      VARCHAR2(10) := 'Y';
52     G_fp_cols_rec          PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
53     --G_populate_mrc_tab_flag         VARCHAR2(10) := 'N';
54     G_call_raTxn_rollup_flag		VARCHAR2(10) := 'Y';
55 
56 g_ipm_ra_id_tab                    SYSTEM.pa_num_tbl_type := SYSTEM.pa_num_tbl_type();
57 g_ipm_curr_code_tab                SYSTEM.pa_varchar2_30_tbl_type := SYSTEM.pa_varchar2_30_tbl_type();
58 g_ipm_cost_rate_ovr_tab            SYSTEM.pa_num_tbl_type := SYSTEM.pa_num_tbl_type();
59 g_ipm_bill_rate_ovr_tab            SYSTEM.pa_num_tbl_type := SYSTEM.pa_num_tbl_type();
60 g_ipm_burden_rate_ovr_tab          SYSTEM.pa_num_tbl_type := SYSTEM.pa_num_tbl_type();
61 
62     /* Billabliity and MRC Enhancements: Note declaring table of records cannot be used in Bulk updates / bulk inserts
63      * so 9.2.5.0 version donot support the builk-in-bind of table of records with indexes
64      * so commenting it out for time being
65     TYPE mrc_fpRec IS RECORD  (
66         budget_line_id      pa_fp_rollup_tmp.budget_line_id%type
67         ,resource_assignment_id pa_fp_rollup_tmp.resource_assignment_id%type
68         ,txn_currency_code      pa_fp_rollup_tmp.txn_currency_code%type
69         ,start_date     pa_fp_rollup_tmp.start_date%type
70             ,end_date       pa_fp_rollup_tmp.start_date%type
71             ,period_name        pa_fp_rollup_tmp.period_name%type
72             ,quantity       Number
73             ,txn_raw_cost       Number
74             ,txn_burdened_cost  Number
75             ,txn_revenue        Number
76             ,project_currency_code  pa_fp_rollup_tmp.txn_currency_code%type
77             ,project_raw_cost   Number
78             ,project_burden_cost    Number
79             ,project_revenue        Number
80             ,projfunc_currency_code pa_fp_rollup_tmp.txn_currency_code%type
81             ,projfunc_raw_cost      Number
82             ,projfunc_burden_cost   Number
83             ,projfunc_revenue       Number
84         ,delete_flag            pa_fp_rollup_tmp.delete_flag%type
85         ,Billable_flag          pa_fp_rollup_tmp.delete_flag%type
86         ,project_cost_rate_type        pa_fp_rollup_tmp.project_cost_rate_type%type
87             ,project_cost_exchange_rate    pa_fp_rollup_tmp.project_cost_exchange_rate%type
88         ,project_cost_rate_date_type   pa_fp_rollup_tmp.project_cost_rate_date_type%type
89             ,project_cost_rate_date     pa_fp_rollup_tmp.project_cost_rate_date%type
90             ,project_rev_rate_type      pa_fp_rollup_tmp.project_rev_rate_type%type
91             ,project_rev_exchange_rate  pa_fp_rollup_tmp.project_rev_exchange_rate%type
92             ,project_rev_rate_date_type pa_fp_rollup_tmp.project_rev_rate_date_type%type
93             ,project_rev_rate_date      pa_fp_rollup_tmp.project_rev_rate_date%type
94             ,projfunc_cost_rate_type    pa_fp_rollup_tmp.projfunc_cost_rate_type%type
95             ,projfunc_cost_exchange_rate    pa_fp_rollup_tmp.projfunc_cost_exchange_rate%type
96             ,projfunc_cost_rate_date_type   pa_fp_rollup_tmp.projfunc_cost_rate_date_type%type
97             ,projfunc_cost_rate_date    pa_fp_rollup_tmp.projfunc_cost_rate_date%type
98             ,projfunc_rev_rate_type     pa_fp_rollup_tmp.projfunc_rev_rate_type%type
99             ,projfunc_rev_exchange_rate pa_fp_rollup_tmp.projfunc_rev_exchange_rate%type
100             ,projfunc_rev_rate_date_type    pa_fp_rollup_tmp.projfunc_rev_rate_date_type%type
101             ,projfunc_rev_rate_date     pa_fp_rollup_tmp.projfunc_rev_rate_date%type
102         );
103     TYPE mrc_fpTab IS TABLE OF mrc_fpRec INDEX BY  BINARY_INTEGER;
104     G_FP_MRC_TAB        mrc_fpTab;
105     */
106     /* declare global plsql tabls for mrc enhancements */
107     g_mrc_budget_line_id_tab                pa_plsql_datatypes.NumTabTyp;
108     g_mrc_res_assignment_id_tab         pa_plsql_datatypes.NumTabTyp;
109         g_mrc_txn_curr_code_tab         pa_plsql_datatypes.Char80TabTyp;
110         g_mrc_start_date_tab                pa_plsql_datatypes.DateTabTyp;
111         g_mrc_end_date_tab                  pa_plsql_datatypes.DateTabTyp;
112         g_mrc_period_name_tab               pa_plsql_datatypes.Char80TabTyp;
113         g_mrc_quantity_tab                  pa_plsql_datatypes.NumTabTyp;
114         g_mrc_txn_raw_cost_tab              pa_plsql_datatypes.NumTabTyp;
115         g_mrc_txn_burden_cost_tab           pa_plsql_datatypes.NumTabTyp;
116         g_mrc_txn_revenue_tab               pa_plsql_datatypes.NumTabTyp;
117         g_mrc_project_curr_code_tab         pa_plsql_datatypes.Char80TabTyp;
118         g_mrc_project_raw_cost_tab          pa_plsql_datatypes.NumTabTyp;
119         g_mrc_project_burden_cost_tab       pa_plsql_datatypes.NumTabTyp;
120         g_mrc_project_revenue_tab           pa_plsql_datatypes.NumTabTyp;
121         g_mrc_projfunc_curr_code_tab        pa_plsql_datatypes.Char80TabTyp;
122         g_mrc_projfunc_raw_cost_tab         pa_plsql_datatypes.NumTabTyp;
123         g_mrc_projfunc_burden_cost_tab      pa_plsql_datatypes.NumTabTyp;
124         g_mrc_projfunc_revenue_tab          pa_plsql_datatypes.NumTabTyp;
125         g_mrc_delete_flag_tab               pa_plsql_datatypes.Char1TabTyp;
126         g_mrc_Billable_flag_tab             pa_plsql_datatypes.Char1TabTyp;
127         g_mrc_project_cst_rt_type_tab        pa_plsql_datatypes.Char80TabTyp;
128         g_mrc_project_cst_exg_rt_tab        pa_plsql_datatypes.NumTabTyp;
129         g_mrc_project_cst_dt_type_tab   pa_plsql_datatypes.Char80TabTyp;
130         g_mrc_project_cst_rt_dt_tab         pa_plsql_datatypes.DateTabTyp;
131         g_mrc_project_rev_rt_type_tab         pa_plsql_datatypes.Char80TabTyp;
132         g_mrc_project_rev_exg_rt_tab        pa_plsql_datatypes.NumTabTyp;
133         g_mrc_project_rev_dt_type_tab         pa_plsql_datatypes.Char80TabTyp;
134         g_mrc_project_rev_rt_dt_tab         pa_plsql_datatypes.DateTabTyp;
135         g_mrc_projfunc_cst_rt_type_tab       pa_plsql_datatypes.Char80TabTyp;
136         g_mrc_projfunc_cst_exg_rt_tab   pa_plsql_datatypes.NumTabTyp;
137         g_mrc_projfunc_cst_dt_type_tab  pa_plsql_datatypes.Char80TabTyp;
138         g_mrc_projfunc_cst_rt_dt_tab       pa_plsql_datatypes.DateTabTyp;
139         g_mrc_projfunc_rev_rt_type_tab        pa_plsql_datatypes.Char80TabTyp;
140         g_mrc_projfunc_rev_exg_rt_tab       pa_plsql_datatypes.NumTabTyp;
141         g_mrc_projfunc_rev_dt_type_tab      pa_plsql_datatypes.Char80TabTyp;
142         g_mrc_projfunc_rev_rt_dt_tab        pa_plsql_datatypes.DateTabTyp;
143 
144     /* The following plsql tabls are declared for bulk processing of spread calls */
145         g_sprd_raId_tab         pa_plsql_datatypes.NumTabTyp;
146         g_sprd_txn_cur_tab      pa_plsql_datatypes.Char50TabTyp;
147         g_sprd_sdate_tab        pa_plsql_datatypes.DateTabTyp;
148         g_sprd_edate_tab        pa_plsql_datatypes.DateTabTyp;
149         g_sprd_plan_sdate_tab       pa_plsql_datatypes.DateTabTyp;
150         g_sprd_plan_edate_tab       pa_plsql_datatypes.DateTabTyp;
151         g_sprd_txn_rev_tab      pa_plsql_datatypes.NumTabTyp;
152         g_sprd_txn_rev_addl_tab     pa_plsql_datatypes.NumTabTyp;
153         g_sprd_txn_raw_tab      pa_plsql_datatypes.NumTabTyp;
154         g_sprd_txn_raw_addl_tab     pa_plsql_datatypes.NumTabTyp;
155         g_sprd_txn_burd_tab     pa_plsql_datatypes.NumTabTyp;
156         g_sprd_txn_burd_addl_tab    pa_plsql_datatypes.NumTabTyp;
157         g_sprd_qty_tab          pa_plsql_datatypes.NumTabTyp;
158         g_sprd_qty_addl_tab     pa_plsql_datatypes.NumTabTyp;
159         g_sprd_txn_cur_ovr_tab      pa_plsql_datatypes.Char50TabTyp;
160         g_sprd_txn_init_rev_tab     pa_plsql_datatypes.NumTabTyp;
161         g_sprd_txn_init_raw_tab     pa_plsql_datatypes.NumTabTyp;
162         g_sprd_txn_init_burd_tab    pa_plsql_datatypes.NumTabTyp;
163         g_sprd_txn_init_qty_tab     pa_plsql_datatypes.NumTabTyp;
164         g_sprd_spread_reqd_flag_tab pa_plsql_datatypes.Char1TabTyp;
165         g_sprd_costRt_tab       pa_plsql_datatypes.NumTabTyp;
166         g_sprd_costRt_Ovr_tab       pa_plsql_datatypes.NumTabTyp;
167         g_sprd_burdRt_Tab       pa_plsql_datatypes.NumTabTyp;
168         g_sprd_burdRt_Ovr_tab       pa_plsql_datatypes.NumTabTyp;
169         g_sprd_billRt_tab       pa_plsql_datatypes.NumTabTyp;
170         g_sprd_billRt_Ovr_tab       pa_plsql_datatypes.NumTabTyp;
171         g_sprd_ratebase_flag_tab    pa_plsql_datatypes.Char1TabTyp;
172         g_sprd_projCur_tab      pa_plsql_datatypes.Char50TabTyp;
173         g_sprd_projfuncCur_tab      pa_plsql_datatypes.Char50TabTyp;
174     g_sprd_task_id_tab              pa_plsql_datatypes.NumTabTyp;
175     g_sprd_rlm_id_tab       pa_plsql_datatypes.NumTabTyp;
176     g_sprd_sp_fixed_date_tab        pa_plsql_datatypes.DateTabTyp;
177     g_sprd_spcurve_id_tab           pa_plsql_datatypes.NumTabTyp;
178     g_sprd_cstRtmissFlag_tab    pa_plsql_datatypes.Char1TabTyp;
179     g_sprd_bdRtmissFlag_tab    pa_plsql_datatypes.Char1TabTyp;
180     g_sprd_bilRtmissFlag_tab    pa_plsql_datatypes.Char1TabTyp;
181 	g_sprd_QtymissFlag_tab    pa_plsql_datatypes.Char1TabTyp;
182     	g_sprd_RawmissFlag_tab    pa_plsql_datatypes.Char1TabTyp;
183     	g_sprd_BurdmissFlag_tab    pa_plsql_datatypes.Char1TabTyp;
184 	g_sprd_RevmissFlag_tab    pa_plsql_datatypes.Char1TabTyp;
185 	/* Bug fix:5726773 */
186  	g_sprd_neg_Qty_Changflag_tab pa_plsql_datatypes.Char1TabTyp;
187  	g_sprd_neg_Raw_Changflag_tab pa_plsql_datatypes.Char1TabTyp;
188  	g_sprd_neg_Burd_Changflag_tab pa_plsql_datatypes.Char1TabTyp;
189  	g_sprd_neg_rev_Changflag_tab pa_plsql_datatypes.Char1TabTyp;
190 
191 
192     /* The following plsql tables defined for bulk processing of rollup tmp for refresh action */
193     g_plan_raId_tab              pa_plsql_datatypes.NumTabTyp;
194     g_plan_txnCur_Tab            pa_plsql_datatypes.Char50TabTyp;
195     g_line_sdate_tab                pa_plsql_datatypes.DateTabTyp;
196     g_line_edate_tab                pa_plsql_datatypes.DateTabTyp;
197     g_Wp_curCode_tab                pa_plsql_datatypes.Char50TabTyp;
198     g_refresh_rates_tab     pa_plsql_datatypes.Char1TabTyp;
199         g_refresh_conv_rates_tab    pa_plsql_datatypes.Char1TabTyp;
200         g_mass_adjust_flag_tab      pa_plsql_datatypes.Char1TabTyp;
201     g_mfc_cost_refresh_tab          pa_plsql_datatypes.Char1TabTyp;
202     g_skip_record_tab       pa_plsql_datatypes.Char1TabTyp;
203 	g_process_skip_CstRevrec_tab pa_plsql_datatypes.Char1TabTyp;
204     g_mfc_cost_refrsh_Raid_tab      pa_plsql_datatypes.NumTabTyp;
205         g_mfc_cost_refrsh_txnCur_tab    pa_plsql_datatypes.Char50TabTyp;
206 
207     /* Bug fix:4295967 During Apply progress, If no change in the ETC quantity then re derive the ETC costs*/
208     g_applyProg_refreshRts_tab      pa_plsql_datatypes.Char1TabTyp;
209     g_applyProg_RaId_tab        pa_plsql_datatypes.NumTabTyp;
210         g_applyProg_TxnCur_tab      pa_plsql_datatypes.Char50TabTyp;
211 
212 
213     /* The following plsql tables defined for bulk processing of rate ONLY changed resource */
214     g_rtChanged_Ra_Flag_tab     pa_plsql_datatypes.Char1TabTyp;
215     g_rtChanged_RaId_tab        pa_plsql_datatypes.NumTabTyp;
216         g_rtChanged_TxnCur_tab      pa_plsql_datatypes.Char50TabTyp;
217     g_rtChanged_sDate_tab       pa_plsql_datatypes.DateTabTyp;
218     g_rtChanged_eDate_tab       pa_plsql_datatypes.DateTabTyp;
219         g_rtChanged_CostRt_Tab      pa_plsql_datatypes.NumTabTyp;
220         g_rtChanged_BurdRt_tab      pa_plsql_datatypes.NumTabTyp;
221         g_rtChanged_billRt_tab      pa_plsql_datatypes.NumTabTyp;
222     	g_rtChanged_cstMisNumFlg_tab pa_plsql_datatypes.Char1TabTyp;
223         g_rtChanged_bdMisNumFlag_tab pa_plsql_datatypes.Char1TabTyp;
224         g_rtChanged_blMisNumFlag_tab pa_plsql_datatypes.Char1TabTyp;
225 	g_rtChanged_QtyMisNumFlg_tab pa_plsql_datatypes.Char1TabTyp;
226         g_rtChanged_RwMisNumFlag_tab pa_plsql_datatypes.Char1TabTyp;
227         g_rtChanged_BrMisNumFlag_tab pa_plsql_datatypes.Char1TabTyp;
228 	g_rtChanged_RvMisNumFlag_tab pa_plsql_datatypes.Char1TabTyp;
229 
230     g_apply_progress_flag_tab       SYSTEM.pa_varchar2_1_tbl_type := SYSTEM.pa_varchar2_1_tbl_type();
231 
232 	g_etcrevrej_raId_tab		pa_plsql_datatypes.NumTabTyp;
233         g_etcrevrej_txnCur_tab		pa_plsql_datatypes.Char30TabTyp;
234         g_etcrevrej_revenue_tab	        pa_plsql_datatypes.NumTabTyp;
235         g_etcrevrej_start_date_tab	pa_plsql_datatypes.DateTabTyp;
236         g_etcrevrej_end_date_tab	pa_plsql_datatypes.DateTabTyp;
237 
238     -- Added for Bug# 6781055
239     gl_cl_roll_up_tmp_rowid_tab    pa_plsql_datatypes.RowidTabTyp;
240 
241     /*Declare global cursors so that the same cursor can be opend at many places
242     * and maintenance of the code is simple and easy
243     */
244     CURSOR get_proj_fp_options_csr(p_budget_version_id  Number) IS
245         SELECT nvl(pfo.use_planning_rates_flag,'N') use_planning_rates_flag
246           ,decode(nvl(bv.wp_version_flag,'N'),'Y',NVL(pfo.track_workplan_costs_flag,'N'),'Y') track_workplan_costs_flag
247           ,bv.version_type
248           ,bv.resource_list_id
249           ,bv.approved_rev_plan_type_flag
250           ,nvl(pfo.plan_in_multi_curr_flag,'N') plan_in_multi_curr_flag
251           ,bv.etc_start_date
252           ,nvl(bv.wp_version_flag,'N') wp_version_flag
253           ,decode(bv.version_type,
254                   'COST',NVL(pfo.cost_time_phased_code,'N'),
255                   'REVENUE',NVL(pfo.revenue_time_phased_code,'N'),
256                   NVL(pfo.all_time_phased_code,'N')) time_phased_code
257           ,bv.project_structure_version_id
258           ,bv.project_id
259           ,pp.project_currency_code
260           ,pp.projfunc_currency_code
261           ,pp.segment1  project_Name
262           ,bv.ci_id     CiId
263           /*Bugfix:4272944 */
264           ,NVL(pp.baseline_funding_flag,'N') baseline_funding_flag
265       ,decode(fpt.plan_class_code,'BUDGET'
266             ,decode(bv.wp_version_flag,'Y','WORKPLAN',fpt.plan_class_code),fpt.plan_class_code) Plan_Class_Type
267         FROM pa_proj_fp_options pfo
268             ,pa_budget_versions bv
269             ,pa_projects_all pp
270         ,pa_fin_plan_types_b fpt
271         WHERE pfo.fin_plan_version_id = bv.budget_version_id
272         AND  bv.project_id = pp.project_id
273     AND  fpt.fin_plan_type_id = pfo.fin_plan_type_id
274         AND bv.budget_version_id = p_budget_version_id;
275         ProjFpOptRec    get_proj_fp_options_csr%ROWTYPE;
276 
277 
278 
279     /* Rounding enhancements: modified the rate derivation logic. instead of deriving rate = sum(amount) / sum(quantity)
280          * derive rate = sum(quantity * periodic line rate) / sum(quantity)
281      * this will take care of rounded decimals and on the UI
282      * For more details refer to Rounding issues details design doc
283      */
284     CURSOR cur_avgBlrts(p_resource_asg_id IN NUMBER
285                          ,p_txn_curr_code   IN VARCHAR2
286                          ,p_line_start_date IN DATE
287                          ,p_line_end_date   IN DATE ) IS
288     SELECT /*+ INDEX(blavgrt PA_BUDGET_LINES_U1) */
289         AVG(DECODE((nvl(blavgrt.quantity,0) - nvl(blavgrt.init_quantity,0)),0,NULL
290 			,blavgrt.txn_cost_rate_override)) avg_txn_cost_rate_override
291                ,AVG(DECODE((nvl(blavgrt.quantity,0) - nvl(blavgrt.init_quantity,0)),0,NULL
292 			,blavgrt.burden_cost_rate_override))   avg_burden_cost_rate_override
293                ,AVG(DECODE((nvl(blavgrt.quantity,0) - nvl(blavgrt.init_quantity,0)),0,NULL
294 			,blavgrt.txn_bill_rate_override)) avg_txn_bill_rate_override
295            /* Bug fix: 5172318 Not required as part of IPM changes
296            ,SUM(nvl(blavgrt.quantity,0) - nvl(blavgrt.init_quantity,0)) sum_etc_Qty
297            ,SUM(nvl(blavgrt.init_quantity,0)) sum_Actual_Qty
298            ,SUM(nvl(blavgrt.quantity,0)) sum_Plan_Qty
299 	   */
300            /*bug fix:4693839 */
301            ,AVG(NVL(blavgrt.txn_cost_rate_override,blavgrt.txn_standard_cost_rate)) avg_zero_null_cost_rate
302            ,AVG(NVL(blavgrt.burden_cost_rate_override,blavgrt.burden_cost_rate))    avg_zero_null_burden_rate
303            ,AVG(NVL(blavgrt.txn_bill_rate_override,blavgrt.txn_standard_bill_rate)) avg_zero_null_bill_rate
304              FROM pa_budget_lines blavgrt
305              WHERE blavgrt.resource_assignment_id = p_resource_asg_id
306              AND blavgrt.txn_currency_code      = p_txn_curr_code
307              AND ( (p_line_start_date is NULL AND p_line_end_date is NULL )
308                 OR
309                  (p_line_start_date is NOT NULL AND p_line_end_date is NOT NULL
310                   AND blavgrt.start_date BETWEEN p_line_start_date AND p_line_end_date)
311                  );
312 
313     AvgBlRec   cur_avgBlrts%ROWTYPE;
314         CURSOR get_bl_date_csr (p_resource_asg_id IN NUMBER
315                          ,p_txn_curr_code   IN VARCHAR2
316                          ,p_line_start_date IN DATE
317                          ,p_line_end_date   IN DATE
318              ,p_avg_txn_cost_rate_override IN NUMBER
319              ,p_avg_burden_rate_override IN NUMBER
320              ,p_avg_bill_rate_override IN NUMBER ) IS
321         SELECT /*+ INDEX(BL PA_BUDGET_LINES_U1) */
322           decode(sum(bl.quantity),0,NULL,sum(bl.quantity)) quantity
323              ,decode( sum(bl.txn_raw_cost),0,NULL,sum(bl.txn_raw_cost)) txn_raw_cost
324              ,decode(sum(bl.txn_burdened_cost),0,NULL,sum(bl.txn_burdened_cost)) txn_burdened_cost
325              ,decode(sum(bl.txn_revenue),0,NULL,sum(bl.txn_revenue)) txn_revenue
326              -- Actuals for ETC calculation
327             ,decode(sum(bl.init_quantity),0,NULL,sum(bl.init_quantity)) init_quantity
328             ,decode(sum(bl.txn_init_raw_cost),0,NULL,sum(bl.txn_init_raw_cost)) init_raw_cost
329             ,decode(sum(bl.txn_init_burdened_cost),0,NULL,sum(bl.txn_init_burdened_cost)) init_burdened_cost
330             ,decode(sum(bl.txn_init_revenue),0,NULL,sum(bl.txn_init_revenue)) init_revenue
331              ,(sum(decode(p_avg_txn_cost_rate_override,NULL,NULL
332                     ,decode((nvl(bl.quantity,0) - nvl(bl.init_quantity,0)),0,NULL
333                     ,decode(nvl(bl.txn_cost_rate_override,nvl(bl.txn_standard_cost_rate,0)),0,NULL
334                         ,((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)) *
335 			  nvl(bl.txn_cost_rate_override,nvl(bl.txn_standard_cost_rate,0)))))))
336                / DECODE((sum(decode(p_avg_txn_cost_rate_override,NULL,NULL
337                     ,decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,NULL
338                     ,decode(nvl(bl.txn_cost_rate_override,nvl(bl.txn_standard_cost_rate,0)),0,null
339 			,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0)))))))
340           	,0,NULL,
341           	(sum(decode(p_avg_txn_cost_rate_override,NULL,NULL
342                     ,decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,NULL
343                     ,decode(nvl(bl.txn_cost_rate_override,nvl(bl.txn_standard_cost_rate,0)),0,null
344 			,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0)))))))
345           	)
346               ) etc_cost_rate_override
347              ,(sum(decode(p_avg_burden_rate_override,NULL,NULL
348                     ,decode((nvl(bl.quantity,0) - nvl(bl.init_quantity,0)),0,NULL
349                     ,decode(nvl(bl.burden_cost_rate_override,nvl(bl.burden_cost_rate,0)),0,NULL
350                         ,((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)) *
351 			   nvl(bl.burden_cost_rate_override,nvl(bl.burden_cost_rate,0)))))))
352                / DECODE((sum(decode(p_avg_burden_rate_override,NULL,NULL
353                     ,decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,NULL
354                     ,decode(nvl(bl.burden_cost_rate_override,nvl(bl.burden_cost_rate,0)),0,NULL
355 			,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0)))))))
356           		,0,NULL,
357            	(sum(decode(p_avg_burden_rate_override,NULL,NULL
358                     ,decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,NULL
359                     ,decode(nvl(bl.burden_cost_rate_override,nvl(bl.burden_cost_rate,0)),0,NULL
360 			,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0)))))))
361           	)
362               ) etc_burden_rate_override
363              ,(sum(decode(p_avg_bill_rate_override,NULL,NULL
364                     , decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,NULL
365                     ,decode(nvl(bl.txn_bill_rate_override,nvl(bl.txn_standard_bill_rate,0)),0,NULL
366                         ,((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)) *
367 			nvl(bl.txn_bill_rate_override,nvl(bl.txn_standard_bill_rate,0)))))))
368                / DECODE((sum(decode(p_avg_bill_rate_override,NULL,NULL
369                     ,decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,NULL
370                     ,decode(nvl(bl.txn_bill_rate_override,nvl(bl.txn_standard_bill_rate,0)),0,null
371 			,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0)))))))
372           	,0,NULL,
373            	(sum(decode(p_avg_bill_rate_override,NULL,NULL
374                     ,decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,NULL
375                     ,decode(nvl(bl.txn_bill_rate_override,nvl(bl.txn_standard_bill_rate,0)),0,null
376 			,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0)))))))
377            	)
378               ) etc_bill_rate_override
379              ,(sum(( decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,null
380                     ,decode(nvl(bl.txn_bill_rate_override,nvl(bl.txn_standard_bill_rate,0)),0,null
381                         ,((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)) *
382 			nvl(bl.txn_bill_rate_override,nvl(bl.txn_standard_bill_rate,0)))))))
383                / DECODE((sum(decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,null
384                     ,decode(nvl(bl.txn_bill_rate_override,nvl(bl.txn_standard_bill_rate,0)),0,null
385 			,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0))))))
386           	,0,NULL,
387            	(sum(decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,null
388                     ,decode(nvl(bl.txn_bill_rate_override,nvl(bl.txn_standard_bill_rate,0)),0
389 			,null,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0))))))
390         	)
391               ) etc_bill_rate
392            	,(sum(( decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,null
393                     ,decode(nvl(bl.txn_cost_rate_override,nvl(bl.txn_standard_cost_rate,0)),0,null
394                         ,((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)) *
395 			nvl(bl.txn_cost_rate_override,nvl(bl.txn_standard_cost_rate,0)))))))
396                / DECODE((sum(decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,null
397                     ,decode(nvl(bl.txn_cost_rate_override,nvl(bl.txn_standard_cost_rate,0)),0,null
398 			,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0))))))
399            	,0,NULL,
400             	(sum(decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,null
401                     ,decode(nvl(bl.txn_cost_rate_override,nvl(bl.txn_standard_cost_rate,0)),0,null
402 			,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0))))))
403         	)
404               ) etc_cost_rate
405              ,(sum(( decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,null
406                     ,decode(nvl(bl.burden_cost_rate_override,nvl(bl.burden_cost_rate,0)),0,null
407                         ,((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)) *
408 			  nvl(bl.burden_cost_rate_override,nvl(bl.burden_cost_rate,0)))))))
409                / DECODE((sum(decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,null
410                     ,decode(nvl(bl.burden_cost_rate_override,nvl(bl.burden_cost_rate,0)),0,null
411 			,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0))))))
412           	,0,NULL,
413            	(sum(decode((nvl(bl.quantity,0)- nvl(bl.init_quantity,0)),0,null
414                     ,decode(nvl(bl.burden_cost_rate_override,nvl(bl.burden_cost_rate,0)),0,null
415 			,(nvl(bl.quantity,0)- nvl(bl.init_quantity,0))))))
416         	)
417               ) etc_burden_rate
418        		/* Bug fix:4693839 Currently all the UI page shows null instead of zeros, and when they pass to param value
419            * will be passed null, representing no change, but some other API like AMG etc, may pass zero in param value.
420            * In order to avoid changing all the calling api, this api is modified to handle nulls and zeros carefully */
421            ,SUM(bl.quantity)              bl_zero_null_quantity
422            ,SUM(bl.txn_raw_cost)          bl_zero_null_rawcost
423            ,SUM(bl.txn_burdened_cost)     bl_zero_null_burdencost
424            ,SUM(bl.txn_revenue)           bl_zero_null_revenue
425            ,SUM(bl.display_quantity)      display_quantity --Bug 6429285
426         FROM pa_budget_lines bl
427         WHERE bl.resource_assignment_id = p_resource_asg_id
428         AND bl.txn_currency_code      = p_txn_curr_code
429         AND ( (p_line_start_date is NULL AND p_line_end_date is NULL )
430              OR
431             (p_line_start_date is NOT NULL AND p_line_end_date is NOT NULL
432             AND bl.start_date BETWEEN p_line_start_date AND p_line_end_date)
433            ) ;
434 
435     /* Bug fix:4900436: IPM Enhancements: */
436         CURSOR cur_ra_txn_rates (p_resource_asg_id IN NUMBER
437                             ,p_txn_curr_code   IN VARCHAR2) IS
438         SELECT  decode(rtx.total_quantity,0,null,rtx.total_quantity) quantity
439                 ,decode( rtx.total_txn_raw_cost,0,NULL,rtx.total_txn_raw_cost) txn_raw_cost
440                 ,decode(rtx.total_txn_burdened_cost,0,NULL,rtx.total_txn_burdened_cost) txn_burdened_cost
441                 ,decode(rtx.total_txn_revenue,0,NULL,rtx.total_txn_revenue) txn_revenue
442                 ,decode(rtx.total_init_quantity,0,NULL,rtx.total_init_quantity) init_quantity
443                 ,decode(rtx.total_txn_init_raw_cost,0,NULL,rtx.total_txn_init_raw_cost) init_raw_cost
444                 ,decode(rtx.total_txn_init_burdened_cost,0,NULL,rtx.total_txn_init_burdened_cost) init_burdened_cost
445                 ,decode(rtx.total_txn_init_revenue,0,NULL,rtx.total_txn_init_revenue) init_revenue
446                 ,rtx.TXN_RAW_COST_RATE_OVERRIDE     etc_cost_rate_override
447                 ,rtx.TXN_BURDEN_COST_RATE_OVERRIDE  etc_burden_rate_override
448                 ,rtx.TXN_BILL_RATE_OVERRIDE         etc_bill_rate_override
449                 ,rtx.TXN_ETC_BILL_RATE          etc_bill_rate
450                 ,rtx.TXN_ETC_RAW_COST_RATE      etc_cost_rate
451                 ,rtx.TXN_ETC_BURDEN_COST_RATE       etc_burden_rate
452             ,rtx.total_quantity                 bl_zero_null_quantity
453             ,rtx.total_txn_raw_cost             bl_zero_null_rawcost
454             ,rtx.total_txn_burdened_cost        bl_zero_null_burdencost
455             ,rtx.total_txn_revenue              bl_zero_null_revenue
456             ,rtx.total_display_quantity         display_quantity --Bug 6429285
457     FROM pa_resource_asgn_curr rtx
458     WHERE rtx.resource_assignment_id = p_resource_asg_id
459     AND  rtx.txn_currency_code = p_txn_curr_code;
460 
461 /*
462 procedure calc_log(p_msg  varchar2) IS
463 
464         pragma autonomous_transaction ;
465 BEGIN
466             INSERT INTO PA_FP_CALCULATE_LOG
467                 (SESSIONID
468                 ,SEQ_NUMBER
469                 ,LOG_MESSAGE)
470             VALUES
471                 (userenv('sessionid')
472                 ,HR.PAY_US_GARN_FEE_RULES_S.nextval
473                 ,substr(P_MSG,1,240)
474                 );
475 	COMMIT;
476 end calc_log;
477 */
478 
479 procedure print_plsql_time(P_MSG  VARCHAR2
480            ,p_dbug_flag VARCHAR2 default 'N') is
481 
482 BEGIN
483 	null;
484       	--calc_log(P_MSG);
485 	--dbms_output.put_line(p_msg);
486 END print_plsql_time;
487 
488 procedure PRINT_MSG(P_MSG  VARCHAR2
489            ,p_dbug_flag VARCHAR2 default 'N') is
490 
491 BEGIN
492       --calc_log(P_MSG);
493         IF (P_PA_DEBUG_MODE = 'Y' ) Then
494             pa_debug.g_err_stage := substr('LOG:'||p_msg,1,240);
495             PA_DEBUG.write
496             (x_Module   => g_module_name
497             ,x_Msg      => pa_debug.g_err_stage
498             ,x_Log_Level    => 3);
499             --pa_debug.write_file('LOG: '||pa_debug.g_err_stage);
500         END IF;
501     /* Incase of performance issue without enabling the debugs get the timings for each API */
502     /**
503     IF (P_PA_DEBUG_MODE = 'N' AND nvl(p_dbug_flag,'N') = 'Y' ) THEN
504         FND_LOG_REPOSITORY.STR_UNCHKED_INT_WITH_CONTEXT
505                 (LOG_LEVEL      => 3
506                 ,MODULE         => g_module_name
507                 ,MESSAGE_TEXT   => 'LOG:'||p_msg
508                 );
509     END IF;
510     **/
511     Return;
512 END PRINT_MSG;
513 
514 /* Bug fix:5203622: When source planning resource has revenue only, then generating forecast results
515  * in irrational ETC revenue calculations. so error message will be displayed on Edit Plan page
516  * after Forecast Generation to indicate to users that specific ETC Rev amounts may be calculated improperly
517  * and may need manual verification.
518  * These error message will be cleared upon any manual update to the ETC Rev amount through calculate process
519  */
520 PROCEDURE clear_etc_rev_other_rejectns
521 	 (p_budget_version_id     	Number
522             ,p_source_context       	Varchar2
523             ,p_calling_module     	Varchar2
524 	    ,p_mode               	Varchar2
525             ,x_return_status    OUT NOCOPY Varchar2
526             ,x_msg_count        OUT NOCOPY number
527             ,x_msg_data     	OUT NOCOPY Varchar2
528             ) IS
529 
530 	CURSOR cur_get_rejLines IS
531 	SELECT /*+ INDEX(BL PA_BUDGET_LINES_U1) */
532 		bl.resource_assignment_id
533 	       ,bl.txn_currency_code
534 	       ,sum(bl.txn_revenue)
535 	       ,decode(p_source_context,'BUDGET_LINE',tmp.start_date,NULL) start_date
536 	       ,decode(p_source_context,'BUDGET_LINE',tmp.end_date,NULL) end_date
537 	FROM PA_BUDGET_LINES bl
538 	     ,PA_FP_SPREAD_CALC_TMP tmp
539 	WHERE tmp.budget_version_id = p_budget_version_id
540 	AND   bl.resource_assignment_id = tmp.resource_assignment_id
541 	AND   bl.txn_currency_code = tmp.txn_currency_code
542 	AND   ((p_source_context = 'BUDGET_LINE'
543 	       and bl.start_date between tmp.start_date and tmp.end_date )
544 		OR
545 		p_source_context <> 'BUDGET_LINE'
546 	      )
547 	AND   bl.other_rejection_code is NOT NULL
548 	GROUP BY bl.resource_assignment_id
549 		,bl.txn_currency_code
550 		,decode(p_source_context,'BUDGET_LINE',tmp.start_date,NULL)
551 		,decode(p_source_context,'BUDGET_LINE',tmp.end_date,NULL) ;
552 
553 	l_etcrevrej_raId_tab	pa_plsql_datatypes.NumTabTyp;
554         l_etcrevrej_txnCur_tab	pa_plsql_datatypes.Char30TabTyp;
555         l_etcrevrej_revenue_tab	pa_plsql_datatypes.NumTabTyp;
556         l_budget_line_id_tab	pa_plsql_datatypes.NumTabTyp;
557 
558 BEGIN
559 	x_return_status := 'S';
560 	x_msg_count := 0;
561 	x_msg_data := NULL;
562 	If P_PA_DEBUG_MODE = 'Y' Then
563 	print_msg('Inside clear_etc_rev_other_rejectns API');
564 	End If;
565 
566 	IF p_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION')
567 	   and g_fp_budget_version_type = 'ALL'
568            and g_ciId is NULL Then --{
569 		If p_mode = 'CACHE' Then
570 			-- cache the lines which needs to processed later
571 			g_etcrevrej_raId_tab.delete;
572 			g_etcrevrej_txnCur_tab.delete;
573 			g_etcrevrej_revenue_tab.delete;
574 			g_etcrevrej_start_date_tab.delete;
575 			g_etcrevrej_end_date_tab.delete;
576 			OPEN cur_get_rejLines;
577 			FETCH cur_get_rejLines BULK COLLECT INTO
578 				g_etcrevrej_raId_tab
579 				,g_etcrevrej_txnCur_tab
580 				,g_etcrevrej_revenue_tab
581 				,g_etcrevrej_start_date_tab
582                                 ,g_etcrevrej_end_date_tab;
583 			CLOSE cur_get_rejLines;
584 
585 			If P_PA_DEBUG_MODE = 'Y' Then
586 				print_msg('Number of etc revenue rejected lines cached =['||g_etcrevrej_raId_tab.count||']');
587 			End If;
588 		ElsIf p_mode = 'CLEAR_REJECTIONS' Then
589 			If g_etcrevrej_raId_tab.COUNT > 0 Then --{
590 				-- now get the latest sum of revenue from budget lines
591 				-- if the user has made any change to revenue ( the calculated revenue is not same as)
592 				-- old revenue then null out the other rejection code on the budget line
593 				l_etcrevrej_raId_tab.delete;
594                         	l_etcrevrej_txnCur_tab.delete;
595                         	l_etcrevrej_revenue_tab.delete;
596 				g_etcrevrej_start_date_tab.delete;
597 				g_etcrevrej_end_date_tab.delete;
598                         	OPEN cur_get_rejLines;
599                         	FETCH cur_get_rejLines BULK COLLECT INTO
600                                 	l_etcrevrej_raId_tab
601                                 	,l_etcrevrej_txnCur_tab
602                                 	,l_etcrevrej_revenue_tab
603 					,g_etcrevrej_start_date_tab
604 					,g_etcrevrej_end_date_tab;
605                         	CLOSE cur_get_rejLines;
606 				If l_etcrevrej_raId_tab.COUNT > 0 Then --{
607 				FORALL i IN l_etcrevrej_raId_tab.FIRST .. l_etcrevrej_raId_tab.LAST
608 				UPDATE PA_BUDGET_LINES bl
609 				SET bl.other_rejection_code = NULL
610 				WHERE bl.resource_assignment_id = l_etcrevrej_raId_tab(i)
611 				AND   bl.txn_currency_code = l_etcrevrej_txnCur_tab(i)
612 				AND   nvl(g_etcrevrej_revenue_tab(i),0) <> nvl(l_etcrevrej_revenue_tab(i),0)
613 				AND   ((p_source_context = 'BUDGET_LINE'
614 					and bl.start_date between g_etcrevrej_start_date_tab(i) and g_etcrevrej_end_date_tab(i))
615 					OR
616 					p_source_context <> 'BUDGET_LINE'
617 				      )
618 				RETURN bl.budget_line_id
619 				BULK COLLECT INTO l_budget_line_id_tab;
620 
621 				If P_PA_DEBUG_MODE = 'Y' Then
622                                     print_msg('Number of etc revenue rejected lines cleared =['||l_budget_line_id_tab.count||']');
623                         	End If;
624 				END IF; --}
625 
626 				/* reset plsql cache */
627 				l_etcrevrej_raId_tab.delete;
628                                 l_etcrevrej_txnCur_tab.delete;
629                                 l_etcrevrej_revenue_tab.delete;
630 				l_budget_line_id_tab.delete;
631 				g_etcrevrej_raId_tab.delete;
632                                 g_etcrevrej_txnCur_tab.delete;
633                                 g_etcrevrej_revenue_tab.delete;
634                                 g_etcrevrej_start_date_tab.delete;
635                                 g_etcrevrej_end_date_tab.delete;
636 			END IF; --}
637 		End If;
638 	End If; --}
639 EXCEPTION
640         WHEN OTHERS THEN
641                 print_msg('Errored in clear_etc_rev_other_rejectns:'||sqlcode||sqlerrm);
642         	x_return_status := 'U';
643                 RAISE;
644 
645 END clear_etc_rev_other_rejectns;
646 
647 PROCEDURE delete_raTxn_Tmp IS
648 BEGIN
649     DELETE FROM pa_resource_asgn_curr_tmp;
650 END delete_raTxn_Tmp;
651 
652 PROCEDURE print_rlTmp_Values IS
653 
654 	CURSOR cur_rltmp IS
655 	SELECT tmp.resource_assignment_id
656 		,tmp.txn_currency_code
657 		,tmp.start_date
658 		,tmp.end_date
659 		,tmp.quantity
660 		,tmp.txn_raw_cost
661 		,tmp.rw_cost_rate_override
662 		,tmp.txn_burdened_cost
663 		,tmp.burden_cost_rate_override
664 		,tmp.txn_revenue
665 		,tmp.bill_rate_override
666 		,tmp.budget_line_id
667 	FROM pa_fp_rollup_tmp tmp
668 	ORDER BY tmp.resource_assignment_id
669                 ,tmp.txn_currency_code;
670 
671 	CURSOR cur_calTmp IS
672         SELECT tmp.resource_assignment_id
673                 ,tmp.txn_currency_code
674                 ,tmp.start_date
675 		,tmp.end_date
676                 ,tmp.quantity
677                 ,tmp.txn_raw_cost
678                 ,tmp.cost_rate_override
679                 ,tmp.txn_burdened_cost
680                 ,tmp.burden_cost_rate_override
681                 ,tmp.txn_revenue
682                 ,tmp.bill_rate_override
683         FROM pa_fp_spread_calc_tmp tmp
684         ORDER BY tmp.resource_assignment_id
685                 ,tmp.txn_currency_code;
686 
687 	l_msg	Varchar2(2000);
688 BEGIN
689 	/**
690 	IF P_PA_DEBUG_MODE = 'Y' Then
691 		FOR i IN cur_rltmp LOOP
692 			l_msg := 'RollupTmp:blId['||i.budget_line_id||']RaId['||i.resource_assignment_id||']TxnCur['||i.txn_currency_code||']';
693 			l_msg := l_msg||'SD['||i.start_date||']ED['||i.end_date||']Qty['||i.quantity||']CstRtOvr['||i.rw_cost_rate_override||']';
694 			l_msg := l_msg||'BurdRtOvr['||i.burden_cost_rate_override||']BillRtOvr['||i.bill_rate_override||']';
695 			print_msg(l_msg);
696 		END LOOP;
697 		FOR i IN cur_calTmp LOOP
698                         l_msg := 'CalcTmp:RaId['||i.resource_assignment_id||']TxnCur['||i.txn_currency_code||']';
699                         l_msg := l_msg||'SD['||i.start_date||']ED['||i.end_date||']Qty['||i.quantity||']CstRtOvr['||i.cost_rate_override||']';
700                         l_msg := l_msg||'BurdRtOvr['||i.burden_cost_rate_override||']BillRtOvr['||i.bill_rate_override||']';
701                         print_msg(l_msg);
702                 END LOOP;
703 	END IF;
704 	**/
705 	NULL;
706 
707 END print_rlTmp_Values;
708 
709 /* IPM Changes: This API populates records into new entity pa_resource_asgn_curr table
710  * and calls pa_res_asg_currency_pub.MAINTAIN_DATA to rollup the amounts
711  * and updates the rate overrides
712  * Logic: When Refresh rates flag = 'Y'
713  *          -- Delete all records from the new entity
714  *        When source context = BUDGET LINE
715  *          -- rollup the amounts in the new entity
716  *        When source context = RESOURCE ASSIGNMENT
717  *          -- create a new record or update existing records with rate overrides
718  *  This API inserts records into temp table based on various combination of input parameters
719  *  and finally make call to maintain_data package
720  */
721 PROCEDURE populate_raTxn_Recs (
722             p_budget_version_id     Number
723             ,p_source_context       Varchar2
724             ,p_calling_mode     Varchar2
725             ,p_delete_flag      Varchar2 := 'N'
726             ,p_delete_raTxn_flag    Varchar2 := 'N'
727             ,p_rollup_flag      Varchar2 := 'N'
728             ,p_call_raTxn_rollup_flag Varchar2 := 'N'
729             ,p_refresh_rate_flag    Varchar2 := 'N'
730 	    ,p_resource_assignment_id NUMBER := NULL
731 	    ,p_txn_currency_code      Varchar2 := NULL
732 	    ,p_start_date	      DATE := NULL
733             ,x_return_status    OUT NOCOPY Varchar2
734             ,x_msg_count        OUT NOCOPY number
735             ,x_msg_data     OUT NOCOPY Varchar2
736             ) IS
737     l_rowCount Number := 0;
738     l_rowCount1 Number := 0;
739     -- Added for Bug# 6781055
740     l_rw_cost_rate_override      NUMBER;
741     l_burden_cost_rate_override  NUMBER;
742     l_bill_rate_override         NUMBER;
743     l_ra_id                      NUMBER;
744     l_txn_currency_code          VARCHAR2(15);
745     -- End for Bug# 6781055
746 
747    -- gboomina added for AAI requirement Bug 8318932 - start
748    -- Cursor to get 'Copy ETC from Plan' flag
749    CURSOR get_copy_etc_from_plan_csr
750    IS
751      SELECT COPY_ETC_FROM_PLAN_FLAG
752      FROM PA_PROJ_FP_OPTIONS
753      WHERE FIN_PLAN_VERSION_ID = P_BUDGET_VERSION_ID;
754 
755    l_copy_etc_from_plan_flag PA_PROJ_FP_OPTIONS.COPY_ETC_FROM_PLAN_FLAG%TYPE;
756    -- gboomina added for AAI requirement Bug 8318932 - end
757 
758 BEGIN
759 
760     x_return_status := 'S';
761     IF NVL(p_delete_flag,'N') = 'N' Then
762       IF p_source_context = 'RESOURCE_ASSIGNMENT' Then
763            If NVL(p_refresh_rate_flag,'N') = 'Y' Then --{
764             --print_msg('Inserting records into pa_resource_asgn_curr_tmp for Refresh rates action');
765             INSERT INTO pa_resource_asgn_curr_tmp raTxn
766                         (RA_TXN_ID
767                         ,BUDGET_VERSION_ID
768                         ,RESOURCE_ASSIGNMENT_ID
769                         ,TXN_CURRENCY_CODE
770                         ,DELETE_FLAG
771                         )
772                         SELECT /*+ INDEX(RTX PA_RESOURCE_ASGN_CURR_U2) */ 1 ra_txn_id
773                         ,p_budget_version_id
774                         ,tmp.resource_assignment_id
775                         ,tmp.txn_currency_code
776                         ,'Y'
777                     FROM pa_fp_spread_calc_tmp tmp
778                 	,pa_resource_asgn_curr rtx
779                     WHERE tmp.budget_version_id = p_budget_version_id
780             	    AND tmp.resource_assignment_id = rtx.resource_assignment_id
781                     AND tmp.txn_currency_code = rtx.txn_currency_code
782 		    /* bug fix: If no budge Lines exists then donot delete the resource when refresh is done */
783 		    AND EXISTS ( select /*+ INDEX(RTMP PA_FP_ROLLUP_TMP_N1) */ null
784 				 from pa_fp_rollup_tmp rtmp
785 				 where rtmp.resource_assignment_id = tmp.resource_assignment_id
786 				 and rtmp.txn_currency_code = tmp.txn_currency_code
787 				);
788                     l_rowCount1      := sql%Rowcount;
789                     --print_msg('Number of records inserted ['||l_rowCount1||']');
790 
791 		    /* Set the override rates to null only for the records exists in spcalctmp table and
792 		     * no budget lines exists
793 		     */
794 		    UPDATE /*+ INDEX(RTX PA_RESOURCE_ASGN_CURR_U2) */ pa_resource_asgn_curr rtx
795                     SET rtx.TXN_RAW_COST_RATE_OVERRIDE  = null
796                             ,rtx.TXN_BURDEN_COST_RATE_OVERRIDE = null
797                             ,rtx.TXN_BILL_RATE_OVERRIDE = null
798                     WHERE rtx.budget_version_id = p_budget_version_id
799 		    AND EXISTS ( select null
800 				 from pa_fp_spread_calc_tmp tmp
801 				 where tmp.resource_assignment_id = rtx.resource_assignment_id
802 				 and tmp.txn_currency_code = rtx.txn_currency_code
803 				)
804                     AND NOT EXISTS ( select null
805                                         from pa_fp_rollup_tmp rtmp
806                                         where rtmp.resource_assignment_id = rtx.resource_assignment_id
807                                         and rtmp.txn_currency_code = rtx.txn_currency_code
808                                         );
809 		     --print_msg('Number of records updated directly with null['||sql%rowcount||']');
810 
811                     If l_rowCount1 > 0 Then
812                         --print_msg('Calling pa_res_asg_currency_pub.maintain_data for deleting records for refresh rates');
813                         pa_res_asg_currency_pub.MAINTAIN_DATA
814                         (P_FP_COLS_REC          => G_FP_COLS_REC
815                         ,P_CALLING_MODULE       => 'CALCULATE_API'
816                         ,P_DELETE_FLAG          => 'Y'
817                         ,P_ROLLUP_FLAG          => 'N'
818                         ,P_VERSION_LEVEL_FLAG   => 'N'
819                         ,X_RETURN_STATUS        => x_return_status
820                         ,X_MSG_COUNT            => x_msg_count
821                         ,X_MSG_DATA             => x_msg_data
822                         );
823                         --print_msg('Return Status of the api ['||x_return_status||']');
824                    End If;
825 
826         Else
827             --print_msg('Inserting records in pa_resource_asgn_curr_tmp from spcalctmp tabls');
828                         INSERT INTO pa_resource_asgn_curr_tmp
829                         (RA_TXN_ID
830                         ,BUDGET_VERSION_ID
831                         ,RESOURCE_ASSIGNMENT_ID
832                         ,TXN_CURRENCY_CODE
833                         ,TXN_RAW_COST_RATE_OVERRIDE
834                         ,TXN_BURDEN_COST_RATE_OVERRIDE
835                         ,TXN_BILL_RATE_OVERRIDE
836                         ,DELETE_FLAG
837                         )
838                         SELECT /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP_N1) */ pa_resource_asgn_curr_s.nextval
839                         ,p_budget_version_id
840                         ,tmp.resource_assignment_id
841                         ,NVL(tmp.txn_curr_code_override,tmp.txn_currency_code)
842                         ,decode(p_refresh_rate_flag, 'N', tmp.cost_rate_override, NULL)
843                         ,decode(p_refresh_rate_flag, 'N', tmp.burden_cost_rate_override, NULL)
844                         ,decode(p_refresh_rate_flag, 'N', tmp.bill_rate_override, NULL)
845                         ,p_delete_raTxn_flag
846                         FROM pa_fp_spread_calc_tmp tmp
847                         WHERE tmp.budget_version_id = p_budget_version_id
848                         AND NVL(tmp.RA_RATES_ONLY_CHANGE_FLAG,'N') = 'Y'
849                           OR (NVL(tmp.cost_rate_changed_flag,'N') = 'Y'
850                           OR NVL(tmp.burden_rate_changed_flag,'N') = 'Y'
851                           OR NVL(tmp.bill_rate_changed_flag,'N') = 'Y'
852               OR NVL(tmp.raw_cost_changed_flag,'N') = 'Y'
853               OR NVL(tmp.burden_cost_changed_flag,'N') = 'Y'
854               OR NVL(tmp.revenue_changed_flag,'N') = 'Y'
855               OR tmp.txn_curr_code_override is NOT NULL
856                          );
857                         l_rowCount      := sql%Rowcount;
858                         --print_msg('Number of records inserted ['||l_rowCount||']');
859            If l_rowCount > 0 Then
860                         /* The following update is required with current logic of the
861                         * new maintain entity which always blows out the records and inserts new records */
862             		--print_msg('Updating pa_resource_asgn_curr_tmp to set rate overrides derived during calculate');
863                         UPDATE pa_resource_asgn_curr_tmp tmp
864                         SET (tmp.TXN_RAW_COST_RATE_OVERRIDE
865                         ,tmp.TXN_BURDEN_COST_RATE_OVERRIDE
866                         ,tmp.TXN_BILL_RATE_OVERRIDE) =
867                                 (SELECT decode(tmp1.cost_rate_g_miss_num_flag,'Y',NULL
868 					,NVL(tmp1.cost_rate_override,rtx.TXN_RAW_COST_RATE_OVERRIDE))
869                                 ,decode(tmp1.burden_rate_g_miss_num_flag,'Y',NULL
870 					,NVL(tmp1.burden_cost_rate_override,rtx.TXN_BURDEN_COST_RATE_OVERRIDE))
871                                 ,decode(tmp1.bill_rate_g_miss_num_flag,'Y',NULL
872 					,NVL(tmp1.bill_rate_override,rtx.TXN_BILL_RATE_OVERRIDE))
873                                 FROM pa_resource_asgn_curr rtx
874                     			,pa_fp_spread_calc_tmp tmp1
875                                 WHERE rtx.resource_assignment_id = tmp.resource_assignment_id
876                                 AND rtx.txn_currency_code = tmp.txn_currency_code
877                 		AND tmp1.resource_assignment_id = tmp.resource_assignment_id
878                 		AND NVL(tmp1.txn_curr_code_override,tmp1.txn_currency_code) = tmp.txn_currency_code
879                                 )
880                         WHERE tmp.budget_version_id = p_budget_version_id
881                         AND EXISTS (select null from pa_resource_asgn_curr rtx2
882                     			,pa_fp_spread_calc_tmp tmp2
883                                         where rtx2.resource_assignment_id = tmp.resource_assignment_id
884                                         and rtx2.txn_currency_code = tmp.txn_currency_code
885                     			AND tmp2.resource_assignment_id = tmp.resource_assignment_id
886                                         AND NVL(tmp2.txn_curr_code_override,tmp2.txn_currency_code) = tmp.txn_currency_code
887                                    );
888             		--print_msg('Number of records Updated ['||sql%Rowcount||']');
889                   End If;
890 
891           	/* If only rates are changed then update the changed override rates on rollup tmp and avoid calling spread
892                	* and call rate api */
893               IF g_rtChanged_RaId_tab.COUNT > 0 Then
894                 g_stage := 'update pa_resource_asgn_curr_tmp with OvrRts';
895                 --print_msg(g_stage);
896                 FORALL i IN g_rtChanged_RaId_tab.FIRST .. g_rtChanged_RaId_tab.LAST
897                 UPDATE pa_resource_asgn_curr_tmp tmp
898                     SET tmp.TXN_RAW_COST_RATE_OVERRIDE       = decode(NVL(g_rtChanged_cstMisNumFlg_tab(i),'N'),'Y',NULL
899                                                         ,NVL(g_rtChanged_CostRt_Tab(i),tmp.TXN_RAW_COST_RATE_OVERRIDE))
900                             ,tmp.TXN_BURDEN_COST_RATE_OVERRIDE = decode(NVL(g_rtChanged_bdMisNumFlag_tab(i),'N'),'Y',NULL
901                                                         ,NVL(g_rtChanged_BurdRt_tab(i),tmp.TXN_BURDEN_COST_RATE_OVERRIDE))
902                             ,tmp.TXN_BILL_RATE_OVERRIDE = decode(NVL(g_rtChanged_blMisNumFlag_tab(i),'N'),'Y',NULL
903                                                         ,NVL(g_rtChanged_billRt_tab(i),tmp.TXN_BILL_RATE_OVERRIDE))
904                 WHERE tmp.budget_version_id = p_budget_version_id
905                 AND   tmp.resource_assignment_id = g_rtChanged_RaId_tab(i)
906                 AND   tmp.txn_currency_code = g_rtChanged_TxnCur_tab(i);
907                 --print_msg('Number of rows updated for RateChanges['||sql%rowcount||']');
908 
909               END IF;
910 
911 		/* when calculate api is called with rollup flag = N then override rates changed during the
912 		 * calcualtion process is not getting stamped on the new entity
913 		 * so whenever override rates are derived and rollup flag is N, directly update the
914 		 * new entity with override rates
915 		 */
916 	      IF G_call_raTxn_rollup_flag = 'N' Then
917 			--print_msg('Updating new entity with override rates when rollup flag is N');
918 			UPDATE /*+ INDEX(RTX PA_RESOURCE_ASGN_CURR_U2) */ pa_resource_asgn_curr rtx
919                     	SET (rtx.TXN_RAW_COST_RATE_OVERRIDE
920                             ,rtx.TXN_BURDEN_COST_RATE_OVERRIDE
921                             ,rtx.TXN_BILL_RATE_OVERRIDE) =
922 					(SELECT tmp.TXN_RAW_COST_RATE_OVERRIDE
923                             			,tmp.TXN_BURDEN_COST_RATE_OVERRIDE
924                             			,tmp.TXN_BILL_RATE_OVERRIDE
925 					FROM pa_resource_asgn_curr_tmp tmp
926 					WHERE tmp.resource_assignment_id = rtx.resource_assignment_id
927 					AND   tmp.txn_currency_code = rtx.txn_currency_code
928 					)
929                 	WHERE rtx.budget_version_id = p_budget_version_id
930 			AND EXISTS ( select null
931 					from pa_resource_asgn_curr_tmp tmp1
932                                         where tmp1.resource_assignment_id = rtx.resource_assignment_id
933                                         and tmp1.txn_currency_code = rtx.txn_currency_code
934                                         );
935 	      End If;
936         End If; --} end of refresh rates flag
937 
938       Else
939         --BUDGET_LINE CONTEXT
940         If NVL(p_calling_mode,'XXX') NOT IN ('CLEAR_CLOSED_PERIOD','RES_ATTRB_CHANGE','DELETE_BL') Then
941         --print_msg('Inserting records in pa_resource_asgn_curr_tmp from rollup Tmp for BUDGET_LINE context');
942         INSERT INTO pa_resource_asgn_curr_tmp raTxn
943                         (RA_TXN_ID
944             ,BUDGET_VERSION_ID
945             ,RESOURCE_ASSIGNMENT_ID
946                         ,TXN_CURRENCY_CODE
947                         )
948             SELECT 1 ra_txn_id
949             ,p_budget_version_id
950             ,tmp.resource_assignment_id
951                         ,tmp.txn_currency_code
952         FROM pa_fp_rollup_tmp tmp
953         WHERE tmp.budget_version_id = p_budget_version_id
954         GROUP BY p_budget_version_id
955             ,tmp.resource_assignment_id
956             ,tmp.txn_currency_code,1;
957             l_rowCount  := sql%Rowcount;
958             --print_msg('Number of records inserted ['||l_rowCount||']');
959         End If;
960 
961         IF NVL(p_calling_mode,'XXX') IN ('CLEAR_CLOSED_PERIOD','RES_ATTRB_CHANGE','DELETE_BL') and  l_rowCount = 0 Then
962             --print_msg('Inserting records in pa_resource_asgn_curr_tmp from sptmp for periodic deletion');
963                 INSERT INTO pa_resource_asgn_curr_tmp raTxn
964                         (RA_TXN_ID
965                         ,BUDGET_VERSION_ID
966                         ,RESOURCE_ASSIGNMENT_ID
967                         ,TXN_CURRENCY_CODE
968                         )
969                         SELECT 1 ra_txn_id
970                         ,p_budget_version_id
971                         ,tmp.resource_assignment_id
972                         ,tmp.txn_currency_code
973                 FROM pa_fp_spread_calc_tmp tmp
974                 WHERE tmp.budget_version_id = p_budget_version_id
975 		AND tmp.resource_assignment_id = NVL(p_resource_assignment_id,tmp.resource_assignment_id)
976 		AND tmp.txn_currency_code = NVL(p_txn_currency_code,tmp.txn_currency_code)
977 		AND NVL(tmp.start_date,trunc(sysdate)) = NVL(p_start_date,nvl(tmp.start_date,trunc(sysdate)))
978                 AND ( NVL(tmp.delete_bl_flag,'N') = 'Y'
979                     	OR NVL(tmp.sp_curve_change_flag,'N') = 'Y'
980                 	OR NVL(tmp.sp_fix_date_change_flag,'N') = 'Y'
981                 	OR NVL(tmp.rlm_id_change_flag,'N') = 'Y'
982                 	OR NVL(tmp.re_spread_amts_flag,'N') = 'Y'
983                 	OR p_calling_mode = 'CLEAR_CLOSED_PERIOD'
984                 	OR ((g_wp_version_flag = 'Y' AND NVL(tmp.plan_dates_change_flag,'N') = 'Y')
985                    	OR (NVL(tmp.ra_in_multi_cur_flag,'N') = 'N' AND NVL(tmp.plan_dates_change_flag,'N') = 'Y'))
986                		);
987 
988                         l_rowCount      := sql%Rowcount;
989                         --print_msg('Number of records inserted ['||l_rowCount||']');
990         End If;
991 
992         If l_rowCount > 0 Then
993             /* The following update is required with current logic of the
994             * new maintain entity which always blows out the records and inserts new records */
995             UPDATE pa_resource_asgn_curr_tmp tmp
996             SET (tmp.TXN_RAW_COST_RATE_OVERRIDE
997                         ,tmp.TXN_BURDEN_COST_RATE_OVERRIDE
998                         ,tmp.TXN_BILL_RATE_OVERRIDE) =
999                 (SELECT rtx.TXN_RAW_COST_RATE_OVERRIDE
1000                             ,rtx.TXN_BURDEN_COST_RATE_OVERRIDE
1001                             ,rtx.TXN_BILL_RATE_OVERRIDE
1002                 FROM pa_resource_asgn_curr rtx
1003                 WHERE rtx.resource_assignment_id = tmp.resource_assignment_id
1004                 AND rtx.txn_currency_code = tmp.txn_currency_code
1005                 )
1006             WHERE tmp.budget_version_id = p_budget_version_id
1007             AND EXISTS (select null from pa_resource_asgn_curr rtx2
1008                     where rtx2.resource_assignment_id = tmp.resource_assignment_id
1009                                     and rtx2.txn_currency_code = tmp.txn_currency_code
1010                    );
1011         End If;
1012         --Start for Bug 6781055.
1013         --As of now below block is added only for non-time phased versions.
1014         --It can be opened up for other flows after enough testing.
1015         IF gl_cl_roll_up_tmp_rowid_tab.COUNT>0 AND g_time_phased_code='N' AND p_calling_mode = 'UPDATE_PLAN_TRANSACTION' THEN
1016             FOR zz IN 1..gl_cl_roll_up_tmp_rowid_tab.COUNT  LOOP
1017                 SELECT rw_cost_rate_override,
1018                        burden_cost_rate_override,
1019                        bill_rate_override,
1020                        resource_assignment_id,
1021                        txn_currency_code
1022                 INTO   l_rw_cost_rate_override,
1023                        l_burden_cost_rate_override,
1024                        l_bill_rate_override,
1025                        l_ra_id,
1026                        l_txn_currency_code
1027                 FROM   pa_fp_rollup_tmp
1028                 WHERE  rowid=gl_cl_roll_up_tmp_rowid_tab(zz);
1029 
1030                 UPDATE pa_resource_asgn_curr_tmp
1031                 SET    txn_raw_cost_rate_override    = NVL(l_rw_cost_rate_override,txn_raw_cost_rate_override),
1032                        txn_burden_cost_rate_override = NVL(l_burden_cost_rate_override,txn_burden_cost_rate_override),
1033                        txn_bill_rate_override        = NVL(l_bill_rate_override,txn_bill_rate_override)
1034                 WHERE  resource_assignment_id     = l_ra_id
1035                 AND    txn_currency_code          = l_txn_currency_code;
1036 
1037             END LOOP;
1038 
1039             gl_cl_roll_up_tmp_rowid_tab.delete;
1040 
1041         END IF;
1042         --End for Bug 6781055.
1043       End If;
1044     ElsIf p_delete_flag = 'Y' Then
1045         /* when rollup is not required just delete from tmp table */
1046         DELETE FROM pa_resource_asgn_curr_tmp;
1047     END IF;
1048 
1049 	/* only for debug purpose
1050     	for c in (select tmp.TXN_RAW_COST_RATE_OVERRIDE costRt
1051                         ,tmp.TXN_BURDEN_COST_RATE_OVERRIDE BurdRt
1052                         ,tmp.TXN_BILL_RATE_OVERRIDE  BillRt
1053             ,tmp1.cost_rate_override tmpCostRt
1054                         ,tmp1.burden_cost_rate_override tmpBurdRt
1055                         ,tmp1.bill_rate_override  tmpBillRt
1056             from pa_resource_asgn_curr_tmp tmp
1057                 ,pa_fp_spread_calc_tmp tmp1) LOOP
1058         print_msg('Rates in Tmp Table CostRt['|| c.costRt||']BurdRt['||c.burdRt||']BillRt['||c.billRt||']');
1059         print_msg('Rates in SpCalcTmp Table tmpCostRt['|| c.tmpcostRt||']tmpBurdRt['||c.tmpburdRt||']tmpBillRt['||c.tmpbillRt||']');
1060     	end loop;
1061 	*/
1062 
1063     /* When override currency is passed, then delete the records from new entity for the old currency */
1064     If p_source_context = 'RESOURCE_ASSIGNMENT' and NVL(p_refresh_rate_flag,'N') = 'N' Then
1065         --print_msg('Inserting records in pa_resource_asgn_curr_tmp from rollup for Override currency code');
1066         INSERT INTO pa_resource_asgn_curr_tmp raTxn
1067                         (RA_TXN_ID
1068                         ,BUDGET_VERSION_ID
1069                         ,RESOURCE_ASSIGNMENT_ID
1070                         ,TXN_CURRENCY_CODE
1071             		,DELETE_FLAG
1072                         )
1073                         SELECT 1 ra_txn_id
1074                         ,p_budget_version_id
1075                         ,tmp.resource_assignment_id
1076                         ,tmp.txn_currency_code
1077             		,'Y'
1078         FROM pa_fp_spread_calc_tmp tmp
1079         WHERE tmp.budget_version_id = p_budget_version_id
1080         AND tmp.txn_curr_code_override is NOT NULL
1081         AND tmp.txn_curr_code_override <> tmp.txn_currency_code;
1082         l_rowCount1      := sql%Rowcount;
1083                 --print_msg('Number of records inserted ['||l_rowCount1||']');
1084 
1085         -- gboomina added for AAI requirement Bug 8318932 - start
1086          OPEN get_copy_etc_from_plan_csr;
1087          FETCH get_copy_etc_from_plan_csr INTO l_copy_etc_from_plan_flag;
1088          CLOSE get_copy_etc_from_plan_csr;
1089          -- skkoppul added for AAI requirement - end
1090 
1091          --AAI Requirement Setting override rates to null for amounts generated from source when copy actuals
1092          -- selected .
1093          IF nvl(l_copy_etc_from_plan_flag,'N') = 'Y' AND p_source_context = 'RESOURCE_ASSIGNMENT'
1094          AND p_calling_mode = 'FORECAST_GENERATION' THEN
1095 
1096              UPDATE pa_resource_asgn_curr rtx
1097              SET rtx.TXN_RAW_COST_RATE_OVERRIDE  = NULL
1098                   ,rtx.TXN_BURDEN_COST_RATE_OVERRIDE = NULL
1099              WHERE rtx.budget_version_id = p_budget_version_id;
1100          END IF;
1101         -- gboomina added for AAI requirement Bug 8318932 - end
1102 
1103         If l_rowCount1 > 0 Then
1104 	    If P_PA_DEBUG_MODE = 'Y' Then
1105             print_msg('Calling pa_res_asg_currency_pub.maintain_data for deleting records');
1106 	    End If;
1107             pa_res_asg_currency_pub.MAINTAIN_DATA
1108                     (P_FP_COLS_REC          => G_FP_COLS_REC
1109                     ,P_CALLING_MODULE       => 'CALCULATE_API'
1110                     ,P_DELETE_FLAG          => 'Y'
1111                     ,P_ROLLUP_FLAG          => 'N'
1112                     ,P_VERSION_LEVEL_FLAG   => 'N'
1113                     ,X_RETURN_STATUS        => x_return_status
1114                     ,X_MSG_COUNT            => x_msg_count
1115                     ,X_MSG_DATA             => x_msg_data
1116                     );
1117 	    If P_PA_DEBUG_MODE = 'Y' Then
1118             print_msg('Return Status of the api ['||x_return_status||']');
1119 	    End If;
1120         End If;
1121 
1122     End If;
1123 
1124     IF p_call_raTxn_rollup_flag = 'Y' AND l_rowCount > 0 Then
1125         -- Call new entity rollup api
1126 	If P_PA_DEBUG_MODE = 'Y' Then
1127         print_msg('Calling pa_res_asg_currency_pub.maintain_data');
1128 	End If;
1129         pa_res_asg_currency_pub.MAINTAIN_DATA
1130         (P_FP_COLS_REC      => G_FP_COLS_REC
1131         ,P_CALLING_MODULE   => 'CALCULATE_API'
1132         ,P_DELETE_FLAG      => 'N'
1133         ,P_ROLLUP_FLAG      => 'Y' --p_rollup_flag
1134         ,P_VERSION_LEVEL_FLAG   => 'N'
1135         ,X_RETURN_STATUS        => x_return_status
1136         ,X_MSG_COUNT            => x_msg_count
1137         ,X_MSG_DATA             => x_msg_data
1138         );
1139 	If P_PA_DEBUG_MODE = 'Y' Then
1140         print_msg('Return Status of the api ['||x_return_status||']');
1141 	End If;
1142         IF nvl(X_RETURN_STATUS,'S') <> 'S' Then
1143             X_RETURN_STATUS := 'E';
1144         END IF;
1145 
1146     END IF;
1147 
1148 EXCEPTION
1149         WHEN OTHERS THEN
1150                 print_msg('Errored in populate_raTxn_Recs:'||sqlcode||sqlerrm);
1151             	x_return_status := 'U';
1152 		x_msg_data := SQLCODE||SQLERRM;
1153                 RAISE;
1154 END populate_raTxn_Recs;
1155 
1156 /* Bug fix: 4900436 */
1157 /* After the spread of quantity, this API copies the rate overrides from new entity pa_resource_asgn_curr
1158  * to rollup tmp table.
1159  */
1160 PROCEDURE RETAIN_RA_TXN_OVR_RATES
1161                         (p_budget_version_id    IN VARCHAR2
1162                         ,x_return_status        OUT NOCOPY VARCHAR2
1163                         ) IS
1164 BEGIN
1165     x_return_status := 'S';
1166 	IF p_pa_debug_mode = 'Y' Then
1167                 print_rlTmp_Values;
1168         End If;
1169     UPDATE pa_fp_rollup_tmp tmp
1170     SET (tmp.rw_cost_rate_override
1171         ,tmp.burden_cost_rate_override
1172         ,tmp.bill_rate_override ) =
1173         (SELECT /*+ INDEX(RAX PA_RESOURCE_ASGN_CURR_U2) */
1174 	    decode(nvl(tmp1.cost_rate_g_miss_num_flag,'N'),'Y',NULL,nvl(tmp.rw_cost_rate_override,rax.txn_raw_cost_rate_override))
1175                ,decode(nvl(tmp1.burden_rate_g_miss_num_flag,'N'),'Y',NULL
1176 		    ,decode(nvl(tmp1.rate_based_flag,'N'),'Y',nvl(tmp.burden_cost_rate_override,rax.txn_burden_cost_rate_override)
1177 		       ,decode(g_fp_budget_version_type,'REVENUE',nvl(tmp.burden_cost_rate_override,rax.txn_burden_cost_rate_override)
1178 			,'COST',nvl(tmp.burden_cost_rate_override,rax.txn_burden_cost_rate_override)
1179 			,'ALL'
1180 			,decode(tmp1.burden_cost_changed_flag,'Y'
1181 			 ,decode(tmp1.burden_cost_rate_override,0,0
1182 			  ,decode(nvl(tmp.burden_cost_rate_override,rax.txn_burden_cost_rate_override),0,NULL
1183 					,nvl(tmp.burden_cost_rate_override,rax.txn_burden_cost_rate_override)))
1184 			  ,decode(tmp1.raw_cost_changed_flag,'Y'
1185                            ,decode(nvl(tmp.burden_cost_rate_override,rax.txn_burden_cost_rate_override),0,NULL
1186                                         ,nvl(tmp.burden_cost_rate_override,rax.txn_burden_cost_rate_override))
1187 				,nvl(tmp.burden_cost_rate_override,rax.txn_burden_cost_rate_override))))))
1188                ,decode(nvl(tmp1.bill_rate_g_miss_num_flag,'N'),'Y',NULL
1189 			,decode(nvl(tmp1.rate_based_flag,'N'),'Y',nvl(tmp.bill_rate_override,rax.txn_bill_rate_override)
1190 			 ,decode(tmp1.revenue_changed_flag,'Y',nvl(tmp.bill_rate_override,rax.txn_bill_rate_override)
1191 			 ,decode(g_fp_budget_version_type,'COST',tmp.bill_rate_override
1192 				,'REVENUE',nvl(tmp.bill_rate_override,rax.txn_bill_rate_override)
1193 				,'ALL',decode(tmp1.raw_cost_changed_flag,'Y'
1194 					,decode(nvl(tmp.bill_rate_override,rax.txn_bill_rate_override),1,NULL
1195 						,0,NULL,nvl(tmp.bill_rate_override,rax.txn_bill_rate_override))
1196 					,decode(tmp1.burden_cost_changed_flag,'Y'
1197 					 ,decode(tmp1.txn_raw_cost,tmp1.txn_burdened_cost
1198 					  ,decode(nvl(tmp.bill_rate_override,rax.txn_bill_rate_override),1,NULL
1199                                                 ,0,NULL,nvl(tmp.bill_rate_override,rax.txn_bill_rate_override))
1200 						,nvl(tmp.bill_rate_override,rax.txn_bill_rate_override))
1201 					  ,nvl(tmp.bill_rate_override,rax.txn_bill_rate_override)))))))
1202         FROM    pa_resource_asgn_curr rax
1203                ,pa_fp_spread_calc_tmp tmp1
1204         WHERE rax.resource_assignment_id = tmp.resource_assignment_id
1205         AND   rax.txn_currency_code = tmp.txn_currency_code
1206         AND   tmp1.resource_assignment_id = rax.resource_assignment_id
1207         AND   tmp1.txn_currency_code = rax.txn_currency_code
1208         AND   (g_source_context = 'RESOURCE_ASSIGNMENT'
1209 	       OR
1210 		(g_source_context = 'BUDGET_LINE'
1211 		 and tmp.start_date between tmp1.start_date and tmp1.end_date)
1212 	     )
1213         )
1214     WHERE tmp.budget_version_id = p_budget_version_id
1215     AND EXISTS (select /*+ INDEX(RAX1 PA_RESOURCE_ASGN_CURR_U2) */ null
1216                 from   pa_resource_asgn_curr rax1
1217                       ,pa_fp_spread_calc_tmp tmp2
1218                 where rax1.resource_assignment_id = tmp.resource_assignment_id
1219                 and rax1.txn_currency_code = tmp.txn_currency_code
1220                 and tmp2.resource_assignment_id = rax1.resource_assignment_id
1221                 and tmp2.txn_currency_code = rax1.txn_currency_code
1222 	        and   (g_source_context = 'RESOURCE_ASSIGNMENT'
1223                		OR
1224                 	(g_source_context = 'BUDGET_LINE'
1225                  	and tmp.start_date between tmp2.start_date and tmp2.end_date)
1226               		)
1227            );
1228 
1229 	IF p_pa_debug_mode = 'Y' Then
1230     		print_msg('Number of rows updated in the rollup tmp with raTxnOvr ['||sql%rowCount||']');
1231 		--print_rlTmp_Values;
1232 		NULL;
1233 	End If;
1234 EXCEPTION
1235         WHEN OTHERS THEN
1236                 print_msg('Errored in retain_ra_txn_ovr_rates:'||sqlcode||sqlerrm);
1237                 x_return_status := 'U';
1238                 RAISE;
1239 END RETAIN_RA_TXN_OVR_RATES;
1240 
1241 /* Bug fix:4229022 Performance fix: call copyBlattributs API only if records in the cacle table exists
1242  * This avoids un-neccessary hitting of budget lines table during copy projects call
1243  */
1244 FUNCTION CheckCacheRecExists(p_budget_version_id IN NUMBER)
1245     RETURN VARCHAR2 IS
1246     l_exists_flag Varchar2(10) := 'N';
1247 BEGIN
1248     SELECT 'Y'
1249     INTO l_exists_flag
1250     FROM DUAL
1251     WHERE EXISTS (select null
1252             from pa_fp_spread_calc_tmp1 tmp1
1253             where tmp1.budget_version_id = p_budget_version_id
1254         );
1255     RETURN NVL(l_exists_flag,'N');
1256 EXCEPTION
1257     WHEN NO_DATA_FOUND THEN
1258         l_exists_flag := 'N';
1259         RETURN l_exists_flag;
1260 
1261     WHEN OTHERS THEN
1262         l_exists_flag := 'N';
1263         RAISE;
1264 END CheckCacheRecExists;
1265 
1266 /* This API rounds the given quantity to 5 decimals. This api should be called
1267  * only for rate based planning resource to round the quantity
1268  */
1269 FUNCTION round_quantity(p_quantity Number) RETURN NUMBER IS
1270     l_quantity Number;
1271 BEGIN
1272     l_quantity := p_quantity;
1273     If p_quantity is NOT NULL Then
1274         l_quantity := round(p_quantity,5);
1275     End If;
1276 
1277     RETURN l_quantity;
1278 
1279 END round_quantity;
1280 
1281 /* This API checks whether MRC is installed for PA schema or not */
1282 PROCEDURE CHECK_MRC_INSTALLED IS
1283 
1284     l_return_status  Varchar2(10);
1285     l_msg_count      Number := 0;
1286     l_msg_data       Varchar2(1000);
1287 BEGIN
1288     l_return_status := 'S';
1289     /********Commented for 11.5.10+ change. MRC installed flag is no longer populated/supported by AD Team********
1290     SELECT nvl(multi_currency_flag,'N')
1291     INTO G_MRC_INSTALLED_FLAG
1292     FROM fnd_product_groups
1293     WHERE  product_group_id=1;
1294 
1295     --Added this check that does the same job as the above select
1296     IF  gl_mc_info.mrc_enabled(275) THEN
1297             G_MRC_INSTALLED_FLAG := 'Y';
1298     ELSE
1299             G_MRC_INSTALLED_FLAG := 'N';
1300     END IF;
1301     ********Commented for 11.5.10+ change. MRC installed flag is no longer populated/supported by AD Team********/
1302 
1303     /* As per mail from venkatesh calling this API instead of standard one using in the costing and billing */
1304     /****MRC Elimination changes: As we are dropping the mrc_finplan package no need to call this api
1305     IF PA_MRC_FINPLAN.G_MRC_ENABLED_FOR_BUDGETS IS NULL THEN
1306         print_msg('Calling PA_MRC_FINPLAN.CHECK_MRC_INSTALL api');
1307                 PA_MRC_FINPLAN.CHECK_MRC_INSTALL
1308                         (x_return_status      => l_return_status
1309                          ,x_msg_count          => l_msg_count
1310                          ,x_msg_data           => l_msg_data);
1311         END IF;
1312     IF PA_MRC_FINPLAN.G_MRC_ENABLED_FOR_BUDGETS THEN
1313         G_MRC_INSTALLED_FLAG := 'Y';
1314     ELSE
1315         G_MRC_INSTALLED_FLAG := 'N';
1316     END IF;
1317     *********/
1318     G_MRC_INSTALLED_FLAG := 'N';
1319     --print_msg('retSts['||l_return_status||']Mrc Flag['||G_MRC_INSTALLED_FLAG||']');
1320 
1321 EXCEPTION
1322     WHEN OTHERS THEN
1323         RAISE;
1324 
1325 END CHECK_MRC_INSTALLED;
1326 
1327 /* This API will set the statistics for global tmp tables. Since Gather_statistics and set_table_stats
1328  * does the commit in the main session, this api made as autonomous so that main session should not be impacted.
1329  * Based on the statistics collected for the pa_budget_lines and pa_resource_assignments on pjperf table
1330  * the tmp table stats will be set as follows
1331  * If number of rows < 500 then set the number of rows = 500 and num blocks to number of rows/30
1332  * if number of rows > 500 then set the number of rows to passed in value and block size to numrows / 30
1333  * This API will be called only once for all tmp tables
1334  */
1335 PROCEDURE SetGatherTmpTblIndxStats
1336         (p_table_name    IN VARCHAR2
1337         ,p_numRow    IN NUMBER
1338         ,x_return_status OUT NOCOPY VARCHAR2 ) IS
1339 
1340     l_numRows     Number := p_numRow;
1341     l_AvgRowLg    Number := 150;
1342     l_num_blks    Number ;
1343     PRAGMA AUTONOMOUS_TRANSACTION;
1344 BEGIN
1345     x_return_status := 'S';
1346     --print_msg('Entered SetGatherTmpTblIndxStats API');
1347     IF g_owner_name is NULL Then
1348         g_owner_name   := PJI_UTILS.GET_PA_SCHEMA_NAME;
1349     End If;
1350     If NVL(l_numRows,0) < 500 Then
1351         l_numRows := 500;
1352     End If;
1353     l_num_blks :=  ROUND((l_numRows / 30));
1354     IF p_table_name IS NOT NULL Then
1355         /* Calling Gather_table_stats implicitly commits the data so changed to set_table_stats
1356         FND_STATS.GATHER_TABLE_STATS
1357         (ownname    => g_owner_name
1358                  ,tabname   => UPPER(p_table_name)
1359                  ,cascade   => TRUE
1360                  ,percent  in number
1361                  ,degree in number
1362                  ,partname in varchar2
1363                  ,backup_flag  in varchar2
1364                  ,granularity in varchar2
1365                  ,hmode in varchar2  default 'LASTRUN'
1366                  ,invalidate    in varchar2 default 'Y'
1367                  );
1368         */
1369         print_msg('Calling set Table Stats API for ['||p_table_name||']');
1370         FND_STATS.SET_TABLE_STATS
1371         	(ownname    => g_owner_name
1372                 ,tabname    => UPPER(p_table_name)
1373                 ,numrows    => l_numRows
1374                 ,numblks    => l_num_blks
1375                 ,avgrlen    => l_AvgRowLg
1376         	);
1377 
1378     END IF;
1379     COMMIT;
1380 EXCEPTION
1381     WHEN OTHERS THEN
1382         x_return_status := 'U';
1383         fnd_msg_pub.add_exc_msg
1384                 ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
1385                  ,p_procedure_name => 'SetGatherTmpTblIndxStats' );
1386                 print_msg('Failed in SetGatherTmpTblIndxStats substr(SQLERRM,1,240) => '|| substr(SQLERRM,1,240));
1387         ROLLBACK;
1388         RAISE;
1389 END SetGatherTmpTblIndxStats;
1390 
1391 /* This API initializes the currency attributes based on the budget version and project Id
1392  * this section of code is moved from convert_ra_txn_currency api to here to avoid executing the sql
1393  * opening cursors for each budget line record in a loop.
1394  * this api is added to improve to improve the performance */
1395 PROCEDURE Initialize_fp_cur_details
1396         (p_budget_version_id  IN  Number
1397         ,p_project_id         IN  Number
1398         ,x_return_status      OUT NOCOPY varchar2
1399          ) IS
1400 
1401         CURSOR get_fp_options_data IS
1402         SELECT v.project_id
1403             ,v.fin_plan_type_id
1404             ,o.projfunc_cost_rate_type
1405             ,o.projfunc_cost_rate_date_type
1406             ,o.projfunc_cost_rate_date
1407             ,o.projfunc_rev_rate_type
1408             ,o.projfunc_rev_rate_date_type
1409             ,o.projfunc_rev_rate_date
1410             ,o.project_cost_rate_type
1411             ,o.project_cost_rate_date_type
1412             ,o.project_cost_rate_date
1413             ,o.project_rev_rate_type
1414             ,o.project_rev_rate_date_type
1415             ,o.project_rev_rate_date
1416         FROM    pa_proj_fp_options o
1417                 ,pa_budget_versions v
1418         WHERE v.budget_version_id   = p_budget_version_id
1419         AND o.project_id          = v.project_id
1420         AND nvl(o.fin_plan_type_id,0)    = nvl(v.fin_plan_type_id,0)
1421         AND o.fin_plan_version_id = v.budget_version_id;
1422 
1423         CURSOR get_project_lvl_data IS
1424         SELECT segment1
1425                 ,project_currency_code
1426                 ,projfunc_currency_code
1427         FROM pa_projects_all
1428         WHERE project_id = p_project_id;
1429 BEGIN
1430     x_return_status := 'S';
1431     g_stage := 'Initialize_fp_cur_details:100';
1432 	If P_PA_DEBUG_MODE = 'Y' Then
1433         print_msg(' ENTERED  Initialize_fp_cur_details calling get_fp_options_data');
1434 	End If;
1435              -- initialize --
1436            pa_fp_multi_currency_pkg.g_project_id                     := NULL;
1437            pa_fp_multi_currency_pkg.g_fin_plan_type_id               := NULL;
1438            pa_fp_multi_currency_pkg.g_projfunc_cost_rate_type        := NULL;
1439            pa_fp_multi_currency_pkg.g_projfunc_cost_rate_date_type   := NULL;
1440            pa_fp_multi_currency_pkg.g_projfunc_cost_rate_date        := NULL;
1441            pa_fp_multi_currency_pkg.g_projfunc_rev_rate_type         := NULL;
1442            pa_fp_multi_currency_pkg.g_projfunc_rev_rate_date_type    := NULL;
1443            pa_fp_multi_currency_pkg.g_projfunc_rev_rate_date         := NULL;
1444            pa_fp_multi_currency_pkg.g_proj_cost_rate_type            := NULL;
1445            pa_fp_multi_currency_pkg.g_proj_cost_rate_date_type       := NULL;
1446            pa_fp_multi_currency_pkg.g_proj_cost_rate_date            := NULL;
1447            pa_fp_multi_currency_pkg.g_proj_rev_rate_type             := NULL;
1448            pa_fp_multi_currency_pkg.g_proj_rev_rate_date_type        := NULL;
1449            pa_fp_multi_currency_pkg.g_proj_rev_rate_date             := NULL;
1450 
1451         OPEN get_fp_options_data;
1452         FETCH get_fp_options_data INTO
1453             pa_fp_multi_currency_pkg.g_project_id
1454            ,pa_fp_multi_currency_pkg.g_fin_plan_type_id
1455            ,pa_fp_multi_currency_pkg.g_projfunc_cost_rate_type
1456            ,pa_fp_multi_currency_pkg.g_projfunc_cost_rate_date_type
1457            ,pa_fp_multi_currency_pkg.g_projfunc_cost_rate_date
1458            ,pa_fp_multi_currency_pkg.g_projfunc_rev_rate_type
1459            ,pa_fp_multi_currency_pkg.g_projfunc_rev_rate_date_type
1460            ,pa_fp_multi_currency_pkg.g_projfunc_rev_rate_date
1461            ,pa_fp_multi_currency_pkg.g_proj_cost_rate_type
1462            ,pa_fp_multi_currency_pkg.g_proj_cost_rate_date_type
1463            ,pa_fp_multi_currency_pkg.g_proj_cost_rate_date
1464            ,pa_fp_multi_currency_pkg.g_proj_rev_rate_type
1465            ,pa_fp_multi_currency_pkg.g_proj_rev_rate_date_type
1466            ,pa_fp_multi_currency_pkg.g_proj_rev_rate_date;
1467         CLOSE get_fp_options_data;
1468     g_stage := 'Initialize_fp_cur_details:101';
1469 
1470         print_msg('In Initialize_fp_cur_details Get Project Levle info');
1471              -- initialize --
1472          pa_fp_multi_currency_pkg.g_project_number         := NULL;
1473          pa_fp_multi_currency_pkg.g_proj_currency_code     := NULL;
1474          pa_fp_multi_currency_pkg.g_projfunc_currency_code := NULL;
1475 
1476         OPEN get_project_lvl_data;
1477         FETCH get_project_lvl_data INTO
1478           pa_fp_multi_currency_pkg.g_project_number
1479          ,pa_fp_multi_currency_pkg.g_proj_currency_code
1480          ,pa_fp_multi_currency_pkg.g_projfunc_currency_code;
1481         ClOSE get_project_lvl_data;
1482     g_stage := 'Initialize_fp_cur_details:102';
1483     RETURN;
1484 
1485 EXCEPTION
1486     WHEN OTHERS THEN
1487     x_return_status := 'U';
1488     fnd_msg_pub.add_exc_msg
1489                 ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
1490                  ,p_procedure_name => 'initialize_fp_cur_details' );
1491                 print_msg('Failed in initialize_fp_cur_details substr(SQLERRM,1,240) => '|| substr(SQLERRM,1,240));
1492     RAISE;
1493 
1494 END initialize_fp_cur_details;
1495 
1496 PROCEDURE Init_MRC_plsqlTabs IS
1497 
1498 BEGIN
1499 	--G_FP_MRC_TAB.DELETE;
1500 	g_mrc_budget_line_id_tab.delete;
1501 	g_mrc_res_assignment_id_tab.delete;
1502         g_mrc_txn_curr_code_tab.delete;
1503         g_mrc_start_date_tab.delete;
1504         g_mrc_end_date_tab.delete;
1505         g_mrc_period_name_tab.delete;
1506         g_mrc_quantity_tab.delete;
1507         g_mrc_txn_raw_cost_tab.delete;
1508         g_mrc_txn_burden_cost_tab.delete;
1509         g_mrc_txn_revenue_tab.delete;
1510         g_mrc_project_curr_code_tab.delete;
1511         g_mrc_project_raw_cost_tab.delete;
1512         g_mrc_project_burden_cost_tab.delete;
1513         g_mrc_project_revenue_tab.delete;
1514         g_mrc_projfunc_curr_code_tab.delete;
1515         g_mrc_projfunc_raw_cost_tab.delete;
1516         g_mrc_projfunc_burden_cost_tab.delete;
1517         g_mrc_projfunc_revenue_tab.delete;
1518         g_mrc_delete_flag_tab.delete;
1519         g_mrc_Billable_flag_tab.delete;
1520         g_mrc_project_cst_rt_type_tab.delete;
1521         g_mrc_project_cst_exg_rt_tab.delete;
1522         g_mrc_project_cst_dt_type_tab.delete;
1523         g_mrc_project_cst_rt_dt_tab.delete;
1524         g_mrc_project_rev_rt_type_tab.delete;
1525         g_mrc_project_rev_exg_rt_tab.delete;
1526         g_mrc_project_rev_dt_type_tab.delete;
1527         g_mrc_project_rev_rt_dt_tab.delete;
1528         g_mrc_projfunc_cst_rt_type_tab.delete;
1529         g_mrc_projfunc_cst_exg_rt_tab.delete;
1530         g_mrc_projfunc_cst_dt_type_tab.delete;
1531         g_mrc_projfunc_cst_rt_dt_tab.delete;
1532         g_mrc_projfunc_rev_rt_type_tab.delete;
1533         g_mrc_projfunc_rev_exg_rt_tab.delete;
1534         g_mrc_projfunc_rev_dt_type_tab.delete;
1535         g_mrc_projfunc_rev_rt_dt_tab.delete;
1536 
1537 END Init_MRC_plsqlTabs;
1538 
1539 
1540         /*Bug: 4309290.Added the parameter to identify if PA_FP_SPREAD_CALC_TMP1
1541         is to be deleted or not. Frm AMG flow we will pass N and for
1542         other calls to calculate api it would be yes*/
1543 PROCEDURE Init_SpreadCalc_Tbls(p_del_spread_calc_tmp1_flg IN VARCHAR2 := 'Y')
1544 IS
1545 	l_return_status 	Varchar2(10);
1546 	l_unexpected_exception	Exception;
1547 BEGIN
1548 
1549     --INITIALIZATION--
1550         DELETE FROM pa_fp_res_assignments_tmp;
1551         DELETE FROM pa_fp_rollup_tmp;
1552         DELETE FROM pa_fp_spread_calc_tmp;
1553 	DELETE FROM pa_resource_asgn_curr_tmp;
1554 
1555         --Bug 4309290.using the new introuced parameter p_del_spread_calc_tmp1_flg to determine delete on pa_fp_spread_calc_tmp1
1556         IF (p_del_spread_calc_tmp1_flg = 'Y') then
1557 
1558             	DELETE FROM pa_fp_spread_calc_tmp1;
1559         ELSE
1560           /* Bug fix:4272944: The following new api call is added to insert zero qty budget lines for Funding baseline */
1561           IF (NVL(G_baseline_funding_flag,'N') = 'Y'
1562                 AND NVL(g_bv_approved_rev_flag,'N') = 'Y') THEN
1563 		If P_PA_DEBUG_MODE = 'Y' Then
1564                 print_msg('Calling PA_FP_CALC_UTILS.InsertFunding_ReqdLines API');
1565 		End If;
1566                 PA_FP_CALC_UTILS.InsertFunding_ReqdLines
1567                 ( p_budget_verson_id      => g_budget_version_id
1568                 ,p_source_context         => g_source_context
1569                 ,p_calling_module         => g_calling_module
1570                 ,p_apply_progress_flag    => 'N'
1571                 ,p_approved_rev_flag      => g_bv_approved_rev_flag
1572                 ,p_autoBaseLine_flag      => G_baseline_funding_flag
1573                 ,x_return_status          => l_return_status
1574                 );
1575 		If NVL(l_return_status,'S') <> 'S' Then
1576 			RAISE l_unexpected_exception;
1577 		End If;
1578                 DELETE FROM pa_fp_spread_calc_tmp1;
1579           END IF;
1580 	  null;
1581         END IF;
1582 
1583         DELETE FROM pa_fp_spread_calc_tmp2;
1584         g_sprd_raId_tab.delete;
1585         g_sprd_txn_cur_tab.delete;
1586         g_sprd_sdate_tab.delete;
1587         g_sprd_edate_tab.delete;
1588         g_sprd_plan_sdate_tab.delete;
1589         g_sprd_plan_edate_tab.delete;
1590         g_sprd_txn_rev_tab.delete;
1591         g_sprd_txn_rev_addl_tab.delete;
1592         g_sprd_txn_raw_tab.delete;
1593         g_sprd_txn_raw_addl_tab.delete;
1594         g_sprd_txn_burd_tab.delete;
1595         g_sprd_txn_burd_addl_tab.delete;
1596         g_sprd_qty_tab.delete;
1597         g_sprd_qty_addl_tab.delete;
1598         g_sprd_txn_cur_ovr_tab.delete;
1599         g_sprd_txn_init_rev_tab.delete;
1600         g_sprd_txn_init_raw_tab.delete;
1601         g_sprd_txn_init_burd_tab.delete;
1602         g_sprd_txn_init_qty_tab.delete;
1603         g_sprd_spread_reqd_flag_tab.delete;
1604         g_sprd_costRt_tab.delete;
1605         g_sprd_costRt_Ovr_tab.delete;
1606         g_sprd_burdRt_Tab.delete;
1607         g_sprd_burdRt_Ovr_tab.delete;
1608         g_sprd_billRt_tab.delete;
1609         g_sprd_billRt_Ovr_tab.delete;
1610         g_sprd_ratebase_flag_tab.delete;
1611         g_sprd_projCur_tab.delete;
1612         g_sprd_projfuncCur_tab.delete;
1613     	g_sprd_task_id_tab.delete;
1614         g_sprd_rlm_id_tab.delete;
1615         g_sprd_sp_fixed_date_tab.delete;
1616         g_sprd_spcurve_id_tab.delete;
1617 	g_sprd_cstRtmissFlag_tab.delete;
1618         g_sprd_bdRtmissFlag_tab.delete;
1619         g_sprd_bilRtmissFlag_tab.delete;
1620         g_sprd_QtymissFlag_tab.delete;
1621         g_sprd_RawmissFlag_tab.delete;
1622         g_sprd_BurdmissFlag_tab.delete;
1623         g_sprd_RevmissFlag_tab.delete;
1624 	/* bug fix:5726773 */
1625  	g_sprd_neg_Qty_Changflag_tab.delete;
1626  	g_sprd_neg_Raw_Changflag_tab.delete;
1627  	g_sprd_neg_Burd_Changflag_tab.delete;
1628  	g_sprd_neg_rev_Changflag_tab.delete;
1629         /* The following plsql tables defined for bulk processing of rollup tmp for refresh action */
1630         g_plan_raId_tab.delete;
1631         g_plan_txnCur_Tab.delete;
1632         g_line_sdate_tab.delete;
1633         g_line_edate_tab.delete;
1634         g_Wp_curCode_tab.delete;
1635         g_refresh_rates_tab.delete;
1636         g_refresh_conv_rates_tab.delete;
1637         g_mass_adjust_flag_tab.delete;
1638         g_mfc_cost_refresh_tab.delete;
1639         g_skip_record_tab.delete;
1640 	g_process_skip_CstRevrec_tab.delete;
1641         g_mfc_cost_refrsh_Raid_tab.delete;
1642         g_mfc_cost_refrsh_txnCur_tab.delete;
1643 
1644     /* The following plsql tables are defined for bulk processing of resource where rates are only changed */
1645     	g_rtChanged_Ra_Flag_tab.delete;
1646     	g_rtChanged_RaId_tab.delete;
1647         g_rtChanged_TxnCur_tab.delete;
1648     	g_rtChanged_sDate_tab.delete;
1649         g_rtChanged_eDate_tab.delete;
1650         g_rtChanged_CostRt_Tab.delete;
1651         g_rtChanged_BurdRt_tab.delete;
1652         g_rtChanged_billRt_tab.delete;
1653 	g_rtChanged_cstMisNumFlg_tab.delete;
1654         g_rtChanged_bdMisNumFlag_tab.delete;
1655         g_rtChanged_blMisNumFlag_tab.delete;
1656         g_rtChanged_QtyMisNumFlg_tab.delete;
1657         g_rtChanged_RwMisNumFlag_tab.delete;
1658         g_rtChanged_BrMisNumFlag_tab.delete;
1659         g_rtChanged_RvMisNumFlag_tab.delete;
1660 
1661     	g_applyProg_refreshRts_tab.delete;
1662     	g_applyProg_RaId_tab.delete;
1663         g_applyProg_TxnCur_tab.delete;
1664 
1665 EXCEPTION
1666 	WHEN l_unexpected_exception THEN
1667 	    RAISE;
1668         WHEN OTHERS THEN
1669             RAISE;
1670 END ;
1671 /* Initialize reporting tbls */
1672 PROCEDURE Init_reporting_Tbls IS
1673 
1674 BEGIN
1675     g_rep_budget_line_id_tab.delete;
1676         g_rep_res_assignment_id_tab .delete;
1677         g_rep_start_date_tab.delete;
1678         g_rep_end_date_tab.delete;
1679         g_rep_period_name_tab.delete;
1680         g_rep_txn_curr_code_tab.delete;
1681         g_rep_quantity_tab.delete;
1682         g_rep_txn_raw_cost_tab.delete;
1683         g_rep_txn_burdened_cost_tab.delete;
1684         g_rep_txn_revenue_tab.delete;
1685         g_rep_project_curr_code_tab.delete;
1686         g_rep_project_raw_cost_tab.delete;
1687         g_rep_project_burden_cost_tab.delete;
1688         g_rep_project_revenue_tab.delete;
1689         g_rep_projfunc_curr_code_tab.delete;
1690         g_rep_projfunc_raw_cost_tab.delete;
1691         g_rep_projfunc_burden_cost_tab.delete;
1692         g_rep_projfunc_revenue_tab.delete;
1693 	g_rep_line_mode_tab.delete;
1694         g_rep_rate_base_flag_tab.delete;
1695 
1696 END ;
1697 /* This API adds the message to error stack */
1698 PROCEDURE ADD_MSGTO_STACK(
1699      P_MSG_NAME    IN VARCHAR2
1700     ,p_token1      IN Varchar2 default null
1701     ,p_value1      IN Varchar2 default null
1702     ,p_token2      IN Varchar2 default null
1703     ,p_value2      IN Varchar2 default null
1704     ,p_token3      IN Varchar2 default null
1705     ,p_value3      IN Varchar2 default null
1706     ,p_token4      IN Varchar2 default null
1707     ,p_value4      IN Varchar2 default null
1708     ,p_token5      IN Varchar2 default null
1709     ,p_value5      IN Varchar2 default null
1710     ) IS
1711 
1712 BEGIN
1713     If P_MSG_name is NOT NULL Then
1714        pa_utils.add_message
1715             ( p_app_short_name => 'PA'
1716               ,p_msg_name       => P_MSG_NAME
1717             ,p_token1       => p_token1
1718             ,p_value1       => p_value1
1719             ,p_token2       => p_token2
1720             ,p_value2       => p_value2
1721             ,p_token3       => p_token3
1722             ,p_value3       => p_value3
1723             ,p_token4       => p_token4
1724             ,p_value4       => p_value4
1725             ,p_token5       => p_token5
1726             ,p_value5       => p_value5
1727         );
1728 
1729     End If;
1730 
1731 EXCEPTION
1732     WHEN OTHERS THEN
1733         PRINT_MSG('Unexpected Error occured while adding msg to Error Stack:'||SQLCODE||SQLERRM);
1734         RAISE;
1735 END ADD_MSGTO_STACK;
1736 
1737 /* This API returns the return status of the fprollup tmp table
1738  * after calling the rate api and converting the txn to txn currency conv
1739  * if there is any errors the abort the process
1740  */
1741 PROCEDURE get_RollupTmp_Status(
1742         x_return_status OUT NOCOPY varchar2 ) IS
1743 
1744         CURSOR cur_retSts IS
1745         SELECT 'E'
1746         FROM DUAL
1747         WHERE EXISTS (select null
1748                         from pa_fp_rollup_tmp tmp
1749                         where ( tmp.cost_rejection_code in ('PA_FP_PROJ_NO_TXNCONVRATE'
1750                                                         ,'PA_FP_PRJFUNC_CURR_NULL'
1751                                                         ,'PA_FP_PRJ_CURR_NULL'
1752                             ,'PA_FP_ERROR_FROM_RATE_API_CALL' )
1753                                 OR tmp.revenue_rejection_code in ('PA_FP_PROJ_NO_TXNCONVRATE'
1754                                                         ,'PA_FP_PRJFUNC_CURR_NULL'
1755                                                         ,'PA_FP_PRJ_CURR_NULL'
1756                             ,'PA_FP_ERROR_FROM_RATE_API_CALL')
1757                              ));
1758 
1759     l_return_status  Varchar2(100);
1760 BEGIN
1761     l_return_status := 'S';
1762 
1763         /* set final return status to E if there are any txn cur conv failuresi*/
1764         OPEN cur_retSts;
1765         FETCH cur_retSts INTO l_return_status;
1766     IF cur_retSts%NOTFOUND then
1767         l_return_status := 'S';
1768     End If;
1769         CLOSE cur_retSts;
1770 
1771     l_return_status := NVL(l_return_status,'S');
1772     x_return_status := l_return_status;
1773 
1774 END get_RollupTmp_status;
1775 
1776 /* This API builds plsql table of records required for MRC conversions
1777  */
1778 PROCEDURE Populate_MRC_plsqlTabs
1779                 (p_calling_module               IN      Varchar2 Default 'CALCULATE_API'
1780                 ,p_budget_version_id            IN      Number
1781                 ,p_budget_line_id               IN      Number
1782                 ,p_resource_assignment_id       IN      Number
1783                 ,p_start_date                   IN      Date
1784                 ,p_end_date                     IN      Date
1785                 ,p_period_name                  IN      Varchar2 Default NULL
1786                 ,p_txn_currency_code            IN      Varchar2
1787                 ,p_quantity                     IN      Number   Default NULL
1788                 ,p_txn_raw_cost                 IN      Number   Default NULL
1789                 ,p_txn_burdened_cost            IN      Number   Default NULL
1790                 ,p_txn_revenue                  IN      Number   Default NULL
1791                 ,p_project_currency_code        IN      Varchar2 Default NULL
1792                 ,p_project_raw_cost             IN      Number   Default NULL
1793                 ,p_project_burdened_cost        IN      Number   Default NULL
1794                 ,p_project_revenue              IN      Number   Default NULL
1795                 ,p_projfunc_currency_code       IN      Varchar2 Default NULL
1796                 ,p_projfunc_raw_cost            IN      Number   Default NULL
1797                 ,p_projfunc_burdened_cost       IN      Number   Default NULL
1798                 ,p_projfunc_revenue             IN      Number   Default NULL
1799 		,p_delete_flag                  IN      Varchar2 := 'N'
1800 		,p_billable_flag                IN      Varchar2 := 'Y'
1801 		,p_project_cost_rate_type	IN      Varchar2 default NULL
1802                 ,p_project_cost_exchange_rate	IN      Number   default NULL
1803                 ,p_project_cost_rate_date_type  IN      Varchar2 default NULL
1804                 ,p_project_cost_rate_date	IN      Date     default NULL
1805                 ,p_project_rev_rate_type	IN      Varchar2 default NULL
1806                 ,p_project_rev_exchange_rate	IN      Number   default NULL
1807                 ,p_project_rev_rate_date_type   IN      Varchar2 default NULL
1808                 ,p_project_rev_rate_date	IN      Date     default NULL
1809                 ,p_projfunc_cost_rate_type      IN      Varchar2 default NULL
1810                 ,p_projfunc_cost_exchange_rate	IN      Number   default NULL
1811                 ,p_projfunc_cost_rate_date_type IN      Varchar2 default NULL
1812                 ,p_projfunc_cost_rate_date	IN      Date     default NULL
1813                 ,p_projfunc_rev_rate_type       IN      Varchar2 default NULL
1814                 ,p_projfunc_rev_exchange_rate	IN      Number   default NULL
1815                 ,p_projfunc_rev_rate_date_type  IN      Varchar2 default NULL
1816                 ,p_projfunc_rev_rate_date	IN      Date     default NULL
1817                 ,x_msg_data                     OUT NOCOPY Varchar2
1818                 ,x_return_status                OUT NOCOPY Varchar2
1819                 ) IS
1820 
1821     	l_msg_count   Number :=0;
1822 BEGIN
1823 	x_msg_data        := NULL;
1824         l_msg_count       := 0;
1825         x_return_status   := 'S';
1826 
1827 	IF NVL(G_populate_mrc_tab_flag,'N') = 'Y' Then
1828 	g_mrc_budget_line_id_tab(NVL(g_mrc_budget_line_id_tab.LAST,0)+1) := p_budget_line_id;
1829 	g_mrc_res_assignment_id_tab(NVL( g_mrc_res_assignment_id_tab.LAST,0)+1) := p_resource_assignment_id;
1830         g_mrc_txn_curr_code_tab(NVL( g_mrc_txn_curr_code_tab.LAST,0)+1)      := p_txn_currency_code;
1831         g_mrc_start_date_tab(NVL( g_mrc_start_date_tab.LAST,0)+1)             := p_start_date;
1832         g_mrc_end_date_tab(NVL( g_mrc_end_date_tab.LAST,0)+1)               := p_end_date;
1833         g_mrc_period_name_tab(NVL( g_mrc_period_name_tab.LAST,0)+1)            := p_period_name;
1834         g_mrc_quantity_tab(NVL( g_mrc_quantity_tab.LAST,0)+1)               := p_quantity;
1835         g_mrc_txn_raw_cost_tab(NVL( g_mrc_txn_raw_cost_tab.LAST,0)+1)           := p_txn_raw_cost;
1836         g_mrc_txn_burden_cost_tab(NVL( g_mrc_txn_burden_cost_tab.LAST,0)+1)      := p_txn_burdened_cost;
1837         g_mrc_txn_revenue_tab(NVL( g_mrc_txn_revenue_tab.LAST,0)+1)            := p_txn_revenue;
1838         g_mrc_project_curr_code_tab(NVL( g_mrc_project_curr_code_tab.LAST,0)+1)  := p_project_currency_code;
1839         g_mrc_project_raw_cost_tab(NVL( g_mrc_project_raw_cost_tab.LAST,0)+1)       := p_project_raw_cost;
1840         g_mrc_project_burden_cost_tab(NVL( g_mrc_project_burden_cost_tab.LAST,0)+1)    := p_project_burdened_cost;
1841         g_mrc_project_revenue_tab(NVL( g_mrc_project_revenue_tab.LAST,0)+1)        := p_project_revenue;
1842         g_mrc_projfunc_curr_code_tab(NVL( g_mrc_projfunc_curr_code_tab.LAST,0)+1) := p_projfunc_currency_code;
1843         g_mrc_projfunc_raw_cost_tab(NVL( g_mrc_projfunc_raw_cost_tab.LAST,0)+1)      := p_projfunc_raw_cost;
1844         g_mrc_projfunc_burden_cost_tab(NVL( g_mrc_projfunc_burden_cost_tab.LAST,0)+1)   := p_projfunc_burdened_cost;
1845         g_mrc_projfunc_revenue_tab(NVL( g_mrc_projfunc_revenue_tab.LAST,0)+1)       := p_projfunc_revenue;
1846         g_mrc_delete_flag_tab(NVL( g_mrc_delete_flag_tab.LAST,0)+1)            := p_delete_flag;
1847         g_mrc_Billable_flag_tab(NVL( g_mrc_Billable_flag_tab.LAST,0)+1)          := p_billable_flag;
1848         g_mrc_project_cst_rt_type_tab(NVL( g_mrc_project_cst_rt_type_tab.LAST,0)+1)         := p_project_cost_rate_type;
1849         g_mrc_project_cst_exg_rt_tab(NVL( g_mrc_project_cst_exg_rt_tab.LAST,0)+1)     := p_project_cost_exchange_rate;
1850         g_mrc_project_cst_dt_type_tab(NVL( g_mrc_project_cst_dt_type_tab.LAST,0)+1)    := p_project_cost_rate_date_type;
1851         g_mrc_project_cst_rt_dt_tab(NVL( g_mrc_project_cst_rt_dt_tab.LAST,0)+1)         := p_project_cost_rate_date;
1852         g_mrc_project_rev_rt_type_tab(NVL( g_mrc_project_rev_rt_type_tab.LAST,0)+1)          := p_project_rev_rate_type;
1853         g_mrc_project_rev_exg_rt_tab(NVL( g_mrc_project_rev_exg_rt_tab.LAST,0)+1)      := p_project_rev_exchange_rate;
1854         g_mrc_project_rev_dt_type_tab(NVL( g_mrc_project_rev_dt_type_tab.LAST,0)+1)     := p_project_rev_rate_date_type;
1855         g_mrc_project_rev_rt_dt_tab(NVL( g_mrc_project_rev_rt_dt_tab.LAST,0)+1)          := p_project_rev_rate_date;
1856         g_mrc_projfunc_cst_rt_type_tab(NVL( g_mrc_projfunc_cst_rt_type_tab.LAST,0)+1)        := p_projfunc_cost_rate_type;
1857         g_mrc_projfunc_cst_exg_rt_tab(NVL( g_mrc_projfunc_cst_exg_rt_tab.LAST,0)+1)    := p_projfunc_cost_exchange_rate;
1858         g_mrc_projfunc_cst_dt_type_tab(NVL( g_mrc_projfunc_cst_dt_type_tab.LAST,0)+1)   := p_projfunc_cost_rate_date_type;
1859         g_mrc_projfunc_cst_rt_dt_tab(NVL( g_mrc_projfunc_cst_rt_dt_tab.LAST,0)+1)        := p_projfunc_cost_rate_date;
1860         g_mrc_projfunc_rev_rt_type_tab(NVL( g_mrc_projfunc_rev_rt_type_tab.LAST,0)+1)         := p_projfunc_rev_rate_type;
1861         g_mrc_projfunc_rev_exg_rt_tab(NVL( g_mrc_projfunc_rev_exg_rt_tab.LAST,0)+1)     := p_projfunc_rev_exchange_rate;
1862         g_mrc_projfunc_rev_dt_type_tab(NVL( g_mrc_projfunc_rev_dt_type_tab.LAST,0)+1)    := p_projfunc_rev_rate_date_type;
1863         g_mrc_projfunc_rev_rt_dt_tab(NVL( g_mrc_projfunc_rev_rt_dt_tab.LAST,0)+1)         := p_projfunc_rev_rate_date;
1864 
1865 	END IF;
1866 
1867 EXCEPTION
1868     WHEN OTHERS THEN
1869         print_msg('Failed in Populate_MRC_plsqlTabs  API ['||sqlcode||sqlerrm);
1870         x_return_status := 'U';
1871         x_msg_data := sqlcode||sqlerrm;
1872         RAISE;
1873 END Populate_MRC_plsqlTabs;
1874 
1875 /* This API inserts mrc plsql table of records into pa_fp_rollup_tmp when mrc conv is required */
1876 PROCEDURE Populate_rollup_WithMrcRecs
1877 	   	(p_budget_version_id            IN      Number
1878 		,x_msg_data                     OUT NOCOPY Varchar2
1879                 ,x_return_status                OUT NOCOPY Varchar2
1880                 ) IS
1881 
1882 BEGIN
1883 	x_return_status := 'S';
1884 	x_msg_data := NULL;
1885 	IF NVL(G_populate_mrc_tab_flag,'N') = 'Y' Then
1886 	  IF g_mrc_budget_line_id_tab.COUNT > 0 THEN
1887 		/* FORALL i IN G_FP_MRC_TAB.FIRST .. G_FP_MRC_TAB.LAST
1888 	 	* using forall thorws error:PLS-00436 implementation restriction: cannot reference fields of
1889 	 	* BULK In-BIND table of records
1890 	 	*/
1891 	      --print_msg('Number of records inserting into rollupTmp for MRC processing['||g_mrc_budget_line_id_tab.COUNT||']');
1892 	      FORALL i IN g_mrc_budget_line_id_tab.FIRST .. g_mrc_budget_line_id_tab.LAST
1893 		  INSERT INTO PA_FP_ROLLUP_TMP tmp
1894 			(budget_version_id
1895        			,budget_line_id
1896        			,resource_assignment_id
1897        			,txn_currency_code
1898        			,start_date
1899        			,end_date
1900        			,period_name
1901        			,quantity
1902        			,txn_raw_cost
1903        			,txn_burdened_cost
1904        			,txn_revenue
1905        			,project_currency_code
1906        			,project_raw_cost
1907        			,project_burdened_cost
1908        			,project_revenue
1909        			,project_cost_rate_type
1910        			,project_cost_exchange_rate
1911        			,project_cost_rate_date_type
1912        			,project_cost_rate_date
1913        			,project_rev_rate_type
1914        			,project_rev_exchange_rate
1915        			,project_rev_rate_date_type
1916        			,project_rev_rate_date
1917        			,projfunc_currency_code
1918        			,projfunc_raw_cost
1919        			,projfunc_burdened_cost
1920        			,projfunc_revenue
1921        			,projfunc_cost_rate_type
1922        			,projfunc_cost_exchange_rate
1923        			,projfunc_cost_rate_date_type
1924        			,projfunc_cost_rate_date
1925        			,projfunc_rev_rate_type
1926        			,projfunc_rev_exchange_rate
1927        			,projfunc_rev_rate_date_type
1928        			,projfunc_rev_rate_date
1929        			,delete_flag
1930 			)
1931 		SELECT p_budget_version_id
1932                         ,g_mrc_budget_line_id_tab(i)
1933                         ,g_mrc_res_assignment_id_tab(i)
1934                         ,g_mrc_txn_curr_code_tab(i)
1935                         ,g_mrc_start_date_tab(i)
1936                         ,g_mrc_end_date_tab(i)
1937                         ,g_mrc_period_name_tab(i)
1938                         ,g_mrc_quantity_tab(i)
1939                         ,g_mrc_txn_raw_cost_tab(i)
1940                         ,g_mrc_txn_burden_cost_tab(i)
1941                         ,g_mrc_txn_revenue_tab(i)
1942                         ,g_mrc_project_curr_code_tab(i)
1943                         ,g_mrc_project_raw_cost_tab(i)
1944                         ,g_mrc_project_burden_cost_tab(i)
1945                         ,g_mrc_project_revenue_tab(i)
1946                         ,g_mrc_project_cst_rt_type_tab(i)
1947                         ,g_mrc_project_cst_exg_rt_tab(i)
1948                         ,g_mrc_project_cst_dt_type_tab(i)
1949                         ,g_mrc_project_cst_rt_dt_tab(i)
1950                         ,g_mrc_project_rev_rt_type_tab(i)
1951                         ,g_mrc_project_rev_exg_rt_tab(i)
1952                         ,g_mrc_project_rev_dt_type_tab(i)
1953                         ,g_mrc_project_rev_rt_dt_tab(i)
1954                         ,g_mrc_projfunc_curr_code_tab(i)
1955                         ,g_mrc_projfunc_raw_cost_tab(i)
1956                         ,g_mrc_projfunc_burden_cost_tab(i)
1957                         ,g_mrc_projfunc_revenue_tab(i)
1958                         ,g_mrc_projfunc_cst_rt_type_tab(i)
1959                         ,g_mrc_projfunc_cst_exg_rt_tab(i)
1960                         ,g_mrc_projfunc_cst_dt_type_tab(i)
1961                         ,g_mrc_projfunc_cst_rt_dt_tab(i)
1962                         ,g_mrc_projfunc_rev_rt_type_tab(i)
1963                         ,g_mrc_projfunc_rev_exg_rt_tab(i)
1964                         ,g_mrc_projfunc_rev_dt_type_tab(i)
1965                         ,g_mrc_projfunc_rev_rt_dt_tab(i)
1966                         ,g_mrc_delete_flag_tab(i)
1967 		FROM DUAL
1968 		WHERE NOT EXISTS (SELECT NULL
1969 				FROM PA_FP_ROLLUP_TMP RLTMP1
1970 				WHERE rltmp1.budget_line_id = g_mrc_budget_line_id_tab(i)
1971 				);
1972 	  END If;
1973 	END IF;
1974 
1975 
1976 EXCEPTION
1977     WHEN OTHERS THEN
1978         print_msg('Failed in Populate_rollup_WithMrcRecs API ['||sqlcode||sqlerrm);
1979         x_return_status := 'U';
1980         x_msg_data := sqlcode||sqlerrm;
1981         RAISE;
1982 END Populate_rollup_WithMrcRecs;
1983 
1984 /* This API resets the plsql table indexes for reporting tables in the order
1985  * so that one-level cache is used inside PJI apis to derive the
1986  * resource details:
1987  * As part of bug fix:5116157: When Non-rate base resource changes to Rate base resource
1988  * this api passes the correct UOM and rate base flag to the reversal lines to PJI
1989  */
1990 PROCEDURE ResetRepPlsqlTabIdex(p_budget_version_id    IN NUMBER
1991                            ,x_return_status           OUT NOCOPY VARCHAR2
1992 			   ,x_msg_data		      OUT NOCOPY VARCHAR2
1993                         ) IS
1994 
1995 BEGIN
1996 	x_return_status := 'S';
1997 	IF g_rep_res_assignment_id_tab.COUNT > 0 Then
1998 		Delete pa_fp_spread_calc_tmp1;
1999 		FORALL i IN g_rep_res_assignment_id_tab.FIRST .. g_rep_res_assignment_id_tab.LAST
2000 		INSERT INTO pa_fp_spread_calc_tmp1
2001 		(budget_line_id
2002 		,resource_assignment_id
2003 		,start_date
2004 		,end_date
2005 		,period_name
2006 		,txn_currency_code
2007 		,quantity
2008 		,txn_raw_cost
2009 		,txn_burdened_cost
2010 		,txn_revenue
2011 		,project_currency_code
2012 		,project_raw_cost
2013 		,project_burdened_cost
2014 		,project_revenue
2015 		,projfunc_currency_code
2016 		,projfunc_raw_cost
2017 		,projfunc_burdened_cost
2018 		,projfunc_revenue
2019 		,system_reference_var1
2020 		,budget_version_id
2021 		) VALUES
2022         	(g_rep_budget_line_id_tab(i)
2023         	,g_rep_res_assignment_id_tab(i)
2024         	,g_rep_start_date_tab(i)
2025         	,g_rep_end_date_tab(i)
2026         	,g_rep_period_name_tab(i)
2027         	,g_rep_txn_curr_code_tab(i)
2028         	,g_rep_quantity_tab(i)
2029         	,g_rep_txn_raw_cost_tab(i)
2030         	,g_rep_txn_burdened_cost_tab(i)
2031         	,g_rep_txn_revenue_tab(i)
2032         	,g_rep_project_curr_code_tab(i)
2033         	,g_rep_project_raw_cost_tab(i)
2034         	,g_rep_project_burden_cost_tab(i)
2035         	,g_rep_project_revenue_tab(i)
2036         	,g_rep_projfunc_curr_code_tab(i)
2037         	,g_rep_projfunc_raw_cost_tab(i)
2038         	,g_rep_projfunc_burden_cost_tab(i)
2039         	,g_rep_projfunc_revenue_tab(i)
2040 		,g_rep_line_mode_tab(i)
2041 		,p_budget_version_id
2042 		);
2043 
2044 		/* Reset the plsql tabs */
2045 		Init_reporting_Tbls;
2046 
2047 		/* bug fix:5116157 : For non-rate base resource when qty is changed, the calculate process sets the rate base flag to Y
2048                  * while passing reversal lines to pji the old rate base flag should be passed, otherwise this results in data corruption
2049                  * on view pages
2050                  * Note: tmp.system_reference_var3 - indicates that Change of Non-rate base to Rate base
2051                  *       tmp1.system_reference_var1 - indicates that reversal or positive entry of budget line passing to pji
2052                  */
2053 		UPDATE pa_fp_spread_calc_tmp1 tmp1
2054 		SET tmp1.rate_based_flag  =
2055 			(SELECT decode(nvl(tmp.system_reference_var3,'N'),'Y'
2056 				,decode(nvl(tmp1.system_reference_var1,'XXX'),'REVERSAL','N',NULL),NULL)
2057 			FROM pa_fp_spread_calc_tmp tmp
2058 			WHERE tmp.resource_assignment_id = tmp1.resource_assignment_id
2059 			AND ROWNUM = 1
2060 			)
2061 		WHERE tmp1.budget_version_id = p_budget_version_id
2062 		AND EXISTS (select null
2063 			FROM pa_fp_spread_calc_tmp otmp
2064                         WHERE otmp.resource_assignment_id = tmp1.resource_assignment_id
2065                         );
2066 		If P_PA_DEBUG_MODE = 'Y' Then
2067 		print_msg('Number of rows updated for ratebasedFlag for Pjirollup['||sql%rowcount||']');
2068 		End If;
2069 
2070 		SELECT
2071 		tmp1.budget_line_id
2072                 ,tmp1.resource_assignment_id
2073                 ,tmp1.start_date
2074                 ,tmp1.end_date
2075                 ,tmp1.period_name
2076                 ,tmp1.txn_currency_code
2077                 ,tmp1.quantity
2078                 ,tmp1.txn_raw_cost
2079                 ,tmp1.txn_burdened_cost
2080                 ,tmp1.txn_revenue
2081                 ,tmp1.project_currency_code
2082                 ,tmp1.project_raw_cost
2083                 ,tmp1.project_burdened_cost
2084                 ,tmp1.project_revenue
2085                 ,tmp1.projfunc_currency_code
2086                 ,tmp1.projfunc_raw_cost
2087                 ,tmp1.projfunc_burdened_cost
2088                 ,tmp1.projfunc_revenue
2089 		,tmp1.system_reference_var1
2090 		,tmp1.rate_based_flag
2091                 BULK COLLECT INTO
2092                 g_rep_budget_line_id_tab
2093                 ,g_rep_res_assignment_id_tab
2094                 ,g_rep_start_date_tab
2095                 ,g_rep_end_date_tab
2096                 ,g_rep_period_name_tab
2097                 ,g_rep_txn_curr_code_tab
2098                 ,g_rep_quantity_tab
2099                 ,g_rep_txn_raw_cost_tab
2100                 ,g_rep_txn_burdened_cost_tab
2101                 ,g_rep_txn_revenue_tab
2102                 ,g_rep_project_curr_code_tab
2103                 ,g_rep_project_raw_cost_tab
2104                 ,g_rep_project_burden_cost_tab
2105                 ,g_rep_project_revenue_tab
2106                 ,g_rep_projfunc_curr_code_tab
2107                 ,g_rep_projfunc_raw_cost_tab
2108                 ,g_rep_projfunc_burden_cost_tab
2109                 ,g_rep_projfunc_revenue_tab
2110 		,g_rep_line_mode_tab
2111 		,g_rep_rate_base_flag_tab
2112 		FROM pa_fp_spread_calc_tmp1 tmp1
2113 		ORDER BY tmp1.resource_assignment_id
2114 			,tmp1.txn_currency_code;
2115 
2116 	END IF;
2117 
2118 EXCEPTION
2119     WHEN OTHERS THEN
2120         print_msg('Failed in ResetRepPlsqlTabIdex API ['||sqlcode||sqlerrm);
2121         x_return_status := 'U';
2122         x_msg_data := sqlcode||sqlerrm;
2123         RAISE;
2124 
2125 
2126 END ResetRepPlsqlTabIdex;
2127 
2128 
2129 /* This API calls the PJI reporting procedures to rollup of the budget lines
2130  * to the task and project level
2131  */
2132 PROCEDURE Add_Toreporting_Tabls
2133                 (p_calling_module               IN      Varchar2 Default 'CALCULATE_API'
2134                 ,p_activity_code                IN      Varchar2 Default 'UPDATE'
2135                 ,p_budget_version_id            IN      Number
2136                 ,p_budget_line_id               IN      Number
2137                 ,p_resource_assignment_id       IN      Number
2138                 ,p_start_date                   IN      Date
2139                 ,p_end_date                     IN      Date
2140                 ,p_period_name                  IN      Varchar2
2141                 ,p_txn_currency_code            IN      Varchar2
2142                 ,p_quantity                     IN      Number
2143                 ,p_txn_raw_cost                 IN      Number
2144                 ,p_txn_burdened_cost            IN      Number
2145                 ,p_txn_revenue                  IN      Number
2146                 ,p_project_currency_code        IN      Varchar2
2147                 ,p_project_raw_cost             IN      Number
2148                 ,p_project_burdened_cost        IN      Number
2149                 ,p_project_revenue              IN      Number
2150                 ,p_projfunc_currency_code       IN      Varchar2
2151                 ,p_projfunc_raw_cost            IN      Number
2152                 ,p_projfunc_burdened_cost       IN      Number
2153                 ,p_projfunc_revenue             IN      Number
2154 		,p_rep_line_mode                IN      Varchar2
2155                 ,x_msg_data                     OUT NOCOPY Varchar2
2156                 ,x_return_status                OUT NOCOPY Varchar2
2157                 ) IS
2158 
2159     l_msg_count   Number :=0;
2160 
2161 BEGIN
2162     x_msg_data        := NULL;
2163         l_msg_count       := 0;
2164         x_return_status   := 'S';
2165     /* Bug fix: 3867302 : PJI reporting apis should not be called for change order/change requests */
2166     IF (NVL(G_AGR_CONV_REQD_FLAG,'N') <> 'Y' AND NVL(g_rollup_required_flag,'N') = 'Y') Then
2167         g_rep_budget_line_id_tab.extend;
2168         g_rep_budget_line_id_tab(g_rep_budget_line_id_tab.last) := p_budget_line_id;
2169             g_rep_res_assignment_id_tab.extend;
2170         g_rep_res_assignment_id_tab(g_rep_res_assignment_id_tab.Last) := p_resource_assignment_id;
2171             g_rep_start_date_tab.extend;
2172         g_rep_start_date_tab(g_rep_start_date_tab.Last) := p_start_date;
2173             g_rep_end_date_tab.extend;
2174         g_rep_end_date_tab(g_rep_end_date_tab.Last) := p_end_date;
2175             g_rep_period_name_tab.Extend;
2176         g_rep_period_name_tab(g_rep_period_name_tab.Last) := p_period_name;
2177             g_rep_txn_curr_code_tab.extend;
2178         g_rep_txn_curr_code_tab(g_rep_txn_curr_code_tab.Last) := p_txn_currency_code;
2179             g_rep_quantity_tab.Extend;
2180         g_rep_quantity_tab(g_rep_quantity_tab.Last) := p_quantity;
2181             g_rep_txn_raw_cost_tab.extend;
2182         g_rep_txn_raw_cost_tab(g_rep_txn_raw_cost_tab.Last) := p_txn_raw_cost;
2183             g_rep_txn_burdened_cost_tab.extend;
2184         g_rep_txn_burdened_cost_tab(g_rep_txn_burdened_cost_tab.Last) := p_txn_burdened_cost;
2185             g_rep_txn_revenue_tab.extend;
2186         g_rep_txn_revenue_tab(g_rep_txn_revenue_tab.Last) := p_txn_revenue;
2187             g_rep_project_curr_code_tab.extend;
2188         g_rep_project_curr_code_tab(g_rep_project_curr_code_tab.Last) := p_project_currency_code;
2189             g_rep_project_raw_cost_tab.extend;
2190         g_rep_project_raw_cost_tab(g_rep_project_raw_cost_tab.Last) := p_project_raw_cost;
2191             g_rep_project_burden_cost_tab.extend;
2192         g_rep_project_burden_cost_tab(g_rep_project_burden_cost_tab.Last) := p_project_burdened_cost;
2193             g_rep_project_revenue_tab.extend;
2194         g_rep_project_revenue_tab(g_rep_project_revenue_tab.Last) := p_project_revenue;
2195             g_rep_projfunc_curr_code_tab.extend;
2196         g_rep_projfunc_curr_code_tab(g_rep_projfunc_curr_code_tab.Last) := p_projfunc_currency_code;
2197             g_rep_projfunc_raw_cost_tab.extend;
2198         g_rep_projfunc_raw_cost_tab(g_rep_projfunc_raw_cost_tab.Last) := p_projfunc_raw_cost;
2199             g_rep_projfunc_burden_cost_tab.extend;
2200         g_rep_projfunc_burden_cost_tab(g_rep_projfunc_burden_cost_tab.Last) := p_projfunc_burdened_cost;
2201             g_rep_projfunc_revenue_tab.extend;
2202         g_rep_projfunc_revenue_tab(g_rep_projfunc_revenue_tab.Last) := p_projfunc_revenue;
2203 	g_rep_line_mode_tab.extend;
2204 	g_rep_line_mode_tab(g_rep_line_mode_tab.Last) := p_rep_line_mode;
2205 	g_rep_rate_base_flag_tab.extend;
2206 	g_rep_rate_base_flag_tab(g_rep_rate_base_flag_tab.last) := NULL;
2207     End If;
2208 
2209 EXCEPTION
2210     WHEN OTHERS THEN
2211         print_msg('Failed in PA_FP_PJI_INTG_PKG.update_reporting_lines API ['||sqlcode||sqlerrm);
2212         x_return_status := 'U';
2213         x_msg_data := sqlcode||sqlerrm;
2214         RAISE;
2215 
2216 END Add_Toreporting_Tabls;
2217 
2218 /* This API will print all the values passed to PJI rollup API.  This is only for debug purpose */
2219 PROCEDURE DbugPjiVals IS
2220 	l_msg	Varchar2(2000);
2221 BEGIN
2222    /**
2223     IF g_rep_res_assignment_id_tab.COUNT > 0 THEN
2224         FOR i IN g_rep_res_assignment_id_tab.FIRST .. g_rep_res_assignment_id_tab.LAST LOOP
2225 	    l_msg := 'RaId['||g_rep_res_assignment_id_tab(i)||']TxnCur['||g_rep_txn_curr_code_tab(i)||']SD['||g_rep_start_date_tab(i)||']';
2226             l_msg := l_msg||'Qty['||g_rep_quantity_tab(i)||']TxnRaw['||g_rep_txn_raw_cost_tab(i)||']Burd['||g_rep_txn_burdened_cost_tab(i)||']';
2227 	    l_msg := l_msg||'RepLineMode['||g_rep_line_mode_tab(i)||']RateBaseFlag['||g_rep_rate_base_flag_tab(i)||']';
2228 	    print_msg(l_msg);
2229         END LOOP;
2230 
2231     END IF;
2232    **/
2233 	NULL;
2234 
2235 END DbugPjiVals;
2236 
2237 PROCEDURE Update_PCPFC_rounding_diff(
2238         p_project_id                     IN  pa_budget_versions.project_id%type
2239                 ,p_budget_version_id              IN  pa_budget_versions.budget_version_id%TYPE
2240                 ,p_calling_module                IN  VARCHAR2 DEFAULT NULL
2241                 ,p_source_context                IN  pa_fp_res_assignments_tmp.source_context%TYPE
2242                 ,p_wp_cost_enabled_flag          IN  varchar2
2243                 ,p_budget_version_type           IN  varchar2
2244                 ,x_return_status                 OUT NOCOPY VARCHAR2
2245                 ,x_msg_count                     OUT NOCOPY NUMBER
2246                 ,x_msg_data                      OUT NOCOPY VARCHAR2) IS
2247 
2248     CURSOR cur_round_discrepancy_lines IS
2249     SELECT resource_assignment_id
2250                 ,txn_currency_code
2251                 ,MAX(start_date)
2252                 ,SUM(quantity)
2253                 ,SUM(init_quantity)
2254                 ,SUM(txn_raw_cost)
2255                 ,SUM(txn_init_raw_cost)
2256                 ,SUM(txn_burdened_cost)
2257                 ,SUM(txn_init_burdened_cost)
2258                 ,SUM(txn_revenue)
2259                 ,SUM(txn_init_revenue)
2260         ,SUM(txn_raw_cost * project_cost_exchange_rate)   unround_project_raw_cost
2261         ,SUM(txn_burdened_cost * project_cost_exchange_rate) unround_project_burden_cost
2262         ,SUM(txn_revenue * project_rev_exchange_rate)   unround_project_revenue
2263         ,SUM(pa_currency.round_trans_currency_amt1((txn_raw_cost * project_cost_exchange_rate),project_currency_code)) round_project_raw_cost
2264         ,SUM(pa_currency.round_trans_currency_amt1((txn_burdened_cost * project_cost_exchange_rate),project_currency_code)) round_project_burden_cost
2265         ,SUM(pa_currency.round_trans_currency_amt1((txn_revenue * project_rev_exchange_rate),project_currency_code)) round_project_revenue
2266         ,SUM(txn_raw_cost * projfunc_cost_exchange_rate)   unround_projfunc_raw_cost
2267                 ,SUM(txn_burdened_cost * projfunc_cost_exchange_rate) unround_projfunc_burden_cost
2268                 ,SUM(txn_revenue * projfunc_rev_exchange_rate)   unround_projfunc_revenue
2269                 ,SUM(pa_currency.round_trans_currency_amt1((txn_raw_cost * projfunc_cost_exchange_rate),projfunc_currency_code)) round_projfunc_raw_cost
2270                 ,SUM(pa_currency.round_trans_currency_amt1((txn_burdened_cost * projfunc_cost_exchange_rate),projfunc_currency_code)) round_projfunc_burden_cost
2271                 ,SUM(pa_currency.round_trans_currency_amt1((txn_revenue * projfunc_rev_exchange_rate),projfunc_currency_code)) round_projfunc_revenue
2272         ,to_number(NULL) diff_proj_raw_cost
2273                 ,to_number(NULL) diff_proj_burden_cost
2274                 ,to_number(NULL) diff_proj_revenue
2275         ,to_number(NULL) diff_projfunc_raw_cost
2276                 ,to_number(NULL) diff_projfunc_burden_cost
2277                 ,to_number(NULL) diff_projfunc_revenue
2278         ,project_currency_code
2279         ,projfunc_currency_code
2280         FROM pa_fp_rollup_tmp tmp
2281     WHERE tmp.budget_version_id = p_budget_version_id
2282     AND nvl(quantity,0) <> 0
2283     AND  ( tmp.txn_currency_code <> tmp.project_currency_code
2284         OR
2285         tmp.txn_currency_code <> tmp.projfunc_currency_code
2286          )
2287     GROUP BY resource_assignment_id
2288                 ,txn_currency_code
2289         ,project_currency_code
2290         ,projfunc_currency_code;
2291 
2292     l_return_status    varchar2(10);
2293     l_msg_count        Number;
2294     l_msg_data         varchar2(240);
2295 
2296         l_resource_assignment_tab       pa_plsql_datatypes.NumTabTyp;
2297         l_txn_currency_code_tab         pa_plsql_datatypes.Char50TabTyp;
2298         l_proj_currency_code_tab        pa_plsql_datatypes.Char50TabTyp;
2299         l_pjfc_currency_code_tab        pa_plsql_datatypes.Char50TabTyp;
2300         l_start_date_tab                pa_plsql_datatypes.DateTabTyp;
2301         l_quantity_tab                  pa_plsql_datatypes.NumTabTyp;
2302         l_init_quantity_tab             pa_plsql_datatypes.NumTabTyp;
2303         l_txn_raw_cost_tab              pa_plsql_datatypes.NumTabTyp;
2304         l_txn_init_raw_cost_tab         pa_plsql_datatypes.NumTabTyp;
2305         l_txn_burdened_cost_tab         pa_plsql_datatypes.NumTabTyp;
2306         l_txn_init_burdened_cost_tab    pa_plsql_datatypes.NumTabTyp;
2307         l_txn_revenue_tab               pa_plsql_datatypes.NumTabTyp;
2308         l_txn_init_revenue_tab          pa_plsql_datatypes.NumTabTyp;
2309     l_unround_proj_raw_cost_tab    pa_plsql_datatypes.NumTabTyp;
2310     l_unround_proj_burd_cost_tab   pa_plsql_datatypes.NumTabTyp;
2311     l_unround_proj_rev_tab         pa_plsql_datatypes.NumTabTyp;
2312     l_round_proj_raw_cost_tab      pa_plsql_datatypes.NumTabTyp;
2313     l_round_proj_burd_cost_tab    pa_plsql_datatypes.NumTabTyp;
2314     l_round_proj_rev_tab           pa_plsql_datatypes.NumTabTyp;
2315         l_unround_pjfc_raw_cost_tab    pa_plsql_datatypes.NumTabTyp;
2316         l_unround_pjfc_burd_cost_tab   pa_plsql_datatypes.NumTabTyp;
2317         l_unround_pjfc_rev_tab         pa_plsql_datatypes.NumTabTyp;
2318         l_round_pjfc_raw_cost_tab      pa_plsql_datatypes.NumTabTyp;
2319         l_round_pjfc_burd_cost_tab    pa_plsql_datatypes.NumTabTyp;
2320         l_round_pjfc_rev_tab           pa_plsql_datatypes.NumTabTyp;
2321     l_diff_proj_raw_cost_tab       pa_plsql_datatypes.NumTabTyp;
2322         l_diff_proj_burd_cost_tab    pa_plsql_datatypes.NumTabTyp;
2323         l_diff_proj_rev_tab        pa_plsql_datatypes.NumTabTyp;
2324         l_diff_pjfc_raw_cost_tab       pa_plsql_datatypes.NumTabTyp;
2325         l_diff_pjfc_burd_cost_tab    pa_plsql_datatypes.NumTabTyp;
2326         l_diff_pjfc_rev_tab        pa_plsql_datatypes.NumTabTyp;
2327 
2328     l_revenue_generation_method varchar2(10);
2329         l_null_revenue_amts_flag    varchar2(10);
2330 
2331 BEGIN
2332     /* initialize the out variables */
2333     x_return_status := 'S';
2334     x_msg_count     := 0;
2335     x_msg_data      := NULL;
2336         l_return_status := 'S';
2337     l_msg_count := 0;
2338     l_msg_data      := NULL;
2339     IF p_pa_debug_mode = 'Y' Then
2340             pa_debug.init_err_stack('PA_FP_CALC_PLAN_PKG.Update_PCPFCrounding_diff');
2341     End If;
2342 
2343     g_stage := 'Update_PCPFC_rounding_diff:100';
2344         pa_debug.g_err_stage := 'Entered Update_PCPFCrounding_diff API';
2345     --print_msg(pa_debug.g_err_stage);
2346 
2347     IF p_wp_cost_enabled_flag = 'Y' Then
2348         /* initialize the plsql tabs */
2349         l_resource_assignment_tab.delete;
2350             l_txn_currency_code_tab.delete;
2351             l_start_date_tab.delete;
2352             l_quantity_tab.delete;
2353             l_init_quantity_tab.delete;
2354             l_txn_raw_cost_tab.delete;
2355             l_txn_init_raw_cost_tab.delete;
2356             l_txn_burdened_cost_tab.delete;
2357             l_txn_init_burdened_cost_tab.delete;
2358             l_txn_revenue_tab.delete;
2359             l_txn_init_revenue_tab.delete;
2360         l_unround_proj_raw_cost_tab.delete;
2361             l_unround_proj_burd_cost_tab.delete;
2362             l_unround_proj_rev_tab.delete;
2363             l_round_proj_raw_cost_tab.delete;
2364             l_round_proj_burd_cost_tab.delete;
2365             l_round_proj_rev_tab.delete;
2366             l_unround_pjfc_raw_cost_tab.delete;
2367             l_unround_pjfc_burd_cost_tab.delete;
2368             l_unround_pjfc_rev_tab.delete;
2369             l_round_pjfc_raw_cost_tab.delete;
2370             l_round_pjfc_burd_cost_tab.delete;
2371             l_round_pjfc_rev_tab.delete;
2372             l_diff_proj_raw_cost_tab.delete;
2373             l_diff_proj_burd_cost_tab.delete;
2374             l_diff_proj_rev_tab.delete;
2375             l_diff_pjfc_raw_cost_tab.delete;
2376             l_diff_pjfc_burd_cost_tab.delete;
2377             l_diff_pjfc_rev_tab.delete;
2378         l_proj_currency_code_tab.delete;
2379         l_pjfc_currency_code_tab.delete;
2380 
2381         OPEN cur_round_discrepancy_lines;
2382         FETCH cur_round_discrepancy_lines BULK COLLECT INTO
2383             l_resource_assignment_tab
2384                     ,l_txn_currency_code_tab
2385                     ,l_start_date_tab
2386                     ,l_quantity_tab
2387                     ,l_init_quantity_tab
2388                     ,l_txn_raw_cost_tab
2389                     ,l_txn_init_raw_cost_tab
2390                     ,l_txn_burdened_cost_tab
2391                     ,l_txn_init_burdened_cost_tab
2392                     ,l_txn_revenue_tab
2393                     ,l_txn_init_revenue_tab
2394             ,l_unround_proj_raw_cost_tab
2395                     ,l_unround_proj_burd_cost_tab
2396                     ,l_unround_proj_rev_tab
2397                     ,l_round_proj_raw_cost_tab
2398                     ,l_round_proj_burd_cost_tab
2399                     ,l_round_proj_rev_tab
2400                     ,l_unround_pjfc_raw_cost_tab
2401                     ,l_unround_pjfc_burd_cost_tab
2402                     ,l_unround_pjfc_rev_tab
2403                     ,l_round_pjfc_raw_cost_tab
2404                     ,l_round_pjfc_burd_cost_tab
2405                     ,l_round_pjfc_rev_tab
2406                     ,l_diff_proj_raw_cost_tab
2407                     ,l_diff_proj_burd_cost_tab
2408                     ,l_diff_proj_rev_tab
2409                     ,l_diff_pjfc_raw_cost_tab
2410                     ,l_diff_pjfc_burd_cost_tab
2411                     ,l_diff_pjfc_rev_tab
2412             ,l_proj_currency_code_tab
2413             ,l_pjfc_currency_code_tab;
2414         CLOSE cur_round_discrepancy_lines;
2415 
2416         --print_msg('Number Of Lines fetched into plsql tabls['||l_resource_assignment_tab.count||']');
2417         IF l_resource_assignment_tab.COUNT > 0 Then
2418             g_stage := 'Update_PCPFC_rounding_diff:101';
2419             FOR i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST LOOP
2420                 l_diff_proj_raw_cost_tab(i) := nvl(l_unround_proj_raw_cost_tab(i),0) - nvl(l_round_proj_raw_cost_tab(i),0);
2421                 l_diff_proj_burd_cost_tab(i) := nvl(l_unround_proj_burd_cost_tab(i),0) - nvl(l_round_proj_burd_cost_tab(i),0);
2422                 l_diff_proj_rev_tab(i)  := nvl(l_unround_proj_rev_tab(i),0) - nvl(l_round_proj_rev_tab(i),0);
2423 
2424                 l_diff_proj_raw_cost_tab(i) := pa_currency.round_trans_currency_amt1(l_diff_proj_raw_cost_tab(i),l_proj_currency_code_tab(i));
2425                 l_diff_proj_burd_cost_tab(i) := pa_currency.round_trans_currency_amt1(l_diff_proj_burd_cost_tab(i),l_proj_currency_code_tab(i));
2426                 l_diff_proj_rev_tab(i)  := pa_currency.round_trans_currency_amt1(l_diff_proj_rev_tab(i),l_proj_currency_code_tab(i));
2427                 /* projfunc discrepancy */
2428                                 l_diff_pjfc_raw_cost_tab(i) := nvl(l_unround_pjfc_raw_cost_tab(i),0) - nvl(l_round_pjfc_raw_cost_tab(i),0);
2429                                 l_diff_pjfc_burd_cost_tab(i) := nvl(l_unround_pjfc_burd_cost_tab(i),0) - nvl(l_round_pjfc_burd_cost_tab(i),0);
2430                                 l_diff_pjfc_rev_tab(i)  := nvl(l_unround_pjfc_rev_tab(i),0) - nvl(l_round_pjfc_rev_tab(i),0);
2431 
2432                                 l_diff_pjfc_raw_cost_tab(i) := pa_currency.round_trans_currency_amt1(l_diff_pjfc_raw_cost_tab(i),l_pjfc_currency_code_tab(i));
2433                                 l_diff_pjfc_burd_cost_tab(i) := pa_currency.round_trans_currency_amt1(l_diff_pjfc_burd_cost_tab(i),l_pjfc_currency_code_tab(i));
2434                                 l_diff_pjfc_rev_tab(i)  := pa_currency.round_trans_currency_amt1(l_diff_pjfc_rev_tab(i),l_pjfc_currency_code_tab(i));
2435             END LOOP;
2436 
2437             l_null_revenue_amts_flag := 'N';
2438             IF (p_calling_module IN ('BUDGET_GENERATION','FORECAST_GENERATION') AND p_budget_version_type = 'ALL'
2439                  --Bug 6722414 When called from ETC client extension, Dont null out revenue amounts.
2440             AND NVL(g_from_etc_client_extn_flag,'N')='N' ) THEN
2441                 l_revenue_generation_method := NVL(PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(p_project_id),'W');
2442                         IF NVL(l_revenue_generation_method,'W') in ('C','E') Then
2443                     l_null_revenue_amts_flag := 'Y';
2444                 End IF;
2445             END IF;
2446 
2447             --print_msg('Updating rollup tmp last line with the rounding difference amount');
2448             g_stage := 'Update_PCPFC_rounding_diff:102';
2449             FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
2450             UPDATE pa_fp_rollup_tmp tmp
2451                         SET tmp.attribute14 = decode(tmp.txn_currency_code,tmp.project_currency_code,NULL,'PCPFCRoundingDiscrepancyLine')
2452             /*---Project columns ---*/
2453             ,tmp.project_raw_cost = decode(p_budget_version_type,'COST',
2454                             decode(tmp.txn_currency_code,tmp.project_currency_code,tmp.project_raw_cost
2455                                 ,decode((nvl(tmp.project_raw_cost,0)+ NVL(l_diff_proj_raw_cost_tab(i),0)),0,NULL,
2456                                     (nvl(tmp.project_raw_cost,0)+ NVL(l_diff_proj_raw_cost_tab(i),0))))
2457                               ,'ALL',
2458                                                         decode(tmp.txn_currency_code,tmp.project_currency_code,tmp.project_raw_cost
2459                                                                 ,decode((nvl(tmp.project_raw_cost,0)+ NVL(l_diff_proj_raw_cost_tab(i),0)),0,NULL,
2460                                                                         (nvl(tmp.project_raw_cost,0)+ NVL(l_diff_proj_raw_cost_tab(i),0))))
2461                               ,'REVENUE',tmp.project_raw_cost)
2462             ,tmp.project_burdened_cost =decode(p_budget_version_type,'COST',
2463                                                         decode(tmp.txn_currency_code,tmp.project_currency_code,tmp.project_burdened_cost
2464                                                                 ,decode((nvl(tmp.project_burdened_cost,0)+ NVL(l_diff_proj_burd_cost_tab(i),0)),0,NULL,
2465                                                                         (nvl(tmp.project_burdened_cost,0)+ NVL(l_diff_proj_burd_cost_tab(i),0))))
2466                                                       ,'ALL',
2467                                                         decode(tmp.txn_currency_code,tmp.project_currency_code,tmp.project_burdened_cost
2468                                                                 ,decode((nvl(tmp.project_burdened_cost,0)+ NVL(l_diff_proj_burd_cost_tab(i),0)),0,NULL,
2469                                                                         (nvl(tmp.project_burdened_cost,0)+ NVL(l_diff_proj_burd_cost_tab(i),0))))
2470                                                       ,'REVENUE',tmp.project_burdened_cost)
2471             ,tmp.project_revenue = decode(p_budget_version_type,'COST', tmp.project_revenue
2472                             ,'ALL',decode(tmp.txn_currency_code,tmp.project_currency_code,tmp.project_revenue
2473                                 ,DECODE(l_null_revenue_amts_flag,'Y',tmp.project_revenue
2474                                   ,decode((nvl(tmp.project_revenue,0)+nvl(l_diff_proj_rev_tab(i),0)),0,NULL,
2475                                      (nvl(tmp.project_revenue,0)+nvl(l_diff_proj_rev_tab(i),0)))))
2476                             ,'REVENUE', decode(tmp.txn_currency_code,tmp.project_currency_code,tmp.project_revenue
2477                                 ,decode((nvl(tmp.project_revenue,0)+nvl(l_diff_proj_rev_tab(i),0)),0,NULL,
2478                                                                      (nvl(tmp.project_revenue,0)+nvl(l_diff_proj_rev_tab(i),0)))))
2479             /*---ProjFunc columns ---*/
2480             ,tmp.projfunc_raw_cost = decode(p_budget_version_type,'COST',
2481                                                         decode(tmp.txn_currency_code,tmp.projfunc_currency_code,tmp.projfunc_raw_cost
2482                                                                 ,decode((nvl(tmp.projfunc_raw_cost,0)+ NVL(l_diff_pjfc_raw_cost_tab(i),0)),0,NULL,
2483                                                                         (nvl(tmp.projfunc_raw_cost,0)+ NVL(l_diff_pjfc_raw_cost_tab(i),0))))
2484                                                       ,'ALL',
2485                                                         decode(tmp.txn_currency_code,tmp.projfunc_currency_code,tmp.projfunc_raw_cost
2486                                                                 ,decode((nvl(tmp.projfunc_raw_cost,0)+ NVL(l_diff_pjfc_raw_cost_tab(i),0)),0,NULL,
2487                                                                         (nvl(tmp.projfunc_raw_cost,0)+ NVL(l_diff_pjfc_raw_cost_tab(i),0))))
2488                                                       ,'REVENUE',tmp.projfunc_raw_cost)
2489             ,tmp.projfunc_burdened_cost = decode(p_budget_version_type,'COST',
2490                                                         decode(tmp.txn_currency_code,tmp.projfunc_currency_code,tmp.projfunc_burdened_cost
2491                                                                 ,decode((nvl(tmp.projfunc_burdened_cost,0)+ NVL(l_diff_pjfc_burd_cost_tab(i),0)),0,NULL,
2492                                                                         (nvl(tmp.projfunc_burdened_cost,0)+ NVL(l_diff_pjfc_burd_cost_tab(i),0))))
2493                                                       ,'ALL',
2494                                                         decode(tmp.txn_currency_code,tmp.projfunc_currency_code,tmp.projfunc_burdened_cost
2495                                                                 ,decode((nvl(tmp.projfunc_burdened_cost,0)+ NVL(l_diff_pjfc_burd_cost_tab(i),0)),0,NULL,
2496                                                                         (nvl(tmp.projfunc_burdened_cost,0)+ NVL(l_diff_pjfc_burd_cost_tab(i),0))))
2497                                                       ,'REVENUE',tmp.projfunc_burdened_cost)
2498             ,tmp.projfunc_revenue = decode(p_budget_version_type,'COST', tmp.projfunc_revenue
2499                                                         ,'ALL',decode(tmp.txn_currency_code,tmp.projfunc_currency_code,tmp.projfunc_revenue
2500                                                                 ,DECODE(l_null_revenue_amts_flag,'Y',tmp.projfunc_revenue
2501                                                                   ,decode((nvl(tmp.projfunc_revenue,0)+nvl(l_diff_pjfc_rev_tab(i),0)),0,NULL,
2502                                                                      (nvl(tmp.projfunc_revenue,0)+nvl(l_diff_pjfc_rev_tab(i),0)))))
2503                                                         ,'REVENUE', decode(tmp.txn_currency_code,tmp.projfunc_currency_code,tmp.projfunc_revenue
2504                                                                 ,decode((nvl(tmp.projfunc_revenue,0)+nvl(l_diff_pjfc_rev_tab(i),0)),0,NULL,
2505                                                                      (nvl(tmp.projfunc_revenue,0)+nvl(l_diff_pjfc_rev_tab(i),0)))))
2506                         WHERE tmp.resource_assignment_id = l_resource_assignment_tab(i)
2507                         AND   tmp.txn_currency_code = l_txn_currency_code_tab(i)
2508                         AND   tmp.start_date = l_start_date_tab(i)
2509                         AND   (NVL(l_diff_proj_raw_cost_tab(i),0) <> 0
2510                      OR NVL(l_diff_proj_burd_cost_tab(i),0) <> 0
2511                  OR NVL(l_diff_proj_rev_tab(i),0) <> 0
2512                  OR NVL(l_diff_pjfc_raw_cost_tab(i),0) <> 0
2513                                  OR NVL(l_diff_pjfc_burd_cost_tab(i),0) <> 0
2514                                  OR NVL(l_diff_pjfc_rev_tab(i),0) <> 0 );
2515             /** Bug fix: 4208217 Performance fix:  This is additional condition may not be necessary so commenting out
2516                         -- added this to ensure that only one budget line in rollup tmp gets updated even if there is duplicate lines
2517                         AND   tmp.rowid in (select max(rowid)
2518                                             from pa_fp_rollup_tmp tmp2
2519                                             where tmp2.resource_assignment_id = tmp.resource_assignment_id
2520                                             and tmp2.txn_currency_code = tmp.txn_currency_code
2521                                             and tmp2.start_date = tmp.start_date
2522                                            );
2523             **/
2524                         --print_msg('Number of lines updated['||sql%rowcount||']');
2525         END IF;
2526     End If;
2527 
2528     x_return_status := l_return_status;
2529         x_msg_count     := l_msg_count;
2530         x_msg_data  := l_msg_data;
2531     g_stage := 'Update_PCPFC_rounding_diff:103';
2532     -- reset error stack
2533     IF p_pa_debug_mode = 'Y' Then
2534     	print_msg('End of Update_PCPFCrounding_diff API return Sts['||x_return_status||']');
2535         pa_debug.reset_err_stack;
2536     End If;
2537 
2538 EXCEPTION
2539     WHEN OTHERS THEN
2540                 print_msg('Failed in Update_PCPFCrounding_diff API ['||sqlcode||sqlerrm);
2541                 x_return_status := 'U';
2542                 x_msg_data := sqlcode||sqlerrm;
2543         fnd_msg_pub.add_exc_msg
2544                 ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
2545                  ,p_procedure_name => 'Update_PCPFC_rounding_diff' );
2546                 print_msg('Failed in Update_PCPFC_rounding_diff substr(SQLERRM,1,240) => '|| substr(SQLERRM,1,240));
2547         IF p_pa_debug_mode = 'Y' Then
2548             pa_debug.reset_err_stack;
2549         End If;
2550                 RAISE;
2551 END Update_PCPFC_rounding_diff;
2552 
2553 /* This API rounds off the amounts to currency precision level and the last budget line of resoruce per currency will be
2554  * updated with the rounding discrepancy amounts
2555  */
2556 PROCEDURE Update_rounding_diff(
2557         p_project_id             IN  pa_budget_versions.project_id%type
2558         ,p_budget_version_id              IN  pa_budget_versions.budget_version_id%TYPE
2559         ,p_calling_module                IN  VARCHAR2 DEFAULT NULL
2560         ,p_source_context                IN  pa_fp_res_assignments_tmp.source_context%TYPE
2561         ,p_wp_cost_enabled_flag          IN  varchar2
2562         ,p_budget_version_type           IN  varchar2
2563                 ,x_return_status                 OUT NOCOPY VARCHAR2
2564                 ,x_msg_count                     OUT NOCOPY NUMBER
2565                 ,x_msg_data                      OUT NOCOPY VARCHAR2) IS
2566 
2567     CURSOR cur_round_discrepancy_lines IS
2568     SELECT resource_assignment_id
2569                 ,txn_currency_code
2570                 ,MAX(start_date)
2571                 ,SUM(quantity)
2572                 ,SUM(init_quantity)
2573                 ,SUM(txn_raw_cost)
2574                 ,SUM(txn_init_raw_cost)
2575                 ,SUM(txn_burdened_cost)
2576                 ,SUM(txn_init_burdened_cost)
2577                 ,SUM(txn_revenue)
2578                 ,SUM(txn_init_revenue)
2579                 ,SUM(((NVL(quantity,0) - nvl(init_quantity,0)) * nvl(rw_cost_rate_override,cost_rate))) unrounded_txn_raw_cost
2580                 ,SUM(((NVL(quantity,0) - nvl(init_quantity,0)) * nvl(burden_cost_rate_override,burden_cost_rate))) unrounded_txn_burdened_cost
2581                 ,SUM(((NVL(quantity,0) - nvl(init_quantity,0)) * nvl(bill_rate_override,bill_rate))) unrounded_txn_revenue
2582         ,SUM(decode(nvl(rw_cost_rate_override,nvl(cost_rate,0)),0,0
2583             ,pa_currency.round_trans_currency_amt1((nvl(txn_raw_cost,0) - nvl(txn_init_raw_cost,0)),txn_currency_code))) rounded_txn_raw_cost
2584         ,SUM(decode(nvl(burden_cost_rate_override,nvl(burden_cost_rate,0)),0,0
2585             ,pa_currency.round_trans_currency_amt1((nvl(txn_burdened_cost,0) - nvl(txn_init_burdened_cost,0)),txn_currency_code))) rounded_txn_burdened_cost
2586                 ,SUM(decode(nvl(bill_rate_override,nvl(bill_rate,0)),0,0
2587             ,pa_currency.round_trans_currency_amt1((nvl(txn_revenue,0) - nvl(txn_init_revenue,0)),txn_currency_code))) rounded_txn_revenue
2588         /**
2589                 ,SUM(pa_currency.round_trans_currency_amt1(((NVL(quantity,0) - nvl(init_quantity,0)) * nvl(rw_cost_rate_override,cost_rate))
2590             ,txn_currency_code)) rounded_txn_raw_cost
2591                 ,SUM(pa_currency.round_trans_currency_amt1(((NVL(quantity,0) - nvl(init_quantity,0)) * nvl(burden_cost_rate_override,burden_cost_rate))
2592                         ,txn_currency_code)) rounded_txn_burdened_cost
2593                 ,SUM(pa_currency.round_trans_currency_amt1(((NVL(quantity,0) - nvl(init_quantity,0)) * nvl(bill_rate_override,bill_rate))
2594             ,txn_currency_code)) rounded_txn_revenue
2595          **/
2596         ,to_number(NULL) diff_raw_cost
2597         ,to_number(NULL) diff_burden_cost
2598         ,to_number(NULL) diff_revenue
2599         FROM pa_fp_rollup_tmp tmp
2600     WHERE tmp.budget_version_id = p_budget_version_id
2601     AND  nvl(quantity,0) <> 0
2602     GROUP BY resource_assignment_id
2603                 ,txn_currency_code ;
2604 
2605     l_return_status    varchar2(10);
2606     l_msg_count        Number;
2607     l_msg_data         varchar2(240);
2608 
2609         l_resource_assignment_tab       pa_plsql_datatypes.NumTabTyp;
2610         l_txn_currency_code_tab         pa_plsql_datatypes.Char50TabTyp;
2611         l_start_date_tab                pa_plsql_datatypes.DateTabTyp;
2612         l_quantity_tab                  pa_plsql_datatypes.NumTabTyp;
2613         l_init_quantity_tab             pa_plsql_datatypes.NumTabTyp;
2614         l_txn_raw_cost_tab              pa_plsql_datatypes.NumTabTyp;
2615         l_txn_init_raw_cost_tab         pa_plsql_datatypes.NumTabTyp;
2616         l_txn_burdened_cost_tab         pa_plsql_datatypes.NumTabTyp;
2617         l_txn_init_burdened_cost_tab    pa_plsql_datatypes.NumTabTyp;
2618         l_txn_revenue_tab               pa_plsql_datatypes.NumTabTyp;
2619         l_txn_init_revenue_tab          pa_plsql_datatypes.NumTabTyp;
2620     l_unrounded_txn_raw_cost_tab    pa_plsql_datatypes.NumTabTyp;
2621     l_unround_txn_burden_cost_tab   pa_plsql_datatypes.NumTabTyp;
2622     l_unrounded_txn_revenue_tab pa_plsql_datatypes.NumTabTyp;
2623     l_rounded_txn_raw_cost_tab  pa_plsql_datatypes.NumTabTyp;
2624     l_rounded_txn_burden_cost_tab   pa_plsql_datatypes.NumTabTyp;
2625     l_rounded_txn_revenue_tab   pa_plsql_datatypes.NumTabTyp;
2626     l_diff_raw_cost_tab         pa_plsql_datatypes.NumTabTyp;
2627     l_diff_burden_cost_tab      pa_plsql_datatypes.NumTabTyp;
2628     l_diff_revenue_tab      pa_plsql_datatypes.NumTabTyp;
2629 
2630     l_revenue_generation_method varchar2(10);
2631         l_null_revenue_amts_flag    varchar2(10);
2632 
2633 BEGIN
2634     /* initialize the out variables */
2635     x_return_status := 'S';
2636     x_msg_count     := 0;
2637     x_msg_data      := NULL;
2638         l_return_status := 'S';
2639     l_msg_count := 0;
2640     l_msg_data      := NULL;
2641     IF p_pa_debug_mode = 'Y' Then
2642             pa_debug.init_err_stack('PA_FP_CALC_PLAN_PKG.Update_rounding_diff');
2643     End If;
2644 
2645     g_stage := 'Update_rounding_diff:100';
2646         pa_debug.g_err_stage := 'Entered Update_rounding_diff API';
2647     --print_msg(pa_debug.g_err_stage);
2648 
2649     IF p_wp_cost_enabled_flag = 'Y' Then
2650         /* initialize the plsql tabs */
2651         l_resource_assignment_tab.delete;
2652             l_txn_currency_code_tab.delete;
2653             l_start_date_tab.delete;
2654             l_quantity_tab.delete;
2655             l_init_quantity_tab.delete;
2656             l_txn_raw_cost_tab.delete;
2657             l_txn_init_raw_cost_tab.delete;
2658             l_txn_burdened_cost_tab.delete;
2659             l_txn_init_burdened_cost_tab.delete;
2660             l_txn_revenue_tab.delete;
2661             l_txn_init_revenue_tab.delete;
2662             l_unrounded_txn_raw_cost_tab.delete;
2663             l_unround_txn_burden_cost_tab.delete;
2664             l_unrounded_txn_revenue_tab.delete;
2665             l_rounded_txn_raw_cost_tab.delete;
2666             l_rounded_txn_burden_cost_tab.delete;
2667             l_rounded_txn_revenue_tab.delete ;
2668         l_diff_raw_cost_tab.delete;
2669             l_diff_burden_cost_tab.delete;
2670             l_diff_revenue_tab.delete;
2671 
2672         OPEN cur_round_discrepancy_lines;
2673         FETCH cur_round_discrepancy_lines BULK COLLECT INTO
2674             l_resource_assignment_tab
2675                     ,l_txn_currency_code_tab
2676                     ,l_start_date_tab
2677                     ,l_quantity_tab
2678                     ,l_init_quantity_tab
2679                     ,l_txn_raw_cost_tab
2680                     ,l_txn_init_raw_cost_tab
2681                     ,l_txn_burdened_cost_tab
2682                     ,l_txn_init_burdened_cost_tab
2683                     ,l_txn_revenue_tab
2684                     ,l_txn_init_revenue_tab
2685                     ,l_unrounded_txn_raw_cost_tab
2686                     ,l_unround_txn_burden_cost_tab
2687                     ,l_unrounded_txn_revenue_tab
2688                     ,l_rounded_txn_raw_cost_tab
2689                     ,l_rounded_txn_burden_cost_tab
2690                     ,l_rounded_txn_revenue_tab
2691             ,l_diff_raw_cost_tab
2692                     ,l_diff_burden_cost_tab
2693                     ,l_diff_revenue_tab;
2694         CLOSE cur_round_discrepancy_lines;
2695         g_stage := 'Update_rounding_diff:101';
2696         --print_msg('Number Of Lines fetched into plsql tabls['||l_resource_assignment_tab.count||']');
2697         IF l_resource_assignment_tab.COUNT > 0 Then
2698             FOR i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST LOOP
2699                 l_diff_raw_cost_tab(i) := nvl(l_unrounded_txn_raw_cost_tab(i),0) - nvl(l_rounded_txn_raw_cost_tab(i),0);
2700                 l_diff_burden_cost_tab(i) := nvl(l_unround_txn_burden_cost_tab(i),0) - nvl(l_rounded_txn_burden_cost_tab(i),0);
2701                 l_diff_revenue_tab(i)  := nvl(l_unrounded_txn_revenue_tab(i),0) - nvl(l_rounded_txn_revenue_tab(i),0);
2702                 l_diff_raw_cost_tab(i) := pa_currency.round_trans_currency_amt1(l_diff_raw_cost_tab(i),l_txn_currency_code_tab(i));
2703                 l_diff_burden_cost_tab(i) := pa_currency.round_trans_currency_amt1(l_diff_burden_cost_tab(i),l_txn_currency_code_tab(i));
2704                 l_diff_revenue_tab(i)  := pa_currency.round_trans_currency_amt1(l_diff_revenue_tab(i),l_txn_currency_code_tab(i));
2705             END LOOP;
2706 
2707             l_null_revenue_amts_flag := 'N';
2708             IF (p_calling_module IN ('BUDGET_GENERATION','FORECAST_GENERATION') AND p_budget_version_type = 'ALL'
2709                 --Bug 6722414. When called from ETC client extension, Dont null out revenue amounts.
2710             AND NVL(g_from_etc_client_extn_flag,'N')='N') THEN
2711                 l_revenue_generation_method := NVL(PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(p_project_id),'W');
2712                         IF NVL(l_revenue_generation_method,'W') in ('C','E') Then
2713                     l_null_revenue_amts_flag := 'Y';
2714                 End IF;
2715             END IF;
2716             g_stage := 'Update_rounding_diff:102';
2717             --print_msg('Updating rollup tmp last line with the rounding difference amount');
2718             FORALL i IN l_resource_assignment_tab.FIRST .. l_resource_assignment_tab.LAST
2719             UPDATE /*+ INDEX(TMP PA_FP_ROLLUP_TMP_N1) */ pa_fp_rollup_tmp tmp
2720                         SET tmp.txn_raw_cost = decode(p_budget_version_type,'COST'
2721                                                                 ,DECODE((nvl(tmp.txn_raw_cost,0)+NVL(l_diff_raw_cost_tab(i),0)),0,NULL
2722                                                                         ,(nvl(tmp.txn_raw_cost,0)+NVL(l_diff_raw_cost_tab(i),0)))
2723                                                         ,'ALL',DECODE((nvl(tmp.txn_raw_cost,0)+NVL(l_diff_raw_cost_tab(i),0)),0,NULL
2724                                                                         ,(nvl(tmp.txn_raw_cost,0)+NVL(l_diff_raw_cost_tab(i),0)))
2725                                                         ,'REVENUE',tmp.txn_raw_cost)
2726                         ,tmp.txn_burdened_cost = decode(p_budget_version_type,'COST'
2727                                                                 ,DECODE((nvl(tmp.txn_burdened_cost,0)+NVL(l_diff_burden_cost_tab(i),0)),0,NULL
2728                                                                         ,(nvl(tmp.txn_burdened_cost,0)+NVL(l_diff_burden_cost_tab(i),0)))
2729                                                         ,'ALL',DECODE((nvl(tmp.txn_burdened_cost,0)+NVL(l_diff_burden_cost_tab(i),0)),0,NULL
2730                                                                         ,(nvl(tmp.txn_burdened_cost,0)+NVL(l_diff_burden_cost_tab(i),0)))
2731                                                         ,'REVENUE',tmp.txn_burdened_cost)
2732                         ,tmp.txn_revenue = decode(p_budget_version_type,'COST',tmp.txn_revenue
2733                                                         ,'ALL',DECODE(l_null_revenue_amts_flag,'Y',tmp.txn_revenue
2734                                                                         ,DECODE((nvl(tmp.txn_revenue,0)+NVL(l_diff_revenue_tab(i),0)),0,NULL
2735                                                                           ,(nvl(tmp.txn_revenue,0)+NVL(l_diff_revenue_tab(i),0))))
2736                                                         ,'REVENUE',DECODE((nvl(tmp.txn_revenue,0)+NVL(l_diff_revenue_tab(i),0)),0,NULL
2737                                                                         ,(nvl(tmp.txn_revenue,0)+NVL(l_diff_revenue_tab(i),0))))
2738                         ,tmp.attribute15 = 'RoundingDiscrepancyLine'
2739                         WHERE tmp.resource_assignment_id = l_resource_assignment_tab(i)
2740                         AND   tmp.txn_currency_code = l_txn_currency_code_tab(i)
2741                         AND   tmp.start_date = l_start_date_tab(i)
2742                         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)
2743             ;
2744             /** Bug fix: 4208217 Performance fix:  This is additional condition may not be necessary so commenting out
2745                         -- added this to ensure that only one budget line in rollup tmp gets updated even if there is duplicate lines
2746                         AND   tmp.rowid in (select max(rowid)
2747                                             from pa_fp_rollup_tmp tmp2
2748                                             where tmp2.resource_assignment_id = tmp.resource_assignment_id
2749                                             and tmp2.txn_currency_code = tmp.txn_currency_code
2750                                             and tmp2.start_date = tmp.start_date
2751                                            );
2752             **/
2753             g_stage := 'Update_rounding_diff:103';
2754                         --print_msg('Number of lines updated['||sql%rowcount||']');
2755         END IF;
2756     End If;
2757 
2758     x_return_status := l_return_status;
2759         x_msg_count     := l_msg_count;
2760         x_msg_data  := l_msg_data;
2761     g_stage := 'Update_rounding_diff:104';
2762     -- reset error stack
2763     IF p_pa_debug_mode = 'Y' Then
2764     	print_msg('End of Update_rounding_diff API return Sts['||x_return_status||']');
2765         pa_debug.reset_err_stack;
2766     End If;
2767 
2768 EXCEPTION
2769     WHEN OTHERS THEN
2770                 print_msg('Failed in Update_rounding_diff API ['||sqlcode||sqlerrm);
2771                 x_return_status := 'U';
2772                 x_msg_data := sqlcode||sqlerrm;
2773                 fnd_msg_pub.add_exc_msg
2774                 ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
2775                  ,p_procedure_name => 'Update_rounding_diff' );
2776                 print_msg('Failed in Update_rounding_diff substr(SQLERRM,1,240) => '|| substr(SQLERRM,1,240));
2777         IF p_pa_debug_mode = 'Y' Then
2778             pa_debug.reset_err_stack;
2779         End If;
2780                 RAISE;
2781 END Update_rounding_diff;
2782 
2783 /*
2784 -- PROCEDURE validate_inputs validates all parameters that are passed into
2785 --  calulate API.
2786 --  1.  project_id, budget_version_id, and source_context are required
2787 --  2.  IF p_resource_assignment_tab has a count > 0 THEN
2788 --       txn_currency_code_tab must also have a count > 0 AND
2789 --          txn_currency_code_tab.COUNT must equal p_resource_assignment_tab.COUNT
2790 --  3.  p_resource_assignment_tab and txn_currency_code_tab must not have NULL values if passed
2791 --  4.  If any other parameter is passed they must have an equal count to _resource_assignment_tab
2792 */
2793 PROCEDURE validate_inputs( p_project_id                    IN  pa_projects_all.project_id%TYPE
2794                           ,p_budget_version_id             IN  pa_budget_versions.budget_version_id%TYPE
2795               ,p_calling_module                IN  VARCHAR2 DEFAULT NULL
2796                       ,p_refresh_rates_flag            IN  VARCHAR2 DEFAULT NULL
2797                       ,p_refresh_conv_rates_flag       IN  VARCHAR2 DEFAULT NULL
2798                           ,p_mass_adjust_flag              IN  VARCHAR2
2799               ,p_qty_adjust_pct                IN  NUMBER
2800               ,p_cst_rate_adjust_pct       IN  NUMBER
2801               ,p_bd_rate_adjust_pct        IN  NUMBER
2802               ,p_bill_rate_adjust_pct      IN  NUMBER
2803 		,p_raw_cost_adj_pct              IN  NUMBER
2804                       ,p_burden_cost_adj_pct           IN  NUMBER
2805                       ,p_revenue_adj_pct               IN  NUMBER
2806                           ,p_spread_required_flag          IN  VARCHAR2
2807               ,p_wp_cost_changed_flag          IN  VARCHAR2
2808               ,p_time_phase_changed_flag       IN  VARCHAR2
2809                           ,p_source_context                IN  pa_fp_res_assignments_tmp.source_context%TYPE
2810                           ,p_resource_assignment_tab       IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
2811                           ,p_delete_budget_lines_tab       IN  SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type()
2812                           ,p_spread_amts_flag_tab          IN  SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type()
2813                           ,p_txn_currency_code_tab         IN  SYSTEM.pa_varchar2_15_tbl_type    DEFAULT SYSTEM.pa_varchar2_15_tbl_type()
2814                           ,p_txn_currency_override_tab     IN  SYSTEM.pa_varchar2_15_tbl_type    DEFAULT SYSTEM.pa_varchar2_15_tbl_type()
2815                           ,p_total_qty_tab                 IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
2816                           ,p_addl_qty_tab                  IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
2817                           ,p_total_raw_cost_tab            IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
2818                           ,p_addl_raw_cost_tab             IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
2819                           ,p_total_burdened_cost_tab       IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
2820                           ,p_addl_burdened_cost_tab        IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
2821                           ,p_total_revenue_tab             IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
2822                           ,p_addl_revenue_tab              IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
2823                           ,p_raw_cost_rate_tab             IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
2824                           ,p_rw_cost_rate_override_tab     IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
2825                           ,p_b_cost_rate_tab               IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
2826                           ,p_b_cost_rate_override_tab      IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
2827                           ,p_bill_rate_tab                 IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
2828                           ,p_bill_rate_override_tab        IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
2829                           ,p_line_start_date_tab           IN  SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type()
2830                           ,p_line_end_date_tab             IN  SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type()
2831               /* for enhancement */
2832               ,p_spread_curve_id_old_tab       IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
2833               ,p_spread_curve_id_new_tab       IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
2834               ,p_sp_fixed_date_old_tab         IN  SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type()
2835               ,p_sp_fixed_date_new_tab         IN  SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type()
2836               ,p_plan_start_date_old_tab       IN  SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type()
2837               ,p_plan_start_date_new_tab       IN  SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type()
2838               ,p_plan_end_date_old_tab         IN  SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type()
2839               ,p_plan_end_date_new_tab         IN  SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type()
2840               ,p_re_spread_flag_tab            IN  SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type()
2841               ,p_sp_curve_change_flag_tab      IN  SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type()
2842               ,p_plan_dates_change_flag_tab    IN  SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type()
2843               ,p_spfix_date_flag_tab           IN  SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type()
2844               ,p_mfc_cost_change_flag_tab      IN  SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type()
2845                           ,p_mfc_cost_type_id_old_tab      IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
2846                           ,p_mfc_cost_type_id_new_tab      IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
2847               ,p_rlm_id_change_flag_tab        IN  SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type()
2848           ,p_fp_task_billable_flag_tab     IN  SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type()
2849                           ,x_return_status                 OUT NOCOPY VARCHAR2
2850                           ,x_msg_count                     OUT NOCOPY NUMBER
2851                           ,x_msg_data                      OUT NOCOPY VARCHAR2) IS
2852 
2853 
2854 
2855     l_res_assignment_tab_count NUMBER := 0;
2856     l_debug_mode               VARCHAR2(30);
2857     l_stage                    NUMBER;
2858     l_count                    NUMBER;
2859     l_msg_index_out            NUMBER;
2860     l_return_status            Varchar2(100);
2861     l_error_msg_code           Varchar2(100);
2862     l_act_exists               Varchar2(10) := 'N';
2863 
2864     CURSOR cur_act_exists IS
2865     SELECT 'Y'
2866     FROM dual
2867     WHERE EXISTS (select null
2868             from pa_budget_lines bl
2869             Where bl.budget_version_id = p_budget_version_id
2870             AND   (nvl(bl.init_quantity,0) <> 0
2871                 OR nvl(bl.txn_init_raw_cost,0) <> 0
2872                 OR nvl(bl.txn_init_burdened_cost,0) <> 0
2873                 OR nvl(bl.txn_init_revenue,0) <> 0
2874                   )
2875             );
2876 
2877 BEGIN
2878 
2879         x_return_status := FND_API.G_RET_STS_SUCCESS;
2880         x_msg_count     := NULL;
2881         x_msg_data      := NULL;
2882     l_return_status := 'S';
2883     IF p_pa_debug_mode = 'Y' Then
2884             pa_debug.init_err_stack('PA_FP_CALC_PLAN_PKG.validate_inputs');
2885             pa_debug.g_err_stage := 'Entered PA_FP_CALC_PLAN_PKG.validate_inputs';
2886     End If;
2887     g_stage := 'validate_inputs:100';
2888     /*
2889     --  Check to see if Budget_version_id, project_id, or source_context
2890     --  are null.  If they are NULL error and return.  These parameters
2891     --  are required to calculate
2892     */
2893 
2894         l_stage := 7010;
2895 
2896         IF p_budget_version_id IS NULL THEN
2897         l_error_msg_code := 'PA_FP_CALC_BUDGET_VER_ID_REQ';
2898                 l_return_status := 'E';
2899     End IF ;
2900 
2901         IF l_return_status = 'S' AND p_project_id IS NULL THEN
2902         l_error_msg_code := 'PA_FP_CALC_PROJ_ID_REQ' ;
2903                 l_return_status := 'E';
2904         End IF;
2905 
2906     If l_return_status = 'S' Then
2907         If p_calling_module IN ('BUDGET_GENERATION','FORECAST_GENERATION') Then /* Bug fix: 4251148 : added forecast generation*/
2908            If nvl(p_refresh_rates_flag,'N') NOT IN ('R','C','Y','N') Then
2909             l_error_msg_code := 'PA_FP_INVALID_REFRESH_FLAG';
2910                         l_return_status := 'E';
2911            End If;
2912         Else
2913            If nvl(p_refresh_rates_flag,'N') NOT IN ('Y','N') Then
2914                 l_error_msg_code := 'PA_FP_INVALID_REFRESH_FLAG';
2915                         l_return_status := 'E';
2916                    End If;
2917         End If;
2918     End If;
2919 
2920     If l_return_status = 'S' Then
2921         IF nvl(p_wp_cost_changed_flag,'N') = 'Y' OR NVL(p_time_phase_changed_flag,'N') = 'Y' Then
2922             OPEN cur_act_exists;
2923             FETCH cur_act_exists INTO l_act_exists;
2924             IF cur_act_exists%NOTFOUND then
2925                 l_act_exists := 'N';
2926             End If;
2927             CLOSE cur_act_exists;
2928 
2929             IF NVL(l_act_exists,'N') = 'Y' Then
2930                         l_error_msg_code := 'PA_FP_INVALID_WPTIMEPHASE';
2931                         l_return_status := 'E';
2932             End If;
2933         End If;
2934     End If;
2935 
2936 
2937         IF l_return_status = 'S' AND p_source_context IS NULL THEN
2938             pa_debug.g_err_stage := to_char(l_stage)||': Planning Transaction Calculate'
2939                                 ||' requires Source Context.'
2940                                 ||' Valid Values: RESOURCE_ASSIGNMENT or BUDGET_LINE'
2941                                 ||' -- Returning';
2942             --print_msg('validate_inputs: ' || g_module_name||pa_debug.g_err_stage);
2943         l_error_msg_code := 'PA_FP_CALC_SRC_CONTEXT_REQ';
2944                 l_return_status := 'E';
2945         End IF ;
2946 
2947 /* Bug fix:5726773 : support negative quantity adustment
2948     IF l_return_status = 'S'  AND NVL(p_mass_adjust_flag,'N') = 'Y' THEN
2949         --print_msg('validate_inputs:  validating mass adjust params');
2950                 IF ( p_qty_adjust_pct is not null AND p_qty_adjust_pct < -100 )
2951            OR (p_cst_rate_adjust_pct is not null AND p_cst_rate_adjust_pct < -100 )
2952            OR (p_bd_rate_adjust_pct is not null AND p_bd_rate_adjust_pct < -100 )
2953            OR (p_bill_rate_adjust_pct is not null AND p_bill_rate_adjust_pct < -100 )
2954 	   OR (p_raw_cost_adj_pct is not null AND p_raw_cost_adj_pct < - 100 )
2955            OR (p_burden_cost_adj_pct is not null AND p_burden_cost_adj_pct < -100 )
2956            OR (p_revenue_adj_pct is not null AND p_revenue_adj_pct < - 100 )
2957              THEN
2958 
2959             --print_msg('validate_inputs: Invalid Mass Adjust Params');
2960                     l_error_msg_code := 'PA_FP_INVALID_MADJUST_PARAMS';
2961                     l_return_status := 'E';
2962         End If;
2963     END IF;
2964 **/
2965 
2966     /*
2967     --  Check if p_resource_assignment_tab has values. > 0
2968     --   If p_resource_assignment_tab > 0 then check to make sure the following
2969     --   1.  p_txn_currency_code_tab > 0
2970     --   2.  p_resource_assignment_tab values are NOT NULL
2971     --   3.  p_txn_currency_code_tab values are NOT NULL
2972     --   4.  Any table parameter passed with a count > 0 has the same count as p_resource_assignment_tab
2973     */
2974 
2975 
2976         l_stage := 7060;
2977         l_res_assignment_tab_count := p_resource_assignment_tab.COUNT;
2978         --print_msg(to_char(l_stage)||' Check if p_resource_assignment_tab has a count['||l_res_assignment_tab_count||']');
2979         IF l_return_status = 'S' AND l_res_assignment_tab_count > 0 THEN
2980             IF l_res_assignment_tab_count <> p_txn_currency_code_tab.COUNT THEN
2981                 print_msg('***ERROR*** p_resource_assignment_tab.COUNT <> p_txn_currency_code_tab.COUNT');
2982             l_error_msg_code := 'PA_FP_CALC_RA_CNT_CUR_CNT_NE';
2983                     l_return_status := 'E';
2984             --print_msg('ResTabCt['||l_res_assignment_tab_count||']CurTabCt['||p_txn_currency_code_tab.COUNT||']');
2985         End If;
2986 
2987         END IF;
2988 
2989         l_stage := 7070;
2990     IF l_return_status = 'S' AND p_resource_assignment_tab.COUNT > 0 Then
2991             FOR i IN p_resource_assignment_tab.FIRST..p_resource_assignment_tab.LAST LOOP
2992                 IF p_resource_assignment_tab(i) is NULL THEN
2993                             l_error_msg_code := 'PA_FP_CALC_RA_ID_NULL';
2994                             l_return_status := 'E';
2995                 EXIT;
2996                 ELSIF p_txn_currency_code_tab(i) is NULL THEN
2997                                 l_error_msg_code := 'PA_FP_CALC_CURR_CODE_NULL';
2998                                 l_return_status := 'E';
2999                                 EXIT;
3000             END IF;
3001 
3002             END LOOP;
3003 
3004     END IF;
3005 
3006         l_stage := 7090;
3007         IF l_return_status = 'S' AND p_delete_budget_lines_tab.COUNT > 0 THEN
3008             IF p_delete_budget_lines_tab.COUNT <> l_res_assignment_tab_count THEN
3009                         l_error_msg_code := 'PA_FP_CALC_DEL_CNT';
3010                         l_return_status := 'E';
3011             --print_msg('ResTabCt['||l_res_assignment_tab_count||']DelBdgtLineCt['||p_delete_budget_lines_tab.COUNT||']');
3012         End If;
3013         END IF;
3014 
3015         l_stage := 7100;
3016         IF l_return_status = 'S' AND p_spread_amts_flag_tab.COUNT > 0 THEN
3017             IF p_spread_amts_flag_tab.COUNT <> l_res_assignment_tab_count THEN
3018                         l_error_msg_code := 'PA_FP_CALC_SPR_CNT';
3019                         l_return_status := 'E';
3020             --print_msg('ResTabCt['||l_res_assignment_tab_count||']SprdAmtTabCt['||p_spread_amts_flag_tab.COUNT||']');
3021                 End If;
3022     End IF;
3023 
3024         l_stage := 7110;
3025         IF l_return_status = 'S' AND p_txn_currency_override_tab.COUNT > 0 THEN
3026             IF p_txn_currency_override_tab.COUNT <> l_res_assignment_tab_count THEN
3027                         l_error_msg_code := 'PA_FP_CALC_CUR_OVR_CNT';
3028                         l_return_status := 'E';
3029                 End If;
3030         End IF;
3031 
3032         l_stage := 7120;
3033         IF l_return_status = 'S' AND p_total_qty_tab.COUNT > 0 THEN
3034             IF p_total_qty_tab.COUNT <> l_res_assignment_tab_count THEN
3035                         l_error_msg_code := 'PA_FP_CALC_QTY_CNT' ;
3036                         l_return_status := 'E';
3037                 End If;
3038         End IF;
3039 
3040         l_stage := 7130;
3041         IF l_return_status = 'S' AND p_addl_qty_tab.COUNT > 0 THEN
3042             IF p_addl_qty_tab.COUNT <> l_res_assignment_tab_count THEN
3043                         l_error_msg_code := 'PA_FP_CALC_ADL_QTY_CNT';
3044                         l_return_status := 'E';
3045                 End If;
3046         End IF;
3047 
3048         l_stage := 7140;
3049         IF l_return_status = 'S' AND p_total_raw_cost_tab.COUNT > 0 THEN
3050             IF p_total_raw_cost_tab.COUNT <> l_res_assignment_tab_count THEN
3051                         l_error_msg_code := 'PA_FP_CALC_RW_CST_CNT';
3052                         l_return_status := 'E';
3053                 End If;
3054         End IF;
3055 
3056         l_stage := 7150;
3057         IF l_return_status = 'S' AND p_addl_raw_cost_tab.COUNT > 0 THEN
3058             IF p_addl_raw_cost_tab.COUNT <> l_res_assignment_tab_count THEN
3059                         l_error_msg_code := 'PA_FP_CALC_ADL_RW_CST_CNT';
3060                         l_return_status := 'E';
3061                 End If;
3062     End If;
3063 
3064         l_stage := 7160;
3065         IF l_return_status = 'S' AND  p_total_burdened_cost_tab.COUNT > 0 THEN
3066             IF p_total_burdened_cost_tab.COUNT <> l_res_assignment_tab_count THEN
3067             l_error_msg_code := 'PA_FP_CALC_BD_CST_CNT';
3068                         l_return_status := 'E';
3069                 End If;
3070         End If;
3071 
3072         l_stage := 7170;
3073         IF l_return_status = 'S' AND p_addl_burdened_cost_tab.COUNT > 0 THEN
3074             IF p_addl_burdened_cost_tab.COUNT <> l_res_assignment_tab_count THEN
3075                         l_error_msg_code := 'PA_FP_CALC_ADL_BD_CST_CNT';
3076                         l_return_status := 'E';
3077                 End If;
3078         End If;
3079 
3080         l_stage := 7180;
3081         IF l_return_status = 'S' AND p_total_revenue_tab.COUNT > 0 THEN
3082             IF p_total_revenue_tab.COUNT <> l_res_assignment_tab_count THEN
3083                         l_error_msg_code := 'PA_FP_CALC_REV_CNT';
3084                         l_return_status := 'E';
3085                 End If;
3086         End If;
3087 
3088 
3089         l_stage := 7190;
3090         IF l_return_status = 'S' AND  p_addl_revenue_tab.COUNT > 0 THEN
3091             IF p_addl_revenue_tab.COUNT <> l_res_assignment_tab_count THEN
3092                         l_error_msg_code := 'PA_FP_CALC_ADL_REV_CNT';
3093                         l_return_status := 'E';
3094                 End If;
3095         End If;
3096 
3097         l_stage := 7200;
3098         IF l_return_status = 'S' AND  p_raw_cost_rate_tab.COUNT > 0 THEN
3099             IF p_raw_cost_rate_tab.COUNT <> l_res_assignment_tab_count THEN
3100                         l_error_msg_code := 'PA_FP_CALC_RW_RATE_CNT';
3101                         l_return_status := 'E';
3102                 End If;
3103         End If;
3104 
3105         l_stage := 7210;
3106         IF l_return_status = 'S' AND p_rw_cost_rate_override_tab.COUNT > 0 THEN
3107             IF p_rw_cost_rate_override_tab.COUNT <> l_res_assignment_tab_count THEN
3108                         l_error_msg_code := 'PA_FP_CALC_RW_RATE_OVR_CNT';
3109                         l_return_status := 'E';
3110                 End If;
3111         End If;
3112 
3113         l_stage := 7220;
3114         IF l_return_status = 'S' AND p_b_cost_rate_tab.COUNT > 0 THEN
3115             IF p_b_cost_rate_tab.COUNT <> l_res_assignment_tab_count THEN
3116                         l_error_msg_code := 'PA_FP_CALC_BD_MULT_CNT';
3117                         l_return_status := 'E';
3118                 End If;
3119         End If;
3120 
3121         l_stage := 7230;
3122         IF l_return_status = 'S' AND p_b_cost_rate_override_tab.COUNT > 0 THEN
3123             IF p_b_cost_rate_override_tab.COUNT <> l_res_assignment_tab_count THEN
3124                         l_error_msg_code :=  'PA_FP_CALC_BD_MULT_OVR_CNT';
3125                         l_return_status := 'E';
3126                 End If;
3127         End If;
3128 
3129         l_stage := 7240;
3130         IF l_return_status = 'S' AND p_bill_rate_tab.COUNT > 0 THEN
3131             IF p_bill_rate_tab.COUNT <> l_res_assignment_tab_count THEN
3132                         l_error_msg_code :=  'PA_FP_CALC_BILL_RATE_CNT';
3133                         l_return_status := 'E';
3134                 End If;
3135         End If;
3136 
3137         l_stage := 7250;
3138         IF l_return_status = 'S' AND p_bill_rate_override_tab.COUNT > 0 THEN
3139             IF p_bill_rate_override_tab.COUNT <> l_res_assignment_tab_count THEN
3140                         l_error_msg_code :=  'PA_FP_CALC_BILL_RATE_OVR_CNT';
3141                         l_return_status := 'E';
3142                 End If;
3143         End If;
3144 
3145         l_stage := 7260;
3146         IF l_return_status = 'S' AND p_line_start_date_tab.COUNT > 0 THEN
3147             IF p_line_start_date_tab.COUNT <> l_res_assignment_tab_count THEN
3148                         l_error_msg_code :=   'PA_FP_CALC_START_DT_CNT';
3149                         l_return_status := 'E';
3150                 End If;
3151         End If;
3152 
3153         l_stage := 7270;
3154         IF l_return_status = 'S' AND p_line_end_date_tab.COUNT > 0 THEN
3155             IF p_line_end_date_tab.COUNT <> l_res_assignment_tab_count THEN
3156                         l_error_msg_code :=  'PA_FP_CALC_END_DT_CNT';
3157                         l_return_status := 'E';
3158                 End If;
3159         End If;
3160 
3161         l_stage := 7280;
3162     /*--------- p_mass_adjust_flag check ----------*/
3163         IF l_return_status = 'S' AND  p_mass_adjust_flag = 'Y' THEN
3164             IF p_resource_assignment_tab.COUNT = 0 THEN
3165             l_error_msg_code :=  'PA_FP_MA_RA_ID_REQ';
3166                         l_return_status := 'E';
3167         Elsif p_txn_currency_code_tab.COUNT = 0 THEN
3168             l_error_msg_code :=  'PA_FP_MA_CURR_REQ';
3169                         l_return_status := 'E';
3170                 End If;
3171         End If;
3172 
3173     If l_return_status = 'S' AND p_spread_curve_id_old_tab.count > 0 Then
3174         If p_resource_assignment_tab.COUNT <> p_spread_curve_id_old_tab.count Then
3175             l_error_msg_code :=  'PA_FP_SPCURVE_ID_CNT';
3176                         l_return_status := 'E';
3177         End If;
3178     End If;
3179 
3180         If l_return_status = 'S' AND p_spread_curve_id_new_tab.count > 0 Then
3181                 If p_resource_assignment_tab.COUNT <> p_spread_curve_id_new_tab.count Then
3182                         l_error_msg_code :=  'PA_FP_SPCURVE_ID_CNT';
3183                         l_return_status := 'E';
3184                 End If;
3185         End If;
3186 
3187         If l_return_status = 'S' AND p_sp_fixed_date_old_tab.count > 0 Then
3188                 If p_resource_assignment_tab.COUNT <> p_sp_fixed_date_old_tab.count Then
3189                         l_error_msg_code :=  'PA_FP_SPFIXED_DATE_CNT';
3190                         l_return_status := 'E';
3191                 End If;
3192         End If;
3193         If l_return_status = 'S' AND p_sp_fixed_date_new_tab.count > 0 Then
3194                 If p_resource_assignment_tab.COUNT <> p_sp_fixed_date_new_tab.count Then
3195                         l_error_msg_code :=  'PA_FP_SPFIXED_DATE_CNT';
3196                         l_return_status := 'E';
3197                 End If;
3198         End If;
3199         If l_return_status = 'S' AND p_plan_start_date_old_tab.count > 0 Then
3200                 If p_resource_assignment_tab.COUNT <> p_plan_start_date_old_tab.count Then
3201                         l_error_msg_code :=  'PA_FP_PLAN_DATE_CNT';
3202                         l_return_status := 'E';
3203                 End If;
3204         End If;
3205         If l_return_status = 'S' AND p_plan_start_date_new_tab.count > 0 Then
3206                 If p_resource_assignment_tab.COUNT <> p_plan_start_date_new_tab.count Then
3207                         l_error_msg_code :=  'PA_FP_PLAN_DATE_CNT';
3208                         l_return_status := 'E';
3209                 End If;
3210         End If;
3211         If l_return_status = 'S' AND p_plan_end_date_old_tab.count > 0 Then
3212                 If p_resource_assignment_tab.COUNT <> p_plan_end_date_old_tab.count Then
3213                         l_error_msg_code :=  'PA_FP_PLAN_DATE_CNT';
3214                         l_return_status := 'E';
3215                 End If;
3216         End If;
3217         If l_return_status = 'S' AND p_plan_end_date_new_tab.count > 0 Then
3218                 If p_resource_assignment_tab.COUNT <> p_plan_end_date_new_tab.count Then
3219                         l_error_msg_code :=  'PA_FP_PLAN_DATE_CNT';
3220                         l_return_status := 'E';
3221                 End If;
3222         End If;
3223 
3224         If l_return_status = 'S' AND p_re_spread_flag_tab.count > 0 Then
3225                 If p_resource_assignment_tab.COUNT <> p_re_spread_flag_tab.count Then
3226                         l_error_msg_code :=  'PA_FP_RESPREAD_FLAG_CNT';
3227                         l_return_status := 'E';
3228                 End If;
3229         End If;
3230 
3231         If l_return_status = 'S' AND p_sp_curve_change_flag_tab.count > 0 Then
3232                 If p_resource_assignment_tab.COUNT <> p_sp_curve_change_flag_tab.count Then
3233                         l_error_msg_code :=  'PA_FP_SPCURVE_FLAG_CNT';
3234                         l_return_status := 'E';
3235                 End If;
3236         End If;
3237         If l_return_status = 'S' AND p_plan_dates_change_flag_tab.count > 0 Then
3238                 If p_resource_assignment_tab.COUNT <> p_plan_dates_change_flag_tab.count Then
3239                         l_error_msg_code :=  'PA_FP_PLANDATES_FLAG_CNT';
3240                         l_return_status := 'E';
3241                 End If;
3242         End If;
3243         If l_return_status = 'S' AND p_spfix_date_flag_tab.count > 0 Then
3244                 If p_resource_assignment_tab.COUNT <> p_spfix_date_flag_tab.count Then
3245                         l_error_msg_code :=  'PA_FP_FIXDATES_FLAG_CNT';
3246                         l_return_status := 'E';
3247                 End If;
3248         End If;
3249     If l_return_status = 'S' AND p_mfc_cost_change_flag_tab.count > 0 Then
3250                 If p_resource_assignment_tab.COUNT <> p_mfc_cost_change_flag_tab.count Then
3251                         l_error_msg_code :=  'PA_FP_MFCFLAG_FLAG_CNT';
3252                         l_return_status := 'E';
3253                 End If;
3254         End If;
3255     If l_return_status = 'S' AND p_mfc_cost_type_id_old_tab.count > 0 Then
3256                 If p_resource_assignment_tab.COUNT <> p_mfc_cost_type_id_old_tab.count Then
3257                         l_error_msg_code :=  'PA_FP_MFCOSTTYPE_CNT';
3258                         l_return_status := 'E';
3259                 End If;
3260         End If;
3261     If l_return_status = 'S' AND p_mfc_cost_type_id_new_tab.count > 0 Then
3262                 If p_resource_assignment_tab.COUNT <> p_mfc_cost_type_id_new_tab.count Then
3263                         l_error_msg_code :=  'PA_FP_MFCOSTTYPE_CNT';
3264                         l_return_status := 'E';
3265                 End If;
3266         End If;
3267     If l_return_status = 'S' AND p_rlm_id_change_flag_tab.count > 0 Then
3268                 If p_resource_assignment_tab.COUNT <> p_rlm_id_change_flag_tab.count Then
3269                         l_error_msg_code :=  'PA_FP_MFCFLAG_FLAG_CNT';
3270                         l_return_status := 'E';
3271                 End If;
3272         End If;
3273 
3274     If l_return_status = 'S' and p_fp_task_billable_flag_tab.count > 0 Then
3275         If p_resource_assignment_tab.COUNT <> p_fp_task_billable_flag_tab.count Then
3276             l_error_msg_code :=  'PA_FP_BILLABLE_FLAG_CNT';
3277                         l_return_status := 'E';
3278                 End If;
3279     End If;
3280 
3281      g_stage := 'validate_inputs:101';
3282     IF l_return_status <> 'S' AND l_error_msg_code is NOT NULL Then
3283               ADD_MSGTO_STACK
3284               (p_msg_name       => l_error_msg_code
3285               ,p_token1         => 'P_BUDGET_VERSION_ID'
3286               ,p_value1         => p_budget_version_id
3287               ,p_token2         => 'P_PROJECT_ID'
3288               ,p_value2         => p_project_id
3289               );
3290     END IF;
3291     x_return_status := l_return_status;
3292     IF p_pa_debug_mode = 'Y' Then
3293     	print_msg('Leaving validate_inputs x_return_status : '||x_return_status);
3294         pa_debug.reset_err_stack;
3295     End If;
3296 
3297 EXCEPTION
3298     WHEN OTHERS THEN
3299             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3300         x_msg_count := 1;
3301         x_msg_data := SQLCODE||SQLERRM;
3302             fnd_msg_pub.add_exc_msg
3303             ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
3304                  ,p_procedure_name => 'validate_inputs' );
3305             print_msg(to_char(l_stage)||' substr(SQLERRM,1,240) => '|| substr(SQLERRM,1,240));
3306         IF p_pa_debug_mode = 'Y' Then
3307                 pa_debug.reset_err_stack;
3308         End If;
3309             RAISE;
3310 
3311 END validate_inputs;
3312 
3313 /* This API will reset the planning end to ETC start date if both planning start and end dates are
3314  * prior to ETC start date
3315  */
3316 PROCEDURE Reset_Planning_end_date
3317         (p_calling_module     IN Varchar2
3318         ,p_budget_version_id      IN Number
3319         ,p_etc_start_date         IN Date
3320                 --,p_res_ass_id             IN Number
3321                 ,p_source_context         IN Varchar2
3322         ,x_return_status          OUT NOCOPY Varchar2
3323                 ,x_msg_data               OUT NOCOPY Varchar2
3324         ) IS
3325 
3326     l_planning_start_date  Date;
3327         l_planning_end_date    Date;
3328         l_etc_start_date       Date;
3329     l_stage                Number;
3330 
3331     CURSOR cur_EvenSpCur IS
3332     SELECT sp.spread_curve_id
3333     FROM pa_spread_curves_b sp
3334     WHERE sp.spread_curve_code = 'EVEN'
3335     AND  rownum = 1;
3336     l_evenSpCurveId  NUMBER;
3337 BEGIN
3338     x_return_status := 'S';
3339     x_msg_data      := NULL;
3340     l_stage         := 1.1;
3341 
3342         IF p_etc_start_date is NOT NULL Then
3343         /* Bug fix: 3846468 when progress date is later than the spread curve fixed, the spread curve and sp fixed date
3344             * should be made as null.  Else the spread will fail OR put the entire etc in the sp_fixed_date which is prior to
3345             * to etc start date
3346             */
3347         l_evenSpCurveId := NULL;
3348         OPEN cur_EvenSpCur;
3349         FETCH cur_EvenSpCur INTO l_evenSpCurveId;
3350         CLOSE cur_EvenSpCur;
3351 
3352         g_stage :='Reset_Planning_end_date:100';
3353                 UPDATE PA_RESOURCE_ASSIGNMENTS ra
3354                 SET     ra.spread_curve_id = DECODE(ra.spread_curve_id,6
3355                             ,decode(sign(nvl(ra.sp_fixed_date,p_etc_start_date) - p_etc_start_date),-1,l_evenSpCurveId,ra.spread_curve_id)
3356                              ,ra.spread_curve_id)
3357                         ,ra.sp_fixed_date = DECODE(sign(nvl(ra.sp_fixed_date,p_etc_start_date) - p_etc_start_date),-1,NULL,ra.sp_fixed_date)
3358             /*Bug fix:4122400--,ra.planning_end_date = DECODE(sign(ra.planning_end_date-p_etc_start_date),-1,p_etc_start_date,ra.planning_end_date) */
3359             ,ra.planning_end_date = DECODE(ra.spread_curve_id,6
3360                                                  ,decode(sign(nvl(ra.sp_fixed_date,p_etc_start_date) - p_etc_start_date),-1,p_etc_start_date,ra.planning_end_date)
3361                                                   ,decode(sign(ra.planning_end_date-p_etc_start_date),-1,p_etc_start_date,ra.planning_end_date))
3362                 WHERE ra.budget_version_id = p_budget_version_id
3363         AND  EXISTS (SELECT null
3364                  FROM pa_fp_spread_calc_tmp tmp
3365                  WHERE tmp.budget_version_id = ra.budget_version_id
3366                  AND   tmp.resource_assignment_id = ra.resource_assignment_id);
3367         print_msg('Reset Ra sp curve, spfixeddate, and planEnddate: NumofRowsUpd['||sql%rowcount||']');
3368 
3369         IF NVL(g_time_phased_code,'N') NOT IN ('G','P') THEN
3370            /* For Non-Time phase budgets, Update the budget lines with planning start and planning end dates */
3371            g_stage :='Reset_Planning_end_date:101';
3372            -- bug 8512066 skkoppul : updating the start date as well coz budget line dates
3373            -- should match the resource assignements dates in a non time phase context
3374            UPDATE pa_budget_lines bl
3375            SET ( bl.start_date, bl.end_date ) = (select ra.planning_start_date, ra.planning_end_date
3376                    From pa_resource_assignments ra
3377                    Where ra.resource_assignment_id = bl.resource_assignment_id)
3378            WHERE bl.budget_version_id = p_budget_version_id
3379            AND EXISTS ( SELECT 'Y'
3380                  FROM pa_resource_assignments pra
3381                 ,pa_fp_spread_calc_tmp tmp
3382                  WHERE pra.resource_assignment_id = bl.resource_assignment_id
3383                  AND   pra.budget_version_id = bl.budget_version_id
3384                  AND   tmp.budget_version_id = pra.budget_version_id
3385                  AND   tmp.resource_assignment_id = pra.resource_assignment_id
3386               );
3387            --print_msg('Num Of BdgtLine rows updated with PlEnd date for Non-TimePhase budget['||sql%rowcount||']');
3388         END IF;
3389 
3390         End If;
3391     Return;
3392 
3393 EXCEPTION
3394     WHEN OTHERS THEN
3395                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3396                 x_msg_data := SQLCODE||SQLERRM;
3397         print_msg('Errored in Reset_Planning_end_date API ['||x_msg_data||']');
3398                 fnd_msg_pub.add_exc_msg
3399                 ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
3400                  ,p_procedure_name => 'Reset_Planning_end_date');
3401                 print_msg(to_char(l_stage)||' substr(SQLERRM,1,240) => '|| substr(SQLERRM,1,240));
3402                 RAISE;
3403 END Reset_Planning_end_date;
3404 
3405 /* This api bulk updates the resource assignments table for the fixed date spread curve which are having
3406  * more than one budget line
3407  */
3408 PROCEDURE PreProcess_BlkProgress_lines
3409     (p_budget_version_id      IN Number
3410     ,p_etc_start_date         IN Date
3411     ,p_apply_progress_flag    IN Varchar2
3412     ,x_return_status          OUT NOCOPY Varchar2
3413         ,x_msg_data               OUT NOCOPY Varchar2
3414         ) IS
3415 
3416         CURSOR cur_spbl_chk IS
3417         SELECT tmp.resource_assignment_id
3418         FROM pa_fp_spread_calc_tmp tmp
3419              ,pa_resource_assignments ra
3420         WHERE tmp.budget_version_id = p_budget_version_id
3421         AND  tmp.resource_assignment_id = ra.resource_assignment_id
3422     AND  NVL(tmp.sp_curve_change_flag,'N') = 'N'
3423         /* Bug fix: AND  ra.sp_fixed_date is NOT NULL this is commented as in some ofthe flows,
3424      * the sp fixed date is null but spread curve is 6 */
3425         AND  ra.spread_curve_id = 6
3426         AND  EXISTS ( select null
3427                         from pa_budget_lines bl
3428                         where bl.budget_version_id = p_budget_version_id
3429                         and   bl.resource_assignment_id = ra.resource_assignment_id
3430                         and   bl.txn_currency_code = tmp.txn_currency_code
3431                         group by bl.resource_assignment_id
3432                                 ,bl.txn_currency_code
3433                         having count(*) > 1
3434                         );
3435 
3436         l_raId_tab      pa_plsql_datatypes.NumTabTyp;
3437     l_return_status varchar2(10) := 'S';
3438         l_msg_count     Number;
3439         l_msg_data      Varchar2(1000);
3440 
3441     CURSOR cur_EvenSpCur IS
3442         SELECT sp.spread_curve_id
3443         FROM pa_spread_curves_b sp
3444         WHERE sp.spread_curve_code = 'EVEN'
3445         AND  rownum = 1;
3446         l_evenSpCurveId  NUMBER;
3447 
3448     /* This cursor picks the budget lines for the open periods where plan quantity is Less than actuals
3449          * this should not happen. Ideally when the actuals were collected for the resource if plan < actual
3450      * then plan should be made equal to actual and etc should be zero
3451      */
3452     CURSOR cur_NegEtcLines IS
3453         SELECT /*+ NO_UNNEST INDEX (BL,PA_BUDGET_LINES_U1) */ bl.budget_line_id -- bug 4873834
3454               ,bl.resource_assignment_id
3455               ,bl.txn_currency_code
3456               ,bl.start_date
3457               ,bl.end_date
3458               ,bl.period_name
3459               ,bl.quantity
3460               ,bl.txn_raw_cost
3461               ,bl.txn_burdened_cost
3462               ,bl.txn_revenue
3463               ,bl.project_raw_cost
3464               ,bl.project_burdened_cost
3465               ,bl.project_revenue
3466               ,bl.raw_cost      projfunc_raw_cost
3467               ,bl.burdened_cost projfunc_burdened_cost
3468               ,bl.revenue       projfunc_revenue
3469               ,bl.project_currency_code
3470               ,bl.projfunc_currency_code
3471               ,bl.cost_rejection_code
3472               ,bl.revenue_rejection_code
3473               ,bl.burden_rejection_code
3474               ,bl.pfc_cur_conv_rejection_code
3475               ,bl.pc_cur_conv_rejection_code
3476               ,bl.init_quantity
3477               ,bl.txn_init_raw_cost
3478               ,bl.txn_init_burdened_cost
3479               ,bl.txn_init_revenue
3480               ,bl.project_init_raw_cost
3481               ,bl.project_init_burdened_cost
3482               ,bl.project_init_revenue
3483               ,bl.init_raw_cost
3484               ,bl.init_burdened_cost
3485               ,bl.init_revenue
3486         FROM pa_budget_lines bl
3487          ,pa_fp_spread_calc_tmp tmp
3488         WHERE tmp.budget_version_id = p_budget_version_id
3489     AND   bl.budget_version_id = tmp.budget_version_id
3490     AND   bl.resource_assignment_id = tmp.resource_assignment_id
3491         AND   bl.txn_currency_code      = tmp.txn_currency_code
3492         AND g_spread_from_date is NOT NULL
3493         AND ((bl.start_date >= g_spread_from_date )
3494              OR (g_spread_from_date BETWEEN bl.start_date AND bl.end_date)
3495             )
3496     AND (NVL(bl.quantity,0) - NVL(bl.init_quantity,0)) < 0  --corrupted data
3497         AND ( NVL(bl.init_quantity,0) <> 0 OR
3498                  NVL(bl.txn_init_raw_cost ,0) <> 0 OR
3499                  NVL(bl.txn_init_burdened_cost ,0) <> 0 OR
3500                  NVL(bl.txn_init_revenue ,0) <> 0
3501            );
3502 
3503 
3504 BEGIN
3505         l_return_status := 'S';
3506         x_return_status := 'S';
3507 	If P_PA_DEBUG_MODE = 'Y' Then
3508         print_msg('Entered PreProcess_BlkProgress_lines api ()');
3509 	End If;
3510         IF p_etc_start_date is NOT NULL Then
3511                 g_stage :='PreProcess_BlkProgress_lines:100';
3512                 /*check and clear spread details on RA when there are multiple budget lines
3513                 * exists for spread curve fixed date. Ideally, for spread fixed date thers should be only one budget line
3514                 * but when actuals come in it may be in different period and budget line will be created where the
3515                 * as of date.
3516                 */
3517                 l_raId_tab.delete;
3518                 OPEN cur_spbl_chk;
3519                 FETCH cur_spbl_chk BULK COLLECT INTO
3520                         l_raId_tab;
3521                 CLOSE cur_spbl_chk;
3522 
3523                 IF l_raId_tab.COUNT > 0 Then
3524             l_evenSpCurveId := NULL;
3525                     OPEN cur_EvenSpCur;
3526                     FETCH cur_EvenSpCur INTO l_evenSpCurveId;
3527                     CLOSE cur_EvenSpCur;
3528 
3529                         --print_msg('More than one budget Line exists for Spread Curve Fixed Date');
3530                         FORALL i IN l_raId_tab.FIRST .. l_raId_tab.LAST
3531                         /* update the RA and set sp_fixed_date to null so that spread api will spread the amts evenly */
3532                         UPDATE PA_RESOURCE_ASSIGNMENTS ra
3533                         SET    ra.spread_curve_id = l_evenSpCurveId
3534                                 ,ra.sp_fixed_date = NULL
3535                                 /* bug fix:4122400 for fixed date spread curve, change the plan end date as ETC start date */
3536                                 /* Bug fix: 4247427 ,ra.planning_end_date = p_etc_start_date
3537                  * ETc start date can be before plannig end date, then donot change the end date */
3538                 ,ra.planning_end_date = decode(sign(ra.planning_end_date-p_etc_start_date),-1,p_etc_start_date,ra.planning_end_date)
3539                         WHERE ra.resource_assignment_id = l_raId_tab(i);
3540 
3541                 End If;
3542 
3543 
3544         If ( nvl(g_wp_version_flag,'N') = 'Y'
3545              --NVL(p_apply_progress_flag,'N') = 'Y'
3546            )  Then
3547                FOR i IN cur_NegEtcLines LOOP
3548                     --print_msg('Corrupted BudgetLines(-ve ETCs) Exists for Open period: RAID['||i.resource_assignment_id||']');
3549                         add_msgto_stack
3550                         ( p_msg_name       => 'PA_NEGETC_EXISTS_OPEN_PERIOD'
3551                         ,p_token1         => 'PROJECT'
3552                         ,p_value1         => g_project_name
3553                         ,p_token2         => 'RESOURCE_ASSIGNMENT'
3554                         ,p_value2         => i.resource_assignment_id
3555                         ,p_token3         => 'TXN_CURRENCY_CODE'
3556                         ,p_value3         => i.txn_currency_code
3557                         ,p_token4         => 'START_DATE'
3558                         ,p_value4         => i.start_date);
3559                         x_return_status := 'E';
3560                END LOOP;
3561             End If;
3562     End If;
3563         g_stage := 'PreProcess_BlkProgress_lines:101';
3564         x_return_status := l_return_status;
3565 	If P_PA_DEBUG_MODE = 'Y' Then
3566         print_msg('Leaving PreProcess_BlkProgress_lines api() retSts['||x_return_status||']');
3567 	End If;
3568 EXCEPTION
3569         WHEN OTHERS THEN
3570                 x_return_status := 'U';
3571                 print_msg('Exception occured in PreProcess_BlkProgress_lines ['||sqlcode||sqlerrm);
3572                 RAISE;
3573 
3574 END PreProcess_BlkProgress_lines;
3575 
3576 /* This API pre process the budget lines when calculate api is called in Apply progress mode */
3577 PROCEDURE Pre_process_progress_lines
3578               (p_budget_version_id  IN Number
3579           ,p_res_ass_id         IN Number
3580               ,p_txn_currency_code  IN Varchar2
3581               ,p_line_start_date    IN Date
3582               ,p_line_end_date      IN Date
3583           ,p_etc_start_date         IN Date
3584           ,p_source_context         IN Varchar2
3585               ,p_actuals_exists_flag    IN Varchar2
3586           ,x_apply_progress_flag    IN OUT NOCOPY Varchar2
3587           ,x_spread_amount_flag     IN OUT NOCOPY Varchar2
3588               ,x_return_status      OUT NOCOPY Varchar2
3589           ,x_msg_data               OUT NOCOPY Varchar2
3590               ) IS
3591 
3592     l_return_status varchar2(10) := 'S';
3593     l_exists_flag   varchar2(10);
3594     l_msg_count     Number;
3595     l_msg_data      Varchar2(1000);
3596     l_num_rowsdeleted Number;
3597     l_spread_amounts_flag  Varchar2(10);
3598     l_app_prg_flag   Varchar2(10);
3599     INVALID_EXCPETION    EXCEPTION;
3600 
3601 
3602     CURSOR cur_sp_bl_chk IS
3603     SELECT 'Y'
3604     FROM DUAL
3605     WHERE EXISTS (select null
3606             from pa_budget_lines bl
3607                  ,pa_resource_assignments ra
3608             where ra.resource_assignment_id = p_res_ass_id
3609             and   bl.resource_assignment_id = ra.resource_assignment_id
3610             and   bl.txn_currency_code = p_txn_currency_code
3611             and   ra.sp_fixed_date is NOT NULL
3612             and   ra.spread_curve_id  = 6
3613             group by bl.resource_assignment_id
3614                                 ,bl.txn_currency_code
3615                         having count(*) > 1
3616             );
3617 
3618     CURSOR cur_EvenSpCur IS
3619         SELECT sp.spread_curve_id
3620         FROM pa_spread_curves_b sp
3621         WHERE sp.spread_curve_code = 'EVEN'
3622         AND  rownum = 1;
3623         l_evenSpCurveId  NUMBER;
3624 
3625 BEGIN
3626     l_return_status := 'S';
3627     x_return_status := 'S';
3628     l_spread_amounts_flag := x_spread_amount_flag;
3629     l_app_prg_flag := x_apply_progress_flag;
3630     If P_PA_DEBUG_MODE = 'Y' Then
3631     print_msg('Entered Pre_process_progress_lines api ()');
3632     End If;
3633 
3634     IF p_etc_start_date is NOT NULL Then
3635         g_stage :='Pre_process_progress_lines:100';
3636         /*check and clear spread details on RA when there are multiple budget lines
3637             * exists for spread curve fixed date. Ideally, for spread fixed date thers should be only one budget line
3638             * but when actuals come in it may be in different period and budget line will be created where the
3639             * as of date.
3640             */
3641         l_exists_flag := 'N';
3642         OPEN cur_sp_bl_chk;
3643         FETCH cur_sp_bl_chk INTO l_exists_flag;
3644         CLOSE cur_sp_bl_chk;
3645 
3646         IF l_exists_flag = 'Y'  Then
3647             l_evenSpCurveId := NULL;
3648                         OPEN cur_EvenSpCur;
3649                         FETCH cur_EvenSpCur INTO l_evenSpCurveId;
3650                         CLOSE cur_EvenSpCur;
3651             --print_msg('More than one budget Line exists for Spread Curve Fixed Date');
3652             /* update the RA and set sp_fixed_date to null so that spread api will spread the amts evenly */
3653             UPDATE PA_RESOURCE_ASSIGNMENTS ra
3654             SET    ra.spread_curve_id = l_evenSpCurveId
3655                 ,ra.sp_fixed_date = NULL
3656                 /* bug fix:4122400 for fixed date spread curve, change the plan end date as ETC start date */
3657                                 ,ra.planning_end_date = p_etc_start_date
3658             WHERE ra.resource_assignment_id = p_res_ass_id;
3659 
3660         End If;
3661                 /* call delete budget lines to delete all the lines so that spread will respred the ETC qty */
3662                 /* Bug fix: 4142150 When progress is applied, the quantity should be spread based on
3663                  * exisitng line distribution method, so donot delete the budget lines
3664                 delete_budget_lines
3665                 ( p_budget_version_id         => p_budget_version_id
3666                 ,p_resource_assignment_id    => p_res_ass_id
3667                 ,p_txn_currency_code          => p_txn_currency_code
3668                 ,p_line_start_date            => p_line_start_date
3669                 ,p_line_end_date              => p_line_end_date
3670                 ,p_source_context             => p_source_context
3671                 ,x_return_status              => l_return_status
3672                 ,x_msg_count                  => l_msg_count
3673                 ,x_msg_data                   => l_msg_data
3674                 ,x_num_rowsdeleted            => l_num_rowsdeleted
3675                 );
3676                 --print_msg('After Calling delete_budget_lines retSts['||l_return_status||']NumRowsDeleted['||l_num_rowsdeleted||']');
3677                 IF l_return_status <> 'S' Then
3678                         print_msg('Unexpected error from delete_budget_lines');
3679                         x_msg_data := l_msg_data;
3680                         RAISE INVALID_EXCPETION;
3681                 END If;
3682                 --setting this flag to tell spread api to spread amounts creating new budget lines
3683                 l_spread_amounts_flag := 'Y';
3684 
3685                 --* if actuals donot exists then ETC should be spread in a normal way
3686                 --* so set the apply progress flag to N
3687                 --*
3688                 If NVL(p_actuals_exists_flag,'N') <> 'Y' Then
3689                         --print_msg('Resetting the l_apply_progress_flag Flag to N');
3690                         -- if we set the apply progress falg to N the we cannot retain the rate override
3691                         -- apply progress always calls calculate api with qty and cost needs to check with sanjay
3692                         l_app_prg_flag := 'N';
3693                 End If;
3694                 ** end of bug fix:4142150 */
3695     End If;
3696     g_stage := 'Pre_process_progress_lines:101';
3697     x_return_status := l_return_status;
3698     x_spread_amount_flag := l_spread_amounts_flag;
3699     x_apply_progress_flag := l_app_prg_flag;
3700     If P_PA_DEBUG_MODE = 'Y' Then
3701     print_msg('Leaving Pre_process_progress_lines api() retSts['||x_return_status||']SpreadFlag['||x_spread_amount_flag||']x_apply_progress_flag['||x_apply_progress_flag||']');
3702     End If;
3703 EXCEPTION
3704     WHEN INVALID_EXCPETION THEN
3705         x_return_status := l_return_status;
3706                 print_msg('Invalid Exception occured in Pre_process_progress_lines ['||sqlcode||sqlerrm);
3707                 RAISE;
3708     WHEN OTHERS THEN
3709         x_return_status := 'U';
3710         print_msg('Exception occured in Pre_process_progress_lines ['||sqlcode||sqlerrm);
3711         RAISE;
3712 
3713 END Pre_process_progress_lines;
3714 
3715 
3716 /* This API provides the agreement related details
3717  * Bug fix: 3679142 Change order versions which have revenue impact should also be in agreement
3718  * currency. This means all change order versions with version type as ALL or REVENUE
3719  * should ultimately have the planning txns and budget lines in AGR CURRENCY.
3720 */
3721 PROCEDURE Get_Agreement_Details
3722     (p_budget_version_id  IN Number
3723     ,x_agr_curr_code      OUT NOCOPY Varchar2
3724     ,x_return_status      OUT NOCOPY Varchar2 ) IS
3725 
3726     l_agreement_id Number;
3727     l_ci_id       Number;
3728     l_agr_curr_code Varchar2(100);
3729     l_agr_con_reqd_flag varchar2(1) := 'N';
3730     l_version_name   pa_budget_versions.version_name%type;
3731     l_version_type   pa_budget_versions.version_type%type;
3732     l_error_msg_code Varchar2(100);
3733     INVALID_EXCEPTION  EXCEPTION;
3734 BEGIN
3735     IF p_pa_debug_mode = 'Y' Then
3736         pa_debug.init_err_stack('PA_FP_CALC_PLAN_PKG.Get_Agreement_Details');
3737     	print_msg('Entered Get_Agreement_Details Api');
3738     End If;
3739     x_return_status := 'S';
3740 
3741     If p_budget_version_id is NOT NULL Then
3742         --print_msg('Calling PA_FIN_PLAN_UTILS2.Get_Agreement_Details api()');
3743         g_stage :='Get_Agreement_Details:100';
3744         PA_FIN_PLAN_UTILS2.Get_Agreement_Details
3745             (p_budget_version_id  => p_budget_version_id
3746             ,x_agr_curr_code      => x_agr_curr_code
3747         ,x_agr_conv_reqd_flag => l_agr_con_reqd_flag
3748             ,x_return_status      => x_return_status
3749         );
3750         --print_msg('After calling PA_FIN_PLAN_UTILS2.Get_Agreement_Details retSts['||x_return_status||']');
3751         --print_msg('agrCur['||x_agr_curr_code||']Flag['||l_agr_con_reqd_flag||']');
3752     End If;
3753 
3754     /* Set the global varaibles to call conv rates api*/
3755     G_AGR_CONV_REQD_FLAG := NVL(l_agr_con_reqd_flag,'N');
3756     G_AGR_CURRENCY_CODE  := x_agr_curr_code;
3757     --print_msg('Leaving Get_Agreement_Details G_AGR_CONV_REQD_FLAG['||G_AGR_CONV_REQD_FLAG||']G_AGR_CURRENCY_CODE['||G_AGR_CURRENCY_CODE||']');
3758     -- reset error stack
3759     IF p_pa_debug_mode = 'Y' Then
3760             pa_debug.reset_err_stack;
3761     End If;
3762 
3763 EXCEPTION
3764 
3765     WHEN OTHERS THEN
3766                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3767                 fnd_msg_pub.add_exc_msg
3768                 ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
3769                  ,p_procedure_name => 'Get_Agreement_Details' );
3770                 print_msg('Failed in Get_Agreement_Details substr(SQLERRM,1,240) => '|| substr(SQLERRM,1,240));
3771         IF p_pa_debug_mode = 'Y' Then
3772                     pa_debug.reset_err_stack;
3773         End If;
3774         RAISE;
3775 END Get_Agreement_Details;
3776 
3777 /* This API will clear out all the qty,amt,rate columns on
3778  * budget lines where etc amt are NOT zero prior to etc start date
3779  */
3780 PROCEDURE clear_closed_period_etcs
3781         (p_budget_version_id  IN Number
3782         ,p_etc_start_date   IN Date
3783         ,x_return_status    OUT NOCOPY Varchar2 ) IS
3784 
3785     /* clear out all the budget lines prior to ETC start date where actuals donot exists
3786          */
3787     CURSOR cur_bl_closed_period is
3788     SELECT /*+ INDEX(BL PA_BUDGET_LINES_U1) */
3789            bl.budget_line_id
3790           ,bl.resource_assignment_id
3791           ,bl.txn_currency_code
3792           ,bl.start_date
3793           ,bl.end_date
3794           ,bl.period_name
3795           ,bl.quantity
3796           ,bl.txn_raw_cost
3797           ,bl.txn_burdened_cost
3798           ,bl.txn_revenue
3799           ,bl.project_raw_cost
3800           ,bl.project_burdened_cost
3801           ,bl.project_revenue
3802           ,bl.raw_cost  projfunc_raw_cost
3803           ,bl.burdened_cost projfunc_burdened_cost
3804           ,bl.revenue   projfunc_revenue
3805           ,bl.project_currency_code
3806           ,bl.projfunc_currency_code
3807           ,bl.cost_rejection_code
3808               ,bl.revenue_rejection_code
3809               ,bl.burden_rejection_code
3810               ,bl.pfc_cur_conv_rejection_code
3811               ,bl.pc_cur_conv_rejection_code
3812     FROM pa_budget_lines bl
3813         ,pa_fp_spread_calc_tmp tmp
3814     WHERE tmp.budget_version_id = p_budget_version_id
3815     AND  bl.resource_assignment_id = tmp.resource_assignment_id
3816     AND  bl.txn_currency_code = tmp.txn_currency_code
3817     AND  bl.start_date < p_etc_start_date
3818     AND  bl.end_date < p_etc_start_date
3819     AND  ( (NVL(bl.quantity,0) - NVl(bl.init_quantity,0)) <> 0
3820          OR (Nvl(bl.txn_raw_cost,0) - Nvl(bl.txn_init_raw_cost,0)) <> 0
3821          OR (Nvl(bl.txn_burdened_cost,0) - nvl(bl.txn_init_burdened_cost,0)) <> 0
3822          OR (Nvl(bl.txn_revenue,0) - nvl(bl.txn_init_revenue,0)) <> 0
3823          )
3824     AND  (  NVL(bl.init_quantity,0) = 0
3825                 and NVL(bl.txn_init_raw_cost ,0) = 0
3826                 and NVL(bl.txn_init_burdened_cost ,0) = 0
3827                 and NVL(bl.txn_init_revenue ,0) = 0
3828              );
3829 
3830     /* check any of the actual lines got created before the etc start date
3831          * is having etc zero or not. If etc is not zero then throw an error
3832      */
3833     CURSOR cur_bl_corrupted is
3834         SELECT /*+ INDEX(BL PA_BUDGET_LINES_U1) */
3835         bl.budget_line_id
3836               ,bl.resource_assignment_id
3837               ,bl.txn_currency_code
3838               ,bl.start_date
3839           --,rl.alias resource_name
3840           ,bl.end_date
3841               ,bl.period_name
3842               ,bl.quantity
3843               ,bl.txn_raw_cost
3844               ,bl.txn_burdened_cost
3845               ,bl.txn_revenue
3846               ,bl.project_raw_cost
3847               ,bl.project_burdened_cost
3848               ,bl.project_revenue
3849               ,bl.raw_cost      projfunc_raw_cost
3850               ,bl.burdened_cost projfunc_burdened_cost
3851               ,bl.revenue       projfunc_revenue
3852               ,bl.project_currency_code
3853               ,bl.projfunc_currency_code
3854               ,bl.cost_rejection_code
3855               ,bl.revenue_rejection_code
3856               ,bl.burden_rejection_code
3857               ,bl.pfc_cur_conv_rejection_code
3858               ,bl.pc_cur_conv_rejection_code
3859         FROM pa_budget_lines bl
3860         ,pa_fp_spread_calc_tmp tmp
3861         WHERE tmp.budget_version_id = p_budget_version_id
3862         AND  bl.resource_assignment_id = tmp.resource_assignment_id
3863         AND  bl.txn_currency_code = tmp.txn_currency_code
3864         AND  bl.start_date < p_etc_start_date
3865         AND  bl.end_date < p_etc_start_date
3866         AND  ( (NVL(bl.quantity,0) - NVl(bl.init_quantity,0)) <> 0
3867              OR (Nvl(bl.txn_raw_cost,0) - Nvl(bl.txn_init_raw_cost,0)) <> 0
3868              OR (Nvl(bl.txn_burdened_cost,0) - nvl(bl.txn_init_burdened_cost,0)) <> 0
3869              OR (Nvl(bl.txn_revenue,0) - nvl(bl.txn_init_revenue,0)) <> 0
3870              )
3871     AND  (bl.init_quantity is NOT NULL
3872         or bl.txn_init_raw_cost is NOT NULL
3873         or bl.txn_init_burdened_cost is NOT NULL
3874         or bl.txn_init_revenue is NOT NULL
3875          );
3876 
3877     /* This cursor picks up all the corrupted budget lines for non-rate based planning
3878          * transactions where actual qty <> to acutal raw cost. IE. while receiving actuals precedence rules were not
3879          * applied or not maintained
3880          */
3881         CURSOR cur_NonRatebase_corrupted_bls is
3882         SELECT /*+ INDEX(BL PA_BUDGET_LINES_U1) */
3883         bl.budget_line_id
3884               ,bl.resource_assignment_id
3885               ,bl.txn_currency_code
3886               ,bl.start_date
3887               ,null  resource_name  --rl.alias resource_name
3888               ,bl.end_date
3889               ,bl.period_name
3890               ,bl.quantity
3891               ,bl.txn_raw_cost
3892               ,bl.txn_burdened_cost
3893               ,bl.txn_revenue
3894               ,bl.project_raw_cost
3895               ,bl.project_burdened_cost
3896               ,bl.project_revenue
3897               ,bl.raw_cost      projfunc_raw_cost
3898               ,bl.burdened_cost projfunc_burdened_cost
3899               ,bl.revenue       projfunc_revenue
3900               ,bl.project_currency_code
3901               ,bl.projfunc_currency_code
3902               ,bl.cost_rejection_code
3903               ,bl.revenue_rejection_code
3904               ,bl.burden_rejection_code
3905               ,bl.pfc_cur_conv_rejection_code
3906               ,bl.pc_cur_conv_rejection_code
3907         FROM pa_budget_lines bl
3908             ,pa_resource_assignments ra
3909         ,pa_fp_spread_calc_tmp tmp
3910         WHERE tmp.budget_version_id = p_budget_version_id
3911         AND  bl.resource_assignment_id = tmp.resource_assignment_id
3912         AND  bl.txn_currency_code = tmp.txn_currency_code
3913         AND  ra.resource_assignment_id = tmp.resource_assignment_id
3914     AND  NVL(ra.rate_based_flag,'N') = 'N'
3915         AND  bl.start_date < p_etc_start_date
3916         AND  bl.end_date < p_etc_start_date
3917         AND  (bl.init_quantity is NOT NULL
3918                 or bl.txn_init_raw_cost is NOT NULL
3919                 or bl.txn_init_burdened_cost is NOT NULL
3920                 or bl.txn_init_revenue is NOT NULL
3921              )
3922     AND (  (g_fp_budget_version_type = 'REVENUE'
3923         and ( nvl(bl.txn_init_raw_cost,0) <> 0
3924             OR (decode(round(bl.init_quantity,2)
3925                    ,decode(decode(nvl(g_wp_version_flag,'N'),'Y',NVL(G_TRACK_WP_COSTS_FLAG,'N'),'Y'),'N'
3926                ,decode(nvl(bl.txn_init_revenue,0),0,round(bl.init_quantity,2),round(bl.txn_init_revenue,2))
3927                  ,round(bl.txn_init_revenue,2)),'Y','N') <> 'Y'
3928                     ))
3929         )OR
3930          ( g_fp_budget_version_type ='COST'
3931            and ( nvl(bl.txn_init_revenue,0) <> 0
3932             OR (decode(round(bl.init_quantity,2)
3933                 ,decode(decode(nvl(g_wp_version_flag,'N'),'Y',NVL(G_TRACK_WP_COSTS_FLAG,'N'),'Y'),'N'
3934                 ,decode(nvl(bl.txn_init_raw_cost,0),0,round(bl.init_quantity,2),round(bl.txn_init_raw_cost,2))
3935                   ,round(bl.txn_init_raw_cost,2)),'Y','N') <> 'Y' ))
3936         ) OR
3937             ( g_fp_budget_version_type  = 'ALL'
3938            and (decode(round(bl.init_quantity,2)
3939             ,decode(decode(nvl(g_wp_version_flag,'N'),'Y',NVL(G_TRACK_WP_COSTS_FLAG,'N'),'Y'),'N'
3940             ,decode(nvl(bl.txn_init_raw_cost,0),0,round(bl.init_quantity,2),round(bl.txn_init_raw_cost,2))
3941               ,round(bl.txn_init_raw_cost,2)),'Y','N') <> 'Y' )
3942         )
3943           );
3944 
3945     l_budget_Line_id_tab   pa_plsql_datatypes.IdTabTyp;
3946     l_resource_assignment_id_tab pa_plsql_datatypes.IdTabTyp;
3947     l_txn_currency_code_tab      pa_plsql_datatypes.Char50TabTyp;
3948     l_start_date_tab             pa_plsql_datatypes.DateTabTyp;
3949     l_end_date_tab           pa_plsql_datatypes.DateTabTyp;
3950         l_period_name_tab        pa_plsql_datatypes.Char50TabTyp;
3951         l_quantity_tab          pa_plsql_datatypes.NumTabTyp;
3952         l_txn_raw_cost_tab      pa_plsql_datatypes.NumTabTyp;
3953         l_txn_burdened_cost_tab     pa_plsql_datatypes.NumTabTyp;
3954         l_txn_revenue_tab       pa_plsql_datatypes.NumTabTyp;
3955         l_project_raw_cost_tab      pa_plsql_datatypes.NumTabTyp;
3956         l_project_burdened_cost_tab pa_plsql_datatypes.NumTabTyp;
3957         l_project_revenue_tab       pa_plsql_datatypes.NumTabTyp;
3958         l_projfunc_raw_cost_tab     pa_plsql_datatypes.NumTabTyp;
3959         l_projfunc_burdened_cost_tab    pa_plsql_datatypes.NumTabTyp;
3960         l_projfunc_revenue_tab      pa_plsql_datatypes.NumTabTyp;
3961         l_project_curr_code_tab     pa_plsql_datatypes.Char50TabTyp;
3962         l_projfunc_curr_code_tab    pa_plsql_datatypes.Char50TabTyp;
3963     l_cost_rejection_code_tab       pa_plsql_datatypes.Char50TabTyp;
3964         l_revenue_rejection_code_tab    pa_plsql_datatypes.Char50TabTyp;
3965         l_burden_rejection_code_tab     pa_plsql_datatypes.Char50TabTyp;
3966         l_pfc_cur_conv_rej_code_tab pa_plsql_datatypes.Char50TabTyp;
3967         l_pc_cur_conv_rej_code_tab  pa_plsql_datatypes.Char50TabTyp;
3968 
3969 
3970     l_upd_budget_Line_id_tab    pa_plsql_datatypes.IdTabTyp;
3971         l_upd_ra_id_tab         pa_plsql_datatypes.IdTabTyp;
3972         l_upd_txn_curr_code_tab         pa_plsql_datatypes.Char50TabTyp;
3973         l_upd_start_date_tab            pa_plsql_datatypes.DateTabTyp;
3974         l_upd_end_date_tab              pa_plsql_datatypes.DateTabTyp;
3975         l_upd_period_name_tab           pa_plsql_datatypes.Char50TabTyp;
3976         l_upd_quantity_tab              pa_plsql_datatypes.NumTabTyp;
3977         l_upd_txn_raw_cost_tab          pa_plsql_datatypes.NumTabTyp;
3978         l_upd_txn_burden_cost_tab       pa_plsql_datatypes.NumTabTyp;
3979         l_upd_txn_revenue_tab           pa_plsql_datatypes.NumTabTyp;
3980         l_upd_project_raw_cost_tab      pa_plsql_datatypes.NumTabTyp;
3981         l_upd_project_burden_cost_tab   pa_plsql_datatypes.NumTabTyp;
3982         l_upd_project_revenue_tab       pa_plsql_datatypes.NumTabTyp;
3983         l_upd_projfunc_raw_cost_tab     pa_plsql_datatypes.NumTabTyp;
3984         l_upd_projfunc_burden_cost_tab  pa_plsql_datatypes.NumTabTyp;
3985         l_upd_projfunc_revenue_tab      pa_plsql_datatypes.NumTabTyp;
3986         l_upd_project_curr_code_tab     pa_plsql_datatypes.Char50TabTyp;
3987         l_upd_projfunc_curr_code_tab    pa_plsql_datatypes.Char50TabTyp;
3988         l_upd_cost_rejection_tab        pa_plsql_datatypes.Char50TabTyp;
3989         l_upd_revenue_rejection_tab     pa_plsql_datatypes.Char50TabTyp;
3990         l_upd_burden_rejection_tab      pa_plsql_datatypes.Char50TabTyp;
3991         l_upd_pfc_cur_conv_rej_tab      pa_plsql_datatypes.Char50TabTyp;
3992         l_upd_pc_cur_conv_rej_tab       pa_plsql_datatypes.Char50TabTyp;
3993 
3994     l_stage  varchar2(100);
3995         l_return_status varchar2(100);
3996         l_msg_data      varchar2(1000);
3997         l_corrupted_bl_update_rows Number := 0;
3998 
3999 
4000     PROCEDURE initPlsqlTabs IS
4001 
4002     BEGIN
4003 
4004         l_budget_Line_id_tab.delete;
4005         l_resource_assignment_id_tab.delete;
4006         l_txn_currency_code_tab.delete;
4007         l_start_date_tab.delete;
4008         l_end_date_tab.delete;
4009             l_period_name_tab.delete;
4010             l_quantity_tab.delete;
4011             l_txn_raw_cost_tab.delete;
4012             l_txn_burdened_cost_tab.delete;
4013             l_txn_revenue_tab.delete;
4014             l_project_raw_cost_tab.delete;
4015             l_project_burdened_cost_tab.delete;
4016             l_project_revenue_tab.delete;
4017             l_projfunc_raw_cost_tab.delete;
4018             l_projfunc_burdened_cost_tab.delete;
4019             l_projfunc_revenue_tab.delete;
4020             l_project_curr_code_tab.delete;
4021             l_projfunc_curr_code_tab.delete;
4022         l_cost_rejection_code_tab.delete;
4023             l_revenue_rejection_code_tab.delete;
4024             l_burden_rejection_code_tab.delete;
4025             l_pfc_cur_conv_rej_code_tab.delete;
4026             l_pc_cur_conv_rej_code_tab.delete;
4027 
4028     END initPlsqlTabs;
4029 
4030     PROCEDURE initUpdPlsqlTabs IS
4031 
4032     BEGIN
4033         l_upd_budget_Line_id_tab.delete;
4034             l_upd_ra_id_tab.delete;
4035             l_upd_txn_curr_code_tab.delete;
4036             l_upd_start_date_tab.delete;
4037             l_upd_end_date_tab.delete;
4038             l_upd_period_name_tab.delete;
4039             l_upd_quantity_tab.delete;
4040             l_upd_txn_raw_cost_tab.delete;
4041             l_upd_txn_burden_cost_tab.delete;
4042             l_upd_txn_revenue_tab.delete;
4043             l_upd_project_raw_cost_tab.delete;
4044             l_upd_project_burden_cost_tab.delete;
4045             l_upd_project_revenue_tab.delete;
4046             l_upd_projfunc_raw_cost_tab.delete;
4047             l_upd_projfunc_burden_cost_tab.delete;
4048             l_upd_projfunc_revenue_tab.delete;
4049             l_upd_project_curr_code_tab.delete;
4050             l_upd_projfunc_curr_code_tab.delete;
4051             l_upd_cost_rejection_tab.delete;
4052             l_upd_revenue_rejection_tab.delete;
4053             l_upd_burden_rejection_tab.delete;
4054             l_upd_pfc_cur_conv_rej_tab.delete;
4055             l_upd_pc_cur_conv_rej_tab.delete;
4056 
4057     END initUpdPlsqlTabs;
4058 
4059 BEGIN
4060     IF p_pa_debug_mode = 'Y' Then
4061         pa_debug.init_err_stack('PA_FP_CALC_PLAN_PKG.clear_closed_period_etcs');
4062     End If;
4063     x_return_status := 'S';
4064     l_stage := 'Entered clear_closed_period_etcs api ETC Date['||p_etc_start_date||']';
4065     g_stage := 'clear_closed_period_etcs:100';
4066     initPlsqlTabs;
4067     OPEN cur_bl_closed_period;
4068     FETCH cur_bl_closed_period BULK COLLECT INTO
4069         l_budget_Line_id_tab
4070         ,l_resource_assignment_id_tab
4071         ,l_txn_currency_code_tab
4072         ,l_start_date_tab
4073         ,l_end_date_tab
4074                 ,l_period_name_tab
4075                 ,l_quantity_tab
4076                 ,l_txn_raw_cost_tab
4077                 ,l_txn_burdened_cost_tab
4078                 ,l_txn_revenue_tab
4079                 ,l_project_raw_cost_tab
4080                 ,l_project_burdened_cost_tab
4081                 ,l_project_revenue_tab
4082                 ,l_projfunc_raw_cost_tab
4083                 ,l_projfunc_burdened_cost_tab
4084                 ,l_projfunc_revenue_tab
4085                 ,l_project_curr_code_tab
4086                 ,l_projfunc_curr_code_tab
4087         ,l_cost_rejection_code_tab
4088             ,l_revenue_rejection_code_tab
4089             ,l_burden_rejection_code_tab
4090             ,l_pfc_cur_conv_rej_code_tab
4091             ,l_pc_cur_conv_rej_code_tab;
4092     CLOSE cur_bl_closed_period;
4093 
4094     IF l_budget_Line_id_tab.COUNT > 0 Then
4095         g_stage := 'clear_closed_period_etcs:101';
4096 	If P_PA_DEBUG_MODE = 'Y' Then
4097         print_msg('There exists a budgetLine prior to ETC startdate with unbalanced amt NumOfLines['||l_budget_Line_id_tab.COUNT||']');
4098 	End if;
4099          FOR i IN l_budget_Line_id_tab.FIRST .. l_budget_Line_id_tab.LAST LOOP
4100              -- call reporting api to update these amounts
4101              IF NVL(g_rollup_required_flag,'N') = 'Y' Then  --{
4102 		/* bug fix:5031388
4103                 IF (l_cost_rejection_code_tab(i) is NULL AND
4104                     l_revenue_rejection_code_tab(i) is NULL AND
4105                     l_burden_rejection_code_tab(i) is NULL AND
4106                     l_pfc_cur_conv_rej_code_tab(i) is NULL AND
4107                     l_pc_cur_conv_rej_code_tab(i) is NULL )  THEN
4108 		*/
4109                     /* update the reporting lines before deleteing the budget lines */
4110                      Add_Toreporting_Tabls
4111                                 (p_calling_module               => 'CALCULATE_API'
4112                                 ,p_activity_code                => 'UPDATE'
4113                                 ,p_budget_version_id            => p_budget_version_id
4114                                 ,p_budget_line_id               => l_budget_Line_id_tab(i)
4115                                 ,p_resource_assignment_id       => l_resource_assignment_id_tab(i)
4116                                 ,p_start_date                   => l_start_date_tab(i)
4117                                 ,p_end_date                     => l_end_date_tab(i)
4118                                 ,p_period_name                  => l_period_name_tab(i)
4119                                 ,p_txn_currency_code            => l_txn_currency_code_tab(i)
4120                                 ,p_quantity                     => l_quantity_tab(i) * -1
4121                                 ,p_txn_raw_cost                 => l_txn_raw_cost_tab(i) * -1
4122                                 ,p_txn_burdened_cost            => l_txn_burdened_cost_tab(i) * -1
4123                                 ,p_txn_revenue                  => l_txn_revenue_tab(i) * -1
4124                                 ,p_project_currency_code        => l_project_curr_code_tab(i)
4125                                 ,p_project_raw_cost             => l_project_raw_cost_tab(i) * -1
4126                                 ,p_project_burdened_cost        => l_project_burdened_cost_tab(i) * -1
4127                                 ,p_project_revenue              => l_project_revenue_tab(i) * -1
4128                                 ,p_projfunc_currency_code       => l_projfunc_curr_code_tab(i)
4129                                 ,p_projfunc_raw_cost            => l_projfunc_raw_cost_tab(i) * -1
4130                                 ,p_projfunc_burdened_cost       => l_projfunc_burdened_cost_tab(i) * -1
4131                                 ,p_projfunc_revenue             => l_projfunc_revenue_tab(i) * -1
4132 				,p_rep_line_mode               => 'REVERSAL'
4133                                 ,x_msg_data                     => l_msg_data
4134                                 ,x_return_status                => l_return_status
4135                                 );
4136                /* bug fix:5031388END IF;*/
4137         END IF; --}
4138 
4139         /* Added for MRC enhancements */
4140         IF NVL(G_populate_mrc_tab_flag,'N') = 'Y' Then --{
4141             Populate_MRC_plsqlTabs
4142                 (p_calling_module               => 'CALCULATE_API'
4143                                 ,p_budget_version_id            => p_budget_version_id
4144                                 ,p_budget_line_id               => l_budget_Line_id_tab(i)
4145                                 ,p_resource_assignment_id       => l_resource_assignment_id_tab(i)
4146                                 ,p_start_date                   => l_start_date_tab(i)
4147                                 ,p_end_date                     => l_end_date_tab(i)
4148                                 ,p_period_name                  => l_period_name_tab(i)
4149                                 ,p_txn_currency_code            => l_txn_currency_code_tab(i)
4150                                 ,p_quantity                     => l_quantity_tab(i)
4151                                 ,p_txn_raw_cost                 => l_txn_raw_cost_tab(i)
4152                                 ,p_txn_burdened_cost            => l_txn_burdened_cost_tab(i)
4153                                 ,p_txn_revenue                  => l_txn_revenue_tab(i)
4154                                 ,p_project_currency_code        => l_project_curr_code_tab(i)
4155                                 ,p_project_raw_cost             => l_project_raw_cost_tab(i)
4156                                 ,p_project_burdened_cost        => l_project_burdened_cost_tab(i)
4157                                 ,p_project_revenue              => l_project_revenue_tab(i)
4158                                 ,p_projfunc_currency_code       => l_projfunc_curr_code_tab(i)
4159                                 ,p_projfunc_raw_cost            => l_projfunc_raw_cost_tab(i)
4160                                 ,p_projfunc_burdened_cost       => l_projfunc_burdened_cost_tab(i)
4161                                 ,p_projfunc_revenue             => l_projfunc_revenue_tab(i)
4162                 ,p_delete_flag                  => 'Y'
4163                                 ,x_msg_data                     => l_msg_data
4164                                 ,x_return_status                => l_return_status
4165                                 );
4166         END IF; --}
4167           END LOOP;
4168         g_stage := 'clear_closed_period_etcs:102';
4169         FORALL i IN l_budget_Line_id_tab.FIRST .. l_budget_Line_id_tab.LAST
4170         /** As discussed with Sanjay and Neeraj, Not to keep etc zero lines
4171          * this may cause to pick the wrong currency during the refresh rates
4172          * so delete all the budget lines instead of updating it to null
4173          **/
4174         DELETE FROM pa_budget_lines bl
4175         WHERE bl.budget_line_id  = l_budget_Line_id_tab(i);
4176         --print_msg('Number of rows deleted from budgetLine['||l_budget_Line_id_tab.count||']');
4177 
4178     END If;
4179 
4180     /* check if there any corrupted records exists. once the actuals are posted, the
4181      * etc should be zero, if not the record is corrupted so add msg to the stack
4182      * and skip the record
4183      * Had discussion with Neeraj and sanjay, Instead of throwing an error, correct the record (make plan = actrual )
4184      * and spread the ETC forward
4185      * so commenting out this section and added new code to handle this.
4186       FOR i IN cur_bl_corrupted LOOP
4187         --print_msg('Corrupted BudgetLines Exists prior to ETC period: RAID['||i.resource_assignment_id||']');
4188                     add_msgto_stack
4189                         ( p_msg_name       => 'PA_BLAMT_EXISTS_PRIOR_ETC'
4190                         ,p_token1         => 'PROJECT'
4191                         ,p_value1         => g_project_name
4192                         ,p_token2         => 'RESOURCE_ASSIGNMENT'
4193                         ,p_value2         => i.resource_assignment_id
4194                         ,p_token3         => 'RESOURCE_NAME'
4195                         ,p_value3         => i.resource_name
4196                         ,p_token4         => 'START_DATE'
4197                         ,p_value4         => i.start_date);
4198             x_return_status := 'E';
4199       END LOOP;
4200      **/
4201     g_stage := 'clear_closed_period_etcs:103';
4202      /* The above code is commented and Added the below code for enhacements */
4203     If NVL(g_track_wp_costs_flag,'N') = 'Y' Then
4204            FOR i IN cur_NonRatebase_corrupted_bls LOOP
4205                 --print_msg('Corrupted BudgetLines Exists prior to ETC period: RAID['||i.resource_assignment_id||']');
4206                     add_msgto_stack
4207                         ( p_msg_name       => 'PA_BLAMT_EXISTS_PRIOR_ETC'
4208                         ,p_token1         => 'PROJECT'
4209                         ,p_value1         => g_project_name
4210                         ,p_token2         => 'RESOURCE_ASSIGNMENT'
4211                         ,p_value2         => i.resource_assignment_id
4212                         ,p_token3         => 'RESOURCE_NAME'
4213                         ,p_value3         => i.resource_name
4214                         ,p_token4         => 'START_DATE'
4215                         ,p_value4         => i.start_date);
4216                         x_return_status := 'E';
4217            END LOOP;
4218     End If;
4219     IF x_return_status = 'S' AND p_etc_start_date is NOT NULL Then  --{
4220         initPlsqlTabs;
4221         initUpdPlsqlTabs;
4222         --print_msg('Opening cur_bl_corrupted cursor');
4223         OPEN cur_bl_corrupted;
4224         FETCH cur_bl_corrupted BULK COLLECT INTO
4225          l_budget_Line_id_tab
4226                 ,l_resource_assignment_id_tab
4227                 ,l_txn_currency_code_tab
4228                 ,l_start_date_tab
4229                 ,l_end_date_tab
4230                 ,l_period_name_tab
4231                 ,l_quantity_tab
4232                 ,l_txn_raw_cost_tab
4233                 ,l_txn_burdened_cost_tab
4234                 ,l_txn_revenue_tab
4235                 ,l_project_raw_cost_tab
4236                 ,l_project_burdened_cost_tab
4237                 ,l_project_revenue_tab
4238                 ,l_projfunc_raw_cost_tab
4239                 ,l_projfunc_burdened_cost_tab
4240                 ,l_projfunc_revenue_tab
4241                 ,l_project_curr_code_tab
4242                 ,l_projfunc_curr_code_tab
4243                 ,l_cost_rejection_code_tab
4244                 ,l_revenue_rejection_code_tab
4245                 ,l_burden_rejection_code_tab
4246                 ,l_pfc_cur_conv_rej_code_tab
4247                 ,l_pc_cur_conv_rej_code_tab;
4248         CLOSE cur_bl_corrupted;
4249         g_stage := 'clear_closed_period_etcs:104';
4250         --print_msg('Number of Budget lines Corrupted ['||l_budget_Line_id_tab.COUNT||']');
4251         IF l_budget_Line_id_tab.COUNT > 0 Then
4252              IF NVL(g_rollup_required_flag,'N') = 'Y' Then  --{
4253               FOR i IN l_budget_Line_id_tab.FIRST .. l_budget_Line_id_tab.LAST LOOP
4254 		/* bug fix:5031388
4255             	IF (l_cost_rejection_code_tab(i) is NULL AND
4256                         l_revenue_rejection_code_tab(i) is NULL AND
4257                         l_burden_rejection_code_tab(i) is NULL AND
4258                         l_pfc_cur_conv_rej_code_tab(i) is NULL AND
4259                         l_pc_cur_conv_rej_code_tab(i) is NULL )  THEN
4260 		*/
4261                         --update the reporting lines before correcting the budget lines
4262             		--print_msg('Passing -ve of blCorrupt:LnId['||l_budget_Line_id_tab(i)||']Qty['||l_quantity_tab(i) * -1||']');
4263                         Add_Toreporting_Tabls
4264                                 (p_calling_module               => 'CALCULATE_API'
4265                                 ,p_activity_code                => 'UPDATE'
4266                                 ,p_budget_version_id            => p_budget_version_id
4267                                 ,p_budget_line_id               => l_budget_Line_id_tab(i)
4268                                 ,p_resource_assignment_id       => l_resource_assignment_id_tab(i)
4269                                 ,p_start_date                   => l_start_date_tab(i)
4270                                 ,p_end_date                     => l_end_date_tab(i)
4271                                 ,p_period_name                  => l_period_name_tab(i)
4272                                 ,p_txn_currency_code            => l_txn_currency_code_tab(i)
4273                                 ,p_quantity                     => l_quantity_tab(i) * -1
4274                                 ,p_txn_raw_cost                 => l_txn_raw_cost_tab(i) * -1
4275                                 ,p_txn_burdened_cost            => l_txn_burdened_cost_tab(i) * -1
4276                                 ,p_txn_revenue                  => l_txn_revenue_tab(i) * -1
4277                                 ,p_project_currency_code        => l_project_curr_code_tab(i)
4278                                 ,p_project_raw_cost             => l_project_raw_cost_tab(i) * -1
4279                                 ,p_project_burdened_cost        => l_project_burdened_cost_tab(i) * -1
4280                                 ,p_project_revenue              => l_project_revenue_tab(i) * -1
4281                                 ,p_projfunc_currency_code       => l_projfunc_curr_code_tab(i)
4282                                 ,p_projfunc_raw_cost            => l_projfunc_raw_cost_tab(i) * -1
4283                                 ,p_projfunc_burdened_cost       => l_projfunc_burdened_cost_tab(i) * -1
4284                                 ,p_projfunc_revenue             => l_projfunc_revenue_tab(i) * -1
4285 				,p_rep_line_mode               => 'REVERSAL'
4286                                 ,x_msg_data                     => l_msg_data
4287                                 ,x_return_status                => l_return_status
4288                                 );
4289                     /* bug fix:5031388 END IF;*/
4290               END LOOP;
4291              END IF; --}
4292         END IF;
4293 
4294         IF l_budget_Line_id_tab.COUNT > 0 Then
4295          g_stage := 'clear_closed_period_etcs:105';
4296          --Correct all the budget lines prior to ETC start date. make plan = atcual and set all the currency conv attributes to NULL
4297          --print_msg('Updating closed period budget lines and correcting the plan amounts');
4298          l_corrupted_bl_update_rows := 0;
4299          FORALL i IN l_budget_Line_id_tab.FIRST .. l_budget_Line_id_tab.LAST
4300          UPDATE pa_budget_lines bl
4301          SET bl.quantity = bl.init_quantity
4302 	   -- Bug 15928585
4303  	   , bl.display_quantity = bl.init_quantity
4304  	   -- End bug 15928585
4305            ,bl.txn_raw_cost = bl.txn_init_raw_cost
4306            ,bl.txn_burdened_cost = bl.txn_init_burdened_cost
4307            ,bl.txn_revenue = bl.txn_init_revenue
4308            /* Bug fix: 4071198 As discussed with sanjay, for closed periods, instead of setting the Etc rates as null
4309             * derive the plan rates. so that the copy version functionality when copies the budget versions
4310             * proper rates will be copied*/
4311            ,bl.txn_standard_cost_rate = DECODE(nvl(bl.init_quantity,0),0,NULL,(bl.txn_init_raw_cost/bl.init_quantity))
4312            ,bl.txn_cost_rate_override = DECODE(nvl(bl.init_quantity,0),0,NULL,(bl.txn_init_raw_cost/bl.init_quantity))
4313            ,bl.burden_cost_rate = DECODE(nvl(bl.init_quantity,0),0,NULL,(bl.txn_init_burdened_cost/bl.init_quantity))
4314            ,bl.burden_cost_rate_override = DECODE(nvl(bl.init_quantity,0),0,NULL,(bl.txn_init_burdened_cost/bl.init_quantity))
4315            ,bl.txn_standard_bill_rate = DECODE(nvl(bl.init_quantity,0),0,NULL,(bl.txn_init_revenue/bl.init_quantity))
4316            ,bl.txn_bill_rate_override = DECODE(nvl(bl.init_quantity,0),0,NULL,(bl.txn_init_revenue/bl.init_quantity))
4317            ,bl.raw_cost = bl.init_raw_cost
4318            ,bl.burdened_cost = bl.init_burdened_cost
4319            ,bl.revenue = bl.init_revenue
4320            ,bl.project_raw_cost = bl.project_init_raw_cost
4321            ,bl.project_burdened_cost = bl.project_init_burdened_cost
4322            ,bl.project_revenue = bl.project_init_revenue
4323                    ,bl.projfunc_cost_rate_type         = null
4324                    ,bl.projfunc_cost_exchange_rate     = null
4325                    ,bl.projfunc_cost_rate_date_type    = null
4326                    ,bl.projfunc_cost_rate_date         = null
4327                    ,bl.projfunc_rev_rate_type          = null
4328                    ,bl.projfunc_rev_exchange_rate      = null
4329                    ,bl.projfunc_rev_rate_date_type     = null
4330                    ,bl.projfunc_rev_rate_date          = null
4331                    ,bl.project_cost_rate_type          = null
4332                    ,bl.project_cost_exchange_rate      = null
4333                    ,bl.project_cost_rate_date_type     = null
4334                    ,bl.project_cost_rate_date          = null
4335                    ,bl.project_rev_rate_type           = null
4336                    ,bl.project_rev_exchange_rate       = null
4337                    ,bl.project_rev_rate_date_type      = null
4338                    ,bl.project_rev_rate_date           = null
4339            ,bl.pfc_cur_conv_rejection_code     = null
4340                    ,bl.pc_cur_conv_rejection_code      = null
4341            ,bl.cost_rejection_code             = null
4342            ,bl.burden_rejection_code           = null
4343            ,bl.revenue_rejection_code          = null
4344                    ,bl.last_update_date                = sysdate
4345                    ,bl.last_updated_by                 = fnd_global.user_id
4346                    ,bl.last_update_login               = fnd_global.login_id
4347            /* Bug fix:4257059 storing this value just for tracking purpose is causing
4348             * issues in the generation flow
4349             *,bl.other_rejection_code            = 'PA_BLAMT_EXISTS_PRIOR_ETC'
4350             */
4351              WHERE bl.budget_line_id = l_budget_Line_id_tab(i)
4352          /*Bug fix:4257059 Added this returning clause to avoid one-select and one-update*/
4353          RETURNING
4354             bl.budget_line_id
4355                         ,bl.resource_assignment_id
4356                         ,bl.txn_currency_code
4357                         ,bl.start_date
4358                         --,rl.alias resource_name
4359                         ,bl.end_date
4360                         ,bl.period_name
4361                         ,bl.quantity
4362                         ,bl.txn_raw_cost
4363                         ,bl.txn_burdened_cost
4364                         ,bl.txn_revenue
4365                         ,bl.project_raw_cost
4366                         ,bl.project_burdened_cost
4367                         ,bl.project_revenue
4368                         ,bl.raw_cost      --projfunc_raw_cost
4369                         ,bl.burdened_cost --projfunc_burdened_cost
4370                         ,bl.revenue       --projfunc_revenue
4371                         ,bl.project_currency_code
4372                         ,bl.projfunc_currency_code
4373                         ,bl.cost_rejection_code
4374                         ,bl.revenue_rejection_code
4375                         ,bl.burden_rejection_code
4376                         ,bl.pfc_cur_conv_rejection_code
4377                         ,bl.pc_cur_conv_rejection_code
4378         BULK COLLECT INTO
4379                         l_upd_budget_Line_id_tab
4380                         ,l_upd_ra_id_tab
4381                         ,l_upd_txn_curr_code_tab
4382                         ,l_upd_start_date_tab
4383                         ,l_upd_end_date_tab
4384                         ,l_upd_period_name_tab
4385                         ,l_upd_quantity_tab
4386                         ,l_upd_txn_raw_cost_tab
4387                         ,l_upd_txn_burden_cost_tab
4388                         ,l_upd_txn_revenue_tab
4389                         ,l_upd_project_raw_cost_tab
4390                         ,l_upd_project_burden_cost_tab
4391                         ,l_upd_project_revenue_tab
4392                         ,l_upd_projfunc_raw_cost_tab
4393                         ,l_upd_projfunc_burden_cost_tab
4394                         ,l_upd_projfunc_revenue_tab
4395                         ,l_upd_project_curr_code_tab
4396                         ,l_upd_projfunc_curr_code_tab
4397                         ,l_upd_cost_rejection_tab
4398                         ,l_upd_revenue_rejection_tab
4399                         ,l_upd_burden_rejection_tab
4400                         ,l_upd_pfc_cur_conv_rej_tab
4401                         ,l_upd_pc_cur_conv_rej_tab ;
4402 
4403 
4404          l_corrupted_bl_update_rows := l_upd_budget_Line_id_tab.COUNT;
4405          --print_msg('Number of closed period budget lines updated['||l_corrupted_bl_update_rows||']');
4406         END IF;
4407 
4408         /** Bug fix:4257059 adding returning clause in the above update
4409                  * no need to hit the db again , so commentingout the code
4410         IF (NVL(l_corrupted_bl_update_rows,0) > 0 AND l_upd_budget_Line_id_tab.COUNT > 0 ) Then --{
4411             BEGIN
4412                 g_stage := 'clear_closed_period_etcs:106';
4413                  SELECT bl.budget_line_id
4414                             ,bl.resource_assignment_id
4415                             ,bl.txn_currency_code
4416                             ,bl.start_date
4417                             --,rl.alias resource_name
4418                             ,bl.end_date
4419                             ,bl.period_name
4420                             ,bl.quantity
4421                             ,bl.txn_raw_cost
4422                             ,bl.txn_burdened_cost
4423                             ,bl.txn_revenue
4424                             ,bl.project_raw_cost
4425                             ,bl.project_burdened_cost
4426                             ,bl.project_revenue
4427                             ,bl.raw_cost      projfunc_raw_cost
4428                             ,bl.burdened_cost projfunc_burdened_cost
4429                             ,bl.revenue       projfunc_revenue
4430                             ,bl.project_currency_code
4431                             ,bl.projfunc_currency_code
4432                             ,bl.cost_rejection_code
4433                             ,bl.revenue_rejection_code
4434                             ,bl.burden_rejection_code
4435                             ,bl.pfc_cur_conv_rejection_code
4436                             ,bl.pc_cur_conv_rejection_code
4437                 BULK COLLECT INTO
4438                             l_upd_budget_Line_id_tab
4439                             ,l_upd_ra_id_tab
4440                             ,l_upd_txn_curr_code_tab
4441                             ,l_upd_start_date_tab
4442                             ,l_upd_end_date_tab
4443                             ,l_upd_period_name_tab
4444                             ,l_upd_quantity_tab
4445                             ,l_upd_txn_raw_cost_tab
4446                             ,l_upd_txn_burden_cost_tab
4447                             ,l_upd_txn_revenue_tab
4448                             ,l_upd_project_raw_cost_tab
4449                             ,l_upd_project_burden_cost_tab
4450                             ,l_upd_project_revenue_tab
4451                             ,l_upd_projfunc_raw_cost_tab
4452                             ,l_upd_projfunc_burden_cost_tab
4453                             ,l_upd_projfunc_revenue_tab
4454                             ,l_upd_project_curr_code_tab
4455                             ,l_upd_projfunc_curr_code_tab
4456                             ,l_upd_cost_rejection_tab
4457                             ,l_upd_revenue_rejection_tab
4458                             ,l_upd_burden_rejection_tab
4459                             ,l_upd_pfc_cur_conv_rej_tab
4460                             ,l_upd_pc_cur_conv_rej_tab
4461                 FROM pa_budget_lines bl
4462                     ,pa_fp_spread_calc_tmp tmp
4463                         WHERE bl.budget_version_id = p_budget_version_id
4464                 AND  tmp.budget_version_id = bl.budget_version_id
4465                         AND  bl.resource_assignment_id = tmp.resource_assignment_id
4466                         AND  bl.txn_currency_code = tmp.txn_currency_code
4467                         AND  bl.start_date < p_etc_start_date
4468                         AND  bl.end_date < p_etc_start_date
4469                 AND  bl.other_rejection_code = 'PA_BLAMT_EXISTS_PRIOR_ETC'
4470                 AND  (bl.init_quantity is NOT NULL
4471                                 or bl.txn_init_raw_cost is NOT NULL
4472                                 or bl.txn_init_burdened_cost is NOT NULL
4473                                 or bl.txn_init_revenue is NOT NULL
4474                                  );
4475                 --print_msg('Number of budget Lines selected after correction['||l_budget_Line_id_tab.count||']');
4476 
4477             EXCEPTION
4478                 WHEN NO_DATA_FOUND THEN
4479                     NULL;
4480             END;
4481         END IF;  --}
4482         *** End of bug fix: 4257059 **/
4483         IF (NVL(l_corrupted_bl_update_rows,0) > 0 AND l_upd_budget_Line_id_tab.COUNT > 0 ) Then --{
4484             --Now pass the corrected plan amounts to the PJI reporting apis
4485             IF l_upd_budget_Line_id_tab.COUNT > 0 THEN
4486                     FOR i IN l_upd_budget_Line_id_tab.FIRST .. l_upd_budget_Line_id_tab.LAST LOOP
4487                          IF NVL(g_rollup_required_flag,'N') = 'Y' Then  --{
4488 				/* bug fix:5031388
4489                                 IF (l_upd_cost_rejection_tab(i) is NULL AND
4490                                     l_upd_revenue_rejection_tab(i) is NULL AND
4491                                     l_upd_burden_rejection_tab(i) is NULL AND
4492                                     l_upd_pfc_cur_conv_rej_tab(i) is NULL AND
4493                                     l_upd_pc_cur_conv_rej_tab(i) is NULL )  THEN
4494 				*/
4495                         	--print_msg('Passing +ve of blCorrupt:LnId['||l_upd_budget_Line_id_tab(i)||']Qty['||l_upd_quantity_tab(i)||']');
4496 
4497                                     --update the reporting lines before deleteing the budget lines
4498                                     Add_Toreporting_Tabls
4499                                         (p_calling_module               => 'CALCULATE_API'
4500                                         ,p_activity_code                => 'UPDATE'
4501                                         ,p_budget_version_id            => p_budget_version_id
4502                                         ,p_budget_line_id               => l_upd_budget_Line_id_tab(i)
4503                                         ,p_resource_assignment_id       => l_upd_ra_id_tab(i)
4504                                         ,p_start_date                   => l_upd_start_date_tab(i)
4505                                         ,p_end_date                     => l_upd_end_date_tab(i)
4506                                         ,p_period_name                  => l_upd_period_name_tab(i)
4507                                         ,p_txn_currency_code            => l_upd_txn_curr_code_tab(i)
4508                                         ,p_quantity                     => l_upd_quantity_tab(i)
4509                                         ,p_txn_raw_cost                 => l_upd_txn_raw_cost_tab(i)
4510                                         ,p_txn_burdened_cost            => l_upd_txn_burden_cost_tab(i)
4511                                         ,p_txn_revenue                  => l_upd_txn_revenue_tab(i)
4512                                         ,p_project_currency_code        => l_upd_project_curr_code_tab(i)
4513                                         ,p_project_raw_cost             => l_upd_project_raw_cost_tab(i)
4514                                         ,p_project_burdened_cost        => l_upd_project_burden_cost_tab(i)
4515                                         ,p_project_revenue              => l_upd_project_revenue_tab(i)
4516                                         ,p_projfunc_currency_code       => l_upd_projfunc_curr_code_tab(i)
4517                                         ,p_projfunc_raw_cost            => l_upd_projfunc_raw_cost_tab(i)
4518                                         ,p_projfunc_burdened_cost       => l_upd_projfunc_burden_cost_tab(i)
4519                                         ,p_projfunc_revenue             => l_upd_projfunc_revenue_tab(i)
4520 					,p_rep_line_mode               => 'POSITIVE_ENTRY'
4521                                         ,x_msg_data                     => l_msg_data
4522                                         ,x_return_status                => l_return_status
4523                                         );
4524                                 /* bug fix:5031388END IF;*/
4525                     END IF; --}
4526 
4527             /* Added for MRC enhancements */
4528                     IF NVL(G_populate_mrc_tab_flag,'N') = 'Y' Then --{
4529                             Populate_MRC_plsqlTabs
4530                                         (p_calling_module               => 'CALCULATE_API'
4531                                         ,p_budget_version_id            => p_budget_version_id
4532                                         ,p_budget_line_id               => l_upd_budget_Line_id_tab(i)
4533                                         ,p_resource_assignment_id       => l_upd_ra_id_tab(i)
4534                                         ,p_start_date                   => l_upd_start_date_tab(i)
4535                                         ,p_end_date                     => l_upd_end_date_tab(i)
4536                                         ,p_period_name                  => l_upd_period_name_tab(i)
4537                                         ,p_txn_currency_code            => l_upd_txn_curr_code_tab(i)
4538                                         ,p_quantity                     => l_upd_quantity_tab(i)
4539                                         ,p_txn_raw_cost                 => l_upd_txn_raw_cost_tab(i)
4540                                         ,p_txn_burdened_cost            => l_upd_txn_burden_cost_tab(i)
4541                                         ,p_txn_revenue                  => l_upd_txn_revenue_tab(i)
4542                                         ,p_project_currency_code        => l_upd_project_curr_code_tab(i)
4543                                         ,p_project_raw_cost             => l_upd_project_raw_cost_tab(i)
4544                                         ,p_project_burdened_cost        => l_upd_project_burden_cost_tab(i)
4545                                         ,p_project_revenue              => l_upd_project_revenue_tab(i)
4546                                         ,p_projfunc_currency_code       => l_upd_projfunc_curr_code_tab(i)
4547                                         ,p_projfunc_raw_cost            => l_upd_projfunc_raw_cost_tab(i)
4548                                         ,p_projfunc_burdened_cost       => l_upd_projfunc_burden_cost_tab(i)
4549                                         ,p_projfunc_revenue             => l_upd_projfunc_revenue_tab(i)
4550                     			,p_delete_flag                  => 'N'
4551                                         ,x_msg_data                     => l_msg_data
4552                                         ,x_return_status                => l_return_status
4553                                         );
4554 
4555             END IF; --}
4556                     END LOOP;
4557             END IF;
4558         END IF; --}
4559     End If;  --}
4560     /* Reset the buffer */
4561     initPlsqlTabs;
4562     initUpdPlsqlTabs;
4563     g_stage := 'clear_closed_period_etcs:107';
4564     --reset error stack
4565     IF p_pa_debug_mode = 'Y' Then
4566     	print_msg('Leaving clear_closed_period_etcs API with retSts['||x_return_status||']');
4567         pa_debug.reset_err_stack;
4568     End If;
4569 
4570 EXCEPTION
4571     WHEN OTHERS THEN
4572             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4573                 fnd_msg_pub.add_exc_msg
4574                 ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
4575                 ,p_procedure_name => 'clear_closed_period_etcs' );
4576         IF p_pa_debug_mode = 'Y' Then
4577                     pa_debug.reset_err_stack;
4578         end if;
4579                 RAISE;
4580 
4581 END clear_closed_period_etcs;
4582 
4583 /* This API updates the required flags in the spread calc tmp table to process in the bulk mode */
4584 PROCEDURE Upd_spread_calc_tmp(
4585         p_budget_version_id     IN NUMBER
4586         ,p_source_context   IN VARCHAR2
4587         ,x_return_status        OUT NOCOPY VARCHAR2
4588                 ) IS
4589 BEGIN
4590     x_return_status := 'S';
4591     g_stage := 'Upd_spread_calc_tmp:100';
4592     If P_PA_DEBUG_MODE = 'Y' Then
4593     print_msg('Entered Upd_spread_calc_tmp API');
4594     End If;
4595     IF g_plan_raId_tab.COUNT > 0 THEN
4596 	If P_PA_DEBUG_MODE = 'Y' Then
4597         print_msg('Number Of rowsUpdated['||g_plan_raId_tab.COUNT||']');
4598 	End If;
4599         FORALL i IN g_plan_raId_tab.FIRST .. g_plan_raId_tab.LAST
4600             UPDATE /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP_N1) */ PA_FP_SPREAD_CALC_TMP tmp -- bug 4873834
4601             SET tmp.skip_record_flag    = NVL(g_skip_record_tab(i),'N')
4602 		,tmp.processed_flag  = NVL(g_process_skip_CstRevrec_tab(i),'N')
4603                ,tmp.REFRESH_RATES_FLAG   = NVL(g_refresh_rates_tab(i),'N')
4604                ,tmp.REFRESH_CONV_RATES_FLAG  = NVL(g_refresh_conv_rates_tab(i),'N')
4605                ,tmp.MASS_ADJUST_FLAG    = NVL(g_mass_adjust_flag_tab(i),'N')
4606                ,tmp.G_WPRABL_CURRENCY_CODE = g_Wp_curCode_tab(i)
4607                ,tmp.RA_RATES_ONLY_CHANGE_FLAG = NVL(g_rtChanged_Ra_Flag_tab(i),'N')
4608                ,tmp.SYSTEM_REFERENCE_VAR2  = NVL(g_applyProg_refreshRts_tab(i),'N') /*Bug fix:4295967 */
4609             WHERE tmp.budget_version_id = p_budget_version_id
4610             AND   tmp.resource_assignment_id = g_plan_raId_tab(i)
4611             AND   tmp.txn_currency_code = g_plan_txnCur_Tab(i)
4612             AND   ((p_source_context = 'BUDGET_LINE'
4613                 and tmp.start_date = g_line_Sdate_tab(i))
4614                 OR
4615                 p_source_context <> 'BUDGET_LINE'
4616                   );
4617 
4618     END IF;
4619     --print_msg('mfcCostRefreshCount['||g_mfc_cost_refrsh_Raid_tab.COUNT||']');
4620     IF g_mfc_cost_refrsh_Raid_tab.COUNT > 0 THEN
4621         g_stage := 'Upd_spread_calc_tmp:101';
4622     --print_msg(g_stage);
4623         FORALL i IN g_mfc_cost_refrsh_Raid_tab.FIRST .. g_mfc_cost_refrsh_Raid_tab.LAST
4624             UPDATE /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP_N1) */ PA_FP_SPREAD_CALC_TMP tmp
4625             SET tmp.mfc_cost_refresh_flag = 'Y'
4626                ,tmp.REFRESH_RATES_FLAG   = 'Y'
4627             WHERE tmp.budget_version_id = p_budget_version_id
4628                         AND   tmp.resource_assignment_id = g_mfc_cost_refrsh_Raid_tab(i)
4629                         AND   tmp.txn_currency_code = g_mfc_cost_refrsh_txnCur_tab(i) ;
4630     	END IF;
4631 
4632     	/* ipm changes */
4633     	If g_sprd_raId_tab.COUNT > 0 Then
4634         g_stage := 'Upd_spread_calc_tmp:102';
4635         --print_msg(g_stage);
4636         FORALL i IN g_sprd_raId_tab.FIRST .. g_sprd_raId_tab.LAST
4637         UPDATE /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP_N1) */ PA_FP_SPREAD_CALC_TMP tmp
4638         SET tmp.cost_rate_override = decode(tmp.COST_RATE_G_MISS_NUM_FLAG,'Y',NULL
4639                             ,NVL(g_sprd_costRt_Ovr_tab(i),tmp.cost_rate_override))
4640            ,tmp.burden_cost_rate_override = decode(tmp.burden_rate_g_miss_num_flag,'Y',NULL
4641                             ,NVL(g_sprd_burdRt_Ovr_tab(i),tmp.burden_cost_rate_override))
4642            ,tmp.bill_rate_override = decode(tmp.bill_rate_g_miss_num_flag,'Y',NULL
4643                             ,NVL(g_sprd_billRt_Ovr_tab(i),tmp.bill_rate_override))
4644         WHERE tmp.resource_assignment_id = g_sprd_raId_tab(i)
4645         AND   tmp.txn_currency_code = g_sprd_txn_cur_tab(i)
4646         AND   NVL(g_sprd_qty_addl_tab(i),0) <> 0
4647 	AND   ((g_source_context <> 'BUDGET_LINE')
4648                 OR
4649                 ((g_source_context = 'BUDGET_LINE')
4650                 and tmp.start_date BETWEEN g_sprd_sDate_tab(i) AND g_sprd_eDate_tab(i)
4651                 ))
4652         AND   (NVL(tmp.cost_rate_changed_flag,'N') = 'Y'
4653                           OR NVL(tmp.burden_rate_changed_flag,'N') = 'Y'
4654                           OR NVL(tmp.bill_rate_changed_flag,'N') = 'Y'
4655                           OR NVL(tmp.raw_cost_changed_flag,'N') = 'Y'
4656                           OR NVL(tmp.burden_cost_changed_flag,'N') = 'Y'
4657                           OR NVL(tmp.revenue_changed_flag,'N') = 'Y'
4658             );
4659     	End If;
4660 
4661 	If g_rtChanged_RaId_tab.COUNT > 0 Then
4662 		If P_PA_DEBUG_MODE = 'Y' Then
4663              	print_msg('Updating spread calc tmp with rate overrides');
4664 		End If;
4665         	FORALL i IN g_rtChanged_RaId_tab.FIRST .. g_rtChanged_RaId_tab.LAST
4666         	UPDATE /*+ INDEX(TMP PA_FP_SPREAD_CALC_TMP_N1) */ pa_fp_spread_calc_tmp tmp
4667         	SET tmp.cost_rate_override = decode(NVL(g_rtChanged_cstMisNumFlg_tab(i),'N'),'Y',NULL
4668                                         ,NVL(g_rtChanged_CostRt_Tab(i),tmp.cost_rate_override))
4669             	,tmp.burden_cost_rate_override = decode(NVL(g_rtChanged_bdMisNumFlag_tab(i),'N'),'Y',NULL
4670                                         ,NVL(g_rtChanged_BurdRt_tab(i),tmp.burden_cost_rate_override))
4671             	,tmp.bill_rate_override  = decode(NVL(g_rtChanged_blMisNumFlag_tab(i),'N'),'Y',NULL
4672                                         ,NVL(g_rtChanged_billRt_tab(i),tmp.bill_rate_override))
4673         	WHERE tmp.resource_assignment_id = g_rtChanged_RaId_tab(i)
4674         	AND   tmp.txn_currency_code = g_rtChanged_TxnCur_tab(i)
4675         	AND   ((g_source_context <> 'BUDGET_LINE')
4676               	OR
4677             	((g_source_context = 'BUDGET_LINE')
4678              	and tmp.start_date BETWEEN g_rtChanged_sDate_tab(i) AND g_rtChanged_eDate_tab(i)
4679             	));
4680 		If P_PA_DEBUG_MODE = 'Y' Then
4681         	print_msg('Number of rows updated for RateChanges['||sql%rowcount||']');
4682 		End If;
4683 	End If;
4684 
4685 
4686 EXCEPTION
4687         WHEN OTHERS THEN
4688                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4689                 fnd_msg_pub.add_exc_msg
4690                 ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
4691                 ,p_procedure_name => 'Upd_spread_calc_tmp' );
4692                 RAISE;
4693 
4694 END  Upd_spread_calc_tmp;
4695 
4696 /* During spread process, the periodic line level override rates and currency conv attributes on the budget lines will be lost
4697  * as we delete all the budget lines before the spread call. The purpose of thei API  is to retain the override rates and
4698  * currency conversion attributes of the periodic line level on the budget lines. updates the rollup tmp table with the override rates
4699  */
4700 PROCEDURE Update_rollupTmp_OvrRates
4701           ( p_budget_version_id         IN  pa_budget_lines.budget_version_id%type
4702            ,p_calling_module            IN  varchar2
4703        ,p_generation_context        IN  varchar2  default 'SPREAD'
4704            ,x_return_status             OUT NOCOPY VARCHAR2
4705            ,x_msg_count                 OUT NOCOPY NUMBER
4706            ,x_msg_data                  OUT NOCOPY VARCHAR2
4707            ) IS
4708 
4709     CURSOR periodDetails IS
4710     SELECT gsb.period_set_name      period_set_name
4711                 ,gsb.accounted_period_type  accounted_period_type
4712                 ,pia.pa_period_type         pa_period_type
4713         ,pbv.version_type       version_type
4714                 ,decode(pbv.version_type,
4715                         'COST',ppfo.cost_time_phased_code,
4716                         'REVENUE',ppfo.revenue_time_phased_code,
4717                          ppfo.all_time_phased_code) time_phase_code
4718          FROM gl_sets_of_books          gsb
4719                 ,pa_implementations_all pia
4720                 ,pa_projects_all        ppa
4721                 ,pa_budget_versions     pbv
4722                 ,pa_proj_fp_options     ppfo
4723         WHERE ppa.project_id        = pbv.project_id
4724         AND pbv.budget_version_id = ppfo.fin_plan_version_id
4725         /* MOAC Changes: AND nvl(ppa.org_id,-99)   = nvl(pia.org_id,-99) */
4726         AND ppa.org_id   = pia.org_id
4727         AND gsb.set_of_books_id   = pia.set_of_books_id
4728         AND pbv.budget_version_id = p_budget_version_id;
4729 
4730     perdRec     periodDetails%ROWTYPE;
4731 
4732     CURSOR fptmpDetails IS
4733     SELECT tmp.rowid
4734           ,tmp.resource_assignment_id
4735           ,tmp.txn_currency_code
4736           ,tmp.start_date
4737           ,tmp.end_date
4738           ,fptmp.period_name
4739           ,decode(perdRec.version_type ,'ALL', NVL(fptmp.raw_cost_rate,tmp.rw_cost_rate_override)
4740                         ,'COST',NVL(fptmp.raw_cost_rate,tmp.rw_cost_rate_override)
4741                         ,decode(p_generation_context,'REVENUE_MARKUP' /* bug fix:4213824 added decode to get the cost rt */
4742                           ,NVL(fptmp.raw_cost_rate,tmp.rw_cost_rate_override),tmp.rw_cost_rate_override)
4743                         /* bgfix:4250089 having this extra default executes always when version type is revenue
4744                         ,tmp.rw_cost_rate_override */
4745                          ) cost_rate_override
4746               ,decode(perdRec.version_type ,'ALL', NVL(fptmp.burdened_cost_rate,tmp.burden_cost_rate_override)
4747                                             ,'COST',NVL(fptmp.burdened_cost_rate,tmp.burden_cost_rate_override)
4748                                             ,decode(p_generation_context,'REVENUE_MARKUP' /* bug fix:4213824 added decode to get the bdRt */
4749                         ,NVL(fptmp.burdened_cost_rate,tmp.burden_cost_rate_override),tmp.burden_cost_rate_override)
4750                         /* bug fix:4250089 ,tmp.burden_cost_rate_override */
4751                         ) burden_rate_override
4752           ,decode(perdRec.version_type ,'ALL', NVL(fptmp.revenue_bill_rate,tmp.bill_rate_override)
4753                                             ,'REVENUE',NVL(fptmp.revenue_bill_rate,tmp.bill_rate_override)
4754                                             ,tmp.bill_rate_override) bill_rate_override
4755           ,tmp.PROJECT_COST_RATE_TYPE
4756               ,tmp.PROJECT_COST_EXCHANGE_RATE
4757               ,tmp.PROJECT_COST_RATE_DATE_TYPE
4758               ,tmp.PROJECT_COST_RATE_DATE
4759               ,tmp.PROJECT_REV_RATE_TYPE
4760               ,tmp.PROJECT_REV_EXCHANGE_RATE
4761               ,tmp.PROJECT_REV_RATE_DATE_TYPE
4762               ,tmp.PROJECT_REV_RATE_DATE
4763               ,tmp.PROJFUNC_COST_RATE_TYPE
4764               ,tmp.PROJFUNC_COST_EXCHANGE_RATE
4765               ,tmp.PROJFUNC_COST_RATE_DATE_TYPE
4766               ,tmp.PROJFUNC_COST_RATE_DATE
4767               ,tmp.PROJFUNC_REV_RATE_TYPE
4768               ,tmp.PROJFUNC_REV_EXCHANGE_RATE
4769               ,tmp.PROJFUNC_REV_RATE_DATE_TYPE
4770               ,tmp.PROJFUNC_REV_RATE_DATE
4771         /* Bug fix:4568011: set a flag based on the bill rate override passed from generation process
4772          * to indicate that revenue should be calculated based on markup or not
4773          * If bill rate override is passed, then do not calculate markup
4774          */
4775         ,decode(p_generation_context,'REVENUE_MARKUP',
4776                 decode(fptmp.revenue_bill_rate,NULL,'Y','N'),'Y') markup_calculation_flag
4777     FROM  pa_fp_rollup_tmp tmp
4778           ,pa_fp_gen_rate_tmp fptmp
4779           ,pa_resource_assignments ra
4780           ,pa_fp_spread_calc_tmp caltmp
4781     WHERE  caltmp.budget_version_id = p_budget_version_id
4782     AND    caltmp.resource_assignment_id = ra.resource_assignment_id
4783     AND    nvl(caltmp.skip_record_flag,'N') <> 'Y'
4784     AND    tmp.resource_assignment_id = ra.resource_assignment_id
4785     AND    tmp.txn_currency_code = caltmp.txn_currency_code
4786     AND    NVL(tmp.system_reference5,'N') = 'N'  /* donot pick already processed lines */
4787     AND    fptmp.target_res_asg_id = tmp.resource_assignment_id
4788     AND    fptmp.txn_currency_code = tmp.txn_currency_code
4789     AND    NVL(tmp.period_name,'SUMMARY') = nvl(fptmp.period_name,NVL(tmp.period_name,'SUMMARY'))
4790     /* Bug fix: 4216423 markup should be calculated for both rate and non-rate base resource
4791     AND    ((p_generation_context = 'SPREAD')
4792         OR
4793         ( p_generation_context = 'REVENUE_MARKUP'
4794           AND NVL(ra.rate_based_flag,'N') = 'N'
4795         ))
4796     */
4797     ;
4798 
4799     /* This cursor will be executed only if the debug profile is set Y
4800      * this is required in order figure out what overrides are exists in the generation temp table */
4801     CURSOR cur_dbgGenRtOvr IS
4802     SELECT tmp.rowid
4803               ,fptmp.target_res_asg_id    RaId
4804               ,fptmp.txn_currency_code    CurCode
4805               ,tmp.start_date
4806               ,tmp.end_date
4807               ,fptmp.period_name      period_name
4808           ,fptmp.raw_cost_rate        cost_rate_override
4809           ,fptmp.burdened_cost_rate   burden_rate_override
4810           ,fptmp.revenue_bill_rate    bill_rate_override
4811       ,decode(p_generation_context,'REVENUE_MARKUP',
4812                                 decode(fptmp.revenue_bill_rate,NULL,'Y','N'),'Y') markup_calculation_flag
4813     FROM  pa_fp_rollup_tmp tmp
4814               ,pa_fp_gen_rate_tmp fptmp
4815               ,pa_resource_assignments ra
4816               ,pa_fp_spread_calc_tmp caltmp
4817         WHERE  caltmp.budget_version_id = p_budget_version_id
4818         AND    caltmp.resource_assignment_id = ra.resource_assignment_id
4819         AND    nvl(caltmp.skip_record_flag,'N') <> 'Y'
4820         AND    tmp.resource_assignment_id = ra.resource_assignment_id
4821         AND    tmp.txn_currency_code = caltmp.txn_currency_code
4822         AND    NVL(tmp.system_reference5,'N') = 'N'  /* donot pick already processed lines */
4823         AND    fptmp.target_res_asg_id = tmp.resource_assignment_id
4824         AND    fptmp.txn_currency_code = tmp.txn_currency_code
4825         AND    NVL(tmp.period_name,'SUMMARY') = nvl(fptmp.period_name,NVL(tmp.period_name,'SUMMARY'))
4826     /* Bug fix: 4216423 markup should be calculated for both rate and non-rate base resource
4827         AND    ((p_generation_context = 'SPREAD')
4828                 OR
4829                 ( p_generation_context = 'REVENUE_MARKUP'
4830                   AND NVL(ra.rate_based_flag,'N') = 'N'
4831                 ))
4832     */
4833     ;
4834 
4835     l_rowid_tab                     pa_plsql_datatypes.RowidTabTyp;
4836     l_resource_assignment_id_tab    pa_plsql_datatypes.IdTabTyp;
4837         l_txn_currency_code_tab         pa_plsql_datatypes.Char50TabTyp;
4838         l_start_date_tab                pa_plsql_datatypes.DateTabTyp;
4839         l_end_date_tab                  pa_plsql_datatypes.DateTabTyp;
4840         l_period_name_tab               pa_plsql_datatypes.Char50TabTyp;
4841         l_cost_rate_override_tab        pa_plsql_datatypes.NumTabTyp;
4842         l_burden_rate_override_tab      pa_plsql_datatypes.NumTabTyp;
4843         l_bill_rate_override_tab        pa_plsql_datatypes.NumTabTyp;
4844     l_PROJECT_COST_RATE_TYPE_tab    pa_plsql_datatypes.Char50TabTyp;
4845     l_PROJECT_COST_EXG_RATE_tab     pa_plsql_datatypes.NumTabTyp;
4846     l_PROJECT_COST_DATE_TYPE_tab    pa_plsql_datatypes.Char50TabTyp;
4847     l_PROJECT_COST_RATE_DATE_tab    pa_plsql_datatypes.DateTabTyp;
4848     l_PROJECT_REV_RATE_TYPE_tab     pa_plsql_datatypes.Char50TabTyp;
4849     l_PROJECT_REV_EXG_RATE_tab      pa_plsql_datatypes.NumTabTyp;
4850     l_PROJECT_REV_DATE_TYPE_tab     pa_plsql_datatypes.Char50TabTyp;
4851     l_PROJECT_REV_RATE_DATE_tab     pa_plsql_datatypes.DateTabTyp;
4852     l_PROJFUNC_COST_RATE_TYPE_tab   pa_plsql_datatypes.Char50TabTyp;
4853     l_PROJFUNC_COST_EXG_RATE_tab    pa_plsql_datatypes.NumTabTyp;
4854     l_PROJFUNC_COST_DATE_TYPE_tab   pa_plsql_datatypes.Char50TabTyp;
4855     l_PROJFUNC_COST_RATE_DATE_tab   pa_plsql_datatypes.DateTabTyp;
4856     l_PROJFUNC_REV_RATE_TYPE_tab    pa_plsql_datatypes.Char50TabTyp;
4857     l_PROJFUNC_REV_EXG_RATE_tab     pa_plsql_datatypes.NumTabTyp;
4858     l_PROJFUNC_REV_DATE_TYPE_tab    pa_plsql_datatypes.Char50TabTyp;
4859     l_PROJFUNC_REV_RATE_DATE_tab    pa_plsql_datatypes.DateTabTyp;
4860     l_markup_calculation_flag_tab   pa_plsql_datatypes.Char1TabTyp;
4861 
4862 
4863 BEGIN
4864     /* Initialize the out variables */
4865     x_return_status := 'S';
4866     x_msg_data := NULL;
4867     x_msg_count := 0;
4868     g_stage :='Update_rollupTmp_OvrRates:100';
4869     perdRec := NULL;
4870     OPEN periodDetails;
4871     FETCH periodDetails INTO perdRec;
4872     CLOSE periodDetails;
4873 
4874     If perdRec.time_phase_code in ('G','P')  Then
4875         g_stage :='Update_rollupTmp_OvrRates:101';
4876         --print_msg('Update rollup tmp period name where it is null');
4877         UPDATE pa_fp_rollup_tmp tmp
4878             SET tmp.period_name = (select gp.period_name
4879                                from gl_periods gp
4880                                where gp.period_set_name = perdRec.period_set_name
4881                                and gp.adjustment_period_flag = 'N'
4882                                and gp.period_type = decode(perdRec.time_phase_code,'G',perdRec.accounted_period_type
4883                                 ,'P',perdRec.pa_period_type,gp.period_type)
4884                                and  tmp.start_date between gp.start_date and gp.end_date
4885                    and rownum = 1
4886                                )
4887             WHERE tmp.period_name is NULL
4888         AND  tmp.budget_version_id = p_budget_version_id
4889         AND NVL(tmp.system_reference5,'N') = 'N'
4890          ;
4891         --print_msg('Number of rows updated['||sql%rowcount||']');
4892     Else
4893         g_stage :='Update_rollupTmp_OvrRates:102';
4894         /* Non-Timephased budgets period name must be null */
4895         UPDATE pa_fp_rollup_tmp tmp
4896                 SET tmp.period_name = NULL
4897                 WHERE tmp.period_name is NOT NULL
4898         AND NVL(tmp.system_reference5,'N') = 'N'
4899         AND  tmp.budget_version_id = p_budget_version_id;
4900                 print_msg('Number of rows updated['||sql%rowcount||']');
4901     End If;
4902 
4903     IF ((p_calling_module in ('FORECAST_GENERATION') AND perdRec.time_phase_code in ('G','P')) OR
4904        (p_generation_context = 'REVENUE_MARKUP' ) OR
4905  	(p_calling_module in ('FORECAST_GENERATION','BUDGET_GENERATION') and perdRec.time_phase_code = 'N'
4906  	and perdRec.version_type = 'ALL'))  Then --{
4907         l_rowid_tab.delete;
4908         l_resource_assignment_id_tab.delete;
4909             l_txn_currency_code_tab.delete;
4910             l_start_date_tab.delete;
4911             l_end_date_tab.delete;
4912             l_period_name_tab.delete;
4913             l_cost_rate_override_tab.delete;
4914             l_burden_rate_override_tab.delete;
4915             l_bill_rate_override_tab.delete;
4916         l_PROJECT_COST_RATE_TYPE_tab.delete;
4917             l_PROJECT_COST_EXG_RATE_tab.delete;
4918             l_PROJECT_COST_DATE_TYPE_tab.delete;
4919             l_PROJECT_COST_RATE_DATE_tab.delete;
4920             l_PROJECT_REV_RATE_TYPE_tab.delete;
4921             l_PROJECT_REV_EXG_RATE_tab.delete;
4922             l_PROJECT_REV_DATE_TYPE_tab.delete;
4923             l_PROJECT_REV_RATE_DATE_tab.delete;
4924             l_PROJFUNC_COST_RATE_TYPE_tab.delete;
4925             l_PROJFUNC_COST_EXG_RATE_tab.delete;
4926             l_PROJFUNC_COST_DATE_TYPE_tab.delete;
4927             l_PROJFUNC_COST_RATE_DATE_tab.delete;
4928             l_PROJFUNC_REV_RATE_TYPE_tab.delete;
4929             l_PROJFUNC_REV_EXG_RATE_tab.delete;
4930             l_PROJFUNC_REV_DATE_TYPE_tab.delete;
4931             l_PROJFUNC_REV_RATE_DATE_tab.delete;
4932         l_markup_calculation_flag_tab.delete;
4933         g_stage :='Update_rollupTmp_OvrRates:103';
4934         --print_msg('Fetching rate overrides details from pa_fp_gen_rate_tmp tables');
4935         OPEN fptmpDetails;
4936         FETCH fptmpDetails BULK COLLECT INTO
4937             l_rowid_tab
4938             ,l_resource_assignment_id_tab
4939                     ,l_txn_currency_code_tab
4940                     ,l_start_date_tab
4941                     ,l_end_date_tab
4942                     ,l_period_name_tab
4943                     ,l_cost_rate_override_tab
4944                     ,l_burden_rate_override_tab
4945                     ,l_bill_rate_override_tab
4946             ,l_PROJECT_COST_RATE_TYPE_tab
4947                     ,l_PROJECT_COST_EXG_RATE_tab
4948                     ,l_PROJECT_COST_DATE_TYPE_tab
4949                     ,l_PROJECT_COST_RATE_DATE_tab
4950                     ,l_PROJECT_REV_RATE_TYPE_tab
4951                     ,l_PROJECT_REV_EXG_RATE_tab
4952                     ,l_PROJECT_REV_DATE_TYPE_tab
4953                     ,l_PROJECT_REV_RATE_DATE_tab
4954                     ,l_PROJFUNC_COST_RATE_TYPE_tab
4955                     ,l_PROJFUNC_COST_EXG_RATE_tab
4956                     ,l_PROJFUNC_COST_DATE_TYPE_tab
4957                     ,l_PROJFUNC_COST_RATE_DATE_tab
4958                     ,l_PROJFUNC_REV_RATE_TYPE_tab
4959                     ,l_PROJFUNC_REV_EXG_RATE_tab
4960                     ,l_PROJFUNC_REV_DATE_TYPE_tab
4961                     ,l_PROJFUNC_REV_RATE_DATE_tab
4962             ,l_markup_calculation_flag_tab;
4963         CLOSE fptmpDetails;
4964         IF l_rowid_tab.COUNT > 0 THEN
4965        /*
4966             If NVL(p_pa_debug_mode,'N')  = 'Y' Then
4967               for i in cur_dbgGenRtOvr loop
4968                 print_msg('Generation context['||p_generation_context||']');
4969                 print_msg('GenRtRaid['||i.raid||']cur['||i.curcode||']perNa['||i.period_name||']CstRtOv['||i.cost_rate_override||']');
4970                 print_msg('bdRtOvr['||i.burden_rate_override||']billRtOvr['||i.bill_rate_override||']markup_calculation_flag[||i.markup_calculation_flag||']');
4971               end loop;
4972             End If;
4973        */
4974             g_stage :='Update_rollupTmp_OvrRates:104';
4975             --print_msg(g_stage||'Number of rows fetched['||l_rowid_tab.COUNT||']');
4976             FORALL i IN  l_rowid_tab.FIRST .. l_rowid_tab.LAST
4977             UPDATE pa_fp_rollup_tmp tmp
4978             SET tmp.rw_cost_rate_override = l_cost_rate_override_tab(i)
4979                ,tmp.burden_cost_rate_override = l_burden_rate_override_tab(i)
4980                ,tmp.bill_rate_override = l_bill_rate_override_tab(i)
4981                ,tmp.PROJECT_COST_RATE_TYPE = nvl(l_PROJECT_COST_RATE_TYPE_tab(i),tmp.PROJECT_COST_RATE_TYPE)
4982                ,tmp.PROJECT_COST_EXCHANGE_RATE = nvl(l_PROJECT_COST_EXG_RATE_tab(i),tmp.PROJECT_COST_EXCHANGE_RATE)
4983                ,tmp.PROJECT_COST_RATE_DATE_TYPE = nvl(l_PROJECT_COST_DATE_TYPE_tab(i),tmp.PROJECT_COST_RATE_DATE_TYPE)
4984                ,tmp.PROJECT_COST_RATE_DATE   = nvl(l_PROJECT_COST_RATE_DATE_tab(i),tmp.PROJECT_COST_RATE_DATE)
4985                ,tmp.PROJECT_REV_RATE_TYPE    = nvl(l_PROJECT_REV_RATE_TYPE_tab(i),tmp.PROJECT_REV_RATE_TYPE)
4986                ,tmp.PROJECT_REV_EXCHANGE_RATE  = nvl(l_PROJECT_REV_EXG_RATE_tab(i),tmp.PROJECT_REV_EXCHANGE_RATE)
4987                ,tmp.PROJECT_REV_RATE_DATE_TYPE = nvl(l_PROJECT_REV_DATE_TYPE_tab(i),tmp.PROJECT_REV_RATE_DATE_TYPE)
4988                ,tmp.PROJECT_REV_RATE_DATE   = nvl(l_PROJECT_REV_RATE_DATE_tab(i),tmp.PROJECT_REV_RATE_DATE)
4989                ,tmp.PROJFUNC_COST_RATE_TYPE   = nvl(l_PROJFUNC_COST_RATE_TYPE_tab(i),tmp.PROJFUNC_COST_RATE_TYPE)
4990                ,tmp.PROJFUNC_COST_EXCHANGE_RATE  = nvl(l_PROJFUNC_COST_EXG_RATE_tab(i),tmp.PROJFUNC_COST_EXCHANGE_RATE)
4991                ,tmp.PROJFUNC_COST_RATE_DATE_TYPE  = nvl(l_PROJFUNC_COST_DATE_TYPE_tab(i),tmp.PROJFUNC_COST_RATE_DATE_TYPE)
4992                ,tmp.PROJFUNC_COST_RATE_DATE     = nvl(l_PROJFUNC_COST_RATE_DATE_tab(i),tmp.PROJFUNC_COST_RATE_DATE)
4993                ,tmp.PROJFUNC_REV_RATE_TYPE    = nvl(l_PROJFUNC_REV_RATE_TYPE_tab(i),tmp.PROJFUNC_REV_RATE_TYPE)
4994                ,tmp.PROJFUNC_REV_EXCHANGE_RATE  = nvl(l_PROJFUNC_REV_EXG_RATE_tab(i),tmp.PROJFUNC_REV_EXCHANGE_RATE)
4995                ,tmp.PROJFUNC_REV_RATE_DATE_TYPE   =nvl(l_PROJFUNC_REV_DATE_TYPE_tab(i),tmp.PROJFUNC_REV_RATE_DATE_TYPE)
4996                ,tmp.PROJFUNC_REV_RATE_DATE = nvl(l_PROJFUNC_REV_RATE_DATE_tab(i),tmp.PROJFUNC_REV_RATE_DATE)
4997            ,tmp.SYSTEM_REFERENCE6 = nvl(l_markup_calculation_flag_tab(i),'Y')
4998             WHERE tmp.rowid = l_rowid_tab(i);
4999 
5000         END IF;
5001     END IF;  --}
5002 
5003 EXCEPTION
5004     WHEN OTHERS THEN
5005         x_return_status := 'U';
5006             x_msg_data := SQLCODE||SQLERRM;
5007             x_msg_count := 1;
5008 
5009 END Update_rollupTmp_OvrRates;
5010 
5011 /*
5012 This API is called when source context is BUDGET_LINE and delete_budget_lines flag is Y
5013 Before deleting budget lines, this api calls Pji reporting apis to update the balances
5014 and then it deletes the budget lines only if there are no actuals exists.
5015 and the budget start date is greater than ETC start date
5016 */
5017 PROCEDURE delete_budget_lines
5018     ( p_budget_version_id         IN  pa_budget_lines.budget_version_id%type
5019      ,p_resource_assignment_id    IN  pa_resource_assignments.resource_assignment_id%TYPE
5020          ,p_txn_currency_code         IN  pa_budget_lines.txn_currency_code%TYPE
5021          ,p_line_start_date           IN  pa_budget_lines.start_date%TYPE
5022          ,p_line_end_date             IN  pa_budget_lines.end_date%TYPE
5023      ,p_source_context            IN  varchar2
5024          ,x_return_status             OUT NOCOPY VARCHAR2
5025          ,x_msg_count                 OUT NOCOPY NUMBER
5026          ,x_msg_data                  OUT NOCOPY VARCHAR2
5027      ,x_num_rowsdeleted       OUT NOCOPY Number
5028          ) IS
5029 
5030     l_debug_mode               VARCHAR2(30);
5031     l_stage                    NUMBER;
5032     l_msg_index_out            NUMBER;
5033     l_return_status            VARCHAR2(30);
5034     PJI_EXCEPTION              EXCEPTION;
5035 
5036     CURSOR get_delete_bl_id IS
5037     SELECT bl.budget_line_id
5038               ,bl.resource_assignment_id
5039               ,bl.txn_currency_code
5040               ,bl.start_date
5041               ,bl.end_date
5042               ,bl.period_name
5043               ,bl.quantity
5044               ,bl.txn_raw_cost
5045               ,bl.txn_burdened_cost
5046               ,bl.txn_revenue
5047               ,bl.project_raw_cost
5048               ,bl.project_burdened_cost
5049               ,bl.project_revenue
5050               ,bl.raw_cost      projfunc_raw_cost
5051               ,bl.burdened_cost projfunc_burdened_cost
5052               ,bl.revenue       projfunc_revenue
5053               ,bl.project_currency_code
5054               ,bl.projfunc_currency_code
5055           ,bl.cost_rejection_code
5056               ,bl.revenue_rejection_code
5057               ,bl.burden_rejection_code
5058               ,bl.pfc_cur_conv_rejection_code
5059               ,bl.pc_cur_conv_rejection_code
5060         FROM pa_budget_lines bl
5061     WHERE bl.resource_assignment_id = p_resource_assignment_id
5062     AND   bl.txn_currency_code      = p_txn_currency_code
5063         AND ((p_line_start_date is NULL AND p_line_end_date is NULL )
5064              OR (p_line_start_date is NOT NULL AND p_line_end_date is NOT NULL
5065                 and bl.start_date BETWEEN p_line_start_date AND p_line_end_date
5066         )
5067         )
5068 /* Bug 4344112 -- Actuals can be stamped as null or zero, in both cases
5069    we need to delete the lines. In case of this bug actuals are getting
5070    stamped as ZERO so we are not deleting this line, the spread logic
5071    breaks becoz of the zero in actuals.
5072    Lines with zero actuals can be deleted as lines with NULL actuals. */
5073  /****** AND (bl.init_quantity          IS NULL AND
5074               bl.txn_init_raw_cost      IS NULL AND
5075               bl.txn_init_burdened_cost IS NULL AND
5076               bl.txn_init_revenue       IS NULL);   ******/
5077     AND (NVL(bl.init_quantity,0)           = 0 AND
5078          NVL(bl.txn_init_raw_cost ,0)      = 0 AND
5079          NVL(bl.txn_init_burdened_cost ,0) = 0 AND
5080          NVL(bl.txn_init_revenue ,0)       = 0);
5081 
5082 
5083     /* This cursor picks all the budget lines where ETC start date falls and updates the
5084     * plan = Actuals so that remaining ETC will be spread forward
5085     */
5086         CURSOR cur_UpdBlWithZeroEtc IS
5087         SELECT bl.budget_line_id
5088               ,bl.resource_assignment_id
5089               ,bl.txn_currency_code
5090               ,bl.start_date
5091               ,bl.end_date
5092               ,bl.period_name
5093               ,bl.quantity
5094               ,bl.txn_raw_cost
5095               ,bl.txn_burdened_cost
5096               ,bl.txn_revenue
5097               ,bl.project_raw_cost
5098               ,bl.project_burdened_cost
5099               ,bl.project_revenue
5100               ,bl.raw_cost      projfunc_raw_cost
5101               ,bl.burdened_cost projfunc_burdened_cost
5102               ,bl.revenue       projfunc_revenue
5103               ,bl.project_currency_code
5104               ,bl.projfunc_currency_code
5105               ,bl.cost_rejection_code
5106               ,bl.revenue_rejection_code
5107               ,bl.burden_rejection_code
5108               ,bl.pfc_cur_conv_rejection_code
5109               ,bl.pc_cur_conv_rejection_code
5110           ,bl.init_quantity
5111           ,bl.txn_init_raw_cost
5112           ,bl.txn_init_burdened_cost
5113           ,bl.txn_init_revenue
5114           ,bl.project_init_raw_cost
5115           ,bl.project_init_burdened_cost
5116           ,bl.project_init_revenue
5117           ,bl.init_raw_cost
5118           ,bl.init_burdened_cost
5119           ,bl.init_revenue
5120         FROM pa_budget_lines bl
5121         WHERE bl.resource_assignment_id = p_resource_assignment_id
5122         AND   bl.txn_currency_code      = p_txn_currency_code
5123         AND ((p_line_start_date is NULL AND p_line_end_date is NULL )
5124              OR (p_line_start_date is NOT NULL AND p_line_end_date is NOT NULL
5125                 and bl.start_date BETWEEN p_line_start_date AND p_line_end_date
5126                 )
5127             )
5128         AND g_spread_from_date is NOT NULL
5129         AND ((bl.start_date >= g_spread_from_date )
5130              /* bug fix: 4139354 and (g_spread_from_date BETWEEN bl.start_date AND bl.end_date)*/
5131              OR (g_spread_from_date BETWEEN bl.start_date AND bl.end_date)
5132             )
5133         AND ( NVL(bl.init_quantity,0) <> 0 OR
5134                  NVL(bl.txn_init_raw_cost ,0) <> 0 OR
5135                  NVL(bl.txn_init_burdened_cost ,0) <> 0 OR
5136                  NVL(bl.txn_init_revenue ,0) <> 0
5137        );
5138 
5139         l_budget_Line_id_tab   pa_plsql_datatypes.IdTabTyp;
5140         l_resource_assignment_id_tab pa_plsql_datatypes.IdTabTyp;
5141         l_txn_currency_code_tab      pa_plsql_datatypes.Char50TabTyp;
5142         l_start_date_tab             pa_plsql_datatypes.DateTabTyp;
5143         l_end_date_tab               pa_plsql_datatypes.DateTabTyp;
5144         l_period_name_tab            pa_plsql_datatypes.Char50TabTyp;
5145         l_quantity_tab                  pa_plsql_datatypes.NumTabTyp;
5146         l_txn_raw_cost_tab              pa_plsql_datatypes.NumTabTyp;
5147         l_txn_burdened_cost_tab         pa_plsql_datatypes.NumTabTyp;
5148         l_txn_revenue_tab               pa_plsql_datatypes.NumTabTyp;
5149         l_project_raw_cost_tab          pa_plsql_datatypes.NumTabTyp;
5150         l_project_burdened_cost_tab     pa_plsql_datatypes.NumTabTyp;
5151         l_project_revenue_tab           pa_plsql_datatypes.NumTabTyp;
5152         l_projfunc_raw_cost_tab         pa_plsql_datatypes.NumTabTyp;
5153         l_projfunc_burdened_cost_tab    pa_plsql_datatypes.NumTabTyp;
5154         l_projfunc_revenue_tab          pa_plsql_datatypes.NumTabTyp;
5155         l_project_curr_code_tab         pa_plsql_datatypes.Char50TabTyp;
5156         l_projfunc_curr_code_tab        pa_plsql_datatypes.Char50TabTyp;
5157         l_cost_rejection_code_tab               pa_plsql_datatypes.Char50TabTyp;
5158         l_revenue_rejection_code_tab    pa_plsql_datatypes.Char50TabTyp;
5159         l_burden_rejection_code_tab             pa_plsql_datatypes.Char50TabTyp;
5160         l_pfc_cur_conv_rej_code_tab       pa_plsql_datatypes.Char50TabTyp;
5161         l_pc_cur_conv_rej_code_tab        pa_plsql_datatypes.Char50TabTyp;
5162     l_init_quantity_tab       pa_plsql_datatypes.NumTabTyp;
5163     l_txn_init_raw_cost_tab       pa_plsql_datatypes.NumTabTyp;
5164     l_txn_init_burdened_cost_tab      pa_plsql_datatypes.NumTabTyp;
5165     l_txn_init_revenue_tab        pa_plsql_datatypes.NumTabTyp;
5166     l_pj_init_raw_cost_tab        pa_plsql_datatypes.NumTabTyp;
5167     l_pj_init_burdened_cost_tab   pa_plsql_datatypes.NumTabTyp;
5168     l_pj_init_revenue_tab         pa_plsql_datatypes.NumTabTyp;
5169     l_pjf_init_raw_cost_tab       pa_plsql_datatypes.NumTabTyp;
5170     l_pjf_init_burdened_cost_tab      pa_plsql_datatypes.NumTabTyp;
5171     l_pjf_init_revenue_tab        pa_plsql_datatypes.NumTabTyp;
5172 
5173 BEGIN
5174 
5175         x_return_status := FND_API.G_RET_STS_SUCCESS;
5176     l_return_status := 'S';
5177     x_msg_data := NULL;
5178     g_stage := 'delete_budget_lines:100';
5179     IF p_pa_debug_mode = 'Y' Then
5180             pa_debug.init_err_stack('PA_FP_CALC_PLAN_PKG.delete_budget_lines');
5181         print_msg('Entered PA_FP_CALC_PLAN_PKG.delete_budget_lines ResAssId['||p_resource_assignment_id||']spreadDate['||g_spread_from_date||']');
5182     End If;
5183         l_stage := 7800;
5184         OPEN  get_delete_bl_id ;
5185         FETCH get_delete_bl_id BULK COLLECT INTO
5186                 l_budget_Line_id_tab
5187                 ,l_resource_assignment_id_tab
5188                 ,l_txn_currency_code_tab
5189                 ,l_start_date_tab
5190                 ,l_end_date_tab
5191                 ,l_period_name_tab
5192                 ,l_quantity_tab
5193                 ,l_txn_raw_cost_tab
5194                 ,l_txn_burdened_cost_tab
5195                 ,l_txn_revenue_tab
5196                 ,l_project_raw_cost_tab
5197                 ,l_project_burdened_cost_tab
5198                 ,l_project_revenue_tab
5199                 ,l_projfunc_raw_cost_tab
5200                 ,l_projfunc_burdened_cost_tab
5201                 ,l_projfunc_revenue_tab
5202                 ,l_project_curr_code_tab
5203                 ,l_projfunc_curr_code_tab
5204         ,l_cost_rejection_code_tab
5205                 ,l_revenue_rejection_code_tab
5206                 ,l_burden_rejection_code_tab
5207                 ,l_pfc_cur_conv_rej_code_tab
5208                 ,l_pc_cur_conv_rej_code_tab;
5209         CLOSE get_delete_bl_id;
5210 
5211     --print_msg('Number Of budget Lines to be deleted ['||l_budget_Line_id_tab.COUNT||']');
5212         IF l_budget_Line_id_tab.COUNT > 0 Then --{
5213             FOR i IN l_budget_Line_id_tab.FIRST .. l_budget_Line_id_tab.LAST LOOP
5214             IF NVL(g_rollup_required_flag,'N') = 'Y' Then  --{
5215                 g_stage := 'delete_budget_lines:101';
5216                     --print_msg('Call reporting lines api before deleting the budgetLines');
5217                     -- call reporting api to update these amounts
5218 			/* bug fix:5031388
5219                     IF (l_cost_rejection_code_tab(i) is NULL AND
5220                         l_revenue_rejection_code_tab(i) is NULL AND
5221                         l_burden_rejection_code_tab(i) is NULL AND
5222                         l_pfc_cur_conv_rej_code_tab(i) is NULL AND
5223                         l_pc_cur_conv_rej_code_tab(i) is NULL )  THEN
5224 			*/
5225                         /* update the reporting lines before deleteing the budget lines */
5226                         Add_Toreporting_Tabls
5227                                 (p_calling_module               => 'CALCULATE_API'
5228                                 ,p_activity_code                => 'UPDATE'
5229                                 ,p_budget_version_id            => p_budget_version_id
5230                                 ,p_budget_line_id               => l_budget_Line_id_tab(i)
5231                                 ,p_resource_assignment_id       => l_resource_assignment_id_tab(i)
5232                                 ,p_start_date                   => l_start_date_tab(i)
5233                                 ,p_end_date                     => l_end_date_tab(i)
5234                                 ,p_period_name                  => l_period_name_tab(i)
5235                                 ,p_txn_currency_code            => l_txn_currency_code_tab(i)
5236                                 ,p_quantity                     => l_quantity_tab(i) * -1
5237                                 ,p_txn_raw_cost                 => l_txn_raw_cost_tab(i) * -1
5238                                 ,p_txn_burdened_cost            => l_txn_burdened_cost_tab(i) * -1
5239                                 ,p_txn_revenue                  => l_txn_revenue_tab(i) * -1
5240                                 ,p_project_currency_code        => l_project_curr_code_tab(i)
5241                                 ,p_project_raw_cost             => l_project_raw_cost_tab(i) * -1
5242                                 ,p_project_burdened_cost        => l_project_burdened_cost_tab(i) * -1
5243                                 ,p_project_revenue              => l_project_revenue_tab(i) * -1
5244                                 ,p_projfunc_currency_code       => l_projfunc_curr_code_tab(i)
5245                                 ,p_projfunc_raw_cost            => l_projfunc_raw_cost_tab(i) * -1
5246                                 ,p_projfunc_burdened_cost       => l_projfunc_burdened_cost_tab(i) * -1
5247                                 ,p_projfunc_revenue             => l_projfunc_revenue_tab(i) * -1
5248 				,p_rep_line_mode               => 'REVERSAL'
5249                                 ,x_msg_data                     => x_msg_data
5250                                 ,x_return_status                => l_return_status
5251                                 );
5252                 	/* bug fix:5031388END If;*/
5253             --print_msg('After calling Add_Toreporting_Tabls Api retSts['||l_return_status||']');
5254             If l_return_status <> 'S' Then
5255                     RAISE PJI_EXCEPTION;
5256             END IF;
5257              END IF; --}
5258 
5259         /* MRC enhancement changes */
5260          IF NVL(G_populate_mrc_tab_flag,'N') = 'Y' Then  --{
5261                         /* add the deleted budget lines to mrc plsql tabs */
5262                         Populate_MRC_plsqlTabs
5263                                 (p_calling_module               => 'CALCULATE_API'
5264                                 ,p_budget_version_id            => p_budget_version_id
5265                                 ,p_budget_line_id               => l_budget_Line_id_tab(i)
5266                                 ,p_resource_assignment_id       => l_resource_assignment_id_tab(i)
5267                                 ,p_start_date                   => l_start_date_tab(i)
5268                                 ,p_end_date                     => l_end_date_tab(i)
5269                                 ,p_period_name                  => l_period_name_tab(i)
5270                                 ,p_txn_currency_code            => l_txn_currency_code_tab(i)
5271                                 ,p_quantity                     => l_quantity_tab(i)
5272                                 ,p_txn_raw_cost                 => l_txn_raw_cost_tab(i)
5273                                 ,p_txn_burdened_cost            => l_txn_burdened_cost_tab(i)
5274                                 ,p_txn_revenue                  => l_txn_revenue_tab(i)
5275                                 ,p_project_currency_code        => l_project_curr_code_tab(i)
5276                                 ,p_project_raw_cost             => l_project_raw_cost_tab(i)
5277                                 ,p_project_burdened_cost        => l_project_burdened_cost_tab(i)
5278                                 ,p_project_revenue              => l_project_revenue_tab(i)
5279                                 ,p_projfunc_currency_code       => l_projfunc_curr_code_tab(i)
5280                                 ,p_projfunc_raw_cost            => l_projfunc_raw_cost_tab(i)
5281                                 ,p_projfunc_burdened_cost       => l_projfunc_burdened_cost_tab(i)
5282                                 ,p_projfunc_revenue             => l_projfunc_revenue_tab(i)
5283                 ,p_delete_flag                  => 'Y'
5284                                 ,x_msg_data                     => x_msg_data
5285                                 ,x_return_status                => l_return_status
5286                                 );
5287              END IF; --}
5288           END LOOP;
5289     End If; --}
5290 
5291         l_stage := 7820;
5292     IF NVL(l_return_status,'S') = 'S' Then
5293         IF l_budget_Line_id_tab.COUNT > 0 Then
5294            g_stage := 'delete_budget_lines:102';
5295            --print_msg('7820.1 Deleteing budget lines');
5296                    FORALL i IN l_budget_Line_id_tab.FIRST .. l_budget_Line_id_tab.LAST
5297                DELETE FROM pa_budget_lines bl
5298                WHERE bl.budget_line_id = l_budget_Line_id_tab(i) ;
5299            x_num_rowsdeleted := sql%rowcount;
5300            --print_msg('Num Of Rows Deleted from BdugetLines['||x_num_rowsdeleted||']');
5301         END IF;
5302     End IF;
5303 
5304     IF NVL(l_return_status,'S') = 'S' AND g_spread_from_date is NOT NULL Then  --{
5305             l_stage := 7830;
5306         --print_msg(l_stage||'Make zero ETC on the budget line where etc start date falls');
5307         l_budget_Line_id_tab.delete;
5308                 l_resource_assignment_id_tab.delete;
5309                 l_txn_currency_code_tab.delete;
5310                 l_start_date_tab.delete;
5311                 l_end_date_tab.delete;
5312                 l_period_name_tab.delete;
5313                 l_quantity_tab.delete;
5314                 l_txn_raw_cost_tab.delete;
5315                 l_txn_burdened_cost_tab.delete;
5316                 l_txn_revenue_tab.delete;
5317                 l_project_raw_cost_tab.delete;
5318                 l_project_burdened_cost_tab.delete;
5319                 l_project_revenue_tab.delete;
5320                 l_projfunc_raw_cost_tab.delete;
5321                 l_projfunc_burdened_cost_tab.delete;
5322                 l_projfunc_revenue_tab.delete;
5323                 l_project_curr_code_tab.delete;
5324                 l_projfunc_curr_code_tab.delete;
5325                 l_cost_rejection_code_tab.delete;
5326                 l_revenue_rejection_code_tab.delete;
5327                 l_burden_rejection_code_tab.delete;
5328                 l_pfc_cur_conv_rej_code_tab.delete;
5329                 l_pc_cur_conv_rej_code_tab.delete;
5330                 l_init_quantity_tab.delete;
5331                 l_txn_init_raw_cost_tab.delete;
5332                 l_txn_init_burdened_cost_tab.delete;
5333                 l_txn_init_revenue_tab.delete;
5334         l_pj_init_raw_cost_tab.delete;
5335             l_pj_init_burdened_cost_tab.delete;
5336             l_pj_init_revenue_tab.delete;
5337             l_pjf_init_raw_cost_tab.delete;
5338             l_pjf_init_burdened_cost_tab.delete;
5339             l_pjf_init_revenue_tab.delete;
5340         g_stage := 'delete_budget_lines:103';
5341             OPEN  cur_UpdBlWithZeroEtc;
5342             FETCH cur_UpdBlWithZeroEtc BULK COLLECT INTO
5343                 l_budget_Line_id_tab
5344                 ,l_resource_assignment_id_tab
5345                 ,l_txn_currency_code_tab
5346                 ,l_start_date_tab
5347                 ,l_end_date_tab
5348                 ,l_period_name_tab
5349                 ,l_quantity_tab
5350                 ,l_txn_raw_cost_tab
5351                 ,l_txn_burdened_cost_tab
5352                 ,l_txn_revenue_tab
5353                 ,l_project_raw_cost_tab
5354                 ,l_project_burdened_cost_tab
5355                 ,l_project_revenue_tab
5356                 ,l_projfunc_raw_cost_tab
5357                 ,l_projfunc_burdened_cost_tab
5358                 ,l_projfunc_revenue_tab
5359                 ,l_project_curr_code_tab
5360                 ,l_projfunc_curr_code_tab
5361                 ,l_cost_rejection_code_tab
5362                 ,l_revenue_rejection_code_tab
5363                 ,l_burden_rejection_code_tab
5364                 ,l_pfc_cur_conv_rej_code_tab
5365                 ,l_pc_cur_conv_rej_code_tab
5366         ,l_init_quantity_tab
5367             ,l_txn_init_raw_cost_tab
5368             ,l_txn_init_burdened_cost_tab
5369             ,l_txn_init_revenue_tab
5370         ,l_pj_init_raw_cost_tab
5371                 ,l_pj_init_burdened_cost_tab
5372                 ,l_pj_init_revenue_tab
5373                 ,l_pjf_init_raw_cost_tab
5374                 ,l_pjf_init_burdened_cost_tab
5375                 ,l_pjf_init_revenue_tab;
5376             CLOSE cur_UpdBlWithZeroEtc ;
5377 
5378             --print_msg('Number Of budget Lines to be updated ['||l_budget_Line_id_tab.COUNT||']');
5379             IF l_budget_Line_id_tab.COUNT > 0 Then
5380             IF NVL(g_rollup_required_flag,'N') = 'Y' Then  --{
5381             g_stage := 'delete_budget_lines:104';
5382                     --print_msg('Call reporting lines api before deleting the budgetLines');
5383                     -- call reporting api to update these amounts
5384                     FOR i IN l_budget_Line_id_tab.FIRST .. l_budget_Line_id_tab.LAST LOOP
5385 			/* bug fix:5031388
5386                           IF (l_cost_rejection_code_tab(i) is NULL AND
5387                             l_revenue_rejection_code_tab(i) is NULL AND
5388                             l_burden_rejection_code_tab(i) is NULL AND
5389                             l_pfc_cur_conv_rej_code_tab(i) is NULL AND
5390                             l_pc_cur_conv_rej_code_tab(i) is NULL )  THEN
5391 			  */
5392                             /* update the reporting lines before deleteing the budget lines */
5393                             Add_Toreporting_Tabls
5394                                 (p_calling_module               => 'CALCULATE_API'
5395                                 ,p_activity_code                => 'UPDATE'
5396                                 ,p_budget_version_id            => p_budget_version_id
5397                                 ,p_budget_line_id               => l_budget_Line_id_tab(i)
5398                                 ,p_resource_assignment_id       => l_resource_assignment_id_tab(i)
5399                                 ,p_start_date                   => l_start_date_tab(i)
5400                                 ,p_end_date                     => l_end_date_tab(i)
5401                                 ,p_period_name                  => l_period_name_tab(i)
5402                                 ,p_txn_currency_code            => l_txn_currency_code_tab(i)
5403                                 ,p_quantity                     => l_quantity_tab(i) * -1
5404                                 ,p_txn_raw_cost                 => l_txn_raw_cost_tab(i) * -1
5405                                 ,p_txn_burdened_cost            => l_txn_burdened_cost_tab(i) * -1
5406                                 ,p_txn_revenue                  => l_txn_revenue_tab(i) * -1
5407                                 ,p_project_currency_code        => l_project_curr_code_tab(i)
5408                                 ,p_project_raw_cost             => l_project_raw_cost_tab(i) * -1
5409                                 ,p_project_burdened_cost        => l_project_burdened_cost_tab(i) * -1
5410                                 ,p_project_revenue              => l_project_revenue_tab(i) * -1
5411                                 ,p_projfunc_currency_code       => l_projfunc_curr_code_tab(i)
5412                                 ,p_projfunc_raw_cost            => l_projfunc_raw_cost_tab(i) * -1
5413                                 ,p_projfunc_burdened_cost       => l_projfunc_burdened_cost_tab(i) * -1
5414                                 ,p_projfunc_revenue             => l_projfunc_revenue_tab(i) * -1
5415 				,p_rep_line_mode               => 'REVERSAL'
5416                                 ,x_msg_data                     => x_msg_data
5417                                 ,x_return_status                => l_return_status
5418                                 );
5419                            /* bug fix:5031388END If;*/
5420 
5421                     END LOOP;
5422                     --print_msg('After calling Add_Toreporting_Tabls Api retSts['||l_return_status||']');
5423                     If l_return_status <> 'S' Then
5424                             RAISE PJI_EXCEPTION;
5425                     END IF;
5426            END IF; --}
5427             End If;
5428         If NVL(l_return_status,'S') = 'S' Then
5429           IF l_budget_Line_id_tab.COUNT > 0 Then
5430             g_stage := 'delete_budget_lines:105';
5431             FORALL i IN  l_budget_Line_id_tab.FIRST .. l_budget_Line_id_tab.LAST
5432                 UPDATE pa_budget_lines bl
5433                 SET bl.quantity = l_init_quantity_tab(i)
5434                   ,bl.txn_raw_cost = l_txn_init_raw_cost_tab(i)
5435                   ,bl.txn_burdened_cost = l_txn_init_burdened_cost_tab(i)
5436                   ,bl.txn_revenue = l_txn_init_revenue_tab(i)
5437                   ,bl.project_raw_cost = l_pj_init_raw_cost_tab(i)
5438                           ,bl.project_burdened_cost = l_pj_init_burdened_cost_tab(i)
5439                               ,bl.project_revenue = l_pj_init_revenue_tab(i)
5440                           ,bl.raw_cost = l_pjf_init_raw_cost_tab(i)
5441                           ,bl.burdened_cost = l_pjf_init_burdened_cost_tab(i)
5442                           ,bl.revenue = l_pjf_init_revenue_tab(i)
5443                 WHERE bl.budget_line_id = l_budget_Line_id_tab(i);
5444 
5445             /* Now pass +ve budget line values (Updated values) to PJI reporting api */
5446             l_stage := 7840;
5447                     l_budget_Line_id_tab.delete;
5448                     l_resource_assignment_id_tab.delete;
5449                     l_txn_currency_code_tab.delete;
5450                     l_start_date_tab.delete;
5451                     l_end_date_tab.delete;
5452                     l_period_name_tab.delete;
5453                     l_quantity_tab.delete;
5454                     l_txn_raw_cost_tab.delete;
5455                     l_txn_burdened_cost_tab.delete;
5456                     l_txn_revenue_tab.delete;
5457                     l_project_raw_cost_tab.delete;
5458                     l_project_burdened_cost_tab.delete;
5459                     l_project_revenue_tab.delete;
5460                     l_projfunc_raw_cost_tab.delete;
5461                     l_projfunc_burdened_cost_tab.delete;
5462                     l_projfunc_revenue_tab.delete;
5463                     l_project_curr_code_tab.delete;
5464                     l_projfunc_curr_code_tab.delete;
5465                     l_cost_rejection_code_tab.delete;
5466                     l_revenue_rejection_code_tab.delete;
5467                     l_burden_rejection_code_tab.delete;
5468                     l_pfc_cur_conv_rej_code_tab.delete;
5469                     l_pc_cur_conv_rej_code_tab.delete;
5470                     l_init_quantity_tab.delete;
5471                     l_txn_init_raw_cost_tab.delete;
5472                     l_txn_init_burdened_cost_tab.delete;
5473                     l_txn_init_revenue_tab.delete;
5474                     l_pj_init_raw_cost_tab.delete;
5475                     l_pj_init_burdened_cost_tab.delete;
5476                     l_pj_init_revenue_tab.delete;
5477                     l_pjf_init_raw_cost_tab.delete;
5478                     l_pjf_init_burdened_cost_tab.delete;
5479                     l_pjf_init_revenue_tab.delete;
5480             g_stage := 'delete_budget_lines:106';
5481                     OPEN  cur_UpdBlWithZeroEtc;
5482                     FETCH cur_UpdBlWithZeroEtc BULK COLLECT INTO
5483                     l_budget_Line_id_tab
5484                     ,l_resource_assignment_id_tab
5485                     ,l_txn_currency_code_tab
5486                     ,l_start_date_tab
5487                     ,l_end_date_tab
5488                     ,l_period_name_tab
5489                     ,l_quantity_tab
5490                     ,l_txn_raw_cost_tab
5491                     ,l_txn_burdened_cost_tab
5492                     ,l_txn_revenue_tab
5493                     ,l_project_raw_cost_tab
5494                     ,l_project_burdened_cost_tab
5495                     ,l_project_revenue_tab
5496                     ,l_projfunc_raw_cost_tab
5497                     ,l_projfunc_burdened_cost_tab
5498                     ,l_projfunc_revenue_tab
5499                     ,l_project_curr_code_tab
5500                     ,l_projfunc_curr_code_tab
5501                     ,l_cost_rejection_code_tab
5502                     ,l_revenue_rejection_code_tab
5503                     ,l_burden_rejection_code_tab
5504                     ,l_pfc_cur_conv_rej_code_tab
5505                     ,l_pc_cur_conv_rej_code_tab
5506                     ,l_init_quantity_tab
5507                     ,l_txn_init_raw_cost_tab
5508                     ,l_txn_init_burdened_cost_tab
5509                     ,l_txn_init_revenue_tab
5510                     ,l_pj_init_raw_cost_tab
5511                     ,l_pj_init_burdened_cost_tab
5512                     ,l_pj_init_revenue_tab
5513                     ,l_pjf_init_raw_cost_tab
5514                     ,l_pjf_init_burdened_cost_tab
5515                     ,l_pjf_init_revenue_tab;
5516                     CLOSE cur_UpdBlWithZeroEtc ;
5517 
5518                     --print_msg('Number Of budget Lines to be deleted ['||l_budget_Line_id_tab.COUNT||']');
5519                     IF l_budget_Line_id_tab.COUNT > 0 Then
5520              IF NVL(g_rollup_required_flag,'N') = 'Y' Then  --{
5521                g_stage := 'delete_budget_lines:107';
5522                            --print_msg('Call reporting lines api before deleting the budgetLines');
5523                            -- call reporting api to update these amounts
5524                           FOR i IN l_budget_Line_id_tab.FIRST .. l_budget_Line_id_tab.LAST LOOP
5525 			    /* bug fix:5031388
5526                             IF (l_cost_rejection_code_tab(i) is NULL AND
5527                                 l_revenue_rejection_code_tab(i) is NULL AND
5528                                 l_burden_rejection_code_tab(i) is NULL AND
5529                                 l_pfc_cur_conv_rej_code_tab(i) is NULL AND
5530                                 l_pc_cur_conv_rej_code_tab(i) is NULL )  THEN
5531 				*/
5532                                 /* update the reporting lines after updating the budget lines */
5533                                 Add_Toreporting_Tabls
5534                                 (p_calling_module               => 'CALCULATE_API'
5535                                 ,p_activity_code                => 'UPDATE'
5536                                 ,p_budget_version_id            => p_budget_version_id
5537                                 ,p_budget_line_id               => l_budget_Line_id_tab(i)
5538                                 ,p_resource_assignment_id       => l_resource_assignment_id_tab(i)
5539                                 ,p_start_date                   => l_start_date_tab(i)
5540                                 ,p_end_date                     => l_end_date_tab(i)
5541                                 ,p_period_name                  => l_period_name_tab(i)
5542                                 ,p_txn_currency_code            => l_txn_currency_code_tab(i)
5543                                 ,p_quantity                     => l_quantity_tab(i)
5544                                 ,p_txn_raw_cost                 => l_txn_raw_cost_tab(i)
5545                                 ,p_txn_burdened_cost            => l_txn_burdened_cost_tab(i)
5546                                 ,p_txn_revenue                  => l_txn_revenue_tab(i)
5547                                 ,p_project_currency_code        => l_project_curr_code_tab(i)
5548                                 ,p_project_raw_cost             => l_project_raw_cost_tab(i)
5549                                 ,p_project_burdened_cost        => l_project_burdened_cost_tab(i)
5550                                 ,p_project_revenue              => l_project_revenue_tab(i)
5551                                 ,p_projfunc_currency_code       => l_projfunc_curr_code_tab(i)
5552                                 ,p_projfunc_raw_cost            => l_projfunc_raw_cost_tab(i)
5553                                 ,p_projfunc_burdened_cost       => l_projfunc_burdened_cost_tab(i)
5554                                 ,p_projfunc_revenue             => l_projfunc_revenue_tab(i)
5555 				,p_rep_line_mode               => 'POSITIVE_ENTRY'
5556                                 ,x_msg_data                     => x_msg_data
5557                                 ,x_return_status                => l_return_status
5558                                 );
5559                              /* bug fix:5031388END If;*/
5560                            END LOOP;
5561                            --print_msg('After calling Add_Toreporting_Tabls Api retSts['||l_return_status||']');
5562                            If l_return_status <> 'S' Then
5563                                 RAISE PJI_EXCEPTION;
5564                            END IF;
5565             END IF; --}
5566                      End If;
5567           End If;
5568         End If;
5569     END IF; --}
5570 
5571         IF l_return_status <> 'S' Then
5572                 IF x_msg_data IS NOT NULL THEN
5573                         add_msgto_stack
5574                         ( p_msg_name       => x_msg_data
5575                         ,p_token1         => 'PROJECT'
5576                         ,p_value1         => g_project_name
5577                         ,p_token2         => 'TASK'
5578                         ,p_value2         => g_task_name
5579                         ,p_token3         => 'RESOURCE_NAME'
5580                         ,p_value3         => g_resource_name
5581                         ,p_token4         => 'START_DATE'
5582                         ,p_value4         => p_line_start_date);
5583                 End IF;
5584 
5585         END IF;
5586     x_return_status := l_return_status ;
5587     IF p_pa_debug_mode = 'Y' Then
5588         	print_msg('x_return_status : '||x_return_status);
5589         	print_msg('Leaving delete_budget_lines');
5590             	pa_debug.reset_err_stack;
5591     End If;
5592 
5593   EXCEPTION
5594     WHEN PJI_EXCEPTION THEN
5595         x_return_status := 'E';
5596         x_msg_count := 1;
5597         IF x_msg_data IS NOT NULL THEN
5598                         add_msgto_stack
5599                         ( p_msg_name       => x_msg_data
5600                         ,p_token1         => 'PROJECT'
5601                         ,p_value1         => g_project_name
5602                         ,p_token2         => 'TASK'
5603                         ,p_value2         => g_task_name
5604                         ,p_token3         => 'RESOURCE_NAME'
5605                         ,p_value3         => g_resource_name
5606                         ,p_token4         => 'START_DATE'
5607                         ,p_value4         => p_line_start_date);
5608                 End IF;
5609         IF p_pa_debug_mode = 'Y' Then
5610             pa_debug.reset_err_stack;
5611         End If;
5612         RAISE;
5613 
5614     WHEN OTHERS THEN
5615             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5616         x_msg_count := 1;
5617         x_msg_data := 'Stage['||l_stage||SQLCODE||SQLERRM;
5618             fnd_msg_pub.add_exc_msg
5619             ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
5620                 ,p_procedure_name => 'delete_budget_lines' );
5621         IF p_pa_debug_mode = 'Y' Then
5622                 pa_debug.reset_err_stack;
5623         End If;
5624             RAISE;
5625 END delete_budget_lines;
5626 
5627 
5628 /*
5629 -- PROCEDURE chk_req_rate_api_inputs checks for required parameters before
5630 -- Calling Rate API
5631 -- p_resource_class, p_item_date, and p_uom should be passed as these are mandatory parameters always.
5632 -- IF p_rate_based_flag ='Y' THEN  p_quantity should not be NULL.
5633 -- IF any Override is entered i.e
5634 -- IF p_cost_override_rate ,p_revenue_override_rate, p_raw_cost, p_burden_cost,
5635 --   p_raw_revenue is passed then  must pass p_override_currency_code
5636 */
5637 
5638 PROCEDURE chk_req_rate_api_inputs
5639     (  p_budget_version_id             IN pa_budget_versions.budget_version_id%TYPE
5640           ,p_budget_version_type           IN pa_budget_versions.version_type%TYPE
5641           ,p_person_id                     IN pa_resource_assignments.person_id%TYPE
5642           ,p_job_id                        IN pa_resource_assignments.job_id%TYPE
5643           ,p_resource_class                IN pa_resource_assignments.resource_class_code%TYPE
5644           ,p_rate_based_flag               IN pa_resource_assignments.rate_based_flag%TYPE
5645           ,p_uom                           IN pa_resource_assignments.unit_of_measure%TYPE
5646           ,p_quantity                      IN pa_budget_lines.quantity%TYPE
5647           ,p_item_date                     IN pa_budget_lines.start_date%TYPE
5648           ,p_non_labor_resource            IN pa_resource_assignments.non_labor_resource%TYPE
5649           ,p_expenditure_org_id            IN pa_resource_assignments.rate_expenditure_org_id%TYPE
5650           ,p_nlr_organization_id           IN pa_resource_assignments.organization_id%TYPE
5651           ,p_cost_override_rate            IN pa_fp_res_assignments_tmp.rw_cost_rate_override%TYPE
5652           ,p_revenue_override_rate         IN pa_fp_res_assignments_tmp.bill_rate_override%TYPE
5653           ,p_raw_cost                      IN pa_fp_res_assignments_tmp.txn_raw_cost%TYPE
5654           ,p_burden_cost                   IN pa_fp_res_assignments_tmp.txn_burdened_cost%TYPE
5655           ,p_raw_revenue                   IN pa_fp_res_assignments_tmp.txn_revenue%TYPE
5656           ,p_override_currency_code        IN pa_fp_res_assignments_tmp.txn_currency_code%TYPE
5657           ,x_return_status                 OUT NOCOPY VARCHAR2
5658           ,x_msg_count                     OUT NOCOPY NUMBER
5659           ,x_msg_data                      OUT NOCOPY VARCHAR2
5660           ) IS
5661 
5662     l_debug_mode               VARCHAR2(30);
5663     l_stage                    NUMBER;
5664     l_count                    NUMBER;
5665     l_msg_index_out            NUMBER;
5666     l_return_status            VARCHAR2(30);
5667     l_error_msg_code           Varchar2(100);
5668 BEGIN
5669 
5670         x_return_status := FND_API.G_RET_STS_SUCCESS;
5671     l_return_status := 'S';
5672     IF p_pa_debug_mode = 'Y' Then
5673             pa_debug.init_err_stack('PA_FP_CALC_PLAN_PKG.chk_req_rate_api_inputs');
5674     End If;
5675 
5676     g_stage := 'chk_req_rate_api_inputs:100';
5677         l_stage := 8010;
5678 
5679         IF l_return_status = 'S' AND p_resource_class IS NULL THEN
5680         l_error_msg_code := 'PA_FP_RES_CLS_REQ_RATE_API';
5681                 l_return_status := 'E';
5682         ELSIF p_item_date IS NULL THEN
5683                 l_error_msg_code :=  'PA_FP_ITEM_DT_REQ_RATE_API';
5684                 l_return_status := 'E';
5685         ELSIF p_uom IS NULL THEN
5686                 l_error_msg_code := 'PA_FP_UOM_REQ_RATE_API';
5687                 l_return_status := 'E';
5688         END IF;
5689 
5690 
5691         IF l_return_status = 'S' AND p_rate_based_flag ='Y' THEN
5692             IF p_budget_version_type = 'COST' THEN
5693                 IF p_quantity IS NULL AND
5694                    p_raw_cost IS NULL AND
5695                    p_burden_cost IS NULL  THEN
5696                         l_error_msg_code := 'PA_FP_QTY_REQ_RATE_API';
5697                 l_return_status := 'E';
5698 
5699                 END IF;
5700             ELSIF p_budget_version_type = 'REVENUE' THEN
5701                 IF p_quantity IS NULL AND
5702                    p_raw_revenue IS NULL THEN
5703                         l_error_msg_code := 'PA_FP_QTY_REV_REQ_RATE_API';
5704                                 l_return_status := 'E';
5705             End IF;
5706             ELSIF p_budget_version_type = 'ALL' THEN
5707                 IF p_quantity IS NULL AND
5708                    p_raw_revenue IS NULL AND
5709                    p_raw_cost IS NULL AND
5710                    p_burden_cost IS NULL  THEN
5711                         l_error_msg_code := 'PA_FP_QTY_ALL_REQ_RATE_API';
5712                 l_return_status := 'E';
5713             End If;
5714         END IF;
5715     END IF;
5716 
5717     IF l_return_status <> 'S' Then
5718          If l_error_msg_code is NOT NULL Then
5719         ADD_MSGTO_STACK(
5720           p_msg_name       => l_error_msg_code
5721                   ,p_token1         => 'PROJECT'
5722                   ,p_value1         => g_project_name
5723                   ,p_token2         => 'TASK'
5724                   ,p_value2         => g_task_name
5725                   ,p_token3         => 'RESOURCE_NAME'
5726                   ,p_value3         => g_resource_name);
5727          End If;
5728         END IF;
5729     g_stage := 'chk_req_rate_api_inputs:101';
5730     x_return_status := l_return_status;
5731     IF p_pa_debug_mode = 'Y' Then
5732             pa_debug.reset_err_stack;
5733     End If;
5734 
5735 EXCEPTION
5736     WHEN OTHERS THEN
5737 
5738             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5739             fnd_msg_pub.add_exc_msg
5740             ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
5741                 ,p_procedure_name => 'chk_req_rate_api_inputs' );
5742         IF p_pa_debug_mode = 'Y' Then
5743                 pa_debug.reset_err_stack;
5744         End If;
5745             RAISE;
5746 
5747 END chk_req_rate_api_inputs;
5748 
5749 /*
5750 *This API populates the rollup temp when spread is not required. If spread is called spread API() populates
5751 *the rollup temp table.
5752 */
5753 PROCEDURE populate_rollup_tmp
5754     ( p_budget_version_id              IN  NUMBER
5755           ,x_return_status                 OUT NOCOPY VARCHAR2
5756           ,x_msg_count                     OUT NOCOPY NUMBER
5757           ,x_msg_data                      OUT NOCOPY VARCHAR2) IS
5758 
5759     l_debug_mode        VARCHAR2(30);
5760     l_stage             NUMBER;
5761     l_count             NUMBER;
5762     l_msg_index_out     NUMBER;
5763 BEGIN
5764 
5765         x_return_status := 'S';
5766         l_stage := 2000;
5767     g_stage := 'populate_rollup_tmp:100';
5768     IF p_pa_debug_mode = 'Y' Then
5769             pa_debug.init_err_stack('PA_FP_CALC_PLAN_PKG.populate_rollup_tmp');
5770         	print_msg(to_char(l_stage)||'Entered PA_FP_CALC_PLAN_PKG.populate_rollup_tmp');
5771     End If;
5772 	/*
5773     If P_PA_DEBUG_MODE = 'Y' Then
5774       for i in (select * from pa_fp_spread_calc_tmp ) LOOP
5775        print_msg('IN params ResId['||i.resource_assignment_id||']TxnCur['||i.txn_currency_code||']RefrFlag['||i.refresh_rates_flag||']');
5776        print_msg('RefrConvFlag['||i.refresh_conv_rates_flag||']gSprdFromDt['||g_spread_from_date||']gLnSD['||i.start_date||']');
5777        print_msg('gLineEnDate['||i.end_date||']massAdflag['||i.mass_adjust_flag||']mfcCstFlag['||i.mfc_cost_refresh_flag||']skipFlag['||i.skip_record_flag||']');
5778       end loop;
5779     END IF;
5780 	*/
5781 
5782        INSERT INTO pa_fp_rollup_tmp (
5783     budget_version_id
5784         ,resource_assignment_id
5785        ,start_date
5786        ,end_date
5787        ,period_name
5788        ,quantity
5789        ,projfunc_raw_cost
5790        ,projfunc_burdened_cost
5791        ,projfunc_revenue
5792        ,cost_rejection_code
5793        ,revenue_rejection_code
5794        ,burden_rejection_code
5795        ,projfunc_currency_code
5796        ,projfunc_cost_rate_type
5797        ,projfunc_cost_exchange_rate
5798        ,projfunc_cost_rate_date_type
5799        ,projfunc_cost_rate_date
5800        ,projfunc_rev_rate_type
5801        ,projfunc_rev_exchange_rate
5802        ,projfunc_rev_rate_date_type
5803        ,projfunc_rev_rate_date
5804        ,project_currency_code
5805        ,project_cost_rate_type
5806        ,project_cost_exchange_rate
5807        ,project_cost_rate_date_type
5808        ,project_cost_rate_date
5809        ,project_raw_cost
5810        ,project_burdened_cost
5811        ,project_rev_rate_type
5812        ,project_rev_exchange_rate
5813        ,project_rev_rate_date_type
5814        ,project_rev_rate_date
5815        ,project_revenue
5816        ,txn_currency_code
5817        ,txn_raw_cost
5818        ,txn_burdened_cost
5819        ,txn_revenue
5820        ,budget_line_id
5821        ,init_quantity
5822        ,txn_init_raw_cost
5823        ,txn_init_burdened_cost
5824        ,txn_init_revenue
5825        ,bill_markup_percentage
5826        ,bill_rate
5827        ,cost_rate
5828        ,rw_cost_rate_override
5829        ,burden_cost_rate
5830        ,bill_rate_override
5831        ,burden_cost_rate_override
5832        ,cost_ind_compiled_set_id
5833        ,init_raw_cost
5834        ,init_burdened_cost
5835        ,init_revenue
5836        ,project_init_raw_cost
5837        ,project_init_burdened_cost
5838        ,project_init_revenue
5839        ,billable_flag
5840        ,rate_based_flag
5841        ,system_reference4  -- version all revenue only entered
5842        )
5843        ( SELECT /*+ INDEX(BL PA_BUDGET_LINES_U1) */
5844     bl.budget_version_id
5845         ,bl.resource_assignment_id
5846        ,bl.start_date
5847        ,bl.end_date
5848        ,bl.period_name
5849        ,bl.quantity
5850         /* Bug Fix 4332086
5851            When ever currency is overridden in the workplan flow the exchange rates of old currency
5852            are used to derive the PFC amounts.
5853            This is happening due to the following piece of code.
5854            In the following code we are storing the pa_budget_lines attributes in pa_fp_rollup_tmp
5855            and then we are using the same in the later part of the code.
5856            This is resulting in the bug.
5857 
5858            As a fix now we added another decode condition to see if the currency is iverridden.
5859            If it is then we nullify all the currency related attributes, so they can be retrieved
5860            for the latest currency instead of caching the old currency's attrs.
5861         */
5862        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5863        ,decode(ra.rate_based_flag,'N',bl.raw_cost
5864         ,decode(tmp.refresh_rates_flag,'Y',decode(bl.quantity,null,bl.raw_cost,NULL)
5865                 ,'C',decode(bl.quantity,null,bl.raw_cost,NULL)
5866                 ,'R',bl.raw_cost
5867                     ,bl.raw_cost
5868             )
5869           ),NULL)
5870        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5871        ,decode(ra.rate_based_flag,'N',bl.burdened_cost
5872         ,decode(tmp.refresh_rates_flag,'Y',decode(bl.quantity,null,bl.burdened_cost,NULL)
5873             ,'C',decode(bl.quantity,null,bl.burdened_cost,NULL)
5874             ,'R',bl.burdened_cost
5875             ,bl.burdened_cost
5876             )
5877           ),NULL)
5878        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5879        ,decode(ra.rate_based_flag,'N',bl.revenue
5880         ,decode(tmp.refresh_rates_flag,'Y',decode(bl.quantity,null,bl.revenue,NULL)
5881                 ,'C',bl.revenue
5882                 ,'R',decode(bl.quantity,null,bl.revenue,NULL)
5883                 ,bl.revenue
5884             )
5885           ),NULL)
5886        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5887        ,decode(tmp.refresh_rates_flag,'Y' ,decode(bl.quantity,null,bl.cost_rejection_code,NULL)
5888             ,'C',decode(bl.quantity,null,bl.cost_rejection_code,NULL)
5889             ,'R',bl.cost_rejection_code
5890         ,bl.cost_rejection_code
5891           ),NULL)
5892        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5893        ,decode(tmp.refresh_rates_flag,'Y',decode(bl.quantity,null,bl.revenue_rejection_code,NULL)
5894             ,'C',bl.revenue_rejection_code
5895             ,'R',decode(bl.quantity,null,bl.revenue_rejection_code,NULL)
5896         ,bl.revenue_rejection_code
5897           ),NULL)
5898        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5899        ,decode(tmp.refresh_rates_flag,'Y' ,decode(bl.quantity,null,bl.burden_rejection_code,NULL)
5900             ,'C',decode(bl.quantity,null,bl.burden_rejection_code,NULL)
5901             ,'R',bl.burden_rejection_code
5902         ,bl.burden_rejection_code
5903           ),NULL)
5904        ,bl.projfunc_currency_code
5905        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5906        ,decode(tmp.refresh_conv_rates_flag,'Y'
5907         ,decode(g_source_context,'BUDGET_LINE',bl.projfunc_cost_rate_type,NULL),bl.projfunc_cost_rate_type),NULL)
5908        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5909        ,decode(tmp.refresh_conv_rates_flag,'Y'
5910         ,decode(g_source_context,'BUDGET_LINE',bl.projfunc_cost_exchange_rate,NULL),bl.projfunc_cost_exchange_rate),NULL)
5911        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5912        ,decode(tmp.refresh_conv_rates_flag,'Y'
5913         ,decode(g_source_context,'BUDGET_LINE',bl.projfunc_cost_rate_date_type,NULL),bl.projfunc_cost_rate_date_type),NULL)
5914        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5915        ,decode(tmp.refresh_conv_rates_flag,'Y'
5916         ,decode(g_source_context,'BUDGET_LINE',bl.projfunc_cost_rate_date,NULL),bl.projfunc_cost_rate_date),NULL)
5917        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5918        ,decode(tmp.refresh_conv_rates_flag,'Y'
5919         ,decode(g_source_context,'BUDGET_LINE',bl.projfunc_rev_rate_type,NULL),bl.projfunc_rev_rate_type),NULL)
5920        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5921        ,decode(tmp.refresh_conv_rates_flag,'Y'
5922         ,decode(g_source_context,'BUDGET_LINE',bl.projfunc_rev_exchange_rate,NULL),bl.projfunc_rev_exchange_rate),NULL)
5923        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5924        ,decode(tmp.refresh_conv_rates_flag,'Y'
5925         ,decode(g_source_context,'BUDGET_LINE',bl.projfunc_rev_rate_date_type,NULL),bl.projfunc_rev_rate_date_type),NULL)
5926        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5927        ,decode(tmp.refresh_conv_rates_flag,'Y'
5928         ,decode(g_source_context,'BUDGET_LINE',bl.projfunc_rev_rate_date,NULL),bl.projfunc_rev_rate_date),NULL)
5929        ,bl.project_currency_code
5930        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5931        ,decode(tmp.refresh_conv_rates_flag,'Y'
5932         ,decode(g_source_context,'BUDGET_LINE',bl.project_cost_rate_type,NULL),bl.project_cost_rate_type),NULL)
5933        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5934        ,decode(tmp.refresh_conv_rates_flag,'Y'
5935         ,decode(g_source_context,'BUDGET_LINE',bl.project_cost_exchange_rate,NULL),bl.project_cost_exchange_rate),NULL)
5936        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5937        ,decode(tmp.refresh_conv_rates_flag,'Y'
5938         ,decode(g_source_context,'BUDGET_LINE',bl.project_cost_rate_date_type,NULL),bl.project_cost_rate_date_type),NULL)
5939        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5940        ,decode(tmp.refresh_conv_rates_flag,'Y'
5941         ,decode(g_source_context,'BUDGET_LINE',bl.project_cost_rate_date,NULL),bl.project_cost_rate_date),NULL)
5942        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5943        ,decode(ra.rate_based_flag,'N',bl.project_raw_cost
5944         ,decode(tmp.refresh_rates_flag,'Y',decode(bl.quantity,null,bl.project_raw_cost,NULL)
5945                 ,'C',decode(bl.quantity,null,bl.project_raw_cost,NULL)
5946                 ,'R',bl.project_raw_cost
5947             ,bl.project_raw_cost
5948             )
5949             ),NULL)
5950        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5951        ,decode(ra.rate_based_flag,'N',bl.project_burdened_cost
5952         ,decode(tmp.refresh_rates_flag,'Y',decode(bl.quantity,null,bl.project_burdened_cost,NULL)
5953                 ,'C',decode(bl.quantity,null,bl.project_burdened_cost,NULL)
5954                 ,'R',bl.project_burdened_cost
5955             ,bl.project_burdened_cost
5956             )
5957             ),NULL)
5958        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5959        ,decode(tmp.refresh_conv_rates_flag,'Y'
5960         ,decode(g_source_context,'BUDGET_LINE',bl.project_rev_rate_type,NULL),bl.project_rev_rate_type),NULL)
5961        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5962        ,decode(tmp.refresh_conv_rates_flag,'Y'
5963         ,decode(g_source_context,'BUDGET_LINE',bl.project_rev_exchange_rate,NULL),bl.project_rev_exchange_rate),NULL)
5964        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5965        ,decode(tmp.refresh_conv_rates_flag,'Y'
5966         ,decode(g_source_context,'BUDGET_LINE',bl.project_rev_rate_date_type,NULL),bl.project_rev_rate_date_type),NULL)
5967        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5968        ,decode(tmp.refresh_conv_rates_flag,'Y'
5969         ,decode(g_source_context,'BUDGET_LINE',bl.project_rev_rate_date,NULL),bl.project_rev_rate_date),NULL)
5970        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5971        ,decode(ra.rate_based_flag,'N',bl.project_revenue
5972         ,decode(tmp.refresh_rates_flag,'Y',decode(bl.quantity,null,bl.project_revenue,NULL)
5973                 ,'C',bl.project_revenue
5974                 ,'R',decode(bl.quantity,null,bl.project_revenue,NULL)
5975             ,bl.project_revenue
5976                )
5977           ),NULL)
5978        ,bl.txn_currency_code
5979        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5980        ,decode(ra.rate_based_flag,'N',bl.txn_raw_cost
5981         ,decode(tmp.refresh_rates_flag,'Y',decode(bl.quantity,null,bl.txn_raw_cost,NULL)
5982                 ,'C',decode(bl.quantity,null,bl.txn_raw_cost,NULL)
5983                 ,'R',bl.txn_raw_cost
5984             ,bl.txn_raw_cost
5985             )
5986         ),NULL)
5987        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5988        ,decode(ra.rate_based_flag,'N',bl.txn_burdened_cost
5989         ,decode(tmp.refresh_rates_flag,'Y',decode(bl.quantity,null,bl.txn_burdened_cost,NULL)
5990                 ,'C',decode(bl.quantity,null,bl.txn_burdened_cost,NULL)
5991                 ,'R',bl.txn_burdened_cost
5992             ,bl.txn_burdened_cost
5993             )
5994         ),NULL)
5995        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
5996        ,decode(ra.rate_based_flag,'N',bl.txn_revenue
5997         ,decode(tmp.refresh_rates_flag,'Y',decode(bl.quantity,null,bl.txn_revenue,NULL)
5998                 ,'C',bl.txn_revenue
5999                 ,'R',decode(bl.quantity,null,bl.txn_revenue,NULL)
6000             ,bl.txn_revenue
6001                )
6002         ),NULL)
6003        ,bl.budget_line_id
6004        ,bl.init_quantity
6005        ,bl.txn_init_raw_cost
6006        ,bl.txn_init_burdened_cost
6007        ,bl.txn_init_revenue
6008        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
6009        ,decode(NVL(tmp.billable_flag,'N'),'N',bl.txn_markup_percent /* Added for billablity enhancements */
6010        ,decode(tmp.refresh_rates_flag,'Y'
6011                 /*Bug fix: 4294287 Starts ,decode(bl.quantity,null,bl.txn_markup_percent,NULL) */
6012                  ,decode(g_fp_budget_version_type ,'REVENUE'
6013                                     ,decode(NVL(bl.txn_markup_percent,0),0,decode(bl.quantity,null,bl.txn_markup_percent,NULL)
6014                        ,bl.txn_markup_percent),decode(bl.quantity,null,bl.txn_markup_percent,NULL))
6015                 /* Bug fix: 4294287 ends */
6016             ,'C',bl.txn_markup_percent
6017             ,'R'/*Bug fix: 4294287 Starts ,decode(bl.quantity,null,bl.txn_markup_percent,NULL) */
6018                  ,decode(g_fp_budget_version_type ,'REVENUE'
6019                                     ,decode(NVL(bl.txn_markup_percent,0),0,decode(bl.quantity,null,bl.txn_markup_percent,NULL)
6020                                       ,bl.txn_markup_percent),decode(bl.quantity,null,bl.txn_markup_percent,NULL))
6021                               /* Bug fix: 4294287 ends */
6022             ,bl.txn_markup_percent
6023         )),NULL)
6024        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
6025        ,decode(ra.rate_based_flag,'N',bl.txn_standard_bill_rate
6026         ,decode(tmp.refresh_rates_flag,'Y',decode(bl.quantity,null,bl.txn_standard_bill_rate,NULL)
6027                 ,'C',bl.txn_standard_bill_rate
6028                 ,'R',decode(bl.quantity,null,bl.txn_standard_bill_rate,NULL)
6029                 ,bl.txn_standard_bill_rate
6030             )
6031         ),NULL)
6032        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
6033        ,decode(ra.rate_based_flag,'N',bl.txn_standard_cost_rate
6034         ,decode(tmp.refresh_rates_flag,'Y',decode(bl.quantity,null,bl.txn_standard_cost_rate,NULL)
6035                 ,'C',decode(bl.quantity,null,bl.txn_standard_cost_rate,NULL)
6036                 ,'R',bl.txn_standard_cost_rate
6037                 ,bl.txn_standard_cost_rate
6038             )
6039         ),NULL)
6040        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
6041        ,decode(ra.rate_based_flag,'N',bl.txn_cost_rate_override
6042         ,decode(tmp.refresh_rates_flag,'Y',decode(bl.quantity,null,bl.txn_cost_rate_override,NULL)
6043                 ,'C',decode(bl.quantity,null,bl.txn_cost_rate_override,NULL)
6044                 ,'R',bl.txn_cost_rate_override
6045                 ,bl.txn_cost_rate_override
6046             )
6047         ),NULL)
6048        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
6049        ,decode(ra.rate_based_flag,'N',bl.burden_cost_rate
6050         ,decode(tmp.refresh_rates_flag,'Y',decode(bl.quantity,null,bl.burden_cost_rate,NULL)
6051                 ,'C',decode(bl.quantity,null,bl.burden_cost_rate,NULL)
6052                 ,'R',bl.burden_cost_rate
6053                 ,bl.burden_cost_rate
6054             )
6055         ),NULL)
6056        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
6057        ,decode(NVL(tmp.billable_flag,'N'),'N',bl.txn_bill_rate_override /* Added for billablity enhancements */
6058      	  ,decode(ra.rate_based_flag,'N',
6059                /*Bug:5056986 */
6060                 decode(g_fp_budget_version_type,'ALL'
6061                 	,decode(tmp.refresh_rates_flag,'Y',decode(bl.txn_cost_rate_override,0,bl.txn_bill_rate_override,NULL)
6062 					,'R',decode(bl.txn_cost_rate_override,0,bl.txn_bill_rate_override,NULL)
6063 					, bl.txn_bill_rate_override),bl.txn_bill_rate_override)
6064            ,decode(tmp.refresh_rates_flag,'Y' /*Bug fix: 4294287 Starts decode(bl.quantity,null,bl.txn_bill_rate_override,NULL)*/
6065                     ,decode(g_fp_budget_version_type ,'REVENUE'
6066                         ,decode(NVL(bl.txn_markup_percent,0),0,decode(bl.quantity,null,bl.txn_bill_rate_override,NULL)
6067                           ,bl.txn_bill_rate_override),decode(bl.quantity,null,bl.txn_bill_rate_override,NULL))
6068                         /*end bug fix:4294287*/
6069                 ,'C',bl.txn_bill_rate_override
6070                 ,'R' /*Bug fix: 4294287 Starts,decode(bl.quantity,null,bl.txn_bill_rate_override,NULL) */
6071                     ,decode(g_fp_budget_version_type ,'REVENUE'
6072                                                 ,decode(NVL(bl.txn_markup_percent,0),0,decode(bl.quantity,null,bl.txn_bill_rate_override,NULL)
6073                                                   ,bl.txn_bill_rate_override),decode(bl.quantity,null,bl.txn_bill_rate_override,NULL))
6074                      /*end bug fix:4294287*/
6075                 ,bl.txn_bill_rate_override
6076             )
6077         )),NULL)
6078         /** Bug fix:4119950 reverted back the changes made for if raw cost = burden cost then retain burden overrides
6079      --for non-rate base, if raw cost = burden cost then retain the burden overrides
6080 
6081        ,decode(tmp.refresh_rates_flag,'Y',decode(bl.quantity,null,bl.burden_cost_rate_override
6082                ,decode(ra.rate_based_flag,'Y',NULL,decode(bl.txn_raw_cost,bl.txn_burdened_cost,bl.burden_cost_rate_override,NULL)))
6083         ,'C',decode(bl.quantity,null,bl.burden_cost_rate_override
6084                        ,decode(ra.rate_based_flag,'Y',NULL,decode(bl.txn_raw_cost,bl.txn_burdened_cost,bl.burden_cost_rate_override,NULL)))
6085         ,'R',bl.burden_cost_rate_override
6086         ,bl.burden_cost_rate_override
6087           )
6088        ,decode(tmp.refresh_rates_flag,'Y',decode(bl.quantity,null,bl.cost_ind_compiled_set_id
6089             ,decode(ra.rate_based_flag,'Y',NULL,decode(bl.txn_raw_cost,bl.txn_burdened_cost,bl.cost_ind_compiled_set_id,NULL)))
6090          ,'C',decode(bl.quantity,null,bl.cost_ind_compiled_set_id
6091                         ,decode(ra.rate_based_flag,'Y',NULL,decode(bl.txn_raw_cost,bl.txn_burdened_cost,bl.cost_ind_compiled_set_id,NULL)))
6092          ,'R',bl.cost_ind_compiled_set_id
6093          ,bl.cost_ind_compiled_set_id
6094         )
6095     **/
6096     /* Added this for Bug fix:4119950 Refresh burden rate override always
6097     Note: If user enters a burden cost only, then on refresh user entered burden cost will be lost.  This is acceptable
6098     as compared to bug 4119950 not refreshing the burden cost at all
6099     */
6100        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
6101        ,decode(tmp.refresh_rates_flag,'Y',decode(bl.quantity,null,bl.burden_cost_rate_override,NULL)
6102                 ,'C',decode(bl.quantity,null,bl.burden_cost_rate_override,NULL)
6103                 ,'R',bl.burden_cost_rate_override
6104                 ,bl.burden_cost_rate_override
6105               ),NULL)
6106        ,DECODE(tmp.TXN_CURR_CODE_OVERRIDE,NULL
6107        ,decode(tmp.refresh_rates_flag,'Y',decode(bl.quantity,null,bl.cost_ind_compiled_set_id,NULL)
6108                  ,'C',decode(bl.quantity,null,bl.cost_ind_compiled_set_id,NULL)
6109                  ,'R',bl.cost_ind_compiled_set_id
6110                  ,bl.cost_ind_compiled_set_id
6111                 ),NULL)
6112        ,bl.init_raw_cost
6113        ,bl.init_burdened_cost
6114        ,bl.init_revenue
6115        ,bl.project_init_raw_cost
6116        ,bl.project_init_burdened_cost
6117        ,bl.project_init_revenue
6118        ,tmp.billable_flag
6119     /* bug fix:4657962 */
6120     ,NVL(ra.rate_based_flag,'N')
6121 	,decode(g_mass_adjust_flag,'N','N'
6122 		,decode(NVL(g_wp_version_flag,'N'),'Y','N'
6123 		     ,decode(nvl(ra.rate_based_flag,'N'),'Y','N'
6124 			 ,'N',decode(bl.txn_cost_rate_override,0,'Y','N'))))
6125        FROM pa_budget_lines bl
6126            ,pa_resource_assignments ra
6127        ,pa_fp_spread_calc_tmp tmp
6128        WHERE tmp.budget_version_id = p_budget_version_id
6129     AND (NVL(tmp.refresh_rates_flag,'N') in ('Y','R','C')
6130         OR NVL(tmp.refresh_conv_rates_flag,'N') = 'Y'
6131         OR NVL(tmp.mass_adjust_flag,'N') = 'Y'
6132         OR NVL(tmp.mfc_cost_refresh_flag,'N') = 'Y'
6133         OR NVL(tmp.ra_rates_only_change_flag,'N') = 'Y'
6134         OR NVL(tmp.system_reference_var2,'N') = 'Y'  /* Bug fix:4295967 to populate rollupt tmp in apply progress mode*/
6135        )
6136     AND NVL(tmp.skip_record_flag,'N') <> 'Y'
6137     AND tmp.resource_assignment_id = ra.resource_assignment_id
6138         AND bl.resource_assignment_id = ra.resource_assignment_id
6139         AND bl.txn_currency_code      = tmp.txn_currency_code
6140         AND ((g_spread_from_date IS NULL)
6141            OR (g_spread_from_date IS NOT NULL
6142                    AND ((bl.start_date > g_spread_from_date )
6143                         OR (g_spread_from_date between bl.start_date and bl.end_date)
6144                        )
6145               )
6146         )
6147         AND ( (g_source_context <> 'BUDGET_LINE' )
6148         OR
6149         (g_source_context = 'BUDGET_LINE'
6150          AND tmp.start_date IS NOT NULL AND tmp.end_date IS NOT NULL
6151                  AND bl.start_date BETWEEN tmp.start_date AND tmp.end_date
6152             )
6153          )
6154     );
6155     g_stage := 'populate_rollup_tmp:101: Number of rows Inserted['||sql%rowcount||']';
6156     /* Now update rollup tmp override with any override rates passed along with currency code overrides */
6157     IF (NVL(g_refresh_rates_flag,'N') = 'N'
6158         AND NVL(g_mass_adjust_flag,'N') = 'N'
6159         AND NVL(g_refresh_conv_rates_flag,'N') = 'N'
6160         AND g_applyProg_RaId_tab.COUNT = 0 ) Then
6161        g_stage := 'populate_rollup_tmp:102';
6162        UPDATE /*+ INDEX(TMP PA_FP_ROLLUP_TMP_N1) */ pa_fp_rollup_tmp tmp
6163        SET (tmp.rw_cost_rate_override
6164         ,tmp.burden_cost_rate_override
6165         ,tmp.bill_rate_override) =
6166         (SELECT  decode(caltmp.txn_curr_code_override,NULL,decode(caltmp.mfc_cost_change_flag,'Y',caltmp.cost_rate_override
6167                         ,tmp.rw_cost_rate_override),caltmp.cost_rate_override)
6168             ,decode(caltmp.txn_curr_code_override,NULL,decode(caltmp.mfc_cost_change_flag,'Y',caltmp.burden_cost_rate_override
6169                         ,tmp.burden_cost_rate_override),caltmp.burden_cost_rate_override)
6170             ,decode(caltmp.txn_curr_code_override,NULL,decode(caltmp.mfc_cost_change_flag,'Y',caltmp.bill_rate_override
6171                         ,tmp.bill_rate_override),caltmp.bill_rate_override)
6172         FROM pa_fp_spread_calc_tmp caltmp
6173         WHERE caltmp.budget_version_id = tmp.budget_version_id
6174         AND   caltmp.resource_assignment_id = tmp.resource_assignment_id
6175         AND   caltmp.txn_currency_code = tmp.txn_currency_code
6176         AND   NVL(caltmp.skip_record_flag,'N') <> 'Y'
6177         AND  (NVL(g_refresh_rates_flag,'N') = 'N'
6178                     AND NVL(caltmp.refresh_conv_rates_flag,'N') = 'N'
6179                     AND NVL(caltmp.mass_adjust_flag,'N') = 'N'
6180                     AND NVL(caltmp.mfc_cost_refresh_flag,'N') = 'Y'
6181                  ))
6182        WHERE tmp.budget_version_id = p_budget_version_id
6183        AND EXISTS ( select null
6184             FROM pa_fp_spread_calc_tmp caltmp
6185                     WHERE caltmp.budget_version_id = tmp.budget_version_id
6186                     AND   caltmp.resource_assignment_id = tmp.resource_assignment_id
6187                     AND   caltmp.txn_currency_code = tmp.txn_currency_code
6188                     AND   NVL(caltmp.skip_record_flag,'N') <> 'Y'
6189                     AND  (NVL(g_refresh_rates_flag,'N') = 'N'
6190                             AND NVL(caltmp.refresh_conv_rates_flag,'N') = 'N'
6191                             AND NVL(caltmp.mass_adjust_flag,'N') = 'N'
6192                             AND NVL(caltmp.mfc_cost_refresh_flag,'N') = 'Y'
6193                         ));
6194 	If p_pa_debug_mode = 'Y' Then
6195         print_msg('Updating rollup tmp with rate overrides for mfc cost refresh['||sql%rowcount||']');
6196 	End If;
6197 
6198     END IF;
6199 
6200     /* If only rates are changed then update the changed override rates on rollup tmp and avoid calling spread
6201      * and call rate api
6202      */
6203     IF g_rtChanged_RaId_tab.COUNT > 0 Then
6204         g_stage := 'populate_rollup_tmp:103';
6205 	If P_PA_DEBUG_MODE = 'Y' Then
6206         print_msg('Updating rollup with rate overrides ');
6207 	End If;
6208         FORALL i IN g_rtChanged_RaId_tab.FIRST .. g_rtChanged_RaId_tab.LAST
6209         UPDATE /*+ INDEX(TMP PA_FP_ROLLUP_TMP_N1) */ pa_fp_rollup_tmp tmp
6210         SET (tmp.rw_cost_rate_override
6211 	    ,tmp.burden_cost_rate_override
6212 	    ,tmp.bill_rate_override ) =
6213 		  (SELECT   decode(NVL(g_rtChanged_cstMisNumFlg_tab(i),'N'),'Y',NULL
6214                             ,NVL(g_rtChanged_CostRt_Tab(i),tmp.rw_cost_rate_override))
6215                     ,decode(NVL(g_rtChanged_bdMisNumFlag_tab(i),'N'),'Y',NULL
6216                             ,decode(tmp.rate_based_flag,'Y',NVL(g_rtChanged_BurdRt_tab(i),tmp.burden_cost_rate_override)
6217 			      ,decode(g_fp_budget_version_type,'ALL'
6218 				,decode(caltmp.burden_cost_changed_flag,'Y',NVL(g_rtChanged_BurdRt_tab(i),tmp.burden_cost_rate_override)
6219 				   ,decode(caltmp.raw_cost_changed_flag,'Y'
6220 					,decode(tmp.rw_cost_rate_override,NULL,tmp.burden_cost_rate_override
6221 					  ,0,NVL(g_rtChanged_BurdRt_tab(i),tmp.burden_cost_rate_override), tmp.burden_cost_rate_override)
6222 						,NVL(g_rtChanged_BurdRt_tab(i),tmp.burden_cost_rate_override)))
6223 				 ,NVL(g_rtChanged_BurdRt_tab(i),tmp.burden_cost_rate_override))))
6224                     ,decode(NVL(g_rtChanged_blMisNumFlag_tab(i),'N'),'Y',NULL
6225                             ,NVL(g_rtChanged_billRt_tab(i),tmp.bill_rate_override))
6226 		  FROM pa_fp_spread_calc_tmp caltmp
6227 		  WHERE caltmp.resource_assignment_id = tmp.resource_assignment_id
6228 		  AND   caltmp.txn_currency_code = tmp.txn_currency_code
6229 		  AND   ((g_source_context <> 'BUDGET_LINE')
6230               		OR
6231             		 ((g_source_context = 'BUDGET_LINE')
6232              		  and tmp.start_date BETWEEN caltmp.start_date and caltmp.end_date)
6233 			)
6234 		)
6235         WHERE tmp.budget_version_id = p_budget_version_id
6236         AND   tmp.resource_assignment_id = g_rtChanged_RaId_tab(i)
6237         AND   tmp.txn_currency_code = g_rtChanged_TxnCur_tab(i)
6238         AND   ((g_source_context <> 'BUDGET_LINE')
6239               OR
6240             ((g_source_context = 'BUDGET_LINE')
6241              and tmp.start_date IS NOT NULL
6242              and tmp.start_date BETWEEN g_rtChanged_sDate_tab(i) AND g_rtChanged_eDate_tab(i)
6243             )
6244               );
6245 	If P_PA_DEBUG_MODE = 'Y' Then
6246         print_msg('Number of rows updated for RateChanges['||sql%rowcount||']');
6247 	End If;
6248     END IF;
6249 
6250 	/**
6251     If P_PA_DEBUG_MODE = 'Y' Then
6252             l_stage := 2019;
6253             SELECT count(*)
6254             INTO l_count
6255             FROM pa_fp_rollup_tmp ;
6256         	g_stage := 'populate_rollup_tmp:104';
6257             print_msg('Num of rows inserted into rollup Temp['||l_count||']');
6258 	print_rlTmp_Values;
6259     End If;
6260 	**/
6261       x_return_status := 'S';
6262     IF p_pa_debug_mode = 'Y' Then
6263       	print_msg('x_return_status : '||x_return_status);
6264       	print_msg('Leaving populate_rollup_tmp');
6265        	pa_debug.reset_err_stack;
6266     End If;
6267 EXCEPTION
6268     WHEN OTHERS THEN
6269             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6270         x_msg_data := sqlcode||sqlerrm;
6271             fnd_msg_pub.add_exc_msg
6272             ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
6273                 ,p_procedure_name => 'populate_rollup_tmp' );
6274             l_stage := 2120;
6275             print_msg(to_char(l_stage)||' substr(SQLERRM,1,240) => '|| substr(SQLERRM,1,240));
6276         IF p_pa_debug_mode = 'Y' Then
6277                 pa_debug.reset_err_stack;
6278         End If;
6279             RAISE;
6280 
6281 END populate_rollup_tmp;
6282 
6283 /* bug fix:4657962 : This API is created to improve the mass adjust performance and rounding issues encountered during the
6284  * multiple assignment mass adjust of quantities
6285  * IPM changes: This api is modified for adjustment of rawcost, burdened cost and revenue in addition
6286  * to quantity and rates.
6287  * Rate-Base Resource: quantity, rates and amounts can be adjusted. adjusting amounts derives override rates
6288  * Non-Rate base resource: Only amounts can be adjusted.
6289  */
6290 
6291 PROCEDURE mass_adjust_new
6292     ( p_budget_version_id             IN  NUMBER
6293          ,p_quantity_adj_pct          IN  NUMBER   := NULL
6294          ,p_cost_rate_adj_pct         IN  NUMBER   := NULL
6295          ,p_burdened_rate_adj_pct     IN  NUMBER   := NULL
6296          ,p_bill_rate_adj_pct         IN  NUMBER   := NULL
6297 	 ,p_raw_cost_adj_pct          IN  NUMBER   := NULL
6298          ,p_burden_cost_adj_pct       IN  NUMBER   := NULL
6299          ,p_revenue_adj_pct           IN  NUMBER   := NULL
6300          ,x_return_status             OUT NOCOPY VARCHAR2
6301          ,x_msg_count                 OUT NOCOPY VARCHAR2
6302          ,x_msg_data                  OUT NOCOPY VARCHAR2
6303          ) IS
6304 
6305     	l_quantity_adj_pct          NUMBER := p_quantity_adj_pct;
6306         l_cost_rate_adj_pct         NUMBER := p_cost_rate_adj_pct;
6307         l_burdened_rate_adj_pct     NUMBER := p_burdened_rate_adj_pct;
6308         l_bill_rate_adj_pct         NUMBER := p_bill_rate_adj_pct;
6309 	l_raw_cost_adj_pct          NUMBER := p_raw_cost_adj_pct;
6310         l_burden_cost_adj_pct       NUMBER := p_burden_cost_adj_pct;
6311         l_revenue_adj_pct           NUMBER := p_revenue_adj_pct;
6312 
6313     	/* declare local plsqltabs for bulk processing */
6314         l_quantity_new_tab              pa_plsql_datatypes.NumTabTyp;
6315         l_quantity_old_tab              pa_plsql_datatypes.NumTabTyp;
6316         l_quantity_diff_tab             pa_plsql_datatypes.NumTabTyp;
6317     	l_raId_tab          		pa_plsql_datatypes.NumTabTyp;
6318     	l_blId_tab          		pa_plsql_datatypes.NumTabTyp;
6319     	l_txn_cur_tab           	pa_plsql_datatypes.Char30TabTyp;
6320     	l_sdate_tab         		pa_plsql_datatypes.DateTabTyp;
6321     	l_ratebase_tab          	pa_plsql_datatypes.Char10TabTyp;
6322 	l_rawCost_new_tab              pa_plsql_datatypes.NumTabTyp;
6323         l_rawcost_old_tab              pa_plsql_datatypes.NumTabTyp;
6324         l_rawcost_diff_tab             pa_plsql_datatypes.NumTabTyp;
6325 	l_revenue_new_tab              pa_plsql_datatypes.NumTabTyp;
6326         l_revenue_old_tab              pa_plsql_datatypes.NumTabTyp;
6327         l_revenue_diff_tab             pa_plsql_datatypes.NumTabTyp;
6328 
6329     	CURSOR cur_rndQty IS
6330         SELECT tmp.resource_assignment_id
6331             ,tmp.txn_currency_code
6332             ,max(tmp.start_date)
6333             ,MAX(tmp.budget_line_id)
6334             ,NVL(tmp.rate_based_flag,'N') rate_based_flag
6335             ,decode(g_wp_version_flag,'Y',(sum(nvl(tmp.old_quantity,0) - nvl(tmp.init_quantity,0)) * ((l_quantity_adj_pct + 100)/100))
6336 		, decode(NVL(tmp.rate_based_flag,'N'),'N',0
6337 			,((sum(nvl(tmp.old_quantity,0) - nvl(tmp.init_quantity,0)) * ((l_quantity_adj_pct + 100)/100))))) unRndOldQty
6338             ,decode(g_wp_version_flag,'Y',(sum(nvl(tmp.quantity,0) - nvl(tmp.init_quantity,0)))
6339 		,decode(NVL(tmp.rate_based_flag,'N'),'N',0,(sum(nvl(tmp.quantity,0) - nvl(tmp.init_quantity,0))))) RndNewQty
6340             ,to_number(null) Quantity_diff
6341 	    /* amount adjustments is allowed only for financial side */
6342 	    ,decode(g_wp_version_flag,'Y',0
6343 		,decode(NVL(tmp.rate_based_flag,'N'),'Y',0
6344 		  ,((sum(nvl(tmp.old_txn_raw_cost,0) - nvl(tmp.txn_init_raw_cost,0)) * ((l_raw_cost_adj_pct + 100)/100))))) unRndRawCost
6345 	    ,decode(g_wp_version_flag,'Y',0
6346                 ,decode(NVL(tmp.rate_based_flag,'N'),'Y',0
6347                   ,(sum(nvl(tmp.txn_raw_cost,0) - nvl(tmp.txn_init_raw_cost,0))))) RndRawCost
6348             ,to_number(null) RawCostDiff
6349 	    ,decode(g_wp_version_flag,'Y',0
6350                 ,decode(NVL(tmp.rate_based_flag,'N'),'Y',0
6351 		  ,((sum(nvl(tmp.old_txn_revenue,0) - nvl(tmp.txn_init_revenue,0)) * ((l_revenue_adj_pct + 100)/100))))) unRndrevenue
6352 	    ,decode(g_wp_version_flag,'Y',0
6353                 ,decode(NVL(tmp.rate_based_flag,'N'),'Y',0
6354                   ,(sum(nvl(tmp.txn_revenue,0) - nvl(tmp.txn_init_revenue,0))))) RndRevenue
6355             ,to_number(null) RevenueDiff
6356         FROM  pa_fp_rollup_tmp tmp
6357          ,pa_fp_spread_calc_tmp caltmp
6358         WHERE caltmp.budget_version_id = p_budget_version_id
6359         AND  caltmp.resource_assignment_id = tmp.resource_assignment_id
6360         AND  tmp.txn_currency_code      = caltmp.txn_currency_code
6361         AND  nvl(caltmp.skip_record_flag,'N') <> 'Y'
6362         AND  nvl(caltmp.mass_adjust_flag,'N') = 'Y'
6363         GROUP BY tmp.resource_assignment_id,tmp.txn_currency_code,tmp.rate_based_flag
6364         ORDER BY tmp.resource_assignment_id,tmp.txn_currency_code;
6365 
6366 BEGIN
6367 
6368     	x_return_status := FND_API.G_RET_STS_SUCCESS;
6369         IF p_pa_debug_mode = 'Y' Then
6370             pa_debug.init_err_stack('PA_FP_CALC_PLAN_PKG.mass_adjust');
6371         End If;
6372         g_stage := 'mass_adjust:100';
6373 	If P_PA_DEBUG_MODE = 'Y' Then
6374         print_msg('QtyAdjPct['||l_quantity_adj_pct||']RateAdjPct['||l_cost_rate_adj_pct||']RwCostPct['||l_raw_cost_adj_pct||']');
6375     	print_msg('BdRateAdPct['||l_burdened_rate_adj_pct||']BurdPct['||l_burden_cost_adj_pct||']');
6376         print_msg('BillRtAdjPct['||l_bill_rate_adj_pct||']RevPct['||l_revenue_adj_pct||']');
6377 	End If;
6378 
6379 
6380         /* Bug fix:4171926 Restrict the adjustment percentage to 2 decimals */
6381         l_quantity_adj_pct       := Round(l_quantity_adj_pct,2);
6382         l_cost_rate_adj_pct      := Round(l_cost_rate_adj_pct,2);
6383         l_burdened_rate_adj_pct  := Round(l_burdened_rate_adj_pct,2);
6384         l_bill_rate_adj_pct      := Round(l_bill_rate_adj_pct,2);
6385 	l_raw_cost_adj_pct 	 := Round(l_raw_cost_adj_pct,2);
6386         l_burden_cost_adj_pct    := Round(l_burden_cost_adj_pct,2);
6387         l_revenue_adj_pct	 := Round(l_revenue_adj_pct,2);
6388 
6389 	If g_wp_version_flag = 'Y' Then  --{
6390         g_stage := 'mass_adjust:101';
6391      	UPDATE /*+ INDEX(TMP PA_FP_ROLLUP_TMP_N1) */ pa_fp_rollup_tmp tmp
6392      	SET    tmp.old_quantity = decode(l_quantity_adj_pct,NULL,to_number(NULL),tmp.quantity)
6393             ,tmp.quantity = decode(l_quantity_adj_pct,NULL,tmp.quantity
6394                    ,decode(NVL(tmp.rate_based_flag,'N'),'N'
6395                      ,(NVL(tmp.init_quantity,0)+ pa_currency.round_trans_currency_amt1 (
6396                     ((NVL(tmp.quantity,0) - nvl(tmp.init_quantity,0))
6397                          * ((l_quantity_adj_pct + 100)/100)),tmp.txn_currency_code))
6398                         ,(NVL(tmp.init_quantity,0)+ Round(((NVL(tmp.quantity,0) - nvl(tmp.init_quantity,0))
6399                        * ((l_quantity_adj_pct + 100)/100)),5)))
6400                     )
6401             ,tmp.rw_cost_rate_override =
6402                 decode(NVL(tmp.rate_based_flag,'N'),'N',tmp.rw_cost_rate_override
6403                                    ,Decode(l_cost_rate_adj_pct,NULL,tmp.rw_cost_rate_override
6404                            ,(NVL(tmp.rw_cost_rate_override,tmp.cost_rate)
6405                             * ((l_cost_rate_adj_pct + 100)/100)))
6406                     )
6407             ,tmp.burden_cost_rate_override =
6408                 Decode(l_burdened_rate_adj_pct,NULL
6409 			,Decode(l_cost_rate_adj_pct,NULL,tmp.burden_cost_rate_override
6410                            ,Decode(tmp.burden_cost_rate_override,NULL,tmp.burden_cost_rate_override
6411                               ,decode(NVL(tmp.rw_cost_rate_override,nvl(tmp.cost_rate,0)),0,tmp.burden_cost_rate_override
6412                                     ,((tmp.burden_cost_rate_override / NVL(tmp.rw_cost_rate_override,tmp.cost_rate))
6413                                         * (NVL(tmp.rw_cost_rate_override,tmp.cost_rate)* ((l_cost_rate_adj_pct + 100)/100))))))
6414                         , (NVL(tmp.burden_cost_rate_override,tmp.burden_cost_rate)
6415                             * ((l_burdened_rate_adj_pct + 100)/100))
6416                         )
6417         WHERE tmp.budget_version_id = p_budget_version_id
6418     	AND  EXISTS ( select null
6419             from pa_fp_spread_calc_tmp caltmp
6420                 WHERE  caltmp.resource_assignment_id = tmp.resource_assignment_id
6421                 AND  caltmp.txn_currency_code      = tmp.txn_currency_code
6422                 AND  nvl(caltmp.skip_record_flag,'N') <> 'Y'
6423                 AND  nvl(caltmp.mass_adjust_flag,'N') = 'Y'
6424            );
6425         g_stage := 'mass_adjust:102: Number of rows Updated['||sql%rowcount||']';
6426 
6427 	ELSE  -- for financial budgets / forecasts
6428 
6429 	  IF l_quantity_adj_pct is NOT NULL
6430 		OR l_cost_rate_adj_pct is NOT NULL
6431 		or l_burdened_rate_adj_pct is NOT NULL
6432 		or l_bill_rate_adj_pct is NOT NULL Then --{
6433            g_stage := 'mass_adjust:103';
6434            UPDATE /*+ INDEX(TMP PA_FP_ROLLUP_TMP_N1) */ pa_fp_rollup_tmp tmp
6435            SET    tmp.old_quantity = decode(NVL(tmp.rate_based_flag,'N'),'N',tmp.quantity
6436 						,decode(l_quantity_adj_pct,NULL,to_number(NULL),tmp.quantity))
6437             ,tmp.quantity = decode(NVL(tmp.rate_based_flag,'N'),'N',tmp.quantity
6438 				,decode(l_quantity_adj_pct,NULL,tmp.quantity
6439                    		  ,decode(NVL(tmp.rate_based_flag,'N'),'N'
6440                      		     ,(NVL(tmp.init_quantity,0)+ pa_currency.round_trans_currency_amt1 (
6441                     				((NVL(tmp.quantity,0) - nvl(tmp.init_quantity,0))
6442                          			* ((l_quantity_adj_pct + 100)/100)),tmp.txn_currency_code))
6443                         		,(NVL(tmp.init_quantity,0)+ Round(((NVL(tmp.quantity,0) - nvl(tmp.init_quantity,0))
6444                        				* ((l_quantity_adj_pct + 100)/100)),5)))
6445                     		 ))
6446             ,tmp.rw_cost_rate_override =
6447                 decode(NVL(tmp.rate_based_flag,'N'),'N',tmp.rw_cost_rate_override
6448                                    ,Decode(l_cost_rate_adj_pct,NULL,tmp.rw_cost_rate_override
6449                            ,(NVL(tmp.rw_cost_rate_override,tmp.cost_rate)
6450                             * ((l_cost_rate_adj_pct + 100)/100)))
6451                     )
6452             ,tmp.burden_cost_rate_override =
6453                 Decode(l_burdened_rate_adj_pct,NULL,decode(NVL(tmp.rate_based_flag,'N'),'N',tmp.burden_cost_rate_override
6454 				,Decode(l_cost_rate_adj_pct,NULL,tmp.burden_cost_rate_override
6455 				   ,Decode(tmp.burden_cost_rate_override,NULL,tmp.burden_cost_rate_override,1,NULL
6456 					  ,decode(NVL(tmp.rw_cost_rate_override,nvl(tmp.cost_rate,0)),0,tmp.burden_cost_rate_override
6457 					     ,((tmp.burden_cost_rate_override / NVL(tmp.rw_cost_rate_override,tmp.cost_rate))
6458 						* (NVL(tmp.rw_cost_rate_override,tmp.cost_rate)* ((l_cost_rate_adj_pct + 100)/100)))))))
6459                                       , (NVL(tmp.burden_cost_rate_override,tmp.burden_cost_rate)
6460                         * ((l_burdened_rate_adj_pct + 100)/100))
6461                         )
6462             ,tmp.bill_rate_override  =
6463                 DECODE(l_bill_rate_adj_pct ,NULL,decode(l_cost_rate_adj_pct,NULL,tmp.bill_rate_override
6464 			,decode(g_fp_budget_version_type,'COST',tmp.bill_rate_override,'REVENUE',tmp.bill_rate_override
6465 			     ,decode(NVL(tmp.rate_based_flag,'N'),'N',tmp.bill_rate_override
6466 				,decode(NVL(tmp.rw_cost_rate_override,nvl(tmp.cost_rate,0)),0,tmp.bill_rate_override
6467 				  ,decode(tmp.bill_rate_override,1,NULL,NULL,NULL
6468 					,((tmp.bill_rate_override / NVL(tmp.rw_cost_rate_override,tmp.cost_rate))
6469 					  * (NVL(tmp.rw_cost_rate_override,tmp.cost_rate)* ((l_cost_rate_adj_pct + 100)/100))))))))
6470                            ,Decode(g_fp_budget_version_type,'COST',tmp.bill_rate_override
6471                     ,'REVENUE',Decode(NVL(tmp.rate_based_flag,'N'),'N',tmp.bill_rate_override
6472                         ,Decode(NVL(tmp.billable_flag,'N'),'Y'
6473                           ,(NVL(tmp.bill_rate_override,tmp.bill_rate) *
6474                             ((l_bill_rate_adj_pct + 100)/100))
6475                             ,(nvl(tmp.bill_rate_override,tmp.bill_rate) * ((l_bill_rate_adj_pct + 100)/100))))
6476                     ,'ALL',Decode(NVL(tmp.rate_based_flag,'N'),'N',tmp.bill_rate_override
6477 			  ,Decode(NVL(tmp.billable_flag,'N'),'Y'
6478                         , (NVL(tmp.bill_rate_override,tmp.bill_rate) *
6479                         ((l_bill_rate_adj_pct + 100)/100))
6480                         ,(nvl(tmp.bill_rate_override,tmp.bill_rate) * ((l_bill_rate_adj_pct + 100)/100))))
6481                     ))
6482            WHERE tmp.budget_version_id = p_budget_version_id
6483            AND  EXISTS ( select null
6484             	from pa_fp_spread_calc_tmp caltmp
6485                 WHERE  caltmp.resource_assignment_id = tmp.resource_assignment_id
6486                 AND  caltmp.txn_currency_code      = tmp.txn_currency_code
6487                 AND  nvl(caltmp.skip_record_flag,'N') <> 'Y'
6488                 AND  nvl(caltmp.mass_adjust_flag,'N') = 'Y'
6489            );
6490            g_stage := 'mass_adjust:104: Number of rows Updated['||sql%rowcount||']';
6491 
6492 	  ELSIF l_raw_cost_adj_pct is NOT NULL OR l_burden_cost_adj_pct is NOT NULL OR l_revenue_adj_pct is NOT NULL Then
6493 		UPDATE /*+ INDEX(TMP PA_FP_ROLLUP_TMP_N1) */ pa_fp_rollup_tmp tmp
6494            	SET    tmp.old_txn_raw_cost =
6495 				decode(l_raw_cost_adj_pct,NULL,to_number(null),tmp.txn_raw_cost)
6496 		       ,tmp.old_txn_revenue =
6497 				decode(l_revenue_adj_pct,NULL,to_number(null),tmp.txn_revenue)
6498 		       ,tmp.txn_raw_cost =
6499 				decode(l_raw_cost_adj_pct,NULL,tmp.txn_raw_cost
6500 				   ,decode(tmp.txn_raw_cost,NULL,NULL,0,0
6501 					,(NVL(tmp.txn_init_raw_cost,0)+ pa_currency.round_trans_currency_amt1 (
6502                                            ((NVL(tmp.txn_raw_cost,0) - nvl(tmp.txn_init_raw_cost,0))
6503                                              * ((l_raw_cost_adj_pct + 100)/100)),tmp.txn_currency_code))))
6504 		       ,tmp.txn_revenue =
6505 				decode(l_revenue_adj_pct,NULL,tmp.txn_revenue
6506                                    ,decode(tmp.txn_revenue,NULL,NULL,0,0
6507                                         ,(NVL(tmp.txn_init_revenue,0)+ pa_currency.round_trans_currency_amt1 (
6508                                            ((NVL(tmp.txn_revenue,0) - nvl(tmp.txn_init_revenue,0))
6509                                              * ((l_revenue_adj_pct + 100)/100)),tmp.txn_currency_code))))
6510 		       ,tmp.quantity = decode(NVL(tmp.rate_based_flag,'N'),'Y',tmp.quantity
6511 					 ,decode(l_raw_cost_adj_pct,NULL
6512 					 ,decode(l_revenue_adj_pct, NULL, tmp.quantity
6513 					    ,decode(g_fp_budget_version_type,'COST',tmp.quantity
6514 						 ,'REVENUE', (NVL(tmp.txn_init_revenue,0)+ pa_currency.round_trans_currency_amt1 (
6515                                            			((NVL(tmp.txn_revenue,0) - nvl(tmp.txn_init_revenue,0))
6516                                              				* ((l_revenue_adj_pct + 100)/100)),tmp.txn_currency_code))
6517 						,'ALL',decode(nvl(tmp.rw_cost_rate_override,0),0
6518 								,(NVL(tmp.txn_init_revenue,0)+ pa_currency.round_trans_currency_amt1 (
6519                                                                 ((NVL(tmp.txn_revenue,0) - nvl(tmp.txn_init_revenue,0))
6520                                                                         * ((l_revenue_adj_pct + 100)/100)),tmp.txn_currency_code))
6521 							       ,tmp.quantity)))
6522 					    ,decode(g_fp_budget_version_type,'REVENUE',tmp.quantity
6523 						,'COST',(NVL(tmp.txn_init_raw_cost,0)+ pa_currency.round_trans_currency_amt1 (
6524                                            		   ((NVL(tmp.txn_raw_cost,0) - nvl(tmp.txn_init_raw_cost,0))
6525                                              		    * ((l_raw_cost_adj_pct + 100)/100)),tmp.txn_currency_code))
6526 						,'ALL',decode(nvl(tmp.rw_cost_rate_override,0),0,tmp.quantity
6527 							,(NVL(tmp.txn_init_raw_cost,0)+ pa_currency.round_trans_currency_amt1 (
6528                                                            ((NVL(tmp.txn_raw_cost,0) - nvl(tmp.txn_init_raw_cost,0))
6529                                                             * ((l_raw_cost_adj_pct + 100)/100)),tmp.txn_currency_code))))))
6530 		       ,tmp.burden_cost_rate_override =
6531                 		Decode(g_fp_budget_version_type,'REVENUE',tmp.burden_cost_rate_override
6532 				 ,Decode(l_burden_cost_adj_pct,NULL
6533 				 ,Decode(l_raw_cost_adj_pct,NULL,tmp.burden_cost_rate_override
6534                                    ,decode(NVL(tmp.rate_based_flag,'N'),'N',tmp.burden_cost_rate_override
6535 				      ,Decode(tmp.burden_cost_rate_override,NULL,tmp.burden_cost_rate_override,1,NULL
6536 					,decode((nvl(tmp.quantity,0) - nvl(tmp.init_quantity,0)),0,tmp.burden_cost_rate_override
6537                                           ,decode(NVL(tmp.rw_cost_rate_override,nvl(tmp.cost_rate,0)),0,tmp.burden_cost_rate_override
6538                                              ,((tmp.burden_cost_rate_override / NVL(tmp.rw_cost_rate_override,tmp.cost_rate))
6539                                                 * (NVL(tmp.rw_cost_rate_override,tmp.cost_rate)* ((l_raw_cost_adj_pct+ 100)/100))))))))
6540                                       	,(NVL(tmp.burden_cost_rate_override,tmp.burden_cost_rate)
6541                         			* ((l_burden_cost_adj_pct + 100)/100))
6542                         		))
6543 		       ,tmp.bill_rate_override =
6544 				decode(g_fp_budget_version_type,'COST', tmp.bill_rate_override
6545 				 ,'REVENUE', decode(l_revenue_adj_pct,NULL,tmp.bill_rate_override
6546 					,decode(NVL(tmp.rate_based_flag,'N'),'N',tmp.bill_rate_override
6547 					 ,(NVL(tmp.bill_rate_override,tmp.bill_rate) * ((l_revenue_adj_pct + 100)/100))))
6548 				,'ALL' , Decode(l_raw_cost_adj_pct,NULL
6549 					  ,decode(l_revenue_adj_pct,NULL,tmp.bill_rate_override
6550 					   ,decode(NVL(tmp.rate_based_flag,'N'),'Y'
6551 						,(NVL(tmp.bill_rate_override,tmp.bill_rate) * ((l_revenue_adj_pct + 100)/100))
6552 						,decode(NVL(tmp.rw_cost_rate_override,0),0,tmp.bill_rate_override
6553 						 ,(NVL(tmp.bill_rate_override,tmp.bill_rate) * ((l_revenue_adj_pct + 100)/100)))))
6554 					  ,decode(NVL(tmp.rate_based_flag,'N'),'N',tmp.bill_rate_override
6555 					   ,decode((nvl(tmp.quantity,0) - nvl(tmp.init_quantity,0)),0,tmp.bill_rate_override
6556 					    ,decode(NVL(tmp.rw_cost_rate_override,nvl(tmp.cost_rate,0)),0,tmp.bill_rate_override
6557 						,((tmp.bill_rate_override / NVL(tmp.rw_cost_rate_override,tmp.cost_rate))
6558                                                 * (NVL(tmp.rw_cost_rate_override,tmp.cost_rate)* ((l_raw_cost_adj_pct+ 100)/100)))))))
6559 					)
6560 		       ,tmp.rw_cost_rate_override =
6561                                 decode(l_raw_cost_adj_pct,NULL,tmp.rw_cost_rate_override
6562 				 ,decode((nvl(tmp.quantity,0) - nvl(tmp.init_quantity,0)),0,tmp.rw_cost_rate_override
6563                                   ,decode(NVL(tmp.rate_based_flag,'N'),'N',tmp.rw_cost_rate_override
6564                                    ,Decode(l_raw_cost_adj_pct,NULL,tmp.rw_cost_rate_override
6565                                      ,(NVL(tmp.rw_cost_rate_override,tmp.cost_rate)
6566                                        * ((l_raw_cost_adj_pct + 100)/100))))))
6567 		WHERE tmp.budget_version_id = p_budget_version_id
6568                 AND  EXISTS ( select null
6569                 		from pa_fp_spread_calc_tmp caltmp
6570                 		WHERE  caltmp.resource_assignment_id = tmp.resource_assignment_id
6571                 		AND  caltmp.txn_currency_code      = tmp.txn_currency_code
6572                 		AND  nvl(caltmp.skip_record_flag,'N') <> 'Y'
6573                 		AND  nvl(caltmp.mass_adjust_flag,'N') = 'Y' );
6574 
6575 	  END IF;
6576 	END IF;  --} //end of g_wp_version_flag
6577 
6578     --print_msg(g_stage);
6579     IF l_quantity_adj_pct is NOT NULL OR l_raw_cost_adj_pct is NOT NULL OR l_revenue_adj_pct is NOT NULL Then --{
6580             l_raId_tab.delete;
6581             l_txn_cur_tab.delete;
6582             l_sdate_tab.delete;
6583             l_blId_tab.delete;
6584             l_ratebase_tab.delete;
6585             l_quantity_old_tab.delete;
6586         l_quantity_new_tab.delete;
6587         l_quantity_diff_tab.delete;
6588 	l_rawCost_new_tab.delete;
6589         l_rawcost_old_tab.delete;
6590         l_rawcost_diff_tab.delete;
6591 	l_revenue_new_tab.delete;
6592         l_revenue_old_tab.delete;
6593         l_revenue_diff_tab.delete;
6594         OPEN cur_rndQty;
6595         FETCH cur_rndQty BULK COLLECT INTO
6596             l_raId_tab
6597                 ,l_txn_cur_tab
6598                 ,l_sdate_tab
6599                 ,l_blId_tab
6600                 ,l_ratebase_tab
6601                 ,l_quantity_old_tab
6602                 ,l_quantity_new_tab
6603             	,l_quantity_diff_tab
6604 		,l_rawCost_old_tab
6605         	,l_rawcost_new_tab
6606         	,l_rawcost_diff_tab
6607 		,l_revenue_old_tab
6608         	,l_revenue_new_tab
6609         	,l_revenue_diff_tab;
6610         CLOSE cur_rndQty;
6611         IF l_blId_tab.COUNT > 0 Then
6612 	   If l_quantity_adj_pct is NOT NULL Then --{
6613             g_stage := 'MassAdjust:Quantity_Rounding adjust:105';
6614 	    If P_PA_DEBUG_MODE = 'Y' Then
6615             print_msg(g_stage);
6616 	    End if;
6617             FOR i IN l_blId_tab.FIRST .. l_blId_tab.LAST LOOP
6618                 If l_ratebase_tab(i) = 'Y' Then
6619                    l_quantity_old_tab(i) := Round_Quantity(l_quantity_old_tab(i));
6620                 Else
6621                    l_quantity_old_tab(i) := pa_currency.round_trans_currency_amt1
6622                                (l_quantity_old_tab(i),l_txn_cur_tab(i));
6623                 End If;
6624                 IF l_quantity_old_tab(i) <> l_quantity_new_tab(i) Then
6625                     l_quantity_diff_tab(i) := l_quantity_old_tab(i) - l_quantity_new_tab(i);
6626                 End If;
6627             END LOOP;
6628             g_stage := 'mass_adjust:106';
6629             FORALL i IN l_blId_tab.FIRST .. l_blId_tab.LAST
6630             UPDATE pa_fp_rollup_tmp tmp
6631             SET tmp.quantity = tmp.quantity + nvl(l_quantity_diff_tab(i),0)
6632             WHERE tmp.budget_line_id = l_blId_tab(i)
6633             AND NVL(l_quantity_diff_tab(i),0) <> 0;
6634 
6635 	 Elsif l_raw_cost_adj_pct is NOT NULL and g_fp_budget_version_type in ('COST','ALL') Then
6636 	    g_stage := 'MassAdjust:RawCost_Rounding adjust:105';
6637 	    If P_PA_DEBUG_MODE = 'Y' Then
6638             print_msg(g_stage);
6639 	    End If;
6640             FOR i IN l_blId_tab.FIRST .. l_blId_tab.LAST LOOP
6641                 If l_ratebase_tab(i) = 'N' Then
6642                    l_rawcost_old_tab(i) := pa_currency.round_trans_currency_amt1
6643                                (l_rawcost_old_tab(i),l_txn_cur_tab(i));
6644                 End If;
6645                 IF l_rawcost_old_tab(i) <> l_rawcost_new_tab(i) Then
6646                     l_rawcost_diff_tab(i) := l_rawcost_old_tab(i) - l_rawcost_new_tab(i);
6647                 End If;
6648             END LOOP;
6649             g_stage := 'mass_adjust:106';
6650             FORALL i IN l_blId_tab.FIRST .. l_blId_tab.LAST
6651             UPDATE pa_fp_rollup_tmp tmp
6652             SET tmp.quantity = decode(g_fp_budget_version_type,'REVENUE', tmp.quantity
6653 				,'COST', (tmp.txn_raw_cost + nvl(l_rawcost_diff_tab(i),0))
6654 				,'ALL',decode(tmp.rw_cost_rate_override,0,tmp.quantity,NULL,tmp.quantity
6655 					,(tmp.txn_raw_cost + nvl(l_rawcost_diff_tab(i),0))))
6656 	       ,tmp.txn_raw_cost = decode(g_fp_budget_version_type,'REVENUE', tmp.txn_raw_cost
6657                                 ,'COST', (tmp.txn_raw_cost + nvl(l_rawcost_diff_tab(i),0))
6658                                 ,'ALL',decode(tmp.rw_cost_rate_override,0,tmp.txn_raw_cost,NULL,tmp.txn_raw_cost
6659                                         ,(tmp.txn_raw_cost + nvl(l_rawcost_diff_tab(i),0))))
6660             WHERE tmp.budget_line_id = l_blId_tab(i)
6661             AND NVL(l_rawcost_diff_tab(i),0) <> 0
6662 	    AND l_ratebase_tab(i) = 'N' ;
6663 
6664 	 Elsif l_revenue_adj_pct is NOT NULL and g_fp_budget_version_type in ('REVENUE','ALL') Then
6665             g_stage := 'MassAdjust:Revenue_Rounding adjust:105';
6666 	    If P_PA_DEBUG_MODE = 'Y' Then
6667             print_msg(g_stage);
6668 	    End If;
6669             FOR i IN l_blId_tab.FIRST .. l_blId_tab.LAST LOOP
6670                 If l_ratebase_tab(i) = 'N' Then
6671                    l_revenue_old_tab(i) := pa_currency.round_trans_currency_amt1
6672                                (l_revenue_old_tab(i),l_txn_cur_tab(i));
6673                 End If;
6674                 IF l_revenue_old_tab(i) <> l_revenue_new_tab(i) Then
6675                     l_revenue_diff_tab(i) := l_revenue_old_tab(i) - l_revenue_new_tab(i);
6676                 End If;
6677             END LOOP;
6678             g_stage := 'mass_adjust:106';
6679             FORALL i IN l_blId_tab.FIRST .. l_blId_tab.LAST
6680             UPDATE pa_fp_rollup_tmp tmp
6681             SET tmp.quantity = decode(g_fp_budget_version_type,'COST', tmp.quantity
6682                                 ,'REVENUE', (tmp.txn_revenue + nvl(l_revenue_diff_tab(i),0))
6683                                 ,'ALL',decode(nvl(tmp.rw_cost_rate_override,0),0
6684 					,(tmp.txn_revenue + nvl(l_revenue_diff_tab(i),0)),tmp.quantity))
6685                ,tmp.txn_revenue = decode(g_fp_budget_version_type,'COST',tmp.txn_revenue
6686 				,'REVENUE', (tmp.txn_revenue + nvl(l_revenue_diff_tab(i),0))
6687                                 ,'ALL', decode(nvl(tmp.rw_cost_rate_override,0),0
6688                                         ,(tmp.txn_revenue + nvl(l_revenue_diff_tab(i),0)),tmp.quantity))
6689             WHERE tmp.budget_line_id = l_blId_tab(i)
6690             AND NVL(l_revenue_diff_tab(i),0) <> 0
6691             AND l_ratebase_tab(i) = 'N' ;
6692 	 END If; --}
6693         END IF;
6694 
6695     End If; --}
6696         IF p_pa_debug_mode = 'Y' Then
6697         	print_msg('x_return_status : '||x_return_status);
6698         	print_msg('Leaving mass_adjust');
6699             	pa_debug.reset_err_stack;
6700         End If;
6701 EXCEPTION
6702         WHEN OTHERS THEN
6703                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6704             x_msg_data := sqlcode||sqlerrm;
6705                 fnd_msg_pub.add_exc_msg
6706                 ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
6707                 ,p_procedure_name => 'mass_adjust' );
6708                 print_msg(g_stage||' substr(SQLERRM,1,240) => '|| substr(SQLERRM,1,240));
6709             IF p_pa_debug_mode = 'Y' Then
6710                     pa_debug.reset_err_stack;
6711             End If;
6712                 RAISE;
6713 
6714 END mass_adjust_new;
6715 
6716 /*
6717 -- FUNCTION get_resource_list_member_id is used to get the resource_list_member_id from
6718 -- pa_resource_assignments based on a resource_assignment_id and txn_currency_code
6719 */
6720 
6721 FUNCTION get_resource_list_member_id
6722     ( p_resource_assignment_id IN NUMBER) RETURN NUMBER IS
6723 
6724     x_resource_list_member_id  NUMBER := NULL;
6725 
6726     CURSOR get_res_list_member_csr IS
6727     SELECT resource_list_member_id
6728         FROM pa_resource_assignments
6729         WHERE resource_assignment_id = p_resource_assignment_id;
6730 
6731     get_res_list_member_rec    get_res_list_member_csr%ROWTYPE;
6732 
6733 BEGIN
6734     get_res_list_member_rec := NULL;
6735         OPEN get_res_list_member_csr;
6736     FETCH get_res_list_member_csr INTO get_res_list_member_rec;
6737     CLOSE get_res_list_member_csr;
6738 
6739         x_resource_list_member_id := get_res_list_member_rec.resource_list_member_id;
6740     If x_resource_list_member_id is NULL Then
6741         x_resource_list_member_id := NULL;
6742     End IF;
6743 
6744     RETURN x_resource_list_member_id;
6745 
6746 END  get_resource_list_member_id;
6747 
6748 
6749 /*
6750 --  PROCEDURE rollup_pf_pfc_to_ra is called from PROCEDURE calculate
6751 --  This procedure is called to Rollup PC and PFC numbers stored in
6752 --  pa_budget_line to pa_resource_assignments
6753 */
6754 -- gboomina for AAI Requirement - Start
6755 -- Modifying this procedure to take calling module as a parameter
6756 -- so that this api can be called from Collect actuals flow
6757 PROCEDURE rollup_pf_pfc_to_ra
6758         ( p_budget_version_id    IN  NUMBER
6759          ,p_calling_module       IN  VARCHAR2 DEFAULT 'CALCULATE_API'
6760          ,x_return_status        OUT NOCOPY VARCHAR2
6761          ,x_msg_count            OUT NOCOPY NUMBER
6762          ,x_msg_data             OUT NOCOPY VARCHAR2) IS
6763 
6764     l_stage             NUMBER;
6765 
6766 /* Note:5519188 data corruption happens when tmp table has multiple rows with raids. Ex: budget line source context
6767  	          * OR in RA context with same ra + different txn currency combo. In order to avoid this cartesian join the only way
6768  	          * is use EXISTS clause or get distinct RAIDs from tmp table and hit budget lines in a loop
6769 */
6770 
6771     CURSOR rollup_bl_csr is
6772     SELECT /*+ INDEX(PBL PA_BUDGET_LINES_U1) */
6773 	   pbl.resource_assignment_id
6774            ,DECODE(sum(pbl.quantity),0,NULL,sum(pbl.quantity))                                      pfc_quantity
6775            ,DECODE(sum(pbl.raw_cost),0,NULL,sum(pbl.raw_cost))                                      pfc_raw_cost
6776            ,DECODE(sum(pbl.burdened_cost),0,NULL,sum(pbl.burdened_cost))                            pfc_burdened_cost
6777            ,DECODE(sum(pbl.revenue),0,NULL,sum(pbl.revenue))                                        pfc_revenue
6778            ,DECODE(sum(pbl.project_raw_cost),0,NULL,sum(pbl.project_raw_cost))                      project_raw_cost
6779            ,DECODE(sum(pbl.project_burdened_cost),0,NULL,sum(pbl.project_burdened_cost))            project_burdened_cost
6780            ,DECODE(sum(pbl.project_revenue),0,NULL,sum(pbl.project_revenue))                        project_revenue
6781            ,DECODE(sum(pbl.init_quantity),0,NULL,sum(pbl.init_quantity))                            pfc_init_quantity
6782            ,DECODE(sum(pbl.init_raw_cost),0,NULL,sum(pbl.init_raw_cost))                            pfc_init_raw_cost
6783            ,DECODE(sum(pbl.init_burdened_cost),0,NULL,sum(pbl.init_burdened_cost))                  pfc_init_burdened_cost
6784            ,DECODE(sum(pbl.init_revenue),0,NULL,sum(pbl.init_revenue))                              pfc_init_revenue
6785            ,DECODE(sum(pbl.project_init_raw_cost),0,NULL,sum(pbl.project_init_raw_cost))            project_init_raw_cost
6786            ,DECODE(sum(pbl.project_init_burdened_cost),0,NULL,sum(pbl.project_init_burdened_cost))  project_init_burdened_cost
6787            ,DECODE(sum(pbl.project_init_revenue),0,NULL,sum(pbl.project_init_revenue))              project_init_revenue
6788         FROM pa_budget_lines pbl
6789 	WHERE pbl.budget_version_id = p_budget_version_id
6790     	AND EXISTS (SELECT NULL
6791                     FROM pa_fp_spread_calc_tmp tmp
6792                     WHERE tmp.budget_version_id = p_budget_version_id
6793                     AND   tmp.resource_assignment_id = pbl.resource_assignment_id
6794                    )
6795      GROUP BY pbl.resource_assignment_id;
6796 
6797     -- gboomina AAI Requirement - Start
6798     -- Cursor to get rolled up amounts from budget lines without temp table
6799     -- This cursor is used for other flows other than calculate api where in
6800     -- we might not have data populated in pa_fp_spread_calc_tmp temp table
6801     CURSOR rollup_bl_generic_csr is
6802     SELECT
6803            pbl.resource_assignment_id
6804            ,DECODE(sum(pbl.quantity),0,NULL,sum(pbl.quantity))                                      pfc_quantity
6805            ,DECODE(sum(pbl.raw_cost),0,NULL,sum(pbl.raw_cost))                                      pfc_raw_cost
6806            ,DECODE(sum(pbl.burdened_cost),0,NULL,sum(pbl.burdened_cost))                            pfc_burdened_cost
6807            ,DECODE(sum(pbl.revenue),0,NULL,sum(pbl.revenue))                                        pfc_revenue
6808            ,DECODE(sum(pbl.project_raw_cost),0,NULL,sum(pbl.project_raw_cost))                      project_raw_cost
6809            ,DECODE(sum(pbl.project_burdened_cost),0,NULL,sum(pbl.project_burdened_cost))            project_burdened_cost
6810            ,DECODE(sum(pbl.project_revenue),0,NULL,sum(pbl.project_revenue))                        project_revenue
6811            ,DECODE(sum(pbl.init_quantity),0,NULL,sum(pbl.init_quantity))                            pfc_init_quantity
6812            ,DECODE(sum(pbl.init_raw_cost),0,NULL,sum(pbl.init_raw_cost))                            pfc_init_raw_cost
6813            ,DECODE(sum(pbl.init_burdened_cost),0,NULL,sum(pbl.init_burdened_cost))                  pfc_init_burdened_cost
6814            ,DECODE(sum(pbl.init_revenue),0,NULL,sum(pbl.init_revenue))                              pfc_init_revenue
6815            ,DECODE(sum(pbl.project_init_raw_cost),0,NULL,sum(pbl.project_init_raw_cost))            project_init_raw_cost
6816            ,DECODE(sum(pbl.project_init_burdened_cost),0,NULL,sum(pbl.project_init_burdened_cost))  project_init_burdened_cost
6817            ,DECODE(sum(pbl.project_init_revenue),0,NULL,sum(pbl.project_init_revenue))              project_init_revenue
6818         FROM pa_budget_lines pbl
6819         WHERE pbl.budget_version_id = p_budget_version_id
6820      GROUP BY pbl.resource_assignment_id;
6821     -- gboomina AAI Requirement - End
6822 
6823     l_resource_assignment_id_tab        pa_plsql_datatypes.NumTabTyp;
6824     l_pfc_quantity_tab          pa_plsql_datatypes.NumTabTyp;
6825     l_pfc_raw_cost_tab          pa_plsql_datatypes.NumTabTyp;
6826         l_pfc_burden_cost_tab           pa_plsql_datatypes.NumTabTyp;
6827         l_pfc_revenue_tab           pa_plsql_datatypes.NumTabTyp;
6828         l_project_raw_cost_tab          pa_plsql_datatypes.NumTabTyp;
6829         l_project_burden_cost_tab       pa_plsql_datatypes.NumTabTyp;
6830         l_project_revenue_tab           pa_plsql_datatypes.NumTabTyp;
6831         l_pfc_init_quantity_tab         pa_plsql_datatypes.NumTabTyp;
6832         l_pfc_init_raw_cost_tab         pa_plsql_datatypes.NumTabTyp;
6833         l_pfc_init_burden_cost_tab      pa_plsql_datatypes.NumTabTyp;
6834         l_pfc_init_revenue_tab          pa_plsql_datatypes.NumTabTyp;
6835         l_project_init_raw_cost_tab     pa_plsql_datatypes.NumTabTyp;
6836         l_project_init_burden_cost_tab      pa_plsql_datatypes.NumTabTyp;
6837         l_project_init_revenue_tab      pa_plsql_datatypes.NumTabTyp;
6838 
6839     l_user_id   Number;
6840         l_login_id  Number;
6841 
6842 BEGIN
6843         x_return_status := 'S';
6844     l_user_id := fnd_global.user_id;
6845         l_login_id := fnd_global.login_id;
6846     /* Bug fix: 4251858  */
6847   -- gboomina AAI Requirement - Start
6848   if (p_calling_module = 'CALCULATE_API') then
6849     UPDATE PA_RESOURCE_ASSIGNMENTS ra
6850         SET ra.total_plan_quantity = null
6851               ,ra.total_plan_raw_cost = null
6852               ,ra.total_plan_burdened_cost = null
6853               ,ra.total_plan_revenue = null
6854               ,ra.total_project_raw_cost = null
6855               ,ra.total_project_burdened_cost = null
6856               ,ra.total_project_revenue = null
6857               ,ra.last_updated_by = l_user_id
6858               ,ra.last_update_date = sysdate
6859               ,ra.last_update_login =  l_login_id
6860         WHERE EXISTS (SELECT NULL
6861                     FROM pa_fp_spread_calc_tmp tmp
6862                     WHERE tmp.budget_version_id = p_budget_version_id
6863                     AND   tmp.resource_assignment_id = ra.resource_assignment_id
6864             /* Bug fix: 4322568 AND  NVL(tmp.skip_record_flag,'N') = 'Y' */
6865                    );
6866 
6867         OPEN rollup_bl_csr;
6868     FETCH rollup_bl_csr BULK COLLECT INTO
6869         l_resource_assignment_id_tab
6870             ,l_pfc_quantity_tab
6871             ,l_pfc_raw_cost_tab
6872             ,l_pfc_burden_cost_tab
6873             ,l_pfc_revenue_tab
6874             ,l_project_raw_cost_tab
6875             ,l_project_burden_cost_tab
6876             ,l_project_revenue_tab
6877             ,l_pfc_init_quantity_tab
6878             ,l_pfc_init_raw_cost_tab
6879             ,l_pfc_init_burden_cost_tab
6880             ,l_pfc_init_revenue_tab
6881             ,l_project_init_raw_cost_tab
6882             ,l_project_init_burden_cost_tab
6883             ,l_project_init_revenue_tab;
6884     CLOSE rollup_bl_csr;
6885   else
6886     -- if calling module is not 'CALCULATE_API' then get values from
6887     -- generic cursor
6888       OPEN rollup_bl_generic_csr;
6889       FETCH rollup_bl_generic_csr BULK COLLECT INTO
6890                 l_resource_assignment_id_tab
6891                ,l_pfc_quantity_tab
6892                ,l_pfc_raw_cost_tab
6893                ,l_pfc_burden_cost_tab
6894                ,l_pfc_revenue_tab
6895                ,l_project_raw_cost_tab
6896                ,l_project_burden_cost_tab
6897                ,l_project_revenue_tab
6898                ,l_pfc_init_quantity_tab
6899                ,l_pfc_init_raw_cost_tab
6900                ,l_pfc_init_burden_cost_tab
6901                ,l_pfc_init_revenue_tab
6902                ,l_project_init_raw_cost_tab
6903                ,l_project_init_burden_cost_tab
6904                ,l_project_init_revenue_tab;
6905        CLOSE rollup_bl_generic_csr;
6906    end if;
6907        -- gboomina AAI Requirement - End
6908 
6909     IF l_resource_assignment_id_tab.COUNT > 0 THEN
6910        FORALL i IN l_resource_assignment_id_tab.FIRST .. l_resource_assignment_id_tab.LAST
6911        UPDATE PA_RESOURCE_ASSIGNMENTS ra
6912        SET ra.total_plan_quantity = l_pfc_quantity_tab(i)
6913                     ,ra.total_plan_raw_cost = l_pfc_raw_cost_tab(i)
6914                     ,ra.total_plan_burdened_cost = l_pfc_burden_cost_tab(i)
6915                     ,ra.total_plan_revenue = l_pfc_revenue_tab(i)
6916                     ,ra.total_project_raw_cost = l_project_raw_cost_tab(i)
6917                     ,ra.total_project_burdened_cost = l_project_burden_cost_tab(i)
6918                     ,ra.total_project_revenue = l_project_revenue_tab(i)
6919             ,ra.last_updated_by = l_user_id
6920             ,ra.last_update_date = sysdate
6921             ,ra.last_update_login =  l_login_id
6922        WHERE ra.resource_assignment_id = l_resource_assignment_id_tab(i);
6923     END IF;
6924 	If P_PA_DEBUG_MODE = 'Y' Then
6925     print_msg('Leaving rollup_pf_pfc_to_ra x_return_status : '||x_return_status);
6926 	End If;
6927 
6928 EXCEPTION
6929     WHEN OTHERS THEN
6930             x_return_status := 'U';
6931             fnd_msg_pub.add_exc_msg
6932             ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
6933                 ,p_procedure_name => 'rollup_pf_pfc_to_ra' );
6934             l_stage := 5140;
6935             print_msg(to_char(l_stage)||' substr(SQLERRM,1,240) => '|| substr(SQLERRM,1,240));
6936             RAISE;
6937 END rollup_pf_pfc_to_ra;
6938 
6939 /*
6940 --  PROCEDURE rollup_pf_pfc_to_bv is called from PROCEDURE calculate
6941 --  This procedure is called to Rollup PC and PFC numbers stored in
6942 --  pa_resource_assignments to pa_budget_versions
6943 */
6944 PROCEDURE rollup_pf_pfc_to_bv ( p_budget_version_id             IN  pa_budget_versions.budget_version_id%TYPE
6945                                ,x_return_status                 OUT NOCOPY VARCHAR2
6946                                ,x_msg_count                     OUT NOCOPY NUMBER
6947                                ,x_msg_data                      OUT NOCOPY VARCHAR2) IS
6948 
6949  l_debug_mode        VARCHAR2(30);
6950  l_stage             NUMBER;
6951 
6952 /*
6953 --  Decode is used on total_plan_quantity to split the quantity into
6954 --  equipment_quantity and labor_quantity.  If the resource_class_code = 'PEOPLE'
6955 --  the quantity is rolled up to labor.  IF the resource_class_code = 'EQUIPMENT'
6956 --  the quantity is rolled up to equipment.  All other quantities are ignored.
6957 */
6958       CURSOR rollup_ra_csr is
6959       SELECT DECODE(sum(total_plan_revenue),0,NULL,
6960                         sum(total_plan_revenue))                             total_plan_revenue
6961             ,DECODE(sum(total_plan_raw_cost),0,NULL,
6962                         sum(total_plan_raw_cost))                            total_plan_raw_cost
6963             ,DECODE(sum(total_plan_burdened_cost),0,NULL,
6964                         sum(total_plan_burdened_cost))                       total_plan_burdened_cost
6965         /* Bug fix: 3968340. rollup the labor and equipment effort only if the uom is HOURS
6966          * the following code is commented out and added the new decode
6967             ,DECODE(sum(decode(resource_class_code,'PEOPLE',total_plan_quantity,to_number(null))),0,NULL,
6968                         sum(decode(resource_class_code,'PEOPLE',total_plan_quantity,to_number(null))))
6969                                                                              total_labor_quantity
6970             ,DECODE(sum(decode(resource_class_code,'EQUIPMENT',total_plan_quantity,to_number(null))),0,NULL,
6971                         sum(decode(resource_class_code,'EQUIPMENT',total_plan_quantity,to_number(null))))
6972                                                                              total_equipment_quantity
6973         */
6974             ,DECODE(sum(decode(resource_class_code,'PEOPLE'
6975                 ,decode(pra.unit_of_measure,'HOURS',total_plan_quantity,to_number(null))
6976                                ,to_number(null))),0,NULL
6977                         ,sum(decode(resource_class_code,'PEOPLE'
6978                      ,decode(pra.unit_of_measure,'HOURS',total_plan_quantity,to_number(null))
6979                           ,to_number(null))
6980             )) total_labor_quantity
6981             ,DECODE(sum(decode(resource_class_code,'EQUIPMENT'
6982                        ,decode(pra.unit_of_measure,'HOURS',total_plan_quantity,to_number(null))
6983                            ,to_number(null))),0,NULL
6984                         ,sum(decode(resource_class_code,'EQUIPMENT'
6985                      ,decode(pra.unit_of_measure,'HOURS',total_plan_quantity,to_number(null))
6986                   ,to_number(null))
6987                ))total_equipment_quantity
6988             ,DECODE(sum(total_project_raw_cost),0,NULL,
6989                         sum(total_project_raw_cost))                         total_project_raw_cost
6990             ,DECODE(sum(total_project_burdened_cost),0,NULL,
6991                         sum(total_project_burdened_cost))                    total_project_burdened_cost
6992             ,DECODE(sum(total_project_revenue),0,NULL,
6993                         sum(total_project_revenue))                          total_project_revenue
6994         FROM pa_resource_assignments pra
6995         WHERE pra.budget_version_id = p_budget_version_id
6996     AND  pra.project_id = g_project_id;
6997 
6998     rollup_ra_rec      rollup_ra_csr%ROWTYPE;
6999     l_msg_index_out    NUMBER;
7000 BEGIN
7001     x_return_status := FND_API.G_RET_STS_SUCCESS;
7002     l_stage             := 6000;
7003 
7004     rollup_ra_rec := NULL;
7005   IF NOT rollup_ra_csr%ISOPEN THEN
7006     OPEN rollup_ra_csr;
7007   ELSE
7008     CLOSE rollup_ra_csr;
7009     OPEN rollup_ra_csr;
7010   END IF;
7011 
7012   FETCH rollup_ra_csr into rollup_ra_rec;
7013     IF rollup_ra_csr%NOTFOUND THEN
7014       l_stage             := 6010;
7015       --print_msg(to_char(l_stage)||' rollup_ra_csr%NOTFOUND nothing to rollup to pa_budget_versions');
7016       BEGIN
7017         l_stage := 6015;
7018         UPDATE  pa_budget_versions SET
7019                 raw_cost                      = to_number(NULL)
7020                ,burdened_cost                 = to_number(NULL)
7021                ,revenue                       = to_number(NULL)
7022                ,total_project_raw_cost        = to_number(NULL)
7023                ,total_project_burdened_cost   = to_number(NULL)
7024                ,total_project_revenue         = to_number(NULL)
7025                ,labor_quantity                = to_number(NULL)
7026                ,equipment_quantity            = to_number(NULL)
7027                ,record_version_number         = NVL(record_version_number,0) + 1
7028                ,last_update_date              = sysdate
7029                ,last_updated_by               = fnd_global.user_id
7030                ,creation_date                 = sysdate
7031                ,created_by                    = fnd_global.user_id
7032                ,last_update_login             = fnd_global.login_id
7033          WHERE budget_version_id = p_budget_version_id;
7034       EXCEPTION
7035          WHEN OTHERS THEN
7036            print_msg(to_char(l_stage)||' ***ERROR*** Updating pa_budget_versions in rollup_pf_pfc_to_bv');
7037            pa_debug.g_err_stage := to_char(l_stage)||': ***ERROR*** Updating pa_budget_versions in rollup_pf_pfc_to_bv';
7038            IF P_PA_DEBUG_MODE = 'Y' THEN
7039              pa_debug.write('rollup_pf_pfc_to_bv: ' || g_module_name,pa_debug.g_err_stage,3);
7040            END IF;
7041            x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7042             SELECT TO_CHAR(SYSDATE,'DD-MON-YYYY HH:MI:SS') INTO g_session_time
7043             FROM DUAL;
7044             print_msg('RETURN bvid => '||g_budget_version_id||' ,pid => '||g_project_id||' ,sesstime => '||g_session_time);
7045            RETURN;
7046       END;
7047     ELSE
7048       l_stage             := 6020;
7049     /*print_msg(to_char(l_stage)||'UPDATE pa_budget_versions with the following:');
7050       print_msg(' raw_cost                      = '||to_char(rollup_ra_rec.total_plan_raw_cost));
7051       print_msg(' burdened_cost                 = '||to_char(rollup_ra_rec.total_plan_burdened_cost));
7052       print_msg(' revenue                       = '||to_char(rollup_ra_rec.total_plan_revenue));
7053       print_msg(' total_project_raw_cost        = '||to_char(rollup_ra_rec.total_project_raw_cost));
7054       print_msg(' total_project_burdened_cost   = '||to_char(rollup_ra_rec.total_project_burdened_cost));
7055       print_msg(' total_project_revenue         = '||to_char(rollup_ra_rec.total_project_revenue));
7056       print_msg(' labor_quantity                = '||to_char(rollup_ra_rec.total_labor_quantity));
7057       print_msg(' equipment_quantity            = '||to_char(rollup_ra_rec.total_equipment_quantity));
7058     */
7059 
7060       BEGIN
7061         l_stage := 6029;
7062         UPDATE  pa_budget_versions
7063     SET raw_cost                      = rollup_ra_rec.total_plan_raw_cost
7064                ,burdened_cost                 = rollup_ra_rec.total_plan_burdened_cost
7065                ,revenue                       = rollup_ra_rec.total_plan_revenue
7066                ,total_project_raw_cost        = rollup_ra_rec.total_project_raw_cost
7067                ,total_project_burdened_cost   = rollup_ra_rec.total_project_burdened_cost
7068                ,total_project_revenue         = rollup_ra_rec.total_project_revenue
7069                ,labor_quantity                = rollup_ra_rec.total_labor_quantity
7070                ,equipment_quantity            = rollup_ra_rec.total_equipment_quantity
7071                ,record_version_number         = NVL(record_version_number,0) + 1
7072                ,last_update_date              = sysdate
7073                ,last_updated_by               = fnd_global.user_id
7074                ,creation_date                 = sysdate
7075                ,created_by                    = fnd_global.user_id
7076                ,last_update_login             = fnd_global.login_id
7077          WHERE budget_version_id = p_budget_version_id;
7078       EXCEPTION
7079          WHEN OTHERS THEN
7080            print_msg(to_char(l_stage)||' ***ERROR*** Updating pa_budget_versions in rollup_pf_pfc_to_bv');
7081            pa_debug.g_err_stage := to_char(l_stage)||': ***ERROR*** Updating pa_budget_versions in rollup_pf_pfc_to_bv';
7082            IF P_PA_DEBUG_MODE = 'Y' THEN
7083              pa_debug.write('rollup_pf_pfc_to_bv: ' || g_module_name,pa_debug.g_err_stage,3);
7084            END IF;
7085            x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7086             SELECT TO_CHAR(SYSDATE,'DD-MON-YYYY HH:MI:SS') INTO g_session_time
7087             FROM DUAL;
7088             print_msg('RETURN bvid => '||g_budget_version_id||' ,pid => '||g_project_id||' ,sesstime => '||g_session_time);
7089            RETURN;
7090       END;
7091     END IF;
7092 
7093   CLOSE rollup_ra_csr;
7094  /*
7095   print_msg('x_return_status : '||x_return_status);
7096   print_msg('Leaving rollup_pf_pfc_to_bv');
7097  */
7098 
7099   EXCEPTION WHEN OTHERS THEN
7100 
7101         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7102         fnd_msg_pub.add_exc_msg
7103            ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
7104             ,p_procedure_name => 'rollup_pf_pfc_to_bv' );
7105         pa_debug.g_err_stage := 'Stage : '||to_char(l_stage)||' '||substr(SQLERRM,1,240);
7106         l_stage := 6140;
7107         print_msg(to_char(l_stage)||' substr(SQLERRM,1,240) => '|| substr(SQLERRM,1,240));
7108         IF P_PA_DEBUG_MODE = 'Y' THEN
7109            pa_debug.write('rollup_pf_pfc_to_bv: ' || g_module_name,pa_debug.g_err_stage,3);
7110         END IF;
7111         raise FND_API.G_EXC_UNEXPECTED_ERROR;
7112 
7113 END  rollup_pf_pfc_to_bv;
7114 
7115 /* This API populates the spread records in the tmp table and finally spread api is called to process these records */
7116 PROCEDURE populate_spreadRecs
7117         (p_budget_version_id   IN NUMBER
7118         ,p_source_context      IN VARCHAR2
7119         ,x_return_status       OUT NOCOPY VARCHAR2 ) IS
7120 
7121 BEGIN
7122     x_return_status := 'S';
7123     IF g_sprd_raId_tab.COUNT > 0 THEN
7124 	If P_PA_DEBUG_MODE = 'Y' Then
7125     print_msg('Inserting records into fp_res_assignment_tmp table count['||g_sprd_raId_tab.COUNT||']fst['||g_sprd_raId_tab.first||']Lst['||g_sprd_raId_tab.last||']');
7126 	End If;
7127 
7128     FORALL i IN g_sprd_raId_tab.FIRST .. g_sprd_raId_tab.LAST
7129     INSERT INTO PA_FP_RES_ASSIGNMENTS_TMP
7130             (BUDGET_VERSION_ID
7131                 ,PROJECT_ID
7132                 ,TASK_ID
7133                 ,RESOURCE_LIST_MEMBER_ID
7134         ,SPREAD_CURVE_ID
7135         ,SP_FIXED_DATE
7136         ,SOURCE_CONTEXT
7137         ,RATE_BASED_FLAG
7138         ,RESOURCE_ASSIGNMENT_ID
7139                 ,TXN_CURRENCY_CODE
7140             ,LINE_START_DATE
7141             ,LINE_END_DATE
7142             ,PLANNING_START_DATE
7143         ,PLANNING_END_DATE
7144             ,TXN_REVENUE
7145             ,TXN_REVENUE_ADDL
7146             ,TXN_RAW_COST
7147             ,TXN_RAW_COST_ADDL
7148             ,TXN_BURDENED_COST
7149             ,TXN_BURDENED_COST_ADDL
7150             ,TXN_PLAN_QUANTITY
7151             ,TXN_PLAN_QUANTITY_ADDL
7152             ,TXN_CURRENCY_CODE_OVERRIDE
7153             ,TXN_INIT_REVENUE
7154             ,TXN_INIT_RAW_COST
7155             ,TXN_INIT_BURDENED_COST
7156             ,INIT_QUANTITY
7157             ,SPREAD_AMOUNTS_FLAG
7158             ,RAW_COST_RATE
7159                 ,RW_COST_RATE_OVERRIDE
7160                 ,BURDEN_COST_RATE
7161                 ,BURDEN_COST_RATE_OVERRIDE
7162                 ,BILL_RATE
7163                 ,BILL_RATE_OVERRIDE
7164         ,PROJECT_CURRENCY_CODE
7165                 ,PROJFUNC_CURRENCY_CODE
7166 		/* bug fix:5726773 : store the value in the sprd table*/
7167  	        ,NEG_QUANTITY_CHANGE_FLAG --neg_Qty_Change_flag
7168  	        ,NEG_RAWCOST_CHANGE_FLAG --neg_RawCst_Change_flag
7169  	        ,NEG_BURDEN_CHANGE_FALG  --neg_BurdCst_Change_flag
7170  	        ,NEG_REVENUE_CHANGE_FLAG --neg_rev_Change_flag
7171          )
7172     VALUES ( p_budget_version_id
7173         ,g_project_id
7174         ,g_sprd_task_id_tab(i)
7175         ,g_sprd_rlm_id_tab(i)
7176         ,g_sprd_spcurve_id_tab(i)
7177         ,g_sprd_sp_fixed_date_tab(i)
7178         ,p_source_context
7179         ,NVL(g_sprd_ratebase_flag_tab(i),'N')
7180         ,g_sprd_raId_tab(i)
7181             ,g_sprd_txn_cur_tab(i)
7182             ,g_sprd_sdate_tab(i)
7183             ,g_sprd_edate_tab(i)
7184             ,g_sprd_plan_sdate_tab(i)
7185             ,g_sprd_plan_edate_tab(i)
7186             ,g_sprd_txn_rev_tab(i)
7187             ,g_sprd_txn_rev_addl_tab(i)
7188             ,g_sprd_txn_raw_tab(i)
7189             ,g_sprd_txn_raw_addl_tab(i)
7190             ,g_sprd_txn_burd_tab(i)
7191             ,g_sprd_txn_burd_addl_tab(i)
7192             ,g_sprd_qty_tab(i)
7193             ,g_sprd_qty_addl_tab(i)
7194             ,g_sprd_txn_cur_ovr_tab(i)
7195             ,g_sprd_txn_init_rev_tab(i)
7196             ,g_sprd_txn_init_raw_tab(i)
7197             ,g_sprd_txn_init_burd_tab(i)
7198             ,g_sprd_txn_init_qty_tab(i)
7199             ,g_sprd_spread_reqd_flag_tab(i)
7200             ,g_sprd_costRt_tab(i)
7201             ,g_sprd_costRt_Ovr_tab(i)
7202             ,g_sprd_burdRt_Tab(i)
7203             ,g_sprd_burdRt_Ovr_tab(i)
7204             ,g_sprd_billRt_tab(i)
7205             ,g_sprd_billRt_Ovr_tab(i)
7206             ,g_sprd_projCur_tab(i)
7207             ,g_sprd_projfuncCur_tab(i)
7208 	    /* Bug fix:5463690 */
7209  	    ,g_sprd_neg_Qty_Changflag_tab(i)
7210  	    ,g_sprd_neg_Raw_Changflag_tab(i)
7211  	    ,g_sprd_neg_Burd_Changflag_tab(i)
7212  	    ,g_sprd_neg_rev_Changflag_tab(i)
7213         );
7214 	If P_PA_DEBUG_MODE = 'Y' Then
7215     print_msg('Number of SpreadRecords Inserted['||sql%rowcount||']');
7216 	End If;
7217     END IF; --}
7218 
7219 EXCEPTION
7220     WHEN OTHERS THEN
7221         print_msg('Unexpected error from populate_spreadRecs['||sqlcode||sqlerrm);
7222             x_return_status := 'U';
7223             fnd_msg_pub.add_exc_msg
7224             ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
7225                 ,p_procedure_name => 'populate_spreadRecs');
7226             RAISE;
7227 END populate_spreadRecs;
7228 /*
7229 --  PROCEDURE convert_ra_txn_currency calls PA_FP_MULTI_CURRENCY_PKG.convert_mc_bult
7230 --    This is called when the Rate API returns Cost and Revenue in 2 different
7231 --    currencies and cost and revenue amounts are held in one budget line.
7232 --    If the budget is an Approved revenue budget, the project functional currency
7233 --    becomes the transaction currency upon return from this API. The transaction
7234 --    currency amounts change accordingly.
7235 --    If the budget is non-approved revenue budget then the project currency becomes
7236 --    the transaction currency upon return from this API. The transaction currency
7237 --    amounts change accordingly.
7238 */
7239 
7240 
7241 PROCEDURE convert_ra_txn_currency
7242             ( p_budget_version_id         IN pa_budget_versions.budget_version_id%TYPE
7243              ,p_resource_assignment_id    IN pa_resource_assignments.resource_assignment_id%TYPE
7244              ,p_txn_currency_code         IN pa_budget_lines.txn_currency_code%TYPE
7245              ,p_budget_line_id            IN pa_budget_lines.budget_line_id%TYPE
7246              ,p_txn_raw_cost              IN pa_fp_rollup_tmp.txn_raw_cost%TYPE
7247              ,p_txn_burdened_cost         IN pa_fp_rollup_tmp.txn_burdened_cost%TYPE
7248              ,p_txn_revenue               IN pa_fp_rollup_tmp.txn_revenue%TYPE
7249              ,x_projfunc_currency_code    OUT NOCOPY pa_fp_rollup_tmp.projfunc_currency_code%TYPE
7250              ,x_projfunc_raw_cost         OUT NOCOPY pa_fp_rollup_tmp.projfunc_raw_cost%TYPE
7251              ,x_projfunc_burdened_cost    OUT NOCOPY pa_fp_rollup_tmp.projfunc_burdened_cost%TYPE
7252              ,x_projfunc_revenue          OUT NOCOPY pa_fp_rollup_tmp.projfunc_revenue%TYPE
7253              ,x_projfunc_rejection_code   OUT NOCOPY pa_fp_rollup_tmp.pfc_cur_conv_rejection_code%TYPE
7254              ,x_project_currency_code     OUT NOCOPY pa_fp_rollup_tmp.project_currency_code%TYPE
7255              ,x_project_raw_cost          OUT NOCOPY pa_fp_rollup_tmp.project_raw_cost%TYPE
7256              ,x_project_burdened_cost     OUT NOCOPY pa_fp_rollup_tmp.project_burdened_cost%TYPE
7257              ,x_project_revenue           OUT NOCOPY pa_fp_rollup_tmp.project_revenue%TYPE
7258              ,x_project_rejection_code    OUT NOCOPY pa_fp_rollup_tmp.pc_cur_conv_rejection_code%TYPE
7259              ,x_return_status             OUT NOCOPY VARCHAR2
7260              ,x_msg_count                 OUT NOCOPY NUMBER
7261              ,x_msg_data                  OUT NOCOPY VARCHAR2) IS
7262 
7263     -----added global variables from the multi currency pkg
7264     /* Bug fix:3801261 l_bl_id_tab SYSTEM.pa_num_tbl_type; */
7265     l_bl_id_tab                   pa_fp_multi_currency_pkg.number_type_tab;
7266     l_resource_assignment_id_tab  pa_fp_multi_currency_pkg.number_type_tab;
7267     l_start_date_tab              pa_fp_multi_currency_pkg.date_type_tab;
7268     l_end_date_tab                pa_fp_multi_currency_pkg.date_type_tab;
7269     l_txn_currency_code_tab       pa_fp_multi_currency_pkg.char240_type_tab;
7270     l_txn_raw_cost_tab            pa_fp_multi_currency_pkg.number_type_tab;
7271     l_txn_burdened_cost_tab       pa_fp_multi_currency_pkg.number_type_tab;
7272     l_txn_revenue_tab             pa_fp_multi_currency_pkg.number_type_tab;
7273     l_projfunc_currency_code_tab  pa_fp_multi_currency_pkg.char240_type_tab;
7274     l_projfunc_cost_rate_type_tab pa_fp_multi_currency_pkg.char240_type_tab;
7275     l_projfunc_cost_rate_tab      pa_fp_multi_currency_pkg.number_type_tab;
7276     l_projfunc_cost_rt_dt_typ_tab pa_fp_multi_currency_pkg.char240_type_tab;
7277     l_projfunc_cost_rate_date_tab pa_fp_multi_currency_pkg.date_type_tab;
7278     l_projfunc_rev_rate_type_tab  pa_fp_multi_currency_pkg.char240_type_tab;
7279     l_projfunc_rev_rate_tab       pa_fp_multi_currency_pkg.number_type_tab;
7280     l_projfunc_rev_rt_dt_typ_tab  pa_fp_multi_currency_pkg.char240_type_tab;
7281     l_projfunc_rev_rate_date_tab  pa_fp_multi_currency_pkg.date_type_tab;
7282     l_projfunc_raw_cost_tab       pa_fp_multi_currency_pkg.number_type_tab;
7283     l_projfunc_burdened_cost_tab  pa_fp_multi_currency_pkg.number_type_tab;
7284     l_projfunc_revenue_tab        pa_fp_multi_currency_pkg.number_type_tab;
7285     l_projfunc_rejection_tab      pa_fp_multi_currency_pkg.char30_type_tab;
7286     l_proj_currency_code_tab      pa_fp_multi_currency_pkg.char240_type_tab;
7287     l_proj_cost_rate_type_tab     pa_fp_multi_currency_pkg.char240_type_tab;
7288     l_proj_cost_rate_tab          pa_fp_multi_currency_pkg.number_type_tab;
7289     l_proj_cost_rt_dt_typ_tab     pa_fp_multi_currency_pkg.char240_type_tab;
7290     l_proj_cost_rate_date_tab     pa_fp_multi_currency_pkg.date_type_tab;
7291     l_proj_rev_rate_type_tab      pa_fp_multi_currency_pkg.char240_type_tab;
7292     l_proj_rev_rate_tab           pa_fp_multi_currency_pkg.number_type_tab;
7293     l_proj_rev_rt_dt_typ_tab      pa_fp_multi_currency_pkg.char240_type_tab;
7294     l_proj_rev_rate_date_tab      pa_fp_multi_currency_pkg.date_type_tab;
7295     l_proj_raw_cost_tab           pa_fp_multi_currency_pkg.number_type_tab;
7296     l_proj_burdened_cost_tab      pa_fp_multi_currency_pkg.number_type_tab;
7297     l_proj_revenue_tab            pa_fp_multi_currency_pkg.number_type_tab;
7298     l_proj_rejection_tab          pa_fp_multi_currency_pkg.char30_type_tab;
7299     l_user_validate_flag_tab      pa_fp_multi_currency_pkg.char240_type_tab;
7300     l_status_flag_tab             pa_fp_multi_currency_pkg.char240_type_tab;
7301 
7302     l_return_status VARCHAR2(240);
7303     l_msg_count NUMBER;
7304     l_msg_data VARCHAR2(2000);
7305 
7306     l_entire_return_status VARCHAR2(240);
7307     l_entire_msg_count NUMBER;
7308     l_entire_msg_data  VARCHAR2(2000);
7309 
7310     l_rowcount number;
7311     l_stage NUMBER;
7312     l_msg_index_out  NUMBER;
7313 
7314     Cursor cur_fp_cur_details IS
7315     Select c.projfunc_cost_exchange_rate
7316         ,c.projfunc_rev_exchange_rate
7317         ,c.project_cost_exchange_rate
7318         ,c.project_rev_exchange_rate
7319     From pa_fp_txn_currencies c
7320         where  c.fin_plan_version_id = p_budget_version_id
7321         and c.txn_currency_code = p_txn_currency_code;
7322 
7323     fp_cur_rec cur_fp_cur_details%rowtype;
7324 
7325     CURSOR rollup_lines IS
7326     select p_budget_line_id
7327         ,p_resource_assignment_id
7328         ,r.start_date
7329         ,r.end_date
7330         ,p_txn_currency_code
7331         ,nvl(p_txn_raw_cost,0)
7332         ,nvl(p_txn_burdened_cost,0)
7333         ,nvl(p_txn_revenue,0)
7334         ,nvl(r.projfunc_currency_code,pa_fp_multi_currency_pkg.g_projfunc_currency_code)
7335         ,nvl(r.projfunc_cost_rate_type,pa_fp_multi_currency_pkg.g_projfunc_cost_rate_type)
7336         ,DECODE(r.projfunc_cost_exchange_rate,null,
7337                                             DECODE(nvl(r.projfunc_cost_rate_type,pa_fp_multi_currency_pkg.g_projfunc_cost_rate_type),'User',
7338                                                                           fp_cur_rec.projfunc_cost_exchange_rate,
7339                                                                           r.projfunc_cost_exchange_rate),
7340                                             r.projfunc_cost_exchange_rate)
7341                                                                             projfunc_cost_exchange_rate
7342         ,DECODE(nvl(r.projfunc_cost_rate_type,pa_fp_multi_currency_pkg.g_projfunc_cost_rate_type),'User',Null,
7343                 nvl(r.projfunc_cost_rate_date_type,pa_fp_multi_currency_pkg.g_projfunc_cost_rate_date_type))
7344         ,DECODE(nvl(r.projfunc_cost_rate_date_type,
7345                     pa_fp_multi_currency_pkg.g_projfunc_cost_rate_date_type),
7346                 'START_DATE',r.start_date,
7347                 'END_DATE'  ,r.end_date,
7348                 nvl(r.projfunc_cost_rate_date,pa_fp_multi_currency_pkg.g_projfunc_cost_rate_date))
7349                                                          projfunc_cost_rate_date
7350         ,nvl(r.projfunc_rev_rate_type,pa_fp_multi_currency_pkg.g_projfunc_rev_rate_type)
7351         ,DECODE(r.projfunc_rev_exchange_rate,null,
7352                                             DECODE(nvl(r.projfunc_rev_rate_type,pa_fp_multi_currency_pkg.g_projfunc_rev_rate_type),'User',
7353                                                                           fp_cur_rec.projfunc_rev_exchange_rate,
7354                                                                           r.projfunc_rev_exchange_rate),
7355                                             r.projfunc_rev_exchange_rate)
7356                                                                             projfunc_rev_exchange_rate
7357         ,DECODE(nvl(r.projfunc_rev_rate_type,pa_fp_multi_currency_pkg.g_projfunc_rev_rate_type),'User',NULL,
7358                 nvl(r.projfunc_rev_rate_date_type,pa_fp_multi_currency_pkg.g_projfunc_rev_rate_date_type))
7359         ,DECODE(nvl(r.projfunc_rev_rate_date_type,pa_fp_multi_currency_pkg.g_projfunc_rev_rate_date_type),
7360                 'START_DATE',r.start_date,
7361                 'END_DATE'  ,r.end_date,
7362                 nvl(r.projfunc_rev_rate_date,pa_fp_multi_currency_pkg.g_projfunc_rev_rate_date))
7363                                                           projfunc_rev_rate_date
7364         ,nvl(r.project_currency_code,pa_fp_multi_currency_pkg.g_proj_currency_code)
7365         ,nvl(r.project_cost_rate_type,pa_fp_multi_currency_pkg.g_proj_cost_rate_type)
7366         ,DECODE(r.project_cost_exchange_rate,null,
7367                                             DECODE(nvl(r.project_cost_rate_type,pa_fp_multi_currency_pkg.g_proj_cost_rate_type),'User',
7368                                                                           fp_cur_rec.project_cost_exchange_rate,
7369                                                                           r.project_cost_exchange_rate),
7370                                             r.project_cost_exchange_rate)
7371                                                                             project_cost_exchange_rate
7372         ,DECODE(nvl(r.project_cost_rate_type,pa_fp_multi_currency_pkg.g_proj_cost_rate_type),'User',NULL,
7373                 nvl(r.project_cost_rate_date_type,pa_fp_multi_currency_pkg.g_proj_cost_rate_date_type))
7374         ,DECODE(nvl(r.project_cost_rate_date_type,pa_fp_multi_currency_pkg.g_proj_cost_rate_date_type),
7375                 'START_DATE',r.start_date,
7376                 'END_DATE'  ,r.end_date,
7377                 nvl(r.project_cost_rate_date,pa_fp_multi_currency_pkg.g_proj_cost_rate_date))
7378                                                           project_cost_rate_date
7379         ,nvl(r.project_rev_rate_type,pa_fp_multi_currency_pkg.g_proj_rev_rate_type)
7380         ,DECODE(r.project_rev_exchange_rate,null,
7381                                             DECODE(nvl(r.project_rev_rate_type,pa_fp_multi_currency_pkg.g_proj_rev_rate_type),'User',
7382                                                                           fp_cur_rec.project_rev_exchange_rate,
7383                                                                           r.project_rev_exchange_rate),
7384                                             r.project_rev_exchange_rate)
7385                                                                             project_rev_exchange_rate
7386         ,DECODE(nvl(r.project_rev_rate_type,pa_fp_multi_currency_pkg.g_proj_rev_rate_type),'User',NULL,
7387                 nvl(r.project_rev_rate_date_type,pa_fp_multi_currency_pkg.g_proj_rev_rate_date_type))
7388         ,DECODE(nvl(r.project_rev_rate_date_type,pa_fp_multi_currency_pkg.g_proj_rev_rate_date_type),
7389                 'START_DATE',r.start_date,
7390                 'END_DATE'  ,r.end_date,
7391                 nvl(r.project_rev_rate_date,pa_fp_multi_currency_pkg.g_proj_rev_rate_date))
7392                                                            project_rev_rate_date
7393         from pa_fp_rollup_tmp r
7394     where nvl(r.delete_flag,'N') = 'N'
7395         and r.budget_line_id = p_budget_line_id
7396     order by r.resource_assignment_id,
7397             r.start_date,
7398             r.txn_currency_code;
7399 
7400 BEGIN
7401     IF p_pa_debug_mode = 'Y' Then
7402         pa_debug.init_err_stack('PA_FP_CALC_PLAN_PKG.convert_ra_txn_currency');
7403     End If;
7404     l_entire_return_status := FND_API.G_RET_STS_SUCCESS;
7405     l_return_status := 'S';
7406     l_msg_count := 0;
7407     l_msg_data  := NULL;
7408     x_return_status := 'S';
7409     x_msg_count := 0;
7410     x_msg_data  := NULL;
7411 
7412     -- Get default attributes for currency conversion from version level proj_fp_options
7413     l_stage := 6500;
7414     --print_msg(to_char(l_stage)||' ENTERED  convert_ra_txn_currency');
7415 
7416     fp_cur_rec := null;
7417     OPEN cur_fp_cur_details;
7418     FETCH cur_fp_cur_details INTO fp_cur_rec;
7419     IF cur_fp_cur_details%NOTFOUND Then
7420         fp_cur_rec := null;
7421     END IF;
7422     CLOSE cur_fp_cur_details;
7423 
7424     /*
7425     print_msg('ProjectCurr=> '||pa_fp_multi_currency_pkg.g_proj_currency_code);
7426     print_msg('ProjFuncCurr=> '||pa_fp_multi_currency_pkg.g_projfunc_currency_code);
7427     */
7428         l_stage := 6560;
7429         --print_msg(to_char(l_stage)||' In convert_ra_txn_currency');
7430         --Reset PL/SQL Tables.
7431        l_bl_id_tab.delete;
7432        l_resource_assignment_id_tab.delete;
7433        l_start_date_tab.delete;
7434        l_end_date_tab.delete;
7435        l_txn_currency_code_tab.delete;
7436        l_txn_raw_cost_tab.delete;
7437        l_txn_burdened_cost_tab.delete;
7438        l_txn_revenue_tab.delete;
7439        l_projfunc_currency_code_tab.delete;
7440        l_projfunc_cost_rate_type_tab.delete;
7441        l_projfunc_cost_rate_tab.delete;
7442        l_projfunc_cost_rt_dt_typ_tab.delete;
7443        l_projfunc_cost_rate_date_tab.delete;
7444        l_projfunc_rev_rate_type_tab.delete;
7445        l_projfunc_rev_rate_tab.delete;
7446        l_projfunc_rev_rt_dt_typ_tab.delete;
7447        l_projfunc_rev_rate_date_tab.delete;
7448        l_projfunc_raw_cost_tab.delete;
7449        l_projfunc_burdened_cost_tab.delete;
7450        l_projfunc_revenue_tab.delete;
7451        l_projfunc_rejection_tab.delete;
7452        l_proj_currency_code_tab.delete;
7453        l_proj_cost_rate_type_tab.delete;
7454        l_proj_cost_rate_tab.delete;
7455        l_proj_cost_rt_dt_typ_tab.delete;
7456        l_proj_cost_rate_date_tab.delete;
7457        l_proj_rev_rate_type_tab.delete;
7458        l_proj_rev_rate_tab.delete;
7459        l_proj_rev_rt_dt_typ_tab.delete;
7460        l_proj_rev_rate_date_tab.delete;
7461        l_proj_raw_cost_tab.delete;
7462        l_proj_burdened_cost_tab.delete;
7463        l_proj_revenue_tab.delete;
7464        l_proj_rejection_tab.delete;
7465        l_user_validate_flag_tab.delete;
7466        l_status_flag_tab.delete;
7467 
7468         l_stage := 6580;
7469         --print_msg(to_char(l_stage)||' In convert_ra_txn_currency Fetch rollup_lines cur');
7470     OPEN rollup_lines;
7471         FETCH rollup_lines BULK COLLECT
7472     INTO l_bl_id_tab
7473             ,l_resource_assignment_id_tab
7474             ,l_start_date_tab
7475             ,l_end_date_tab
7476             ,l_txn_currency_code_tab
7477             ,l_txn_raw_cost_tab
7478             ,l_txn_burdened_cost_tab
7479             ,l_txn_revenue_tab
7480             ,l_projfunc_currency_code_tab
7481             ,l_projfunc_cost_rate_type_tab
7482             ,l_projfunc_cost_rate_tab
7483             ,l_projfunc_cost_rt_dt_typ_tab
7484             ,l_projfunc_cost_rate_date_tab
7485             ,l_projfunc_rev_rate_type_tab
7486             ,l_projfunc_rev_rate_tab
7487             ,l_projfunc_rev_rt_dt_typ_tab
7488             ,l_projfunc_rev_rate_date_tab
7489             ,l_proj_currency_code_tab
7490             ,l_proj_cost_rate_type_tab
7491             ,l_proj_cost_rate_tab
7492             ,l_proj_cost_rt_dt_typ_tab
7493             ,l_proj_cost_rate_date_tab
7494             ,l_proj_rev_rate_type_tab
7495             ,l_proj_rev_rate_tab
7496             ,l_proj_rev_rt_dt_typ_tab
7497             ,l_proj_rev_rate_date_tab ;
7498     CLOSE rollup_lines;
7499 
7500     -- initialize --
7501         L_ROWCOUNT := NULL;
7502         L_ROWCOUNT := l_bl_id_tab.count;
7503     --print_msg(to_char(l_stage)||' Number of rows fetched into tab['||L_ROWCOUNT||']');
7504         IF l_rowcount > 0 THEN
7505             l_stage := 6590;
7506             --print_msg(to_char(l_stage)||' Calling pa_fp_multi_currency_pkg.conv_mc_bulk');
7507             pa_fp_multi_currency_pkg.conv_mc_bulk (
7508             p_resource_assignment_id_tab  => l_resource_assignment_id_tab
7509             ,p_start_date_tab              => l_start_date_tab
7510             ,p_end_date_tab                => l_end_date_tab
7511             ,p_txn_currency_code_tab       => l_txn_currency_code_tab
7512             ,p_txn_raw_cost_tab            => l_txn_raw_cost_tab
7513             ,p_txn_burdened_cost_tab       => l_txn_burdened_cost_tab
7514             ,p_txn_revenue_tab             => l_txn_revenue_tab
7515             ,p_projfunc_currency_code_tab  => l_projfunc_currency_code_tab
7516             ,p_projfunc_cost_rate_type_tab => l_projfunc_cost_rate_type_tab
7517             ,p_projfunc_cost_rate_tab      => l_projfunc_cost_rate_tab
7518             ,p_projfunc_cost_rate_date_tab => l_projfunc_cost_rate_date_tab
7519             ,p_projfunc_rev_rate_type_tab  => l_projfunc_rev_rate_type_tab
7520             ,p_projfunc_rev_rate_tab       => l_projfunc_rev_rate_tab
7521             ,p_projfunc_rev_rate_date_tab  => l_projfunc_rev_rate_date_tab
7522             ,x_projfunc_raw_cost_tab       => l_projfunc_raw_cost_tab
7523             ,x_projfunc_burdened_cost_tab  => l_projfunc_burdened_cost_tab
7524             ,x_projfunc_revenue_tab        => l_projfunc_revenue_tab
7525             ,x_projfunc_rejection_tab      => l_projfunc_rejection_tab
7526             ,p_proj_currency_code_tab      => l_proj_currency_code_tab
7527             ,p_proj_cost_rate_type_tab     => l_proj_cost_rate_type_tab
7528             ,p_proj_cost_rate_tab          => l_proj_cost_rate_tab
7529             ,p_proj_cost_rate_date_tab     => l_proj_cost_rate_date_tab
7530             ,p_proj_rev_rate_type_tab      => l_proj_rev_rate_type_tab
7531             ,p_proj_rev_rate_tab           => l_proj_rev_rate_tab
7532             ,p_proj_rev_rate_date_tab      => l_proj_rev_rate_date_tab
7533             ,x_proj_raw_cost_tab           => l_proj_raw_cost_tab
7534             ,x_proj_burdened_cost_tab      => l_proj_burdened_cost_tab
7535             ,x_proj_revenue_tab            => l_proj_revenue_tab
7536             ,x_proj_rejection_tab          => l_proj_rejection_tab
7537             ,p_user_validate_flag_tab      => l_user_validate_flag_tab
7538             ,x_return_status               => l_return_status
7539             ,x_msg_count                   => l_msg_count
7540             ,x_msg_data                    => l_msg_data);
7541 
7542             l_entire_msg_count := nvl(l_entire_msg_count,0) + nvl(l_msg_count,0);
7543             l_entire_msg_data  := l_msg_data;
7544         --print_msg('After calling pa_fp_multi_currency_pkg.conv_mc_bulk msgData['||l_msg_data||'RetSts['||l_return_status||']msgCt['||l_msg_count||']');
7545 
7546             IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7547                     l_stage := 6600;
7548                     print_msg(to_char(l_stage)||' Errored In convert_ra_txn_currency');
7549                     l_entire_return_status := l_return_status;
7550             END IF;
7551 
7552             l_stage := 6610;
7553             --print_msg(to_char(l_stage)||' In convert_ra_txn_currency');
7554                 -- initialize --
7555                 x_projfunc_currency_code    := NULL;
7556                 x_projfunc_raw_cost         := NULL;
7557                 x_projfunc_burdened_cost    := NULL;
7558                 x_projfunc_revenue          := NULL;
7559                 x_projfunc_rejection_code   := NULL;
7560                 x_project_currency_code     := NULL;
7561                 x_project_raw_cost          := NULL;
7562                 x_project_burdened_cost     := NULL;
7563                 x_project_revenue           := NULL;
7564                 x_project_rejection_code    := NULL;
7565 
7566                 FOR i in 1..l_rowcount LOOP
7567                     x_projfunc_currency_code    := l_projfunc_currency_code_tab(i);
7568                     x_projfunc_raw_cost         := l_projfunc_raw_cost_tab(i);
7569                     x_projfunc_burdened_cost    := l_projfunc_burdened_cost_tab(i);
7570                     x_projfunc_revenue          := l_projfunc_revenue_tab(i);
7571                     x_projfunc_rejection_code   := l_projfunc_rejection_tab(i);
7572                     x_project_currency_code     := l_proj_currency_code_tab(i);
7573                     x_project_raw_cost          := l_proj_raw_cost_tab(i);
7574                     x_project_burdened_cost     := l_proj_burdened_cost_tab(i);
7575                     x_project_revenue           := l_proj_revenue_tab(i);
7576                     x_project_rejection_code    := l_proj_rejection_tab(i);
7577                 END LOOP;
7578         END IF; -- rowcount > 0
7579     x_return_status := l_entire_return_status;
7580     x_msg_count := l_msg_count;
7581     x_msg_data := l_msg_data;
7582     --print_msg('End of convert_ra_txn_currency retSts['||x_return_status||']');
7583     IF p_pa_debug_mode = 'Y' Then
7584         pa_debug.reset_err_stack;
7585     End If;
7586 
7587 
7588 EXCEPTION
7589     WHEN OTHERS THEN
7590             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7591         x_msg_count := 1;
7592         x_msg_data := sqlcode||sqlerrm;
7593             fnd_msg_pub.add_exc_msg
7594             ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
7595                 ,p_procedure_name => 'convert_ra_txn_currency' );
7596             pa_debug.g_err_stage := 'Stage : '||to_char(l_stage)||' '||substr(SQLERRM,1,240);
7597             print_msg('PA_FP_CALC_PLAN_PKG.convert_ra_txn_currency -- Stage : ' ||to_char(l_stage)||' '||substr(SQLERRM,1,240));
7598         IF p_pa_debug_mode = 'Y' Then
7599                 pa_debug.reset_err_stack;
7600         End If;
7601             RAISE;
7602 END convert_ra_txn_currency;
7603 
7604 /* This API checks whether the actuals present on the budget line for the given resource
7605  * assignment Id
7606  */
7607 PROCEDURE check_actual_exists(p_res_ass_id  IN NUmber
7608           ,p_start_date  IN date default NULL
7609           ,p_end_date    IN date default NULL
7610                   ,x_actual_flag OUT NOCOPY varchar2 ) IS
7611 
7612     cursor getActualBlLines IS
7613     select 'Y'
7614     from dual
7615     where EXISTS
7616         (select null
7617          from pa_budget_lines bl
7618          where bl.resource_assignment_id = p_res_ass_id
7619          and (bl.init_quantity is not null
7620                      or bl.txn_init_raw_cost is not null
7621              or bl.txn_init_burdened_cost is not null
7622              or bl.txn_init_revenue is not null )
7623         );
7624 BEGIN
7625     x_actual_flag := 'N';
7626     OPEN getActualBlLines;
7627     FETCH getActualBlLines INTO x_actual_flag;
7628     CLOSE getActualBlLines;
7629     IF x_actual_flag is NULL Then
7630        x_actual_flag := 'N';
7631     End IF;
7632     Return;
7633 END check_actual_exists;
7634 
7635 /* This API deletes all the budget lines when no quantiy , amounts exists on the budget lines
7636  * retaining these budget lines create issues during the workplan mode
7637  * keeping these budget lines will retain the currency code during the resource assignment updates
7638  */
7639 PROCEDURE Delete_BL_Where_Nulls
7640                         ( p_budget_version_id        IN  NUmber
7641                     	,p_resource_assignment_tab   IN  SYSTEM.pa_num_tbl_type   DEFAULT SYSTEM.pa_num_tbl_type()
7642                         ,x_return_status             OUT NOCOPY varchar2
7643                         ,x_msg_data                  OUT NOCOPY varchar2
7644                          ) IS
7645 
7646     	/*Perf Changes: Removed update and added a cusor to fetch the ra+txn currency
7647 	 *This reduces teh cpu time from 350sec to 11sec tested on pjperf instance
7648          */
7649 	cursor cur_nullBls is
7650 	select tmp1.resource_assignment_id
7651         	,tmp1.txn_currency_code
7652         from pa_fp_spread_calc_tmp tmp1
7653         	,pa_resource_assignments ra
7654         where tmp1.budget_version_id = p_budget_version_id
7655         and ra.resource_assignment_id = tmp1.resource_assignment_id
7656         and NVL(ra.rate_based_flag,'N') = 'N'
7657         and NOT EXISTS ( select /*+ INDEX(BL PA_BUDGET_LINES_U1) */ null
7658         	from pa_budget_lines bl
7659         	where bl.resource_assignment_id = tmp1.resource_assignment_id
7660         	and bl.txn_currency_code = tmp1.txn_currency_code
7661         	)
7662 	group by tmp1.resource_assignment_id
7663                 ,tmp1.txn_currency_code;
7664 
7665     l_budget_line_id_tab     pa_plsql_datatypes.IdTabTyp;
7666     l_raid_tab           pa_plsql_datatypes.IdTabTyp;
7667     l_txn_cur_code_tab       pa_plsql_datatypes.Char30TabTyp;
7668     l_start_date_tab         pa_plsql_datatypes.DateTabTyp;
7669     l_end_date_tab       pa_plsql_datatypes.DateTabTyp;
7670     l_period_name_tab        pa_plsql_datatypes.Char80TabTyp;
7671     l_proj_cur_code_tab      pa_plsql_datatypes.Char30TabTyp;
7672     l_projfunc_cur_code_tab  pa_plsql_datatypes.Char30TabTyp;
7673 
7674 BEGIN
7675     x_return_status := 'S';
7676     x_msg_data := NULL;
7677     l_budget_line_id_tab.delete;
7678     /* Bug fix:4272944 Starts */
7679     IF ( NVL(g_baseline_funding_flag,'N') = 'Y'
7680             AND NVL(g_bv_approved_rev_flag,'N') = 'Y' ) THEN
7681                print_msg('Bug fix:4272944: DONOT DELETE AUTOBASELINE zero qty budget lines');
7682                null;
7683         /* Bug fix:4272944 Ends */
7684     ELSIF p_resource_assignment_tab.COUNT > 0 THEN
7685 	If P_PA_DEBUG_MODE = 'Y' Then
7686         print_msg('Delete all the budget lines where Qty and Amounts are not exists');
7687 	End If;
7688     l_budget_line_id_tab.delete;
7689     l_raid_tab.delete;
7690     l_txn_cur_code_tab.delete;
7691     l_start_date_tab.delete;
7692     l_end_date_tab.delete;
7693     l_period_name_tab.delete;
7694     l_proj_cur_code_tab.delete;
7695     l_projfunc_cur_code_tab.delete;
7696         FORALL i IN p_resource_assignment_tab.FIRST .. p_resource_assignment_tab.LAST
7697         DELETE FROM pa_budget_lines bl
7698         WHERE bl.resource_assignment_id = p_resource_assignment_tab(i)
7699         AND   bl.budget_version_id = p_budget_version_id
7700         AND   ( nvl(bl.quantity,0) = 0
7701               and nvl(bl.txn_raw_cost,0) = 0
7702               and nvl(bl.txn_burdened_cost,0) = 0
7703               and nvl(bl.txn_revenue,0) = 0
7704               and nvl(bl.init_quantity,0) = 0
7705               and nvl(bl.txn_init_raw_cost,0) = 0
7706               and nvl(bl.txn_init_burdened_cost,0) = 0
7707               and nvl(bl.txn_init_revenue,0) = 0
7708              )
7709         RETURNING bl.budget_line_id
7710         ,bl.resource_assignment_id
7711         ,bl.txn_currency_code
7712         ,bl.start_date
7713         ,bl.end_date
7714         ,bl.period_name
7715         ,bl.project_currency_code
7716         ,bl.projfunc_currency_code
7717         BULK COLLECT INTO
7718          l_budget_line_id_tab
7719     ,l_raid_tab
7720         ,l_txn_cur_code_tab
7721         ,l_start_date_tab
7722         ,l_end_date_tab
7723         ,l_period_name_tab
7724         ,l_proj_cur_code_tab
7725         ,l_projfunc_cur_code_tab;
7726 
7727 	If P_PA_DEBUG_MODE = 'Y' Then
7728         print_msg('Number of rows deleted ['||l_budget_line_id_tab.count||']');
7729 	End If;
7730      IF l_budget_line_id_tab.COUNT > 0 THEN --{
7731         FOR i IN l_budget_line_id_tab.FIRST .. l_budget_line_id_tab.LAST LOOP
7732            /* Added for MRC enhancements */
7733                IF NVL(G_populate_mrc_tab_flag,'N') = 'Y' Then
7734                         Populate_MRC_plsqlTabs
7735                                 (p_calling_module               => 'CALCULATE_API'
7736                                 ,p_budget_version_id            => p_budget_version_id
7737                                 ,p_budget_line_id               => l_budget_Line_id_tab(i)
7738                                 ,p_resource_assignment_id       => l_raid_tab(i)
7739                                 ,p_start_date                   => l_start_date_tab(i)
7740                                 ,p_end_date                     => l_end_date_tab(i)
7741                                 ,p_period_name                  => l_period_name_tab(i)
7742                                 ,p_txn_currency_code            => l_txn_cur_code_tab(i)
7743                                 ,p_project_currency_code        => l_proj_cur_code_tab(i)
7744                                 ,p_projfunc_currency_code       => l_projfunc_cur_code_tab(i)
7745                                 ,p_delete_flag                  => 'Y'
7746                                 ,x_msg_data                     => x_msg_data
7747                                 ,x_return_status                => x_return_status
7748                                 );
7749                END IF;
7750         END LOOP;
7751      END IF; --}
7752        END IF;
7753 
7754 	/* Added this check to ensure that for non-rate base resource if no budget lines exists
7755 	* then null out the rate overrides from new entity
7756 	*/
7757 	If nvl(g_wp_version_flag,'N') <> 'Y' AND g_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION') then
7758 		l_raid_tab.delete;
7759     		l_txn_cur_code_tab.delete;
7760 		OPEN cur_nullBls;
7761 		FETCH cur_nullBls BULK COLLECT INTO
7762 		l_raid_tab
7763 		,l_txn_cur_code_tab;
7764 		CLOSE cur_nullBls;
7765 
7766 		IF l_raid_tab.COUNT > 0 Then
7767 		  FORALL i IN l_raid_tab.FIRST .. l_raid_tab.LAST
7768 		  UPDATE /*+ INDEX(RTX PA_RESOURCE_ASGN_CURR_U2) */ pa_resource_asgn_curr rtx
7769         	  SET rtx.TXN_RAW_COST_RATE_OVERRIDE  = null
7770             		,rtx.TXN_BURDEN_COST_RATE_OVERRIDE = null
7771             		,rtx.TXN_BILL_RATE_OVERRIDE = null
7772         	  WHERE rtx.resource_assignment_id = l_raid_tab(i)
7773 		  AND  rtx.txn_currency_code = l_txn_cur_code_tab(i);
7774 
7775 		END IF;
7776 		--print_msg('Number of rows updated for setting null rates['||sql%rowcount||']');
7777 	End If;
7778 
7779 	/* Bug fix:5920547: Ideally, this fix should have been put in pa_res_asg_currency_pub.maintain_data().
7780          * When a calculate API is called, it derives the transaction currency based on the rate schedule setup,
7781          * and it updates the passed in the txn currency with the rate scheduel currency.
7782 	 * while rollup the amounts, the maintain data() api should update the existing RA+TXN currency,
7783 	 * instead of deleting the old records and creating the new records.
7784 	 * Fix required: In order to fix this issue, calculate api should keep track of old txn currency and new txn currency
7785 	 * per planning resource and then call the maintain_data() api by passing old txn currency to delete and create
7786 	 * record with new txn currency.
7787 	 * Proposal:
7788          * since the amount of effort reqd to fix is more. adding simple delete of records from new entity
7789          * for workplan context where quantity is null, and rates are null.
7790          * This issue happens only for workplan when PC <> PFC and for initial creation of task assignment
7791         */
7792         If nvl(g_wp_version_flag,'N') = 'Y' AND g_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION') then
7793                 If g_source_context = 'RESOURCE_ASSIGNMENT' OR g_time_phased_code = 'N'  Then
7794                  FOR i IN p_resource_assignment_tab.FIRST .. p_resource_assignment_tab.LAST LOOP
7795                     DELETE FROM pa_resource_asgn_curr rbc
7796                     WHERE  rbc.budget_version_id = p_budget_version_id
7797                     AND   rbc.resource_assignment_id = p_resource_assignment_tab(i)
7798                     AND EXISTS ( SELECT null
7799                          FROM   pa_budget_lines bl
7800                          WHERE  bl.resource_assignment_id = rbc.resource_assignment_id
7801                          AND    bl.txn_currency_code <> rbc.txn_currency_code )
7802                     AND rbc.total_quantity is NULL
7803                     AND rbc.total_init_quantity is NULL
7804                     AND rbc.txn_raw_cost_rate_override is NULL
7805                     AND rbc.txn_burden_cost_rate_override is NULL
7806                         ;
7807                          print_msg('Number of rows deleted from new entity['||sql%rowcount||']');
7808                  END LOOP;
7809                 End If;
7810         End If;
7811 
7812 
7813 EXCEPTION
7814     WHEN OTHERS THEN
7815         x_return_status := 'U';
7816         x_msg_data := substr(SQLCODE||SQLERRM,1,250);
7817         print_msg('Unexpected error occured in Delete_BL_Where_Nulls['||x_msg_data||']');
7818         RAISE;
7819 
7820 END Delete_BL_Where_Nulls;
7821 
7822 /*
7823 * This is main API interface called from self-service and AMG packages
7824 * When the API is called from page/AMG, the api compares the values in params
7825 * with the actual budget lines and stores the diff in addl_tab columns
7826 * based on the addl_tab columns the calculate derives the rates and calls
7827 * reporting and rollup pkgs.
7828 * The following are the must required params
7829 * p_project_id                  Required
7830 * p_budget_version_id       Required
7831 * p_source_context              Required  possible values are 'RESOURCE_ASSIGNMENT' or 'BUDGET_LINE'
7832 * p_calling_module              Required  possible values are  'UPDATE_PLAN_TRANSACTION' / 'BUDGET_GENERATION','FORECAST_GENERATION'
7833 * p_activity_code       Required  possible values are  'CALCULATE'
7834 * If p_mass_adjust_flag  is passed as 'Y' then following one-of the params must be passed
7835 *   p_quantity_adj_pct
7836 *   p_cost_rate_adj_pct
7837 *   p_burdened_rate_adj_pct
7838 *   p_bill_rate_adj_pct
7839 * The following are the valid values for p_refresh_rates_flag
7840 *      'Y'     -- Refresh all Raw cost,burden cost and revenue amounts
7841 *      'C'     -- Refresh only Raw cost and burden cost amounts but retain the Revenue amounts
7842 *      'R'     -- Refresh only Revenue amounts
7843 *      'N'     -- No Refresh
7844 *  Note: The values ('C' and 'R' is valid only in calling module = 'BUDGET_GENERATION' and 'FORECAST_GENERATION' )
7845 * the following params are only for internal purposes, the values passed from AMG or page will be ignored
7846 *   p_addl_qty_tab,p_addl_raw_cost_tab,p_addl_burdened_cost_tab,p_addl_revenue_tab
7847 *
7848 */
7849 PROCEDURE calculate (  p_project_id                    IN  pa_projects_all.project_id%TYPE
7850                       ,p_budget_version_id             IN  pa_budget_versions.budget_version_id%TYPE
7851                       ,p_refresh_rates_flag            IN  VARCHAR2 := 'N'
7852                       ,p_refresh_conv_rates_flag       IN  VARCHAR2 := 'N'
7853                       ,p_spread_required_flag          IN  VARCHAR2 := 'Y'
7854                       ,p_conv_rates_required_flag      IN  VARCHAR2 := 'Y'
7855                       ,p_rollup_required_flag          IN  VARCHAR2 := 'Y'
7856                       ,p_mass_adjust_flag              IN  VARCHAR2 := 'N'
7857                       ,p_apply_progress_flag           IN  VARCHAR2 := 'N'
7858                       ,p_wp_cost_changed_flag          IN  VARCHAR2 := 'N'
7859                       ,p_time_phase_changed_flag       IN  VARCHAR2 := 'N'
7860                       ,p_quantity_adj_pct              IN  NUMBER   := NULL
7861                       ,p_cost_rate_adj_pct             IN  NUMBER   := NULL
7862                       ,p_burdened_rate_adj_pct         IN  NUMBER   := NULL
7863                       ,p_bill_rate_adj_pct             IN  NUMBER   := NULL
7864 		      ,p_raw_cost_adj_pct              IN  NUMBER   := NULL
7865                       ,p_burden_cost_adj_pct           IN  NUMBER   := NULL
7866                       ,p_revenue_adj_pct               IN  NUMBER   := NULL
7867                       ,p_source_context                IN  pa_fp_res_assignments_tmp.source_context%TYPE
7868                       ,p_calling_module                IN  VARCHAR2  DEFAULT   'UPDATE_PLAN_TRANSACTION'
7869                       ,p_activity_code                 IN  VARCHAR2  DEFAULT   'CALCULATE'
7870                       ,p_resource_assignment_tab       IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
7871                       ,p_delete_budget_lines_tab       IN  SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type()
7872                       ,p_spread_amts_flag_tab          IN  SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type()
7873                       ,p_txn_currency_code_tab         IN  SYSTEM.pa_varchar2_15_tbl_type    DEFAULT SYSTEM.pa_varchar2_15_tbl_type()
7874                       ,p_txn_currency_override_tab     IN  SYSTEM.pa_varchar2_15_tbl_type    DEFAULT SYSTEM.pa_varchar2_15_tbl_type()
7875                       ,p_total_qty_tab                 IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
7876                       ,p_addl_qty_tab                  IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
7877                       ,p_total_raw_cost_tab            IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
7878                       ,p_addl_raw_cost_tab             IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
7879                       ,p_total_burdened_cost_tab       IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
7880                       ,p_addl_burdened_cost_tab        IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
7881                       ,p_total_revenue_tab             IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
7882                       ,p_addl_revenue_tab              IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
7883                       ,p_raw_cost_rate_tab             IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
7884                       ,p_rw_cost_rate_override_tab     IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
7885                       ,p_b_cost_rate_tab               IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
7886                       ,p_b_cost_rate_override_tab      IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
7887                       ,p_bill_rate_tab                 IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
7888                       ,p_bill_rate_override_tab        IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
7889                       ,p_line_start_date_tab           IN  SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type()
7890                       ,p_line_end_date_tab             IN  SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type()
7891               /* Added for Spread enhancements */
7892                       ,p_mfc_cost_type_id_old_tab      IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
7893                       ,p_mfc_cost_type_id_new_tab      IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
7894                       ,p_spread_curve_id_old_tab       IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
7895                       ,p_spread_curve_id_new_tab       IN  SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type()
7896                       ,p_sp_fixed_date_old_tab         IN  SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type()
7897                       ,p_sp_fixed_date_new_tab         IN  SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type()
7898                       ,p_plan_start_date_old_tab       IN  SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type()
7899                       ,p_plan_start_date_new_tab       IN  SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type()
7900                       ,p_plan_end_date_old_tab         IN  SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type()
7901                       ,p_plan_end_date_new_tab         IN  SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type()
7902                       ,p_re_spread_flag_tab            IN  SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type()
7903                       ,p_rlm_id_change_flag_tab        IN  SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type()
7904                       ,p_del_spread_calc_tmp1_flg      IN  VARCHAR2 := 'Y' /* Bug: 4309290.Added the parameter to identify if
7905                                                                            PA_FP_SPREAD_CALC_TMP1 is to be deleted or not. Frm AMG flow
7906                                                                            we will pass N and for other calls to calculate api it would
7907                                                                            be yes */
7908               ,p_fp_task_billable_flag_tab     IN  SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type() /* default 'D' */
7909               ,p_clientExtn_api_call_flag      IN  VARCHAR2 DEFAULT 'Y'
7910               ,p_raTxn_rollup_api_call_flag    IN  VARCHAR2 DEFAULT 'Y' /* Bug fix:4900436 */
7911                       ,x_return_status                 OUT NOCOPY VARCHAR2
7912                       ,x_msg_count                     OUT NOCOPY NUMBER
7913                       ,x_msg_data                      OUT VARCHAR2) IS
7914 
7915     l_tab_count            NUMBER;
7916     l_stage                NUMBER;
7917     l_debug_mode           VARCHAR2(30);
7918     l_delete_budget_lines  VARCHAR2(1);
7919     l_return_status        VARCHAR2(240);
7920     l_entire_return_status VARCHAR2(240);
7921     l_msg_index_out        NUMBER;
7922     l_txn_init_quantity    Number;
7923     l_fp_cols_rec          PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
7924     l_calling_module       Varchar2(240) := NVL(p_calling_module,'UPDATE_PLAN_TRANSACTION');
7925     l_activity_code        varchar2(240) := NVL(p_activity_code,'CALCULATE');
7926 
7927     l_apply_progress_flag  varchar2(20) := 'N';
7928     l_countr        NUMBER ;
7929     l_message_name         VARCHAR2(100);
7930 
7931 -- TABLE IN LOCAL VARIABLES
7932   l_resource_assignment_tab         SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type();
7933   l_delete_budget_lines_tab         SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7934   l_spread_amts_flag_tab            SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7935   l_txn_currency_code_tab           SYSTEM.pa_varchar2_15_tbl_type    DEFAULT SYSTEM.pa_varchar2_15_tbl_type();
7936   l_txn_currency_override_tab       SYSTEM.pa_varchar2_15_tbl_type    DEFAULT SYSTEM.pa_varchar2_15_tbl_type();
7937   l_total_qty_tab                   SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type();
7938   l_addl_qty_tab                    SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type();
7939   l_total_raw_cost_tab              SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type();
7940   l_addl_raw_cost_tab               SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type();
7941   l_total_burdened_cost_tab         SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type();
7942   l_addl_burdened_cost_tab          SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type();
7943   l_total_revenue_tab               SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type();
7944   l_addl_revenue_tab                SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type();
7945   l_raw_cost_rate_tab               SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type();
7946   l_rw_cost_rate_override_tab       SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type();
7947   l_b_cost_rate_tab                 SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type();
7948   l_b_cost_rate_override_tab        SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type();
7949   l_bill_rate_tab                   SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type();
7950   l_bill_rate_override_tab          SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type();
7951   l_line_start_date_tab             SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type();
7952   l_line_end_date_tab               SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type();
7953   l_spread_curve_id_old_tab         SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type();
7954   l_spread_curve_id_new_tab         SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type();
7955   l_sp_fixed_date_old_tab           SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type();
7956   l_sp_fixed_date_new_tab           SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type();
7957   l_plan_start_date_old_tab         SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type();
7958   l_plan_start_date_new_tab         SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type();
7959   l_plan_end_date_old_tab           SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type();
7960   l_plan_end_date_new_tab           SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type();
7961   l_re_spread_flag_tab              SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7962   l_sp_curve_change_flag_tab        SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7963   l_plan_dates_change_flag_tab      SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7964   l_spfix_date_flag_tab             SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7965   l_mfc_cost_type_id_old_tab        SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type();
7966   l_mfc_cost_type_id_new_tab        SYSTEM.pa_num_tbl_type            DEFAULT SYSTEM.pa_num_tbl_type();
7967   l_mfc_cost_change_flag_tab        SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7968   l_rlm_id_change_flag_tab          SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7969   l_plan_sdate_shrunk_flag_tab      SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7970   l_plan_edate_shrunk_flag_tab      SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7971   l_mfc_cost_refresh_flag_tab       SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7972   l_ra_in_multi_cur_flag_tab        SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7973   l_fp_task_billable_flag_tab       SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7974 
7975   l_quantity_changed_flag_tab       SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7976   l_raw_cost_changed_flag_tab       SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7977   l_cost_rate_changed_flag_tab      SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7978   l_burden_cost_changed_flag_tab    SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7979   l_burden_rate_changed_flag_tab    SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7980   l_rev_changed_flag_tab            SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7981   l_bill_rate_changed_flag_tab      SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7982   l_multicur_plan_start_date_tab    SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type();
7983   l_multicur_plan_end_date_tab      SYSTEM.pa_date_tbl_type           DEFAULT SYSTEM.pa_date_tbl_type();
7984 
7985   l_cost_rt_miss_num_flag_tab       SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7986   l_burd_rt_miss_num_flag_tab       SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7987   l_bill_rt_miss_num_flag_tab       SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7988   l_Qty_miss_num_flag_tab	    SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7989   l_Rw_miss_num_flag_tab	    SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7990   l_Br_miss_num_flag_tab	    SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7991   l_Rv_miss_num_flag_tab	    SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7992   l_rev_only_entry_flag_tab         SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7993 
7994   /* bug fix:5726773 */
7995   l_neg_Qty_Changflag_tab         SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7996   l_neg_Raw_Changflag_tab         SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7997   l_neg_Burd_Changflag_tab         SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7998   l_neg_rev_Changflag_tab         SYSTEM.pa_varchar2_1_tbl_type     DEFAULT SYSTEM.pa_varchar2_1_tbl_type();
7999 
8000     --pa_resource_assignemts local variables--
8001     l_resource_assignment_id           pa_resource_assignments.resource_assignment_id%TYPE;
8002     l_planning_start_date              pa_resource_assignments.planning_start_date%TYPE;
8003     l_planning_end_date                pa_resource_assignments.planning_end_date%TYPE;
8004     l_spread_curve_id                  pa_resource_assignments.spread_curve_id%TYPE;
8005     l_resource_class_code              pa_resource_assignments.resource_class_code%TYPE;
8006     l_sp_fixed_date                    pa_resource_assignments.sp_fixed_date%TYPE;
8007     l_rate_based_flag                  pa_resource_assignments.rate_based_flag%TYPE;
8008     -- end of pa_resource_assignemts local variables--
8009 
8010 	--bug#14398131 :: added the following 3 variables l_txn_raw_cost_total, l_txn_burdened_cost_total and l_txn_revenue_total
8011     l_txn_raw_cost_total                     pa_fp_res_assignments_tmp.txn_raw_cost%TYPE;
8012     l_txn_burdened_cost_total                pa_fp_res_assignments_tmp.txn_burdened_cost%TYPE;
8013     l_txn_raw_cost_total_bl                     pa_fp_res_assignments_tmp.txn_raw_cost%TYPE;
8014     l_txn_burdened_cost_total_bl                pa_fp_res_assignments_tmp.txn_burdened_cost%TYPE;
8015 
8016     l_txn_currency_code                pa_fp_res_assignments_tmp.txn_currency_code%TYPE;
8017     l_txn_revenue                      pa_fp_res_assignments_tmp.txn_revenue%TYPE;
8018     l_txn_revenue_addl                 pa_fp_res_assignments_tmp.txn_revenue_addl%TYPE;
8019     l_txn_raw_cost                     pa_fp_res_assignments_tmp.txn_raw_cost%TYPE;
8020     l_txn_raw_cost_addl                pa_fp_res_assignments_tmp.txn_raw_cost_addl%TYPE;
8021     l_txn_burdened_cost                pa_fp_res_assignments_tmp.txn_burdened_cost%TYPE;
8022     l_txn_burdened_cost_addl           pa_fp_res_assignments_tmp.txn_burdened_cost_addl%TYPE;
8023     l_txn_plan_quantity                pa_fp_res_assignments_tmp.txn_plan_quantity%TYPE;
8024     l_txn_plan_quantity_addl           pa_fp_res_assignments_tmp.txn_plan_quantity_addl%TYPE;
8025     l_txn_currency_code_override       pa_fp_res_assignments_tmp.txn_currency_code_override%TYPE;
8026     l_txn_init_revenue                 pa_fp_res_assignments_tmp.txn_init_revenue%TYPE;
8027     l_txn_init_revenue_addl            pa_fp_res_assignments_tmp.txn_init_revenue_addl%TYPE;
8028     l_txn_init_raw_cost                pa_fp_res_assignments_tmp.txn_init_raw_cost%TYPE;
8029     l_txn_init_raw_cost_addl           pa_fp_res_assignments_tmp.txn_init_raw_cost_addl%TYPE;
8030     l_txn_init_burdened_cost           pa_fp_res_assignments_tmp.txn_init_burdened_cost%TYPE;
8031     l_txn_init_burdened_cost_addl      pa_fp_res_assignments_tmp.txn_init_burdened_cost_addl%TYPE;
8032     l_init_quantity                    pa_fp_res_assignments_tmp.init_quantity%TYPE;
8033     l_init_quantity_addl               pa_fp_res_assignments_tmp.init_quantity_addl%TYPE;
8034     l_spread_amounts_flag              pa_fp_res_assignments_tmp.spread_amounts_flag%TYPE;
8035     l_raw_cost_rate                    pa_fp_res_assignments_tmp.raw_cost_rate%TYPE;
8036     l_rw_cost_rate_override            pa_fp_res_assignments_tmp.rw_cost_rate_override%TYPE;
8037     l_burden_cost_rate                 pa_fp_res_assignments_tmp.burden_cost_rate%TYPE;
8038     l_burden_cost_rate_override        pa_fp_res_assignments_tmp.burden_cost_rate_override%TYPE;
8039     l_bill_rate                        pa_fp_res_assignments_tmp.bill_rate%TYPE;
8040     l_bill_rate_override               pa_fp_res_assignments_tmp.bill_rate_override%TYPE;
8041     l_org_id                           pa_projects_all.org_id%TYPE;
8042 
8043     l_cost_rt_miss_num_flag            VARCHAR2(1) := NULL;
8044     l_burd_rt_miss_num_flag            VARCHAR2(1) := NULL;
8045     l_bill_rt_miss_num_flag     VARCHAR2(1) := NULL;
8046 
8047 
8048     --pa_budget_lines local variables---
8049     l_budget_line_id                   pa_budget_lines.budget_line_id%TYPE;
8050     l_bl_quantity                      pa_budget_lines.quantity%TYPE;
8051     l_bl_raw_cost_rate                 pa_budget_lines.txn_standard_cost_rate%TYPE;
8052     l_bl_standard_cost_rate            pa_budget_lines.txn_standard_cost_rate%TYPE;
8053     l_bl_cost_rate_override            pa_budget_lines.txn_cost_rate_override%TYPE;
8054     l_bl_raw_cost                      pa_budget_lines.txn_raw_cost%TYPE;
8055     l_bl_avg_burden_cost_rate          pa_budget_lines.burden_cost_rate%TYPE;
8056     l_bl_burden_cost_rate              pa_budget_lines.burden_cost_rate%TYPE;
8057     l_bl_burden_cost_rate_override     pa_budget_lines.burden_cost_rate_override%TYPE;
8058     l_bl_burdened_cost                 pa_budget_lines.txn_burdened_cost%TYPE;
8059     l_bl_bill_rate                     pa_budget_lines.txn_standard_bill_rate%TYPE;
8060     l_bl_standard_bill_rate            pa_budget_lines.txn_standard_bill_rate%TYPE;
8061     l_bl_bill_rate_override            pa_budget_lines.txn_bill_rate_override%TYPE;
8062     l_bl_revenue                       pa_budget_lines.txn_revenue%TYPE;
8063 
8064     l_actual_exists_flag               VARCHAR2(60);
8065     l_resAttribChangeFlag              VARCHAR2(1) := 'N';
8066     l_multicur_plan_start_date         DATE;
8067     l_multicur_plan_end_date         DATE;
8068 
8069     l_num_rowsdeleted    Number := 0;
8070     blrec   get_bl_date_csr%ROWTYPE;
8071 
8072     --bug#14398131 :: added the following CURSOR to get total sum values.
8073 
8074     CURSOR get_total_amounts_res_asn (p_resource_asg_id IN NUMBER) IS
8075     select sum(txn_burdened_cost) l_txn_burdened_cost_total_bl,
8076     sum(txn_raw_cost) l_txn_raw_cost_total_bl
8077     from pa_fp_rollup_tmp
8078     where budget_version_id = p_budget_version_id
8079     and resource_assignment_id = p_resource_asg_id;
8080 
8081     CURSOR get_p_res_asn_curr_code IS
8082         SELECT resource_assignment_id
8083             ,txn_currency_code
8084         FROM pa_budget_lines bl
8085         WHERE bl.budget_version_id = p_budget_version_id
8086     GROUP BY resource_assignment_id,txn_currency_code;
8087 
8088     CURSOR get_proj_fp_options_csr IS
8089         SELECT nvl(pfo.use_planning_rates_flag,'N') use_planning_rates_flag
8090           ,decode(nvl(bv.wp_version_flag,'N'),'Y',NVL(pfo.track_workplan_costs_flag,'N'),'Y') track_workplan_costs_flag
8091           ,bv.version_type
8092           ,bv.resource_list_id
8093           ,bv.approved_rev_plan_type_flag
8094           ,nvl(pfo.plan_in_multi_curr_flag,'N') plan_in_multi_curr_flag
8095           ,bv.etc_start_date
8096           ,nvl(bv.wp_version_flag,'N') wp_version_flag
8097       ,decode(bv.version_type,
8098                   'COST',NVL(pfo.cost_time_phased_code,'N'),
8099                   'REVENUE',NVL(pfo.revenue_time_phased_code,'N'),
8100                   NVL(pfo.all_time_phased_code,'N')) time_phased_code
8101       ,bv.project_structure_version_id
8102       ,bv.project_id
8103       ,pp.project_currency_code
8104       ,pp.projfunc_currency_code
8105       ,pp.segment1  project_Name
8106       ,bv.ci_id     CiId
8107       /*Bugfix:4272944 */
8108           ,NVL(pp.baseline_funding_flag,'N') baseline_funding_flag
8109         FROM pa_proj_fp_options pfo
8110             ,pa_budget_versions bv
8111         ,pa_projects_all pp
8112         WHERE pfo.fin_plan_version_id = bv.budget_version_id
8113     AND  bv.project_id = pp.project_id
8114         AND bv.budget_version_id = p_budget_version_id;
8115     ProjFpOptRec    get_proj_fp_options_csr%ROWTYPE;
8116 
8117 
8118     CURSOR get_bl_currency IS
8119         SELECT txn_currency_code
8120         FROM  pa_budget_lines
8121         WHERE  resource_assignment_id = l_resource_assignment_id
8122     ORDER BY start_date;
8123 
8124     CURSOR get_resource_asn_csr (p_resource_asg_id IN NUMBER) IS
8125         SELECT ra.resource_assignment_id
8126            ,ra.budget_version_id
8127            ,ra.project_id
8128            ,ra.task_id
8129            ,ra.resource_list_member_id
8130            ,ra.planning_start_date
8131            ,ra.planning_end_date
8132            ,ra.spread_curve_id
8133            ,ra.etc_method_code
8134            ,ra.resource_class_code
8135            ,ra.mfc_cost_type_id
8136            ,ra.sp_fixed_date
8137            ,ra.rate_based_flag
8138        ,rl.alias  Resource_Name
8139         FROM pa_resource_assignments ra
8140         ,pa_resource_list_members rl
8141         WHERE ra.resource_assignment_id = p_resource_asg_id
8142     AND  ra.resource_list_member_id = rl.resource_list_member_id ;
8143     ResAsgnRec    get_resource_asn_csr%ROWTYPE;
8144 
8145     -- --Bug 6781055. Added rowid in the cursor
8146     CURSOR get_client_xtn_rollup_csr IS
8147         SELECT tmp.rowid
8148            ,tmp.budget_line_id
8149            ,tmp.resource_assignment_id
8150            ,tmp.txn_currency_code
8151            ,tmp.start_date
8152            ,tmp.end_date
8153            ,tmp.period_name
8154            ,tmp.quantity
8155            ,tmp.txn_raw_cost
8156        ,tmp.cost_rate
8157        ,tmp.rw_cost_rate_override
8158            ,tmp.txn_burdened_cost
8159        ,tmp.burden_cost_rate
8160        ,tmp.burden_cost_rate_override
8161            ,tmp.txn_revenue
8162        ,tmp.bill_rate
8163        ,tmp.bill_rate_override
8164            ,tmp.pm_product_code
8165        ,bv.version_type
8166        ,ra.resource_list_member_id
8167        ,ra.rate_based_flag
8168        ,ra.task_id
8169        ,rl.resource_id
8170         ,tmp.cost_rejection_code
8171     ,tmp.burden_rejection_code
8172     ,tmp.revenue_rejection_code
8173         -- Bug 6781055
8174         ,tmp.init_quantity
8175         ,tmp.txn_init_raw_cost
8176         ,tmp.txn_init_burdened_cost
8177         ,tmp.txn_init_revenue
8178         -- End for 6781055
8179         FROM pa_fp_rollup_tmp tmp
8180         ,pa_budget_versions bv
8181         ,pa_resource_assignments ra
8182         ,pa_resource_list_members rl
8183     WHERE bv.budget_version_id = p_budget_version_id
8184     AND   ra.budget_version_id = bv.budget_version_id
8185     AND   tmp.resource_assignment_id = ra.resource_assignment_id
8186     AND   ra.resource_list_member_id = rl.resource_list_member_id
8187         ORDER BY tmp.resource_assignment_id
8188         ,tmp.start_date
8189         ,tmp.txn_currency_code;
8190 
8191     -------------------------------- cursors for rate api variables-------------------
8192     ---error code cursor---
8193     CURSOR get_line_info (p_resource_assignment_id IN NUMBER) IS
8194         SELECT pt.name task_name
8195                ,prl.alias resource_name
8196         FROM pa_proj_elements pt
8197                ,pa_resource_list_members prl
8198                ,pa_resource_assignments pra
8199         WHERE pra.resource_assignment_id = p_resource_assignment_id
8200         AND pt.proj_element_id(+) = pra.task_id
8201         AND prl.resource_list_member_id = pra.resource_list_member_id;
8202 
8203     l_bdgt_line_sDate       Date := NULL;
8204         l_bdgt_line_eDate       Date := NULL;
8205     l_quantity_changed_flag     Varchar2(10) := 'N';
8206         l_raw_cost_changed_flag     Varchar2(10) := 'N';
8207         l_rw_cost_rate_changed_flag     Varchar2(10) := 'N';
8208         l_burden_cost_changed_flag  Varchar2(10) := 'N';
8209         l_b_cost_rate_changed_flag  Varchar2(10) := 'N';
8210         l_rev_changed_flag      Varchar2(10) := 'N';
8211         l_bill_rate_changed_flag    Varchar2(10) := 'N';
8212         l_bill_rt_ovr_changed_flag  Varchar2(10) := 'N';
8213         l_bl_init_raw_cost      Number;
8214         l_bl_init_burdened_cost     Number;
8215         l_bl_init_revenue       Number;
8216         l_bl_init_quantity      Number;
8217     l_agreement_cur_code        Varchar2(15);
8218 
8219         l_curr_burden_rate      Number := NULL; -- IPM
8220         l_curr_bill_rate        Number := NULL; -- IPM
8221 	l_curr_cost_rate        Number := NULL; -- bug fix:5726773
8222     l_curr_markup_percentage Number := NULL; --IPM
8223     /* Bug fix:4263265 the following variables declared to keep track of what is changed before deleteing
8224          * after deleting budget lines. these variables stores the original changed values passed to calculate
8225          * by comparing with the budget lines */
8226     l_org_quantity_changed_flag     Varchar2(10) := 'N';
8227         l_org_raw_cost_changed_flag     Varchar2(10) := 'N';
8228         l_org_rw_rate_changed_flag      Varchar2(10) := 'N';
8229         l_org_burden_cost_changed_flag  Varchar2(10) := 'N';
8230         l_org_b_cost_rate_changed_flag  Varchar2(10) := 'N';
8231         l_org_rev_changed_flag          Varchar2(10) := 'N';
8232         l_org_bill_rate_changed_flag    Varchar2(10) := 'N';
8233     l_generation_context            Varchar2(50) := 'SPREAD';
8234 
8235     l_re_spread_amts_flag       Varchar2(10) := 'N';
8236         l_sp_curve_change_flag      Varchar2(10) := 'N';
8237         l_plan_dates_change_flag    Varchar2(10) := 'N';
8238         l_spfix_date_change_flag    Varchar2(10) := 'N';
8239         l_mfc_cost_change_flag      Varchar2(10) := 'N';
8240         l_rlm_id_change_flag        Varchar2(10) := 'N';
8241         l_plan_sdate_shrunk_flag    Varchar2(10) := 'N';
8242         l_plan_edate_shrunk_flag    Varchar2(10) := 'N';
8243         l_ra_in_multi_cur_flag      Varchar2(10) := 'N';
8244 
8245     /* declared the following tbl for client extn bulk update */
8246     l_cl_txn_plan_quantity_tab  pa_plsql_datatypes.NumTabTyp;
8247         l_cl_txn_raw_cost_tab       pa_plsql_datatypes.NumTabTyp;
8248         l_cl_txn_burdened_cost_tab  pa_plsql_datatypes.NumTabTyp;
8249         l_cl_txn_revenue_tab        pa_plsql_datatypes.NumTabTyp;
8250         l_cl_cost_rate_override_tab pa_plsql_datatypes.NumTabTyp;
8251         l_cl_burden_rate_override_tab   pa_plsql_datatypes.NumTabTyp;
8252         l_cl_bill_rate_override_tab pa_plsql_datatypes.NumTabTyp;
8253         l_cl_budget_line_id_tab     pa_plsql_datatypes.NumTabTyp;
8254     l_cl_raw_rejection_code_tab pa_plsql_datatypes.char30TabTyp;
8255     l_cl_burd_rejection_code_tab pa_plsql_datatypes.char30TabTyp;
8256     l_cl_rev_rejection_code_tab  pa_plsql_datatypes.char30TabTyp;
8257     l_cl_cntr           NUMBER := 0;
8258     l_cl_raw_rejection_code     VARCHAR2(30);
8259         l_cl_burd_rejection_code    VARCHAR2(30);
8260         l_cl_rev_rejection_code     VARCHAR2(30);
8261 
8262 	l_raTxnRec_mode		  VARCHAR2(80);
8263 
8264         /* bug fix: 5028631 */
8265         l_msg_data   Varchar2(2000);
8266 
8267 	l_calc_start_time       Number;
8268 	l_pls_start_time	Number;
8269 	l_pls_end_time		Number;
8270 
8271     -- Start for Bug# 6781055
8272     l_rec_modified_in_cl_flag     VARCHAR2(1);
8273     l_cl_init_quantity            pa_budget_lines.init_quantity%TYPE;
8274     l_cl_init_raw_cost            pa_budget_lines.txn_init_raw_cost%TYPE;
8275     l_cl_init_burd_cost           pa_budget_lines.txn_init_burdened_cost%TYPE;
8276     l_cl_init_revenue             pa_budget_lines.txn_init_revenue%TYPE;
8277     -- End for Bug# 6781055
8278 
8279     l_locked                     VARCHAR2(5);  -- Bug 11810038
8280 
8281  BEGIN
8282 g_ipm_ra_id_tab.delete;
8283 g_ipm_curr_code_tab.delete;
8284 g_ipm_cost_rate_ovr_tab.delete;
8285 g_ipm_bill_rate_ovr_tab.delete;
8286 g_ipm_burden_rate_ovr_tab.delete;
8287 -- For Bug# 6781055
8288 gl_cl_roll_up_tmp_rowid_tab.delete;
8289 
8290     IF p_pa_debug_mode = 'Y' Then
8291         pa_debug.init_err_stack('PA_FP_CALC_PLAN_PKG.calculate');
8292         pa_debug.set_process('PLSQL','LOG',l_debug_mode);
8293     End If;
8294         l_return_status        := FND_API.G_RET_STS_SUCCESS;
8295         l_entire_return_status := FND_API.G_RET_STS_SUCCESS;
8296         x_return_status        := FND_API.G_RET_STS_SUCCESS;
8297 
8298     /* Initialize the msg stack */
8299     FND_MSG_PUB.initialize;
8300 
8301     SAVEPOINT start_of_calculate_api;
8302 
8303         /* Bug fix: 4078623 Set curr and init err stack both are calling but reset curr function is not done.
8304          * This api call is not required as it does the same as init_err_stack
8305         --pa_debug.set_curr_function( p_function     => 'PA_FP_CALC_PLAN_PKG.calculate'
8306                                    --,p_debug_mode   =>  p_pa_debug_mode);
8307          */
8308 	l_calc_start_time := dbms_utility.get_time;
8309 	print_plsql_time('Calculate API start Time:['||l_calc_start_time||']','Y');
8310 	If P_PA_DEBUG_MODE = 'Y' Then
8311         l_stage := 10;
8312         print_msg(to_char(l_stage)||' Entered PA_FP_CALC_PLAN_PKG.calculate');
8313     	print_msg('Calculate API start Time:['||l_calc_start_time||']','Y');
8314         l_stage := 20;
8315         print_msg('PA_FP_CALC_PLAN_PKG.calculat IN param(Scalar) values');
8316         print_msg('p_project_id                  => '|| to_char(p_project_id));
8317         print_msg('p_budget_version_id           => '|| to_char(p_budget_version_id));
8318         print_msg('p_refresh_rates_flag          => '|| p_refresh_rates_flag);
8319         print_msg('p_refresh_conv_rates_flag     => '|| p_refresh_conv_rates_flag);
8320         print_msg('p_spread_required_flag:Obsoleted: => '|| p_spread_required_flag);
8321         print_msg('p_conv_rates_required_flag    => '|| p_conv_rates_required_flag);
8322         print_msg('p_rollup_required_flag        => '|| p_rollup_required_flag);
8323         print_msg('p_mass_adjust_flag            => '|| p_mass_adjust_flag);
8324         print_msg('p_quantity_adj_pct            => '|| to_char(p_quantity_adj_pct));
8325         print_msg('p_cost_rate_adj_pct           => '|| to_char(p_cost_rate_adj_pct));
8326         print_msg('p_burdened_rate_adj_pct       => '|| to_char(p_burdened_rate_adj_pct));
8327         print_msg('p_bill_rate_adj_pct           => '|| to_char(p_bill_rate_adj_pct));
8328 	print_msg('p_raw_cost_adj_pct            => '|| to_char(p_raw_cost_adj_pct));
8329         print_msg('p_burden_cost_adj_pct         => '|| to_char(p_burden_cost_adj_pct));
8330         print_msg('p_revenue_adj_pct             => '|| to_char(p_revenue_adj_pct));
8331     	print_msg('p_calling_module              => '|| nvl(p_calling_module,l_calling_module));
8332         print_msg('p_source_context              => '|| p_source_context);
8333     	print_msg('p_apply_progress_flag         => '|| p_apply_progress_flag);
8334     	print_msg('p_wp_cost_changed_flag        => '|| p_wp_cost_changed_flag);
8335         print_msg('p_time_phase_changed_flag     => '|| p_time_phase_changed_flag);
8336         print_msg('p_clientExtn_api_call_flag     => '|| p_clientExtn_api_call_flag);
8337         print_msg('p_raTxn_rollup_api_call_flag	  => '|| p_raTxn_rollup_api_call_flag);
8338         print_msg(to_char(l_stage)||' Initialization all local plsql tables ');
8339 	End If;
8340 
8341         l_resource_assignment_tab.delete;
8342         l_delete_budget_lines_tab.delete;
8343         l_spread_amts_flag_tab.delete;
8344         l_txn_currency_code_tab.delete;
8345         l_txn_currency_override_tab.delete;
8346         l_total_qty_tab.delete;
8347         l_addl_qty_tab.delete;
8348         l_total_raw_cost_tab.delete;
8349         l_addl_raw_cost_tab.delete;
8350         l_total_burdened_cost_tab.delete;
8351         l_addl_burdened_cost_tab.delete;
8352         l_total_revenue_tab.delete;
8353         l_addl_revenue_tab.delete;
8354         l_raw_cost_rate_tab.delete;
8355         l_rw_cost_rate_override_tab.delete;
8356         l_b_cost_rate_tab.delete;
8357         l_b_cost_rate_override_tab.delete;
8358         l_bill_rate_tab.delete;
8359         l_bill_rate_override_tab.delete;
8360         l_line_start_date_tab.delete;
8361         l_line_end_date_tab.delete;
8362     g_apply_progress_flag_tab.delete;
8363     l_spread_curve_id_old_tab.delete;
8364     l_spread_curve_id_new_tab.delete;
8365     l_sp_fixed_date_old_tab.delete;
8366     l_sp_fixed_date_new_tab.delete;
8367     l_plan_start_date_old_tab.delete;
8368     l_plan_start_date_new_tab.delete;
8369     l_plan_end_date_old_tab.delete;
8370     l_plan_end_date_new_tab.delete;
8371     l_re_spread_flag_tab.delete;
8372     l_sp_curve_change_flag_tab.delete;
8373     l_plan_dates_change_flag_tab.delete;
8374     l_spfix_date_flag_tab.delete;
8375     l_mfc_cost_change_flag_tab.delete;
8376     l_mfc_cost_type_id_old_tab.delete;
8377     l_mfc_cost_type_id_new_tab.delete;
8378     l_rlm_id_change_flag_tab.delete;
8379     l_plan_sdate_shrunk_flag_tab.delete;
8380     l_plan_edate_shrunk_flag_tab.delete;
8381     l_mfc_cost_refresh_flag_tab.delete;
8382     l_ra_in_multi_cur_flag_tab.delete;
8383     l_quantity_changed_flag_tab.delete;
8384     l_raw_cost_changed_flag_tab.delete;
8385     l_cost_rate_changed_flag_tab.delete;
8386     l_burden_cost_changed_flag_tab.delete;
8387     l_burden_rate_changed_flag_tab.delete;
8388     l_rev_changed_flag_tab.delete;
8389     l_bill_rate_changed_flag_tab.delete;
8390     l_multicur_plan_start_date_tab.delete;
8391         l_multicur_plan_end_date_tab.delete;
8392     l_fp_task_billable_flag_tab.delete;
8393     l_cost_rt_miss_num_flag_tab.delete;
8394     l_burd_rt_miss_num_flag_tab.delete;
8395     l_bill_rt_miss_num_flag_tab.delete;
8396     l_Qty_miss_num_flag_tab.delete;
8397     l_Rw_miss_num_flag_tab.delete;
8398     l_Br_miss_num_flag_tab.delete;
8399     l_Rv_miss_num_flag_tab.delete;
8400     l_rev_only_entry_flag_tab.delete;
8401 
8402     /* bug fix:5726773 */
8403     l_neg_Qty_Changflag_tab.delete;
8404     l_neg_Raw_Changflag_tab.delete;
8405     l_neg_Burd_Changflag_tab.delete;
8406     l_neg_rev_Changflag_tab.delete;
8407 
8408 
8409         /* Initialize the scalar global variables with in params */
8410         G_refresh_conv_rates_flag       := p_refresh_conv_rates_flag;
8411         G_refresh_rates_flag            := p_refresh_rates_flag;
8412         G_mass_adjust_flag          := p_mass_adjust_flag;
8413         G_source_context            := p_source_context;
8414     	G_calling_module                := p_calling_module;
8415     	G_conv_rates_required_flag      := p_conv_rates_required_flag;
8416     	G_clientExtn_api_call_flag      := NVL(p_clientExtn_api_call_flag,'Y');
8417 
8418 	If NVL(p_wp_cost_changed_flag,'N') = 'Y'
8419 	   and NVL(p_time_phase_changed_flag,'N') = 'N' Then
8420             print_msg('WP costs changed set the refresh cost flag to Y');
8421             -- set the refresh costs flag
8422             G_refresh_rates_flag := 'Y';
8423 
8424         End If;
8425 
8426         l_stage                            := NULL;
8427         x_return_status                    := 'S';
8428         x_msg_count                        := 0;
8429         x_msg_data                         := NULL;
8430         g_bv_resource_list_id              := NULL;
8431         g_bv_approved_rev_flag             := NULL;
8432         g_fp_multi_curr_enabled            := NULL;
8433         g_spread_from_date                 := NULL;
8434         g_session_time                     := NULL;
8435         g_ra_bl_txn_currency_code          := NULL;
8436         G_AGR_CONV_REQD_FLAG               := 'N';
8437         G_AGR_CURRENCY_CODE                := NULL;
8438         g_proj_structure_ver_id            := NULL;
8439     /* Bug fix:4275007 : since these global variables are not initialized, values got cached if the calculate api is called in the same session */
8440     g_proj_rev_rate_type               := NULL;
8441     G_proj_rev_exchange_rate           := NULL;
8442 	G_call_raTxn_rollup_flag	:= NVL(p_raTxn_rollup_api_call_flag,'Y');
8443 
8444         IF p_budget_version_id IS NOT NULL Then
8445 	If P_PA_DEBUG_MODE = 'Y' Then
8446         print_msg('Calling Init_Globals API: p_del_spread_calc_tmp1_flg['||p_del_spread_calc_tmp1_flg||']');
8447 	End If;
8448         Init_Globals(
8449                 p_budget_version_id  => p_budget_version_id
8450                 ,p_source_context    => p_source_context
8451                 ,x_return_status     => l_return_status
8452                 );
8453 	If P_PA_DEBUG_MODE = 'Y' Then
8454         print_msg('ReturnStatus of Init_Globals ['||l_return_status||']');
8455 	End If;
8456         IF l_return_status <> 'S' Then
8457                         x_return_status := l_return_status;
8458                         l_entire_return_status := l_return_status;
8459                         GOTO END_OF_PROCESS;
8460                 END IF;
8461         END IF;
8462 
8463         /* Initialize the spreadCalc global plsql tables */
8464         /*Bug: 4309290. Added the parameter to identify if PA_FP_SPREAD_CALC_TMP1
8465         is to be deleted or not. Frm AMG flow we will pass N and for
8466         other calls to calculate api it would be yes*/
8467         Init_SpreadCalc_Tbls(p_del_spread_calc_tmp1_flg => p_del_spread_calc_tmp1_flg);
8468 
8469         /* Intialize the Mrc Plsql Tabs */
8470         Init_MRC_plsqlTabs;
8471 
8472         /* Initialize reporting tables */
8473         Init_reporting_Tbls;
8474 
8475     /* when calculate api is called in apply progress mode ensure that etc start date is populated */
8476     IF (NVL(p_apply_progress_flag,'N') = 'Y' AND g_spread_from_date is NULL)  Then
8477         l_stage := 15;
8478                 print_msg(l_stage||' ETC START DATE NULL for apply progress call');
8479                 pa_utils.add_message
8480                         ( p_app_short_name => 'PA'
8481                         ,p_msg_name       => 'PA_FP_ETCSTARTDATE_NULL'
8482                         ,p_token1         => 'BUDGET_VERSION_ID'
8483                         ,p_value1         =>  p_budget_version_id
8484                         ,p_token2         => 'PROJECT_ID'
8485                         ,p_value2         =>  p_project_id);
8486                         l_return_status := 'E';
8487                         x_return_status := 'E';
8488             l_entire_return_status := l_return_status;
8489                         GOTO END_OF_PROCESS;
8490     End If;
8491 
8492         l_stage := 25;
8493 	l_pls_start_time := dbms_utility.get_time;
8494     	--print_plsql_time('Start of Validate Inputs:['||l_pls_start_time||']','Y');
8495 	If P_PA_DEBUG_MODE = 'Y' Then
8496         print_msg(to_char(l_stage)||' Calling Validate Inputs');
8497     	print_msg('Start of Validate Inputs:['||l_pls_start_time||']','Y');
8498 	End If;
8499         pa_fp_calc_plan_pkg.validate_inputs
8500         ( p_project_id               =>  p_project_id
8501                 ,p_budget_version_id             =>  p_budget_version_id
8502         ,p_calling_module                =>  l_calling_module
8503         ,p_refresh_rates_flag            =>  G_refresh_rates_flag
8504         ,p_refresh_conv_rates_flag       =>  G_refresh_conv_rates_flag
8505                 ,p_mass_adjust_flag              =>  g_mass_adjust_flag
8506         ,p_qty_adjust_pct                =>  p_quantity_adj_pct
8507                 ,p_cst_rate_adjust_pct           =>  p_cost_rate_adj_pct
8508                 ,p_bd_rate_adjust_pct            =>  p_burdened_rate_adj_pct
8509                 ,p_bill_rate_adjust_pct          =>  p_bill_rate_adj_pct
8510 		,p_raw_cost_adj_pct              => p_raw_cost_adj_pct
8511                 ,p_burden_cost_adj_pct           => p_burden_cost_adj_pct
8512                 ,p_revenue_adj_pct               => p_revenue_adj_pct
8513                 ,p_spread_required_flag          =>  p_spread_required_flag
8514                 ,p_source_context                =>  p_source_context
8515                 ,p_wp_cost_changed_flag          =>  p_wp_cost_changed_flag
8516                 ,p_time_phase_changed_flag       =>  p_time_phase_changed_flag
8517                 ,p_resource_assignment_tab       =>  p_resource_assignment_tab
8518                 ,p_delete_budget_lines_tab       =>  p_delete_budget_lines_tab
8519                 ,p_spread_amts_flag_tab          =>  p_spread_amts_flag_tab
8520                 ,p_txn_currency_code_tab         =>  p_txn_currency_code_tab
8521                 ,p_txn_currency_override_tab     =>  p_txn_currency_override_tab
8522                 ,p_total_qty_tab                 =>  p_total_qty_tab
8523                 ,p_addl_qty_tab                  =>  p_addl_qty_tab
8524                 ,p_total_raw_cost_tab            =>  p_total_raw_cost_tab
8525                 ,p_addl_raw_cost_tab             =>  p_addl_raw_cost_tab
8526                 ,p_total_burdened_cost_tab       =>  p_total_burdened_cost_tab
8527                 ,p_addl_burdened_cost_tab        =>  p_addl_burdened_cost_tab
8528                 ,p_total_revenue_tab             =>  p_total_revenue_tab
8529                 ,p_addl_revenue_tab              =>  p_addl_revenue_tab
8530                 ,p_raw_cost_rate_tab             =>  p_raw_cost_rate_tab
8531                 ,p_rw_cost_rate_override_tab     =>  p_rw_cost_rate_override_tab
8532                 ,p_b_cost_rate_tab               =>  p_b_cost_rate_tab
8533                 ,p_b_cost_rate_override_tab      =>  p_b_cost_rate_override_tab
8534                 ,p_bill_rate_tab                 =>  p_bill_rate_tab
8535                 ,p_bill_rate_override_tab        =>  p_bill_rate_override_tab
8536                 ,p_line_start_date_tab           =>  p_line_start_date_tab
8537                 ,p_line_end_date_tab             =>  p_line_end_date_tab
8538         /* added for enhancements */
8539                 ,p_spread_curve_id_old_tab       =>  p_spread_curve_id_old_tab
8540                 ,p_spread_curve_id_new_tab       =>  p_spread_curve_id_new_tab
8541                 ,p_sp_fixed_date_old_tab         =>  p_sp_fixed_date_old_tab
8542                 ,p_sp_fixed_date_new_tab         =>  p_sp_fixed_date_new_tab
8543                 ,p_plan_start_date_old_tab       =>  p_plan_start_date_old_tab
8544                 ,p_plan_start_date_new_tab       =>  p_plan_start_date_new_tab
8545                 ,p_plan_end_date_old_tab         =>  p_plan_end_date_old_tab
8546                 ,p_plan_end_date_new_tab         =>  p_plan_end_date_new_tab
8547                 ,p_re_spread_flag_tab            =>  p_re_spread_flag_tab
8548                 ,p_sp_curve_change_flag_tab      =>  l_sp_curve_change_flag_tab
8549                 ,p_plan_dates_change_flag_tab    =>  l_plan_dates_change_flag_tab
8550                 ,p_spfix_date_flag_tab           =>  l_spfix_date_flag_tab
8551             ,p_mfc_cost_change_flag_tab      =>  l_mfc_cost_change_flag_tab
8552         ,p_mfc_cost_type_id_old_tab      =>  p_mfc_cost_type_id_old_tab
8553         ,p_mfc_cost_type_id_new_tab      =>  p_mfc_cost_type_id_new_tab
8554         ,p_rlm_id_change_flag_tab       =>  p_rlm_id_change_flag_tab
8555         ,p_fp_task_billable_flag_tab     => p_fp_task_billable_flag_tab
8556                 ,x_return_status                 =>  l_return_status
8557                 ,x_msg_count                     =>  x_msg_count
8558                 ,x_msg_data                      =>  x_msg_data);
8559 	l_pls_end_time := dbms_utility.get_time;
8560 	If P_PA_DEBUG_MODE = 'Y' Then
8561     		print_msg('End of Validate Inputs:['||l_pls_end_time||']','Y');
8562 	End If;
8563     		print_plsql_time('End of Validate Inputs: Total time :['||(l_pls_end_time-l_pls_start_time)||']');
8564 
8565 
8566         IF l_return_status <> 'S' Then
8567             print_msg('Failed in validation inputs');
8568                        x_return_status := l_return_status;
8569                        l_entire_return_status := l_return_status;
8570             GOTO END_OF_PROCESS;
8571                 END IF;
8572 
8573     /*
8574     assign local tab variables the p_tab IN parameters  this needs to be done because table IN parameters needs to be
8575     extended from here on out use the l_tab variable in place of p_tab variables
8576     */
8577         l_resource_assignment_tab     := p_resource_assignment_tab;
8578         l_txn_currency_code_tab       := p_txn_currency_code_tab;
8579         l_delete_budget_lines_tab         := p_delete_budget_lines_tab;
8580         l_spread_amts_flag_tab            := p_spread_amts_flag_tab;
8581         l_txn_currency_override_tab       := p_txn_currency_override_tab;
8582         l_total_qty_tab                   := p_total_qty_tab;
8583         l_addl_qty_tab                    := p_addl_qty_tab;
8584         l_total_raw_cost_tab              := p_total_raw_cost_tab;
8585         l_addl_raw_cost_tab               := p_addl_raw_cost_tab;
8586         l_total_burdened_cost_tab         := p_total_burdened_cost_tab;
8587         l_addl_burdened_cost_tab          := p_addl_burdened_cost_tab;
8588         l_total_revenue_tab               := p_total_revenue_tab;
8589         l_addl_revenue_tab                := p_addl_revenue_tab;
8590         l_raw_cost_rate_tab               := p_raw_cost_rate_tab;
8591         l_rw_cost_rate_override_tab       := p_rw_cost_rate_override_tab;
8592         l_b_cost_rate_tab                 := p_b_cost_rate_tab;
8593         l_b_cost_rate_override_tab        := p_b_cost_rate_override_tab;
8594         l_bill_rate_tab                   := p_bill_rate_tab;
8595         l_bill_rate_override_tab          := p_bill_rate_override_tab;
8596         l_line_start_date_tab             := p_line_start_date_tab;
8597         l_line_end_date_tab               := p_line_end_date_tab;
8598     /* added for spread enhancements */
8599         l_spread_curve_id_old_tab         := p_spread_curve_id_old_tab;
8600         l_spread_curve_id_new_tab         := p_spread_curve_id_new_tab;
8601         l_sp_fixed_date_old_tab           := p_sp_fixed_date_old_tab;
8602         l_sp_fixed_date_new_tab           := p_sp_fixed_date_new_tab;
8603         l_plan_start_date_old_tab         := p_plan_start_date_old_tab;
8604         l_plan_start_date_new_tab         := p_plan_start_date_new_tab;
8605         l_plan_end_date_old_tab           := p_plan_end_date_old_tab;
8606         l_plan_end_date_new_tab           := p_plan_end_date_new_tab;
8607     l_mfc_cost_type_id_old_tab        := p_mfc_cost_type_id_old_tab;
8608         l_mfc_cost_type_id_new_tab        := p_mfc_cost_type_id_new_tab;
8609         l_re_spread_flag_tab              := p_re_spread_flag_tab;
8610     l_rlm_id_change_flag_tab          := p_rlm_id_change_flag_tab;
8611     l_fp_task_billable_flag_tab   := p_fp_task_billable_flag_tab;
8612     /*
8613     Check if p_resource_assignment_tab has values.  If not try to
8614     populate with values from pa_resource_assignments using
8615     the budget_version_id.  If there is still no values for
8616     resource assignment error and return.  Else assign
8617     resource_assignment_ids to local variable l_resource_assignment_tab.
8618     l_resource_assignment_tab will be used instead of p_resource_assignment_tab
8619     for the rest of the procedure
8620     */
8621         l_tab_count := l_resource_assignment_tab.COUNT;
8622         l_stage := 100;
8623 	If P_PA_DEBUG_MODE = 'Y' Then
8624         print_msg(to_char(l_stage)||' Check if p_resource_assignment_tab has values['||l_tab_count||']');
8625 	End If;
8626 
8627         IF l_tab_count = 0 THEN
8628             l_stage := 110;
8629             --print_msg(to_char(l_stage)||' p_resource_assignment_tab.COUNT = 0');
8630             IF ( nvl(p_wp_cost_changed_flag,'N') = 'Y'
8631              OR nvl(p_time_phase_changed_flag,'N') = 'Y'
8632              /* Bug fix:4307790 */
8633              OR NVL(p_refresh_rates_flag,'N') = 'Y'
8634              OR NVL(p_refresh_conv_rates_flag,'N') = 'Y' ) Then
8635                OPEN get_p_res_asn_curr_code;
8636                FETCH get_p_res_asn_curr_code BULK COLLECT INTO
8637             l_resource_assignment_tab
8638             ,l_txn_currency_code_tab;
8639                CLOSE get_p_res_asn_curr_code;
8640                l_tab_count := l_resource_assignment_tab.COUNT;
8641 		If P_PA_DEBUG_MODE = 'Y' Then
8642                print_msg(to_char(l_stage)||' l_resource_assignment_tab.COUNT ='||to_char(l_tab_count));
8643 		End If;
8644         End If;
8645 
8646             IF l_tab_count = 0 THEN
8647                 l_stage := 130;
8648                 print_msg(to_char(l_stage)||' No resource assignments exists simply return with success');
8649                 /*pa_utils.add_message
8650                     ( p_app_short_name => 'PA',
8651                     p_msg_name       => 'PA_FP_CALC_RA_BL_REQ',
8652                     p_token1         => 'BUDGET_VERSION_ID',
8653                     p_value1         =>  p_budget_version_id,
8654                     p_token2         => 'PROJECT_ID',
8655                     p_value2         =>  p_project_id);
8656             */
8657             l_return_status := 'S';
8658             x_return_status := 'S';
8659             GOTO END_OF_PROCESS;
8660                END IF;
8661         END IF;
8662 
8663     	/* Bug fix: 3693097 The inparams contains G_MISS_NUM chars should be validated*/
8664     	/*************************************************************************************
8665 		l_pls_start_time := dbms_utility.get_time;
8666  	        --print_plsql_time('Start of MainLopp1:['||l_pls_start_time);
8667      	*Bug:5309529: Performance improvement changes : the following loop and execution of cursors inside the loop
8668      	*is removed and added a new api inside the PAFPCL1B.pls insert_spread_calctmp_records
8669 	**************End of Bug fix:5309529 *****************************************/
8670 
8671 	l_pls_end_time := dbms_utility.get_time;
8672 	print_plsql_time('End of MainLopp1:Total time['||(l_pls_end_time - l_pls_start_time));
8673     l_stage := 133;
8674     IF l_return_status <> 'S' Then
8675              print_msg(l_stage||'Errors found in the params processing');
8676              x_return_status := l_return_status;
8677              l_entire_return_status := l_return_status;
8678              GOTO END_OF_PROCESS;
8679         END IF;
8680 
8681          /* End of Bug fix: 3693097 */
8682  	         /*  Assign g_spread_required_flag value passed from p_spread_required flag.
8683  	         */
8684  	         g_spread_required_flag := 'N';
8685  	         g_ra_bl_txn_currency_code := NULL;
8686  	         /* Bug fix:5463690: this flag is not used anywhere. spread is always based on the additional qty derived
8687  	          * so obsolete the parameter p_spread_required_flag:
8688  	         IF (g_mass_adjust_flag = 'Y'
8689  	             OR g_refresh_rates_flag = 'Y'
8690  	             OR g_refresh_conv_rates_flag = 'Y' ) Then
8691  	                 g_spread_required_flag := 'N';
8692  	          ELSE
8693  	                 g_spread_required_flag := p_spread_required_flag;
8694  	         END IF;
8695  	 **/
8696 
8697         g_rollup_required_flag := p_rollup_required_flag;
8698     	IF g_rollup_required_flag is NULL OR g_rollup_required_flag <> 'N' Then
8699         	g_rollup_required_flag := 'Y';
8700     	END IF;
8701     	/* Bug fix:4149684 for budget /forecast generation process the calling api will call the
8702          * plan update and plan delete pji api. so set the rollup required flag to N */
8703         /* Bug fix:4189762 discussed with sakthi,saima and sanjay, during apply progress mode no need to call the rollup
8704          * as the progress API is calling plan_delete and plan_create rollup API to improve the perf
8705          */
8706         IF (p_calling_module IN ('BUDGET_GENERATION','FORECAST_GENERATION')
8707             /* Reverting back:OR NVL(p_apply_progress_flag,'N') = 'Y' as the 4189762 is NOT working properly */
8708             OR NVL(G_AGR_CONV_REQD_FLAG,'N') = 'Y'  ) Then
8709                 g_rollup_required_flag := 'N';
8710         End If;
8711 	--print_msg('rollup required flag =>'||g_rollup_required_flag||']');
8712 	l_pls_start_time := dbms_utility.get_time;
8713     	--print_plsql_time('Start of populate_spreadCalc_tmp:['||l_pls_start_time);
8714 
8715     IF l_resource_assignment_tab.COUNT > 0 THEN --{
8716 	If P_PA_DEBUG_MODE = 'Y' Then
8717         print_msg('Calling PA_FP_CALC_UTILS.populate_spreadCalc_Tmp API');
8718 	End If;
8719         PA_FP_CALC_UTILS.populate_spreadCalc_Tmp (
8720                 p_budget_version_id              => p_budget_version_id
8721         ,p_budget_version_type           => g_fp_budget_version_type
8722         ,p_calling_module                => l_calling_module
8723                 ,p_source_context                => p_source_context
8724                 ,p_time_phased_code              => g_time_phased_code
8725         ,p_apply_progress_flag           => p_apply_progress_flag
8726                 ,p_rollup_required_flag          => g_rollup_required_flag
8727             ,p_refresh_rates_flag            => g_refresh_rates_flag
8728                 ,p_refresh_conv_rates_flag       => g_refresh_conv_rates_flag
8729                 ,p_mass_adjust_flag              => g_mass_adjust_flag
8730         ,p_time_phase_changed_flag        => NVL(p_time_phase_changed_flag,'N')
8731 	,p_wp_cost_changed_flag           => NVL(p_wp_cost_changed_flag,'N')
8732         ,x_resource_assignment_tab       =>l_resource_assignment_tab
8733                 ,x_delete_budget_lines_tab       =>l_delete_budget_lines_tab
8734                 ,x_spread_amts_flag_tab          =>l_spread_amts_flag_tab
8735                 ,x_txn_currency_code_tab         =>l_txn_currency_code_tab
8736                 ,x_txn_currency_override_tab     =>l_txn_currency_override_tab
8737                 ,x_total_qty_tab                 =>l_total_qty_tab
8738                 ,x_addl_qty_tab                  =>l_addl_qty_tab
8739                 ,x_total_raw_cost_tab            =>l_total_raw_cost_tab
8740                 ,x_addl_raw_cost_tab             =>l_addl_raw_cost_tab
8741                 ,x_total_burdened_cost_tab       =>l_total_burdened_cost_tab
8742                 ,x_addl_burdened_cost_tab        =>l_addl_burdened_cost_tab
8743                 ,x_total_revenue_tab             =>l_total_revenue_tab
8744                 ,x_addl_revenue_tab              =>l_addl_revenue_tab
8745                 ,x_raw_cost_rate_tab             =>l_raw_cost_rate_tab
8746                 ,x_rw_cost_rate_override_tab     =>l_rw_cost_rate_override_tab
8747                 ,x_b_cost_rate_tab               =>l_b_cost_rate_tab
8748                 ,x_b_cost_rate_override_tab      =>l_b_cost_rate_override_tab
8749                 ,x_bill_rate_tab                 =>l_bill_rate_tab
8750                 ,x_bill_rate_override_tab        =>l_bill_rate_override_tab
8751                 ,x_line_start_date_tab           =>l_line_start_date_tab
8752                 ,x_line_end_date_tab             =>l_line_end_date_tab
8753                 ,x_apply_progress_flag_tab       =>g_apply_progress_flag_tab
8754                 ,x_spread_curve_id_old_tab       =>l_spread_curve_id_old_tab
8755                 ,x_spread_curve_id_new_tab       =>l_spread_curve_id_new_tab
8756                 ,x_sp_fixed_date_old_tab         =>l_sp_fixed_date_old_tab
8757                 ,x_sp_fixed_date_new_tab         =>l_sp_fixed_date_new_tab
8758                 ,x_plan_start_date_old_tab       =>l_plan_start_date_old_tab
8759                 ,x_plan_start_date_new_tab       =>l_plan_start_date_new_tab
8760                 ,x_plan_end_date_old_tab         =>l_plan_end_date_old_tab
8761                 ,x_plan_end_date_new_tab         =>l_plan_end_date_new_tab
8762                 ,x_re_spread_flag_tab            =>l_re_spread_flag_tab
8763                 ,x_sp_curve_change_flag_tab      =>l_sp_curve_change_flag_tab
8764                 ,x_plan_dates_change_flag_tab    =>l_plan_dates_change_flag_tab
8765                 ,x_spfix_date_flag_tab           =>l_spfix_date_flag_tab
8766                 ,x_mfc_cost_change_flag_tab      =>l_mfc_cost_change_flag_tab
8767                 ,x_mfc_cost_type_id_old_tab      =>l_mfc_cost_type_id_old_tab
8768                 ,x_mfc_cost_type_id_new_tab      =>l_mfc_cost_type_id_new_tab
8769         ,x_rlm_id_change_flag_tab        =>l_rlm_id_change_flag_tab
8770             ,x_plan_sdate_shrunk_flag_tab    =>l_plan_sdate_shrunk_flag_tab
8771             ,x_plan_edate_shrunk_flag_tab    =>l_plan_edate_shrunk_flag_tab
8772             ,x_mfc_cost_refresh_flag_tab     =>l_mfc_cost_refresh_flag_tab
8773         ,x_ra_in_multi_cur_flag_tab      =>l_ra_in_multi_cur_flag_tab
8774         ,x_quantity_changed_flag_tab     =>l_quantity_changed_flag_tab
8775             ,x_raw_cost_changed_flag_tab     =>l_raw_cost_changed_flag_tab
8776             ,x_cost_rate_changed_flag_tab    =>l_cost_rate_changed_flag_tab
8777             ,x_burden_cost_changed_flag_tab  =>l_burden_cost_changed_flag_tab
8778             ,x_burden_rate_changed_flag_tab  =>l_burden_rate_changed_flag_tab
8779             ,x_rev_changed_flag_tab          =>l_rev_changed_flag_tab
8780             ,x_bill_rate_changed_flag_tab    =>l_bill_rate_changed_flag_tab
8781         ,x_multcur_plan_start_date_tab   =>l_multicur_plan_start_date_tab
8782         ,x_multcur_plan_end_date_tab     =>l_multicur_plan_end_date_tab
8783         ,x_fp_task_billable_flag_tab  => l_fp_task_billable_flag_tab
8784         ,x_cost_rt_miss_num_flag_tab  => l_cost_rt_miss_num_flag_tab
8785         ,x_burd_rt_miss_num_flag_tab  => l_burd_rt_miss_num_flag_tab
8786         ,x_bill_rt_miss_num_flag_tab  => l_bill_rt_miss_num_flag_tab
8787         ,x_Qty_miss_num_flag_tab  => l_Qty_miss_num_flag_tab
8788         ,x_Rw_miss_num_flag_tab  => l_Rw_miss_num_flag_tab
8789         ,x_Br_miss_num_flag_tab  => l_Br_miss_num_flag_tab
8790 	,x_Rv_miss_num_flag_tab  => l_Rv_miss_num_flag_tab
8791 	,x_rev_only_entry_flag_tab => l_rev_only_entry_flag_tab
8792 	/* bug fix:5726773 */
8793  	,x_neg_Qty_Changflag_tab   => l_neg_Qty_Changflag_tab
8794  	,x_neg_Raw_Changflag_tab  => l_neg_Raw_Changflag_tab
8795  	,x_neg_Burd_Changflag_tab => l_neg_Burd_Changflag_tab
8796  	,x_neg_rev_Changflag_tab  => l_neg_rev_Changflag_tab
8797         ,x_return_status                 => l_return_status
8798         ,x_msg_data                      => x_msg_data
8799                 );
8800 	l_pls_end_time := dbms_utility.get_time;
8801         print_plsql_time('End of populate_spreadCalc_tmp:Total time :['||(l_pls_end_time-l_pls_start_time)||']');
8802 	If P_PA_DEBUG_MODE = 'Y' Then
8803         print_msg('End of calling PA_FP_CALC_UTILS.populate_spreadCalc_Tmp retSts['||l_return_status||']');
8804 	End If;
8805         If l_return_status <> 'S' Then
8806                         l_entire_return_status := l_return_status;
8807                         x_return_status := l_return_status;
8808                         GOTO END_OF_PROCESS;
8809                 End If;
8810     END IF; --}
8811 
8812     l_stage := 205;
8813     /* Initialize the currency conversion details */
8814     Initialize_fp_cur_details
8815                 (p_budget_version_id  => p_budget_version_id
8816                 ,p_project_id         => g_project_id
8817         ,x_return_status      => l_return_status
8818         );
8819 
8820     l_stage := 206;
8821     /* reset the planning transaction dates if the actual through period dates and planning dates are
8822         * are not in sync
8823         */
8824         IF (NVL(l_return_status,'S') = 'S'
8825        AND g_spread_from_date IS NOT NULL
8826        AND p_source_context = 'RESOURCE_ASSIGNMENT'
8827        AND g_refresh_rates_flag = 'N'
8828        AND g_refresh_conv_rates_flag = 'N'
8829        AND g_mass_adjust_flag = 'N')  THEN  --{
8830                 Reset_Planning_end_date
8831                 (p_calling_module         => l_calling_module
8832                 ,p_source_context         => g_source_context
8833                 ,p_budget_version_id      => g_budget_version_id
8834                 ,p_etc_start_date         => g_spread_from_date
8835                 ,x_return_status          => l_return_status
8836                 ,x_msg_data               => x_msg_data
8837                 );
8838                 IF l_return_status <> 'S' Then
8839                     print_msg('Un expected Error from Reset_Planning_end_date api');
8840                     l_entire_return_status := l_return_status;
8841                     x_return_status := l_return_status;
8842             GOTO END_OF_PROCESS;
8843                 End If;
8844 
8845         /* update resource assignments set planning end date as etc start date for the fixed date
8846         * spread curves where more than one budget line exists
8847         */
8848             PreProcess_BlkProgress_lines
8849             (p_budget_version_id      => g_budget_version_id
8850             ,p_etc_start_date         => g_spread_from_date
8851         ,p_apply_progress_flag    => p_apply_progress_flag
8852             ,x_return_status          => l_return_status
8853             ,x_msg_data               => x_msg_data
8854             );
8855                 IF l_return_status <> 'S' Then
8856                     print_msg('Un expected Error from PreProcess_BlkProgress_lines api');
8857                     l_entire_return_status := l_return_status;
8858                     x_return_status := l_return_status;
8859                     GOTO END_OF_PROCESS;
8860                 End If;
8861 
8862             /* added this check to make sure that before summing the budget Line amounts
8863                 * the closed period amounts should be null
8864                 */
8865                 IF NVL(l_return_status,'S') = 'S' Then
8866 			If P_PA_DEBUG_MODE = 'Y' Then
8867                        print_msg('Calling clear_closed_period_etcs API since ETC start date is populated');
8868 			End If;
8869                        clear_closed_period_etcs
8870                        (p_budget_version_id       => g_budget_version_id
8871                        ,p_etc_start_date          => g_spread_from_date
8872                        ,x_return_status           => l_return_status );
8873 			If P_PA_DEBUG_MODE = 'Y' Then
8874                        print_msg('End of clear_closed_period_etcs retSts['||l_return_status||']');
8875 			End If;
8876                        IF l_return_status <> 'S' Then
8877                          l_entire_return_status := l_return_status;
8878                          x_return_status := l_return_status;
8879                          GOTO END_OF_PROCESS;
8880                        End If;
8881                 End If;
8882 
8883         /* IPM changes: Whenever budget lines get deleted, rollup the amts to new entity
8884          * otherwise this causes data corruption of amounts and quantity get doubled during apply progress
8885          */
8886         IF p_source_context = 'RESOURCE_ASSIGNMENT' AND
8887                      NVL(p_raTxn_rollup_api_call_flag,'Y') = 'Y' AND nvl(l_entire_return_status,'S') = 'S' Then
8888 			 If P_PA_DEBUG_MODE = 'Y' Then
8889                          print_msg('Calling populate_raTxn_Recs API for rollup of budgetlines during apply progress');
8890 			 End if;
8891                          delete_raTxn_Tmp;
8892                          populate_raTxn_Recs (
8893                          p_budget_version_id     => g_budget_version_id
8894                          ,p_source_context       => 'BUDGET_LINE' -- to rollup the amounts
8895                          ,p_calling_mode         => 'CLEAR_CLOSED_PERIOD'
8896                          ,p_delete_flag          => 'N'
8897                          ,p_delete_raTxn_flag    => 'N'
8898                          ,p_refresh_rate_flag    => 'N'
8899                          ,p_rollup_flag          => 'Y'
8900                          ,p_call_raTxn_rollup_flag => 'Y'
8901                          ,x_return_status        => l_return_status
8902                          ,x_msg_count            => x_msg_count
8903                          ,x_msg_data             => x_msg_data
8904                          );
8905 			 If P_PA_DEBUG_MODE = 'Y' Then
8906                          print_msg('AFter calling populate_raTxn_Recs retSTst['||l_return_status||']MsgData['||x_msg_data||']');
8907 			 End if;
8908                          IF l_return_status <> 'S' Then
8909                             x_return_status := l_return_status;
8910                             l_entire_return_status := l_return_status;
8911                          END IF;
8912                END IF;
8913         END IF; --}
8914 
8915 
8916 
8917        /* Throw an error If budget lines having zero qty and actuals, these lines corrupted budget lines
8918         * getting created through the AMG apis and budget generation process. Just abort the process
8919         */
8920        IF (NVL(l_return_status,'S') = 'S'
8921            AND p_source_context = 'RESOURCE_ASSIGNMENT'
8922            AND g_refresh_rates_flag = 'N'
8923            AND g_refresh_conv_rates_flag = 'N'
8924            AND g_mass_adjust_flag = 'N')  THEN  --{
8925 		If P_PA_DEBUG_MODE = 'Y' Then
8926                 print_msg('Check zero Quantity budget Lines where actuals Exists');
8927 		End if;
8928                 PA_FP_CALC_UTILS.Check_ZeroQty_Bls
8929                                 (p_budget_version_id => p_budget_version_id
8930                                 ,x_return_status      => l_return_status
8931                                 );
8932 		If P_PA_DEBUG_MODE = 'Y' Then
8933                 print_msg('ReturnStatus of Check_ZeroQty_ActualBls API['||l_return_status||']');
8934 		End if;
8935                 If l_return_status <> 'S' Then
8936                       x_return_status := 'E';
8937               l_entire_return_status := l_return_status;
8938               GOTO END_OF_PROCESS;
8939                 End If;
8940     END IF; --}
8941 
8942 	/* Bug fix:5203622 */
8943 	IF l_entire_return_status = 'S' Then
8944 	l_pls_start_time := dbms_utility.get_time;
8945     --print_plsql_time('Start of clear_etc_rev_other_rejectns :['||l_pls_start_time);
8946 		clear_etc_rev_other_rejectns
8947          	(p_budget_version_id      => p_budget_version_id
8948             	,p_source_context         => p_source_context
8949             	,p_calling_module         => p_calling_module
8950             	,p_mode                   => 'CACHE'
8951             	,x_return_status    	  => l_return_status
8952             	,x_msg_count        	  => x_msg_count
8953             	,x_msg_data         	  => l_msg_data
8954             	);
8955 		If l_return_status <> 'S' Then
8956                       	x_return_status := 'E';
8957               		l_entire_return_status := l_return_status;
8958               		GOTO END_OF_PROCESS;
8959                 End If;
8960 	END IF;
8961 	l_pls_end_time := dbms_utility.get_time;
8962 	print_plsql_time('End of clear_etc_rev_other_rejectns Total time :['||(l_pls_end_time-l_pls_start_time)||']');
8963 
8964     l_stage := 210;
8965 	If P_PA_DEBUG_MODE = 'Y' Then
8966     print_msg(to_char(l_stage)||' Entering loop using the l_resource_assignment_tab.resource_assignment_id');
8967     print_msg('l_resource_assignment_tab.first['||l_resource_assignment_tab.first||']Last['||l_resource_assignment_tab.last);
8968     print_msg(l_stage||':Count of Errors:MsgCtinErrStack['||fnd_msg_pub.count_msg||']');
8969 	End If;
8970 	l_pls_start_time := dbms_utility.get_time;
8971     --print_plsql_time('Start of MainLoop2:['||l_pls_start_time);
8972     --MAIN CODE STARTS HERE
8973     l_countr := 0;
8974     FOR i IN l_resource_assignment_tab.first..l_resource_assignment_tab.last LOOP
8975 
8976         l_countr := l_countr +1 ;
8977         g_plan_raId_tab(l_countr) := l_resource_assignment_tab(i);
8978             g_plan_txnCur_Tab(l_countr) := l_txn_currency_code_tab(i);
8979             g_line_sdate_tab(l_countr) := NULL;
8980             g_line_edate_tab(l_countr) := NULL;
8981             g_Wp_curCode_tab(l_countr) := NULL;
8982             g_refresh_rates_tab(l_countr) := g_refresh_rates_flag;
8983             g_refresh_conv_rates_tab(l_countr) := g_refresh_conv_rates_flag;
8984             g_mass_adjust_flag_tab(l_countr) := g_mass_adjust_flag;
8985             g_mfc_cost_refresh_tab(l_countr) := 'N';
8986         	g_rtChanged_Ra_Flag_tab(l_countr) := 'N';
8987             g_skip_record_tab(l_countr) := 'N';
8988 	    g_process_skip_CstRevrec_tab(l_countr) := 'N';
8989             /* Bug fix:4295967 */
8990                 g_applyProg_refreshRts_tab(l_countr) := 'N';
8991 
8992 
8993         /*
8994         Use BEGIN here to allow for the skip record exception if required parameters needed to update
8995         budget lines are all null.
8996         */
8997         BEGIN
8998                 l_stage := 220;
8999 		If P_PA_DEBUG_MODE = 'Y' Then
9000                 print_msg('************'||l_stage||'Inside MAIN resource assignment loop***********');
9001                 print_msg('PRINT IN PARAMETERS for this Resource Assignment ID');
9002                 print_msg('l_resource_assignment_tab(i)  => '|| to_char(l_resource_assignment_tab(i)));
9003 		End if;
9004             /* Bug fix:4227820 Open this cursor only when exception is raised
9005              * so moved this portion just before adding the error msg to stack
9006                 OPEN get_line_info(l_resource_assignment_tab(i));
9007                 FETCH get_line_info INTO
9008                  g_task_name
9009                 , g_resource_name;
9010                 CLOSE get_line_info;
9011             **/
9012 
9013             /*
9014             --  Initialize all local variable used within this loop
9015             */
9016                 l_resource_assignment_id           := NULL;
9017                 l_planning_start_date              := NULL;
9018                 l_planning_end_date                := NULL;
9019                 l_spread_curve_id                  := NULL;
9020                 l_resource_class_code              := NULL;
9021                 l_sp_fixed_date                    := NULL;
9022                 l_rate_based_flag                  := NULL;
9023                 l_txn_currency_code                := NULL;
9024                 l_txn_revenue                      := NULL;
9025                 l_txn_revenue_addl                 := NULL;
9026                 l_txn_raw_cost                     := NULL;
9027                 l_txn_raw_cost_addl                := NULL;
9028                 l_txn_burdened_cost                := NULL;
9029                 l_txn_burdened_cost_addl           := NULL;
9030                 l_txn_plan_quantity                := NULL;
9031                 l_txn_plan_quantity_addl           := NULL;
9032                 l_txn_currency_code_override       := NULL;
9033                 l_txn_init_revenue                 := NULL;
9034                 l_txn_init_revenue_addl            := NULL;
9035                 l_txn_init_raw_cost                := NULL;
9036                 l_txn_init_raw_cost_addl           := NULL;
9037                 l_txn_init_burdened_cost           := NULL;
9038                 l_txn_init_burdened_cost_addl      := NULL;
9039                 l_init_quantity                    := NULL;
9040                 l_init_quantity_addl               := NULL;
9041                 g_line_start_date                  := NULL;
9042                 g_line_end_date                    := NULL;
9043                 l_spread_amounts_flag              := NULL;
9044                 l_raw_cost_rate                    := NULL;
9045                 l_rw_cost_rate_override            := NULL;
9046                 l_burden_cost_rate                 := NULL;
9047                 l_burden_cost_rate_override        := NULL;
9048                 l_bill_rate                        := NULL;
9049                 l_bill_rate_override               := NULL;
9050                 l_budget_line_id                   := NULL;
9051         l_cost_rt_miss_num_flag        := NULL;
9052                 l_burd_rt_miss_num_flag        := NULL;
9053                 l_bill_rt_miss_num_flag        := NULL;
9054                 g_resource_name                    := NULL;
9055 
9056                         /* Initialize the bl variables */
9057                 l_bl_quantity                      := NULL;
9058                 l_bl_raw_cost_rate                 := NULL;
9059                 l_bl_standard_cost_rate            := NULL;
9060                 l_bl_cost_rate_override            := NULL;
9061                 l_bl_raw_cost                      := NULL;
9062                 l_bl_avg_burden_cost_rate          := NULL;
9063                 l_bl_burden_cost_rate              := NULL;
9064                 l_bl_burden_cost_rate_override     := NULL;
9065                 l_bl_burdened_cost                 := NULL;
9066                 l_bl_bill_rate                     := NULL;
9067                 l_bl_standard_bill_rate            := NULL;
9068                 l_bl_bill_rate_override            := NULL;
9069                 l_bl_revenue                       := NULL;
9070             --  end of initalization
9071 
9072             /*
9073             *Select pa_resource_assignment attributes required for the rate API
9074             */
9075                 l_stage := 250;
9076                 --print_msg(to_char(l_stage)||' Select pa_resource_assignment attributes required for the rate API');
9077                 --print_msg(' l_resource_assignment_tab(i) => '||to_char(l_resource_assignment_tab(i)));
9078             ResAsgnRec := NULL;
9079                 OPEN get_resource_asn_csr(l_resource_assignment_tab(i));
9080                 FETCH get_resource_asn_csr INTO ResAsgnRec;
9081                 IF get_resource_asn_csr%NOTFOUND THEN
9082                         l_stage := 260;
9083                         --print_msg(to_char(l_stage)||' get_resource_asn_csr%NOTFOUND');
9084                         NULL;
9085                 END IF;
9086                 CLOSE  get_resource_asn_csr;
9087 
9088             /*
9089             *Assign local variables values selected from the resource_assignemt cursur
9090             */
9091                 l_stage := 270;
9092                 --print_msg(to_char(l_stage)||' Assign local variables values selected from the resource_assignemt cursur');
9093                 g_task_id                          := ResAsgnRec.task_id;
9094                 g_resource_list_member_id          := ResAsgnRec.resource_list_member_id;
9095             g_resource_name                    := ResAsgnRec.resource_name;
9096                 l_planning_start_date              := ResAsgnRec.planning_start_date;
9097                 l_planning_end_date                := ResAsgnRec.planning_end_date;
9098                 l_spread_curve_id                  := ResAsgnRec.spread_curve_id;
9099                 l_resource_class_code              := ResAsgnRec.resource_class_code;
9100                 l_sp_fixed_date                    := ResAsgnRec.sp_fixed_date;
9101                 l_rate_based_flag                  := ResAsgnRec.rate_based_flag;
9102 
9103 
9104             /*
9105             assign tab values to local variables
9106             */
9107             l_resource_assignment_id :=l_resource_assignment_tab(i);
9108             l_txn_currency_code := l_txn_currency_code_tab(i);
9109                 l_delete_budget_lines   := NULL;
9110                 l_txn_currency_code_override := NULL;
9111             /* Added for spread enhancements */
9112             l_re_spread_amts_flag    := NVL(l_re_spread_flag_tab(i),'N');
9113                     l_sp_curve_change_flag   := NVL(l_sp_curve_change_flag_tab(i),'N');
9114                     l_plan_dates_change_flag := NVL(l_plan_dates_change_flag_tab(i),'N');
9115                     l_spfix_date_change_flag := NVL(l_spfix_date_flag_tab(i),'N');
9116                     l_mfc_cost_change_flag   := NVL(l_mfc_cost_change_flag_tab(i),'N');
9117                     l_rlm_id_change_flag     := NVL(l_rlm_id_change_flag_tab(i),'N');
9118                     l_plan_sdate_shrunk_flag := NVL(l_plan_sdate_shrunk_flag_tab(i),'N');
9119                     l_plan_edate_shrunk_flag := NVL(l_plan_edate_shrunk_flag_tab(i),'N');
9120             l_ra_in_multi_cur_flag   := NVL(l_ra_in_multi_cur_flag_tab(i),'N');
9121             l_quantity_changed_flag := NVL(l_quantity_changed_flag_tab(i),'N');
9122                         l_raw_cost_changed_flag := NVL(l_raw_cost_changed_flag_tab(i),'N');
9123                         l_rw_cost_rate_changed_flag := NVL(l_cost_rate_changed_flag_tab(i),'N');
9124                         l_burden_cost_changed_flag := NVL(l_burden_cost_changed_flag_tab(i),'N');
9125                         l_b_cost_rate_changed_flag := NVL(l_burden_rate_changed_flag_tab(i),'N');
9126                         l_rev_changed_flag         := NVL(l_rev_changed_flag_tab(i),'N');
9127                         l_bill_rate_changed_flag   := NVL(l_bill_rate_changed_flag_tab(i),'N');
9128             l_resAttribChangeFlag      := 'N';
9129             l_multicur_plan_start_date := l_multicur_plan_start_date_tab(i);
9130             l_multicur_plan_end_date   := l_multicur_plan_end_date_tab(i);
9131             /* Bug fix:4263265 */
9132             l_org_quantity_changed_flag    := NVL(l_quantity_changed_flag_tab(i),'N');
9133                         l_org_raw_cost_changed_flag    := NVL(l_raw_cost_changed_flag_tab(i),'N');
9134                         l_org_rw_rate_changed_flag     := NVL(l_cost_rate_changed_flag_tab(i),'N');
9135                         l_org_burden_cost_changed_flag := NVL(l_burden_cost_changed_flag_tab(i),'N');
9136                         l_org_b_cost_rate_changed_flag := NVL(l_burden_rate_changed_flag_tab(i),'N');
9137                         l_org_rev_changed_flag         := NVL(l_rev_changed_flag_tab(i),'N');
9138                         l_org_bill_rate_changed_flag   := NVL(l_bill_rate_changed_flag_tab(i),'N');
9139 
9140                         /* check any actuals exists for this resource */
9141                         l_actual_exists_flag := 'N';
9142                         check_actual_exists(p_res_ass_id  => l_resource_assignment_id
9143                                         ,p_start_date  => null
9144                                         ,p_end_date    => null
9145                                         ,x_actual_flag => l_actual_exists_flag );
9146                   	--print_msg('After calling check_actual_exists flag['||l_actual_exists_flag||']');
9147 
9148                         IF l_delete_budget_lines_tab.EXISTS(i) Then
9149                            If NVL(l_delete_budget_lines,'N') = 'N' Then  -- this is set 'Y' at override currency changed
9150                               --print_msg('l_delete_budget_lines_tab(i) ['||l_delete_budget_lines_tab(i)||']');
9151                               l_delete_budget_lines  := l_delete_budget_lines_tab(i);
9152                            End If;
9153                         END IF;
9154 
9155             IF NVL(p_apply_progress_flag,'N') <> 'Y' Then  --{
9156                  IF (l_re_spread_amts_flag = 'Y'
9157                OR l_sp_curve_change_flag = 'Y'
9158                OR l_spfix_date_change_flag = 'Y'
9159                OR l_rlm_id_change_flag = 'Y' ) Then
9160                 l_delete_budget_lines := 'Y';
9161                     l_resAttribChangeFlag := 'Y';
9162              ElsIf ((g_wp_version_flag = 'Y' AND l_plan_dates_change_flag = 'Y')
9163                    OR (l_ra_in_multi_cur_flag = 'N' AND l_plan_dates_change_flag = 'Y')) Then
9164                 l_delete_budget_lines := 'Y';
9165                 l_resAttribChangeFlag := 'Y';
9166              Elsif (l_mfc_cost_change_flag = 'Y' AND l_quantity_changed_flag = 'N' ) Then
9167                 /* Note: If only mfc cost type changes with out change in quantity then refresh else spread the addl qty */
9168                 If NVL(l_delete_budget_lines,'N') <> 'Y' Then
9169                     g_mfc_cost_refresh_tab(l_countr) := 'Y';
9170                     l_resAttribChangeFlag := 'Y';
9171                 End If;
9172              End If;
9173             End If; --}
9174 
9175 	    /* bug fix:5726773 */
9176  	    If l_resAttribChangeFlag = 'Y' Then
9177  	        l_neg_Qty_Changflag_tab(i) := 'N';
9178  	        l_neg_Raw_Changflag_tab(i) := 'N';
9179  	        l_neg_Burd_Changflag_tab(i) := 'N';
9180  	        l_neg_rev_Changflag_tab(i) := 'N';
9181  	    End If;
9182 
9183 	If P_PA_DEBUG_MODE = 'Y' Then
9184         print_msg('Flag Values:l_re_spread_amts_flag['||l_re_spread_amts_flag||']l_sp_curve_change_flag['||l_sp_curve_change_flag||']');
9185         print_msg('l_rlm_id_change_flag['||l_rlm_id_change_flag||']l_delete_budget_lines['||l_delete_budget_lines||']');
9186         print_msg('l_resAttribChangeFlag['||l_resAttribChangeFlag||']l_ra_in_multi_cur_flag['||l_ra_in_multi_cur_flag||']');
9187         print_msg('l_plan_dates_change_flag['||l_plan_dates_change_flag||']l_mfc_cost_change_flag['||l_mfc_cost_change_flag||']');
9188         print_msg('l_quantity_changed_flag['||l_quantity_changed_flag||']g_wp_version_flag['||g_wp_version_flag||']');
9189 	print_msg('negQtyChagFlag['||l_neg_Qty_Changflag_tab(i)||']negRawChgFlag['||l_neg_Raw_Changflag_tab(i)||']');
9190  	print_msg('negBurdChagFlag['||l_neg_Burd_Changflag_tab(i)||']negRevChagFlag['||l_neg_rev_Changflag_tab(i)||']');
9191 	End if;
9192             IF l_txn_currency_override_tab.EXISTS(i) THEN  --{
9193                            --print_msg('l_txn_currency_override_tab(i) ['||l_txn_currency_override_tab(i));
9194                            l_txn_currency_code_override  := l_txn_currency_override_tab(i);
9195                            IF l_txn_currency_code_override is NOT NULL Then
9196                 /* Currency code override can be changed only from TA flow */
9197                 IF g_wp_version_flag <> 'Y' Then
9198                     OPEN get_line_info(l_resource_assignment_id);
9199                                 FETCH get_line_info INTO
9200                                          g_task_name,g_resource_name;
9201                                 CLOSE get_line_info;
9202                     l_stage := 363;
9203                                         add_msgto_stack
9204                                         ( p_msg_name => 'PA_FP_INVALID_CURCODE_OVR'
9205                                         ,p_token1     => 'G_PROJECT_NAME'
9206                                         ,p_value1     => g_project_name
9207                                         ,p_token2     => 'G_TASK_NAME'
9208                                         ,p_value2     => g_task_name
9209                                         ,p_token3     => 'G_RESOURCE_NAME'
9210                                         ,p_value3     => g_resource_name
9211                                         ,p_token4     => 'G_CURRENCY_CODE'
9212                                         ,p_value4     => l_txn_currency_code_override
9213                     );
9214                                         l_entire_return_status := FND_API.G_RET_STS_ERROR;
9215                         RAISE skip_record;
9216                 Elsif (l_actual_exists_flag = 'Y' AND g_wp_version_flag = 'Y') Then
9217                     OPEN get_line_info(l_resource_assignment_id);
9218                                         FETCH get_line_info INTO
9219                                                  g_task_name,g_resource_name;
9220                                         CLOSE get_line_info;
9221                     l_stage := 363;
9222                                         add_msgto_stack
9223                                         ( p_msg_name => 'PA_FP_INVALID_ACT_CURCODE_OVR'
9224                                         ,p_token1     => 'G_PROJECT_NAME'
9225                                         ,p_value1     => g_project_name
9226                                         ,p_token2     => 'G_TASK_NAME'
9227                                         ,p_value2     => g_task_name
9228                                         ,p_token3     => 'G_RESOURCE_NAME'
9229                                         ,p_value3     => g_resource_name
9230                                         ,p_token4     => 'G_CURRENCY_CODE'
9231                                         ,p_value4     => l_txn_currency_code_override
9232                                         );
9233                                         l_entire_return_status := FND_API.G_RET_STS_ERROR;
9234                     RAISE skip_record;
9235                 /* Note: If only currency with out change in quantity, then refresh else spread the addl qty */
9236                                 ElsIF (NVL(l_delete_budget_lines,'N') <> 'Y' AND l_quantity_changed_flag = 'N'
9237                     and NVL(p_apply_progress_flag,'N') <> 'Y' ) Then
9238                    g_mfc_cost_refresh_tab(l_countr) := 'Y';
9239                                    --print_msg('setting mfc cost refresh tab Y for currency code override');
9240                 End If;
9241                            END IF;
9242                         END IF; --}
9243 
9244             l_bdgt_line_sDate := null;
9245             l_bdgt_line_eDate := null;
9246                 --print_msg(to_char(l_stage)||' Get Budget Lines amts for comparison');
9247                 IF l_line_start_date_tab.EXISTS(i) AND l_line_end_date_tab.EXISTS(i) THEN
9248                     --print_msg('l_line_start_date_tab.COUNT > 0 AND l_line_end_date_tab.COUNT > 0');
9249                     IF l_line_start_date_tab(i) IS NOT NULL Then
9250                    l_bdgt_line_sDate := l_line_start_date_tab(i);
9251                 End IF;
9252             End If;
9253             IF l_line_end_date_tab.EXISTS(i) THEN
9254                 If l_line_end_date_tab(i) IS NOT NULL THEN
9255                                    l_bdgt_line_eDate := l_line_end_date_tab(i);
9256                                 End IF;
9257             End if;
9258             IF l_spread_amts_flag_tab.EXISTS(i) Then
9259                 l_spread_amounts_flag     := NVL(l_spread_amts_flag_tab(i),'N');
9260             Else
9261                     l_spread_amounts_flag     := 'N';
9262             End If;
9263             /* assign the dates only if the process called in BUDGET_LINE context */
9264             IF p_source_context  = 'BUDGET_LINE' THEN
9265                     g_line_start_date  := l_bdgt_line_sDate;
9266                 g_line_end_date    := l_bdgt_line_eDate;
9267                 ELSE
9268                     g_line_start_date  := to_date(NULL);
9269                     g_line_end_date  := to_date(NULL);
9270                 l_bdgt_line_sDate := null;
9271                 l_bdgt_line_eDate := null;
9272                 END IF;
9273             g_line_sdate_tab(l_countr) := g_line_start_date ;
9274                     g_line_edate_tab(l_countr) := g_line_end_date;
9275 
9276             --print_msg('After setting gLineStartEndDates:SD['||g_line_start_date||']ED['||g_line_end_date||']');
9277             /* check the budget line end dates and etc dates */
9278                     IF g_spread_from_date IS NOT NULL AND g_line_end_date is NOT NULL THEN
9279                             IF g_spread_from_date > g_line_end_date THEN
9280                                l_stage := 363;
9281                     OPEN get_line_info(l_resource_assignment_id);
9282                                         FETCH get_line_info INTO
9283                                                  g_task_name,g_resource_name;
9284                                         CLOSE get_line_info;
9285                                 add_msgto_stack
9286                                 ( p_msg_name => 'PA_FP_ETC_SPREAD_DATE',
9287                                 p_token1     => 'G_PROJECT_NAME' ,
9288                                 p_value1     => g_project_name,
9289                                 p_token2     => 'G_TASK_NAME',
9290                                 p_value2     => g_task_name,
9291                                 p_token3     => 'G_RESOURCE_NAME',
9292                                 p_value3     => g_resource_name,
9293                                 p_token4     => 'G_SPREAD_FROM_DATE',
9294                                 p_value4     => g_spread_from_date);
9295                                 l_entire_return_status := FND_API.G_RET_STS_ERROR;
9296                     RAISE skip_record;
9297                         End IF;
9298                     END IF;
9299 
9300             If l_total_revenue_tab.EXISTS(i) Then
9301                l_txn_revenue  := l_total_revenue_tab(i);
9302             End If;
9303 
9304             If l_total_raw_cost_tab.EXISTS(i) THEN
9305                l_txn_raw_cost    := l_total_raw_cost_tab(i);
9306             End if;
9307 
9308             IF l_raw_cost_rate_tab.EXISTS(i) Then
9309                        l_raw_cost_rate := l_raw_cost_rate_tab(i);
9310             End IF;
9311 
9312             IF l_rw_cost_rate_override_tab.EXISTS(i) THEN
9313                         l_rw_cost_rate_override :=  l_rw_cost_rate_override_tab(i);
9314             End If;
9315 
9316             IF l_total_qty_tab.EXISTS(i) Then
9317                    l_txn_plan_quantity := l_total_qty_tab(i);
9318             End IF;
9319 
9320             IF l_addl_qty_tab.EXISTS(i) Then
9321                    l_txn_plan_quantity_addl   := l_addl_qty_tab(i);
9322             End IF;
9323             IF l_total_burdened_cost_tab.EXISTS(i) Then
9324                    l_txn_burdened_cost   := l_total_burdened_cost_tab(i);
9325             End IF;
9326 
9327             IF l_b_cost_rate_tab.EXISTS(i) Then
9328                    l_burden_cost_rate  := l_b_cost_rate_tab(i);
9329             End IF;
9330                 IF l_b_cost_rate_override_tab.EXISTS(i) Then
9331                    l_burden_cost_rate_override := l_b_cost_rate_override_tab(i);
9332                 END IF;
9333                 IF l_bill_rate_tab.EXISTS(i) Then
9334                    l_bill_rate  := l_bill_rate_tab(i);
9335             End If;
9336                 IF l_bill_rate_override_tab.COUNT > 0 THEN
9337                    l_bill_rate_override := l_bill_rate_override_tab(i);
9338             End If;
9339             l_quantity_changed_flag := 'N';
9340                 l_raw_cost_changed_flag := 'N';
9341                 l_rw_cost_rate_changed_flag := 'N';
9342                 l_burden_cost_changed_flag := 'N';
9343                 l_b_cost_rate_changed_flag := 'N';
9344                 l_rev_changed_flag := 'N';
9345                 l_bill_rate_changed_flag := 'N';
9346                 l_bill_rt_ovr_changed_flag := 'N';
9347 
9348             /* Check for mass adjust is called for the correct attributes
9349              * from page or AMG apis, For Non-Rate transactions, mass adjust of cost rate is not allowed
9350              * so if they call then skip this transaction
9351              */
9352             If g_mass_adjust_flag = 'Y' Then --{
9353 		IF g_wp_version_flag = 'Y' Then
9354 		   IF l_rate_based_flag = 'N' Then
9355 			If p_cost_rate_adj_pct is NOT NULL Then
9356 				print_msg('Bypassing the pl txn for CostRate Adj for Non-Rate Pl txn');
9357                             	RAISE skip_record;
9358 			End If;
9359 		   End If;
9360 		Else
9361                    IF l_rate_based_flag = 'N' Then
9362                      IF g_fp_budget_version_type in ('COST','ALL') Then
9363                         If (p_quantity_adj_pct is NOT NULL
9364 			    OR p_cost_rate_adj_pct is NOT NULL
9365 			    OR p_burdened_rate_adj_pct is NOT NULL)  Then
9366                             print_msg('Bypassing the pl txn for quantity and Rate Adjustments for Non-Rate Pl txn');
9367                             RAISE skip_record;
9368                         End If;
9369                      End If;
9370 		     If  g_fp_budget_version_type in ('REVENUE','ALL') Then
9371                         If (p_quantity_adj_pct is NOT NULL
9372 			    OR p_bill_rate_adj_pct is NOT NULL ) Then
9373                             print_msg('Bypassing the pl txn for BillRate Adj for Non-Rate Pl txn');
9374                             RAISE skip_record;
9375                         End If;
9376                      End If;
9377 		  End If;
9378                 End If;
9379             End If; --}
9380 
9381             l_stage := 275;
9382             /* Check if the budget is of REVENUE/ALL and related to Change Order/Change Requrest then Only Agreement Currency
9383              * takes the precedence*/
9384             IF  G_AGR_CONV_REQD_FLAG = 'Y' Then
9385                 print_msg(l_stage||'The Entire Budget version can have Only one Agremeent Currency['||g_agr_currency_code||']');
9386                 g_ra_bl_txn_currency_code := g_agr_currency_code;
9387                 g_Wp_curCode_tab(l_countr) := g_ra_bl_txn_currency_code;
9388 
9389             Else
9390 
9391                /* the following code is added for workplan: can have only one currency for resource assignment*/
9392                    IF p_source_context = 'BUDGET_LINE' and g_wp_version_flag = 'Y' Then
9393                     If g_ra_bl_txn_currency_code is NOT NULL Then
9394                     null;
9395                 Else
9396                         g_ra_bl_txn_currency_code := NULL;
9397                 End If;
9398                    Else
9399                 g_ra_bl_txn_currency_code := NULL;
9400                    End If;
9401 
9402                    IF g_wp_version_flag = 'Y' and g_ra_bl_txn_currency_code is NULL  THEN
9403                     OPEN get_bl_currency;
9404                     FETCH get_bl_currency INTO g_ra_bl_txn_currency_code;
9405                     IF get_bl_currency%NOTFOUND THEN
9406                         g_ra_bl_txn_currency_code := NULL;
9407                         --print_msg(l_stage||':set g_ra_bl_txn_currency_code to NULL := '||g_ra_bl_txn_currency_code);
9408                     ELSE
9409                         NULL;
9410                         --print_msg(l_stage||':set g_ra_bl_txn_currency_code to bl.txn_currency_code := '||g_ra_bl_txn_currency_code);
9411                     END IF;
9412                     CLOSE get_bl_currency;
9413 
9414                 /* Bug fix: Refresh rates doesnot refresh the currencies */
9415                 IF l_actual_exists_flag = 'N'
9416                     AND ( g_refresh_rates_flag in ('Y','R','C')
9417                           OR g_mfc_cost_refresh_tab(l_countr) = 'Y'
9418                           OR l_rlm_id_change_flag = 'Y' )  Then
9419                     g_ra_bl_txn_currency_code := NULL;
9420                             --print_msg(l_stage||':set g_ra_bl_txn_currency_code to NULL during refresh rates mode as no actual exists ');
9421                 End IF;
9422                             IF l_txn_currency_code_override IS NOT NULL THEN
9423                                     --print_msg(' set g_ra_bl_txn_currency_code to l_txn_currency_code_override['||l_txn_currency_code_override);
9424                                     g_ra_bl_txn_currency_code := l_txn_currency_code_override;
9425                             END IF;
9426                 g_Wp_curCode_tab(l_countr) := g_ra_bl_txn_currency_code ;
9427                 /* Bug fix:4394666: During apply progress mode always retain the transaction currency code for the resource
9428                                  * Reason: When progress cycle is shifted, we clear all closed periods so the transaction currency is lost
9429                                  * when etc start date is later than ra planning end date.
9430                                  */
9431                                 IF NVL(p_apply_progress_flag,'N') = 'Y' Then
9432                                    IF g_Wp_curCode_tab(l_countr) is NULL Then
9433                                         g_Wp_curCode_tab(l_countr) := l_txn_currency_code;
9434                     --print_msg('Setting WP currency to txn currency code during apply progress mode');
9435                                    End If;
9436                                 End If;
9437                                 /* End of bug fix: 4394666 */
9438 
9439                    END IF; --g_wp_version_flag = 'Y'
9440 
9441             END If; -- end of g_agr_conv_reqd_flag
9442             /* Bug fix::4396300 */
9443                         IF (p_calling_module in ('BUDGET_GENERATION','FORECAST_GENERATION')
9444                             AND g_ra_bl_txn_currency_code  is NULL ) Then
9445                                 --print_msg('Setting the wp currency code context during budget/forecst generation process');
9446                                 g_Wp_curCode_tab(l_countr) := l_txn_currency_code;
9447                         End If;
9448                         /* Bug fix:4396300 */
9449             --print_msg(' Value of g_ra_bl_txn_currency_code ['||g_ra_bl_txn_currency_code||']Wp_curCode_tab['||g_Wp_curCode_tab(l_countr)||']');
9450 
9451                         l_stage := 276;
9452                         --print_msg(to_char(l_stage)||'CHK if l_delete_budget_lines ['||l_delete_budget_lines||']');
9453                         IF l_delete_budget_lines = 'Y' THEN
9454 				If P_PA_DEBUG_MODE = 'Y' Then
9455                                 print_msg(to_char(l_stage)||' Delete from pa_budget_lines, rollup pfc numbers, and skip record');
9456 				End if;
9457                                 pa_fp_calc_plan_pkg.delete_budget_lines
9458                                         (p_budget_version_id          => p_budget_version_id
9459                                         ,p_resource_assignment_id     => l_resource_assignment_id
9460                                         ,p_txn_currency_code          => l_txn_currency_code
9461                                         ,p_line_start_date            => g_line_start_date
9462                                         ,p_line_end_date              => g_line_end_date
9463                                         ,p_source_context             => g_source_context
9464                                         ,x_return_status              => l_return_status
9465                                         ,x_msg_count                  => x_msg_count
9466                                         ,x_msg_data                   => x_msg_data
9467                                         ,x_num_rowsdeleted            => l_num_rowsdeleted
9468                                         );
9469 				If P_PA_DEBUG_MODE = 'Y' Then
9470                                 print_msg('Number of budgetLines deleted['||l_num_rowsdeleted||']retSts['||l_return_status||']');
9471 				End if;
9472                                 IF l_return_status <> 'S' Then
9473                                         x_return_status := l_return_status;
9474                                         l_entire_return_status := l_return_status;
9475                                 END IF;
9476                 		IF NVL(p_raTxn_rollup_api_call_flag,'Y') = 'Y' AND nvl(l_entire_return_status,'S') = 'S' Then
9477 			    	   If p_source_context = 'RESOURCE_ASSIGNMENT' Then
9478 					l_raTxnRec_mode := 'RES_ATTRB_CHANGE';
9479 			    	   Else
9480 					l_raTxnRec_mode := 'DELETE_BL';
9481 			    	End If;
9482                             	--print_msg('Calling populate_raTxn_Recs API for delete of for Resource attribute changes');
9483                                 delete_raTxn_Tmp;
9484                                 populate_raTxn_Recs (
9485                                 p_budget_version_id     => g_budget_version_id
9486                                 ,p_source_context       => 'BUDGET_LINE' -- to rollup the amounts
9487                                 ,p_calling_mode         => l_raTxnRec_mode
9488                                 ,p_delete_flag          => 'N'
9489                                 ,p_delete_raTxn_flag    => 'N'
9490                                 ,p_refresh_rate_flag    => g_refresh_rates_flag
9491                                 ,p_rollup_flag          => 'Y'
9492                                 ,p_call_raTxn_rollup_flag => 'Y'
9493 				,p_resource_assignment_id => l_resource_assignment_id
9494             			,p_txn_currency_code	 => l_txn_currency_code
9495 				,p_start_date           => g_line_start_date
9496                                 ,x_return_status        => l_return_status
9497                                 ,x_msg_count            => x_msg_count
9498                                 ,x_msg_data             => x_msg_data
9499                                 );
9500                             	--print_msg('AFter calling populate_raTxn_Recs retSTst['||l_return_status||']MsgData['||x_msg_data||']');
9501                             	IF l_return_status <> 'S' Then
9502                                     x_return_status := l_return_status;
9503                                     l_entire_return_status := l_return_status;
9504                             	END IF;
9505                     		END IF;
9506 
9507                                 IF p_source_context = 'RESOURCE_ASSIGNMENT' Then
9508                                    IF (l_spread_amounts_flag = 'N' OR l_num_rowsdeleted > 0) Then
9509                                         l_spread_amounts_flag := 'Y';
9510                                    END If;
9511                                 End If;
9512                         END IF;  --IF l_delete_budget_lines = 'Y'
9513 
9514             l_stage := 277;
9515             /*Progess can be applied in two modes, 1. ETC may come in along with actuals
9516                           2. ETC may come in with NO actuals exists on the budget lines.
9517                           so this needs to handled properly, when no actuals exists on budget line
9518                           the ETC qty should be respread, so delete all the budget lines after the etc start date
9519                           and respread the given ETC so this shoul go through normal flow.
9520               so set the g_apply_progress_flag to 'N'.
9521                           When actuals Exists, by pass the apply precedence rules,
9522              */
9523             IF g_apply_progress_flag_tab.EXISTS(i) THEN
9524                 l_apply_progress_flag := g_apply_progress_flag_tab(i);
9525             Else
9526                 l_apply_progress_flag := 'N';
9527             End If;
9528 
9529         /* BudgetLine comparision and applying precedence rules will require only if we call the spread api
9530          * to populate the budget lines in rollup tmp. For refresh rates and mass adjust, the existsing lines
9531          * from budgetlines will be copied into rollup tmp in calculate api. so NO need to apply and compare
9532          */
9533             IF (g_refresh_conv_rates_flag ='N'
9534                 AND g_refresh_rates_flag    ='N'
9535                 AND g_mass_adjust_flag      = 'N'
9536             AND g_mfc_cost_refresh_tab(l_countr) = 'N' ) THEN  --{
9537 
9538             /* Rounding Enhancements: round off the given quantity and amounts before start processing */
9539                If l_txn_plan_quantity is NOT NULL Then
9540                 If l_rate_based_flag = 'N' THEN
9541                     l_txn_plan_quantity := pa_currency.round_trans_currency_amt1(l_txn_plan_quantity,l_txn_currency_code);
9542                 Else
9543                     l_txn_plan_quantity := round_quantity(l_txn_plan_quantity);
9544                 End If;
9545                End If;
9546 
9547                If l_txn_raw_cost is NOT NULL Then
9548                 l_txn_raw_cost := pa_currency.round_trans_currency_amt1(l_txn_raw_cost,l_txn_currency_code);
9549                End If;
9550                If l_txn_burdened_cost is NOT NULL Then
9551                 l_txn_burdened_cost := pa_currency.round_trans_currency_amt1(l_txn_burdened_cost,l_txn_currency_code);
9552                End If;
9553                If l_txn_revenue is NOT NULL Then
9554                 l_txn_revenue := pa_currency.round_trans_currency_amt1(l_txn_revenue,l_txn_currency_code);
9555                End If;
9556 
9557             /* compare with budget line values
9558             * and populate the changed flags. Based on these flag apply the
9559             * precedence and set the addl variables to pass it to spread api
9560             */
9561             l_stage := 280;
9562 	    If P_PA_DEBUG_MODE = 'Y' Then
9563             print_msg(l_stage||'Before calling Compare_With_BdgtLine_Values');
9564             print_msg('l_apply_progress_flag['||l_apply_progress_flag||']l_txn_plan_quantity['||l_txn_plan_quantity||']');
9565             print_msg('l_txn_raw_cost['||l_txn_raw_cost||']l_raw_cost_rate['||l_raw_cost_rate||']rwcostrateoverride['||l_rw_cost_rate_override);
9566             print_msg('l_txn_burdened_cost['||l_txn_burdened_cost||']l_burden_cost_rate['||l_burden_cost_rate||']');
9567             print_msg('l_burden_cost_rate_override['||l_burden_cost_rate_override);
9568             print_msg('l_txn_revenue['||l_txn_revenue||']l_bill_rate['||l_bill_rate||']l_bill_rate_override['||l_bill_rate_override||']');
9569             print_msg('l_org_quantity_changed_flag['||l_org_quantity_changed_flag||']l_org_raw_cost_changed_flag['||l_org_raw_cost_changed_flag||']');
9570             print_msg('l_org_rw_rate_changed_flag['||l_org_rw_rate_changed_flag||']org_burdencostchanged_flag['||l_org_burden_cost_changed_flag||']');
9571             print_msg('l_org_b_cost_rate_changed_flag['||l_org_b_cost_rate_changed_flag||']l_org_rev_changed_flag['||l_org_rev_changed_flag||']');
9572             print_msg('l_org_bill_rate_changed_flag['||l_org_bill_rate_changed_flag||']');
9573 	    End If;
9574 
9575             Compare_With_BdgtLine_Values
9576                 (p_resource_ass_id => l_resource_assignment_id
9577                 ,p_txn_currency_code => l_txn_currency_code
9578                 ,p_line_start_date   => g_line_start_date
9579                 ,p_line_end_date     => g_line_end_date
9580                 ,p_bdgt_version_type => g_fp_budget_version_type
9581                 ,p_rate_based_flag   => l_rate_based_flag
9582                 ,p_apply_progress_flag => l_apply_progress_flag
9583                 ,p_resAttribute_changed_flag => l_resAttribChangeFlag
9584                      /* Bug fix:4263265 Added these param to avoid deriving rate overrides */
9585                     ,p_qty_changed_flag          => l_org_quantity_changed_flag
9586                     ,p_raw_cost_changed_flag     => l_org_raw_cost_changed_flag
9587                     ,p_rw_cost_rate_changed_flag => l_org_rw_rate_changed_flag
9588                     ,p_burden_cost_changed_flag  => l_org_burden_cost_changed_flag
9589                     ,p_b_cost_rate_changed_flag  => l_org_b_cost_rate_changed_flag
9590                     ,p_rev_changed_flag          => l_org_rev_changed_flag
9591                     ,p_bill_rate_changed_flag    => l_org_bill_rate_changed_flag
9592 		,p_revenue_only_entry_flag  	=> l_rev_only_entry_flag_tab(i)
9593                 /* End of bug fix:4263265 */
9594                 ,p_txn_currency_code_ovr => l_txn_currency_code_override
9595                 ,p_txn_plan_quantity  => l_txn_plan_quantity
9596                 ,p_txn_raw_cost       => l_txn_raw_cost
9597                 ,p_txn_raw_cost_rate  => l_raw_cost_rate
9598                 ,p_txn_rw_cost_rate_override => l_rw_cost_rate_override
9599                 ,p_txn_burdened_cost    => l_txn_burdened_cost
9600                 ,p_txn_b_cost_rate  => l_burden_cost_rate
9601                 ,p_txn_b_cost_rate_override => l_burden_cost_rate_override
9602                 ,p_txn_revenue => l_txn_revenue
9603                 ,p_txn_bill_rate => l_bill_rate
9604                 ,p_txn_bill_rate_override => l_bill_rate_override
9605                 ,x_qty_changed_flag => l_quantity_changed_flag
9606                 ,x_raw_cost_changed_flag => l_raw_cost_changed_flag
9607                 ,x_rw_cost_rate_changed_flag => l_rw_cost_rate_changed_flag
9608                 ,x_burden_cost_changed_flag => l_burden_cost_changed_flag
9609                 ,x_b_cost_rate_changed_flag => l_b_cost_rate_changed_flag
9610                 ,x_rev_changed_flag         => l_rev_changed_flag
9611                 ,x_bill_rate_changed_flag   => l_bill_rate_changed_flag
9612                 ,x_bill_rt_ovr_changed_flag => l_bill_rt_ovr_changed_flag
9613                     ,x_txn_revenue_addl  => l_txn_revenue_addl
9614                                 ,x_txn_raw_cost_addl => l_txn_raw_cost_addl
9615                                 ,x_txn_plan_quantity_addl => l_txn_plan_quantity_addl
9616                                 ,x_txn_burdened_cost_addl => l_txn_burdened_cost_addl
9617                 ,x_init_raw_cost         => l_txn_init_raw_cost
9618                         ,x_init_burdened_cost    => l_txn_init_burdened_cost
9619                         ,x_init_revenue          => l_txn_init_revenue
9620                         ,x_init_quantity         => l_txn_init_quantity
9621                 ,x_bl_raw_cost           => l_bl_raw_cost
9622                     ,x_bl_burdened_cost      => l_bl_burdened_cost
9623                     ,x_bl_revenue            => l_bl_revenue
9624                     ,x_bl_quantity           => l_bl_quantity
9625                 );
9626 
9627             l_stage := 281;
9628 	    If P_PA_DEBUG_MODE = 'Y' Then
9629             print_msg(l_stage||'After calling Compare_With_BdgtLine_Values');
9630             print_msg('l_txn_plan_quantity['||l_txn_plan_quantity||']');
9631             print_msg('l_txn_raw_cost['||l_txn_raw_cost||']l_raw_cost_rate['||l_raw_cost_rate||']rwcostrateoverride['||l_rw_cost_rate_override);
9632             print_msg('l_txn_burdened_cost['||l_txn_burdened_cost||']l_burden_cost_rate['||l_burden_cost_rate||']');
9633             print_msg('l_burden_cost_rate_override['||l_burden_cost_rate_override);
9634             print_msg('l_txn_revenue['||l_txn_revenue||']l_bill_rate['||l_bill_rate||']l_bill_rate_override['||l_bill_rate_override||']');
9635             print_msg('l_quantity_changed_flag['||l_quantity_changed_flag||']l_raw_cost_changed_flag['||l_raw_cost_changed_flag||']');
9636             print_msg('l_rw_cost_rate_changed_flag['||l_rw_cost_rate_changed_flag||']burdencostchanged_flag['||l_burden_cost_changed_flag||']');
9637             print_msg('l_b_cost_rate_changed_flag['||l_b_cost_rate_changed_flag||']l_rev_changed_flag['||l_rev_changed_flag||']');
9638             print_msg('l_bill_rate_changed_flag['||l_bill_rate_changed_flag||']billrtovrchanged_flag['||l_bill_rt_ovr_changed_flag||']');
9639                         print_msg('l_txn_raw_cost_addl['||l_txn_raw_cost_addl||']l_txn_plan_quantity_addl['||l_txn_plan_quantity_addl||']');
9640                         print_msg('l_txn_burdened_cost_addl['||l_txn_burdened_cost_addl||']l_txn_init_raw_cost['||l_txn_init_raw_cost||']');
9641                     print_msg('l_txn_init_burdened_cost['||l_txn_init_burdened_cost||']l_txn_init_revenue['||l_txn_init_revenue||']');
9642                     print_msg('l_txn_init_quantity['||l_txn_init_quantity||']');
9643              print_msg('l_bl_raw_cost['||l_bl_raw_cost||']l_bl_revenue['||l_bl_revenue||']l_bl_quantity['||l_bl_quantity||']');
9644 	     End If;
9645 
9646             /* Reset changed flag based on the resource Attribute Flags */
9647             IF ( l_re_spread_amts_flag = 'Y'
9648                              OR l_sp_curve_change_flag = 'Y'
9649                              OR l_spfix_date_change_flag = 'Y'
9650                              OR l_plan_dates_change_flag = 'Y'
9651                              OR l_rlm_id_change_flag = 'Y'
9652                  OR NVL(p_apply_progress_flag,'N') = 'Y' ) THEN
9653                 --print_msg('Setting addl columns to NULL');
9654                 -- derive addl quantity and spread addl quantity only then re stamp the
9655                 -- override rates and currency cuonversion attributes
9656                 -- l_quantity_changed_flag := 'N';
9657                             l_raw_cost_changed_flag := 'N';
9658                             l_rw_cost_rate_changed_flag := 'N';
9659                             l_burden_cost_changed_flag := 'N';
9660                             l_b_cost_rate_changed_flag := 'N';
9661                             l_rev_changed_flag := 'N';
9662                             l_bill_rate_changed_flag := 'N';
9663                             l_bill_rt_ovr_changed_flag := 'N';
9664                 l_txn_raw_cost_addl      := NULL;
9665                 l_txn_burdened_cost_addl := NULL;
9666                 l_txn_revenue_addl       := NULL;
9667                 /* when rates override rates only entered along with planning dates change, then call refresh mode */
9668                 IF l_plan_dates_change_flag = 'Y' AND l_ra_in_multi_cur_flag = 'Y'  Then
9669                        IF (l_rw_cost_rate_override is NOT NULL AND l_rate_based_flag = 'Y') Then
9670                     l_rw_cost_rate_changed_flag := 'Y';
9671                    End If;
9672                    IF l_burden_cost_rate_override is NOT NULL Then
9673                     l_b_cost_rate_changed_flag := 'Y';
9674                    End If;
9675 
9676                    IF g_fp_budget_version_type in ('REVENUE') Then
9677                      IF (l_bill_rate_override is NOT NULL AND l_rate_based_flag = 'Y')  Then
9678                     l_bill_rate_changed_flag := 'Y';
9679                      End IF;
9680                    Elsif g_fp_budget_version_type in ('ALL') Then
9681                                      IF (l_bill_rate_override is NOT NULL)  Then
9682                                         l_bill_rate_changed_flag := 'Y';
9683                                      End IF;
9684                    END IF;
9685                 END IF;
9686             End IF;
9687             /* Apply precedence rules to the additionals
9688             * based on the rate based flag, changed_flags
9689             * the outcome will determine whether spread and rate api needs to be called or not
9690             * since the logic is different and to avoid using tooo many if conditions to check the variables
9691             * seperate apis are written for rate base and non rate base
9692             * transactions
9693             */
9694 
9695             -- IPM changes - find the current override burden rate
9696             IF p_source_context = 'RESOURCE_ASSIGNMENT' THEN
9697                BEGIN
9698 		l_curr_burden_rate := NULL;
9699  	        l_curr_bill_rate   := NULL;
9700  	        l_curr_cost_rate := NULL;
9701                SELECT rtx.txn_burden_cost_rate_override
9702              ,rtx.txn_bill_rate_override
9703              ,tmp.bill_markup_percentage
9704 	     ,rtx.txn_raw_cost_rate_override
9705                  INTO l_curr_burden_rate
9706             ,l_curr_bill_rate
9707             ,l_curr_markup_percentage
9708 	    ,l_curr_cost_rate
9709                  FROM pa_resource_asgn_curr rtx
9710              ,pa_fp_spread_calc_tmp tmp
9711                 WHERE tmp.resource_assignment_id = l_resource_assignment_id
9712                   AND tmp.txn_currency_code = l_txn_currency_code
9713           AND rtx.resource_assignment_id = tmp.resource_assignment_id
9714           AND rtx.txn_currency_code = tmp.txn_currency_code;
9715           If l_curr_markup_percentage is NULL Then
9716             l_curr_bill_rate := NULL;
9717           End If;
9718                EXCEPTION WHEN OTHERS THEN
9719                   l_curr_burden_rate := NULL;
9720                   l_curr_bill_rate   := NULL;
9721 		  l_curr_cost_rate := NULL;
9722                END;
9723             ELSE
9724                BEGIN
9725 		l_curr_burden_rate := NULL;
9726  	        l_curr_bill_rate   := NULL;
9727  	        l_curr_cost_rate := NULL;
9728                   SELECT AVG(bl.burden_cost_rate_override)
9729             ,AVG(bl.txn_bill_rate_override)
9730             ,AVG(bl.txn_markup_percent)
9731 	    ,AVG(bl.txn_cost_rate_override)
9732                     INTO l_curr_burden_rate
9733             ,l_curr_bill_rate
9734             ,l_curr_markup_percentage
9735 	    ,l_curr_cost_rate
9736                     FROM pa_budget_lines bl
9737                    WHERE bl.resource_assignment_id = l_resource_assignment_id
9738                      AND bl.txn_currency_code = l_txn_currency_code
9739              AND bl.start_date between l_bdgt_line_sDate and l_bdgt_line_eDate;
9740             If l_curr_markup_percentage is NULL Then
9741                             l_curr_bill_rate := NULL;
9742                     End If;
9743                EXCEPTION WHEN OTHERS THEN
9744                      l_curr_burden_rate := NULL;
9745                      l_curr_bill_rate := NULL;
9746 		     l_curr_cost_rate := NULL;
9747                END;
9748             END IF;
9749 
9750             IF  NVL(l_apply_progress_flag,'N') <> 'Y' THEN
9751                IF  l_rate_based_flag = 'N' THEN --{
9752                 l_stage := 282;
9753 		If P_PA_DEBUG_MODE = 'Y' Then
9754                 print_msg(l_stage||'Calling Apply_NON_RATE_BASE_precedence api');
9755 		End If;
9756                 Apply_NON_RATE_BASE_precedence(
9757                    p_txn_currency_code         => l_txn_currency_code
9758                   ,p_rate_based_flag           => l_rate_based_flag
9759                   ,p_budget_version_type       => g_fp_budget_version_type
9760                   ,p_qty_changed_flag          => l_quantity_changed_flag
9761                   ,p_raw_cost_changed_flag     => l_raw_cost_changed_flag
9762                   ,p_rw_cost_rate_changed_flag => l_rw_cost_rate_changed_flag
9763                   ,p_burden_cost_changed_flag  => l_burden_cost_changed_flag
9764                   ,p_b_cost_rate_changed_flag  => l_b_cost_rate_changed_flag
9765                   ,p_rev_changed_flag          => l_rev_changed_flag
9766                   ,p_bill_rate_changed_flag    => l_bill_rate_changed_flag
9767                   ,p_bill_rt_ovr_changed_flag  => l_bill_rt_ovr_changed_flag
9768                   ,p_init_raw_cost             => l_txn_init_raw_cost
9769                   ,p_init_burdened_cost        => l_txn_init_burdened_cost
9770                   ,p_init_revenue              => l_txn_init_revenue
9771                   ,p_init_quantity             => l_txn_init_quantity
9772                   ,p_bl_raw_cost               => l_bl_raw_cost
9773                   ,p_bl_burdened_cost          => l_bl_burdened_cost
9774                   ,p_bl_revenue                => l_bl_revenue
9775                   ,p_bl_quantity               => l_bl_quantity
9776 		  ,p_curr_cost_rate            => l_curr_cost_rate
9777                   ,p_curr_burden_rate          => l_curr_burden_rate
9778                   ,p_curr_bill_rate            => l_curr_bill_rate
9779 		  ,p_revenue_only_entry_flag   => l_rev_only_entry_flag_tab(i)
9780                   ,x_txn_plan_quantity         => l_txn_plan_quantity
9781                   ,x_txn_raw_cost              => l_txn_raw_cost
9782                   ,x_txn_raw_cost_rate         => l_raw_cost_rate
9783                   ,x_txn_rw_cost_rate_override => l_rw_cost_rate_override
9784                   ,x_txn_burdened_cost         => l_txn_burdened_cost
9785                   ,x_txn_b_cost_rate           => l_burden_cost_rate
9786                   ,x_txn_b_cost_rate_override  => l_burden_cost_rate_override
9787                   ,x_txn_revenue               => l_txn_revenue
9788                   ,x_txn_bill_rate             => l_bill_rate
9789                   ,x_txn_bill_rate_override    => l_bill_rate_override
9790                   ,x_txn_revenue_addl          => l_txn_revenue_addl
9791                   ,x_txn_raw_cost_addl         => l_txn_raw_cost_addl
9792                   ,x_txn_plan_quantity_addl    => l_txn_plan_quantity_addl
9793                   ,x_txn_burdened_cost_addl    => l_txn_burdened_cost_addl
9794                   );
9795 		If P_PA_DEBUG_MODE = 'Y' Then
9796                 print_msg(l_stage||'End of Apply_NON_RATE_BASE_precedence api');
9797 		End if;
9798                ELse -- rate base flag = 'Y'
9799 
9800 
9801                 l_stage := 283;
9802 		If P_PA_DEBUG_MODE = 'Y' Then
9803                 print_msg(l_stage||'Calling Apply_RATE_BASE_precedence api');
9804 		End If;
9805                 Apply_RATE_BASE_precedence(
9806                    p_txn_currency_code         => l_txn_currency_code
9807                   ,p_rate_based_flag           => l_rate_based_flag
9808                   ,p_budget_version_type       => g_fp_budget_version_type
9809                   ,p_qty_changed_flag          => l_quantity_changed_flag
9810                   ,p_raw_cost_changed_flag     => l_raw_cost_changed_flag
9811                   ,p_rw_cost_rate_changed_flag => l_rw_cost_rate_changed_flag
9812                   ,p_burden_cost_changed_flag  => l_burden_cost_changed_flag
9813                   ,p_b_cost_rate_changed_flag  => l_b_cost_rate_changed_flag
9814                   ,p_rev_changed_flag          => l_rev_changed_flag
9815                   ,p_bill_rate_changed_flag    => l_bill_rate_changed_flag
9816                   ,p_bill_rt_ovr_changed_flag  => l_bill_rt_ovr_changed_flag
9817                   ,p_init_raw_cost             => l_txn_init_raw_cost
9818                   ,p_init_burdened_cost        => l_txn_init_burdened_cost
9819                   ,p_init_revenue              => l_txn_init_revenue
9820                   ,p_init_quantity             => l_txn_init_quantity
9821                   ,p_bl_raw_cost               => l_bl_raw_cost
9822                   ,p_bl_burdened_cost          => l_bl_burdened_cost
9823                   ,p_bl_revenue                => l_bl_revenue
9824                   ,p_bl_quantity               => l_bl_quantity
9825 		  ,p_curr_cost_rate            => l_curr_cost_rate
9826                   ,p_curr_burden_rate          => l_curr_burden_rate
9827                   ,p_curr_bill_rate            => l_curr_bill_rate
9828                   ,x_txn_plan_quantity         => l_txn_plan_quantity
9829                   ,x_txn_raw_cost              => l_txn_raw_cost
9830                   ,x_txn_raw_cost_rate         => l_raw_cost_rate
9831                   ,x_txn_rw_cost_rate_override => l_rw_cost_rate_override
9832                   ,x_txn_burdened_cost         => l_txn_burdened_cost
9833                   ,x_txn_b_cost_rate           => l_burden_cost_rate
9834                   ,x_txn_b_cost_rate_override  => l_burden_cost_rate_override
9835                   ,x_txn_revenue               => l_txn_revenue
9836                   ,x_txn_bill_rate             => l_bill_rate
9837                   ,x_txn_bill_rate_override    => l_bill_rate_override
9838                   ,x_txn_revenue_addl          => l_txn_revenue_addl
9839                   ,x_txn_raw_cost_addl         => l_txn_raw_cost_addl
9840                   ,x_txn_plan_quantity_addl    => l_txn_plan_quantity_addl
9841                   ,x_txn_burdened_cost_addl    => l_txn_burdened_cost_addl
9842                 );
9843 		If P_PA_DEBUG_MODE = 'Y' Then
9844                 print_msg(l_stage||'End of Apply_RATE_BASE_precedence api');
9845 		End If;
9846 		End If;  --} // end of precedence rules
9847  	        /* Bug fix:5726773 */
9848  	        /* Added check here to catch the quantity change in precedence rules when
9849  	         * Changing cost and rates may change quantity from +ve to -ve or -ve to +ve */
9850  	        IF g_wp_version_flag = 'Y' Then --{
9851  	           If (l_quantity_changed_flag = 'N' and l_total_qty_tab.EXISTS(i)) Then
9852  	              if nvl(l_txn_plan_quantity,0) <> 0 and nvl(l_total_qty_tab(i),0) <> 0 Then
9853  	                  if sign(nvl(l_txn_plan_quantity,0)) <> sign(nvl(l_total_qty_tab(i),0)) Then
9854  	                         l_neg_Qty_Changflag_tab(i) := 'Y';
9855  	                  end if;
9856  	              End if;
9857                    End If;
9858 		Else -- for budgets / forecasts
9859  	                   if l_rate_based_flag = 'Y' Then
9860  	                     If (l_quantity_changed_flag = 'N' and l_total_qty_tab.EXISTS(i)) Then
9861  	                       if nvl(l_txn_plan_quantity,0) <> 0 and nvl(l_total_qty_tab(i),0) <> 0 Then
9862  	                         if sign(nvl(l_txn_plan_quantity,0)) <> sign(nvl(l_total_qty_tab(i),0)) Then
9863  	                                 l_neg_Qty_Changflag_tab(i) := 'Y';
9864  	                         end if;
9865  	                       End if;
9866  	                     End If;
9867  	                   Else -- for non-rate based flag
9868  	                     If (g_fp_budget_version_type in ('COST','ALL')) Then
9869  	                         If l_neg_Raw_Changflag_tab(i) = 'Y' Then
9870  	                            l_neg_Qty_Changflag_tab(i) := 'Y';
9871  	                         Elsif g_fp_budget_version_type = 'ALL' and l_rev_only_entry_flag_tab(i) = 'Y' Then
9872  	                           If l_neg_rev_Changflag_tab(i) = 'Y' Then
9873  	                                 l_neg_Qty_Changflag_tab(i) := 'Y';
9874  	                           End If;
9875  	                         End If;
9876  	                     Elsif g_fp_budget_version_type = 'REVENUE' Then
9877  	                         If l_neg_rev_Changflag_tab(i) = 'Y' Then
9878  	                            l_neg_Qty_Changflag_tab(i) := 'Y';
9879  	                         End If;
9880  	                     End If;
9881  	                   End If;
9882  	                 End IF; --}
9883 
9884         /* IPM changes: If rates are nulled out from UI, it should refresh the rates from rate schedule */
9885         If l_cost_rt_miss_num_flag_tab(i) = 'Y' Then
9886                         l_rw_cost_rate_changed_flag := 'Y';
9887                         l_rw_cost_rate_override := NULL;
9888                 End If;
9889                 If l_burd_rt_miss_num_flag_tab(i) = 'Y' Then
9890                         l_b_cost_rate_changed_flag := 'Y';
9891                         l_burden_cost_rate_override := NULL;
9892                 End If;
9893                 If l_bill_rt_miss_num_flag_tab(i) = 'Y' Then
9894                         l_bill_rate_changed_flag := 'Y';
9895                         l_bill_rate_override := NULL;
9896                 End If;
9897               /* Reset Additionals based on the resource Attribute Flags */
9898                           IF ( l_re_spread_amts_flag = 'Y'
9899                              OR l_sp_curve_change_flag = 'Y'
9900                              OR l_spfix_date_change_flag = 'Y'
9901                              OR l_plan_dates_change_flag = 'Y'
9902                              OR l_rlm_id_change_flag = 'Y'
9903                              OR NVL(p_apply_progress_flag,'N') = 'Y' ) THEN
9904                                 -- derive addl quantity and spread addl quantity only then re stamp the
9905                                 -- override rates and currency cuonversion attributes
9906                                 l_txn_raw_cost_addl      := NULL;
9907                                 l_txn_burdened_cost_addl := NULL;
9908                                 l_txn_revenue_addl       := NULL;
9909 				l_neg_Qty_Changflag_tab(i) := 'N';
9910                           End IF;
9911 
9912               /* Performance Impr: When Rate alone changed, then no need to call the spread api
9913                * copy budget lines to rollup tmp and update the changed rates
9914                * doing this will improve performance by 50%
9915                */
9916               IF NVL(l_txn_plan_quantity_addl,0) = 0
9917                  AND ( (l_raw_cost_changed_flag = 'Y' AND
9918                         l_rate_based_flag = 'Y')
9919                       OR l_rw_cost_rate_changed_flag = 'Y'
9920                       OR l_burden_cost_changed_flag = 'Y'
9921                       OR l_b_cost_rate_changed_flag ='Y'
9922                       OR l_rev_changed_flag = 'Y'
9923                       OR l_bill_rate_changed_flag = 'Y'
9924                       OR l_bill_rt_ovr_changed_flag = 'Y'  ) Then
9925                 g_rtChanged_Ra_Flag_tab(l_countr) := 'Y';
9926               End If;
9927 
9928               /*Corner case bug 6429285:
9929                 If a rate based resource is added as non rate based resource assignment
9930                 in pa_resource_asgn_curr and pa_budget_lines quantity will be populated
9931                 as raw_cost and display_quantity will be null.Now if we want to enter
9932                 the quantity same as raw cost (i.e existing quantity)the display_quantity will never be populated.
9933                 Also in this case populating the display_quantity is not enough we need to
9934                 give precedence to quantity and re-populate the raw cost,burden cost
9935                 and revenue based on quantity. This will happen only when we recalculate the
9936                 amounts. In this case there is no need to re-spread the amounts. So setting
9937                 rate changed flag because the ra will be treated as rate based and recalculated again
9938                 in this process.
9939 
9940                 This fix is inspired by fix 5088589.
9941               */
9942               --Bug 6429285
9943               If g_wp_version_flag ='N' and NVL(l_txn_plan_quantity_addl,0) = 0 and nvl(l_quantity_changed_flag,'N') = 'Y' Then
9944                     g_rtChanged_Ra_Flag_tab(l_countr) := 'Y';
9945               end if;
9946               --Bug 6429285
9947 
9948 	     /* bug fix:5088589: Corner case: For revenue only entered trx. when raw cost is changed and which is
9949              * same as existing quantity, then process ignores the changes
9950              */
9951 	    If g_fp_budget_version_type = 'ALL'
9952 		AND l_rate_based_flag = 'N'
9953 		AND NVL(l_txn_plan_quantity_addl,0) = 0
9954 		AND g_rtChanged_Ra_Flag_tab(l_countr) = 'N' Then
9955                 If l_raw_cost_changed_flag = 'Y' Then
9956                    If l_txn_raw_cost = l_bl_quantity and l_bl_quantity = l_bl_revenue Then
9957                    	--print_msg('283: set the rate change flag to Y so that it goes throguh refresh mode and updates');
9958 			g_rtChanged_Ra_Flag_tab(l_countr) := 'Y';
9959                    	IF nvl(l_rw_cost_rate_override , 1) <> 0 THEN
9960                                l_rw_cost_rate_override := 1;
9961                    	END IF;
9962                    End If;
9963 		End If;
9964             End If; --end of bug fix:5088589
9965 
9966             END IF; -- end of applyprogress mode
9967         END IF;  --}  end of bl comparision
9968 
9969         /* Bug fix:4295967 */
9970         IF NVL(p_apply_progress_flag,'N') = 'Y' Then
9971            If NVL(l_txn_plan_quantity_addl,0) = 0 Then
9972             g_applyProg_refreshRts_tab(l_countr) := 'Y';
9973            End If;
9974         End If;
9975 
9976         /* If delete flag is passed in budget line context then, spread or refresh should not be called
9977         * just delete the budget lines */
9978         IF p_source_context = 'BUDGET_LINE'
9979            AND l_delete_budget_lines = 'Y' THEN
9980             	g_rtChanged_Ra_Flag_tab(l_countr) := 'N';
9981             	l_txn_raw_cost_addl      := NULL;
9982                 l_txn_burdened_cost_addl := NULL;
9983                 l_txn_revenue_addl       := NULL;
9984 		If g_fp_budget_version_type = 'ALL' Then
9985 		   If l_rate_based_flag = 'N' AND l_re_spread_amts_flag = 'Y' Then
9986 			NULL;
9987 		   Else
9988             		l_txn_plan_quantity_addl := NULL;
9989 		   End If;
9990 		Else
9991 			l_txn_plan_quantity_addl := NULL;
9992 		End If;
9993         END IF;
9994 
9995    l_stage := 300;
9996 	If P_PA_DEBUG_MODE = 'Y' Then
9997    print_msg(to_char(l_stage)||' Local Variables populated from TAB IN parameters');
9998     print_msg(' l_delete_budget_lines['||l_delete_budget_lines||']l_spread_amounts_flag['||l_spread_amounts_flag||']');
9999     print_msg('l_txn_currency_code['||l_txn_currency_code||']l_txn_currency_code_override['||l_txn_currency_code_override||']');
10000     print_msg('l_txn_plan_quantity['||to_char(l_txn_plan_quantity)||']l_txn_plan_quantity_addl['||to_char(l_txn_plan_quantity_addl)||']');
10001     print_msg('l_txn_raw_cost['||to_char(l_txn_raw_cost)||']l_txn_raw_cost_addl['||to_char(l_txn_raw_cost_addl)||']');
10002     print_msg('l_txn_burdened_cost['||to_char(l_txn_burdened_cost)||']l_txn_burdened_cost_addl['||to_char(l_txn_burdened_cost_addl)||']');
10003     print_msg('l_txn_revenue['||to_char(l_txn_revenue)||']l_txn_revenue_addl['||to_char(l_txn_revenue_addl)||']');
10004     print_msg('l_raw_cost_rate[ '||to_char(l_raw_cost_rate)||']l_rw_cost_rate_override['||to_char(l_rw_cost_rate_override)||']');
10005     print_msg('l_burden_cost_rate['||to_char(l_burden_cost_rate)||']l_burden_cost_rate_override['||to_char(l_burden_cost_rate_override)||']');
10006     print_msg('l_bill_rate['||to_char(l_bill_rate)||']l_bill_rate_override['||to_char(l_bill_rate_override)||']');
10007     print_msg('g_line_start_date['||to_char(g_line_start_date)||']g_line_end_date ['||to_char(g_line_end_date)||']');
10008     print_msg('blInitRaw['||l_txn_init_raw_cost||']BlInitBurd['||l_txn_init_burdened_cost||'BlInitRev['||l_txn_init_revenue||']');
10009     print_msg('blinitQty['||l_txn_init_quantity||']blPlanRaw['||l_bl_raw_cost||']BlPlanBurd['||l_bl_burdened_cost||']');
10010     print_msg('blPlanReve['||l_bl_revenue||']BlPlanQty['||l_bl_quantity||']');
10011 	End If;
10012 
10013                 IF   ( NVL(l_txn_plan_quantity_addl,0)          = 0
10014                     AND g_refresh_conv_rates_flag       = 'N'
10015                     AND g_refresh_rates_flag            = 'N'
10016                     AND g_mass_adjust_flag              = 'N'
10017                 AND g_mfc_cost_refresh_tab(l_countr)    = 'N'
10018                 AND g_applyProg_refreshRts_tab(l_countr) = 'N'
10019                 AND g_rtChanged_Ra_Flag_tab(l_countr)   = 'N') Then
10020                 l_stage := 330;
10021                     print_msg(to_char(l_stage)||' Planning Transaction Calculate is bypassing this txn, required BL parameters are all NULL');
10022                     RAISE skip_record;
10023             END IF;
10024 
10025     l_stage := 520;
10026 	If P_PA_DEBUG_MODE = 'Y' Then
10027         print_msg(to_char(l_stage)||' Populate global temporary tables :refresh_conv_rates_flag ['||g_refresh_conv_rates_flag||']');
10028         print_msg(']refresh_rates_flag['||g_refresh_rates_flag||']');
10029 	End If;
10030 
10031         IF (g_refresh_conv_rates_flag ='Y'
10032        OR g_refresh_rates_flag    in ('Y','R','C')
10033            OR g_mass_adjust_flag      = 'Y'
10034        OR g_mfc_cost_refresh_tab(l_countr) = 'Y'
10035        OR g_rtChanged_Ra_Flag_tab(l_countr) = 'Y' ) THEN  --{
10036 
10037         g_refresh_rates_tab(l_countr) := g_refresh_rates_flag;
10038         g_refresh_conv_rates_tab(l_countr) := g_refresh_conv_rates_flag;
10039         g_mass_adjust_flag_tab(l_countr) := g_mass_adjust_flag;
10040         IF (g_mfc_cost_refresh_tab(l_countr) = 'Y' AND g_refresh_rates_flag = 'N')  Then
10041             g_mfc_cost_refrsh_Raid_tab(NVL(g_mfc_cost_refrsh_Raid_tab.last,0)+1) := l_resource_assignment_id;
10042             g_mfc_cost_refrsh_txnCur_tab(NVL(g_mfc_cost_refrsh_txnCur_tab.last,0)+1) := l_txn_currency_code;
10043         End If;
10044 
10045         /* process recors where rates only changed */
10046         IF (g_rtChanged_Ra_Flag_tab(l_countr) = 'Y'
10047            and g_mfc_cost_refresh_tab(l_countr) = 'N'
10048            and g_refresh_rates_flag = 'N'
10049            and g_refresh_conv_rates_flag = 'N'
10050            and g_mass_adjust_flag = 'N' ) Then
10051             	g_rtChanged_RaId_tab(NVL(g_rtChanged_RaId_tab.LAST,0)+1) := l_resource_assignment_id;
10052             	g_rtChanged_TxnCur_tab(NVL(g_rtChanged_TxnCur_tab.LAST,0)+1) := l_txn_currency_code;
10053             	g_rtChanged_sDate_tab(NVL(g_rtChanged_sDate_tab.LAST,0)+1)   := g_line_start_date;
10054             	g_rtChanged_eDate_tab(NVL(g_rtChanged_eDate_tab.LAST,0)+1)   := g_line_end_date;
10055             	g_rtChanged_CostRt_Tab(NVL(g_rtChanged_CostRt_Tab.LAST,0)+1) := l_rw_cost_rate_override;
10056             	g_rtChanged_BurdRt_tab(NVL(g_rtChanged_BurdRt_tab.LAST,0)+1) := l_burden_cost_rate_override;
10057             	g_rtChanged_billRt_tab(NVL(g_rtChanged_billRt_tab.LAST,0)+1) := l_bill_rate_override;
10058         	g_rtChanged_cstMisNumFlg_tab(NVL(g_rtChanged_cstMisNumFlg_tab.LAST,0)+1) := l_cost_rt_miss_num_flag_tab(i);
10059         	g_rtChanged_bdMisNumFlag_tab(NVL(g_rtChanged_bdMisNumFlag_tab.LAST,0)+1) := l_burd_rt_miss_num_flag_tab(i);
10060         	g_rtChanged_blMisNumFlag_tab(NVL(g_rtChanged_blMisNumFlag_tab.LAST,0)+1) := l_bill_rt_miss_num_flag_tab(i);
10061 		g_rtChanged_QtyMisNumFlg_tab(NVL(g_rtChanged_QtyMisNumFlg_tab.LAST,0)+1) := l_Qty_miss_num_flag_tab(i);
10062         	g_rtChanged_RwMisNumFlag_tab(NVL(g_rtChanged_RwMisNumFlag_tab.LAST,0)+1) := l_Rw_miss_num_flag_tab(i);
10063         	g_rtChanged_BrMisNumFlag_tab(NVL(g_rtChanged_BrMisNumFlag_tab.LAST,0)+1) := l_Br_miss_num_flag_tab(i);
10064         	g_rtChanged_RvMisNumFlag_tab(NVL(g_rtChanged_RvMisNumFlag_tab.LAST,0)+1) := l_Rv_miss_num_flag_tab(i);
10065         End If;
10066 
10067         ELSIF ( NVL(l_txn_plan_quantity_addl,0) <> 0 ) THEN
10068             l_stage := 400;
10069 	    If P_PA_DEBUG_MODE = 'Y' Then
10070             print_msg(to_char(l_stage)||' Spread Required populte the resAss tmp');
10071 	    End If;
10072         /*
10073         --  Populate global temporary table pa_fp_res_assignments_tmp with values assigned to
10074         --  the local variables.  The spread api queries this table for values
10075         */
10076             BEGIN
10077             /* THIS LOGIC HAS BEEN SHIFTED TO THE SPREAD API
10078              * Bug fix: 3831350 spread should spread from etc start date. setting the pl start as etc start will
10079              * will fix this issue
10080             IF g_spread_from_date is NOT NULL Then
10081                 IF g_spread_from_date BETWEEN l_planning_start_date AND l_planning_end_date THEN
10082                     l_planning_start_date := g_spread_from_date;
10083                 End IF;
10084             END IF;
10085             Bug fix: When currency override is passed, spread should create the lines in new override currency
10086             IF l_txn_currency_code_override  is NOT NULL Then
10087                 l_txn_currency_code := l_txn_currency_code_override;
10088             End If;
10089             **/
10090                 l_stage := 501;
10091 		If P_PA_DEBUG_MODE = 'Y' Then
10092                 print_msg(l_stage||'g_sprd_raId_tab.Last['||g_sprd_raId_tab.Last||']');
10093                 print_msg('MulticurPlanSD['||l_multicur_plan_start_date||']MutiCurPlanEd['||l_multicur_plan_end_date||']');
10094 		End If;
10095                 g_sprd_raId_tab(NVL(g_sprd_raId_tab.last,0)+1) := l_resource_assignment_id;
10096                 g_sprd_txn_cur_tab(NVL(g_sprd_txn_cur_tab.last,0)+1) := l_txn_currency_code;
10097                 g_sprd_sdate_tab(NVL(g_sprd_sdate_tab.last,0)+1) := g_line_start_date;
10098                 g_sprd_edate_tab(NVL(g_sprd_edate_tab.last,0)+1) := g_line_end_date;
10099                 g_sprd_plan_sdate_tab(NVL(g_sprd_plan_sdate_tab.last,0)+1) := NVL(l_multicur_plan_start_date,l_planning_start_date);
10100                 g_sprd_plan_edate_tab(NVL(g_sprd_plan_edate_tab.last,0)+1) := NVL(l_multicur_plan_end_date,l_planning_end_date);
10101                 g_sprd_txn_rev_tab(NVL(g_sprd_txn_rev_tab.last,0)+1) := l_txn_revenue;
10102                 g_sprd_txn_rev_addl_tab(NVL(g_sprd_txn_rev_addl_tab.last,0)+1) := NULL; --l_txn_revenue_addl;
10103                 g_sprd_txn_raw_tab(NVL(g_sprd_txn_raw_tab.last,0)+1) := l_txn_raw_cost;
10104                 g_sprd_txn_raw_addl_tab(NVL(g_sprd_txn_raw_addl_tab.last,0)+1) := NULL; --l_txn_raw_cost_addl;
10105                 g_sprd_txn_burd_tab(NVL(g_sprd_txn_burd_tab.last,0)+1) := l_txn_burdened_cost;
10106                 g_sprd_txn_burd_addl_tab(NVL(g_sprd_txn_burd_addl_tab.last,0)+1) := NULL; --l_txn_burdened_cost_addl;
10107                 g_sprd_qty_tab(NVL(g_sprd_qty_tab.last,0)+1) := l_txn_plan_quantity;
10108                 g_sprd_qty_addl_tab(NVL(g_sprd_qty_addl_tab.last,0)+1) := l_txn_plan_quantity_addl;
10109                 g_sprd_txn_cur_ovr_tab(NVL(g_sprd_txn_cur_ovr_tab.last,0)+1) := l_txn_currency_code_override;
10110                 g_sprd_txn_init_rev_tab(NVL(g_sprd_txn_init_rev_tab.last,0)+1) := l_txn_init_revenue;
10111                 g_sprd_txn_init_raw_tab(NVL(g_sprd_txn_init_raw_tab.last,0)+1) := l_txn_init_raw_cost;
10112                 g_sprd_txn_init_burd_tab(NVL(g_sprd_txn_init_burd_tab.last,0)+1) := l_txn_init_burdened_cost;
10113                 g_sprd_txn_init_qty_tab(NVL(g_sprd_txn_init_qty_tab.last,0)+1) := l_txn_init_quantity;
10114                 g_sprd_spread_reqd_flag_tab(NVL(g_sprd_spread_reqd_flag_tab.last,0)+1) := l_spread_amounts_flag;
10115                 g_sprd_costRt_tab(NVL(g_sprd_costRt_tab.last,0)+1) := l_raw_cost_rate;
10116                 g_sprd_costRt_Ovr_tab(NVL(g_sprd_costRt_Ovr_tab.last,0)+1) := l_rw_cost_rate_override;
10117                 g_sprd_burdRt_Tab(NVL(g_sprd_burdRt_Tab.last,0)+1) := l_burden_cost_rate;
10118                 g_sprd_burdRt_Ovr_tab(NVL(g_sprd_burdRt_Ovr_tab.last,0)+1) := l_burden_cost_rate_override;
10119                 g_sprd_billRt_tab(NVL(g_sprd_billRt_tab.last,0)+1) := l_bill_rate;
10120                 g_sprd_billRt_Ovr_tab(NVL(g_sprd_billRt_Ovr_tab.last,0)+1) := l_bill_rate_override;
10121                 g_sprd_ratebase_flag_tab(NVL(g_sprd_ratebase_flag_tab.last,0)+1) :=  l_rate_based_flag;
10122                 g_sprd_projCur_tab(NVL(g_sprd_projCur_tab.last,0)+1) := g_project_currency_code;
10123                 g_sprd_projfuncCur_tab(NVL(g_sprd_projfuncCur_tab.last,0)+1) := g_projfunc_currency_code;
10124                 g_sprd_task_id_tab(NVL(g_sprd_task_id_tab.last,0)+1) := g_task_id;
10125                 g_sprd_rlm_id_tab(NVL(g_sprd_rlm_id_tab.last,0)+1) := g_resource_list_member_id;
10126                 g_sprd_sp_fixed_date_tab(NVL(g_sprd_sp_fixed_date_tab.last,0)+1) := l_sp_fixed_date;
10127                 g_sprd_spcurve_id_tab(NVL(g_sprd_spcurve_id_tab.last,0)+1) := l_spread_curve_id;
10128             	g_sprd_cstRtmissFlag_tab(NVL(g_sprd_cstRtmissFlag_tab.last,0)+1) := l_cost_rt_miss_num_flag_tab(i);
10129                 g_sprd_bdRtmissFlag_tab(NVL(g_sprd_bdRtmissFlag_tab.last,0)+1) := l_burd_rt_miss_num_flag_tab(i);
10130                 g_sprd_bilRtmissFlag_tab(NVL(g_sprd_bilRtmissFlag_tab.last,0)+1) := l_bill_rt_miss_num_flag_tab(i);
10131 		g_sprd_QtymissFlag_tab(NVL(g_sprd_QtymissFlag_tab.last,0)+1) :=  l_Qty_miss_num_flag_tab(i);
10132         	g_sprd_RawmissFlag_tab(NVL(g_sprd_RawmissFlag_tab.last,0)+1) :=  l_Rw_miss_num_flag_tab(i);
10133         	g_sprd_BurdmissFlag_tab(NVL(g_sprd_BurdmissFlag_tab.last,0)+1):= l_Br_miss_num_flag_tab(i);
10134         	g_sprd_RevmissFlag_tab(NVL(g_sprd_RevmissFlag_tab.last,0)+1) :=  l_Rv_miss_num_flag_tab(i);
10135 		/* bug fix:5726773 */
10136  	        g_sprd_neg_Qty_Changflag_tab(NVL(g_sprd_neg_Qty_Changflag_tab.last,0)+1) := l_neg_Qty_Changflag_tab(i);
10137  	        g_sprd_neg_Raw_Changflag_tab(NVL(g_sprd_neg_Raw_Changflag_tab.last,0)+1) := l_neg_Raw_Changflag_tab(i);
10138  	        g_sprd_neg_Burd_Changflag_tab(NVL(g_sprd_neg_Burd_Changflag_tab.last,0)+1) :=l_neg_Burd_Changflag_tab(i);
10139  	        g_sprd_neg_rev_Changflag_tab(NVL(g_sprd_neg_rev_Changflag_tab.last,0)+1) := l_neg_rev_Changflag_tab(i);
10140             EXCEPTION
10141                 WHEN OTHERS THEN
10142                     print_msg(to_char(l_stage)||' ***ERROR*** Inserting into pa_fp_res_assignments_tmp');
10143                     pa_debug.g_err_stage := to_char(l_stage)||':  ***ERROR*** Inserting into pa_fp_res_assignments_tmp';
10144                 RAISE;
10145             END;
10146      /* Bug fix:4295967 */
10147     ELSIF  (NVL(p_apply_progress_flag,'N') = 'Y'
10148             AND NVL(l_txn_plan_quantity_addl,0) = 0
10149             AND g_applyProg_refreshRts_tab(l_countr) = 'Y' ) Then
10150                         g_applyProg_RaId_tab(NVL(g_applyProg_RaId_tab.LAST,0)+1) := l_resource_assignment_id;
10151                         g_applyProg_TxnCur_tab(NVL(g_applyProg_TxnCur_tab.LAST,0)+1) := l_txn_currency_code;
10152 
10153     END IF; --}
10154 
10155   EXCEPTION
10156         WHEN skip_record THEN
10157         print_msg('Planning Transaction is Skipped Either No addl were found Or WrongMassAdjust Call for this Resource');
10158         g_skip_record_tab(l_countr) := 'Y';
10159    END;
10160 
10161   END LOOP; --end loop from FOR i in l_resource_assignment_tab.first..l_resource_assignment_tab.last
10162 	l_pls_end_time := dbms_utility.get_time;
10163     print_plsql_time('End of MainLoop2:Total time :['||(l_pls_end_time-l_pls_start_time)||']');
10164 	If P_PA_DEBUG_MODE = 'Y' Then
10165     print_msg(to_char(l_stage)||'END RESOURCE_ASSIGNMENTS LOOP ');
10166 	End If;
10167     IF NVL(l_entire_return_status,'S') = 'S' Then
10168         /* Now update the spread_calc tmp table with the required flags to process in bulk */
10169 	If P_PA_DEBUG_MODE = 'Y' Then
10170         print_msg('Calling Upd_spread_calc_tmp API');
10171 	End If;
10172         Upd_spread_calc_tmp(
10173                 p_budget_version_id     => g_budget_version_id
10174                 ,p_source_context       => g_source_context
10175                 ,x_return_status        => l_return_status
10176                 );
10177 	If P_PA_DEBUG_MODE = 'Y' Then
10178         print_msg('After calling Upd_spread_calc_tmp api retSts['||l_return_status||']');
10179 	End If;
10180                 IF l_return_status <> 'S' Then
10181                         x_return_status := l_return_status;
10182                         l_entire_return_status := l_return_status;
10183                         print_msg(to_char(l_stage)||'x_msg_data => '|| x_msg_data);
10184                         GOTO END_OF_PROCESS;
10185                 End If;
10186     End If;
10187 	If P_PA_DEBUG_MODE = 'Y' Then
10188     print_msg('SpreadProcessRecs['||g_sprd_raId_tab.COUNT||']MfcCostProcessRec['||g_mfc_cost_refrsh_Raid_tab.COUNT||']');
10189     print_msg('RatesOnlyProcRec['||g_rtChanged_RaId_tab.COUNT||']ApplyProgRefreshRecs['||g_applyProg_RaId_tab.COUNT||']');
10190 	End If;
10191 
10192     /* Process spread records,Call spread package only once in bulk mode */
10193     IF g_sprd_raId_tab.COUNT > 0 THEN  --{
10194         l_stage := 543;
10195 	If P_PA_DEBUG_MODE = 'Y' Then
10196         print_msg('Populate spread records in tmp table');
10197 	End If;
10198         populate_spreadRecs
10199                 (p_budget_version_id   => g_budget_version_id
10200                 ,p_source_context      => g_source_context
10201                 ,x_return_status       => l_return_status
10202         );
10203 	If P_PA_DEBUG_MODE = 'Y' Then
10204                 print_msg(to_char(l_stage)||' Spread is required call spread_amounts');
10205 	End If;
10206 	l_pls_start_time := dbms_utility.get_time;
10207         --print_plsql_time('Start of spread amounts:['||l_pls_start_time);
10208                 PA_FP_SPREAD_AMTS_PKG.spread_amounts
10209                         (  p_budget_version_id         => g_budget_version_id
10210                           ,x_return_status             => l_return_status
10211                           ,x_msg_count                 => x_msg_count
10212                           ,x_msg_data                  => x_msg_data
10213                           );
10214 	l_pls_end_time := dbms_utility.get_time;
10215         print_plsql_time('End of spread amounts:Total time :['||(l_pls_end_time-l_pls_start_time)||']');
10216 	If P_PA_DEBUG_MODE = 'Y' Then
10217                 print_msg('After calling spread_amounts api retSts['||l_return_status||']msgdata['||x_msg_data||']');
10218 	End If;
10219                 IF l_return_status <> 'S' Then
10220                         x_return_status := l_return_status;
10221                         l_entire_return_status := l_return_status;
10222                         print_msg(to_char(l_stage)||'x_msg_data => '|| x_msg_data);
10223                         GOTO END_OF_PROCESS;
10224                 End If;
10225     END IF; --}
10226 
10227     /* Process the MFC cost type changes records */
10228     IF ( g_mfc_cost_refrsh_Raid_tab.COUNT > 0
10229         OR g_rtChanged_RaId_tab.COUNT > 0
10230         OR g_refresh_conv_rates_flag ='Y'
10231             OR g_refresh_rates_flag    in ('Y','R','C')
10232             OR g_mass_adjust_flag      = 'Y' ) THEN  --{
10233                 l_stage := 530;
10234 		If P_PA_DEBUG_MODE = 'Y' Then
10235                 print_msg(to_char(l_stage)||' Spread is not required call populate_rollup_tmp');
10236             	print_msg(to_char(l_stage)||' Populate global temporary tables :refresh_conv_rates_flag ['||g_refresh_conv_rates_flag||']');
10237             print_msg(']refresh_rates_flag['||g_refresh_rates_flag||']');
10238 		End if;
10239 	l_pls_start_time := dbms_utility.get_time;
10240         --print_plsql_time('Start of populate rollupTmp:['||l_pls_start_time);
10241                 pa_fp_calc_plan_pkg.populate_rollup_tmp
10242                         ( p_budget_version_id          => g_budget_version_id
10243                           ,x_return_status             => l_return_status
10244                           ,x_msg_count                 => x_msg_count
10245                           ,x_msg_data                  => x_msg_data
10246                           );
10247 		l_pls_end_time := dbms_utility.get_time;
10248         	print_plsql_time('End of populate rollupTmp:Total time :['||(l_pls_end_time-l_pls_start_time)||']');
10249 		If P_PA_DEBUG_MODE = 'Y' Then
10250                 print_msg('After Calling populate_rollup_tmp retSts['||l_return_status||']');
10251 		End If;
10252                 IF l_return_status <> 'S' Then
10253                         x_return_status := l_return_status;
10254                         l_entire_return_status := l_return_status;
10255                         l_stage := 535;
10256                         print_msg(to_char(l_stage)||'x_msg_data => '|| x_msg_data);
10257                         GOTO END_OF_PROCESS;
10258                 END IF;
10259 
10260                 IF g_mass_adjust_flag = 'Y' THEN
10261                         l_stage := 537;
10262 			If P_PA_DEBUG_MODE = 'Y' Then
10263                         print_msg(l_stage||'Calling pa_fp_calc_plan_pkg.mass_adjust API');
10264 			End If;
10265             /*bug fix:4657962 */
10266 			l_pls_start_time := dbms_utility.get_time;
10267             		--print_plsql_time('Start of MassAdjust:['||l_pls_start_time);
10268                         pa_fp_calc_plan_pkg.mass_adjust_new
10269                         ( p_budget_version_id         => g_budget_version_id
10270                          ,p_quantity_adj_pct          => p_quantity_adj_pct
10271                          ,p_cost_rate_adj_pct         => p_cost_rate_adj_pct
10272                          ,p_burdened_rate_adj_pct     => p_burdened_rate_adj_pct
10273                          ,p_bill_rate_adj_pct         => p_bill_rate_adj_pct
10274 			 ,p_raw_cost_adj_pct          => p_raw_cost_adj_pct
10275                       	 ,p_burden_cost_adj_pct       => p_burden_cost_adj_pct
10276                          ,p_revenue_adj_pct           => p_revenue_adj_pct
10277                          ,x_return_status             => l_return_status
10278                          ,x_msg_count                 => x_msg_count
10279                          ,x_msg_data                  => x_msg_data
10280                          );
10281 	    l_pls_end_time := dbms_utility.get_time;
10282             print_plsql_time('End of MassAdjust:Total time :['||(l_pls_end_time-l_pls_start_time)||']');
10283 			If P_PA_DEBUG_MODE = 'Y' Then
10284                         print_msg('End of pa_fp_calc_plan_pkg.mass_adjust API retSts['||l_return_status||']');
10285 			End If;
10286                         IF l_return_status <> 'S' Then
10287                                 x_return_status := l_return_status;
10288                                 l_entire_return_status := l_return_status;
10289                                 l_stage := 539;
10290                                 print_msg(to_char(l_stage)||'x_msg_data => '|| x_msg_data);
10291                                 GOTO END_OF_PROCESS;
10292                         END IF;
10293                 END IF;
10294 
10295     END IF;  --} end of refresh mfc cost
10296 
10297     	/* Bug fix:4295967 */
10298     	IF ( NVL(p_apply_progress_flag,'N') = 'Y'
10299          AND g_applyProg_RaId_tab.COUNT > 0 ) Then
10300 		If P_PA_DEBUG_MODE = 'Y' Then
10301         	print_msg('Calling populate rollup tmp in apply progress mode to rederive the etc costs');
10302 		End If;
10303 		l_pls_start_time := dbms_utility.get_time;
10304     		--print_plsql_time('Start of populaterollupTmp inApplyProgMode:['||l_pls_start_time);
10305         	pa_fp_calc_plan_pkg.populate_rollup_tmp
10306                         ( p_budget_version_id          => g_budget_version_id
10307                           ,x_return_status             => l_return_status
10308                           ,x_msg_count                 => x_msg_count
10309                           ,x_msg_data                  => x_msg_data
10310                           );
10311 		l_pls_end_time := dbms_utility.get_time;
10312         	print_plsql_time('End of populaterollupTmp inApplyProgMode:time :['||(l_pls_end_time-l_pls_start_time)||']');
10313 		If P_PA_DEBUG_MODE = 'Y' Then
10314                 print_msg('After Calling populate_rollup_tmp retSts['||l_return_status||']');
10315 		End If;
10316                 IF l_return_status <> 'S' Then
10317                         x_return_status := l_return_status;
10318                         l_entire_return_status := l_return_status;
10319                         l_stage := 535;
10320                         print_msg(to_char(l_stage)||'x_msg_data => '|| x_msg_data);
10321                         GOTO END_OF_PROCESS;
10322                 END IF;
10323     	END IF;
10324 
10325 	/* IPM Changes */
10326 	/*****
10327 	IF l_entire_return_status = 'S' Then
10328 	   IF g_fp_budget_version_type = 'ALL' and g_process_skip_CstRevrec_tab.COUNT > 0 Then
10329 		If P_PA_DEBUG_MODE = 'Y' Then
10330 		print_msg('Calling Process_skipped_records');
10331 		End if;
10332                 Process_skipped_records(p_budget_version_id  => g_budget_version_id
10333 			  ,p_calling_mode		=> 'PROCESS_CST_REV_MIX'
10334 			  ,p_source_context		=> g_source_context
10335                           ,x_return_status              => l_return_status
10336                            ,x_msg_count                 => x_msg_count
10337                            ,x_msg_data                  => l_msg_data
10338                            );
10339                 --print_msg('After Process_skipped_records l_return_status = ' || l_return_status);
10340 
10341                 IF l_return_status  <> 'S' THEN
10342                         l_entire_return_status := l_return_status;
10343                         x_msg_data := l_msg_data;
10344                 END IF;
10345 	   End If;
10346 	End If;
10347 	***/
10348 
10349         /* Bug fix:4900436 */
10350         IF NVL(g_refresh_rates_flag,'N') = 'Y' Then
10351             delete_raTxn_Tmp;
10352             populate_raTxn_Recs (
10353                         p_budget_version_id     => g_budget_version_id
10354                         ,p_source_context       => g_source_context
10355                         ,p_calling_mode         => g_calling_module
10356                         ,p_refresh_rate_flag    => g_refresh_rates_flag
10357                         ,p_delete_flag          => 'N'
10358                         ,p_delete_raTxn_flag    => 'Y'
10359                         ,p_rollup_flag          => 'Y'
10360                         ,p_call_raTxn_rollup_flag => p_raTxn_rollup_api_call_flag -- Changed from 'Y'
10361                         ,x_return_status        => l_return_status
10362                         ,x_msg_count            => x_msg_count
10363                         ,x_msg_data             => x_msg_data
10364                         );
10365         END IF;
10366 
10367         /*
10368          *  Call RATE API  only if refresh_rates_flag in ('Y','R','C')  or spread_required_flag = 'Y'
10369         */
10370         IF NVL(l_entire_return_status,'S') = 'S'
10371         AND (g_refresh_rates_flag in ('Y','R','C')
10372             OR   g_refresh_conv_rates_flag ='Y'
10373             OR   g_mass_adjust_flag = 'Y'
10374         OR   g_mfc_cost_refrsh_Raid_tab.COUNT > 0
10375         OR   g_sprd_raId_tab.COUNT > 0
10376         OR   g_applyProg_RaId_tab.COUNT > 0
10377         OR   g_rtChanged_RaId_tab.COUNT > 0
10378 	OR   g_process_skip_CstRevrec_tab.COUNT > 0 ) THEN --{
10379 
10380                 /* Bug fix:3968748 For Non-rated resource revenue only version, during budget generation revenue should be
10381                  * calculated based on markup percent on top of raw or burden cost */
10382              l_generation_context := 'SPREAD';
10383                  IF (p_calling_module IN ('BUDGET_GENERATION','FORECAST_GENERATION')
10384                      and g_revenue_generation_method = 'T') THEN
10385                      If g_fp_budget_version_type = 'REVENUE' Then
10386                           --print_msg(3968748||'Calling Update_rollupTmp_OvrRates API for REVENUE MARKUP');
10387                   l_generation_context := 'REVENUE_MARKUP';
10388              End If;
10389              End If;
10390 
10391         /*IB6 enhancements for forecast generation : retain the override rates derived in the forecasting module */
10392                 IF (l_calling_module in ('FORECAST_GENERATION')
10393           OR ( p_calling_module = 'BUDGET_GENERATION'
10394             AND g_fp_budget_version_type = 'REVENUE'
10395                 AND g_revenue_generation_method = 'T' )
10396  	                 /* bug fix:5726773 : added this to read rate overrides from tmp table for non-time phase revenue only
10397  	                  * records in cost and revenue together version */
10398  	                 OR ( p_calling_module in ('FORECAST_GENERATION','BUDGET_GENERATION')
10399  	                         AND g_time_phased_code = 'N'
10400  	                         AND g_fp_budget_version_type = 'ALL')
10401  	                 ) Then
10402 
10403                         l_stage := 543;
10404 		 If P_PA_DEBUG_MODE = 'Y' Then
10405                         print_msg(l_stage||'Calling Update_rollupTmp_OvrRates API with genrationContext['||l_generation_context||']');
10406 		End if;
10407 	    l_pls_start_time := dbms_utility.get_time;
10408             --print_plsql_time('Start of Update_rollupTmp_OvrRates:['||l_pls_start_time);
10409                         Update_rollupTmp_OvrRates
10410                           ( p_budget_version_id        => g_budget_version_id
10411                           ,p_calling_module            => l_calling_module
10412                           ,p_generation_context        => l_generation_context
10413                           ,x_return_status             => l_return_status
10414                           ,x_msg_count                 => x_msg_count
10415                           ,x_msg_data                  => x_msg_data
10416                           );
10417 	    l_pls_end_time := dbms_utility.get_time;
10418             print_plsql_time('End of Update_rollupTmp_OvrRates:Total time :['||(l_pls_end_time-l_pls_start_time)||']');
10419 		If P_PA_DEBUG_MODE = 'Y' Then
10420                         print_msg('After calling Update_rollupTmp_OvrRates api retSts['||l_return_status||']msgdata['||x_msg_data||']');
10421 		End If;
10422                         IF l_return_status <> 'S' Then
10423                            x_return_status := l_return_status;
10424                            l_entire_return_status := l_return_status;
10425                            print_msg(to_char(l_stage)||'x_msg_data => '|| x_msg_data);
10426                            GOTO END_OF_PROCESS;
10427                         End If;
10428                 End If;
10429 
10430            IF (l_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION')
10431             AND CheckCacheRecExists(p_budget_version_id => g_budget_version_id) = 'Y') Then
10432 		If P_PA_DEBUG_MODE = 'Y' Then
10433             print_msg('Calling PA_FP_CALC_UTILS.copy_BlAttributes api');
10434 		End if;
10435 	l_pls_start_time := dbms_utility.get_time;
10436         --print_plsql_time('Start of CopyBlAttributes:['||l_pls_start_time);
10437             PA_FP_CALC_UTILS.copy_BlAttributes(
10438                         p_budget_verson_id               => g_budget_version_id
10439                         ,p_source_context                => g_source_context
10440                         ,p_calling_module                => l_calling_module
10441                         ,p_apply_progress_flag           => p_apply_progress_flag
10442                         ,x_return_status                 =>l_return_status
10443                         ,x_msg_data                      => x_msg_data
10444                         );
10445 	l_pls_end_time := dbms_utility.get_time;
10446         print_plsql_time('End of CopyBlAttributes:Total time :['||(l_pls_end_time-l_pls_start_time)||']');
10447 		If P_PA_DEBUG_MODE = 'Y' Then
10448             print_msg('returnSts of PA_FP_CALC_UTILS.copy_BlAttributes['||l_return_status||']');
10449 		End If;
10450             IF l_return_status <> 'S' Then
10451                            x_return_status := l_return_status;
10452                            l_entire_return_status := l_return_status;
10453                            print_msg(to_char(l_stage)||'x_msg_data => '|| x_msg_data);
10454                            GOTO END_OF_PROCESS;
10455                         End If;
10456            END IF;
10457 
10458        /* bug fix:4900436 */
10459        IF NVL(l_entire_return_status,'S') = 'S' Then --{
10460         If NVL(g_refresh_rates_flag,'N') = 'N' and g_source_context = 'RESOURCE_ASSIGNMENT' Then
10461            /* Bug fix:4900436 */
10462             delete_raTxn_Tmp;
10463 	    If p_pa_debug_mode = 'Y' Then
10464             	print_msg('Calling populate_raTxn_Recs API');
10465 	    End If;
10466                         populate_raTxn_Recs (
10467                         p_budget_version_id     => g_budget_version_id
10468                         ,p_source_context       => g_source_context
10469                         ,p_calling_mode         => g_calling_module
10470                         ,p_delete_flag          => 'N'
10471                         ,p_delete_raTxn_flag    => 'N'
10472                         ,p_rollup_flag          => 'N'
10473                         ,p_call_raTxn_rollup_flag => p_raTxn_rollup_api_call_flag --'Y'
10474                         ,x_return_status        => l_return_status
10475                         ,x_msg_count            => x_msg_count
10476                         ,x_msg_data             => x_msg_data
10477                         );
10478 	    If p_pa_debug_mode = 'Y' Then
10479             	print_msg('retSts of populate_raTxn_Recs ['||l_return_status||']');
10480 	    End If;
10481             IF l_return_status <> 'S' Then
10482                            x_return_status := l_return_status;
10483                            l_entire_return_status := l_return_status;
10484                            GOTO END_OF_PROCESS;
10485                         End If;
10486         End If;
10487         IF NVL(l_return_status,'S') = 'S' AND NVL(g_refresh_rates_flag,'N') = 'N' Then
10488 	    If P_PA_DEBUG_MODE = 'Y' Then
10489             print_msg('Calling Retain_RaTxn_OverrideRates');
10490 	    End if;
10491             RETAIN_RA_TXN_OVR_RATES
10492             (p_budget_version_id    => g_budget_version_id
10493             ,x_return_status    => l_return_status
10494             );
10495 	    If P_PA_DEBUG_MODE = 'Y' Then
10496             print_msg('returnSts of RETAIN_RA_TXN_OVR_RATES api['||l_return_status||']');
10497 	    End if;
10498                     IF l_return_status <> 'S' Then
10499                            x_return_status := l_return_status;
10500                            l_entire_return_status := l_return_status;
10501                            GOTO END_OF_PROCESS;
10502                     End If;
10503         End If;
10504        End If; --}
10505 
10506 	   If P_PA_DEBUG_MODE = 'Y' Then
10507                print_msg('Calling Rate API');
10508 	   End if;
10509 		l_pls_start_time := dbms_utility.get_time;
10510         	--print_plsql_time('Start of Get_Res_RATEs:['||l_pls_start_time);
10511                 Get_Res_RATEs
10512                 (p_calling_module          => l_calling_module
10513                 ,p_activity_code           => l_activity_code
10514                 ,p_budget_version_id       => g_budget_version_id
10515                 ,p_mass_adjust_flag        => g_mass_adjust_flag
10516                 ,p_apply_progress_flag     => p_apply_progress_flag
10517                 ,p_precedence_progress_flag => l_apply_progress_flag
10518                 ,x_return_status           => l_return_status
10519                 ,x_msg_data                => x_msg_data
10520                 ,x_msg_count               => x_msg_count
10521                 ) ;
10522 		l_pls_end_time := dbms_utility.get_time;
10523         	print_plsql_time('End of Get_Res_RATEs:Total time :['||(l_pls_end_time-l_pls_start_time)||']');
10524 	    If P_PA_DEBUG_MODE = 'Y' Then
10525                 print_msg('After Calling Rate API retSTS['||l_return_status||']');
10526 	    End if;
10527                 /* bug fix: 4078623 Whenever there is a unexpected error from RATE api just abort the process for the first line itself */
10528                 IF l_return_status = 'U' Then
10529                         x_return_status := l_return_status;
10530                         l_entire_return_status := l_return_status;
10531                         print_msg(to_char(l_stage)||'x_msg_data => '|| x_msg_data);
10532                         GOTO END_OF_PROCESS;
10533                 END IF;
10534 
10535         END IF; --}
10536 
10537 
10538       /*Bug 4224464. This API would be called to insert into pa_fp_rollup_tmp all those budget lines which are not already present in
10539           pa_fp_rollup_tmp. These lines would be the ones with no changes to qty/amnt and rate columns. The lines with changes to
10540           qty/amnt and rate columns would not be processed by this API as earlier call to copy_blattributes would have handled these
10541           lines  Also using the same signature for this API as used for copy_blattributes above.*/
10542       /* This call to update_dffcols is required for non AMG flows too but currently doing for AMG flow only
10543        *.as the fix is done for AMG rollup. Will ask Ranga to evaluate this for non-AMG flows and remove the if condition.
10544        *.This can then be put in FP M rollup with extensive QE testing */
10545         IF ( p_calling_module = 'AMG_API' )
10546         THEN
10547 	l_pls_start_time := dbms_utility.get_time;
10548         --print_plsql_time('Start of update_diffcols: time :'||l_pls_start_time);
10549                 PA_FP_CALC_UTILS.update_dffcols(
10550                          p_budget_verson_id               => g_budget_version_id
10551                         ,p_source_context                 => g_source_context
10552                         ,p_calling_module                 => l_calling_module
10553                         ,p_apply_progress_flag            => p_apply_progress_flag
10554                         ,x_return_status                  => l_return_status
10555                         ,x_msg_count                      => x_msg_count
10556                         ,x_msg_data                       => x_msg_data
10557                         );
10558 	    l_pls_end_time := dbms_utility.get_time;
10559             print_plsql_time('End of update_diffcols:Total time :['||(l_pls_end_time-l_pls_start_time)||']');
10560 		If P_PA_DEBUG_MODE = 'Y' Then
10561                         print_msg('returnSts of PA_FP_CALC_UTILS.update_dff['||l_return_status||']');
10562 		End if;
10563                 IF l_return_status <> 'S' Then
10564                         x_return_status := l_return_status;
10565                         l_entire_return_status := l_return_status;
10566                         print_msg(to_char(l_stage)||'x_msg_data => '|| x_msg_data);
10567                         GOTO END_OF_PROCESS;
10568                 End If;
10569         END IF;
10570 
10571     l_stage := 850;
10572     print_msg(l_stage||'End of Get_Res_RATEs retSts Before Calling  get_RollupTmp_Status api['||l_return_status||']l_entireSts['||l_entire_return_status||']');
10573     /* check any Trxn currency conv errors exists in the rollup tmp*/
10574     get_RollupTmp_Status(
10575                 x_return_status => l_return_status);
10576     print_msg('After Calling retSts['||l_return_status||']l_entire_return_status['||l_entire_return_status||']');
10577     IF ( nvl(l_return_status,'S') <> 'S'  OR NVL(l_entire_return_status,'S') <> 'S' ) Then
10578 	If P_PA_DEBUG_MODE = 'Y' Then
10579         print_msg('Errors found in RollupTmp Aborting the process');
10580 	End if;
10581         SELECT decode(nvl(l_return_status,'S'),'E','E'
10582                               ,'U','U'
10583                                   ,'S',decode(nvl(l_entire_return_status,'S')
10584                                 ,'E','E'
10585                                 ,'U','U'
10586                                 ,'S','S'),'E')
10587         INTO l_return_status
10588         FROM dual;
10589         x_return_status := l_return_status;
10590         l_entire_return_status := l_return_status;
10591 	If P_PA_DEBUG_MODE = 'Y' Then
10592         print_msg('Final Return Status['||x_return_status||']MsgCtinErrStack['||fnd_msg_pub.count_msg||']');
10593 	End If;
10594     End IF;
10595 
10596 	/* Added for bug 5028631 for populating  pa_roll_up_tmp table with skipped lines*/
10597 	IF nvl(p_calling_module,'BUDGET_GENERATION') = 'BUDGET_GENERATION'
10598   	AND p_source_context = 'RESOURCE_ASSIGNMENT'
10599   	AND NVL(G_clientExtn_api_call_flag,'Y') = 'Y'
10600   	AND NVL(l_entire_return_status,'S') = 'S' Then
10601 		If P_PA_DEBUG_MODE = 'Y' Then
10602    		print_msg('Calling Process_skipped_records');
10603 		End If;
10604    		Process_skipped_records(p_budget_version_id  => g_budget_version_id
10605 			  ,p_calling_mode               => 'PROCESS_SKIPP_RECS'
10606                           ,p_source_context             => g_source_context
10607                           ,x_return_status              => l_return_status
10608                            ,x_msg_count                 => x_msg_count
10609                            ,x_msg_data           	=> x_msg_data
10610                            );
10611 		If P_PA_DEBUG_MODE = 'Y' Then
10612    		print_msg('After Process_skipped_records l_return_status = ' || l_return_status);
10613 		End if;
10614    		IF l_return_status  <> 'S' THEN
10615         		l_entire_return_status := l_return_status;
10616         		x_msg_data := x_msg_data;
10617    		END IF;
10618  	END IF;
10619 	/* End for bug 5028631 */
10620 
10621         /* Bug 4224464. Call to pa_client_extn_budget  The client extensions wont be called for the AMG flow.
10622         So added this if condition for this*/
10623     IF (not (p_calling_module is not null and p_calling_module = 'AMG_API') )
10624     THEN
10625     IF NVL(G_clientExtn_api_call_flag,'Y') = 'Y' AND NVL(l_entire_return_status,'S') = 'S' Then
10626         l_stage := 900;
10627 	If P_PA_DEBUG_MODE = 'Y' Then
10628         print_msg(to_char(l_stage)||'Call to pa_client_extn_budget');
10629 	End if;
10630         l_cl_txn_plan_quantity_tab.delete;
10631             l_cl_txn_raw_cost_tab.delete;
10632             l_cl_txn_burdened_cost_tab.delete;
10633             l_cl_txn_revenue_tab.delete;
10634             l_cl_cost_rate_override_tab.delete;
10635             l_cl_burden_rate_override_tab.delete;
10636             l_cl_bill_rate_override_tab.delete;
10637             l_cl_budget_line_id_tab.delete;
10638         l_cl_raw_rejection_code_tab.delete;
10639             l_cl_burd_rejection_code_tab.delete;
10640             l_cl_rev_rejection_code_tab.delete;
10641         l_cl_cntr := 0;
10642 	l_pls_start_time := dbms_utility.get_time;
10643     --print_plsql_time('Start of ClientExtnLoop:Start time :['||l_pls_end_time||']');
10644         FOR rec IN get_client_xtn_rollup_csr LOOP
10645             l_stage := 910;
10646             --print_msg(to_char(l_stage)||' INSIDE get_client_xtn_rollup_csr LOOP');
10647             l_cl_cntr := l_cl_cntr +1;
10648             l_txn_raw_cost               := rec.txn_raw_cost;
10649             l_txn_burdened_cost          := rec.txn_burdened_cost;
10650             l_txn_revenue                := rec.txn_revenue;
10651             l_txn_plan_quantity          := rec.quantity;
10652             -- Start for Bug# 6781055
10653             l_cl_init_quantity           := NVL(rec.init_quantity,0);
10654             l_cl_init_raw_cost           := NVL(rec.txn_init_raw_cost,0);
10655             l_cl_init_burd_cost          := NVL(rec.txn_init_burdened_cost,0);
10656             l_cl_init_revenue            := NVL(rec.txn_init_revenue,0);
10657             -- End for Bug# 6781055
10658             g_resource_list_member_id    := rec.resource_list_member_id;
10659             g_task_id                    := rec.task_id;
10660             g_resource_id                := rec.resource_id;
10661             l_rw_cost_rate_override      := NULL;
10662             l_burden_cost_rate_override  := NULL;
10663             l_bill_rate_override         := NULL;
10664         l_cl_raw_rejection_code  := rec.cost_rejection_code;
10665             l_cl_burd_rejection_code     := rec.burden_rejection_code;
10666             l_cl_rev_rejection_code  := rec.revenue_rejection_code;
10667             -- Added for Bug# 6781055
10668             l_rec_modified_in_cl_flag    := 'N';
10669 
10670             /*print_msg(' BEFORE client extn Values');
10671             print_msg(' g_resource_list_member_id  => '|| to_char(g_resource_list_member_id));
10672             print_msg(' l_txn_raw_cost             => ' || to_char(l_txn_raw_cost));
10673             print_msg(' l_txn_burdened_cost        => ' || to_char(l_txn_burdened_cost));
10674             print_msg(' l_txn_revenue              => ' || to_char(l_txn_revenue));
10675             */
10676             IF rec.version_type in ('ALL','COST') Then
10677                 pa_client_extn_budget.calc_raw_cost
10678                 ( x_budget_version_id       => g_budget_version_id
10679                                   ,x_project_id              => g_project_id
10680                                   ,x_task_id                 => g_task_id
10681                                   ,x_resource_list_member_id => g_resource_list_member_id
10682                                   ,x_resource_list_id        => g_bv_resource_list_id
10683                                   ,x_resource_id             => g_resource_id
10684                                   ,x_start_date              => rec.start_date
10685                                   ,x_end_date                => rec.end_date
10686                                   ,x_period_name             => rec.period_name
10687                                   ,x_quantity                => l_txn_plan_quantity
10688                                   ,x_raw_cost                => l_txn_raw_cost
10689                                   ,x_pm_product_code         => rec.pm_product_code
10690                                   ,x_txn_currency_code       => rec.txn_currency_code
10691                                   ,x_error_code              => l_return_status
10692 				  ,x_error_message           => l_msg_data --5028631
10693                                   );
10694 
10695                             IF l_return_status <> '0' THEN
10696                                   print_msg('retSts of calc_raw_cost ['||l_return_status||']l_msg_data['||l_msg_data||']'); --5028631
10697                                   x_return_status := 'E';
10698                                   x_msg_data := l_msg_data; --5028631
10699                                   l_entire_return_status := FND_API.G_RET_STS_ERROR;
10700                                   ADD_MSGTO_STACK( P_MSG_NAME    => x_msg_data); --5028631
10701                                   GOTO END_OF_PROCESS; --5028631
10702                             END IF;
10703 
10704                             /* if the Client extn amounts override the rate api derived amounts
10705                              * then re-derive the override rates
10706                              */
10707                             IF rec.version_type in ('ALL','COST') Then
10708                                 If rec.rate_based_flag = 'N' Then
10709                                         If NVL(l_txn_raw_cost,0) <> NVL(rec.txn_raw_cost,0) Then
10710                                             --Bug 6781055
10711                                             l_rec_modified_in_cl_flag:='Y';
10712 
10713                         l_txn_raw_cost := pa_currency.round_trans_currency_amt1(l_txn_raw_cost,rec.txn_currency_code);
10714                                                 l_txn_plan_quantity := l_txn_raw_cost;
10715                         l_cl_raw_rejection_code := NULL;
10716                                                 /* change in raw cost changes the burden cost rate */
10717                                                 --Bug 6781055
10718                                                 If nvl(l_txn_plan_quantity-l_cl_init_quantity,0) <> 0 Then
10719                                                    l_burden_cost_rate_override :=
10720 (l_txn_burdened_cost-l_cl_init_burd_cost)/(l_txn_plan_quantity-l_cl_init_quantity);
10721                                                 End if;
10722                         /* change in the quantity changes the bill rate */
10723                         If rec.version_type = 'ALL' Then
10724                                                 --Bug 6781055
10725                                                 If (nvl(l_txn_plan_quantity-l_cl_init_quantity,0) <> 0 AND nvl(l_txn_plan_quantity,0) <> nvl(rec.quantity,0)) Then
10726                                                         l_bill_rate_override := (l_txn_revenue-l_cl_init_revenue)/(l_txn_plan_quantity-l_cl_init_quantity);
10727                                                 End If;
10728                                             End If;
10729                                         End If;
10730                                 Else
10731                                         If NVL(l_txn_raw_cost,0) <> NVL(rec.txn_raw_cost,0) Then
10732                                             --Bug 6781055
10733                                             l_rec_modified_in_cl_flag:='Y';
10734                        			     	l_txn_raw_cost := pa_currency.round_trans_currency_amt1(l_txn_raw_cost,rec.txn_currency_code);
10735                        				l_cl_raw_rejection_code := NULL;
10736                                             --Bug 6781055
10737                                            	If nvl(l_txn_plan_quantity-l_cl_init_quantity,0) <> 0 Then
10738                                                 	l_rw_cost_rate_override := (l_txn_raw_cost-l_cl_init_raw_cost)/(l_txn_plan_quantity-l_cl_init_quantity);
10739 
10740                                            	End If;
10741                                             Else --{calculate override -- Bug 14117870
10742                                                     If ( (nvl(p_calling_module,'BUDGET_GENERATION') = 'BUDGET_GENERATION')
10743                                                             AND (nvl(l_txn_plan_quantity,0) <> 0) )Then
10744                                                               l_txn_raw_cost := pa_currency.round_trans_currency_amt1(l_txn_raw_cost,rec.txn_currency_code);
10745                                                             l_cl_raw_rejection_code := NULL;
10746                                                      -- l_rw_cost_rate_override := l_txn_raw_cost/l_txn_plan_quantity;
10747 								--l_rw_cost_rate_override := pa_currency.round_trans_currency_amt1(l_rw_cost_rate_override,rec.txn_currency_code); -- Bug 14398131
10748                                             End If; -- Bug 14117870
10749                                         End If;
10750                                 End If;
10751                             End If;
10752 
10753                 /* Calling client extn for burdened amts*/
10754                             pa_client_extn_budget.Calc_Burdened_Cost
10755                                 ( x_budget_version_id       => g_budget_version_id
10756                                   ,x_project_id              => g_project_id
10757                                   ,x_task_id                 => g_task_id
10758                                   ,x_resource_list_member_id => g_resource_list_member_id
10759                                   ,x_resource_list_id        => g_bv_resource_list_id
10760                                   ,x_resource_id             => g_resource_id
10761                                   ,x_start_date              => rec.start_date
10762                                   ,x_end_date                => rec.end_date
10763                                   ,x_period_name             => rec.period_name
10764                                   ,x_quantity                => l_txn_plan_quantity
10765                   		,x_raw_cost                => l_txn_raw_cost
10766                                   ,x_burdened_cost           => l_txn_burdened_cost
10767                                   ,x_pm_product_code         => rec.pm_product_code
10768                                   ,x_txn_currency_code       => rec.txn_currency_code
10769                                   ,x_error_code              => l_return_status
10770 				  ,x_error_message           => l_msg_data --5028631
10771                                   );
10772 
10773                            IF l_return_status <> '0' THEN
10774                                   x_return_status := 'E';
10775                   		  x_msg_data := l_msg_data; --5028631
10776                                   l_entire_return_status := FND_API.G_RET_STS_ERROR;
10777                                   ADD_MSGTO_STACK( P_MSG_NAME    => x_msg_data); --5028631
10778                                   GOTO END_OF_PROCESS; --5028631
10779                            END IF;
10780 
10781                /* re derive the burden cost rate override after calling the client extn */
10782                If NVl(l_txn_burdened_cost,0) <> NVl(rec.txn_burdened_cost,0) Then
10783                     --Bug 6781055
10784                     l_rec_modified_in_cl_flag:='Y';
10785                    l_txn_burdened_cost := pa_currency.round_trans_currency_amt1(l_txn_burdened_cost,rec.txn_currency_code);
10786                 l_cl_burd_rejection_code := NULL;
10787                                    --Bug 6781055
10788                                    If nvl(l_txn_plan_quantity-l_cl_init_quantity,0) <> 0 Then
10789                                           l_burden_cost_rate_override := (l_txn_burdened_cost-l_cl_init_burd_cost)/(l_txn_plan_quantity-l_cl_init_quantity);
10790 
10791                                    End if;
10792                 Else --{calculate override -- Bug 14117870
10793                         If ( (nvl(p_calling_module,'BUDGET_GENERATION') = 'BUDGET_GENERATION')
10794                                     AND (nvl(l_txn_plan_quantity,0) <> 0) )Then
10795                                         l_txn_burdened_cost := pa_currency.round_trans_currency_amt1(l_txn_burdened_cost,rec.txn_currency_code);
10796                                 l_cl_raw_rejection_code := NULL;
10797                                --l_burden_cost_rate_override := l_txn_burdened_cost/l_txn_plan_quantity;
10798 				    --l_burden_cost_rate_override := pa_currency.round_trans_currency_amt1(l_burden_cost_rate_override,rec.txn_currency_code); -- Bug 14398131
10799                      End If; -- Bug 14117870
10800                            End if;
10801             End If ; -- end of version type
10802 
10803             IF rec.version_type in ('ALL','REVENUE') Then
10804                /* Calling clinet extn for revenue amts */
10805                pa_client_extn_budget.calc_revenue
10806                 ( x_budget_version_id       => g_budget_version_id
10807                                   ,x_project_id              => g_project_id
10808                                   ,x_task_id                 => g_task_id
10809                                   ,x_resource_list_member_id => g_resource_list_member_id
10810                                   ,x_resource_list_id        => g_bv_resource_list_id
10811                                   ,x_resource_id             => g_resource_id
10812                                   ,x_start_date              => rec.start_date
10813                                   ,x_end_date                => rec.end_date
10814                                   ,x_period_name             => rec.period_name
10815                                   ,x_quantity                => l_txn_plan_quantity
10816                   		,x_raw_cost                => l_txn_raw_cost
10817                   		,x_burdened_cost           => l_txn_burdened_cost
10818                                   ,x_revenue                 => l_txn_revenue
10819                                   ,x_pm_product_code         => rec.pm_product_code
10820                                   ,x_txn_currency_code       => rec.txn_currency_code
10821                                   ,x_error_code              => l_return_status
10822 				  ,x_error_message           => l_msg_data  --5028631
10823                                   );
10824                            IF l_return_status <> '0' THEN
10825                                   x_return_status := 'E';
10826                                   x_msg_data := l_msg_data; --5028631
10827                                   l_entire_return_status := FND_API.G_RET_STS_ERROR;
10828                                   ADD_MSGTO_STACK( P_MSG_NAME    => x_msg_data); --5028631
10829                                   GOTO END_OF_PROCESS; --5028631
10830                            END IF;
10831 
10832                /* rederive the override rates */
10833                            If rec.version_type in ('ALL','REVENUE') Then
10834                                 If rec.rate_based_flag = 'N' Then
10835                                         If NVL(l_txn_revenue,0) <> NVL(rec.txn_revenue,0) Then
10836                                             --Bug 6781055
10837                                             l_rec_modified_in_cl_flag:='Y';
10838                        l_txn_revenue := pa_currency.round_trans_currency_amt1(l_txn_revenue,rec.txn_currency_code);
10839                 l_cl_rev_rejection_code := NULL;
10840                                            If rec.version_type = 'REVENUE' Then
10841                                                 l_txn_plan_quantity := l_txn_revenue;
10842                         l_bill_rate_override := 1;
10843                                            Else
10844                                                 --Bug 6781055
10845                                                 If nvl(l_txn_plan_quantity-l_cl_init_quantity,0) <> 0 Then
10846                                                    l_bill_rate_override := (l_txn_revenue-l_cl_init_revenue)/(l_txn_plan_quantity-l_cl_init_quantity);
10847                                                 End If;
10848                                            End If;
10849                                         End If;
10850                                 Else
10851                                         If NVL(l_txn_revenue,0) <> NVL(rec.txn_revenue,0) Then
10852                                             --Bug 6781055
10853                                             l_rec_modified_in_cl_flag:='Y';
10854                        l_txn_revenue := pa_currency.round_trans_currency_amt1(l_txn_revenue,rec.txn_currency_code);
10855                     l_cl_rev_rejection_code := NULL;
10856                                            --Bug 6781055
10857                                            If nvl(l_txn_plan_quantity-l_cl_init_quantity,0) <> 0 Then
10858                                                 l_bill_rate_override := (l_txn_revenue-l_cl_init_revenue)/(l_txn_plan_quantity-l_cl_init_quantity);
10859 
10860                                            End If;
10861                                         End If;
10862                                 End If;
10863                            End If;
10864             End If; -- end of version type
10865 
10866             /*print_msg(' AFTER client extn Values UPDATE pa_fp_rollup_tmp');
10867             print_msg(' txn_raw_cost             => ' || to_char(l_txn_raw_cost));
10868             print_msg(' txn_burdened_cost        => ' || to_char(l_txn_burdened_cost));
10869             print_msg(' txn_revenue              => ' || to_char(l_txn_revenue));
10870             */
10871             --Bug 6781055
10872             IF l_rec_modified_in_cl_flag ='Y' THEN
10873                 gl_cl_roll_up_tmp_rowid_tab(gl_cl_roll_up_tmp_rowid_tab.COUNT+1):=rec.rowid;
10874             END IF;
10875 
10876             l_cl_txn_plan_quantity_tab(l_cl_cntr) := l_txn_plan_quantity;
10877                     l_cl_txn_raw_cost_tab(l_cl_cntr) :=     l_txn_raw_cost;
10878                     l_cl_txn_burdened_cost_tab(l_cl_cntr) := l_txn_burdened_cost;
10879                     l_cl_txn_revenue_tab(l_cl_cntr) :=      l_txn_revenue;
10880                     l_cl_cost_rate_override_tab(l_cl_cntr) :=  l_rw_cost_rate_override;
10881                     l_cl_burden_rate_override_tab(l_cl_cntr) :=  l_burden_cost_rate_override;
10882                     l_cl_bill_rate_override_tab(l_cl_cntr) :=   l_bill_rate_override;
10883                     l_cl_budget_line_id_tab(l_cl_cntr) := rec.budget_line_id;
10884             l_cl_raw_rejection_code_tab(l_cl_cntr) := l_cl_raw_rejection_code;
10885                     l_cl_burd_rejection_code_tab(l_cl_cntr) := l_cl_burd_rejection_code;
10886                     l_cl_rev_rejection_code_tab(l_cl_cntr) := l_cl_rev_rejection_code;
10887 
10888         END LOOP;
10889         IF l_cl_budget_line_id_tab.COUNT > 0 then
10890             FORALL i IN l_cl_budget_line_id_tab.FIRST .. l_cl_budget_line_id_tab.LAST
10891                 UPDATE pa_fp_rollup_tmp tmp
10892                                 SET tmp.quantity       = l_cl_txn_plan_quantity_tab(i)
10893                                 ,tmp.txn_raw_cost      = l_cl_txn_raw_cost_tab(i)
10894                                 ,tmp.txn_burdened_cost = l_cl_txn_burdened_cost_tab(i)
10895                                 ,tmp.txn_revenue       = l_cl_txn_revenue_tab(i)
10896                                 ,tmp.rw_cost_rate_override = NVL(l_cl_cost_rate_override_tab(i),tmp.rw_cost_rate_override)
10897                                 ,tmp.burden_cost_rate_override = nvl(l_cl_burden_rate_override_tab(i),tmp.burden_cost_rate_override)
10898                                 ,tmp.bill_rate_override = nvl(l_cl_bill_rate_override_tab(i),tmp.bill_rate_override)
10899                 ,tmp.cost_rejection_code = l_cl_raw_rejection_code_tab(i)
10900                 ,tmp.burden_rejection_code  = l_cl_burd_rejection_code_tab(i)
10901                 ,tmp.revenue_rejection_code = l_cl_rev_rejection_code_tab(i)
10902                                 WHERE tmp.budget_line_id = l_cl_budget_line_id_tab(i);
10903                         --print_msg('Number rows updated with ClientExtnUpd['||sql%rowcount||']');
10904                 END IF;
10905         End If;
10906 	l_pls_end_time := dbms_utility.get_time;
10907         print_plsql_time('End of ClientExtnLoop:Total time :['||(l_pls_end_time-l_pls_start_time)||']');
10908     End If;  -- end of client extension calls
10909 
10910         /* Rounding Enhancements: Update the last rollup tmp line with the rounding discrepancy amounts */
10911         IF NVL(l_entire_return_status,'S') = 'S' AND NVL(g_track_wp_costs_flag,'Y') = 'Y' THEN
10912 	l_pls_start_time := dbms_utility.get_time;
10913         --print_plsql_time('Start of Update_rounding_diff:['||l_pls_start_time);
10914                Update_rounding_diff(
10915                 p_project_id                     => p_project_id
10916                 ,p_budget_version_id             => g_budget_version_id
10917                 ,p_calling_module                => l_calling_module
10918                 ,p_source_context                => g_source_context
10919                 ,p_wp_cost_enabled_flag          => g_track_wp_costs_flag
10920                 ,p_budget_version_type           => g_fp_budget_version_type
10921                 ,x_return_status                 => l_return_status
10922                 ,x_msg_count                     => x_msg_count
10923                 ,x_msg_data                      => l_msg_data --5028631
10924                 );
10925 	l_pls_end_time := dbms_utility.get_time;
10926         print_plsql_time('End of Update_rounding_diff:Total time :['||(l_pls_end_time-l_pls_start_time)||']');
10927                 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10928                         x_return_status := l_return_status;
10929 			x_msg_data := l_msg_data; --5028631
10930                         l_entire_return_status := l_return_status;
10931                 END IF;
10932 
10933 		       /*
10934  	       bug#14398131 :: added logic to make sure that the sum of all the amounts in the pa_budget_lines for
10935  	       a resource assignment will equal to that of the amounts present at the pa_resource_assignment level.
10936  	       If there is any discrepency in the total due to rounding of the amounts, then that difference amounts
10937  	       will be added to the last budget line.
10938 		Bug 14747696 :- removing updation of txn_revenue.
10939  	       */
10940  	       IF nvl(p_calling_module,'BUDGET_GENERATION') = 'BUDGET_GENERATION' THEN
10941  	                       FOR j IN l_resource_assignment_tab.first..l_resource_assignment_tab.last LOOP
10942 
10943  	                               l_txn_burdened_cost_total := l_total_burdened_cost_tab(j);
10944  	                               l_txn_raw_cost_total :=l_total_raw_cost_tab(j);
10945 
10946  	                               l_txn_raw_cost_total_bl        := 0;
10947  	                               l_txn_burdened_cost_total_bl   := 0;
10948 
10949  	                               OPEN get_total_amounts_res_asn(l_resource_assignment_tab(j));
10950  	                                       FETCH get_total_amounts_res_asn INTO l_txn_burdened_cost_total_bl, l_txn_raw_cost_total_bl;
10951  	                               CLOSE  get_total_amounts_res_asn;
10952 
10953  	                               update pa_fp_rollup_tmp
10954  	                               set txn_burdened_cost = (nvl(txn_burdened_cost,0) + nvl(l_txn_burdened_cost_total,0)-nvl(l_txn_burdened_cost_total_bl,0)),
10955  	                               txn_raw_cost = (nvl(txn_raw_cost,0) + nvl(l_txn_raw_cost_total,0)-nvl(l_txn_raw_cost_total_bl,0))
10956  	                               where budget_version_id = p_budget_version_id and resource_assignment_id = l_resource_assignment_tab(j)
10957  	                               and start_date = (select max(start_date) from pa_fp_rollup_tmp where budget_version_id = p_budget_version_id
10958  	                               and resource_assignment_id = l_resource_assignment_tab(j));
10959 
10960  	                       END LOOP;
10961  	       END IF;
10962 
10963         End If;
10964 
10965     l_stage := 1000;
10966     If P_PA_DEBUG_MODE = 'Y' Then
10967     print_msg(to_char(l_stage)||'CHK g_conv_rates_required_flag = Y');
10968     print_msg('p_conv_rates_required_flag => '||g_conv_rates_required_flag||']g_track_wp_costs_flag['||g_track_wp_costs_flag||']');
10969     End if;
10970     /* Refreshing the rates will also refresh the conversion rates */
10971     IF NVL(l_entire_return_status,'S') = 'S' AND NVL(g_track_wp_costs_flag,'Y') = 'Y' THEN
10972        IF (g_conv_rates_required_flag = 'Y' OR g_refresh_rates_flag in ('Y','R','C'))  THEN
10973         l_stage := 1010;
10974 	If P_PA_DEBUG_MODE = 'Y' Then
10975         print_msg(to_char(l_stage)||'Calling convert_txn_currency with the following parameters:');
10976 	End if;
10977 	l_pls_start_time := dbms_utility.get_time;
10978         --print_plsql_time('Start of Currency Conversion['||l_pls_start_time);
10979         pa_fp_multi_currency_pkg.convert_txn_currency
10980             ( p_budget_version_id         => g_budget_version_id
10981                         ,p_entire_version            => 'N'
10982 			,p_calling_module            => l_calling_module -- Added for Bug#5395732
10983                         ,x_return_status             => l_return_status
10984                         ,x_msg_count                 => x_msg_count
10985                         ,x_msg_data                  => l_msg_data --5028631
10986                         );
10987 	l_pls_end_time := dbms_utility.get_time;
10988     	print_plsql_time('End of Currency ConversionTotal time :['||(l_pls_end_time-l_pls_start_time)||']');
10989 	If P_PA_DEBUG_MODE = 'Y' Then
10990         print_msg('AFter calling convert_txn_currency API returnSTS['||l_return_status||']');
10991 	End if;
10992                 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10993                         x_return_status := l_return_status;
10994 			x_msg_data := l_msg_data; --5028631
10995                         l_entire_return_status := l_return_status;
10996                 END IF;
10997 
10998         /** commented out this api call as this needs completed unit and qa testing
10999         --Bug fix: 4096201 Call rounding discrepanc api to update the pc and pfc amounts in the rollup tmp
11000         --print_msg('Calling Update_PCPFC_rounding_diff API');
11001         Update_PCPFC_rounding_diff(
11002                 p_project_id                     => p_project_id
11003                 ,p_budget_version_id             => g_budget_version_id
11004                 ,p_calling_module                => l_calling_module
11005                 ,p_source_context                => g_source_context
11006                 ,p_wp_cost_enabled_flag          => g_track_wp_costs_flag
11007                 ,p_budget_version_type           => g_fp_budget_version_type
11008                 ,x_return_status                 => l_return_status
11009                 ,x_msg_count                     => x_msg_count
11010                 ,x_msg_data                      => l_msg_data --5028631
11011                 );
11012         --print_msg('AFter calling Update_PCPFC_rounding_diff retSts['||l_return_status||']');
11013                 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
11014                         x_return_status := l_return_status;
11015 			x_msg_data := l_msg_data; --5028631
11016                         l_entire_return_status := l_return_status;
11017                 END IF;
11018         **/
11019       END IF;
11020     END IF;
11021 
11022     /*
11023     *Now the global temporary table pa_fp_rollup_tmp is completely populated and the
11024     *table pa_budget_lines is ready to be updated with the values stored in pa_fp_rollup_tmp
11025     *It will update pa_budget_lines with ALL rows stored in pa_fp_rollup_tmp
11026     */
11027     l_stage := 1100;
11028         /* Bug fix: 4184159 moved to bulk update pa_fp_calc_plan_pkg.update_budget_lines */
11029 	l_pls_start_time := dbms_utility.get_time;
11030         --print_plsql_time('Start of BLK UpdateBudget Lines:['||l_pls_start_time);
11031             PA_FP_CALC_UTILS.BLK_update_budget_lines
11032                ( p_budget_version_id           => p_budget_version_id
11033 		,p_calling_module            => l_calling_module -- Added for Bug#5395732
11034                 ,x_return_status              => l_return_status
11035                 ,x_msg_count                  => x_msg_count
11036                 ,x_msg_data                      => l_msg_data --5028631
11037                 );
11038 	    l_pls_end_time := dbms_utility.get_time;
11039             print_plsql_time('End of BLK UpdateBudget Total time :['||(l_pls_end_time-l_pls_start_time)||']');
11040 	If P_PA_DEBUG_MODE = 'Y' Then
11041         print_msg('AFter calling update_budget_lines retSTst['||l_return_status||']MsgData['||l_msg_data||']');
11042 	End if;
11043                 IF l_return_status <> 'S' Then
11044                         x_return_status := l_return_status;
11045 			x_msg_data := l_msg_data; --5028631
11046                         l_entire_return_status := l_return_status;
11047                     GOTO END_OF_PROCESS;
11048                 END IF;
11049 
11050     IF NVL(p_raTxn_rollup_api_call_flag,'Y') = 'Y' AND nvl(l_entire_return_status,'S') = 'S' Then
11051 	If P_PA_DEBUG_MODE = 'Y' Then
11052         print_msg('Calling populate_raTxn_Recs API');
11053 	End if;
11054 	l_pls_start_time := dbms_utility.get_time;
11055 	    --print_plsql_time('Start of populate_raTxn_Recs :['||l_pls_start_time);
11056             delete_raTxn_Tmp;
11057             populate_raTxn_Recs (
11058                         p_budget_version_id     => g_budget_version_id
11059                         ,p_source_context       => 'BUDGET_LINE' -- to rollup the amounts
11060                         ,p_calling_mode         => g_calling_module
11061                         ,p_delete_flag          => 'N'
11062                         ,p_delete_raTxn_flag    => 'N'
11063                         ,p_refresh_rate_flag    => g_refresh_rates_flag
11064                         ,p_rollup_flag          => 'Y'
11065                         ,p_call_raTxn_rollup_flag => 'Y'
11066                         ,x_return_status        => l_return_status
11067                         ,x_msg_count            => x_msg_count
11068                         ,x_msg_data                      => l_msg_data --5028631
11069                         );
11070 	    l_pls_end_time := dbms_utility.get_time;
11071 	    print_plsql_time('End of populate_raTxn_RecsTotal time :['||(l_pls_end_time-l_pls_start_time)||']');
11072 		If P_PA_DEBUG_MODE = 'Y' Then
11073         	print_msg('AFter calling populate_raTxn_Recs retSTst['||l_return_status||']MsgData['||l_msg_data||']');
11074 		End if;
11075                 IF l_return_status <> 'S' Then
11076                         x_return_status := l_return_status;
11077                         l_entire_return_status := l_return_status;
11078 			x_msg_data := l_msg_data; --5028631
11079                         GOTO END_OF_PROCESS;
11080                 END IF;
11081     END IF;
11082 
11083     l_stage := 1110;
11084     IF (nvl(l_entire_return_status,'S') = 'S' AND g_rep_res_assignment_id_tab.COUNT > 0) THEN
11085        /* Bug fix: 3867302 : PJI reporting apis should not be called for change order/change requests */
11086        IF NVL(G_AGR_CONV_REQD_FLAG,'N') <> 'Y' AND NVL(g_rollup_required_flag,'N') = 'Y' Then
11087         --print_msg(l_stage||'Call PJI apis to update the reporting lines only once');
11088 	ResetRepPlsqlTabIdex(p_budget_version_id             => p_budget_version_id
11089 			   ,x_return_status                 => l_return_status
11090 			   ,x_msg_data                      => l_msg_data
11091 			);
11092 	IF l_return_status <> 'S' Then
11093                         x_return_status := l_return_status;
11094                         l_entire_return_status := l_return_status;
11095                         x_msg_data := l_msg_data; --5028631
11096                         GOTO END_OF_PROCESS;
11097         END IF;
11098 	If p_pa_debug_mode = 'Y' Then
11099             DbugPjiVals;
11100         End If;
11101 	l_pls_start_time := dbms_utility.get_time;
11102         --print_plsql_time('Start of PJI reporting:['||l_pls_start_time);
11103 
11104         BEGIN
11105 
11106         PA_FP_PJI_INTG_PKG.blk_update_reporting_lines
11107             (p_calling_module                => 'CALCULATE_API'
11108             ,p_activity_code                 => 'UPDATE'
11109             ,p_budget_version_id             => p_budget_version_id
11110             ,p_rep_budget_line_id_tab        => g_rep_budget_line_id_tab
11111             ,p_rep_res_assignment_id_tab     => g_rep_res_assignment_id_tab
11112             ,p_rep_start_date_tab            => g_rep_start_date_tab
11113             ,p_rep_end_date_tab              => g_rep_end_date_tab
11114             ,p_rep_period_name_tab           => g_rep_period_name_tab
11115             ,p_rep_txn_curr_code_tab         => g_rep_txn_curr_code_tab
11116             ,p_rep_quantity_tab              => g_rep_quantity_tab
11117             ,p_rep_txn_raw_cost_tab          => g_rep_txn_raw_cost_tab
11118             ,p_rep_txn_burdened_cost_tab     => g_rep_txn_burdened_cost_tab
11119             ,p_rep_txn_revenue_tab           => g_rep_txn_revenue_tab
11120             ,p_rep_project_curr_code_tab     => g_rep_project_curr_code_tab
11121             ,p_rep_project_raw_cost_tab      => g_rep_project_raw_cost_tab
11122             ,p_rep_project_burden_cost_tab   => g_rep_project_burden_cost_tab
11123             ,p_rep_project_revenue_tab       => g_rep_project_revenue_tab
11124             ,p_rep_projfunc_curr_code_tab    => g_rep_projfunc_curr_code_tab
11125             ,p_rep_projfunc_raw_cost_tab     => g_rep_projfunc_raw_cost_tab
11126             ,p_rep_projfunc_burden_cost_tab  => g_rep_projfunc_burden_cost_tab
11127             ,p_rep_projfunc_revenue_tab      => g_rep_projfunc_revenue_tab
11128 	    ,p_rep_line_mode_tab             => g_rep_line_mode_tab
11129 	    ,p_rep_rate_base_flag_tab        => g_rep_rate_base_flag_tab
11130             ,x_msg_data                      => l_msg_data --5028631
11131             ,x_msg_count                     => x_msg_count
11132             ,x_return_status                 => l_return_status
11133             );
11134 
11135         EXCEPTION
11136             WHEN OTHERS THEN
11137                 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
11138                    begin
11139                    SELECT lock_flag INTO l_locked
11140                    FROM pji_pjp_wbs_header where plan_version_id = p_budget_version_id;
11141                    EXCEPTION
11142                       WHEN NO_DATA_FOUND THEN
11143                            NULL;
11144                       WHEN OTHERS THEN
11145                            NULL;
11146                    END;
11147                    IF NVL(l_locked,'X') = 'P' THEN
11148                       FND_MSG_PUB.initialize;
11149                       l_return_status := FND_API.G_RET_STS_ERROR;
11150 
11151                       FND_MESSAGE.SET_NAME('PA', 'PA_FP_LOCKED_BY_PROCESSING');
11152                       Fnd_Msg_Pub.add_detail(p_message_type=>FND_API.G_RET_STS_ERROR);
11153                    END IF;
11154                 END IF;
11155         END;
11156 
11157 	l_pls_end_time := dbms_utility.get_time;
11158         print_plsql_time('End of PJI reporting:Total time :['||(l_pls_end_time-l_pls_start_time)||']');
11159 	If P_PA_DEBUG_MODE = 'Y' Then
11160                 print_msg('AFter calling PA_FP_PJI_INTG_PKG retSTst['||l_return_status||']MsgData['||l_msg_data||']');
11161 	End if;
11162                 IF l_return_status <> 'S' Then
11163                         x_return_status := l_return_status;
11164                         l_entire_return_status := l_return_status;
11165 			x_msg_data := l_msg_data; --5028631
11166                         GOTO END_OF_PROCESS;
11167                 END IF;
11168        End If;
11169     END If;
11170 
11171 
11172     /*
11173     --  ROLLUP PC and PFC numbers to pa_resource_assignments
11174     --  For each resource_assignment in the l_resource_assignment_tab the
11175     --  numbers must be rolled up. Therefore a loop is required.
11176     */
11177     IF NVL(l_entire_return_status,'S') = 'S' Then
11178             l_stage := 1210;
11179 	If P_PA_DEBUG_MODE = 'Y' Then
11180         print_msg('Rollup PC and PFC to RA ');
11181 	End if;
11182 	l_pls_start_time := dbms_utility.get_time;
11183 	--print_plsql_time('Start of rollup_pf_pfc_to_ra :['||l_pls_start_time);
11184             pa_fp_calc_plan_pkg.rollup_pf_pfc_to_ra
11185             ( p_budget_version_id          => g_budget_version_id
11186                          ,x_return_status              => l_return_status
11187                          ,x_msg_count                  => x_msg_count
11188                          ,x_msg_data                      => l_msg_data --5028631
11189 		);
11190 	l_pls_end_time := dbms_utility.get_time;
11191 	print_plsql_time('End of rollup_pf_pfc_to_raTotal time :['||(l_pls_end_time-l_pls_start_time)||']');
11192 	If P_PA_DEBUG_MODE = 'Y' Then
11193         print_msg('After calling pa_fp_calc_plan_pkg.rollup_pf_pfc_to_ra retSts['||l_return_status||']msgData['||l_msg_data||']');
11194 	End if;
11195                 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
11196                         x_return_status := l_return_status;
11197                         l_entire_return_status := l_return_status;
11198 			x_msg_data := l_msg_data; --5028631
11199             print_msg('Errored in pa_fp_calc_plan_pkg.rollup_pf_pfc_to_ra');
11200             GOTO END_OF_PROCESS;
11201                 END IF;
11202     END IF;
11203 
11204         /* Bug fix:4250222: when -100% adjustment of qty is made, the budget lines got deleted but
11205          * RA is not rolled up. so move Delete_BL_Where_Nulls after RA rollup */
11206         l_stage := 1310;
11207         IF NVL(x_return_status,'S') = 'S' Then
11208                 /* Delete all the budget Lines where quantity and amounts are not exists but only the rate
11209                  * retaining these budget lines will cause issues in reating the currency for workplan version
11210                  * ideally budget lines with null amounts and null quantity with rate make no sense
11211                  */
11212 		If P_PA_DEBUG_MODE = 'Y' Then
11213             	print_msg(l_stage||'Calling Delete_BL_Where_Nulls API');
11214 		End if;
11215 		l_pls_start_time := dbms_utility.get_time;
11216 		--print_plsql_time('Start of Delete_BL_Where_Nulls :['||l_pls_start_time);
11217                 Delete_BL_Where_Nulls
11218                         ( p_budget_version_id        => p_budget_version_id
11219                           ,p_resource_assignment_tab => l_resource_assignment_tab
11220                           ,x_return_status           => l_return_status
11221                           ,x_msg_data                      => l_msg_data --5028631
11222                          );
11223 		l_pls_end_time := dbms_utility.get_time;
11224 		print_plsql_time('End of Delete_BL_Where_NullsTotal time :['||(l_pls_end_time-l_pls_start_time)||']');
11225 		If P_PA_DEBUG_MODE = 'Y' Then
11226                 print_msg('AFter calling Delete_BL_Where_Nulls retSTst['||l_return_status||']MsgData['||l_msg_data||']');
11227 		End if;
11228                 IF l_return_status <> 'S' Then
11229                         x_return_status := l_return_status;
11230                         x_msg_count := 1;
11231                         l_entire_return_status := l_return_status;
11232 			x_msg_data := l_msg_data; --5028631
11233                         GOTO END_OF_PROCESS;
11234                 END IF;
11235         End IF;
11236 
11237     /*
11238     -- call  PROCEDURE maintain_all_mc_budget_line for reporting
11239     */
11240     /* dont call mrc for the workplan version enabled budgets*/
11241     /****MRC Elimination Changes: no need to call MRC as all the MRC objects are obsoleted from r12
11242     IF (NVL(l_entire_return_status,'S') = 'S' AND NVL(g_wp_version_flag,'N') = 'N'
11243         AND NVL(g_mrc_installed_flag,'N') = 'Y'
11244         AND PA_MRC_FINPLAN.G_FINPLAN_MRC_OPTION_CODE = 'A'
11245     AND NVL(g_conv_rates_required_flag,'Y') = 'Y' )  Then
11246 	l_pls_start_time := dbms_utility.get_time;
11247     --print_plsql_time('Start of MRC:['||l_pls_start_time);
11248 
11249         l_stage := 1280;
11250     IF (NVL(G_populate_mrc_tab_flag,'N') = 'Y' AND g_mrc_budget_line_id_tab.COUNT > 0 ) Then
11251 		If P_PA_DEBUG_MODE = 'Y' Then
11252             print_msg(to_char(l_stage)||' Calling  pa_mrc_finplan.maintain_all_mc_budget_lines:');
11253 		End if;
11254         Populate_rollup_WithMrcRecs
11255                 (p_budget_version_id            => g_budget_version_id
11256                	,x_msg_data                      => l_msg_data --5028631
11257                 ,x_return_status                => l_return_status
11258                 );
11259 		If P_PA_DEBUG_MODE = 'Y' Then
11260             print_msg('After calling Populate_rollup_WithMrcRecs retSts['||l_return_status||']msgData['||l_msg_data||']');
11261 		End if;
11262         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
11263                         x_return_status := l_return_status;
11264                         l_entire_return_status := l_return_status;
11265 			x_msg_data := l_msg_data; --5028631
11266                         print_msg('Failed Unexpected exception in Populate_rollup_WithMrcRecs API['||sqlcode||sqlerrm);
11267                         GOTO END_OF_PROCESS;
11268                 END IF;
11269     END If;
11270 
11271         l_stage := 1280.1;
11272 	If P_PA_DEBUG_MODE = 'Y' Then
11273         print_msg(to_char(l_stage)||' Calling  pa_mrc_finplan.maintain_all_mc_budget_lines:');
11274 	End if;
11275         pa_mrc_finplan.maintain_all_mc_budget_lines
11276                 ( p_fin_plan_version_id    => g_budget_version_id
11277                 ,p_entire_version         => 'N'
11278                 ,x_return_status          => l_return_status
11279                 ,x_msg_count              => x_msg_count
11280                 ,x_msg_data                      => l_msg_data --5028631
11281 		);
11282 	If P_PA_DEBUG_MODE = 'Y' Then
11283         print_msg('After calling pa_mrc_finplan.maintain_all_mc_budget_lines retSts['||l_return_status||']msgData['||l_msg_data||']');
11284 	end if;
11285                 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
11286                         x_return_status := l_return_status;
11287                         l_entire_return_status := l_return_status;
11288 			x_msg_data := l_msg_data; --5028631
11289                     print_msg('Failed Unexpected exception in MRC API['||sqlcode||sqlerrm);
11290                     GOTO END_OF_PROCESS;
11291                 END IF;
11292 	l_pls_end_time := dbms_utility.get_time;
11293         print_plsql_time('End of MRC:Total time :['||(l_pls_end_time-l_pls_start_time)||']');
11294     End If;
11295     **************END of MRC Elimination changes ***/
11296 
11297     /*
11298     --  ROLLUP PC and PFC numbers to pa_budget_versions
11299     */
11300     IF NVL(l_entire_return_status,'S') = 'S' Then
11301         l_stage := 1300;
11302 	If P_PA_DEBUG_MODE = 'Y' Then
11303         print_msg(to_char(l_stage)||' Calling rollup_pf_pfc_to_bv with following parameters:');
11304 	End if;
11305 	l_pls_start_time := dbms_utility.get_time;
11306 	--print_plsql_time('Start of rollup_pf_pfc_to_bv:['||l_pls_start_time);
11307         pa_fp_calc_plan_pkg.rollup_pf_pfc_to_bv
11308             ( p_budget_version_id          => g_budget_version_id
11309                          ,x_return_status              => l_return_status
11310                          ,x_msg_count                  => x_msg_count
11311                          ,x_msg_data                      => l_msg_data --5028631
11312 		);
11313 	l_pls_end_time := dbms_utility.get_time;
11314 	print_plsql_time('End of rollup_pf_pfc_to_bvTotal time :['||(l_pls_end_time-l_pls_start_time)||']');
11315 	If P_PA_DEBUG_MODE = 'Y' Then
11316         print_msg('After calling pa_fp_calc_plan_pkg.rollup_pf_pfc_to_bv retSts['||l_return_status||']msgData['||l_msg_data||']');
11317 	End if;
11318                IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
11319                         x_return_status := l_return_status;
11320                         l_entire_return_status := l_return_status;
11321 			x_msg_data := l_msg_data; --5028631
11322             GOTO END_OF_PROCESS;
11323                END IF;
11324     END IF;
11325 
11326     IF NVL(l_entire_return_status,'S') = 'S' AND g_fp_multi_curr_enabled = 'Y' THEN
11327             l_stage := 1322;
11328 	    If P_PA_DEBUG_MODE = 'Y' Then
11329             print_msg(to_char(l_stage)||'Call pa_fp_gen_amount_utils only if g_fp_multi_curr_enabled ['||g_fp_multi_curr_enabled||']');
11330 	   End if;
11331             pa_fp_gen_amount_utils.get_plan_version_dtls
11332                     (p_project_id         => g_project_id,
11333                     p_budget_version_id  => g_budget_version_id,
11334                     x_fp_cols_rec        => l_fp_cols_rec,
11335                     x_return_status      => l_return_status
11336                     ,x_msg_count          => x_msg_count
11337                    ,x_msg_data                      => l_msg_data --5028631
11338             );
11339 	 If P_PA_DEBUG_MODE = 'Y' Then
11340          print_msg('After calling pa_fp_gen_amount_utils.get_plan_version_dtls retSts['||l_return_status||']msgData['||l_msg_data||']');
11341 	 End if;
11342                IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
11343                         x_return_status := l_return_status;
11344                         l_entire_return_status := l_return_status;
11345 			x_msg_data := l_msg_data; --5028631
11346                         GOTO END_OF_PROCESS;
11347                END IF;
11348 
11349             l_stage := 1327;
11350 	    If P_PA_DEBUG_MODE = 'Y' Then
11351             print_msg(to_char(l_stage)||'  Calling insert_txn_currency api');
11352 	    End if;
11353             pa_fp_gen_budget_amt_pub.insert_txn_currency
11354                 (p_project_id          => g_project_id,
11355                     p_budget_version_id   => g_budget_version_id,
11356                     p_fp_cols_rec         => l_fp_cols_rec,
11357                     x_return_status       => l_return_status
11358                     ,x_msg_count           => x_msg_count
11359                     ,x_msg_data                      => l_msg_data --5028631
11360             );
11361 	    If P_PA_DEBUG_MODE = 'Y' Then
11362         print_msg('AFter calling pa_fp_gen_budget_amt_pub.insert_txn_currency API retSts['||l_return_status||']x_msg_date['||l_msg_data||']');
11363 	    End if;
11364                IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
11365                         x_return_status := l_return_status;
11366                         l_entire_return_status := l_return_status;
11367 			x_msg_data := l_msg_data; --5028631
11368                         GOTO END_OF_PROCESS;
11369                END IF;
11370 
11371     END IF; -- g_fp_multi_curr_enabled = Y
11372 
11373 	/* Bug fix:5203622 */
11374         IF l_entire_return_status = 'S' Then
11375 		l_pls_start_time := dbms_utility.get_time;
11376 		--print_plsql_time('Start of clear_etc_rev_other_rejectns['||l_pls_start_time);
11377                 clear_etc_rev_other_rejectns
11378                 (p_budget_version_id      => p_budget_version_id
11379                 ,p_source_context         => p_source_context
11380                 ,p_calling_module         => p_calling_module
11381                 ,p_mode                   => 'CLEAR_REJECTIONS'
11382                 ,x_return_status          => l_return_status
11383                 ,x_msg_count              => x_msg_count
11384                 ,x_msg_data               => l_msg_data
11385                 );
11386 		l_pls_end_time := dbms_utility.get_time;
11387 		print_plsql_time('end of clear_etc_rev_Total time :['||(l_pls_end_time-l_pls_start_time)||']');
11388                 If l_return_status <> 'S' Then
11389                         x_return_status := 'E';
11390                         l_entire_return_status := l_return_status;
11391 			x_msg_data := l_msg_data;
11392                         GOTO END_OF_PROCESS;
11393                 End If;
11394         END IF;
11395 
11396     <<END_OF_PROCESS>>
11397 	If P_PA_DEBUG_MODE = 'Y' Then
11398         print_msg('Set x_return_status := l_entire_return_status => '||l_entire_return_status);
11399 	End if;
11400         x_return_status := NVL(l_entire_return_status,'S');
11401         IF x_return_status = 'U' Then
11402                 x_msg_count := 1;
11403                 If x_msg_data is NULL Then
11404                         x_msg_data := sqlcode||sqlerrm;
11405                 End If;
11406         ROLLBACK TO start_of_calculate_api;
11407 
11408         ElsIf x_return_status <> 'S' Then
11409         x_msg_count := fnd_msg_pub.count_msg;
11410             IF x_msg_count = 1 THEN
11411                     pa_interface_utils_pub.get_messages
11412                     ( p_encoded       => FND_API.G_TRUE
11413                     ,p_msg_index     => 1
11414                     ,p_data          => x_msg_data
11415                     ,p_msg_index_out => l_msg_index_out
11416                     );
11417             ELSIF x_msg_count > 1 THEN
11418                 x_msg_count := x_msg_count;
11419                 x_msg_data := null;
11420             END IF;
11421         ROLLBACK TO start_of_calculate_api;
11422 	IF NVL(x_msg_count,0) = 0 Then
11423             x_msg_data := NVL(l_msg_data,x_msg_data); --5028631
11424 	    If P_PA_DEBUG_MODE = 'Y' Then
11425             print_msg('msg count is zero: x_return_status : '||x_return_status||']x_msg_count['||x_msg_count||']x_msg_data['||x_msg_data||']');
11426 	    End if;
11427         End If;
11428     End If;
11429     /* Reset the error stack */
11430     IF p_pa_debug_mode = 'Y' Then
11431             pa_debug.reset_err_stack;
11432     End If;
11433     /* Bug fix: 4225263. When CST_getItemCost raises no data found, the bill rate rate api adds this msg to stack
11434          * though the calculate api is passing return sts as sucess(S), and msgct =0 and msgdata = null, the page
11435          * is getting the count from error stack and raising the unexpected error
11436          * Just to handle this reset the msg stack
11437      */
11438     IF x_return_status = 'S' Then
11439         x_msg_data := NULL;
11440         x_msg_count := 0;
11441         FND_MSG_PUB.initialize;
11442     End If;
11443     /* Bug fix: 4343985 */
11444     IF cur_avgBlrts%ISOPEN then
11445                 CLOSE cur_avgBlrts;
11446         END If;
11447         IF get_bl_date_csr%ISOPEN THEN
11448                 CLOSE get_bl_date_csr;
11449         End If;
11450 
11451     If cur_ra_txn_rates%isopen then
11452         close cur_ra_txn_rates;
11453     end if;
11454 	l_pls_end_time := dbms_utility.get_time;
11455     /* End of bug fix:4343985 */
11456     If P_PA_DEBUG_MODE = 'Y' Then
11457         print_msg('LEAVING calculate bvid => '||g_budget_version_id||' ,pid => '||g_project_id||' ,sesstime => '||g_session_time);
11458     print_msg('x_return_status : '||x_return_status||']x_msg_count['||x_msg_count||']x_msg_data['||x_msg_data||']');
11459 	End if;
11460     print_plsql_time('End of CalculateAPI:['||l_pls_end_time||']');
11461     print_plsql_time('End of CalculateAPI:Total time :['||(l_pls_end_time-l_calc_start_time)||']');
11462 
11463  EXCEPTION
11464     WHEN OTHERS THEN
11465             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11466         IF p_pa_debug_mode = 'Y' Then
11467             pa_debug.write_file('LOG: '||pa_debug.g_err_stage);
11468                 pa_debug.reset_err_stack;
11469         End If;
11470         If x_msg_data is NULL Then
11471             x_msg_data := sqlcode||sqlerrm;
11472         End If;
11473             fnd_msg_pub.add_exc_msg
11474             ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
11475                 ,p_procedure_name => 'calculate:'||substr(l_stage,1,240) );
11476         pa_debug.write_file('LOG: '||substr(l_stage||':'||sqlcode||sqlerrm,1,240));
11477 
11478         /* Bug fix: 4343985 */
11479         IF cur_avgBlrts%ISOPEN then
11480             CLOSE cur_avgBlrts;
11481         END If;
11482         IF get_bl_date_csr%ISOPEN THEN
11483             CLOSE get_bl_date_csr;
11484         End If;
11485     If cur_ra_txn_rates%isopen then
11486         close cur_ra_txn_rates;
11487     End If;
11488         ROLLBACK TO start_of_calculate_api;
11489             print_msg(to_char(l_stage)||' substr(SQLERRM,1,240) => '|| substr(SQLERRM,1,240));
11490         RAISE;
11491  END calculate;
11492 
11493 /* This API derives the final transaction currency after calling the rate API.
11494  * This is added for rounding enhancement.  before updating the budget lines all the amounts
11495  * must be rounded as per the currency precision. There should not any currency derivation at time of
11496  * updating the budget lines
11497  * Logic: If budget version is approved revenue the Final_Txn_Currency = projfunc_currency_code
11498  *        For all change orders, set the Final_Txn_Currency = agreement currency code
11499  *        For budget version is Multi-Currency DISABLED then Final_Txn_Currency = project_currency_code
11500  *        For workplan context ,set the Final_Txn_Currency = Initial currency code of the RA
11501  *   To convert from one Txn currency to another Txn currency call Actual (GL) model currency conversion attributes
11502  */
11503 PROCEDURE Convert_Final_Txn_Cur_Amts(
11504         p_project_id        IN Number
11505             ,p_budget_version_id    IN Number
11506         ,p_budget_version_type  IN varchar2
11507         ,p_rate_base_flag       IN varchar2
11508         ,p_exp_org_id           IN Number
11509         ,p_task_id              IN Number
11510         ,p_ei_date              IN Date
11511         ,p_denom_quantity       IN Number
11512         ,p_denom_raw_cost       IN Number
11513         ,p_denom_burden_cost    IN Number
11514         ,p_denom_revenue    IN Number
11515         ,p_denom_curr_code      IN varchar2
11516         ,p_final_txn_curr_code  IN varchar2
11517         ,x_final_txn_rate_type  OUT NOCOPY varchar2
11518         ,x_final_txn_rate_date  OUT NOCOPY DATE
11519         ,x_final_txn_exch_rate  OUT NOCOPY Number
11520         ,x_final_txn_quantity   OUT NOCOPY Number
11521         ,x_final_txn_raw_cost   OUT NOCOPY Number
11522         ,x_final_txn_burden_cost OUT NOCOPY Number
11523         ,x_final_txn_revenue    OUT NOCOPY Number
11524         ,x_return_status        OUT NOCOPY varchar2
11525         ,x_msg_data             OUT NOCOPY varchar2
11526         ,x_stage                OUT NOCOPY varchar2
11527         ) IS
11528 
11529 
11530     l_return_status    Varchar2(100);
11531     l_status       Varchar2(100);
11532     x_dummy_curr_code  Varchar2(100);
11533     x_dummy_rate_date  Date;
11534     x_dummy_rate_type  Varchar2(100);
11535     x_dummy_exch_rate  Number;
11536     x_dummy_cost       Number;
11537     /* Declared for bug fix: 4275007 */
11538     l_multi_currency_billing_flag   Varchar2(10);
11539         l_baseline_funding_flag     Varchar2(10);
11540         l_revproc_currency_code     Varchar2(100);
11541         l_invproc_currency_type     Varchar2(100);
11542         l_invproc_currency_code     Varchar2(100);
11543         l_project_currency_code     Varchar2(100);
11544         l_project_bil_rate_date_code    Varchar2(100);
11545         l_project_bil_rate_type     Varchar2(100);
11546         l_project_bil_rate_date     Date;
11547         l_project_bil_exchange_rate Number;
11548         l_projfunc_currency_code    Varchar2(100);
11549         l_projfunc_bil_rate_date_code   Varchar2(100);
11550         l_projfunc_bil_rate_type    Varchar2(100);
11551         l_projfunc_bil_rate_date    Date;
11552         l_projfunc_bil_exchange_rate    Number;
11553         l_funding_rate_date_code    Varchar2(100);
11554         l_funding_rate_type     Varchar2(100);
11555         l_funding_rate_date     Date;
11556         l_funding_exchange_rate     Number;
11557         l_msg_count         Number;
11558     /* end OF BUG fix: 4275007 */
11559 
11560 BEGIN
11561         -- INitialize the err stack;
11562     IF p_pa_debug_mode = 'Y' Then
11563             PA_DEBUG.INIT_ERR_STACK('PA_FP_CALC_PLAN_PKG.Convert_Final_Txn_Cur_Amts');
11564     End If;
11565         l_return_status := 'S';
11566         x_return_status := 'S';
11567 
11568     IF p_denom_curr_code IS NOT NULL AND p_final_txn_curr_code IS NOT NULL Then
11569        IF p_denom_curr_code <> p_final_txn_curr_code THEN
11570         /* Bug fix: 4275007: For revenue only version conversion attributes of revenue type ie.proj_bill_rate_type
11571          * must be considered.
11572         */
11573         IF p_budget_version_type = 'REVENUE' Then
11574             If ( g_proj_rev_rate_type is NULL OR g_project_id <> p_project_id ) Then
11575                 --print_msg('Calling PA_MULTI_CURRENCY_BILLING.get_project_defaults API');
11576                 g_proj_rev_rate_type := NULL;
11577                 g_proj_rev_exchange_rate := NULL;
11578                 PA_MULTI_CURRENCY_BILLING.get_project_defaults (
11579                         p_project_id                  =>  p_project_id,
11580                         x_multi_currency_billing_flag =>  l_multi_currency_billing_flag,
11581                         x_baseline_funding_flag       =>  l_baseline_funding_flag,
11582                         x_revproc_currency_code       =>  l_revproc_currency_code,
11583                         x_invproc_currency_type       =>  l_invproc_currency_type,
11584                         x_invproc_currency_code       =>  l_invproc_currency_code,
11585                         x_project_currency_code       =>  l_project_currency_code,
11586                         x_project_bil_rate_date_code  =>  l_project_bil_rate_date_code,
11587                         x_project_bil_rate_type       =>  g_proj_rev_rate_type,
11588                         x_project_bil_rate_date       =>  l_project_bil_rate_date,
11589                         x_project_bil_exchange_rate   =>  g_proj_rev_exchange_rate,
11590                         x_projfunc_currency_code      =>  l_projfunc_currency_code,
11591                         x_projfunc_bil_rate_date_code =>  l_projfunc_bil_rate_date_code,
11592                         x_projfunc_bil_rate_type      =>  l_projfunc_bil_rate_type,
11593                         x_projfunc_bil_rate_date      =>  l_projfunc_bil_rate_date,
11594                         x_projfunc_bil_exchange_rate  =>  l_projfunc_bil_exchange_rate,
11595                         x_funding_rate_date_code      =>  l_funding_rate_date_code,
11596                         x_funding_rate_type           =>  l_funding_rate_type,
11597                         x_funding_rate_date           =>  l_funding_rate_date,
11598                         x_funding_exchange_rate       =>  l_funding_exchange_rate,
11599                         x_return_status               =>  l_return_status,
11600                         x_msg_count                   =>  l_msg_count,
11601                         x_msg_data                    =>  x_msg_data);
11602 
11603                 --print_msg('ReturnSts of PA_MULTI_CURRENCY_BILLING ['||nvl(l_return_status,'S')||']RevRateTyp['||g_proj_rev_rate_type||']');
11604                 If ( NVL(l_return_status,'S') <> 'S' OR g_proj_rev_rate_type is NULL ) Then
11605                     --print_msg('Error Occured from MultiCurrencyBilling API:x_msg_data['||x_msg_data||']');
11606                     x_return_status := 'E';
11607                     pa_utils.add_message
11608                                     ( p_app_short_name => 'PA'
11609                                     ,p_msg_name       => 'PA_FP_MULTI_CURR_BILL_ERROR'
11610                                     ,p_token1         => 'Error_Message'
11611                                     ,p_value1         =>  x_msg_data
11612                                     );
11613                     x_msg_data := 'PA_FP_PROJ_NO_TXNCONVRATE';
11614                     IF p_pa_debug_mode = 'Y' Then
11615                                 pa_debug.reset_err_stack;
11616                         End If;
11617                     RETURN;
11618                 End If;
11619             End If;
11620             x_final_txn_rate_type := g_proj_rev_rate_type;
11621             x_final_txn_exch_rate := g_proj_rev_exchange_rate;
11622         End If;
11623         /* End of bug fix:4275007 **/
11624 
11625         /* Call currency conversion api to convert from one txn currency to another txn currency amounts
11626          * using Actual model(GL) i.e the attributes will be used from task/project not from fp_options
11627          */
11628 	/*
11629         print_msg('Calling pa_multi_currency_txn.get_currency_amounts for conversion from['||p_denom_curr_code||']To['||p_final_txn_curr_code||']');
11630         print_msg('txnRtTyp['||x_final_txn_rate_type||']rateDate['||x_final_txn_rate_date||']Rate['||x_final_txn_exch_rate||']');
11631 	*/
11632         x_dummy_curr_code := p_denom_curr_code;
11633         pa_multi_currency_txn.get_currency_amounts (
11634                        p_project_id                  => p_project_id
11635                        ,p_exp_org_id                  => p_exp_org_id
11636                        ,p_calling_module              => 'WORKPLAN'
11637                        ,p_task_id                     => p_task_id
11638                        ,p_ei_date                     => p_ei_date
11639                        ,p_denom_raw_cost              => 1
11640                        ,p_denom_curr_code             => p_denom_curr_code
11641                        ,p_acct_curr_code              => x_dummy_curr_code
11642                        ,p_accounted_flag              => 'N'
11643                        ,p_acct_rate_date              => x_dummy_rate_date
11644                        ,p_acct_rate_type              => x_dummy_rate_type
11645                        ,p_acct_exch_rate              => x_dummy_exch_rate
11646                        ,p_acct_raw_cost               => x_dummy_cost
11647                        ,p_project_curr_code           => p_final_txn_curr_code
11648                        ,p_project_rate_type           => x_final_txn_rate_type
11649                        ,p_project_rate_date           => x_final_txn_rate_date
11650                        ,p_project_exch_rate           => x_final_txn_exch_rate
11651                        ,p_project_raw_cost            => x_final_txn_raw_cost
11652                        ,p_projfunc_curr_code          => x_dummy_curr_code
11653                        ,p_projfunc_cost_rate_type     => x_dummy_rate_type
11654                        ,p_projfunc_cost_rate_date     => x_dummy_rate_date
11655                        ,p_projfunc_cost_exch_rate     => x_dummy_exch_rate
11656                        ,p_projfunc_raw_cost           => x_dummy_cost
11657                        ,p_system_linkage              => 'NER'
11658                ,p_structure_version_id        => g_proj_structure_ver_id
11659                        ,p_status                      => l_status
11660                        ,p_stage                       => x_stage) ;
11661 
11662             --print_msg('After calling get_currency_amounts retSts['||l_status||']x_stage['||x_stage||']Rate['||x_final_txn_exch_rate||']');
11663 
11664                        IF x_final_txn_exch_rate is NULL OR l_status is NOT NULL Then
11665                 print_msg('The error from currency conv api');
11666                             x_return_status := 'E';
11667                             l_return_status := 'E';
11668                             pa_utils.add_message
11669                             ( p_app_short_name => 'PA'
11670                             ,p_msg_name       => 'PA_FP_PROJ_NO_TXNCONVRATE'
11671                             ,p_token1         => 'G_PROJECT_NAME'
11672                             ,p_value1         =>  g_project_name
11673                             ,p_token2         => 'FROMCURRENCY'
11674                             ,p_value2         => p_denom_curr_code
11675                             ,p_token3         => 'TOCURRENCY'
11676                             ,p_value3         => p_final_txn_curr_code
11677                 ,p_token4         => 'CONVERSION_TYPE'
11678                 ,p_value4         => x_final_txn_rate_type
11679                 ,p_token5         => 'CONVERSION_DATE'
11680                 ,p_value5         => x_final_txn_rate_date
11681                             );
11682                             x_msg_data := 'PA_FP_PROJ_NO_TXNCONVRATE';
11683                        END IF;
11684 
11685                IF NVL(l_return_status,'S') = 'S' Then
11686                 IF nvl(p_denom_raw_cost,0) <> 0 Then
11687                     x_final_txn_raw_cost := p_denom_raw_cost * x_final_txn_exch_rate;
11688                     x_final_txn_raw_cost := pa_currency.round_trans_currency_amt1(x_final_txn_raw_cost,p_final_txn_curr_code);
11689                 End If;
11690                 IF nvl(p_denom_burden_cost,0) <> 0 Then
11691                     x_final_txn_burden_cost := p_denom_burden_cost * x_final_txn_exch_rate;
11692                     x_final_txn_burden_cost := pa_currency.round_trans_currency_amt1(x_final_txn_burden_cost,p_final_txn_curr_code);
11693                 End If;
11694                 IF nvl(p_denom_revenue,0) <> 0 Then
11695                     x_final_txn_revenue := p_denom_revenue * x_final_txn_exch_rate;
11696                     x_final_txn_revenue := pa_currency.round_trans_currency_amt1(x_final_txn_revenue,p_final_txn_curr_code);
11697                 End If;
11698                End If;
11699        END IF;
11700     END IF;
11701 
11702     x_return_status := NVL(l_return_status,'S');
11703     IF p_pa_debug_mode = 'Y' Then
11704             pa_debug.reset_err_stack;
11705     End If;
11706         --print_msg('LEAVING Convert_Final_Txn_Cur_Amts x_return_status : '||x_return_status||']x_msg_data['||x_msg_data||']');
11707 
11708 EXCEPTION
11709 
11710         WHEN OTHERS THEN
11711                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11712                 If x_msg_data is NULL Then
11713                         x_msg_data := sqlcode||sqlerrm;
11714                 End If;
11715         IF p_pa_debug_mode = 'Y' Then
11716             pa_debug.reset_err_stack;
11717         End If;
11718                 fnd_msg_pub.add_exc_msg
11719                 ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
11720                 ,p_procedure_name => 'Convert_Final_Txn_Cur_Amts' );
11721                 print_msg('Unexpected Error from Convert_Final_Txn_Cur_Amts :'||x_msg_data);
11722                 RAISE;
11723 END Convert_Final_Txn_Cur_Amts;
11724 
11725 
11726 /* This API calls the main wrapper RATE api and converts the amounts from txn to txn currency if
11727  * cost rate and revenue rate currencies are different
11728  * Note: Before calling this API, pa_fp_rollup_tmp should be populated
11729  */
11730 PROCEDURE Get_Res_RATEs
11731     (p_calling_module          IN Varchar2
11732         ,p_activity_code           IN Varchar2
11733     ,p_budget_version_id       IN Number
11734     ,p_mass_adjust_flag        IN varchar2
11735     ,p_apply_progress_flag     IN varchar2  DEFAULT 'N'
11736         ,p_precedence_progress_flag IN varchar2  DEFAULT 'N'
11737     ,x_return_status           OUT NOCOPY varchar2
11738     ,x_msg_data                OUT NOCOPY varchar2
11739     ,x_msg_count               OUT NOCOPY Number
11740     ) IS
11741 
11742     l_task_id  Number;
11743 
11744     /* declared the following local variables as IN (p_)params to avoid massive changes */
11745     p_resource_assignment_id  Number;
11746         p_txn_currency_code      Varchar2(50);
11747     p_line_start_date         Date;
11748     p_line_end_date         Date;
11749         p_txn_currency_code_ovr  varchar2(50);
11750         p_project_id             Number;
11751         p_task_id                Number;
11752 
11753     CURSOR cur_calcTmp IS
11754     SELECT /*+ INDEX(CALTMP PA_FP_SPREAD_CALC_TMP_N1) */ caltmp.resource_assignment_id
11755         ,caltmp.txn_currency_code
11756         ,caltmp.start_date
11757         ,caltmp.end_date
11758         ,caltmp.txn_curr_code_override
11759         ,caltmp.G_WPRABL_CURRENCY_CODE
11760         ,ra.project_id
11761         ,ra.task_id
11762         ,ra.budget_version_id
11763         ,NVL(ra.rate_based_flag,'N') rate_based_flag
11764     ,caltmp.task_name
11765         ,caltmp.resource_name
11766     ,caltmp.billable_flag
11767     FROM pa_fp_spread_calc_tmp caltmp
11768         ,pa_resource_assignments ra
11769     WHERE caltmp.budget_version_id = p_budget_version_id
11770     AND   caltmp.resource_assignment_id = ra.resource_assignment_id
11771     AND   ( NVL(caltmp.skip_record_flag,'N') <> 'Y'
11772 	    OR
11773 	    ( NVL(caltmp.skip_record_flag,'N') = 'Y'
11774 		and NVL(caltmp.processed_flag,'N') = 'Y'
11775 	     )
11776 	  );
11777 
11778         CURSOR get_rollup_csr(
11779             p_resource_assignment_id Number
11780             ,p_txn_currency_code    Varchar2
11781             ,p_txn_curr_code_Ovr    Varchar2
11782             ,p_line_start_date      Date
11783             ,p_line_end_date        Date ) IS
11784         SELECT  /*+LEADING(TMP) INDEX(TMP PA_FP_ROLLUP_TMP_N1)*/ ra.resource_assignment_id -- bug 4873834
11785        ,tmp.txn_currency_code
11786            ,tmp.quantity
11787            ,tmp.start_date
11788            ,tmp.budget_line_id
11789            ,tmp.burden_cost_rate_override
11790            ,tmp.rw_cost_rate_override
11791            ,tmp.bill_rate_override
11792            ,tmp.txn_raw_cost
11793            ,tmp.txn_burdened_cost
11794            ,tmp.txn_revenue
11795        ,ra.task_id
11796            ,ra.resource_list_member_id
11797            ,ra.unit_of_measure
11798            ,ra.standard_bill_rate
11799            ,ra.wbs_element_version_id
11800            ,ra.rbs_element_id
11801            ,ra.planning_start_date
11802            ,ra.planning_end_date
11803            ,ra.spread_curve_id
11804            ,ra.etc_method_code
11805            ,ra.res_type_code
11806            ,ra.fc_res_type_code
11807            ,ra.resource_class_code
11808            ,ra.organization_id
11809            ,ra.job_id
11810            ,ra.person_id
11811            ,ra.expenditure_type
11812            ,ra.expenditure_category
11813        ,ra.revenue_category_code
11814            ,ra.event_type
11815            ,ra.supplier_id
11816            ,ra.non_labor_resource
11817            ,ra.bom_resource_id
11818            ,ra.inventory_item_id
11819            ,ra.item_category_id
11820            ,ra.billable_percent
11821            ,ra.mfc_cost_type_id
11822            ,ra.incurred_by_res_flag
11823            ,ra.rate_job_id
11824            ,ra.rate_expenditure_type
11825            ,ra.sp_fixed_date
11826            ,ra.person_type_code
11827            ,NVL(ra.rate_based_flag,'N') rate_based_flag
11828            ,ra.rate_exp_func_curr_code
11829            ,ra.rate_expenditure_org_id
11830            ,ra.incur_by_res_class_code
11831            ,ra.incur_by_role_id
11832            ,ra.project_role_id
11833        ,ra.resource_class_flag
11834            ,ra.named_role
11835        ,rl.res_format_id
11836        ,tmp.init_quantity
11837        ,tmp.txn_init_raw_cost
11838        ,tmp.txn_init_burdened_cost
11839        ,tmp.txn_init_revenue
11840        /* Bug fix:4294287 */
11841        ,tmp.bill_markup_percentage
11842     ,NVL(tmp.system_reference6,'Y') markup_calculation_flag
11843         FROM pa_resource_assignments ra
11844             ,pa_fp_rollup_tmp tmp
11845         ,pa_resource_list_members rl
11846         WHERE tmp.resource_assignment_id = p_resource_assignment_id
11847     AND ra.resource_assignment_id = tmp.resource_assignment_id
11848     AND rl.resource_list_member_id = ra.resource_list_member_id
11849         AND tmp.txn_currency_code = decode(p_txn_curr_code_Ovr,NULL,p_txn_currency_code
11850                     ,decode(p_txn_curr_code_Ovr,tmp.txn_currency_code,p_txn_curr_code_Ovr,p_txn_currency_code))
11851                 /* the decode is added to take care of when override currency changes along with qty the spread api is called
11852                  * this will create rollup lines with override curr. when rates changes along with ovrride currency change then
11853                  * refresh rates action performed and rollup lines will be created with original txn curr */
11854         AND ((g_source_context <> 'BUDGET_LINE' )
11855        OR
11856         (g_source_context = 'BUDGET_LINE'
11857          and p_line_start_date is NOT NULL and p_line_end_date is NOT NULL
11858          and tmp.start_date BETWEEN p_line_start_date and p_line_end_date)
11859        )
11860     /* added this to avoid processing the same record twice. This may happend due to deriving the final
11861      * currency is moved from update_budget_lines to Rate API.*/
11862     -- commenting out as rate api is called only once AND NVL(tmp.system_reference5,'N') = 'N'
11863         ORDER BY ra.resource_assignment_id,tmp.start_date,tmp.txn_currency_code ;
11864 
11865 
11866         CURSOR get_rate_api_params_cur IS
11867         SELECT decode(nvl(pfo.use_planning_rates_flag,'N'),'N',pfo.res_class_bill_rate_sch_id,
11868                           decode(bv.version_type,'REVENUE',pfo.rev_res_class_rate_sch_id,
11869                                                  'ALL'    ,pfo.rev_res_class_rate_sch_id,
11870                                                            NULL)) res_class_bill_rate_sch_id
11871           ,decode(nvl(pfo.use_planning_rates_flag,'N'),'N',pfo.res_class_raw_cost_sch_id,
11872                           decode(bv.version_type,'COST',pfo.cost_res_class_rate_sch_id,
11873                                                  'ALL' ,pfo.cost_res_class_rate_sch_id,
11874                                                            NULL)) res_class_raw_cost_sch_id
11875           ,nvl(pfo.use_planning_rates_flag,'N') use_planning_rates_flag
11876           ,decode(nvl(pfo.use_planning_rates_flag,'N'),'N',null,
11877                           decode(bv.version_type,'REVENUE',pfo.rev_job_rate_sch_id,
11878                                                  'ALL'    ,pfo.rev_job_rate_sch_id,
11879                                                  NULL))    rev_job_rate_sch_id
11880           ,decode(nvl(pfo.use_planning_rates_flag,'N'),'N',null,
11881                           decode(bv.version_type,'COST'   ,pfo.cost_job_rate_sch_id,
11882                                                  'ALL'    ,pfo.cost_job_rate_sch_id,
11883                                                  NULL))     cost_job_rate_sch_id
11884           ,decode(nvl(pfo.use_planning_rates_flag,'N'),'N',null,
11885                           decode(bv.version_type,'REVENUE',pfo.rev_emp_rate_sch_id,
11886                                                  'ALL'    ,pfo.rev_emp_rate_sch_id,
11887                                                  NULL))    rev_emp_rate_sch_id
11888           ,decode(nvl(pfo.use_planning_rates_flag,'N'),'N',null,
11889                           decode(bv.version_type,'COST'   ,pfo.cost_emp_rate_sch_id,
11890                                                  'ALL'    ,pfo.cost_emp_rate_sch_id,
11891                                                  NULL))     cost_emp_rate_sch_id
11892           ,decode(nvl(pfo.use_planning_rates_flag,'N'),'N',null,
11893                           decode(bv.version_type,'REVENUE',pfo.rev_non_labor_res_rate_sch_id,
11894                                                  'ALL'    ,pfo.rev_non_labor_res_rate_sch_id,
11895                                                  NULL))     rev_non_labor_res_rate_sch_id
11896           ,decode(nvl(pfo.use_planning_rates_flag,'N'),'N',null,
11897                           decode(bv.version_type,'COST'   ,pfo.cost_non_labor_res_rate_sch_id,
11898                                                  'ALL'    ,pfo.cost_non_labor_res_rate_sch_id,
11899                                                  NULL))     cost_non_labor_res_rate_sch_id
11900           ,decode(nvl(pfo.use_planning_rates_flag,'N'),'N',null,
11901                           decode(bv.version_type,'COST'   ,pfo.cost_burden_rate_sch_id,
11902                                                  'ALL'    ,pfo.cost_burden_rate_sch_id,
11903                                                  NULL))     cost_burden_rate_sch_id
11904           ,decode(nvl(bv.wp_version_flag,'N'),'Y',NVL(pfo.track_workplan_costs_flag,'N'),'Y') track_workplan_costs_flag
11905           ,bv.version_type fp_budget_version_type
11906           ,bv.resource_list_id
11907           ,nvl(bv.approved_rev_plan_type_flag,'N') approved_rev_plan_type_flag
11908           ,nvl(pfo.plan_in_multi_curr_flag,'N')    plan_in_multi_curr_flag
11909           ,bv.etc_start_date
11910           ,nvl(bv.wp_version_flag,'N') wp_version_flag
11911       ,pp.assign_precedes_task
11912           ,pp.bill_job_group_id
11913           ,pp.carrying_out_organization_id
11914           ,nvl(pp.multi_currency_billing_flag,'N') multi_currency_billing_flag
11915           ,pp.org_id
11916           ,pp.non_labor_bill_rate_org_id
11917           ,pp.project_currency_code
11918           ,pp.non_labor_schedule_discount
11919           ,pp.non_labor_schedule_fixed_date
11920           ,pp.non_lab_std_bill_rt_sch_id
11921           ,pp.project_type
11922           ,pp.projfunc_currency_code
11923           ,pp.emp_bill_rate_schedule_id
11924           ,pp.job_bill_rate_schedule_id
11925           ,pp.labor_bill_rate_org_id
11926           ,pp.labor_sch_type
11927           ,pp.non_labor_sch_type
11928       ,bv.project_structure_version_id
11929       ,bv.project_id
11930         FROM pa_proj_fp_options pfo
11931             ,pa_budget_versions bv
11932             ,pa_projects_all pp
11933         WHERE pfo.fin_plan_version_id = bv.budget_version_id
11934         AND bv.budget_version_id = p_budget_version_id
11935     AND pp.project_id = bv.project_id
11936     AND pfo.project_id = pp.project_id;
11937 
11938     rate_rec  get_rate_api_params_cur%ROWtype;
11939 
11940     CURSOR get_tasks_csr(p_project_id  Number
11941                 ,p_task_id     Number ) IS
11942         SELECT non_labor_bill_rate_org_id
11943            ,non_labor_schedule_discount
11944            ,non_labor_schedule_fixed_date
11945            ,non_lab_std_bill_rt_sch_id
11946            ,emp_bill_rate_schedule_id
11947            ,job_bill_rate_schedule_id
11948            ,labor_bill_rate_org_id
11949            ,labor_sch_type
11950            ,non_labor_sch_type
11951            ,top_task_id
11952         FROM pa_tasks t
11953         WHERE t.task_id = p_task_id
11954     AND  t.project_id = p_project_id;
11955 
11956         tsk_rec        get_tasks_csr%ROWTYPE;
11957 
11958 
11959     l_txn_currency_code                 Varchar2(100);
11960         l_txn_plan_quantity                 Number;
11961         l_budget_lines_start_date           Date;
11962         l_budget_line_id                    Number;
11963         l_burden_cost_rate_override         Number;
11964         l_rw_cost_rate_override             Number;
11965         l_bill_rate_override                Number;
11966         l_txn_raw_cost                      Number;
11967         l_txn_burdened_cost                 Number;
11968         l_txn_revenue               Number;
11969     x_bill_rate                         Number;
11970         x_cost_rate                         Number;
11971         x_burden_cost_rate                  Number;
11972         x_raw_cost                          Number;
11973         x_burden_cost                       Number;
11974         x_raw_revenue                       Number;
11975         x_bill_markup_percentage            Number;
11976         x_cost_txn_curr_code                Varchar2(100);
11977         x_rev_txn_curr_code                 Varchar2(100);
11978         x_raw_cost_rejection_code           Varchar2(100);
11979         x_burden_cost_rejection_code        Varchar2(100);
11980         x_revenue_rejection_code            Varchar2(100);
11981         x_cost_ind_compiled_set_id          Number;
11982     x_projfunc_currency_code            Varchar2(100) ;
11983         x_projfunc_raw_cost                 Number;
11984         x_projfunc_burdened_cost            Number;
11985         x_projfunc_revenue                  Number;
11986         x_projfunc_rejection_code           Varchar2(100);
11987         x_project_currency_code             Varchar2(100);
11988         x_project_raw_cost                  Number;
11989         x_project_burdened_cost             Number;
11990         x_project_revenue                   Number;
11991         x_project_rejection_code            Varchar2(100);
11992         x_acct_rate_date                    Date;
11993         x_acct_rate_type                    Varchar2(100);
11994         x_acct_exch_rate                    Number;
11995         x_acct_raw_cost                     Number;
11996         x_project_rate_type                 Varchar2(100);
11997         x_project_rate_date             Date;
11998         x_project_exch_rate                 Number;
11999         x_projfunc_cost_rate_type           Varchar2(100);
12000         x_projfunc_cost_rate_date           Date;
12001         x_projfunc_cost_exch_rate           Number;
12002     X_BURDEN_MULTIPLIER                 Number;
12003     l_calculate_mode                    Varchar2(100);
12004     l_return_status                     Varchar2(100);
12005     l_stage                             Number;
12006     l_txn_currency_code_override        Varchar2(100);
12007     l_cost_rate_multiplier             CONSTANT pa_labor_cost_multipliers.multiplier%TYPE := 1;
12008     l_bill_rate_multiplier             CONSTANT pa_labor_cost_multipliers.multiplier%TYPE := 1;
12009     l_cost_sch_type                    VARCHAR2(30) := 'COST';
12010     l_mfc_cost_source                  CONSTANT NUMBER := 2;
12011     x_stage                            varchar2(1000);
12012 
12013     l_labor_sch_type           pa_projects_all.labor_sch_type%TYPE;
12014         l_non_labor_sch_type           pa_projects_all.labor_sch_type%TYPE;
12015 
12016     www   get_rollup_csr%rowtype;
12017     l_rate_api_called_flag             varchar2(100);
12018     l_revenue_generation_method        Varchar2(100);
12019 
12020     /* Added these variables for bug fix: 3681314,3828998 */
12021     l_cost_override_currency           Varchar2(100) := 'N';
12022     l_burden_override_currency     Varchar2(100) := 'N';
12023     l_revenue_override_currency        Varchar2(100) := 'N';
12024     l_override_organization_id         Number;
12025         l_convert_rawcost_only_flag        Varchar2(100) := 'N';
12026         l_convert_revenue_only_flag        Varchar2(100) := 'N';
12027         l_ra_txn_currency_api_call         Varchar2(100) := 'N';
12028 
12029     l_Final_Txn_Currency_Code          Varchar2(100);
12030     l_Final_Txn_raw_cost               Number;
12031     l_Final_Txn_burden_cost            Number;
12032     l_Final_Txn_revenue                Number;
12033     l_Final_Txn_quantity               Number;
12034     l_Final_txn_exch_rate              Number;
12035     l_final_txn_rate_type              Varchar2(100);
12036     l_final_txn_rate_date              Date;
12037     l_error_code                       Varchar2(1000);
12038     l_rev_to_cost_conv_cur             Varchar2(100);
12039 
12040         /* declared for bulk processing of rollup tmp update */
12041         l_rl_cntr           NUMBER := 0;
12042         l_rlt_budget_line_id_tab        pa_plsql_datatypes.IdTabTyp;
12043         l_rlt_quantity_tab              pa_plsql_datatypes.NumTabTyp;
12044         l_rlt_bill_rate_tab             pa_plsql_datatypes.NumTabTyp;
12045         l_rlt_bill_rate_ovr_tab         pa_plsql_datatypes.NumTabTyp;
12046         l_rlt_cost_rate_tab             pa_plsql_datatypes.NumTabTyp;
12047         l_rlt_rw_cost_rate_ovr_tab      pa_plsql_datatypes.NumTabTyp;
12048         l_rlt_burden_cost_rate_tab      pa_plsql_datatypes.NumTabTyp;
12049         l_rlt_burden_cost_rate_ovr_tab  pa_plsql_datatypes.NumTabTyp;
12050         l_rlt_raw_cost_tab              pa_plsql_datatypes.NumTabTyp;
12051         l_rlt_burden_cost_tab           pa_plsql_datatypes.NumTabTyp;
12052         l_rlt_raw_revenue_tab           pa_plsql_datatypes.NumTabTyp;
12053         l_rlt_bill_markup_percent_tab   pa_plsql_datatypes.NumTabTyp;
12054         l_rlt_txn_curr_code_tab         pa_plsql_datatypes.Char30TabTyp;
12055         l_rlt_raw_cost_rejection_tab    pa_plsql_datatypes.Char30TabTyp;
12056         l_rlt_burden_rejection_tab  pa_plsql_datatypes.Char30TabTyp;
12057         l_rlt_revenue_rejection_tab     pa_plsql_datatypes.Char30TabTyp;
12058         l_rlt_projfunc_rejection_tab    pa_plsql_datatypes.Char30TabTyp;
12059         l_rlt_project_rejection_tab     pa_plsql_datatypes.Char30TabTyp;
12060         l_rlt_ind_compiled_set_tab  pa_plsql_datatypes.NumTabTyp;
12061 
12062     /* Bug fix: 4294287 */
12063     l_bill_markup_percentage        Number;
12064     l_billable_flag                 Varchar2(10);
12065     l_rateApi_billable_flag         Varchar2(10);
12066 
12067     UNEXPECTED_ERRORS                  EXCEPTION;
12068     RATEAPI_UNEXPECTED_ERRORS          EXCEPTION;
12069 
12070      -- bug 4474861: for webadi context, for error reporting
12071     l_webAdi_calling_context           VARCHAR2(100) := PA_FP_WEBADI_PKG.G_FP_WA_CALC_CALLING_CONTEXT;
12072 
12073 	l_time_start number ;
12074 	l_time_end number ;
12075 BEGIN
12076 
12077     -- INitialize the err stack;
12078     IF p_pa_debug_mode = 'Y' Then
12079         PA_DEBUG.INIT_ERR_STACK('PA_FP_CALC_PLAN_PKG.Get_Res_Rates');
12080     	print_msg('Entered Get_Res_Rates API');
12081     End If;
12082     l_return_status := 'S';
12083     x_return_status := 'S';
12084     rate_rec := NULL;
12085     OPEN get_rate_api_params_cur;
12086     FETCH get_rate_api_params_cur INTO rate_rec;
12087     IF get_rate_api_params_cur%FOUND THEN
12088 	  null;
12089           --print_msg('get_rate_api_params_cur found');
12090     Else
12091 	  null;
12092           --print_msg('get_rate_api_params_curnot found');
12093     End If;
12094     CLOSE get_rate_api_params_cur;
12095     l_revenue_generation_method := g_revenue_generation_method; --Bug 5462471
12096     --l_revenue_generation_method := NVL(PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(rate_rec.project_id),'W');
12097     --print_msg('After Calling GET_REV_GEN_METHOD ['||l_revenue_generation_method||']');
12098 
12099     /* declared for bulk processing of rollup tmp update */
12100         l_rl_cntr   := 0;
12101         l_rlt_budget_line_id_tab.delete;
12102         l_rlt_quantity_tab.delete;
12103         l_rlt_bill_rate_tab.delete;
12104         l_rlt_bill_rate_ovr_tab.delete;
12105         l_rlt_cost_rate_tab.delete;
12106         l_rlt_rw_cost_rate_ovr_tab.delete;
12107         l_rlt_burden_cost_rate_tab.delete;
12108         l_rlt_burden_cost_rate_ovr_tab.delete;
12109         l_rlt_raw_cost_tab.delete;
12110         l_rlt_burden_cost_tab.delete;
12111         l_rlt_raw_revenue_tab.delete;
12112         l_rlt_bill_markup_percent_tab.delete;
12113         l_rlt_txn_curr_code_tab.delete;
12114         l_rlt_raw_cost_rejection_tab.delete;
12115         l_rlt_burden_rejection_tab.delete;
12116         l_rlt_revenue_rejection_tab.delete;
12117         l_rlt_projfunc_rejection_tab.delete;
12118         l_rlt_project_rejection_tab.delete;
12119         l_rlt_ind_compiled_set_tab.delete;
12120 
12121     -- main loooooooooop starts here
12122     FOR caltmp IN cur_calcTmp LOOP  --{{
12123     /* assign the cursor value to local variable*/
12124     p_resource_assignment_id   := caltmp.resource_assignment_id;
12125         p_txn_currency_code        := caltmp.txn_currency_code;
12126     p_line_start_date          := caltmp.start_date;
12127     p_line_end_date            := caltmp.end_date;
12128         p_txn_currency_code_ovr    := caltmp.txn_curr_code_override;
12129         p_project_id               := caltmp.project_id;
12130         p_task_id          := caltmp.task_id;
12131     g_task_name        := caltmp.task_name;
12132     g_resource_name    := caltmp.resource_name;
12133     l_billable_flag    := NVL(caltmp.billable_flag,'N');
12134     l_rateApi_billable_flag := l_billable_flag;
12135 
12136 	If P_PA_DEBUG_MODE = 'Y' Then
12137     print_msg('LOOOOOP:ResId['||p_resource_assignment_id||']TxnCur['||p_txn_currency_code||']CurOvr['||p_txn_currency_code_ovr||']');
12138     print_msg('glinesd['||g_line_start_date||']iglineEd['||g_line_end_date||']l_billable_flag['||l_billable_flag||']');
12139 	End if;
12140 
12141     l_txn_currency_code_override := p_txn_currency_code_ovr;
12142     /* for each resource assignment in calctmp open the task cursor */
12143     tsk_rec := NULL;
12144     OPEN get_tasks_csr(p_project_id,p_task_id);
12145     FETCH get_tasks_csr INTO tsk_rec;
12146     CLOSE get_tasks_csr;
12147 
12148         IF rate_rec.fp_budget_version_type = 'REVENUE' THEN
12149             l_calculate_mode  := 'REVENUE';
12150         ELSIF rate_rec.fp_budget_version_type = 'COST' THEN
12151             l_calculate_mode  := 'COST';
12152         ELSIF rate_rec.fp_budget_version_type = 'ALL' THEN
12153             l_calculate_mode  := 'COST_REVENUE';
12154         END IF;
12155 
12156     /* Bug fix:3968748 For Non-rated resource revenue only version, during budget generation revenue should be
12157      * calculated based on markup percent on top of raw or burden cost */
12158     IF (p_calling_module IN ('BUDGET_GENERATION','FORECAST_GENERATION') and l_revenue_generation_method = 'T') THEN
12159         If rate_rec.fp_budget_version_type = 'REVENUE' Then
12160             /* bug fix: 4214050 during generation process, markup should be calculated for both rate and non-rate based
12161             * planning resource. The generation process must populate cost rate and burden rate overrides in the temp table
12162             * decision taken by ramesh and pms
12163             * IF caltmp.rate_based_flag = 'N' Then */
12164             l_calculate_mode  := 'COST_REVENUE';
12165            /*End If; */
12166         End If;
12167     End If;
12168 
12169     /* Initialize the workplan currency code  for Each RA+Cur combo*/
12170     g_ra_bl_txn_currency_code := NULL;
12171     IF (( g_wp_version_flag = 'Y' OR  g_agr_conv_reqd_flag = 'Y')
12172            /* Bug fix::4396300 */
12173            OR (p_calling_module in ('BUDGET_GENERATION','FORECAST_GENERATION')
12174                AND caltmp.G_WPRABL_CURRENCY_CODE is NOT NULL ))
12175            /* Bug fix:4396300 */
12176         THEN  --{
12177                    g_ra_bl_txn_currency_code := caltmp.G_WPRABL_CURRENCY_CODE;
12178         END IF; --}
12179 
12180         FOR z IN get_rollup_csr(p_resource_assignment_id
12181                 ,p_txn_currency_code
12182                 ,p_txn_currency_code_ovr
12183                 ,p_line_start_date
12184                 ,p_line_end_date)  LOOP --{
12185         l_stage := 600;
12186 
12187         l_txn_currency_code                 := z.txn_currency_code;
12188         l_txn_plan_quantity                 := z.quantity;
12189         l_budget_lines_start_date           := z.start_date;
12190         l_budget_line_id                    := z.budget_line_id;
12191         l_burden_cost_rate_override         := z.burden_cost_rate_override;
12192         l_rw_cost_rate_override             := z.rw_cost_rate_override;
12193         l_bill_rate_override                := z.bill_rate_override;
12194         l_txn_raw_cost                      := z.txn_raw_cost;
12195         l_txn_burdened_cost                 := z.txn_burdened_cost;
12196         l_txn_revenue                       := z.txn_revenue;
12197     x_raw_cost                          := z.txn_raw_cost;
12198         x_burden_cost                       := z.txn_burdened_cost;
12199         x_raw_revenue                       := z.txn_revenue;
12200     x_raw_cost_rejection_code           := null;
12201         x_burden_cost_rejection_code        := null;
12202         x_revenue_rejection_code            := null;
12203         x_projfunc_rejection_code           := null;
12204         x_project_rejection_code            := null;
12205     l_bill_markup_percentage            := z.bill_markup_percentage;
12206     x_bill_markup_percentage            := l_bill_markup_percentage;
12207 
12208     /* initialize the ovierride flags */
12209         l_cost_override_currency     := 'N';
12210         l_burden_override_currency   := 'N';
12211         l_revenue_override_currency  := 'N';
12212 
12213     /* set the final transaction currency code */
12214     IF g_agr_conv_reqd_flag = 'Y' Then
12215         l_Final_Txn_Currency_Code := g_agr_currency_code;
12216     Elsif  g_bv_approved_rev_flag  = 'Y' Then
12217         l_Final_Txn_Currency_Code := rate_rec.projfunc_currency_code;
12218     Elsif rate_rec.plan_in_multi_curr_flag = 'N' Then
12219         l_Final_Txn_Currency_Code := rate_rec.project_currency_code;
12220     Else
12221         -- the rate api currency code
12222         l_Final_Txn_Currency_Code := NULL;
12223     End If;
12224 
12225     l_return_status := 'S';
12226     x_msg_data := NULL;
12227 
12228 	If P_PA_DEBUG_MODE = 'Y' Then
12229         print_msg(to_char(l_stage)||' Rate API req parameters from pa_fp_rollup_tmp');
12230         print_msg(' l_txn_currency_code                 := '||l_txn_currency_code);
12231         print_msg(' l_Final_txn_currency_code           := '||l_Final_txn_currency_code);
12232         print_msg(' l_txn_plan_quantity                 := '||l_txn_plan_quantity);
12233         print_msg(' l_budget_lines_start_date           := '||z.start_date);
12234         print_msg(' l_budget_line_id                    := '||z.budget_line_id);
12235         print_msg(' l_burden_cost_rate_override         := '||l_burden_cost_rate_override);
12236         print_msg(' l_rw_cost_rate_override             := '||l_rw_cost_rate_override);
12237         print_msg(' l_bill_rate_override                := '||l_bill_rate_override);
12238         print_msg(' l_txn_raw_cost                      := '||l_txn_raw_cost);
12239         print_msg(' l_txn_burdened_cost                 := '||l_txn_burdened_cost);
12240         print_msg(' l_txn_revenue                       := '||l_txn_revenue);
12241         print_msg(' l_rate_based_flag                   := '||z.rate_based_flag);
12242         print_msg(' l_fp_budget_version_type            := '||rate_rec.fp_budget_version_type);
12243         print_msg(' l_bill_markup_percentage            := '||z.bill_markup_percentage);
12244         print_msg(' l_bill_markup_percentage            := '||z.bill_markup_percentage);
12245         print_msg(' markup_calculation_flag             := '||z.markup_calculation_flag);
12246 	print_msg(' l_init_quantity                     := '||z.init_quantity);
12247 	print_msg(' l_txn_init_raw_cost                 := '||z.txn_init_raw_cost);
12248 	print_msg(' l_txn_init_burden_cost              := '||z.txn_init_burdened_cost);
12249 	print_msg(' l_txn_init_revenue                  := '||z.txn_init_revenue);
12250 	End if;
12251 
12252     /* derive the ETC values and pass it the rate api*/
12253     l_txn_plan_quantity := l_txn_plan_quantity - nvl(z.init_quantity,0);
12254     l_txn_raw_cost := l_txn_raw_cost - nvl(z.txn_init_raw_cost,0);
12255     l_txn_burdened_cost := l_txn_burdened_cost - nvl(z.txn_init_burdened_cost,0);
12256     l_txn_revenue := l_txn_revenue - nvl(z.txn_init_revenue,0);
12257 
12258     x_raw_cost    := x_raw_cost - nvl(z.txn_init_raw_cost,0);
12259     x_burden_cost := x_burden_cost - nvl(z.txn_init_burdened_cost,0);
12260     x_raw_revenue := x_raw_revenue  - nvl(z.txn_init_revenue,0);
12261 
12262         IF z.rate_based_flag = 'N' THEN  --{
12263                l_stage := 605;
12264                print_msg(to_char(l_stage)|| ' z.rate_based_flag = N');
12265        IF rate_rec.fp_budget_version_type in ('COST','ALL') THEN
12266         If nvl(l_txn_plan_quantity,0) <> 0
12267 		AND (l_rw_cost_rate_override is NOT NULL
12268 			OR l_rw_cost_rate_override = 0 ) Then
12269             l_txn_raw_cost := null;
12270         End If;
12271         /* as Rate api will be always called in this scenerio, burden cost will be calculated
12272         * based on raw cost or quantity or burden cost override */
12273         If ((nvl(l_txn_plan_quantity,0) <> 0) OR l_txn_raw_cost is NOT NULL ) Then
12274             l_txn_burdened_cost := null;
12275         End If;
12276        End If;
12277        IF rate_rec.fp_budget_version_type in ('REVENUE','ALL') Then
12278         /* bug fix: 4229575 For cost and revenue together non-rate base resource refresh must refresh the bill rate */
12279         If  rate_rec.fp_budget_version_type = 'ALL' Then
12280             If (nvl(l_txn_plan_quantity,0) <> 0) Then
12281                 l_txn_revenue := NULL;
12282             End If;
12283         Elsif rate_rec.fp_budget_version_type = 'REVENUE' Then
12284           If nvl(l_txn_plan_quantity,0) <> 0 AND l_bill_rate_override is NOT NULL  Then
12285             l_txn_revenue := NULL;
12286             /* Bug fix:3968748 During budget or Forecast generation process, For Non-Rate based resource Revenue is generated based on raw/burden cost
12287                  * the generation process copies raw / burden to the target version ResAsgnment and populates the bill rate override as 1
12288              * and calls calculate api to spread the amounts. During this process, revenue should be calculated based on the markup percent
12289              * on top of raw / burden cost. If bill rate override exists, the RATE api will not calculate the markup.
12290              * In order to fix this issue, the following logic is included.
12291              * 1. The generation process must pass either Raw cost OR Burdened cost to resource assignment tab
12292              * 2. Before calling RATE api, pass cost rate override and burden rate override as 1 so that rate api will not calculate
12293              *    the raw and burden costs
12294              * 3. pass bill rate override as NULL. so that markup is applied on top of raw / burden
12295              * 4. After rate api call, null out the raw cost, burdened cost ,cost rate override and burden rate overrides
12296              * 5. Copy the revenue to quantity and change the bill rate override to 1
12297              */
12298              IF (p_calling_module IN ('BUDGET_GENERATION','FORECAST_GENERATION')
12299                  and l_revenue_generation_method = 'T') THEN
12300                 If l_rw_cost_rate_override is NULL Then
12301                    l_rw_cost_rate_override := 1;
12302                 End If;
12303                 If l_burden_cost_rate_override is NULL Then
12304                    l_burden_cost_rate_override := 1;
12305                 End If;
12306         IF NVL(l_billable_flag,'N') = 'Y' Then  --Added for billability changes
12307           IF z.markup_calculation_flag = 'Y' Then  /* Bug fix:4568011 */
12308                      l_bill_rate_override := NULL;
12309           End If;
12310         END IF;
12311              END IF;
12312          End If;
12313            End If;
12314        End If;
12315 
12316     ELSE  -- rate_based_flag = 'Y'
12317         IF l_txn_plan_quantity is NOT NULL Then
12318             l_txn_raw_cost := NULL;
12319                     l_txn_burdened_cost := NULL;
12320                     l_txn_revenue := NULL;
12321             /* bug fix: 4214050 */
12322             IF (rate_rec.fp_budget_version_type = 'REVENUE'
12323                 and p_calling_module IN ('BUDGET_GENERATION','FORECAST_GENERATION')
12324                 and l_revenue_generation_method = 'T' ) THEN
12325                 If l_rw_cost_rate_override is NULL Then
12326                          l_rw_cost_rate_override := 1;
12327                 End If;
12328                 If l_burden_cost_rate_override is NULL Then
12329                          l_burden_cost_rate_override := 1;
12330                 End If;
12331         IF NVL(l_billable_flag,'N') = 'Y' Then  --Added for billability changes
12332             IF z.markup_calculation_flag = 'Y' Then  /* Bug fix:4568011 */
12333                          l_bill_rate_override := NULL;
12334             End If;
12335         ElsIF ( NVL(l_billable_flag,'N') = 'N'
12336             and l_bill_rate_override is NOT NULL ) Then
12337             NULL;
12338         End If;
12339             END IF;
12340         END IF;
12341         END IF; -- } IF l_rate_based_flag = 'N'
12342 
12343     IF (rate_rec.fp_budget_version_type = 'REVENUE'
12344            and p_calling_module IN ('BUDGET_GENERATION','FORECAST_GENERATION')
12345            and l_revenue_generation_method = 'T'
12346        and l_txn_plan_quantity is NOT NULL ) THEN
12347         l_txn_raw_cost := NULL;
12348                 l_txn_burdened_cost := NULL;
12349     End IF;
12350 
12351     /* setting the quantity to null to avoid call to rate api with 0 qty */
12352     IF NVL(l_txn_plan_quantity,0) = 0 Then
12353         l_txn_plan_quantity := NULL;
12354         /* Bug fix: 4254051 When quantity is nulled out or zeroed, the rate api should not be called
12355                 * so null out all the amounts and rates */
12356         /* bug fix:5726773
12357 	l_rw_cost_rate_override := NULL;
12358         l_burden_cost_rate_override := NULL;
12359         l_bill_rate_override := NULL;
12360 	x_burden_multiplier := NULL;
12361  	**/
12362         l_txn_raw_cost := NULL;
12363         l_txn_burdened_cost := NULL;
12364         l_txn_revenue := NULL;
12365 
12366         -- Bug 8314994
12367         -- Avoiding nulling of burdned cost for non rate base case where we have only burdened cost in
12368         -- system.
12369         If NOT ( p_calling_module = 'BUDGET_GENERATION' AND NVL(z.rate_based_flag,'N') = 'N'
12370                  AND (nvl(x_raw_cost,0)=0 AND nvl(x_burden_cost,0)<> 0 )  )Then
12371                         x_burden_cost := NULL;
12372         END IF;
12373 
12374         x_raw_cost    := NULL;
12375 				--x_burden_cost := NULL;   Bug 8314994
12376 				x_raw_revenue := NULL;
12377 				x_bill_rate   := NULL;
12378 				x_cost_rate   := NULL;
12379 				x_burden_cost_rate := NULL;
12380 
12381     End If;
12382 
12383 
12384         l_stage := 610;
12385     /*
12386         print_msg(to_char(l_stage)||' Rate API req parameters from pa_fp_rollup_tmp after rate_based_flag = N check');
12387         print_msg(' l_txn_currency_code                 := '||l_txn_currency_code);
12388         print_msg(' l_txn_plan_quantity                 := '||l_txn_plan_quantity);
12389         print_msg(' l_budget_lines_start_date           := '||l_budget_lines_start_date);
12390         print_msg(' l_budget_line_id                    := '||l_budget_line_id);
12391         print_msg(' l_burden_cost_rate_override         := '||l_burden_cost_rate_override);
12392         print_msg(' l_rw_cost_rate_override             := '||l_rw_cost_rate_override);
12393         print_msg(' l_bill_rate_override                := '||l_bill_rate_override);
12394         print_msg(' l_txn_raw_cost                      := '||l_txn_raw_cost);
12395         print_msg(' l_txn_burdened_cost                 := '||l_txn_burdened_cost);
12396         print_msg(' l_txn_revenue                       := '||l_txn_revenue);
12397     */
12398 
12399 /*
12400 --  Check to see if all Cost and Revenue numbers are present in transaction currency.
12401 --  If yes then RATE API need not be called for this planning transaction.
12402  */
12403         l_stage := 620;
12404         --print_msg(to_char(l_stage)||' Check to see if all l_fp_track_workplan_costs_flag = N');
12405         --print_msg(to_char(l_stage)||' Check to see if all Cost and Revenue numbers are present in transaction currency');
12406     l_rate_api_called_flag := 'N';
12407         IF rate_rec.track_workplan_costs_flag = 'N' THEN  --{
12408                l_stage := 625;
12409                --print_msg(to_char(l_stage)||' No call to Rate API - track_workplan_costs_flag = N set all cost and rates to null');
12410            --set all the override rates and costs to null
12411         x_bill_rate                 := null;
12412                 l_bill_rate_override        := null;
12413                 x_cost_rate         := null;
12414                 l_rw_cost_rate_override     := null;
12415                 x_burden_cost_rate          := null;
12416                 l_burden_cost_rate_override     := null;
12417                 x_raw_cost          := null;
12418                 x_burden_cost           := null;
12419                 x_raw_revenue           := null;
12420                 x_bill_markup_percentage    := null;
12421                 x_raw_cost_rejection_code   := null;
12422                 x_burden_cost_rejection_code    := null;
12423                 x_revenue_rejection_code    := null;
12424                 x_projfunc_rejection_code   := null;
12425                 x_project_rejection_code    := null;
12426                 x_cost_ind_compiled_set_id  := null;
12427                NULL;
12428     ELSIF (rate_rec.fp_budget_version_type in ('COST','ALL') AND
12429         l_txn_plan_quantity is NULL    AND
12430         NVL(l_txn_plan_quantity,0) = 0 AND
12431         l_txn_raw_cost IS NULL         AND
12432         NVL(l_txn_raw_cost,0) = 0 ) THEN
12433         -- calculation of burden and revenue is always based on raw cost so if both qty and raw cost is null
12434         -- then no need to call rate api. User can enter only burdened cost / revenue.
12435         --print_msg('Both qty and raw costs are null so no need to call rate api');
12436         null;
12437     ELSIF (rate_rec.fp_budget_version_type in ('REVENUE') AND
12438                 l_txn_plan_quantity is NULL    AND
12439                 NVL(l_txn_plan_quantity,0) = 0 )  THEN
12440         -- in case revenue only , revenue is derived based on cost. to calculate cost qty should be there
12441         -- so if qty is null then no need to call rate api
12442         --print_msg('Quantity is null in revenue version no need to call rate api');
12443         null;
12444         ELSIF
12445            rate_rec.fp_budget_version_type = 'COST' AND
12446              l_txn_raw_cost IS NOT NULL AND nvl(l_txn_raw_cost,0) <> 0 AND
12447              l_txn_burdened_cost IS NOT NULL AND nvl(l_txn_burdened_cost,0) <> 0 AND
12448              p_mass_adjust_flag = 'N' THEN
12449                l_stage := 630;
12450                --print_msg(to_char(l_stage)||' No call to Rate API - budget_version_type = COST - Raw and Burdened Cost are NOT NULL');
12451                NULL;
12452         ELSIF
12453            rate_rec.fp_budget_version_type = 'REVENUE' AND
12454              l_txn_revenue IS NOT NULL AND nvl(l_txn_revenue,0) <> 0 AND
12455              p_mass_adjust_flag = 'N' THEN
12456                l_stage := 640;
12457                --print_msg(to_char(l_stage)||' No call to Rate API - budget_version_type = REVENUE - Revenue is NOT NULL');
12458                NULL;
12459         ELSIF
12460            rate_rec.fp_budget_version_type = 'ALL' AND
12461              l_txn_raw_cost IS NOT NULL AND nvl(l_txn_raw_cost,0) <> 0 AND
12462              l_txn_burdened_cost IS NOT NULL AND nvl(l_txn_burdened_cost,0) <> 0 AND
12463              l_txn_revenue IS NOT NULL AND nvl(l_txn_revenue,0) <> 0 AND
12464              p_mass_adjust_flag = 'N' THEN
12465                l_stage := 650;
12466                --print_msg(to_char(l_stage)||' No call to Rate API - budget_version_type = ALL - ALL have values');
12467                NULL;
12468         ELSIF
12469            rate_rec.fp_budget_version_type = 'COST' AND
12470              (l_txn_plan_quantity IS NULL OR nvl(l_txn_plan_quantity,0) = 0) AND
12471              (l_txn_raw_cost IS NULL OR nvl(l_txn_raw_cost,0) = 0 ) AND
12472              ( (l_txn_burdened_cost IS NULL OR nvl(l_txn_burdened_cost,0) = 0) OR
12473                (l_txn_burdened_cost is NOT NULL ))  THEN
12474                l_stage := 652;
12475                --print_msg(to_char(l_stage)||' No call to Rate API - budget_version_type = COST - Quantity AND Raw and Burdened Cost are NULL');
12476                NULL;
12477         ELSIF
12478            rate_rec.fp_budget_version_type = 'REVENUE' AND
12479              ( l_txn_plan_quantity IS NULL OR nvl(l_txn_plan_quantity,0) = 0) AND
12480              (l_txn_revenue IS NULL OR nvl(l_txn_revenue,0) = 0) THEN
12481                l_stage := 654;
12482                --print_msg(to_char(l_stage)||' No call to Rate API - budget_version_type = REVENUE - Quantity AND Revenue are NULL');
12483                NULL;
12484         ELSIF
12485            rate_rec.fp_budget_version_type = 'ALL' AND
12486              (l_txn_plan_quantity IS NULL OR nvl(l_txn_plan_quantity,0) = 0) AND
12487              (l_txn_raw_cost IS NULL OR nvl(l_txn_raw_cost,0) = 0)  AND
12488              (l_txn_burdened_cost IS NULL OR nvl(l_txn_burdened_cost,0) = 0)  AND
12489              (l_txn_revenue IS NULL OR nvl(l_txn_revenue,0) = 0) THEN
12490                l_stage := 656;
12491                --print_msg(to_char(l_stage)||' No call to Rate API - budget_version_type = ALL - ALL have NULL values');
12492                NULL;
12493         ELSE /* some or all txn amounts are not present so need to call rate API */
12494                l_stage := 660;
12495                --print_msg(to_char(l_stage)||' Some or all txn amounts are not present so need to call rate API');
12496                --print_msg(to_char(l_stage)||' Calling chk_req_rate_api_inputs');
12497 
12498             pa_fp_calc_plan_pkg.chk_req_rate_api_inputs
12499         ( p_budget_version_id                    => p_budget_version_id
12500                 ,p_budget_version_type                  => rate_rec.fp_budget_version_type
12501                 ,p_person_id                            => z.person_id
12502                 ,p_job_id                               => z.job_id
12503                 ,p_resource_class                       => z.resource_class_code
12504                 ,p_rate_based_flag                      => z.rate_based_flag
12505                 ,p_uom                                  => z.unit_of_measure
12506                 ,p_item_date                            => z.start_date
12507                 ,p_non_labor_resource                   => z.non_labor_resource
12508                 ,p_expenditure_org_id                   => z.rate_expenditure_org_id
12509                 ,p_nlr_organization_id                  => z.organization_id
12510                 ,p_quantity                             => l_txn_plan_quantity
12511                 ,p_cost_override_rate                   => l_rw_cost_rate_override
12512                 ,p_revenue_override_rate                => l_bill_rate_override
12513                 ,p_raw_cost                             => l_txn_raw_cost
12514                 ,p_burden_cost                          => l_txn_burdened_cost
12515                 ,p_raw_revenue                          => l_txn_revenue
12516                 ,p_override_currency_code               => l_txn_currency_code
12517                 ,x_return_status                        => l_return_status
12518                 ,x_msg_data                             => x_msg_data
12519                 ,x_msg_count                            => x_msg_count
12520                 );
12521 
12522                IF l_return_status <> 'S' THEN
12523                          x_return_status := l_return_status;
12524              x_raw_cost_rejection_code := substr(x_msg_data,1,30);
12525              x_burden_cost_rejection_code := substr(x_msg_data,1,30);
12526              x_revenue_rejection_code := substr(x_msg_data,1,30);
12527              GOTO END_RES_RATE;
12528                END IF;
12529 
12530         IF l_rw_cost_rate_override IS NOT NULL THEN
12531             l_stage :=680;
12532             --print_msg(to_char(l_stage)||' l_rw_cost_rate_override IS NOT NULL');
12533             --print_msg(to_char(l_stage)||' Check if txn_currency_override is null');
12534         l_cost_override_currency := 'Y';
12535             IF l_txn_currency_code_override IS NULL THEN
12536                 l_stage :=683;
12537                 --print_msg(to_char(l_stage)||' Copy l_txn_currency_code into l_txn_currency_code_override');
12538                 l_txn_currency_code_override := l_txn_currency_code;
12539             END IF;
12540         END IF;
12541 
12542 	If z.rate_based_flag = 'N' Then
12543 		If rate_rec.fp_budget_version_type = 'ALL' AND NVL(g_wp_version_flag,'N') = 'N' then
12544 			If l_rw_cost_rate_override = 0 Then
12545 				l_burden_cost_rate_override := 0;
12546 			End If;
12547 		End If;
12548 	End If;
12549 
12550         IF l_burden_cost_rate_override IS NOT NULL THEN
12551             l_stage :=685;
12552             --print_msg(to_char(l_stage)||' l_burden_cost_rate_override IS NOT NULL');
12553             --print_msg(to_char(l_stage)||' Check if txn_currency_override is null');
12554         	l_burden_override_currency := 'Y';
12555             IF l_txn_currency_code_override IS NULL THEN
12556                 l_stage :=687;
12557                 --print_msg(to_char(l_stage)||' Copy l_txn_currency_code into l_txn_currency_code_override');
12558                 l_txn_currency_code_override := l_txn_currency_code;
12559             END IF;
12560         END IF;
12561 
12562         IF l_bill_rate_override IS NOT NULL THEN
12563             l_stage :=689;
12564             --print_msg(to_char(l_stage)||' l_bill_rate_override IS NOT NULL');
12565             --print_msg(to_char(l_stage)||' Check if txn_currency_override is null');
12566         l_revenue_override_currency := 'Y';
12567             IF l_txn_currency_code_override IS NULL THEN
12568                 l_stage :=690;
12569                 --print_msg(to_char(l_stage)||' Copy l_txn_currency_code into l_txn_currency_code_override');
12570                 l_txn_currency_code_override := l_txn_currency_code;
12571             END IF;
12572         END IF;
12573 
12574         IF l_txn_raw_cost IS NOT NULL THEN
12575             l_stage :=692;
12576             --print_msg(to_char(l_stage)||' l_txn_raw_cost IS NOT NULL');
12577             --print_msg(to_char(l_stage)||' Check if txn_currency_override is null');
12578         l_cost_override_currency := 'Y';
12579             IF l_txn_currency_code_override IS NULL THEN
12580                 l_stage :=694;
12581                 --print_msg(to_char(l_stage)||' Copy l_txn_currency_code into l_txn_currency_code_override');
12582                 l_txn_currency_code_override := l_txn_currency_code;
12583             END IF;
12584         END IF;
12585 
12586         IF l_txn_burdened_cost IS NOT NULL THEN
12587             l_stage :=696;
12588             --print_msg(to_char(l_stage)||' l_txn_burdened_cost IS NOT NULL');
12589             --print_msg(to_char(l_stage)||' Check if txn_currency_override is null');
12590         l_burden_override_currency := 'Y';
12591             IF l_txn_currency_code_override IS NULL THEN
12592                 l_stage :=697;
12593                 --print_msg(to_char(l_stage)||' Copy l_txn_currency_code into l_txn_currency_code_override');
12594                 l_txn_currency_code_override := l_txn_currency_code;
12595             END IF;
12596         END IF;
12597 
12598         IF l_txn_revenue IS NOT NULL THEN
12599             l_stage :=698;
12600             --print_msg(to_char(l_stage)||' l_txn_revenue IS NOT NULL');
12601             --print_msg(to_char(l_stage)||' Check if txn_currency_override is null');
12602         l_revenue_override_currency := 'Y';
12603             IF l_txn_currency_code_override IS NULL THEN
12604                 l_stage :=699;
12605                 --print_msg(to_char(l_stage)||' Copy l_txn_currency_code into l_txn_currency_code_override');
12606                 l_txn_currency_code_override := l_txn_currency_code;
12607             END IF;
12608         END IF;
12609 
12610     IF l_txn_currency_code_override is NOT NULL Then
12611              IF  ( g_wp_version_flag = 'Y' AND g_ra_bl_txn_currency_code IS NULL and g_agr_conv_reqd_flag = 'N' ) THEN
12612                  /* set the global currency if the currency override ie cost and rates are entered from the page */
12613                   g_ra_bl_txn_currency_code := l_txn_currency_code_override;
12614                   --print_msg(' g_ra_bl_txn_currency_code set to Override currency code['||g_ra_bl_txn_currency_code||']');
12615              END IF;
12616     END IF;
12617 	/*
12618     print_msg('Before calling Rate API chk overrids CostCurFlag['||l_cost_override_currency||']BurdCurFlag['||l_burden_override_currency||']');
12619     print_msg('RevOvrCur['||l_revenue_override_currency||']gRaBlCurCode['||g_ra_bl_txn_currency_code||']TxnCur['||l_txn_currency_code||']');
12620 	*/
12621 
12622         /* Bug fix: 3861970 For people resource class, the organization override must be considered
12623          * this can be defined at the project level. PA_COST_DIST_OVERRIDES stores configurations defined
12624          * at the project level that redirect specific costs and revenue to another organization. You can define a
12625          * cost distribution override to redirect the costs and revenues generated by a specific employee or by all
12626          * employees assigned to a specified organization. You can optionally redirect only certain costs and
12627          * revenues by specifying an expenditure category.
12628          */
12629         l_override_organization_id := NULL;
12630         /* Bug fix: 4232181 As per sanjay's discussion with Anders, dinakar and Ramesh the project level override
12631                  * organization id should be derived for all resource classes. If user doesnot setup proper override organizations
12632                  * then material and bom-resources may not derive the correct rates. so commenting out the if condition
12633          * If z.resource_class_code = 'PEOPLE' Then
12634          */
12635             IF l_override_organization_id is NULL Then
12636                 l_stage := 699.1;
12637                                 pa_cost.Override_exp_organization
12638                                 (P_item_date                  => z.start_date
12639                                 ,P_person_id                  => z.person_id
12640                                 ,P_project_id                 => p_project_id
12641                                 ,P_incurred_by_organz_id      => z.organization_id
12642                                 ,P_Expenditure_type           => nvl(z.expenditure_type,z.rate_expenditure_type)
12643                                 ,X_overr_to_organization_id   => l_override_organization_id
12644                                 ,X_return_status              => l_return_status
12645                                 ,X_msg_count                  => x_msg_count
12646                                 ,X_msg_data                   => x_msg_data
12647                                 );
12648                                 --print_msg(l_stage||'Return status of pa_cost.Override_exp_organization retSts['||l_return_status||']');
12649                         End If;
12650         /* End of bug fix: 4232181 End If; */
12651         /* End of bug fix: 3861970 */
12652 
12653     /* The following condition is added, to ensure that rate api derives the bill rates and revenue
12654      * when bill rate override is passed for non-billable tasks */
12655     If rate_rec.fp_budget_version_type in ('REVENUE','ALL') Then
12656       If (l_bill_rate_override is NOT NULL
12657            and l_billable_flag = 'N' ) Then
12658         l_rateApi_billable_flag := 'Y';
12659       Else
12660         l_rateApi_billable_flag := l_billable_flag;
12661       End If;
12662     End If;
12663 
12664        l_stage := 700;
12665 	If P_PA_DEBUG_MODE = 'Y' Then
12666        print_msg(to_char(l_stage)||' All Rate API required parameters');
12667        print_msg(' ---------LEGEND----------------------------- ');
12668        print_msg(' **REQUIRED** = MUST BE PASSED TO RATE API');
12669        print_msg(' p_project_id                => '||p_project_id);
12670        print_msg(' p_task_id                   => '||z.task_id);
12671        print_msg(' p_top_task_id               => '||tsk_rec.top_task_id);
12672        print_msg(' p_person_id                 => '||z.person_id);
12673        print_msg(' p_job_id                    => '||z.job_id);
12674        print_msg(' p_bill_job_grp_id           => '||rate_rec.bill_job_group_id);
12675        print_msg(' p_project_organz_id         => '||rate_rec.carrying_out_organization_id);
12676        print_msg(' p_rev_res_class_rate_sch_id => '||rate_rec.res_class_bill_rate_sch_id);
12677        print_msg(' p_cost_res_class_rate_sch_id=> '||rate_rec.res_class_raw_cost_sch_id);
12678        print_msg(' p_rev_task_nl_rate_sch_id   => '||tsk_rec.non_lab_std_bill_rt_sch_id);
12679        print_msg(' p_rev_proj_nl_rate_sch_id   => '||rate_rec.non_lab_std_bill_rt_sch_id);
12680        print_msg(' p_rev_job_rate_sch_id       => '||nvl(tsk_rec.job_bill_rate_schedule_id,rate_rec.job_bill_rate_schedule_id));
12681        print_msg(' p_rev_emp_rate_sch_id       => '||nvl(tsk_rec.emp_bill_rate_schedule_id,rate_rec.emp_bill_rate_schedule_id));
12682        print_msg(' p_plan_rev_job_rate_sch_id  => '||rate_rec.rev_job_rate_sch_id);
12683        print_msg(' p_plan_cost_job_rate_sch_id => '||rate_rec.cost_job_rate_sch_id);
12684        print_msg(' p_plan_rev_emp_rate_sch_id  => '||rate_rec.rev_emp_rate_sch_id);
12685        print_msg(' p_plan_cost_emp_rate_sch_id => '||rate_rec.cost_emp_rate_sch_id);
12686        print_msg(' p_plan_rev_nlr_rate_sch_id  => '||rate_rec.rev_non_labor_res_rate_sch_id);
12687        print_msg(' p_plan_cost_nlr_rate_sch_id => '||rate_rec.cost_non_labor_res_rate_sch_id);
12688        print_msg(' p_plan_burden_cost_sch_id   => '||rate_rec.cost_burden_rate_sch_id);
12689        print_msg(' p_calculate_mode            => '||l_calculate_mode);
12690        print_msg(' p_mcb_flag                  => '||rate_rec.multi_currency_billing_flag);
12691        print_msg(' p_cost_rate_multiplier      => '||l_cost_rate_multiplier);
12692        print_msg(' p_bill_rate_multiplier      => '||l_bill_rate_multiplier);
12693        print_msg(' p_cost_sch_type             => '||l_cost_sch_type);
12694        print_msg(' p_labor_sch_type            => '||rate_rec.labor_sch_type);
12695        print_msg(' p_non_labor_sch_type        => '||rate_rec.non_labor_sch_type);
12696        print_msg(' p_labor_schdl_discnt        => '||NULL);
12697        print_msg(' p_labor_bill_rate_org_id    => '||rate_rec.labor_bill_rate_org_id);
12698        print_msg(' p_labor_std_bill_rate_schdl => '||NULL);
12699        print_msg(' p_labor_schdl_fixed_date    => '||NULL);
12700        print_msg(' p_project_org_id            => '||rate_rec.org_id);
12701        print_msg(' p_project_type              => '||rate_rec.project_type);
12702        print_msg(' p_expenditure_type          => '||nvl(z.expenditure_type,z.rate_expenditure_type));
12703        print_msg(' p_non_labor_resource        => '||z.non_labor_resource);
12704        print_msg(' p_incurred_by_organz_id     => '||z.organization_id);
12705        print_msg(' p_override_to_organz_id     => '||l_override_organization_id);
12706        print_msg(' p_expenditure_org_id        => '||nvl(z.rate_expenditure_org_id,rate_rec.org_id));
12707        print_msg(' p_assignment_precedes_task  => '||rate_rec.assign_precedes_task);
12708        print_msg(' p_planning_transaction_id   => '||z.budget_line_id);
12709        print_msg(' p_task_bill_rate_org_id     => '||tsk_rec.non_labor_bill_rate_org_id);
12710        print_msg(' p_project_bill_rate_org_id  => '||rate_rec.non_labor_bill_rate_org_id);
12711        print_msg(' p_nlr_organization_id       => '||z.organization_id);
12712        print_msg(' p_project_sch_date          => '||rate_rec.non_labor_schedule_fixed_date);
12713        print_msg(' p_task_sch_date             => '||tsk_rec.non_labor_schedule_fixed_date);
12714        print_msg(' p_project_sch_discount      => '||rate_rec.non_labor_schedule_discount);
12715        print_msg(' p_task_sch_discount         => '||tsk_rec.non_labor_schedule_discount);
12716        print_msg(' p_inventory_item_id         => '||z.inventory_item_id);
12717        print_msg(' p_BOM_resource_Id           => '||z.bom_resource_id);
12718        print_msg(' P_mfc_cost_type_id          => '||z.mfc_cost_type_id);
12719        print_msg(' P_item_category_id          => '||z.item_category_id);
12720        print_msg(' p_mfc_cost_source           => '||l_mfc_cost_source);
12721        print_msg(' ** p_assignment_id             => '||z.resource_assignment_id);
12722        print_msg(' ** p_resource_class            => '||z.resource_class_code);
12723        print_msg(' ** p_planning_resource_format  => '||z.res_format_id);
12724        print_msg(' ** p_use_planning_rates_flag   => '||rate_rec.use_planning_rates_flag);
12725        print_msg(' ** p_rate_based_flag           => '||z.rate_based_flag);
12726        print_msg(' ** p_uom                       => '||z.unit_of_measure);
12727        print_msg(' ** p_quantity                  => '||l_txn_plan_quantity);
12728        print_msg(' ** p_item_date                 => '||z.start_date);
12729        print_msg(' ** p_cost_override_rate        => '||l_rw_cost_rate_override);
12730        print_msg(' ** p_revenue_override_rate     => '||l_bill_rate_override);
12731        print_msg(' ** p_override_burden_cost_rate => '||l_burden_cost_rate_override);
12732        print_msg(' ** p_override_currency_code    => '||l_txn_currency_code_override);
12733        print_msg(' ** p_txn_currency_code         => '||l_txn_currency_code);
12734        print_msg(' ** p_raw_cost                  => '||l_txn_raw_cost);
12735        print_msg(' ** p_burden_cost               => '||l_txn_burdened_cost);
12736        print_msg(' ** p_raw_revenue               => '||l_txn_revenue);
12737        print_msg(' ** p_RateApibillability_flag   => '||l_rateApi_billable_flag);
12738        print_msg(' ** p_budget_version_id         => '||p_budget_version_id);
12739 	End if;
12740 
12741        l_stage := 740;
12742     /*
12743     *CALL get_planning_rates
12744     */
12745         l_stage := 745;
12746         --print_msg(to_char(l_stage)||' ****Calling get_planning_rates****');
12747         BEGIN
12748         /* bug fix: 3737994: For project level budgeting the task id should be passed as NULL instead of zero to calculate
12749                  * project level bill rate overrides
12750                  */
12751          l_task_id := z.task_id;
12752          If l_task_id = 0 Then
12753             l_task_id := NULL;
12754          End If;
12755 
12756         /* Bug fix:4133047 pass the Task level or project level labor and non-labor sch types to bill rate api in order to
12757         * derive the markup based on burden schedule or bill rate schedule
12758         */
12759         If l_task_id IS NOT NULL THEN
12760                     l_labor_sch_type:= tsk_rec.labor_sch_type;
12761                     l_non_labor_sch_type  := tsk_rec.non_labor_sch_type;
12762             Else
12763                     l_labor_sch_type:= rate_rec.labor_sch_type;
12764                     l_non_labor_sch_type  := rate_rec.non_labor_sch_type;
12765             End If;
12766             pa_plan_revenue.Get_planning_Rates
12767                 (
12768                                 p_project_id                           =>  p_project_id
12769                                 /* bug fix: 3737994 ,p_task_id          => z.task_id */
12770                                 ,p_task_id                              => l_task_id
12771                                 ,p_top_task_id                          => tsk_rec.top_task_id
12772                                 ,p_person_id                            => z.person_id
12773                                 ,p_job_id                               => z.job_id
12774                                 ,p_bill_job_grp_id                      => rate_rec.bill_job_group_id
12775                                 ,p_resource_class                       => z.resource_class_code
12776                                 ,p_planning_resource_format             => z.res_format_id
12777                                 ,p_use_planning_rates_flag              => NVL(rate_rec.use_planning_rates_flag,'N')
12778                                 ,p_rate_based_flag                      => NVL(z.rate_based_flag,'N')
12779                                 ,p_uom                                  => z.unit_of_measure
12780                                 ,p_system_linkage                       => NULL
12781                                 ,p_project_organz_id                    => rate_rec.carrying_out_organization_id
12782                                 ,p_rev_res_class_rate_sch_id            => rate_rec.res_class_bill_rate_sch_id
12783                                 ,p_cost_res_class_rate_sch_id           => rate_rec.res_class_raw_cost_sch_id
12784                                 ,p_rev_task_nl_rate_sch_id              => tsk_rec.non_lab_std_bill_rt_sch_id
12785                                 ,p_rev_proj_nl_rate_sch_id              => rate_rec.non_lab_std_bill_rt_sch_id
12786 				/* bug fix:5056986: Pass task level rate schedule overrides when exists */
12787                                 ,p_rev_job_rate_sch_id                  => nvl(tsk_rec.job_bill_rate_schedule_id,rate_rec.job_bill_rate_schedule_id)
12788                                 ,p_rev_emp_rate_sch_id                  => nvl(tsk_rec.emp_bill_rate_schedule_id,rate_rec.emp_bill_rate_schedule_id)
12789                                 ,p_plan_rev_job_rate_sch_id             => rate_rec.rev_job_rate_sch_id
12790                                 ,p_plan_cost_job_rate_sch_id            => rate_rec.cost_job_rate_sch_id
12791                                 ,p_plan_rev_emp_rate_sch_id             => rate_rec.rev_emp_rate_sch_id
12792                                 ,p_plan_cost_emp_rate_sch_id            => rate_rec.cost_emp_rate_sch_id
12793                                 ,p_plan_rev_nlr_rate_sch_id             => rate_rec.rev_non_labor_res_rate_sch_id
12794                                 ,p_plan_cost_nlr_rate_sch_id            => rate_rec.cost_non_labor_res_rate_sch_id
12795                                 ,p_plan_burden_cost_sch_id              => rate_rec.cost_burden_rate_sch_id
12796                                 ,p_calculate_mode                       => l_calculate_mode
12797                                 ,p_mcb_flag                             => rate_rec.multi_currency_billing_flag
12798                                 ,p_cost_rate_multiplier                 => l_cost_rate_multiplier
12799                                 ,p_bill_rate_multiplier                 => l_bill_rate_multiplier
12800                                 ,p_quantity                             => l_txn_plan_quantity
12801                                 ,p_item_date                            => z.start_date
12802                                 ,p_cost_sch_type                        => l_cost_sch_type
12803                                 ,p_labor_sch_type                       => l_labor_sch_type
12804                                 ,p_non_labor_sch_type                   => l_non_labor_sch_type
12805                                 ,p_labor_schdl_discnt                   => NULL
12806                                 ,p_labor_bill_rate_org_id               => rate_rec.labor_bill_rate_org_id
12807                                 ,p_labor_std_bill_rate_schdl            => NULL
12808                                 ,p_labor_schdl_fixed_date               => NULL
12809                                 ,p_assignment_id                        => z.resource_assignment_id
12810                                 ,p_project_org_id                       => rate_rec.org_id
12811                                 ,p_project_type                         => rate_rec.project_type
12812                                 ,p_expenditure_type                     => nvl(z.expenditure_type,z.rate_expenditure_type)
12813                                 ,p_non_labor_resource                   => z.non_labor_resource
12814                                 ,p_incurred_by_organz_id                => z.organization_id
12815                                 ,p_override_to_organz_id                => l_override_organization_id
12816                                 ,p_expenditure_org_id                   => nvl(z.rate_expenditure_org_id,rate_rec.org_id)
12817                                 ,p_assignment_precedes_task             => rate_rec.assign_precedes_task
12818                                 ,p_planning_transaction_id              => z.budget_line_id
12819                                 ,p_task_bill_rate_org_id                => tsk_rec.non_labor_bill_rate_org_id
12820                                 ,p_project_bill_rate_org_id             => rate_rec.non_labor_bill_rate_org_id
12821                                 ,p_nlr_organization_id                  => z.organization_id
12822                                 ,p_project_sch_date                     => rate_rec.non_labor_schedule_fixed_date
12823                                 ,p_task_sch_date                        => tsk_rec.non_labor_schedule_fixed_date
12824                                 ,p_project_sch_discount                 => rate_rec.non_labor_schedule_discount
12825                                 ,p_task_sch_discount                    => tsk_rec.non_labor_schedule_discount
12826                                 ,p_inventory_item_id                    => z.inventory_item_id
12827                                 ,p_BOM_resource_Id                      => z.bom_resource_id
12828                                 ,P_mfc_cost_type_id                     => z.mfc_cost_type_id
12829                                 ,P_item_category_id                     => z.item_category_id
12830                                 ,p_mfc_cost_source                      => l_mfc_cost_source
12831                                 ,p_cost_override_rate                   => l_rw_cost_rate_override
12832                                 ,p_revenue_override_rate                => l_bill_rate_override
12833                                 ,p_override_burden_cost_rate            => l_burden_cost_rate_override
12834                                 ,p_override_currency_code               => l_txn_currency_code_override
12835                                 ,p_txn_currency_code                    => l_txn_currency_code
12836                                 ,p_raw_cost                             => l_txn_raw_cost
12837                                 ,p_burden_cost                          => l_txn_burdened_cost
12838                                 ,p_raw_revenue                          => l_txn_revenue
12839                 		,p_billability_flag                     => l_rateApi_billable_flag
12840 				,p_budget_version_id                    => p_budget_version_id /*Added For CBS*/
12841                                 ,x_bill_rate                            => x_bill_rate
12842                                 ,x_cost_rate                            => x_cost_rate
12843                                 ,x_burden_cost_rate                     => x_burden_cost_rate
12844                                 ,x_burden_multiplier                    => x_burden_multiplier
12845                                 ,x_raw_cost                             => x_raw_cost
12846                                 ,x_burden_cost                          => x_burden_cost
12847                                 ,x_raw_revenue                          => x_raw_revenue
12848                                 ,x_bill_markup_percentage               => x_bill_markup_percentage
12849                                 ,x_cost_txn_curr_code                   => x_cost_txn_curr_code
12850                                 ,x_rev_txn_curr_code                    => x_rev_txn_curr_code
12851                                 ,x_raw_cost_rejection_code              => x_raw_cost_rejection_code
12852                                 ,x_burden_cost_rejection_code           => x_burden_cost_rejection_code
12853                                 ,x_revenue_rejection_code               => x_revenue_rejection_code
12854                                 ,x_cost_ind_compiled_set_id             => x_cost_ind_compiled_set_id
12855                                 ,x_return_status                        => l_return_status
12856                                 ,x_msg_data                             => x_msg_data
12857                                 ,x_msg_count                            => x_msg_count
12858                                 );
12859 	    If P_PA_DEBUG_MODE = 'Y' Then
12860             print_msg('Return status of the RATE API['||l_return_status||']msgData['||x_msg_data||']');
12861             print_msg('get_plannig_rateAPIMsgCtinErrStack['||fnd_msg_pub.count_msg||']');
12862 	    End if;
12863                 If l_return_status = 'U' Then
12864                     x_raw_cost_rejection_code      := substr('PA_FP_ERROR_FROM_RATE_API_CALL',1,30);
12865                         x_burden_cost_rejection_code   := substr(SQLERRM,1,30);
12866                         x_revenue_rejection_code       := substr('PA_FP_ERROR_FROM_RATE_API_CALL',1,30);
12867                          pa_utils.add_message
12868                           ( p_app_short_name => 'PA'
12869                           ,p_msg_name       => 'PA_FP_ERROR_FROM_RATE_API_CALL'
12870                           ,p_token1         => 'G_PROJECT_NAME'
12871                           ,p_value1         => g_project_name
12872                           ,p_token2         => 'G_TASK_NAME'
12873                           ,p_value2         => g_task_name
12874                           ,p_token3         => 'G_RESOURCE_NAME'
12875                           ,p_value3         => g_resource_name
12876                           ,p_token4         => 'TO_CHAR(L_TXN_CURRENCY_CODE)' /*instead of changing the msg and logging seed bug changed the token */
12877                           ,p_value4         => l_txn_currency_code
12878                           ,p_token5         => 'TO_CHAR(L_BUDGET_LINES_START_DATE)'
12879                           ,p_value5         => to_char(z.start_date));
12880 
12881                     x_return_status := l_return_status;
12882                     /* bug fix: 4078623 GOTO END_RES_RATE; */
12883                         RAISE RATEAPI_UNEXPECTED_ERRORS;
12884             End If;
12885 
12886         EXCEPTION
12887         WHEN OTHERS THEN
12888 
12889             print_msg('Unexpected error occured in RATE API');
12890                 x_raw_cost_rejection_code      := substr('PA_FP_ERROR_FROM_RATE_API_CALL',1,30);
12891                 x_burden_cost_rejection_code   := substr(SQLERRM,1,30);
12892                 x_revenue_rejection_code       := substr('PA_FP_ERROR_FROM_RATE_API_CALL',1,30);
12893             If l_return_status = 'U' Then
12894                 x_return_status := l_return_status;
12895              pa_utils.add_message
12896                           ( p_app_short_name => 'PA'
12897                           ,p_msg_name       => 'PA_FP_ERROR_FROM_RATE_API_CALL'
12898                           ,p_token1         => 'G_PROJECT_NAME'
12899                           ,p_value1         => g_project_name
12900                           ,p_token2         => 'G_TASK_NAME'
12901                           ,p_value2         => g_task_name
12902                           ,p_token3         => 'G_RESOURCE_NAME'
12903                           ,p_value3         => g_resource_name
12904                           ,p_token4         => 'TO_CHAR(L_TXN_CURRENCY_CODE)'
12905                           ,p_value4         => l_txn_currency_code
12906                           ,p_token5         => 'TO_CHAR(L_BUDGET_LINES_START_DATE)'
12907                           ,p_value5         => to_char(z.start_date));
12908             End If;
12909             /* bug fix: 4078623 GOTO END_RES_RATE; */
12910                         RAISE RATEAPI_UNEXPECTED_ERRORS;
12911     END;
12912 
12913         l_stage := 746;
12914 	If P_PA_DEBUG_MODE = 'Y' Then
12915         print_msg(l_stage||'****AFTER Calling get_planning_rates**** Raw Values returned by Rate API: ');
12916         print_msg('x_cost_txn_curr_code['||x_cost_txn_curr_code||']x_raw_cost['||x_raw_cost||']x_cost_rate['||x_cost_rate||']');
12917     print_msg('x_burden_cost['||x_burden_cost||']x_burden_cost_rate['||x_burden_cost_rate||']x_burden_multiplier['||x_burden_multiplier||']');
12918     print_msg('x_cost_ind_compiled_set_id['||x_cost_ind_compiled_set_id||']');
12919     print_msg('x_rev_txn_curr_code['||x_rev_txn_curr_code||']x_raw_revenue['||x_raw_revenue||']x_bill_rate['||x_bill_rate||']');
12920     print_msg('markup['||x_bill_markup_percentage||']x_revenue_rejection_code['||x_revenue_rejection_code||']');
12921     print_msg('CostRejection['||x_raw_cost_rejection_code||']BurdRejection['||x_burden_cost_rejection_code||']');
12922 	End if;
12923 
12924 		/* bug fix:5054395 : donot derive revenue based on bill rate for non-rate base resource when markup% is not exists */
12925 		If p_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION') THEN
12926 			If NVL(z.rate_based_flag,'N') = 'N' Then
12927 				If rate_rec.fp_budget_version_type = 'ALL' Then
12928 				   /* for a non rate based resource if markup percent is not setup then
12929 				    * donot derive the revenue. ignore bill rate
12930 				    */
12931 				     If l_bill_rate_override is NULL and x_bill_markup_percentage is NULL Then
12932 					--print_msg('Resetting the revenue to Null for Non-rate base resources ');
12933 					x_bill_rate := NULL;
12934 					x_raw_revenue := NULL;
12935 				     End If;
12936 
12937 				     /* The following conditions are to reset the quantity for revenue only entered transaction
12938 				      * for cost and revenue together version
12939 				      */
12940 				      If l_bill_rate_override is NOT NULL and l_rw_cost_rate_override = 0 Then
12941 					 If l_txn_plan_quantity <> x_raw_revenue Then
12942 						l_txn_plan_quantity := x_raw_revenue;
12943 						l_bill_rate_override := 1;
12944 					 End If;
12945 				      End If;
12946 				End If;
12947 			End If;
12948 		End If;
12949 
12950 
12951             /* ER:4376722 : Billability changes */
12952                 IF NVL(l_billable_flag,'N') = 'N' Then --{
12953                   IF (p_calling_module IN ('BUDGET_GENERATION','FORECAST_GENERATION')) THEN
12954                /* Added these for future reference: in case if we need to retain the revenue from generation process passes the
12955                 * the bill rate overrides,
12956                 * : July 20, 2005: again decision changed to retain the revenue for Forecast generation process if bill rate override is passed
12957                 */
12958                IF p_calling_module = 'FORECAST_GENERATION' Then
12959                              If l_bill_rate_override is NULL Then
12960                               x_bill_rate := NULL;
12961                               x_raw_revenue := NULL;
12962                               x_bill_markup_percentage := NULL;
12963                               l_bill_rate_override := NULL;
12964                  End If;
12965                            End If;
12966                If p_calling_module = 'BUDGET_GENERATION' Then
12967                              l_bill_rate_override := NULL;
12968                              x_bill_rate := NULL;
12969                              x_raw_revenue := NULL;
12970                              x_bill_markup_percentage := NULL;
12971                              x_revenue_rejection_code := NULL;
12972                End If;
12973                If (rate_rec.fp_budget_version_type = 'REVENUE'
12974                               and NVL(z.rate_based_flag,'N') = 'N'
12975                               --and l_bill_rate_override is NULL
12976                                 ) Then
12977                                 l_txn_plan_quantity := NULL;
12978                                 x_raw_revenue := NULL;
12979                            End If;
12980                   ElsIf rate_rec.fp_budget_version_type = 'REVENUE' Then
12981                     If NVL(z.rate_based_flag,'N') = 'Y' Then
12982                         If l_bill_rate_override is NULL Then
12983                            x_bill_rate := NULL;
12984                            x_revenue_rejection_code := NULL;
12985                            x_raw_revenue := NULL;
12986                            x_bill_markup_percentage := NULL;
12987                         End If;
12988                     End If;
12989                   Elsif rate_rec.fp_budget_version_type = 'ALL' Then
12990                         If l_bill_rate_override is NULL Then
12991                            x_bill_rate := NULL;
12992                            x_revenue_rejection_code := NULL;
12993                            x_raw_revenue := NULL;
12994                            x_bill_markup_percentage := NULL;
12995                         End If;
12996                   End If;
12997                 END If; --}
12998 
12999     /* For workplan version there should not be any rejections from revenue related columns
13000      * so assign all the params to null or ignore the values returned from rate api for revenue columns
13001      */
13002         IF ( rate_rec.fp_budget_version_type = 'COST' OR NVL(g_wp_version_flag,'N') = 'Y' ) THEN
13003           l_stage := 750;
13004           --print_msg(to_char(l_stage)||' rate_rec.fp_budget_version_type = COST set REVENUE parameters to NULL');
13005           x_bill_rate                            := NULL;
13006           x_raw_revenue                          := NULL;
13007           x_bill_markup_percentage               := NULL;
13008           x_rev_txn_curr_code                    := NULL;
13009           x_revenue_rejection_code               := NULL;
13010       /* Bug fix: 4293020 set rate overrides to null where appropriate */
13011       l_bill_rate_override                   := NULL;
13012         ELSIF ( rate_rec.fp_budget_version_type = 'REVENUE'
13013         AND ( l_revenue_generation_method <> 'T'
13014           OR p_calling_module NOT IN ('BUDGET_GENERATION','FORECAST_GENERATION')))  THEN
13015           l_stage := 755;
13016           --print_msg(to_char(l_stage)||' rate_rec.fp_budget_version_type = REVENUE set COST parameters to NULL');
13017           x_cost_rate                            := NULL;
13018           x_burden_cost_rate                     := NULL;
13019           x_burden_multiplier                    := NULL;
13020           x_raw_cost                             := NULL;
13021           x_burden_cost                          := NULL;
13022           x_cost_txn_curr_code                   := NULL;
13023           x_raw_cost_rejection_code              := NULL;
13024           x_burden_cost_rejection_code           := NULL;
13025           x_cost_ind_compiled_set_id             := NULL;
13026       /* Bug fix: 4293020 set rate overrides to null where appropriate */
13027       l_rw_cost_rate_override        := NULL;
13028       l_burden_cost_rate_override        := NULL;
13029         ELSIF rate_rec.fp_budget_version_type = 'ALL'  THEN
13030           l_stage := 757;
13031           --print_msg(to_char(l_stage)||' rate_rec.fp_budget_version_type = ALL -- leave x parameters as is');
13032       /* during Revenue budget generation, If the Revenue generation method is based on Cost or Event Based
13033            * the calling API will generate the revenue amounts by applying the event markups
13034        * Bug fix: 3765835
13035        * Revenue Generation method : C - Cost, E - Event Based, T - Time, W - Wrok
13036        */
13037        IF p_calling_module IN ('BUDGET_GENERATION','FORECAST_GENERATION')
13038            --Bug 6722414 When called from ETC client extension, Dont null out revenue amounts.
13039        AND  NVL(g_from_etc_client_extn_flag,'N')='N' THEN
13040           IF NVL(l_revenue_generation_method,'W') in ('C','E') Then
13041         --print_msg('Revenue Generation Method is COST or EVENT so Null out Revenue columns');
13042         -- set all the revenue params to NULL
13043         x_bill_rate                            := NULL;
13044             x_raw_revenue                          := NULL;
13045             x_bill_markup_percentage               := NULL;
13046             x_rev_txn_curr_code                    := NULL;
13047             x_revenue_rejection_code               := NULL;
13048         /* Bug fix: 4293020 set rate overrides to null where appropriate */
13049         l_bill_rate_override                   := NULL;
13050 
13051           End If;
13052        END IF;
13053         END IF;
13054 
13055     /* Rounding Enhancements : */
13056         /* Bug fix:4085836 Derive the burden rate based on the unrounded burdened cost by etc quantity */
13057         IF rate_rec.fp_budget_version_type in ('COST','ALL') AND NVL(l_burden_override_currency,'N') <> 'Y' THEN
13058                 IF NVL(l_txn_plan_quantity,0) <> 0  AND NVL(x_burden_cost,0) <> 0 AND NVL(x_cost_rate,0) <> 0 THEN
13059                         IF x_raw_cost = x_burden_cost THEN
13060                                 x_burden_cost_rate := x_cost_rate;
13061                         ElsIF NVL(x_burden_multiplier,0) <> 0 Then
13062                                 x_burden_cost_rate := ((l_txn_plan_quantity * x_cost_rate) +
13063                             ((l_txn_plan_quantity * x_cost_rate)*NVL(x_burden_multiplier,0)))/l_txn_plan_quantity;
13064                 x_burden_cost := pa_currency.round_trans_currency_amt1
13065                          ((l_txn_plan_quantity *x_burden_cost_rate),NVL(x_cost_txn_curr_code,l_txn_currency_code));
13066                         END IF;
13067                 END IF;
13068         END IF;
13069 
13070         /* When markup percent is defined for a resource, The rate api is not deriving Bill Rates
13071          * due to this, the Revenue on the page derives as zero
13072          */
13073         IF NVL(x_raw_revenue,0) <> 0 AND NVL(l_txn_plan_quantity,0) <> 0 Then
13074                 IF x_bill_rate is NULL Then
13075                         /* check whether markup is applied on raw cost or burdened cost then
13076                          * derive the bill rate based on unrounded revenue
13077                          */
13078                         IF NVL(x_bill_markup_percentage,0) <> 0  Then
13079                              IF x_raw_revenue = (pa_currency.round_trans_currency_amt1(
13080                                                   ((1+x_bill_markup_percentage/100)*x_raw_cost),NVL(x_rev_txn_curr_code
13081                                                                                 ,NVL(x_cost_txn_curr_code,l_txn_currency_code)))) Then
13082                                 x_bill_rate := ((1+x_bill_markup_percentage/100)*x_raw_cost)/l_txn_plan_quantity;
13083 
13084                              Elsif x_raw_revenue = (pa_currency.round_trans_currency_amt1(
13085                                                   ((1+x_bill_markup_percentage/100)*x_burden_cost),NVL(x_rev_txn_curr_code
13086                                                                                 ,NVL(x_cost_txn_curr_code,l_txn_currency_code)))) Then
13087                                 x_bill_rate := ((1+x_bill_markup_percentage/100)*x_burden_cost)/l_txn_plan_quantity;
13088 
13089                              ElsIF NVL(x_raw_cost,0) <> 0 Then
13090                                 x_bill_rate := ((1+x_bill_markup_percentage/100)*x_raw_cost)/l_txn_plan_quantity;
13091                              Else
13092                                 x_bill_rate := x_raw_revenue/l_txn_plan_quantity ;
13093                              End If;
13094                         Else
13095                                 x_bill_rate := x_raw_revenue/l_txn_plan_quantity ;
13096                         End If;
13097             /* Bug fix:4099096 For non-rate base if bill rate is null set it to 1 */
13098             If rate_rec.fp_budget_version_type = 'REVENUE' Then
13099               If NVL(z.rate_based_flag,'N') = 'N' AND x_bill_rate is NULL Then
13100                 x_bill_rate := 1;
13101               End If;
13102             End If;
13103                 End If;
13104         End If;
13105 
13106     /* Bug fix: 4163722 If markup percent is not defined then for non-rate base resource revenue only version
13107         * revenue should not be derived based on the bill rate * quantity.
13108         * discussed with Neeraj, sanjay, ramesh assign burdened cost to revenue and mark bill rate override = 1
13109         */
13110         IF (p_calling_module IN ('BUDGET_GENERATION','FORECAST_GENERATION') and l_revenue_generation_method = 'T') THEN
13111                 If rate_rec.fp_budget_version_type = 'REVENUE' Then
13112                     IF caltmp.rate_based_flag = 'N' Then
13113                         /* Bug fix:4229752 l_calculate_mode  := 'REVENUE'; causing markup calculates only for the first line */
13114                         If (NVL(x_bill_markup_percentage,0) = 0 AND  z.markup_calculation_flag = 'Y' ) Then
13115                           x_raw_revenue := NVL(x_burden_cost,x_raw_cost);
13116                           x_bill_rate := 1;
13117                           x_rev_txn_curr_code := l_txn_currency_code;
13118                           l_txn_plan_quantity := x_raw_revenue;
13119                         End If;
13120             Else -- for rate base resource
13121             If (NVL(x_bill_markup_percentage,0) <> 0) Then
13122                 -- mark is applied on raw/burden cost so currency should not change
13123                 x_rev_txn_curr_code := l_txn_currency_code;
13124             Else
13125                 -- for revenue only version rate is applied on qty so ignore cost currency given by rate api
13126                 If (l_txn_currency_code_override is NOT NULL
13127                     and x_rev_txn_curr_code <> l_txn_currency_code_override) Then
13128                    l_txn_currency_code_override := x_rev_txn_curr_code;
13129                 End If;
13130             End If;
13131                     End If;
13132                 End If;
13133         End If;
13134     /* Bug fix: 4294287 Starts */
13135     IF (p_calling_module IN ('BUDGET_GENERATION','FORECAST_GENERATION')) THEN
13136                 If rate_rec.fp_budget_version_type = 'REVENUE' Then
13137           If (NVL(x_bill_markup_percentage,0) <> 0) Then
13138                   l_bill_rate_override := x_bill_rate;
13139           End If;
13140         End If;
13141     End If;
13142     IF rate_rec.fp_budget_version_type = 'REVENUE' Then
13143        If (NVL(x_bill_markup_percentage,0) = 0) Then
13144         If (NVL(l_bill_markup_percentage,0) <> 0) Then
13145            x_bill_markup_percentage := l_bill_markup_percentage;
13146            --print_msg('4294287:copy the old bill markup percentage');
13147         End If;
13148        End If;
13149     End If;
13150     /* Bug fix:4294287 Ends */
13151 
13152     /* bug fix: 4214050 Starts*/
13153     IF (rate_rec.fp_budget_version_type = 'REVENUE')  THEN
13154           l_stage := 4214050;
13155           --print_msg(to_char(l_stage)||' rate_rec.fp_budget_version_type = REVENUE set COST parameters to NULL');
13156           x_cost_rate                            := NULL;
13157           x_burden_cost_rate                     := NULL;
13158           x_burden_multiplier                    := NULL;
13159           x_raw_cost                             := NULL;
13160           x_burden_cost                          := NULL;
13161           x_cost_txn_curr_code                   := NULL;
13162           x_raw_cost_rejection_code              := NULL;
13163           x_burden_cost_rejection_code           := NULL;
13164           x_cost_ind_compiled_set_id             := NULL;
13165       l_rw_cost_rate_override                := NULL;
13166       l_burden_cost_rate_override            := NULL;
13167     End If;
13168     /* bug fix: 4214050 Ends */
13169 
13170     /* ER:4376722 : Billability changes */
13171         IF NVL(l_billable_flag,'N') = 'N' Then --{
13172           IF (p_calling_module IN ('BUDGET_GENERATION','FORECAST_GENERATION')) THEN
13173                IF p_calling_module = 'FORECAST_GENERATION' Then
13174                  If l_bill_rate_override is NULL Then
13175                    /* Added these for future reference: in case if we need to retain the revenue from generation process passes the
13176                                 * the bill rate overrides,*/
13177                     x_bill_rate := NULL;
13178                 l_bill_rate_override := NULL;
13179                 x_revenue_rejection_code := NULL;
13180                                 x_raw_revenue := NULL;
13181                                 x_bill_markup_percentage := NULL;
13182                  End If;
13183                End If;
13184                IF p_calling_module = 'BUDGET_GENERATION' Then
13185                 l_bill_rate_override := NULL;
13186                 x_bill_rate := NULL;
13187                             x_revenue_rejection_code := NULL;
13188                             x_raw_revenue := NULL;
13189                             x_bill_markup_percentage := NULL;
13190                End If;
13191                If (rate_rec.fp_budget_version_type = 'REVENUE'
13192                   and NVL(z.rate_based_flag,'N') = 'N'
13193                   --and l_bill_rate_override is NULL
13194                 ) Then
13195                 l_txn_plan_quantity := NULL;
13196                 x_raw_revenue := NULL;
13197                End If;
13198                   ElsIf rate_rec.fp_budget_version_type = 'REVENUE' Then
13199                     If NVL(z.rate_based_flag,'N') = 'Y' Then
13200                         If l_bill_rate_override is NULL Then
13201                            x_bill_rate := NULL;
13202                            x_revenue_rejection_code := NULL;
13203                            x_raw_revenue := NULL;
13204                            x_bill_markup_percentage:= NULL;
13205                         End If;
13206                     End If;
13207                   Elsif rate_rec.fp_budget_version_type = 'ALL' Then
13208                         If l_bill_rate_override is NULL Then
13209                            x_bill_rate := NULL;
13210                            x_revenue_rejection_code := NULL;
13211                            x_raw_revenue := NULL;
13212                            x_bill_markup_percentage := NULL;
13213                         End If;
13214                   End If;
13215         END If; --}
13216     IF NVL(x_raw_cost,0) <> 0 Then
13217         x_raw_cost := pa_currency.round_trans_currency_amt1(x_raw_cost,NVL(x_cost_txn_curr_code,l_txn_currency_code_override));
13218     End If;
13219 
13220     IF NVL(x_burden_cost,0) <> 0 Then
13221         x_burden_cost := pa_currency.round_trans_currency_amt1(x_burden_cost,
13222                     NVL(l_txn_currency_code_override,x_cost_txn_curr_code));
13223     End If;
13224 
13225     If NVL(x_raw_revenue,0) <> 0 Then
13226         x_raw_revenue :=  pa_currency.round_trans_currency_amt1(x_raw_revenue,
13227                     NVL(x_rev_txn_curr_code,l_txn_currency_code_override));
13228     End If;
13229 
13230     /***
13231        print_msg('Corrected Rate API values based on Budget Version Type (COST/REVENUE or ALL');
13232        print_msg(' x_bill_rate                            => '||to_char(x_bill_rate));
13233        print_msg(' x_cost_rate                            => '||to_char(x_cost_rate));
13234        print_msg(' x_burden_cost_rate                     => '||to_char(x_burden_cost_rate));
13235        print_msg(' x_raw_cost                             => '||to_char(x_raw_cost));
13236        print_msg(' x_burden_cost                          => '||to_char(x_burden_cost));
13237        print_msg(' x_raw_revenue                          => '||to_char(x_raw_revenue));
13238        print_msg(' x_bill_markup_percentage               => '||to_char(x_bill_markup_percentage));
13239        print_msg(' x_cost_txn_curr_code                   => '||x_cost_txn_curr_code);
13240        print_msg(' x_rev_txn_curr_code                    => '||x_rev_txn_curr_code);
13241        print_msg(' x_raw_cost_rejection_code              => '||x_raw_cost_rejection_code);
13242        print_msg(' x_burden_cost_rejection_code           => '||x_burden_cost_rejection_code);
13243        print_msg(' x_revenue_rejection_code               => '||x_revenue_rejection_code);
13244        print_msg(' x_cost_ind_compiled_set_id             => '||to_char(x_cost_ind_compiled_set_id));
13245     **/
13246 
13247         /*
13248         --  Check to make sure RATE API does not return 2 different values for
13249         --  the x_cost_txn_curr_code or x_rev_txn_curr_code.  If the values are different
13250         --  set Revenue Parameters to NULL and x_revenue_rejection_code := 'MORE_THAN_ONE_CURR'
13251         --  Else assign l_txn_currency_code with either the cost or rev
13252         --  txn_curr_code that is not null.  This attribute is needed by the procedure
13253         --  update_rollup_tmp
13254         */
13255                 l_convert_rawcost_only_flag     := 'N';
13256                 l_convert_revenue_only_flag     := 'N';
13257                 l_ra_txn_currency_api_call      := 'N';
13258             IF x_cost_txn_curr_code IS NOT NULL AND x_rev_txn_curr_code IS NULL THEN  --{
13259                 l_stage := 800;
13260                 l_txn_currency_code := x_cost_txn_curr_code;
13261                 --print_msg(l_stage||'l_txn_currency_code set to x_cost_txn_curr_code := '||l_txn_currency_code);
13262                         /* if only the burden rate is entered then we need to retain the currency of the burden rate but
13263                          * rate api returns the different currency for the raw cost then we need to convert the
13264                          * raw cost to the currency of the burden cost */
13265                          --If ( g_wp_version_flag = 'N' AND  g_agr_conv_reqd_flag = 'N' AND NVL(l_burden_override_currency,'N') = 'Y' ) Then
13266                          If ( NVL(l_burden_override_currency,'N') = 'Y' ) Then
13267                                 IF NVL(l_cost_override_currency,'N') = 'N' Then
13268                                         IF (l_txn_currency_code_override is NOT NULL
13269                                             AND l_txn_currency_code_override <> l_txn_currency_code ) Then
13270                         --print_msg('800:Setting l_convert_rawcost_only_flag to Y');
13271                                             l_convert_rawcost_only_flag := 'Y';
13272                                         End If;
13273                                 End If;
13274                          End If;
13275             ELSIF x_cost_txn_curr_code IS NULL AND x_rev_txn_curr_code IS NOT NULL THEN
13276                 l_stage := 801;
13277                 l_txn_currency_code := x_rev_txn_curr_code;
13278             IF NVL(l_revenue_override_currency,'N') = 'N' Then
13279                                IF (l_txn_currency_code_override is NOT NULL
13280                                    AND l_txn_currency_code_override <> l_txn_currency_code ) Then
13281                                        l_convert_revenue_only_flag := 'Y';
13282                                End If;
13283                         End If;
13284                 --print_msg(l_stage||'l_txn_currency_code set to x_rev_txn_curr_code := '||l_txn_currency_code);
13285 
13286             ELSIF x_cost_txn_curr_code IS NOT NULL AND x_rev_txn_curr_code IS NOT NULL THEN
13287                 IF  x_cost_txn_curr_code = x_rev_txn_curr_code THEN
13288                     l_stage := 802;
13289                     l_txn_currency_code := x_cost_txn_curr_code;
13290                     --print_msg('l_txn_currency_code set to x_cost_txn_curr_code := '||l_txn_currency_code);
13291                                 If ( NVL(l_burden_override_currency,'N') = 'Y' ) Then
13292                                   IF NVL(l_cost_override_currency,'N') = 'N' Then
13293                                         IF (l_txn_currency_code_override is NOT NULL
13294                                             AND l_txn_currency_code_override <> l_txn_currency_code ) Then
13295                         --print_msg('802:Setting l_convert_rawcost_only_flag to Y');
13296                                             l_convert_rawcost_only_flag := 'Y';
13297                                         End If;
13298                                   End If;
13299                                   IF NVL(l_revenue_override_currency,'N') = 'N' Then
13300                                         IF (l_txn_currency_code_override is NOT NULL
13301                                             AND l_txn_currency_code_override <> l_txn_currency_code ) Then
13302                                             l_convert_revenue_only_flag := 'Y';
13303                                         End If;
13304                                   End If;
13305                                 End If;
13306                 ELSIF x_cost_txn_curr_code <> x_rev_txn_curr_code THEN  --{
13307                     l_stage := 803;
13308 		    /*
13309                     print_msg(l_stage||'More than one currency returned by Rate API.Revenue Currency and Cost Currency are not equal');
13310                     print_msg('x_cost_txn_curr_code['||x_cost_txn_curr_code||'x_rev_txn_curr_code['||x_rev_txn_curr_code);
13311 		    */
13312                 l_ra_txn_currency_api_call := 'Y';
13313                                 If ( NVL(l_burden_override_currency,'N') = 'Y' ) Then
13314                                   IF NVL(l_cost_override_currency,'N') = 'N' Then
13315                                         IF (l_txn_currency_code_override is NOT NULL
13316                                             AND l_txn_currency_code_override <> x_cost_txn_curr_code ) Then
13317                         --print_msg('803:Setting l_convert_rawcost_only_flag to Y');
13318                                             l_convert_rawcost_only_flag := 'Y';
13319                                         End If;
13320                                   End If;
13321                                   IF NVL(l_revenue_override_currency,'N') = 'N' Then
13322                                         IF (l_txn_currency_code_override is NOT NULL
13323                                             AND l_txn_currency_code_override <> x_rev_txn_curr_code ) Then
13324                                             l_convert_revenue_only_flag := 'Y';
13325                                         End If;
13326                                   End If;
13327                                 End If;
13328                         END IF;  --}
13329                 END IF; --}
13330 
13331                 /* The following code is added to handle when qty and burden rate is entered, and rate api gives the different currency
13332                  * for the cost rate. In such case convert the raw cost to burden cost currency (override currency) */
13333 
13334                 -- Bug 6882579 (Handle case where rate is 0 for a resource class rate schedule)
13335 
13336                 IF nvl(l_convert_rawcost_only_flag,'N') = 'Y' Then  --{
13337                         IF ((l_txn_currency_code_override IS NOT NULL) AND
13338                 (l_txn_currency_code_override <> x_cost_txn_curr_code)) THEN --{
13339                  IF (nvl(x_raw_cost,0) <> 0) THEN
13340                                 l_error_code := NULL;
13341                                 --print_msg('Calling Convert_Final_Txn_Cur_Amts API for Cost amts');
13342                                 Convert_Final_Txn_Cur_Amts(
13343                                 p_project_id            => g_project_id
13344                                 ,p_budget_version_id    => p_budget_version_id
13345                                 ,p_budget_version_type  => rate_rec.fp_budget_version_type
13346                                 ,p_rate_base_flag       => z.rate_based_flag
13347                                 ,p_exp_org_id           => nvl(z.rate_expenditure_org_id,rate_rec.org_id)
13348                                 ,p_task_id              => NVL(z.task_id,g_task_id)
13349                                 ,p_ei_date              => z.start_date
13350                                 ,p_denom_quantity       => l_txn_plan_quantity
13351                                 ,p_denom_raw_cost       => x_raw_cost
13352                                 ,p_denom_burden_cost    => NULL
13353                                 ,p_denom_revenue        => NULL
13354                                 ,p_denom_curr_code      => x_cost_txn_curr_code
13355                                 ,p_final_txn_curr_code  => l_txn_currency_code_override
13356                                 ,x_final_txn_rate_type  => l_Final_txn_rate_type
13357                                 ,x_final_txn_rate_date  => l_Final_txn_rate_date
13358                                 ,x_final_txn_exch_rate  => l_Final_txn_exch_rate
13359                                 ,x_final_txn_quantity   => l_Final_txn_Quantity
13360                                 ,x_final_txn_raw_cost   => l_Final_txn_raw_cost
13361                                 ,x_final_txn_burden_cost =>l_Final_txn_burden_cost
13362                                 ,x_final_txn_revenue    => l_Final_txn_revenue
13363                                 ,x_return_status        => l_return_status
13364                                 ,x_msg_data             => l_error_code
13365                                 ,x_stage                => l_stage
13366                                 );
13367                                 --print_msg('End Of Convert_Final_Txn_Cur_Amts API retSts['||l_return_status||']ErrCode['||l_error_code||']');
13368                                 IF l_return_status <> 'S' Then
13369                     			x_return_status := 'E';
13370                                         If rate_rec.fp_budget_version_type in ('ALL','COST') Then
13371                                           If x_raw_cost_rejection_code is NULL Then
13372                                               x_raw_cost_rejection_code := substr(l_error_code,1,30);
13373                                           End If;
13374                                         End If;
13375 				    	/*bug 4474861: for web adi flow, collect the invalid record informations
13376                                      	* to call an api to update the interface table with the web adi error code
13377 				     	*/
13378                                     	IF l_webAdi_calling_context = 'WEBADI_CALCULATE' THEN
13379                                           IF l_error_code = 'PA_FP_PROJ_NO_TXNCONVRATE' THEN
13380                                             -- populating the error tables.
13381                                             -- calling pa_fp_webadi_pkg.process_errors
13382                                             --print_msg('ConvErr:Web ADI context collecting errors');
13383                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.EXTEND(1);
13384                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13385 					      (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).error_code :=
13386 							'PA_FP_WA_TXN_CURR_NO_CONV_RATE';
13387                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13388 						(PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).task_id := z.task_id;
13389                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13390 						(PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).rlm_id :=
13391 						z.resource_list_member_id;
13392                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13393 						(PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).txn_currency :=
13394 						l_txn_currency_code;
13395                                           END IF; -- for the missing txn to txn conv rate only.
13396                                     	END IF; -- webadi context
13397                                         GOTO END_RES_RATE;
13398                 ELSE
13399                     -- derive the rates and amounts
13400                                         If rate_rec.fp_budget_version_type in ('ALL','COST') Then
13401                                             l_txn_currency_code          := l_txn_currency_code_override;
13402                         x_cost_txn_curr_code         := l_txn_currency_code_override;
13403                                                 If (nvl(x_raw_cost,0) <> 0) Then
13404                                                         x_raw_cost := l_Final_txn_raw_cost;
13405                                                         IF nvl(l_txn_plan_quantity,0) <> 0 THEN
13406                                                             x_cost_rate := x_raw_cost/l_txn_plan_quantity;
13407                                                             If l_rw_cost_rate_override is NOT NULL Then
13408                                                                 l_rw_cost_rate_override := x_raw_cost/l_txn_plan_quantity;
13409                                                             End If;
13410                                                         Else
13411                                                             x_cost_rate := null;
13412                                                             l_rw_cost_rate_override := null;
13413                                                         End If;
13414                                                 End If;
13415                                         End If;
13416                                 END IF;
13417                            ELSE
13418 				IF rate_rec.fp_budget_version_type in ('ALL','COST') THEN
13419 				l_txn_currency_code          := l_txn_currency_code_override;
13420 				x_cost_txn_curr_code         := l_txn_currency_code_override;
13421 				END IF;
13422 			    END IF;
13423 
13424                         End If; --}
13425                 End If;  --}
13426                 IF nvl(l_convert_revenue_only_flag,'N') = 'Y' Then --{
13427                         IF  ((l_txn_currency_code_override IS NOT NULL) AND
13428                  (l_txn_currency_code_override <> x_rev_txn_curr_code) AND nvl(x_raw_revenue,0) <> 0 ) THEN  --{
13429                                 l_error_code := NULL;
13430                                 --print_msg('Calling Convert_Final_Txn_Cur_Amts API for revenue txn_currency_code_override['||l_txn_currency_code_override||']');
13431                                 Convert_Final_Txn_Cur_Amts(
13432                                 p_project_id            => g_project_id
13433                                 ,p_budget_version_id    => p_budget_version_id
13434                                 ,p_budget_version_type  => rate_rec.fp_budget_version_type
13435                                 ,p_rate_base_flag       => z.rate_based_flag
13436                                 ,p_exp_org_id           => nvl(z.rate_expenditure_org_id,rate_rec.org_id)
13437                                 ,p_task_id              => NVL(z.task_id,g_task_id)
13438                                 ,p_ei_date              => z.start_date
13439                                 ,p_denom_quantity       => l_txn_plan_quantity
13440                                 ,p_denom_raw_cost       => NULL
13441                                 ,p_denom_burden_cost    => NULL
13442                                 ,p_denom_revenue        => x_raw_revenue
13443                                 ,p_denom_curr_code      => x_rev_txn_curr_code
13444                                 ,p_final_txn_curr_code  => l_txn_currency_code_override
13445                                 ,x_final_txn_rate_type  => l_Final_txn_rate_type
13446                                 ,x_final_txn_rate_date  => l_Final_txn_rate_date
13447                                 ,x_final_txn_exch_rate  => l_Final_txn_exch_rate
13448                                 ,x_final_txn_quantity   => l_Final_txn_Quantity
13449                                 ,x_final_txn_raw_cost   => l_Final_txn_raw_cost
13450                                 ,x_final_txn_burden_cost =>l_Final_txn_burden_cost
13451                                 ,x_final_txn_revenue    => l_Final_txn_revenue
13452                                 ,x_return_status        => l_return_status
13453                                 ,x_msg_data             => l_error_code
13454                                 ,x_stage                => l_stage
13455                                 );
13456                                 --print_msg('End Of Convert_Final_Txn_Cur_Amts API retSts['||l_return_status||']ErrCode['||l_error_code||']');
13457                                 IF l_return_status <> 'S' Then
13458                     			x_return_status := 'E';
13459                                         If rate_rec.fp_budget_version_type in ('ALL','REVENUE') Then
13460                                           If x_revenue_rejection_code is NULL Then
13461                                               x_revenue_rejection_code := substr(l_error_code,1,30);
13462                                           End If;
13463                                         End If;
13464 					/*bug 4474861: for web adi flow, collect the invalid record informations
13465                                         * to call an api to update the interface table with the web adi error code
13466                                         */
13467                                         IF l_webAdi_calling_context = 'WEBADI_CALCULATE' THEN
13468                                           IF l_error_code = 'PA_FP_PROJ_NO_TXNCONVRATE' THEN
13469                                             -- populating the error tables.
13470                                             -- calling pa_fp_webadi_pkg.process_errors
13471                                             --print_msg('ConvErr:Web ADI context collecting errors');
13472                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.EXTEND(1);
13473                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13474                                               (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).error_code :=
13475                                                         'PA_FP_WA_TXN_CURR_NO_CONV_RATE';
13476                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13477                                                 (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).task_id := z.task_id;
13478                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13479                                                 (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).rlm_id :=
13480                                                 z.resource_list_member_id;
13481                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13482                                                 (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).txn_currency :=
13483                                                 l_txn_currency_code;
13484                                           END IF; -- for the missing txn to txn conv rate only.
13485                                         END IF; -- webadi context
13486                                         GOTO END_RES_RATE;
13487                                 ELSE
13488                                         -- derive the rates and amounts
13489                     l_txn_currency_code          := l_txn_currency_code_override;
13490                                         x_rev_txn_curr_code          := l_txn_currency_code_override;
13491                                         If rate_rec.fp_budget_version_type in ('ALL','REVENUE') Then
13492                                           If (nvl(x_raw_revenue,0) <> 0 ) Then
13493                                               x_raw_revenue := l_Final_txn_revenue;
13494                                               IF nvl(l_txn_plan_quantity,0) <> 0 THEN
13495                                                  x_bill_rate := x_raw_revenue / l_txn_plan_quantity;
13496                                                  If l_bill_rate_override is NOT NULL Then
13497                                                     l_bill_rate_override := x_raw_revenue / l_txn_plan_quantity;
13498                                                  End If;
13499                                               Else
13500                                                  x_bill_rate := NULL;
13501                                                  l_bill_rate_override := NULL;
13502                                               End If;
13503                                           End If;
13504                                         End If;
13505                                 End If;
13506 
13507                         End If;  --}
13508                 End If; --}
13509                 IF nvl(l_ra_txn_currency_api_call,'N') = 'Y' Then --{
13510 
13511             --Note: Ehancements: If Cost and Revenue currencies are different, then both will be
13512             --converted to one currency on the following logic:
13513             --For approved revenue budget convert both cost and revenue to project functional currency
13514             --Else convert revenue to Cost currency
13515 
13516             IF g_bv_approved_rev_flag  = 'Y' THEN
13517                 --Convert Cost to Projfunc Currency
13518                 If (x_cost_txn_curr_code <> rate_rec.projfunc_currency_code AND
13519                  (nvl(x_raw_cost,0) <> 0 OR nvl(x_burden_cost,0) <> 0 )) Then --{
13520 
13521                     l_error_code := NULL;
13522                 --print_msg('Calling Convert_Final_Txn_Cur_Amts API for Cost amts');
13523                 Convert_Final_Txn_Cur_Amts(
13524                         p_project_id            => g_project_id
13525                         ,p_budget_version_id    => p_budget_version_id
13526                         ,p_budget_version_type  => rate_rec.fp_budget_version_type
13527                         ,p_rate_base_flag       => z.rate_based_flag
13528                         ,p_exp_org_id           => nvl(z.rate_expenditure_org_id,rate_rec.org_id)
13529                         ,p_task_id              => NVL(z.task_id,g_task_id)
13530                         ,p_ei_date              => z.start_date
13531                         ,p_denom_quantity       => l_txn_plan_quantity
13532                         ,p_denom_raw_cost       => x_raw_cost
13533                 ,p_denom_burden_cost    => x_burden_cost
13534                 ,p_denom_revenue        => NULL
13535                         ,p_denom_curr_code      => x_cost_txn_curr_code
13536                         ,p_final_txn_curr_code  => rate_rec.projfunc_currency_code
13537                         ,x_final_txn_rate_type  => l_Final_txn_rate_type
13538                         ,x_final_txn_rate_date  => l_Final_txn_rate_date
13539                         ,x_final_txn_exch_rate  => l_Final_txn_exch_rate
13540                         ,x_final_txn_quantity   => l_Final_txn_Quantity
13541                         ,x_final_txn_raw_cost   => l_Final_txn_raw_cost
13542                         ,x_final_txn_burden_cost =>l_Final_txn_burden_cost
13543                         ,x_final_txn_revenue    => l_Final_txn_revenue
13544                         ,x_return_status        => l_return_status
13545                         ,x_msg_data             => l_error_code
13546                         ,x_stage                => l_stage
13547                         );
13548                 --print_msg('End Of Convert_Final_Txn_Cur_Amts API retSts['||l_return_status||']ErrCode['||l_error_code||']');
13549                 IF l_return_status <> 'S' Then
13550                     If rate_rec.fp_budget_version_type in ('ALL','COST') Then
13551                       If x_raw_cost_rejection_code is NULL Then
13552                           x_raw_cost_rejection_code := substr(l_error_code,1,30);
13553                       End If;
13554                       If x_burden_cost_rejection_code is NULL Then
13555                                               x_burden_cost_rejection_code := substr(l_error_code,1,30);
13556                       End If;
13557                     End If;
13558 			/*bug 4474861: for web adi flow, collect the invalid record informations
13559                                         * to call an api to update the interface table with the web adi error code
13560                                         */
13561                                         IF l_webAdi_calling_context = 'WEBADI_CALCULATE' THEN
13562                                           IF l_error_code = 'PA_FP_PROJ_NO_TXNCONVRATE' THEN
13563                                             -- populating the error tables.
13564                                             -- calling pa_fp_webadi_pkg.process_errors
13565                                             --print_msg('ConvErr:Web ADI context collecting errors');
13566                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.EXTEND(1);
13567                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13568                                               (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).error_code :=
13569                                                         'PA_FP_WA_TXN_CURR_NO_CONV_RATE';
13570                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13571                                                 (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).task_id := z.task_id;
13572                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13573                                                 (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).rlm_id :=
13574                                                 z.resource_list_member_id;
13575                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13576                                                 (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).txn_currency :=
13577                                                 l_txn_currency_code;
13578                                           END IF; -- for the missing txn to txn conv rate only.
13579                                         END IF; -- webadi context
13580                     		GOTO END_RES_RATE;
13581                 ELSE
13582                     -- derive the rates and amounts
13583                     If rate_rec.fp_budget_version_type in ('ALL','COST') Then
13584                         l_txn_currency_code := rate_rec.projfunc_currency_code ;
13585                         If (nvl(x_raw_cost,0) <> 0) Then
13586                             x_raw_cost := l_Final_txn_raw_cost;
13587                             IF nvl(l_txn_plan_quantity,0) <> 0 THEN
13588                                 x_cost_rate := x_raw_cost/l_txn_plan_quantity;
13589                                 If l_rw_cost_rate_override is NOT NULL Then
13590                                 l_rw_cost_rate_override := x_raw_cost/l_txn_plan_quantity;
13591                                 End If;
13592                             Else
13593                                 x_cost_rate := null;
13594                                 l_rw_cost_rate_override := null;
13595                             End If;
13596                         End If;
13597                         If (nvl(x_burden_cost,0) <> 0)  Then
13598                             x_burden_cost := l_Final_txn_burden_cost;
13599                             IF nvl(l_txn_plan_quantity,0) <> 0 THEN
13600                                 x_burden_cost_rate := x_burden_cost/l_txn_plan_quantity;
13601                                 If l_burden_cost_rate_override is NOT NULL Then
13602                                 l_burden_cost_rate_override := x_burden_cost/l_txn_plan_quantity;
13603                                 End If;
13604                             Else
13605                                 x_burden_cost_rate := NULL;
13606                                 l_burden_cost_rate_override := NULL;
13607                             End If;
13608                         End If;
13609                     End If;
13610                 End If;
13611             End If;  --}
13612            End If;  -- end of approved revenue budget
13613           END IF;  --}
13614 
13615           IF nvl(l_ra_txn_currency_api_call,'N') = 'Y' AND
13616             (g_bv_approved_rev_flag  = 'Y' OR (x_rev_txn_curr_code <> x_cost_txn_curr_code)) Then  --{
13617 
13618            --set Revenue to ProjFunc currency or Cost currency
13619             If g_bv_approved_rev_flag = 'Y' Then
13620             l_rev_to_cost_conv_cur := rate_rec.projfunc_currency_code;
13621             Else
13622             l_rev_to_cost_conv_cur := x_cost_txn_curr_code;
13623             End If;
13624             --Convert Revenue to ProjFunc currency
13625             If (x_rev_txn_curr_code <> l_rev_to_cost_conv_cur AND nvl(x_raw_revenue,0) <> 0 )  Then
13626                                 l_error_code := NULL;
13627                                 --print_msg('Calling Convert_Final_Txn_Cur_Amts API for l_rev_to_cost_conv_cur['||l_rev_to_cost_conv_cur||']');
13628                                 Convert_Final_Txn_Cur_Amts(
13629                                 p_project_id            => g_project_id
13630                                 ,p_budget_version_id    => p_budget_version_id
13631                                 ,p_budget_version_type  => rate_rec.fp_budget_version_type
13632                                 ,p_rate_base_flag       => z.rate_based_flag
13633                                 ,p_exp_org_id           => nvl(z.rate_expenditure_org_id,rate_rec.org_id)
13634                                 ,p_task_id              => NVL(z.task_id,g_task_id)
13635                                 ,p_ei_date              => z.start_date
13636                                 ,p_denom_quantity       => l_txn_plan_quantity
13637                                 ,p_denom_raw_cost       => NULL
13638                                 ,p_denom_burden_cost    => NULL
13639                                 ,p_denom_revenue        => x_raw_revenue
13640                                 ,p_denom_curr_code      => x_rev_txn_curr_code
13641                                 ,p_final_txn_curr_code  => l_rev_to_cost_conv_cur
13642                                 ,x_final_txn_rate_type  => l_Final_txn_rate_type
13643                                 ,x_final_txn_rate_date  => l_Final_txn_rate_date
13644                                 ,x_final_txn_exch_rate  => l_Final_txn_exch_rate
13645                                 ,x_final_txn_quantity   => l_Final_txn_Quantity
13646                                 ,x_final_txn_raw_cost   => l_Final_txn_raw_cost
13647                                 ,x_final_txn_burden_cost =>l_Final_txn_burden_cost
13648                                 ,x_final_txn_revenue    => l_Final_txn_revenue
13649                                 ,x_return_status        => l_return_status
13650                                 ,x_msg_data             => l_error_code
13651                                 ,x_stage                => l_stage
13652                                 );
13653                                 --print_msg('End Of Convert_Final_Txn_Cur_Amts API retSts['||l_return_status||']ErrCode['||l_error_code||']');
13654                                 IF l_return_status <> 'S' Then
13655                         		If rate_rec.fp_budget_version_type in ('ALL','REVENUE') Then
13656                                           If x_revenue_rejection_code is NULL Then
13657                                               x_revenue_rejection_code := substr(l_error_code,1,30);
13658                                           End If;
13659                                         End If;
13660 					/*bug 4474861: for web adi flow, collect the invalid record informations
13661                                         * to call an api to update the interface table with the web adi error code
13662                                         */
13663                                         IF l_webAdi_calling_context = 'WEBADI_CALCULATE' THEN
13664                                           IF l_error_code = 'PA_FP_PROJ_NO_TXNCONVRATE' THEN
13665                                             -- populating the error tables.
13666                                             -- calling pa_fp_webadi_pkg.process_errors
13667                                             --print_msg('ConvErr:Web ADI context collecting errors');
13668                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.EXTEND(1);
13669                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13670                                               (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).error_code :=
13671                                                         'PA_FP_WA_TXN_CURR_NO_CONV_RATE';
13672                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13673                                                 (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).task_id := z.task_id;
13674                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13675                                                 (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).rlm_id :=
13676                                                 z.resource_list_member_id;
13677                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13678                                                 (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).txn_currency :=
13679                                                 l_txn_currency_code;
13680                                           END IF; -- for the missing txn to txn conv rate only.
13681                                         END IF; -- webadi context
13682                     			GOTO END_RES_RATE;
13683                                 ELSE
13684                                         -- derive the rates and amounts
13685                     l_txn_currency_code := l_rev_to_cost_conv_cur;
13686                                         If rate_rec.fp_budget_version_type in ('ALL','REVENUE') Then
13687                                           If (nvl(x_raw_revenue,0) <> 0 ) Then
13688                                               x_raw_revenue := l_Final_txn_revenue;
13689                           IF nvl(l_txn_plan_quantity,0) <> 0 THEN
13690                                                  x_bill_rate := x_raw_revenue / l_txn_plan_quantity;
13691                                                  If l_bill_rate_override is NOT NULL Then
13692                                                     l_bill_rate_override := x_raw_revenue / l_txn_plan_quantity;
13693                                                  End If;
13694                           Else
13695                          x_bill_rate := NULL;
13696                          l_bill_rate_override := NULL;
13697                           End If;
13698                                           End If;
13699                                         End If;
13700                                 End If;
13701              END IF;
13702         END IF;  --} end of l_ra_txn_currency_api_call
13703                 /* If the budget version is of revenue and related to change order/change request the
13704                 * then transaction currency should be converted into agrment currency
13705                 */
13706                 IF g_ra_bl_txn_currency_code is NULL Then
13707                    If (g_agr_conv_reqd_flag = 'Y' ) Then
13708                         --print_msg('Setting the g_ra_bl_txn_currency_code to AgreementCur');
13709                         g_ra_bl_txn_currency_code := g_agr_currency_code;
13710                    Elsif ( g_wp_version_flag = 'Y'
13711                         AND  g_agr_conv_reqd_flag = 'N'
13712                         AND rate_rec.plan_in_multi_curr_flag = 'N' ) Then
13713                         --print_msg('Setting the g_ra_bl_txn_currency_code to project currency for Multi-Cur disabled project');
13714                         g_ra_bl_txn_currency_code := rate_rec.project_currency_code;
13715                    End If;
13716                 End If;
13717 
13718             l_stage := 824;
13719             --print_msg(to_char(l_stage)||'l_txn_currency_code ['||l_txn_currency_code||'GlobalCur['||g_ra_bl_txn_currency_code||']');
13720             /* For work plan versions we have to ensure that there is only one transaction currency possible for
13721             the entire duration of the task assignment. If the rate API returns a different currency than the one
13722             existing in budget_lines then the rate api returned currency has to be transformed into the budget_line currency
13723             and the rate api amounts and rates will have to be convereted accordingly.
13724         */
13725         IF (( g_wp_version_flag = 'Y' OR  g_agr_conv_reqd_flag = 'Y')
13726                    /* Bug fix::4396300 */
13727                     OR (p_calling_module in ('BUDGET_GENERATION','FORECAST_GENERATION')
13728                     AND caltmp.G_WPRABL_CURRENCY_CODE is NOT NULL ))
13729                    /* Bug fix:4396300 */
13730                 THEN  --{
13731                IF (g_ra_bl_txn_currency_code IS NOT NULL AND (g_ra_bl_txn_currency_code <> l_txn_currency_code)) THEN --{
13732             IF (NVL(x_raw_cost,0) <> 0 OR NVL(x_burden_cost,0) <> 0 OR NVL(x_raw_revenue,0) <> 0 ) THEN   --{
13733                     l_stage := 826;
13734 		    /*
13735                     print_msg(to_char(l_stage)||'Converting x_raw_cost to existing transaction currency');
13736                     print_msg('x_raw_cost => ' || to_char(x_raw_cost));
13737                     print_msg('From l_txn_currency_code => ' || l_txn_currency_code);
13738                     print_msg('To g_ra_bl_txn_currency_code => ' || g_ra_bl_txn_currency_code);
13739 		    */
13740                 l_stage := null;
13741                     l_error_code := NULL;
13742                 --print_msg('Calling Convert_Final_Txn_Cur_Amts API');
13743                 Convert_Final_Txn_Cur_Amts(
13744                         p_project_id            => g_project_id
13745                         ,p_budget_version_id    => p_budget_version_id
13746                         ,p_budget_version_type  => rate_rec.fp_budget_version_type
13747                         ,p_rate_base_flag       => z.rate_based_flag
13748                         ,p_exp_org_id           => nvl(z.rate_expenditure_org_id,rate_rec.org_id)
13749                         ,p_task_id              => NVL(z.task_id,g_task_id)
13750                         ,p_ei_date              => z.start_date
13751                         ,p_denom_quantity       => l_txn_plan_quantity
13752                         ,p_denom_raw_cost       => x_raw_cost
13753                 ,p_denom_burden_cost    => x_burden_cost
13754                 ,p_denom_revenue        => x_raw_revenue
13755                         ,p_denom_curr_code      => l_txn_currency_code
13756                         ,p_final_txn_curr_code  => g_ra_bl_txn_currency_code
13757                         ,x_final_txn_rate_type  => l_Final_txn_rate_type
13758                         ,x_final_txn_rate_date  => l_Final_txn_rate_date
13759                         ,x_final_txn_exch_rate  => l_Final_txn_exch_rate
13760                         ,x_final_txn_quantity   => l_Final_txn_Quantity
13761                         ,x_final_txn_raw_cost   => l_Final_txn_raw_cost
13762                         ,x_final_txn_burden_cost =>l_Final_txn_burden_cost
13763                         ,x_final_txn_revenue    => l_Final_txn_revenue
13764                         ,x_return_status        => l_return_status
13765                         ,x_msg_data             => l_error_code
13766                         ,x_stage                => l_stage
13767                         );
13768                 --print_msg('End Of Convert_Final_Txn_Cur_Amts API retSts['||l_return_status||']ErrCode['||l_error_code||']');
13769                 IF l_return_status <> 'S' Then
13770                     x_return_status := 'E';
13771                     If rate_rec.fp_budget_version_type in ('ALL','COST') Then
13772                       If x_raw_cost_rejection_code is NULL Then
13773                           x_raw_cost_rejection_code := substr(l_error_code,1,30);
13774                       End If;
13775                       If x_burden_cost_rejection_code is NULL Then
13776                                               x_burden_cost_rejection_code := substr(l_error_code,1,30);
13777                       End If;
13778                     End If;
13779                     If rate_rec.fp_budget_version_type in ('ALL','REVENUE') Then
13780                       If x_revenue_rejection_code is NULL Then
13781                                               x_revenue_rejection_code := substr(l_error_code,1,30);
13782                       End If;
13783                     End If;
13784 				/*bug 4474861: for web adi flow, collect the invalid record informations
13785                                         * to call an api to update the interface table with the web adi error code
13786                                         */
13787                                         IF l_webAdi_calling_context = 'WEBADI_CALCULATE' THEN
13788                                           IF l_error_code = 'PA_FP_PROJ_NO_TXNCONVRATE' THEN
13789                                             -- populating the error tables.
13790                                             -- calling pa_fp_webadi_pkg.process_errors
13791                                             --print_msg('ConvErr:Web ADI context collecting errors');
13792                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.EXTEND(1);
13793                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13794                                               (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).error_code :=
13795                                                         'PA_FP_WA_TXN_CURR_NO_CONV_RATE';
13796                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13797                                                 (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).task_id := z.task_id;
13798                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13799                                                 (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).rlm_id :=
13800                                                 z.resource_list_member_id;
13801                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13802                                                 (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).txn_currency :=
13803                                                 l_txn_currency_code;
13804                                           END IF; -- for the missing txn to txn conv rate only.
13805                                         END IF; -- webadi context
13806                     	GOTO END_RES_RATE;
13807                 ELSE
13808                     --derive the rates and amounts
13809                     l_txn_currency_code          := g_ra_bl_txn_currency_code;
13810                     If rate_rec.fp_budget_version_type in ('ALL','COST') Then
13811                         If (nvl(x_raw_cost,0) <> 0) Then
13812                             x_raw_cost := l_Final_txn_raw_cost;
13813                             IF nvl(l_txn_plan_quantity,0) <> 0 THEN
13814                                 x_cost_rate := x_raw_cost/l_txn_plan_quantity;
13815                                 If l_rw_cost_rate_override is NOT NULL Then
13816                                 l_rw_cost_rate_override := x_raw_cost/l_txn_plan_quantity;
13817                                 End If;
13818                              Else
13819                                 x_cost_rate := NULL;
13820                                 l_rw_cost_rate_override := NULL;
13821                              End If;
13822                         End If;
13823                         If (nvl(x_burden_cost,0) <> 0)  Then
13824                             x_burden_cost := l_Final_txn_burden_cost;
13825                             IF nvl(l_txn_plan_quantity,0) <> 0 THEN
13826                                 x_burden_cost_rate := x_burden_cost/l_txn_plan_quantity;
13827                                 If l_burden_cost_rate_override is NOT NULL Then
13828                                 l_burden_cost_rate_override := x_burden_cost/l_txn_plan_quantity;
13829                                 End If;
13830                              Else
13831                                  x_burden_cost_rate := NULL;
13832                                  l_burden_cost_rate_override := NULL;
13833                              End If;
13834                         End If;
13835                     End If;
13836                     If rate_rec.fp_budget_version_type in ('ALL','REVENUE') Then
13837                         If (nvl(x_raw_revenue,0) <> 0 ) Then
13838                             x_raw_revenue := l_Final_txn_revenue;
13839                             If nvl(l_txn_plan_quantity,0) <> 0 THEN
13840                                 x_bill_rate := x_raw_revenue / l_txn_plan_quantity;
13841                                 If l_bill_rate_override is NOT NULL Then
13842                                 l_bill_rate_override := x_raw_revenue / l_txn_plan_quantity;
13843                                 End If;
13844                             Else
13845                                 x_bill_rate := NULL;
13846                                 l_bill_rate_override := NULL;
13847                             End If;
13848                         End If;
13849                     End If;
13850                 END IF;
13851                 END IF;  --}
13852                 END IF;  --} end of g_ra_bl_txn_currency_code IS NOT NULL
13853             END IF; --}  end of g_wp_version_flag = 'Y' OR  g_agr_conv_reqd_flag = 'Y'
13854         END IF; --} end of track workplan flag = 'N'
13855         <<END_RES_RATE>>
13856             --print_msg('AFter calling get planning rate api');
13857                 /* For workplan context, Always retain one currency per resource */
13858                 IF  ( g_wp_version_flag = 'Y' AND g_ra_bl_txn_currency_code IS NULL and g_agr_conv_reqd_flag = 'N' ) THEN
13859                         /* set the global currency if its null after calling the rate api */
13860                         g_ra_bl_txn_currency_code := l_txn_currency_code;
13861                         --print_msg(' g_ra_bl_txn_currency_code set to RateAPIl_txn_currency_code['||g_ra_bl_txn_currency_code||']');
13862                 END IF;
13863         IF ( g_wp_version_flag = 'Y' OR g_agr_conv_reqd_flag = 'Y'
13864                    /* Bug fix::4396300 */
13865                     OR (p_calling_module in ('BUDGET_GENERATION','FORECAST_GENERATION')
13866                     AND caltmp.G_WPRABL_CURRENCY_CODE is NOT NULL )) THEN
13867                    /* Bug fix:4396300 */
13868                         IF  (g_ra_bl_txn_currency_code IS NOT NULL AND
13869                                 g_ra_bl_txn_currency_code <> l_txn_currency_code) Then
13870                                 l_txn_currency_code := g_ra_bl_txn_currency_code;
13871                         End If;
13872                 End If;
13873 
13874         /* Start of rounding enhancements: derive final txn currency*/
13875         IF rate_rec.track_workplan_costs_flag = 'Y' Then --{
13876            If ((nvl(x_raw_cost,0) <> 0 OR nvl(x_burden_cost,0) <> 0 OR nvl(x_raw_revenue,0) <> 0 ) AND
13877                       (nvl(x_raw_cost_rejection_code,'XX') NOT IN ('PA_FP_PROJ_NO_TXNCONVRATE')
13878                and nvl(x_burden_cost_rejection_code,'XX') NOT IN ('PA_FP_PROJ_NO_TXNCONVRATE')
13879                and nvl(x_revenue_rejection_code,'XX') NOT IN ('PA_FP_PROJ_NO_TXNCONVRATE'))) Then  --{
13880             --print_msg('Converting txn amounts to final txn currency code From['||l_txn_currency_code||']To['||l_Final_Txn_Currency_code||']');
13881             IF l_txn_currency_code IS NOT NULL AND l_Final_Txn_Currency_code IS NOT NULL Then --{
13882               IF (l_txn_currency_code <> l_Final_Txn_Currency_code) Then  --{
13883                     l_error_code := NULL;
13884                 --print_msg('Calling Convert_Final_Txn_Cur_Amts API');
13885                 Convert_Final_Txn_Cur_Amts(
13886                         p_project_id            => g_project_id
13887                         ,p_budget_version_id    => p_budget_version_id
13888                         ,p_budget_version_type  => rate_rec.fp_budget_version_type
13889                         ,p_rate_base_flag       => z.rate_based_flag
13890                         ,p_exp_org_id           => nvl(z.rate_expenditure_org_id,rate_rec.org_id)
13891                         ,p_task_id              => NVL(z.task_id,g_task_id)
13892                         ,p_ei_date              => z.start_date
13893                         ,p_denom_quantity       => l_txn_plan_quantity
13894                         ,p_denom_raw_cost       => x_raw_cost
13895                 ,p_denom_burden_cost    => x_burden_cost
13896                 ,p_denom_revenue        => x_raw_revenue
13897                         ,p_denom_curr_code      => l_txn_currency_code
13898                         ,p_final_txn_curr_code  => l_Final_Txn_Currency_code
13899                         ,x_final_txn_rate_type  => l_Final_txn_rate_type
13900                         ,x_final_txn_rate_date  => l_Final_txn_rate_date
13901                         ,x_final_txn_exch_rate  => l_Final_txn_exch_rate
13902                         ,x_final_txn_quantity   => l_Final_txn_Quantity
13903                         ,x_final_txn_raw_cost   => l_Final_txn_raw_cost
13904                         ,x_final_txn_burden_cost =>l_Final_txn_burden_cost
13905                         ,x_final_txn_revenue    => l_Final_txn_revenue
13906                         ,x_return_status        => l_return_status
13907                         ,x_msg_data             => l_error_code
13908                         ,x_stage                => l_stage
13909                         );
13910                 --print_msg('End Of Convert_Final_Txn_Cur_Amts API retSts['||l_return_status||']ErrCode['||l_error_code||']');
13911                 IF l_return_status <> 'S' Then
13912                     If rate_rec.fp_budget_version_type in ('ALL','COST') Then
13913                       If x_raw_cost_rejection_code is NULL Then
13914                           x_raw_cost_rejection_code := substr(l_error_code,1,30);
13915                       End If;
13916                       If x_burden_cost_rejection_code is NULL Then
13917                                               x_burden_cost_rejection_code := substr(l_error_code,1,30);
13918                       End If;
13919                     End If;
13920                     If rate_rec.fp_budget_version_type in ('ALL','REVENUE') Then
13921                       If x_revenue_rejection_code is NULL Then
13922                                               x_revenue_rejection_code := substr(l_error_code,1,30);
13923                       End If;
13924                     End If;
13925 			/*bug 4474861: for web adi flow, collect the invalid record informations
13926                                         * to call an api to update the interface table with the web adi error code
13927                                         */
13928                                         IF l_webAdi_calling_context = 'WEBADI_CALCULATE' THEN
13929                                           IF l_error_code = 'PA_FP_PROJ_NO_TXNCONVRATE' THEN
13930                                             -- populating the error tables.
13931                                             -- calling pa_fp_webadi_pkg.process_errors
13932                                             --print_msg('ConvErr:Web ADI context collecting errors');
13933                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.EXTEND(1);
13934                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13935                                               (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).error_code :=
13936                                                         'PA_FP_WA_TXN_CURR_NO_CONV_RATE';
13937                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13938                                                 (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).task_id := z.task_id;
13939                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13940                                                 (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).rlm_id :=
13941                                                 z.resource_list_member_id;
13942                                             PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl
13943                                                 (PA_FP_WEBADI_PKG.g_fp_webadi_rec_tbl.COUNT).txn_currency :=
13944                                                 l_txn_currency_code;
13945                                           END IF; -- for the missing txn to txn conv rate only.
13946                                         END IF; -- webadi context
13947 				GOTO END_RES_RATE;
13948                 ELSE
13949 
13950 
13951                                 /* set the global currency to final txn currency code */
13952                                 IF  ( g_wp_version_flag = 'Y' AND g_ra_bl_txn_currency_code IS NOT NULL
13953                         and g_agr_conv_reqd_flag = 'N' AND l_Final_Txn_currency_code is NOT NULL ) THEN
13954                         If g_ra_bl_txn_currency_code <> l_Final_Txn_currency_code Then
13955                                         g_ra_bl_txn_currency_code := NVL(l_Final_Txn_currency_code,l_txn_currency_code);
13956                                         --print_msg(' g_ra_bl_txn_currency_code set to finalTxnCur['||l_Final_Txn_currency_code||']');
13957                         End If;
13958                             END IF;
13959                     /* derive the rates and amounts */
13960                     If rate_rec.fp_budget_version_type in ('ALL','COST') Then
13961                         If (nvl(x_raw_cost,0) <> 0) Then
13962                             x_raw_cost := l_Final_txn_raw_cost;
13963 
13964 							--bug#12757122
13965 							IF z.rate_based_flag = 'N' Then
13966 								If (nvl(x_raw_cost,0) <> 0 AND (nvl(x_raw_cost,0) <> nvl(l_txn_plan_quantity,0)) ) Then
13967 											l_txn_plan_quantity := x_raw_cost;
13968 											l_rw_cost_rate_override := 1;
13969 								Elsif (nvl(x_raw_cost,0) <> 0 AND (nvl(x_raw_cost,0) = nvl(l_txn_plan_quantity,0)) ) Then
13970 											l_rw_cost_rate_override := 1;
13971 								End If;
13972 							End If;
13973 							-- end of bug#12757122
13974 
13975                             IF nvl(l_txn_plan_quantity,0) <> 0 THEN
13976                                 x_cost_rate := x_raw_cost/l_txn_plan_quantity;
13977                                 If l_rw_cost_rate_override is NOT NULL Then
13978                                 l_rw_cost_rate_override := x_raw_cost/l_txn_plan_quantity;
13979                                 End If;
13980                              Else
13981                                 x_cost_rate := NULL;
13982                                 l_rw_cost_rate_override := NULL;
13983                              End If;
13984                         End If;
13985                         If (nvl(x_burden_cost,0) <> 0)  Then
13986                             x_burden_cost := l_Final_txn_burden_cost;
13987                             IF nvl(l_txn_plan_quantity,0) <> 0 THEN
13988                                 x_burden_cost_rate := x_burden_cost/l_txn_plan_quantity;
13989                                 If l_burden_cost_rate_override is NOT NULL Then
13990                                 l_burden_cost_rate_override := x_burden_cost/l_txn_plan_quantity;
13991                                 End If;
13992                              Else
13993                                  x_burden_cost_rate := NULL;
13994                                  l_burden_cost_rate_override := NULL;
13995                              End If;
13996                         End If;
13997                     End If;
13998                     If rate_rec.fp_budget_version_type in ('ALL','REVENUE') Then
13999                         If (nvl(x_raw_revenue,0) <> 0 ) Then
14000                             x_raw_revenue := l_Final_txn_revenue;
14001 
14002 							--bug#12757122
14003 							  If ( nvl(x_raw_revenue,0) <> 0 AND nvl(x_raw_revenue,0) <> nvl(l_txn_plan_quantity,0) ) Then
14004 											l_txn_plan_quantity := x_raw_revenue;
14005 											l_bill_rate_override := 1;
14006 							  Elsif ( nvl(x_raw_revenue,0) <> 0 AND nvl(x_raw_revenue,0) = nvl(l_txn_plan_quantity,0) ) Then
14007 											l_bill_rate_override := 1;
14008 							  End If;
14009 							  -- end of bug#12757122
14010 
14011                             If nvl(l_txn_plan_quantity,0) <> 0 THEN
14012                                 x_bill_rate := x_raw_revenue / l_txn_plan_quantity;
14013                                 If l_bill_rate_override is NOT NULL Then
14014                                 l_bill_rate_override := x_raw_revenue / l_txn_plan_quantity;
14015                                 End If;
14016                             Else
14017                                 x_bill_rate := NULL;
14018                                 l_bill_rate_override := NULL;
14019                             End If;
14020                         End If;
14021                     End If;
14022                 END IF;
14023                End If;  --}  -- end of txn currency <> final txn currency
14024             END IF;  --}
14025             --print_msg('End of Convert amts to final txn currency');
14026            END IF;  --}
14027                    IF z.rate_based_flag = 'N' Then
14028                         /* For non-rate base resource copy the converted amt to quantity*/
14029                         If (rate_rec.fp_budget_version_type in ('ALL','COST') ) Then
14030                                If (nvl(x_raw_cost,0) <> 0 AND (nvl(x_raw_cost,0) <> nvl(l_txn_plan_quantity,0)) ) Then
14031                                     l_txn_plan_quantity := x_raw_cost;
14032                                     l_rw_cost_rate_override := 1;
14033                    Elsif (nvl(x_raw_cost,0) <> 0 AND (nvl(x_raw_cost,0) = nvl(l_txn_plan_quantity,0)) ) Then
14034                     l_rw_cost_rate_override := 1;
14035                                End If;
14036                    /* Rederiving the rate here overrwrite the rate api derived values
14037                    IF (nvl(l_txn_plan_quantity,0) <> 0 and nvl(x_burden_cost,0) <> 0) Then
14038                                     x_burden_cost_rate := x_burden_cost/l_txn_plan_quantity;
14039                                     If l_burden_cost_rate_override is NOT NULL Then
14040                                        l_burden_cost_rate_override := x_burden_cost/l_txn_plan_quantity;
14041                                     End If;
14042                    End If;
14043                    */
14044                         End If;
14045                         /* for non-rate base resource of revenue only version copy the converted amt to qty */
14046                         If (rate_rec.fp_budget_version_type = 'REVENUE') Then
14047                                If ( nvl(x_raw_revenue,0) <> 0 AND nvl(x_raw_revenue,0) <> nvl(l_txn_plan_quantity,0) ) Then
14048                                     l_txn_plan_quantity := x_raw_revenue;
14049                                     l_bill_rate_override := 1;
14050                    Elsif ( nvl(x_raw_revenue,0) <> 0 AND nvl(x_raw_revenue,0) = nvl(l_txn_plan_quantity,0) ) Then
14051                     l_bill_rate_override := 1;
14052                                End If;
14053                         End If;
14054                    End If;
14055                 End If;  --}
14056         /* End of rounding enhancements: derive final txn currency*/
14057 
14058             --print_msg('AFter rounding enhancements: derive final txn currency API');
14059         /* Bug fix: 3808295: overrides will be populated once the progress is applied
14060                  * on refresh, all the rate and overrides will be wiped out so we need to
14061          * re derive the rate where actuals exists on the budget line
14062                  */
14063         /***Spread enhancements periodic override rates must be retained **
14064         If rate_rec.fp_budget_version_type in ('COST','ALL') Then
14065           IF x_raw_cost_rejection_code is NULL Then
14066             If (nvl(z.txn_init_raw_cost,0) <> 0 AND nvl(l_txn_plan_quantity,0) <> 0) Then
14067             If l_rw_cost_rate_override is NULL Then
14068                   --print_msg('Rederive Cost rate override since actuals exists');
14069                   l_rw_cost_rate_override := x_raw_cost /l_txn_plan_quantity;
14070             End If;
14071             End If;
14072           End If;
14073 
14074           If x_burden_cost_rejection_code is NULL Then
14075            If (nvl(z.txn_init_burdened_cost,0) <> 0 AND nvl(l_txn_plan_quantity,0) <> 0) Then
14076             If l_burden_cost_rate_override is NULL Then
14077                --print_msg('Rederive Burden rate override since actuals exists');
14078                l_burden_cost_rate_override := x_burden_cost / l_txn_plan_quantity;
14079             End If;
14080            End If;
14081           End If;
14082         End If;
14083         If rate_rec.fp_budget_version_type in ('REVENUE','ALL') Then
14084                   If x_revenue_rejection_code is NULL Then
14085                     If (nvl(z.txn_init_revenue,0) <> 0 ANd nvl(l_txn_plan_quantity,0) <> 0) Then
14086                         If l_bill_rate_override is NULL Then
14087                            --print_msg('Rederive Bill rate override since actuals exists');
14088                            l_bill_rate_override := x_raw_revenue/l_txn_plan_quantity;
14089                         End If;
14090                     End If;
14091                   End If;
14092         End If;
14093                  ** added for the bug fix: 3846474, when progress is applied, we derive override rate to retain the
14094                  *  qty, amounts to spread forwards. but after spread and retainig the currency,qty,amounts. we should null out the
14095                  *  override rates where override rates were not exists previously
14096                  **
14097                 IF NVL(p_apply_progress_flag,'N') = 'Y' Then
14098                         IF nvl(p_precedence_progress_flag,'N') = 'N' THEN
14099                               IF z.rate_based_flag = 'N' Then
14100                                   l_rw_cost_rate_override := 1;
14101                               Else
14102                                 l_rw_cost_rate_override := null;
14103                               End If;
14104                               l_burden_cost_rate_override := null;
14105                               --print_msg('setting override rates to NULL for the resources where actuals not present in apply progress mode');
14106                         End If;
14107                 END IF;
14108         *****Periodic override rates must be retained donot rederive the rates *****/
14109 
14110         If rate_rec.fp_budget_version_type in ('COST','ALL') Then
14111           -- set the rates to null if both qty and costs are null
14112           If l_txn_plan_quantity is NULL and x_raw_cost is NULL Then
14113            If nvl(z.init_quantity,0) <> 0 and NVL(z.txn_init_raw_cost,0) <> 0 Then
14114                 l_rw_cost_rate_override := z.rw_cost_rate_override;
14115            Elsif z.rw_cost_rate_override = 0 Then
14116                 l_rw_cost_rate_override := 0;
14117            Else
14118                 l_rw_cost_rate_override := null;
14119                 x_cost_rate := null;
14120            End If;
14121           End If;
14122           If l_txn_plan_quantity is NULL and x_burden_cost is NULL Then
14123            If nvl(z.init_quantity,0) <> 0 and NVL(z.txn_init_burdened_cost,0) <> 0 Then
14124                 l_burden_cost_rate_override := z.burden_cost_rate_override;
14125            Elsif z.burden_cost_rate_override = 0 Then
14126                 l_burden_cost_rate_override := 0;
14127            Else
14128                 l_burden_cost_rate_override := null;
14129                 x_burden_cost_rate := null;
14130            End If;
14131           End If;
14132         End If;
14133         If rate_rec.fp_budget_version_type in ('REVENUE','ALL') Then
14134           -- set the rates to null if both qty and revenue are null
14135           If x_raw_revenue is NULL and l_txn_plan_quantity is NULL Then
14136             if nvl(z.init_quantity,0) <> 0 and NVL(z.txn_init_revenue,0) <> 0 then
14137                 l_bill_rate_override := z.bill_rate_override;
14138             Elsif z.bill_rate_override = 0 Then
14139                 l_bill_rate_override := 0;
14140             Else
14141                 l_bill_rate_override := null;
14142                 x_bill_rate := null;
14143             End If;
14144           End If;
14145         End If;
14146 
14147         --print_msg('AFter calling get planning rate api');
14148                 /* before updating the rollup tmp add the actuals to etc values to make it plan */
14149                 l_txn_plan_quantity := NVL(l_txn_plan_quantity,0) + nvl(z.init_quantity,0);
14150         If l_txn_plan_quantity = 0 and nvl(z.init_quantity,0) = 0 Then
14151             l_txn_plan_quantity := NULL;
14152         End If;
14153                 x_raw_cost := NVL(x_raw_cost,0) + nvl(z.txn_init_raw_cost,0);
14154         If x_raw_cost = 0 and nvl(z.txn_init_raw_cost,0) = 0 Then
14155             x_raw_cost := NULL;
14156         End If;
14157                 x_burden_cost := NVL(x_burden_cost,0) + nvl(z.txn_init_burdened_cost,0);
14158         If x_burden_cost = 0 and nvl(z.txn_init_burdened_cost,0) = 0 Then
14159             x_burden_cost := NULL;
14160         End If;
14161                 x_raw_revenue := NVL(x_raw_revenue,0) + nvl(z.txn_init_revenue,0);
14162         If x_raw_revenue = 0 and nvl(z.txn_init_revenue,0) = 0 Then
14163             x_raw_revenue := NULL;
14164         End If;
14165 
14166                 IF rate_rec.track_workplan_costs_flag = 'N' THEN  --{
14167                         --print_msg(' Finally check - track_workplan_costs_flag = N set all cost and rates to null');
14168                         --set all the override rates and costs to null
14169                                 x_bill_rate                     := null;
14170                                 l_bill_rate_override            := null;
14171                                 x_cost_rate                     := null;
14172                                 l_rw_cost_rate_override         := null;
14173                                 x_burden_cost_rate              := null;
14174                                 l_burden_cost_rate_override     := null;
14175                                 x_raw_cost                      := null;
14176                                 x_burden_cost                   := null;
14177                                 x_raw_revenue                   := null;
14178                                 x_bill_markup_percentage        := null;
14179                                 x_raw_cost_rejection_code       := null;
14180                                 x_burden_cost_rejection_code    := null;
14181                                 x_revenue_rejection_code        := null;
14182                                 x_projfunc_rejection_code       := null;
14183                                 x_project_rejection_code        := null;
14184                                 x_cost_ind_compiled_set_id      := null;
14185         Else
14186                       /* Rounding Enhancements: Null out costs and Rates if plan quantity is zero */
14187 		      /* bug fix:5726773
14188                       If NVL(l_txn_plan_quantity,0) = 0 Then
14189                         x_raw_cost              := NULL;
14190                         x_burden_cost           := NULL;
14191                         x_raw_revenue           := NULL;
14192                         x_cost_rate             := NULL;
14193                         l_rw_cost_rate_override := NULL;
14194                         x_burden_cost_rate      := NULL;
14195                         l_burden_cost_rate_override := NULL;
14196                         x_bill_rate             := NULL;
14197                         l_bill_rate_override    := NULL;
14198                       End If;
14199 		      end of bug fix:5726773**/
14200               IF rate_rec.fp_budget_version_type = 'ALL'  THEN
14201                 /*Bug fix: 3765835 Revenue Generation method : C - Cost, E - Event Based */
14202                 IF p_calling_module IN ('BUDGET_GENERATION','FORECAST_GENERATION')
14203                    --Bug 6722414 When called from ETC client extension, Dont null out revenue amounts.
14204                 AND  NVL(g_from_etc_client_extn_flag,'N')='N' THEN
14205                        IF NVL(l_revenue_generation_method,'W') in ('C','E') Then
14206                         -- set all the revenue params to NULL
14207                         x_bill_rate                            := NULL;
14208                         x_raw_revenue                          := NULL;
14209                         x_bill_markup_percentage               := NULL;
14210                         x_rev_txn_curr_code                    := NULL;
14211                         x_revenue_rejection_code               := NULL;
14212                        End If;
14213                 END IF;
14214                   END IF;
14215 
14216                   IF NVL(x_raw_cost,0) <> 0 Then
14217                             x_raw_cost := pa_currency.round_trans_currency_amt1(x_raw_cost,
14218                     NVL(l_Final_txn_currency_code,l_txn_currency_code));
14219                   End If;
14220 
14221                   IF NVL(x_burden_cost,0) <> 0 Then
14222                         x_burden_cost := pa_currency.round_trans_currency_amt1(x_burden_cost,
14223                                         NVL(l_Final_txn_currency_code,l_txn_currency_code));
14224                   End If;
14225 
14226                   If NVL(x_raw_revenue,0) <> 0 Then
14227                         x_raw_revenue :=  pa_currency.round_trans_currency_amt1(x_raw_revenue,
14228                                         NVL(l_Final_txn_currency_code,l_txn_currency_code));
14229                   End If;
14230         End If;  --}
14231 
14232                 l_stage := 838;
14233 		If P_PA_DEBUG_MODE = 'Y' Then
14234                 print_msg(to_char(l_stage)||'Calling update_rollup_tmp with the following parameters:');
14235                 print_msg(' p_budget_line_id         => '||to_char(l_budget_line_id));
14236         	print_msg('Qtuantity =>'||l_txn_plan_quantity||']');
14237                 print_msg(' p_bill_rate              => '||to_char(x_bill_rate));
14238                 print_msg(' p_bill_rate_override     => '||to_char(l_bill_rate_override));
14239                 print_msg(' p_cost_rate              => '||to_char(x_cost_rate));
14240                 print_msg(' p_rw_cost_rate_override  => '||to_char(l_rw_cost_rate_override));
14241                 print_msg(' p_burden_cost_rate       => '||to_char(x_burden_cost_rate));
14242                 print_msg(' p_burden_cost_rate_override => '||to_char(l_burden_cost_rate_override));
14243                 print_msg(' p_raw_cost               => '||to_char(x_raw_cost));
14244                 print_msg(' p_burden_cost            => '||to_char(x_burden_cost));
14245                 print_msg(' p_raw_revenue            => '||to_char(x_raw_revenue));
14246                 print_msg(' p_bill_markup_percentage => '||to_char(x_bill_markup_percentage));
14247                 print_msg(' p_txn_curr_code          => '||l_txn_currency_code||'FinalTxnCur['||l_Final_Txn_Currency_Code||']');
14248                 print_msg(' g_ra_bl_txn_currency_code => '||g_ra_bl_txn_currency_code);
14249                 print_msg(' p_raw_cost_rejection_code => '||x_raw_cost_rejection_code);
14250                 print_msg(' p_burden_cost_rejection_code=> '||x_burden_cost_rejection_code);
14251                 print_msg(' p_revenue_rejection_code   => '||x_revenue_rejection_code);
14252                 print_msg(' p_projfunc_rejection_code  => '||x_projfunc_rejection_code);
14253                 print_msg(' p_project_rejection_code   => '||x_project_rejection_code);
14254                 print_msg(' p_cost_ind_compiled_set_id => '||to_char(x_cost_ind_compiled_set_id));
14255 		End if;
14256 
14257         /* recalculate markup percentage when bill rate or revenue is overriden */
14258         If x_raw_revenue is NOT NULL Then
14259            If l_bill_rate_override is NOT NULL Then
14260             If x_bill_markup_percentage is NULL AND l_bill_markup_percentage is NOT NULL Then
14261                 x_bill_markup_percentage := (((x_raw_revenue - x_raw_cost )/x_raw_cost)*100)  ;
14262             End If;
14263            End If;
14264         End If;
14265         /* Now populate plsql tables for bulk update */
14266         l_rl_cntr := l_rl_cntr + 1;
14267         l_rlt_budget_line_id_tab(l_rl_cntr)            := l_budget_line_id;
14268                 l_rlt_quantity_tab(l_rl_cntr)                  := l_txn_plan_quantity;
14269                 l_rlt_bill_rate_tab(l_rl_cntr)                 := x_bill_rate;
14270                 l_rlt_bill_rate_ovr_tab(l_rl_cntr)             := l_bill_rate_override;
14271                 l_rlt_cost_rate_tab(l_rl_cntr)                 := x_cost_rate;
14272                 l_rlt_rw_cost_rate_ovr_tab(l_rl_cntr)          := l_rw_cost_rate_override;
14273                 l_rlt_burden_cost_rate_tab(l_rl_cntr)          := x_burden_cost_rate;
14274                 l_rlt_burden_cost_rate_ovr_tab(l_rl_cntr)      := l_burden_cost_rate_override;
14275                 l_rlt_raw_cost_tab(l_rl_cntr)                  := x_raw_cost;
14276                 l_rlt_burden_cost_tab(l_rl_cntr)               := x_burden_cost;
14277                 l_rlt_raw_revenue_tab(l_rl_cntr)               := x_raw_revenue;
14278                 l_rlt_bill_markup_percent_tab(l_rl_cntr)       := x_bill_markup_percentage;
14279                 l_rlt_txn_curr_code_tab(l_rl_cntr)             := NVL(l_Final_txn_currency_code,l_txn_currency_code);
14280                 l_rlt_raw_cost_rejection_tab(l_rl_cntr)        := x_raw_cost_rejection_code;
14281                 l_rlt_burden_rejection_tab(l_rl_cntr)     := x_burden_cost_rejection_code;
14282                 l_rlt_revenue_rejection_tab(l_rl_cntr)         := x_revenue_rejection_code;
14283                 l_rlt_projfunc_rejection_tab(l_rl_cntr)        := x_projfunc_rejection_code;
14284                 l_rlt_project_rejection_tab(l_rl_cntr)         := x_project_rejection_code;
14285                 l_rlt_ind_compiled_set_tab(l_rl_cntr)     := x_cost_ind_compiled_set_id;
14286 
14287 
14288         END LOOP;  --}
14289 
14290     -- main loooooooooop ends here
14291     END LOOP;  --}}
14292 
14293     /** Bug fix: 4207221 This condition is not updating the rollup tmp with rejections
14294      If NVL(l_return_status,'S') = 'S' Then
14295      **/
14296     IF l_rlt_budget_line_id_tab.COUNT > 0 Then
14297        FORALL i IN l_rlt_budget_line_id_tab.FIRST .. l_rlt_budget_line_id_tab.LAST
14298         UPDATE PA_FP_ROLLUP_TMP RL
14299         SET RL.QUANTITY = l_rlt_quantity_tab(i)
14300                   ,RL.BILL_RATE = l_rlt_bill_rate_tab(i)
14301                    ,RL.BILL_RATE_OVERRIDE = l_rlt_bill_rate_ovr_tab(i)
14302                    ,RL.COST_RATE = l_rlt_cost_rate_tab(i)
14303                    ,RL.RW_COST_RATE_OVERRIDE = l_rlt_rw_cost_rate_ovr_tab(i)
14304                    ,RL.BURDEN_COST_RATE = l_rlt_burden_cost_rate_tab(i)
14305                    ,RL.BURDEN_COST_RATE_OVERRIDE = l_rlt_burden_cost_rate_ovr_tab(i)
14306                    ,RL.TXN_RAW_COST = l_rlt_raw_cost_tab(i)
14307                    ,RL.TXN_BURDENED_COST = l_rlt_burden_cost_tab(i)
14308                    ,RL.TXN_REVENUE = l_rlt_raw_revenue_tab(i)
14309                    ,RL.BILL_MARKUP_PERCENTAGE = l_rlt_bill_markup_percent_tab(i)
14310                    ,RL.TXN_CURRENCY_CODE = l_rlt_txn_curr_code_tab(i)
14311                    ,RL.COST_REJECTION_CODE = l_rlt_raw_cost_rejection_tab(i)
14312                    ,RL.BURDEN_REJECTION_CODE = l_rlt_burden_rejection_tab(i)
14313                    ,RL.REVENUE_REJECTION_CODE = l_rlt_revenue_rejection_tab(i)
14314                    ,RL.PFC_CUR_CONV_REJECTION_CODE = l_rlt_projfunc_rejection_tab(i)
14315                    ,RL.PC_CUR_CONV_REJECTION_CODE = l_rlt_project_rejection_tab(i)
14316                    ,RL.COST_IND_COMPILED_SET_ID = l_rlt_ind_compiled_set_tab(i)
14317            ,RL.SYSTEM_REFERENCE5 = 'Y'
14318         WHERE RL.BUDGET_LINE_ID = l_rlt_budget_line_id_tab(i);
14319     END IF;
14320     x_return_status := NVL(l_return_status,'S');
14321     IF p_pa_debug_mode = 'Y' Then
14322     	   print_msg('Leaving Get_Res_Rates API sts['||x_return_status||']');
14323             pa_debug.reset_err_stack;
14324     End If;
14325 EXCEPTION
14326     WHEN RATEAPI_UNEXPECTED_ERRORS THEN
14327                 fnd_msg_pub.add_exc_msg
14328                 ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
14329                 ,p_procedure_name => 'Get_Res_Rates.pa_plan_revenue.Get_planning_Rates');
14330                 print_msg(to_char(l_stage)||' substr(SQLERRM,1,240) => '|| substr(SQLERRM,1,240));
14331         IF p_pa_debug_mode = 'Y' Then
14332                     pa_debug.reset_err_stack;
14333         End If;
14334         x_return_status := 'U';
14335                 RAISE;
14336 
14337     WHEN UNEXPECTED_ERRORS THEN
14338         fnd_msg_pub.add_exc_msg
14339                 ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
14340                 ,p_procedure_name => 'Get_Res_Rates:Update_rollupTmp_OvrRates');
14341                 print_msg(to_char(l_stage)||' substr(SQLERRM,1,240) => '|| substr(SQLERRM,1,240));
14342         IF p_pa_debug_mode = 'Y' Then
14343                     pa_debug.reset_err_stack;
14344         End If;
14345         x_return_status := 'U';
14346                 RAISE;
14347     WHEN OTHERS THEN
14348             fnd_msg_pub.add_exc_msg
14349             ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
14350                 ,p_procedure_name => 'Get_Res_Rates');
14351             print_msg(to_char(l_stage)||' substr(SQLERRM,1,240) => '|| substr(SQLERRM,1,240));
14352         IF p_pa_debug_mode = 'Y' Then
14353                 pa_debug.reset_err_stack;
14354         End If;
14355         x_return_status := 'U';
14356         RAISE;
14357 
14358 END Get_Res_RATEs;
14359 
14360 /* Compare the In params value with the existsing budget line values
14361 * and populate the changed flags. Based on these flag apply the
14362 * precedence and set the addl variables to pass it to spread api
14363 */
14364 PROCEDURE Compare_With_BdgtLine_Values
14365          (p_resource_ass_id    IN Number
14366          ,p_txn_currency_code  IN Varchar2
14367          ,p_line_start_date    IN Date
14368          ,p_line_end_date      IN Date
14369      ,p_bdgt_version_type  IN Varchar2
14370      ,p_rate_based_flag    IN Varchar2
14371      ,p_apply_progress_flag IN Varchar2
14372      ,p_resAttribute_changed_flag IN Varchar2
14373      /* Bug fix:4263265 Added these param to avoid deriving rate overrides */
14374          ,p_qty_changed_flag        IN Varchar2
14375          ,p_raw_cost_changed_flag   IN Varchar2
14376          ,p_rw_cost_rate_changed_flag   IN Varchar2
14377          ,p_burden_cost_changed_flag    IN Varchar2
14378          ,p_b_cost_rate_changed_flag    IN Varchar2
14379          ,p_rev_changed_flag            IN Varchar2
14380          ,p_bill_rate_changed_flag      IN Varchar2
14381 	 ,p_revenue_only_entry_flag  IN Varchar2
14382          ,p_txn_currency_code_ovr IN OUT NOCOPY Varchar2
14383          ,p_txn_plan_quantity     IN OUT NOCOPY Number
14384          ,p_txn_raw_cost          IN OUT NOCOPY Number
14385          ,p_txn_raw_cost_rate     IN OUT NOCOPY Number
14386          ,p_txn_rw_cost_rate_override IN OUT NOCOPY Number
14387          ,p_txn_burdened_cost         IN OUT NOCOPY Number
14388          ,p_txn_b_cost_rate           IN OUT NOCOPY Number
14389          ,p_txn_b_cost_rate_override  IN OUT NOCOPY Number
14390          ,p_txn_revenue         IN OUT NOCOPY Number
14391          ,p_txn_bill_rate       IN OUT NOCOPY Number
14392          ,p_txn_bill_rate_override  IN OUT NOCOPY Number
14393          ,x_qty_changed_flag        OUT NOCOPY Varchar2
14394          ,x_raw_cost_changed_flag   OUT NOCOPY Varchar2
14395          ,x_rw_cost_rate_changed_flag   OUT NOCOPY Varchar2
14396          ,x_burden_cost_changed_flag    OUT NOCOPY Varchar2
14397          ,x_b_cost_rate_changed_flag    OUT NOCOPY Varchar2
14398          ,x_rev_changed_flag            OUT NOCOPY Varchar2
14399          ,x_bill_rate_changed_flag      OUT NOCOPY Varchar2
14400          ,x_bill_rt_ovr_changed_flag    OUT NOCOPY Varchar2
14401      ,x_txn_revenue_addl            OUT NOCOPY Number
14402          ,x_txn_raw_cost_addl           OUT NOCOPY Number
14403          ,x_txn_plan_quantity_addl      OUT NOCOPY Number
14404          ,x_txn_burdened_cost_addl      OUT NOCOPY Number
14405      ,x_init_raw_cost               OUT NOCOPY Number
14406      ,x_init_burdened_cost          OUT NOCOPY Number
14407      ,x_init_revenue                OUT NOCOPY Number
14408      ,x_init_quantity               OUT NOCOPY Number
14409          ,x_bl_raw_cost                 OUT NOCOPY Number
14410          ,x_bl_burdened_cost            OUT NOCOPY Number
14411          ,x_bl_revenue                  OUT NOCOPY Number
14412          ,x_bl_quantity                 OUT NOCOPY Number
14413          ) IS
14414 
14415     i get_bl_date_csr%rowtype;
14416     l_actual_exists   varchar2(100);
14417         l_txn_raw_cost_rate         Number ;
14418         l_txn_rw_cost_rate_override Number ;
14419         l_txn_b_cost_rate           Number ;
14420         l_txn_b_cost_rate_override  Number ;
14421         l_txn_bill_rate             Number ;
14422         l_txn_bill_rate_override    Number ;
14423 
14424 BEGIN
14425     -- check the budgetline amounts with the passes in values
14426     -- and assign the values if the params are null. based on this an additional varaibles needs to
14427     -- derived to call the spread api.
14428     x_qty_changed_flag  := 'N';
14429         x_raw_cost_changed_flag  := 'N';
14430         x_rw_cost_rate_changed_flag  := 'N';
14431         x_burden_cost_changed_flag  := 'N';
14432         x_b_cost_rate_changed_flag  := 'N';
14433         x_rev_changed_flag  := 'N';
14434         x_bill_rate_changed_flag  := 'N';
14435     x_txn_revenue_addl         := NULL;
14436         x_txn_raw_cost_addl          := NULL;
14437         x_txn_plan_quantity_addl    := NULL;
14438         x_txn_burdened_cost_addl:= NULL;
14439         l_txn_raw_cost_rate         := p_txn_raw_cost_rate;
14440         l_txn_rw_cost_rate_override := p_txn_rw_cost_rate_override;
14441         l_txn_b_cost_rate           := p_txn_b_cost_rate;
14442         l_txn_b_cost_rate_override  := p_txn_b_cost_rate_override;
14443         l_txn_bill_rate             := p_txn_bill_rate;
14444         l_txn_bill_rate_override    := p_txn_bill_rate_override;
14445 	If P_PA_DEBUG_MODE = 'Y' Then
14446     print_msg('Entered Compare_With_BdgtLine_Values API');
14447 	End if;
14448         i := NULL;
14449         AvgBlRec := NULL;
14450     IF g_source_context = 'RESOURCE_ASSIGNMENT' Then
14451 
14452                 OPEN cur_ra_txn_rates(p_resource_ass_id
14453                                  ,p_txn_currency_code);
14454                 FETCH cur_ra_txn_rates INTO i;
14455                 IF cur_ra_txn_rates%NOTFOUND then
14456                         i := NULL;
14457 			AvgBlRec := NULL;
14458                 End If;
14459                 CLOSE cur_ra_txn_rates;
14460         ELSE
14461 
14462                 OPEN cur_avgBlrts(p_resource_ass_id
14463                                  ,p_txn_currency_code
14464                                  ,p_line_start_Date
14465                                  ,p_line_end_date
14466                                  );
14467                 FETCH cur_avgBlrts INTO AvgBlRec;
14468                 IF cur_avgBlrts%NOTFOUND then
14469                                 AvgBlRec := NULL;
14470                 End If;
14471                 CLOSE cur_avgBlrts;
14472                 OPEN get_bl_date_csr(p_resource_ass_id
14473                                  ,p_txn_currency_code
14474                                  ,p_line_start_Date
14475                                  ,p_line_end_date
14476                         ,AvgBlRec.avg_txn_cost_rate_override
14477                                  ,AvgBlRec.avg_burden_cost_rate_override
14478                                  ,AvgBlRec.avg_txn_bill_rate_override);
14479                 --print_msg('Opened budgetline amts cursor');
14480             FETCH get_bl_date_csr INTO i;
14481             CLOSE get_bl_date_csr;
14482     END IF;
14483 
14484         /* Bug fix:4221022 The generation process is creating budget Lines with unrounded qty and amounts
14485                  * this causes the spread process to create -0.003 lines. In order to avoid this as a precautionary measure
14486                  * before comparing just round the amounts from budget lines also */
14487         If NVL(i.quantity,0) <> 0 Then
14488            If  p_rate_based_flag = 'Y' Then
14489             i.quantity := Round_quantity(i.quantity);
14490            Else
14491             i.quantity := pa_currency.round_trans_currency_amt1(i.quantity,p_txn_currency_code);
14492            End If;
14493         End If;
14494         If NVL(i.txn_raw_cost,0) <> 0 Then
14495             i.txn_raw_cost := pa_currency.round_trans_currency_amt1(i.txn_raw_cost,p_txn_currency_code);
14496         End If;
14497         If NVL(i.txn_burdened_cost,0) <> 0 Then
14498             i.txn_burdened_cost := pa_currency.round_trans_currency_amt1(i.txn_burdened_cost,p_txn_currency_code);
14499         End If;
14500         If NVL(i.txn_revenue,0) <> 0 Then
14501             i.txn_revenue := pa_currency.round_trans_currency_amt1(i.txn_revenue,p_txn_currency_code);
14502         End If;
14503         /* end of bug 4221022 */
14504 
14505                 x_init_raw_cost              := i.init_raw_cost;
14506                 x_init_burdened_cost         := i.init_burdened_cost;
14507                 x_init_revenue               := i.init_revenue;
14508                 x_init_quantity              := i.init_quantity;
14509                 x_bl_raw_cost                := i.txn_raw_cost;
14510                 x_bl_burdened_cost           := i.txn_burdened_cost;
14511                 x_bl_revenue                 := i.txn_revenue;
14512                 x_bl_quantity                := i.quantity;
14513 	If P_PA_DEBUG_MODE = 'Y' Then
14514         print_msg('bletcCstRtOvr['||i.etc_cost_rate_override||']EtcRt['||i.etc_cost_rate||']EtcBurdRtOvr['||i.etc_burden_rate_override||']EtcBdRt['||i.etc_burden_rate||']');
14515 	End if;
14516 
14517     If (x_init_raw_cost is NULL
14518         and x_init_burdened_cost is NULL
14519         and x_init_revenue is NULL
14520         and x_init_quantity is NULL ) Then
14521         l_actual_exists := 'N';
14522     Else
14523         l_actual_exists := 'Y';
14524     End if;
14525 
14526     /* When calculate api is called in apply progress mode, just we need to correct the
14527     * budget line. so no need to apply any precedence rules. so derive all additionals
14528     */
14529      If NVL(p_apply_progress_flag,'N') <> 'Y' Then --{
14530 
14531         /*
14532              Bug 6429285
14533              Below if condition will handle a corner case
14534              If a rate based resource is added as non rate based resource assignment
14535              in pa_resource_asgn_curr and pa_budget_lines quantity will be populated
14536              as raw_cost and display_quantity will be null.Now if we want to enter
14537              the quantity same as raw cost (i.e existing quantity) the existing if condition will fail because
14538              the user entered quantity is same as what is alreay existing
14539              This check is already performed in Compare_bdgtLine_Values*/
14540         /*
14541 
14542         if NVL(p_txn_plan_quantity,0) <> Nvl(i.quantity,0) Then
14543             x_qty_changed_flag := 'Y';
14544         End If;*/
14545 
14546         if ((NVL(p_txn_plan_quantity,0) <> Nvl(i.quantity,0))
14547             or (p_txn_plan_quantity = 0 and i.bl_zero_null_quantity is null)
14548             or (p_txn_plan_quantity is not null and i.display_quantity is null))Then
14549             x_qty_changed_flag := 'Y';
14550         End If;
14551 
14552         If NVL(p_raw_cost_changed_flag,'N') = 'Y' then
14553            if ((NVL(p_txn_raw_cost,0) <> NVL(i.txn_raw_cost,0))
14554         OR (p_txn_raw_cost = 0 AND i.bl_zero_null_rawcost is NULL )) Then /*bug fix:4693839 */
14555             --print_msg('Cost changed ptxncost['||p_txn_raw_cost||']itxncost['||i.txn_raw_cost||']');
14556             x_raw_cost_changed_flag := 'Y';
14557            End If;
14558         End If;
14559 
14560         If NVL(p_rw_cost_rate_changed_flag,'N') = 'Y' Then --{
14561            /* Use actual exists flag to derive / assign the rates */
14562             IF p_txn_rw_cost_rate_override IS NULL Then
14563                 If nvl(p_txn_raw_cost_rate,0) <> nvl(i.etc_cost_rate_override,nvl(i.etc_cost_rate,0)) Then
14564                                         p_txn_rw_cost_rate_override := p_txn_raw_cost_rate;
14565                                         x_rw_cost_rate_changed_flag := 'Y';
14566                                 End If;
14567             Else
14568                 If ((NVL(p_txn_rw_cost_rate_override,0) <>
14569                         nvl(i.etc_cost_rate_override,nvl(i.etc_cost_rate,0)))
14570             OR
14571             ( p_txn_rw_cost_rate_override = 0 AND AvgBlRec.avg_zero_null_cost_rate is NULL ))  Then /*bug fix:4693839 */
14572                         x_rw_cost_rate_changed_flag := 'Y';
14573                 End If;
14574             End If;
14575             if p_txn_rw_cost_rate_override is NULL Then
14576            If ((NVL(p_txn_raw_cost_rate,0) <> nvl(i.etc_cost_rate_override,nvl(i.etc_cost_rate,0)))
14577                     OR ( p_txn_raw_cost_rate = 0 AND AvgBlRec.avg_zero_null_cost_rate is NULL))  Then /*bug fix:4693839 */
14578                      p_txn_rw_cost_rate_override  := NVL(p_txn_raw_cost_rate,i.etc_cost_rate_override);
14579                      x_rw_cost_rate_changed_flag := 'Y';
14580                End If;
14581         End If;
14582         End If; --}
14583 
14584         If NVL(p_burden_cost_changed_flag,'N') = 'Y' Then
14585            if ((NVL(p_txn_burdened_cost,0) <> NVL(i.txn_burdened_cost,0))
14586             OR ( p_txn_burdened_cost = 0 AND i.bl_zero_null_burdencost is NULL )) Then  /*bug fix:4693839 */
14587             x_burden_cost_changed_flag  := 'Y';
14588            End IF;
14589         End If;
14590 
14591         IF NVL(p_b_cost_rate_changed_flag,'N') = 'Y' Then --{
14592            /* start burden cost rate override comparision */
14593                     If p_txn_b_cost_rate_override  is NULL Then
14594                     if NVL(p_txn_b_cost_rate,0) <> NVL(i.etc_burden_rate_override,nvl(i.etc_burden_rate,0)) Then
14595                            p_txn_b_cost_rate_override := p_txn_b_cost_rate;
14596                            x_b_cost_rate_changed_flag := 'Y';
14597                         End If;
14598                     Else
14599                         if ((nvl(p_txn_b_cost_rate_override,0) <> nvl(i.etc_burden_rate_override,NVL(i.etc_burden_rate,0)))
14600                 OR (p_txn_b_cost_rate_override = 0 AND AvgBlRec.avg_zero_null_burden_rate is NULL )) Then /*bug fix:4693839 */
14601                                  x_b_cost_rate_changed_flag := 'Y';
14602                         End If;
14603                     End If;
14604            /* start of burden cost rate comparision */
14605        IF p_txn_b_cost_rate_override is NULL Then
14606             if ( (NVL(p_txn_b_cost_rate,0) <> nvl(i.etc_burden_rate_override,NVL(i.etc_burden_rate,0)))
14607                        OR (p_txn_b_cost_rate = 0  AND AvgBlRec.avg_zero_null_burden_rate is NULL ))  Then /*bug fix:4693839 */
14608                         p_txn_b_cost_rate_override := p_txn_b_cost_rate;
14609                         x_b_cost_rate_changed_flag := 'Y';
14610                 End If;
14611            End If;
14612 	End If; --}
14613 
14614         IF NVL(p_rev_changed_flag,'N') = 'Y' Then
14615           if ((NVL(p_txn_revenue,0) <> NVL(i.txn_revenue,0))
14616           OR (p_txn_revenue = 0 AND i.bl_zero_null_revenue is NULL )) Then /*bug fix:4693839 */
14617             x_rev_changed_flag := 'Y';
14618           End IF;
14619         End IF;
14620 
14621         IF NVL(p_bill_rate_changed_flag,'N') = 'Y' Then --{
14622           /* start of bill rate override comparision*/
14623                     IF p_txn_bill_rate_override  is NULL Then
14624                     if NVL(p_txn_bill_rate,0) <> nvl(i.etc_bill_rate,0) Then
14625                                 p_txn_bill_rate_override  := p_txn_bill_rate;
14626                                 x_bill_rate_changed_flag := 'Y';
14627                         End If;
14628                     Else
14629                         If ((nvl(p_txn_bill_rate_override,0) <> nvl( i.etc_bill_rate_override,0))
14630                 OR (p_txn_bill_rate_override = 0 AND AvgBlRec.avg_zero_null_bill_rate is NULL))  Then /*bug fix:4693839 */
14631                                 x_bill_rate_changed_flag := 'Y';
14632                         End If;
14633                     End If;
14634        If p_txn_bill_rate_override is NULL Then
14635                    if ( (NVL(p_txn_bill_rate,0) <> nvl(i.etc_bill_rate_override,NVl(i.etc_bill_rate,0)))
14636                         OR (p_txn_bill_rate = 0 AND  AvgBlRec.avg_zero_null_bill_rate is NULL))  Then /*bug fix:4693839 */
14637                         p_txn_bill_rate_override  := p_txn_bill_rate;
14638                         x_bill_rate_changed_flag := 'Y';
14639                    End IF;
14640            End If;
14641          END IF; --}
14642        END IF ; --} end of apply progress is not Y
14643 
14644     IF (nvl(p_txn_revenue,0) - nvl(i.txn_revenue,0)) = 0 Then
14645         x_txn_revenue_addl := NULL;
14646     Else
14647         x_txn_revenue_addl :=  (nvl(p_txn_revenue,0) - nvl(i.txn_revenue,0));
14648     End If;
14649 
14650     IF (nvl(p_txn_raw_cost,0) - nvl(i.txn_raw_cost,0)) = 0 Then
14651         x_txn_raw_cost_addl := NULL;
14652     Else
14653         x_txn_raw_cost_addl := (nvl(p_txn_raw_cost,0) - nvl(i.txn_raw_cost,0));
14654     End If;
14655 
14656     IF (nvl(p_txn_plan_quantity,0) - nvl(i.quantity,0)) = 0 Then
14657         x_txn_plan_quantity_addl := NULL;
14658     Else
14659         x_txn_plan_quantity_addl := (nvl(p_txn_plan_quantity,0) - nvl(i.quantity,0));
14660     End If;
14661 
14662     IF (nvl(p_txn_burdened_cost,0) - nvl(i.txn_burdened_cost,0)) = 0 Then
14663         x_txn_burdened_cost_addl := NULL;
14664     Else
14665         x_txn_burdened_cost_addl := (nvl(p_txn_burdened_cost,0) - nvl(i.txn_burdened_cost,0));
14666     End If;
14667 
14668         /* bug fix: 4122263 retain the original rates and overrides */
14669         IF (NVL(p_apply_progress_flag,'N') = 'Y' OR NVL(p_resAttribute_changed_flag,'N') = 'Y' ) Then
14670                 --retain only quantity and set all other flags to N
14671         IF NVL(x_txn_plan_quantity_addl,0) <> 0 Then
14672                     x_qty_changed_flag  := 'Y';
14673         End If;
14674                 x_raw_cost_changed_flag  := 'N';
14675                 x_rw_cost_rate_changed_flag  := 'N';
14676                 x_burden_cost_changed_flag  := 'N';
14677                 x_b_cost_rate_changed_flag  := 'N';
14678                 x_rev_changed_flag  := 'N';
14679                 x_bill_rate_changed_flag  := 'N';
14680                 x_txn_revenue_addl         := NULL;
14681                 x_txn_raw_cost_addl          := NULL;
14682                 x_txn_burdened_cost_addl:= NULL;
14683                 p_txn_raw_cost_rate         := l_txn_raw_cost_rate;
14684                 p_txn_rw_cost_rate_override := l_txn_rw_cost_rate_override;
14685                 p_txn_b_cost_rate           := l_txn_b_cost_rate;
14686                 p_txn_b_cost_rate_override  := l_txn_b_cost_rate_override;
14687                 p_txn_bill_rate             := l_txn_bill_rate;
14688                 p_txn_bill_rate_override    := l_txn_bill_rate_override;
14689         END IF;
14690     IF p_bdgt_version_type in ('COST','ALL') Then
14691        IF p_rate_based_flag = 'N' Then
14692            x_rw_cost_rate_changed_flag := 'N';
14693 	   If p_bdgt_version_type = 'ALL' Then
14694 	     If p_revenue_only_entry_flag = 'Y' Then
14695 		p_txn_rw_cost_rate_override := 0;
14696 	     ElsIf p_txn_rw_cost_rate_override <> 0 Then
14697             	p_txn_rw_cost_rate_override := 1;
14698 	     End If;
14699 	   Else
14700 		If p_txn_rw_cost_rate_override <> 0 Then
14701                    p_txn_rw_cost_rate_override := 1;
14702 		End If;
14703            End If;
14704        End If;
14705     Elsif p_bdgt_version_type in ('REVENUE') Then
14706            IF p_rate_based_flag = 'N' Then
14707                 x_bill_rate_changed_flag := 'N';
14708                 p_txn_bill_rate_override := 1;
14709            End If;
14710     End If;
14711     If P_PA_DEBUG_MODE = 'Y' Then
14712     print_msg('Leaving Compare_With_BdgtLine_Values API');
14713     End if;
14714 EXCEPTION
14715     WHEN OTHERS THEN
14716         RAISE;
14717 
14718 END Compare_With_BdgtLine_Values;
14719 /* This API will apply the precedence rules on Non-Rate Based planning transactions */
14720 PROCEDURE Apply_NON_RATE_BASE_precedence(
14721      p_txn_currency_code        IN Varchar2
14722     ,p_rate_based_flag          IN Varchar2
14723     ,p_budget_version_type      IN Varchar2
14724     ,p_qty_changed_flag         IN Varchar2
14725     ,p_raw_cost_changed_flag    IN Varchar2
14726     ,p_rw_cost_rate_changed_flag IN Varchar2
14727     ,p_burden_cost_changed_flag IN Varchar2
14728     ,p_b_cost_rate_changed_flag IN Varchar2
14729     ,p_rev_changed_flag         IN Varchar2
14730     ,p_bill_rate_changed_flag   IN Varchar2
14731     ,p_bill_rt_ovr_changed_flag IN Varchar2
14732     ,p_init_raw_cost            IN Number
14733     ,p_init_burdened_cost       IN Number
14734     ,p_init_revenue             IN Number
14735     ,p_init_quantity            IN Number
14736     ,p_bl_raw_cost              IN Number
14737     ,p_bl_burdened_cost         IN Number
14738     ,p_bl_revenue               IN Number
14739     ,p_bl_quantity              IN Number
14740     ,p_curr_cost_rate           IN Number
14741     ,p_curr_burden_rate         IN Number
14742     ,p_curr_bill_rate           IN Number
14743     ,p_revenue_only_entry_flag  IN Varchar2
14744     ,x_txn_plan_quantity        IN OUT NOCOPY Number
14745     ,x_txn_raw_cost             IN OUT NOCOPY Number
14746     ,x_txn_raw_cost_rate        IN OUT NOCOPY Number
14747     ,x_txn_rw_cost_rate_override IN OUT NOCOPY Number
14748     ,x_txn_burdened_cost        IN OUT NOCOPY Number
14749     ,x_txn_b_cost_rate          IN OUT NOCOPY Number
14750     ,x_txn_b_cost_rate_override IN OUT NOCOPY Number
14751     ,x_txn_revenue              IN OUT NOCOPY Number
14752     ,x_txn_bill_rate            IN OUT NOCOPY Number
14753     ,x_txn_bill_rate_override   IN OUT NOCOPY Number
14754     ,x_txn_revenue_addl         IN OUT NOCOPY Number
14755     ,x_txn_raw_cost_addl        IN OUT NOCOPY Number
14756     ,x_txn_plan_quantity_addl   IN OUT NOCOPY Number
14757     ,x_txn_burdened_cost_addl   IN OUT NOCOPY Number
14758     ) IS
14759 
14760     l_stage   varchar2(100);
14761 
14762 BEGIN
14763 
14764     -- precedence rules
14765     -- For non-rate based transactions, the cost and rev rate is always 1,
14766     -- any change to rate is ignored
14767     -- if there is change in burden rate override, then burden override
14768     -- must be applied
14769     -- If qty and cost is changed then cost takes the precedence and
14770     -- qty := cost;
14771     -- if qty only changed then cost := qty, If cost only changed then
14772     -- qty := cost
14773 
14774         If p_budget_version_type in ('COST','ALL') THEN
14775             -- Start of Raw cost and qty calculation
14776             -- ignore the rate and rate override
14777             /* For Non rate based transactions ignore any change
14778              * to rate override and always set it to 1 */
14779 	   If g_source_context = 'RESOURCE_ASSIGNMENT' Then
14780 		If p_budget_version_type = 'ALL' then
14781             	   IF nvl(x_txn_rw_cost_rate_override, 1) <> 0 AND p_revenue_only_entry_flag = 'N' THEN
14782 			If p_raw_cost_changed_flag = 'Y' then
14783                		   x_txn_rw_cost_rate_override := 1;
14784 			end If;
14785 	           Elsif p_revenue_only_entry_flag = 'Y' then
14786 			x_txn_rw_cost_rate_override := 0;
14787 		   Else
14788 			If p_raw_cost_changed_flag = 'Y' Then
14789 			  x_txn_rw_cost_rate_override := 1;
14790 			End If;
14791             	   END IF;
14792 		Else  -- for all other versions
14793 		   IF nvl(x_txn_rw_cost_rate_override, 1) <> 0 THEN
14794                         x_txn_rw_cost_rate_override := 1;
14795                    END IF;
14796 		End If;
14797 	   Else
14798 		If p_budget_version_type = 'ALL' then
14799 			If x_txn_rw_cost_rate_override is NULL
14800 			   and x_txn_raw_cost is NULL
14801 			   and p_raw_cost_changed_flag = 'N' Then
14802 			   x_txn_rw_cost_rate_override := 0;
14803 			Else
14804 			   IF nvl(x_txn_rw_cost_rate_override, 1) <> 0 and p_revenue_only_entry_flag = 'N' THEN
14805 				If p_raw_cost_changed_flag = 'Y' then
14806 				  x_txn_rw_cost_rate_override := 1;
14807 				End If;
14808 			   Elsif p_revenue_only_entry_flag = 'Y' Then
14809 				x_txn_rw_cost_rate_override := 0;
14810 			   End If;
14811 			End If;
14812 		Else
14813 		  IF nvl(x_txn_rw_cost_rate_override, 1) <> 0 THEN
14814                         x_txn_rw_cost_rate_override := 1;
14815                   END IF;
14816 		End If;
14817 	   End If;
14818 
14819 
14820         /* Rules:
14821              * C1: when raw cost and quantity both change for the
14822              *     non-rate based resource then Raw cost takes the precedence
14823              *     over quantity and copy raw cost to quantity.
14824          * C2: If raw cost only changes then copy raw cost to quantity.
14825          * C3: If quantity only changes then copy quantity to raw cost.
14826          * C4: Change in raw cost should re-derive burden cost rate
14827          *     override only when the previous burden rate override exists.
14828          */
14829 
14830             /* The following is for the case C1 and C2 - copy raw cost to
14831              * quantity when raw cost changes */
14832             IF (p_qty_changed_flag = 'Y' AND p_raw_cost_changed_flag = 'Y') OR
14833                (p_qty_changed_flag = 'N' AND p_raw_cost_changed_flag = 'Y')
14834             THEN
14835                l_stage := 'NRB - C1 and C2 - raw cost changed';
14836                --print_msg(l_stage);
14837                x_txn_plan_quantity := x_txn_raw_cost; -- copy raw cost to quan
14838                		x_txn_plan_quantity_addl := nvl(x_txn_plan_quantity,0) -
14839                                            nvl(p_bl_quantity,0);
14840                x_txn_raw_cost_addl := nvl(x_txn_raw_cost,0) -
14841                                       nvl(p_bl_raw_cost,0);
14842             /* The following is for the case C3 - copy quantity to raw cost
14843              * when quantity only changes (raw cost is not changed) */
14844             ELSIF (p_qty_changed_flag = 'Y' AND p_raw_cost_changed_flag = 'N')
14845             THEN
14846                l_stage := 'NRB - C3 - quantity changes';
14847                --print_msg(l_stage);
14848                x_txn_raw_cost := x_txn_plan_quantity;-- copy quan to raw cost
14849                -- x_txn_rw_cost_rate_override is set above for all cases.
14850                x_txn_raw_cost_addl := nvl(x_txn_raw_cost,0) -
14851                                       nvl(p_bl_raw_cost,0);
14852                x_txn_plan_quantity_addl := nvl(x_txn_plan_quantity,0) -
14853                                            nvl(p_bl_quantity,0);
14854             END IF;
14855 
14856             /* start of burden cost calculation - change in the qty results
14857                in burden cost variation */
14858         /* When burden cost and burden cost rate both change, then
14859              * burden cost takes the precedence, so re-derive the burden cost
14860              * rate override
14861              * Note: Rates are always calculated as ETC rates i.e.
14862              *       ETC Rate = (burden cost - actual burden cost ) /
14863              *                  (quantity - actual quantity)                */
14864 
14865             IF ((p_qty_changed_flag = 'Y' AND
14866                  p_b_cost_rate_changed_flag = 'Y' AND
14867                  p_burden_cost_changed_flag = 'N') OR
14868                 (p_qty_changed_flag = 'Y' AND
14869                  p_b_cost_rate_changed_flag = 'N' AND
14870                  p_burden_cost_changed_flag = 'N') OR
14871                 (p_qty_changed_flag = 'N' AND
14872                  p_b_cost_rate_changed_flag = 'Y'))
14873             THEN
14874                l_stage := 'PRC:8';
14875                --print_msg(l_stage);
14876                -- No need to check for l_actual_exists
14877                IF (x_txn_plan_quantity IS NOT NULL OR
14878                    p_qty_changed_flag = 'Y')
14879                THEN
14880                    x_txn_burdened_cost := nvl(p_init_burdened_cost,0) +
14881                                           ((nvl(x_txn_plan_quantity ,0) -
14882                                             nvl(p_init_quantity,0)) *
14883                                             nvl(x_txn_b_cost_rate_override,
14884                                                 x_txn_b_cost_rate));
14885                    x_txn_burdened_cost :=
14886                                    pa_currency.round_trans_currency_amt1(
14887                                       x_txn_burdened_cost,p_txn_currency_code);
14888                    x_txn_burdened_cost_addl := nvl(x_txn_burdened_cost,0) -
14889                                                nvl(p_init_burdened_cost,0);
14890                END IF;
14891         /* re-derive the burden cost rate override when burden cost
14892              * is changed */
14893             ELSIF (p_burden_cost_changed_flag = 'Y') THEN
14894 		If p_budget_version_type = 'ALL' then
14895 			iF x_txn_raw_cost = x_txn_plan_quantity then
14896 			   --l_stage := 'PRC:9.1'; print_msg(l_stage);
14897 			   If  (nvl(x_txn_plan_quantity,0) - nvl(p_init_quantity,0)) <> 0 THEN
14898                             x_txn_b_cost_rate_override := (nvl(x_txn_burdened_cost,0) -
14899                                                  nvl(p_init_burdened_cost,0)) /
14900                                                 (nvl(x_txn_plan_quantity,0) -
14901                                                  nvl(p_init_quantity,0));
14902 			   End If;
14903 			Else
14904 			   --l_stage := 'PRC:9.2'; print_msg(l_stage);
14905 			   If (nvl(x_txn_raw_cost,0) - nvl(p_init_raw_cost,0)) <> 0 Then
14906 			    x_txn_b_cost_rate_override := (nvl(x_txn_burdened_cost,0) -
14907                                                  nvl(p_init_burdened_cost,0)) /
14908                                                 (nvl(x_txn_raw_cost,0) -
14909                                                  nvl(p_init_raw_cost,0));
14910 			   End If;
14911                         END IF;
14912 		Else
14913                		l_stage := 'PRC:9.3';
14914                		--print_msg(l_stage);
14915                		IF (nvl(x_txn_plan_quantity,0) - nvl(p_init_quantity,0)) <> 0 THEN
14916                   	    x_txn_b_cost_rate_override := (nvl(x_txn_burdened_cost,0) -
14917                                                  nvl(p_init_burdened_cost,0)) /
14918                                                 (nvl(x_txn_plan_quantity,0) -
14919                                                  nvl(p_init_quantity,0));
14920                		END IF;
14921 		End If;
14922                x_txn_burdened_cost_addl := nvl(x_txn_burdened_cost,0) -
14923                                            nvl(p_init_burdened_cost,0);
14924             END IF;
14925 
14926         /* When burden rate is previously overridden, change in the raw
14927              * cost should re-derive the burden cost rate override. This is
14928              * the new rule enforced.   */
14929 
14930        IF (p_raw_cost_changed_flag = 'Y') AND
14931         (p_burden_cost_changed_flag = 'N' AND p_b_cost_rate_changed_flag = 'N' ) THEN
14932               /* New Rule - see C4 above */
14933           /* IF old burden cost rate override IS NOT NULL THEN
14934            * New burden cost rate override =
14935            *  ((new raw cost - actual raw cost) *
14936            *   ((old burden cost - actual burden cost) /
14937            *    (old raw cost - actual raw cost))) /
14938            *  (quantity - actual quantity)                  */
14939               IF p_curr_burden_rate IS NOT NULL THEN
14940                  IF ((nvl(p_bl_raw_cost,0) - nvl(p_init_raw_cost,0)) <> 0) AND
14941                     ((nvl(x_txn_plan_quantity, 0) -
14942                       nvl(p_init_quantity, 0)) <> 0) THEN
14943 
14944 		   If p_budget_version_type = 'ALL' then
14945                         iF x_txn_raw_cost = x_txn_plan_quantity then
14946                     	   x_txn_b_cost_rate_override:= ((nvl(x_txn_raw_cost,0) -
14947                                                    nvl(p_init_raw_cost,0)) *
14948                                                   ((nvl(p_bl_burdened_cost,0) -
14949                                                  nvl(p_init_burdened_cost,0))) /
14950                                                    (nvl(p_bl_raw_cost,0) -
14951                                                     nvl(p_init_raw_cost,0))) /
14952                                                  (nvl(x_txn_plan_quantity, 0) -
14953                                                   nvl(p_init_quantity, 0));
14954 			Else
14955 			   -- mixture of revenue only and cost and revenue together transactions
14956 			   x_txn_b_cost_rate_override:= ((nvl(x_txn_raw_cost,0) -
14957                                                    nvl(p_init_raw_cost,0)) *
14958                                                   ((nvl(p_bl_burdened_cost,0) -
14959                                                  nvl(p_init_burdened_cost,0))) /
14960                                                    (nvl(p_bl_raw_cost,0) -
14961                                                     nvl(p_init_raw_cost,0))) /
14962                                                  (nvl(x_txn_raw_cost, 0) -
14963                                                   nvl(p_init_raw_cost, 0));
14964 		        End If;
14965 		   Else
14966                     	-- Cost only version, always raw cost and quantity exists
14967 			x_txn_b_cost_rate_override:= ((nvl(x_txn_raw_cost,0) -
14968                                                    nvl(p_init_raw_cost,0)) *
14969                                                   ((nvl(p_bl_burdened_cost,0) -
14970                                                  nvl(p_init_burdened_cost,0))) /
14971                                                    (nvl(p_bl_raw_cost,0) -
14972                                                     nvl(p_init_raw_cost,0))) /
14973                                                  (nvl(x_txn_plan_quantity, 0) -
14974                                                   nvl(p_init_quantity, 0));
14975 		   End If;
14976                  END IF;
14977           END IF;
14978            END IF;
14979         END IF;
14980         /* end of cost budget version */
14981 
14982     /* Start of Revenue calculation */
14983     /* R1: For revenue only version, change in revenue will be copied
14984          *     to quantity and
14985          * R2: change in quantity will be copied to revenue.
14986          * And bill rate is always 1.
14987          * R3: For cost and revenue together version, change in revenue
14988          *     will derive the bill rate override and change in the raw cost
14989          *     will re-derive the bill rate override provided the previous
14990          *     bill rate override exists.                                 */
14991 
14992         IF p_budget_version_type IN ('REVENUE') THEN
14993            IF ((p_rev_changed_flag = 'Y' AND p_qty_changed_flag = 'Y') OR
14994                (p_rev_changed_flag = 'Y' AND p_qty_changed_flag = 'N'))
14995            THEN
14996               x_txn_plan_quantity := x_txn_revenue; -- Case R1.
14997               IF nvl(x_txn_bill_rate_override, 1) <> 0 THEN
14998                  x_txn_bill_rate_override := 1;
14999               END IF;
15000               x_txn_revenue_addl := nvl(x_txn_revenue,0) -
15001                                     nvl(p_init_revenue,0);
15002               x_txn_plan_quantity_addl := nvl(x_txn_plan_quantity,0) -
15003                                           nvl(p_bl_quantity,0);
15004            ELSIF (p_rev_changed_flag = 'N' AND p_qty_changed_flag = 'Y') THEN
15005               x_txn_revenue := x_txn_plan_quantity; -- Case R2.
15006               IF nvl(x_txn_bill_rate_override, 1) <> 0 THEN
15007                  x_txn_bill_rate_override := 1;
15008               END IF;
15009               x_txn_revenue_addl := nvl(x_txn_revenue,0) -
15010                                     nvl(p_init_revenue,0);
15011               x_txn_plan_quantity_addl := nvl(x_txn_plan_quantity,0) -
15012                                           nvl(p_bl_quantity,0);
15013            END IF;
15014         END IF; -- REVENUE
15015 
15016         IF p_budget_version_type IN ('ALL') THEN
15017            -- Case R3
15018            IF ((p_rev_changed_flag = 'Y' AND p_qty_changed_flag = 'Y') OR
15019                (p_rev_changed_flag = 'Y' AND p_qty_changed_flag = 'N' AND
15020                 p_bill_rate_changed_flag = 'N') OR
15021                (p_rev_changed_flag = 'Y' AND p_qty_changed_flag = 'N' AND
15022                 p_bill_rate_changed_flag = 'Y'))
15023            THEN
15024               IF (nvl(x_txn_plan_quantity,0) -
15025                   nvl(p_init_quantity,0)) <> 0 THEN
15026               x_txn_bill_rate_override := (nvl(x_txn_revenue,0) -
15027                                                nvl(p_init_revenue ,0)) /
15028                                               (nvl(x_txn_plan_quantity,0) -
15029                                                nvl(p_init_quantity,0));
15030               x_txn_revenue_addl := nvl(x_txn_revenue,0) -
15031                                         nvl(p_init_revenue,0);
15032               -- Below not in TA ... Add in?
15033                   x_txn_plan_quantity_addl := nvl(x_txn_plan_quantity,0) -
15034                                               nvl(p_bl_quantity,0);
15035           END IF;
15036 
15037            ELSIF ((p_rev_changed_flag = 'N' AND p_qty_changed_flag = 'Y') OR
15038                   p_bill_rate_changed_flag = 'Y') THEN
15039               x_txn_revenue_addl := (nvl(x_txn_plan_quantity,0) -
15040                                      nvl(p_init_quantity,0)) *
15041                                      nvl(x_txn_bill_rate_override,
15042                                          x_txn_bill_rate);
15043           x_txn_revenue_addl := pa_currency.round_trans_currency_amt1(
15044                                       x_txn_revenue_addl, p_txn_currency_code);
15045           x_txn_revenue := x_txn_revenue_addl + nvl(p_init_revenue,0);
15046           x_txn_plan_quantity_addl := nvl(x_txn_plan_quantity,0) -
15047                                               nvl(p_bl_quantity,0);
15048            END IF;
15049 
15050         END IF; -- ALL
15051 
15052         IF (p_budget_version_type IN ('ALL') AND
15053             p_raw_cost_changed_flag = 'Y' and p_rev_changed_flag = 'N' AND p_bill_rate_changed_flag = 'N' ) THEN
15054         /* Change in the raw cost should re-derive the revenue by
15055              * calculating the bill rate markup percentage. This is done
15056              * based on the formula
15057          * IF old bill rate override is not null then
15058          * New bill rate override =
15059          * ((new raw cost - actual raw cost) *
15060          *  ((old revenue - actual revenue) /
15061          *   (old raw cost - actual raw cost)) /
15062          * (quantity - actual quatity)                             */
15063 
15064            IF p_curr_bill_rate IS NOT NULL THEN
15065               IF ((nvl(p_bl_raw_cost,0) - nvl(p_init_raw_cost,0)) <> 0) AND
15066                  ((nvl(x_txn_plan_quantity, 0) - nvl(p_init_quantity, 0)) <> 0)
15067               THEN
15068                  x_txn_bill_rate_override := ((nvl(x_txn_raw_cost,0) -
15069                                                nvl(p_init_raw_cost,0)) *
15070                                               ((nvl(p_bl_revenue,0) -
15071                                                 nvl(p_init_revenue,0))) /
15072                                                (nvl(p_bl_raw_cost,0) -
15073                                                 nvl(p_init_raw_cost,0))) /
15074                                              (nvl(x_txn_plan_quantity, 0) -
15075                                               nvl(p_init_quantity, 0));
15076               END IF;
15077            ELSE
15078               -- New bill rate override = Markup % + 1
15079               -- (ensure that it is applied on the new raw cost,
15080               -- which should be equaled to qty)
15081               -- TBD
15082               null;
15083            END IF;
15084         END IF;
15085 
15086         IF x_txn_plan_quantity_addl = 0 Then
15087            x_txn_plan_quantity_addl := NULL;
15088         End If;
15089         IF x_txn_raw_cost_addl = 0 then
15090             x_txn_raw_cost_addl := NULL;
15091         End If;
15092         IF x_txn_burdened_cost_addl = 0 then
15093             x_txn_burdened_cost_addl := NULL;
15094         End If;
15095         If x_txn_revenue_addl = 0 Then
15096             x_txn_revenue_addl := NULL;
15097         End If;
15098 	If P_PA_DEBUG_MODE = 'Y' Then
15099         print_msg('Leaving pply_NON_RATE_BASE_precedence API with status [S]');
15100 	End if;
15101 EXCEPTION
15102     WHEN OTHERS THEN
15103         RAISE;
15104 
15105 
15106 END Apply_NON_RATE_BASE_precedence;
15107 
15108 /* This API will apply the precedence rules on Rate Based planning transactions */
15109 PROCEDURE Apply_RATE_BASE_precedence(
15110      p_txn_currency_code        IN Varchar2
15111     ,p_rate_based_flag          IN Varchar2
15112     ,p_budget_version_type      IN Varchar2
15113     ,p_qty_changed_flag         IN Varchar2
15114     ,p_raw_cost_changed_flag    IN Varchar2
15115     ,p_rw_cost_rate_changed_flag IN Varchar2
15116     ,p_burden_cost_changed_flag IN Varchar2
15117     ,p_b_cost_rate_changed_flag IN Varchar2
15118     ,p_rev_changed_flag         IN Varchar2
15119     ,p_bill_rate_changed_flag   IN Varchar2
15120     ,p_bill_rt_ovr_changed_flag IN Varchar2
15121     ,p_init_raw_cost            IN Number
15122     ,p_init_burdened_cost       IN Number
15123     ,p_init_revenue             IN Number
15124     ,p_init_quantity            IN Number
15125     ,p_bl_raw_cost              IN Number
15126     ,p_bl_burdened_cost         IN Number
15127     ,p_bl_revenue               IN Number
15128     ,p_bl_quantity              IN Number
15129     ,p_curr_cost_rate           IN Number
15130     ,p_curr_burden_rate         IN Number
15131     ,p_curr_bill_rate           IN Number
15132     ,x_txn_plan_quantity        IN OUT NOCOPY Number
15133     ,x_txn_raw_cost             IN OUT NOCOPY Number
15134     ,x_txn_raw_cost_rate        IN OUT NOCOPY Number
15135     ,x_txn_rw_cost_rate_override IN OUT NOCOPY Number
15136     ,x_txn_burdened_cost        IN OUT NOCOPY Number
15137     ,x_txn_b_cost_rate          IN OUT NOCOPY Number
15138     ,x_txn_b_cost_rate_override IN OUT NOCOPY Number
15139     ,x_txn_revenue              IN OUT NOCOPY Number
15140     ,x_txn_bill_rate            IN OUT NOCOPY Number
15141     ,x_txn_bill_rate_override   IN OUT NOCOPY Number
15142     ,x_txn_revenue_addl         IN OUT NOCOPY Number
15143     ,x_txn_raw_cost_addl        IN OUT NOCOPY Number
15144     ,x_txn_plan_quantity_addl   IN OUT NOCOPY Number
15145     ,x_txn_burdened_cost_addl   IN OUT NOCOPY Number
15146     ) IS
15147 
15148     l_stage                    VARCHAR2(100);
15149 BEGIN
15150 --print_msg('p_curr_burden_rate IS : ' || p_curr_burden_rate||']p_curr_bill_rate  IS : ' || p_curr_bill_rate);
15151     /***
15152     -- precedence rules
15153     -- For rate based transactions,
15154     -- Quantity  Rate   Amount   Result
15155     ---------------------------------------------------------------------------
15156        X         X      X        All are changed: New Amt := New Qty * New Rate
15157        X         X      -        New Amt := newQty*newRate
15158        X         -      -        New Amt := newQty*oldRate
15159        X         -      X        newRt = NewAmt/NewQty
15160        -         X      -        NewAmt := oldqty * newRate
15161     ------- special case as per FD -------
15162     -- any change in rate and cost will result in change in qty
15163        -         X      X        Newqty := newAmt/newRate
15164        -         -      X        NewQty := NewAmt / oldRate
15165     Based on the above precedence rules re derive the cost,qty
15166     and populate the addl out params
15167     ***/
15168     IF p_budget_version_type IN ('COST','ALL') THEN
15169        -- Start of Raw cost and qty calculation
15170        IF (p_qty_changed_flag = 'Y' AND  -- Case C1, C2, C3, C7
15171            p_raw_cost_changed_flag = 'Y' AND
15172            p_rw_cost_rate_changed_flag = 'Y') THEN
15173 
15174            l_stage := 'PRC:1';
15175            --print_msg(l_stage);
15176 
15177            -- x_txn_raw_cost := NVL(x_txn_plan_quantity ,0) *
15178            --                   NVL(x_txn_rw_cost_rate_override,
15179            --                       x_txn_raw_cost_rate);
15180            -- x_txn_raw_cost := pa_currency.round_trans_currency_amt1(
15181            --                      x_txn_raw_cost, p_txn_currency_code);
15182 
15183            -- C1, C2 and C3: rederive cost rate override as raw cost / quantity
15184            IF (nvl(x_txn_plan_quantity, 0) - nvl(p_init_quantity,0)) <> 0 THEN
15185               x_txn_rw_cost_rate_override := (NVL(x_txn_raw_cost,0) - NVL(p_init_raw_cost,0)) /
15186                                              (nvl(x_txn_plan_quantity, 0) - nvl(p_init_quantity,0));
15187            END IF;
15188 
15189            x_txn_raw_cost_addl := nvl(x_txn_raw_cost,0) -
15190                                   nvl(p_bl_raw_cost,0);
15191            l_stage := 'PRC:2';
15192            --print_msg(l_stage);
15193        ELSIF (p_qty_changed_flag = 'Y' AND  -- Case C5
15194               p_raw_cost_changed_flag = 'N' AND
15195               p_rw_cost_rate_changed_flag = 'Y') OR
15196              (p_qty_changed_flag = 'Y' AND  -- Case C20
15197               p_raw_cost_changed_flag = 'N' AND
15198               p_rw_cost_rate_changed_flag = 'N') THEN
15199            l_stage := 'PRC:3';
15200            --print_msg(l_stage);
15201 
15202            -- C5 and C20: rederive cost as raw cost rate * quantity
15203 	   /* bug fix:5463690:5553549
15204            x_txn_raw_cost := NVL(x_txn_plan_quantity ,0) *
15205                              NVL(x_txn_rw_cost_rate_override,
15206                                  x_txn_raw_cost_rate);
15207 	   */
15208  	   -- Note: Raw cost = ETC raw cost + Actual RawCost
15209  	   x_txn_raw_cost :=(NVL(p_init_raw_cost,0) +
15210  	                     ((NVL(x_txn_plan_quantity ,0) - NVL(p_init_quantity,0)) *
15211  	                      NVL(x_txn_rw_cost_rate_override,x_txn_raw_cost_rate)));
15212 
15213            x_txn_raw_cost := pa_currency.round_trans_currency_amt1(
15214                                 x_txn_raw_cost, p_txn_currency_code);
15215            x_txn_raw_cost_addl := nvl(x_txn_raw_cost,0) -
15216                                   nvl(p_bl_raw_cost,0);
15217        ELSIF (p_qty_changed_flag = 'Y' AND  -- Case C4, C8, C11, C17
15218               p_raw_cost_changed_flag = 'Y' AND
15219               p_rw_cost_rate_changed_flag = 'N') THEN
15220 
15221               l_stage := 'PRC:4';
15222               --print_msg(l_stage);
15223 
15224               -- C4, C8, C11, C17: rederive cost rate override as
15225               -- raw cost / quantity
15226               IF (nvl(x_txn_plan_quantity, 0) - nvl(p_init_quantity,0)) <> 0 THEN
15227         x_txn_rw_cost_rate_override := (NVL(x_txn_raw_cost,0) - NVL(p_init_raw_cost,0)) /
15228                                              (nvl(x_txn_plan_quantity, 0) - nvl(p_init_quantity,0));
15229               END IF;
15230               x_txn_plan_quantity_addl := Nvl(x_txn_plan_quantity,0) -
15231                                           nvl(p_bl_quantity,0);
15232               x_txn_raw_cost_addl := nvl(x_txn_raw_cost,0) -
15233                                      nvl(p_bl_raw_cost,0);
15234        ELSIF (p_qty_changed_flag = 'N' AND  -- Case C21, C24, C28
15235               p_raw_cost_changed_flag = 'Y' AND
15236               p_rw_cost_rate_changed_flag = 'N') THEN
15237               -- qty not changed, cost has changed, rate not changed
15238               -- C21, C24, C28: rederive cost rate override as
15239               -- raw cost / quantity
15240               -- Do not rederive quantity.
15241 
15242               l_stage := 'PRC:6';
15243               --print_msg(l_stage);
15244           IF (nvl(x_txn_plan_quantity, 0) - nvl(p_init_quantity,0)) <> 0 THEN
15245                 x_txn_rw_cost_rate_override := (NVL(x_txn_raw_cost,0) - NVL(p_init_raw_cost,0)) /
15246                                              (nvl(x_txn_plan_quantity, 0) - nvl(p_init_quantity,0));
15247               END IF;
15248               x_txn_plan_quantity_addl := Nvl(x_txn_plan_quantity,0) -
15249                                           nvl(p_bl_quantity,0);
15250               x_txn_raw_cost_addl := nvl(x_txn_raw_cost,0) -
15251                                      nvl(p_bl_raw_cost,0);
15252 
15253        ELSIF (p_qty_changed_flag = 'N' AND  -- Case C6, C19
15254                p_raw_cost_changed_flag = 'Y' AND
15255                p_rw_cost_rate_changed_flag = 'Y') Then
15256                -- qty not changed, cost has changed, rate changed
15257                -- C6, C19: rederive quantity as raw cost / raw cost rate
15258 
15259               l_stage := 'PRC:6.5';
15260               --print_msg(l_stage);
15261                IF NVL(x_txn_rw_cost_rate_override,
15262                   nvl(x_txn_raw_cost_rate,0)) <> 0 THEN
15263 
15264                  /* bug fix:5726773 */
15265  	         x_txn_plan_quantity := ((NVL(x_txn_raw_cost,0) - NVL(p_init_raw_cost,0))/
15266                                          nvl(x_txn_rw_cost_rate_override,
15267                                              nvl(x_txn_raw_cost_rate,0))) + nvl(p_init_quantity,0);
15268                   x_txn_plan_quantity := round_quantity( x_txn_plan_quantity);
15269                   x_txn_plan_quantity_addl := nvl(x_txn_plan_quantity,0) -
15270                                               nvl(p_bl_quantity,0);
15271 
15272                ELSE /* **** NOT SURE **** */
15273                   /* Bug fix:4244118 derive rate override when qty
15274                    * and amts were given */
15275                   IF (NVL(x_txn_rw_cost_rate_override,
15276                       nvl(x_txn_raw_cost_rate,0)) = 0 AND
15277                       nvl(x_txn_plan_quantity,0) <> 0 AND
15278                       nvl(x_txn_raw_cost,0) <> 0) THEN
15279 
15280                       print_msg('4244118: Setting the rate override');
15281               IF (nvl(x_txn_plan_quantity, 0) - nvl(p_init_quantity,0)) <> 0 THEN
15282                         x_txn_rw_cost_rate_override := (NVL(x_txn_raw_cost,0) - NVL(p_init_raw_cost,0)) /
15283                                              (nvl(x_txn_plan_quantity, 0) - nvl(p_init_quantity,0));
15284                       END IF;
15285                   END IF;
15286                END IF;
15287        ELSIF (p_qty_changed_flag = 'N' AND  -- Case C16, C22, C25 and C29
15288               p_raw_cost_changed_flag = 'N' AND
15289               p_rw_cost_rate_changed_flag = 'Y') THEN
15290 
15291               l_stage := 'PRC:7';
15292               --print_msg(l_stage);
15293               -- C16, C22, C25 and C29: rederive raw cost as
15294               -- raw cost rate * quantity
15295               IF x_txn_plan_quantity IS NOT NULL THEN
15296                  /* bug fix:5463690:5553549
15297 		 x_txn_raw_cost := NVL(x_txn_plan_quantity ,0) *
15298                                    NVL(x_txn_rw_cost_rate_override,
15299                                        x_txn_raw_cost_rate);
15300                  */
15301  	         -- Note: Raw cost = ETC raw cost + Actual RawCost
15302  	         x_txn_raw_cost :=(NVL(p_init_raw_cost,0) +
15303  	                               ((NVL(x_txn_plan_quantity ,0) - NVL(p_init_quantity,0)) *
15304  	                                NVL(x_txn_rw_cost_rate_override,x_txn_raw_cost_rate)));
15305 
15306 		 x_txn_raw_cost := pa_currency.round_trans_currency_amt1(
15307                                        x_txn_raw_cost,p_txn_currency_code);
15308                  x_txn_raw_cost_addl := nvl(x_txn_raw_cost,0) -
15309                                         nvl(p_bl_raw_cost,0);
15310               END IF;
15311        END IF; -- End of qty changed checks
15312 
15313        /* start of burden cost calculation -
15314         * change in the qty results in burden cost variation */
15315 
15316        IF ((p_qty_changed_flag  = 'Y' AND  -- Case C1, C4, C5, C14
15317             p_burden_cost_changed_flag = 'Y' AND
15318             p_b_cost_rate_changed_flag = 'Y') OR
15319            (p_qty_changed_flag = 'Y' AND   -- Case C2, C8, C9, C20
15320             p_burden_cost_changed_flag = 'Y' AND
15321             p_b_cost_rate_changed_flag = 'N') OR
15322            (p_qty_changed_flag = 'N' AND   -- Case C6, C15, C16, C26
15323             p_burden_cost_changed_flag = 'Y' AND
15324             p_b_cost_rate_changed_flag = 'Y') OR
15325            (p_qty_changed_flag = 'N' AND   -- Case C10, C21, C22, C30
15326             p_burden_cost_changed_flag = 'Y' AND
15327             p_b_cost_rate_changed_flag = 'N')) THEN
15328 
15329             l_stage := 'PRC:8';
15330             --print_msg(l_stage);
15331 
15332             -- In all of these cases, rederive the burden cost rate as
15333             -- burden cost / quantity.
15334             IF (Nvl(x_txn_plan_quantity,0) - nvl(p_init_quantity,0)) <> 0 THEN
15335                x_txn_b_cost_rate_override := (x_txn_burdened_cost - nvl(p_init_burdened_cost,0)) /
15336                                              (Nvl(x_txn_plan_quantity,0) - nvl(p_init_quantity,0));
15337             END IF;
15338 
15339        ELSIF ((p_qty_changed_flag = 'Y' AND   -- Case C3, C11, C12, C23
15340                p_burden_cost_changed_flag = 'N' AND
15341                p_b_cost_rate_changed_flag = 'Y') OR
15342               (p_qty_changed_flag = 'N' AND   -- Case C13, C24, C25, C31
15343                p_burden_cost_changed_flag = 'N' AND
15344                p_b_cost_rate_changed_flag = 'Y')) THEN
15345 
15346             -- In all of these cases, rederive the burden cost as
15347             -- burden cost rate * quantity.
15348 
15349             l_stage := 'PRC:9';
15350             print_msg(l_stage);
15351             IF (x_txn_plan_quantity IS NOT NULL OR
15352                 p_qty_changed_flag = 'Y') THEN
15353                 x_txn_burdened_cost := x_txn_plan_quantity *
15354                                            NVL(x_txn_b_cost_rate_override,
15355                                                x_txn_b_cost_rate);
15356                 x_txn_burdened_cost := pa_currency.round_trans_currency_amt1(
15357                                           x_txn_burdened_cost,
15358                                           p_txn_currency_code);
15359                 x_txn_burdened_cost_addl := nvl(x_txn_burdened_cost,0) -
15360                                             nvl(p_bl_burdened_cost,0);
15361             END IF;
15362 
15363             /* When burden rate is previously overridden, change in the raw
15364              * cost should re-derive the burden cost rate override. This is
15365              * the new rule enforced.   */
15366 
15367        ELSIF ((p_qty_changed_flag = 'Y' AND   -- Case C7, C17, C18, C27
15368                p_burden_cost_changed_flag = 'N' AND
15369                p_b_cost_rate_changed_flag = 'N') OR
15370               (p_qty_changed_flag = 'N' AND   -- Case C19, C28, C29, C32
15371                p_burden_cost_changed_flag = 'N' AND
15372                p_b_cost_rate_changed_flag = 'N')) THEN
15373               /* IF old burden cost rate override IS NOT NULL THEN
15374                * New burden cost rate override =
15375                *  ((new raw cost - actual raw cost) *
15376                *   ((old burden cost - actual burden cost) /
15377                *    (old raw cost - actual raw cost))) /
15378                *  (quantity - actual quantity) */
15379 		If p_pa_debug_mode = 'Y' Then
15380  	        print_msg('PRC:9.1:p_curr_burden_rate['||p_curr_burden_rate||']');
15381  	        End If;
15382            IF p_curr_burden_rate IS NOT NULL AND (p_raw_cost_changed_flag = 'Y' OR p_rw_cost_rate_changed_flag = 'Y')  THEN
15383               IF ((nvl(p_bl_raw_cost,0) - nvl(p_init_raw_cost,0)) <> 0) AND
15384                  ((nvl(x_txn_plan_quantity, 0) - nvl(p_init_quantity, 0)) <> 0)
15385               THEN
15386                  x_txn_b_cost_rate_override:= ((nvl(x_txn_raw_cost,0) -
15387                                                 nvl(p_init_raw_cost,0)) *
15388                                                ((nvl(p_bl_burdened_cost,0) -
15389                                                  nvl(p_init_burdened_cost,0))) /
15390                                                 (nvl(p_bl_raw_cost,0) -
15391                                                  nvl(p_init_raw_cost,0))) /
15392                                               (nvl(x_txn_plan_quantity, 0) -
15393                                                nvl(p_init_quantity, 0));
15394 
15395 		/* bug fix:5726773 */
15396  	               ELSIF p_curr_cost_rate is NOT NULL and NVL(p_curr_cost_rate,0) <> 0 Then
15397  	                         x_txn_b_cost_rate_override:= x_txn_rw_cost_rate_override *
15398  	                                                     (p_curr_burden_rate / p_curr_cost_rate) ;
15399               END IF;
15400            END IF;
15401        END IF;
15402     END IF;  -- end of cost type calculation
15403 
15404     IF p_budget_version_type IN ('REVENUE') THEN
15405        -- Start of revenue calculation
15406        l_stage := 'PRC:10';
15407        --print_msg(l_stage);
15408        -- qty is already modified in COST calculation so
15409        -- derive revenue based that qty
15410        IF ((p_rev_changed_flag = 'Y' AND  -- R1, R2
15411             p_qty_changed_flag = 'Y') OR
15412            (p_rev_changed_flag = 'Y' AND  -- R6
15413             p_qty_changed_flag = 'N' AND
15414             p_bill_rate_changed_flag = 'N')) THEN
15415 
15416           -- R1, R2, R6: rederive bill rate as revenue / quantity
15417           IF (Nvl(x_txn_plan_quantity,0) - nvl(p_init_quantity,0)) <> 0 THEN
15418              x_txn_bill_rate_override := (x_txn_revenue - nvl(p_init_revenue,0)) /
15419                                          (Nvl(x_txn_plan_quantity,0) - nvl(p_init_quantity,0));
15420           END IF;
15421 
15422        ELSIF (p_rev_changed_flag = 'Y' AND  -- R4
15423               p_qty_changed_flag = 'N' AND
15424               p_bill_rate_changed_flag = 'Y') THEN
15425           -- R4: rederive quantity as revenue / bill rate
15426           IF NVL(x_txn_bill_rate_override, nvl(x_txn_bill_rate,0)) <> 0 THEN
15427             x_txn_plan_quantity := (nvl(x_txn_revenue,0)-nvl(p_init_revenue,0)) /
15428                                     (NVL(x_txn_bill_rate_override,
15429                                         nvl(x_txn_bill_rate,0)))+ nvl(p_init_quantity,0);
15430              x_txn_plan_quantity := round_quantity(x_txn_plan_quantity);
15431              x_txn_plan_quantity_addl := nvl(x_txn_plan_quantity,0) -
15432                                              nvl(p_bl_quantity,0);
15433           END IF;
15434 
15435        ELSIF p_rev_changed_flag = 'N' --  R3, R5, R7, R8
15436        THEN
15437 
15438           -- R8: if qyt is not null or 0:
15439           --     if rev is null, clear bill rate
15440           --     if rev is 0, bill rate is set to 0
15441           --     if bill rate is null, clear rev
15442           --     if bill rate is 0, rev is set to 0
15443           IF p_qty_changed_flag = 'N' AND p_bill_rate_changed_flag = 'N' THEN
15444              IF Nvl(x_txn_plan_quantity,0) <> 0 THEN
15445                 IF x_txn_revenue IS NULL THEN
15446                    x_txn_bill_rate_override := NULL;
15447                 END IF;
15448                 IF x_txn_bill_rate_override IS NULL THEN
15449                    x_txn_revenue := NULL;
15450                 END IF;
15451 
15452                 IF x_txn_revenue = 0 THEN
15453                    x_txn_bill_rate_override := 0;
15454                 END IF;
15455                 IF x_txn_bill_rate_override = 0 THEN
15456                    x_txn_revenue := 0;
15457                 END IF;
15458              END IF;
15459           END IF;
15460 
15461           -- R3, R5, R7: rederive revenue as quantity * bill rate
15462           IF (p_qty_changed_flag = 'Y' OR
15463               (Nvl(x_txn_plan_quantity,0) <> 0)) THEN
15464 
15465              x_txn_revenue := NVL(x_txn_plan_quantity ,0) *
15466                               NVL(x_txn_bill_rate_override, x_txn_bill_rate);
15467              x_txn_revenue := pa_currency.round_trans_currency_amt1(
15468                                    x_txn_revenue,p_txn_currency_code);
15469              x_txn_revenue_addl := nvl(x_txn_revenue,0) -
15470                                    nvl(p_bl_revenue,0);
15471           END IF;
15472        END IF; -- end of checks
15473     END IF; -- Revenue - this is case of revenue only budget type
15474 
15475     IF p_budget_version_type IN ('ALL') THEN
15476 
15477        l_stage := 'PRC:11';
15478        --print_msg(l_stage);
15479        IF (p_qty_changed_flag = 'Y' AND  -- CR1, CR4, CR5, CR14
15480            p_rev_changed_flag = 'Y' AND
15481            p_bill_rate_changed_flag = 'Y') OR
15482           (p_qty_changed_flag = 'Y' AND  -- CR2, CR8, CR9, CR20
15483            p_rev_changed_flag = 'Y' AND
15484            p_bill_rate_changed_flag = 'N') OR
15485           (p_qty_changed_flag = 'N' AND  -- CR6, CR15, CR16, CR26
15486            p_rev_changed_flag = 'Y' AND
15487            p_bill_rate_changed_flag = 'Y') OR
15488           (p_qty_changed_flag = 'Y' AND  -- CR7, CR17, CR18, CR27
15489            p_rev_changed_flag = 'N' AND
15490            p_bill_rate_changed_flag = 'N') OR
15491           (p_qty_changed_flag = 'N' AND  -- CR10, CR21, CR22, CR30
15492            p_rev_changed_flag = 'Y' AND
15493            p_bill_rate_changed_flag = 'N') OR
15494           (p_qty_changed_flag = 'N' AND  -- CR19, CR28, CR29, CR32
15495            p_rev_changed_flag = 'N' AND
15496            p_bill_rate_changed_flag = 'N')THEN
15497 
15498            l_stage := 'PRC:12';
15499            --print_msg(l_stage);
15500 
15501            IF p_qty_changed_flag = 'N' AND  -- CR32
15502               p_rev_changed_flag = 'N' AND
15503               p_bill_rate_changed_flag = 'N' AND
15504               p_raw_cost_changed_flag = 'N' AND
15505               p_rw_cost_rate_changed_flag = 'N' THEN
15506               -- CR32: if qyt is not null or 0:
15507               --       if rev is null, clear bill rate
15508               --       if rev is 0, bill rate is set to 0
15509               --       if bill rate is null, clear rev
15510               --       if bill rate is 0, rev is set to 0
15511         l_stage := 'PRC:12.1';
15512             --print_msg(l_stage);
15513               IF Nvl(x_txn_plan_quantity,0) <> 0 THEN
15514                  IF x_txn_revenue IS NULL THEN
15515                     x_txn_bill_rate_override := NULL;
15516                  END IF;
15517                  IF x_txn_bill_rate_override IS NULL THEN
15518                     x_txn_revenue := NULL;
15519                  END IF;
15520 
15521                  IF x_txn_revenue = 0 THEN
15522                     x_txn_bill_rate_override := 0;
15523                  END IF;
15524                  IF x_txn_bill_rate_override = 0 THEN
15525                     x_txn_revenue := 0;
15526                  END IF;
15527               END IF;
15528 
15529        ELSIF p_rev_changed_flag = 'Y' Then
15530         l_stage := 'PRC:12.2';
15531                 --print_msg(l_stage);
15532         If (nvl(x_txn_plan_quantity,0) - nvl(p_init_quantity,0)) <> 0 Then
15533             x_txn_bill_rate_override := (x_txn_revenue - nvl(p_init_revenue,0))/
15534                        (nvl(x_txn_plan_quantity,0) - nvl(p_init_quantity,0));
15535         End If;
15536        ELSIF ( p_qty_changed_flag = 'Y' and p_rev_changed_flag = 'N'
15537                    and p_bill_rate_changed_flag = 'N') Then
15538             l_stage := 'PRC:12.3';
15539                     --print_msg(l_stage);
15540 
15541                         NULL;
15542 	/*
15543        ELSE
15544               -- CR1, CR4, CR5, CR14: rederive bill rate as revenue / quantity
15545               -- CR2, CR8, CR9, CR20: rederive bill rate as revenue / quantity
15546               -- CR6, CR15, CR16, CR26: rederive bill rate as revenue / quantity
15547               -- CR7, CR17, CR18, CR27: rederive bill rate as revenue / quantity
15548               -- CR10, CR21, CR22,CR30: rederive bill rate as revenue / quantity
15549               -- CR19, CR28, CR29: rederive bill rate as revenue / quantity
15550         	l_stage := 'PRC:12.4';
15551                 --print_msg(l_stage);
15552                 If (nvl(x_txn_plan_quantity,0) - nvl(p_init_quantity,0)) <> 0 Then
15553                         x_txn_bill_rate_override := (x_txn_revenue - nvl(p_init_revenue,0))/
15554                                            (nvl(x_txn_plan_quantity,0) - nvl(p_init_quantity,0));
15555                 End If;
15556 	 */
15557         END IF;
15558 
15559        ELSIF (p_qty_changed_flag = 'Y' AND  -- CR3, CR11, CR12, CR23
15560               p_rev_changed_flag = 'N' AND
15561               p_bill_rate_changed_flag = 'Y') OR
15562              (p_qty_changed_flag = 'N' AND  -- CR13, CR24, CR25, CR31
15563               p_rev_changed_flag = 'N' AND
15564               p_bill_rate_changed_flag = 'Y') THEN
15565 
15566            l_stage := 'PRC:12.5';
15567            --print_msg(l_stage);
15568 
15569            -- CR3, CR11, CR12, CR23: rederive revenue as quantity * bill rate
15570            -- CR13, CR24, CR25, CR31: rederive revenue as quantity * bill rate
15571            x_txn_revenue := NVL(x_txn_plan_quantity ,0) *
15572                             NVL(x_txn_bill_rate_override, x_txn_bill_rate);
15573            x_txn_revenue := pa_currency.round_trans_currency_amt1(
15574                                  x_txn_revenue,p_txn_currency_code);
15575            x_txn_revenue_addl := nvl(x_txn_revenue,0) - nvl(p_bl_revenue,0);
15576 
15577        END IF; -- end of checks
15578     END IF; -- end of budget_version_type ALL
15579 
15580     IF (p_budget_version_type IN ('REVENUE', 'ALL')) THEN --{
15581 
15582       IF (p_rev_changed_flag = 'N' AND p_bill_rate_changed_flag = 'N' )
15583      AND (p_raw_cost_changed_flag = 'Y'    -- Case CR28
15584               OR p_rw_cost_rate_changed_flag = 'Y'  -- Case CR7, CR19, C29
15585          ) Then
15586     /* Change in the raw cost should re-derive the revenue by
15587          * calculating the bill rate markup percentage. This is done
15588          * based on the formula
15589      * IF old bill rate override is not null then
15590      * New bill rate override =
15591      * ((new raw cost - actual raw cost) *
15592      *  ((old revenue - actual revenue) /
15593      *   (old raw cost - actual raw cost)) /
15594      * (quantity - actual quatity)                             */
15595 
15596        IF p_curr_bill_rate IS NOT NULL THEN
15597           IF ((nvl(p_bl_raw_cost,0) - nvl(p_init_raw_cost,0)) <> 0) AND
15598              ((nvl(x_txn_plan_quantity, 0) - nvl(p_init_quantity, 0)) <> 0)
15599           THEN
15600       l_stage := 'PRC:12.6';
15601            --print_msg(l_stage);
15602           x_txn_bill_rate_override := ((nvl(x_txn_raw_cost,0) -
15603                                         nvl(p_init_raw_cost,0)) *
15604                                        ((nvl(p_bl_revenue,0) -
15605                                          nvl(p_init_revenue,0))) /
15606                                         (nvl(p_bl_raw_cost,0) -
15607                                          nvl(p_init_raw_cost,0))) /
15608                                       (nvl(x_txn_plan_quantity, 0) -
15609                                        nvl(p_init_quantity, 0));
15610           END IF;
15611        ELSE
15612           -- New bill rate override = Markup % + 1
15613           -- (ensure that it is applied on the new raw cost,
15614           -- which should be equaled to qty)
15615           -- TBD
15616           null;
15617        END IF;
15618       END IF;
15619     END IF; --}
15620 
15621     /* rederive the additionals*/
15622     x_txn_plan_quantity_addl := nvl(x_txn_plan_quantity,0) -
15623                                 nvl(p_bl_quantity,0);
15624     x_txn_raw_cost_addl      := nvl(x_txn_raw_cost,0) -
15625                                 nvl(p_bl_raw_cost,0);
15626     x_txn_burdened_cost_addl := nvl(x_txn_burdened_cost,0) -
15627                                 nvl(p_bl_burdened_cost,0);
15628     x_txn_revenue_addl       := nvl(x_txn_revenue,0) -
15629                                 nvl(p_bl_revenue,0);
15630 
15631     --print_msg('Finally set the addl columns to NULL if ithas zeros');
15632     /* set addl columns to NULL if it has zero */
15633     /* Performance bug fix: 4208217
15634      * avoid hitting dual wherever possible */
15635 
15636     IF x_txn_plan_quantity_addl = 0 Then
15637        x_txn_plan_quantity_addl := NULL;
15638     End If;
15639     IF x_txn_raw_cost_addl = 0 then
15640        x_txn_raw_cost_addl := NULL;
15641     End If;
15642     IF x_txn_burdened_cost_addl = 0 then
15643        x_txn_burdened_cost_addl := NULL;
15644     End If;
15645     If x_txn_revenue_addl = 0 Then
15646        x_txn_revenue_addl := NULL;
15647     End If;
15648      If P_PA_DEBUG_MODE = 'Y' Then
15649     print_msg('Leaving Apply_RATE_BASE_precedence API with status [S]');
15650 	End if;
15651 EXCEPTION
15652     WHEN OTHERS THEN
15653         RAISE;
15654 
15655 END Apply_RATE_BASE_precedence;
15656 
15657 /* This API initializes the global variables  for the given budget version Id */
15658 PROCEDURE Init_Globals(
15659         p_budget_version_id  IN NUMBER
15660         ,p_source_context    IN  VARCHAR2
15661         ,x_return_status     OUT NOCOPY VARCHAR2
15662         ) IS
15663     l_agreement_cur_code  Varchar2(100);
15664     l_return_status  Varchar2(100);
15665     l_msg_count Number;
15666     l_msg_data  Varchar2(100);
15667 BEGIN
15668     x_return_status  := 'S';
15669     If P_PA_DEBUG_MODE = 'Y' Then
15670     print_msg('Entered Init_Globals API');
15671     End if;
15672     IF p_budget_version_id IS NOT NULL Then
15673                 /*
15674                 Select project option attibutes required for RATE API and assign to local variables
15675                 This only needs to be done once during the procedure
15676                 */
15677                 ProjFpOptRec := NULL;
15678                 OPEN  get_proj_fp_options_csr(p_budget_version_id);
15679                 FETCH get_proj_fp_options_csr INTO ProjFpOptRec;
15680                 CLOSE get_proj_fp_options_csr;
15681 		If P_PA_DEBUG_MODE = 'Y' Then
15682                 print_msg('Assigning project options cursorval to globla variables');
15683 		End if;
15684                 g_fp_budget_version_type           := ProjFpOptRec.version_type;
15685                 g_bv_resource_list_id              := ProjFpOptRec.resource_list_id;
15686                 g_bv_approved_rev_flag             := ProjFpOptRec.approved_rev_plan_type_flag;
15687                 g_fp_multi_curr_enabled            := ProjFpOptRec.plan_in_multi_curr_flag;
15688                 g_spread_from_date                 := ProjFpOptRec.etc_start_date;
15689                 g_wp_version_flag                  := ProjFpOptRec.wp_version_flag;
15690                 g_track_wp_costs_flag              := ProjFpOptRec.track_workplan_costs_flag;
15691                 g_proj_structure_ver_id            := ProjFpOptRec.project_structure_version_id;
15692                 g_budget_version_id                := p_budget_version_id;
15693                 g_project_id                       := ProjFpOptRec.project_id;
15694                 g_time_phased_code                 := ProjFpOptRec.time_phased_code;
15695                 g_project_currency_code            := ProjFpOptRec.project_currency_code;
15696                 g_projfunc_currency_code           := ProjFpOptRec.projfunc_currency_code;
15697                 g_project_name                     := ProjFpOptRec.project_name;
15698                 g_source_context                   := p_source_context;
15699                 g_revenue_generation_method        := NVL(PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(g_project_id),'W');
15700             g_ciId                             := ProjFpOptRec.CiId;
15701             g_baseline_funding_flag            := ProjFpOptRec.baseline_funding_flag;
15702         g_Plan_Class_Type                  := ProjFpOptRec.Plan_Class_Type;
15703 
15704                 /* Get the Agreement currency details if the budget is of Change Order*/
15705                 --print_msg('Calling Get_Agreement_Details API');
15706                 Get_Agreement_Details
15707                 (p_budget_version_id  => p_budget_version_id
15708                 ,x_agr_curr_code      => l_agreement_cur_code
15709                 ,x_return_status      => l_return_status );
15710 
15711                 /* Initialize the mrc check flag */
15712                 CHECK_MRC_INSTALLED;
15713 
15714                 --print_msg('End of calling Get_Agreement_Details retSts['||l_return_status||']AgrCur['||l_agreement_cur_code||']');
15715                 IF l_return_status <> 'S' Then
15716                         x_return_status := l_return_status;
15717                 END IF;
15718 
15719         /* mrc enhancements */
15720         /**MRC Elimination Changes:
15721         IF ( NVL(g_wp_version_flag,'N') = 'N'
15722                  AND NVL(g_mrc_installed_flag,'N') = 'Y'
15723                  AND PA_MRC_FINPLAN.G_FINPLAN_MRC_OPTION_CODE = 'A'
15724              AND NVL(g_conv_rates_required_flag,'Y') = 'Y' ) Then
15725             -- Initialize the populate mrc plsql tabs flag
15726             G_populate_mrc_tab_flag  := 'Y';
15727         Else
15728             G_populate_mrc_tab_flag  := 'N';
15729         End If;
15730 	**/
15731 	G_populate_mrc_tab_flag  := 'N';
15732 	If P_PA_DEBUG_MODE = 'Y' Then
15733             print_msg('Calling pa_fp_gen_amount_utils.get_plan_version_dtls ');
15734 	End If;
15735             pa_fp_gen_amount_utils.get_plan_version_dtls
15736                     (p_project_id         => g_project_id,
15737                     p_budget_version_id  => g_budget_version_id,
15738                     x_fp_cols_rec        => g_fp_cols_rec,
15739                     x_return_status      => l_return_status,
15740                     x_msg_count          => l_msg_count,
15741                     x_msg_data           => l_msg_data
15742                     );
15743 	   If P_PA_DEBUG_MODE = 'Y' Then
15744             print_msg('Printing all global variables: g_bv_resource_list_id['||g_bv_resource_list_id||']g_bv_approved_rev_flag['||g_bv_approved_rev_flag||']');
15745             print_msg('TimePhas['||g_time_phased_code||']g_fp_multi_curr_enabled['||g_fp_multi_curr_enabled||']g_spread_from_date['||g_spread_from_date||']');
15746             print_msg('g_wp_version_flag['||g_wp_version_flag||']g_fp_budget_version_typei['||g_fp_budget_version_type||']');
15747             print_msg('g_track_wp_costs_flag['||g_track_wp_costs_flag||']G_AGR_CONV_REQD_FLAG['||G_AGR_CONV_REQD_FLAG||']');
15748             print_msg('MRCInstFlag['||g_mrc_installed_flag||']G_baseline_FundingFlg['||g_baseline_funding_flag||']');
15749             print_msg('g_rev_generation_method['||g_revenue_generation_method||']g_CiId['||g_CiId||']');
15750         print_msg('G_populate_mrc_tab_flag['||G_populate_mrc_tab_flag||']g_Plan_Class_Type['||g_Plan_Class_Type||']');
15751     	print_msg('ReturnStatus of Init_Globals ['||x_return_status||']');
15752 	 End if;
15753 
15754         END IF;
15755 EXCEPTION
15756     WHEN OTHERS THEN
15757         print_msg('ERROR FROM Init_Globals ['||SQLCODE||SQLERRM||']');
15758         RAISE;
15759 
15760 END Init_Globals;
15761 
15762 
15763 /* Added for bug 5028631 */
15764 /* During calculation process, if nothing has changed, i.e quantity,rates and amounts
15765  * donot change. then calculate api skips / ignores these planning resource.
15766  * But there is a customer requirement to call the client extension api for skipped
15767  * records. This API copies the budget lines into fp rollup tmp table for the skipped
15768  * resources and calls client extension api
15769  */
15770 PROCEDURE Process_skipped_records
15771     	( p_budget_version_id              IN  NUMBER
15772 	,p_calling_mode               	   IN  VARCHAR2
15773         ,p_source_context             	   IN  VARCHAR2
15774         ,x_return_status                 OUT NOCOPY VARCHAR2
15775         ,x_msg_count                     OUT NOCOPY NUMBER
15776         ,x_msg_data                      OUT NOCOPY VARCHAR2) IS
15777 
15778     l_debug_mode        VARCHAR2(30);
15779     l_stage             NUMBER;
15780     l_count             NUMBER;
15781     l_msg_index_out     NUMBER;
15782 BEGIN
15783 
15784         x_return_status := 'S';
15785     IF p_pa_debug_mode = 'Y' Then
15786         	print_msg(to_char(l_stage)||'Entered PA_FP_CALC_PLAN_PKG.Process_skipped_records');
15787             pa_debug.init_err_stack('PA_FP_CALC_PLAN_PKG.Process_skipped_records');
15788     End If;
15789 	/***
15790     If P_PA_DEBUG_MODE = 'Y' Then
15791       for i in (select * from pa_fp_spread_calc_tmp ) LOOP
15792        print_msg('IN params ResId['||i.resource_assignment_id||']TxnCur['||i.txn_currency_code||']RefrFlag['||i.refresh_rates_flag||']');
15793        print_msg('RefrConvFlag['||i.refresh_conv_rates_flag||']gSprdFromDt['||g_spread_from_date||']gLnSD['||i.start_date||']');
15794        print_msg('gLineEnDate['||i.end_date||']massAdflag['||i.mass_adjust_flag||']mfcCstFlag['||i.mfc_cost_refresh_flag||']skipFlag['||i.skip_record_flag||']');
15795       end loop;
15796     END IF;
15797 	**/
15798 
15799 
15800     g_stage := 'Process_skipped_records : populate_rollup_tmp';
15801 
15802        INSERT INTO pa_fp_rollup_tmp (
15803     budget_version_id
15804         ,resource_assignment_id
15805        ,start_date
15806        ,end_date
15807        ,period_name
15808        ,quantity
15809        ,projfunc_raw_cost
15810        ,projfunc_burdened_cost
15811        ,projfunc_revenue
15812        ,cost_rejection_code
15813        ,revenue_rejection_code
15814        ,burden_rejection_code
15815        ,projfunc_currency_code
15816        ,projfunc_cost_rate_type
15817        ,projfunc_cost_exchange_rate
15818        ,projfunc_cost_rate_date_type
15819        ,projfunc_cost_rate_date
15820        ,projfunc_rev_rate_type
15821        ,projfunc_rev_exchange_rate
15822        ,projfunc_rev_rate_date_type
15823        ,projfunc_rev_rate_date
15824        ,project_currency_code
15825        ,project_cost_rate_type
15826        ,project_cost_exchange_rate
15827        ,project_cost_rate_date_type
15828        ,project_cost_rate_date
15829        ,project_raw_cost
15830        ,project_burdened_cost
15831        ,project_rev_rate_type
15832        ,project_rev_exchange_rate
15833        ,project_rev_rate_date_type
15834        ,project_rev_rate_date
15835        ,project_revenue
15836        ,txn_currency_code
15837        ,txn_raw_cost
15838        ,txn_burdened_cost
15839        ,txn_revenue
15840        ,budget_line_id
15841        ,init_quantity
15842        ,txn_init_raw_cost
15843        ,txn_init_burdened_cost
15844        ,txn_init_revenue
15845        ,bill_markup_percentage
15846        ,bill_rate
15847        ,cost_rate
15848        ,rw_cost_rate_override
15849        ,burden_cost_rate
15850        ,bill_rate_override
15851        ,burden_cost_rate_override
15852        ,cost_ind_compiled_set_id
15853        ,init_raw_cost
15854        ,init_burdened_cost
15855        ,init_revenue
15856        ,project_init_raw_cost
15857        ,project_init_burdened_cost
15858        ,project_init_revenue
15859        ,billable_flag
15860        )
15861        ( SELECT /*+ INDEX(BL PA_BUDGET_LINES_U1) */
15862 	bl.budget_version_id
15863        ,bl.resource_assignment_id
15864        ,bl.start_date
15865        ,bl.end_date
15866        ,bl.period_name
15867        ,bl.quantity
15868        ,bl.raw_cost
15869        ,bl.burdened_cost
15870        ,bl.revenue
15871        ,bl.cost_rejection_code
15872        ,bl.revenue_rejection_code
15873        ,bl.burden_rejection_code
15874        ,bl.projfunc_currency_code
15875        ,bl.projfunc_cost_rate_type
15876        ,bl.projfunc_cost_exchange_rate
15877        ,bl.projfunc_cost_rate_date_type
15878        ,bl.projfunc_cost_rate_date
15879        ,bl.projfunc_rev_rate_type
15880        ,bl.projfunc_rev_exchange_rate
15881        ,bl.projfunc_rev_rate_date_type
15882        ,bl.projfunc_rev_rate_date
15883        ,bl.project_currency_code
15884        ,bl.project_cost_rate_type
15885        ,bl.project_cost_exchange_rate
15886        ,bl.project_cost_rate_date_type
15887        ,bl.project_cost_rate_date
15888        ,bl.project_raw_cost
15889        ,bl.project_burdened_cost
15890        ,bl.project_rev_rate_type
15891        ,bl.project_rev_exchange_rate
15892        ,bl.project_rev_rate_date_type
15893        ,bl.project_rev_rate_date
15894        ,bl.project_revenue
15895        ,bl.txn_currency_code
15896        ,bl.txn_raw_cost
15897        ,bl.txn_burdened_cost
15898        ,bl.txn_revenue
15899        ,bl.budget_line_id
15900        ,bl.init_quantity
15901        ,bl.txn_init_raw_cost
15902        ,bl.txn_init_burdened_cost
15903        ,bl.txn_init_revenue
15904        ,bl.txn_markup_percent
15905        ,bl.txn_standard_bill_rate
15906        ,bl.txn_standard_cost_rate
15907        ,bl.txn_cost_rate_override
15908        ,bl.burden_cost_rate
15909        ,bl.txn_bill_rate_override
15910        ,bl.burden_cost_rate_override
15911        ,bl.cost_ind_compiled_set_id
15912        ,bl.init_raw_cost
15913        ,bl.init_burdened_cost
15914        ,bl.init_revenue
15915        ,bl.project_init_raw_cost
15916        ,bl.project_init_burdened_cost
15917        ,bl.project_init_revenue
15918        ,tmp.billable_flag
15919        FROM pa_budget_lines bl
15920            ,pa_resource_assignments ra
15921        ,pa_fp_spread_calc_tmp tmp
15922 	,pa_fp_rollup_tmp rlp --Bug 5203868
15923        WHERE tmp.budget_version_id = p_budget_version_id
15924            AND tmp.resource_assignment_id = ra.resource_assignment_id
15925 	   AND  bl.resource_assignment_id = tmp.resource_assignment_id
15926 	   AND   bl.txn_currency_code = tmp.txn_currency_code
15927 	   AND   NVL(tmp.skip_record_flag,'N') = 'Y'
15928 	   AND   ((p_calling_mode = 'PROCESS_CST_REV_MIX'
15929 		  and nvl(tmp.processed_flag,'N') = 'Y' )
15930 		  OR
15931 		  p_calling_mode <> 'PROCESS_CST_REV_MIX'
15932 		 )
15933 	   AND  ((p_source_context = 'BUDGET_LINE'
15934 		 and bl.start_date BETWEEN tmp.start_date and tmp.end_date)
15935 		 OR
15936 		 p_source_context <> 'BUDGET_LINE'
15937 		)
15938 	   --Bug 5203868. Replaced the NOT EXISTS with the following
15939                 AND   rlp.resource_assignment_id(+)=tmp.resource_assignment_id
15940                 AND   rlp.txn_currency_code(+)=tmp.txn_currency_code
15941                 AND   rlp.rowid IS NULL
15942              /* Commenting below code for bug 5203868
15943                AND   NOT EXISTS
15944                 (select null
15945                  from pa_fp_rollup_tmp rl1
15946                  Where rl1.resource_assignment_id = tmp.resource_assignment_id
15947                  and rl1.txn_currency_code = tmp.txn_currency_code
15948                 )
15949              */
15950     	);
15951 
15952       x_return_status := 'S';
15953     IF p_pa_debug_mode = 'Y' Then
15954 	print_msg('Process_skipped_records :Number of records inserted['||sql%rowcount||']');
15955       print_msg('Process_skipped_records: x_return_status : '||x_return_status);
15956       print_msg('Process_skipped_records: Leaving Process_skipped_records');
15957             pa_debug.reset_err_stack;
15958     End If;
15959 EXCEPTION
15960     WHEN OTHERS THEN
15961             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
15962         x_msg_data := sqlcode||sqlerrm;
15963             fnd_msg_pub.add_exc_msg
15964             ( p_pkg_name       => 'PA_FP_CALC_PLAN_PKG'
15965                 ,p_procedure_name => 'Process_skipped_records' );
15966             l_stage := 2120;
15967             print_msg(to_char(l_stage)||' substr(SQLERRM,1,240) => '|| substr(SQLERRM,1,240));
15968         IF p_pa_debug_mode = 'Y' Then
15969                 pa_debug.reset_err_stack;
15970         End If;
15971             RAISE;
15972 
15973 END Process_skipped_records;
15974 /* End for bug 5028631 */
15975 
15976 
15977 END PA_FP_CALC_PLAN_PKG;