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