[Home] [Help]
PACKAGE BODY: APPS.PA_FP_GEN_FCST_AMT_PUB
Source
1 PACKAGE body PA_FP_GEN_FCST_AMT_PUB as
2 /* $Header: PAFPFGPB.pls 120.25.12020000.3 2013/06/07 10:43:38 bpottipa ship $ */
3
4
5 P_PA_DEBUG_MODE varchar2(1) := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
6
7 -----------------------------------------------------------------------
8 --------- Forward declarations for local/private procedures -----------
9 -----------------------------------------------------------------------
10
11 PROCEDURE UPD_REV_CALCULATION_ERR
12 (P_PROJECT_ID IN PA_PROJECTS_ALL.PROJECT_ID%TYPE,
13 P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
14 P_FP_COLS_REC IN PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
15 P_ETC_START_DATE IN DATE,
16 P_CALLED_MODE IN VARCHAR2 DEFAULT 'SELF_SERVICE',
17 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
18 X_MSG_COUNT OUT NOCOPY NUMBER,
19 X_MSG_DATA OUT NOCOPY VARCHAR2 );
20
21 ------------------------------------------------------------------------------
22 --------- END OF Forward declarations for local/private procedures -----------
23 ------------------------------------------------------------------------------
24
25 /**GENERATE_FCST_AMT_WRP is called from PA_FP_GEN_FCST_PG_PKG.UPD_VER_DTLS_AND_GEN_AMT,
26 *which was called directly from forecast generation page.
27 **/
28 PROCEDURE GENERATE_FCST_AMT_WRP
29 ( P_PROJECT_ID IN PA_PROJECTS_ALL.PROJECT_ID%TYPE,
30 P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
31 P_FP_COLS_REC IN PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
32 P_CALLED_MODE IN VARCHAR2,
33 P_COMMIT_FLAG IN VARCHAR2,
34 P_INIT_MSG_FLAG IN VARCHAR2,
35 P_VERSION_TYPE IN PA_BUDGET_VERSIONS.VERSION_TYPE%TYPE,
36 P_UNSPENT_AMT_FLAG IN PA_PROJ_FP_OPTIONS.GEN_COST_INCL_UNSPENT_AMT_FLAG%TYPE,
37 P_UNSPENT_AMT_PERIOD IN VARCHAR2,
38 P_INCL_CHG_DOC_FLAG IN PA_PROJ_FP_OPTIONS.GEN_COST_INCL_CHANGE_DOC_FLAG%TYPE,
39 P_INCL_OPEN_CMT_FLAG IN PA_PROJ_FP_OPTIONS.GEN_COST_INCL_OPEN_COMM_FLAG%TYPE,
40 P_INCL_BILL_EVT_FLAG IN PA_PROJ_FP_OPTIONS.GEN_REV_INCL_BILL_EVENT_FLAG%TYPE,
41 P_RET_MANUAL_LNS_FLAG IN PA_PROJ_FP_OPTIONS.GEN_COST_RET_MANUAL_LINE_FLAG%TYPE,
42 P_PLAN_TYPE_ID IN PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE,
43 P_PLAN_VERSION_ID IN PA_PROJ_FP_OPTIONS.FIN_PLAN_VERSION_ID%TYPE,
44 P_PLAN_VERSION_NAME IN PA_BUDGET_VERSIONS.VERSION_NAME%TYPE,
45 P_ETC_PLAN_TYPE_ID IN PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE,
46 P_ETC_PLAN_VERSION_ID IN PA_PROJ_FP_OPTIONS.FIN_PLAN_VERSION_ID%TYPE,
47 P_ETC_PLAN_VERSION_NAME IN PA_BUDGET_VERSIONS.VERSION_NAME%TYPE,
48 P_ACTUALS_FROM_PERIOD IN VARCHAR2,
49 P_ACTUALS_TO_PERIOD IN VARCHAR2,
50 P_ETC_FROM_PERIOD IN VARCHAR2,
51 P_ETC_TO_PERIOD IN VARCHAR2,
52 P_ACTUALS_THRU_PERIOD IN PA_BUDGET_VERSIONS.ACTUAL_AMTS_THRU_PERIOD%TYPE,
53 P_ACTUALS_THRU_DATE IN PA_PERIODS_ALL.END_DATE%TYPE,
54 P_WP_STRUCTURE_VERSION_ID IN PA_PROJ_ELEM_VER_STRUCTURE.ELEMENT_VERSION_ID%TYPE,
55 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
56 X_MSG_COUNT OUT NOCOPY NUMBER,
57 X_MSG_DATA OUT NOCOPY VARCHAR2) IS
58
59 l_module_name VARCHAR2(200) := 'pa.plsql.pa_fp_gen_fcst_amt_pub.generate_fcst_amt_wrp';
60 l_cost_version_id PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE;
61 l_ci_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
62 l_gen_res_asg_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
63 l_deleted_res_asg_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
64
65 l_rev_gen_method VARCHAR2(3);
66 l_error_msg VARCHAR2(30);
67 l_msg_count NUMBER;
68 l_msg_data VARCHAR2(2000);
69 l_data VARCHAR2(2000);
70 l_msg_index_out NUMBER:=0;
71
72 l_count NUMBER;
73 l_dummy NUMBER;
74 l_task_count NUMBER;
75
76 l_src_plan_class_code pa_fin_plan_types_b.plan_class_code%type;
77 l_src_version_type pa_budget_versions.version_type%type;
78 lx_deleted_res_asg_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
79 lx_gen_res_asg_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
80
81 -- BEGIN Bug 10298995 : Added for Viasat enhancement
82 cursor res_asgn_csr IS
83 select resource_assignment_id, txn_currency_code
84 from pa_resource_asgn_curr
85 where budget_version_id = P_BUDGET_VERSION_ID;
86
87 l_res_asgn_id_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
88 l_txn_curr_code_tab SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
89 -- END Bug 10298995 : Added for Viasat enhancement
90 -- Bug 4592564: Removed variables for Unspent Amounts option.
91
92 -- Added as part of fix for Bug 4232094
93 l_budget_generation_flow_flag VARCHAR2(1) := 'N';
94
95 l_call_maintain_data_api VARCHAR2(1);
96
97 --Bug 8557807
98 l_ci_id_tbl SYSTEM.pa_num_tbl_type:=SYSTEM.PA_NUM_TBL_TYPE();
99 l_translated_msgs_tbl SYSTEM.pa_varchar2_2000_tbl_type;
100 l_translated_err_msg_count NUMBER;
101 l_translated_err_msg_level_tbl SYSTEM.pa_varchar2_30_tbl_type;
102 l_budget_version_id_tbl SYSTEM.pa_num_tbl_type:=SYSTEM.PA_NUM_TBL_TYPE();
103 l_impl_cost_flag_tbl SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
104 l_impl_rev_flag_tbl SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
105
106 BEGIN
107 /* hr_utility.trace_on(null,'mftest');
108 hr_utility.trace('---BEGIN---'); */
109 IF P_INIT_MSG_FLAG = 'Y' THEN
110 FND_MSG_PUB.initialize;
111 END IF;
112 X_MSG_COUNT := 0;
113 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
114
115 IF p_pa_debug_mode = 'Y' THEN
116 pa_debug.set_curr_function( p_function => 'GENERATE_FCST_AMT_WRP',
117 p_debug_mode => p_pa_debug_mode);
118 END IF;
119
120 IF P_PA_DEBUG_MODE = 'Y' THEN
121 pa_fp_gen_amount_utils.fp_debug
122 (p_called_mode => P_CALLED_MODE,
123 p_msg =>
124 'Before calling PA_FP_GEN_BUDGET_AMT_PUB.UPDATE_BV_FOR_GEN_DATE',
125 p_module_name => l_module_name);
126 END IF;
127 PA_FP_GEN_BUDGET_AMT_PUB.UPDATE_BV_FOR_GEN_DATE
128 (P_PROJECT_ID => P_PROJECT_ID,
129 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
130 P_ETC_START_DATE => P_ACTUALS_THRU_DATE + 1,
131 X_RETURN_STATUS => X_RETURN_STATUS,
132 X_MSG_COUNT => X_MSG_COUNT,
133 X_MSG_DATA => X_MSG_DATA);
134 IF P_PA_DEBUG_MODE = 'Y' THEN
135 pa_fp_gen_amount_utils.fp_debug
136 (p_called_mode => P_CALLED_MODE,
137 p_msg => 'After calling PA_FP_GEN_BUDGET_AMT_PUB.UPDATE_BV_FOR_GEN_DATE,
138 ret status: '||x_return_status,
139 p_module_name => l_module_name);
140 END IF;
141
142 DELETE FROM PA_FP_CALC_AMT_TMP1;
143 DELETE FROM PA_FP_CALC_AMT_TMP2;
144 IF p_fp_cols_rec.x_gen_incl_open_comm_flag = 'Y' THEN
145 IF p_pa_debug_mode = 'Y' THEN
146 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
147 P_CALLED_MODE => P_CALLED_MODE,
148 P_MSG => 'Before calling pa_fp_commitment_amounts.'||
149 'get_commitment_amts',
150 P_MODULE_NAME => l_module_name);
151 END IF;
152 PA_FP_COMMITMENT_AMOUNTS.GET_COMMITMENT_AMTS
153 (P_PROJECT_ID => P_PROJECT_ID,
154 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
155 P_FP_COLS_REC => p_fp_cols_rec,
156 PX_GEN_RES_ASG_ID_TAB => l_gen_res_asg_id_tab,
157 PX_DELETED_RES_ASG_ID_TAB => l_deleted_res_asg_id_tab,
158 X_RETURN_STATUS => X_RETURN_STATUS,
159 X_MSG_COUNT => X_MSG_COUNT,
160 X_MSG_DATA => X_MSG_DATA);
161 --dbms_output.put_line('??x_msg_count:'||x_msg_count);
162 x_msg_count := 0;
163 IF p_pa_debug_mode = 'Y' THEN
164 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
165 P_CALLED_MODE => P_CALLED_MODE,
166 P_MSG => 'After calling pa_fp_commitment_amounts.'||
167 'get_commitment_amts: '||x_return_status,
168 P_MODULE_NAME => l_module_name);
169 END IF;
170 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
171 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
172 END IF;
173 END IF;
174
175 IF p_etc_plan_type_id IS NOT NULL AND
176 p_etc_plan_version_id IS NOT NULL THEN
177
178 SELECT plan_class_code
179 INTO l_src_plan_class_code
180 FROM pa_fin_plan_types_b
181 WHERE fin_plan_type_id = P_ETC_PLAN_TYPE_ID;
182
183 SELECT version_type
184 INTO l_src_version_type
185 FROM pa_budget_versions
186 WHERE budget_version_id = P_ETC_PLAN_VERSION_ID;
187
188 END IF;
189
190 -- Bug 4130319: Moved initialization of l_rev_gen_method from below.
191 -- Before, it was being set after the call to COPY_ACTUALS for the
192 -- Event-based Revenue and Resource Schedule cases.
193 l_rev_gen_method := nvl(P_FP_COLS_REC.X_REVENUE_DERIVATION_METHOD,PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(p_project_id)); --Bug 5462471
194 --l_rev_gen_method := PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(p_project_id);
195
196 -- Bug 4114589: We call the Copy Actuals API for these two cases here,
197 -- and postpone calling it until after CREATE_RES_ASG and UPDATE_RES_ASG
198 -- have been called in the remaining two cases (see conditional logic below).
199 IF (P_FP_COLS_REC.X_VERSION_TYPE = 'REVENUE' AND l_rev_gen_method = 'E') OR
200 (P_FP_COLS_REC.X_GEN_ETC_SRC_CODE = 'RESOURCE_SCHEDULE') THEN
201 IF p_pa_debug_mode = 'Y' THEN
202 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
203 P_CALLED_MODE => P_CALLED_MODE,
204 P_MSG => 'Before calling pa_fp_copy_actuals_pub.copy_actuals',
205 P_MODULE_NAME => l_module_name);
206 END IF;
207 PA_FP_COPY_ACTUALS_PUB.COPY_ACTUALS
208 (P_PROJECT_ID => P_PROJECT_ID,
209 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
210 P_FP_COLS_REC => P_fp_cols_rec,
211 P_END_DATE => P_ACTUALS_THRU_DATE,
212 P_INIT_MSG_FLAG => 'N',
213 P_COMMIT_FLAG => 'N',
214 X_RETURN_STATUS => X_RETURN_STATUS,
215 X_MSG_COUNT => X_MSG_COUNT,
216 X_MSG_DATA => X_MSG_DATA);
217 IF p_pa_debug_mode = 'Y' THEN
218 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
219 P_CALLED_MODE => P_CALLED_MODE,
220 P_MSG => 'After calling pa_fp_copy_actuals_pub.copy_actuals:'
221 ||x_return_status,
222 P_MODULE_NAME => l_module_name);
223 END IF;
224 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
225 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
226 END IF;
227 END IF;
228
229 --dbms_output.put_line('++P_FP_COLS_REC.X_GEN_ETC_SRC_CODE is :' ||P_FP_COLS_REC.X_GEN_ETC_SRC_CODE);
230 IF P_FP_COLS_REC.X_VERSION_TYPE = 'REVENUE' AND l_rev_gen_method = 'E' THEN
231 /*Skip both resource_schedule and task_level_sel*/
232 l_dummy := 1;
233 ELSIF P_FP_COLS_REC.X_GEN_ETC_SRC_CODE = 'RESOURCE_SCHEDULE' THEN
234 -- Bug 4222555: When the Target is a Revenue version and the accrual
235 -- method is Cost, we need to call the GEN_REV_BDGT_AMT_RES_SCH_WRP API.
236 IF p_fp_cols_rec.x_version_type = 'REVENUE' AND l_rev_gen_method = 'C' THEN
237 IF p_pa_debug_mode = 'Y' THEN
238 pa_fp_gen_amount_utils.fp_debug
239 ( p_called_mode => p_called_mode,
240 p_msg => 'Before calling
241 pa_fp_gen_budget_amt_pub.gen_rev_bdgt_amt_res_sch_wrp',
242 p_module_name => l_module_name,
243 p_log_level => 5 );
244 END IF;
245 --hr_utility.trace('before PA_FP_GEN_BUDGET_AMT_PUB.GEN_REV_BDGT_AMT_RES_SCH_WRP');
246 PA_FP_GEN_BUDGET_AMT_PUB.GEN_REV_BDGT_AMT_RES_SCH_WRP
247 ( P_PROJECT_ID => P_PROJECT_ID,
248 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
249 P_FP_COLS_REC => P_fp_cols_rec,
250 P_PLAN_CLASS_CODE => P_fp_cols_rec.x_plan_class_code,
251 P_GEN_SRC_CODE => P_fp_cols_rec.x_gen_etc_src_code,
252 P_COST_PLAN_TYPE_ID => P_fp_cols_rec.x_gen_src_plan_type_id,
253 p_COST_VERSION_ID => l_cost_version_id,
254 P_RETAIN_MANUAL_FLAG => P_fp_cols_rec.x_gen_ret_manual_line_flag,
255 P_CALLED_MODE => P_CALLED_MODE,
256 P_INC_CHG_DOC_FLAG => P_fp_cols_rec.x_gen_incl_change_doc_flag,
257 P_INC_BILL_EVENT_FLAG => P_fp_cols_rec.x_gen_incl_bill_event_flag,
258 P_INC_OPEN_COMMIT_FLAG => P_fp_cols_rec.x_gen_incl_open_comm_flag,
259 P_ACTUALS_THRU_DATE => P_ACTUALS_THRU_DATE,
260 P_CI_ID_TAB => l_ci_id_tab,
261 PX_GEN_RES_ASG_ID_TAB => l_gen_res_asg_id_tab,
262 PX_DELETED_RES_ASG_ID_TAB => l_deleted_res_asg_id_tab,
263 P_COMMIT_FLAG => 'N',
264 P_INIT_MSG_FLAG => 'N',
265 X_RETURN_STATUS => X_RETURN_STATUS,
266 X_MSG_COUNT => X_MSG_COUNT,
267 X_MSG_DATA => X_MSG_DATA );
268 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
269 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
270 END IF;
271 IF p_pa_debug_mode = 'Y' THEN
272 pa_fp_gen_amount_utils.fp_debug
273 ( p_called_mode => p_called_mode,
274 p_msg => 'Status after calling pa_fp_gen_budget_amt_pub.'||
275 'gen_rev_bdgt_amt_res_sch_wrp:'||x_return_status,
276 p_module_name => l_module_name,
277 p_log_level => 5 );
278 END IF;
279 ELSE
280 IF p_pa_debug_mode = 'Y' THEN
281 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
282 P_CALLED_MODE => P_CALLED_MODE,
283 P_MSG => 'Before calling pa_fp_gen_budget_amt_pub.'||
284 'generate_budget_amt_res_sch',
285 P_MODULE_NAME => l_module_name);
286 END IF;
287 PA_FP_GEN_BUDGET_AMT_PUB.GENERATE_BUDGET_AMT_RES_SCH
288 (P_PROJECT_ID => P_PROJECT_ID,
289 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
290 P_FP_COLS_REC => P_fp_cols_rec,
291 P_PLAN_CLASS_CODE => P_fp_cols_rec.x_plan_class_code,
292 P_GEN_SRC_CODE => P_fp_cols_rec.x_gen_etc_src_code,
293 P_COST_PLAN_TYPE_ID => P_fp_cols_rec.x_gen_src_plan_type_id,
294 p_COST_VERSION_ID => l_cost_version_id,
295 P_RETAIN_MANUAL_FLAG => P_fp_cols_rec.x_gen_ret_manual_line_flag,
296 P_CALLED_MODE => P_CALLED_MODE,
297 P_INC_CHG_DOC_FLAG => P_fp_cols_rec.x_gen_incl_change_doc_flag,
298 P_INC_BILL_EVENT_FLAG => P_fp_cols_rec.x_gen_incl_bill_event_flag,
299 P_INC_OPEN_COMMIT_FLAG => P_fp_cols_rec.x_gen_incl_open_comm_flag,
300 P_ACTUALS_THRU_DATE => P_ACTUALS_THRU_DATE,
301 P_CI_ID_TAB => l_ci_id_tab,
302 PX_GEN_RES_ASG_ID_TAB => l_gen_res_asg_id_tab,
303 PX_DELETED_RES_ASG_ID_TAB => l_deleted_res_asg_id_tab,
304 P_COMMIT_FLAG => 'N',
305 P_INIT_MSG_FLAG => 'N',
306 X_RETURN_STATUS => X_RETURN_STATUS,
307 X_MSG_COUNT => X_MSG_COUNT,
308 X_MSG_DATA => X_MSG_DATA);
309 IF p_pa_debug_mode = 'Y' THEN
310 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
311 P_CALLED_MODE => P_CALLED_MODE,
312 P_MSG => 'After calling pa_fp_gen_budget_amt_pub.'||
313 'generate_budget_amt_res_sch: '||x_return_status,
314 P_MODULE_NAME => l_module_name);
315 END IF;
316 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
317 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
318 END IF;
319 END IF; -- cost-based revenue check
320 ELSIF P_FP_COLS_REC.X_VERSION_TYPE = 'REVENUE' AND
321 p_etc_plan_type_id IS NOT NULL AND
322 l_src_plan_class_code = 'FORECAST' AND
323 (l_src_version_type = 'COST' OR l_src_version_type = 'ALL') THEN
324
325 -- Added as part of fix for Bug 4232094
326 l_budget_generation_flow_flag := 'Y';
327
328 /* For revenue fcst generation, source can only be cost and all.
329 From revenue version is provented from UI.
330 Revenue fcst generation should follow the budget generation logic.*/
331 IF p_pa_debug_mode = 'Y' THEN
332 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
333 P_CALLED_MODE => P_CALLED_MODE,
334 P_MSG =>
335 'Before calling PA_FP_WP_GEN_BUDGET_AMT_PUB.'||
336 'GENERATE_WP_BUDGET_AMT',
337 P_MODULE_NAME => l_module_name);
338 END IF;
339 PA_FP_WP_GEN_BUDGET_AMT_PUB.GENERATE_WP_BUDGET_AMT
340 (P_PROJECT_ID => P_PROJECT_ID,
341 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
342 P_PLAN_CLASS_CODE => 'FORECAST',
343 P_GEN_SRC_CODE => 'FINANCIAL_PLAN',
344 P_COST_PLAN_TYPE_ID => NULL,
345 P_COST_VERSION_ID => NULL,
346 P_RETAIN_MANUAL_FLAG => P_RET_MANUAL_LNS_FLAG,
347 P_CALLED_MODE => P_CALLED_MODE,
348 P_INC_CHG_DOC_FLAG => P_INCL_CHG_DOC_FLAG,
349 P_INC_BILL_EVENT_FLAG => P_INCL_BILL_EVT_FLAG,
350 P_INC_OPEN_COMMIT_FLAG => P_INCL_OPEN_CMT_FLAG,
351 --P_CI_ID_TAB
352 P_INIT_MSG_FLAG => 'N',
353 P_COMMIT_FLAG => 'N',
354 P_CALLING_CONTEXT => 'FORECAST_GENERATION',
355 P_ETC_PLAN_TYPE_ID => P_ETC_PLAN_TYPE_ID,
356 P_ETC_PLAN_VERSION_ID => P_ETC_PLAN_VERSION_ID,
357 --P_ETC_PLAN_VERSION_NAME
358 P_ACTUALS_THRU_DATE => P_ACTUALS_THRU_DATE,
359 PX_DELETED_RES_ASG_ID_TAB => lx_deleted_res_asg_id_tab,
360 PX_GEN_RES_ASG_ID_TAB => lx_gen_res_asg_id_tab,
361 X_RETURN_STATUS => X_RETURN_STATUS,
362 X_MSG_COUNT => X_MSG_COUNT,
363 X_MSG_DATA => X_MSG_DATA );
364 IF p_pa_debug_mode = 'Y' THEN
365 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
366 P_CALLED_MODE => P_CALLED_MODE,
367 P_MSG =>
368 'After calling PA_FP_WP_GEN_BUDGET_AMT_PUB.'||
369 'GENERATE_WP_BUDGET_AMT: '||x_return_status,
370 P_MODULE_NAME => l_module_name);
371 END IF;
372 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
373 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
374 END IF;
375 ELSE
376 IF p_pa_debug_mode = 'Y' THEN
377 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
378 P_CALLED_MODE => P_CALLED_MODE,
379 P_MSG => 'Before calling pa_fp_gen_fcst_amt_pub.'||
380 'gen_fcst_task_level_amt',
381 P_MODULE_NAME => l_module_name);
382 END IF;
383 PA_FP_GEN_FCST_AMT_PUB.GEN_FCST_TASK_LEVEL_AMT
384 (P_PROJECT_ID => P_PROJECT_ID,
385 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
386 P_FP_COLS_REC => P_FP_COLS_REC,
387 P_WP_STRUCTURE_VERSION_ID => P_WP_STRUCTURE_VERSION_ID,
388 P_ETC_FP_PLAN_VERSION_ID => P_ETC_PLAN_VERSION_ID,
389 P_ACTUALS_THRU_DATE => P_ACTUALS_THRU_DATE,
390 P_ACTUALS_FROM_PERIOD => P_ACTUALS_FROM_PERIOD,
391 P_ACTUALS_TO_PERIOD => P_ACTUALS_TO_PERIOD,
392 P_ETC_FROM_PERIOD => P_ETC_FROM_PERIOD,
393 P_ETC_TO_PERIOD => P_ETC_TO_PERIOD,
394 X_RETURN_STATUS => X_RETURN_STATUS,
395 X_MSG_COUNT => X_MSG_COUNT,
396 X_MSG_DATA => X_MSG_DATA);
397
398 IF p_pa_debug_mode = 'Y' THEN
399 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
400 P_CALLED_MODE => P_CALLED_MODE,
401 P_MSG => 'After calling pa_fp_gen_fcst_amt_pub.'||
402 'gen_fcst_task_level_amt: '||x_return_status,
403 P_MODULE_NAME => l_module_name);
404 END IF;
405 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
406 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
407 END IF;
408 END IF;
409
410 --hr_utility.trace('p_fp_cols_rec.x_gen_incl_open_comm_flag:'||p_fp_cols_rec.x_gen_incl_open_comm_flag);
411 /* IF p_pa_debug_mode = 'Y' THEN
412 pa_fp_gen_amount_utils.fp_debug
413 (p_msg => 'Value of gen_incl_open_comm_flag: '||p_fp_cols_rec.x_gen_incl_open_comm_flag,
414 p_module_name => l_module_name,
415 p_log_level => 5);
416 END IF;*/
417
418 /*IF p_pa_debug_mode = 'Y' THEN
419 pa_fp_gen_amount_utils.fp_debug
420 (p_msg => 'Value of gen_incl_change_doc_flag: '||p_fp_cols_rec.x_gen_incl_change_doc_flag,
421 p_module_name => l_module_name,
422 p_log_level => 5);
423 END IF;*/
424
425 IF p_fp_cols_rec.x_gen_incl_open_comm_flag = 'Y' THEN
426 IF p_pa_debug_mode = 'Y' THEN
427 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
428 P_CALLED_MODE => P_CALLED_MODE,
429 P_MSG => 'Before calling PA_FP_GEN_COMMITMENT_AMOUNTS.'||
430 'GEN_COMMITMENT_AMOUNTS',
431 P_MODULE_NAME => l_module_name);
432 END IF;
433 PA_FP_GEN_COMMITMENT_AMOUNTS.GEN_COMMITMENT_AMOUNTS
434 (P_PROJECT_ID => P_PROJECT_ID,
435 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
436 P_FP_COLS_REC => p_fp_cols_rec,
437 PX_GEN_RES_ASG_ID_TAB => l_gen_res_asg_id_tab,
438 PX_DELETED_RES_ASG_ID_TAB => l_deleted_res_asg_id_tab,
439 X_RETURN_STATUS => X_RETURN_STATUS,
440 X_MSG_COUNT => X_MSG_COUNT,
441 X_MSG_DATA => X_MSG_DATA);
442 IF p_pa_debug_mode = 'Y' THEN
443 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
444 P_CALLED_MODE => P_CALLED_MODE,
445 P_MSG => 'After calling PA_FP_GEN_COMMITMENT_AMOUNTS.'||
446 'GEN_COMMITMENT_AMOUNTS: '||x_return_status,
447 P_MODULE_NAME => l_module_name);
448 END IF;
449 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
450 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
451 END IF;
452 END IF;--p_fp_cols_rec.x_gen_incl_open_comm_flag = 'Y'
453
454 --dbms_output.put_line('++Before reven++');
455 --dbms_output.put_line('??x_msg_count:'||x_msg_count);
456 /* IF p_pa_debug_mode = 'Y' THEN
457 pa_fp_gen_amount_utils.fp_debug
458 (p_msg => 'Value of version_type: '||p_fp_cols_rec.x_version_type,
459 p_module_name => l_module_name,
460 p_log_level => 5);
461 END IF;*/
462 --------------FOR REVENUE: FROM PAFPGAMB.pls------
463 IF (p_fp_cols_rec.x_version_type = 'ALL'
464 OR p_fp_cols_rec.x_version_type = 'REVENUE')
465 AND l_rev_gen_method = 'C' THEN
466
467 -- Bug 4232094: When the Target version is Revenue with accrual method
468 -- of Cost, time phasing is None, and the code did not go through the
469 -- budget generation flow (PAFPWPGB), then we need to call the currency
470 -- conversion API.
471
472 -- Bug 4549862: When generating a Cost and Revenue together version
473 -- from Staffing Plan with revenue accrual method of COST, the
474 -- currency conversion step is performed on the PA_FP_ROLLUP_TMP
475 -- table (instead of pa_budget_lines) earlier in the code flow by the
476 -- GENERATE_BUDGET_AMT_RES_SCH API so that pc/pfc Commitment amounts
477 -- can be honored. We should not call the currency conversion API in
478 -- this case.
479
480 IF ( p_fp_cols_rec.x_version_type = 'ALL' AND
481 p_fp_cols_rec.x_gen_etc_src_code <> 'RESOURCE_SCHEDULE' ) OR
482 (l_budget_generation_flow_flag = 'N' AND
483 p_fp_cols_rec.x_version_type = 'REVENUE' AND
484 l_rev_gen_method = 'C' AND
485 p_fp_cols_rec.x_time_phased_code = 'N') THEN
486 --Calling the currency conversion API
487 IF p_pa_debug_mode = 'Y' THEN
488 pa_fp_gen_amount_utils.fp_debug
489 (p_called_mode => p_called_mode,
490 p_msg => 'Before calling
491 pa_fp_multi_currency_pkg.convert_txn_currency',
492 p_module_name => l_module_name,
493 p_log_level => 5);
494 END IF;
495 PA_FP_MULTI_CURRENCY_PKG.CONVERT_TXN_CURRENCY
496 (p_budget_version_id => P_BUDGET_VERSION_ID,
497 p_entire_version => 'Y',
498 p_calling_module => 'FORECAST_GENERATION', -- Added for Bug#5395732
499 X_RETURN_STATUS => X_RETURN_STATUS,
500 X_MSG_COUNT => X_MSG_COUNT,
501 X_MSG_DATA => X_MSG_DATA);
502 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
503 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
504 END IF;
505
506 IF p_pa_debug_mode = 'Y' THEN
507 pa_fp_gen_amount_utils.fp_debug
508 (p_called_mode => p_called_mode,
509 p_msg => 'Status after calling
510 pa_fp_multi_currency_pkg.convert_txn_currency: '
511 ||x_return_status,
512 p_module_name => l_module_name,
513 p_log_level => 5);
514 END IF;
515 END IF;
516
517 /* Calling rollup budget version api
518 rollup amounts for the version level not required as the
519 amounts are derived from budget lines data
520 IF p_pa_debug_mode = 'Y' THEN
521 pa_fp_gen_amount_utils.fp_debug
522 (p_called_mode => p_called_mode,
523 p_msg => 'Before calling
524 pa_fp_rollup_pkg.rollup_budget_version',
525 p_module_name => l_module_name,
526 p_log_level => 5);
527 END IF;
528 PA_FP_ROLLUP_PKG.ROLLUP_BUDGET_VERSION
529 (p_budget_version_id => P_BUDGET_VERSION_ID,
530 p_entire_version => 'Y',
531 X_RETURN_STATUS => X_RETURN_STATUS,
532 X_MSG_COUNT => X_MSG_COUNT,
533 X_MSG_DATA => X_MSG_DATA);
534
535 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
536 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
537 END IF;
538 IF p_pa_debug_mode = 'Y' THEN
539 pa_fp_gen_amount_utils.fp_debug
540 (p_called_mode => p_called_mode,
541 p_msg => 'Status after calling
542 pa_fp_rollup_pkg.rollup_budget_version: '
543 ||x_return_status,
544 p_module_name => l_module_name,
545 p_log_level => 5);
546 END IF;
547 IF p_pa_debug_mode = 'Y' THEN
548 pa_fp_gen_amount_utils.fp_debug
549 (p_msg => 'Value of project_value: '||p_fp_cols_rec.x_project_value,
550 p_module_name => l_module_name,
551 p_log_level => 5);
552 END IF;
553 IF p_fp_cols_rec.x_project_value IS NULL THEN
554 PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
555 p_msg_name => 'PA_FCST_NO_PRJ_VALUE');
556 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
557 END IF;
558 the error for project value null chk is handled in
559 gen cost based revenue gen API */
560 --Calling gen cost based revenue api
561 IF p_pa_debug_mode = 'Y' THEN
562 pa_fp_gen_amount_utils.fp_debug
563 (p_called_mode => p_called_mode,
564 p_msg => 'Before calling
565 pa_fp_rev_gen_pub.gen_cost_based_revenue',
566 p_module_name => l_module_name,
567 p_log_level => 5);
568 END IF;
569 --hr_utility.trace('---calling cost based rev gen---');
570 PA_FP_REV_GEN_PUB.GEN_COST_BASED_REVENUE
571 (P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
572 P_FP_COLS_REC => p_fp_cols_rec,
573 P_ETC_START_DATE => P_ACTUALS_THRU_DATE + 1,
574 X_RETURN_STATUS => X_RETURN_STATUS,
575 X_MSG_COUNT => X_MSG_COUNT,
576 X_MSG_DATA => X_MSG_DATA);
577 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
578 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
579 END IF;
580 IF p_pa_debug_mode = 'Y' THEN
581 pa_fp_gen_amount_utils.fp_debug
582 (p_called_mode => p_called_mode,
583 p_msg => 'Status after calling
584 pa_fp_rev_gen_pub.gen_cost_based_revenue'
585 ||x_return_status,
586 p_module_name => l_module_name,
587 p_log_level => 5);
588 END IF;
589 END IF;
590
591 -- Bug 4592564: Removed Unspent Amounts API call and related logic for
592 -- getting the Source Approved Budget version.
593
594 /*Only for ALL or Revenue version, revenue generation method can be set
595 and include billing event flag can be chosen. This logic is implemented
596 in both here and UI*/
597 IF (p_fp_cols_rec.x_version_type = 'ALL'
598 OR p_fp_cols_rec.x_version_type = 'REVENUE')
599 AND (l_rev_gen_method = 'E'
600 OR p_fp_cols_rec.x_gen_incl_bill_event_flag = 'Y') THEN
601 --Calling Billing Events API
602 IF p_pa_debug_mode = 'Y' THEN
603 pa_fp_gen_amount_utils.fp_debug
604 (p_called_mode => p_called_mode,
605 p_msg => 'Before calling
606 pa_fp_gen_billing_amounts.gen_billing_amounts',
607 p_module_name => l_module_name,
608 p_log_level => 5);
609 END IF;
610 PA_FP_GEN_BILLING_AMOUNTS.GEN_BILLING_AMOUNTS
611 (P_PROJECT_ID => P_PROJECT_ID,
612 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
613 P_FP_COLS_REC => p_fp_cols_rec,
614 PX_GEN_RES_ASG_ID_TAB => l_gen_res_asg_id_tab,
615 P_ETC_START_DATE => P_ACTUALS_THRU_DATE + 1,
616 PX_DELETED_RES_ASG_ID_TAB => l_deleted_res_asg_id_tab,
617 X_RETURN_STATUS => X_RETURN_STATUS,
618 X_MSG_COUNT => X_MSG_COUNT,
619 X_MSG_DATA => X_MSG_DATA);
620
621 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
622 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
623 END IF;
624 IF p_pa_debug_mode = 'Y' THEN
625 pa_fp_gen_amount_utils.fp_debug
626 (p_called_mode => p_called_mode,
627 p_msg => 'Status after calling
628 pa_fp_gen_billing_amounts.gen_billing_amounts: '
629 ||x_return_status,
630 p_module_name => l_module_name,
631 p_log_level => 5);
632 END IF;
633 END IF;
634
635 IF p_fp_cols_rec.x_version_type = 'REVENUE' THEN
636 IF p_pa_debug_mode = 'Y' THEN
637 pa_fp_gen_amount_utils.fp_debug
638 (p_called_mode => p_called_mode,
639 p_msg => 'Before calling
640 pa_fp_gen_budget_amt_pub.reset_cost_amounts',
641 p_module_name => l_module_name,
642 p_log_level => 5);
643 END IF;
644 --hr_utility.trace('######Calling RESET_COST_AMOUNTS');
645 PA_FP_GEN_BUDGET_AMT_PUB.RESET_COST_AMOUNTS
646 (P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
647 X_RETURN_STATUS => X_RETURN_STATUS,
648 X_MSG_COUNT => X_MSG_COUNT,
649 X_MSG_DATA => X_MSG_DATA);
650 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
651 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
652 END IF;
653 IF p_pa_debug_mode = 'Y' THEN
654 pa_fp_gen_amount_utils.fp_debug
655 (p_called_mode => p_called_mode,
656 p_msg => 'Status after calling
657 pa_fp_gen_budget_amt_pub.reset_cost_amounts: '
658 ||x_return_status,
659 p_module_name => l_module_name,
660 p_log_level => 5);
661 END IF;
662 END IF;
663 --dbms_output.put_line('??x_msg_count:'||x_msg_count);
664 --dbms_output.put_line('++Exiting rev part++');
665 -----------------------------------
666
667 -- Start Bug 8557807.
668 -- The change orders are getting lost when forecast is generated as system
669 -- deletes all the budget line and regenerates the same but in doing so
670 -- the system is not regenrating the change order changes and hence it
671 -- not visible for next include nor its amounts are seen budget.
672 IF P_fp_cols_rec.x_gen_ret_manual_line_flag <> 'Y' THEN
673
674 IF p_pa_debug_mode = 'Y' THEN
675 pa_fp_gen_amount_utils.fp_debug
676 (p_msg => 'Before calling
677 pa_fp_ci_merge.implement_change_document',
678 p_module_name => l_module_name,
679 p_log_level => 5);
680 END IF;
681
682 SELECT pfmci.ci_id
683 BULK COLLECT
684 INTO l_ci_id_tbl
685 FROM pa_fp_merged_ctrl_items pfmci
686 WHERE pfmci.plan_version_id = P_FP_COLS_REC.X_BUDGET_VERSION_ID
687 AND NOT EXISTS ( SELECT 1 FROM pa_fp_merged_ctrl_items pfmci1
688 WHERE pfmci1.plan_version_id = P_FP_COLS_REC.X_GEN_SRC_PLAN_VERSION_ID
689 AND pfmci.ci_id = pfmci1.ci_id);
690
691 l_budget_version_id_tbl.extend;
692 l_budget_version_id_tbl(1) := P_FP_COLS_REC.X_BUDGET_VERSION_ID;
693
694 DELETE
695 FROM pa_fp_merged_ctrl_items pfmci
696 WHERE pfmci.plan_version_id = P_FP_COLS_REC.X_BUDGET_VERSION_ID
697 AND NOT EXISTS ( SELECT 1 FROM pa_fp_merged_ctrl_items pfmci1
698 WHERE pfmci1.plan_version_id = P_FP_COLS_REC.X_GEN_SRC_PLAN_VERSION_ID
699 AND pfmci.ci_id = pfmci1.ci_id);
700
701
702 PA_FP_CI_MERGE.implement_change_document
703 (p_context =>
704 'INCLUDE',
705 p_calling_context =>
706 'FORECAST_GENERATION',
707 p_ci_id_tbl =>
708 l_ci_id_tbl,
709 p_budget_version_id_tbl =>
710 l_budget_version_id_tbl,
711 p_impl_cost_flag_tbl =>
712 l_impl_cost_flag_tbl,
713 p_impl_rev_flag_tbl =>
714 l_impl_rev_flag_tbl,
715 p_raTxn_rollup_api_call_flag =>
716 'N',
717 x_translated_msgs_tbl =>
718 l_translated_msgs_tbl,
719 x_translated_err_msg_count =>
720 l_translated_err_msg_count,
721 x_translated_err_msg_level_tbl =>
722 l_translated_err_msg_level_tbl,
723 x_return_status =>
724 x_return_status,
725 x_msg_count =>
726 x_msg_count,
727 x_msg_data =>
728 x_msg_data);
729
730
731 IF p_pa_debug_mode = 'Y' THEN
732 pa_fp_gen_amount_utils.fp_debug
733 (p_msg => 'Status after calling pa_fp_ci_merge.implement_change_document'
734 ||x_return_status,
735 p_module_name => l_module_name,
736 p_log_level => 5);
737 END IF;
738
739 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
740 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
741 END IF;
742
743 END IF;
744 -- End Bug 8557807.
745
746
747 /* calling the change document merge API after calling
748 the cost based revenue generation API for bug 3815353 */
749
750 IF p_fp_cols_rec.x_gen_incl_change_doc_flag = 'Y' THEN
751 IF p_etc_plan_version_id IS NOT NULL THEN
752 SELECT count(*)
753 INTO l_task_count
754 FROM pa_tasks
755 WHERE project_id = p_project_id
756 AND gen_etc_source_code = 'FINANCIAL_PLAN'
757 AND gen_etc_source_code IS NOT NULL;
758
759 IF l_task_count > 0 THEN
760 IF p_pa_debug_mode = 'Y' THEN
761 pa_fp_gen_amount_utils.fp_debug
762 (p_called_mode => p_called_mode,
763 p_msg => 'Before calling
764 pa_fp_ci_merge.copy_merged_ctrl_items',
765 p_module_name => l_module_name,
766 p_log_level => 5);
767 END IF;
768 PA_FP_CI_MERGE.copy_merged_ctrl_items
769 ( p_project_id => p_project_id
770 ,p_source_version_id => p_etc_plan_version_id
771 ,p_target_version_id => p_fp_cols_rec.x_budget_version_id
772 ,p_calling_context =>'GENERATION' --Bug 4247703
773 ,x_return_status => x_return_status
774 ,x_msg_count => x_msg_count
775 ,x_msg_data => x_msg_data);
776 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
777 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
778 END IF;
779 IF p_pa_debug_mode = 'Y' THEN
780 pa_fp_gen_amount_utils.fp_debug
781 (p_called_mode => p_called_mode,
782 p_msg => 'Status after calling
783 pa_fp_ci_merge.copy_merged_ctrl_items: '
784 ||x_return_status,
785 p_module_name => l_module_name,
786 p_log_level => 5);
787 END IF;
788 END IF;
789 END IF;
790 IF p_pa_debug_mode = 'Y' THEN
791 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
792 P_CALLED_MODE => P_CALLED_MODE,
793 P_MSG => 'Before calling pa_fp_gen_pub.'||
794 'include_change_document_wrp',
795 P_MODULE_NAME => l_module_name);
796 END IF;
797 --dbms_output.put_line('++Before chg doc++');
798 PA_FP_GEN_PUB.INCLUDE_CHANGE_DOCUMENT_WRP
799 (P_FP_COLS_REC => p_fp_cols_rec,
800 X_RETURN_STATUS => X_RETURN_STATUS,
801 X_MSG_COUNT => X_MSG_COUNT,
802 X_MSG_DATA => X_MSG_DATA);
803 --dbms_output.put_line('++After chg doc is: '||x_return_status);
804 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
805 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
806 END IF;
807 IF p_pa_debug_mode = 'Y' THEN
808 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
809 P_CALLED_MODE => P_CALLED_MODE,
810 P_MSG => 'After calling pa_fp_gen_pub.'||
811 'include_change_document_wrp:'||x_return_status,
812 P_MODULE_NAME => l_module_name);
813 END IF;
814
815 END IF;
816
817 -- Bug 4247669: We should not update the budget lines after calling
818 -- the MAINTAIN_BUDGET_VERSION API because it calls the PJI create
819 -- and delete APIs. Hence, moved UPDATE_TOTAL_PLAN_AMTS call before
820 -- the MAINTAIN_BUDGET_VERSION call.
821
822 /*Due to the request from workplan team, this part gets handled in
823 PA_FP_MAINTAIN_ACTUAL_PUB.MAINTAIN_ACTUAL_AMT_RA. Hence commented
824 out this part */
825
826 -- Bug 4232094: Uncommented the UPDATE_TOTAL_PLAN_AMTS API call to
827 -- address Issue 2 of the bug concerning inccorect ETC amounts being
828 -- displayed. In addition, added IF condition so that the API call
829 -- happens only when the Target is None timephased.
830
831 -- Bug 4292083: Commenting the UPDATE_TOTAL_PLAN_AMTS API call again
832 -- in favor of a different approach to updating the plan amounts. See
833 -- bug updates for more details.
834
835 /* Begin Comment for Bug 4292083 ************************************************
836
837 IF p_fp_cols_rec.x_time_phased_code = 'N' THEN
838 IF p_pa_debug_mode = 'Y' THEN
839 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
840 P_CALLED_MODE => P_CALLED_MODE,
841 P_MSG => 'Before calling pa_fp_gen_fcst_amt_pub.'||
842 'update_total_plan_amts',
843 P_MODULE_NAME => l_module_name);
844 END IF;
845 PA_FP_GEN_FCST_AMT_PVT.UPDATE_TOTAL_PLAN_AMTS
846 (P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
847 X_RETURN_STATUS => X_RETURN_STATUS,
848 X_MSG_COUNT => X_MSG_COUNT,
849 X_MSG_DATA => X_MSG_DATA);
850 --dbms_output.put_line('Status of update total plan amts api: '||X_RETURN_STATUS);
851 --dbms_output.put_line('??x_msg_count:'||x_msg_count);
852 IF p_pa_debug_mode = 'Y' THEN
853 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
854 P_CALLED_MODE => P_CALLED_MODE,
855 P_MSG => 'AFTER CALLING PA_FP_GEN_FCST_AMT_PUB.'||
856 'UPDATE_TOTAL_PLAN_AMTS:'||x_return_status,
857 P_MODULE_NAME => l_module_name);
858 END IF;
859 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
860 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
861 END IF;
862 END IF;
863
864 ** End Comment for Bug 4292083 **************************************************/
865
866 -- Call API to update pa_budget_lines.other_rejection_code
867 -- with any ETC revenue amount calculation errors.
868 -- See bug 5203622 for more details.
869 IF p_pa_debug_mode = 'Y' THEN
870 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
871 P_MSG => 'Before calling PA_FP_GEN_FCST_AMT_PUB.' ||
872 'UPD_REV_CALCULATION_ERR',
873 P_CALLED_MODE => p_called_mode,
874 P_MODULE_NAME => l_module_name);
875 END IF;
876 PA_FP_GEN_FCST_AMT_PUB.UPD_REV_CALCULATION_ERR
877 (P_PROJECT_ID => p_project_id,
878 P_BUDGET_VERSION_ID => p_budget_version_id,
879 P_FP_COLS_REC => p_fp_cols_rec,
880 P_ETC_START_DATE => p_actuals_thru_date + 1,
881 P_CALLED_MODE => p_called_mode,
882 X_RETURN_STATUS => X_RETURN_STATUS,
883 X_MSG_COUNT => X_MSG_COUNT,
884 X_MSG_DATA => X_MSG_DATA);
885 IF p_pa_debug_mode = 'Y' THEN
886 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
887 P_MSG => 'After calling PA_FP_GEN_FCST_AMT_PUB.' ||
888 'UPD_REV_CALCULATION_ERR: '||x_return_status,
889 P_CALLED_MODE => p_called_mode,
890 P_MODULE_NAME => l_module_name);
891 END IF;
892
893 --Start Bug 5726785
894
895 PA_FP_GEN_FCST_AMT_PUB1.call_clnt_extn_and_update_bl
896 (p_project_id => p_project_id
897 ,p_budget_version_id => p_budget_version_id
898 ,x_call_maintain_data_api => l_call_maintain_data_api
899 ,x_return_status => x_return_status
900 ,x_msg_count => x_msg_count
901 ,x_msg_data => x_msg_data);
902
903 IF p_pa_debug_mode = 'Y' THEN
904 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
905 P_CALLED_MODE => P_CALLED_MODE,
906 P_MSG => 'After calling pa_fp_gen_fcst_amt_pub.'||
907 'call_clnt_extn_and_update_bl '||x_return_status,
908 P_MODULE_NAME => l_module_name);
909 END IF;
910 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
911 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
912 END IF;
913
914
915
916 --End Bug 5726785
917
918
919 IF p_pa_debug_mode = 'Y' THEN
920 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
921 P_CALLED_MODE => P_CALLED_MODE,
922 P_MSG => 'Before calling PA_FP_GEN_FCST_AMT_PUB1.'||
923 'MAINTAIN_BUDGET_VERSION',
924 P_MODULE_NAME => l_module_name);
925 END IF;
926 --dbms_output.put_line('++Before pub1.maintain_bv++');
927 PA_FP_GEN_FCST_AMT_PUB1.MAINTAIN_BUDGET_VERSION
928 (P_PROJECT_ID => P_PROJECT_ID,
929 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
930 P_ETC_START_DATE => P_ACTUALS_THRU_DATE + 1,
931 P_CALL_MAINTAIN_DATA_API => L_CALL_MAINTAIN_DATA_API,
932 X_RETURN_STATUS => x_return_status,
933 X_MSG_COUNT => x_msg_count,
934 X_MSG_DATA => x_msg_data );
935 --dbms_output.put_line('++AFter pub1.maintain_bv++:'||x_return_status);
936 --dbms_output.put_line('??x_msg_count:'||x_msg_count);
937 IF p_pa_debug_mode = 'Y' THEN
938 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
939 P_CALLED_MODE => P_CALLED_MODE,
940 P_MSG => 'After calling PA_FP_GEN_FCST_AMT_PUB1.'||
941 'MAINTAIN_BUDGET_VERSION: '||x_return_status,
942 P_MODULE_NAME => l_module_name);
943 END IF;
944 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
945 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
946 END IF;
947
948 -- BEGIN bug 10298995 : Added for Viasat enhancement
949 IF (NVL(FND_PROFILE.value('PA_USE_FCST_RATE_SCHEDULE'),'N') = 'Y') THEN
950
951 OPEN res_asgn_csr;
952 FETCH res_asgn_csr BULK COLLECT INTO l_res_asgn_id_tab, l_txn_curr_code_tab;
953 CLOSE res_asgn_csr;
954
955 IF P_PA_DEBUG_MODE = 'Y' THEN
956 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
957 P_CALLED_MODE => P_CALLED_MODE,
958 P_MSG => 'Calling PA_FP_CALC_PLAN_PKG.calculate l_res_asgn_id_tab.count '|| l_res_asgn_id_tab.count,
959 P_MODULE_NAME => l_module_name);
960 END IF;
961 PA_FP_CALC_PLAN_PKG.calculate(
962 p_project_id => P_PROJECT_ID,
963 p_budget_version_id => P_BUDGET_VERSION_ID,
964 p_refresh_rates_flag => 'Y',
965 p_refresh_conv_rates_flag => 'N',
966 p_source_context => 'RESOURCE_ASSIGNMENT',
967 p_resource_assignment_tab => l_res_asgn_id_tab,
968 p_txn_currency_code_tab => l_txn_curr_code_tab,
969 x_return_status => x_return_status,
970 x_msg_count => x_msg_count,
971 x_msg_data => x_msg_data);
972
973 IF P_PA_DEBUG_MODE = 'Y' THEN
974 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
975 P_CALLED_MODE => P_CALLED_MODE,
976 P_MSG => 'After calling PA_FP_CALC_PLAN_PKG.calculate: '|| x_return_status,
977 P_MODULE_NAME => l_module_name);
978 END IF;
979 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
980 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
981 END IF;
982
983 END IF;
984 -- END bug 10298995 : Added for Viasat enhancement
985
986 IF P_COMMIT_FLAG = 'Y' THEN
987 COMMIT;
988 END IF;
989 IF p_pa_debug_mode = 'Y' THEN
990 PA_DEBUG.Reset_Curr_Function;
991 END IF;
992 --dbms_output.put_line('??END: x_msg_count:'||x_msg_count);
993 /*temp */
994 IF x_return_status = FND_API.G_RET_STS_SUCCESS THEN
995 x_msg_count := 0;
996 END IF;
997 EXCEPTION
998 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
999 l_msg_count := FND_MSG_PUB.count_msg;
1000 IF l_msg_count = 1 THEN
1001 PA_INTERFACE_UTILS_PUB.get_messages
1002 (p_encoded => FND_API.G_TRUE
1003 ,p_msg_index => 1
1004 ,p_msg_count => l_msg_count
1005 ,p_msg_data => l_msg_data
1006 ,p_data => l_data
1007 ,p_msg_index_out => l_msg_index_out);
1008 x_msg_data := l_data;
1009 x_msg_count := l_msg_count;
1010 ELSE
1011 x_msg_count := l_msg_count;
1012 END IF;
1013 ROLLBACK;
1014
1015 x_return_status := FND_API.G_RET_STS_ERROR;
1016 IF P_PA_DEBUG_MODE = 'Y' THEN
1017 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1018 P_CALLED_MODE => P_CALLED_MODE,
1019 P_MSG => 'Invalid Arguments Passed',
1020 P_MODULE_NAME => l_module_name);
1021 PA_DEBUG.Reset_Curr_Function;
1022 END IF;
1023 RAISE;
1024
1025 WHEN OTHERS THEN
1026 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1027 x_msg_data := SUBSTR(SQLERRM,1,240);
1028 FND_MSG_PUB.add_exc_msg
1029 ( p_pkg_name => 'PA_FP_GEN_FCST_AMT_PUB'
1030 ,p_procedure_name => 'GENERATE_FCST_AMT_WRP');
1031 IF P_PA_DEBUG_MODE = 'Y' THEN
1032 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1033 P_CALLED_MODE => P_CALLED_MODE,
1034 P_MSG => 'Unexpected Error'||substr(sqlerrm, 1, 240),
1035 P_MODULE_NAME => l_module_name);
1036 PA_DEBUG.Reset_Curr_Function;
1037 END IF;
1038 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1039
1040 END GENERATE_FCST_AMT_WRP;
1041
1042 PROCEDURE GEN_FCST_TASK_LEVEL_AMT
1043 (P_PROJECT_ID IN PA_PROJECTS_ALL.PROJECT_ID%TYPE,
1044 P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
1045 P_FP_COLS_REC IN PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
1046 P_WP_STRUCTURE_VERSION_ID IN PA_PROJ_ELEM_VER_STRUCTURE.ELEMENT_VERSION_ID%TYPE,
1047 P_ETC_FP_PLAN_VERSION_ID IN PA_PROJ_FP_OPTIONS.FIN_PLAN_VERSION_ID%TYPE,
1048 P_ACTUALS_THRU_DATE IN PA_PERIODS_ALL.END_DATE%TYPE,
1049 P_ACTUALS_FROM_PERIOD IN VARCHAR2,
1050 P_ACTUALS_TO_PERIOD IN VARCHAR2,
1051 P_ETC_FROM_PERIOD IN VARCHAR2,
1052 P_ETC_TO_PERIOD IN VARCHAR2,
1053 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
1054 X_MSG_COUNT OUT NOCOPY NUMBER,
1055 X_MSG_DATA OUT NOCOPY VARCHAR2) IS
1056
1057 l_module_name VARCHAR2(200) := 'pa.plsql.pa_fp_gen_fcst_amt_pub.gen_fcst_task_level_amt';
1058
1059 l_latest_published_fwbs_id NUMBER;
1060 l_proj_struc_sharing_code VARCHAR2(30);
1061
1062 l_wp_version_id NUMBER;
1063 l_fp_cols_rec_target PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
1064 l_fp_cols_rec_wp PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
1065 l_fp_cols_rec_fp PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
1066 l_fp_cols_rec_approved PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
1067 l_resource_list_id NUMBER;
1068 l_struct_ver_id NUMBER;
1069 l_calendar_type VARCHAR2(3);
1070 l_record_type VARCHAR2(10);
1071
1072 l_calling_context VARCHAR2(30);
1073
1074 CURSOR traverse_tasks_cur(c_gen_etc_src_code PA_PROJ_FP_OPTIONS.GEN_COST_SRC_CODE%TYPE) IS
1075 SELECT task_id,
1076 DECODE(c_gen_etc_src_code,
1077 NULL,NVL(gen_etc_source_code,'NONE'),
1078 c_gen_etc_src_code)
1079 FROM pa_tasks t
1080 WHERE project_id = P_PROJECT_ID;
1081
1082 CURSOR traverse_top_tasks_cur(c_gen_etc_src_code PA_PROJ_FP_OPTIONS.GEN_COST_SRC_CODE%TYPE) IS
1083 SELECT task_id,
1084 DECODE(c_gen_etc_src_code,
1085 NULL,NVL(gen_etc_source_code,'NONE'),
1086 c_gen_etc_src_code)
1087 FROM pa_tasks t
1088 WHERE project_id = P_PROJECT_ID and
1089 parent_task_id is null;
1090
1091 l_temp_top_task_id PA_TASKS.TOP_TASK_ID%TYPE;
1092 CURSOR traverse_child_tasks_cur IS
1093 SELECT task_id
1094 FROM pa_tasks t
1095 WHERE project_id = P_PROJECT_ID and
1096 top_task_id = l_temp_top_task_id and
1097 task_id <> top_task_id; -- don't want to retrieve the current node
1098
1099 l_top_task_id_tab PA_PLSQL_DATATYPES.NumTabTyp; -- ETC Enhancements 10/2004
1100 l_child_task_id_tab PA_PLSQL_DATATYPES.NumTabTyp; -- ETC Enhancements 10/2004
1101 l_top_gen_etc_src_code_tab pa_plsql_datatypes.Char30TabTyp; -- ETC Enhancements 10/2004
1102 l_task_id_tab PA_PLSQL_DATATYPES.NumTabTyp;
1103 l_gen_etc_source_code_tab pa_plsql_datatypes.Char30TabTyp;
1104 l_curr_task_id PA_TASKS.TASK_ID%TYPE;
1105 l_curr_etc_source PA_TASKS.GEN_ETC_SOURCE_CODE%TYPE;
1106 l_curr_etc_ver_id NUMBER;
1107 l_curr_etc_method_code VARCHAR2(30);
1108 l_curr_src_ra_id NUMBER;
1109 l_curr_tgt_ra_id NUMBER;
1110 l_curr_rlm_id NUMBER;
1111 l_curr_cbs_id NUMBER;--bug#16791711
1112 l_txn_amt_rec PA_FP_GEN_FCST_AMT_PUB.TXN_AMT_REC_TYP;
1113 l_work_qty_cnt NUMBER:= 0;
1114
1115 /* Indices for ETC method PL/SQL tables */
1116 l_rb_index BINARY_INTEGER;
1117 l_bc_index BINARY_INTEGER;
1118 l_ev_index BINARY_INTEGER;
1119
1120 /* PL/SQL tables for Remaining Budget - Performance Bug 4194849 */
1121 l_rb_src_ra_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1122 l_rb_tgt_ra_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1123 l_rb_task_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1124 l_rb_rlm_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1125 l_rb_cbs_id_tab PA_PLSQL_DATATYPES.IdTabTyp;--bug#16791711
1126 l_rb_etc_source_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1127
1128 /* PL/SQL tables for Budget To Complete - Performance Bug 4194849 */
1129 l_bc_src_ra_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1130 l_bc_tgt_ra_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1131 l_bc_task_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1132 l_bc_rlm_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1133 l_bc_cbs_id_tab PA_PLSQL_DATATYPES.IdTabTyp;--bug#16791711
1134 l_bc_etc_source_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1135
1136 /* PL/SQL tables for Earned Value - Performance Bug 4194849 */
1137 l_ev_src_ra_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1138 l_ev_tgt_ra_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1139 l_ev_task_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1140 l_ev_rlm_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1141 l_ev_cbs_id_tab PA_PLSQL_DATATYPES.IdTabTyp;--bug#16791711
1142 l_ev_etc_source_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1143
1144 -- Bug 4114589: When populating temporary table data, we need to process
1145 -- tasks with source of Average of Actuals separately after copying actuals.
1146 l_avg_actuals_task_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1147
1148 -- Bug 4089850: Modified traverse_tasks_rlm_cur so that we no longer
1149 -- join with pa_tasks to get the ETC source code. Instead, we return
1150 -- the transaction_source_code from tmp1.
1151
1152 CURSOR traverse_tasks_rlm_cur (c_gen_etc_source_code VARCHAR2) IS
1153 SELECT tmp1.task_id,
1154 NVL(c_gen_etc_source_code, NVL(tmp1.transaction_source_code,'NONE')),
1155 tmp1.resource_assignment_id,
1156 tmp1.target_res_asg_id,
1157 tmp1.resource_list_member_id,
1158 tmp1.cbs_element_id, --bug#16791711
1159 tmp1.etc_method_code
1160 FROM PA_FP_CALC_AMT_TMP1 tmp1;
1161
1162 l_task_id_tab2 PA_PLSQL_DATATYPES.NumTabTyp;
1163 l_gen_etc_source_code_tab2 pa_plsql_datatypes.Char30TabTyp;
1164 l_src_ra_id_tab2 PA_PLSQL_DATATYPES.NumTabTyp;
1165 l_tgt_ra_id_tab2 PA_PLSQL_DATATYPES.NumTabTyp;
1166 l_rlm_id_tab2 PA_PLSQL_DATATYPES.NumTabTyp;
1167 l_cbs_id_tab2 PA_PLSQL_DATATYPES.NumTabTyp;--bug#16791711
1168 l_etc_method_tab2 pa_plsql_datatypes.Char30TabTyp;
1169
1170 -- gboomina Bug 8318932 AAI Enhancement - Start
1171 CURSOR get_copy_etc_from_plan_csr
1172 IS
1173 SELECT COPY_ETC_FROM_PLAN_FLAG
1174 FROM PA_PROJ_FP_OPTIONS
1175 WHERE FIN_PLAN_VERSION_ID = P_BUDGET_VERSION_ID;
1176
1177 l_copy_etc_from_plan_flag PA_PROJ_FP_OPTIONS.COPY_ETC_FROM_PLAN_FLAG%TYPE;
1178 -- gboomina Bug 8318932 AAI Enhancement - End
1179
1180 l_gen_etc_source_code_override VARCHAR2(30);
1181
1182 --in param for PPA_FP_MAP_BV_PUB.GEN_MAP_BV_TO_TARGET_RL to
1183 --get baselined cost.
1184 l_approved_fp_version_id pa_proj_fp_options.fin_plan_version_id%TYPE;
1185 l_approved_fp_options_id pa_proj_fp_options.proj_fp_options_id%TYPE;
1186
1187 l_fin_plan_type_id pa_proj_fp_options.fin_plan_type_id%TYPE;
1188 l_version_type VARCHAR2(15);
1189
1190 l_plan_level VARCHAR2(15);
1191
1192 l_amt_dtls_tbl pa_fp_maintain_actual_pub.l_amt_dtls_tbl_typ;
1193
1194 /*For None Time Phase*/
1195 l_start_date DATE;
1196 l_end_date DATE;
1197
1198 --local PL/SQL table used for calling Calculate API
1199 l_refresh_rates_flag VARCHAR2(1);
1200 l_refresh_conv_rates_flag VARCHAR2(1);
1201 l_spread_required_flag VARCHAR2(1);
1202 l_conv_rates_required_flag VARCHAR2(1);
1203 l_raTxn_rollup_api_call_flag VARCHAR2(1); -- Added for IPM new entity ER
1204
1205 l_source_context VARCHAR2(30) :='RESOURCE_ASSIGNMENT';
1206 l_cal_ra_id_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1207 l_cal_src_ra_id_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1208 l_cal_rate_based_flag_tab SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
1209 l_cal_rlm_id_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1210 l_cal_cbs_id_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();--bug#16791711
1211 l_cal_task_id_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1212 l_cal_etc_method_code_tab SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1213 l_cal_rcost_rate_override_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1214 l_cal_bcost_rate_override_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1215 l_cal_bill_rate_override_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1216 l_delete_budget_lines_tab SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
1217 l_spread_amts_flag_tab SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
1218 l_cal_txn_currency_code_tab SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
1219 l_txn_currency_override_tab SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
1220 l_cal_etc_qty_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1221 l_addl_qty_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1222 l_cal_etc_raw_cost_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1223 l_addl_raw_cost_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1224 l_cal_etc_burdened_cost_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1225 l_addl_burdened_cost_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1226 l_cal_etc_revenue_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1227 l_addl_revenue_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1228 l_raw_cost_rate_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1229 l_b_cost_rate_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1230 l_bill_rate_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1231 l_line_start_date_tab SYSTEM.pa_date_tbl_type:=SYSTEM.pa_date_tbl_type();
1232 l_line_end_date_tab SYSTEM.pa_date_tbl_type:=SYSTEM.pa_date_tbl_type();
1233 l_input_period_rates_tbl PA_FP_FCST_GEN_CLIENT_EXT.l_pds_rate_dtls_tab;
1234 l_period_rates_tbl PA_FP_FCST_GEN_CLIENT_EXT.l_pds_rate_dtls_tab;
1235 l_cal_unit_of_measure_tab SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1236
1237 L_RES_ASG_UOM_UPDATE_TAB PA_PLSQL_DATATYPES.IdTabTyp;
1238
1239 l_target_class_rlm_id NUMBER;
1240 l_target_class_cbs_id NUMBER;--bug#16791711
1241 l_rev_gen_method VARCHAR2(10);
1242
1243 l_msg_count NUMBER;
1244 l_msg_data VARCHAR2(2000);
1245 l_data VARCHAR2(2000);
1246 l_msg_index_out NUMBER:=0;
1247
1248 l_count_tmp NUMBER;
1249 l_test NUMBER;
1250 p_called_mode varchar2(20) := 'SELF_SERVICE';
1251 l_dummy NUMBER;
1252 l_date date;
1253 l_count number;
1254 l_task_index NUMBER; -- used for populating task pl/sql tables
1255
1256 l_fcst_etc_qty NUMBER;
1257 l_fcst_etc_raw_cost NUMBER;
1258 l_fcst_etc_burdened_cost NUMBER;
1259 l_fcst_etc_revenue NUMBER;
1260 l_init_qty NUMBER;
1261 l_init_raw_cost NUMBER;
1262 l_init_burdened_cost NUMBER;
1263 l_init_revenue NUMBER;
1264
1265 l_fp_cols_rec_src PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
1266 /* Bug 4369741: Replaced l_planning_options_flag with 2 separate
1267 * planning options flags for WP and FP later in the declaration. */
1268 --l_planning_options_flag VARCHAR2(1);
1269 l_ra_txn_source_code PA_RESOURCE_ASSIGNMENTS.TRANSACTION_SOURCE_CODE%TYPE;
1270 l_bl_count NUMBER;
1271
1272 l_cnt NUMBER := 1;
1273 l_cal_ra_id_tab_tmp SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1274 l_cal_txn_curr_code_tab_tmp SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
1275 l_cal_rate_based_flag_tab_tmp SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
1276 l_cal_rlm_id_tab_tmp SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1277 l_cal_cbs_id_tab_tmp SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();--bug#16791711
1278 l_cal_task_id_tab_tmp SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1279 l_cal_unit_of_measure_tab_tmp SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1280 l_cal_etc_method_code_tab_tmp SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1281 l_cal_etc_qty_tab_tmp SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1282 l_cal_etc_raw_cost_tab_tmp SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1283 l_cal_etc_brdn_cost_tab_tmp SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1284 l_cal_etc_revenue_tab_tmp SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1285
1286 l_fcst_gen_src_code PA_PROJ_FP_OPTIONS.GEN_COST_SRC_CODE%TYPE;
1287
1288 l_etc_start_date DATE;
1289
1290 /* Bug 3968748: Variables for populating PA_FP_GEN_RATE_TMP */
1291 l_ext_period_name_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1292 l_ext_raw_cost_rate_tab PA_PLSQL_DATATYPES.NumTabTyp;
1293 l_ext_burdened_cost_rate_tab PA_PLSQL_DATATYPES.NumTabTyp;
1294 l_ext_revenue_bill_rate_tab PA_PLSQL_DATATYPES.NumTabTyp;
1295
1296 l_entered_flag VARCHAR2(1) := 'N';
1297 l_proceed_flag VARCHAR2(1) := 'Y';
1298
1299 -- Bug 4346172: l_use_src_rates_flag will be 'Y' when the src/tgt planning
1300 -- options match, and when the source ETC method is not EARNED_VALUE.
1301 l_use_src_rates_flag VARCHAR2(1);
1302
1303 /* Variables Added for ER 4376722 */
1304 l_billable_flag_tab SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
1305 l_billable_flag_tab_tmp SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
1306 l_cal_src_ra_id_tab_tmp SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1307
1308 -- This index is used in billability logic to track the running index of the _tmp tables
1309 l_tmp_index NUMBER;
1310
1311 /* Variables Added for Bug 4369741 */
1312 l_wp_planning_options_flag VARCHAR2(1);
1313 l_fp_planning_options_flag VARCHAR2(1);
1314
1315 l_gen_etc_src_code_tab_tmp SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1316 l_gen_etc_src_code_tab SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1317
1318 -- Bug 4346172: As part of the fix, added join on pa_fp_calc_amt_tmp1
1319 -- to get the correct source ETC method code.
1320 -- As a result of further testing, discovered that the original fix
1321 -- introduced a duplicate resource error when Commitments are included.
1322 -- PROBLEM:
1323 -- Normally, there should be 1 record per target_res_asg_id in the
1324 -- PA_FP_CALC_AMT_TMP1 table. However, when Commitments are included,
1325 -- extra PA_FP_CALC_AMT_TMP1 records are added for commitment records.
1326 -- As a result, the query returned 2 records for target resources with
1327 -- commitments and ETC.
1328 -- SOLUTION:
1329 -- Ignore records in the PA_FP_CALC_AMT_TMP1 table with transaction
1330 -- source code of 'OPEN_COMMITMENTS'. This will ensure that the query
1331 -- retrieves at most 1 record per target_res_asg_id. Note that we do
1332 -- not need to worry about the scenario when there is a commitment
1333 -- record in the temp table but no ETC record, since the purpose of
1334 -- this query is to get ETC amounts (and Commitments are generated
1335 -- later by a separate API).
1336
1337 -- ER 4376722: To carry out the Task Billability logic, we need to
1338 -- modify the queries to fetch the task billable_flag for each target
1339 -- resource. Since ra.task_id can be NULL or 0, we take the outer
1340 -- join: NVL(ra.task_id,0) = ta.task_id (+). By default, tasks are
1341 -- billable, so we SELECT NVL(ta.billable_flag,'Y').
1342
1343 -- Bug 4571025: To avoid TMP2 records matching multiple TMP1 records,
1344 -- added the following additional WHERE clause join condition to ETC
1345 -- amount cursors (etc_amts_cur_wp_opt_same, etc_amts_cur_fp_opt_same,
1346 -- etc_amts_cur_wp_fp_opt_diff, and etc_amts_cur_wp_fp_opt_same):
1347 -- AND tmp_ra.resource_assignment_id = tmp.resource_assignment_id
1348
1349 /* Bug 4369741: Added cursor etc_amts_cur_wp_fp_opt_same to be used in
1350 * the following scenarios:
1351 * 1. Target ETC generation source = 'WORKPLAN_RESOURCES'
1352 * l_wp_planning_options_flag = Y
1353 * 2. Target ETC generation source = 'FINANCIAL_PLAN'
1354 * l_fp_planning_options_flag = Y
1355 * 3. Target ETC generation source = 'TASK_LEVEL_SEL'
1356 * l_wp_planning_options_flag = Y
1357 * l_fp_planning_options_flag = Y
1358 * When the ETC generation source is Workplan or Financial Plan,
1359 * 'WORKPLAN_RESOURCES' or 'FINANCIAL_PLAN' should be passed for the
1360 * c_gen_etc_source_code cursor parameter, respectively.
1361 * When the ETC generation source is Task Level Selection, the
1362 * c_gen_etc_source_code cursor parameter should be NULL so that the
1363 * cursor picks up each task's generation source. */
1364
1365 CURSOR etc_amts_cur_wp_fp_opt_same
1366 (c_gen_etc_source_code VARCHAR2 DEFAULT NULL) IS
1367 SELECT /*+ INDEX(tmp,PA_FP_CALC_AMT_TMP2_N1)
1368 INDEX(tmp_ra,PA_FP_CALC_AMT_TMP1_N1) */
1369 tmp.RESOURCE_ASSIGNMENT_ID,
1370 tmp.TARGET_RES_ASG_ID,
1371 tmp.ETC_CURRENCY_CODE,
1372 ra.rate_based_flag,
1373 ra.resource_list_member_id,
1374 ra.cbs_element_id, --bug#16791711
1375 ra.task_id,
1376 ra.unit_of_measure,
1377 tmp_ra.etc_method_code,
1378 SUM(tmp.ETC_PLAN_QUANTITY),
1379 SUM(tmp.ETC_TXN_RAW_COST),
1380 SUM(tmp.ETC_TXN_BURDENED_COST),
1381 SUM(tmp.ETC_TXN_REVENUE),
1382 NVL(ta.billable_flag,'Y'), /* Added for ER 4376722 */
1383 nvl(c_gen_etc_source_code, /* Added for Bug 4369741 */
1384 nvl(tmp_ra.transaction_source_code, 'NONE'))
1385 FROM PA_FP_CALC_AMT_TMP1 tmp_ra,
1386 PA_FP_CALC_AMT_TMP2 tmp,
1387 PA_RESOURCE_ASSIGNMENTS ra,
1388 pa_tasks ta /* Added for ER 4376722 */
1389 WHERE tmp.target_res_asg_id = ra.resource_assignment_id
1390 AND tmp.TRANSACTION_SOURCE_CODE = 'ETC'
1391 AND tmp_ra.target_res_asg_id = tmp.target_res_asg_id
1392 AND tmp_ra.transaction_source_code <> 'OPEN_COMMITMENTS' /* Bug 4346172 */
1393 and NVL(ra.task_id,0) = ta.task_id (+) /* Added for ER 4376722 */
1394 --and ta.project_id = P_PROJECT_ID /* Added for ER 4376722 */
1395 AND ra.budget_version_id = P_BUDGET_VERSION_ID /* Added for Bug 4369741 Perf */
1396 AND ra.project_id = P_PROJECT_ID /* Added for Bug 4369741 Perf */
1397 AND tmp_ra.resource_assignment_id = tmp.resource_assignment_id /* Added for Bug 4571025 */
1398 GROUP BY tmp.RESOURCE_ASSIGNMENT_ID,
1399 tmp.TARGET_RES_ASG_ID,
1400 tmp.ETC_CURRENCY_CODE,
1401 ra.rate_based_flag,
1402 ra.resource_list_member_id,
1403 ra.cbs_element_id, --bug#16791711
1404 ra.task_id,
1405 ra.unit_of_measure,
1406 tmp_ra.etc_method_code,
1407 NVL(ta.billable_flag,'Y'), /* Added for ER 4376722 */
1408 nvl(c_gen_etc_source_code, /* Added for Bug 4369741 */
1409 nvl(tmp_ra.transaction_source_code, 'NONE'));
1410
1411 -- 5/10/05 : When planning options do not match, we potentially
1412 -- have many source resources mapping to each target resource. As
1413 -- such, we cannot determine a single source ETC method. Thus,
1414 -- replaced ra.etc_method_code with NULL in the SELECT clause below.
1415
1416 /* Bug 4369741: Added cursor etc_amts_cur_wp_fp_opt_diff to be used in
1417 * the following scenarios:
1418 * 1. Target ETC generation source = 'WORKPLAN_RESOURCES'
1419 * l_wp_planning_options_flag = N
1420 * 2. Target ETC generation source = 'FINANCIAL_PLAN'
1421 * l_fp_planning_options_flag = N
1422 * 3. Target ETC generation source = 'TASK_LEVEL_SEL'
1423 * l_wp_planning_options_flag = N
1424 * l_fp_planning_options_flag = N
1425 * When the ETC generation source is Workplan or Financial Plan,
1426 * 'WORKPLAN_RESOURCES' or 'FINANCIAL_PLAN' should be passed for the
1427 * c_gen_etc_source_code cursor parameter, respectively.
1428 * When the ETC generation source is Task Level Selection, the
1429 * c_gen_etc_source_code cursor parameter should be NULL so that the
1430 * cursor picks up each task's generation source. */
1431
1432 CURSOR etc_amts_cur_wp_fp_opt_diff
1433 (c_gen_etc_source_code VARCHAR2 DEFAULT NULL) IS
1434 SELECT /*+ INDEX(tmp,PA_FP_CALC_AMT_TMP2_N1)
1435 INDEX(tmp_ra,PA_FP_CALC_AMT_TMP1_N1) */
1436 sum(1*null),
1437 tmp.TARGET_RES_ASG_ID,
1438 tmp.ETC_CURRENCY_CODE,
1439 ra.rate_based_flag,
1440 ra.resource_list_member_id,
1441 ra.cbs_element_id, --bug#16791711
1442 ra.task_id,
1443 ra.unit_of_measure,
1444 null, --ra.etc_method_code,
1445 SUM(tmp.ETC_PLAN_QUANTITY),
1446 SUM(tmp.ETC_TXN_RAW_COST),
1447 SUM(tmp.ETC_TXN_BURDENED_COST),
1448 SUM(tmp.ETC_TXN_REVENUE),
1449 NVL(ta.billable_flag,'Y'), /* Added for ER 4376722 */
1450 nvl(c_gen_etc_source_code, /* Added for Bug 4369741 */
1451 nvl(tmp_ra.transaction_source_code, 'NONE'))
1452 FROM PA_FP_CALC_AMT_TMP1 tmp_ra, /* Added for Bug 4369741 */
1453 PA_FP_CALC_AMT_TMP2 tmp,
1454 PA_RESOURCE_ASSIGNMENTS ra,
1455 pa_tasks ta /* Added for ER 4376722 */
1456 WHERE tmp.target_res_asg_id = ra.resource_assignment_id
1457 AND tmp.TRANSACTION_SOURCE_CODE = 'ETC'
1458 and NVL(ra.task_id,0) = ta.task_id (+) /* Added for ER 4376722 */
1459 --and ta.project_id = P_PROJECT_ID /* Added for ER 4376722 */
1460 AND tmp_ra.target_res_asg_id = tmp.target_res_asg_id /* Added for Bug 4369741 */
1461 AND tmp_ra.transaction_source_code <> 'OPEN_COMMITMENTS' /* Added for Bug 4369741 */
1462 AND ra.budget_version_id = P_BUDGET_VERSION_ID /* Added for Bug 4369741 Perf */
1463 AND ra.project_id = P_PROJECT_ID /* Added for Bug 4369741 Perf */
1464 AND tmp_ra.resource_assignment_id = tmp.resource_assignment_id /* Added for Bug 4571025 */
1465 GROUP BY
1466 tmp.TARGET_RES_ASG_ID,
1467 tmp.ETC_CURRENCY_CODE,
1468 ra.rate_based_flag,
1469 ra.resource_list_member_id,
1470 ra.cbs_element_id, --bug#16791711
1471 ra.task_id,
1472 ra.unit_of_measure,
1473 null, --ra.etc_method_code,
1474 NVL(ta.billable_flag,'Y'), /* Added for ER 4376722 */
1475 nvl(c_gen_etc_source_code, /* Added for Bug 4369741 */
1476 nvl(tmp_ra.transaction_source_code, 'NONE'));
1477
1478 /* Bug 4369741: Added cursor etc_amts_cur_wp_opt_same to be used in
1479 * the following scenario:
1480 * 1. Target ETC generation source = 'TASK_LEVEL_SEL'
1481 * l_wp_planning_options_flag = Y
1482 * l_fp_planning_options_flag = N
1483 * This cursor's SELECT statement uses the etc_amts_cur_wp_fp_opt_same
1484 * cursor's SELECT statement for resources with Workplan source UNION
1485 * ALL the etc_amts_cur_wp_fp_opt_diff cursor's SELECT statement for
1486 * resources with non-Workplan source. */
1487
1488 CURSOR etc_amts_cur_wp_opt_same IS
1489 SELECT /*+ INDEX(tmp,PA_FP_CALC_AMT_TMP2_N1)
1490 INDEX(tmp_ra,PA_FP_CALC_AMT_TMP1_N1) */
1491 tmp.RESOURCE_ASSIGNMENT_ID,
1492 tmp.TARGET_RES_ASG_ID,
1493 tmp.ETC_CURRENCY_CODE,
1494 ra.rate_based_flag,
1495 ra.resource_list_member_id,
1496 ra.cbs_element_id, --bug#16791711
1497 ra.task_id,
1498 ra.unit_of_measure,
1499 tmp_ra.etc_method_code,
1500 SUM(tmp.ETC_PLAN_QUANTITY),
1501 SUM(tmp.ETC_TXN_RAW_COST),
1502 SUM(tmp.ETC_TXN_BURDENED_COST),
1503 SUM(tmp.ETC_TXN_REVENUE),
1504 NVL(ta.billable_flag,'Y'), /* Added for ER 4376722 */
1505 tmp_ra.transaction_source_code /* Added for Bug 4369741 */
1506 FROM PA_FP_CALC_AMT_TMP1 tmp_ra,
1507 PA_FP_CALC_AMT_TMP2 tmp,
1508 PA_RESOURCE_ASSIGNMENTS ra,
1509 pa_tasks ta /* Added for ER 4376722 */
1510 WHERE tmp.target_res_asg_id = ra.resource_assignment_id
1511 AND tmp.TRANSACTION_SOURCE_CODE = 'ETC'
1512 AND tmp_ra.target_res_asg_id = tmp.target_res_asg_id
1513 AND tmp_ra.transaction_source_code = 'WORKPLAN_RESOURCES' /* Added for Bug 4369741 */
1514 and NVL(ra.task_id,0) = ta.task_id (+) /* Added for ER 4376722 */
1515 --and ta.project_id = P_PROJECT_ID /* Added for ER 4376722 */
1516 AND ra.budget_version_id = P_BUDGET_VERSION_ID /* Added for Bug 4369741 Perf */
1517 AND ra.project_id = P_PROJECT_ID /* Added for Bug 4369741 Perf */
1518 AND tmp_ra.resource_assignment_id = tmp.resource_assignment_id /* Added for Bug 4571025 */
1519 GROUP BY tmp.RESOURCE_ASSIGNMENT_ID,
1520 tmp.TARGET_RES_ASG_ID,
1521 tmp.ETC_CURRENCY_CODE,
1522 ra.rate_based_flag,
1523 ra.resource_list_member_id,
1524 ra.cbs_element_id, --bug#16791711
1525 ra.task_id,
1526 ra.unit_of_measure,
1527 tmp_ra.etc_method_code,
1528 NVL(ta.billable_flag,'Y'), /* Added for ER 4376722 */
1529 tmp_ra.transaction_source_code /* Added for Bug 4369741 */
1530 UNION ALL
1531 SELECT /*+ INDEX(tmp,PA_FP_CALC_AMT_TMP2_N1)
1532 INDEX(tmp_ra,PA_FP_CALC_AMT_TMP1_N1) */
1533 sum(1*null),
1534 tmp.TARGET_RES_ASG_ID,
1535 tmp.ETC_CURRENCY_CODE,
1536 ra.rate_based_flag,
1537 ra.resource_list_member_id,
1538 ra.cbs_element_id, --bug#16791711
1539 ra.task_id,
1540 ra.unit_of_measure,
1541 null, --ra.etc_method_code,
1542 SUM(tmp.ETC_PLAN_QUANTITY),
1543 SUM(tmp.ETC_TXN_RAW_COST),
1544 SUM(tmp.ETC_TXN_BURDENED_COST),
1545 SUM(tmp.ETC_TXN_REVENUE),
1546 NVL(ta.billable_flag,'Y'), /* Added for ER 4376722 */
1547 tmp_ra.transaction_source_code /* Added for Bug 4369741 */
1548 FROM PA_FP_CALC_AMT_TMP1 tmp_ra, /* Added for Bug 4369741 */
1549 PA_FP_CALC_AMT_TMP2 tmp,
1550 PA_RESOURCE_ASSIGNMENTS ra,
1551 pa_tasks ta /* Added for ER 4376722 */
1552 WHERE tmp.target_res_asg_id = ra.resource_assignment_id
1553 AND tmp.TRANSACTION_SOURCE_CODE = 'ETC'
1554 and NVL(ra.task_id,0) = ta.task_id (+) /* Added for ER 4376722 */
1555 --and ta.project_id = P_PROJECT_ID /* Added for ER 4376722 */
1556 AND tmp_ra.target_res_asg_id = tmp.target_res_asg_id /* Added for Bug 4369741 */
1557 AND tmp_ra.transaction_source_code <> 'OPEN_COMMITMENTS' /* Added for Bug 4369741 */
1558 AND tmp_ra.transaction_source_code <> 'WORKPLAN_RESOURCES' /* Added for Bug 4369741 */
1559 AND ra.budget_version_id = P_BUDGET_VERSION_ID /* Added for Bug 4369741 Perf */
1560 AND ra.project_id = P_PROJECT_ID /* Added for Bug 4369741 Perf */
1561 AND tmp_ra.resource_assignment_id = tmp.resource_assignment_id /* Added for Bug 4571025 */
1562 GROUP BY
1563 tmp.TARGET_RES_ASG_ID,
1564 tmp.ETC_CURRENCY_CODE,
1565 ra.rate_based_flag,
1566 ra.resource_list_member_id,
1567 ra.cbs_element_id, --bug#16791711
1568 ra.task_id,
1569 ra.unit_of_measure,
1570 null, --ra.etc_method_code,
1571 NVL(ta.billable_flag,'Y'), /* Added for ER 4376722 */
1572 tmp_ra.transaction_source_code; /* Added for Bug 4369741 */
1573
1574 /* Bug 4369741: Added cursor etc_amts_cur_fp_opt_same to be used in
1575 * the following scenario:
1576 * 1. Target ETC generation source = 'TASK_LEVEL_SEL'
1577 * l_wp_planning_options_flag = N
1578 * l_fp_planning_options_flag = Y
1579 * This cursor's SELECT statement uses the etc_amts_cur_wp_fp_opt_same
1580 * cursor's SELECT statement for resources with Financial Plan source
1581 * UNION ALL the etc_amts_cur_wp_fp_opt_diff cursor's SELECT statement for
1582 * resources with non Financial Plan source. */
1583
1584 CURSOR etc_amts_cur_fp_opt_same IS
1585 SELECT /*+ INDEX(tmp,PA_FP_CALC_AMT_TMP2_N1)
1586 INDEX(tmp_ra,PA_FP_CALC_AMT_TMP1_N1) */
1587 tmp.RESOURCE_ASSIGNMENT_ID,
1588 tmp.TARGET_RES_ASG_ID,
1589 tmp.ETC_CURRENCY_CODE,
1590 ra.rate_based_flag,
1591 ra.resource_list_member_id,
1592 ra.cbs_element_id, --bug#16791711
1593 ra.task_id,
1594 ra.unit_of_measure,
1595 tmp_ra.etc_method_code,
1596 SUM(tmp.ETC_PLAN_QUANTITY),
1597 SUM(tmp.ETC_TXN_RAW_COST),
1598 SUM(tmp.ETC_TXN_BURDENED_COST),
1599 SUM(tmp.ETC_TXN_REVENUE),
1600 NVL(ta.billable_flag,'Y'), /* Added for ER 4376722 */
1601 tmp_ra.transaction_source_code /* Added for Bug 4369741 */
1602 FROM PA_FP_CALC_AMT_TMP1 tmp_ra,
1603 PA_FP_CALC_AMT_TMP2 tmp,
1604 PA_RESOURCE_ASSIGNMENTS ra,
1605 pa_tasks ta /* Added for ER 4376722 */
1606 WHERE tmp.target_res_asg_id = ra.resource_assignment_id
1607 AND tmp.TRANSACTION_SOURCE_CODE = 'ETC'
1608 AND tmp_ra.target_res_asg_id = tmp.target_res_asg_id
1609 AND tmp_ra.transaction_source_code = 'FINANCIAL_PLAN' /* Added for Bug 4369741 */
1610 and NVL(ra.task_id,0) = ta.task_id (+) /* Added for ER 4376722 */
1611 --and ta.project_id = P_PROJECT_ID /* Added for ER 4376722 */
1612 AND ra.budget_version_id = P_BUDGET_VERSION_ID /* Added for Bug 4369741 Perf */
1613 AND ra.project_id = P_PROJECT_ID /* Added for Bug 4369741 Perf */
1614 AND tmp_ra.resource_assignment_id = tmp.resource_assignment_id /* Added for Bug 4571025 */
1615 GROUP BY tmp.RESOURCE_ASSIGNMENT_ID,
1616 tmp.TARGET_RES_ASG_ID,
1617 tmp.ETC_CURRENCY_CODE,
1618 ra.rate_based_flag,
1619 ra.resource_list_member_id,
1620 ra.cbs_element_id, --bug#16791711
1621 ra.task_id,
1622 ra.unit_of_measure,
1623 tmp_ra.etc_method_code,
1624 NVL(ta.billable_flag,'Y'), /* Added for ER 4376722 */
1625 tmp_ra.transaction_source_code /* Added for Bug 4369741 */
1626 UNION ALL
1627 SELECT /*+ INDEX(tmp,PA_FP_CALC_AMT_TMP2_N1)
1628 INDEX(tmp_ra,PA_FP_CALC_AMT_TMP1_N1) */
1629 sum(1*null),
1630 tmp.TARGET_RES_ASG_ID,
1631 tmp.ETC_CURRENCY_CODE,
1632 ra.rate_based_flag,
1633 ra.resource_list_member_id,
1634 ra.cbs_element_id, --bug#16791711
1635 ra.task_id,
1636 ra.unit_of_measure,
1637 null, --ra.etc_method_code,
1638 SUM(tmp.ETC_PLAN_QUANTITY),
1639 SUM(tmp.ETC_TXN_RAW_COST),
1640 SUM(tmp.ETC_TXN_BURDENED_COST),
1641 SUM(tmp.ETC_TXN_REVENUE),
1642 NVL(ta.billable_flag,'Y'), /* Added for ER 4376722 */
1643 tmp_ra.transaction_source_code /* Added for Bug 4369741 */
1644 FROM PA_FP_CALC_AMT_TMP1 tmp_ra, /* Added for Bug 4369741 */
1645 PA_FP_CALC_AMT_TMP2 tmp,
1646 PA_RESOURCE_ASSIGNMENTS ra,
1647 pa_tasks ta /* Added for ER 4376722 */
1648 WHERE tmp.target_res_asg_id = ra.resource_assignment_id
1649 AND tmp.TRANSACTION_SOURCE_CODE = 'ETC'
1650 and NVL(ra.task_id,0) = ta.task_id (+) /* Added for ER 4376722 */
1651 --and ta.project_id = P_PROJECT_ID /* Added for ER 4376722 */
1652 AND tmp_ra.target_res_asg_id = tmp.target_res_asg_id /* Added for Bug 4369741 */
1653 AND tmp_ra.transaction_source_code <> 'OPEN_COMMITMENTS' /* Added for Bug 4369741 */
1654 AND tmp_ra.transaction_source_code <> 'FINANCIAL_PLAN' /* Added for Bug 4369741 */
1655 AND ra.budget_version_id = P_BUDGET_VERSION_ID /* Added for Bug 4369741 Perf */
1656 AND ra.project_id = P_PROJECT_ID /* Added for Bug 4369741 Perf */
1657 AND tmp_ra.resource_assignment_id = tmp.resource_assignment_id /* Added for Bug 4571025 */
1658 GROUP BY
1659 tmp.TARGET_RES_ASG_ID,
1660 tmp.ETC_CURRENCY_CODE,
1661 ra.rate_based_flag,
1662 ra.resource_list_member_id,
1663 ra.cbs_element_id, --bug#16791711
1664 ra.task_id,
1665 ra.unit_of_measure,
1666 null, --ra.etc_method_code,
1667 NVL(ta.billable_flag,'Y'), /* Added for ER 4376722 */
1668 tmp_ra.transaction_source_code; /* Added for Bug 4369741 */
1669
1670 /* Bug 4654157 and 4670253: Variables for enforcing positive total plan quantity */
1671 l_index NUMBER; -- index for _tmp tables
1672 l_total_plan_qty NUMBER;
1673 l_cal_rcost_rate_ovrd_tab_tmp SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1674 l_cal_bcost_rate_ovrd_tab_tmp SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1675 l_cal_bill_rate_ovrd_tab_tmp SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1676
1677 -- IPM: New Entity ER ------------------------------------------
1678 -- Stores ids of resources with Financial Plan as the ETC generation source
1679 l_fp_ra_id_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1680 -- Stores ids of resources with Workplan as the ETC generation source
1681 l_wp_ra_id_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1682 -- Stores ids of non-billable resources with Financial Plan as the ETC generation source
1683 l_non_billable_fp_ra_id_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1684
1685 -- Defining a table of tables to process tables in a loop.
1686 TYPE SystemPaNumTblTypeTabType
1687 IS TABLE OF SYSTEM.pa_num_tbl_type INDEX BY BINARY_INTEGER;
1688
1689 l_ra_id_tab_table SystemPaNumTblTypeTabType;
1690 l_planning_options_flag_tab PA_PLSQL_DATATYPES.Char1TabTyp;
1691 l_src_version_id_tab PA_PLSQL_DATATYPES.NumTabTyp;
1692
1693 /***
1694 * Added in IPM
1695 * Variable : L_REMOVE_RECORD_FLAG_TAB
1696 * Background : There are a growing number of cases where it is
1697 * necessary to skip certain records in further
1698 * processing. The strategy up till now has been
1699 * to copy non-skipped records into a set of temporary
1700 * pl/sql tables and then copy back to the original
1701 * tables. This table is being introduced to reduce
1702 * the number of times tables are copied back and forth.
1703 * Usage : - Records in this table should be in a 1-to-1 mapping
1704 * with planning txns given by the l_cal_ra_id_tab and
1705 * l_cal_txn_curr_code_tab tables.
1706 * - By default, initialize all records in this table to 'N'.
1707 * - Any time it becomes necessary for a planning txn
1708 * to be skipped in further processing, the corresponding
1709 * record in this table should be set to 'Y'.
1710 * - Downstream generation code should check this table
1711 * at the beginning of logical processing blocks.
1712 *
1713 * Variable : L_REMOVE_RECORDS_FLAG
1714 * Usage : - By default, initialize this flag to 'N'.
1715 * - Set this flag to 'Y' if any record in the associated
1716 * l_remove_record_flag_tab table is set to 'Y'.
1717 * - Before the Calculate or Maintain_Actual_Amt_Ra APIs
1718 * are called, if this flag is 'Y', then records with
1719 * l_remove_record_flag_tab(i) = 'Y' should be filtered
1720 * from the main pl/sql tables.
1721 *
1722 * Variable : L_REV_ONLY_SRC_TXN_FLAG_TAB
1723 * Background : As of IPM, it is possible to plan for just revenue
1724 * amounts (without cost amounts) in a Cost and Revenue
1725 * Together version. Pre-IPM, quantity was always set to
1726 * raw cost for non-rate-based transactions. However, in
1727 * the revenue only case, we store quantity as revenue.
1728 * In order to handle this correctly, it is necessary to
1729 * know if ETC revenue exists without ETC raw cost. This
1730 * latter piece of information is initially available
1731 * after querying for the ETC numbers. However, it may
1732 * be lost once the generation logic begins processing
1733 * and manipulating the amounts. Hence, this table is being
1734 * introduced to track which transactions have only ETC
1735 * revenue amounts.
1736 * Usage : - Records in this table should be in a 1-to-1 mapping
1737 * with planning txns given by the l_cal_ra_id_tab and
1738 * l_cal_txn_curr_code_tab tables.
1739 * - By default, initialize all records in this table to 'N'.
1740 * - Set records whose corresponding planning txns have only
1741 * ETC revenue amounts (i.e. Null ETC raw cost) to 'Y'.
1742 */
1743
1744 -- Added in IPM to track if a record in the existing set of
1745 -- pl/sql tables needs to be removed.
1746 l_remove_record_flag_tab PA_PLSQL_DATATYPES.Char1TabTyp;
1747 l_remove_records_flag VARCHAR2(1);
1748
1749 -- Added in IPM to track if only ETC revenue is available.
1750 -- Note that this table should be initialized after ETC is
1751 -- fetched but before assignments to ETC raw cost begin.
1752 l_rev_only_src_txn_flag_tab PA_PLSQL_DATATYPES.Char1TabTyp;
1753
1754 /* This user-defined exception is used to skip processing of
1755 * a planning transaction within a loop */
1756 continue_loop EXCEPTION;
1757
1758 l_source_version_type_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1759 l_target_version_type PA_BUDGET_VERSIONS.VERSION_TYPE%TYPE;
1760
1761 BEGIN
1762 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
1763 X_MSG_COUNT := 0;
1764 IF p_pa_debug_mode = 'Y' THEN
1765 pa_debug.set_curr_function( p_function => 'GEN_FCST_TASK_LEVEL_AMT',
1766 p_debug_mode => p_pa_debug_mode);
1767 END IF;
1768 l_latest_published_fwbs_id := PA_PROJECT_STRUCTURE_UTILS.GET_LATEST_FIN_STRUC_VER_ID(P_PROJECT_ID);
1769 l_proj_struc_sharing_code := NVL(PA_PROJECT_STRUCTURE_UTILS.
1770 get_Structure_sharing_code(P_PROJECT_ID),'SHARE_FULL');
1771 /*IF p_pa_debug_mode = 'Y' THEN
1772 pa_fp_gen_amount_utils.fp_debug
1773 (p_msg => 'Value of l_latest_published_fwbs_id: '||l_latest_published_fwbs_id,
1774 p_module_name => l_module_name,
1775 p_log_level => 5);
1776 END IF;*/
1777 /*IF p_pa_debug_mode = 'Y' THEN
1778 pa_fp_gen_amount_utils.fp_debug
1779 (p_msg => 'Value of l_proj_struc_sharing_code: '||l_proj_struc_sharing_code,
1780 p_module_name => l_module_name,
1781 p_log_level => 5);
1782 END IF;*/
1783 /*IF p_pa_debug_mode = 'Y' THEN
1784 pa_fp_gen_amount_utils.fp_debug
1785 (p_msg => 'Value of p_wp_structure_version_id: '||p_wp_structure_version_id,
1786 p_module_name => l_module_name,
1787 p_log_level => 5);
1788 END IF;*/
1789
1790 IF p_fp_cols_rec.x_version_type = 'REVENUE' THEN
1791 l_fcst_gen_src_code := p_fp_cols_rec.x_gen_etc_src_code;
1792 END IF;
1793
1794 IF p_fp_cols_rec.x_version_type = 'REVENUE' AND
1795 l_fcst_gen_src_code IN ('NONE','AVERAGE_ACTUALS') THEN
1796
1797 IF p_pa_debug_mode = 'Y' THEN
1798 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1799 P_CALLED_MODE => P_CALLED_MODE,
1800 P_MSG => 'Before calling pa_fp_copy_actuals_pub.copy_actuals',
1801 P_MODULE_NAME => l_module_name);
1802 END IF;
1803 PA_FP_COPY_ACTUALS_PUB.COPY_ACTUALS
1804 (P_PROJECT_ID => P_PROJECT_ID,
1805 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
1806 P_FP_COLS_REC => P_fp_cols_rec,
1807 P_END_DATE => P_ACTUALS_THRU_DATE,
1808 P_INIT_MSG_FLAG => 'N',
1809 P_COMMIT_FLAG => 'N',
1810 X_RETURN_STATUS => X_RETURN_STATUS,
1811 X_MSG_COUNT => X_MSG_COUNT,
1812 X_MSG_DATA => X_MSG_DATA);
1813 IF p_pa_debug_mode = 'Y' THEN
1814 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1815 P_CALLED_MODE => P_CALLED_MODE,
1816 P_MSG => 'After calling pa_fp_copy_actuals_pub.copy_actuals:'
1817 ||x_return_status,
1818 P_MODULE_NAME => l_module_name);
1819 END IF;
1820 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
1821 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
1822 END IF;
1823
1824 IF l_fcst_gen_src_code = 'NONE' THEN
1825 IF p_pa_debug_mode = 'Y' THEN
1826 PA_DEBUG.Reset_Curr_Function;
1827 END IF;
1828 RETURN;
1829 END IF;
1830
1831 IF l_fcst_gen_src_code = 'AVERAGE_ACTUALS' THEN
1832 IF p_pa_debug_mode = 'Y' THEN
1833 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1834 P_CALLED_MODE => P_CALLED_MODE,
1835 P_MSG => 'Before calling PA_FP_GEN_FCST_AMT_PUB.'||
1836 'GEN_AVERAGE_OF_ACTUALS_WRP for Revenue only version',
1837 P_MODULE_NAME => l_module_name);
1838 END IF;
1839
1840 /* hr_utility.trace('Values passed to call GEN_AVERAGE_OF_ACTUALS_WRP api');
1841 hr_utility.trace('P_BUDGET_VERSION_ID: '||P_BUDGET_VERSION_ID);
1842 hr_utility.trace('l_curr_task_id: '||l_curr_task_id);
1843 hr_utility.trace('P_ACTUALS_THRU_DATE: '||P_ACTUALS_THRU_DATE);
1844 hr_utility.trace('P_ACTUALS_FROM_PERIOD: '||P_ACTUALS_FROM_PERIOD);
1845 hr_utility.trace('P_ACTUALS_TO_PERIOD: '||P_ACTUALS_TO_PERIOD);
1846 hr_utility.trace('P_ETC_FROM_PERIOD: '||P_ETC_FROM_PERIOD);
1847 hr_utility.trace('P_ETC_TO_PERIOD: '||P_ETC_TO_PERIOD); */
1848
1849 /* When the task id is passed as NULL, the wrapper API generates
1850 the ETC numbers for all the target version planning resources
1851 based on the average value of the actual txn data. */
1852
1853 PA_FP_GEN_FCST_AMT_PUB1.GEN_AVERAGE_OF_ACTUALS_WRP
1854 (P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
1855 P_TASK_ID => NULL,
1856 P_ACTUALS_THRU_DATE => P_ACTUALS_THRU_DATE,
1857 P_FP_COLS_REC => P_FP_COLS_REC,
1858 P_ACTUALS_FROM_PERIOD => P_ACTUALS_FROM_PERIOD,
1859 P_ACTUALS_TO_PERIOD => P_ACTUALS_TO_PERIOD,
1860 P_ETC_FROM_PERIOD => P_ETC_FROM_PERIOD,
1861 P_ETC_TO_PERIOD => P_ETC_TO_PERIOD,
1862 X_RETURN_STATUS => X_RETURN_STATUS,
1863 X_MSG_COUNT => X_MSG_COUNT,
1864 X_MSG_DATA => X_MSG_DATA );
1865 -- hr_utility.trace('Return status after calling GEN_AVERAGE_OF_ACTUALS_WRP: '
1866 -- ||x_return_status);
1867 IF p_pa_debug_mode = 'Y' THEN
1868 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1869 P_CALLED_MODE => P_CALLED_MODE,
1870 P_MSG => 'After calling PA_FP_GEN_FCST_AMT_PUB.'||
1871 'GEN_AVERAGE_OF_ACTUALS_WRP: '||x_return_status,
1872 P_MODULE_NAME => l_module_name);
1873 END IF;
1874
1875 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1876 IF p_pa_debug_mode = 'Y' THEN
1877 PA_DEBUG.Reset_Curr_Function;
1878 END IF;
1879 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
1880 END IF;
1881
1882 IF p_pa_debug_mode = 'Y' THEN
1883 PA_DEBUG.Reset_Curr_Function;
1884 END IF;
1885
1886 RETURN;
1887 END IF; -- for average actual check
1888 /* the processing should continue when the target plan version type is
1889 REVENUE and the ETC Revenue generation source is either 'FINANCIAL_PLAN'
1890 or 'WORKPLAN_RESOURCES'. */
1891
1892 END IF; -- for revenue check
1893
1894 IF P_WP_STRUCTURE_VERSION_ID IS NOT NULL THEN
1895 l_wp_version_id := Pa_Fp_wp_gen_amt_utils.get_wp_version_id
1896 ( p_project_id => P_PROJECT_ID,
1897 p_plan_type_id => -1,
1898 p_proj_str_ver_id => P_WP_STRUCTURE_VERSION_ID );
1899
1900 IF P_PA_DEBUG_MODE = 'Y' THEN
1901 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1902 P_CALLED_MODE => P_CALLED_MODE,
1903 P_MSG => 'Before calling PA_FP_GEN_AMOUNT_UTILS.'||
1904 'GET_PLAN_VERSION_DTL',
1905 P_MODULE_NAME => l_module_name);
1906 END IF;
1907 PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS(
1908 P_PROJECT_ID => P_PROJECT_ID,
1909 P_BUDGET_VERSION_ID => l_wp_version_id,
1910 X_FP_COLS_REC => l_fp_cols_rec_wp,
1911 X_RETURN_STATUS => x_return_status,
1912 X_MSG_COUNT => x_msg_count,
1913 X_MSG_DATA => x_msg_data);
1914 IF P_PA_DEBUG_MODE = 'Y' THEN
1915 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1916 P_CALLED_MODE => P_CALLED_MODE,
1917 P_MSG => 'After calling PA_FP_GEN_AMOUNT_UTILS.'||
1918 'GET_PLAN_VERSION_DTL:'||x_return_status,
1919 P_MODULE_NAME => l_module_name);
1920 END IF;
1921 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1922 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
1923 END IF;
1924 END IF;
1925
1926 /*IF p_pa_debug_mode = 'Y' THEN
1927 pa_fp_gen_amount_utils.fp_debug
1928 (p_msg => 'Value of p_etc_fp_plan_version_id: '||p_etc_fp_plan_version_id,
1929 p_module_name => l_module_name,
1930 p_log_level => 5);
1931 END IF;*/
1932
1933 IF P_ETC_FP_PLAN_VERSION_ID IS NOT NULL THEN
1934 IF P_PA_DEBUG_MODE = 'Y' THEN
1935 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1936 P_CALLED_MODE => P_CALLED_MODE,
1937 P_MSG => 'Before calling PA_FP_GEN_AMOUNT_UTILS.'||
1938 'GET_PLAN_VERSION_DTLS',
1939 P_MODULE_NAME => l_module_name);
1940 END IF;
1941 PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS(
1942 P_PROJECT_ID => P_PROJECT_ID,
1943 P_BUDGET_VERSION_ID => P_ETC_FP_PLAN_VERSION_ID,
1944 X_FP_COLS_REC => l_fp_cols_rec_fp,
1945 X_RETURN_STATUS => x_return_status,
1946 X_MSG_COUNT => x_msg_count,
1947 X_MSG_DATA => x_msg_data);
1948 IF P_PA_DEBUG_MODE = 'Y' THEN
1949 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1950 P_CALLED_MODE => P_CALLED_MODE,
1951 P_MSG => 'After calling PA_FP_GEN_AMOUNT_UTILS.'||
1952 'GET_PLAN_VERSION_DTLS: '||x_return_status,
1953 P_MODULE_NAME => l_module_name);
1954 END IF;
1955 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1956 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
1957 END IF;
1958 END IF;
1959
1960 l_fp_cols_rec_target := P_FP_COLS_REC;
1961 l_calendar_type := l_fp_cols_rec_target.X_TIME_PHASED_CODE;
1962
1963 /**l_record_type: XXXX
1964 *1st X: 'Y',data will be returned in periods;
1965 * 'N',ITD amounts will be returned;
1966 *2nd X: 'Y',data will be returned by planning resources at
1967 * entered level(periodic/total);
1968 *3rd X: 'Y',data is returned by tasks;
1969 *4th X: 'N',amt will be gotten at entered level, no rollup is done.**/
1970 IF (l_calendar_type = 'G' OR l_calendar_type = 'P') THEN
1971 l_record_type := 'Y';
1972 ELSE
1973 l_record_type := 'N';
1974 END IF;
1975 l_record_type := l_record_type||'Y'||'Y'||'N';
1976
1977 --*****Populate pji tmp1,fcst tmp1 tables from workplan version******--
1978 -- hr_utility.trace('P_WP_STRUCTURE_VERSION_ID: '||P_WP_STRUCTURE_VERSION_ID);
1979 IF P_WP_STRUCTURE_VERSION_ID IS NOT NULL THEN
1980 l_resource_list_id := l_fp_cols_rec_wp.X_RESOURCE_LIST_ID;
1981 l_struct_ver_id := l_fp_cols_rec_wp.X_PROJECT_STRUCTURE_VERSION_ID;
1982
1983 /*IF p_pa_debug_mode = 'Y' THEN
1984 pa_fp_gen_amount_utils.fp_debug
1985 (p_msg => 'Value of l_resource_list_id: '||l_resource_list_id,
1986 p_module_name => l_module_name,
1987 p_log_level => 5);
1988 END IF;*/
1989 /*IF p_pa_debug_mode = 'Y' THEN
1990 pa_fp_gen_amount_utils.fp_debug
1991 (p_msg => 'Value of l_struct_ver_id: '||l_struct_ver_id,
1992 p_module_name => l_module_name,
1993 p_log_level => 5);
1994 END IF;*/
1995
1996 IF P_PA_DEBUG_MODE = 'Y' THEN
1997 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1998 P_CALLED_MODE => P_CALLED_MODE,
1999 P_MSG => 'Before calling PA_FP_GEN_FCST_AMT_PUB1.'||
2000 'CALL_SUMM_POP_TMPS',
2001 P_MODULE_NAME => l_module_name);
2002 END IF;
2003
2004 /* hr_utility.trace('1.l_calendar_type: '||l_calendar_type);
2005 hr_utility.trace('1.l_record_type: '||l_record_type);
2006 hr_utility.trace('1.l_resource_list_id: '||l_resource_list_id);
2007 hr_utility.trace('1.l_struct_ver_id: '||l_struct_ver_id);
2008 hr_utility.trace('1.P_ACTUALS_THRU_DATE: '||P_ACTUALS_THRU_DATE); */
2009
2010 PA_FP_GEN_FCST_AMT_PUB1.CALL_SUMM_POP_TMPS(
2011 P_PROJECT_ID => P_PROJECT_ID,
2012 P_CALENDAR_TYPE => l_calendar_type,
2013 P_RECORD_TYPE => l_record_type,
2014 P_RESOURCE_LIST_ID => l_resource_list_id,
2015 P_STRUCT_VER_ID => l_struct_ver_id,
2016 P_ACTUALS_THRU_DATE => P_ACTUALS_THRU_DATE,
2017 P_DATA_TYPE_CODE => 'ETC_WP',
2018 X_RETURN_STATUS => x_return_status,
2019 X_MSG_COUNT => x_msg_count,
2020 X_MSG_DATA => x_msg_data );
2021 -- hr_utility.trace('1.Status after calling call_summ_pop_tmps api: '||x_return_status);
2022 IF P_PA_DEBUG_MODE = 'Y' THEN
2023 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2024 P_CALLED_MODE => P_CALLED_MODE,
2025 P_MSG => 'After calling PA_FP_GEN_FCST_AMT_PUB1.'||
2026 'CALL_SUMM_POP_TMPS:'||x_return_status,
2027 P_MODULE_NAME => l_module_name);
2028 END IF;
2029 --dbms_output.put_line('After calling pji api: '||x_return_status);
2030 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2031 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2032 END IF;
2033 END IF; -- for wp_structure_version_id check
2034
2035 --*****Populate pji tmp1,fcst tmp1 tables from ETC financial version******--
2036 -- hr_utility.trace('P_ETC_FP_PLAN_VERSION_ID: '||P_ETC_FP_PLAN_VERSION_ID);
2037 IF P_ETC_FP_PLAN_VERSION_ID IS NOT NULL THEN
2038 l_resource_list_id := l_fp_cols_rec_fp.X_RESOURCE_LIST_ID;
2039 l_struct_ver_id := l_fp_cols_rec_fp.X_PROJECT_STRUCTURE_VERSION_ID;
2040
2041 /*IF p_pa_debug_mode = 'Y' THEN
2042 pa_fp_gen_amount_utils.fp_debug
2043 (p_msg => 'Value of l_resource_list_id: '||l_resource_list_id,
2044 p_module_name => l_module_name,
2045 p_log_level => 5);
2046 END IF;*/
2047 /*IF p_pa_debug_mode = 'Y' THEN
2048 pa_fp_gen_amount_utils.fp_debug
2049 (p_msg => 'Value of l_struct_ver_id: '||l_struct_ver_id,
2050 p_module_name => l_module_name,
2051 p_log_level => 5);
2052 END IF;*/
2053
2054 IF P_PA_DEBUG_MODE = 'Y' THEN
2055 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2056 P_CALLED_MODE => P_CALLED_MODE,
2057 P_MSG => 'Before calling PA_FP_GEN_FCST_AMT_PUB1.'||
2058 'CALL_SUMM_POP_TMPS',
2059 P_MODULE_NAME => l_module_name);
2060 END IF;
2061
2062 /* hr_utility.trace('2.l_calendar_type: '||l_calendar_type);
2063 hr_utility.trace('2.l_record_type: '||l_record_type);
2064 hr_utility.trace('2.l_resource_list_id: '||l_resource_list_id);
2065 hr_utility.trace('2.l_struct_ver_id: '||l_struct_ver_id);
2066 hr_utility.trace('2.P_ACTUALS_THRU_DATE: '||P_ACTUALS_THRU_DATE); */
2067
2068 PA_FP_GEN_FCST_AMT_PUB1.CALL_SUMM_POP_TMPS(
2069 P_PROJECT_ID => P_PROJECT_ID,
2070 P_CALENDAR_TYPE => l_calendar_type,
2071 P_RECORD_TYPE => l_record_type,
2072 P_RESOURCE_LIST_ID => l_resource_list_id,
2073 P_STRUCT_VER_ID => l_struct_ver_id,
2074 P_ACTUALS_THRU_DATE => P_ACTUALS_THRU_DATE,
2075 P_DATA_TYPE_CODE => 'ETC_FP',
2076 X_RETURN_STATUS => x_return_status,
2077 X_MSG_COUNT => x_msg_count,
2078 X_MSG_DATA => x_msg_data );
2079 -- hr_utility.trace('2.Status after calling call_summ_pop_tmps api: '||x_return_status);
2080 IF P_PA_DEBUG_MODE = 'Y' THEN
2081 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2082 P_CALLED_MODE => P_CALLED_MODE,
2083 P_MSG => 'After calling PA_FP_GEN_FCST_AMT_PUB1.'||
2084 'CALL_SUMM_POP_TMPS:'||x_return_status,
2085 P_MODULE_NAME => l_module_name);
2086 END IF;
2087 --dbms_output.put_line('After calling pji api: '||x_return_status);
2088 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2089 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2090 END IF;
2091 END IF; -- for P_ETC_FP_PLAN_VERSION_ID check
2092
2093 --*****Populate pji tmp1,fcst tmp1 tables from target financial version******--
2094 l_resource_list_id := l_fp_cols_rec_target.X_RESOURCE_LIST_ID;
2095 l_struct_ver_id := l_fp_cols_rec_target.X_PROJECT_STRUCTURE_VERSION_ID;
2096 /*IF p_pa_debug_mode = 'Y' THEN
2097 pa_fp_gen_amount_utils.fp_debug
2098 (p_msg => 'Value of l_resource_list_id: '||l_resource_list_id,
2099 p_module_name => l_module_name,
2100 p_log_level => 5);
2101 END IF;
2102 IF p_pa_debug_mode = 'Y' THEN
2103 pa_fp_gen_amount_utils.fp_debug
2104 (p_msg => 'Value of l_struct_ver_id: '||l_struct_ver_id,
2105 p_module_name => l_module_name,
2106 p_log_level => 5);
2107 END IF;*/
2108 IF P_PA_DEBUG_MODE = 'Y' THEN
2109 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2110 P_CALLED_MODE => P_CALLED_MODE,
2111 P_MSG => 'Before calling PA_FP_GEN_FCST_AMT_PUB1.'||
2112 'CALL_SUMM_POP_TMPS',
2113 P_MODULE_NAME => l_module_name);
2114 END IF;
2115 /* hr_utility.trace('3.l_calendar_type: '||l_calendar_type);
2116 hr_utility.trace('3.l_record_type: '||l_record_type);
2117 hr_utility.trace('3.l_resource_list_id: '||l_resource_list_id);
2118 hr_utility.trace('3.l_struct_ver_id: '||l_struct_ver_id);
2119 hr_utility.trace('3.P_ACTUALS_THRU_DATE: '||P_ACTUALS_THRU_DATE); */
2120 PA_FP_GEN_FCST_AMT_PUB1.CALL_SUMM_POP_TMPS(
2121 P_PROJECT_ID => P_PROJECT_ID,
2122 P_CALENDAR_TYPE => l_calendar_type,
2123 P_RECORD_TYPE => l_record_type,
2124 P_RESOURCE_LIST_ID => l_resource_list_id,
2125 P_STRUCT_VER_ID => l_struct_ver_id,
2126 P_ACTUALS_THRU_DATE => P_ACTUALS_THRU_DATE,
2127 P_DATA_TYPE_CODE => 'TARGET_FP',
2128 X_RETURN_STATUS => x_return_status,
2129 X_MSG_COUNT => x_msg_count,
2130 X_MSG_DATA => x_msg_data );
2131 -- hr_utility.trace('3.Status after calling call_summ_pop_tmps api: '||x_return_status);
2132 IF P_PA_DEBUG_MODE = 'Y' THEN
2133 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2134 P_CALLED_MODE => P_CALLED_MODE,
2135 P_MSG => 'After calling PA_FP_GEN_FCST_AMT_PUB1.'||
2136 'CALL_SUMM_POP_TMPS:'||x_return_status,
2137 P_MODULE_NAME => l_module_name);
2138 END IF;
2139 --dbms_output.put_line(' --After calling pji get_summarized api: '||x_return_status);
2140 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2141 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2142 END IF;
2143
2144 /**traverse each node in latest published finanical WBS,
2145 *check for each task's etc source code, do corresponding
2146 *operations.**/
2147
2148 /* 10/11/2004 ETC Enhancements:
2149 For Top Task planning, copy ETC method from Top Task to all of its children
2150 */
2151 -- hr_utility.trace('FIN_PLAN_LEVEL_CODE: '||l_fp_cols_rec_target.X_FIN_PLAN_LEVEL_CODE);
2152 /* Planning level : top task */
2153 if l_fp_cols_rec_target.X_FIN_PLAN_LEVEL_CODE = 'T' then
2154 OPEN traverse_top_tasks_cur(l_fcst_gen_src_code);
2155 FETCH traverse_top_tasks_cur
2156 BULK COLLECT
2157 INTO l_top_task_id_tab,
2158 l_top_gen_etc_src_code_tab;
2159 CLOSE traverse_top_tasks_cur;
2160 /* hr_utility.trace('l_top_task_id_tab,count: '||l_top_task_id_tab.count);
2161 hr_utility.trace('l_top_gen_etc_src_code_tab.count: '||l_top_gen_etc_src_code_tab.count); */
2162 l_task_index := 0;
2163 FOR i in 1..l_top_task_id_tab.last LOOP
2164 /* Add the Top Task to pl/sql tables */
2165 l_task_id_tab(l_task_index) := l_top_task_id_tab(i);
2166 l_gen_etc_source_code_tab(l_task_index) := l_top_gen_etc_src_code_tab(i);
2167 l_task_index := l_task_index + 1;
2168 l_temp_top_task_id := l_top_task_id_tab(i);
2169 l_child_task_id_tab.DELETE;
2170
2171 OPEN traverse_child_tasks_cur;
2172 FETCH traverse_child_tasks_cur
2173 BULK COLLECT
2174 INTO l_child_task_id_tab;
2175 CLOSE traverse_child_tasks_cur;
2176
2177 -- hr_utility.trace('l_child_task_id_tab.count: '||l_child_task_id_tab.count);
2178 FOR j in 1..l_child_task_id_tab.count LOOP
2179 /* Add the Top Task's childen to pl/sql tables */
2180 l_task_id_tab(l_task_index) := l_child_task_id_tab(j);
2181 l_gen_etc_source_code_tab(l_task_index) := l_top_gen_etc_src_code_tab(i);
2182 l_task_index := l_task_index + 1;
2183 END LOOP;
2184 END LOOP;
2185 ELSIF l_fp_cols_rec_target.X_FIN_PLAN_LEVEL_CODE IN ('L','P') THEN
2186 /* Lowest task or Project */
2187 OPEN traverse_tasks_cur(l_fcst_gen_src_code);
2188 FETCH traverse_tasks_cur
2189 BULK COLLECT
2190 INTO l_task_id_tab,
2191 l_gen_etc_source_code_tab;
2192 CLOSE traverse_tasks_cur;
2193 END IF; -- for plan level check
2194
2195 IF P_PA_DEBUG_MODE = 'Y' THEN
2196 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2197 P_CALLED_MODE => P_CALLED_MODE,
2198 P_MSG => 'In traverse cursor, we have how many records?'||
2199 l_task_id_tab.count,
2200 P_MODULE_NAME => l_module_name);
2201 END IF;
2202 IF l_task_id_tab.count = 0 THEN
2203 IF p_pa_debug_mode = 'Y' THEN
2204 PA_DEBUG.Reset_Curr_Function;
2205 END IF;
2206 RETURN;
2207 END IF;
2208
2209 -- Changes done for bug#10406949 ,FP Bug#12800007
2210 --IF (l_proj_struc_sharing_code = 'SPLIT_MAPPING') or (l_proj_struc_sharing_code = 'SPLIT_NO_MAPPING') THEN
2211 --bug#13829368 modified the if condition to support SHARE_PARTIAL structure_sharing_code
2212 IF (l_proj_struc_sharing_code = 'SPLIT_MAPPING') or (l_proj_struc_sharing_code = 'SHARE_PARTIAL') THEN
2213 DELETE FROM pa_map_wp_to_fin_tasks_tmp;
2214 INSERT INTO pa_map_wp_to_fin_tasks_tmp (SELECT * FROM pa_map_wp_to_fin_tasks_v WHERE project_id = P_PROJECT_ID);
2215 END IF;
2216
2217 /* hr_utility.trace('--Before traverse any task node');
2218 hr_utility.trace('--we have :'||l_task_id_tab.count||' task ids'); */
2219 FOR i IN l_task_id_tab.first..l_task_id_tab.last LOOP
2220 -- hr_utility.trace(i||'th task->');
2221
2222 l_curr_task_id := l_task_id_tab(i);
2223 l_curr_etc_source := l_gen_etc_source_code_tab(i);
2224
2225 /* hr_utility.trace('--task id is:'||l_task_id_tab(i));
2226 hr_utility.trace('--curr etc source is fin/wp/wkqty/avgact:'||
2227 l_gen_etc_source_code_tab(i)); */
2228 --dbms_output.put_line('--task id is:'||l_task_id_tab(i));
2229 --dbms_output.put_line('--curr etc source is fin/wp/wkqty/avgact:'||l_gen_etc_source_code_tab(i));
2230 /* IF p_pa_debug_mode = 'Y' THEN
2231 pa_fp_gen_amount_utils.fp_debug
2232 (p_msg => 'Value of l_curr_etc_source: '||l_curr_etc_source,
2233 p_module_name => l_module_name,
2234 p_log_level => 5);
2235 END IF;*/
2236 -- hr_utility.trace('l_curr_etc_source: '||l_curr_etc_source);
2237 IF l_curr_etc_source = 'AVERAGE_ACTUALS' THEN
2238 -- Bug 4114589: Processing of tasks with source of Average of Actuals
2239 -- has moved to after the resource mapping and Copy Actuals API call.
2240 l_avg_actuals_task_id_tab(l_avg_actuals_task_id_tab.count+1) := l_curr_task_id;
2241 ELSIF l_curr_etc_source = 'FINANCIAL_PLAN'
2242 OR l_curr_etc_source = 'WORKPLAN_RESOURCES' THEN
2243 l_proceed_flag := 'Y';
2244 IF l_curr_etc_source = 'WORKPLAN_RESOURCES' AND
2245 l_proj_struc_sharing_code = 'SPLIT_NO_MAPPING' THEN
2246 IF l_entered_flag = 'Y' THEN
2247 l_proceed_flag := 'N';
2248 ELSE
2249 l_proceed_flag := 'Y';
2250 l_entered_flag := 'Y';
2251 END IF;
2252 END IF;
2253 IF l_proceed_flag = 'Y' THEN
2254 IF l_curr_etc_source = 'FINANCIAL_PLAN' THEN
2255 l_calling_context := 'FINANCIAL_PLAN';
2256 ELSIF l_curr_etc_source = 'WORKPLAN_RESOURCES' THEN
2257 l_calling_context := 'WORK_PLAN';
2258 END IF;
2259
2260 /*IF p_pa_debug_mode = 'Y' THEN
2261 pa_fp_gen_amount_utils.fp_debug
2262 (p_msg => 'Value of l_calling_context: '||l_calling_context,
2263 p_module_name => l_module_name,
2264 p_log_level => 5);
2265 END IF;*/
2266
2267 /**Calling the total_plan_txn_amts api to get the total
2268 *transaction amts for a given task**/
2269 IF P_PA_DEBUG_MODE = 'Y' THEN
2270 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2271 P_CALLED_MODE => P_CALLED_MODE,
2272 P_MSG => 'Before calling pa_fp_gen_fcst_amt_pub.'||
2273 'get_total_plan_txn_amts',
2274 P_MODULE_NAME => l_module_name);
2275 END IF;
2276 --dbms_output.put_line('--Before GET_TOTAL--');
2277 --dbms_output.put_line('--P_PROJECT_ID:'||p_project_id);
2278 --dbms_output.put_line('--P_BUDGET_VERSION_ID:'||P_BUDGET_VERSION_ID);
2279 --dbms_output.put_line('--l_wp_version_id:'||l_wp_version_id);
2280 --dbms_output.put_line('--P_ETC_FP_PLAN_VERSION_ID:'||P_ETC_FP_PLAN_VERSION_ID);
2281 --dbms_output.put_line('--l_fp_cols_rec_wp:'||l_fp_cols_rec_wp.X_PROJ_FP_OPTIONS_ID);
2282 --dbms_output.put_line('--l_fp_cols_rec_fp:'||l_fp_cols_rec_fp.X_PROJ_FP_OPTIONS_ID);
2283 --dbms_output.put_line('--P_FP_COLS_REC:'||P_FP_COLS_REC.X_PROJ_FP_OPTIONS_ID);
2284 --dbms_output.put_line('--l_curr_task_id:'||l_curr_task_id);
2285 --dbms_output.put_line('--l_calling_context:'||l_calling_context);
2286
2287 BEGIN
2288 PA_FP_GEN_FCST_AMT_PVT.GET_TOTAL_PLAN_TXN_AMTS
2289 ( P_PROJECT_ID => P_PROJECT_ID,
2290 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
2291 P_BV_ID_ETC_WP => l_wp_version_id,
2292 P_BV_ID_ETC_FP => P_ETC_FP_PLAN_VERSION_ID,
2293 P_FP_COLS_REC_ETC_WP => l_fp_cols_rec_wp,
2294 P_FP_COLS_REC_ETC_FP => l_fp_cols_rec_fp,
2295 P_FP_COLS_REC => P_FP_COLS_REC,
2296 P_TASK_ID => l_curr_task_id,
2297 P_STRUCTURE_SHARING_CODE => l_proj_struc_sharing_code, -- Changes done for bug#10406949 ,FP Bug#12800007
2298 --P_RES_LIST_MEMBER_ID => NULL,
2299 --P_TXN_CURRENCY_CODE => NULL,
2300 P_LATEST_PUBLISH_FP_WBS_ID => l_latest_published_fwbs_id,
2301 P_CALLING_CONTEXT => l_calling_context,
2302 X_TXN_AMT_REC => l_txn_amt_rec,
2303 X_RETURN_STATUS => x_return_status,
2304 X_MSG_COUNT => x_msg_count,
2305 X_MSG_DATA => x_msg_data );
2306 EXCEPTION
2307 WHEN no_data_found THEN
2308 IF p_pa_debug_mode = 'Y' THEN
2309 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2310 P_CALLED_MODE => P_CALLED_MODE,
2311 P_MSG => 'PA_FP_GEN_FCST_AMT_PVT.GET_TOTAL_PLAN_TXN_AMTS '||
2312 'throws out no_data_found exception',
2313 P_MODULE_NAME => l_module_name);
2314 END IF;
2315 END;
2316 IF p_pa_debug_mode = 'Y' THEN
2317 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2318 P_CALLED_MODE => P_CALLED_MODE,
2319 P_MSG => 'After calling pa_fp_gen_fcst_amt_pub.'||
2320 'get_total_plan_txn_amts: '||x_return_status,
2321 P_MODULE_NAME => l_module_name);
2322 END IF;
2323 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2324 IF p_pa_debug_mode = 'Y' THEN
2325 PA_DEBUG.Reset_Curr_Function;
2326 END IF;
2327 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2328 END IF;
2329 END IF;
2330 ELSIF l_curr_etc_source = 'WORK_QUANTITY' THEN
2331 /*IF p_pa_debug_mode = 'Y' THEN
2332 pa_fp_gen_amount_utils.fp_debug
2333 (p_msg => 'Value of l_curr_etc_source: '||l_curr_etc_source,
2334 p_module_name => l_module_name,
2335 p_log_level => 5);
2336 END IF;
2337 IF p_pa_debug_mode = 'Y' THEN
2338 pa_fp_gen_amount_utils.fp_debug
2339 (p_msg => 'Value of l_work_qty_cnt: '||l_work_qty_cnt,
2340 p_module_name => l_module_name,
2341 p_log_level => 5);
2342 END IF;
2343 IF p_pa_debug_mode = 'Y' THEN
2344 pa_fp_gen_amount_utils.fp_debug
2345 (p_msg => 'Value of l_proj_struc_sharing_code: '||l_proj_struc_sharing_code,
2346 p_module_name => l_module_name,
2347 p_log_level => 5);
2348 END IF;*/
2349 IF l_work_qty_cnt = 0 THEN
2350 IF l_proj_struc_sharing_code = 'SPLIT_NO_MAPPING' THEN
2351 l_work_qty_cnt := 1;
2352 l_curr_task_id := NULL;
2353 END IF;
2354 IF P_PA_DEBUG_MODE = 'Y' THEN
2355 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2356 P_CALLED_MODE => P_CALLED_MODE,
2357 P_MSG => 'Before calling pa_fp_gen_fcst_amt_pub1.'||
2358 'GET_ETC_WORK_QTY_AMTS',
2359 P_MODULE_NAME => l_module_name);
2360 END IF;
2361 /*WORK_QTY_AMTS are generated at task level, so P_RESOURCE_ASSIGNMENT and
2362 P_RESOURCE_LIST_MEMBER_ID are not needed*/
2363 PA_FP_GEN_FCST_AMT_PUB1.GET_ETC_WORK_QTY_AMTS(
2364 P_PROJECT_ID => P_PROJECT_ID,
2365 P_PROJ_CURRENCY_CODE => P_FP_COLS_REC.X_PROJECT_CURRENCY_CODE,
2366 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
2367 P_TASK_ID => l_curr_task_id,
2368 P_TARGET_RES_LIST_ID => l_fp_cols_rec_target.X_RESOURCE_LIST_ID,
2369 P_ACTUALS_THRU_DATE => P_ACTUALS_THRU_DATE,
2370 P_FP_COLS_REC => P_FP_COLS_REC,
2371 P_WP_STRUCTURE_VERSION_ID => P_WP_STRUCTURE_VERSION_ID,
2372 X_RETURN_STATUS => x_return_status,
2373 X_MSG_COUNT => x_msg_count,
2374 X_MSG_DATA => x_msg_data);
2375 IF p_pa_debug_mode = 'Y' THEN
2376 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2377 P_CALLED_MODE => P_CALLED_MODE,
2378 P_MSG => 'After calling pa_fp_gen_fcst_amt_pub1.'||
2379 'GET_ETC_WORK_QTY_AMTS: '||x_return_status,
2380 P_MODULE_NAME => l_module_name);
2381 END IF;
2382 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2383 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2384 END IF;
2385 END IF;
2386 ELSIF l_curr_etc_source = 'NONE' THEN
2387 IF P_PA_DEBUG_MODE = 'Y' THEN
2388 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2389 P_CALLED_MODE => P_CALLED_MODE,
2390 P_MSG => 'Before calling pa_fp_gen_fcst_amt_pub1.none_etc_src',
2391 P_MODULE_NAME => l_module_name);
2392 END IF;
2393 PA_FP_GEN_FCST_AMT_PUB1.NONE_ETC_SRC(
2394 P_PROJECT_ID => P_PROJECT_ID,
2395 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
2396 P_RESOURCE_LIST_ID => l_fp_cols_rec_target.X_RESOURCE_LIST_ID,
2397 P_TASK_ID => l_curr_task_id,
2398 X_RETURN_STATUS => x_return_status,
2399 X_MSG_COUNT => x_msg_count,
2400 X_MSG_DATA => x_msg_data );
2401 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2402 IF p_pa_debug_mode = 'Y' THEN
2403 PA_DEBUG.Reset_Curr_Function;
2404 END IF;
2405 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2406 END IF;
2407 END IF;
2408 END LOOP;
2409
2410 -- Changes done for bug#10406949 , FP Bug#12800007
2411 DELETE FROM pa_map_wp_to_fin_tasks_tmp;
2412
2413 --Bug 6407972
2414 --Bug 5929269. If the plan version into whihc amounts are being forecasted has
2415 --Top Task Planning level then the task ids in PA_FP_FCST_GEN_TMP1 should be updated
2416 --to the top task ids since the ETC should now be calculated for top tasks
2417 IF p_fp_cols_rec.x_fin_plan_level_code = 'T' THEN
2418
2419 UPDATE pa_fp_fcst_gen_tmp1 tmp
2420 SET tmp.project_element_id = (SELECT pt.top_task_id
2421 FROM pa_tasks pt
2422 WHERE tmp.project_element_id = pt.task_id)
2423 WHERE tmp.data_type_code = 'ETC_FP'
2424 AND tmp.project_element_id
2425 IN
2426 (SELECT pt.task_id
2427 FROM pa_tasks pt
2428 WHERE pt.top_task_id IN (SELECT tmp1.task_id
2429 FROM pa_fp_calc_amt_tmp1 tmp1
2430 WHERE tmp1.budget_version_id =
2431 p_etc_fp_plan_version_id)
2432 AND pt.task_id NOT IN (SELECT tmp1.task_id
2433 FROM pa_fp_calc_amt_tmp1 tmp1
2434 WHERE tmp1.budget_version_id =
2435 p_etc_fp_plan_version_id)
2436 AND pt.project_id=p_project_id
2437 AND pt.task_id<>pt.top_task_id
2438 );
2439
2440 END IF;
2441
2442 /* Call resource mapping API on source transaction resources.
2443 The planning resources from the generation source must be mapped to the
2444 target forecast verion resource list before calculating the ETC numbers.
2445 The ETC calculation is based on the rate based flag of the target
2446 planning resource. */
2447
2448 IF p_pa_debug_mode = 'Y' THEN
2449 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2450 P_CALLED_MODE => P_CALLED_MODE,
2451 P_MSG => 'Before calling pa_fp_gen_fcst_rmap_pkg.fcst_src_txns_rmap',
2452 P_MODULE_NAME => l_module_name);
2453 END IF;
2454 -- hr_utility.trace('before fcst src txns rmap');
2455 PA_FP_GEN_FCST_RMAP_PKG.FCST_SRC_TXNS_RMAP
2456 (P_PROJECT_ID => P_PROJECT_ID,
2457 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
2458 P_FP_COLS_REC => P_fp_cols_rec,
2459 X_RETURN_STATUS => X_RETURN_STATUS,
2460 X_MSG_COUNT => X_MSG_COUNT,
2461 X_MSG_DATA => X_MSG_DATA);
2462 -- hr_utility.trace('after fcst src txns rmap');
2463 IF p_pa_debug_mode = 'Y' THEN
2464 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2465 P_CALLED_MODE => P_CALLED_MODE,
2466 P_MSG => 'After calling pa_fp_gen_fcst_rmap_pkg.fcst_src_txns_rmap'
2467 ||x_return_status,
2468 P_MODULE_NAME => l_module_name);
2469 END IF;
2470 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2471 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2472 END IF;
2473
2474 -- Bug 4114589: Moved from beginning of GENERATE_FCST_AMT_WRP to after
2475 -- resource mapping, which also calls CREATE_RES_ASG and UPDATE_RES_ASG
2476 -- via call to MAINTAIN_RES_ASG, so that planning dates from the source
2477 -- are honored when possible, since resources created by the Copy Actuals
2478 -- API use task/project-level default dates.
2479 IF p_pa_debug_mode = 'Y' THEN
2480 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2481 P_CALLED_MODE => P_CALLED_MODE,
2482 P_MSG => 'Before calling pa_fp_copy_actuals_pub.copy_actuals',
2483 P_MODULE_NAME => l_module_name);
2484 END IF;
2485 PA_FP_COPY_ACTUALS_PUB.COPY_ACTUALS
2486 (P_PROJECT_ID => P_PROJECT_ID,
2487 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
2488 P_FP_COLS_REC => P_fp_cols_rec,
2489 P_END_DATE => P_ACTUALS_THRU_DATE,
2490 P_INIT_MSG_FLAG => 'N',
2491 P_COMMIT_FLAG => 'N',
2492 X_RETURN_STATUS => X_RETURN_STATUS,
2493 X_MSG_COUNT => X_MSG_COUNT,
2494 X_MSG_DATA => X_MSG_DATA);
2495 IF p_pa_debug_mode = 'Y' THEN
2496 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2497 P_CALLED_MODE => P_CALLED_MODE,
2498 P_MSG => 'After calling pa_fp_copy_actuals_pub.copy_actuals:'
2499 ||x_return_status,
2500 P_MODULE_NAME => l_module_name);
2501 END IF;
2502 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2503 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2504 END IF;
2505
2506 -- Now that we have copied the actuals, we do the delayed processing
2507 -- for tasks with source of Average of Actuals.
2508 FOR i IN 1..l_avg_actuals_task_id_tab.count LOOP
2509 IF p_pa_debug_mode = 'Y' THEN
2510 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2511 P_CALLED_MODE => P_CALLED_MODE,
2512 P_MSG => 'Before calling PA_FP_GEN_FCST_AMT_PUB.'||
2513 'GEN_AVERAGE_OF_ACTUALS_WRP',
2514 P_MODULE_NAME => l_module_name);
2515 END IF;
2516 /* hr_utility.trace('Values passed to call GEN_AVERAGE_OF_ACTUALS_WRP api');
2517 hr_utility.trace('P_BUDGET_VERSION_ID: '||P_BUDGET_VERSION_ID);
2518 hr_utility.trace('l_curr_task_id: '||l_curr_task_id);
2519 hr_utility.trace('P_ACTUALS_THRU_DATE: '||P_ACTUALS_THRU_DATE);
2520 hr_utility.trace('P_ACTUALS_FROM_PERIOD: '||P_ACTUALS_FROM_PERIOD);
2521 hr_utility.trace('P_ACTUALS_TO_PERIOD: '||P_ACTUALS_TO_PERIOD);
2522 hr_utility.trace('P_ETC_FROM_PERIOD: '||P_ETC_FROM_PERIOD);
2523 hr_utility.trace('P_ETC_TO_PERIOD: '||P_ETC_TO_PERIOD); */
2524 PA_FP_GEN_FCST_AMT_PUB1.GEN_AVERAGE_OF_ACTUALS_WRP
2525 (P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
2526 P_TASK_ID => l_avg_actuals_task_id_tab(i),
2527 P_ACTUALS_THRU_DATE => P_ACTUALS_THRU_DATE,
2528 P_FP_COLS_REC => P_FP_COLS_REC,
2529 P_ACTUALS_FROM_PERIOD => P_ACTUALS_FROM_PERIOD,
2530 P_ACTUALS_TO_PERIOD => P_ACTUALS_TO_PERIOD,
2531 P_ETC_FROM_PERIOD => P_ETC_FROM_PERIOD,
2532 P_ETC_TO_PERIOD => P_ETC_TO_PERIOD,
2533 X_RETURN_STATUS => X_RETURN_STATUS,
2534 X_MSG_COUNT => X_MSG_COUNT,
2535 X_MSG_DATA => X_MSG_DATA );
2536 -- hr_utility.trace('Return status after calling GEN_AVERAGE_OF_ACTUALS_WRP: '
2537 -- ||x_return_status);
2538 IF p_pa_debug_mode = 'Y' THEN
2539 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2540 P_CALLED_MODE => P_CALLED_MODE,
2541 P_MSG => 'After calling PA_FP_GEN_FCST_AMT_PUB.'||
2542 'GEN_AVERAGE_OF_ACTUALS_WRP: '||x_return_status,
2543 P_MODULE_NAME => l_module_name);
2544 END IF;
2545 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2546 IF p_pa_debug_mode = 'Y' THEN
2547 PA_DEBUG.Reset_Curr_Function;
2548 END IF;
2549 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2550 END IF;
2551 END LOOP;
2552 -- Bug 4114589: End changes.
2553
2554 --dbms_output.put_line('--next, we will get all etc amts for each task');
2555 /***********************************************************
2556 *Above gets all the plan amounts for any specifc tasks
2557 *Below will get all the etc amounts for the tasks.
2558 ***********************************************************/
2559
2560 /**From latest approved version, by calling gen_map_bv_to_target_rl
2561 *we get PA_FP_CALC_AMT_TMP3 popuated, from it, we can get the
2562 *baselined cost**/
2563
2564 /* select count(*) into l_test from Pa_fp_CALC_AMT_TMP1;
2565 hr_utility.trace('fp calc amt tmp1 tab count '||l_test);
2566 select count(*) into l_test from Pa_fp_CALC_AMT_TMP2;
2567 hr_utility.trace('fp calc amt tmp2 tab count '||l_test); */
2568
2569 DELETE FROM PA_FP_CALC_AMT_TMP3;
2570 /* the following code is commented. We are not going to use the
2571 baselined budget cost for ETC gen method Plan to Complete. */
2572 /* IF P_PA_DEBUG_MODE = 'Y' THEN
2573 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2574 P_CALLED_MODE => P_CALLED_MODE,
2575 P_MSG => 'Before calling PA_FIN_PLAN_UTILS.'||
2576 'Get_Appr_Cost_Plan_Type_Info',
2577 P_MODULE_NAME => l_module_name);
2578 END IF;
2579 PA_FIN_PLAN_UTILS.Get_Appr_Cost_Plan_Type_Info(
2580 p_project_id => P_PROJECT_ID,
2581 x_plan_type_id => l_fin_plan_type_id,
2582 x_return_status => x_return_status,
2583 x_msg_count => x_msg_count,
2584 x_msg_data => x_msg_data);
2585
2586 --dbms_output.put_line('l_fin_plan_type_id is '||l_fin_plan_type_id);
2587 IF P_PA_DEBUG_MODE = 'Y' THEN
2588 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2589 P_CALLED_MODE => P_CALLED_MODE,
2590 P_MSG => 'After calling PA_FIN_PLAN_UTILS.'||
2591 'Get_Appr_Cost_Plan_Type_Info: '||x_return_status,
2592 P_MODULE_NAME => l_module_name);
2593 END IF;
2594 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2595 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2596 END IF;
2597 IF (l_fin_plan_type_id IS NULL) THEN
2598 PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
2599 p_msg_name => 'PA_FP_GENFCST_NO_COST_PTYPE');
2600 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2601 END IF;
2602
2603 SELECT DECODE( FIN_PLAN_PREFERENCE_CODE,'COST_ONLY', 'COST' ,
2604 'COST_AND_REV_SEP', 'COST',
2605 'COST_AND_REV_SAME', 'ALL') INTO l_version_type
2606 FROM pa_proj_fp_options
2607 WHERE fin_plan_type_id = l_fin_plan_type_id
2608 AND fin_plan_option_level_code = 'PLAN_TYPE'
2609 AND project_id = P_PROJECT_ID;
2610
2611 --dbms_output.put_line('--l_version_type: '||l_version_type);
2612 IF P_PA_DEBUG_MODE = 'Y' THEN
2613 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2614 P_CALLED_MODE => P_CALLED_MODE,
2615 P_MSG => 'Before calling PA_FP_GEN_AMOUNT_UTILS.'||
2616 'Get_Curr_Original_Version_Info',
2617 P_MODULE_NAME => l_module_name);
2618 END IF;
2619 PA_FP_GEN_AMOUNT_UTILS.Get_Curr_Original_Version_Info(
2620 p_project_id => P_PROJECT_ID,
2621 p_fin_plan_type_id => l_fin_plan_type_id,
2622 p_version_type => l_version_type,
2623 p_status_code => 'CURRENT_APPROVED',
2624 x_fp_options_id => l_approved_fp_options_id,
2625 x_fin_plan_version_id => l_approved_fp_version_id,
2626 x_return_status => x_return_status,
2627 x_msg_count => x_msg_count,
2628 x_msg_data => x_msg_data);
2629 --dbms_output.put_line('--!after PA_FP_GEN_AMOUNT_UTILS.Get_Curr_Original_Version_Info'||x_return_status);
2630 --dbms_output.put_line('--l_approved_fp_version_id is:'||l_approved_fp_version_id);
2631 IF P_PA_DEBUG_MODE = 'Y' THEN
2632 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2633 P_CALLED_MODE => P_CALLED_MODE,
2634 P_MSG => 'After calling PA_FP_GEN_AMOUNT_UTILS.'||
2635 'Get_Curr_Original_Version_Info: '||x_return_status,
2636 P_MODULE_NAME => l_module_name);
2637 END IF;
2638 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2639 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2640 END IF;
2641 IF (l_approved_fp_version_id IS NULL) THEN
2642 --dbms_output.put_line('--l_approved_fp_version_id is NULL');
2643 PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
2644 p_msg_name => 'PA_FP_GENFCST_NO_APPR_FPVER');
2645 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2646 END IF;
2647
2648 IF P_PA_DEBUG_MODE = 'Y' THEN
2649 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2650 P_CALLED_MODE => P_CALLED_MODE,
2651 P_MSG => 'Before calling PA_FP_GEN_AMOUNT_UTILS.'||
2652 'GET_PLAN_VERSION_DTLS',
2653 P_MODULE_NAME => l_module_name);
2654 END IF;
2655 --dbms_output.put_line('--before PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS');
2656 PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS(
2657 P_PROJECT_ID => P_PROJECT_ID,
2658 P_BUDGET_VERSION_ID => l_approved_fp_version_id,
2659 X_FP_COLS_REC => l_fp_cols_rec_approved,
2660 X_RETURN_STATUS => x_return_status,
2661 X_MSG_COUNT => x_msg_count,
2662 X_MSG_DATA => x_msg_data);
2663 --dbms_output.put_line('--after PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS :'||x_return_status);
2664 IF P_PA_DEBUG_MODE = 'Y' THEN
2665 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2666 P_CALLED_MODE => P_CALLED_MODE,
2667 P_MSG => 'After calling PA_FP_GEN_AMOUNT_UTILS.'||
2668 'GET_PLAN_VERSION_DTLS: '||x_return_status,
2669 P_MODULE_NAME => l_module_name);
2670 END IF;
2671 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2672 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2673 END IF;
2674
2675 IF P_PA_DEBUG_MODE = 'Y' THEN
2676 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2677 P_CALLED_MODE => P_CALLED_MODE,
2678 P_MSG => 'Before calling PA_FP_MAP_BV_PUB.'||
2679 'GEN_MAP_BV_TO_TARGET_RL',
2680 P_MODULE_NAME => l_module_name);
2681 END IF;
2682 --dbms_output.put_line('--before MAP_BV_TO_TARGET_RL');
2683 --hr_utility.trace('bef call PA_FP_MAP_BV_PUB.GEN_MAP_BV_TO_TARGET_RL api');
2684 PA_FP_MAP_BV_PUB.GEN_MAP_BV_TO_TARGET_RL
2685 (P_SOURCE_BV_ID => l_approved_fp_version_id,
2686 P_TARGET_FP_COLS_REC => P_FP_COLS_REC,
2687 P_ETC_FP_COLS_REC => l_fp_cols_rec_wp,
2688 P_CB_FP_COLS_REC => l_fp_cols_rec_approved,
2689 X_RETURN_STATUS => x_return_status,
2690 X_MSG_COUNT => x_msg_count,
2691 X_MSG_DATA => x_msg_data);
2692 --dbms_output.put_line('--PA_FP_MAP_BV_PUB.GEN_MAP_BV_TO_TARGET_RL:' ||x_return_status);
2693 --hr_utility.trace('aft call GEN_MAP_BV_TO_TARGET_RL api:'||x_return_status);
2694 IF P_PA_DEBUG_MODE = 'Y' THEN
2695 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2696 P_CALLED_MODE => P_CALLED_MODE,
2697 P_MSG => 'After calling PA_FP_MAP_BV_PUB.'||
2698 'GEN_MAP_BV_TO_TARGET_RL: '||x_return_status,
2699 P_MODULE_NAME => l_module_name);
2700 END IF;
2701 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2702 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2703 END IF;
2704
2705 IF P_PA_DEBUG_MODE = 'Y' THEN
2706 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2707 P_CALLED_MODE => P_CALLED_MODE,
2708 P_MSG => 'Before calling PA_FP_MAP_BV_PUB.'||
2709 'GEN_MAP_BV_TO_TARGET_RL(2nd time)',
2710 P_MODULE_NAME => l_module_name);
2711 END IF;
2712 PA_FP_MAP_BV_PUB.GEN_MAP_BV_TO_TARGET_RL
2713 (P_SOURCE_BV_ID => l_approved_fp_version_id,
2714 P_TARGET_FP_COLS_REC => P_FP_COLS_REC,
2715 P_ETC_FP_COLS_REC => l_fp_cols_rec_fp,
2716 P_CB_FP_COLS_REC => l_fp_cols_rec_approved,
2717 X_RETURN_STATUS => x_return_status,
2718 X_MSG_COUNT => x_msg_count,
2719 X_MSG_DATA => x_msg_data);
2720 --tmp3's basedline value will be used in method api
2721 IF P_PA_DEBUG_MODE = 'Y' THEN
2722 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2723 P_CALLED_MODE => P_CALLED_MODE,
2724 P_MSG => 'After calling PA_FP_MAP_BV_PUB.'||
2725 'GEN_MAP_BV_TO_TARGET_RL:(2nd time) '||x_return_status,
2726 P_MODULE_NAME => l_module_name);
2727 END IF;
2728 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2729 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2730 END IF; */
2731 /*End baselined comments*/
2732
2733 /* For Forecast Generation of Revenue-only plans, we should honor the
2734 * target's gen source code instead of the gen source codes specified
2735 * at the task level. */
2736 IF p_fp_cols_rec.x_version_type = 'REVENUE' THEN
2737 l_gen_etc_source_code_override := l_fcst_gen_src_code;
2738 ELSE
2739 l_gen_etc_source_code_override := NULL;
2740 END IF;
2741
2742 --select count(*) into l_count_tmp from PA_FP_CALC_AMT_TMP1;
2743 --dbms_output.put_line('l_count_tmp:'||l_count_tmp);
2744 --hr_utility.trace('bef cursor for etc amt calc');
2745 OPEN traverse_tasks_rlm_cur(l_gen_etc_source_code_override);
2746 FETCH traverse_tasks_rlm_cur
2747 BULK COLLECT
2748 INTO l_task_id_tab2,
2749 l_gen_etc_source_code_tab2,
2750 l_src_ra_id_tab2,
2751 l_tgt_ra_id_tab2,
2752 l_rlm_id_tab2,
2753 l_cbs_id_tab2, --bug#16791711
2754 l_etc_method_tab2;
2755 CLOSE traverse_tasks_rlm_cur;
2756 /*IF p_pa_debug_mode = 'Y' THEN
2757 pa_fp_gen_amount_utils.fp_debug
2758 (p_msg => 'Value of l_ra_id_tab2.count: '||l_ra_id_tab2.count,
2759 p_module_name => l_module_name,
2760 p_log_level => 5);
2761 END IF;*/
2762 --dbms_output.put_line('++l_ra_id_tab2.count:'||l_ra_id_tab2.count);
2763 --dbms_output.put_line('++l_ra_id_tab2.first:'||l_ra_id_tab2.first);
2764 --dbms_output.put_line('++l_ra_id_tab2.last:'||l_ra_id_tab2.last);
2765 IF P_PA_DEBUG_MODE = 'Y' THEN
2766 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2767 P_CALLED_MODE => P_CALLED_MODE,
2768 P_MSG => 'second traverse cursor, we have how many records?'
2769 ||l_src_ra_id_tab2.count,
2770 P_MODULE_NAME => l_module_name);
2771 END IF;
2772
2773 /*Check the planning options */
2774
2775 -- Bug 4369741: Initialize planning options flags to 'N'
2776 l_wp_planning_options_flag := 'N';
2777 l_fp_planning_options_flag := 'N';
2778
2779 /* Bug 4369741: Call the COMPARE_ETC_SRC_TARGET_FP_OPT API separately
2780 * for Workplan and Financial Plan source(s) as needed and store the
2781 * results in l_wp_planning_options_flag and l_fp_planning_options_flag. */
2782
2783 IF l_wp_version_id IS NOT NULL AND
2784 p_fp_cols_rec.x_gen_etc_src_code IN ('WORKPLAN_RESOURCES','TASK_LEVEL_SEL') THEN
2785
2786 IF P_PA_DEBUG_MODE = 'Y' THEN
2787 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2788 P_CALLED_MODE => P_CALLED_MODE,
2789 P_MSG => 'Before calling PA_FP_FCST_GEN_AMT_UTILS.'||
2790 'COMPARE_ETC_SRC_TARGET_FP_OPT',
2791 P_MODULE_NAME => l_module_name);
2792 END IF;
2793 PA_FP_FCST_GEN_AMT_UTILS.COMPARE_ETC_SRC_TARGET_FP_OPT
2794 (P_PROJECT_ID => P_PROJECT_ID,
2795 P_WP_SRC_PLAN_VER_ID => l_wp_version_id,
2796 P_FP_SRC_PLAN_VER_ID => NULL, /* Bug 4369741 */
2797 P_FP_TARGET_PLAN_VER_ID => P_BUDGET_VERSION_ID,
2798 X_SAME_PLANNING_OPTION_FLAG => l_wp_planning_options_flag, /* Bug 4369741 */
2799 X_RETURN_STATUS => X_RETURN_STATUS,
2800 X_MSG_COUNT => X_MSG_COUNT,
2801 X_MSG_DATA => X_MSG_DATA);
2802 IF P_PA_DEBUG_MODE = 'Y' THEN
2803 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2804 P_CALLED_MODE => P_CALLED_MODE,
2805 P_MSG => 'After calling PA_FP_FCST_GEN_AMT_UTILS.'||
2806 'COMPARE_ETC_SRC_TARGET_FP_OPT:'||l_wp_planning_options_flag,
2807 P_MODULE_NAME => l_module_name);
2808 END IF;
2809 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2810 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2811 END IF;
2812 END IF; -- get WP planning options flags
2813
2814 IF p_etc_fp_plan_version_id IS NOT NULL AND
2815 p_fp_cols_rec.x_gen_etc_src_code IN ('FINANCIAL_PLAN','TASK_LEVEL_SEL') THEN
2816
2817 IF P_PA_DEBUG_MODE = 'Y' THEN
2818 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2819 P_CALLED_MODE => P_CALLED_MODE,
2820 P_MSG => 'Before calling PA_FP_FCST_GEN_AMT_UTILS.'||
2821 'COMPARE_ETC_SRC_TARGET_FP_OPT',
2822 P_MODULE_NAME => l_module_name);
2823 END IF;
2824 PA_FP_FCST_GEN_AMT_UTILS.COMPARE_ETC_SRC_TARGET_FP_OPT
2825 (P_PROJECT_ID => P_PROJECT_ID,
2826 P_WP_SRC_PLAN_VER_ID => null, /* Bug 4369741 */
2827 P_FP_SRC_PLAN_VER_ID => P_ETC_FP_PLAN_VERSION_ID,
2828 P_FP_TARGET_PLAN_VER_ID => P_BUDGET_VERSION_ID,
2829 X_SAME_PLANNING_OPTION_FLAG => l_fp_planning_options_flag, /* Bug 4369741 */
2830 X_RETURN_STATUS => X_RETURN_STATUS,
2831 X_MSG_COUNT => X_MSG_COUNT,
2832 X_MSG_DATA => X_MSG_DATA);
2833 IF P_PA_DEBUG_MODE = 'Y' THEN
2834 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2835 P_CALLED_MODE => P_CALLED_MODE,
2836 P_MSG => 'After calling PA_FP_FCST_GEN_AMT_UTILS.'||
2837 'COMPARE_ETC_SRC_TARGET_FP_OPT:'||l_fp_planning_options_flag,
2838 P_MODULE_NAME => l_module_name);
2839 END IF;
2840 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2841 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2842 END IF;
2843 END IF; -- get FP planning options flags
2844
2845
2846 /* hr_utility.trace('l_src_ra_id_tab2.COUNT :'||l_src_ra_id_tab2.COUNT);
2847 hr_utility.trace('before for loop :'); */
2848
2849 IF P_PA_DEBUG_MODE = 'Y' THEN
2850 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2851 P_CALLED_MODE => P_CALLED_MODE,
2852 P_MSG => 'Before calling PA_FP_GEN_FCST_AMT_PVT.'||
2853 'UPD_TGT_RATE_BASED_FLAG',
2854 P_MODULE_NAME => l_module_name);
2855 END IF;
2856 PA_FP_GEN_FCST_AMT_PVT.UPD_TGT_RATE_BASED_FLAG(
2857 P_FP_COLS_REC => P_FP_COLS_REC,
2858 X_RETURN_STATUS => x_return_status,
2859 X_MSG_COUNT => x_msg_count,
2860 X_MSG_DATA => x_msg_data);
2861 IF P_PA_DEBUG_MODE = 'Y' THEN
2862 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2863 P_CALLED_MODE => P_CALLED_MODE,
2864 P_MSG => 'After calling PA_FP_GEN_FCST_AMT_PVT.'||
2865 'UPD_TGT_RATE_BASED_FLAG: '||x_return_status,
2866 P_MODULE_NAME => l_module_name);
2867 END IF;
2868 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2869 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2870 END IF;
2871
2872 /* Initialize indices for ETC method PL/SQL tables */
2873 l_rb_index := 0;
2874 l_bc_index := 0;
2875 l_ev_index := 0;
2876
2877 FOR i IN 1..l_src_ra_id_tab2.COUNT LOOP
2878 /*hr_utility.trace('===i===='||i);
2879 hr_utility.trace('task id :'||l_task_id_tab2(i));
2880 hr_utility.trace('rlm id :'||l_rlm_id_tab2(i));
2881 hr_utility.trace('src ra id :'||l_src_ra_id_tab2(i));
2882 hr_utility.trace('gen etc src code:'||l_gen_etc_source_code_tab2(i));
2883 hr_utility.trace('gen etc mtd code:'||l_etc_method_tab2(i)); */
2884
2885 l_curr_task_id := l_task_id_tab2(i);
2886 l_curr_etc_source := l_gen_etc_source_code_tab2(i);
2887 l_curr_src_ra_id := l_src_ra_id_tab2(i);
2888 l_curr_tgt_ra_id := l_tgt_ra_id_tab2(i);
2889 l_curr_rlm_id := l_rlm_id_tab2(i);
2890 l_curr_cbs_id := l_cbs_id_tab2(i);--bug#16791711
2891 l_curr_etc_method_code := l_etc_method_tab2(i);
2892 /*IF p_pa_debug_mode = 'Y' THEN
2893 pa_fp_gen_amount_utils.fp_debug
2894 (p_msg => 'Value of l_curr_task_id: '||l_curr_task_id,
2895 p_module_name => l_module_name,
2896 p_log_level => 5);
2897 END IF;
2898 IF p_pa_debug_mode = 'Y' THEN
2899 pa_fp_gen_amount_utils.fp_debug
2900 (p_msg => 'Value of l_curr_etc_source: '||l_curr_etc_source,
2901 p_module_name => l_module_name,
2902 p_log_level => 5);
2903 END IF;
2904 IF p_pa_debug_mode = 'Y' THEN
2905 pa_fp_gen_amount_utils.fp_debug
2906 (p_msg => 'Value of l_curr_ra_id: '||l_curr_ra_id,
2907 p_module_name => l_module_name,
2908 p_log_level => 5);
2909 END IF;
2910 IF p_pa_debug_mode = 'Y' THEN
2911 pa_fp_gen_amount_utils.fp_debug
2912 (p_msg => 'Value of l_curr_rlm_id: '||l_curr_rlm_id,
2913 p_module_name => l_module_name,
2914 p_log_level => 5);
2915 END IF;
2916 IF p_pa_debug_mode = 'Y' THEN
2917 pa_fp_gen_amount_utils.fp_debug
2918 (p_msg => 'Value of l_curr_etc_method_code: '||l_curr_etc_method_code,
2919 p_module_name => l_module_name,
2920 p_log_level => 5);
2921 END IF;*/
2922 --dbms_output.put_line('@l_curr_task_id:'|| l_curr_task_id);
2923 --dbms_output.put_line('@l_curr_etc_src:'|| l_curr_etc_source);
2924 --dbms_output.put_line('@l_curr_rlm_id'||l_curr_rlm_id);
2925 --dbms_output.put_line('@l_curr_ra_id'||l_curr_ra_id);
2926 --dbms_output.put_line('@l_curr_etc_method:'|| l_curr_etc_method_code);
2927
2928 IF l_curr_etc_source = 'FINANCIAL_PLAN'
2929 OR l_curr_etc_source = 'WORKPLAN_RESOURCES' THEN
2930
2931 IF l_curr_etc_method_code = 'REMAINING_BUDGET' THEN
2932 l_rb_index := l_rb_index + 1;
2933 l_rb_src_ra_id_tab(l_rb_index) := l_curr_src_ra_id;
2934 l_rb_tgt_ra_id_tab(l_rb_index) := l_curr_tgt_ra_id;
2935 l_rb_task_id_tab(l_rb_index) := l_curr_task_id;
2936 l_rb_rlm_id_tab(l_rb_index) := l_curr_rlm_id;
2937 l_rb_cbs_id_tab(l_rb_index) := l_curr_cbs_id; --bug#16791711
2938 l_rb_etc_source_tab(l_rb_index) := l_curr_etc_source;
2939 ELSIF l_curr_etc_method_code = 'BUDGET_TO_COMPLETE' THEN
2940 l_bc_index := l_bc_index + 1;
2941 l_bc_src_ra_id_tab(l_bc_index) := l_curr_src_ra_id;
2942 l_bc_tgt_ra_id_tab(l_bc_index) := l_curr_tgt_ra_id;
2943 l_bc_task_id_tab(l_bc_index) := l_curr_task_id;
2944 l_bc_rlm_id_tab(l_bc_index) := l_curr_rlm_id;
2945 l_bc_cbs_id_tab(l_bc_index) := l_curr_cbs_id; --bug#16791711 bug#16923124(changed index)
2946 l_bc_etc_source_tab(l_bc_index) := l_curr_etc_source;
2947 ELSIF l_curr_etc_method_code = 'EARNED_VALUE' THEN
2948 l_ev_index := l_ev_index + 1;
2949 l_ev_src_ra_id_tab(l_ev_index) := l_curr_src_ra_id;
2950 l_ev_tgt_ra_id_tab(l_ev_index) := l_curr_tgt_ra_id;
2951 l_ev_task_id_tab(l_ev_index) := l_curr_task_id;
2952 l_ev_rlm_id_tab(l_ev_index) := l_curr_rlm_id;
2953 l_ev_cbs_id_tab(l_ev_index) := l_curr_cbs_id; --bug#16791711 bug#16923124(changed index)
2954 l_ev_etc_source_tab(l_ev_index) := l_curr_etc_source;
2955 END IF;
2956 END IF;
2957 END LOOP;
2958
2959 -- gboomina Bug 8318932 AAI Enhancement - Start
2960 OPEN get_copy_etc_from_plan_csr;
2961 FETCH get_copy_etc_from_plan_csr INTO l_copy_etc_from_plan_flag;
2962 CLOSE get_copy_etc_from_plan_csr;
2963
2964 IF NVL(l_copy_etc_from_plan_flag,'N') = 'N' THEN
2965 -- gboomina Bug 8318932 AAI Enhancement - End
2966
2967 IF l_rb_src_ra_id_tab.count > 0 THEN
2968 /* Bug 4369741: Pass NULL for the P_PLANNING_OPTIONS_FLAG parameter
2969 * to make explicit the fact that the ETC method APIs do not make
2970 * use of the planning options flag. All of the planning options logic
2971 * is present in this API itself. */
2972 IF P_PA_DEBUG_MODE = 'Y' THEN
2973 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2974 P_CALLED_MODE => P_CALLED_MODE,
2975 P_MSG => 'Before calling pa_fp_gen_fcst_amt_pub3.'||
2976 'GET_ETC_REMAIN_BDGT_AMTS_BLK',
2977 P_MODULE_NAME => l_module_name);
2978 END IF;
2979 PA_FP_GEN_FCST_AMT_PUB3.GET_ETC_REMAIN_BDGT_AMTS_BLK(
2980 P_SRC_RES_ASG_ID_TAB => l_rb_src_ra_id_tab,
2981 P_TGT_RES_ASG_ID_TAB => l_rb_tgt_ra_id_tab,
2982 P_FP_COLS_SRC_REC_FP => l_fp_cols_rec_fp,
2983 P_FP_COLS_SRC_REC_WP => l_fp_cols_rec_wp,
2984 P_FP_COLS_TGT_REC => P_FP_COLS_REC,
2985 P_TASK_ID_TAB => l_rb_task_id_tab,
2986 P_RES_LIST_MEMBER_ID_TAB => l_rb_rlm_id_tab,
2987 P_CBS_ELEMENT_ID_TAB => l_rb_cbs_id_tab, --bug#16791711
2988 P_ETC_SOURCE_CODE_TAB => l_rb_etc_source_tab,
2989 P_WP_STRUCTURE_VERSION_ID => P_WP_STRUCTURE_VERSION_ID,
2990 P_ACTUALS_THRU_DATE => P_ACTUALS_THRU_DATE,
2991 P_PLANNING_OPTIONS_FLAG => NULL, /* Bug 4369741 */
2992 X_RETURN_STATUS => x_return_status,
2993 X_MSG_COUNT => x_msg_count,
2994 X_MSG_DATA => x_msg_data);
2995 IF p_pa_debug_mode = 'Y' THEN
2996 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2997 P_CALLED_MODE => P_CALLED_MODE,
2998 P_MSG => 'After calling pa_fp_gen_fcst_amt_pub3.'||
2999 'GET_ETC_REMAIN_BDGT_AMTS_BLK: '||x_return_status,
3000 P_MODULE_NAME => l_module_name);
3001 END IF;
3002 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3003 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3004 END IF;
3005 END IF;
3006
3007 IF l_bc_src_ra_id_tab.count > 0 THEN
3008 /* Bug 4369741: Pass NULL for the P_PLANNING_OPTIONS_FLAG parameter
3009 * to make explicit the fact that the ETC method APIs do not make
3010 * use of the planning options flag. All of the planning options logic
3011 * is present in this API itself. */
3012 IF P_PA_DEBUG_MODE = 'Y' THEN
3013 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3014 P_CALLED_MODE => P_CALLED_MODE,
3015 P_MSG => 'Before calling pa_fp_gen_fcst_amt_pub4.'||
3016 'GET_ETC_BDGT_COMPLETE_AMTS_BLK',
3017 P_MODULE_NAME => l_module_name);
3018 END IF;
3019 PA_FP_GEN_FCST_AMT_PUB4.GET_ETC_BDGT_COMPLETE_AMTS_BLK(
3020 P_SRC_RES_ASG_ID_TAB => l_bc_src_ra_id_tab,
3021 P_TGT_RES_ASG_ID_TAB => l_bc_tgt_ra_id_tab,
3022 P_FP_COLS_SRC_REC_FP => l_fp_cols_rec_fp,
3023 P_FP_COLS_SRC_REC_WP => l_fp_cols_rec_wp,
3024 P_FP_COLS_TGT_REC => P_FP_COLS_REC,
3025 P_TASK_ID_TAB => l_bc_task_id_tab,
3026 P_RES_LIST_MEMBER_ID_TAB => l_bc_rlm_id_tab,
3027 P_ETC_SOURCE_CODE_TAB => l_bc_etc_source_tab,
3028 P_WP_STRUCTURE_VERSION_ID => P_WP_STRUCTURE_VERSION_ID,
3029 P_ACTUALS_THRU_DATE => P_ACTUALS_THRU_DATE,
3030 P_PLANNING_OPTIONS_FLAG => NULL, /* Bug 4369741 */
3031 X_RETURN_STATUS => x_return_status,
3032 X_MSG_COUNT => x_msg_count,
3033 X_MSG_DATA => x_msg_data);
3034 IF p_pa_debug_mode = 'Y' THEN
3035 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3036 P_CALLED_MODE => P_CALLED_MODE,
3037 P_MSG => 'After calling pa_fp_gen_fcst_amt_pub4.'||
3038 'GET_ETC_BDGT_COMPLETE_AMTS_BLK: '||x_return_status,
3039 P_MODULE_NAME => l_module_name);
3040 END IF;
3041 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3042 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3043 END IF;
3044 END IF;
3045
3046 IF l_ev_src_ra_id_tab.count > 0 THEN
3047 /* Bug 4369741: Pass NULL for the P_PLANNING_OPTIONS_FLAG parameter
3048 * to make explicit the fact that the ETC method APIs do not make
3049 * use of the planning options flag. All of the planning options logic
3050 * is present in this API itself. */
3051 IF P_PA_DEBUG_MODE = 'Y' THEN
3052 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3053 P_CALLED_MODE => P_CALLED_MODE,
3054 P_MSG => 'Before calling pa_fp_gen_fcst_amt_pub5.'||
3055 'GET_ETC_EARNED_VALUE_AMTS_BLK',
3056 P_MODULE_NAME => l_module_name);
3057 END IF;
3058 PA_FP_GEN_FCST_AMT_PUB5.GET_ETC_EARNED_VALUE_AMTS_BLK(
3059 P_SRC_RES_ASG_ID_TAB => l_ev_src_ra_id_tab,
3060 P_TGT_RES_ASG_ID_TAB => l_ev_tgt_ra_id_tab,
3061 P_FP_COLS_SRC_REC_FP => l_fp_cols_rec_fp,
3062 P_FP_COLS_SRC_REC_WP => l_fp_cols_rec_wp,
3063 P_FP_COLS_TGT_REC => P_FP_COLS_REC,
3064 P_TASK_ID_TAB => l_ev_task_id_tab,
3065 P_RES_LIST_MEMBER_ID_TAB => l_ev_rlm_id_tab,
3066 P_CBS_ELEMENT_ID_TAB => l_ev_cbs_id_tab,
3067 P_ETC_SOURCE_CODE_TAB => l_ev_etc_source_tab,
3068 P_WP_STRUCTURE_VERSION_ID => P_WP_STRUCTURE_VERSION_ID,
3069 P_ACTUALS_THRU_DATE => P_ACTUALS_THRU_DATE,
3070 P_PLANNING_OPTIONS_FLAG => NULL, /* Bug 4369741 */
3071 X_RETURN_STATUS => x_return_status,
3072 X_MSG_COUNT => x_msg_count,
3073 X_MSG_DATA => x_msg_data);
3074 IF p_pa_debug_mode = 'Y' THEN
3075 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3076 P_CALLED_MODE => P_CALLED_MODE,
3077 P_MSG => 'After calling pa_fp_gen_fcst_amt_pub5.'||
3078 'GET_ETC_EARNED_VALUE_AMTS_BLK: '||x_return_status,
3079 P_MODULE_NAME => l_module_name);
3080 END IF;
3081 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3082 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3083 END IF;
3084 END IF;
3085
3086 IF p_fp_cols_rec.x_gen_incl_open_comm_flag = 'Y' THEN
3087
3088 /* Bug 4369741: Modified parameters of GET_ETC_COMMITMENT_AMTS
3089 * API to reflect spec change from a single planning options
3090 * flag to 2 separate flags for Workplan and Financial Plan sources. */
3091
3092 -- hr_utility.trace('after for loop :');
3093 IF P_PA_DEBUG_MODE = 'Y' THEN
3094 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3095 P_CALLED_MODE => P_CALLED_MODE,
3096 P_MSG => 'Before calling PA_FP_GEN_FCST_AMT_PUB3.'||
3097 'GET_ETC_COMMITMENT_AMTS',
3098 P_MODULE_NAME => l_module_name);
3099 END IF;
3100 -- hr_utility.trace('before pub3 cmt amts:');
3101 PA_FP_GEN_FCST_AMT_PUB3.GET_ETC_COMMITMENT_AMTS
3102 (P_FP_COLS_TGT_REC => p_fp_cols_rec,
3103 P_WP_PLANNING_OPTIONS_FLAG => l_wp_planning_options_flag, /* Bug 4369741 */
3104 P_FP_PLANNING_OPTIONS_FLAG => l_fp_planning_options_flag, /* Bug 4369741 */
3105 X_RETURN_STATUS => x_return_status,
3106 X_MSG_COUNT => x_msg_count,
3107 X_MSG_DATA => x_msg_data);
3108
3109 -- hr_utility.trace('after pub3 cmt amts:');
3110
3111 IF p_pa_debug_mode = 'Y' THEN
3112 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3113 P_CALLED_MODE => P_CALLED_MODE,
3114 P_MSG => 'After calling PA_FP_GEN_FCST_AMT_PUB3.'||
3115 'GET_ETC_COMMITMENT_AMTS: '||x_return_status,
3116 P_MODULE_NAME => l_module_name);
3117 END IF;
3118 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3119 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3120 END IF;
3121 END IF;
3122 -- gboomina Bug 8318932 for AAI Enhancement - Start
3123 ELSE
3124 IF P_PA_DEBUG_MODE = 'Y' THEN
3125 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3126 P_CALLED_MODE => P_CALLED_MODE,
3127 P_MSG => 'Before calling pa_fp_gen_fcst_amt_pub3.'||
3128 'GET_ETC_FROM_SRC_BDGT',
3129 P_MODULE_NAME => l_module_name);
3130 END IF;
3131 PA_FP_GEN_FCST_AMT_PUB3.GET_ETC_FROM_SRC_BDGT(
3132 P_FP_COLS_SRC_FP_REC => l_fp_cols_rec_fp,
3133 P_FP_COLS_SRC_WP_REC => l_fp_cols_rec_wp,
3134 P_FP_COLS_TGT_REC => l_fp_cols_rec_target,
3135 P_ACTUALS_THRU_DATE => P_ACTUALS_THRU_DATE,
3136 X_RETURN_STATUS => x_return_status,
3137 X_MSG_COUNT => x_msg_count,
3138 X_MSG_DATA => x_msg_data);
3139 IF p_pa_debug_mode = 'Y' THEN
3140 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3141 P_CALLED_MODE => P_CALLED_MODE,
3142 P_MSG => 'After calling pa_fp_gen_fcst_amt_pub3.'||
3143 'GET_ETC_FROM_SRC_BDGT: '||x_return_status,
3144 P_MODULE_NAME => l_module_name);
3145 END IF;
3146 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3147 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3148 END IF;
3149
3150 END IF; -- IF l_fp_cols_rec_target.X_COPY_ETC_FROM_PLAN_FLAG
3151 -- gboomina Bug 8318932 for AAI Enhancement - End
3152
3153 --hr_utility.trace('After processing all etc source!');
3154 --dbms_output.put_line('--before mapping++');
3155 /**After calling apis based on each res_asg_id's gen_method, we have all the plan totals and
3156 *ETC amounts populated in tmp2 table, now, we need to map the amounts to the target fin
3157 *plan's resource list, summ up, call calculate to spread into pa_budget_lines if time_phase
3158 *is not null, otherwise, we need to populate into pa_budget_lines by ourselves**/
3159
3160 /* select count(*) into l_count_tmp from PA_FP_CALC_AMT_TMP1;
3161 hr_utility.trace('tmp1 count :'|| l_count_tmp);
3162 select count(*) into l_count_tmp from PA_FP_CALC_AMT_TMP2;
3163 hr_utility.trace('tmp2 count :'|| l_count_tmp); */
3164 --delete from calc_amt_tmp11;
3165 --insert into calc_amt_tmp11 select * from pa_fp_calc_amt_tmp1;
3166
3167 --select count(*) into l_count_tmp from PA_FP_CALC_AMT_TMP1;
3168 --hr_utility.trace('***PA_FP_CALC_AMT_TMP1.count'||l_count_tmp);
3169 --select count(*) into l_count_tmp from PA_FP_CALC_AMT_TMP2;
3170 --hr_utility.trace('**PA_FP_CALC_AMT_TMP2.count'||l_count_tmp);
3171 --hr_utility.trace('**P_FP_COLS_REC.X_TIME_PHASED_CODE:'||P_FP_COLS_REC.X_TIME_PHASED_CODE);
3172
3173 --l_rev_gen_method := PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(p_project_id);
3174 l_rev_gen_method := nvl(P_FP_COLS_REC.X_REVENUE_DERIVATION_METHOD,PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(p_project_id)); --Bug 5462471
3175 IF l_fp_cols_rec_target.x_version_type = 'REVENUE' and l_rev_gen_method = 'C' THEN
3176 IF p_fp_cols_rec.X_GEN_RET_MANUAL_LINE_FLAG = 'N' THEN
3177 SELECT DISTINCT target_res_asg_id
3178 BULK COLLECT INTO l_res_asg_uom_update_tab
3179 FROM PA_FP_CALC_AMT_TMP2
3180 WHERE transaction_source_code = 'ETC';
3181 ELSIF p_fp_cols_rec.X_GEN_RET_MANUAL_LINE_FLAG = 'Y' THEN
3182 IF p_fp_cols_rec.x_time_phased_code IN ('P','G') THEN
3183 l_etc_start_date :=
3184 PA_FP_GEN_AMOUNT_UTILS.GET_ETC_START_DATE(p_budget_version_id);
3185
3186 SELECT /*+ INDEX(tmp1,PA_FP_CALC_AMT_TMP1_N1)*/
3187 DISTINCT tmp1.target_res_asg_id
3188 BULK COLLECT
3189 INTO l_res_asg_uom_update_tab
3190 FROM PA_FP_CALC_AMT_TMP1 tmp1,
3191 pa_resource_assignments ra
3192 WHERE ra.budget_version_id = p_budget_version_id
3193 AND ra.resource_assignment_id = tmp1.target_res_asg_id
3194 AND ( ra.transaction_source_code IS NOT NULL
3195 OR ( ra.transaction_source_code IS NULL
3196 AND NOT EXISTS ( SELECT 1
3197 FROM pa_budget_lines bl
3198 WHERE bl.resource_assignment_id =
3199 ra.resource_assignment_id
3200 AND bl.start_date >= l_etc_start_date
3201 AND rownum = 1 )))
3202 AND EXISTS ( SELECT /*+ INDEX(tmp2,PA_FP_CALC_AMT_TMP2_N1)*/ 1
3203 FROM PA_FP_CALC_AMT_TMP2 tmp2
3204 WHERE tmp2.target_res_asg_id = tmp1.target_res_asg_id
3205 AND tmp2.transaction_source_code = 'ETC'
3206 AND rownum = 1 );
3207 ELSIF p_fp_cols_rec.x_time_phased_code = 'N' THEN
3208 SELECT /*+ INDEX(tmp1,PA_FP_CALC_AMT_TMP1_N1)*/
3209 DISTINCT tmp1.target_res_asg_id
3210 BULK COLLECT
3211 INTO l_res_asg_uom_update_tab
3212 FROM PA_FP_CALC_AMT_TMP1 tmp1,
3213 pa_resource_assignments ra
3214 WHERE ra.budget_version_id = p_budget_version_id
3215 AND ra.resource_assignment_id = tmp1.target_res_asg_id
3216 AND ( ra.transaction_source_code IS NOT NULL
3217 OR ( ra.transaction_source_code IS NULL
3218 AND NOT EXISTS ( SELECT 1
3219 FROM pa_budget_lines bl
3220 WHERE bl.resource_assignment_id =
3221 ra.resource_assignment_id
3222 AND NVL(bl.quantity,0) <>
3223 NVL(bl.init_quantity,0)
3224 AND rownum = 1 )))
3225 AND EXISTS ( SELECT /*+ INDEX(tmp2,PA_FP_CALC_AMT_TMP2_N1)*/ 1
3226 FROM PA_FP_CALC_AMT_TMP2 tmp2
3227 WHERE tmp2.target_res_asg_id = tmp1.target_res_asg_id
3228 AND tmp2.transaction_source_code = 'ETC'
3229 AND rownum = 1 );
3230 END IF; -- time phase check
3231 END IF;
3232
3233 FORALL i IN 1..l_res_asg_uom_update_tab.count
3234 UPDATE pa_resource_assignments
3235 SET unit_of_measure = 'DOLLARS',
3236 rate_based_flag = 'N'
3237 WHERE resource_assignment_id = l_res_asg_uom_update_tab(i);
3238 END IF;
3239
3240 l_cal_ra_id_tab.delete;
3241 l_cal_txn_currency_code_tab.delete;
3242 l_cal_unit_of_measure_tab.delete;
3243 l_cal_etc_qty_tab.delete;
3244 l_cal_etc_raw_cost_tab.delete;
3245 l_cal_etc_burdened_cost_tab.delete;
3246 l_cal_rate_based_flag_tab.delete;
3247
3248 l_cal_rlm_id_tab.delete;
3249 l_cal_cbs_id_tab.delete; --bug#16791711
3250 l_cal_task_id_tab.delete;
3251 l_cal_etc_method_code_tab.delete;
3252
3253 --select count(*) into l_count_tmp from PA_FP_CALC_AMT_TMP2;
3254 --hr_utility.trace('?????PA_FP_CALC_AMT_TMP2.count'||l_count_tmp);
3255
3256 -- select count(*) into l_test from PA_FP_CALC_AMT_TMP2 where
3257 -- TRANSACTION_SOURCE_CODE = 'ETC';
3258 -- hr_utility.trace('calc amt tmp2 count with src code as ETC:'||l_test);
3259
3260 IF ( l_fp_planning_options_flag = 'Y' AND
3261 P_FP_COLS_REC.x_gen_etc_src_code = 'FINANCIAL_PLAN' ) OR
3262 ( l_wp_planning_options_flag = 'Y' AND
3263 P_FP_COLS_REC.x_gen_etc_src_code = 'WORKPLAN_RESOURCES' ) THEN
3264 OPEN etc_amts_cur_wp_fp_opt_same
3265 ( p_fp_cols_rec.x_gen_etc_src_code );
3266 FETCH etc_amts_cur_wp_fp_opt_same
3267 BULK COLLECT
3268 INTO l_cal_src_ra_id_tab_tmp, /* Modified during ER 4376722 */
3269 l_cal_ra_id_tab_tmp,
3270 l_cal_txn_curr_code_tab_tmp,
3271 l_cal_rate_based_flag_tab_tmp,
3272 l_cal_rlm_id_tab_tmp,
3273 l_cal_cbs_id_tab_tmp, --bug#16791711
3274 l_cal_task_id_tab_tmp,
3275 l_cal_unit_of_measure_tab_tmp,
3276 l_cal_etc_method_code_tab_tmp,
3277 l_cal_etc_qty_tab_tmp,
3278 l_cal_etc_raw_cost_tab_tmp,
3279 l_cal_etc_brdn_cost_tab_tmp,
3280 l_cal_etc_revenue_tab_tmp,
3281 l_billable_flag_tab_tmp, /* Added for ER 4376722 */
3282 l_gen_etc_src_code_tab_tmp; /* Added for Bug 4369741 */
3283 CLOSE etc_amts_cur_wp_fp_opt_same;
3284 ELSIF ( l_fp_planning_options_flag = 'N' AND
3285 P_FP_COLS_REC.x_gen_etc_src_code = 'FINANCIAL_PLAN' ) OR
3286 ( l_wp_planning_options_flag = 'N' AND
3287 P_FP_COLS_REC.x_gen_etc_src_code = 'WORKPLAN_RESOURCES' ) THEN
3288 OPEN etc_amts_cur_wp_fp_opt_diff
3289 ( p_fp_cols_rec.x_gen_etc_src_code );
3290 FETCH etc_amts_cur_wp_fp_opt_diff
3291 BULK COLLECT
3292 INTO l_cal_src_ra_id_tab_tmp, /* Modified during ER 4376722 */
3293 l_cal_ra_id_tab_tmp,
3294 l_cal_txn_curr_code_tab_tmp,
3295 l_cal_rate_based_flag_tab_tmp,
3296 l_cal_rlm_id_tab_tmp,
3297 l_cal_cbs_id_tab_tmp, --bug#16791711
3298 l_cal_task_id_tab_tmp,
3299 l_cal_unit_of_measure_tab_tmp,
3300 l_cal_etc_method_code_tab_tmp,
3301 l_cal_etc_qty_tab_tmp,
3302 l_cal_etc_raw_cost_tab_tmp,
3303 l_cal_etc_brdn_cost_tab_tmp,
3304 l_cal_etc_revenue_tab_tmp,
3305 l_billable_flag_tab_tmp, /* Added for ER 4376722 */
3306 l_gen_etc_src_code_tab_tmp; /* Added for Bug 4369741 */
3307 CLOSE etc_amts_cur_wp_fp_opt_diff;
3308 ELSIF P_FP_COLS_REC.x_gen_etc_src_code = 'TASK_LEVEL_SEL' THEN
3309 IF l_wp_planning_options_flag = 'Y' AND
3310 l_fp_planning_options_flag = 'Y' THEN
3311 OPEN etc_amts_cur_wp_fp_opt_same;
3312 FETCH etc_amts_cur_wp_fp_opt_same
3313 BULK COLLECT
3314 INTO l_cal_src_ra_id_tab_tmp, /* Modified during ER 4376722 */
3315 l_cal_ra_id_tab_tmp,
3316 l_cal_txn_curr_code_tab_tmp,
3317 l_cal_rate_based_flag_tab_tmp,
3318 l_cal_rlm_id_tab_tmp,
3319 l_cal_cbs_id_tab_tmp, --bug#16791711
3320 l_cal_task_id_tab_tmp,
3321 l_cal_unit_of_measure_tab_tmp,
3322 l_cal_etc_method_code_tab_tmp,
3323 l_cal_etc_qty_tab_tmp,
3324 l_cal_etc_raw_cost_tab_tmp,
3325 l_cal_etc_brdn_cost_tab_tmp,
3326 l_cal_etc_revenue_tab_tmp,
3327 l_billable_flag_tab_tmp, /* Added for ER 4376722 */
3328 l_gen_etc_src_code_tab_tmp; /* Added for Bug 4369741 */
3329 CLOSE etc_amts_cur_wp_fp_opt_same;
3330 ELSIF l_wp_planning_options_flag = 'Y' AND
3331 l_fp_planning_options_flag = 'N' THEN
3332 OPEN etc_amts_cur_wp_opt_same;
3333 FETCH etc_amts_cur_wp_opt_same
3334 BULK COLLECT
3335 INTO l_cal_src_ra_id_tab_tmp, /* Modified during ER 4376722 */
3336 l_cal_ra_id_tab_tmp,
3337 l_cal_txn_curr_code_tab_tmp,
3338 l_cal_rate_based_flag_tab_tmp,
3339 l_cal_rlm_id_tab_tmp,
3340 l_cal_cbs_id_tab_tmp, --bug#16791711
3341 l_cal_task_id_tab_tmp,
3342 l_cal_unit_of_measure_tab_tmp,
3343 l_cal_etc_method_code_tab_tmp,
3344 l_cal_etc_qty_tab_tmp,
3345 l_cal_etc_raw_cost_tab_tmp,
3346 l_cal_etc_brdn_cost_tab_tmp,
3347 l_cal_etc_revenue_tab_tmp,
3348 l_billable_flag_tab_tmp, /* Added for ER 4376722 */
3349 l_gen_etc_src_code_tab_tmp; /* Added for Bug 4369741 */
3350 CLOSE etc_amts_cur_wp_opt_same;
3351 ELSIF l_wp_planning_options_flag = 'N' AND
3352 l_fp_planning_options_flag = 'Y' THEN
3353 OPEN etc_amts_cur_fp_opt_same;
3354 FETCH etc_amts_cur_fp_opt_same
3355 BULK COLLECT
3356 INTO l_cal_src_ra_id_tab_tmp, /* Modified during ER 4376722 */
3357 l_cal_ra_id_tab_tmp,
3358 l_cal_txn_curr_code_tab_tmp,
3359 l_cal_rate_based_flag_tab_tmp,
3360 l_cal_rlm_id_tab_tmp,
3361 l_cal_cbs_id_tab_tmp, --bug#16791711
3362 l_cal_task_id_tab_tmp,
3363 l_cal_unit_of_measure_tab_tmp,
3364 l_cal_etc_method_code_tab_tmp,
3365 l_cal_etc_qty_tab_tmp,
3366 l_cal_etc_raw_cost_tab_tmp,
3367 l_cal_etc_brdn_cost_tab_tmp,
3368 l_cal_etc_revenue_tab_tmp,
3369 l_billable_flag_tab_tmp, /* Added for ER 4376722 */
3370 l_gen_etc_src_code_tab_tmp; /* Added for Bug 4369741 */
3371 CLOSE etc_amts_cur_fp_opt_same;
3372 ELSIF l_wp_planning_options_flag = 'N' AND
3373 l_fp_planning_options_flag = 'N' THEN
3374 OPEN etc_amts_cur_wp_fp_opt_diff;
3375 FETCH etc_amts_cur_wp_fp_opt_diff
3376 BULK COLLECT
3377 INTO l_cal_src_ra_id_tab_tmp, /* Modified during ER 4376722 */
3378 l_cal_ra_id_tab_tmp,
3379 l_cal_txn_curr_code_tab_tmp,
3380 l_cal_rate_based_flag_tab_tmp,
3381 l_cal_rlm_id_tab_tmp,
3382 l_cal_cbs_id_tab_tmp, --bug#16791711
3383 l_cal_task_id_tab_tmp,
3384 l_cal_unit_of_measure_tab_tmp,
3385 l_cal_etc_method_code_tab_tmp,
3386 l_cal_etc_qty_tab_tmp,
3387 l_cal_etc_raw_cost_tab_tmp,
3388 l_cal_etc_brdn_cost_tab_tmp,
3389 l_cal_etc_revenue_tab_tmp,
3390 l_billable_flag_tab_tmp, /* Added for ER 4376722 */
3391 l_gen_etc_src_code_tab_tmp; /* Added for Bug 4369741 */
3392 CLOSE etc_amts_cur_wp_fp_opt_diff;
3393 END IF;
3394 ELSE
3395 -- error handling code stub
3396 l_dummy := 1;
3397 END IF; -- fetch ETC data
3398 --hr_utility.trace('????l_cal_ra_id_tab.count:'||l_cal_ra_id_tab.count);
3399
3400
3401 IF p_fp_cols_rec.x_gen_ret_manual_line_flag = 'Y' THEN
3402
3403 FOR i in 1..l_cal_ra_id_tab_tmp.count LOOP
3404 SELECT transaction_source_code
3405 INTO l_ra_txn_source_code
3406 FROM pa_resource_assignments
3407 WHERE resource_assignment_id = l_cal_ra_id_tab_tmp(i);
3408
3409 l_bl_count := 0;
3410
3411 -- Bug 4301959: Modified the Retain Manually Added Lines logic to
3412 -- handle the non-time phased case separately, using the (quantity <>
3413 -- actual quantity) check instead of (start_date > etc_start_date).
3414
3415 IF l_ra_txn_source_code IS NULL THEN
3416 IF p_fp_cols_rec.x_time_phased_code IN ('P','G') THEN
3417 SELECT count(*)
3418 INTO l_bl_count
3419 FROM pa_budget_lines
3420 WHERE resource_assignment_id = l_cal_ra_id_tab_tmp(i)
3421 AND start_date > p_actuals_thru_date;
3422 ELSIF p_fp_cols_rec.x_time_phased_code = 'N' THEN
3423 SELECT count(*)
3424 INTO l_bl_count
3425 FROM pa_budget_lines
3426 WHERE resource_assignment_id = l_cal_ra_id_tab_tmp(i)
3427 AND NVL(quantity,0) <> NVL(init_quantity,0);
3428 END IF;
3429 END IF;
3430
3431 /* hr_utility.trace('blines count for res asg id '||
3432 l_bl_count || ' for res asg '||l_cal_ra_id_tab_tmp(i)); */
3433
3434 /* modified the logic for handling retain manually added lines
3435 for bug 3968630. If the txn source code for the planning resource is
3436 not null (generated - not manually entered), then the existing
3437 plan lines should be deleted and amounts should be generated from the
3438 generation source. */
3439
3440 IF ( l_ra_txn_source_code IS NULL AND l_bl_count > 0 ) THEN
3441 /* Mannually entered lines do exist, so they will be honored,
3442 source records will be dropped */
3443 l_dummy := 1;
3444 ELSE
3445 /* Mannually entered lines don't exist, so source records will
3446 be honored */
3447 -- gboomina Bug 8318932 for AAI Enhancement - Start
3448 -- Avoiding the deletion of budget lines created when l_copy_etc_from_plan_flag is checked
3449 IF (p_fp_cols_rec.x_time_phased_code = 'P'
3450 OR p_fp_cols_rec.x_time_phased_code = 'G')
3451 AND NVL(l_copy_etc_from_plan_flag,'N') = 'N' THEN
3452 DELETE FROM pa_budget_lines
3453 WHERE resource_assignment_id = l_cal_ra_id_tab_tmp(i)
3454 AND start_date > p_actuals_thru_date;
3455 END IF;
3456 -- gboomina Bug 8318932 for AAI Enhancement - End
3457 -- hr_utility.trace('inside table population ');
3458
3459 l_cal_ra_id_tab.EXTEND;
3460 l_cal_txn_currency_code_tab.EXTEND;
3461 l_cal_rate_based_flag_tab.EXTEND;
3462 l_cal_rlm_id_tab.EXTEND;
3463 l_cal_cbs_id_tab.EXTEND;--bug#16791711
3464 l_cal_task_id_tab.EXTEND;
3465 l_cal_unit_of_measure_tab.EXTEND;
3466 l_cal_etc_method_code_tab.EXTEND;
3467 l_cal_etc_qty_tab.EXTEND;
3468 l_cal_etc_raw_cost_tab.EXTEND;
3469 l_cal_etc_burdened_cost_tab.EXTEND;
3470 l_cal_etc_revenue_tab.EXTEND;
3471 l_billable_flag_tab.EXTEND; /* Added for ER 4376722 */
3472 l_cal_src_ra_id_tab.EXTEND; /* Modified during ER 4376722 */
3473 l_gen_etc_src_code_tab.EXTEND; /* Added for Bug 4369741 */
3474
3475 l_cal_ra_id_tab(l_cnt) := l_cal_ra_id_tab_tmp(i);
3476 l_cal_txn_currency_code_tab(l_cnt) := l_cal_txn_curr_code_tab_tmp(i);
3477 l_cal_rate_based_flag_tab(l_cnt) := l_cal_rate_based_flag_tab_tmp(i);
3478 l_cal_rlm_id_tab(l_cnt) := l_cal_rlm_id_tab_tmp(i);
3479 l_cal_cbs_id_tab(l_cnt) := l_cal_cbs_id_tab_tmp(i);--bug#16791711
3480 l_cal_task_id_tab(l_cnt) := l_cal_task_id_tab_tmp(i);
3481 l_cal_unit_of_measure_tab(l_cnt) := l_cal_unit_of_measure_tab_tmp(i);
3482 l_cal_etc_method_code_tab(l_cnt) := l_cal_etc_method_code_tab_tmp(i);
3483 l_cal_etc_qty_tab(l_cnt) := l_cal_etc_qty_tab_tmp(i);
3484 l_cal_etc_raw_cost_tab(l_cnt) := l_cal_etc_raw_cost_tab_tmp(i);
3485 l_cal_etc_burdened_cost_tab(l_cnt) := l_cal_etc_brdn_cost_tab_tmp(i);
3486 l_cal_etc_revenue_tab(l_cnt) := l_cal_etc_revenue_tab_tmp(i);
3487 l_billable_flag_tab(l_cnt) := l_billable_flag_tab_tmp(i); /* Added for ER 4376722 */
3488 l_cal_src_ra_id_tab(l_cnt) := l_cal_src_ra_id_tab_tmp(i); /* Modified during ER 4376722 */
3489 l_gen_etc_src_code_tab(l_cnt) := l_gen_etc_src_code_tab_tmp(i); /* Added for Bug 4369741 */
3490
3491 l_cnt := l_cnt + 1;
3492 END IF;
3493 END LOOP;
3494 -- hr_utility.trace('after the for loop for calc api ');
3495 /* End the logic to handle mannually updated lines*/
3496
3497 ELSE
3498
3499 l_cal_ra_id_tab := l_cal_ra_id_tab_tmp;
3500 l_cal_txn_currency_code_tab := l_cal_txn_curr_code_tab_tmp;
3501 l_cal_rate_based_flag_tab := l_cal_rate_based_flag_tab_tmp;
3502 l_cal_rlm_id_tab := l_cal_rlm_id_tab_tmp;
3503 l_cal_cbs_id_tab := l_cal_cbs_id_tab_tmp;--bug#16791711
3504 l_cal_task_id_tab := l_cal_task_id_tab_tmp;
3505 l_cal_unit_of_measure_tab := l_cal_unit_of_measure_tab_tmp;
3506 l_cal_etc_method_code_tab := l_cal_etc_method_code_tab_tmp;
3507 l_cal_etc_qty_tab := l_cal_etc_qty_tab_tmp;
3508 l_cal_etc_raw_cost_tab := l_cal_etc_raw_cost_tab_tmp;
3509 l_cal_etc_burdened_cost_tab := l_cal_etc_brdn_cost_tab_tmp;
3510 l_cal_etc_revenue_tab := l_cal_etc_revenue_tab_tmp;
3511 l_billable_flag_tab := l_billable_flag_tab_tmp; /* Added for ER 4376722 */
3512 l_cal_src_ra_id_tab := l_cal_src_ra_id_tab_tmp; /* Modified during ER 4376722 */
3513 l_gen_etc_src_code_tab := l_gen_etc_src_code_tab_tmp; /* Added for Bug 4369741 */
3514
3515 END IF; -- manual lines condition
3516
3517
3518 -- IPM: New Entity ER ------------------------------------------
3519 IF l_fp_planning_options_flag = 'Y' OR
3520 l_wp_planning_options_flag = 'Y' THEN
3521
3522 -- Sort resource assignment ids into two pl/sql tables
3523 -- based on whether the ETC generation source is FP or WP.
3524 -- Also, track non-billable resources whose source is FP.
3525 FOR i IN 1..l_cal_ra_id_tab.count LOOP
3526 IF l_gen_etc_src_code_tab(i) = 'FINANCIAL_PLAN' THEN
3527 l_fp_ra_id_tab.EXTEND;
3528 l_fp_ra_id_tab(l_fp_ra_id_tab.count) := l_cal_ra_id_tab(i);
3529
3530 IF l_billable_flag_tab(i) = 'N' THEN
3531 l_non_billable_fp_ra_id_tab.EXTEND;
3532 l_non_billable_fp_ra_id_tab(l_non_billable_fp_ra_id_tab.count)
3533 := l_cal_ra_id_tab(i);
3534 END IF;
3535 ELSIF l_gen_etc_src_code_tab(i) = 'WORKPLAN_RESOURCES' THEN
3536 l_wp_ra_id_tab.EXTEND;
3537 l_wp_ra_id_tab(l_wp_ra_id_tab.count) := l_cal_ra_id_tab(i);
3538 END IF;
3539 END LOOP;
3540
3541 -- Index 1 stores Financial Plan data.
3542 l_ra_id_tab_table(1) := l_fp_ra_id_tab;
3543 l_planning_options_flag_tab(1) := l_fp_planning_options_flag;
3544 l_src_version_id_tab(1) := p_etc_fp_plan_version_id;
3545
3546 -- Index 2 stores Workplan data.
3547 l_ra_id_tab_table(2) := l_wp_ra_id_tab;
3548 l_planning_options_flag_tab(2) := l_wp_planning_options_flag;
3549 l_src_version_id_tab(2) := l_wp_version_id;
3550
3551 FOR i IN 1..l_ra_id_tab_table.count LOOP
3552
3553 IF l_ra_id_tab_table(i).count > 0 AND
3554 l_planning_options_flag_tab(i) = 'Y' THEN
3555
3556 DELETE pa_resource_asgn_curr_tmp;
3557
3558 -- As per the copy_table_records API specification, when calling the
3559 -- maintenance API in temp table Copy mode, populate the temp table
3560 -- with distinct target ra_id values (without txn_currency_code values).
3561
3562 INSERT INTO pa_resource_asgn_curr_tmp
3563 ( resource_assignment_id )
3564 SELECT DISTINCT column_value
3565 FROM TABLE( CAST( l_ra_id_tab_table(i) AS SYSTEM.pa_num_tbl_type ));
3566
3567 -- Call the maintenance api in COPY mode
3568 IF p_pa_debug_mode = 'Y' THEN
3569 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3570 P_MSG => 'Before calling PA_RES_ASG_CURRENCY_PUB.' ||
3571 'MAINTAIN_DATA',
3572 P_CALLED_MODE => p_called_mode,
3573 P_MODULE_NAME => l_module_name);
3574 END IF;
3575 PA_RES_ASG_CURRENCY_PUB.MAINTAIN_DATA
3576 ( P_FP_COLS_REC => l_fp_cols_rec_target,
3577 P_CALLING_MODULE => 'FORECAST_GENERATION',
3578 P_COPY_FLAG => 'Y',
3579 P_SRC_VERSION_ID => l_src_version_id_tab(i),
3580 P_COPY_MODE => 'COPY_OVERRIDES',
3581 P_VERSION_LEVEL_FLAG => 'N',
3582 P_CALLED_MODE => p_called_mode,
3583 X_RETURN_STATUS => x_return_status,
3584 X_MSG_COUNT => x_msg_count,
3585 X_MSG_DATA => x_msg_data );
3586 IF p_pa_debug_mode = 'Y' THEN
3587 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3588 P_MSG => 'After calling PA_RES_ASG_CURRENCY_PUB.' ||
3589 'MAINTAIN_DATA: '||x_return_status,
3590 P_CALLED_MODE => p_called_mode,
3591 P_MODULE_NAME => l_module_name);
3592 END IF;
3593 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3594 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3595 END IF;
3596 END IF; -- planning options flag check
3597 END LOOP; -- FOR i IN 1..l_ra_id_tab_table.count LOOP
3598
3599 -- Ensure that non-billable tasks do not have bill rate overrides
3600 -- in the new entity table by re-Inserting new entity records with
3601 -- existing cost rate overrides but Null bill rate overrides for
3602 -- non-billable tasks.
3603 -- Note: Processing resources with Workplan as the source is not
3604 -- required since workplans are guaranteed to store only costs.
3605
3606 IF l_fp_planning_options_flag = 'Y' AND
3607 l_non_billable_fp_ra_id_tab.count > 0 AND
3608 l_fp_cols_rec_fp.x_version_type = 'ALL' AND
3609 l_fp_cols_rec_target.x_version_type IN ('REVENUE','ALL') THEN
3610
3611 DELETE pa_resource_asgn_curr_tmp;
3612
3613 -- Note: An outer join on pa_tasks is not needed in the query
3614 -- below because we are only interested in updating resources
3615 -- for non-billable tasks. Project-level tasks that require an
3616 -- outer join are always billable.
3617 INSERT INTO pa_resource_asgn_curr_tmp
3618 ( RESOURCE_ASSIGNMENT_ID,
3619 TXN_CURRENCY_CODE,
3620 TXN_RAW_COST_RATE_OVERRIDE,
3621 TXN_BURDEN_COST_RATE_OVERRIDE )
3622 SELECT rbc.resource_assignment_id,
3623 rbc.txn_currency_code,
3624 rbc.txn_raw_cost_rate_override,
3625 rbc.txn_burden_cost_rate_override
3626 FROM pa_resource_asgn_curr rbc
3627 WHERE rbc.budget_version_id = p_budget_version_id
3628 AND rbc.txn_bill_rate_override IS NOT NULL
3629 AND EXISTS ( SELECT null
3630 FROM TABLE(CAST( l_non_billable_fp_ra_id_tab AS SYSTEM.pa_num_tbl_type ))
3631 WHERE rbc.resource_assignment_id = column_value );
3632
3633 l_count := SQL%ROWCOUNT;
3634
3635 IF l_count > 0 THEN
3636 -- CALL the maintenance api in INSERT mode
3637 IF p_pa_debug_mode = 'Y' THEN
3638 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3639 P_MSG => 'Before calling PA_RES_ASG_CURRENCY_PUB.' ||
3640 'MAINTAIN_DATA',
3641 P_CALLED_MODE => p_called_mode,
3642 P_MODULE_NAME => l_module_name);
3643 END IF;
3644 PA_RES_ASG_CURRENCY_PUB.MAINTAIN_DATA
3645 ( P_FP_COLS_REC => l_fp_cols_rec_target,
3646 P_CALLING_MODULE => 'FORECAST_GENERATION',
3647 P_VERSION_LEVEL_FLAG => 'N',
3648 P_ROLLUP_FLAG => 'N', -- 'N' indicates Insert
3649 P_CALLED_MODE => p_called_mode,
3650 X_RETURN_STATUS => x_return_status,
3651 X_MSG_COUNT => x_msg_count,
3652 X_MSG_DATA => x_msg_data );
3653 IF p_pa_debug_mode = 'Y' THEN
3654 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3655 P_MSG => 'After calling PA_RES_ASG_CURRENCY_PUB.' ||
3656 'MAINTAIN_DATA: '||x_return_status,
3657 P_CALLED_MODE => p_called_mode,
3658 P_MODULE_NAME => l_module_name);
3659 END IF;
3660 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3661 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3662 END IF;
3663 END IF; -- IF l_count > 0 THEN
3664 END IF; -- logic to null out bill rate overrides for non-billable tasks
3665
3666 END IF; -- logic to copy source pa_resource_asgn_curr overrides
3667 -- END OF IPM: New Entity ER ------------------------------------------
3668
3669
3670 IF l_fp_cols_rec_target.x_version_type = 'REVENUE' and l_rev_gen_method = 'C' THEN
3671 l_cal_etc_revenue_tab := l_cal_etc_burdened_cost_tab;
3672 END IF;
3673 /*IF p_pa_debug_mode = 'Y' THEN
3674 pa_fp_gen_amount_utils.fp_debug
3675 (p_msg => 'Value of l_rev_gen_method: '||l_rev_gen_method,
3676 p_module_name => l_module_name,
3677 p_log_level => 5);
3678 END IF;
3679 IF p_pa_debug_mode = 'Y' THEN
3680 pa_fp_gen_amount_utils.fp_debug
3681 (p_msg => 'Value of l_cal_etc_revenue_tab.count: '||l_cal_etc_revenue_tab.count,
3682 p_module_name => l_module_name,
3683 p_log_level => 5);
3684 END IF;
3685 IF p_pa_debug_mode = 'Y' THEN
3686 pa_fp_gen_amount_utils.fp_debug
3687 (p_msg => 'Value of l_cal_ra_id_tab.count: '||l_cal_ra_id_tab.count,
3688 p_module_name => l_module_name,
3689 p_log_level => 5);
3690 END IF;*/
3691 -- hr_utility.trace('==Before calling calculate api in the loop');
3692 -- hr_utility.trace('==l_cal_ra_id tab count bef calculate api '||l_cal_ra_id_tab.count);
3693
3694
3695 /* ER 4376722: When the Target is a Revenue-only Forecast, we do not
3696 * generate quantity or amounts for non-rate-based resources of
3697 * non-billable tasks. The simple algorithm to do this is as follows:
3698 *
3699 * 0. Clear out any data in the _tmp tables.
3700 * 1. Copy records for
3701 * a) billable tasks
3702 * b) rate-based resources of non-billable tasks
3703 * into _tmp tables.
3704 * 2. Copy records from _tmp tables back to non-temporary tables.
3705 *
3706 * The result is that we do not process records for non-rate-based
3707 * resources of non-billable task afterwards. Hence, quantity and
3708 * amounts for these resources will not be generated. */
3709
3710 IF l_fp_cols_rec_target.x_version_type = 'REVENUE' THEN
3711
3712 -- 0. Clear out any data in the _tmp tables.
3713 l_cal_src_ra_id_tab_tmp.delete;
3714 l_cal_ra_id_tab_tmp.delete;
3715 l_cal_txn_curr_code_tab_tmp.delete;
3716 l_cal_rate_based_flag_tab_tmp.delete;
3717 l_cal_rlm_id_tab_tmp.delete;
3718 l_cal_cbs_id_tab_tmp.delete; --bug#16791711
3719 l_cal_task_id_tab_tmp.delete;
3720 l_cal_unit_of_measure_tab_tmp.delete;
3721 l_cal_etc_method_code_tab_tmp.delete;
3722 l_cal_etc_qty_tab_tmp.delete;
3723 l_cal_etc_raw_cost_tab_tmp.delete;
3724 l_cal_etc_brdn_cost_tab_tmp.delete;
3725 l_cal_etc_revenue_tab_tmp.delete;
3726 l_billable_flag_tab_tmp.delete;
3727
3728 -- 1. Copy records for billable tasks into _tmp tables.
3729 l_tmp_index := 0;
3730 FOR i IN 1..l_cal_ra_id_tab.count LOOP
3731 IF l_billable_flag_tab(i) = 'Y' OR
3732 (l_billable_flag_tab(i) = 'N' AND
3733 l_cal_rate_based_flag_tab(i) = 'Y') THEN
3734
3735 l_cal_src_ra_id_tab_tmp.extend;
3736 l_cal_ra_id_tab_tmp.extend;
3737 l_cal_txn_curr_code_tab_tmp.extend;
3738 l_cal_rate_based_flag_tab_tmp.extend;
3739 l_cal_rlm_id_tab_tmp.extend;
3740 l_cal_cbs_id_tab_tmp.extend; --bug#16791711
3741 l_cal_task_id_tab_tmp.extend;
3742 l_cal_unit_of_measure_tab_tmp.extend;
3743 l_cal_etc_method_code_tab_tmp.extend;
3744 l_cal_etc_qty_tab_tmp.extend;
3745 l_cal_etc_raw_cost_tab_tmp.extend;
3746 l_cal_etc_brdn_cost_tab_tmp.extend;
3747 l_cal_etc_revenue_tab_tmp.extend;
3748 l_billable_flag_tab_tmp.extend;
3749
3750 l_tmp_index := l_tmp_index + 1;
3751 l_cal_src_ra_id_tab_tmp(l_tmp_index) := l_cal_src_ra_id_tab(i);
3752 l_cal_ra_id_tab_tmp(l_tmp_index) := l_cal_ra_id_tab(i);
3753 l_cal_txn_curr_code_tab_tmp(l_tmp_index) := l_cal_txn_currency_code_tab(i);
3754 l_cal_rate_based_flag_tab_tmp(l_tmp_index) := l_cal_rate_based_flag_tab(i);
3755 l_cal_rlm_id_tab_tmp(l_tmp_index) := l_cal_rlm_id_tab(i);
3756 l_cal_cbs_id_tab_tmp(l_tmp_index) := l_cal_cbs_id_tab(i);--bug#16791711
3757 l_cal_task_id_tab_tmp(l_tmp_index) := l_cal_task_id_tab(i);
3758 l_cal_unit_of_measure_tab_tmp(l_tmp_index) := l_cal_unit_of_measure_tab(i);
3759 l_cal_etc_method_code_tab_tmp(l_tmp_index) := l_cal_etc_method_code_tab(i);
3760 l_cal_etc_qty_tab_tmp(l_tmp_index) := l_cal_etc_qty_tab(i);
3761 l_cal_etc_raw_cost_tab_tmp(l_tmp_index) := l_cal_etc_raw_cost_tab(i);
3762 l_cal_etc_brdn_cost_tab_tmp(l_tmp_index) := l_cal_etc_burdened_cost_tab(i);
3763 l_cal_etc_revenue_tab_tmp(l_tmp_index) := l_cal_etc_revenue_tab(i);
3764 l_billable_flag_tab_tmp(l_tmp_index) := l_billable_flag_tab(i);
3765 END IF;
3766 END LOOP;
3767
3768 -- 2. Copy records from _tmp_ tables back to non-temporary tables.
3769 l_cal_src_ra_id_tab := l_cal_src_ra_id_tab_tmp;
3770 l_cal_ra_id_tab := l_cal_ra_id_tab_tmp;
3771 l_cal_txn_currency_code_tab := l_cal_txn_curr_code_tab_tmp;
3772 l_cal_rate_based_flag_tab := l_cal_rate_based_flag_tab_tmp;
3773 l_cal_rlm_id_tab := l_cal_rlm_id_tab_tmp;
3774 l_cal_cbs_id_tab := l_cal_cbs_id_tab_tmp;--bug#16791711
3775 l_cal_task_id_tab := l_cal_task_id_tab_tmp;
3776 l_cal_unit_of_measure_tab := l_cal_unit_of_measure_tab_tmp;
3777 l_cal_etc_method_code_tab := l_cal_etc_method_code_tab_tmp;
3778 l_cal_etc_qty_tab := l_cal_etc_qty_tab_tmp;
3779 l_cal_etc_raw_cost_tab := l_cal_etc_raw_cost_tab_tmp;
3780 l_cal_etc_burdened_cost_tab := l_cal_etc_brdn_cost_tab_tmp;
3781 l_cal_etc_revenue_tab := l_cal_etc_revenue_tab_tmp;
3782 l_billable_flag_tab := l_billable_flag_tab_tmp;
3783
3784 END IF; -- ER 4376722 billability logic for REVENUE Forecast
3785
3786 -- Initialize l_remove_record_flag
3787 l_remove_records_flag := 'N';
3788
3789 -- Initialize l_remove_record_flag_tab
3790 FOR i IN 1..l_cal_ra_id_tab.count LOOP
3791 l_remove_record_flag_tab(i) := 'N';
3792 END LOOP;
3793
3794 -- Initialize l_source_version_type_tab
3795 -- Initialize l_rev_only_src_txn_flag_tab
3796 FOR i IN 1..l_cal_ra_id_tab.count LOOP
3797
3798 IF l_gen_etc_src_code_tab(i) = 'FINANCIAL_PLAN' THEN
3799 l_source_version_type_tab(i) := l_fp_cols_rec_fp.x_version_type;
3800 ELSIF l_gen_etc_src_code_tab(i) IN ('WORKPLAN_RESOURCES','WORK_QUANTITY') THEN
3801 l_source_version_type_tab(i) := l_fp_cols_rec_wp.x_version_type;
3802 ELSE -- l_gen_etc_src_code_tab(i) = 'NONE'
3803 l_source_version_type_tab(i) := null;
3804 END IF;
3805
3806 l_rev_only_src_txn_flag_tab(i) := 'N';
3807
3808 -- NOTE: Generation from Revenue-only versions not supported.
3809 -- This case has been added in case of future changes.
3810 IF l_source_version_type_tab(i) = 'REVENUE' OR
3811 ( l_source_version_type_tab(i) = 'ALL' AND
3812 nvl(l_cal_etc_raw_cost_tab(i),0) = 0 ) THEN
3813 l_rev_only_src_txn_flag_tab(i) := 'Y';
3814 END IF;
3815 END LOOP;
3816
3817 l_target_version_type := l_fp_cols_rec_target.x_version_type;
3818
3819 -- Added for IPM :
3820 -- This loop processes each planning txn, based on the source/target
3821 -- version type combination, and does the following:
3822 -- 1. Updates l_remove_record_flag_tab
3823
3824 FOR i in 1..l_cal_ra_id_tab.count LOOP
3825
3826 -- 1. Update l_remove_record_flag_tab based on source/target version types.
3827 IF l_source_version_type_tab(i) = 'ALL' AND l_target_version_type = 'COST' THEN
3828 IF l_cal_rate_based_flag_tab(i) = 'N' THEN
3829 IF l_rev_only_src_txn_flag_tab(i) = 'Y' THEN
3830 l_remove_record_flag_tab(i) := 'Y';
3831 l_remove_records_flag := 'Y';
3832 END IF;
3833 END IF;
3834 ELSIF l_source_version_type_tab(i) = 'ALL' AND
3835 l_target_version_type = 'REVENUE' AND
3836 l_rev_gen_method = 'T' THEN
3837 -- Set quantity to revenue in the main processing loop later.
3838 -- Do nothing for now.
3839 l_dummy := 1;
3840 ELSIF l_source_version_type_tab(i) = 'ALL' AND
3841 l_target_version_type = 'REVENUE' AND
3842 l_rev_gen_method = 'C' THEN
3843 IF l_cal_rate_based_flag_tab(i) = 'N' THEN
3844 IF l_rev_only_src_txn_flag_tab(i) = 'Y' THEN
3845 l_remove_record_flag_tab(i) := 'Y';
3846 l_remove_records_flag := 'Y';
3847 END IF;
3848 END IF;
3849 ELSIF l_source_version_type_tab(i) = 'ALL' AND
3850 l_target_version_type = 'REVENUE' AND
3851 l_rev_gen_method = 'E' THEN
3852 /*Revenue is only based on billing events, which is handled seperately*/
3853 l_dummy := 1;
3854 IF P_PA_DEBUG_MODE = 'Y' THEN
3855 PA_DEBUG.RESET_CURR_FUNCTION;
3856 END IF;
3857 RETURN;
3858 ELSIF l_source_version_type_tab(i) = 'ALL' AND
3859 l_target_version_type = 'ALL' AND
3860 l_rev_gen_method = 'T' THEN
3861 -- Set quantity to revenue in the main processing loop later.
3862 -- Do nothing for now.
3863 l_dummy := 1;
3864 ELSIF l_source_version_type_tab(i) = 'ALL' AND
3865 l_target_version_type = 'ALL' AND
3866 l_rev_gen_method = 'C' THEN
3867 IF l_cal_rate_based_flag_tab(i) = 'N' THEN
3868 IF l_rev_only_src_txn_flag_tab(i) = 'Y' THEN
3869 l_remove_record_flag_tab(i) := 'Y';
3870 l_remove_records_flag := 'Y';
3871 END IF;
3872 END IF;
3873 ELSIF l_source_version_type_tab(i) = 'ALL' AND
3874 l_target_version_type = 'ALL' AND
3875 l_rev_gen_method = 'E' THEN
3876 IF l_cal_rate_based_flag_tab(i) = 'N' THEN
3877 IF l_rev_only_src_txn_flag_tab(i) = 'Y' THEN
3878 l_remove_record_flag_tab(i) := 'Y';
3879 l_remove_records_flag := 'Y';
3880 END IF;
3881 END IF;
3882 END IF;
3883
3884 END LOOP; -- IPM filtering logic
3885
3886 -- Added for IPM : In a Cost and Revenue Together version,
3887 -- if a non-billable, non-rate-based planning txn has only
3888 -- ETC revenue amounts, then filter out the record as if the
3889 -- Target were a Revenue-only version.
3890
3891 IF l_target_version_type = 'ALL' THEN
3892 FOR i IN 1..l_cal_ra_id_tab.count LOOP
3893 IF l_billable_flag_tab(i) = 'N' AND
3894 l_rev_only_src_txn_flag_tab(i) = 'Y' AND
3895 l_cal_rate_based_flag_tab(i) = 'N' THEN
3896 l_remove_record_flag_tab(i) := 'Y';
3897 l_remove_records_flag := 'Y';
3898 END IF;
3899 END LOOP;
3900 END IF; -- Added billability logic for ALL versions in IPM
3901
3902 -- Added for IPM : Properly size pl/sql system tables
3903 -- outside of the loop so that skipping records using
3904 -- the continue_loop exception does not throw the loop
3905 -- iterator and table sizes out of sync.
3906
3907 IF l_cal_ra_id_tab.count > 0 THEN
3908 l_cal_rcost_rate_override_tab.extend(l_cal_ra_id_tab.count);
3909 l_cal_bcost_rate_override_tab.extend(l_cal_ra_id_tab.count);
3910 l_cal_bill_rate_override_tab.extend(l_cal_ra_id_tab.count);
3911 END IF;
3912
3913 FOR i in 1..l_cal_ra_id_tab.count LOOP
3914 BEGIN
3915
3916 -- Added in IPM:
3917 -- Before processing the current planning txn, check if the
3918 -- record should be skipped. If so, continue with next record.
3919 IF l_remove_record_flag_tab(i) = 'Y' THEN
3920 RAISE continue_loop;
3921 END IF;
3922
3923 -- Bug 4346172: In general, when source/target planning options match,
3924 -- we use the source version's periodic planning rates to calculate the
3925 -- amounts. However, when the ETC method is Earned Value, we honor the
3926 -- actuals rates. The l_use_src_rates_flag captures this information.
3927
3928 -- Bug 4369741: Extended IF condition logic to set l_use_src_rates_flag
3929 -- based on 2 separate planning options flags (for WP and FP) and the
3930 -- ETC generation source stored in l_gen_etc_src_code_tab.
3931
3932 IF l_cal_etc_method_code_tab(i) <> 'EARNED_VALUE' AND
3933 (( l_fp_planning_options_flag = 'Y' AND
3934 l_gen_etc_src_code_tab(i) = 'FINANCIAL_PLAN' ) OR
3935 ( l_wp_planning_options_flag = 'Y' AND
3936 l_gen_etc_src_code_tab(i) = 'WORKPLAN_RESOURCES' )) THEN
3937 l_use_src_rates_flag := 'Y';
3938 ELSE
3939 l_use_src_rates_flag := 'N';
3940 END IF;
3941
3942
3943 IF l_cal_rate_based_flag_tab(i) = 'N' THEN
3944 -- Bug 4232094, 4232253: For Cost-based Revenue generation, quantity should
3945 -- equal burdened cost. We make use of this modified l_cal_etc_qty_tab later
3946 -- for another part of the bug fix.
3947 IF l_fp_cols_rec_target.x_version_type = 'REVENUE' and l_rev_gen_method = 'C' THEN
3948 -- IPM : Earlier, the code checks if cost amounts exists and
3949 -- skips processing if they do not exist. Hence, the assignment
3950 -- below should only be reached when it makes sense to do so.
3951 l_cal_etc_qty_tab(i) := l_cal_etc_burdened_cost_tab(i);
3952 ELSE
3953 -- IPM : When only revenue amounts exist, quantity should equal revenue
3954 -- for non-rate-based transactions. Based on record filtering logic
3955 -- upstream, this should only happen under the following conditions:
3956 -- * Source is an 'ALL' version
3957 -- * Target is either a 'REVENUE' or 'ALL' version
3958 -- * Revenue accrual method is 'T' (work-based)
3959 IF l_rev_only_src_txn_flag_tab(i) = 'Y' THEN
3960 l_cal_etc_qty_tab(i) := l_cal_etc_revenue_tab(i);
3961 ELSE
3962 l_cal_etc_qty_tab(i) := l_cal_etc_raw_cost_tab(i);
3963 END IF;
3964
3965 END IF;
3966 END IF;
3967
3968 -- hr_utility.trace('==inside the loop for calling calcualte ');
3969
3970 -- Modified for IPM : Instead of extending the table size by 1 on
3971 -- each loop iteration, we now extend all at once before the loop.
3972 --l_cal_rcost_rate_override_tab.extend;
3973 --l_cal_bcost_rate_override_tab.extend;
3974
3975 -- ER 5726773: Instead of requiring l_cal_etc_qty_tab(i) be positive,
3976 -- relax the condition to ensure it is non-zero.
3977 IF l_cal_etc_qty_tab(i) <> 0 THEN
3978 l_cal_rcost_rate_override_tab(i) := l_cal_etc_raw_cost_tab(i)/l_cal_etc_qty_tab(i);
3979 l_cal_bcost_rate_override_tab(i) := l_cal_etc_burdened_cost_tab(i)/l_cal_etc_qty_tab(i);
3980 ELSE
3981 l_cal_rcost_rate_override_tab(i) := NULL;
3982 l_cal_bcost_rate_override_tab(i) := NULL;
3983 END IF;
3984 -- Modified for IPM : Instead of extending the table size by 1 on
3985 -- each loop iteration, we now extend all at once before the loop.
3986 --l_cal_bill_rate_override_tab.extend;
3987 l_cal_bill_rate_override_tab(i) := NULL;
3988 IF l_fp_cols_rec_target.x_version_type = 'REVENUE' and l_rev_gen_method = 'C' THEN
3989 l_cal_bill_rate_override_tab(i) := l_cal_bcost_rate_override_tab(i);
3990 l_cal_etc_raw_cost_tab(i) := NULL;
3991 l_cal_etc_burdened_cost_tab(i) := NULL;
3992 l_cal_rcost_rate_override_tab(i) := NULL;
3993 l_cal_bcost_rate_override_tab(i) := NULL;
3994 END IF;
3995
3996 -- Added in IPM :
3997 -- For the case given below, set bill rate override to 1
3998 -- so that revenue will equal quantity (and not be rederived).
3999 -- If the target is an ALL version, then also set the
4000 -- cost rate overrides to 0 so the Calculate API does not
4001 -- default them to 1 and then compute cost amounts.
4002
4003 IF l_rev_only_src_txn_flag_tab(i) = 'Y' AND
4004 l_cal_rate_based_flag_tab(i) = 'N' AND
4005 l_target_version_type IN ('REVENUE','ALL') AND
4006 l_rev_gen_method = 'T' THEN
4007 l_cal_bill_rate_override_tab(i) := 1;
4008 IF l_target_version_type = 'ALL' THEN
4009 l_cal_rcost_rate_override_tab(i) := 0;
4010 l_cal_bcost_rate_override_tab(i) := 0;
4011 END IF;
4012 END IF;
4013
4014
4015 -- Bug 4216423: We now need to populate PA_FP_GEN_RATE_TMP with cost
4016 -- rates for both rate-based and non-rate based resources when generating
4017 -- work-based revenue for a Revenue-only target version.
4018
4019 -- Added in IPM : When generating revenue-only, non-rate-based txns
4020 -- for ALL versions with work-based revenue accrual, do not use periodic
4021 -- source rates. Instead, populate the temp table with bill rate
4022 -- override as 1 and cost rate overrides as 0.
4023
4024 IF l_use_src_rates_flag = 'Y' AND
4025 NOT ( p_fp_cols_rec.x_version_type = 'REVENUE' AND l_rev_gen_method = 'T' ) AND
4026 NOT ( p_fp_cols_rec.x_version_type = 'ALL' AND l_rev_gen_method = 'T' AND
4027 l_rev_only_src_txn_flag_tab(i) = 'Y' AND l_cal_rate_based_flag_tab(i) = 'N') THEN
4028
4029 -- hr_utility.trace('==inside plan option same flag = Y ');
4030 IF P_PA_DEBUG_MODE = 'Y' THEN
4031 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4032 P_CALLED_MODE => P_CALLED_MODE,
4033 P_MSG =>
4034 'Before calling PA_FP_GEN_FCST_AMT_PUB1.POPULATE_GEN_RATE',
4035 P_MODULE_NAME => l_module_name);
4036 END IF;
4037 PA_FP_GEN_FCST_AMT_PUB1.POPULATE_GEN_RATE
4038 (P_SOURCE_RES_ASG_ID => l_cal_src_ra_id_tab(i),
4039 P_TARGET_RES_ASG_ID => l_cal_ra_id_tab(i),
4040 P_TXN_CURRENCY_CODE => l_cal_txn_currency_code_tab(i),
4041 X_RETURN_STATUS => x_return_status,
4042 X_MSG_COUNT => x_msg_count,
4043 X_MSG_DATA => x_msg_data);
4044 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
4045 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
4046 END IF;
4047 IF P_PA_DEBUG_MODE = 'Y' THEN
4048 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4049 P_CALLED_MODE => P_CALLED_MODE,
4050 P_MSG =>
4051 'After calling PA_FP_GEN_FCST_AMT_PUB1.POPULATE_GEN_RATE: '||x_return_status,
4052 P_MODULE_NAME => l_module_name);
4053 END IF;
4054
4055 /* Populate the period rates table for the Client Extension API */
4056
4057 -- Bug 4320954: When we fetch data from and update data to the
4058 -- PA_FP_GEN_RATE_TMP table for the Client Extension API, we need
4059 -- to check both the target_res_asg_id AND the TXN_CURRENCY_CODE
4060 -- in the WHERE clause so that the plan currency is honored.
4061
4062 SELECT /*+ INDEX(PA_FP_GEN_RATE_TMP,PA_FP_GEN_RATE_TMP_N1)*/
4063 period_name,
4064 raw_cost_rate,
4065 burdened_cost_rate,
4066 revenue_bill_rate
4067 BULK COLLECT
4068 INTO l_ext_period_name_tab,
4069 l_ext_raw_cost_rate_tab,
4070 l_ext_burdened_cost_rate_tab,
4071 l_ext_revenue_bill_rate_tab
4072 FROM pa_fp_gen_rate_tmp
4073 WHERE target_res_asg_id = l_cal_ra_id_tab(i)
4074 AND txn_currency_code = l_cal_txn_currency_code_tab(i);
4075
4076 l_input_period_rates_tbl.delete;
4077 FOR j IN 1..l_ext_period_name_tab.count LOOP
4078 l_input_period_rates_tbl(j).period_name := l_ext_period_name_tab(j);
4079 l_input_period_rates_tbl(j).raw_cost_rate := l_ext_raw_cost_rate_tab(j);
4080 l_input_period_rates_tbl(j).burdened_cost_rate := l_ext_burdened_cost_rate_tab(j);
4081 l_input_period_rates_tbl(j).revenue_bill_rate := l_ext_revenue_bill_rate_tab(j);
4082 END LOOP;
4083 ELSIF ( p_fp_cols_rec.x_version_type = 'REVENUE' AND l_rev_gen_method = 'T' ) THEN
4084 /* Populate the period rates table for the Client Extension API */
4085 l_input_period_rates_tbl.delete;
4086 l_input_period_rates_tbl(1).raw_cost_rate := l_cal_rcost_rate_override_tab(i);
4087 l_input_period_rates_tbl(1).burdened_cost_rate := l_cal_bcost_rate_override_tab(i);
4088
4089 IF l_rev_only_src_txn_flag_tab(i) = 'Y' AND
4090 l_cal_rate_based_flag_tab(i) = 'N' THEN
4091 l_input_period_rates_tbl(1).revenue_bill_rate := l_cal_bill_rate_override_tab(i);
4092 END IF;
4093
4094 -- Added in IPM : This handles a corner case.
4095 ELSIF ( p_fp_cols_rec.x_version_type = 'ALL' AND l_rev_gen_method = 'T' AND
4096 l_rev_only_src_txn_flag_tab(i) = 'Y' AND l_cal_rate_based_flag_tab(i) = 'N') THEN
4097
4098 /* Populate the period rates table for the Client Extension API */
4099 l_input_period_rates_tbl.delete;
4100 l_input_period_rates_tbl(1).raw_cost_rate := l_cal_rcost_rate_override_tab(i);
4101 l_input_period_rates_tbl(1).burdened_cost_rate := l_cal_bcost_rate_override_tab(i);
4102 l_input_period_rates_tbl(1).revenue_bill_rate := l_cal_bill_rate_override_tab(i);
4103
4104 END IF;
4105
4106
4107 /* ER 4376722: When the Target is a Revenue-only Forecast, we
4108 * generate quantity but not revenue for rate-based resources of
4109 * non-billable tasks. To do this, null out revenue amounts,
4110 * overrides, and possible periodic rates for rate-based
4111 * resources of non-billable tasks.
4112 * Note that we handle the case of non-rated-based resources
4113 * of non-billable tasks earlier in the code. */
4114
4115 IF l_fp_cols_rec_target.x_version_type = 'REVENUE' THEN
4116 -- Null out revenue amounts for non-billable tasks
4117 IF l_billable_flag_tab(i) = 'N' AND
4118 l_cal_rate_based_flag_tab(i) = 'Y' THEN
4119
4120 l_cal_etc_revenue_tab(i) := NULL;
4121 l_cal_bill_rate_override_tab(i) := NULL;
4122
4123 FOR j IN 1..l_input_period_rates_tbl.count LOOP
4124 -- null out cost rates in case of Work-based revenue
4125 l_input_period_rates_tbl(j).raw_cost_rate := NULL;
4126 l_input_period_rates_tbl(j).burdened_cost_rate := NULL;
4127 l_input_period_rates_tbl(j).revenue_bill_rate := NULL;
4128 END LOOP;
4129 END IF;
4130 END IF; -- ER 4376722 billability logic for REVENUE Forecast
4131
4132
4133 /* ER 4376722: When the Target is a Cost and Revenue together
4134 * version, we do not generate revenue for non-billable tasks.
4135 * To do this, null out revenue amounts, overrides, and possible
4136 * periodic rates for non-billable tasks. Since we call the
4137 * Client Extension, it's possible for revenue to be overriden
4138 * for non-billable tasks. */
4139
4140 IF l_fp_cols_rec_target.x_version_type = 'ALL' THEN
4141 -- Null out revenue amounts for non-billable tasks
4142 IF l_billable_flag_tab(i) = 'N' THEN
4143
4144 l_cal_etc_revenue_tab(i) := NULL;
4145 l_cal_bill_rate_override_tab(i) := NULL;
4146
4147 FOR j IN 1..l_input_period_rates_tbl.count LOOP
4148 l_input_period_rates_tbl(j).revenue_bill_rate := NULL;
4149 END LOOP;
4150 END IF;
4151 END IF; -- ER 4376722 billability logic for ALL versions
4152
4153
4154 IF P_PA_DEBUG_MODE = 'Y' THEN
4155 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4156 P_CALLED_MODE => P_CALLED_MODE,
4157 P_MSG =>
4158 'Before calling pa_fp_fcst_gen_client_ext.fcst_gen_client_extn',
4159 P_MODULE_NAME => l_module_name);
4160 END IF;
4161 /*For client_extn, many attributes are passed as NULL is because
4162 this API is still under developmen and some parameters are not
4163 available.Null values will be replaced later*/
4164 /* Call PA_FP_GEN_FCST_AMT_PUB1.POPULATE_GEN_RATE to populate
4165 pa_fp_gen_rate_tmp, which is used to populate input parameter
4166 P_PERIOD_RATES_TBL */
4167
4168 -- hr_utility.trace('==before calling client extn api ');
4169
4170 --This code has been commented due to bug 5726785 where the client extension
4171 --call has been made be passing the existing and also the periodic level amounts.
4172
4173 /* PA_FP_FCST_GEN_CLIENT_EXT.FCST_GEN_CLIENT_EXTN
4174 (P_PROJECT_ID => P_PROJECT_ID,
4175 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
4176 P_RESOURCE_ASSIGNMENT_ID => l_cal_ra_id_tab(i),
4177 P_TASK_ID => l_cal_task_id_tab(i),
4178 P_TASK_PERCENT_COMPLETE => NULL,
4179 P_PROJECT_PERCENT_COMPLETE => NULL,
4180 P_RESOURCE_LIST_MEMBER_ID => l_cal_rlm_id_tab(i),
4181 P_UNIT_OF_MEASURE => l_cal_unit_of_measure_tab(i), -- NEW PARAM
4182 P_TXN_CURRENCY_CODE => l_cal_txn_currency_code_tab(i),
4183 P_ETC_QTY => l_cal_etc_qty_tab(i),
4184 P_ETC_RAW_COST => l_cal_etc_raw_cost_tab(i),
4185 P_ETC_BURDENED_COST => l_cal_etc_burdened_cost_tab(i),
4186 P_ETC_REVENUE => l_cal_etc_revenue_tab(i),
4187 P_ETC_SOURCE => NULL,
4188 P_ETC_GEN_METHOD => l_cal_etc_method_code_tab(i),
4189 P_ACTUAL_THRU_DATE => P_ACTUALS_THRU_DATE,
4190 P_ETC_START_DATE => P_ACTUALS_THRU_DATE+1,
4191 P_ETC_END_DATE => NULL,
4192 P_PLANNED_WORK_QTY => NULL,
4193 P_ACTUAL_WORK_QTY => NULL,
4194 P_ACTUAL_QTY => NULL,
4195 P_ACTUAL_RAW_COST => NULL,
4196 P_ACTUAL_BURDENED_COST => NULL,
4197 P_ACTUAL_REVENUE => NULL,
4198 P_PERIOD_RATES_TBL => l_input_period_rates_tbl, -- NEW PARAM
4199 X_ETC_QTY => l_fcst_etc_qty,
4200 X_ETC_RAW_COST => l_fcst_etc_raw_cost,
4201 X_ETC_BURDENED_COST => l_fcst_etc_burdened_cost,
4202 X_ETC_REVENUE => l_fcst_etc_revenue,
4203 X_PERIOD_RATES_TBL => l_period_rates_tbl, -- NEW PARAM
4204 X_RETURN_STATUS => x_return_status,
4205 X_MSG_DATA => x_msg_data,
4206 X_MSG_COUNT => x_msg_count);
4207
4208 -- hr_utility.trace('==after calling client extn api ');
4209
4210 IF P_PA_DEBUG_MODE = 'Y' THEN
4211 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4212 P_CALLED_MODE => P_CALLED_MODE,
4213 P_MSG =>
4214 'After calling pa_fp_fcst_gen_client_ext.fcst_gen_client_extn: '
4215 ||x_return_status,
4216 P_MODULE_NAME => l_module_name);
4217 END IF;
4218 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
4219 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
4220 END IF; */
4221
4222 -- Code in client extn kept here to avoid further changes in code after client extn.
4223 /* bug fix 5726773 : commenting out unecessary client-extension related code */
4224 /*
4225 l_fcst_etc_qty := l_cal_etc_qty_tab(i);
4226 l_fcst_etc_raw_cost := l_cal_etc_raw_cost_tab(i);
4227 l_fcst_etc_burdened_cost := l_cal_etc_burdened_cost_tab(i);
4228 l_fcst_etc_revenue := l_cal_etc_revenue_tab(i);
4229
4230 IF l_input_period_rates_tbl.count > 0 and
4231 l_period_rates_tbl.count = 0 THEN
4232 FOR j IN 1..l_input_period_rates_tbl.count LOOP
4233 l_period_rates_tbl(j).period_name := l_input_period_rates_tbl(j).period_name;
4234 l_period_rates_tbl(j).raw_cost_rate := l_input_period_rates_tbl(j).raw_cost_rate;
4235 l_period_rates_tbl(j).burdened_cost_rate := l_input_period_rates_tbl(j).burdened_cost_rate;
4236 l_period_rates_tbl(j).revenue_bill_rate := l_input_period_rates_tbl(j).revenue_bill_rate;
4237 END LOOP;
4238 END IF;
4239 */
4240 /* end bug fix 5726773 */
4241 -- Code in client extn kept here to avoid further changes in code after client extn.
4242
4243 -- Bug 3968748: We need to populate the PA_FP_GEN_RATE_TMP table with
4244 -- burdened cost rates for non-rate-based resources for Calculate API
4245 -- when generating work-based revenue for a Revenue-only target version.
4246
4247 -- Bug 4216423: We now need to populate PA_FP_GEN_RATE_TMP with cost
4248 -- rates for both rate-based and non-rate based resources when generating
4249 -- work-based revenue for a Revenue-only target version.
4250
4251 IF l_use_src_rates_flag = 'Y' OR
4252 ( p_fp_cols_rec.x_version_type = 'REVENUE' AND l_rev_gen_method = 'T' ) OR
4253 -- Added Condition for IPM
4254 ( p_fp_cols_rec.x_version_type = 'ALL' AND l_rev_gen_method = 'T' AND
4255 l_rev_only_src_txn_flag_tab(i) = 'Y' AND l_cal_rate_based_flag_tab(i) = 'N') THEN
4256
4257 -- Bug 4320954: When we fetch data from and update data to the
4258 -- PA_FP_GEN_RATE_TMP table for the Client Extension API, we need
4259 -- to check both the target_res_asg_id AND the TXN_CURRENCY_CODE
4260 -- in the WHERE clause so that the plan currency is honored.
4261
4262 DELETE /*+ INDEX(PA_FP_GEN_RATE_TMP,PA_FP_GEN_RATE_TMP_N1)*/
4263 FROM pa_fp_gen_rate_tmp
4264 WHERE target_res_asg_id = l_cal_ra_id_tab(i)
4265 AND txn_currency_code = l_cal_txn_currency_code_tab(i);
4266
4267 l_ext_period_name_tab.delete;
4268 l_ext_raw_cost_rate_tab.delete;
4269 l_ext_burdened_cost_rate_tab.delete;
4270 l_ext_revenue_bill_rate_tab.delete;
4271
4272 /* bug fix 5726773: Use l_input_period_rates_tbl instead of l_period_rates_tbl */
4273 FOR j IN 1..l_input_period_rates_tbl.count LOOP
4274 l_ext_period_name_tab(j) := l_input_period_rates_tbl(j).period_name;
4275 l_ext_raw_cost_rate_tab(j) := l_input_period_rates_tbl(j).raw_cost_rate;
4276 l_ext_burdened_cost_rate_tab(j) := l_input_period_rates_tbl(j).burdened_cost_rate;
4277 l_ext_revenue_bill_rate_tab(j) := l_input_period_rates_tbl(j).revenue_bill_rate;
4278 END LOOP;
4279
4280 FORALL j IN 1..l_ext_period_name_tab.count
4281 INSERT INTO PA_FP_GEN_RATE_TMP
4282 ( SOURCE_RES_ASG_ID,
4283 TXN_CURRENCY_CODE,
4284 PERIOD_NAME,
4285 RAW_COST_RATE,
4286 BURDENED_COST_RATE,
4287 REVENUE_BILL_RATE,
4288 TARGET_RES_ASG_ID )
4289 VALUES
4290 ( l_cal_src_ra_id_tab(i),
4291 l_cal_txn_currency_code_tab(i),
4292 l_ext_period_name_tab(j),
4293 l_ext_raw_cost_rate_tab(j),
4294 l_ext_burdened_cost_rate_tab(j),
4295 l_ext_revenue_bill_rate_tab(j),
4296 l_cal_ra_id_tab(i) );
4297 END IF;
4298
4299 /* hr_utility.trace('==etc qty aft client extn api '||l_fcst_etc_qty);
4300 hr_utility.trace('==etc cost aft client extn api '||l_fcst_etc_raw_cost);
4301 hr_utility.trace('==etc bd cost aft client extn api '||l_fcst_etc_burdened_cost);
4302 hr_utility.trace('==etc rev aft client extn api '||l_fcst_etc_revenue); */
4303
4304 /* bug fix 5726773 : commenting out unecessary client-extension related code */
4305 /*
4306 l_cal_etc_qty_tab(i) := l_fcst_etc_qty;
4307 l_cal_etc_raw_cost_tab(i) := l_fcst_etc_raw_cost;
4308 l_cal_etc_burdened_cost_tab(i) := l_fcst_etc_burdened_cost;
4309 l_cal_etc_revenue_tab(i) := l_fcst_etc_revenue;
4310 */
4311 /* end bug fix 5726773 */
4312
4313 IF (l_use_src_rates_flag = 'Y' OR
4314 (p_fp_cols_rec.x_version_type = 'REVENUE' AND l_rev_gen_method = 'T'))
4315 AND l_cal_rate_based_flag_tab(i) = 'Y' THEN
4316 /* Adding an if condition for bug#12377838.
4317 For a resources which do not have the actual amounts, the calculate api is not being invoked.
4318 So, when the raw cost and burdened cost are being assigned to null value, those values are
4319 not getting populated. So, added an extra condition to not to make null the raw cost and
4320 burdened cost.
4321 */
4322 IF (P_FP_COLS_REC.X_TIME_PHASED_CODE <> 'N' or p_fp_cols_rec.x_version_type = 'REVENUE') THEN -- Added for bug#12377838
4323 l_cal_etc_raw_cost_tab(i) := NULL;
4324 l_cal_etc_burdened_cost_tab(i) := NULL;
4325 l_cal_etc_revenue_tab(i) := NULL;
4326
4327 l_cal_rcost_rate_override_tab(i) := NULL;
4328 l_cal_bcost_rate_override_tab(i) := NULL;
4329 END IF;
4330 END IF;
4331
4332 /*Bug fix: 4258968: for none rate based resources, bill markup should be applied
4333 on top of raw cost, not revenue. So,nullify revenue here*/
4334
4335 IF (p_fp_cols_rec.x_version_type = 'REVENUE' OR p_fp_cols_rec.x_version_type = 'ALL')
4336 AND l_rev_gen_method = 'T'
4337 AND l_cal_rate_based_flag_tab(i) = 'N' THEN
4338 l_cal_etc_revenue_tab(i) := NULL;
4339 l_cal_bill_rate_override_tab(i) := NULL;
4340 END IF;
4341
4342 /* Start bug 3826548
4343 The following code has been added as a short term fix only.
4344 The Calculate API expects the total amounts for populating the
4345 budget lines for the ETC periods. Inside the Calculate API, they
4346 derived the actual amounts and subtract it from the passed total
4347 amounts. This fix is being patched for only testing the forecast
4348 generation process with the following assumptions.
4349
4350 1. There is going to be only one txn currency for the actual txn
4351 for the planning resource. - Actual amt currency.
4352 2. ETC source - Work Plan/Financial Plan - The Plan amount for the
4353 planning resource should be planned in only one txn currency.
4354 (For Work plan, it is always going to be only one txn currency.
4355 But, this may change in the future.) - Plan amt currency.
4356 3. The Actual amt currency and the Plan amt currency should be same.
4357
4358 The above fix will not cover all the cases. If we are going to have
4359 actual txn amounts in multiple currencies or if the ETC source total
4360 plan amount is going to be planned in multiple currencies, we will
4361 generate the ETC amount in Project Currency. In this case, if we have
4362 three different actual txn currencies and one planning currency for the
4363 planning currency (which is different from the actual txn currencies),
4364 then the actual amount cannot be derived from the budget lines for the
4365 target version. B/c, the Calculate/Spread API gets the actual amounts
4366 based on the txn currency passed from the fcst gen code. In this case,
4367 we wont get any amounts.
4368
4369 The fcst gen process will not give better performance results. B/c,
4370 from the fcst gen process, we are going to add the actual amount by
4371 reading the budget line data. Then, the Calculate/Spread API is going
4372 to select the same data and subtract the amounts from the total amount.
4373
4374 Permanent Fix : The 'Calculate/Spread' API should spread only the amount
4375 passed from the fcst generation process and should not manipulate the
4376 data in any way. We have the p_calling_module parameter and this
4377 parameter should be used to avoid any manipulation to the passed data.
4378
4379 If we go with the above strategy then the following code to select the
4380 actual amount (and adding the actual amount to the ETC amounts) should be
4381 removed and the changes should be made in the
4382 Calculate API/Spread API.
4383
4384 If we are going to address this issue using a different strategy then
4385 the code changes should be made in Fcst gen/Calculate/Spread API.
4386
4387 End bug 3826548
4388 */
4389
4390 /* bug fix start */
4391
4392 -- Bug 4211776, 4194849: Commented out logic for addition of actuals.
4393 /*
4394 SELECT sum(init_quantity),
4395 sum(txn_init_raw_cost),
4396 sum(txn_init_burdened_cost),
4397 sum(txn_init_revenue)
4398 INTO l_init_qty,
4399 l_init_raw_cost,
4400 l_init_burdened_cost,
4401 l_init_revenue
4402 FROM pa_budget_lines
4403 WHERE resource_assignment_id = l_cal_ra_id_tab(i)
4404 AND txn_currency_code = l_cal_txn_currency_code_tab(i);
4405
4406 l_cal_etc_qty_tab(i) := NVL(l_cal_etc_qty_tab(i),0) +
4407 NVL(l_init_qty,0);
4408
4409 IF p_fp_cols_rec.x_version_type = 'COST' THEN
4410 l_cal_etc_raw_cost_tab(i) := NVL(l_cal_etc_raw_cost_tab(i),0) +
4411 NVL(l_init_raw_cost,0);
4412 l_cal_etc_burdened_cost_tab(i) := NVL(l_cal_etc_burdened_cost_tab(i),0) +
4413 NVL(l_init_burdened_cost,0);
4414 ELSIF p_fp_cols_rec.x_version_type = 'REVENUE' THEN
4415 l_cal_etc_revenue_tab(i) := NVL(l_cal_etc_revenue_tab(i),0) +
4416 NVL(l_init_revenue,0);
4417 ELSIF p_fp_cols_rec.x_version_type = 'ALL' THEN
4418 l_cal_etc_raw_cost_tab(i) := NVL(l_cal_etc_raw_cost_tab(i),0) +
4419 NVL(l_init_raw_cost,0);
4420 l_cal_etc_burdened_cost_tab(i) := NVL(l_cal_etc_burdened_cost_tab(i),0) +
4421 NVL(l_init_burdened_cost,0);
4422 l_cal_etc_revenue_tab(i) := NVL(l_cal_etc_revenue_tab(i),0) +
4423 NVL(l_init_revenue,0);
4424 END IF;
4425 */
4426
4427 /* bug fix end */
4428 --hr_utility.trace('==Before calculate, l_cal_ra_id_tab('||i||'):'||l_cal_ra_id_tab(i));
4429 --hr_utility.trace('==Before calculate, l_cal_txn_currency_code_tab('||i||'):'||l_cal_txn_currency_code_tab(i));
4430 --hr_utility.trace('==Before calculate, l_cal_etc_qty_tab('||i||'):'||l_cal_etc_qty_tab(i));
4431 --hr_utility.trace('==Before calculate, l_cal_etc_raw_cost_tab('||i||'):'||l_cal_etc_raw_cost_tab(i));
4432 --hr_utility.trace('==Before calculate, l_cal_etc_burdened_cost_tab('||i||'):'||l_cal_etc_burdened_cost_tab(i));
4433 --hr_utility.trace('==Before calculate, l_cal_etc_revenue_tab('||i||'):'||l_cal_etc_revenue_tab(i));
4434 --hr_utility.trace('==Before calculate, l_cal_rcost_rate_override_tab('||i||'):'||l_cal_rcost_rate_override_tab(i));
4435 --hr_utility.trace('==Before calculate, l_cal_bcost_rate_override_tab('||i||'):'||l_cal_bcost_rate_override_tab(i));
4436 --hr_utility.trace('==Before calculate, l_cal_bill_rate_override_tab('||i||'):'||l_cal_bill_rate_override_tab(i));
4437 -- dbms_output.put_line('==Before calculate, l_cal_ra_id_tab('||i||'):'||l_cal_ra_id_tab(i));
4438 --dbms_output.put_line('==Before calculate, l_cal_txn_currency_code_tab('||i||'):'||l_cal_txn_currency_code_tab(i));
4439 --dbms_output.put_line('==Before calculate, l_cal_etc_qty_tab('||i||'):'||l_cal_etc_qty_tab(i));
4440 --dbms_output.put_line('==Before calculate, l_cal_etc_raw_cost_tab('||i||'):'||l_cal_etc_raw_cost_tab(i));
4441 --dbms_output.put_line('==Before calculate, l_cal_etc_burdened_cost_tab('||i||'):'||l_cal_etc_burdened_cost_tab(i));
4442
4443 -- Added in IPM: The continue_loop Exception is used within the
4444 -- loop to skip further processing of the current planning txn.
4445 EXCEPTION
4446 WHEN CONTINUE_LOOP THEN
4447 l_dummy := 1;
4448 WHEN OTHERS THEN
4449 RAISE;
4450 END;
4451 END LOOP;
4452
4453
4454 -- Added in IPM. If there are any pl/sql table records that need to
4455 -- be removed, use a separate set of _tmp_ tables to filter them out.
4456
4457 IF l_remove_records_flag = 'Y' THEN
4458
4459 -- 0. Clear out any data in the _tmp_ tables.
4460 l_cal_src_ra_id_tab_tmp.delete;
4461 l_cal_ra_id_tab_tmp.delete;
4462 l_cal_txn_curr_code_tab_tmp.delete;
4463 l_cal_rate_based_flag_tab_tmp.delete;
4464 l_cal_rlm_id_tab_tmp.delete;
4465 l_cal_cbs_id_tab_tmp.delete; --bug#16791711
4466 l_cal_task_id_tab_tmp.delete;
4467 l_cal_unit_of_measure_tab_tmp.delete;
4468 l_cal_etc_method_code_tab_tmp.delete;
4469 l_cal_etc_qty_tab_tmp.delete;
4470 l_cal_etc_raw_cost_tab_tmp.delete;
4471 l_cal_etc_brdn_cost_tab_tmp.delete;
4472 l_cal_etc_revenue_tab_tmp.delete;
4473 l_billable_flag_tab_tmp.delete;
4474 l_cal_rcost_rate_ovrd_tab_tmp.delete;
4475 l_cal_bcost_rate_ovrd_tab_tmp.delete;
4476 l_cal_bill_rate_ovrd_tab_tmp.delete;
4477
4478 -- 1. Copy records into _tmp_ tables
4479 l_index := 1;
4480 FOR i in 1..l_cal_ra_id_tab.count LOOP
4481 IF l_remove_record_flag_tab(i) <> 'Y' THEN
4482
4483 l_cal_src_ra_id_tab_tmp.extend;
4484 l_cal_ra_id_tab_tmp.extend;
4485 l_cal_txn_curr_code_tab_tmp.extend;
4486 l_cal_rate_based_flag_tab_tmp.extend;
4487 l_cal_rlm_id_tab_tmp.extend;
4488 l_cal_cbs_id_tab_tmp.extend; --bug#16791711
4489 l_cal_task_id_tab_tmp.extend;
4490 l_cal_unit_of_measure_tab_tmp.extend;
4491 l_cal_etc_method_code_tab_tmp.extend;
4492 l_cal_etc_qty_tab_tmp.extend;
4493 l_cal_etc_raw_cost_tab_tmp.extend;
4494 l_cal_etc_brdn_cost_tab_tmp.extend;
4495 l_cal_etc_revenue_tab_tmp.extend;
4496 l_billable_flag_tab_tmp.extend;
4497 l_cal_rcost_rate_ovrd_tab_tmp.extend;
4498 l_cal_bcost_rate_ovrd_tab_tmp.extend;
4499 l_cal_bill_rate_ovrd_tab_tmp.extend;
4500
4501 l_cal_src_ra_id_tab_tmp(l_index) := l_cal_src_ra_id_tab(i);
4502 l_cal_ra_id_tab_tmp(l_index) := l_cal_ra_id_tab(i);
4503 l_cal_txn_curr_code_tab_tmp(l_index) := l_cal_txn_currency_code_tab(i);
4504 l_cal_rate_based_flag_tab_tmp(l_index) := l_cal_rate_based_flag_tab(i);
4505 l_cal_rlm_id_tab_tmp(l_index) := l_cal_rlm_id_tab(i);
4506 l_cal_cbs_id_tab_tmp(l_index) := l_cal_cbs_id_tab(i);--bug#16791711
4507 l_cal_task_id_tab_tmp(l_index) := l_cal_task_id_tab(i);
4508 l_cal_unit_of_measure_tab_tmp(l_index) := l_cal_unit_of_measure_tab(i);
4509 l_cal_etc_method_code_tab_tmp(l_index) := l_cal_etc_method_code_tab(i);
4510 l_cal_etc_qty_tab_tmp(l_index) := l_cal_etc_qty_tab(i);
4511 l_cal_etc_raw_cost_tab_tmp(l_index) := l_cal_etc_raw_cost_tab(i);
4512 l_cal_etc_brdn_cost_tab_tmp(l_index) := l_cal_etc_burdened_cost_tab(i);
4513 l_cal_etc_revenue_tab_tmp(l_index) := l_cal_etc_revenue_tab(i);
4514 l_billable_flag_tab_tmp(l_index) := l_billable_flag_tab(i);
4515 l_cal_rcost_rate_ovrd_tab_tmp(l_index) := l_cal_rcost_rate_override_tab(i);
4516 l_cal_bcost_rate_ovrd_tab_tmp(l_index) := l_cal_bcost_rate_override_tab(i);
4517 l_cal_bill_rate_ovrd_tab_tmp(l_index) := l_cal_bill_rate_override_tab(i);
4518
4519 l_index := l_index + 1;
4520 END IF;
4521 END LOOP;
4522
4523 -- 2. Copy records from _tmp_ tables back to non-temporary tables.
4524 l_cal_src_ra_id_tab := l_cal_src_ra_id_tab_tmp;
4525 l_cal_ra_id_tab := l_cal_ra_id_tab_tmp;
4526 l_cal_txn_currency_code_tab := l_cal_txn_curr_code_tab_tmp;
4527 l_cal_rate_based_flag_tab := l_cal_rate_based_flag_tab_tmp;
4528 l_cal_rlm_id_tab := l_cal_rlm_id_tab_tmp;
4529 l_cal_cbs_id_tab := l_cal_cbs_id_tab_tmp;--bug#16791711
4530 l_cal_task_id_tab := l_cal_task_id_tab_tmp;
4531 l_cal_unit_of_measure_tab := l_cal_unit_of_measure_tab_tmp;
4532 l_cal_etc_method_code_tab := l_cal_etc_method_code_tab_tmp;
4533 l_cal_etc_qty_tab := l_cal_etc_qty_tab_tmp;
4534 l_cal_etc_raw_cost_tab := l_cal_etc_raw_cost_tab_tmp;
4535 l_cal_etc_burdened_cost_tab := l_cal_etc_brdn_cost_tab_tmp;
4536 l_cal_etc_revenue_tab := l_cal_etc_revenue_tab_tmp;
4537 l_billable_flag_tab := l_billable_flag_tab_tmp;
4538 l_cal_rcost_rate_override_tab := l_cal_rcost_rate_ovrd_tab_tmp;
4539 l_cal_bcost_rate_override_tab := l_cal_bcost_rate_ovrd_tab_tmp;
4540 l_cal_bill_rate_override_tab := l_cal_bill_rate_ovrd_tab_tmp;
4541
4542 END IF; -- IF l_remove_records_flag = 'Y' THEN
4543
4544 -- End IPM filtering logic.
4545
4546 /*********************************************************************
4547 ER 5726773: Commenting out logic that filters out planning
4548 transaction records with: (total plan quantity <= 0).
4549
4550 -- Bug 4654157 and 4670253 : Before calling the Calculate API, we should ensure that only
4551 -- target resources with Total Plan Quantity >= 0 are passed. Total Plan Quantity
4552 -- is the sum of Actual Quantity (from target budget lines) + ETC Quantity.
4553
4554 l_index := 1;
4555
4556 l_cal_ra_id_tab_tmp.delete;
4557 l_cal_txn_curr_code_tab_tmp.delete;
4558 l_cal_rate_based_flag_tab_tmp.delete;
4559 l_cal_rlm_id_tab_tmp.delete;
4560 l_cal_task_id_tab_tmp.delete;
4561 l_cal_unit_of_measure_tab_tmp.delete;
4562 l_cal_etc_method_code_tab_tmp.delete;
4563 l_cal_etc_qty_tab_tmp.delete;
4564 l_cal_etc_raw_cost_tab_tmp.delete;
4565 l_cal_etc_brdn_cost_tab_tmp.delete;
4566 l_cal_etc_revenue_tab_tmp.delete;
4567 l_cal_rcost_rate_ovrd_tab_tmp.delete;
4568 l_cal_bcost_rate_ovrd_tab_tmp.delete;
4569 l_cal_bill_rate_ovrd_tab_tmp.delete;
4570
4571 FOR i in 1..l_cal_ra_id_tab.count LOOP
4572 -- Bug 4670253: Added NVL around actual quantity sum to
4573 -- ensure that l_init_qty is not null.
4574 BEGIN
4575 SELECT nvl(sum(nvl(init_quantity,0)),0)
4576 INTO l_init_qty
4577 FROM pa_budget_lines
4578 WHERE resource_assignment_id = l_cal_ra_id_tab(i)
4579 AND txn_currency_code = l_cal_txn_currency_code_tab(i);
4580 EXCEPTION
4581 WHEN NO_DATA_FOUND THEN
4582 l_init_qty := 0;
4583 END;
4584
4585 l_total_plan_qty := l_init_qty + nvl(l_cal_etc_qty_tab(i),0);
4586
4587 IF nvl(l_total_plan_qty,0) > 0 THEN
4588 l_cal_ra_id_tab_tmp.EXTEND;
4589 l_cal_txn_curr_code_tab_tmp.EXTEND;
4590 l_cal_rate_based_flag_tab_tmp.EXTEND;
4591 l_cal_rlm_id_tab_tmp.EXTEND;
4592 l_cal_task_id_tab_tmp.EXTEND;
4593 l_cal_unit_of_measure_tab_tmp.EXTEND;
4594 l_cal_etc_method_code_tab_tmp.EXTEND;
4595 l_cal_etc_qty_tab_tmp.EXTEND;
4596 l_cal_etc_raw_cost_tab_tmp.EXTEND;
4597 l_cal_etc_brdn_cost_tab_tmp.EXTEND;
4598 l_cal_etc_revenue_tab_tmp.EXTEND;
4599 l_cal_rcost_rate_ovrd_tab_tmp.EXTEND;
4600 l_cal_bcost_rate_ovrd_tab_tmp.EXTEND;
4601 l_cal_bill_rate_ovrd_tab_tmp.EXTEND;
4602
4603 l_cal_ra_id_tab_tmp(l_index) := l_cal_ra_id_tab(i);
4604 l_cal_txn_curr_code_tab_tmp(l_index) := l_cal_txn_currency_code_tab(i);
4605 l_cal_rate_based_flag_tab_tmp(l_index) := l_cal_rate_based_flag_tab(i);
4606 l_cal_rlm_id_tab_tmp(l_index) := l_cal_rlm_id_tab(i);
4607 l_cal_task_id_tab_tmp(l_index) := l_cal_task_id_tab(i);
4608 l_cal_unit_of_measure_tab_tmp(l_index) := l_cal_unit_of_measure_tab(i);
4609 l_cal_etc_method_code_tab_tmp(l_index) := l_cal_etc_method_code_tab(i);
4610 l_cal_etc_qty_tab_tmp(l_index) := l_cal_etc_qty_tab(i);
4611 l_cal_etc_raw_cost_tab_tmp(l_index) := l_cal_etc_raw_cost_tab(i);
4612 l_cal_etc_brdn_cost_tab_tmp(l_index) := l_cal_etc_burdened_cost_tab(i);
4613 l_cal_etc_revenue_tab_tmp(l_index) := l_cal_etc_revenue_tab(i);
4614 l_cal_rcost_rate_ovrd_tab_tmp(l_index) := l_cal_rcost_rate_override_tab(i);
4615 l_cal_bcost_rate_ovrd_tab_tmp(l_index) := l_cal_bcost_rate_override_tab(i);
4616 l_cal_bill_rate_ovrd_tab_tmp(l_index) := l_cal_bill_rate_override_tab(i);
4617
4618 l_index := l_index + 1;
4619 END IF; -- l_total_plan_qty > 0
4620
4621 END LOOP; -- FOR i in 1..l_cal_ra_id_tab.count LOOP
4622
4623 l_cal_ra_id_tab := l_cal_ra_id_tab_tmp;
4624 l_cal_txn_currency_code_tab := l_cal_txn_curr_code_tab_tmp;
4625 l_cal_rate_based_flag_tab := l_cal_rate_based_flag_tab_tmp;
4626 l_cal_rlm_id_tab := l_cal_rlm_id_tab_tmp;
4627 l_cal_task_id_tab := l_cal_task_id_tab_tmp;
4628 l_cal_unit_of_measure_tab := l_cal_unit_of_measure_tab_tmp;
4629 l_cal_etc_method_code_tab := l_cal_etc_method_code_tab_tmp;
4630 l_cal_etc_qty_tab := l_cal_etc_qty_tab_tmp;
4631 l_cal_etc_raw_cost_tab := l_cal_etc_raw_cost_tab_tmp;
4632 l_cal_etc_burdened_cost_tab := l_cal_etc_brdn_cost_tab_tmp;
4633 l_cal_etc_revenue_tab := l_cal_etc_revenue_tab_tmp;
4634 l_cal_rcost_rate_override_tab := l_cal_rcost_rate_ovrd_tab_tmp;
4635 l_cal_bcost_rate_override_tab := l_cal_bcost_rate_ovrd_tab_tmp;
4636 l_cal_bill_rate_override_tab := l_cal_bill_rate_ovrd_tab_tmp;
4637
4638 -- End Bug Fix 4654157 and 4670253
4639
4640 ER 5726773: End of commented out section.
4641 *********************************************************************/
4642
4643 IF P_FP_COLS_REC.X_TIME_PHASED_CODE='N' AND
4644 ( p_fp_cols_rec.x_version_type = 'COST' OR
4645 ( p_fp_cols_rec.x_version_type = 'REVENUE' AND
4646 l_rev_gen_method IN ('C','E') ) ) THEN
4647
4648 FOR i in 1..l_cal_ra_id_tab.count LOOP
4649 SELECT planning_start_date,
4650 planning_end_date
4651 INTO l_start_date,
4652 l_end_date
4653 FROM pa_resource_assignments
4654 WHERE resource_assignment_id = l_cal_ra_id_tab(i);
4655
4656 /*Start of the rounding handing*/
4657 IF l_cal_rate_based_flag_tab(i) = 'Y' THEN
4658 l_cal_etc_qty_tab(i) := pa_fin_plan_utils2.round_quantity
4659 (p_quantity => l_cal_etc_qty_tab(i));
4660 ELSE
4661 l_cal_etc_qty_tab(i) := pa_currency.round_trans_currency_amt1
4662 (x_amount => l_cal_etc_qty_tab(i),
4663 x_curr_Code => l_cal_txn_currency_code_tab(i));
4664 END IF;
4665 l_cal_etc_raw_cost_tab(i) := pa_currency.round_trans_currency_amt1
4666 (x_amount => l_cal_etc_raw_cost_tab(i),
4667 x_curr_Code => l_cal_txn_currency_code_tab(i));
4668 l_cal_etc_burdened_cost_tab(i) := pa_currency.round_trans_currency_amt1
4669 (x_amount => l_cal_etc_burdened_cost_tab(i),
4670 x_curr_Code => l_cal_txn_currency_code_tab(i));
4671 /*End of the rounding handling*/
4672
4673 /*dbms_output.put_line('ra_id = ' || l_cal_ra_id_tab(i) ||
4674 ',qty = ' || l_cal_etc_qty_tab(i) ||
4675 ', rc = ' || l_cal_etc_raw_cost_tab(i) ||
4676 ', bc = ' || l_cal_etc_burdened_cost_tab(i));*/
4677
4678 l_amt_dtls_tbl.delete;
4679 l_amt_dtls_tbl(1).period_name := null;
4680 l_amt_dtls_tbl(1).start_date := l_start_date;
4681 l_amt_dtls_tbl(1).end_date := l_end_date;
4682 l_amt_dtls_tbl(1).quantity := l_cal_etc_qty_tab(i);
4683 l_amt_dtls_tbl(1).txn_raw_cost := l_cal_etc_raw_cost_tab(i);
4684 l_amt_dtls_tbl(1).txn_burdened_cost := l_cal_etc_burdened_cost_tab(i);
4685 l_amt_dtls_tbl(1).txn_revenue := null;
4686 l_amt_dtls_tbl(1).project_raw_cost := null;
4687 l_amt_dtls_tbl(1).project_burdened_cost := null;
4688 l_amt_dtls_tbl(1).project_revenue := null;
4689 l_amt_dtls_tbl(1).project_func_raw_cost := null;
4690 l_amt_dtls_tbl(1).project_func_burdened_cost := null;
4691 l_amt_dtls_tbl(1).project_func_revenue := null;
4692
4693 -- ER 4376722: Note that we do not need to check task billability
4694 -- at this point; the billability logic performed upstream should
4695 -- be sufficient. The IF statement below is the only point within
4696 -- this None timephase logic block where Revenue is updated by an
4697 -- assignment. However, the assignment statement is safe, because
4698 -- the billable_flag cannot be 'N' at this point - if it were 'N',
4699 -- then the billability logic upstream would have removed the
4700 -- current record from the pl/sql tables.
4701
4702 -- if then introduced for bug 4232253
4703 IF p_fp_cols_rec.x_version_type = 'REVENUE' AND
4704 l_cal_rate_based_flag_tab(i) = 'N' THEN
4705 -- Earlier, l_cal_etc_qty value has been set to raw cost or
4706 -- burdened cost based on the revenue accrual method.
4707 l_amt_dtls_tbl(1).txn_revenue := l_amt_dtls_tbl(1).quantity;
4708 END IF;
4709
4710 IF P_PA_DEBUG_MODE = 'Y' THEN
4711 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4712 P_CALLED_MODE => P_CALLED_MODE,
4713 P_MSG => 'Before calling PA_FP_MAINTAIN_ACTUAL_PUB.'||
4714 'MAINTAIN_ACTUAL_AMT_RA',
4715 P_MODULE_NAME => l_module_name);
4716 END IF;
4717 PA_FP_MAINTAIN_ACTUAL_PUB.MAINTAIN_ACTUAL_AMT_RA (
4718 P_PROJECT_ID => P_PROJECT_ID,
4719 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
4720 P_RESOURCE_ASSIGNMENT_ID => l_cal_ra_id_tab(i),
4721 P_TXN_CURRENCY_CODE => l_cal_txn_currency_code_tab(i),
4722 P_AMT_DTLS_REC_TAB => l_amt_dtls_tbl,
4723 P_CALLING_CONTEXT => 'FP_GEN_FCST_COPY_ACTUAL',
4724 P_TXN_AMT_TYPE_CODE => 'PLANNING_TXN',
4725 X_RETURN_STATUS => x_return_Status,
4726 X_MSG_COUNT => x_msg_count,
4727 X_MSG_DATA => x_msg_data );
4728 IF P_PA_DEBUG_MODE = 'Y' THEN
4729 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4730 P_CALLED_MODE => P_CALLED_MODE,
4731 P_MSG => 'After calling PA_FP_MAINTAIN_ACTUAL_PUB.'||
4732 'MAINTAIN_ACTUAL_AMT_RA: '||x_return_status,
4733 P_MODULE_NAME => l_module_name);
4734 END IF;
4735 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4736 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
4737 END IF;
4738 END LOOP;
4739 IF p_pa_debug_mode = 'Y' THEN
4740 PA_DEBUG.Reset_Curr_Function;
4741 END IF;
4742 -- RETURN; --bug#13330980
4743 END IF;
4744
4745 /*
4746 select count(*) into l_count from
4747 pa_budget_lines where budget_version_id = P_BUDGET_VERSION_ID;
4748
4749 hr_utility.trace('==before calculate=== no of bdgt lines'||
4750 l_count );
4751 Initializing every pl sql table to null for calling calculate API */
4752
4753 FOR i in 1..l_cal_ra_id_tab.count LOOP
4754 l_delete_budget_lines_tab.extend;
4755 l_spread_amts_flag_tab.extend;
4756 l_txn_currency_override_tab.extend;
4757 l_addl_qty_tab.extend;
4758 l_addl_raw_cost_tab.extend;
4759 l_addl_burdened_cost_tab.extend;
4760 l_addl_revenue_tab.extend;
4761 l_raw_cost_rate_tab.extend;
4762 l_b_cost_rate_tab.extend;
4763 l_bill_rate_tab.extend;
4764 l_line_start_date_tab.extend;
4765 l_line_end_date_tab.extend;
4766
4767 l_delete_budget_lines_tab(i) := Null;
4768 l_spread_amts_flag_tab(i) := 'Y';
4769 l_txn_currency_override_tab(i) := Null;
4770 l_addl_qty_tab(i) := Null;
4771 l_addl_raw_cost_tab(i) := Null;
4772 l_addl_burdened_cost_tab(i) := Null;
4773 l_addl_revenue_tab(i) := Null;
4774 l_raw_cost_rate_tab(i) := Null;
4775 l_b_cost_rate_tab(i) := Null;
4776 l_bill_rate_tab(i) := Null;
4777 l_line_start_date_tab(i) := Null;
4778 l_line_end_date_tab(i) := Null;
4779 -- --dbms_output.put_line('----'||i||'-----');
4780 -- --dbms_output.put_line(l_resource_assignment_id_tab(i));
4781 -- --dbms_output.put_line(l_quantity_tab(i));
4782 END LOOP;
4783 l_refresh_rates_flag := 'N';
4784 l_refresh_conv_rates_flag := 'N';
4785 l_spread_required_flag := 'Y';
4786 l_conv_rates_required_flag := 'Y';
4787 l_raTxn_rollup_api_call_flag := 'N'; -- Added for IPM new entity ER
4788
4789 -- Bug 3991151: Before calling the Calculate API, we need to copy source
4790 -- attributes (including the spread_curve_id) to target resources where
4791 -- applicable.
4792
4793 /* Populate target ra_ids in tmp1 for COPY_SRC_ATTRS_TO_TARGET_FCST */
4794 DELETE pa_res_list_map_tmp1;
4795 FORALL i in 1..l_cal_ra_id_tab.count
4796 INSERT INTO pa_res_list_map_tmp1
4797 ( txn_resource_assignment_id )
4798 VALUES ( l_cal_ra_id_tab(i) );
4799
4800 IF p_pa_debug_mode = 'Y' THEN
4801 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
4802 ( p_msg => 'Before calling PA_FP_GEN_PUB.' ||
4803 'COPY_SRC_ATTRS_TO_TARGET_FCST',
4804 p_module_name => l_module_name,
4805 p_log_level => 5 );
4806 END IF;
4807 PA_FP_GEN_PUB.COPY_SRC_ATTRS_TO_TARGET_FCST
4808 ( P_FP_COLS_REC => p_fp_cols_rec,
4809 X_RETURN_STATUS => x_return_status,
4810 X_MSG_COUNT => x_msg_count,
4811 X_MSG_DATA => x_msg_data );
4812 IF p_pa_debug_mode = 'Y' THEN
4813 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
4814 ( p_msg => 'Status after calling PA_FP_GEN_PUB.' ||
4815 'COPY_SRC_ATTRS_TO_TARGET_FCST: ' ||
4816 x_return_status,
4817 p_module_name => l_module_name,
4818 p_log_level => 5 );
4819 END IF;
4820 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4821 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
4822 END IF;
4823 -- Bug 3991151: End changes.
4824
4825 IF P_PA_DEBUG_MODE = 'Y' THEN
4826 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4827 P_CALLED_MODE => P_CALLED_MODE,
4828 P_MSG => 'Before calling PA_FP_CALC_PLAN_PKG.calculate',
4829 P_MODULE_NAME => l_module_name);
4830 END IF;
4831 /* select etc_start_date into l_date from
4832 pa_budget_versions where budget_version_id = P_BUDGET_VERSION_ID;
4833
4834 hr_utility.trace('==before calculate=== etc start date '||
4835 to_char(l_date,'dd-mon-yyyy') );
4836 hr_utility.trace('==Entering Calculate=================='); */
4837
4838 /* p_calling module parameter added for bug 3796136 to
4839 spread ETC amount only after the actual thru period end date
4840 and update the planning end date in res asg table.
4841 This logic is handled in the calculate API based on this
4842 new parameter. */
4843
4844 PA_FP_CALC_PLAN_PKG.calculate(
4845 p_calling_module => 'FORECAST_GENERATION',
4846 P_PROJECT_ID => P_PROJECT_ID,
4847 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
4848 P_REFRESH_RATES_FLAG => l_refresh_rates_flag,
4849 P_REFRESH_CONV_RATES_FLAG => l_refresh_conv_rates_flag,
4850 P_SPREAD_REQUIRED_FLAG => l_spread_required_flag,
4851 P_CONV_RATES_REQUIRED_FLAG => l_conv_rates_required_flag,
4852 P_ROLLUP_REQUIRED_FLAG => 'N',
4853 --P_MASS_ADJUST_FLAG
4854 --P_QUANTITY_ADJ_PCT
4855 --P_COST_RATE_ADJ_PCT
4856 --P_BURDENED_RATE_ADJ_PCT
4857 --P_BILL_RATE_ADJ_PCT
4858 P_SOURCE_CONTEXT => l_source_context,
4859 P_RESOURCE_ASSIGNMENT_TAB => l_cal_ra_id_tab,
4860 P_DELETE_BUDGET_LINES_TAB => l_delete_budget_lines_tab,
4861 P_SPREAD_AMTS_FLAG_TAB => l_spread_amts_flag_tab,
4862 P_TXN_CURRENCY_CODE_TAB => l_cal_txn_currency_code_tab,
4863 P_TXN_CURRENCY_OVERRIDE_TAB => l_txn_currency_override_tab,
4864 P_TOTAL_QTY_TAB => l_cal_etc_qty_tab,
4865 P_ADDL_QTY_TAB => l_addl_qty_tab,
4866 P_TOTAL_RAW_COST_TAB => l_cal_etc_raw_cost_tab,
4867 P_ADDL_RAW_COST_TAB => l_addl_raw_cost_tab,
4868 P_TOTAL_BURDENED_COST_TAB => l_cal_etc_burdened_cost_tab,
4869 P_ADDL_BURDENED_COST_TAB => l_addl_burdened_cost_tab,
4870 P_TOTAL_REVENUE_TAB => l_cal_etc_revenue_tab,
4871 P_ADDL_REVENUE_TAB => l_addl_revenue_tab,
4872 P_RAW_COST_RATE_TAB => l_raw_cost_rate_tab,
4873 P_RW_COST_RATE_OVERRIDE_TAB => l_cal_rcost_rate_override_tab,
4874 P_B_COST_RATE_TAB => l_b_cost_rate_tab,
4875 P_B_COST_RATE_OVERRIDE_TAB => l_cal_bcost_rate_override_tab,
4876 P_BILL_RATE_TAB => l_bill_rate_tab,
4877 P_BILL_RATE_OVERRIDE_TAB => l_cal_bill_rate_override_tab,
4878 P_LINE_START_DATE_TAB => l_line_start_date_tab,
4879 P_LINE_END_DATE_TAB => l_line_start_date_tab,
4880 P_RATXN_ROLLUP_API_CALL_FLAG => l_raTxn_rollup_api_call_flag,
4881 X_RETURN_STATUS => x_return_status,
4882 X_MSG_COUNT => x_msg_count,
4883 X_MSG_DATA => x_msg_data );
4884
4885 -- hr_utility.trace('==Leaving Calculate==================:'||x_return_status);
4886
4887 IF P_PA_DEBUG_MODE = 'Y' THEN
4888 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4889 P_CALLED_MODE => P_CALLED_MODE,
4890 P_MSG => 'After calling PA_FP_CALC_PLAN_PKG.calculate: '||
4891 x_return_status,
4892 P_MODULE_NAME => l_module_name);
4893 END IF;
4894 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
4895 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
4896 END IF;
4897
4898 IF p_pa_debug_mode = 'Y' THEN
4899 PA_DEBUG.Reset_Curr_Function;
4900 END IF;
4901 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
4902 EXCEPTION
4903 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
4904 --dbms_output.put_line('--INSIDE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc');
4905 l_msg_count := FND_MSG_PUB.count_msg;
4906 IF l_msg_count = 1 THEN
4907 PA_INTERFACE_UTILS_PUB.get_messages
4908 (p_encoded => FND_API.G_TRUE
4909 ,p_msg_index => 1
4910 ,p_msg_count => l_msg_count
4911 ,p_msg_data => l_msg_data
4912 ,p_data => l_data
4913 ,p_msg_index_out => l_msg_index_out);
4914 x_msg_data := l_data;
4915 x_msg_count := l_msg_count;
4916 ELSE
4917 x_msg_count := l_msg_count;
4918 END IF;
4919 ROLLBACK;
4920
4921 x_return_status := FND_API.G_RET_STS_ERROR;
4922 IF P_PA_DEBUG_MODE = 'Y' THEN
4923 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4924 P_CALLED_MODE => P_CALLED_MODE,
4925 P_MSG => 'Invalid Arguments Passed',
4926 P_MODULE_NAME => l_module_name);
4927 PA_DEBUG.Reset_Curr_Function;
4928 END IF;
4929 RAISE;
4930
4931 WHEN OTHERS THEN
4932 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4933 x_msg_data := SUBSTR(SQLERRM,1,240);
4934 FND_MSG_PUB.add_exc_msg
4935 ( p_pkg_name => 'PA_FP_GEN_FCST_AMT_PUB'
4936 ,p_procedure_name => 'GEN_FCST_TASK_LEVEL_AMT');
4937 IF P_PA_DEBUG_MODE = 'Y' THEN
4938 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4939 P_CALLED_MODE => P_CALLED_MODE,
4940 P_MSG => 'Unexpected Error'||substr(sqlerrm, 1, 240),
4941 P_MODULE_NAME => l_module_name);
4942 PA_DEBUG.Reset_Curr_Function;
4943 END IF;
4944 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4945 END GEN_FCST_TASK_LEVEL_AMT;
4946
4947 PROCEDURE MAINTAIN_RES_ASG(
4948 P_PROJECT_ID IN PA_PROJECTS_ALL.PROJECT_ID%TYPE,
4949 P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
4950 P_FP_COLS_REC IN PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
4951 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
4952 X_MSG_COUNT OUT NOCOPY NUMBER,
4953 X_MSG_DATA OUT NOCOPY VARCHAR2)
4954 IS
4955 l_module_name VARCHAR2(200) := 'pa.plsql.pa_fp_gen_fcst_amt_pub.maintain_res_asg';
4956
4957 l_msg_count NUMBER;
4958 l_msg_data VARCHAR2(2000);
4959 l_data VARCHAR2(2000);
4960 l_msg_index_out NUMBER:=0;
4961
4962 l_count number;
4963 BEGIN
4964 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
4965 X_MSG_COUNT := 0;
4966 IF p_pa_debug_mode = 'Y' THEN
4967 pa_debug.set_curr_function( p_function => 'MAINTAIN_RES_ASG',
4968 p_debug_mode => p_pa_debug_mode);
4969 END IF;
4970
4971 DELETE FROM PA_FP_PLANNING_RES_TMP1;
4972 IF P_FP_COLS_REC.X_FIN_PLAN_LEVEL_CODE = 'L' THEN
4973 -- hr_utility.trace('inside lowest task in maintain res asg :');
4974 /* PA_FP_PLANNING_RES_TMP1 will have res asg id column with
4975 > 0 value - actual res asg id from WP or FP budget version
4976 source, all negative res asg values are inserted either for
4977 tasks with etc source as WORK_QUANTITY or the etc is NONE or NULL. */
4978 INSERT INTO PA_FP_PLANNING_RES_TMP1 (
4979 TASK_ID,
4980 RESOURCE_LIST_MEMBER_ID,
4981 CBS_ELEMENT_ID,--bug#16791711
4982 RESOURCE_ASSIGNMENT_ID,
4983 planning_start_date,
4984 planning_end_date )
4985 (SELECT MAPPED_FIN_TASK_ID,
4986 TARGET_RLM_ID,
4987 CBS_ELEMENT_ID,--bug#16791711
4988 to_number(NULL),
4989 min(planning_start_date),
4990 max(planning_end_date)
4991 FROM PA_FP_CALC_AMT_TMP1
4992 GROUP BY mapped_fin_task_id,TARGET_RLM_ID,CBS_ELEMENT_ID,to_number(NULL));
4993 ELSIF P_FP_COLS_REC.X_FIN_PLAN_LEVEL_CODE = 'P' THEN
4994 -- hr_utility.trace('inside proj lvl in maintain res asg :');
4995 INSERT INTO PA_FP_PLANNING_RES_TMP1 (
4996 TASK_ID,
4997 RESOURCE_LIST_MEMBER_ID,
4998 CBS_ELEMENT_ID,--bug#16791711
4999 RESOURCE_ASSIGNMENT_ID,
5000 planning_start_date,
5001 planning_end_date )
5002 (SELECT 0,
5003 TARGET_RLM_ID,
5004 CBS_ELEMENT_ID,--bug#16791711
5005 to_number(NULL),
5006 min(planning_start_date),
5007 max(planning_end_date)
5008 FROM PA_FP_CALC_AMT_TMP1
5009 group by 0, TARGET_RLM_ID,CBS_ELEMENT_ID,
5010 to_number(NULL) );
5011 ELSIF P_FP_COLS_REC.X_FIN_PLAN_LEVEL_CODE = 'T' THEN
5012 -- hr_utility.trace('inside top task in maintain res asg :');
5013 INSERT INTO PA_FP_PLANNING_RES_TMP1 (
5014 TASK_ID,
5015 RESOURCE_LIST_MEMBER_ID,
5016 CBS_ELEMENT_ID,--bug#16791711
5017 RESOURCE_ASSIGNMENT_ID,
5018 planning_start_date,
5019 planning_end_date )
5020 (SELECT MAPPED_FIN_TASK_ID,
5021 TARGET_RLM_ID,
5022 CBS_ELEMENT_ID,--bug#16791711
5023 to_number(NULL),
5024 min(planning_start_date),
5025 max(planning_end_date)
5026 FROM PA_FP_CALC_AMT_TMP1 group by
5027 mapped_fin_task_id,TARGET_RLM_ID,CBS_ELEMENT_ID,
5028 to_number(NULL) );
5029 END IF;
5030 -- select count(*) into l_count from PA_FP_PLANNING_RES_TMP1;
5031 -- hr_utility.trace('in maintain res asg plan res tmp1 count :'||l_count);
5032 IF P_PA_DEBUG_MODE = 'Y' THEN
5033 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
5034 P_MSG => 'Before calling pa_fp_copy_actuals_pub.create_res_asg',
5035 P_MODULE_NAME => l_module_name,
5036 p_log_level => 5);
5037 END IF;
5038 PA_FP_COPY_ACTUALS_PUB.CREATE_RES_ASG (
5039 P_PROJECT_ID => P_PROJECT_ID,
5040 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
5041 P_FP_COLS_REC => P_FP_COLS_REC,
5042 P_CALLING_PROCESS => 'FORECAST_GENERATION',
5043 X_RETURN_STATUS => x_return_status,
5044 X_MSG_COUNT => x_msg_count,
5045 X_MSG_DATA => x_msg_data );
5046 IF P_PA_DEBUG_MODE = 'Y' THEN
5047 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
5048 P_MSG => 'After calling create_res_asg,return status is: '||x_return_status,
5049 P_MODULE_NAME => l_module_name,
5050 p_log_level => 5);
5051 END IF;
5052 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5053 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
5054 END IF;
5055
5056 IF P_PA_DEBUG_MODE = 'Y' THEN
5057 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
5058 P_MSG => 'Before calling pa_fp_copy_actuals_pub.update_res_asg',
5059 P_MODULE_NAME => l_module_name,
5060 p_log_level => 5);
5061 END IF;
5062 PA_FP_COPY_ACTUALS_PUB.UPDATE_RES_ASG (
5063 P_PROJECT_ID => P_PROJECT_ID,
5064 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
5065 P_FP_COLS_REC => P_FP_COLS_REC,
5066 P_CALLING_PROCESS => 'FORECAST_GENERATION',
5067 X_RETURN_STATUS => x_return_status,
5068 X_MSG_COUNT => x_msg_count,
5069 X_MSG_DATA => x_msg_data );
5070 IF P_PA_DEBUG_MODE = 'Y' THEN
5071 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
5072 P_MSG => 'After calling update_res_asg,return status is: '||x_return_status,
5073 P_MODULE_NAME => l_module_name,
5074 p_log_level => 5);
5075 END IF;
5076 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5077 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
5078 END IF;
5079
5080 IF p_pa_debug_mode = 'Y' THEN
5081 PA_DEBUG.Reset_Curr_Function;
5082 END IF;
5083 EXCEPTION
5084 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
5085 l_msg_count := FND_MSG_PUB.count_msg;
5086 IF l_msg_count = 1 THEN
5087 PA_INTERFACE_UTILS_PUB.get_messages
5088 (p_encoded => FND_API.G_TRUE
5089 ,p_msg_index => 1
5090 ,p_msg_count => l_msg_count
5091 ,p_msg_data => l_msg_data
5092 ,p_data => l_data
5093 ,p_msg_index_out => l_msg_index_out);
5094 x_msg_data := l_data;
5095 x_msg_count := l_msg_count;
5096 ELSE
5097 x_msg_count := l_msg_count;
5098 END IF;
5099 ROLLBACK;
5100
5101 x_return_status := FND_API.G_RET_STS_ERROR;
5102 IF P_PA_DEBUG_MODE = 'Y' THEN
5103 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
5104 P_MSG => 'Invalid Arguments Passed',
5105 P_MODULE_NAME => l_module_name,
5106 p_log_level => 5);
5107 PA_DEBUG.Reset_Curr_Function;
5108 END IF;
5109 RAISE;
5110
5111 WHEN OTHERS THEN
5112 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5113 x_msg_data := SUBSTR(SQLERRM,1,240);
5114 FND_MSG_PUB.add_exc_msg
5115 ( p_pkg_name => 'PA_FP_GEN_FCST_AMT_PUB'
5116 ,p_procedure_name => 'MAINTAIN_RES_ASG');
5117 IF P_PA_DEBUG_MODE = 'Y' THEN
5118 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
5119 P_MSG => 'Unexpected Error'||substr(sqlerrm, 1, 240),
5120 P_MODULE_NAME => l_module_name,
5121 p_log_level => 5);
5122 PA_DEBUG.Reset_Curr_Function;
5123 END IF;
5124 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5125 END MAINTAIN_RES_ASG;
5126
5127
5128 /**
5129 * This procedure updates pa_budget_lines.other_rejection_code
5130 * for the purpose of signalling ETC revenue amount calculation
5131 * errors. See bug 5203622.
5132 *
5133 * Pre-Conditions:
5134 * 1. At this point, other_rejection_code values should be stored
5135 * in the txn_currency_code column of the pa_fp_calc_amt_tmp2
5136 * table for planning txns with ETC revenue calculation errors.
5137 *
5138 * Note: The etc_currency_code column (not txn_currency_code)
5139 * to store the currency for ETC records in pa_fp_calc_amt_tmp2.
5140 *
5141 * Also worth noting is that this procedure is package-private.
5142 */
5143 PROCEDURE UPD_REV_CALCULATION_ERR
5144 (P_PROJECT_ID IN PA_PROJECTS_ALL.PROJECT_ID%TYPE,
5145 P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
5146 P_FP_COLS_REC IN PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
5147 P_ETC_START_DATE IN DATE,
5148 P_CALLED_MODE IN VARCHAR2 DEFAULT 'SELF_SERVICE',
5149 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
5150 X_MSG_COUNT OUT NOCOPY NUMBER,
5151 X_MSG_DATA OUT NOCOPY VARCHAR2 )
5152 IS
5153 l_package_name VARCHAR2(30) := 'PA_FP_GEN_FCST_AMT_PUB';
5154 l_procedure_name VARCHAR2(30) := 'UPD_REV_CALCULATION_ERR';
5155 l_module_name VARCHAR2(100);
5156
5157 l_log_level NUMBER := 5;
5158 l_msg_count NUMBER;
5159 l_data VARCHAR2(1000);
5160 l_msg_data VARCHAR2(1000);
5161 l_msg_index_out NUMBER;
5162 BEGIN
5163 l_module_name := 'pa.plsql.' || l_package_name || '.' || l_procedure_name;
5164
5165 x_return_status := FND_API.G_RET_STS_SUCCESS;
5166 x_msg_count := 0;
5167
5168 IF p_pa_debug_mode = 'Y' THEN
5169 PA_DEBUG.SET_CURR_FUNCTION( p_function => l_procedure_name,
5170 p_debug_mode => p_pa_debug_mode );
5171 END IF;
5172
5173 -- Print values of Input Parameters to debug log
5174 IF p_pa_debug_mode = 'Y' THEN
5175 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
5176 ( p_msg => 'Input Parameters for '
5177 || l_module_name || '():',
5178 p_called_mode => p_called_mode,
5179 p_module_name => l_module_name,
5180 p_log_level => l_log_level );
5181 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
5182 ( p_msg => 'P_PROJECT_ID:['||p_project_id||']',
5183 p_called_mode => p_called_mode,
5184 p_module_name => l_module_name,
5185 p_log_level => l_log_level );
5186 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
5187 ( p_msg => 'P_BUDGET_VERSION_ID:['||p_budget_version_id||']',
5188 p_called_mode => p_called_mode,
5189 p_module_name => l_module_name,
5190 p_log_level => l_log_level );
5191 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
5192 ( p_msg => 'P_ETC_START_DATE:['||p_etc_start_date||']',
5193 p_called_mode => p_called_mode,
5194 p_module_name => l_module_name,
5195 p_log_level => l_log_level );
5196 END IF; -- IF p_pa_debug_mode = 'Y' THEN
5197
5198 -- Validate input parameters
5199 IF p_project_id is NULL OR
5200 p_budget_version_id is NULL OR
5201 p_etc_start_date is NULL THEN
5202 IF p_pa_debug_mode = 'Y' THEN
5203 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
5204 ( p_msg => 'Input Parameter Validation FAILED',
5205 p_called_mode => p_called_mode,
5206 p_module_name => l_module_name,
5207 p_log_level => l_log_level );
5208 PA_DEBUG.RESET_CURR_FUNCTION;
5209 END IF;
5210 RETURN;
5211 END IF;
5212
5213 -- Update pa_budget_lines with any other_rejection_codes stored
5214 -- in the txn_currency_code column of the task level selection
5215 -- forecast generation processing table pa_fp_calc_amt_tmp2.
5216
5217 UPDATE pa_budget_lines bl
5218 SET bl.other_rejection_code =
5219 ( SELECT tmp2.txn_currency_code
5220 FROM pa_fp_calc_amt_tmp2 tmp2
5221 WHERE tmp2.transaction_source_code = 'ETC'
5222 AND tmp2.txn_currency_code is not null
5223 AND bl.resource_assignment_id = tmp2.target_res_asg_id
5224 AND bl.txn_currency_code = tmp2.etc_currency_code )
5225 WHERE bl.budget_version_id = p_budget_version_id
5226 AND nvl(bl.quantity,0) <> nvl(bl.init_quantity,0) -- ETC lines only
5227 AND EXISTS
5228 ( SELECT null
5229 FROM pa_fp_calc_amt_tmp2 tmp2
5230 WHERE tmp2.transaction_source_code = 'ETC'
5231 AND tmp2.txn_currency_code is not null
5232 AND bl.resource_assignment_id = tmp2.target_res_asg_id
5233 AND bl.txn_currency_code = tmp2.etc_currency_code );
5234
5235 IF p_pa_debug_mode = 'Y' THEN
5236 PA_DEBUG.RESET_CURR_FUNCTION;
5237 END IF;
5238 EXCEPTION
5239 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
5240 l_msg_count := FND_MSG_PUB.count_msg;
5241 IF l_msg_count = 1 THEN
5242 PA_INTERFACE_UTILS_PUB.GET_MESSAGES
5243 ( p_encoded => FND_API.G_TRUE,
5244 p_msg_index => 1,
5245 p_msg_count => l_msg_count,
5246 p_msg_data => l_msg_data,
5247 p_data => l_data,
5248 p_msg_index_out => l_msg_index_out);
5249 x_msg_data := l_data;
5250 x_msg_count := l_msg_count;
5251 ELSE
5252 x_msg_count := l_msg_count;
5253 END IF;
5254
5255 ROLLBACK;
5256 x_return_status := FND_API.G_RET_STS_ERROR;
5257
5258 IF p_pa_debug_mode = 'Y' THEN
5259 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
5260 (p_msg => 'Invalid Arguments Passed',
5261 p_module_name => l_module_name,
5262 p_log_level => 5);
5263 PA_DEBUG.RESET_CURR_FUNCTION;
5264 END IF;
5265 RAISE;
5266 WHEN OTHERS THEN
5267 ROLLBACK;
5268 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5269 x_msg_count := 1;
5270 x_msg_data := substr(sqlerrm,1,240);
5271 FND_MSG_PUB.ADD_EXC_MSG
5272 ( p_pkg_name => l_package_name,
5273 p_procedure_name => l_procedure_name,
5274 p_error_text => substr(sqlerrm,1,240));
5275
5276 IF p_pa_debug_mode = 'Y' THEN
5277 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
5278 (p_msg => 'Unexpected Error'||substr(sqlerrm, 1, 240),
5279 p_module_name => l_module_name,
5280 p_log_level => 5);
5281 PA_DEBUG.RESET_CURR_FUNCTION;
5282 END IF;
5283 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5284
5285 END UPD_REV_CALCULATION_ERR;
5286
5287
5288 END PA_FP_GEN_FCST_AMT_PUB;