[Home] [Help]
PACKAGE BODY: APPS.PA_FP_GEN_BUDGET_AMT_PUB
Source
1 PACKAGE body PA_FP_GEN_BUDGET_AMT_PUB as
2 /* $Header: PAFPGAMB.pls 120.20 2007/11/28 07:46:11 vgovvala ship $ */
3
4 P_PA_DEBUG_MODE varchar2(1) := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
5
6 /**
7 * Wrapper API
8 *
9 * 23-MAY-05 dkuo Added parameters P_CHECK_SRC_ERRORS, X_WARNING_MESSAGE.
10 * Please check body of VALIDATE_SUPPORT_CASES in PAFPGAUB.pls
11 * for list of valid parameter values.
12 **/
13 PROCEDURE GENERATE_BUDGET_AMT_WRP
14 (P_PROJECT_ID IN pa_projects_all.PROJECT_ID%TYPE,
15 P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
16 P_CALLED_MODE IN VARCHAR2,
17 P_COMMIT_FLAG IN VARCHAR2,
18 P_INIT_MSG_FLAG IN VARCHAR2,
19 P_CHECK_SRC_ERRORS_FLAG IN VARCHAR2,
20 X_WARNING_MESSAGE OUT NOCOPY VARCHAR2,
21 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
22 X_MSG_COUNT OUT NOCOPY NUMBER,
23 X_MSG_DATA OUT NOCOPY VARCHAR2) IS
24
25 l_module_name VARCHAR2(200) := 'pa.plsql.PA_FP_GEN_BUDGET_AMT_PUB.GENERATE_BUDGET_AMT_WRP';
26
27 l_cost_version_id PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE;
28 l_ci_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
29 l_gen_res_asg_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
30 l_deleted_res_asg_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
31 l_commit_flag VARCHAR2(1);
32 l_init_msg_flag VARCHAR2(1);
33 l_ret_status VARCHAR2(100);
34 l_msg_count NUMBER;
35 l_msg_data VARCHAR2(2000);
36 l_data VARCHAR2(2000);
37 l_msg_index_out NUMBER:=0;
38
39 l_fp_cols_rec PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
40 l_rev_gen_method VARCHAR2(3);
41
42 -- Bug Fix: 4569365. Removed MRC code.
43 -- g_mrc_exception EXCEPTION;
44
45 l_wp_track_cost_flag VARCHAR2(1);
46
47 l_source_bv_id PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE;
48
49 l_record_version_number PA_BUDGET_VERSIONS.RECORD_VERSION_NUMBER%TYPE;
50
51 l_res_as_id PA_PLSQL_DATATYPES.IdTabTyp; /* Bug 4160375 */
52 BEGIN
53 --hr_utility.trace_on(null,'mftest');
54 --hr_utility.trace('---BEGIN---');
55
56 --Setting initial values
57 IF p_init_msg_flag = 'Y' THEN
58 FND_MSG_PUB.initialize;
59 END IF;
60
61 X_MSG_COUNT := 0;
62 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
63
64 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
65 PA_DEBUG.init_err_stack('PA_FP_GEN_BUDGET_AMT_PUB.GENERATE_BUDGET_AMT_WRP');
66 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
67 pa_debug.set_curr_function( p_function => 'GENERATE_BUDGET_AMT_WRP'
68 ,p_debug_mode => p_pa_debug_mode);
69 END IF;
70
71 --Calling the get_plan_version_dtls api
72 IF p_pa_debug_mode = 'Y' THEN
73 pa_fp_gen_amount_utils.fp_debug
74 (p_called_mode => p_called_mode,
75 p_msg => 'Before calling
76 pa_fp_gen_amount_utils.get_plan_version_dtls',
77 p_module_name => l_module_name,
78 p_log_level => 5);
79 END IF;
80 PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS
81 (P_PROJECT_ID => P_PROJECT_ID,
82 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
83 X_FP_COLS_REC => l_fp_cols_rec,
84 X_RETURN_STATUS => X_RETURN_STATUS,
85 X_MSG_COUNT => X_MSG_COUNT,
86 X_MSG_DATA => X_MSG_DATA);
87 IF p_pa_debug_mode = 'Y' THEN
88 pa_fp_gen_amount_utils.fp_debug
89 (p_called_mode => p_called_mode,
90 p_msg => 'Status after calling
91 pa_fp_gen_amount_utils.get_plan_version_dtls: '
92 ||x_return_status,
93 p_module_name => l_module_name,
94 p_log_level => 5);
95 END IF;
96 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
97 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
98 END IF;
99
100 /* This API validates that the current generation is supported.
101 * For a list of unsupported cases, please see comments at the
102 * beginning of the VALIDATE_SUPPORT_CASES API (PAFPGAUB.pls) */
103
104 IF p_pa_debug_mode = 'Y' THEN
105 pa_fp_gen_amount_utils.fp_debug
106 ( p_msg => 'Before calling
107 pa_fp_gen_amount_utils.validate_support_cases',
108 p_module_name => l_module_name,
109 p_log_level => 5 );
110 END IF;
111
112 PA_FP_GEN_AMOUNT_UTILS.VALIDATE_SUPPORT_CASES (
113 P_FP_COLS_REC_TGT => l_fp_cols_rec,
114 P_CHECK_SRC_ERRORS_FLAG => P_CHECK_SRC_ERRORS_FLAG,
115 P_CALLING_CONTEXT => P_CALLED_MODE, /* Added for ER 4391321 */
116 X_WARNING_MESSAGE => X_WARNING_MESSAGE,
117 X_RETURN_STATUS => X_RETURN_STATUS,
118 X_MSG_COUNT => X_MSG_COUNT,
119 X_MSG_DATA => X_MSG_DATA );
120
121 IF p_pa_debug_mode = 'Y' THEN
122 pa_fp_gen_amount_utils.fp_debug
123 ( p_msg => 'Status after calling
124 pa_fp_gen_amount_utils.validate_support_cases: '
125 ||x_return_status,
126 p_module_name => l_module_name,
127 p_log_level => 5 );
128 END IF;
129 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
130 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
131 END IF;
132
133 /* When VALIDATE_SUPPORT_CASES returns a non-null warning message,
134 * we need to Return control to the page/front-end so that a warning
135 * can be displayed asking the user whether or not to proceed.
136 */
137 IF X_WARNING_MESSAGE IS NOT NULL THEN
138 -- Before returning, we always have the following check.
139 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
140 PA_DEBUG.reset_err_stack;
141 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
142 PA_DEBUG.Reset_Curr_Function;
143 END IF;
144
145 RETURN;
146 END IF;
147
148 --acquire version lock
149
150 SELECT record_version_number
151 INTO l_record_version_number
152 FROM pa_budget_versions
153 WHERE budget_version_id = p_budget_version_id;
154 IF p_pa_debug_mode = 'Y' THEN
155 pa_fp_gen_amount_utils.fp_debug
156 (p_called_mode => p_called_mode,
157 p_msg => 'Before calling pa_fin_plan_pvt.lock_unlock_version',
158 p_module_name => l_module_name,
159 p_log_level => 5);
160 END IF;
161 pa_fin_plan_pvt.lock_unlock_version
162 (p_budget_version_id => P_BUDGET_VERSION_ID,
163 p_record_version_number => l_record_version_number,
164 p_action => 'L',
165 p_user_id => FND_GLOBAL.USER_ID,
166 p_person_id => NULL,
167 x_return_status => x_return_status,
168 x_msg_count => x_msg_count,
169 x_msg_data => x_msg_data);
170 IF p_pa_debug_mode = 'Y' THEN
171 pa_fp_gen_amount_utils.fp_debug
172 (p_called_mode => p_called_mode,
173 p_msg => 'Status after calling pa_fin_plan_pvt.lock_unlock_version:'
174 ||x_return_status,
175 p_module_name => l_module_name,
176 p_log_level => 5);
177 END IF;
178 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
179 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
180 PA_DEBUG.reset_err_stack;
181 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
182 PA_DEBUG.Reset_Curr_Function;
183 END IF;
184 RETURN;
185 END IF;
186
187 COMMIT;
188
189 /* we need to commit the changes so that the locked by person info
190 will be available for other sessions. */
191
192 /* This API returns generic error message that
193 can be used for any other process for
194 locking the main budget table */
195
196 --Calling the acquire_locks_for_copy_actual api
197 IF p_pa_debug_mode = 'Y' THEN
198 pa_fp_gen_amount_utils.fp_debug
199 (p_called_mode => p_called_mode,
200 p_msg => 'Before calling
201 pa_fp_copy_from_pkg.acquire_locks_for_copy_actual',
202 p_module_name => l_module_name,
203 p_log_level => 5);
204 END IF;
205 PA_FP_COPY_FROM_PKG.ACQUIRE_LOCKS_FOR_COPY_ACTUAL
206 (P_PLAN_VERSION_ID => P_BUDGET_VERSION_ID,
207 X_RETURN_STATUS => X_RETURN_STATUS,
208 X_MSG_COUNT => X_MSG_COUNT,
209 X_MSG_DATA => X_MSG_DATA);
210 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
211 --If we can't acquire lock, customized message is thrown from within
212 -- the API, so we should suppress exception error.
213 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
214 PA_DEBUG.reset_err_stack;
215 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
216 PA_DEBUG.Reset_Curr_Function;
217 END IF;
218 RETURN;
219 END IF;
220 IF p_pa_debug_mode = 'Y' THEN
221 pa_fp_gen_amount_utils.fp_debug
222 (p_called_mode => p_called_mode,
223 p_msg => 'Status after calling
224 pa_fp_copy_from_pkg.acquire_locks_for_copy_actual: '
225 ||x_return_status,
226 p_module_name => l_module_name,
227 p_log_level => 5);
228 END IF;
229
230 /* Records are deleted from pa_budget_lines and PA_RESOURCE_ASSIGNMENTS
231 tables when the flag is set to N */
232 IF l_fp_cols_rec.x_gen_ret_manual_line_flag = 'N' THEN
233 DELETE FROM PA_BUDGET_LINES
234 WHERE budget_version_id = p_budget_version_id ;
235
236 DELETE FROM PA_RESOURCE_ASSIGNMENTS
237 WHERE budget_version_id = p_budget_version_id ;
238
239 -- IPM: New Entity ER ------------------------------------------
240 -- Call the maintenance api in DELETE mode
241 IF p_pa_debug_mode = 'Y' THEN
242 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
243 ( P_MSG => 'Before calling PA_RES_ASG_CURRENCY_PUB.'
244 || 'MAINTAIN_DATA',
245 P_CALLED_MODE => p_called_mode,
246 P_MODULE_NAME => l_module_name,
247 P_LOG_LEVEL => 5 );
248 END IF;
249 PA_RES_ASG_CURRENCY_PUB.MAINTAIN_DATA
250 ( P_FP_COLS_REC => l_fp_cols_rec,
251 P_CALLING_MODULE => 'BUDGET_GENERATION',
252 P_DELETE_FLAG => 'Y',
253 P_VERSION_LEVEL_FLAG => 'Y',
254 P_CALLED_MODE => p_called_mode,
255 X_RETURN_STATUS => x_return_status,
256 X_MSG_COUNT => x_msg_count,
257 X_MSG_DATA => x_msg_data );
258 IF p_pa_debug_mode = 'Y' THEN
259 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
260 ( P_MSG => 'After calling PA_RES_ASG_CURRENCY_PUB.'
261 || 'MAINTAIN_DATA: ' || x_return_status,
262 P_CALLED_MODE => p_called_mode,
263 P_MODULE_NAME => l_module_name,
264 P_LOG_LEVEL => 5 );
265 END IF;
266 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
267 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
268 END IF;
269 -- END OF IPM: New Entity ER ------------------------------------------
270
271 ELSIF l_fp_cols_rec.x_gen_ret_manual_line_flag = 'Y' THEN
272 -- Bug 4344111: We should delete budget lines for all resources with
273 -- non-null transaction source code and then null-out the transaction
274 -- source code for these resources. Moved the logic for Bug 4160375
275 -- from right before Commitments are processed to this location, and
276 -- modified the SELECT statement's WHERE clause to check that the
277 -- transaction_source_code IS NOT NULL (which includes the previous
278 -- check that transaction_source_code was either Open Commitments,
279 -- Billing Events, or Change Documents).
280
281 /* Bug 4160375 Fixed the problem of Comm. getting incremented on every round of budget generation */
282
283 SELECT resource_assignment_id
284 BULK COLLECT INTO
285 l_res_as_id
286 FROM PA_RESOURCE_ASSIGNMENTS
287 WHERE budget_version_id = p_budget_version_id AND
288 transaction_source_code IS NOT NULL;
289
290 IF (l_res_as_id.count > 0) THEN
291 FORALL i IN 1 .. l_res_as_id.count
292 DELETE FROM PA_BUDGET_LINES
293 WHERE resource_assignment_id = l_res_as_id(i);
294
295 FORALL j IN 1 .. l_res_as_id.count
296 UPDATE PA_RESOURCE_ASSIGNMENTS
297 SET transaction_source_code = null
298 WHERE resource_assignment_id = l_res_as_id(j);
299
300 -- IPM: New Entity ER ------------------------------------------
301 DELETE pa_resource_asgn_curr_tmp;
302
303 FORALL k IN 1..l_res_as_id.count
304 INSERT INTO pa_resource_asgn_curr_tmp (
305 RESOURCE_ASSIGNMENT_ID,
306 DELETE_FLAG )
307 VALUES (
308 l_res_as_id(k),
309 'Y' );
310
311 -- Call the maintenance api in DELETE mode
312 IF p_pa_debug_mode = 'Y' THEN
313 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
314 ( P_MSG => 'Before calling PA_RES_ASG_CURRENCY_PUB.'
315 || 'MAINTAIN_DATA',
316 P_CALLED_MODE => p_called_mode,
317 P_MODULE_NAME => l_module_name,
318 P_LOG_LEVEL => 5 );
319 END IF;
320 PA_RES_ASG_CURRENCY_PUB.MAINTAIN_DATA
321 ( P_FP_COLS_REC => l_fp_cols_rec,
322 P_CALLING_MODULE => 'BUDGET_GENERATION',
323 P_DELETE_FLAG => 'Y',
324 P_VERSION_LEVEL_FLAG => 'N',
325 P_CALLED_MODE => p_called_mode,
326 X_RETURN_STATUS => x_return_status,
327 X_MSG_COUNT => x_msg_count,
328 X_MSG_DATA => x_msg_data );
329 IF p_pa_debug_mode = 'Y' THEN
330 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
331 ( P_MSG => 'After calling PA_RES_ASG_CURRENCY_PUB.'
332 || 'MAINTAIN_DATA: ' || x_return_status,
333 P_CALLED_MODE => p_called_mode,
334 P_MODULE_NAME => l_module_name,
335 P_LOG_LEVEL => 5 );
336 END IF;
337 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
338 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
339 END IF;
340 -- END OF IPM: New Entity ER ------------------------------------------
341
342 END IF;
343 END IF; -- Manual lines logic
344
345 --l_rev_gen_method := PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(p_project_id);
346 l_rev_gen_method := nvl(l_fp_cols_rec.x_revenue_derivation_method,PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(p_project_id)); --Bug 5462471
347 /* Checking for the planning level and calling appropriate API */
348 IF l_fp_cols_rec.x_gen_src_code = 'RESOURCE_SCHEDULE' THEN
349 IF l_fp_cols_rec.x_version_type = 'REVENUE'
350 AND l_rev_gen_method = 'C' THEN
351 IF p_pa_debug_mode = 'Y' THEN
352 pa_fp_gen_amount_utils.fp_debug
353 (p_called_mode => p_called_mode,
354 p_msg => 'Before calling
355 pa_fp_gen_budget_amt_pub.gen_rev_bdgt_amt_res_sch_wrp',
356 p_module_name => l_module_name,
357 p_log_level => 5);
358 END IF;
359 --hr_utility.trace('before PA_FP_GEN_BUDGET_AMT_PUB.GEN_REV_BDGT_AMT_RES_SCH_WRP');
360 PA_FP_GEN_BUDGET_AMT_PUB.GEN_REV_BDGT_AMT_RES_SCH_WRP
361 (P_PROJECT_ID => P_PROJECT_ID,
362 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
363 P_FP_COLS_REC => l_fp_cols_rec,
364 P_PLAN_CLASS_CODE => l_fp_cols_rec.x_plan_class_code,
365 P_GEN_SRC_CODE => l_fp_cols_rec.x_gen_src_code,
366 P_COST_PLAN_TYPE_ID => l_fp_cols_rec.x_gen_src_plan_type_id,
367 p_COST_VERSION_ID => l_cost_version_id,
368 P_RETAIN_MANUAL_FLAG => l_fp_cols_rec.x_gen_ret_manual_line_flag,
369 P_CALLED_MODE => 'SELF_SERVICE',
370 P_INC_CHG_DOC_FLAG => l_fp_cols_rec.x_gen_incl_change_doc_flag,
371 P_INC_BILL_EVENT_FLAG => l_fp_cols_rec.x_gen_incl_bill_event_flag,
372 P_INC_OPEN_COMMIT_FLAG => l_fp_cols_rec.x_gen_incl_open_comm_flag,
373 P_ACTUALS_THRU_DATE => NULL,
374 P_CI_ID_TAB => l_ci_id_tab,
375 PX_GEN_RES_ASG_ID_TAB => l_gen_res_asg_id_tab,
376 PX_DELETED_RES_ASG_ID_TAB => l_deleted_res_asg_id_tab,
377 P_COMMIT_FLAG => P_COMMIT_FLAG,
378 P_INIT_MSG_FLAG => P_INIT_MSG_FLAG,
379 X_RETURN_STATUS => X_RETURN_STATUS,
380 X_MSG_COUNT => X_MSG_COUNT,
381 X_MSG_DATA => X_MSG_DATA);
382
383 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
384 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
385 END IF;
386 IF p_pa_debug_mode = 'Y' THEN
387 pa_fp_gen_amount_utils.fp_debug
388 (p_called_mode => p_called_mode,
389 p_msg => 'Status after calling pa_fp_gen_budget_amt_pub.'||
390 'gen_rev_bdgt_amt_res_sch_wrp:'||x_return_status,
391 p_module_name => l_module_name,
392 p_log_level => 5);
393 END IF;
394 ELSE
395 /* Calling Resource Schedule API */
396 IF p_pa_debug_mode = 'Y' THEN
397 pa_fp_gen_amount_utils.fp_debug
398 (p_called_mode => p_called_mode,
399 p_msg => 'Before calling
400 pa_fp_gen_budget_amt_pub.generate_budget_amt_res_sch',
401 p_module_name => l_module_name,
402 p_log_level => 5);
403 END IF;
404 --hr_utility.trace('before PA_FP_GEN_BUDGET_AMT_PUB.GENERATE_BUDGET_AMT_RES_SCH');
405 PA_FP_GEN_BUDGET_AMT_PUB.GENERATE_BUDGET_AMT_RES_SCH
406 (P_PROJECT_ID => P_PROJECT_ID,
407 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
408 P_FP_COLS_REC => l_fp_cols_rec,
409 P_PLAN_CLASS_CODE => l_fp_cols_rec.x_plan_class_code,
410 P_GEN_SRC_CODE => l_fp_cols_rec.x_gen_src_code,
411 P_COST_PLAN_TYPE_ID => l_fp_cols_rec.x_gen_src_plan_type_id,
412 p_COST_VERSION_ID => l_cost_version_id,
413 P_RETAIN_MANUAL_FLAG => l_fp_cols_rec.x_gen_ret_manual_line_flag,
414 P_CALLED_MODE => 'SELF_SERVICE',
415 P_INC_CHG_DOC_FLAG => l_fp_cols_rec.x_gen_incl_change_doc_flag,
416 P_INC_BILL_EVENT_FLAG => l_fp_cols_rec.x_gen_incl_bill_event_flag,
417 P_INC_OPEN_COMMIT_FLAG => l_fp_cols_rec.x_gen_incl_open_comm_flag,
418 P_CI_ID_TAB => l_ci_id_tab,
419 PX_GEN_RES_ASG_ID_TAB => l_gen_res_asg_id_tab,
420 PX_DELETED_RES_ASG_ID_TAB => l_deleted_res_asg_id_tab,
421 P_COMMIT_FLAG => P_COMMIT_FLAG,
422 P_INIT_MSG_FLAG => P_INIT_MSG_FLAG,
423 X_RETURN_STATUS => X_RETURN_STATUS,
424 X_MSG_COUNT => X_MSG_COUNT,
425 X_MSG_DATA => X_MSG_DATA);
426 --dbms_output.put_line('after PA_FP_GEN_BUDGET_AMT_PUB.GENERATE_BUDGET_AMT_RES_SCH:'||x_return_status);
427 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
428 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
429 END IF;
430 IF p_pa_debug_mode = 'Y' THEN
431 pa_fp_gen_amount_utils.fp_debug
432 (p_called_mode => p_called_mode,
433 p_msg => 'Status after calling
434 pa_fp_gen_budget_amt_pub.generate_budget_amt_res_sch: '
435 ||x_return_status,
436 p_module_name => l_module_name,
437 p_log_level => 5);
438 END IF;
439 END IF;
440 ELSIF l_fp_cols_rec.x_gen_src_code = 'WORKPLAN_RESOURCES'
441 OR l_fp_cols_rec.x_gen_src_code = 'FINANCIAL_PLAN' THEN
442 /* Calling Work Plan API */
443 l_wp_track_cost_flag := Pa_Fp_wp_gen_amt_utils.get_wp_track_cost_amt_flag (p_project_id);
444 IF l_fp_cols_rec.x_version_type = 'REVENUE'
445 AND l_rev_gen_method = 'C'
446 AND l_wp_track_cost_flag <> 'Y' THEN
447 IF p_pa_debug_mode = 'Y' THEN
448 pa_fp_gen_amount_utils.fp_debug
449 (p_called_mode => p_called_mode,
450 p_msg => 'Before calling
451 pa_fp_wp_gen_budget_amt_pub.generate_wp_budget_amt',
452 p_module_name => l_module_name,
453 p_log_level => 5);
454 END IF;
455 PA_FP_GEN_BUDGET_AMT_PUB.GEN_WP_REV_BDGT_AMT_WRP
456 (P_PROJECT_ID => P_PROJECT_ID,
457 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
458 P_PLAN_CLASS_CODE => l_fp_cols_rec.x_plan_class_code,
459 P_GEN_SRC_CODE => l_fp_cols_rec.x_gen_src_code,
460 P_COST_PLAN_TYPE_ID => l_fp_cols_rec.x_gen_src_plan_type_id,
461 P_COST_VERSION_ID => l_cost_version_id,
462 P_RETAIN_MANUAL_FLAG => l_fp_cols_rec.x_gen_ret_manual_line_flag,
463 P_CALLED_MODE => 'SELF_SERVICE',
464 P_INC_CHG_DOC_FLAG => l_fp_cols_rec.x_gen_incl_change_doc_flag,
465 P_INC_BILL_EVENT_FLAG => l_fp_cols_rec.x_gen_incl_bill_event_flag,
466 P_INC_OPEN_COMMIT_FLAG => l_fp_cols_rec.x_gen_incl_open_comm_flag,
467 P_CI_ID_TAB => l_ci_id_tab,
468 PX_GEN_RES_ASG_ID_TAB => l_gen_res_asg_id_tab,
469 PX_DELETED_RES_ASG_ID_TAB => l_deleted_res_asg_id_tab,
470 P_INIT_MSG_FLAG => P_INIT_MSG_FLAG,
471 P_COMMIT_FLAG => P_COMMIT_FLAG,
472 X_RETURN_STATUS => X_RETURN_STATUS,
473 X_MSG_COUNT => X_MSG_COUNT,
474 X_MSG_DATA => X_MSG_DATA);
475 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
476 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
477 END IF;
478 IF p_pa_debug_mode = 'Y' THEN
479 pa_fp_gen_amount_utils.fp_debug
480 (p_called_mode => p_called_mode,
481 p_msg => 'Status after calling
482 pa_fp_wp_gen_budget_amt_pub.generate_wp_budget_amt: '
483 ||x_return_status,
484 p_module_name => l_module_name,
485 p_log_level => 5);
486 END IF;
487 ELSE
488 IF p_pa_debug_mode = 'Y' THEN
489 pa_fp_gen_amount_utils.fp_debug
490 (p_called_mode => p_called_mode,
491 p_msg => 'Before calling
492 pa_fp_wp_gen_budget_amt_pub.generate_wp_budget_amt',
493 p_module_name => l_module_name,
494 p_log_level => 5);
495 END IF;
496 PA_FP_WP_GEN_BUDGET_AMT_PUB.GENERATE_WP_BUDGET_AMT
497 (P_PROJECT_ID => P_PROJECT_ID,
498 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
499 P_PLAN_CLASS_CODE => l_fp_cols_rec.x_plan_class_code,
500 P_GEN_SRC_CODE => l_fp_cols_rec.x_gen_src_code,
501 P_COST_PLAN_TYPE_ID => l_fp_cols_rec.x_gen_src_plan_type_id,
502 P_COST_VERSION_ID => l_cost_version_id,
503 P_RETAIN_MANUAL_FLAG => l_fp_cols_rec.x_gen_ret_manual_line_flag,
504 P_CALLED_MODE => 'SELF_SERVICE',
505 P_INC_CHG_DOC_FLAG => l_fp_cols_rec.x_gen_incl_change_doc_flag,
506 P_INC_BILL_EVENT_FLAG => l_fp_cols_rec.x_gen_incl_bill_event_flag,
507 P_INC_OPEN_COMMIT_FLAG => l_fp_cols_rec.x_gen_incl_open_comm_flag,
508 P_CI_ID_TAB => l_ci_id_tab,
509 PX_GEN_RES_ASG_ID_TAB => l_gen_res_asg_id_tab,
510 PX_DELETED_RES_ASG_ID_TAB => l_deleted_res_asg_id_tab,
511 P_INIT_MSG_FLAG => P_INIT_MSG_FLAG,
512 P_COMMIT_FLAG => P_COMMIT_FLAG,
513 X_RETURN_STATUS => X_RETURN_STATUS,
514 X_MSG_COUNT => X_MSG_COUNT,
515 X_MSG_DATA => X_MSG_DATA);
516
517 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
518 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
519 END IF;
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 => 'Status after calling
524 pa_fp_wp_gen_budget_amt_pub.generate_wp_budget_amt: '
525 ||x_return_status,
526 p_module_name => l_module_name,
527 p_log_level => 5);
528 END IF;
529 END IF;
530 END IF;
531
532 IF l_fp_cols_rec.x_gen_incl_open_comm_flag = 'Y' THEN
533 /* Calling Commitment API*/
534 IF p_pa_debug_mode = 'Y' THEN
535 pa_fp_gen_amount_utils.fp_debug
536 (p_called_mode => p_called_mode,
537 p_msg => 'Before calling
538 pa_fp_gen_commitment_amounts.gen_commitment_amounts',
539 p_module_name => l_module_name,
540 p_log_level => 5);
541 END IF;
542 PA_FP_GEN_COMMITMENT_AMOUNTS.GEN_COMMITMENT_AMOUNTS
543 (P_PROJECT_ID => P_PROJECT_ID,
544 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
545 P_FP_COLS_REC => l_fp_cols_rec,
546 PX_GEN_RES_ASG_ID_TAB => l_gen_res_asg_id_tab,
547 PX_DELETED_RES_ASG_ID_TAB => l_deleted_res_asg_id_tab,
548 X_RETURN_STATUS => X_RETURN_STATUS,
549 X_MSG_COUNT => X_MSG_COUNT,
550 X_MSG_DATA => X_MSG_DATA);
551
552 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
553 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
554 END IF;
555 IF p_pa_debug_mode = 'Y' THEN
556 pa_fp_gen_amount_utils.fp_debug
557 (p_called_mode => p_called_mode,
558 p_msg =>'Status after calling
559 pa_fp_gen_commitment_amounts.gen_commitment_amounts: '
560 ||x_return_status,
561 p_module_name => l_module_name,
562 p_log_level => 5);
563 END IF;
564 END IF;
565
566 IF l_fp_cols_rec.x_gen_src_plan_version_id IS NOT NULL THEN
567 l_source_bv_id := l_fp_cols_rec.x_gen_src_plan_version_id;
568 ELSE
569 SELECT
570 DECODE(bv.version_type,
571 'COST', opt.gen_src_cost_plan_version_id,
572 'REVENUE',opt.gen_src_rev_plan_version_id,
573 'ALL',opt.gen_src_all_plan_version_id)
574 INTO l_source_bv_id
575 FROM pa_proj_fp_options opt, pa_budget_versions bv
576 WHERE bv.budget_version_id = opt.fin_plan_version_id
577 AND bv.budget_version_id = p_budget_version_id ;
578 END IF;
579
580 IF (l_fp_cols_rec.x_version_type = 'ALL'
581 OR l_fp_cols_rec.x_version_type = 'REVENUE')
582 AND l_rev_gen_method = 'C' THEN
583
584 -- Bug 4549862: When generating a Cost and Revenue together version
585 -- from Staffing Plan with revenue accrual method of COST, the
586 -- currency conversion step is performed on the PA_FP_ROLLUP_TMP
587 -- table (instead of pa_budget_lines) earlier in the code flow by the
588 -- GENERATE_BUDGET_AMT_RES_SCH API so that pc/pfc Commitment amounts
589 -- can be honored. We should not call the currency conversion API in
590 -- this case.
591
592 IF l_fp_cols_rec.x_version_type = 'ALL' AND
593 l_fp_cols_rec.x_gen_src_code <> 'RESOURCE_SCHEDULE' THEN
594 /* Calling the currency conversion API*/
595 IF p_pa_debug_mode = 'Y' THEN
596 pa_fp_gen_amount_utils.fp_debug
597 (p_called_mode => p_called_mode,
598 p_msg => 'Before calling
599 pa_fp_multi_currency_pkg.convert_txn_currency',
600 p_module_name => l_module_name,
601 p_log_level => 5);
602 END IF;
603 PA_FP_MULTI_CURRENCY_PKG.CONVERT_TXN_CURRENCY
604 (p_budget_version_id => P_BUDGET_VERSION_ID,
605 p_entire_version => 'Y',
606 p_calling_module => 'BUDGET_GENERATION', -- Added for Bug#5395732
607 X_RETURN_STATUS => X_RETURN_STATUS,
608 X_MSG_COUNT => X_MSG_COUNT,
609 X_MSG_DATA => X_MSG_DATA);
610 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
611 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
612 END IF;
613 IF p_pa_debug_mode = 'Y' THEN
614 pa_fp_gen_amount_utils.fp_debug
615 (p_called_mode => p_called_mode,
616 p_msg => 'Status after calling
617 pa_fp_multi_currency_pkg.convert_txn_currency: '
618 ||x_return_status,
619 p_module_name => l_module_name,
620 p_log_level => 5);
621 END IF;
622 END IF;
623
624 -- Bug 4549862: Removed ROLLUP_BUDGET_VERSION API call that used
625 -- to be before the GEN_COST_BASED_REVENUE API call. The same API
626 -- call is commented out in GENERATE_FCST_AMT_WRP. The Rollup API
627 -- is called at the end of the generation process in the Maintain
628 -- Budget Version API already. The Cost Based Revenue Generation
629 -- API may have used rolled up amounts in the past, but does not
630 -- currently use them. Lastly, the Change Documents process uses
631 -- rolled up amounts, but the Change Document wrapper API takes
632 -- care of this already.
633
634 /* Calling gen cost based revenue api */
635 IF p_pa_debug_mode = 'Y' THEN
636 pa_fp_gen_amount_utils.fp_debug
637 (p_called_mode => p_called_mode,
638 p_msg => 'Before calling
639 pa_fp_rev_gen_pub.gen_cost_based_revenue',
640 p_module_name => l_module_name,
641 p_log_level => 5);
642 END IF;
643 PA_FP_REV_GEN_PUB.GEN_COST_BASED_REVENUE
644 (P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
645 P_FP_COLS_REC => l_fp_cols_rec,
646 X_RETURN_STATUS => X_RETURN_STATUS,
647 X_MSG_COUNT => X_MSG_COUNT,
648 X_MSG_DATA => X_MSG_DATA);
649 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
650 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
651 END IF;
652 IF p_pa_debug_mode = 'Y' THEN
653 pa_fp_gen_amount_utils.fp_debug
654 (p_called_mode => p_called_mode,
655 p_msg => 'Status after calling
656 pa_fp_rev_gen_pub.gen_cost_based_revenue: '
657 ||x_return_status,
658 p_module_name => l_module_name,
659 p_log_level => 5);
660 END IF;
661 END IF;
662
663 /* Calling include_change_document_wrp api */
664 IF l_fp_cols_rec.x_gen_incl_change_doc_flag = 'Y' THEN
665 IF l_fp_cols_rec.x_gen_src_code = 'FINANCIAL_PLAN' THEN
666 IF p_pa_debug_mode = 'Y' THEN
667 pa_fp_gen_amount_utils.fp_debug
668 (p_called_mode => p_called_mode,
669 p_msg => 'Before calling
670 pa_fp_ci_merge.copy_merged_ctrl_items',
671 p_module_name => l_module_name,
672 p_log_level => 5);
673 END IF;
674 PA_FP_CI_MERGE.copy_merged_ctrl_items
675 (p_project_id => p_project_id
676 ,p_source_version_id => l_source_bv_id
677 ,p_target_version_id => l_fp_cols_rec.x_budget_version_id
678 ,p_calling_context => 'GENERATION' --Bug 4247703
679 ,x_return_status => x_return_status
680 ,x_msg_count => x_msg_count
681 ,x_msg_data => x_msg_data);
682 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
683 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
684 END IF;
685 IF p_pa_debug_mode = 'Y' THEN
686 pa_fp_gen_amount_utils.fp_debug
687 (p_called_mode => p_called_mode,
688 p_msg => 'Status after calling
689 pa_fp_ci_merge.copy_merged_ctrl_items: '
690 ||x_return_status,
691 p_module_name => l_module_name,
692 p_log_level => 5);
693 END IF;
694 END IF;
695
696 IF p_pa_debug_mode = 'Y' THEN
697 pa_fp_gen_amount_utils.fp_debug
698 (p_called_mode => p_called_mode,
699 p_msg => 'Before calling PA_FP_GEN_PUB.include_change_document_wrp',
700 p_module_name => l_module_name,
701 p_log_level => 5);
702 END IF;
703 --dbms_output.put_line('before chg_doc');
704 PA_FP_GEN_PUB.INCLUDE_CHANGE_DOCUMENT_WRP
705 (P_FP_COLS_REC => l_fp_cols_rec,
706 X_RETURN_STATUS => X_RETURN_STATUS,
707 X_MSG_COUNT => X_MSG_COUNT,
708 X_MSG_DATA => X_MSG_DATA);
709 --dbms_output.put_line('after chg_doc:'||x_return_status);
710 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
711 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
712 END IF;
713 IF p_pa_debug_mode = 'Y' THEN
714 pa_fp_gen_amount_utils.fp_debug
715 (p_called_mode => p_called_mode,
716 p_msg => 'Status after calling PA_FP_GEN_PUB.include_change_document_wrp: '
717 ||x_return_status,
718 p_module_name => l_module_name,
719 p_log_level => 5);
720 END IF;
721 END IF;
722
723 /*Only for ALL or Revenue version, revenue generation method can be set
724 and include billing event flag can be chosen. This logic is implemented
725 in both here and UI*/
726 IF (l_fp_cols_rec.x_version_type = 'ALL'
727 OR l_fp_cols_rec.x_version_type = 'REVENUE')
728 AND (l_rev_gen_method = 'E'
729 OR l_fp_cols_rec.x_gen_incl_bill_event_flag = 'Y') THEN
730 /* Calling Billing Events API */
731 IF p_pa_debug_mode = 'Y' THEN
732 pa_fp_gen_amount_utils.fp_debug
733 (p_called_mode => p_called_mode,
734 p_msg => 'Before calling
735 pa_fp_gen_billing_amounts.gen_billing_amounts',
736 p_module_name => l_module_name,
737 p_log_level => 5);
738 END IF;
739 PA_FP_GEN_BILLING_AMOUNTS.GEN_BILLING_AMOUNTS
740 (P_PROJECT_ID => P_PROJECT_ID,
741 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
742 P_FP_COLS_REC => l_fp_cols_rec,
743 PX_GEN_RES_ASG_ID_TAB => l_gen_res_asg_id_tab,
744 PX_DELETED_RES_ASG_ID_TAB => l_deleted_res_asg_id_tab,
745 X_RETURN_STATUS => X_RETURN_STATUS,
746 X_MSG_COUNT => X_MSG_COUNT,
747 X_MSG_DATA => X_MSG_DATA);
748
749 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
750 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
751 END IF;
752 IF p_pa_debug_mode = 'Y' THEN
753 pa_fp_gen_amount_utils.fp_debug
754 (p_called_mode => p_called_mode,
755 p_msg => 'Status after calling
756 pa_fp_gen_billing_amounts.gen_billing_amounts: '
757 ||x_return_status,
758 p_module_name => l_module_name,
759 p_log_level => 5);
760 END IF;
761 END IF;
762
763 IF l_fp_cols_rec.x_version_type = 'REVENUE' THEN
764 IF p_pa_debug_mode = 'Y' THEN
765 pa_fp_gen_amount_utils.fp_debug
766 (p_called_mode => p_called_mode,
767 p_msg => 'Before calling
768 pa_fp_gen_budget_amt_pub.reset_cost_amounts',
769 p_module_name => l_module_name,
770 p_log_level => 5);
771 END IF;
772 PA_FP_GEN_BUDGET_AMT_PUB.RESET_COST_AMOUNTS
773 (P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
774 X_RETURN_STATUS => X_RETURN_STATUS,
775 X_MSG_COUNT => X_MSG_COUNT,
776 X_MSG_DATA => X_MSG_DATA);
777
778 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
779 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
780 END IF;
781 IF p_pa_debug_mode = 'Y' THEN
782 pa_fp_gen_amount_utils.fp_debug
783 (p_called_mode => p_called_mode,
784 p_msg => 'Status after calling
785 pa_fp_gen_budget_amt_pub.reset_cost_amounts: '
786 ||x_return_status,
787 p_module_name => l_module_name,
788 p_log_level => 5);
789 END IF;
790 END IF;
791 IF p_pa_debug_mode = 'Y' THEN
792 pa_fp_gen_amount_utils.fp_debug
793 (p_called_mode => p_called_mode,
794 p_msg => 'Before calling
795 pa_fp_gen_fcst_amt_pub1.maintain_budget_version',
796 p_module_name => l_module_name,
797 p_log_level => 5);
798 END IF;
799 --hr_utility.trace('before pub1.maintain bv');
800 PA_FP_GEN_FCST_AMT_PUB1.MAINTAIN_BUDGET_VERSION
801 (P_PROJECT_ID => P_PROJECT_ID,
802 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
803 X_RETURN_STATUS => X_RETURN_STATUS,
804 X_MSG_COUNT => X_MSG_COUNT,
805 X_MSG_DATA => X_MSG_DATA);
806 --hr_utility.trace('after pub1.maintain bv:'||x_return_status);
807 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
808 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
809 END IF;
810 IF p_pa_debug_mode = 'Y' THEN
811 pa_fp_gen_amount_utils.fp_debug
812 (p_called_mode => p_called_mode,
813 p_msg => 'Status after calling
814 pa_fp_gen_fcst_amt_pub1.maintain_budget_version: '
815 ||x_return_status,
816 p_module_name => l_module_name,
817 p_log_level => 5);
818 END IF;
819
820 IF P_COMMIT_FLAG = 'Y' THEN
821 COMMIT;
822 END IF;
823
824 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
825 PA_DEBUG.reset_err_stack;
826 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
827 PA_DEBUG.Reset_Curr_Function;
828 END IF;
829
830 EXCEPTION
831 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
832 -- Bug Fix: 4569365. Removed MRC code.
833 -- PA_MRC_FINPLAN.G_CALLING_MODULE := Null;
834 l_msg_count := FND_MSG_PUB.count_msg;
835 IF l_msg_count = 1 THEN
836 PA_INTERFACE_UTILS_PUB.get_messages
837 (p_encoded => FND_API.G_TRUE
838 ,p_msg_index => 1
839 ,p_msg_count => l_msg_count
840 ,p_msg_data => l_msg_data
841 ,p_data => l_data
842 ,p_msg_index_out => l_msg_index_out);
843 x_msg_data := l_data;
844 x_msg_count := l_msg_count;
845 ELSE
846 x_msg_count := l_msg_count;
847 END IF;
848 ROLLBACK;
849 x_return_status := FND_API.G_RET_STS_ERROR;
850
851 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
852 PA_DEBUG.reset_err_stack;
853 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
854 PA_DEBUG.Reset_Curr_Function;
855 END IF;
856
857 WHEN OTHERS THEN
858 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
859 x_msg_data := SUBSTR(SQLERRM,1,240);
860 FND_MSG_PUB.add_exc_msg
861 ( p_pkg_name => 'PA_FP_GEN_BUDGET_AMT_PUB'
862 ,p_procedure_name => 'GENERATE_BUDGET_AMT_WRP');
863
864 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
865 PA_DEBUG.reset_err_stack;
866 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
867 PA_DEBUG.Reset_Curr_Function;
868 END IF;
869
870 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
871
872 END GENERATE_BUDGET_AMT_WRP;
873
874 FUNCTION Get_Person_Id(p_res_id NUMBER)
875 RETURN NUMBER IS
876 x_person_id NUMBER;
877
878 BEGIN
879 SELECT person_id INTO x_person_id FROM
880 PA_RESOURCE_TXN_ATTRIBUTES WHERE
881 RESOURCE_ID = p_res_id;
882 RETURN x_person_id;
883 EXCEPTION
884 WHEN NO_DATA_FOUND THEN
885 RETURN NULL;
886 WHEN OTHERS THEN
887 RETURN NULL;
888 END;
889
890 PROCEDURE UPDATE_BUDG_VERSION(p_budget_version_id IN NUMBER ) IS
891 BEGIN
892 UPDATE PA_BUDGET_VERSIONS SET PLAN_PROCESSING_CODE = 'E'
893 WHERE BUDGET_VERSION_ID = p_budget_version_id;
894 COMMIT;
895 END;
896
897 /* Procedure to generate budget amount when
898 planning level is Resource Schedule */
899 PROCEDURE GENERATE_BUDGET_AMT_RES_SCH
900 (P_PROJECT_ID IN PA_PROJECTS_ALL.PROJECT_ID%TYPE,
901 P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
902 P_FP_COLS_REC IN PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
903 P_PLAN_CLASS_CODE IN PA_FIN_PLAN_TYPES_B.PLAN_CLASS_CODE%TYPE,
904 P_GEN_SRC_CODE IN PA_PROJ_FP_OPTIONS.GEN_ALL_SRC_CODE%TYPE,
905 P_COST_PLAN_TYPE_ID IN PA_PROJ_FP_OPTIONS.GEN_SRC_COST_PLAN_TYPE_ID%TYPE,
906 P_COST_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
907 P_RETAIN_MANUAL_FLAG IN PA_PROJ_FP_OPTIONS.GEN_COST_RET_MANUAL_LINE_FLAG%TYPE,
908 P_CALLED_MODE IN VARCHAR2,
909 P_INC_CHG_DOC_FLAG IN PA_PROJ_FP_OPTIONS.GEN_COST_INCL_CHANGE_DOC_FLAG%TYPE,
910 P_INC_BILL_EVENT_FLAG IN PA_PROJ_FP_OPTIONS.GEN_REV_INCL_BILL_EVENT_FLAG%TYPE,
911 P_INC_OPEN_COMMIT_FLAG IN PA_PROJ_FP_OPTIONS.GEN_COST_INCL_OPEN_COMM_FLAG%TYPE,
912 P_ACTUALS_THRU_DATE IN PA_PERIODS_ALL.END_DATE%TYPE,
913 P_CI_ID_TAB IN PA_PLSQL_DATATYPES.IdTabTyp,
914 PX_GEN_RES_ASG_ID_TAB IN OUT NOCOPY PA_PLSQL_DATATYPES.IdTabTyp,
915 --this pl/sql table is used to update the initial res_asg_id from the generated amounts
916 PX_DELETED_RES_ASG_ID_TAB IN OUT NOCOPY PA_PLSQL_DATATYPES.IdTabTyp,
917 --this pl/sql table will have res_asg_id for which manual budget lines are already deleted
918 P_COMMIT_FLAG IN VARCHAR2,
919 P_INIT_MSG_FLAG IN VARCHAR2,
920 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
921 X_MSG_COUNT OUT NOCOPY NUMBER,
922 X_MSG_DATA OUT NOCOPY VARCHAR2) IS
923
924 l_module_name VARCHAR2(200) := 'pa.plsql.PA_FP_GEN_BUDGET_AMT_PUB.GENERATE_BUDGET_AMT_RES_SCH';
925
926 l_budget_line_id PA_BUDGET_LINES.BUDGET_LINE_ID%type;
927
928 CURSOR PROJ_DETAILS IS
929 SELECT P.PROJECT_TYPE,
930 P.PROJECT_CURRENCY_CODE,
931 P.CARRYING_OUT_ORGANIZATION_ID,
932 P.PROJECT_VALUE,
933 P.JOB_BILL_RATE_SCHEDULE_ID,
934 P.EMP_BILL_RATE_SCHEDULE_ID,
935 P.DISTRIBUTION_RULE,
936 P.BILL_JOB_GROUP_ID,
937 NVL(P.ORG_ID,-99),
938 P.COMPLETION_DATE,
939 NVL(P.TEMPLATE_FLAG,'N'),
940 P.PROJFUNC_CURRENCY_CODE,
941 P.PROJFUNC_BIL_RATE_DATE_CODE,
942 P.PROJFUNC_BIL_RATE_TYPE,
943 P.PROJFUNC_BIL_RATE_DATE,
944 P.PROJFUNC_BIL_EXCHANGE_RATE,
945 P.COST_JOB_GROUP_ID,
946 P.PROJECT_RATE_DATE,
947 P.PROJECT_RATE_TYPE,
948 P.PROJECT_BIL_RATE_DATE_CODE,
949 P.PROJECT_BIL_RATE_TYPE,
950 P.PROJECT_BIL_RATE_DATE,
951 P.PROJECT_BIL_EXCHANGE_RATE,
952 P.PROJFUNC_COST_RATE_TYPE,
953 P.PROJFUNC_COST_RATE_DATE,
954 P.LABOR_TP_SCHEDULE_ID,
955 P.LABOR_TP_FIXED_DATE,
956 P.LABOR_SCHEDULE_DISCOUNT,
957 NVL(P.ASSIGN_PRECEDES_TASK,'N'),
958 NVL(P.LABOR_BILL_RATE_ORG_ID,-99),
959 P.LABOR_STD_BILL_RATE_SCHDL,
960 P.LABOR_SCHEDULE_FIXED_DATE,
961 P.LABOR_SCH_TYPE
962 FROM PA_PROJECTS_ALL P
963 WHERE PROJECT_ID = P_PROJECT_ID;
964
965 CURSOR PROJ_ASSIGNMENTS IS
966 SELECT DISTINCT PA.ASSIGNMENT_ID,
967 PA.START_DATE,
968 PA.RESOURCE_ID,
969 PA.PROJECT_ROLE_ID,
970 PA.FCST_JOB_ID,
971 PA.FCST_JOB_GROUP_ID,
972 PR.MEANING,
973 PA.ASSIGNMENT_TYPE ,
974 NVL(PA.EXPENDITURE_ORGANIZATION_ID,
975 NVL(p.CARRYING_OUT_ORGANIZATION_ID,-99))
976 EXPENDITURE_ORGANIZATION_ID,
977 PA.EXPENDITURE_TYPE,
978 PA.REVENUE_BILL_RATE,
979 NVL(PA.EXPENDITURE_ORG_ID,
980 NVL(p.ORG_ID,-99)) EXPENDITURE_ORG_ID,
981 PA.STATUS_CODE,
982 WB.BILLABLE_CAPITALIZABLE_FLAG,
983 'Y' PROCESS_CODE,
984 to_char(null) ERROR_MSG_CODE,
985 PA.END_DATE,
986 RTA.PERSON_ID,
987 PA.ASSIGNMENT_NAME,
988 FI.EXPENDITURE_ORGANIZATION_ID,
989 DECODE(PA.EXPENDITURE_TYPE,null,NULL,'EXPENDITURE_TYPE')
990 FROM PA_PROJECT_ASSIGNMENTS PA,
991 PA_WORK_TYPES_B WB,
992 PA_PROJECT_ROLE_TYPES PR,
993 PA_PROJECTS_ALL P,
994 PA_RESOURCE_TXN_ATTRIBUTES RTA,
995 PA_FORECAST_ITEMS FI
996 WHERE PA.PROJECT_ID = p_project_id
997 AND PA.PROJECT_ROLE_ID = PR.PROJECT_ROLE_ID
998 AND P.PROJECT_ID = p_project_id
999 AND WB.WORK_TYPE_ID = PA.WORK_TYPE_ID(+)
1000 AND PA.RESOURCE_ID = RTA.RESOURCE_ID(+)
1001 AND DECODE(PA.STATUS_CODE,NULL,'Y',
1002 DECODE(PA.ASSIGNMENT_TYPE,
1003 'OPEN_ASSIGNMENT',
1004 PA_ASSIGNMENT_UTILS.Is_Asgmt_In_Open_Status(PA.STATUS_CODE,'OPEN_ASGMT'),
1005 'STAFFED_ASSIGNMENT',
1006 DECODE(PA_ASSIGNMENT_UTILS.Is_Staffed_Asgmt_Cancelled(PA.STATUS_CODE,'STAFFED_ASGMT'),
1007 'Y','N','N','Y'),
1008 'STAFFED_ADMIN_ASSIGNMENT',
1009 DECODE(PA_ASSIGNMENT_UTILS.Is_Staffed_Asgmt_Cancelled(PA.STATUS_CODE,'STAFFED_ASGMT'),
1010 'Y','N','N','Y'))) = 'Y'
1011 AND PA.ASSIGNMENT_ID = FI.ASSIGNMENT_ID
1012 AND FI.DELETE_FLAG = 'N' -- Added for Bug 5029939
1013 AND FI.ERROR_FLAG = 'N'; -- Added for Bug 5029939
1014
1015 /* Bug 5657334: Added org_id join in pa_periods_all to avoid multiple row selection */
1016 CURSOR FCST_PA(p_prj_assignment_id NUMBER, c_act_thru_date DATE, c_exp_organization_id NUMBER, c_org_id NUMBER) IS
1017 SELECT FI.EXPENDITURE_ORG_ID,
1018 FI.EXPENDITURE_ORGANIZATION_ID,
1019 FI.RCVR_PA_PERIOD_NAME,
1020 P.START_DATE,
1021 P.END_DATE,
1022 SUM(FI.ITEM_QUANTITY),
1023 MIN(FI.FORECAST_ITEM_ID)
1024 FROM PA_FORECAST_ITEMS FI,
1025 PA_FORECAST_ITEM_DETAILS FID,
1026 PA_PERIODS_ALL P
1027 WHERE FI.PROJECT_ORG_ID = NVL(P.ORG_ID,-99)
1028 AND P.ORG_ID = c_org_id /* Bug 5657334 */
1029 AND P.PERIOD_NAME = FI.RCVR_PA_PERIOD_NAME
1030 AND FI.FORECAST_ITEM_ID = FID.FORECAST_ITEM_ID
1031 AND FID.FORECAST_SUMMARIZED_CODE = 'N'
1032 AND FID.NET_ZERO_FLAG = 'N'
1033 AND FI.ERROR_FLAG = 'N'
1034 AND FI.DELETE_FLAG = 'N'
1035 AND ASSIGNMENT_ID = p_prj_assignment_id
1036 AND FI.EXPENDITURE_ORG_ID <>-88
1037 AND FI.ITEM_DATE >= NVL(c_act_thru_date+1,FI.ITEM_DATE)
1038 AND FI.EXPENDITURE_ORGANIZATION_ID = c_exp_organization_id
1039 GROUP BY FI.EXPENDITURE_ORG_ID,
1040 FI.EXPENDITURE_ORGANIZATION_ID,
1041 P.START_DATE,
1042 P.END_DATE,
1043 FI.RCVR_PA_PERIOD_NAME;
1044
1045 CURSOR FCST_GL(p_prj_assignment_id NUMBER, c_act_thru_date DATE, c_exp_organization_id NUMBER) IS
1046 SELECT FI.EXPENDITURE_ORG_ID,
1047 FI.EXPENDITURE_ORGANIZATION_ID,
1048 FI.RCVR_GL_PERIOD_NAME,
1049 GLP.START_DATE,
1050 GLP.END_DATE,
1051 SUM(FI.ITEM_QUANTITY),
1052 MIN(FI.FORECAST_ITEM_ID)
1053 FROM PA_FORECAST_ITEMS FI,
1054 PA_FORECAST_ITEM_DETAILS FID,
1055 GL_PERIODS GLP
1056 WHERE FI.FORECAST_ITEM_ID = FID.FORECAST_ITEM_ID
1057 AND FID.FORECAST_SUMMARIZED_CODE = 'N'
1058 AND FID.NET_ZERO_FLAG = 'N'
1059 AND FI.ERROR_FLAG = 'N'
1060 AND FI.DELETE_FLAG = 'N'
1061 AND GLP.PERIOD_SET_NAME = FI.RCVR_PERIOD_SET_NAME
1062 AND GLP.PERIOD_NAME = FI.RCVR_GL_PERIOD_NAME
1063 AND ASSIGNMENT_ID = p_prj_assignment_id
1064 AND FI.EXPENDITURE_ORG_ID <> -88
1065 AND FI.ITEM_DATE >= NVL(c_act_thru_date+1,FI.ITEM_DATE)
1066 AND FI.EXPENDITURE_ORGANIZATION_ID = c_exp_organization_id
1067 GROUP BY FI.EXPENDITURE_ORG_ID,
1068 FI.EXPENDITURE_ORGANIZATION_ID,
1069 GLP.START_DATE,
1070 GLP.END_DATE,
1071 FI.RCVR_GL_PERIOD_NAME;
1072
1073 CURSOR FCST_NONE(p_prj_assignment_id NUMBER, c_act_thru_date DATE, c_exp_organization_id NUMBER) IS
1074 SELECT FI.EXPENDITURE_ORG_ID,
1075 FI.EXPENDITURE_ORGANIZATION_ID,
1076 SUM(FI.ITEM_QUANTITY),
1077 MIN(FI.FORECAST_ITEM_ID),
1078 null period_name,
1079 min(fi.item_Date) start_date,
1080 max(fi.item_Date) end_date -- Bug 4549862: Changed min to max.
1081 FROM PA_FORECAST_ITEMS FI,
1082 PA_FORECAST_ITEM_DETAILS FID
1083 WHERE FI.FORECAST_ITEM_ID = FID.FORECAST_ITEM_ID
1084 AND FID.FORECAST_SUMMARIZED_CODE = 'N'
1085 AND FID.NET_ZERO_FLAG = 'N'
1086 AND FI.ERROR_FLAG = 'N'
1087 AND FI.DELETE_FLAG = 'N'
1088 AND ASSIGNMENT_ID = p_prj_assignment_id
1089 AND FI.EXPENDITURE_ORG_ID <> -88
1090 AND FI.ITEM_DATE >= NVL(c_act_thru_date+1,FI.ITEM_DATE)
1091 AND FI.EXPENDITURE_ORGANIZATION_ID = c_exp_organization_id
1092 GROUP BY FI.EXPENDITURE_ORG_ID,
1093 FI.EXPENDITURE_ORGANIZATION_ID;
1094
1095 CURSOR BUDGET_LINES(c_budget_version_id PA_RESOURCE_ASSIGNMENTS.BUDGET_VERSION_ID%TYPE,
1096 c_project_id PA_RESOURCE_ASSIGNMENTS.PROJECT_ID%TYPE,
1097 c_resource_assignment_id PA_RESOURCE_ASSIGNMENTS.RESOURCE_ASSIGNMENT_ID%TYPE) IS
1098 SELECT BL.PERIOD_NAME,
1099 BL.START_DATE,
1100 BL.BURDENED_COST
1101 FROM PA_BUDGET_LINES BL,
1102 PA_RESOURCE_ASSIGNMENTS RA
1103 WHERE BL.RESOURCE_ASSIGNMENT_ID = RA.RESOURCE_ASSIGNMENT_ID
1104 AND RA.BUDGET_VERSION_ID = c_budget_version_id
1105 AND RA.PROJECT_ID = c_project_id
1106 AND RA.RESOURCE_LIST_MEMBER_ID = 103
1107 ORDER BY BL.START_DATE;
1108
1109 -- M-Closeout: Bill Rate Override ER ------------------------------------------
1110 -- Also query up the rate API parameters per period
1111
1112 /* Bug 5657334: Added org_id join in pa_periods_all to avoid multiple row selection */
1113 CURSOR FCST_RATE_PA(p_prj_assignment_id NUMBER, c_act_thru_date DATE, c_exp_organization_id NUMBER, c_org_id NUMBER) IS
1114 SELECT FI.EXPENDITURE_ORG_ID,
1115 FI.EXPENDITURE_ORGANIZATION_ID,
1116 FI.RCVR_PA_PERIOD_NAME,
1117 P.START_DATE,
1118 P.END_DATE,
1119 SUM(FI.ITEM_QUANTITY),
1120 MIN(FI.FORECAST_ITEM_ID),
1121 RA.RESOURCE_ASSIGNMENT_ID,
1122 RA.UNIT_OF_MEASURE,
1123 RA.RESOURCE_CLASS_CODE,
1124 RA.ORGANIZATION_ID,
1125 RA.JOB_ID,
1126 RA.PERSON_ID,
1127 RA.EXPENDITURE_TYPE,
1128 RA.NON_LABOR_RESOURCE,
1129 RA.BOM_RESOURCE_ID,
1130 RA.INVENTORY_ITEM_ID,
1131 RA.ITEM_CATEGORY_ID,
1132 RA.MFC_COST_TYPE_ID,
1133 RA.RATE_EXPENDITURE_TYPE,
1134 NVL(RA.RATE_BASED_FLAG, 'N') RATE_BASED_FLAG,
1135 RA.RATE_EXPENDITURE_ORG_ID,
1136 RLM.RES_FORMAT_ID,
1137 RLM.RESOURCE_LIST_MEMBER_ID,
1138 RLM.RESOURCE_ID,
1139 RLM.RESOURCE_LIST_ID,
1140 RLM.ALIAS
1141 FROM PA_FORECAST_ITEMS FI,
1142 PA_FORECAST_ITEM_DETAILS FID,
1143 PA_PERIODS_ALL P,
1144 PA_RES_LIST_MAP_TMP4 TMP4,
1145 PA_RESOURCE_ASSIGNMENTS RA,
1146 PA_RESOURCE_LIST_MEMBERS RLM
1147 WHERE FI.PROJECT_ORG_ID = NVL(P.ORG_ID,-99)
1148 AND P.ORG_ID = c_org_id /* Bug 5657334 */
1149 AND P.PERIOD_NAME = FI.RCVR_PA_PERIOD_NAME
1150 AND FI.FORECAST_ITEM_ID = FID.FORECAST_ITEM_ID
1151 AND FID.FORECAST_SUMMARIZED_CODE = 'N'
1152 AND FID.NET_ZERO_FLAG = 'N'
1153 AND FI.ERROR_FLAG = 'N'
1154 AND FI.DELETE_FLAG = 'N'
1155 AND ASSIGNMENT_ID = p_prj_assignment_id
1156 AND FI.EXPENDITURE_ORG_ID <>-88
1157 AND FI.ITEM_DATE >= NVL(c_act_thru_date+1,FI.ITEM_DATE)
1158 AND FI.EXPENDITURE_ORGANIZATION_ID = c_exp_organization_id
1159 AND ASSIGNMENT_ID = TMP4.TXN_SOURCE_ID
1160 AND RA.RESOURCE_ASSIGNMENT_ID = TMP4.TXN_RESOURCE_ASSIGNMENT_ID
1161 AND RA.RESOURCE_LIST_MEMBER_ID = RLM.RESOURCE_LIST_MEMBER_ID
1162 GROUP BY FI.EXPENDITURE_ORG_ID,
1163 FI.EXPENDITURE_ORGANIZATION_ID,
1164 P.START_DATE,
1165 P.END_DATE,
1166 FI.RCVR_PA_PERIOD_NAME,
1167 RA.RESOURCE_ASSIGNMENT_ID,
1168 RA.UNIT_OF_MEASURE,
1169 RA.RESOURCE_CLASS_CODE,
1170 RA.ORGANIZATION_ID,
1171 RA.JOB_ID,
1172 RA.PERSON_ID,
1173 RA.EXPENDITURE_TYPE,
1174 RA.NON_LABOR_RESOURCE,
1175 RA.BOM_RESOURCE_ID,
1176 RA.INVENTORY_ITEM_ID,
1177 RA.ITEM_CATEGORY_ID,
1178 RA.MFC_COST_TYPE_ID,
1179 RA.RATE_EXPENDITURE_TYPE,
1180 RA.RATE_BASED_FLAG,
1181 RA.RATE_EXPENDITURE_ORG_ID,
1182 RLM.RES_FORMAT_ID,
1183 RLM.RESOURCE_LIST_MEMBER_ID,
1184 RLM.RESOURCE_ID,
1185 RLM.RESOURCE_LIST_ID,
1186 RLM.ALIAS;
1187
1188 CURSOR FCST_RATE_GL(p_prj_assignment_id NUMBER, c_act_thru_date DATE, c_exp_organization_id NUMBER) IS
1189 SELECT FI.EXPENDITURE_ORG_ID,
1190 FI.EXPENDITURE_ORGANIZATION_ID,
1191 FI.RCVR_GL_PERIOD_NAME,
1192 GLP.START_DATE,
1193 GLP.END_DATE,
1194 SUM(FI.ITEM_QUANTITY),
1195 MIN(FI.FORECAST_ITEM_ID),
1196 RA.RESOURCE_ASSIGNMENT_ID,
1197 RA.UNIT_OF_MEASURE,
1198 RA.RESOURCE_CLASS_CODE,
1199 RA.ORGANIZATION_ID,
1200 RA.JOB_ID,
1201 RA.PERSON_ID,
1202 RA.EXPENDITURE_TYPE,
1203 RA.NON_LABOR_RESOURCE,
1204 RA.BOM_RESOURCE_ID,
1205 RA.INVENTORY_ITEM_ID,
1206 RA.ITEM_CATEGORY_ID,
1207 RA.MFC_COST_TYPE_ID,
1208 RA.RATE_EXPENDITURE_TYPE,
1209 NVL(RA.RATE_BASED_FLAG, 'N') RATE_BASED_FLAG,
1210 RA.RATE_EXPENDITURE_ORG_ID,
1211 RLM.RES_FORMAT_ID,
1212 RLM.RESOURCE_LIST_MEMBER_ID,
1213 RLM.RESOURCE_ID,
1214 RLM.RESOURCE_LIST_ID,
1215 RLM.ALIAS
1216 FROM PA_FORECAST_ITEMS FI,
1217 PA_FORECAST_ITEM_DETAILS FID,
1218 GL_PERIODS GLP,
1219 PA_RES_LIST_MAP_TMP4 TMP4,
1220 PA_RESOURCE_ASSIGNMENTS RA,
1221 PA_RESOURCE_LIST_MEMBERS RLM
1222 WHERE FI.FORECAST_ITEM_ID = FID.FORECAST_ITEM_ID
1223 AND FID.FORECAST_SUMMARIZED_CODE = 'N'
1224 AND FID.NET_ZERO_FLAG = 'N'
1225 AND FI.ERROR_FLAG = 'N'
1226 AND FI.DELETE_FLAG = 'N'
1227 AND GLP.PERIOD_SET_NAME = FI.RCVR_PERIOD_SET_NAME
1228 AND GLP.PERIOD_NAME = FI.RCVR_GL_PERIOD_NAME
1229 AND ASSIGNMENT_ID = p_prj_assignment_id
1230 AND FI.EXPENDITURE_ORG_ID <> -88
1231 AND FI.ITEM_DATE >= NVL(c_act_thru_date+1,FI.ITEM_DATE)
1232 AND FI.EXPENDITURE_ORGANIZATION_ID = c_exp_organization_id
1233 AND ASSIGNMENT_ID = TMP4.TXN_SOURCE_ID
1234 AND RA.RESOURCE_ASSIGNMENT_ID = TMP4.TXN_RESOURCE_ASSIGNMENT_ID
1235 AND RA.RESOURCE_LIST_MEMBER_ID = RLM.RESOURCE_LIST_MEMBER_ID
1236 GROUP BY FI.EXPENDITURE_ORG_ID,
1237 FI.EXPENDITURE_ORGANIZATION_ID,
1238 GLP.START_DATE,
1239 GLP.END_DATE,
1240 FI.RCVR_GL_PERIOD_NAME,
1241 RA.RESOURCE_ASSIGNMENT_ID,
1242 RA.UNIT_OF_MEASURE,
1243 RA.RESOURCE_CLASS_CODE,
1244 RA.ORGANIZATION_ID,
1245 RA.JOB_ID,
1246 RA.PERSON_ID,
1247 RA.EXPENDITURE_TYPE,
1248 RA.NON_LABOR_RESOURCE,
1249 RA.BOM_RESOURCE_ID,
1250 RA.INVENTORY_ITEM_ID,
1251 RA.ITEM_CATEGORY_ID,
1252 RA.MFC_COST_TYPE_ID,
1253 RA.RATE_EXPENDITURE_TYPE,
1254 RA.RATE_BASED_FLAG,
1255 RA.RATE_EXPENDITURE_ORG_ID,
1256 RLM.RES_FORMAT_ID,
1257 RLM.RESOURCE_LIST_MEMBER_ID,
1258 RLM.RESOURCE_ID,
1259 RLM.RESOURCE_LIST_ID,
1260 RLM.ALIAS;
1261
1262
1263 CURSOR FCST_RATE_NONE(p_prj_assignment_id NUMBER, c_act_thru_date DATE, c_exp_organization_id NUMBER) IS
1264 SELECT FI.EXPENDITURE_ORG_ID,
1265 FI.EXPENDITURE_ORGANIZATION_ID,
1266 SUM(FI.ITEM_QUANTITY),
1267 MIN(FI.FORECAST_ITEM_ID),
1268 null period_name,
1269 min(fi.item_Date) start_date,
1270 max(fi.item_Date) end_date, -- Bug 4621534: Changed min to max.
1271 RA.RESOURCE_ASSIGNMENT_ID,
1272 RA.UNIT_OF_MEASURE,
1273 RA.RESOURCE_CLASS_CODE,
1274 RA.ORGANIZATION_ID,
1275 RA.JOB_ID,
1276 RA.PERSON_ID,
1277 RA.EXPENDITURE_TYPE,
1278 RA.NON_LABOR_RESOURCE,
1279 RA.BOM_RESOURCE_ID,
1280 RA.INVENTORY_ITEM_ID,
1281 RA.ITEM_CATEGORY_ID,
1282 RA.MFC_COST_TYPE_ID,
1283 RA.RATE_EXPENDITURE_TYPE,
1284 NVL(RA.RATE_BASED_FLAG, 'N') RATE_BASED_FLAG,
1285 RA.RATE_EXPENDITURE_ORG_ID,
1286 RLM.RES_FORMAT_ID,
1287 RLM.RESOURCE_LIST_MEMBER_ID,
1288 RLM.RESOURCE_ID,
1289 RLM.RESOURCE_LIST_ID,
1290 RLM.ALIAS
1291 FROM PA_FORECAST_ITEMS FI,
1292 PA_FORECAST_ITEM_DETAILS FID,
1293 PA_RES_LIST_MAP_TMP4 TMP4,
1294 PA_RESOURCE_ASSIGNMENTS RA,
1295 PA_RESOURCE_LIST_MEMBERS RLM
1296 WHERE FI.FORECAST_ITEM_ID = FID.FORECAST_ITEM_ID
1297 AND FID.FORECAST_SUMMARIZED_CODE = 'N'
1298 AND FID.NET_ZERO_FLAG = 'N'
1299 AND FI.ERROR_FLAG = 'N'
1300 AND FI.DELETE_FLAG = 'N'
1301 AND ASSIGNMENT_ID = p_prj_assignment_id
1302 AND FI.EXPENDITURE_ORG_ID <> -88
1303 AND FI.ITEM_DATE >= NVL(c_act_thru_date+1,FI.ITEM_DATE)
1304 AND FI.EXPENDITURE_ORGANIZATION_ID = c_exp_organization_id
1305 AND ASSIGNMENT_ID = TMP4.TXN_SOURCE_ID
1306 AND RA.RESOURCE_ASSIGNMENT_ID = TMP4.TXN_RESOURCE_ASSIGNMENT_ID
1307 AND RA.RESOURCE_LIST_MEMBER_ID = RLM.RESOURCE_LIST_MEMBER_ID
1308 GROUP BY FI.EXPENDITURE_ORG_ID,
1309 FI.EXPENDITURE_ORGANIZATION_ID,
1310 RA.RESOURCE_ASSIGNMENT_ID,
1311 RA.UNIT_OF_MEASURE,
1312 RA.RESOURCE_CLASS_CODE,
1313 RA.ORGANIZATION_ID,
1314 RA.JOB_ID,
1315 RA.PERSON_ID,
1316 RA.EXPENDITURE_TYPE,
1317 RA.NON_LABOR_RESOURCE,
1318 RA.BOM_RESOURCE_ID,
1319 RA.INVENTORY_ITEM_ID,
1320 RA.ITEM_CATEGORY_ID,
1321 RA.MFC_COST_TYPE_ID,
1322 RA.RATE_EXPENDITURE_TYPE,
1323 RA.RATE_BASED_FLAG,
1324 RA.RATE_EXPENDITURE_ORG_ID,
1325 RLM.RES_FORMAT_ID,
1326 RLM.RESOURCE_LIST_MEMBER_ID,
1327 RLM.RESOURCE_ID,
1328 RLM.RESOURCE_LIST_ID,
1329 RLM.ALIAS;
1330
1331
1332 CURSOR GET_RATE_API_PARAMS_CUR IS
1333 SELECT DECODE(NVL(pfo.use_planning_rates_flag,'N'),'N',pfo.res_class_bill_rate_sch_id,
1334 DECODE(bv.version_type,'REVENUE',pfo.rev_res_class_rate_sch_id,
1335 'ALL' ,pfo.rev_res_class_rate_sch_id,
1336 NULL)) res_class_bill_rate_sch_id
1337 ,DECODE(NVL(pfo.use_planning_rates_flag,'N'),'N',pfo.res_class_raw_cost_sch_id,
1338 DECODE(bv.version_type,'COST',pfo.cost_res_class_rate_sch_id,
1339 'ALL' ,pfo.cost_res_class_rate_sch_id,
1340 NULL)) res_class_raw_cost_sch_id
1341 ,NVL(pfo.use_planning_rates_flag,'N') use_planning_rates_flag
1342 ,DECODE(NVL(pfo.use_planning_rates_flag,'N'),'N',NULL,
1343 DECODE(bv.version_type,'REVENUE',pfo.rev_job_rate_sch_id,
1344 'ALL' ,pfo.rev_job_rate_sch_id,
1345 NULL)) rev_job_rate_sch_id
1346 ,DECODE(NVL(pfo.use_planning_rates_flag,'N'),'N',NULL,
1347 DECODE(bv.version_type,'COST' ,pfo.cost_job_rate_sch_id,
1348 'ALL' ,pfo.cost_job_rate_sch_id,
1349 NULL)) cost_job_rate_sch_id
1350 ,DECODE(NVL(pfo.use_planning_rates_flag,'N'),'N',NULL,
1351 DECODE(bv.version_type,'REVENUE',pfo.rev_emp_rate_sch_id,
1352 'ALL' ,pfo.rev_emp_rate_sch_id,
1353 NULL)) rev_emp_rate_sch_id
1354 ,DECODE(NVL(pfo.use_planning_rates_flag,'N'),'N',NULL,
1355 DECODE(bv.version_type,'COST' ,pfo.cost_emp_rate_sch_id,
1356 'ALL' ,pfo.cost_emp_rate_sch_id,
1357 NULL)) cost_emp_rate_sch_id
1358 ,DECODE(NVL(pfo.use_planning_rates_flag,'N'),'N',NULL,
1359 DECODE(bv.version_type,'REVENUE',pfo.rev_non_labor_res_rate_sch_id,
1360 'ALL' ,pfo.rev_non_labor_res_rate_sch_id,
1361 NULL)) rev_non_labor_res_rate_sch_id
1362 ,DECODE(NVL(pfo.use_planning_rates_flag,'N'),'N',NULL,
1363 DECODE(bv.version_type,'COST' ,pfo.cost_non_labor_res_rate_sch_id,
1364 'ALL' ,pfo.cost_non_labor_res_rate_sch_id,
1365 NULL)) cost_non_labor_res_rate_sch_id
1366 ,DECODE(NVL(pfo.use_planning_rates_flag,'N'),'N',NULL,
1367 DECODE(bv.version_type,'COST' ,pfo.cost_burden_rate_sch_id,
1368 'ALL' ,pfo.cost_burden_rate_sch_id,
1369 NULL)) cost_burden_rate_sch_id
1370 ,bv.version_type fp_budget_version_type
1371 ,NVL(bv.approved_rev_plan_type_flag,'N') approved_rev_plan_type_flag
1372 ,NVL(pfo.plan_in_multi_curr_flag,'N') plan_in_multi_curr_flag
1373 ,pp.assign_precedes_task
1374 ,pp.bill_job_group_id
1375 ,pp.carrying_out_organization_id
1376 ,NVL(pp.multi_currency_billing_flag,'N') multi_currency_billing_flag
1377 ,pp.org_id
1378 ,pp.non_labor_bill_rate_org_id
1379 ,pp.project_currency_code
1380 ,pp.non_labor_schedule_discount
1381 ,pp.non_labor_schedule_fixed_date
1382 ,pp.non_lab_std_bill_rt_sch_id
1383 ,pp.project_type
1384 ,pp.projfunc_currency_code
1385 ,pp.emp_bill_rate_schedule_id
1386 ,pp.job_bill_rate_schedule_id
1387 ,pp.labor_bill_rate_org_id
1388 ,pp.labor_sch_type
1389 ,pp.non_labor_sch_type
1390 ,pp.name project_name
1391 FROM pa_proj_fp_options pfo
1392 ,pa_budget_versions bv
1393 ,pa_projects_all pp
1394 WHERE pfo.fin_plan_version_id = bv.budget_version_id
1395 AND bv.budget_version_id = p_budget_version_id
1396 AND pp.project_id = bv.project_id
1397 AND pfo.project_id = pp.project_id;
1398
1399 rate_rec get_rate_api_params_cur%ROWTYPE;
1400
1401 CURSOR CHECK_BILL_RATE_OVRD_EXISTS IS
1402 SELECT 'Y'
1403 FROM DUAL
1404 WHERE EXISTS (SELECT assignment_id
1405 FROM pa_project_assignments
1406 WHERE project_id = p_project_id
1407 AND bill_rate_override is not null);
1408
1409 l_bill_rate_ovrd_exists_flag VARCHAR2(1) := 'N';
1410
1411 -- Bug 4615787: Added 'PA_GL_' to cursor name to emphasize that
1412 -- it should be used when the Target timephase is either PA or GL.
1413
1414 CURSOR GROUP_TO_INSERT_INTO_PA_GL_BL IS
1415 SELECT RESOURCE_ASSIGNMENT_ID,
1416 START_DATE,
1417 END_DATE,
1418 PERIOD_NAME,
1419 SUM(QUANTITY),
1420 TXN_CURRENCY_CODE,
1421 SUM(TXN_RAW_COST),
1422 SUM(TXN_BURDENED_COST),
1423 SUM(TXN_REVENUE),
1424 BILL_MARKUP_PERCENTAGE,
1425 COST_REJECTION_CODE,
1426 BURDEN_REJECTION_CODE,
1427 REVENUE_REJECTION_CODE,
1428 COST_IND_COMPILED_SET_ID
1429 FROM pa_fp_rollup_tmp
1430 GROUP BY resource_assignment_id,
1431 txn_currency_code,
1432 start_date,
1433 end_date,
1434 period_name,
1435 BILL_MARKUP_PERCENTAGE,
1436 COST_REJECTION_CODE,
1437 BURDEN_REJECTION_CODE,
1438 REVENUE_REJECTION_CODE,
1439 COST_IND_COMPILED_SET_ID;
1440
1441 -- Bug 4615787: Added cursor GROUP_TO_INSERT_INTO_NTP_BL to
1442 -- aggregate data correctly when the Target version is None
1443 -- timephased. Derived from GROUP_TO_INSERT_INTO_NTP_BL,
1444 -- this cursor is different in that it does not group by
1445 -- start_date, end_date, period_name, bill_markup_percentage,
1446 -- or cost_ind_compiled_set_id. In the SELECT clause, we can
1447 -- take the MIN(start_date), MAX(end_date), and NULL for the
1448 -- remaining ungrouped columns.
1449 -- The goal is to ensure that a single record is fetched for
1450 -- each (Resource Assignment Id, Txn Currency) combination.
1451
1452 CURSOR GROUP_TO_INSERT_INTO_NTP_BL IS
1453 SELECT RESOURCE_ASSIGNMENT_ID,
1454 MIN(START_DATE),
1455 MAX(END_DATE),
1456 NULL, --PERIOD_NAME,
1457 SUM(QUANTITY),
1458 TXN_CURRENCY_CODE,
1459 SUM(TXN_RAW_COST),
1460 SUM(TXN_BURDENED_COST),
1461 SUM(TXN_REVENUE),
1462 NULL, --BILL_MARKUP_PERCENTAGE,
1463 COST_REJECTION_CODE,
1464 BURDEN_REJECTION_CODE,
1465 REVENUE_REJECTION_CODE,
1466 NULL --COST_IND_COMPILED_SET_ID
1467 FROM pa_fp_rollup_tmp
1468 GROUP BY resource_assignment_id,
1469 txn_currency_code,
1470 COST_REJECTION_CODE,
1471 BURDEN_REJECTION_CODE,
1472 REVENUE_REJECTION_CODE;
1473
1474 -- Bug 4549862: Added cursor for when the target version is None
1475 -- Time Phased and the context is Forecast Generation. In this
1476 -- case, budget lines may exist with actuals. Fetch temp table
1477 -- data for which budget lines do not yet exist, which should be
1478 -- Inserted into pa_budget_lines.
1479
1480 -- Bug 4615787: Removed start_date, end_date, period_name,
1481 -- bill_markup_percentage, and cost_ind_compiled_set_id from the
1482 -- GROUP BY clause. In the SELECT clause, take MIN(start_date),
1483 -- MAX(end_date), and NULL for the remaining ungrouped columns.
1484 -- The goal is to ensure that a single record is fetched for
1485 -- each (Resource Assignment Id, Txn Currency) combination.
1486
1487 CURSOR GROUP_TO_INS_INTO_NTP_FCST_BL IS
1488 SELECT RESOURCE_ASSIGNMENT_ID,
1489 MIN(START_DATE),
1490 MAX(END_DATE),
1491 NULL, --PERIOD_NAME,
1492 SUM(QUANTITY),
1493 TXN_CURRENCY_CODE,
1494 SUM(TXN_RAW_COST),
1495 SUM(TXN_BURDENED_COST),
1496 SUM(TXN_REVENUE),
1497 NULL, --BILL_MARKUP_PERCENTAGE,
1498 COST_REJECTION_CODE,
1499 BURDEN_REJECTION_CODE,
1500 REVENUE_REJECTION_CODE,
1501 NULL --COST_IND_COMPILED_SET_ID
1502 FROM pa_fp_rollup_tmp tmp
1503 GROUP BY resource_assignment_id,
1504 txn_currency_code,
1505 COST_REJECTION_CODE,
1506 BURDEN_REJECTION_CODE,
1507 REVENUE_REJECTION_CODE
1508 HAVING ( SELECT count(*)
1509 FROM pa_budget_lines bl
1510 WHERE tmp.resource_assignment_id = bl.resource_assignment_id
1511 AND tmp.txn_currency_code = bl.txn_currency_code ) = 0;
1512
1513
1514 -- Bug 4549862: Added cursor for when the target version is None
1515 -- Time Phased and the context is Forecast Generation. In this
1516 -- case, budget lines may exist with actuals. Fetch temp table
1517 -- data for which budget lines exist, which whould be Updated
1518 -- into pa_budget_lines.
1519
1520 -- Bug 4615787: Removed start_date, end_date, period_name,
1521 -- bill_markup_percentage, and cost_ind_compiled_set_id from the
1522 -- GROUP BY clause. In the SELECT clause, take MIN(start_date),
1523 -- MAX(end_date), and NULL for the remaining ungrouped columns.
1524 -- The goal is to ensure that a single record is fetched for
1525 -- each (Resource Assignment Id, Txn Currency) combination.
1526
1527 CURSOR GROUP_TO_UPD_INTO_NTP_FCST_BL IS
1528 SELECT RESOURCE_ASSIGNMENT_ID,
1529 MIN(START_DATE),
1530 MAX(END_DATE),
1531 NULL, --PERIOD_NAME,
1532 SUM(QUANTITY),
1533 TXN_CURRENCY_CODE,
1534 SUM(TXN_RAW_COST),
1535 SUM(TXN_BURDENED_COST),
1536 SUM(TXN_REVENUE),
1537 NULL, --BILL_MARKUP_PERCENTAGE,
1538 COST_REJECTION_CODE,
1539 BURDEN_REJECTION_CODE,
1540 REVENUE_REJECTION_CODE,
1541 NULL --COST_IND_COMPILED_SET_ID
1542 FROM pa_fp_rollup_tmp tmp
1543 GROUP BY resource_assignment_id,
1544 txn_currency_code,
1545 COST_REJECTION_CODE,
1546 BURDEN_REJECTION_CODE,
1547 REVENUE_REJECTION_CODE
1548 HAVING ( SELECT count(*)
1549 FROM pa_budget_lines bl
1550 WHERE tmp.resource_assignment_id = bl.resource_assignment_id
1551 AND tmp.txn_currency_code = bl.txn_currency_code ) > 0;
1552
1553
1554 CURSOR FIND_REJECTION_CODE IS
1555 SELECT tmp1.resource_assignment_id,
1556 tmp1.start_date,
1557 tmp1.txn_currency_code,
1558 tmp1.revenue_rejection_code
1559 FROM pa_fp_rollup_tmp tmp1,
1560 pa_fp_rollup_tmp tmp2
1561 WHERE tmp2.txn_revenue IS NOT NULL
1562 AND tmp1.revenue_rejection_code IS NOT NULL
1563 AND tmp1.resource_assignment_id = tmp2.resource_assignment_id
1564 AND tmp1.txn_currency_code = tmp2.txn_currency_code
1565 AND tmp1.start_date = tmp2.start_date;
1566 -- END of M-closeout: Bill Rate Override ER ------------------------------------------
1567
1568 l_carrying_out_organization_id PA_PROJECTS_ALL.CARRYING_OUT_ORGANIZATION_ID%TYPE;
1569 l_project_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE;
1570 l_projfunc_currency_code PA_PROJECTS_ALL.PROJFUNC_CURRENCY_CODE%TYPE;
1571 l_project_value PA_PROJECTS_ALL.PROJECT_VALUE%TYPE;
1572 l_job_bill_rate_schedule_id PA_PROJECTS_ALL.JOB_BILL_RATE_SCHEDULE_ID%TYPE;
1573 l_emp_bill_rate_schedule_id PA_PROJECTS_ALL.EMP_BILL_RATE_SCHEDULE_ID%TYPE;
1574 l_rev_gen_method VARCHAR2(3);
1575 l_distribution_rule PA_PROJECTS_ALL.DISTRIBUTION_RULE%TYPE;
1576 l_project_type PA_PROJECTS_ALL.PROJECT_TYPE%TYPE;
1577 l_bill_job_group_id PA_PROJECTS_ALL.BILL_JOB_GROUP_ID%TYPE;
1578 l_org_id PA_PROJECTS_ALL.ORG_ID%TYPE;
1579 l_completion_date PA_PROJECTS_ALL.COMPLETION_DATE%TYPE;
1580 l_template_flag PA_PROJECTS_ALL.TEMPLATE_FLAG%TYPE;
1581 l_projfunc_bil_rate_date_code PA_PROJECTS_ALL.PROJECT_BIL_RATE_DATE_CODE%TYPE;
1582 l_projfunc_bil_rate_type PA_PROJECTS_ALL.PROJECT_BIL_RATE_TYPE%TYPE;
1583 l_projfunc_bil_rate_date PA_PROJECTS_ALL.PROJECT_BIL_RATE_DATE%TYPE;
1584 l_projfunc_bil_exchange_rate PA_PROJECTS_ALL.PROJECT_BIL_EXCHANGE_RATE%TYPE;
1585
1586 l_system_linkage Pa_Forecast_Items.EXPENDITURE_TYPE_CLASS%TYPE;
1587 /* Added for Org Forecasting */
1588
1589 l_cost_job_group_id Pa_Projects_All.Cost_Job_Group_Id%TYPE;
1590 l_prj_rate_date Pa_Projects_All.PROJECT_RATE_DATE%TYPE;
1591 l_prj_rate_type Pa_Projects_All.PROJECT_RATE_TYPE%TYPE;
1592 l_prj_bil_rate_date_code Pa_Projects_All.PROJECT_BIL_RATE_DATE_CODE%TYPE;
1593 l_prj_bil_rate_type Pa_Projects_All.PROJECT_BIL_RATE_TYPE%TYPE;
1594 l_prj_bil_rate_date Pa_Projects_All.PROJECT_BIL_RATE_DATE%TYPE;
1595 l_prj_bil_ex_rate Pa_Projects_All.PROJECT_BIL_EXCHANGE_RATE%TYPE;
1596 l_prjfunc_cost_rate_type Pa_Projects_All.PROJFUNC_COST_RATE_TYPE%TYPE;
1597 l_prjfunc_cost_rate_date Pa_Projects_All.PROJFUNC_COST_RATE_DATE%TYPE;
1598 l_labor_tp_schedule_id Pa_Projects_All.LABOR_TP_SCHEDULE_ID%TYPE;
1599 l_labor_tp_fixed_date Pa_Projects_All.LABOR_TP_FIXED_DATE%TYPE;
1600
1601 l_labor_sch_discount Pa_Projects_All.LABOR_SCHEDULE_DISCOUNT%TYPE;
1602 l_asg_precedes_task Pa_Projects_All.ASSIGN_PRECEDES_TASK%TYPE;
1603 l_labor_bill_rate_orgid Pa_Projects_All.LABOR_BILL_RATE_ORG_ID%TYPE;
1604 l_labor_std_bill_rate_sch Pa_Projects_All.LABOR_STD_BILL_RATE_SCHDL%TYPE;
1605 l_labor_sch_fixed_dt Pa_Projects_All.LABOR_SCHEDULE_FIXED_DATE%TYPE;
1606 l_labor_sch_type Pa_Projects_All.LABOR_SCH_TYPE%TYPE;
1607
1608
1609 l_budget_version_id PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE;
1610 l_version_number PA_BUDGET_VERSIONS.VERSION_NUMBER%TYPE;
1611 l_plan_processing_code PA_BUDGET_VERSIONS.PLAN_PROCESSING_CODE%TYPE;
1612
1613 --Declaring PL/SQL tables for bulk binding
1614 l_proj_assignment_id PA_PLSQL_DATATYPES.IdTabTyp;
1615 l_proj_start_date PA_PLSQL_DATATYPES.DateTabTyp;
1616 l_proj_resource_id PA_PLSQL_DATATYPES.IdTabTyp;
1617 l_proj_project_role_id PA_PLSQL_DATATYPES.IdTabTyp;
1618 l_proj_fcst_job_id PA_PLSQL_DATATYPES.IdTabTyp;
1619 l_proj_fcst_job_group_id PA_PLSQL_DATATYPES.IdTabTyp;
1620 l_proj_meaning PA_PLSQL_DATATYPES.Char80TabTyp;
1621 l_proj_named_role PA_PLSQL_DATATYPES.Char80TabTyp;
1622 l_proj_assignment_type PA_PLSQL_DATATYPES.Char30TabTyp;
1623 l_proj_exp_org_id PA_PLSQL_DATATYPES.IdTabTyp;
1624 l_proj_exp_organization_id PA_PLSQL_DATATYPES.IdTabTyp;
1625 l_proj_expenditure_org_id PA_PLSQL_DATATYPES.IdTabTyp;
1626 l_fi_exp_organization_id PA_PLSQL_DATATYPES.IdTabTyp;
1627 l_proj_exp_type PA_PLSQL_DATATYPES.Char30TabTyp;
1628 l_proj_person_id PA_PLSQL_DATATYPES.IdTabTyp;
1629 l_proj_revenue_bill_rate PA_PLSQL_DATATYPES.NumTabTyp;
1630 l_proj_short_assignment_type PA_PLSQL_DATATYPES.Char30TabTyp;
1631 l_proj_status_code PA_PLSQL_DATATYPES.Char30TabTyp;
1632 l_proj_billable_flag PA_PLSQL_DATATYPES.Char2TabTyp;
1633 l_proj_process_code PA_PLSQL_DATATYPES.Char30TabTyp;
1634 l_proj_error_msg_code PA_PLSQL_DATATYPES.Char30TabTyp;
1635 l_proj_end_date PA_PLSQL_DATATYPES.DateTabTyp;
1636 l_proj_fc_res_type_code PA_PLSQL_DATATYPES.Char30TabTyp;
1637
1638 l_role_error_code PA_RESOURCE_ASSIGNMENTS.PLAN_ERROR_CODE%TYPE;
1639
1640 l_err_code VARCHAR2(30);
1641 l_err_stack VARCHAR2(2000);
1642 l_err_stage VARCHAR2(2000);
1643 l_err_id NUMBER;
1644
1645
1646 l_projfunc_bill_rate NUMBER;
1647 l_projfunc_raw_revenue NUMBER;
1648 l_projfunc_raw_cost NUMBER;
1649 l_projfunc_raw_cost_rate NUMBER;
1650 l_projfunc_burdened_cost NUMBER;
1651 l_projfunc_burdened_cost_rate NUMBER;
1652 l_error_msg VARCHAR2(30);
1653
1654 l_std_raw_revenue NUMBER;
1655 l_rev_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE;
1656 l_billable_flag VARCHAR2(2);
1657
1658 l_rev_reject_reason VARCHAR2(1000);
1659 l_cost_reject_reason VARCHAR2(1000);
1660 l_burdened_reject_reason VARCHAR2(1000);
1661 l_other_reject_reason VARCHAR2(1000);
1662
1663 l_resource_list_member_id PA_RESOURCE_LIST_MEMBERS.RESOURCE_LIST_MEMBER_ID%TYPE;
1664 l_resource_id PA_RESOURCE_LIST_MEMBERS.RESOURCE_LIST_MEMBER_ID%TYPE;
1665 l_resource_assignment_id PA_RESOURCE_ASSIGNMENTS.RESOURCE_ASSIGNMENT_ID%TYPE;
1666 l_track_as_labor_flag PA_RESOURCE_LIST_MEMBERS.TRACK_AS_LABOR_FLAG%TYPE;
1667 l_parent_member_id PA_RESOURCE_LIST_MEMBERS.PARENT_MEMBER_ID%TYPE;
1668 l_prj_res_assignment_id PA_RESOURCE_ASSIGNMENTS.RESOURCE_ASSIGNMENT_ID%TYPE;
1669
1670 l_fcst_opt_jobcostrate_sch_id PA_FORECASTING_OPTIONS_ALL.JOB_COST_RATE_SCHEDULE_ID%TYPE;
1671
1672 l_calling_mode VARCHAR2(50);
1673 l_rowid ROWID;
1674 l_counter NUMBER := 1 ;
1675 l_cost_cnt NUMBER := 1 ;
1676
1677 l_created_by NUMBER(15) := PA_FORECAST_GLOBAL.G_who_columns.G_created_by;
1678 l_request_id NUMBER(15) := PA_FORECAST_GLOBAL.G_who_columns.G_request_id;
1679 l_program_id NUMBER(15) := PA_FORECAST_GLOBAL.G_who_columns.G_program_id;
1680 l_program_application_id NUMBER(15) := PA_FORECAST_GLOBAL.G_who_columns.G_program_application_id;
1681 l_creation_date DATE := PA_FORECAST_GLOBAL.G_who_columns.G_creation_date;
1682 l_program_update_date DATE := PA_FORECAST_GLOBAL.G_who_columns.G_last_update_date;
1683
1684 l_period_name_flag VARCHAR2(1);
1685 l_period_name_tot_flag VARCHAR2(1);
1686 l_current_index PLS_INTEGER;
1687 l_current_index_tot PLS_INTEGER:=1;
1688 l_cnt PLS_INTEGER;
1689 l_budget_lines_tbl PA_GENERATE_FORECAST_PUB.budget_lines_tbl_type;
1690 l_budget_lines_tot_tbl PA_GENERATE_FORECAST_PUB.budget_lines_tbl_type;
1691
1692
1693 l_prj_revenue_tab PA_RATE_PVT_PKG.ProjAmt_TabTyp;
1694 l_prj_cost_tab PA_RATE_PVT_PKG.ProjAmt_TabTyp;
1695 l_project_id NUMBER(15);
1696
1697 l_ret_status VARCHAR2(100);
1698 l_msg_count NUMBER;
1699 l_msg_data VARCHAR2(2000);
1700 l_data VARCHAR2(2000);
1701 l_msg_index_out NUMBER:=0;
1702 l_init_bill_rate_flag VARCHAR2(1);
1703 l_role_error_code_flag VARCHAR2(1);
1704 l_prj_level_revenue NUMBER:=0;
1705 l_process_fis_flag VARCHAR2(1);
1706 l_asgmt_status_flag VARCHAR2(1);
1707 l_commit_cnt NUMBER:= 0;
1708 l_event_error_msg VARCHAR2(100);
1709
1710 l_bl_start_date_tab PA_PLSQL_DATATYPES.DateTabTyp;
1711 l_bl_end_date_tab PA_PLSQL_DATATYPES.DateTabTyp;
1712 l_bl_pd_name_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1713 l_bl_qty_tab PA_PLSQL_DATATYPES.NumTabTyp;
1714 l_bl_rcost_tab PA_PLSQL_DATATYPES.NumTabTyp;
1715 l_bl_revenue_tab PA_PLSQL_DATATYPES.NumTabTyp;
1716 l_bl_bcost_tab PA_PLSQL_DATATYPES.NumTabTyp;
1717 l_bl_cost_rej_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1718 l_bl_bcost_rej_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1719 l_bl_rev_rej_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1720 l_bl_oth_rej_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1721
1722 l_rt_forecast_item_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1723 l_rt_pd_name_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1724 l_rt_start_date_tab PA_PLSQL_DATATYPES.DateTabTyp;
1725 l_rt_end_date_tab PA_PLSQL_DATATYPES.DateTabTyp;
1726
1727 l_rt_qty_tab PA_PLSQL_DATATYPES.NumTabTyp;
1728 l_rt_exp_org_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1729 l_rt_exp_organization_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1730
1731 -- M-closeout: Bill Rate Override ER ------------------------------------------
1732 l_rt_res_assignment_id_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1733 l_rt_uom_tab SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1734 l_rt_res_class_code_tab SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1735 l_rt_organization_id_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1736 l_rt_job_id_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1737 l_rt_person_id_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1738 l_rt_expenditure_type_tab SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1739 l_rt_non_labor_resource_tab SYSTEM.pa_varchar2_20_tbl_type:=SYSTEM.pa_varchar2_20_tbl_type();
1740 l_rt_bom_resource_id_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1741 l_rt_inventory_item_id_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1742 l_rt_item_category_id_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1743 l_rt_mfc_cost_type_id_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1744 l_rt_rate_expenditure_type_tab SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1745 l_rt_rate_based_flag_tab SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
1746 l_rt_rate_exp_org_id_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1747 l_rt_res_format_id_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1748 l_rt_res_list_member_id_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1749 l_rt_resource_id_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1750 l_rt_resource_list_id_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1751 l_rt_alias_tab SYSTEM.pa_varchar2_80_tbl_type:=SYSTEM.pa_varchar2_80_tbl_type();
1752 l_mfc_cost_source CONSTANT NUMBER := 2;
1753 l_txn_currency_code VARCHAR2(100);
1754
1755 l_bl_RES_ASSIGNMENT_ID_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1756 l_bl_PERIOD_NAME_tab SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1757 l_bl_QUANTITY_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1758 l_bl_TXN_CURRENCY_CODE_tab SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1759 l_bl_TXN_RAW_COST_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1760 l_bl_TXN_BURDENED_COST_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1761 l_bl_TXN_REVENUE_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1762 l_bl_BILL_MARKUP_PERCENT_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1763 l_bl_COST_REJECTION_CODE_tab SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1764 l_bl_BURDEN_REJECTION_CODE_tab SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1765 l_bl_REV_REJECTION_CODE_tab SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1766 l_bl_COST_IND_C_SET_ID_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1767
1768 l_rej_res_assignment_id_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1769 l_rej_start_date_tab SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1770 l_rej_txn_currency_code_tab SYSTEM.pa_varchar2_80_tbl_type:=SYSTEM.pa_varchar2_80_tbl_type();
1771 l_rej_revenue_rej_code_tab SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1772 -- END OF M-closeout: Bill Rate Override ER ------------------------------------------
1773
1774 l_rt_exp_func_raw_cst_rt_tab PA_PLSQL_DATATYPES.NumTabTyp;
1775 l_rt_exp_func_raw_cst_tab PA_PLSQL_DATATYPES.NumTabTyp;
1776 l_rt_exp_func_bur_cst_rt_tab PA_PLSQL_DATATYPES.NumTabTyp;
1777 l_rt_exp_func_burdned_cst_tab PA_PLSQL_DATATYPES.NumTabTyp;
1778 l_rt_projfunc_bill_rt_tab PA_PLSQL_DATATYPES.NumTabTyp;
1779 l_rt_projfunc_raw_revenue_tab PA_PLSQL_DATATYPES.NumTabTyp;
1780 l_rt_projfunc_raw_cst_tab PA_PLSQL_DATATYPES.NumTabTyp;
1781 l_rt_projfunc_raw_cst_rt_tab PA_PLSQL_DATATYPES.NumTabTyp;
1782 l_rt_projfunc_burdned_cst_tab PA_PLSQL_DATATYPES.NumTabTyp;
1783 l_rt_projfunc_bd_cst_rt_tab PA_PLSQL_DATATYPES.NumTabTyp;
1784 l_rt_rev_rejct_reason_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1785 l_rt_cst_rejct_reason_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1786 l_rt_burdned_rejct_reason_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1787 l_rt_others_rejct_reason_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1788 l_bulk_fetch_count NUMBER:= 0;
1789 l_markup_percentage NUMBER;
1790 l_cost_based_error_code VARCHAR2(100);
1791
1792 l_prj_asg_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1793 l_avg_bill_rate_tab PA_PLSQL_DATATYPES.NumTabTyp;
1794
1795 l_rowcount number :=0;
1796
1797 l_amount_set_id PA_PROJ_FP_OPTIONS.COST_AMOUNT_SET_ID%TYPE;
1798 l_fin_plan_level_code PA_PROJ_FP_OPTIONS.COST_FIN_PLAN_LEVEL_CODE%TYPE;
1799 l_time_phased_code PA_PROJ_FP_OPTIONS.COST_TIME_PHASED_CODE%TYPE;
1800 l_resource_list_id PA_PROJ_FP_OPTIONS.COST_RESOURCE_LIST_ID%TYPE;
1801 l_res_planning_level PA_PROJ_FP_OPTIONS.COST_RES_PLANNING_LEVEL%TYPE;
1802 l_rbs_version_id PA_PROJ_FP_OPTIONS.RBS_VERSION_ID%TYPE;
1803 --l_plan_res_list_id PA_PROJ_FP_OPTIONS.COST_PLAN_RES_LIST_ID%TYPE;
1804 l_emp_rate_sch_id PA_PROJ_FP_OPTIONS.COST_EMP_RATE_SCH_ID%TYPE;
1805 l_job_rate_sch_id PA_PROJ_FP_OPTIONS.COST_JOB_RATE_SCH_ID%TYPE;
1806 l_non_labor_res_rate_sch_id PA_PROJ_FP_OPTIONS.COST_NON_LABOR_RES_RATE_SCH_ID%TYPE;
1807 l_res_class_rate_sch_id PA_PROJ_FP_OPTIONS.COST_RES_CLASS_RATE_SCH_ID%TYPE;
1808 l_burden_rate_sch_id PA_PROJ_FP_OPTIONS.COST_BURDEN_RATE_SCH_ID%TYPE;
1809 l_current_planning_period PA_PROJ_FP_OPTIONS.COST_CURRENT_PLANNING_PERIOD%TYPE;
1810 l_period_mask_id PA_PROJ_FP_OPTIONS.COST_PERIOD_MASK_ID%TYPE;
1811 l_gen_src_plan_type_id PA_PROJ_FP_OPTIONS.GEN_SRC_COST_PLAN_TYPE_ID%TYPE;
1812 l_gen_src_plan_version_id PA_PROJ_FP_OPTIONS.GEN_SRC_COST_PLAN_VERSION_ID%TYPE;
1813 l_gen_src_plan_ver_code PA_PROJ_FP_OPTIONS.GEN_SRC_COST_PLAN_VER_CODE%TYPE;
1814 l_gen_src_code PA_PROJ_FP_OPTIONS.GEN_COST_SRC_CODE%TYPE;
1815 l_gen_etc_src_code PA_PROJ_FP_OPTIONS.GEN_COST_ETC_SRC_CODE%TYPE;
1816 l_gen_incl_change_doc_flag PA_PROJ_FP_OPTIONS.GEN_COST_INCL_CHANGE_DOC_FLAG%TYPE;
1817 l_gen_incl_open_comm_flag PA_PROJ_FP_OPTIONS.GEN_COST_INCL_OPEN_COMM_FLAG%TYPE;
1818 l_gen_incl_bill_event_flag PA_PROJ_FP_OPTIONS.GEN_REV_INCL_BILL_EVENT_FLAG%TYPE;
1819 l_gen_ret_manual_line_flag PA_PROJ_FP_OPTIONS.GEN_COST_RET_MANUAL_LINE_FLAG%TYPE;
1820 l_gen_actual_amts_thru_code PA_PROJ_FP_OPTIONS.GEN_COST_ACTUAL_AMTS_THRU_CODE%TYPE;
1821 l_gen_incl_unspent_amt_flag PA_PROJ_FP_OPTIONS.GEN_COST_INCL_UNSPENT_AMT_FLAG%TYPE;
1822
1823 l_raw_cost_flag PA_FIN_PLAN_AMOUNT_SETS.RAW_COST_FLAG%TYPE;
1824 l_burdened_flag PA_FIN_PLAN_AMOUNT_SETS.BURDENED_COST_FLAG%TYPE;
1825 l_revenue_flag PA_FIN_PLAN_AMOUNT_SETS.REVENUE_FLAG%TYPE;
1826 l_cost_quantity_flag PA_FIN_PLAN_AMOUNT_SETS.COST_QTY_FLAG%TYPE;
1827 l_rev_quantity_flag PA_FIN_PLAN_AMOUNT_SETS.REVENUE_QTY_FLAG%TYPE;
1828 l_all_quantity_flag PA_FIN_PLAN_AMOUNT_SETS.ALL_QTY_FLAG%TYPE;
1829 l_bill_rate_flag PA_FIN_PLAN_AMOUNT_SETS.BILL_RATE_FLAG%TYPE;
1830 l_cost_rate_flag PA_FIN_PLAN_AMOUNT_SETS.COST_RATE_FLAG%TYPE;
1831 l_burden_rate_flag PA_FIN_PLAN_AMOUNT_SETS.BURDEN_RATE_FLAG%TYPE;
1832
1833 l_fp_cols_rec PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
1834
1835 l_res_assgn_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1836 l_res_assgn_id_tmp_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1837 l_total_plan_quantity number;
1838 l_rlm_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1839
1840 l_last_updated_by NUMBER := FND_GLOBAL.user_id;
1841 l_last_update_login NUMBER := FND_GLOBAL.login_id;
1842 l_sysdate DATE := SYSDATE;
1843 l_sysdate_trunc DATE;
1844 l_proj_assgn_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1845 l_proj_exp_organization_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1846 l_proj_res_assgn_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1847 -- M-Closeout ER: Bill Rate Override ER
1848 l_proj_bill_rate_override_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1849 l_proj_bill_rate_cur_ovrd_tab SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1850 l_calculate_mode VARCHAR2(30);
1851 l_cost_rate_multiplier CONSTANT pa_labor_cost_multipliers.multiplier%TYPE := 1;
1852 l_bill_rate_multiplier CONSTANT pa_labor_cost_multipliers.multiplier%TYPE := 1;
1853 l_cost_sch_type VARCHAR2(30) := 'COST';
1854 l_override_organization_id NUMBER := NULL;
1855 l_Final_Txn_Currency_Code VARCHAR2(100);
1856 l_insert_Txn_Currency_Code VARCHAR2(100); -- Bug 4615589
1857 l_return_status VARCHAR2(1);
1858 l_error_code VARCHAR2(100);
1859 l_stage VARCHAR2(100);
1860 l_status VARCHAR2(100);
1861 l_entire_return_status VARCHAR2(1);
1862 x_bill_rate NUMBER := NULL;
1863 x_cost_rate NUMBER := NULL;
1864 x_raw_cost NUMBER := NULL;
1865 x_cost_txn_curr_code VARCHAR2(100) := NULL;
1866 x_rev_txn_curr_code VARCHAR2(100) := NULL;
1867 x_burden_cost_rate NUMBER := NULL;
1868 x_burden_cost NUMBER := NULL;
1869 x_raw_revenue NUMBER := NULL;
1870 x_burden_multiplier NUMBER := NULL;
1871 x_bill_markup_percentage NUMBER := NULL;
1872 x_raw_cost_rejection_code VARCHAR2(30) := NULL;
1873 x_burden_cost_rejection_code VARCHAR2(30) := NULL;
1874 x_revenue_rejection_code VARCHAR2(30) := NULL;
1875 x_cost_ind_compiled_set_id NUMBER := NULL;
1876 l_ce_raw_cost NUMBER := NULL;
1877 l_ce_burdened_cost NUMBER := NULL;
1878 l_ce_revenue NUMBER := NULL;
1879 l_final_txn_rate_type VARCHAR2(100);
1880 l_final_txn_rate_date DATE := NULL;
1881 l_final_txn_exch_rate NUMBER := NULL;
1882 l_final_txn_quantity NUMBER := NULL;
1883 l_final_txn_revenue NUMBER := NULL;
1884 l_final_txn_raw_cost NUMBER := NULL;
1885 l_final_txn_burden_cost NUMBER := NULL;
1886
1887 x_dummy_rate_date DATE;
1888 x_dummy_rate_type VARCHAR2(100);
1889 x_dummy_exch_rate NUMBER;
1890 x_dummy_cost NUMBER;
1891 -- END of M-Closeout ER: Bill Rate Override ER
1892
1893 --Local PL/SQL table used for calling Calculate API
1894 l_calling_module VARCHAR2(30) := 'BUDGET_GENERATION';
1895 l_refresh_rates_flag VARCHAR2(1) := 'Y';
1896 l_refresh_conv_rates_flag VARCHAR2(1) := 'N';
1897 l_spread_required_flag VARCHAR2(1) := 'N';
1898 l_conv_rates_required_flag VARCHAR2(1) := 'N';
1899 l_rollup_required_flag VARCHAR2(1) := 'N';
1900 l_mass_adjust_flag VARCHAR2(1) := 'N';
1901 l_raTxn_rollup_api_call_flag VARCHAR2(1) := 'N'; -- Added for IPM new entity ER
1902 l_quantity_adj_pct NUMBER := NULL;
1903 l_cost_rate_adj_pct NUMBER := NULL;
1904 l_burdened_rate_adj_pct NUMBER := NULL;
1905 l_bill_rate_adj_pct NUMBER := NULL;
1906 l_source_context pa_fp_res_assignments_tmp.source_context%TYPE := 'RESOURCE_ASSIGNMENT';
1907
1908 l_delete_budget_lines_tab SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
1909 l_spread_amts_flag_tab SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
1910 l_txn_currency_code_tab SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
1911 l_txn_currency_override_tab SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
1912 l_total_qty_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1913 l_addl_qty_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1914 l_total_raw_cost_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1915 l_addl_raw_cost_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1916 l_total_burdened_cost_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1917 l_addl_burdened_cost_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1918 l_total_revenue_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1919 l_addl_revenue_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1920 l_raw_cost_rate_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1921 l_rw_cost_rate_override_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1922 l_b_cost_rate_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1923 l_b_cost_rate_override_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1924
1925
1926 l_bill_rate_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1927 l_bill_rate_override_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
1928 l_line_start_date_tab SYSTEM.pa_date_tbl_type:=SYSTEM.pa_date_tbl_type();
1929 l_line_end_date_tab SYSTEM.pa_date_tbl_type:=SYSTEM.pa_date_tbl_type();
1930
1931 l_stru_sharing_code PA_PROJECTS_ALL.STRUCTURE_SHARING_CODE%TYPE;
1932 l_count NUMBER;
1933 l_count1 NUMBER;
1934 l_gen_res_asg_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1935 l_chk_duplicate_flag VARCHAR2(1) := 'N';
1936 l_deleted_res_asg_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1937
1938 l_resource_class_id PA_RESOURCE_CLASSES_B.RESOURCE_CLASS_ID%TYPE;
1939 l_dp_counter NUMBER;
1940 l_dp_flag VARCHAR2(1);
1941
1942 tmp_flag varchar2(1);
1943 tmp_rlm_tab pa_plsql_datatypes.IdTabTyp;
1944 tmp_task_tab pa_plsql_datatypes.IdTabTyp;
1945 tmp_ra_tab pa_plsql_datatypes.IdTabTyp;
1946
1947 --Local pl/sql table to call Map_Rlmi_Rbs api
1948 l_TXN_SOURCE_ID_tab PA_PLSQL_DATATYPES.IdTabTyp;
1949 l_TXN_SOURCE_TYPE_CODE_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1950 l_PERSON_ID_tab PA_PLSQL_DATATYPES.IdTabTyp;
1951 l_JOB_ID_tab PA_PLSQL_DATATYPES.IdTabTyp;
1952 l_ORGANIZATION_ID_tab PA_PLSQL_DATATYPES.IdTabTyp;
1953 l_VENDOR_ID_tab PA_PLSQL_DATATYPES.IdTabTyp;
1954 l_EXPENDITURE_TYPE_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1955 l_EVENT_TYPE_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1956 l_NON_LABOR_RESOURCE_tab PA_PLSQL_DATATYPES.Char20TabTyp;
1957 l_EXPENDITURE_CATEGORY_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1958 l_REVENUE_CATEGORY_CODE_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1959 l_NLR_ORGANIZATION_ID_tab PA_PLSQL_DATATYPES.IdTabTyp;
1960 l_EVENT_CLASSIFICATION_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1961 l_SYS_LINK_FUNCTION_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1962 l_PROJECT_ROLE_ID_tab PA_PLSQL_DATATYPES.IdTabTyp;
1963 l_RESOURCE_CLASS_CODE_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1964 l_MFC_COST_TYPE_ID_tab PA_PLSQL_DATATYPES.IDTabTyp;
1965 l_RESOURCE_CLASS_FLAG_tab PA_PLSQL_DATATYPES.Char1TabTyp;
1966 l_FC_RES_TYPE_CODE_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1967 l_INVENTORY_ITEM_ID_tab PA_PLSQL_DATATYPES.IDTabTyp;
1968 l_ITEM_CATEGORY_ID_tab PA_PLSQL_DATATYPES.IDTabTyp;
1969 l_PERSON_TYPE_CODE_tab PA_PLSQL_DATATYPES.Char30TabTyp;
1970 l_BOM_RESOURCE_ID_tab PA_PLSQL_DATATYPES.IDTabTyp;
1971 l_NAMED_ROLE_tab PA_PLSQL_DATATYPES.Char80TabTyp;
1972 l_INCURRED_BY_RES_FLAG_tab PA_PLSQL_DATATYPES.Char1TabTyp;
1973 l_RATE_BASED_FLAG_tab PA_PLSQL_DATATYPES.Char1TabTyp;
1974 l_TXN_TASK_ID_tab PA_PLSQL_DATATYPES.IdTabTyp;
1975 l_TXN_WBS_ELEMENT_VER_ID_tab PA_PLSQL_DATATYPES.IdTabTyp;
1976 l_TXN_RBS_ELEMENT_ID_tab PA_PLSQL_DATATYPES.IdTabTyp;
1977 l_TXN_PLAN_START_DATE_tab PA_PLSQL_DATATYPES.DateTabTyp;
1978 l_TXN_PLAN_END_DATE_tab PA_PLSQL_DATATYPES.DateTabTyp;
1979 --out param from PA_RLMI_RBS_MAP_PUB.MAP_RLMI_RBS
1980 l_map_txn_source_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1981 l_map_rlm_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1982 l_map_rbs_element_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1983 l_map_txn_accum_header_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1984
1985 --Local PL/SQL table used for calling Calculate API
1986 l_t_refresh_rates_flag VARCHAR2(1) := 'Y';
1987 l_t_refresh_conv_rates_flag VARCHAR2(1) := 'N';
1988 l_t_spread_required_flag VARCHAR2(1) := 'N';
1989 l_t_conv_rates_required_flag VARCHAR2(1) := 'N';
1990 l_t_mass_adjust_flag VARCHAR2(1) := 'N';
1991 l_t_quantity_adj_pct NUMBER := NULL;
1992 l_t_cost_rate_adj_pct NUMBER := NULL;
1993 l_t_burdened_rate_adj_pct NUMBER := NULL;
1994 l_t_bill_rate_adj_pct NUMBER := NULL;
1995 l_t_source_context pa_fp_res_assignments_tmp.source_context%TYPE := 'RESOURCE_ASSIGNMENT';
1996
1997 l_t_res_assgn_id_tmp_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1998 l_t_delete_budget_lines_tab SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
1999 l_t_spread_amts_flag_tab SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
2000 l_t_txn_currency_code_tab SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
2001 l_t_txn_currency_override_tab SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
2002 l_t_total_qty_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2003 l_t_addl_qty_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2004 l_t_total_raw_cost_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2005 l_t_addl_raw_cost_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2006 l_t_total_burdened_cost_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2007 l_t_addl_burdened_cost_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2008 l_t_total_revenue_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2009 l_t_addl_revenue_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2010 l_t_raw_cost_rate_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2011 l_t_rw_cost_rate_override_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2012 l_t_b_cost_rate_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2013 l_t_b_cost_rate_override_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2014
2015
2016 l_t_bill_rate_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2017 l_t_bill_rate_override_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2018 l_t_line_start_date_tab SYSTEM.pa_date_tbl_type:=SYSTEM.pa_date_tbl_type();
2019 l_t_line_end_date_tab SYSTEM.pa_date_tbl_type:=SYSTEM.pa_date_tbl_type();
2020
2021 l_bl_count NUMBER;
2022 l_transaction_source_code PA_RESOURCE_ASSIGNMENTS.TRANSACTION_SOURCE_CODE%TYPE;
2023
2024 -- Bug 4548733: Added new pl/sql table to hold billability flag values for
2025 -- Calculate API. Corresponds to p_fp_task_billable_flag_tab IN parameter.
2026 l_calc_billable_flag_tab SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
2027
2028 -- Bug 4549862: Added counter to track unique budget_line_id values for
2029 -- the PA_FP_ROLLUP_TMP table. Will be arbitrarily initialized to 0 and
2030 -- then incremented by 1 prior to each Insert to the temp table.
2031 -- Note: these are not valid budget_line_id values in pa_budget_lines.
2032 -- Rather, we are using the column to index records for processing of
2033 -- cost-based revenue amounts, since an Index exists for the column.
2034 l_bl_id_counter NUMBER;
2035
2036 -- Bug 4549862: Added pl/sql tables for budget line update.
2037 l_upd_bl_start_date_tab PA_PLSQL_DATATYPES.DateTabTyp;
2038 l_upd_bl_end_date_tab PA_PLSQL_DATATYPES.DateTabTyp;
2039 l_upd_bl_RES_ASSIGNMENT_ID_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2040 l_upd_bl_PERIOD_NAME_tab SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
2041 l_upd_bl_QUANTITY_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2042 l_upd_bl_TXN_CURRENCY_CODE_tab SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
2043 l_upd_bl_TXN_RAW_COST_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2044 l_upd_bl_TXN_BURDENED_COST_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2045 l_upd_bl_TXN_REVENUE_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2046 l_upd_bl_BILL_MARKUP_PRCNT_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2047 l_upd_bl_COST_REJ_CODE_tab SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
2048 l_upd_bl_BURDEN_REJ_CODE_tab SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
2049 l_upd_bl_REV_REJ_CODE_tab SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
2050 l_upd_bl_COST_IND_C_SET_ID_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
2051
2052 -- Bug 4549862: PL/SQL tables for rejection code processing
2053 l_rej_code_ra_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
2054 l_rej_code_txn_currency_tab PA_PLSQL_DATATYPES.Char15TabTyp;
2055 l_rej_code_msg_name_tab PA_PLSQL_DATATYPES.Char30TabTyp;
2056
2057 BEGIN
2058 /* Setting the initial values */
2059 IF p_init_msg_flag = 'Y' THEN
2060 FND_MSG_PUB.initialize;
2061 END IF;
2062 X_MSG_COUNT := 0;
2063 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
2064
2065 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
2066 PA_DEBUG.init_err_stack('PA_FP_GEN_BUDGET_AMT_PUB.GENERATE_BUDGET_AMT_RES_SCH');
2067 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
2068 pa_debug.set_curr_function( p_function => 'GENERATE_BUDGET_AMT_RES_SCH'
2069 ,p_debug_mode => p_pa_debug_mode);
2070 END IF;
2071
2072 -- Bug 4549862: Added counter to track unique budget_line_id values for
2073 -- the PA_FP_ROLLUP_TMP table. Will be arbitrarily initialized to 0 and
2074 -- then incremented by 1 prior to each Insert to the temp table.
2075 l_bl_id_counter := 0;
2076
2077 -- Bug 4549862: Moved initialization of l_rev_gen_method before
2078 -- initialization of l_calculate_mode.
2079
2080 --l_rev_gen_method := PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(p_project_id);
2081 l_rev_gen_method := nvl(l_fp_cols_rec.x_revenue_derivation_method,PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(p_project_id)); --Bug 5462471
2082
2083 -- M-closeout: Bill Rate Override ER ------------------------------------------
2084
2085 -- Check whether there exist at least 1 project assignment with
2086 -- bill rate override in the project.
2087 OPEN CHECK_BILL_RATE_OVRD_EXISTS;
2088 FETCH CHECK_BILL_RATE_OVRD_EXISTS INTO l_bill_rate_ovrd_exists_flag;
2089 CLOSE CHECK_BILL_RATE_OVRD_EXISTS;
2090
2091 -- Only need to honor bill rate override and
2092 -- call rate API IF:
2093 -- a) version type is COST and REVENUE and,
2094 -- b) there is at least 1 project asgmt with
2095 -- bill rate override in the project.
2096
2097 -- Bug 4549862: Modified IF condition so that the code also proceeds
2098 -- along the Rate API flow when target version is ALL and revenue
2099 -- accrual method is COST.
2100
2101 IF p_fp_cols_rec.x_version_type = 'ALL' AND
2102 ( l_bill_rate_ovrd_exists_flag = 'Y' OR l_rev_gen_method = 'C' ) THEN
2103
2104 OPEN GET_RATE_API_PARAMS_CUR;
2105 FETCH GET_RATE_API_PARAMS_CUR INTO rate_rec;
2106 CLOSE GET_RATE_API_PARAMS_CUR;
2107
2108 END IF;
2109
2110 -- Bug 4549862: Modified logic for initializing l_calculate_mode
2111 -- to 'COST'. When the version type is Cost and Revenue together
2112 -- and the revenue accrual method is COST or EVENT, we will be
2113 -- generating revenue amounts using either GEN_COST_BASED_REVENUE
2114 -- or GEN_BILLING_AMOUNTS, respectively. Setting l_calculate_mode
2115 -- to 'COST' in these cases will tell the Rate API to return only
2116 -- cost rates when it is called later in this API.
2117
2118 IF p_fp_cols_rec.x_version_type = 'REVENUE' THEN
2119 l_calculate_mode := 'REVENUE';
2120 ELSIF p_fp_cols_rec.x_version_type = 'COST' OR
2121 ( p_fp_cols_rec.x_version_type = 'ALL' AND
2122 l_rev_gen_method IN ('C','E') ) THEN
2123 l_calculate_mode := 'COST';
2124 ELSIF p_fp_cols_rec.x_version_type = 'ALL' THEN
2125 -- Bug 4549862: l_rev_gen_method is implicitly 'T' in this case.
2126 l_calculate_mode := 'COST_REVENUE';
2127 END IF;
2128
2129 -- Final Currency:
2130 -- a. For Approved Revenue, final currency = PFC
2131 -- b. If multi-currency is disabled, final currency = PC
2132 IF rate_rec.approved_rev_plan_type_flag = 'Y' THEN
2133 l_Final_Txn_Currency_Code := rate_rec.projfunc_currency_code;
2134 ELSIF rate_rec.plan_in_multi_curr_flag = 'N' THEN
2135 l_Final_Txn_Currency_Code := rate_rec.project_currency_code;
2136 ELSE
2137 l_Final_Txn_Currency_Code := NULL;
2138 END IF;
2139
2140 -- END of M-closeout: Bill Rate Override ER ----------------------------------
2141
2142 /*Bug 4197666: when ret_manual_lines flag is 'N', budget lines and resource assignments
2143 are deleted completely for the target version. when ret_manual_lines flag is 'Y', for
2144 budget version,all budget lines that under resource assignment whose transaction source
2145 code is NOT NULL should be deleted. for forecast version, 'P' and 'G' time phased, all
2146 ETC budget lines should be deleted; 'N' time phased, ETC should be deleted or negated.*/
2147 IF p_fp_cols_rec.x_gen_ret_manual_line_flag = 'Y' THEN
2148 IF P_PLAN_CLASS_CODE = 'BUDGET' THEN
2149 DELETE FROM pa_budget_lines
2150 WHERE budget_version_id = p_budget_version_id
2151 AND budget_line_id IN
2152 (SELECT bl.budget_line_id
2153 FROM pa_budget_lines bl, pa_resource_assignments ra
2154 WHERE ra.budget_version_id = p_budget_version_id
2155 AND bl.budget_version_id = p_budget_version_id
2156 AND ra.transaction_source_code IS NOT NULL
2157 AND ra.resource_assignment_id = bl.resource_assignment_id);
2158 ELSIF P_PLAN_CLASS_CODE = 'FORECAST' THEN
2159 IF P_FP_COLS_REC.x_time_phased_code IN ('P','G') THEN
2160 DELETE FROM pa_budget_lines
2161 WHERE budget_version_id = p_budget_version_id
2162 AND budget_line_id IN
2163 (SELECT bl.budget_line_id
2164 FROM pa_budget_lines bl, pa_resource_assignments ra
2165 WHERE ra.budget_version_id = p_budget_version_id
2166 AND bl.budget_version_id = p_budget_version_id
2167 AND ra.transaction_source_code IS NOT NULL
2168 AND ra.resource_assignment_id = bl.resource_assignment_id
2169 AND bl.start_date > p_actuals_thru_date);
2170 ELSE
2171 DELETE FROM pa_budget_lines
2172 WHERE budget_version_id = p_budget_version_id
2173 AND NVL(init_quantity,0) = 0
2174 AND NVL(init_raw_cost,0) = 0
2175 AND NVL(init_burdened_cost,0) = 0
2176 AND NVL(init_revenue,0) = 0;
2177
2178 UPDATE pa_budget_lines
2179 SET quantity = init_quantity,
2180 txn_raw_cost = txn_init_raw_cost,
2181 txn_burdened_cost = txn_init_burdened_cost,
2182 txn_revenue = txn_init_revenue,
2183 project_raw_cost = project_init_raw_cost,
2184 project_burdened_cost = project_init_burdened_cost,
2185 project_revenue = project_init_revenue,
2186 raw_cost = init_raw_cost,
2187 burdened_cost = init_burdened_cost,
2188 revenue = init_revenue,
2189 txn_cost_rate_override = DECODE(NVL(init_quantity,0),0,NULL,txn_init_raw_cost/init_quantity),
2190 txn_bill_rate_override = DECODE(NVL(init_quantity,0),0,NULL,txn_init_revenue/init_quantity),
2191 project_cost_exchange_rate = DECODE(NVL(txn_init_raw_cost,0),0,NULL,project_init_raw_cost/txn_init_raw_cost),
2192 project_rev_exchange_rate = DECODE(NVL(txn_init_revenue,0),0,NULL,project_init_revenue/txn_init_revenue),
2193 projfunc_cost_exchange_rate = DECODE(NVL(txn_init_raw_cost,0),0,NULL,init_raw_cost/txn_init_raw_cost),
2194 projfunc_rev_exchange_rate = DECODE(NVL(txn_init_revenue,0),0,NULL,init_revenue/txn_init_revenue)
2195 WHERE budget_version_id = p_budget_version_id
2196 AND budget_line_id IN
2197 (SELECT bl.budget_line_id
2198 FROM pa_budget_lines bl, pa_resource_assignments ra
2199 WHERE ra.budget_version_id = p_budget_version_id
2200 AND bl.budget_version_id = p_budget_version_id
2201 AND ra.transaction_source_code IS NOT NULL
2202 AND ra.resource_assignment_id = bl.resource_assignment_id);
2203 END IF;
2204 END IF;
2205 END IF;
2206
2207 l_sysdate_trunc := trunc(sysdate);
2208 /* l_role_error_code_flag is used here
2209 for only checking whether to continue
2210 with forecasting process or not */
2211 l_role_error_code_flag := 'N';
2212 OPEN PROJ_DETAILS;
2213 FETCH PROJ_DETAILS INTO
2214 l_project_type,
2215 l_project_currency_code,
2216 l_carrying_out_organization_id,
2217 l_project_value,
2218 l_job_bill_rate_schedule_id,
2219 l_emp_bill_rate_schedule_id,
2220 l_distribution_rule,
2221 l_bill_job_group_id,
2222 l_org_id,
2223 l_completion_date,
2224 l_template_flag,
2225 l_projfunc_currency_code,
2226 l_projfunc_bil_rate_date_code,
2227 l_projfunc_bil_rate_type,
2228 l_projfunc_bil_rate_date,
2229 l_projfunc_bil_exchange_rate,
2230 l_cost_job_group_id,
2231 l_prj_rate_date,
2232 l_prj_rate_type,
2233 l_prj_bil_rate_date_code,
2234 l_prj_bil_rate_type,
2235 l_prj_bil_rate_date,
2236 l_prj_bil_ex_rate,
2237 l_prjfunc_cost_rate_type,
2238 l_prjfunc_cost_rate_date,
2239 l_labor_tp_schedule_id,
2240 l_labor_tp_fixed_date,
2241 l_labor_sch_discount,
2242 l_asg_precedes_task,
2243 l_labor_bill_rate_orgid,
2244 l_labor_std_bill_rate_sch,
2245 l_labor_sch_fixed_dt,
2246 l_labor_sch_type;
2247
2248 IF PROJ_DETAILS%NOTFOUND THEN
2249 x_return_status := FND_API.G_RET_STS_ERROR;
2250 l_role_error_code_flag := 'Y';
2251 PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
2252 p_msg_name => 'PA_INVALID_PROJECT_ID');
2253 END IF;
2254
2255 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2256 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2257 END IF;
2258 CLOSE PROJ_DETAILS;
2259
2260 -- Bug 4549862: REMOVED call to Get_Revenue_Generation_Method API.
2261 -- Added initialization of l_rev_gen_method at the beginning of
2262 -- this API using the GET_REV_GEN_METHOD wrapper API.
2263
2264 /* Set plan processing code to G - G(enerated Successfully) */
2265
2266 l_plan_processing_code := 'G';
2267 l_budget_lines_tot_tbl.DELETE;
2268
2269 OPEN PROJ_ASSIGNMENTS;
2270 FETCH PROJ_ASSIGNMENTS
2271 BULK COLLECT INTO l_proj_assignment_id,
2272 l_proj_start_date,
2273 l_proj_resource_id,
2274 l_proj_project_role_id,
2275 l_proj_fcst_job_id,
2276 l_proj_fcst_job_group_id,
2277 l_proj_meaning,
2278 l_proj_assignment_type,
2279 l_proj_exp_organization_id,
2280 l_proj_exp_type,
2281 l_proj_revenue_bill_rate,
2282 l_proj_expenditure_org_id,
2283 l_proj_status_code,
2284 l_proj_billable_flag,
2285 l_proj_process_code,
2286 l_proj_error_msg_code,
2287 l_proj_end_date,
2288 l_proj_person_id,
2289 l_proj_named_role,
2290 l_fi_exp_organization_id,
2291 l_proj_fc_res_type_code;
2292 CLOSE PROJ_ASSIGNMENTS;
2293
2294 FOR i IN 1..l_proj_person_id.count LOOP
2295 l_person_type_code_tab(i) := NULL;
2296 l_vendor_id_tab(i) := NULL;
2297 IF l_proj_person_id(i) IS NOT NULL THEN
2298 BEGIN
2299 SELECT p_type.SYSTEM_PERSON_TYPE
2300 INTO l_person_type_code_tab(i)
2301 FROM PER_PERSON_TYPES p_type,
2302 PER_PERSON_TYPE_USAGES_F p_usg
2303 WHERE p_type.SYSTEM_PERSON_TYPE IN ('EMP', 'CWK')
2304 AND p_type.PERSON_TYPE_ID = p_usg.PERSON_TYPE_ID
2305 AND l_proj_person_id(i) = p_usg.PERSON_ID
2306 AND l_proj_start_date(i) BETWEEN p_usg.EFFECTIVE_START_DATE AND p_usg.EFFECTIVE_END_DATE;
2307 EXCEPTION
2308 WHEN OTHERS THEN
2309 l_person_type_code_tab(i) := NULL;
2310 END;
2311 BEGIN
2312 SELECT p_asg.vendor_id
2313 INTO l_vendor_id_tab(i)
2314 FROM PER_ALL_ASSIGNMENTS_F p_asg
2315 WHERE l_proj_person_id(i) = p_asg.PERSON_ID
2316 AND l_proj_start_date(i) BETWEEN p_asg.EFFECTIVE_START_DATE AND p_asg.EFFECTIVE_END_DATE
2317 AND p_asg.PRIMARY_FLAG = 'Y';
2318 EXCEPTION
2319 WHEN OTHERS THEN
2320 l_vendor_id_tab(i) := NULL;
2321 END;
2322 END IF;
2323 END LOOP;
2324
2325 --hr_utility.trace('l_proj_assignment_id.count:'||l_proj_assignment_id.count);
2326 IF p_pa_debug_mode = 'Y' THEN
2327 pa_fp_gen_amount_utils.fp_debug
2328 (p_called_mode => p_called_mode,
2329 p_msg => 'l_proj_assignment_id.count:'||l_proj_assignment_id.count,
2330 p_module_name => l_module_name,
2331 p_log_level => 5);
2332 END IF;
2333
2334 if l_proj_resource_id.count = 0 then
2335 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
2336 PA_DEBUG.reset_err_stack;
2337 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
2338 PA_DEBUG.Reset_Curr_Function;
2339 END IF;
2340 return;
2341 end if;
2342
2343 /* code to populate to job and/or job group id is null */
2344 FOR i IN 1..l_proj_resource_id.count LOOP
2345 IF (l_proj_fcst_job_id(i) IS NULL)
2346 OR (l_proj_fcst_job_group_id(i) IS NULL) THEN
2347 BEGIN
2348 SELECT PR.DEFAULT_JOB_ID,PJ.JOB_GROUP_ID
2349 INTO l_proj_fcst_job_id(i),l_proj_fcst_job_group_id(i)
2350 FROM PA_PROJECT_ROLE_TYPES PR, PER_JOBS PJ
2351 WHERE PR.PROJECT_ROLE_ID = l_proj_project_role_id(i)
2352 AND PJ.JOB_ID = PR.DEFAULT_JOB_ID;
2353 EXCEPTION
2354 WHEN NO_DATA_FOUND THEN
2355 l_proj_process_code(i) := 'N';
2356 l_proj_error_msg_code(i) := 'N';
2357 END;
2358 END IF;
2359 END LOOP;
2360
2361 DELETE FROM PA_RES_LIST_MAP_TMP1;
2362 DELETE FROM PA_RES_LIST_MAP_TMP4;
2363
2364 l_TXN_SOURCE_ID_tab := l_proj_assignment_id;
2365 l_PERSON_ID_tab := l_proj_person_id;
2366 l_JOB_ID_tab := l_proj_fcst_job_id;
2367 l_ORGANIZATION_ID_tab := l_fi_exp_organization_id;
2368 l_EXPENDITURE_TYPE_tab := l_proj_exp_type;
2369 l_PROJECT_ROLE_ID_tab := l_proj_project_role_id;
2370 l_FC_RES_TYPE_CODE_tab := l_proj_fc_res_type_code;
2371 l_NAMED_ROLE_tab := l_proj_named_role;
2372 l_TXN_PLAN_START_DATE_tab := l_proj_start_date;
2373 l_TXN_PLAN_END_DATE_tab := l_proj_end_date;
2374
2375 FOR bb in 1..l_TXN_SOURCE_ID_tab.count LOOP
2376 l_TXN_SOURCE_TYPE_CODE_tab(bb) := null;
2377 l_EVENT_TYPE_tab(bb) := null;
2378 l_NON_LABOR_RESOURCE_tab(bb) := null;
2379 l_EXPENDITURE_CATEGORY_tab(bb) := null;
2380 l_REVENUE_CATEGORY_CODE_tab(bb):= null;
2381 l_NLR_ORGANIZATION_ID_tab(bb) := null;
2382 l_EVENT_CLASSIFICATION_tab(bb) := null;
2383 l_SYS_LINK_FUNCTION_tab(bb) := null;
2384 l_RESOURCE_CLASS_CODE_tab(bb) := 'PEOPLE';
2385 l_MFC_COST_TYPE_ID_tab(bb) := null;
2386 l_RESOURCE_CLASS_FLAG_tab(bb) := null;
2387 l_INVENTORY_ITEM_ID_tab(bb) := null;
2388 l_ITEM_CATEGORY_ID_tab(bb) := null;
2389 l_BOM_RESOURCE_ID_tab(bb) := null;
2390 l_INCURRED_BY_RES_FLAG_tab(bb) := null;
2391 l_RATE_BASED_FLAG_tab(bb) := null;
2392 l_TXN_TASK_ID_tab(bb) := null;
2393 l_TXN_WBS_ELEMENT_VER_ID_tab(bb):= null;
2394 l_TXN_RBS_ELEMENT_ID_tab(bb) := null;
2395 END LOOP;
2396
2397 IF P_PA_DEBUG_MODE = 'Y' THEN
2398 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2399 P_MSG => 'Before calling PA_RLMI_RBS_MAP_PUB.MAP_RLMI_RBS',
2400 P_MODULE_NAME => l_module_name);
2401 END IF;
2402 PA_RLMI_RBS_MAP_PUB.MAP_RLMI_RBS (
2403 P_PROJECT_ID => p_project_id,
2404 P_BUDGET_VERSION_ID => NULL,
2405 P_RESOURCE_LIST_ID => P_FP_COLS_REC.X_RESOURCE_LIST_ID,
2406 P_RBS_VERSION_ID => NULL,
2407 P_CALLING_PROCESS => 'BUDGET_GENERATION',
2408 P_CALLING_CONTEXT => 'PLSQL',
2409 P_PROCESS_CODE => 'RES_MAP',
2410 P_CALLING_MODE => 'PLSQL_TABLE',
2411 P_INIT_MSG_LIST_FLAG => 'N',
2412 P_COMMIT_FLAG => 'N',
2413 P_TXN_SOURCE_ID_TAB => l_TXN_SOURCE_ID_tab,
2414 P_TXN_SOURCE_TYPE_CODE_TAB => l_TXN_SOURCE_TYPE_CODE_tab,
2415 P_PERSON_ID_TAB => l_PERSON_ID_tab,
2416 P_JOB_ID_TAB => l_JOB_ID_tab,
2417 P_ORGANIZATION_ID_TAB => l_ORGANIZATION_ID_tab,
2418 P_VENDOR_ID_TAB => l_VENDOR_ID_tab,
2419 P_EXPENDITURE_TYPE_TAB => l_EXPENDITURE_TYPE_tab,
2420 P_EVENT_TYPE_TAB => l_EVENT_TYPE_tab,
2421 P_NON_LABOR_RESOURCE_TAB => l_NON_LABOR_RESOURCE_tab,
2422 P_EXPENDITURE_CATEGORY_TAB => l_EXPENDITURE_CATEGORY_tab,
2423 P_REVENUE_CATEGORY_CODE_TAB =>l_REVENUE_CATEGORY_CODE_tab,
2424 P_NLR_ORGANIZATION_ID_TAB =>l_NLR_ORGANIZATION_ID_tab,
2425 P_EVENT_CLASSIFICATION_TAB => l_EVENT_CLASSIFICATION_tab,
2426 P_SYS_LINK_FUNCTION_TAB => l_SYS_LINK_FUNCTION_tab,
2427 P_PROJECT_ROLE_ID_TAB => l_PROJECT_ROLE_ID_tab,
2428 P_RESOURCE_CLASS_CODE_TAB => l_RESOURCE_CLASS_CODE_tab,
2429 P_MFC_COST_TYPE_ID_TAB => l_MFC_COST_TYPE_ID_tab,
2430 P_RESOURCE_CLASS_FLAG_TAB => l_RESOURCE_CLASS_FLAG_tab,
2431 P_FC_RES_TYPE_CODE_TAB => l_FC_RES_TYPE_CODE_tab,
2432 P_INVENTORY_ITEM_ID_TAB => l_INVENTORY_ITEM_ID_tab,
2433 P_ITEM_CATEGORY_ID_TAB => l_ITEM_CATEGORY_ID_tab,
2434 P_PERSON_TYPE_CODE_TAB => l_PERSON_TYPE_CODE_tab,
2435 P_BOM_RESOURCE_ID_TAB =>l_BOM_RESOURCE_ID_tab,
2436 P_NAMED_ROLE_TAB =>l_NAMED_ROLE_tab,
2437 P_INCURRED_BY_RES_FLAG_TAB =>l_INCURRED_BY_RES_FLAG_tab,
2438 P_RATE_BASED_FLAG_TAB =>l_RATE_BASED_FLAG_tab,
2439 P_TXN_TASK_ID_TAB =>l_TXN_TASK_ID_tab,
2440 P_TXN_WBS_ELEMENT_VER_ID_TAB => l_TXN_WBS_ELEMENT_VER_ID_tab,
2441 P_TXN_RBS_ELEMENT_ID_TAB => l_TXN_RBS_ELEMENT_ID_tab,
2442 P_TXN_PLAN_START_DATE_TAB => l_TXN_PLAN_START_DATE_tab,
2443 P_TXN_PLAN_END_DATE_TAB => l_TXN_PLAN_END_DATE_tab,
2444 X_TXN_SOURCE_ID_TAB =>l_map_txn_source_id_tab,
2445 X_RES_LIST_MEMBER_ID_TAB =>l_map_rlm_id_tab,
2446 X_RBS_ELEMENT_ID_TAB =>l_map_rbs_element_id_tab,
2447 X_TXN_ACCUM_HEADER_ID_TAB =>l_map_txn_accum_header_id_tab,
2448 X_RETURN_STATUS => x_return_status,
2449 X_MSG_COUNT => x_msg_count,
2450 X_MSG_DATA => x_msg_data );
2451 IF P_PA_DEBUG_MODE = 'Y' THEN
2452 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2453 P_MSG => 'After calling PA_RLMI_RBS_MAP_PUB.MAP_RLMI_RBS: '||
2454 x_return_status,
2455 P_MODULE_NAME => l_module_name);
2456 END IF;
2457
2458 /* Added return status check for bug 4093872 */
2459 IF x_return_status <> 'S' THEN
2460 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2461 END IF;
2462
2463 SELECT /*+ INDEX(T,PA_RES_LIST_MAP_TMP4_N1)*/ count(*) INTO l_count
2464 FROM PA_RES_LIST_MAP_TMP4
2465 WHERE RESOURCE_LIST_MEMBER_ID IS NULL and rownum=1;
2466 IF l_count > 0 THEN
2467 PA_UTILS.ADD_MESSAGE
2468 (p_app_short_name => 'PA',
2469 p_msg_name => 'PA_INVALID_MAPPING_ERR');
2470 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2471 END IF;
2472
2473 SELECT count(*) INTO l_count
2474 FROM PA_RES_LIST_MAP_TMP4;
2475 IF p_pa_debug_mode = 'Y' THEN
2476 pa_fp_gen_amount_utils.fp_debug
2477 (p_called_mode => p_called_mode,
2478 p_msg => 'After calling pa_resource_mapping.map_resource_list,'||
2479 'pa_res_list_map_tmp4.count has '||l_count||' rows',
2480 p_module_name => l_module_name,
2481 p_log_level => 5);
2482 END IF;
2483
2484
2485 /* Calling the API to get the resource_assignment_id */
2486 IF p_pa_debug_mode = 'Y' THEN
2487 pa_fp_gen_amount_utils.fp_debug
2488 (p_called_mode => p_called_mode,
2489 p_msg => 'Before calling
2490 pa_fp_gen_budget_amt_pub.create_res_asg',
2491 p_module_name => l_module_name,
2492 p_log_level => 5);
2493 END IF;
2494
2495 PA_FP_GEN_BUDGET_AMT_PUB.CREATE_RES_ASG
2496 (P_PROJECT_ID => P_PROJECT_ID,
2497 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
2498 P_STRU_SHARING_CODE => l_stru_sharing_code,
2499 P_GEN_SRC_CODE => 'RESOURCE_SCHEDULE',
2500 P_FP_COLS_REC => p_FP_COLS_REC,
2501 X_RETURN_STATUS => X_RETURN_STATUS,
2502 X_MSG_COUNT => X_MSG_COUNT,
2503 X_MSG_DATA => X_MSG_DATA);
2504 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2505 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2506 END IF;
2507 IF p_pa_debug_mode = 'Y' THEN
2508 pa_fp_gen_amount_utils.fp_debug
2509 (p_called_mode => p_called_mode,
2510 p_msg => 'Status after calling
2511 pa_fp_gen_budget_amt_pub.create_res_asg: '
2512 ||x_return_status,
2513 p_module_name => l_module_name,
2514 p_log_level => 5);
2515 END IF;
2516
2517 /* Calling the API to update the tmp4
2518 table with resource_assignment_id */
2519 IF p_pa_debug_mode = 'Y' THEN
2520 pa_fp_gen_amount_utils.fp_debug
2521 (p_called_mode => p_called_mode,
2522 p_msg => 'Before calling
2523 pa_fp_gen_budget_amt_pub.update_res_asg',
2524 p_module_name => l_module_name,
2525 p_log_level => 5);
2526 END IF;
2527 PA_FP_GEN_BUDGET_AMT_PUB.UPDATE_RES_ASG
2528 (P_PROJECT_ID => P_PROJECT_ID,
2529 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
2530 P_STRU_SHARING_CODE => l_stru_sharing_code,
2531 P_GEN_SRC_CODE => 'RESOURCE_SCHEDULE',
2532 P_FP_COLS_REC => p_FP_COLS_REC,
2533 X_RETURN_STATUS => X_RETURN_STATUS,
2534 X_MSG_COUNT => X_MSG_COUNT,
2535 X_MSG_DATA => X_MSG_DATA);
2536 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2537 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2538 END IF;
2539 IF p_pa_debug_mode = 'Y' THEN
2540 pa_fp_gen_amount_utils.fp_debug
2541 (p_called_mode => p_called_mode,
2542 p_msg => 'Status after calling
2543 pa_fp_gen_budget_amt_pub.update_res_asg: '
2544 ||x_return_status,
2545 p_module_name => l_module_name,
2546 p_log_level => 5);
2547 END IF;
2548
2549 -- Bug 4549862: REMOVED old code for retaining manually added
2550 -- lines that was already commented out to reduce clutter.
2551
2552 l_proj_res_assgn_id_tab.delete;
2553 l_proj_exp_organization_id_tab.delete;
2554 l_proj_assgn_id_tab.delete;
2555 l_proj_bill_rate_override_tab.delete;
2556 l_proj_bill_rate_cur_ovrd_tab.delete;
2557
2558 SELECT tmp4.TXN_SOURCE_ID,
2559 tmp4.ORGANIZATION_ID,
2560 tmp4.TXN_RESOURCE_ASSIGNMENT_ID,
2561 PA.BILL_RATE_OVERRIDE, -- M-Closeout ER: Bill Rate Override ER
2562 PA.BILL_RATE_CURR_OVERRIDE, -- M-Closeout ER: Bill Rate Override ER
2563 nvl(WB.BILLABLE_CAPITALIZABLE_FLAG, 'N') -- M-Closeout ER: Honor billability flag ER
2564 BULK COLLECT
2565 INTO l_proj_assgn_id_tab,
2566 l_proj_exp_organization_id_tab,
2567 l_proj_res_assgn_id_tab,
2568 l_proj_bill_rate_override_tab, -- M-Closeout ER: Bill Rate Override ER
2569 l_proj_bill_rate_cur_ovrd_tab, -- M-Closeout ER: Bill Rate Override ER
2570 l_proj_billable_flag -- M-Closeout ER: Honor billability flag ER
2571 FROM PA_RES_LIST_MAP_TMP4 tmp4,
2572 PA_PROJECT_ASSIGNMENTS PA,
2573 PA_WORK_TYPES_B WB
2574 WHERE tmp4.txn_source_id = pa.assignment_id
2575 AND WB.WORK_TYPE_ID = PA.WORK_TYPE_ID(+);
2576
2577 --dbms_output.put_line('From tmp4, l_proj_assgn_id_tab:'||l_proj_assgn_id_tab.count
2578 -- ||';l_proj_res_assgn_id_tab.count:'||l_proj_res_assgn_id_tab.count);
2579 IF p_pa_debug_mode = 'Y' THEN
2580 pa_fp_gen_amount_utils.fp_debug
2581 (p_called_mode => p_called_mode,
2582 p_msg => 'From tmp4, l_proj_assgn_id_tab.count:'||l_proj_assgn_id_tab.count
2583 ||';l_proj_res_assgn_id_tab.count:'||l_proj_res_assgn_id_tab.count,
2584 p_module_name => l_module_name,
2585 p_log_level => 5);
2586 END IF;
2587
2588 -- M-closeout: Bill Rate Override ER ------------------------------------------
2589
2590 -- IF it is a COST and REVENUE budget or forecast AND
2591 -- there exist at least 1 project assignment with
2592 -- bill rate override in the whole project, honor bill rate
2593 -- override and call rate API
2594
2595 -- Bug 4549862: Modified IF condition so that the code also proceeds
2596 -- along the Rate API flow when target version is ALL and revenue
2597 -- accrual method is COST.
2598 -- The goal is to populate the PA_FP_ROLLUP_TMP global temp table
2599 -- with generation data and then let control return to the Budget
2600 -- or Forecast wrapper API without propagating data to the budget
2601 -- lines. The GEN_COST_BASED_REVENUE API will expect data in the
2602 -- temp table, which it will use to compute revenue amounts. The
2603 -- cost-based revenue API will propagate data from the temp table
2604 -- to the budget lines. Before the cost-based revenue API is called
2605 -- (e.g. in GEN_COMMITMENT_AMOUNTS), inserts/updates to the budget
2606 -- lines should go to the PA_FP_ROLLUP_TMP table instead so that
2607 -- the cost-based revenue API has all of the necessary data in the
2608 -- temp table when it is called.
2609 -- Note: this info only applies when generating ALL versions from
2610 -- Staffing Plan with revenue accrual method of COST.
2611
2612 IF p_fp_cols_rec.x_version_type = 'ALL' AND
2613 ( l_bill_rate_ovrd_exists_flag = 'Y' OR l_rev_gen_method = 'C' ) THEN
2614
2615 IF p_pa_debug_mode = 'Y' THEN
2616 pa_fp_gen_amount_utils.fp_debug
2617 (p_called_mode => p_called_mode,
2618 p_msg => 'Honoring bill rate override and call Rate API',
2619 p_module_name => l_module_name,
2620 p_log_level => 5);
2621 END IF;
2622
2623 DELETE FROM pa_fp_rollup_tmp;
2624
2625 FOR j IN 1..l_proj_assgn_id_tab.count LOOP
2626 --dbms_output.put_line('before cursor:l_proj_res_assgn_id_tab('||j
2627 -- ||'):'||l_proj_res_assgn_id_tab(j)
2628 -- ||';p_actuals_thru_date:'||p_actuals_thru_date);
2629 IF p_pa_debug_mode = 'Y' THEN
2630 pa_fp_gen_amount_utils.fp_debug
2631 (p_called_mode => p_called_mode,
2632 p_msg => 'before cursor:l_proj_assgn_id_tab('||j
2633 ||'):'||l_proj_assgn_id_tab(j)
2634 ||';p_actuals_thru_date:'||p_actuals_thru_date,
2635 p_module_name => l_module_name,
2636 p_log_level => 5);
2637
2638 END IF;
2639
2640 l_budget_lines_tbl.delete;
2641 l_rt_forecast_item_id_tab.delete;
2642 l_rt_pd_name_tab.delete;
2643 l_rt_start_date_tab.delete;
2644 l_rt_end_date_tab.delete;
2645 l_rt_qty_tab.delete;
2646 l_rt_res_assignment_id_tab.delete;
2647 l_rt_uom_tab.delete;
2648 l_rt_res_class_code_tab.delete;
2649 l_rt_organization_id_tab.delete;
2650 l_rt_job_id_tab.delete;
2651 l_rt_person_id_tab.delete;
2652 l_rt_expenditure_type_tab.delete;
2653 l_rt_non_labor_resource_tab.delete;
2654 l_rt_bom_resource_id_tab.delete;
2655 l_rt_inventory_item_id_tab.delete;
2656 l_rt_item_category_id_tab.delete;
2657 l_rt_mfc_cost_type_id_tab.delete;
2658 l_rt_rate_expenditure_type_tab.delete;
2659 l_rt_rate_based_flag_tab.delete;
2660 l_rt_rate_exp_org_id_tab.delete;
2661 l_rt_res_format_id_tab.delete;
2662
2663 -- 0. Execute SQLs (FCST_RATE_PA, FCST_RATE_GL, FCST_RATE_NONE cursors) to
2664 -- determine the qty and rate API parameters per period
2665 -- 1. Get PA_PLAN_REVENUE.GET_PLANNING_RATES API IN parameter values
2666
2667 IF p_FP_COLS_REC.X_TIME_PHASED_CODE = 'P' THEN
2668 OPEN FCST_RATE_PA(l_proj_assgn_id_tab(j),p_actuals_thru_date,l_proj_exp_organization_id_tab(j), l_org_id);
2669 FETCH FCST_RATE_PA BULK COLLECT INTO
2670 l_rt_exp_org_id_tab,
2671 l_rt_exp_organization_id_tab,
2672 l_rt_pd_name_tab,
2673 l_rt_start_date_tab,
2674 l_rt_end_date_tab,
2675 l_rt_qty_tab,
2676 l_rt_forecast_item_id_tab,
2677 l_rt_res_assignment_id_tab,
2678 l_rt_uom_tab,
2679 l_rt_res_class_code_tab,
2680 l_rt_organization_id_tab,
2681 l_rt_job_id_tab,
2682 l_rt_person_id_tab,
2683 l_rt_expenditure_type_tab,
2684 l_rt_non_labor_resource_tab,
2685 l_rt_bom_resource_id_tab,
2686 l_rt_inventory_item_id_tab,
2687 l_rt_item_category_id_tab,
2688 l_rt_mfc_cost_type_id_tab,
2689 l_rt_rate_expenditure_type_tab,
2690 l_rt_rate_based_flag_tab,
2691 l_rt_rate_exp_org_id_tab,
2692 l_rt_res_format_id_tab,
2693 l_rt_res_list_member_id_tab,
2694 l_rt_resource_id_tab,
2695 l_rt_resource_list_id_tab,
2696 l_rt_alias_tab;
2697 CLOSE FCST_RATE_PA;
2698
2699 ELSIF p_FP_COLS_REC.X_TIME_PHASED_CODE = 'G' THEN
2700 OPEN FCST_RATE_GL(l_proj_assgn_id_tab(j),p_actuals_thru_date,l_proj_exp_organization_id_tab(j));
2701 FETCH FCST_RATE_GL BULK COLLECT INTO
2702 l_rt_exp_org_id_tab,
2703 l_rt_exp_organization_id_tab,
2704 l_rt_pd_name_tab,
2705 l_rt_start_date_tab,
2706 l_rt_end_date_tab,
2707 l_rt_qty_tab,
2708 l_rt_forecast_item_id_tab,
2709 l_rt_res_assignment_id_tab,
2710 l_rt_uom_tab,
2711 l_rt_res_class_code_tab,
2712 l_rt_organization_id_tab,
2713 l_rt_job_id_tab,
2714 l_rt_person_id_tab,
2715 l_rt_expenditure_type_tab,
2716 l_rt_non_labor_resource_tab,
2717 l_rt_bom_resource_id_tab,
2718 l_rt_inventory_item_id_tab,
2719 l_rt_item_category_id_tab,
2720 l_rt_mfc_cost_type_id_tab,
2721 l_rt_rate_expenditure_type_tab,
2722 l_rt_rate_based_flag_tab,
2723 l_rt_rate_exp_org_id_tab,
2724 l_rt_res_format_id_tab,
2725 l_rt_res_list_member_id_tab,
2726 l_rt_resource_id_tab,
2727 l_rt_resource_list_id_tab,
2728 l_rt_alias_tab;
2729 CLOSE FCST_RATE_GL;
2730
2731 ELSE
2732 OPEN FCST_RATE_NONE(l_proj_assgn_id_tab(j),p_actuals_thru_date,l_proj_exp_organization_id_tab(j));
2733 FETCH FCST_RATE_NONE BULK COLLECT INTO
2734 l_rt_exp_org_id_tab,
2735 l_rt_exp_organization_id_tab,
2736 l_rt_qty_tab,
2737 l_rt_forecast_item_id_tab,
2738 l_rt_pd_name_tab,
2739 l_rt_start_date_tab,
2740 l_rt_end_date_tab,
2741 l_rt_res_assignment_id_tab,
2742 l_rt_uom_tab,
2743 l_rt_res_class_code_tab,
2744 l_rt_organization_id_tab,
2745 l_rt_job_id_tab,
2746 l_rt_person_id_tab,
2747 l_rt_expenditure_type_tab,
2748 l_rt_non_labor_resource_tab,
2749 l_rt_bom_resource_id_tab,
2750 l_rt_inventory_item_id_tab,
2751 l_rt_item_category_id_tab,
2752 l_rt_mfc_cost_type_id_tab,
2753 l_rt_rate_expenditure_type_tab,
2754 l_rt_rate_based_flag_tab,
2755 l_rt_rate_exp_org_id_tab,
2756 l_rt_res_format_id_tab,
2757 l_rt_res_list_member_id_tab,
2758 l_rt_resource_id_tab,
2759 l_rt_resource_list_id_tab,
2760 l_rt_alias_tab;
2761 CLOSE FCST_RATE_NONE;
2762
2763 END IF;
2764
2765 -- 2. Call PA_PLAN_REVENUE.GET_PLANNING_RATES API based on periodic data
2766 -- in PA/GL periods. Need to also pass in billability flag. (Project
2767 -- assignments with different bill rate override currency are mapped
2768 -- to different budget lines.)
2769 FOR k in 1..l_rt_start_date_tab.COUNT LOOP
2770
2771 IF p_pa_debug_mode = 'Y' THEN
2772 pa_fp_gen_amount_utils.fp_debug
2773 (p_called_mode => p_called_mode,
2774 p_msg => 'inside FOR k in 1..l_rt_start_date_tab.COUNT LOOP ('||k
2775 ||'):'||l_rt_start_date_tab(k),
2776 p_module_name => l_module_name,
2777 p_log_level => 5);
2778 END IF;
2779
2780 pa_cost.Override_exp_organization
2781 (P_item_date => l_rt_start_date_tab(k)
2782 ,P_person_id => l_rt_person_id_tab(k)
2783 ,P_project_id => p_project_id
2784 ,P_incurred_by_organz_id => l_rt_organization_id_tab(k)
2785 ,P_Expenditure_type => NVL(l_rt_expenditure_type_tab(k),l_rt_rate_expenditure_type_tab(k))
2786 ,X_overr_to_organization_id => l_override_organization_id
2787 ,X_return_status => l_return_status
2788 ,X_msg_count => x_msg_count
2789 ,X_msg_data => x_msg_data);
2790
2791 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2792 x_return_status := l_return_status;
2793 END IF;
2794
2795 BEGIN
2796
2797 IF l_proj_bill_rate_cur_ovrd_tab(j) IS NOT NULL THEN
2798 l_txn_currency_code := l_proj_bill_rate_cur_ovrd_tab(j);
2799 ELSE
2800 l_txn_currency_code := rate_rec.project_currency_code;
2801 END IF;
2802
2803 IF p_pa_debug_mode = 'Y' THEN
2804
2805 pa_fp_gen_amount_utils.fp_debug
2806 (p_called_mode => p_called_mode,
2807 p_msg => 'BEFORE calling pa_plan_revenue.Get_planning_Rates',
2808 p_module_name => l_module_name,
2809 p_log_level => 5);
2810 pa_fp_gen_amount_utils.fp_debug
2811 (p_called_mode => p_called_mode,
2812 p_msg => 'p_person_id:'||l_rt_person_id_tab(k),
2813 p_module_name => l_module_name,
2814 p_log_level => 5);
2815 pa_fp_gen_amount_utils.fp_debug
2816 (p_called_mode => p_called_mode,
2817 p_msg => 'p_job_id:'||l_rt_job_id_tab(k),
2818 p_module_name => l_module_name,
2819 p_log_level => 5);
2820 pa_fp_gen_amount_utils.fp_debug
2821 (p_called_mode => p_called_mode,
2822 p_msg => 'p_bill_job_grp_id:'||rate_rec.bill_job_group_id,
2823 p_module_name => l_module_name,
2824 p_log_level => 5);
2825 pa_fp_gen_amount_utils.fp_debug
2826 (p_called_mode => p_called_mode,
2827 p_msg => 'p_resource_class:'||l_rt_res_class_code_tab(k),
2828 p_module_name => l_module_name,
2829 p_log_level => 5);
2830 END IF;
2831
2832 -- Bug 4548733: Uncommented the p_billability_flag input parameter,
2833 -- passing it l_proj_billable_flag(j) as the value.
2834
2835 pa_plan_revenue.Get_planning_Rates
2836 (
2837 p_project_id => p_project_id
2838 ,p_task_id => 0
2839 ,p_top_task_id => NULL
2840 ,p_person_id => l_rt_person_id_tab(k)
2841 ,p_job_id => l_rt_job_id_tab(k)
2842 ,p_bill_job_grp_id => rate_rec.bill_job_group_id
2843 ,p_resource_class => l_rt_res_class_code_tab(k)
2844 ,p_planning_resource_format => l_rt_res_format_id_tab(k)
2845 ,p_use_planning_rates_flag => NVL(rate_rec.use_planning_rates_flag, 'N')
2846 ,p_rate_based_flag => l_rt_rate_based_flag_tab(k)
2847 ,p_uom => l_rt_uom_tab(k)
2848 ,p_system_linkage => NULL
2849 ,p_project_organz_id => rate_rec.carrying_out_organization_id
2850 ,p_rev_res_class_rate_sch_id => rate_rec.res_class_bill_rate_sch_id
2851 ,p_cost_res_class_rate_sch_id => rate_rec.res_class_raw_cost_sch_id
2852 ,p_rev_task_nl_rate_sch_id => NULL
2853 ,p_rev_proj_nl_rate_sch_id => rate_rec.non_lab_std_bill_rt_sch_id
2854 ,p_rev_job_rate_sch_id => rate_rec.job_bill_rate_schedule_id
2855 ,p_rev_emp_rate_sch_id => rate_rec.emp_bill_rate_schedule_id
2856 ,p_plan_rev_job_rate_sch_id => rate_rec.rev_job_rate_sch_id
2857 ,p_plan_cost_job_rate_sch_id => rate_rec.cost_job_rate_sch_id
2858 ,p_plan_rev_emp_rate_sch_id => rate_rec.rev_emp_rate_sch_id
2859 ,p_plan_cost_emp_rate_sch_id => rate_rec.cost_emp_rate_sch_id
2860 ,p_plan_rev_nlr_rate_sch_id => rate_rec.rev_non_labor_res_rate_sch_id
2861 ,p_plan_cost_nlr_rate_sch_id => rate_rec.cost_non_labor_res_rate_sch_id
2862 ,p_plan_burden_cost_sch_id => rate_rec.cost_burden_rate_sch_id
2863 ,p_calculate_mode => l_calculate_mode
2864 ,p_mcb_flag => rate_rec.multi_currency_billing_flag
2865 ,p_cost_rate_multiplier => l_cost_rate_multiplier
2866 ,p_bill_rate_multiplier => l_bill_rate_multiplier
2867 ,p_quantity => l_rt_qty_tab(k)
2868 ,p_item_date => l_rt_start_date_tab(k)
2869 ,p_cost_sch_type => l_cost_sch_type
2870 ,p_labor_sch_type => rate_rec.labor_sch_type
2871 ,p_non_labor_sch_type => rate_rec.non_labor_sch_type
2872 ,p_labor_schdl_discnt => NULL
2873 ,p_labor_bill_rate_org_id => rate_rec.labor_bill_rate_org_id
2874 ,p_labor_std_bill_rate_schdl => NULL
2875 ,p_labor_schdl_fixed_date => NULL
2876 ,p_assignment_id => l_rt_res_assignment_id_tab(k)
2877 ,p_project_org_id => rate_rec.org_id
2878 ,p_project_type => rate_rec.project_type
2879 ,p_expenditure_type => NVL(l_rt_expenditure_type_tab(k),l_rt_rate_expenditure_type_tab(k))
2880 ,p_non_labor_resource => l_rt_non_labor_resource_tab(k)
2881 ,p_incurred_by_organz_id => l_rt_organization_id_tab(k)
2882 ,p_override_to_organz_id => l_override_organization_id
2883 ,p_expenditure_org_id => NVL(l_rt_rate_exp_org_id_tab(k),rate_rec.org_id)
2884 ,p_assignment_precedes_task => rate_rec.assign_precedes_task
2885 ,p_planning_transaction_id => NULL
2886 ,p_task_bill_rate_org_id => NULL
2887 ,p_project_bill_rate_org_id => rate_rec.non_labor_bill_rate_org_id
2888 ,p_nlr_organization_id => l_rt_organization_id_tab(k)
2889 ,p_project_sch_date => rate_rec.non_labor_schedule_fixed_date
2890 ,p_task_sch_date => NULL
2891 ,p_project_sch_discount => rate_rec.non_labor_schedule_discount
2892 ,p_task_sch_discount => NULL
2893 ,p_inventory_item_id => l_rt_item_category_id_tab(k)
2894 ,p_BOM_resource_Id => l_rt_bom_resource_id_tab(k)
2895 ,P_mfc_cost_type_id => l_rt_mfc_cost_type_id_tab(k)
2896 ,P_item_category_id => l_rt_item_category_id_tab(k)
2897 ,p_mfc_cost_source => l_mfc_cost_source
2898 ,p_cost_override_rate => NULL
2899 ,p_revenue_override_rate => l_proj_bill_rate_override_tab(j)
2900 ,p_override_burden_cost_rate => NULL
2901 ,p_override_currency_code => l_proj_bill_rate_cur_ovrd_tab(j)
2902 ,p_txn_currency_code => l_txn_currency_code
2903 ,p_raw_cost => NULL
2904 ,p_burden_cost => NULL
2905 ,p_raw_revenue => NULL
2906 ,p_billability_flag => l_proj_billable_flag(j) /* Bug 4548733 */
2907 ,x_bill_rate => x_bill_rate
2908 ,x_cost_rate => x_cost_rate
2909 ,x_burden_cost_rate => x_burden_cost_rate
2910 ,x_burden_multiplier => x_burden_multiplier
2911 ,x_raw_cost => x_raw_cost
2912 ,x_burden_cost => x_burden_cost
2913 ,x_raw_revenue => x_raw_revenue
2914 ,x_bill_markup_percentage => x_bill_markup_percentage
2915 ,x_cost_txn_curr_code => x_cost_txn_curr_code
2916 ,x_rev_txn_curr_code => x_rev_txn_curr_code
2917 ,x_raw_cost_rejection_code => x_raw_cost_rejection_code
2918 ,x_burden_cost_rejection_code => x_burden_cost_rejection_code
2919 ,x_revenue_rejection_code => x_revenue_rejection_code
2920 ,x_cost_ind_compiled_set_id => x_cost_ind_compiled_set_id
2921 ,x_return_status => l_return_status
2922 ,x_msg_data => x_msg_data
2923 ,x_msg_count => x_msg_count
2924 );
2925
2926
2927 IF l_return_status = 'U' THEN
2928 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2929 END IF;
2930
2931 EXCEPTION
2932 WHEN OTHERS THEN
2933
2934 x_raw_cost_rejection_code := SUBSTR('PA_FP_ERROR_FROM_RATE_API_CALL',1,30);
2935 x_burden_cost_rejection_code := SUBSTR(SQLERRM,1,30);
2936 x_revenue_rejection_code := SUBSTR('PA_FP_ERROR_FROM_RATE_API_CALL',1,30);
2937 IF l_return_status = 'U' THEN
2938 x_return_status := l_return_status;
2939 pa_utils.add_message
2940 ( p_app_short_name => 'PA'
2941 ,p_msg_name => 'PA_FP_ERROR_FROM_RATE_API_CALL'
2942 ,p_token1 => 'G_PROJECT_NAME'
2943 ,p_value1 => rate_rec.project_name
2944 ,p_token2 => 'G_TASK_NAME'
2945 ,p_value2 => null
2946 ,p_token3 => 'G_RESOURCE_NAME'
2947 ,p_value3 => l_rt_alias_tab(k)
2948 ,p_token4 => 'TO_CHAR(L_TXN_CURRENCY_CODE)'
2949 ,p_value4 => l_txn_currency_code
2950 ,p_token5 => 'TO_CHAR(L_BUDGET_LINES_START_DATE)'
2951 ,p_value5 => TO_CHAR(l_rt_start_date_tab(k)));
2952 END IF;
2953
2954 x_return_status := l_return_status;
2955 RAISE;
2956 END;
2957
2958 IF p_pa_debug_mode = 'Y' THEN
2959 pa_fp_gen_amount_utils.fp_debug
2960 (p_called_mode => p_called_mode,
2961 p_msg => 'calling client extensions',
2962 p_module_name => l_module_name,
2963 p_log_level => 5);
2964 END IF;
2965
2966 -- 2.5. Call client extension
2967
2968 -- Bug 4549862: Changed IF condition so that l_calculate_mode is
2969 -- checked instead of the target version type. We should only call
2970 -- the cost client extensions if costs are being generated from
2971 -- source cost amounts, which is the case when l_calculate_mode
2972 -- is either 'COST_REVENUE' or 'COST'.
2973
2974 IF l_calculate_mode IN ('COST_REVENUE', 'COST') THEN
2975
2976 l_ce_raw_cost := x_raw_cost;
2977
2978 pa_client_extn_budget.calc_raw_cost
2979 ( x_budget_version_id => p_budget_version_id
2980 ,x_project_id => p_project_id
2981 ,x_task_id => 0
2982 ,x_resource_list_member_id => l_rt_res_list_member_id_tab(k)
2983 ,x_resource_list_id => l_rt_resource_list_id_tab(k)
2984 ,x_resource_id => l_rt_resource_id_tab(k)
2985 ,x_start_date => l_rt_start_date_tab(k)
2986 ,x_end_date => l_rt_end_date_tab(k)
2987 ,x_period_name => l_rt_pd_name_tab(k)
2988 ,x_quantity => l_rt_qty_tab(k)
2989 ,x_raw_cost => l_ce_raw_cost -- IN OUT
2990 ,x_pm_product_code => NULL
2991 ,x_txn_currency_code => x_cost_txn_curr_code
2992 ,x_error_code => l_return_status
2993 ,x_error_message => x_msg_data
2994 );
2995
2996 IF l_return_status <> '0' THEN
2997 x_return_status := FND_API.G_RET_STS_ERROR;
2998 END IF;
2999
3000 IF NVL(l_ce_raw_cost,0) <> NVL(x_raw_cost,0) THEN
3001 x_raw_cost := pa_currency.round_trans_currency_amt1(x_raw_cost,x_cost_txn_curr_code);
3002 END IF;
3003
3004 l_ce_burdened_cost := x_burden_cost;
3005
3006 -- Calling client extn for burdened amts
3007 pa_client_extn_budget.Calc_Burdened_Cost
3008 ( x_budget_version_id => p_budget_version_id
3009 ,x_project_id => p_project_id
3010 ,x_task_id => 0
3011 ,x_resource_list_member_id => l_rt_res_list_member_id_tab(k)
3012 ,x_resource_list_id => l_rt_resource_list_id_tab(k)
3013 ,x_resource_id => l_rt_resource_id_tab(k)
3014 ,x_start_date => l_rt_start_date_tab(k)
3015 ,x_end_date => l_rt_end_date_tab(k)
3016 ,x_period_name => l_rt_pd_name_tab(k)
3017 ,x_quantity => l_rt_qty_tab(k)
3018 ,x_raw_cost => x_raw_cost
3019 ,x_burdened_cost => l_ce_burdened_cost -- IN OUT
3020 ,x_pm_product_code => NULL
3021 ,x_txn_currency_code => x_cost_txn_curr_code
3022 ,x_error_code => l_return_status
3023 ,x_error_message => x_msg_data
3024 );
3025
3026 IF l_return_status <> '0' THEN
3027 x_return_status := FND_API.G_RET_STS_ERROR;
3028 END IF;
3029
3030 IF NVL(l_ce_burdened_cost,0) <> NVL(x_burden_cost,0) THEN
3031 x_burden_cost := pa_currency.round_trans_currency_amt1(l_ce_burdened_cost,x_cost_txn_curr_code);
3032 END IF;
3033
3034 END IF ; -- IF p_fp_cols_rec.x_version_type IN ('ALL','COST') THEN
3035
3036 -- Bug 4549862: Changed IF condition so that l_calculate_mode is
3037 -- checked instead of the target version type. We should only call
3038 -- the revenue client extension if revenue is being generated from
3039 -- source revenue amounts, which is the case when l_calculate_mode
3040 -- is either 'COST_REVENUE' or 'REVENUE'.
3041
3042 IF l_calculate_mode IN ('COST_REVENUE', 'REVENUE') THEN
3043
3044 l_ce_revenue := x_raw_revenue;
3045
3046 -- Calling clinet extn for revenue amts
3047 pa_client_extn_budget.calc_revenue
3048 ( x_budget_version_id => p_budget_version_id
3049 ,x_project_id => p_project_id
3050 ,x_task_id => 0
3051 ,x_resource_list_member_id => l_rt_res_list_member_id_tab(k)
3052 ,x_resource_list_id => l_rt_resource_list_id_tab(k)
3053 ,x_resource_id => l_rt_resource_id_tab(k)
3054 ,x_start_date => l_rt_start_date_tab(k)
3055 ,x_end_date => l_rt_end_date_tab(k)
3056 ,x_period_name => l_rt_pd_name_tab(k)
3057 ,x_quantity => l_rt_qty_tab(k)
3058 ,x_raw_cost => x_raw_cost
3059 ,x_burdened_cost => x_burden_cost
3060 ,x_revenue => l_ce_revenue -- IN OUT
3061 ,x_pm_product_code => NULL
3062 ,x_txn_currency_code => x_rev_txn_curr_code
3063 ,x_error_code => l_return_status
3064 ,x_error_message => x_msg_data
3065 );
3066 IF l_return_status <> '0' THEN
3067 x_return_status := FND_API.G_RET_STS_ERROR;
3068 END IF;
3069
3070 IF NVL(l_ce_revenue,0) <> NVL(x_raw_revenue,0) THEN
3071 x_raw_revenue := pa_currency.round_trans_currency_amt1(l_ce_revenue,x_rev_txn_curr_code);
3072 END IF;
3073
3074 END IF; -- IF p_fp_cols_rec.x_version_type IN ('ALL','REVENUE') THEN
3075
3076 -- Bug 4530753: Previously, local variables were passed to the
3077 -- pa_multi_currency_txn.get_currency_amounts API as IN OUT
3078 -- parameters but never modified by this procedure. The multi-
3079 -- currency API seems to use the given EI date only when the
3080 -- other rate dates are null. Thus, to get the correct periodic
3081 -- rates, we should null out the following local variables:
3082 -- x_dummy_rate_date, x_dummy_rate_type, x_dummy_exch_rate, x_dummy_cost,
3083 -- l_Final_txn_rate_type, l_Final_txn_rate_date, and l_Final_txn_exch_rate.
3084
3085 x_dummy_rate_date := NULL;
3086 x_dummy_rate_type := NULL;
3087 x_dummy_exch_rate := NULL;
3088 x_dummy_cost := NULL;
3089 l_Final_txn_rate_type := NULL;
3090 l_Final_txn_rate_date := NULL;
3091 l_Final_txn_exch_rate := NULL;
3092
3093 -- 3. Convert amounts
3094 -- a. For Approved Revenue, final currency = PFC
3095 -- b. If multi-currency is disabled, final currency = PC
3096 -- c. Otherwise, rev currency should be converted into cost currency (from Rate API).
3097 l_insert_Txn_Currency_Code := l_Final_Txn_Currency_Code; -- Bug 4615589
3098
3099 IF l_Final_Txn_Currency_Code IS NOT NULL THEN
3100
3101 -- Bug 4549862: Modified IF condition so that l_calculate_mode is
3102 -- checked in addition to x_cost_txn_curr_code. We should only call
3103 -- the currency conversion API for cost amounts if costs are
3104 -- being generated from source cost amounts, which is the case
3105 -- when l_calculate_mode is either 'COST_REVENUE' or 'COST'.
3106
3107 IF x_cost_txn_curr_code <> l_Final_Txn_Currency_Code AND
3108 l_calculate_mode IN ('COST_REVENUE', 'COST') THEN
3109
3110 IF p_pa_debug_mode = 'Y' THEN
3111 pa_fp_gen_amount_utils.fp_debug
3112 (p_called_mode => p_called_mode,
3113 p_msg => 'convert cost from '|| x_cost_txn_curr_code ||
3114 ' to '||l_Final_Txn_Currency_Code,
3115 p_module_name => l_module_name,
3116 p_log_level => 5);
3117 END IF;
3118
3119 pa_multi_currency_txn.get_currency_amounts (
3120 p_project_id => p_project_id
3121 ,p_exp_org_id => NVL(l_rt_rate_exp_org_id_tab(k),rate_rec.org_id)
3122 ,p_calling_module => 'WORKPLAN'
3123 ,p_task_id => 0
3124 ,p_ei_date => l_rt_start_date_tab(k)
3125 ,p_denom_raw_cost => 1
3126 ,p_denom_curr_code => x_cost_txn_curr_code -- FROM currency code
3127 ,p_acct_curr_code => x_cost_txn_curr_code
3128 ,p_accounted_flag => 'N'
3129 ,p_acct_rate_date => x_dummy_rate_date
3130 ,p_acct_rate_type => x_dummy_rate_type
3131 ,p_acct_exch_rate => x_dummy_exch_rate
3132 ,p_acct_raw_cost => x_dummy_cost
3133 ,p_project_curr_code => l_Final_Txn_Currency_Code -- TO currency code
3134 ,p_project_rate_type => l_Final_txn_rate_type
3135 ,p_project_rate_date => l_Final_txn_rate_date
3136 ,p_project_exch_rate => l_Final_txn_exch_rate
3137 ,p_project_raw_cost => x_dummy_cost
3138 ,p_projfunc_curr_code => l_Final_Txn_Currency_Code -- TO currency code
3139 ,p_projfunc_cost_rate_type => x_dummy_rate_type
3140 ,p_projfunc_cost_rate_date => x_dummy_rate_date
3141 ,p_projfunc_cost_exch_rate => x_dummy_exch_rate
3142 ,p_projfunc_raw_cost => x_dummy_cost
3143 ,p_system_linkage => 'NER'
3144 ,p_structure_version_id => NULL -- always NULL for finplan
3145 ,p_status => l_status
3146 ,p_stage => l_stage) ;
3147
3148
3149 IF l_final_txn_exch_rate IS NULL OR l_status IS NOT NULL THEN
3150
3151 x_return_status := FND_API.G_RET_STS_ERROR;
3152
3153 pa_utils.add_message
3154 ( p_app_short_name => 'PA'
3155 ,p_msg_name => 'PA_FP_PROJ_NO_TXNCONVRATE'
3156 ,p_token1 => 'G_PROJECT_NAME'
3157 ,p_value1 => rate_rec.project_name
3158 ,p_token2 => 'FROMCURRENCY'
3159 ,p_value2 => x_cost_txn_curr_code
3160 ,p_token3 => 'TOCURRENCY'
3161 ,p_value3 => l_Final_Txn_Currency_Code
3162 ,p_token4 => 'CONVERSION_TYPE'
3163 ,p_value4 => l_Final_txn_rate_type
3164 ,p_token5 => 'CONVERSION_DATE'
3165 ,p_value5 => l_Final_txn_rate_date
3166 );
3167
3168 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3169
3170 END IF; -- IF l_final_txn_exch_rate IS NULL OR l_status IS NOT NULL THEN
3171
3172 IF NVL(x_raw_cost,0) <> 0 THEN
3173 x_raw_cost := x_raw_cost * l_final_txn_exch_rate;
3174 x_raw_cost := pa_currency.round_trans_currency_amt1(x_raw_cost,l_final_txn_currency_code);
3175 END IF;
3176 IF NVL(x_burden_cost,0) <> 0 THEN
3177 x_burden_cost := x_burden_cost * l_final_txn_exch_rate;
3178 x_burden_cost := pa_currency.round_trans_currency_amt1(x_burden_cost,l_final_txn_currency_code);
3179 END IF;
3180
3181
3182 END IF; -- IF x_cost_txn_curr_code <> l_Final_Txn_Currency_Code THEN
3183
3184 -- Bug 4549862: Modified IF condition so that l_calculate_mode is
3185 -- checked in addition to x_rev_txn_curr_code. We should only call
3186 -- the currency conversion API for revenue amounts if revenue is
3187 -- being generated from source revenue amounts, which is the case
3188 -- when l_calculate_mode is either 'COST_REVENUE' or 'REVENUE'.
3189
3190 IF x_rev_txn_curr_code <> l_Final_Txn_Currency_Code AND
3191 l_calculate_mode IN ('COST_REVENUE', 'REVENUE') THEN
3192
3193 IF p_pa_debug_mode = 'Y' THEN
3194 pa_fp_gen_amount_utils.fp_debug
3195 (p_called_mode => p_called_mode,
3196 p_msg => 'convert revenue from '|| x_rev_txn_curr_code ||
3197 ' to '||l_Final_Txn_Currency_Code,
3198 p_module_name => l_module_name,
3199 p_log_level => 5);
3200 END IF;
3201
3202 pa_multi_currency_txn.get_currency_amounts (
3203 p_project_id => p_project_id
3204 ,p_exp_org_id => NVL(l_rt_rate_exp_org_id_tab(k),rate_rec.org_id)
3205 ,p_calling_module => 'WORKPLAN'
3206 ,p_task_id => 0
3207 ,p_ei_date => l_rt_start_date_tab(k)
3208 ,p_denom_raw_cost => 1
3209 ,p_denom_curr_code => x_rev_txn_curr_code -- FROM currency code
3210 ,p_acct_curr_code => x_rev_txn_curr_code
3211 ,p_accounted_flag => 'N'
3212 ,p_acct_rate_date => x_dummy_rate_date
3213 ,p_acct_rate_type => x_dummy_rate_type
3214 ,p_acct_exch_rate => x_dummy_exch_rate
3215 ,p_acct_raw_cost => x_dummy_cost
3216 ,p_project_curr_code => l_Final_Txn_Currency_Code -- TO currency code
3217 ,p_project_rate_type => l_Final_txn_rate_type
3218 ,p_project_rate_date => l_Final_txn_rate_date
3219 ,p_project_exch_rate => l_Final_txn_exch_rate
3220 ,p_project_raw_cost => x_dummy_cost
3221 ,p_projfunc_curr_code => l_Final_Txn_Currency_Code -- TO currency code
3222 ,p_projfunc_cost_rate_type => x_dummy_rate_type
3223 ,p_projfunc_cost_rate_date => x_dummy_rate_date
3224 ,p_projfunc_cost_exch_rate => x_dummy_exch_rate
3225 ,p_projfunc_raw_cost => x_dummy_cost
3226 ,p_system_linkage => 'NER'
3227 ,p_structure_version_id => NULL -- always NULL for finplan
3228 ,p_status => l_status
3229 ,p_stage => l_stage) ;
3230
3231
3232 IF l_final_txn_exch_rate IS NULL OR l_status IS NOT NULL THEN
3233
3234 x_return_status := FND_API.G_RET_STS_ERROR;
3235
3236 pa_utils.add_message
3237 ( p_app_short_name => 'PA'
3238 ,p_msg_name => 'PA_FP_PROJ_NO_TXNCONVRATE'
3239 ,p_token1 => 'G_PROJECT_NAME'
3240 ,p_value1 => rate_rec.project_name
3241 ,p_token2 => 'FROMCURRENCY'
3242 ,p_value2 =>x_rev_txn_curr_code
3243 ,p_token3 => 'TOCURRENCY'
3244 ,p_value3 => l_Final_Txn_Currency_Code
3245 ,p_token4 => 'CONVERSION_TYPE'
3246 ,p_value4 => l_Final_txn_rate_type
3247 ,p_token5 => 'CONVERSION_DATE'
3248 ,p_value5 => l_Final_txn_rate_date
3249 );
3250
3251 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3252
3253 END IF; -- IF l_final_txn_exch_rate IS NULL OR l_status IS NOT NULL THEN
3254
3255 IF NVL(x_raw_revenue,0) <> 0 THEN
3256 x_raw_revenue := x_raw_revenue * l_final_txn_exch_rate;
3257 x_raw_revenue := pa_currency.round_trans_currency_amt1(x_raw_revenue,l_final_txn_currency_code);
3258 END IF;
3259
3260 END IF; -- IF x_rev_txn_curr_code <> <> l_Final_Txn_Currency_Code THEN
3261
3262 -- Bug 4549862: Modified ELSIF condition so that l_calculate_mode
3263 -- also checked. We should only call the currency conversion API
3264 -- for revenue amounts if revenue is being generated from source
3265 -- revenue amounts, which is the case when l_calculate_mode is
3266 -- either 'COST_REVENUE' or 'REVENUE'.
3267
3268 ELSIF x_cost_txn_curr_code <> x_rev_txn_curr_code AND
3269 l_calculate_mode IN ('COST_REVENUE', 'REVENUE') THEN
3270
3271 l_insert_Txn_Currency_Code := x_cost_txn_curr_code; -- Bug 4615589
3272
3273 IF p_pa_debug_mode = 'Y' THEN
3274 pa_fp_gen_amount_utils.fp_debug
3275 (p_called_mode => p_called_mode,
3276 p_msg => 'cost cur <> rev cur, convert revenue from '|| x_rev_txn_curr_code ||
3277 ' to '||l_insert_Txn_Currency_Code, -- Bug 4615589
3278 p_module_name => l_module_name,
3279 p_log_level => 5);
3280 END IF;
3281
3282 pa_multi_currency_txn.get_currency_amounts (
3283 p_project_id => p_project_id
3284 ,p_exp_org_id => NVL(l_rt_rate_exp_org_id_tab(k),rate_rec.org_id)
3285 ,p_calling_module => 'WORKPLAN'
3286 ,p_task_id => 0
3287 ,p_ei_date => l_rt_start_date_tab(k)
3288 ,p_denom_raw_cost => 1
3289 ,p_denom_curr_code => x_rev_txn_curr_code -- FROM currency code
3290 ,p_acct_curr_code => x_rev_txn_curr_code
3291 ,p_accounted_flag => 'N'
3292 ,p_acct_rate_date => x_dummy_rate_date
3293 ,p_acct_rate_type => x_dummy_rate_type
3294 ,p_acct_exch_rate => x_dummy_exch_rate
3295 ,p_acct_raw_cost => x_dummy_cost
3296 ,p_project_curr_code => l_insert_Txn_Currency_Code -- Bug 4615589 TO currency code
3297 ,p_project_rate_type => l_Final_txn_rate_type
3298 ,p_project_rate_date => l_Final_txn_rate_date
3299 ,p_project_exch_rate => l_Final_txn_exch_rate
3300 ,p_project_raw_cost => x_dummy_cost
3301 ,p_projfunc_curr_code => x_rev_txn_curr_code -- 4615656: Should convert based on PC rate type
3302 ,p_projfunc_cost_rate_type => x_dummy_rate_type
3303 ,p_projfunc_cost_rate_date => x_dummy_rate_date
3304 ,p_projfunc_cost_exch_rate => x_dummy_exch_rate
3305 ,p_projfunc_raw_cost => x_dummy_cost
3306 ,p_system_linkage => 'NER'
3307 ,p_structure_version_id => NULL -- always NULL for finplan
3308 ,p_status => l_status
3309 ,p_stage => l_stage) ;
3310
3311
3312 IF l_final_txn_exch_rate IS NULL OR l_status IS NOT NULL THEN
3313
3314 x_return_status := FND_API.G_RET_STS_ERROR;
3315
3316 pa_utils.add_message
3317 ( p_app_short_name => 'PA'
3318 ,p_msg_name => 'PA_FP_PROJ_NO_TXNCONVRATE'
3319 ,p_token1 => 'G_PROJECT_NAME'
3320 ,p_value1 => rate_rec.project_name
3321 ,p_token2 => 'FROMCURRENCY'
3322 ,p_value2 => x_rev_txn_curr_code
3323 ,p_token3 => 'TOCURRENCY'
3324 ,p_value3 => l_insert_Txn_Currency_Code -- Bug 4615589
3325 ,p_token4 => 'CONVERSION_TYPE'
3326 ,p_value4 => l_Final_txn_rate_type
3327 ,p_token5 => 'CONVERSION_DATE'
3328 ,p_value5 => l_Final_txn_rate_date
3329 );
3330
3331 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3332
3333 END IF; -- IF l_final_txn_exch_rate IS NULL OR l_status IS NOT NULL THEN
3334
3335 IF NVL(x_raw_revenue,0) <> 0 THEN
3336 x_raw_revenue := x_raw_revenue * l_final_txn_exch_rate;
3337 x_raw_revenue := pa_currency.round_trans_currency_amt1(x_raw_revenue,l_insert_Txn_Currency_Code); -- Bug 4615589
3338 END IF;
3339
3340 ELSE
3341 l_insert_Txn_Currency_Code := x_cost_txn_curr_code; -- Bug 4615589
3342
3343 END IF; -- ELSIF x_cost_txn_curr_code <> x_rev_txn_curr_code THEN
3344
3345 IF p_pa_debug_mode = 'Y' THEN
3346 pa_fp_gen_amount_utils.fp_debug
3347 (p_called_mode => p_called_mode,
3348 p_msg => 'Populate temporary table (pa_fp_rollup_tmp) with rates and rejection code',
3349 p_module_name => l_module_name,
3350 p_log_level => 5);
3351 pa_fp_gen_amount_utils.fp_debug
3352 (p_called_mode => p_called_mode,
3353 p_msg => 'resource assignment id:'||l_rt_res_assignment_id_tab(k),
3354 p_module_name => l_module_name,
3355 p_log_level => 5);
3356 pa_fp_gen_amount_utils.fp_debug
3357 (p_called_mode => p_called_mode,
3358 p_msg => 'start date:'||l_rt_start_date_tab(k),
3359 p_module_name => l_module_name,
3360 p_log_level => 5);
3361 pa_fp_gen_amount_utils.fp_debug
3362 (p_called_mode => p_called_mode,
3363 p_msg => 'txn currency code:'||l_insert_Txn_Currency_Code,
3364 p_module_name => l_module_name,
3365 p_log_level => 5);
3366 END IF;
3367
3368 -- 5. Populate temporary table (pa_fp_rollup_tmp) with rates and rejection code
3369
3370 -- Bug 4549862: Increment counter to a new unique id.
3371 l_bl_id_counter := l_bl_id_counter + 1;
3372
3373 -- Bug 4549862: Added 2 additional columns to Insert statement (BUDGET_LINE_ID
3374 -- and BILLABLE_FLAG) for further processing by other APIs when generating
3375 -- ALL versions from Staffing Plan with revenue accrual method of COST.
3376
3377 INSERT INTO pa_fp_rollup_tmp(
3378 RESOURCE_ASSIGNMENT_ID,
3379 START_DATE,
3380 END_DATE,
3381 PERIOD_NAME,
3382 QUANTITY,
3383 TXN_CURRENCY_CODE,
3384 TXN_RAW_COST,
3385 TXN_BURDENED_COST,
3386 TXN_REVENUE,
3387 BILL_MARKUP_PERCENTAGE,
3388 COST_REJECTION_CODE,
3389 BURDEN_REJECTION_CODE,
3390 REVENUE_REJECTION_CODE,
3391 COST_IND_COMPILED_SET_ID,
3392 BUDGET_LINE_ID, -- Added for Bug 4549862
3393 BILLABLE_FLAG, -- Added for Bug 4549862
3394 BUDGET_VERSION_ID ) -- Added for Bug 6207688
3395 VALUES(
3396 l_rt_res_assignment_id_tab(k),
3397 l_rt_start_date_tab(k),
3398 l_rt_end_date_tab(k),
3399 l_rt_pd_name_tab(k),
3400 l_rt_qty_tab(k),
3401 l_insert_Txn_Currency_Code, -- Bug 4615589
3402 x_raw_cost,
3403 x_burden_cost,
3404 x_raw_revenue,
3405 x_bill_markup_percentage,
3406 x_raw_cost_rejection_code,
3407 x_burden_cost_rejection_code,
3408 x_revenue_rejection_code,
3409 x_cost_ind_compiled_set_id,
3410 l_bl_id_counter, -- Added for Bug 4549862
3411 l_proj_billable_flag(j), -- Added for Bug 4549862
3412 P_BUDGET_VERSION_ID ); -- Added for Bug 6207688
3413
3414
3415 END LOOP; -- FOR k in 1..l_rt_start_date_tab.COUNT LOOP
3416
3417 END LOOP; -- FOR j IN 1..l_proj_assgn_id_tab.count LOOP
3418
3419 -- Bug 4549862: The PA_FP_ROLLUP_TMP global temp table has now
3420 -- been populated with Txn generation data as well as rejection
3421 -- codes for raw cost, burden cost, and revenue.
3422 --
3423 -- If the revenue accrual method is COST, we should call the
3424 -- currency conversion API to populate pc/pfc amounts in the
3425 -- temp table and let control return to the Budget or Forecast
3426 -- wrapper API without propagating data to the budget lines.
3427 --
3428 -- If the revenue accrual method is NOT COST, then propagate
3429 -- temp table data to the budget lines as before.
3430
3431 IF l_rev_gen_method = 'C' THEN
3432
3433 -- Bug 4549862: Call currency conversion API. Passing 'N' for
3434 -- the p_entire_version parameter tells to the API to convert
3435 -- currencies in the PA_FP_ROLLUP_TMP table instead of in the
3436 -- PA_BUDGET_LINES table.
3437
3438 IF p_pa_debug_mode = 'Y' THEN
3439 pa_fp_gen_amount_utils.fp_debug
3440 (p_called_mode => p_called_mode,
3441 p_msg => 'Before calling
3442 pa_fp_multi_currency_pkg.convert_txn_currency',
3443 p_module_name => l_module_name,
3444 p_log_level => 5);
3445 END IF;
3446 PA_FP_MULTI_CURRENCY_PKG.CONVERT_TXN_CURRENCY
3447 ( p_budget_version_id => P_BUDGET_VERSION_ID,
3448 p_entire_version => 'N',
3449 p_calling_module => 'BUDGET_GENERATION', -- Added for Bug#5395732
3450 X_RETURN_STATUS => X_RETURN_STATUS,
3451 X_MSG_COUNT => X_MSG_COUNT,
3452 X_MSG_DATA => X_MSG_DATA );
3453 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
3454 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3455 END IF;
3456 IF p_pa_debug_mode = 'Y' THEN
3457 pa_fp_gen_amount_utils.fp_debug
3458 (p_called_mode => p_called_mode,
3459 p_msg => 'Status after calling
3460 pa_fp_multi_currency_pkg.convert_txn_currency: '
3461 ||x_return_status,
3462 p_module_name => l_module_name,
3463 p_log_level => 5);
3464 END IF;
3465
3466 END IF; -- l_rev_gen_method = 'C'
3467
3468
3469 -- Bug 4549862: At this point, for each set of requirements/assignments
3470 -- mapping to the same target resource, there may be multiple non-null
3471 -- values for each rejection code column when the target version is None
3472 -- timephased. However, we can only store one rejection code value per
3473 -- budget line. Our current approach is to randomly pick 1 rejection code
3474 -- value to store in each column when there are multiple values.
3475 -- At the same time, ff a requirement/assignment has a non-null rejection
3476 -- code, then all the other requirements/assignments mapping to the same
3477 -- target resource need to be updated with the same rejection code value,
3478 -- and the corresponding amounts should be nulled out.
3479 -- This logic applies if the target version is None timephased.
3480
3481 IF p_fp_cols_rec.x_time_phased_code = 'N' THEN
3482
3483 IF l_rev_gen_method = 'C' THEN
3484
3485 -- A1. Logic to update cost rejection code and cost columns
3486 SELECT RESOURCE_ASSIGNMENT_ID,
3487 TXN_CURRENCY_CODE,
3488 MIN(COST_REJECTION_CODE)
3489 BULK COLLECT INTO
3490 l_rej_code_ra_id_tab,
3491 l_rej_code_txn_currency_tab,
3492 l_rej_code_msg_name_tab
3493 FROM pa_fp_rollup_tmp
3494 WHERE cost_rejection_code is not null
3495 GROUP BY RESOURCE_ASSIGNMENT_ID,
3496 TXN_CURRENCY_CODE;
3497
3498 FORALL i IN 1..l_rej_code_ra_id_tab.COUNT
3499 UPDATE pa_fp_rollup_tmp
3500 SET TXN_RAW_COST = NULL,
3501 PROJECT_RAW_COST = NULL,
3502 PROJFUNC_RAW_COST = NULL,
3503 COST_REJECTION_CODE = l_rej_code_msg_name_tab(i)
3504 WHERE resource_assignment_id = l_rej_code_ra_id_tab(i)
3505 AND txn_currency_code = l_rej_code_txn_currency_tab(i);
3506
3507 -- A2. Logic to update burden rejection code and cost columns
3508 SELECT RESOURCE_ASSIGNMENT_ID,
3509 TXN_CURRENCY_CODE,
3510 MIN(BURDEN_REJECTION_CODE)
3511 BULK COLLECT INTO
3512 l_rej_code_ra_id_tab,
3513 l_rej_code_txn_currency_tab,
3514 l_rej_code_msg_name_tab
3515 FROM pa_fp_rollup_tmp
3516 WHERE burden_rejection_code is not null
3517 GROUP BY RESOURCE_ASSIGNMENT_ID,
3518 TXN_CURRENCY_CODE;
3519
3520 FORALL i IN 1..l_rej_code_ra_id_tab.COUNT
3521 UPDATE pa_fp_rollup_tmp
3522 SET TXN_BURDENED_COST = NULL,
3523 PROJECT_BURDENED_COST = NULL,
3524 PROJFUNC_BURDENED_COST = NULL,
3525 BURDEN_REJECTION_CODE = l_rej_code_msg_name_tab(i)
3526 WHERE resource_assignment_id = l_rej_code_ra_id_tab(i)
3527 AND txn_currency_code = l_rej_code_txn_currency_tab(i);
3528
3529 -- A3. Logic to update pc currency conversion rejection code and pc amounts
3530 SELECT RESOURCE_ASSIGNMENT_ID,
3531 TXN_CURRENCY_CODE,
3532 MIN(PC_CUR_CONV_REJECTION_CODE)
3533 BULK COLLECT INTO
3534 l_rej_code_ra_id_tab,
3535 l_rej_code_txn_currency_tab,
3536 l_rej_code_msg_name_tab
3537 FROM pa_fp_rollup_tmp
3538 WHERE pc_cur_conv_rejection_code is not null
3539 GROUP BY RESOURCE_ASSIGNMENT_ID,
3540 TXN_CURRENCY_CODE;
3541
3542 FORALL i IN 1..l_rej_code_ra_id_tab.COUNT
3543 UPDATE pa_fp_rollup_tmp
3544 SET PROJECT_RAW_COST = NULL,
3545 PROJECT_BURDENED_COST = NULL,
3546 PROJECT_REVENUE = NULL,
3547 PC_CUR_CONV_REJECTION_CODE = l_rej_code_msg_name_tab(i)
3548 WHERE resource_assignment_id = l_rej_code_ra_id_tab(i)
3549 AND txn_currency_code = l_rej_code_txn_currency_tab(i);
3550
3551 -- A4. Logic to update pfc currency conversion rejection code and pfc amounts
3552 SELECT RESOURCE_ASSIGNMENT_ID,
3553 TXN_CURRENCY_CODE,
3554 MIN(PFC_CUR_CONV_REJECTION_CODE)
3555 BULK COLLECT INTO
3556 l_rej_code_ra_id_tab,
3557 l_rej_code_txn_currency_tab,
3558 l_rej_code_msg_name_tab
3559 FROM pa_fp_rollup_tmp
3560 WHERE pfc_cur_conv_rejection_code is not null
3561 GROUP BY RESOURCE_ASSIGNMENT_ID,
3562 TXN_CURRENCY_CODE;
3563
3564 FORALL i IN 1..l_rej_code_ra_id_tab.COUNT
3565 UPDATE pa_fp_rollup_tmp
3566 SET PROJFUNC_RAW_COST = NULL,
3567 PROJFUNC_BURDENED_COST = NULL,
3568 PROJFUNC_REVENUE = NULL,
3569 PFC_CUR_CONV_REJECTION_CODE = l_rej_code_msg_name_tab(i)
3570 WHERE resource_assignment_id = l_rej_code_ra_id_tab(i)
3571 AND txn_currency_code = l_rej_code_txn_currency_tab(i);
3572
3573 ELSE -- l_rev_gen_method <> 'C'
3574
3575 -- B1. Logic to update cost rejection code and txn_raw_cost
3576 SELECT RESOURCE_ASSIGNMENT_ID,
3577 TXN_CURRENCY_CODE,
3578 MIN(COST_REJECTION_CODE)
3579 BULK COLLECT INTO
3580 l_rej_code_ra_id_tab,
3581 l_rej_code_txn_currency_tab,
3582 l_rej_code_msg_name_tab
3583 FROM pa_fp_rollup_tmp
3584 WHERE cost_rejection_code is not null
3585 GROUP BY RESOURCE_ASSIGNMENT_ID,
3586 TXN_CURRENCY_CODE;
3587
3588 FORALL i IN 1..l_rej_code_ra_id_tab.COUNT
3589 UPDATE pa_fp_rollup_tmp
3590 SET TXN_RAW_COST = NULL,
3591 COST_REJECTION_CODE = l_rej_code_msg_name_tab(i)
3592 WHERE resource_assignment_id = l_rej_code_ra_id_tab(i)
3593 AND txn_currency_code = l_rej_code_txn_currency_tab(i);
3594
3595 -- B2. Logic to update burden rejection code and txn_burdened_cost
3596 SELECT RESOURCE_ASSIGNMENT_ID,
3597 TXN_CURRENCY_CODE,
3598 MIN(BURDEN_REJECTION_CODE)
3599 BULK COLLECT INTO
3600 l_rej_code_ra_id_tab,
3601 l_rej_code_txn_currency_tab,
3602 l_rej_code_msg_name_tab
3603 FROM pa_fp_rollup_tmp
3604 WHERE burden_rejection_code is not null
3605 GROUP BY RESOURCE_ASSIGNMENT_ID,
3606 TXN_CURRENCY_CODE;
3607
3608 FORALL i IN 1..l_rej_code_ra_id_tab.COUNT
3609 UPDATE pa_fp_rollup_tmp
3610 SET TXN_BURDENED_COST = NULL,
3611 BURDEN_REJECTION_CODE = l_rej_code_msg_name_tab(i)
3612 WHERE resource_assignment_id = l_rej_code_ra_id_tab(i)
3613 AND txn_currency_code = l_rej_code_txn_currency_tab(i);
3614
3615 -- B3. Logic to update revenue rejection code and txn_revenue_cost.
3616 -- This logic differs from Step 5.5 because FIND_REJECTION_CODE
3617 -- matches requirement/assignment records based on start_date,
3618 -- which could miss records when the target is None timephased.
3619 SELECT DISTINCT
3620 RESOURCE_ASSIGNMENT_ID,
3621 TXN_CURRENCY_CODE,
3622 MIN(REVENUE_REJECTION_CODE)
3623 BULK COLLECT INTO
3624 l_rej_code_ra_id_tab,
3625 l_rej_code_txn_currency_tab,
3626 l_rej_code_msg_name_tab
3627 FROM pa_fp_rollup_tmp
3628 WHERE revenue_rejection_code is not null
3629 GROUP BY RESOURCE_ASSIGNMENT_ID,
3630 TXN_CURRENCY_CODE;
3631
3632 FORALL i IN 1..l_rej_code_ra_id_tab.COUNT
3633 UPDATE pa_fp_rollup_tmp
3634 SET TXN_REVENUE = NULL,
3635 REVENUE_REJECTION_CODE = l_rej_code_msg_name_tab(i)
3636 WHERE resource_assignment_id = l_rej_code_ra_id_tab(i)
3637 AND txn_currency_code = l_rej_code_txn_currency_tab(i);
3638
3639 END IF; -- l_rev_gen_method = 'C'
3640
3641 END IF; -- p_fp_cols_rec.x_time_phased_code = 'N'
3642
3643
3644 IF l_rev_gen_method = 'C' THEN
3645
3646 -- Bug 4549862: Returning control to the Budget or Forecast
3647 -- wrapper API, which will call GEN_COST_BASED_REVENUE to
3648 -- finish processing the data in PA_FP_ROLLUP_TMP and write
3649 -- it to the budget lines.
3650
3651 RETURN;
3652
3653 ELSE -- l_rev_gen_method <> 'C'
3654
3655 -- 5.5. If there are multiple lines with the same resource assignment
3656 -- id, txn currency code and start date, remove the revenue amount and stamp
3657 -- the rev rejection code on the lines with revenue amount. This situation is
3658 -- formed if there are multiple project assignments contributing to a single
3659 -- budget line. Some project assignment have bill rate override and the std rates
3660 -- are not available for the rest of the project assignments.
3661 OPEN FIND_REJECTION_CODE;
3662 FETCH FIND_REJECTION_CODE BULK COLLECT INTO
3663 l_rej_res_assignment_id_tab,
3664 l_rej_start_date_tab,
3665 l_rej_txn_currency_code_tab,
3666 l_rej_revenue_rej_code_tab;
3667 CLOSE FIND_REJECTION_CODE;
3668
3669 FOR m IN 1..l_rej_res_assignment_id_tab.COUNT LOOP
3670
3671 UPDATE pa_fp_rollup_tmp
3672 SET TXN_REVENUE = NULL,
3673 REVENUE_REJECTION_CODE = l_rej_revenue_rej_code_tab(m)
3674 WHERE resource_assignment_id = l_rej_res_assignment_id_tab(m)
3675 AND start_date = l_rej_start_date_tab(m)
3676 AND txn_currency_code = l_rej_txn_currency_code_tab(m)
3677 AND (txn_revenue is not null OR
3678 revenue_rejection_code is null);
3679
3680 END LOOP; -- FOR m IN 1..l_rej_res_assignment_id_tab.COUNT LOOP
3681
3682 IF p_pa_debug_mode = 'Y' THEN
3683 pa_fp_gen_amount_utils.fp_debug
3684 (p_called_mode => p_called_mode,
3685 p_msg => 'Group temp table data by res asgmt, txn cur and period. Insert into budget lines',
3686 p_module_name => l_module_name,
3687 p_log_level => 5);
3688 END IF;
3689
3690 -- 6. Group the temporary table data by resource assignment, txn currency code and period name
3691
3692 -- Bug 4549862: If the target version is None timephased and the
3693 -- context is Forecast generation, then budget lines containing
3694 -- actuals may exist. As a result, some of the data in the temp
3695 -- table may need to be Inserted while other data in the table
3696 -- may need to be Updated in pa_budget_lines.
3697 --
3698 -- Group the temporary table data by resource assignment and txn
3699 -- currency code using separate cursors for the Insert/Update cases.
3700
3701 IF p_fp_cols_rec.x_time_phased_code = 'N' AND
3702 p_fp_cols_rec.x_plan_class_code = 'FORECAST' THEN
3703
3704 -- Bug 4549862: Fetch data for Insert.
3705 OPEN GROUP_TO_INS_INTO_NTP_FCST_BL;
3706 FETCH GROUP_TO_INS_INTO_NTP_FCST_BL BULK COLLECT INTO
3707 l_bl_RES_ASSIGNMENT_ID_tab,
3708 l_bl_START_DATE_tab,
3709 l_bl_END_DATE_tab,
3710 l_bl_PERIOD_NAME_tab,
3711 l_bl_QUANTITY_tab,
3712 l_bl_TXN_CURRENCY_CODE_tab,
3713 l_bl_TXN_RAW_COST_tab,
3714 l_bl_TXN_BURDENED_COST_tab,
3715 l_bl_TXN_REVENUE_tab,
3716 l_bl_BILL_MARKUP_PERCENT_tab,
3717 l_bl_COST_REJECTION_CODE_tab,
3718 l_bl_BURDEN_REJECTION_CODE_tab,
3719 l_bl_REV_REJECTION_CODE_tab,
3720 l_bl_COST_IND_C_SET_ID_tab;
3721 CLOSE GROUP_TO_INS_INTO_NTP_FCST_BL;
3722
3723 -- Bug 4549862: Fetch data for Update.
3724 OPEN GROUP_TO_UPD_INTO_NTP_FCST_BL;
3725 FETCH GROUP_TO_UPD_INTO_NTP_FCST_BL BULK COLLECT INTO
3726 l_upd_bl_RES_ASSIGNMENT_ID_tab,
3727 l_upd_bl_START_DATE_tab,
3728 l_upd_bl_END_DATE_tab,
3729 l_upd_bl_PERIOD_NAME_tab,
3730 l_upd_bl_QUANTITY_tab,
3731 l_upd_bl_TXN_CURRENCY_CODE_tab,
3732 l_upd_bl_TXN_RAW_COST_tab,
3733 l_upd_bl_TXN_BURDENED_COST_tab,
3734 l_upd_bl_TXN_REVENUE_tab,
3735 l_upd_bl_BILL_MARKUP_PRCNT_tab,
3736 l_upd_bl_COST_REJ_CODE_tab,
3737 l_upd_bl_BURDEN_REJ_CODE_tab,
3738 l_upd_bl_REV_REJ_CODE_tab,
3739 l_upd_bl_COST_IND_C_SET_ID_tab;
3740 CLOSE GROUP_TO_UPD_INTO_NTP_FCST_BL;
3741
3742 -- Bug 4549862: If the context is Budget generation, then we do
3743 -- not need to worry about the existence of budget lines containing
3744 -- actuals, so all temp table data can be Inserted into the budget
3745 -- lines table. If the context is Forecast generation and the target
3746 -- version is timephased by either PA or GL, then budget lines with
3747 -- actuals will only exist for periods through the Actuals Through
3748 -- Date. Since the temp table will contain ETC data in this case,
3749 -- all temp table data can be Inserted into the budget lines table.
3750 -- Therefore, in the ELSE block, fetch all of the data.
3751
3752 ELSE
3753
3754 -- Bug 4615787: When the Target is timephased by PA or GL, we
3755 -- should continue to fetch pa_fp_rollup_tmp data using the
3756 -- GROUP_TO_INSERT_INTO_PA_GL_BL cursor. When the Target is None
3757 -- timephased, use the new GROUP_TO_INSERT_INTO_PA_GL_BL cursor
3758 -- instead so that only a single record is fetched for each
3759 -- (Resource Assignment Id, Txn Currency) combination.
3760
3761 IF p_fp_cols_rec.x_time_phased_code IN ('P','G') THEN
3762 OPEN GROUP_TO_INSERT_INTO_PA_GL_BL;
3763 FETCH GROUP_TO_INSERT_INTO_PA_GL_BL BULK COLLECT INTO
3764 l_bl_RES_ASSIGNMENT_ID_tab,
3765 l_bl_START_DATE_tab,
3766 l_bl_END_DATE_tab,
3767 l_bl_PERIOD_NAME_tab,
3768 l_bl_QUANTITY_tab,
3769 l_bl_TXN_CURRENCY_CODE_tab,
3770 l_bl_TXN_RAW_COST_tab,
3771 l_bl_TXN_BURDENED_COST_tab,
3772 l_bl_TXN_REVENUE_tab,
3773 l_bl_BILL_MARKUP_PERCENT_tab,
3774 l_bl_COST_REJECTION_CODE_tab,
3775 l_bl_BURDEN_REJECTION_CODE_tab,
3776 l_bl_REV_REJECTION_CODE_tab,
3777 l_bl_COST_IND_C_SET_ID_tab;
3778 CLOSE GROUP_TO_INSERT_INTO_PA_GL_BL;
3779 ELSIF p_fp_cols_rec.x_time_phased_code = 'N' THEN
3780 OPEN GROUP_TO_INSERT_INTO_NTP_BL;
3781 FETCH GROUP_TO_INSERT_INTO_NTP_BL BULK COLLECT INTO
3782 l_bl_RES_ASSIGNMENT_ID_tab,
3783 l_bl_START_DATE_tab,
3784 l_bl_END_DATE_tab,
3785 l_bl_PERIOD_NAME_tab,
3786 l_bl_QUANTITY_tab,
3787 l_bl_TXN_CURRENCY_CODE_tab,
3788 l_bl_TXN_RAW_COST_tab,
3789 l_bl_TXN_BURDENED_COST_tab,
3790 l_bl_TXN_REVENUE_tab,
3791 l_bl_BILL_MARKUP_PERCENT_tab,
3792 l_bl_COST_REJECTION_CODE_tab,
3793 l_bl_BURDEN_REJECTION_CODE_tab,
3794 l_bl_REV_REJECTION_CODE_tab,
3795 l_bl_COST_IND_C_SET_ID_tab;
3796 CLOSE GROUP_TO_INSERT_INTO_NTP_BL;
3797 END IF; -- time phase check
3798
3799 END IF; -- None timephased Forecast check
3800
3801
3802 -- 7. Insert into budget lines: quantity, cost and revenue amounts, txn currency code,
3803 -- cost ind compiled set id and rejection codes
3804 IF l_bl_RES_ASSIGNMENT_ID_tab.COUNT > 0 THEN
3805
3806 FORALL bl_index IN 1 .. l_bl_START_DATE_tab.COUNT
3807 INSERT INTO PA_BUDGET_LINES(
3808 RESOURCE_ASSIGNMENT_ID,
3809 START_DATE,
3810 LAST_UPDATE_DATE,
3811 LAST_UPDATED_BY,
3812 CREATION_DATE,
3813 CREATED_BY,
3814 LAST_UPDATE_LOGIN,
3815 END_DATE,
3816 PERIOD_NAME,
3817 QUANTITY,
3818 TXN_CURRENCY_CODE,
3819 BUDGET_LINE_ID,
3820 BUDGET_VERSION_ID,
3821 -- PROJECT_CURRENCY_CODE,
3822 -- PROJFUNC_CURRENCY_CODE,
3823 TXN_COST_RATE_OVERRIDE,
3824 TXN_BILL_RATE_OVERRIDE , -- override rate on project assignment
3825 BURDEN_COST_RATE_OVERRIDE,
3826 TXN_RAW_COST,
3827 TXN_BURDENED_COST,
3828 TXN_REVENUE,
3829 TXN_MARKUP_PERCENT_OVERRIDE,
3830 COST_REJECTION_CODE,
3831 BURDEN_REJECTION_CODE,
3832 REVENUE_REJECTION_CODE,
3833 COST_IND_COMPILED_SET_ID)
3834 VALUES(
3835 l_bl_RES_ASSIGNMENT_ID_tab(bl_index),
3836 l_bl_START_DATE_tab(bl_index),
3837 l_sysdate,
3838 l_last_updated_by,
3839 l_sysdate,
3840 l_last_updated_by,
3841 l_last_update_login,
3842 l_bl_END_DATE_tab(bl_index),
3843 l_bl_PERIOD_NAME_tab(bl_index),
3844 l_bl_QUANTITY_tab(bl_index),
3845 l_bl_TXN_CURRENCY_CODE_tab(bl_index),
3846 PA_BUDGET_LINES_S.nextval,
3847 P_BUDGET_VERSION_ID,
3848 DECODE(l_bl_QUANTITY_tab(bl_index), 0, NULL, l_bl_TXN_RAW_COST_tab(bl_index)/l_bl_QUANTITY_tab(bl_index)),
3849 DECODE(l_bl_QUANTITY_tab(bl_index), 0, NULL, l_bl_TXN_REVENUE_tab(bl_index)/l_bl_QUANTITY_tab(bl_index)),
3850 DECODE(l_bl_QUANTITY_tab(bl_index), 0, NULL, l_bl_TXN_BURDENED_COST_tab(bl_index)/l_bl_QUANTITY_tab(bl_index)),
3851 l_bl_TXN_RAW_COST_tab(bl_index),
3852 l_bl_TXN_BURDENED_COST_tab(bl_index),
3853 l_bl_TXN_REVENUE_tab(bl_index),
3854 l_bl_BILL_MARKUP_PERCENT_tab(bl_index),
3855 l_bl_COST_REJECTION_CODE_tab(bl_index),
3856 l_bl_BURDEN_REJECTION_CODE_tab(bl_index),
3857 l_bl_REV_REJECTION_CODE_tab(bl_index),
3858 l_bl_COST_IND_C_SET_ID_tab(bl_index));
3859
3860 END IF; -- IF l_bl_RES_ASSIGNMENT_ID_tab.COUNT > 0 THEN
3861
3862
3863 -- Bug 4549862: If the target version is None timephased and the
3864 -- context is Forecast generation, then budget lines containing
3865 -- actuals may exist. As a result, some of the data in the temp
3866 -- table may need to be Inserted while other data in the table
3867 -- may need to be Updated in pa_budget_lines.
3868 --
3869 -- The following code Updates the budget lines.
3870
3871 IF l_upd_bl_RES_ASSIGNMENT_ID_tab.COUNT > 0 THEN
3872
3873 FORALL bl_index IN 1 .. l_upd_bl_START_DATE_tab.COUNT
3874 UPDATE PA_BUDGET_LINES
3875 SET LAST_UPDATE_DATE = l_sysdate,
3876 LAST_UPDATED_BY = l_last_updated_by,
3877 LAST_UPDATE_LOGIN = l_last_update_login,
3878 START_DATE = LEAST(START_DATE, l_upd_bl_START_DATE_tab(bl_index)),
3879 END_DATE = GREATEST(END_DATE, l_upd_bl_END_DATE_tab(bl_index)),
3880 QUANTITY =
3881 DECODE(INIT_QUANTITY, null, l_upd_bl_QUANTITY_tab(bl_index),
3882 INIT_QUANTITY + NVL(l_upd_bl_QUANTITY_tab(bl_index),0)),
3883 TXN_RAW_COST =
3884 DECODE(TXN_INIT_RAW_COST, null, l_upd_bl_TXN_RAW_COST_tab(bl_index),
3885 TXN_INIT_RAW_COST + NVL(l_upd_bl_TXN_RAW_COST_tab(bl_index),0)),
3886 TXN_BURDENED_COST =
3887 DECODE(TXN_INIT_BURDENED_COST, null, l_upd_bl_TXN_BURDENED_COST_tab(bl_index),
3888 TXN_INIT_BURDENED_COST + NVL(l_upd_bl_TXN_BURDENED_COST_tab(bl_index),0)),
3889 TXN_REVENUE =
3890 DECODE(TXN_INIT_REVENUE, null, l_upd_bl_TXN_REVENUE_tab(bl_index),
3891 TXN_INIT_REVENUE + NVL(l_upd_bl_TXN_REVENUE_tab(bl_index),0)),
3892 TXN_COST_RATE_OVERRIDE =
3893 DECODE(l_upd_bl_QUANTITY_tab(bl_index), 0, NULL,
3894 l_upd_bl_TXN_RAW_COST_tab(bl_index)/l_upd_bl_QUANTITY_tab(bl_index)),
3895 -- override rate on project assignment
3896 TXN_BILL_RATE_OVERRIDE =
3897 DECODE(l_upd_bl_QUANTITY_tab(bl_index), 0, NULL,
3898 l_upd_bl_TXN_REVENUE_tab(bl_index)/l_upd_bl_QUANTITY_tab(bl_index)),
3899 BURDEN_COST_RATE_OVERRIDE =
3900 DECODE(l_upd_bl_QUANTITY_tab(bl_index), 0, NULL,
3901 l_upd_bl_TXN_BURDENED_COST_tab(bl_index)/l_upd_bl_QUANTITY_tab(bl_index)),
3902 TXN_MARKUP_PERCENT_OVERRIDE = l_upd_bl_BILL_MARKUP_PRCNT_tab(bl_index),
3903 COST_REJECTION_CODE = l_upd_bl_COST_REJ_CODE_tab(bl_index),
3904 BURDEN_REJECTION_CODE = l_upd_bl_BURDEN_REJ_CODE_tab(bl_index),
3905 REVENUE_REJECTION_CODE = l_upd_bl_REV_REJ_CODE_tab(bl_index),
3906 COST_IND_COMPILED_SET_ID = l_upd_bl_COST_IND_C_SET_ID_tab(bl_index)
3907 WHERE RESOURCE_ASSIGNMENT_ID = l_upd_bl_RES_ASSIGNMENT_ID_tab(bl_index)
3908 AND TXN_CURRENCY_CODE = l_upd_bl_TXN_CURRENCY_CODE_tab(bl_index);
3909
3910 END IF; -- l_upd_bl_RES_ASSIGNMENT_ID_tab.COUNT > 0 check
3911
3912 END IF; -- l_rev_gen_method check for Bug 4549862
3913
3914 ELSE -- p_fp_cols_rec.x_version_type = 'ALL' AND l_bill_rate_ovrd_exists_flag = 'Y' THEN
3915
3916 -- END OF M-closeout: Bill Rate Override ER
3917
3918 FOR j IN 1..l_proj_assgn_id_tab.count LOOP
3919 --dbms_output.put_line('before cursor:l_proj_res_assgn_id_tab('||j
3920 -- ||'):'||l_proj_res_assgn_id_tab(j)
3921 -- ||';p_actuals_thru_date:'||p_actuals_thru_date);
3922 IF p_pa_debug_mode = 'Y' THEN
3923 pa_fp_gen_amount_utils.fp_debug
3924 (p_called_mode => p_called_mode,
3925 p_msg => 'before cursor:l_proj_assgn_id_tab('||j
3926 ||'):'||l_proj_assgn_id_tab(j)
3927 ||';p_actuals_thru_date:'||p_actuals_thru_date,
3928 p_module_name => l_module_name,
3929 p_log_level => 5);
3930 END IF;
3931
3932 IF p_FP_COLS_REC.X_TIME_PHASED_CODE = 'P' THEN
3933 OPEN FCST_PA(l_proj_assgn_id_tab(j),p_actuals_thru_date,l_proj_exp_organization_id_tab(j), l_org_id);
3934
3935 ELSIF p_FP_COLS_REC.X_TIME_PHASED_CODE = 'G' THEN
3936 OPEN FCST_GL(l_proj_assgn_id_tab(j),p_actuals_thru_date,l_proj_exp_organization_id_tab(j));
3937
3938 ELSE
3939 OPEN FCST_NONE(l_proj_assgn_id_tab(j),p_actuals_thru_date,l_proj_exp_organization_id_tab(j));
3940 END IF;
3941
3942 l_budget_lines_tbl.delete;
3943 l_rt_forecast_item_id_tab.delete;
3944 l_rt_pd_name_tab.delete;
3945 l_rt_start_date_tab.delete;
3946 l_rt_end_date_tab.delete;
3947 l_rt_qty_tab.delete;
3948 l_rt_exp_org_id_tab.delete;
3949 l_rt_exp_organization_id_tab.delete;
3950 l_rt_exp_func_raw_cst_rt_tab.delete;
3951 l_rt_exp_func_raw_cst_tab.delete;
3952 l_rt_exp_func_bur_cst_rt_tab.delete;
3953 l_rt_exp_func_burdned_cst_tab.delete;
3954 l_rt_projfunc_bill_rt_tab.delete;
3955 l_rt_projfunc_raw_revenue_tab.delete;
3956 l_rt_projfunc_raw_cst_tab.delete;
3957 l_rt_projfunc_raw_cst_rt_tab.delete;
3958 l_rt_projfunc_burdned_cst_tab.delete;
3959 l_rt_projfunc_bd_cst_rt_tab.delete;
3960 l_rt_rev_rejct_reason_tab.delete;
3961 l_rt_cst_rejct_reason_tab.delete;
3962 l_rt_burdned_rejct_reason_tab.delete;
3963 l_rt_others_rejct_reason_tab.delete;
3964
3965 l_init_bill_rate_flag := 'N';
3966
3967 IF p_FP_COLS_REC.X_TIME_PHASED_CODE = 'P' THEN
3968 FETCH FCST_PA BULK COLLECT INTO
3969 l_rt_exp_org_id_tab,
3970 l_rt_exp_organization_id_tab,
3971 l_rt_pd_name_tab,
3972 l_rt_start_date_tab,
3973 l_rt_end_date_tab,
3974 l_rt_qty_tab,
3975 l_rt_forecast_item_id_tab;
3976
3977 ELSIF p_FP_COLS_REC.X_TIME_PHASED_CODE = 'G' THEN
3978 FETCH FCST_GL BULK COLLECT INTO
3979 l_rt_exp_org_id_tab,
3980 l_rt_exp_organization_id_tab,
3981 l_rt_pd_name_tab,
3982 l_rt_start_date_tab,
3983 l_rt_end_date_tab,
3984 l_rt_qty_tab,
3985 l_rt_forecast_item_id_tab;
3986 ELSE
3987 FETCH FCST_NONE BULK COLLECT INTO
3988 l_rt_exp_org_id_tab,
3989 l_rt_exp_organization_id_tab,
3990 l_rt_qty_tab,
3991 l_rt_forecast_item_id_tab,
3992 l_rt_pd_name_tab,
3993 l_rt_start_date_tab,
3994 l_rt_end_date_tab;
3995 END IF;
3996
3997 IF p_FP_COLS_REC.X_TIME_PHASED_CODE = 'P' THEN
3998 CLOSE FCST_PA;
3999
4000 ELSIF p_FP_COLS_REC.X_TIME_PHASED_CODE = 'G' THEN
4001 CLOSE FCST_GL;
4002
4003 ELSE
4004 CLOSE FCST_NONE;
4005 END IF;
4006
4007 IF p_pa_debug_mode = 'Y' THEN
4008 pa_fp_gen_amount_utils.fp_debug
4009 (p_called_mode => p_called_mode,
4010 p_msg => '==j=='||j
4011 ||';==l_rt_start_date_tab.count:'||l_rt_start_date_tab.count,
4012 p_module_name => l_module_name,
4013 p_log_level => 5);
4014 END IF;
4015 SELECT count(*)
4016 INTO l_count
4017 FROM pa_budget_lines
4018 WHERE resource_assignment_id = l_proj_res_assgn_id_tab(j)
4019 AND rownum <2;
4020
4021 --dbms_output.put_line('==j=='||j
4022 -- ||';l_proj_res_assgn_id_tab(j):'||l_proj_res_assgn_id_tab(j)
4023 -- ||';count:'||l_count
4024 -- ||';l_rt_start_date_tab.count:'||l_rt_start_date_tab.count);
4025 IF p_pa_debug_mode = 'Y' THEN
4026 pa_fp_gen_amount_utils.fp_debug
4027 (p_called_mode => p_called_mode,
4028 p_msg => '==j=='||j
4029 ||';l_proj_res_assgn_id_tab(j):'||l_proj_res_assgn_id_tab(j)
4030 ||';count:'||l_count
4031 ||';l_rt_start_date_tab.count:'||l_rt_start_date_tab.count,
4032 p_module_name => l_module_name,
4033 p_log_level => 5);
4034 END IF;
4035 --dbms_output.put_line('l_count:'||l_count);
4036 --dbms_output.put_line('l_rt_start_date_tab.COUNT:'||l_rt_start_date_tab.COUNT);
4037 --for i in 1..l_rt_start_date_tab.count loop
4038 --dbms_output.put_line(i);
4039 --dbms_output.put_line('l_proj_res_assgn_id_tab(j):'||l_proj_res_assgn_id_tab(j));
4040 --dbms_output.put_line('l_rt_start_date_tab(i),:'||l_rt_start_date_tab(i));
4041 --dbms_output.put_line('l_rt_pd_name_tab(i):'||l_rt_pd_name_tab(i));
4042 --end loop;
4043
4044 IF l_count = 0 THEN
4045 FORALL fp IN 1 .. l_rt_start_date_tab.COUNT
4046 INSERT INTO PA_BUDGET_LINES(RESOURCE_ASSIGNMENT_ID,
4047 START_DATE,
4048 LAST_UPDATE_DATE,
4049 LAST_UPDATED_BY,
4050 CREATION_DATE,
4051 CREATED_BY,
4052 LAST_UPDATE_LOGIN,
4053 END_DATE,
4054 PERIOD_NAME,
4055 QUANTITY,
4056 TXN_CURRENCY_CODE,
4057 BUDGET_LINE_ID,
4058 BUDGET_VERSION_ID,
4059 PROJECT_CURRENCY_CODE,
4060 PROJFUNC_CURRENCY_CODE)
4061 VALUES(l_proj_res_assgn_id_tab(j),
4062 l_rt_start_date_tab(fp),
4063 l_sysdate,
4064 l_last_updated_by,
4065 l_sysdate,
4066 l_last_updated_by,
4067 l_last_update_login,
4068 l_rt_end_date_tab(fp),
4069 l_rt_pd_name_tab(fp),
4070 l_rt_qty_tab(fp),
4071 l_project_currency_code,
4072 PA_BUDGET_LINES_S.nextval,
4073 P_BUDGET_VERSION_ID,
4074 p_FP_COLS_REC.X_PROJECT_CURRENCY_CODE,
4075 p_FP_COLS_REC.X_PROJFUNC_CURRENCY_CODE);
4076 ELSE
4077 FOR fp IN 1 .. l_rt_start_date_tab.COUNT LOOP
4078 -- Bug 4615787: When the Target is timephased by PA or GL, budget lines
4079 -- are unique given (Resource Assignment Id, Currency Code, Start Date).
4080 -- When the Target is None timephased, budget lines should be unique
4081 -- given (Resource Assignment Id, Currency Code). Thus, we need to check
4082 -- for budget line existence differently based on Target timephase.
4083 IF p_fp_cols_rec.x_time_phased_code IN ('P','G') THEN
4084 SELECT count(*)
4085 INTO l_count1
4086 FROM pa_budget_lines
4087 WHERE resource_assignment_id = l_proj_res_assgn_id_tab(j)
4088 AND txn_currency_code = l_project_currency_code
4089 AND start_date = l_rt_start_date_tab(fp);
4090 ELSIF p_fp_cols_rec.x_time_phased_code = 'N' THEN
4091 SELECT count(*)
4092 INTO l_count1
4093 FROM pa_budget_lines
4094 WHERE resource_assignment_id = l_proj_res_assgn_id_tab(j)
4095 AND txn_currency_code = l_project_currency_code;
4096 END IF;
4097 IF l_count1 = 0 then
4098 INSERT INTO PA_BUDGET_LINES(RESOURCE_ASSIGNMENT_ID,
4099 START_DATE,
4100 LAST_UPDATE_DATE,
4101 LAST_UPDATED_BY,
4102 CREATION_DATE,
4103 CREATED_BY,
4104 LAST_UPDATE_LOGIN,
4105 END_DATE,
4106 PERIOD_NAME,
4107 QUANTITY,
4108 TXN_CURRENCY_CODE,
4109 BUDGET_LINE_ID,
4110 BUDGET_VERSION_ID,
4111 PROJECT_CURRENCY_CODE,
4112 PROJFUNC_CURRENCY_CODE)
4113 VALUES(l_proj_res_assgn_id_tab(j),
4114 l_rt_start_date_tab(fp),
4115 l_sysdate,
4116 l_last_updated_by,
4117 l_sysdate,
4118 l_last_updated_by,
4119 l_last_update_login,
4120 l_rt_end_date_tab(fp),
4121 l_rt_pd_name_tab(fp),
4122 l_rt_qty_tab(fp),
4123 l_project_currency_code,
4124 PA_BUDGET_LINES_S.nextval,
4125 P_BUDGET_VERSION_ID,
4126 p_FP_COLS_REC.X_PROJECT_CURRENCY_CODE,
4127 p_FP_COLS_REC.X_PROJFUNC_CURRENCY_CODE);
4128 ELSE
4129 -- Bug 4615787: When the Target is timephased by PA or GL, budget lines
4130 -- are unique given (Resource Assignment Id, Currency Code, Start Date).
4131 -- When the Target is None timephased, budget lines should be unique
4132 -- given (Resource Assignment Id, Currency Code). Split Update logic into
4133 -- 2 cases based on Target timephase.
4134 IF p_fp_cols_rec.x_time_phased_code IN ('P','G') THEN
4135 UPDATE pa_budget_lines
4136 SET quantity = nvl(quantity,0) +
4137 l_rt_qty_tab(fp)
4138 WHERE resource_assignment_id = l_proj_res_assgn_id_tab(j)
4139 AND txn_currency_code = l_project_currency_code
4140 AND start_date = l_rt_start_date_tab(fp);
4141 ELSIF p_fp_cols_rec.x_time_phased_code = 'N' THEN
4142 UPDATE pa_budget_lines
4143 SET quantity = nvl(quantity,0) + l_rt_qty_tab(fp),
4144 start_date = least(start_date, l_rt_start_date_tab(fp)),
4145 end_date = greatest(end_date, l_rt_end_date_tab(fp))
4146 WHERE resource_assignment_id = l_proj_res_assgn_id_tab(j)
4147 AND txn_currency_code = l_project_currency_code;
4148 END IF; -- timephase check
4149 END IF;
4150 END LOOP; -- FOR fp IN 1 .. l_rt_start_date_tab.COUNT LOOP
4151 END IF;
4152
4153 END LOOP; -- FOR j IN 1..l_proj_assgn_id_tab.count LOOP
4154
4155 /*Duplicate res_assignment needs to be filtered before calling calculate API*/
4156 IF l_proj_res_assgn_id_tab.count = 0 THEN
4157 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
4158 PA_DEBUG.reset_err_stack;
4159 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
4160 PA_DEBUG.Reset_Curr_Function;
4161 END IF;
4162 RETURN;
4163 END IF;
4164 l_dp_counter := 0;
4165 FOR i IN 1..l_proj_res_assgn_id_tab.count LOOP
4166 l_dp_flag := 'N';
4167 FOR j IN 1..l_res_assgn_id_tmp_tab.count LOOP
4168 IF l_proj_res_assgn_id_tab(i) = l_res_assgn_id_tmp_tab(j) THEN
4169 l_dp_flag := 'Y';
4170 END IF;
4171 END LOOP;
4172 IF l_dp_flag = 'N' THEN
4173 l_dp_counter := l_dp_counter+1;
4174 l_res_assgn_id_tmp_tab.extend;
4175 l_res_assgn_id_tmp_tab(l_dp_counter) := l_proj_res_assgn_id_tab(i);
4176
4177 -- Bug 4548733: Populate l_calc_billable_flag_tab with billability
4178 -- flag values to pass to Calculate API.
4179 l_calc_billable_flag_tab.extend;
4180 l_calc_billable_flag_tab(l_dp_counter) := l_proj_billable_flag(i);
4181 END IF;
4182 END LOOP;
4183
4184 -- Bug 4549862: Moved initialization of l_rev_gen_method before
4185 -- initialization of l_calculate_mode earlier in the code.
4186
4187 IF p_fp_cols_rec.x_version_type = 'REVENUE' and l_rev_gen_method = 'C' THEN
4188 delete from pa_fp_calc_amt_tmp2;
4189
4190 FOR i IN 1..l_res_assgn_id_tmp_tab.count LOOP
4191 SELECT SUM(quantity)
4192 INTO l_total_plan_quantity
4193 FROM pa_budget_lines
4194 WHERE resource_assignment_id = l_res_assgn_id_tmp_tab(i); /* Bug 4093872 - Column name corrected from budget_version_id to resource_assignment_id */
4195
4196 INSERT INTO pa_fp_calc_amt_tmp2(
4197 resource_assignment_id,
4198 total_plan_quantity)
4199 VALUES(
4200 l_res_assgn_id_tmp_tab(i),
4201 l_total_plan_quantity);
4202 END LOOP;
4203 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
4204 PA_DEBUG.reset_err_stack;
4205 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
4206 PA_DEBUG.Reset_Curr_Function;
4207 END IF;
4208 RETURN;
4209 END IF;
4210 --dbms_output.put_line('gen_ret_manual_line_flag: '||p_fp_cols_rec.x_gen_ret_manual_line_flag);
4211
4212 /* Taken off the logic of checking if the Retain manually added plan lines flag
4213 is set to Y or N due to the new logic added. Bug 4046530 -sbhavsar */
4214
4215
4216 FOR i IN 1..l_res_assgn_id_tmp_tab.count LOOP
4217
4218 l_delete_budget_lines_tab.extend;
4219 l_spread_amts_flag_tab.extend;
4220 l_txn_currency_code_tab.extend;
4221 l_txn_currency_override_tab.extend;
4222 l_total_qty_tab.extend;
4223 l_addl_qty_tab.extend;
4224 l_total_raw_cost_tab.extend;
4225 l_addl_raw_cost_tab.extend;
4226 l_total_burdened_cost_tab.extend;
4227 l_addl_burdened_cost_tab.extend;
4228 l_total_revenue_tab.extend;
4229 l_addl_revenue_tab.extend;
4230 l_raw_cost_rate_tab.extend;
4231 l_rw_cost_rate_override_tab.extend;
4232 l_b_cost_rate_tab.extend;
4233 l_b_cost_rate_override_tab.extend;
4234 l_bill_rate_tab.extend;
4235 l_bill_rate_override_tab.extend;
4236 l_line_start_date_tab.extend;
4237 l_line_end_date_tab.extend;
4238
4239
4240 l_delete_budget_lines_tab(i) := Null;
4241 l_spread_amts_flag_tab(i) := Null;
4242 l_txn_currency_code_tab(i) := l_project_currency_code;
4243 l_txn_currency_override_tab(i) := Null;
4244 l_total_qty_tab(i) := Null;
4245 l_addl_qty_tab(i) := Null;
4246 l_total_raw_cost_tab(i) := Null;
4247 l_addl_raw_cost_tab(i) := Null;
4248 l_total_burdened_cost_tab(i) := Null;
4249 l_addl_burdened_cost_tab(i) := Null;
4250 l_total_revenue_tab(i) := Null;
4251 l_addl_revenue_tab(i) := Null;
4252 l_raw_cost_rate_tab(i) := Null;
4253 l_rw_cost_rate_override_tab(i) := Null;
4254 l_b_cost_rate_tab(i) := Null;
4255 l_b_cost_rate_override_tab(i) := Null;
4256 l_bill_rate_tab(i) := Null;
4257 l_bill_rate_override_tab(i) := Null;
4258 l_line_start_date_tab(i) := Null;
4259 l_line_end_date_tab(i) := Null;
4260 END LOOP;
4261
4262 -- Bug 4149684: Added p_calling_module and p_rollup_required_flag to parameter list of
4263 -- Calculate API with values 'BUDGET_GENERATION' and 'N', respectively, so that calling
4264 -- PJI rollup api is bypassed for increased performance.
4265
4266 /* Calling the calculate API */
4267 IF p_pa_debug_mode = 'Y' THEN
4268 pa_fp_gen_amount_utils.fp_debug
4269 (p_called_mode => p_called_mode,
4270 p_msg => 'Before calling
4271 pa_fp_calc_plan_pkg.calculate',
4272 p_module_name => l_module_name,
4273 p_log_level => 5);
4274 END IF;
4275
4276 -- Bug 4548733: Added a new pl/sql table to hold billability flag values for the
4277 -- Calculate API and passing it via the p_fp_task_billable_flag_tab IN parameter.
4278
4279 PA_FP_CALC_PLAN_PKG.calculate
4280 (p_calling_module => l_calling_module
4281 ,p_project_id => p_project_id
4282 ,p_budget_version_id => p_budget_version_id
4283 ,p_refresh_rates_flag => l_refresh_rates_flag
4284 ,p_refresh_conv_rates_flag => l_refresh_conv_rates_flag
4285 ,p_spread_required_flag => l_spread_required_flag
4286 ,p_conv_rates_required_flag => l_conv_rates_required_flag
4287 ,p_rollup_required_flag => l_rollup_required_flag
4288 ,p_mass_adjust_flag => l_mass_adjust_flag
4289 ,p_quantity_adj_pct => l_quantity_adj_pct
4290 ,p_cost_rate_adj_pct => l_cost_rate_adj_pct
4291 ,p_burdened_rate_adj_pct => l_burdened_rate_adj_pct
4292 ,p_bill_rate_adj_pct => l_bill_rate_adj_pct
4293 ,p_source_context => l_source_context
4294 ,p_resource_assignment_tab => l_res_assgn_id_tmp_tab
4295 ,p_delete_budget_lines_tab => l_delete_budget_lines_tab
4296 ,p_spread_amts_flag_tab => l_spread_amts_flag_tab
4297 ,p_txn_currency_code_tab => l_txn_currency_code_tab
4298 ,p_txn_currency_override_tab => l_txn_currency_override_tab
4299 ,p_total_qty_tab => l_total_qty_tab
4300 ,p_addl_qty_tab => l_addl_qty_tab
4301 ,p_total_raw_cost_tab => l_total_raw_cost_tab
4302 ,p_addl_raw_cost_tab => l_addl_raw_cost_tab
4303 ,p_total_burdened_cost_tab => l_total_burdened_cost_tab
4304 ,p_addl_burdened_cost_tab => l_addl_burdened_cost_tab
4305 ,p_total_revenue_tab => l_total_revenue_tab
4306 ,p_addl_revenue_tab => l_addl_revenue_tab
4307 ,p_raw_cost_rate_tab => l_raw_cost_rate_tab
4308 ,p_rw_cost_rate_override_tab => l_rw_cost_rate_override_tab
4309 ,p_b_cost_rate_tab => l_b_cost_rate_tab
4310 ,p_b_cost_rate_override_tab => l_b_cost_rate_override_tab
4311 ,p_bill_rate_tab => l_bill_rate_tab
4312 ,p_bill_rate_override_tab => l_bill_rate_override_tab
4313 ,p_line_start_date_tab => l_line_start_date_tab
4314 ,p_line_end_date_tab => l_line_end_date_tab
4315 ,p_fp_task_billable_flag_tab => l_calc_billable_flag_tab /* Added for Bug 4548733 */
4316 ,p_raTxn_rollup_api_call_flag => l_raTxn_rollup_api_call_flag, --Added for IPM new entity ER
4317 X_RETURN_STATUS => X_RETURN_STATUS,
4318 X_MSG_COUNT => X_MSG_COUNT,
4319 X_MSG_DATA => X_MSG_DATA);
4320
4321 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
4322 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
4323 END IF;
4324 IF p_pa_debug_mode = 'Y' THEN
4325 pa_fp_gen_amount_utils.fp_debug
4326 (p_called_mode => p_called_mode,
4327 p_msg => 'Status after calling
4328 pa_fp_calc_plan_pkg.calculate: '
4329 ||x_return_status,
4330 p_module_name => l_module_name,
4331 p_log_level => 5);
4332 END IF;
4333
4334 -- M-closeout: Bill Rate Override ER
4335 END IF; -- IF p_fp_cols_rec.x_version_type = 'ALL' ...
4336 -- END OF M-closeout: Bill Rate Override ER
4337
4338 IF P_COMMIT_FLAG = 'Y' THEN
4339 COMMIT;
4340 END IF;
4341
4342 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
4343 PA_DEBUG.reset_err_stack;
4344 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
4345 PA_DEBUG.Reset_Curr_Function;
4346 END IF;
4347
4348
4349 EXCEPTION
4350
4351 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
4352 -- Bug Fix: 4569365. Removed MRC code.
4353 -- PA_MRC_FINPLAN.G_CALLING_MODULE := Null;
4354 l_msg_count := FND_MSG_PUB.count_msg;
4355 IF l_msg_count = 1 THEN
4356 PA_INTERFACE_UTILS_PUB.get_messages
4357 (p_encoded => FND_API.G_TRUE
4358 ,p_msg_index => 1
4359 ,p_msg_count => l_msg_count
4360 ,p_msg_data => l_msg_data
4361 ,p_data => l_data
4362 ,p_msg_index_out => l_msg_index_out);
4363 x_msg_data := l_data;
4364 x_msg_count := l_msg_count;
4365 ELSE
4366 x_msg_count := l_msg_count;
4367 END IF;
4368 ROLLBACK;
4369 x_return_status := FND_API.G_RET_STS_ERROR;
4370
4371 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
4372 PA_DEBUG.reset_err_stack;
4373 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
4374 PA_DEBUG.Reset_Curr_Function;
4375 END IF;
4376
4377 RAISE;
4378
4379 WHEN OTHERS THEN
4380 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4381 x_msg_data := SUBSTR(SQLERRM,1,240);
4382 FND_MSG_PUB.add_exc_msg
4383 ( p_pkg_name => 'PA_FP_GEN_BUDGET_AMT_PUB'
4384 ,p_procedure_name => 'GENERATE_BUDGET_AMT_RES_SCH');
4385
4386 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
4387 PA_DEBUG.reset_err_stack;
4388 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
4389 PA_DEBUG.Reset_Curr_Function;
4390 END IF;
4391
4392 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4393 END GENERATE_BUDGET_AMT_RES_SCH;
4394
4395 PROCEDURE CREATE_RES_ASG
4396 (P_PROJECT_ID IN PA_PROJ_FP_OPTIONS.PROJECT_ID%TYPE,
4397 P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
4398 P_STRU_SHARING_CODE IN PA_PROJECTS_ALL.STRUCTURE_SHARING_CODE%TYPE,
4399 P_GEN_SRC_CODE IN PA_PROJ_FP_OPTIONS.GEN_ALL_SRC_CODE%TYPE,
4400 P_FP_COLS_REC IN PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
4401 P_WP_STRUCTURE_VER_ID IN PA_BUDGET_VERSIONS.PROJECT_STRUCTURE_VERSION_ID%TYPE,
4402 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
4403 X_MSG_COUNT OUT NOCOPY NUMBER,
4404 X_MSG_DATA OUT NOCOPY VARCHAR2) IS
4405
4406 l_module_name VARCHAR2(200) := 'pa.plsql.PA_FP_GEN_BUDGET_AMT_PUB.CREATE_RES_ASG';
4407
4408 --Cursor used when planning type is Project
4409 CURSOR RES_ASG1 IS
4410 SELECT T.RESOURCE_LIST_MEMBER_ID,
4411 MIN(T.TXN_PLANNING_START_DATE),
4412 MAX(T.TXN_PLANNING_END_DATE)
4413 FROM PA_RES_LIST_MAP_TMP4 T
4414 WHERE NOT EXISTS
4415 (SELECT /*+ INDEX(T,PA_RES_LIST_MAP_TMP4_N1)*/
4416 P.RESOURCE_LIST_MEMBER_ID
4417 FROM PA_RESOURCE_ASSIGNMENTS P
4418 WHERE P.BUDGET_VERSION_ID = P_BUDGET_VERSION_ID
4419 AND NVL(P.TASK_ID,0) = 0
4420 AND P.PROJECT_ASSIGNMENT_ID = -1
4421 AND T.RESOURCE_LIST_MEMBER_ID = P.RESOURCE_LIST_MEMBER_ID)
4422 GROUP BY T.RESOURCE_LIST_MEMBER_ID;
4423
4424 --Cursor used when planning type is Lowest task (Financial task only)
4425 CURSOR RES_ASG2 IS
4426 SELECT T.RESOURCE_LIST_MEMBER_ID,
4427 NVL(T.TXN_TASK_ID,0),
4428 MIN(T.TXN_PLANNING_START_DATE),
4429 MAX(T.TXN_PLANNING_END_DATE)
4430 FROM PA_RES_LIST_MAP_TMP4 T
4431 WHERE NOT EXISTS
4432 (SELECT /*+ INDEX(T,PA_RES_LIST_MAP_TMP4_N1)*/ 1
4433 FROM PA_RESOURCE_ASSIGNMENTS P
4434 WHERE P.BUDGET_VERSION_ID = P_BUDGET_VERSION_ID
4435 AND NVL(P.TASK_ID,0) = NVL(T.TXN_TASK_ID,0)
4436 AND P.PROJECT_ASSIGNMENT_ID = -1
4437 AND T.RESOURCE_LIST_MEMBER_ID = P.RESOURCE_LIST_MEMBER_ID)
4438 GROUP BY T.RESOURCE_LIST_MEMBER_ID,
4439 NVL(T.TXN_TASK_ID,0);
4440
4441 --Cursor used when planning type is Top task(Financial task only)
4442 CURSOR RES_ASG3 IS
4443 SELECT T.RESOURCE_LIST_MEMBER_ID,
4444 NVL(PAT.TOP_TASK_ID,0),
4445 MIN(T.TXN_PLANNING_START_DATE),
4446 MAX(T.TXN_PLANNING_END_DATE)
4447 FROM PA_RES_LIST_MAP_TMP4 T,
4448 PA_TASKS PAT
4449 WHERE NVL(T.TXN_TASK_ID,0) > 0
4450 AND NVL(T.TXN_TASK_ID,0) = PAT.TASK_ID
4451 AND NOT EXISTS
4452 (SELECT /*+ INDEX(T,PA_RES_LIST_MAP_TMP4_N1)*/ 1
4453 FROM PA_RESOURCE_ASSIGNMENTS P,PA_TASKS TS
4454 WHERE P.BUDGET_VERSION_ID = P_BUDGET_VERSION_ID
4455 AND NVL(T.TXN_TASK_ID,0) > 0
4456 AND TS.TASK_ID = NVL(T.TXN_TASK_ID,0)
4457 AND NVL(TS.TOP_TASK_ID,0) = NVL(P.TASK_ID,0)
4458 AND P.PROJECT_ASSIGNMENT_ID = -1
4459 AND T.RESOURCE_LIST_MEMBER_ID = P.RESOURCE_LIST_MEMBER_ID)
4460 GROUP BY T.RESOURCE_LIST_MEMBER_ID,
4461 NVL(PAT.TOP_TASK_ID,0)
4462 UNION
4463 SELECT T.RESOURCE_LIST_MEMBER_ID,
4464 0,
4465 MIN(T.TXN_PLANNING_START_DATE),
4466 MAX(T.TXN_PLANNING_END_DATE)
4467 FROM PA_RES_LIST_MAP_TMP4 T
4468 WHERE NVL(T.TXN_TASK_ID,0) = 0
4469 AND NOT EXISTS
4470 (SELECT /*+ INDEX(T,PA_RES_LIST_MAP_TMP4_N1)*/ 1
4471 FROM PA_RESOURCE_ASSIGNMENTS P
4472 WHERE P.BUDGET_VERSION_ID = P_BUDGET_VERSION_ID
4473 AND NVL(T.TXN_TASK_ID,0) = 0
4474 AND NVL(P.TASK_ID,0) = 0
4475 AND P.RESOURCE_LIST_MEMBER_ID = T.RESOURCE_LIST_MEMBER_ID
4476 AND P.PROJECT_ASSIGNMENT_ID = -1)
4477 GROUP BY T.RESOURCE_LIST_MEMBER_ID,
4478 0;
4479
4480 /* Cursor used when planning type is Lowest task
4481 (both Financial task and Workplan task) */
4482 /* the union clause takes care of bringing the project level records. */
4483 CURSOR RES_ASG4 IS
4484 SELECT T.RESOURCE_LIST_MEMBER_ID resource_list_member_id,
4485 NVL(V1.MAPPED_FIN_TASK_ID,0) mapped_fin_task_id,
4486 NVL(V1.MAPPED_FIN_TASK_VERSION_ID,0) mapped_fin_task_version_id,
4487 MIN(T.TXN_PLANNING_START_DATE) txn_planning_start_date,
4488 MAX(T.TXN_PLANNING_END_DATE) txn_planning_end_date
4489 FROM PA_RES_LIST_MAP_TMP4 T,
4490 PA_MAP_WP_TO_FIN_TASKS_V V1
4491 WHERE NOT EXISTS
4492 (SELECT /*+ INDEX(T,PA_RES_LIST_MAP_TMP4_N1)*/ 1
4493 FROM PA_RESOURCE_ASSIGNMENTS P,PA_MAP_WP_TO_FIN_TASKS_V V
4494 WHERE P.BUDGET_VERSION_ID = P_BUDGET_VERSION_ID
4495 AND V.PARENT_STRUCTURE_VERSION_ID = P_WP_STRUCTURE_VER_ID
4496 AND nvl(T.TXN_TASK_ID,0) = NVL(V.PROJ_ELEMENT_ID,0)
4497 AND P.PROJECT_ASSIGNMENT_ID = -1
4498 AND T.RESOURCE_LIST_MEMBER_ID = P.RESOURCE_LIST_MEMBER_ID
4499 AND NVL(V.MAPPED_FIN_TASK_ID,0) = NVL(P.TASK_ID,0))
4500 AND V1.PARENT_STRUCTURE_VERSION_ID = P_WP_STRUCTURE_VER_ID
4501 AND NVL(T.TXN_TASK_ID,0) = NVL(V1.PROJ_ELEMENT_ID,0)
4502 AND NVL(T.TXN_TASK_ID,0) > 0
4503 GROUP BY
4504 T.RESOURCE_LIST_MEMBER_ID,
4505 NVL(V1.MAPPED_FIN_TASK_ID,0),
4506 NVL(V1.MAPPED_FIN_TASK_VERSION_ID,0)
4507 union
4508 SELECT T.RESOURCE_LIST_MEMBER_ID resource_list_member_id,
4509 0 mapped_fin_task_id,
4510 0 mapped_fin_task_version_id,
4511 MIN(T.TXN_PLANNING_START_DATE) txn_planning_start_date,
4512 MAX(T.TXN_PLANNING_END_DATE) txn_planning_end_date
4513 FROM PA_RES_LIST_MAP_TMP4 T
4514 WHERE NVL(T.TXN_TASK_ID,0) = 0 AND
4515 NOT EXISTS
4516 (SELECT /*+ INDEX(T,PA_RES_LIST_MAP_TMP4_N1)*/ 1
4517 FROM PA_RESOURCE_ASSIGNMENTS P
4518 WHERE P.BUDGET_VERSION_ID = P_BUDGET_VERSION_ID
4519 AND P.PROJECT_ASSIGNMENT_ID = -1
4520 AND T.RESOURCE_LIST_MEMBER_ID = P.RESOURCE_LIST_MEMBER_ID
4521 AND NVL(P.TASK_ID,0) = 0 )
4522 GROUP BY T.RESOURCE_LIST_MEMBER_ID,
4523 0,
4524 0;
4525
4526 /* Cursor used when planning type is Top task
4527 (both Financial task and Workplan task)*/
4528 CURSOR RES_ASG5 IS
4529 SELECT T.RESOURCE_LIST_MEMBER_ID,
4530 NVL(PAT.TOP_TASK_ID,0),
4531 NVL(pa_proj_elements_utils.get_task_version_id(
4532 v1.MAPPED_FIN_STR_VERSION_ID,pat.top_task_id),0),
4533 MIN(T.TXN_PLANNING_START_DATE),
4534 MAX(T.TXN_PLANNING_END_DATE)
4535 FROM PA_RES_LIST_MAP_TMP4 T,
4536 PA_TASKS PAT,
4537 PA_MAP_WP_TO_FIN_TASKS_V V1
4538 WHERE NVL(V1.MAPPED_FIN_TASK_ID,0) = PAT.TASK_ID (+)
4539 AND NOT EXISTS
4540 (SELECT /*+ INDEX(T,PA_RES_LIST_MAP_TMP4_N1)*/ 1
4541 FROM PA_RESOURCE_ASSIGNMENTS P,PA_TASKS TS,PA_MAP_WP_TO_FIN_TASKS_V V
4542 WHERE P.BUDGET_VERSION_ID = P_BUDGET_VERSION_ID
4543 AND V.PARENT_STRUCTURE_VERSION_ID = P_WP_STRUCTURE_VER_ID
4544 AND NVL(T.TXN_TASK_ID,0) = NVL(V.PROJ_ELEMENT_ID,0)
4545 AND TS.TASK_ID(+) = NVL(V.MAPPED_FIN_TASK_ID,0)
4546 AND P.PROJECT_ASSIGNMENT_ID = -1
4547 AND T.RESOURCE_LIST_MEMBER_ID = P.RESOURCE_LIST_MEMBER_ID
4548 AND NVL(TS.TOP_TASK_ID,0) = NVL(P.TASK_ID,0))
4549 AND V1.PARENT_STRUCTURE_VERSION_ID = P_WP_STRUCTURE_VER_ID
4550 AND NVL(T.TXN_TASK_ID,0) = NVL(V1.PROJ_ELEMENT_ID,0)
4551 AND NVL(T.TXN_TASK_ID,0) > 0
4552 GROUP BY T.RESOURCE_LIST_MEMBER_ID,
4553 NVL(PAT.TOP_TASK_ID,0),
4554 NVL(pa_proj_elements_utils.get_task_version_id(
4555 v1.MAPPED_FIN_STR_VERSION_ID,pat.top_task_id),0)
4556 union
4557 SELECT T.RESOURCE_LIST_MEMBER_ID resource_list_member_id,
4558 0,
4559 0,
4560 MIN(T.TXN_PLANNING_START_DATE) txn_planning_start_date,
4561 MAX(T.TXN_PLANNING_END_DATE) txn_planning_end_date
4562 FROM PA_RES_LIST_MAP_TMP4 T
4563 WHERE NVL(T.TXN_TASK_ID,0) = 0 AND
4564 NOT EXISTS
4565 (SELECT /*+ INDEX(T,PA_RES_LIST_MAP_TMP4_N1)*/ 1
4566 FROM PA_RESOURCE_ASSIGNMENTS P
4567 WHERE P.BUDGET_VERSION_ID = P_BUDGET_VERSION_ID
4568 AND P.PROJECT_ASSIGNMENT_ID = -1
4569 AND T.RESOURCE_LIST_MEMBER_ID = P.RESOURCE_LIST_MEMBER_ID
4570 AND NVL(P.TASK_ID,0) = 0)
4571 GROUP BY T.RESOURCE_LIST_MEMBER_ID, 0,
4572 0;
4573
4574
4575
4576 l_stru_sharing_code PA_PROJECTS_ALL.STRUCTURE_SHARING_CODE%TYPE;
4577 l_unique_rlm_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
4578 l_res_list_member_id PA_PLSQL_DATATYPES.IdTabTyp;
4579 l_task_id PA_PLSQL_DATATYPES.IdTabTyp;
4580 l_mapped_fin_task_version_id PA_PLSQL_DATATYPES.IdTabTyp;
4581 l_start_date_tab PA_PLSQL_DATATYPES.DateTabTyp;
4582 l_end_date_tab PA_PLSQL_DATATYPES.DateTabTyp;
4583 l_last_updated_by NUMBER := FND_GLOBAL.user_id;
4584 l_last_update_login NUMBER := FND_GLOBAL.login_id;
4585 l_sysdate DATE := SYSDATE;
4586 l_ret_status VARCHAR2(100);
4587 l_msg_count NUMBER;
4588 l_msg_data VARCHAR2(2000);
4589 l_data VARCHAR2(2000);
4590 l_msg_index_out NUMBER:=0;
4591 l_project_id NUMBER(15);
4592
4593 --Local Variables for calling get_resource_defaults API
4594 l_da_resource_list_members_tab SYSTEM.PA_NUM_TBL_TYPE:=SYSTEM.PA_NUM_TBL_TYPE();
4595 l_da_resource_class_flag_tab SYSTEM.PA_VARCHAR2_1_TBL_TYPE;
4596 l_da_resource_class_code_tab SYSTEM.PA_VARCHAR2_30_TBL_TYPE;
4597 l_da_resource_class_id_tab SYSTEM.PA_NUM_TBL_TYPE;
4598 l_da_res_type_code_tab SYSTEM.PA_VARCHAR2_30_TBL_TYPE;
4599 l_da_person_id_tab SYSTEM.PA_NUM_TBL_TYPE;
4600 l_da_job_id_tab SYSTEM.PA_NUM_TBL_TYPE;
4601 l_da_person_type_code_tab SYSTEM.PA_VARCHAR2_30_TBL_TYPE;
4602 l_da_named_role_tab SYSTEM.PA_VARCHAR2_80_TBL_TYPE;
4603 l_da_bom_resource_id_tab SYSTEM.PA_NUM_TBL_TYPE;
4604 l_da_non_labor_resource_tab SYSTEM.PA_VARCHAR2_20_TBL_TYPE;
4605 l_da_inventory_item_id_tab SYSTEM.PA_NUM_TBL_TYPE;
4606 l_da_item_category_id_tab SYSTEM.PA_NUM_TBL_TYPE;
4607 l_da_project_role_id_tab SYSTEM.PA_NUM_TBL_TYPE;
4608 l_da_organization_id_tab SYSTEM.PA_NUM_TBL_TYPE;
4609 l_da_fc_res_type_code_tab SYSTEM.PA_VARCHAR2_30_TBL_TYPE;
4610 l_da_expenditure_type_tab SYSTEM.PA_VARCHAR2_30_TBL_TYPE;
4611 l_da_expenditure_category_tab SYSTEM.PA_VARCHAR2_30_TBL_TYPE;
4612 l_da_event_type_tab SYSTEM.PA_VARCHAR2_30_TBL_TYPE;
4613 l_da_revenue_category_code_tab SYSTEM.PA_VARCHAR2_30_TBL_TYPE;
4614 l_da_supplier_id_tab SYSTEM.PA_NUM_TBL_TYPE;
4615 l_da_spread_curve_id_tab SYSTEM.PA_NUM_TBL_TYPE;
4616 l_da_etc_method_code_tab SYSTEM.PA_VARCHAR2_30_TBL_TYPE;
4617 l_da_mfc_cost_type_id_tab SYSTEM.PA_NUM_TBL_TYPE;
4618 l_da_incurred_by_res_flag_tab SYSTEM.PA_VARCHAR2_1_TBL_TYPE;
4619 l_da_incur_by_res_cls_code_tab SYSTEM.PA_VARCHAR2_30_TBL_TYPE;
4620 l_da_incur_by_role_id_tab SYSTEM.PA_NUM_TBL_TYPE;
4621 l_da_unit_of_measure_tab SYSTEM.PA_VARCHAR2_30_TBL_TYPE;
4622 l_da_org_id_tab SYSTEM.PA_NUM_TBL_TYPE;
4623 l_da_rate_based_flag_tab SYSTEM.PA_VARCHAR2_1_TBL_TYPE;
4624 l_da_rate_expenditure_type_tab SYSTEM.PA_VARCHAR2_30_TBL_TYPE;
4625 l_da_rate_func_curr_code_tab SYSTEM.PA_VARCHAR2_30_TBL_TYPE;
4626 l_da_incur_by_res_type_tab SYSTEM.PA_VARCHAR2_30_TBL_TYPE;
4627
4628 /* Performance-Variables to replace the literals in the Insert into
4629 pa_resource_assignments stmts. */
4630 l_task_id_01 NUMBER:=0;
4631 l_proj_asg_id_minus1 NUMBER:=-1;
4632 l_res_as_type_USER_ENTERED VARCHAR2(30):='USER_ENTERED';
4633 l_rec_ver_number_1 NUMBER:=1;
4634
4635 l_count NUMBER;
4636 l_count1 NUMBER;
4637 l_wp_version_flag pa_budget_Versions.wp_version_flag%TYPE;
4638 l_gen_src_code pa_proj_fp_options.gen_all_src_code%TYPE := null;
4639
4640 --Bug 4052036. This tbl will hold the ra ids that are inserted in this API
4641 l_ins_ra_id_tbl SYSTEM.PA_VARCHAR2_30_TBL_TYPE;
4642 BEGIN
4643 X_MSG_COUNT := 0;
4644 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
4645
4646 l_project_id := p_project_id;
4647
4648 IF p_pa_debug_mode = 'Y' THEN
4649 PA_DEBUG.SET_CURR_FUNCTION
4650 ( p_function => 'CREATE_RES_ASG',
4651 p_debug_mode => p_pa_debug_mode );
4652 END IF;
4653
4654 l_stru_sharing_code :=
4655 PA_PROJECT_STRUCTURE_UTILS.GET_STRUCTURE_SHARING_CODE
4656 ( P_PROJECT_ID=> P_PROJECT_ID );
4657
4658 /* bug 4160375 The generation source code should always be populated
4659 whenever the planning resources are created. The source could be
4660 the primary source (FP / WP / Res Sch) or the additional options. */
4661
4662 l_gen_src_code := p_gen_src_code;
4663
4664 IF P_FP_COLS_REC.X_FIN_PLAN_LEVEL_CODE = 'P' OR P_GEN_SRC_CODE = 'RESOURCE_SCHEDULE' THEN
4665 OPEN RES_ASG1;
4666 FETCH RES_ASG1
4667 BULK COLLECT
4668 INTO l_res_list_member_id,
4669 l_start_date_tab,
4670 l_end_date_tab;
4671 CLOSE RES_ASG1;
4672
4673 IF l_res_list_member_id.count = 0 THEN
4674 IF P_PA_DEBUG_MODE = 'Y' THEN
4675 PA_DEBUG.Reset_Curr_Function;
4676 END IF;
4677 RETURN;
4678 END IF;
4679
4680 SELECT NVL(wp_version_flag,'N')
4681 INTO l_wp_version_flag
4682 FROM pa_budget_versions
4683 WHERE budget_version_id=P_BUDGET_VERSION_ID;
4684
4685 FORALL i IN 1..l_res_list_member_id.count
4686 INSERT INTO PA_RESOURCE_ASSIGNMENTS(RESOURCE_ASSIGNMENT_ID,
4687 BUDGET_VERSION_ID,
4688 PROJECT_ID,
4689 TASK_ID,
4690 RESOURCE_LIST_MEMBER_ID,
4691 LAST_UPDATE_DATE,
4692 LAST_UPDATED_BY,
4693 CREATION_DATE,
4694 CREATED_BY,
4695 LAST_UPDATE_LOGIN,
4696 PROJECT_ASSIGNMENT_ID,
4697 resource_assignment_type,
4698 record_version_number,
4699 planning_start_date,
4700 planning_end_date,
4701 transaction_source_code)
4702 VALUES (PA_RESOURCE_ASSIGNMENTS_S.nextval,
4703 P_BUDGET_VERSION_ID,
4704 P_PROJECT_ID,
4705 l_task_id_01,
4706 l_res_list_member_id(i),
4707 l_sysdate,
4708 l_last_updated_by,
4709 l_sysdate,
4710 l_last_updated_by,
4711 l_last_update_login,
4712 l_proj_asg_id_minus1 ,
4713 l_res_as_type_USER_ENTERED,
4714 l_rec_ver_number_1 ,
4715 l_start_date_tab(i),
4716 l_end_date_tab(i),
4717 l_gen_src_code )
4718 RETURNING resource_assignment_id BULK COLLECT INTO l_ins_ra_id_tbl;
4719
4720 ELSIF P_FP_COLS_REC.X_FIN_PLAN_LEVEL_CODE = 'L'
4721 AND (l_stru_sharing_code IS NULL OR
4722 l_stru_sharing_code = 'SHARE_FULL' OR
4723 P_GEN_SRC_CODE IN ( 'FINANCIAL_PLAN',
4724 'OPEN_COMMITMENTS','BILLING_EVENTS' )) THEN
4725
4726 OPEN RES_ASG2;
4727 FETCH RES_ASG2
4728 BULK COLLECT
4729 INTO l_res_list_member_id,
4730 l_task_id,
4731 l_start_date_tab,
4732 l_end_date_tab;
4733 CLOSE RES_ASG2;
4734
4735 IF l_res_list_member_id.count = 0 then
4736 IF P_PA_DEBUG_MODE = 'Y' THEN
4737 PA_DEBUG.Reset_Curr_Function;
4738 END IF;
4739 RETURN;
4740 END IF;
4741
4742 FORALL i IN 1..l_res_list_member_id.count
4743 INSERT INTO PA_RESOURCE_ASSIGNMENTS(RESOURCE_ASSIGNMENT_ID,
4744 BUDGET_VERSION_ID,
4745 PROJECT_ID,
4746 TASK_ID,
4747 RESOURCE_LIST_MEMBER_ID,
4748 LAST_UPDATE_DATE,
4749 LAST_UPDATED_BY,
4750 CREATION_DATE,
4751 CREATED_BY,
4752 LAST_UPDATE_LOGIN,
4753 PROJECT_ASSIGNMENT_ID,
4754 resource_assignment_type,
4755 record_version_number,
4756 planning_start_date,
4757 planning_end_date,
4758 transaction_source_code)
4759 VALUES (PA_RESOURCE_ASSIGNMENTS_S.nextval,
4760 P_BUDGET_VERSION_ID,
4761 P_PROJECT_ID,
4762 l_task_id(i),
4763 l_res_list_member_id(i),
4764 l_sysdate,
4765 l_last_updated_by,
4766 l_sysdate,
4767 l_last_updated_by,
4768 l_last_update_login,
4769 l_proj_asg_id_minus1,
4770 l_res_as_type_USER_ENTERED,
4771 l_rec_ver_number_1,
4772 l_start_date_tab(i),
4773 l_end_date_tab(i),
4774 l_gen_src_code )
4775 RETURNING resource_assignment_id BULK COLLECT INTO l_ins_ra_id_tbl;
4776 ELSIF P_FP_COLS_REC.X_FIN_PLAN_LEVEL_CODE = 'T'
4777 AND ( l_stru_sharing_code IS NULL OR
4778 l_stru_sharing_code = 'SHARE_FULL' OR
4779 P_GEN_SRC_CODE IN ( 'FINANCIAL_PLAN',
4780 'OPEN_COMMITMENTS','BILLING_EVENTS' )) THEN
4781
4782 OPEN RES_ASG3;
4783 FETCH RES_ASG3
4784 BULK COLLECT
4785 INTO l_res_list_member_id,
4786 l_task_id,
4787 l_start_date_tab,
4788 l_end_date_tab;
4789 CLOSE RES_ASG3;
4790
4791 IF l_res_list_member_id.count = 0 then
4792 IF P_PA_DEBUG_MODE = 'Y' THEN
4793 PA_DEBUG.Reset_Curr_Function;
4794 END IF;
4795 RETURN;
4796 END IF;
4797 FORALL i IN 1..l_res_list_member_id.count
4798 INSERT INTO PA_RESOURCE_ASSIGNMENTS(RESOURCE_ASSIGNMENT_ID,
4799 BUDGET_VERSION_ID,
4800 PROJECT_ID,
4801 TASK_ID,
4802 RESOURCE_LIST_MEMBER_ID,
4803 LAST_UPDATE_DATE,
4804 LAST_UPDATED_BY,
4805 CREATION_DATE,
4806 CREATED_BY,
4807 LAST_UPDATE_LOGIN,
4808 PROJECT_ASSIGNMENT_ID,
4809 resource_assignment_type,
4810 record_version_number,
4811 planning_start_date,
4812 planning_end_date,
4813 transaction_source_code)
4814 VALUES (PA_RESOURCE_ASSIGNMENTS_S.nextval,
4815 P_BUDGET_VERSION_ID,
4816 P_PROJECT_ID,
4817 l_task_id(i),
4818 l_res_list_member_id(i),
4819 l_sysdate,
4820 l_last_updated_by,
4821 l_sysdate,
4822 l_last_updated_by,
4823 l_last_update_login,
4824 l_proj_asg_id_minus1,
4825 l_res_as_type_USER_ENTERED,
4826 l_rec_ver_number_1,
4827 l_start_date_tab(i),
4828 l_end_date_tab(i),
4829 l_gen_src_code )
4830 RETURNING resource_assignment_id BULK COLLECT INTO l_ins_ra_id_tbl;
4831
4832 ELSIF P_FP_COLS_REC.X_FIN_PLAN_LEVEL_CODE = 'L'
4833 AND l_stru_sharing_code IS NOT NULL THEN
4834 --dbms_output.put('before res_asg4 cursor');
4835
4836 --dbms_output.put('p_wp_structure_ver_id'||p_wp_structure_ver_id);
4837 --insert into ltmp4 select * from PA_RES_LIST_MAP_TMP4;
4838 --insert into lra select * from pa_resource_assignments where budget_version_id = p_budget_version_id;
4839 OPEN RES_ASG4;
4840 FETCH RES_ASG4
4841 BULK COLLECT
4842 INTO l_res_list_member_id,
4843 l_task_id,
4844 l_mapped_fin_task_version_id,
4845 l_start_date_tab,
4846 l_end_date_tab;
4847 CLOSE RES_ASG4;
4848
4849 IF l_res_list_member_id.count = 0 then
4850 IF P_PA_DEBUG_MODE = 'Y' THEN
4851 PA_DEBUG.Reset_Curr_Function;
4852 END IF;
4853 RETURN;
4854 END IF;
4855 IF P_PA_DEBUG_MODE = 'Y' THEN
4856 FOR i IN 1..l_res_list_member_id.count LOOP
4857 pa_fp_gen_amount_utils.fp_debug
4858 (p_msg => 'in res_asg4:@@rlm in cursor:'||l_res_list_member_id(i)
4859 ||'; @@task in cursor:'||l_task_id(i)
4860 ||';@@start date in cursor:'||l_start_date_tab(i)
4861 ||';@@end date in cursor:'||l_end_date_tab(i),
4862 p_module_name => l_module_name,
4863 p_log_level => 5);
4864 END LOOP;
4865 END IF;
4866 --dbms_output.put_line('before insert in pa ra');
4867 --FOR i IN 1..l_res_list_member_id.count LOOP
4868 --dbms_output.put_line('--i--'||i);
4869 --dbms_output.put_line('l_res_list_member_id:'||l_res_list_member_id(i));
4870 --dbms_output.put_line('l_task_id:'||l_task_id(i));
4871 --END LOOP;
4872 --commit;
4873 FORALL i IN 1..l_res_list_member_id.count
4874 INSERT INTO PA_RESOURCE_ASSIGNMENTS(RESOURCE_ASSIGNMENT_ID,
4875 BUDGET_VERSION_ID,
4876 PROJECT_ID,
4877 TASK_ID,
4878 RESOURCE_LIST_MEMBER_ID,
4879 LAST_UPDATE_DATE,
4880 LAST_UPDATED_BY,
4881 CREATION_DATE,
4882 CREATED_BY,
4883 LAST_UPDATE_LOGIN,
4884 PROJECT_ASSIGNMENT_ID,
4885 resource_assignment_type,
4886 planning_start_Date,
4887 planning_end_date,
4888 record_version_number,
4889 wbs_element_version_id,
4890 transaction_source_code)
4891 VALUES (PA_RESOURCE_ASSIGNMENTS_S.nextval,
4892 P_BUDGET_VERSION_ID,
4893 P_PROJECT_ID,
4894 l_task_id(i),
4895 l_res_list_member_id(i),
4896 l_sysdate,
4897 l_last_updated_by,
4898 l_sysdate,
4899 l_last_updated_by,
4900 l_last_update_login,
4901 l_proj_asg_id_minus1,
4902 l_res_as_type_USER_ENTERED,
4903 l_start_date_tab(i),
4904 l_end_date_tab(i),
4905 l_rec_ver_number_1,
4906 DECODE(l_wp_version_flag,'Y',l_mapped_fin_task_version_id(i),
4907 NULL),
4908 l_gen_src_code )
4909 RETURNING resource_assignment_id BULK COLLECT INTO l_ins_ra_id_tbl;
4910
4911 ELSIF P_FP_COLS_REC.X_FIN_PLAN_LEVEL_CODE = 'T' AND l_stru_sharing_code IS NOT NULL THEN
4912
4913 OPEN RES_ASG5;
4914 FETCH RES_ASG5
4915 BULK COLLECT
4916 INTO l_res_list_member_id,
4917 l_task_id,
4918 l_mapped_fin_task_version_id,
4919 l_start_date_tab,
4920 l_end_date_tab;
4921 CLOSE RES_ASG5;
4922
4923 IF l_res_list_member_id.count = 0 then
4924 IF P_PA_DEBUG_MODE = 'Y' THEN
4925 PA_DEBUG.Reset_Curr_Function;
4926 END IF;
4927 RETURN;
4928 END IF;
4929 FORALL i IN 1..l_res_list_member_id.count
4930 INSERT INTO PA_RESOURCE_ASSIGNMENTS(RESOURCE_ASSIGNMENT_ID,
4931 BUDGET_VERSION_ID,
4932 PROJECT_ID,
4933 TASK_ID,
4934 RESOURCE_LIST_MEMBER_ID,
4935 LAST_UPDATE_DATE,
4936 LAST_UPDATED_BY,
4937 CREATION_DATE,
4938 CREATED_BY,
4939 LAST_UPDATE_LOGIN,
4940 PROJECT_ASSIGNMENT_ID,
4941 resource_assignment_type,
4942 record_version_number,
4943 wbs_element_version_id,
4944 planning_start_date,
4945 planning_end_date,
4946 transaction_source_code)
4947 VALUES (PA_RESOURCE_ASSIGNMENTS_S.nextval,
4948 P_BUDGET_VERSION_ID,
4949 P_PROJECT_ID,
4950 l_task_id(i),
4951 l_res_list_member_id(i),
4952 l_sysdate,
4953 l_last_updated_by,
4954 l_sysdate,
4955 l_last_updated_by,
4956 l_last_update_login,
4957 l_proj_asg_id_minus1,
4958 l_res_as_type_USER_ENTERED,
4959 l_rec_ver_number_1,
4960 DECODE(l_wp_version_flag,'Y',l_mapped_fin_task_version_id(i),
4961 NULL),
4962 l_start_date_tab(i),
4963 l_end_date_tab(i),
4964 l_gen_src_code )
4965 RETURNING resource_assignment_id BULK COLLECT INTO l_ins_ra_id_tbl;
4966 END IF;
4967
4968 IF SQL%ROWCOUNT = 0 THEN
4969 IF P_PA_DEBUG_MODE = 'Y' THEN
4970 PA_DEBUG.Reset_Curr_Function;
4971 END IF;
4972 RETURN;
4973 END IF;
4974 --dbms_output.put_line('before res_list_map');
4975 /* we need to pass only distinct
4976 RLM ids to the get res defa API */
4977 DELETE from pa_res_list_map_tmp1;
4978
4979 FORALL pp in 1 .. l_res_list_member_id.count
4980 INSERT INTO pa_res_list_map_tmp1
4981 (txn_resource_list_member_id)
4982 VALUES
4983 (l_res_list_member_id(pp));
4984
4985 l_unique_rlm_id_tab.delete;
4986
4987 SELECT DISTINCT txn_resource_list_member_id
4988 BULK COLLECT
4989 INTO l_unique_rlm_id_tab
4990 FROM pa_res_list_map_tmp1;
4991
4992 DELETE FROM pa_res_list_map_tmp1;
4993
4994 FOR kk in 1 .. l_unique_rlm_id_tab.count LOOP
4995 l_da_resource_list_members_tab.extend;
4996 l_da_resource_list_members_tab(kk) := l_unique_rlm_id_tab(kk);
4997 END LOOP;
4998
4999 --Calling resource defualt API
5000 IF p_pa_debug_mode = 'Y' THEN
5001 pa_fp_gen_amount_utils.fp_debug
5002 (p_msg => 'Before calling
5003 pa_planning_resource_utils.get_resource_defaults',
5004 p_module_name => l_module_name,
5005 p_log_level => 5);
5006 END IF;
5007 --dbms_output.put_line('before get_resource_defaults:'||x_return_status);
5008 --dbms_output.put_line('project_id:'||p_project_id);
5009 --dbms_output.put_line('l_da_resource_list_members_tab.count'||l_da_resource_list_members_tab.count);
5010 --for i in 1..l_da_resource_list_members_tab.count loop
5011 --dbms_output.put_line('l_da_resource_list_members_tab(i)'||l_da_resource_list_members_tab(i));
5012 --end loop;
5013 PA_PLANNING_RESOURCE_UTILS.get_resource_defaults (
5014 P_resource_list_members => l_da_resource_list_members_tab,
5015 P_project_id => p_project_id,
5016 X_resource_class_flag => l_da_resource_class_flag_tab,
5017 X_resource_class_code => l_da_resource_class_code_tab,
5018 X_resource_class_id => l_da_resource_class_id_tab,
5019 X_res_type_code => l_da_res_type_code_tab,
5020 X_incur_by_res_type => l_da_incur_by_res_type_tab,
5021 X_person_id => l_da_person_id_tab,
5022 X_job_id => l_da_job_id_tab,
5023 X_person_type_code => l_da_person_type_code_tab,
5024 X_named_role => l_da_named_role_tab,
5025 X_bom_resource_id => l_da_bom_resource_id_tab,
5026 X_non_labor_resource => l_da_non_labor_resource_tab,
5027 X_inventory_item_id => l_da_inventory_item_id_tab,
5028 X_item_category_id => l_da_item_category_id_tab,
5029 X_project_role_id => l_da_project_role_id_tab,
5030 X_organization_id => l_da_organization_id_tab,
5031 X_fc_res_type_code => l_da_fc_res_type_code_tab,
5032 X_expenditure_type => l_da_expenditure_type_tab,
5033 X_expenditure_category => l_da_expenditure_category_tab,
5034 X_event_type => l_da_event_type_tab,
5035 X_revenue_category_code => l_da_revenue_category_code_tab,
5036 X_supplier_id => l_da_supplier_id_tab,
5037 X_spread_curve_id => l_da_spread_curve_id_tab,
5038 X_etc_method_code => l_da_etc_method_code_tab,
5039 X_mfc_cost_type_id => l_da_mfc_cost_type_id_tab,
5040 X_incurred_by_res_flag => l_da_incurred_by_res_flag_tab,
5041 X_incur_by_res_class_code => l_da_incur_by_res_cls_code_tab,
5042 X_incur_by_role_id => l_da_incur_by_role_id_tab,
5043 X_unit_of_measure => l_da_unit_of_measure_tab,
5044 X_org_id => l_da_org_id_tab,
5045 X_rate_based_flag => l_da_rate_based_flag_tab,
5046 X_rate_expenditure_type => l_da_rate_expenditure_type_tab,
5047 X_rate_func_curr_code => l_da_rate_func_curr_code_tab,
5048 X_msg_data => X_MSG_DATA,
5049 X_msg_count => X_MSG_COUNT,
5050 X_return_status => X_RETURN_STATUS);
5051 --dbms_output.put_line('after get_resource_defaults:'||x_return_status);
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 IF p_pa_debug_mode = 'Y' THEN
5056 pa_fp_gen_amount_utils.fp_debug
5057 (p_msg => 'Status after calling
5058 pa_planning_resource_utils.get_resource_defaults'
5059 ||x_return_status,
5060 p_module_name => l_module_name,
5061 p_log_level => 5);
5062 END IF;
5063
5064 IF p_gen_src_code = 'RESOURCE_SCHEDULE' THEN
5065 FOR jj in 1..l_da_spread_curve_id_tab.count LOOP
5066 l_da_spread_curve_id_tab(jj) := null;
5067 END LOOP;
5068 END IF;
5069
5070 -- IPM: At the time of resource creation, the resource_rate_based_flag
5071 -- should be set based on the default rate_based_flag for the resource.
5072 -- Modified the Update statement below to set resource_rate_based_flag.
5073
5074 --Bug 4052036. Changed the check in the where clause to identify the resource assignments that got inserted
5075 --thru this API.
5076 FORALL i IN 1 .. l_da_resource_list_members_tab.count
5077 UPDATE PA_RESOURCE_ASSIGNMENTS
5078 SET RESOURCE_CLASS_FLAG = l_da_resource_class_flag_tab(i),
5079 RESOURCE_CLASS_CODE = l_da_resource_class_code_tab(i),
5080 RES_TYPE_CODE = l_da_res_type_code_tab(i),
5081 PERSON_ID = l_da_person_id_tab(i),
5082 JOB_ID = l_da_job_id_tab(i),
5083 PERSON_TYPE_CODE = l_da_person_type_code_tab(i),
5084 NAMED_ROLE = l_da_named_role_tab(i),
5085 BOM_RESOURCE_ID = l_da_bom_resource_id_tab(i),
5086 NON_LABOR_RESOURCE = l_da_non_labor_resource_tab(i),
5087 INVENTORY_ITEM_ID = l_da_inventory_item_id_tab(i),
5088 ITEM_CATEGORY_ID = l_da_item_category_id_tab(i),
5089 PROJECT_ROLE_ID = l_da_project_role_id_tab(i),
5090 ORGANIZATION_ID = l_da_organization_id_tab(i),
5091 FC_RES_TYPE_CODE = l_da_fc_res_type_code_tab(i),
5092 EXPENDITURE_TYPE = l_da_expenditure_type_tab(i),
5093 EXPENDITURE_CATEGORY = l_da_expenditure_category_tab(i),
5094 EVENT_TYPE = l_da_event_type_tab(i),
5095 REVENUE_CATEGORY_CODE = l_da_revenue_category_code_tab(i),
5096 SUPPLIER_ID = l_da_supplier_id_tab(i),
5097 SPREAD_CURVE_ID = l_da_spread_curve_id_tab(i),
5098 ETC_METHOD_CODE = l_da_etc_method_code_tab(i),
5099 MFC_COST_TYPE_ID = l_da_mfc_cost_type_id_tab(i),
5100 INCURRED_BY_RES_FLAG = l_da_incurred_by_res_flag_tab(i),
5101 INCUR_BY_RES_CLASS_CODE = l_da_incur_by_res_cls_code_tab(i),
5102 INCUR_BY_ROLE_ID = l_da_incur_by_role_id_tab(i),
5103 UNIT_OF_MEASURE = l_da_unit_of_measure_tab(i),
5104 RATE_BASED_FLAG = l_da_rate_based_flag_tab(i),
5105 RESOURCE_RATE_BASED_FLAG = l_da_rate_based_flag_tab(i), -- Added for IPM ER
5106 RATE_EXPENDITURE_TYPE = l_da_rate_expenditure_type_tab(i),
5107 RATE_EXP_FUNC_CURR_CODE = l_da_rate_func_curr_code_tab(i),
5108 LAST_UPDATE_DATE = l_sysdate,
5109 LAST_UPDATED_BY = l_last_updated_by,
5110 CREATION_DATE = l_sysdate,
5111 CREATED_BY = l_last_updated_by,
5112 LAST_UPDATE_LOGIN = l_last_update_login,
5113 RATE_EXPENDITURE_ORG_ID = l_da_org_id_tab(i)
5114 WHERE budget_version_id = p_budget_version_id
5115 AND RESOURCE_LIST_MEMBER_ID = l_da_resource_list_members_tab(i)
5116 AND (resource_assignment_id
5117 BETWEEN l_ins_ra_id_tbl(l_ins_ra_id_tbl.FIRST) AND l_ins_ra_id_tbl(l_ins_ra_id_tbl.LAST));
5118
5119 IF P_PA_DEBUG_MODE = 'Y' THEN
5120 PA_DEBUG.Reset_Curr_Function;
5121 END IF;
5122 RETURN;
5123
5124 EXCEPTION
5125 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
5126 -- Bug Fix: 4569365. Removed MRC code.
5127 -- PA_MRC_FINPLAN.G_CALLING_MODULE := Null;
5128 l_msg_count := FND_MSG_PUB.count_msg;
5129 IF l_msg_count = 1 THEN
5130 PA_INTERFACE_UTILS_PUB.get_messages
5131 (p_encoded => FND_API.G_TRUE
5132 ,p_msg_index => 1
5133 ,p_msg_count => l_msg_count
5134 ,p_msg_data => l_msg_data
5135 ,p_data => l_data
5136 ,p_msg_index_out => l_msg_index_out);
5137 x_msg_data := l_data;
5138 x_msg_count := l_msg_count;
5139 ELSE
5140 x_msg_count := l_msg_count;
5141 END IF;
5142 ROLLBACK;
5143 x_return_status := FND_API.G_RET_STS_ERROR;
5144
5145 IF P_PA_DEBUG_MODE = 'Y' THEN
5146 PA_DEBUG.Reset_Curr_Function;
5147 END IF;
5148 WHEN OTHERS THEN
5149 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5150 x_msg_data := SUBSTR(SQLERRM,1,240);
5151 -- dbms_output.put_line('inside excep create res asg');
5152 -- dbms_output.put_line(SUBSTR(SQLERRM,1,240));
5153 FND_MSG_PUB.add_exc_msg
5154 ( p_pkg_name => 'PA_FP_GEN_BUDGET_AMT_PUB'
5155 ,p_procedure_name => 'CREATE_RES_ASG');
5156
5157 IF P_PA_DEBUG_MODE = 'Y' THEN
5158 PA_DEBUG.Reset_Curr_Function;
5159 END IF;
5160 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5161
5162 END CREATE_RES_ASG;
5163
5164
5165 /* Procedure to update the reosurce_assignment_id
5166 in the resource assignment table*/
5167 PROCEDURE UPDATE_RES_ASG
5168 (P_PROJECT_ID IN PA_PROJ_FP_OPTIONS.PROJECT_ID%TYPE,
5169 P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
5170 P_STRU_SHARING_CODE IN PA_PROJECTS_ALL.STRUCTURE_SHARING_CODE%TYPE,
5171 P_GEN_SRC_CODE IN PA_PROJ_FP_OPTIONS.GEN_ALL_SRC_CODE%TYPE,
5172 P_FP_COLS_REC IN PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
5173 P_WP_STRUCTURE_VER_ID IN PA_BUDGET_VERSIONS.PROJECT_STRUCTURE_VERSION_ID%TYPE,
5174 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
5175 X_MSG_COUNT OUT NOCOPY NUMBER,
5176 X_MSG_DATA OUT NOCOPY VARCHAR2) IS
5177
5178 l_module_name VARCHAR2(200) := 'pa.plsql.PA_FP_GEN_BUDGET_AMT_PUB.UPDATE_RES_ASG';
5179
5180 l_stru_sharing_code PA_PROJECTS_ALL.STRUCTURE_SHARING_CODE%TYPE;
5181
5182 l_res_assgn_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
5183 l_res_assgn_id_del_tab PA_PLSQL_DATATYPES.IdTabTyp;
5184 l_rlm_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
5185 l_txn_task_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
5186 l_txn_top_task_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
5187 l_txn_sub_task_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
5188 l_mapped_task_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
5189
5190 l_count number;
5191 l_project_id NUMBER(15);
5192
5193 tmp_count number;
5194 tmp_ra_id_tab PA_PLSQL_DATATYPES.IdTabTyp; -- PA_PLSQL_DATATYPES.Char30TabTyp;
5195 tmp_rlm_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
5196 tmp_task_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
5197
5198 l_txn_res_asg_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
5199 l_txn_plan_start_date_tab PA_PLSQL_DATATYPES.DateTabTyp;
5200 l_txn_plan_end_date_tab PA_PLSQL_DATATYPES.DateTabTyp;
5201
5202 l_txn_resource_asg_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
5203
5204 /* Variables for Manually Added Plan Lines logic */
5205 l_etc_start_date DATE;
5206 l_spread_curve_id pa_spread_curves_b.spread_curve_id%TYPE;
5207 BEGIN
5208 X_MSG_COUNT := 0;
5209 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
5210
5211 IF p_pa_debug_mode = 'Y' THEN
5212 pa_debug.set_curr_function( p_function => 'UPDATE_RES_ASG'
5213 ,p_debug_mode => p_pa_debug_mode);
5214 END IF;
5215 l_project_id := p_project_id;
5216
5217 l_stru_sharing_code := PA_PROJECT_STRUCTURE_UTILS.
5218 get_Structure_sharing_code(P_PROJECT_ID=> P_PROJECT_ID);
5219
5220 IF P_FP_COLS_REC.X_FIN_PLAN_LEVEL_CODE = 'P' or
5221 P_GEN_SRC_CODE = 'RESOURCE_SCHEDULE' THEN
5222
5223 /* Updating the TMP4 table with resource_assignment_id */
5224 SELECT /*+ INDEX(T,PA_RES_LIST_MAP_TMP4_N1)*/
5225 distinct P.RESOURCE_ASSIGNMENT_ID,
5226 P.RESOURCE_LIST_MEMBER_ID
5227 BULK COLLECT
5228 INTO l_res_assgn_id_tab,
5229 l_rlm_id_tab
5230 FROM PA_RESOURCE_ASSIGNMENTS P,
5231 PA_RES_LIST_MAP_TMP4 T
5232 WHERE P.BUDGET_VERSION_ID = P_BUDGET_VERSION_ID
5233 AND NVL(P.TASK_ID,0) = 0
5234 AND P.PROJECT_ASSIGNMENT_ID = -1
5235 AND T.RESOURCE_LIST_MEMBER_ID = P.RESOURCE_LIST_MEMBER_ID;
5236
5237 FORALL i IN 1..l_res_assgn_id_tab.count
5238 UPDATE /*+ INDEX(PA_RES_LIST_MAP_TMP4,PA_RES_LIST_MAP_TMP4_N1)*/
5239 PA_RES_LIST_MAP_TMP4
5240 SET TXN_RESOURCE_ASSIGNMENT_ID = l_res_assgn_id_tab(i)
5241 WHERE RESOURCE_LIST_MEMBER_ID = l_rlm_id_tab(i);
5242 /* AND NVL(TXN_TASK_ID,0) = l_txn_task_id_tab(i);
5243 task id check is not required. commented for bug 3475017 */
5244
5245 /* Updating the TMP4 table with resource_assignment_id
5246 when planning level is Lowest task (Financial task only)*/
5247 ELSIF P_FP_COLS_REC.X_FIN_PLAN_LEVEL_CODE = 'L'
5248 AND ( l_stru_sharing_code IS NULL OR
5249 l_stru_sharing_code = 'SHARE_FULL' OR
5250 P_GEN_SRC_CODE IN ( 'FINANCIAL_PLAN',
5251 'OPEN_COMMITMENTS','BILLING_EVENTS' )) THEN
5252
5253 SELECT /*+ INDEX(T,PA_RES_LIST_MAP_TMP4_N1)*/
5254 P.RESOURCE_ASSIGNMENT_ID,
5255 P.RESOURCE_LIST_MEMBER_ID,
5256 NVL(T.TXN_TASK_ID,0)
5257 BULK COLLECT
5258 INTO l_res_assgn_id_tab,
5259 l_rlm_id_tab,
5260 l_txn_task_id_tab
5261 FROM PA_RESOURCE_ASSIGNMENTS P,
5262 PA_RES_LIST_MAP_TMP4 T
5263 WHERE P.BUDGET_VERSION_ID = P_BUDGET_VERSION_ID
5264 AND NVL(P.TASK_ID,0) = NVL(T.TXN_TASK_ID,0)
5265 AND P.PROJECT_ASSIGNMENT_ID = -1
5266 AND T.RESOURCE_LIST_MEMBER_ID = P.RESOURCE_LIST_MEMBER_ID;
5267
5268 FORALL i IN 1..l_res_assgn_id_tab.count
5269 UPDATE /*+ INDEX(PA_RES_LIST_MAP_TMP4,PA_RES_LIST_MAP_TMP4_N1)*/
5270 PA_RES_LIST_MAP_TMP4
5271 SET TXN_RESOURCE_ASSIGNMENT_ID = l_res_assgn_id_tab(i)
5272 WHERE RESOURCE_LIST_MEMBER_ID = l_rlm_id_tab(i)
5273 AND NVL(TXN_TASK_ID,0) = l_txn_task_id_tab(i);
5274
5275 /* Updating the TMP4 table with resource_assignment_id
5276 when planning level is Top task (Financial task only)*/
5277 ELSIF P_FP_COLS_REC.X_FIN_PLAN_LEVEL_CODE = 'T'
5278 AND ( l_stru_sharing_code IS NULL OR
5279 l_stru_sharing_code = 'SHARE_FULL' OR
5280 P_GEN_SRC_CODE IN ( 'FINANCIAL_PLAN',
5281 'OPEN_COMMITMENTS','BILLING_EVENTS' )) THEN
5282
5283 SELECT /*+ INDEX(T,PA_RES_LIST_MAP_TMP4_N1)*/
5284 P.RESOURCE_ASSIGNMENT_ID,
5285 P.RESOURCE_LIST_MEMBER_ID,
5286 NVL(P.TASK_ID,0),
5287 NVL(T.TXN_TASK_ID,0)
5288 BULK COLLECT
5289 INTO l_res_assgn_id_tab,
5290 l_rlm_id_tab,
5291 l_txn_top_task_id_tab,
5292 l_txn_sub_task_id_tab
5293 FROM PA_RESOURCE_ASSIGNMENTS P,
5294 PA_RES_LIST_MAP_TMP4 T,
5295 PA_TASKS TS
5296 WHERE P.BUDGET_VERSION_ID = P_BUDGET_VERSION_ID
5297 AND TS.TASK_ID(+) = NVL(T.TXN_TASK_ID,0)
5298 AND NVL(P.TASK_ID,0) = NVL(TS.TOP_TASK_ID,0)
5299 AND P.PROJECT_ASSIGNMENT_ID = -1
5300 AND T.RESOURCE_LIST_MEMBER_ID = P.RESOURCE_LIST_MEMBER_ID;
5301
5302 FORALL i IN 1..l_res_assgn_id_tab.count
5303 UPDATE /*+ INDEX(PA_RES_LIST_MAP_TMP4,PA_RES_LIST_MAP_TMP4_N1)*/
5304 PA_RES_LIST_MAP_TMP4 tmp4
5305 SET TXN_RESOURCE_ASSIGNMENT_ID = l_res_assgn_id_tab(i)
5306 WHERE RESOURCE_LIST_MEMBER_ID = l_rlm_id_tab(i)
5307 AND NVL(TXN_TASK_ID,0) = l_txn_sub_task_id_tab(i);
5308
5309 /* Updating the TMP4 table with resource_assignment_id when
5310 planning level is Lowest task (both Financial task and Workplan task)*/
5311
5312 ELSIF P_FP_COLS_REC.X_FIN_PLAN_LEVEL_CODE = 'L' AND l_stru_sharing_code IS NOT NULL THEN
5313 SELECT resource_assignment_id,
5314 resource_list_member_id,
5315 txn_task_id,
5316 mapped_fin_task_id
5317 BULK COLLECT INTO
5318 l_res_assgn_id_tab,
5319 l_rlm_id_tab,
5320 l_txn_task_id_tab,
5321 l_mapped_task_id_tab
5322 FROM
5323 (
5324 SELECT /*+ INDEX(T,PA_RES_LIST_MAP_TMP4_N1)*/
5325 P.RESOURCE_ASSIGNMENT_ID resource_assignment_id,
5326 P.RESOURCE_LIST_MEMBER_ID resource_list_member_id,
5327 NVL(T.TXN_TASK_ID,0) txn_task_id ,
5328 NVL(V.MAPPED_FIN_TASK_ID,0) mapped_fin_task_id
5329 FROM PA_RESOURCE_ASSIGNMENTS P,
5330 PA_RES_LIST_MAP_TMP4 T,
5331 PA_MAP_WP_TO_FIN_TASKS_V V
5332 WHERE P.BUDGET_VERSION_ID = P_BUDGET_VERSION_ID
5333 AND V.PARENT_STRUCTURE_VERSION_ID = P_WP_STRUCTURE_VER_ID
5334 AND NVL(T.TXN_TASK_ID,0) = NVL(V.PROJ_ELEMENT_ID,0)
5335 AND P.PROJECT_ASSIGNMENT_ID = -1
5336 AND T.RESOURCE_LIST_MEMBER_ID = P.RESOURCE_LIST_MEMBER_ID
5337 AND NVL(P.TASK_ID,0) = NVL(V.MAPPED_FIN_TASK_ID,0)
5338 AND NVL(T.TXN_TASK_ID,0) > 0
5339 union
5340 SELECT /*+ INDEX(T,PA_RES_LIST_MAP_TMP4_N1)*/
5341 P.RESOURCE_ASSIGNMENT_ID resource_assignment_id,
5342 P.RESOURCE_LIST_MEMBER_ID resource_list_member_id,
5343 0 txn_task_id,
5344 0 mapped_fin_task_id
5345 FROM PA_RESOURCE_ASSIGNMENTS P,
5346 PA_RES_LIST_MAP_TMP4 T
5347 WHERE P.BUDGET_VERSION_ID = P_BUDGET_VERSION_ID
5348 AND P.PROJECT_ASSIGNMENT_ID = -1
5349 AND T.RESOURCE_LIST_MEMBER_ID = P.RESOURCE_LIST_MEMBER_ID
5350 AND NVL(P.TASK_ID,0) = 0 );
5351
5352 --@@
5353 IF P_PA_DEBUG_MODE = 'Y' THEN
5354 for i in 1..l_res_assgn_id_tab.count loop
5355 pa_fp_gen_amount_utils.fp_debug
5356 (p_msg => 'within update when share partial and planning at lowest task i:'
5357 ||i||'; ra id in cursor:'||l_res_assgn_id_tab(i)
5358 ||';rlm id in cursor:'||l_rlm_id_tab(i)
5359 ||';task id in cursor:'||l_txn_task_id_tab(i)
5360 ||';mapped task id in cursor:'||l_mapped_task_id_tab(i),
5361 p_module_name => l_module_name,
5362 p_log_level => 5);
5363 end loop;
5364 END IF;
5365 --@@
5366
5367 --dbms_output.put_line('@@l_res_assgn_id_tab.count'||l_res_assgn_id_tab.count);
5368 --dbms_output.put_line('@@l_res_assgn_id_tab(1):'||l_res_assgn_id_tab(1));
5369 --dbms_output.put_line('@@l_res_assgn_id_tab(2):'||l_res_assgn_id_tab(2));
5370 --dbms_output.put_line('@@l_res_assgn_id_tab(3):'||l_res_assgn_id_tab(3));
5371 --dbms_output.put_line('@@l_res_assgn_id_tab(4):'||l_res_assgn_id_tab(4));
5372 --dbms_output.put_line('@@l_rlm_id_tab(1):'||l_rlm_id_tab(1));
5373 --dbms_output.put_line('@@l_rlm_id_tab(2):'||l_rlm_id_tab(2));
5374 --dbms_output.put_line('@@l_rlm_id_tab(1):'||l_rlm_id_tab(3));
5375 --dbms_output.put_line('@@l_rlm_id_tab(2):'||l_rlm_id_tab(4));
5376 --dbms_output.put_line('@@l_txn_task_id_tab(1):'||l_txn_task_id_tab(1));
5377 --dbms_output.put_line('@@l_txn_task_id_tab(2):'||l_txn_task_id_tab(2));
5378 --dbms_output.put_line('@@l_txn_task_id_tab(3):'||l_txn_task_id_tab(3));
5379 --dbms_output.put_line('@@l_txn_task_id_tab(4):'||l_txn_task_id_tab(4));
5380 --select count(*) into tmp_count from PA_RES_LIST_MAP_TMP4;
5381 --dbms_output.put_line('@@l_count of tmp4:'||tmp_count);
5382 --select txn_resource_assignment_id,resource_list_member_id, txn_task_id
5383 --bulk collect into tmp_ra_id_tab, tmp_rlm_id_tab, tmp_task_id_tab
5384 --from PA_RES_LIST_MAP_TMP4;
5385 --dbms_output.put_line('@@tmp_ra_id_tab.count'||tmp_ra_id_tab.count);
5386 --dbms_output.put_line('@@tmp_ra_id_tab(1):'||tmp_ra_id_tab(1));
5387 --dbms_output.put_line('@@tmp_ra_id_tab(2):'||tmp_ra_id_tab(2));
5388 --dbms_output.put_line('@@tmp_ra_id_tab(3):'||tmp_ra_id_tab(3));
5389 --dbms_output.put_line('@@tmp_rlm_id_tab(1):'||tmp_rlm_id_tab(1));
5390 --dbms_output.put_line('@@tmp_rlm_id_tab(2):'||tmp_rlm_id_tab(2));
5391 --dbms_output.put_line('@@tmp_rlm_id_tab(3):'||tmp_rlm_id_tab(3));
5392 --dbms_output.put_line('@@tmp_task_id_tab(1):'||tmp_task_id_tab(1));
5393 --dbms_output.put_line('@@tmp_task_id_tab(2):'||tmp_task_id_tab(2));
5394 --dbms_output.put_line('@@tmp_task_id_tab(3):'||tmp_task_id_tab(3));
5395
5396 FORALL i IN 1..l_res_assgn_id_tab.count
5397 UPDATE /*+ INDEX(PA_RES_LIST_MAP_TMP4,PA_RES_LIST_MAP_TMP4_N1)*/
5398 PA_RES_LIST_MAP_TMP4
5399 SET TXN_RESOURCE_ASSIGNMENT_ID = l_res_assgn_id_tab(i)
5400 WHERE RESOURCE_LIST_MEMBER_ID = l_rlm_id_tab(i)
5401 AND NVL(TXN_TASK_ID,0) = l_txn_task_id_tab(i);
5402
5403 ELSIF P_FP_COLS_REC.X_FIN_PLAN_LEVEL_CODE = 'T'
5404 AND l_stru_sharing_code IS NOT NULL THEN
5405 SELECT resource_assignment_id,
5406 resource_list_member_id,
5407 txn_task_id,
5408 mapped_fin_task_id
5409 BULK COLLECT INTO
5410 l_res_assgn_id_tab,
5411 l_rlm_id_tab,
5412 l_txn_task_id_tab,
5413 l_mapped_task_id_tab
5414 FROM
5415 (
5416 SELECT /*+ INDEX(T,PA_RES_LIST_MAP_TMP4_N1)*/
5417 P.RESOURCE_ASSIGNMENT_ID resource_assignment_id,
5418 P.RESOURCE_LIST_MEMBER_ID resource_list_member_id,
5419 NVL(T.TXN_TASK_ID,0) txn_task_id,
5420 NVL(V.MAPPED_FIN_TASK_ID,0) mapped_fin_task_id
5421 FROM PA_RESOURCE_ASSIGNMENTS P,
5422 PA_RES_LIST_MAP_TMP4 T,
5423 PA_MAP_WP_TO_FIN_TASKS_V V,
5424 PA_TASKS TS
5425 WHERE P.BUDGET_VERSION_ID = P_BUDGET_VERSION_ID
5426 AND V.PARENT_STRUCTURE_VERSION_ID = P_WP_STRUCTURE_VER_ID
5427 AND t.txn_task_id = v.PROJ_ELEMENT_ID
5428 AND NVL(TS.top_TASK_ID,0) = NVL(p.task_id,0)
5429 AND TS.TASK_ID(+) = NVL(V.MAPPED_FIN_TASK_ID,0)
5430 AND P.PROJECT_ASSIGNMENT_ID = -1
5431 AND T.RESOURCE_LIST_MEMBER_ID = P.RESOURCE_LIST_MEMBER_ID
5432 AND NVL(T.TXN_TASK_ID,0) > 0
5433 union
5434 SELECT /*+ INDEX(T,PA_RES_LIST_MAP_TMP4_N1)*/
5435 DISTINCT P.RESOURCE_ASSIGNMENT_ID resource_assignment_id,
5436 P.RESOURCE_LIST_MEMBER_ID resource_list_member_id,
5437 0 txn_task_id,
5438 0 mapped_fin_task_id
5439 FROM PA_RESOURCE_ASSIGNMENTS P,
5440 PA_RES_LIST_MAP_TMP4 T
5441 WHERE P.BUDGET_VERSION_ID = P_BUDGET_VERSION_ID
5442 AND P.PROJECT_ASSIGNMENT_ID = -1
5443 AND T.RESOURCE_LIST_MEMBER_ID = P.RESOURCE_LIST_MEMBER_ID
5444 AND NVL(P.TASK_ID,0) = 0
5445 AND NVL(T.TXN_TASK_ID,0) = NVL(P.TASK_ID,0) );
5446
5447 FORALL i IN 1..l_res_assgn_id_tab.count
5448 UPDATE /*+ INDEX(PA_RES_LIST_MAP_TMP4,PA_RES_LIST_MAP_TMP4_N1)*/
5449 PA_RES_LIST_MAP_TMP4
5450 SET TXN_RESOURCE_ASSIGNMENT_ID = l_res_assgn_id_tab(i)
5451 WHERE RESOURCE_LIST_MEMBER_ID = l_rlm_id_tab(i)
5452 AND NVL(TXN_TASK_ID,0) = l_txn_task_id_tab(i);
5453
5454 END IF;
5455
5456 -- Bug 4159172: Moved manual lines logic from CREATE_RES_ASG to after
5457 -- txn_resource_assignments have been updated in tmp4 so that we can
5458 -- delete tmp4 records for manually added resources based on txn ra_ids
5459 -- instead of txn_task_id. Checking for txn_task_id is not sufficient
5460 -- (e.g. when Target is planned at a higher level than the source or when
5461 -- the structure is Partially Shared).
5462
5463 /* If the Retain Manually Added Plan Lines option is enabled, we remove
5464 * all rows in the PA_RES_LIST_MAP_TMP4 table with target resources that
5465 * have manually added plan lines. Thus, after this point, we can use the
5466 * mapping table without checking for the manually added lines condition. */
5467 IF p_fp_cols_rec.x_gen_ret_manual_line_flag = 'Y' THEN
5468 IF p_fp_cols_rec.x_plan_class_code = 'BUDGET' THEN
5469 DELETE FROM pa_res_list_map_tmp4 tmp
5470 WHERE EXISTS
5471 ( SELECT /*+ INDEX(tmp,PA_RES_LIST_MAP_TMP4_N2)*/ 1
5472 FROM pa_resource_assignments ra
5473 WHERE ra.budget_version_id = p_budget_version_id
5474 AND ra.resource_assignment_id = tmp.txn_resource_assignment_id
5475 AND ra.transaction_source_code IS NULL
5476 AND EXISTS
5477 ( SELECT 1
5478 FROM pa_budget_lines bl
5479 WHERE bl.resource_assignment_id = ra.resource_assignment_id
5480 AND rownum = 1 ));
5481 ELSIF p_fp_cols_rec.x_plan_class_code = 'FORECAST' THEN
5482 l_etc_start_date := PA_FP_GEN_AMOUNT_UTILS.GET_ETC_START_DATE
5483 ( p_budget_version_id );
5484 DELETE FROM pa_res_list_map_tmp4 tmp
5485 WHERE EXISTS
5486 ( SELECT /*+ INDEX(tmp,PA_RES_LIST_MAP_TMP4_N2)*/ 1
5487 FROM pa_resource_assignments ra
5488 WHERE ra.budget_version_id = p_budget_version_id
5489 AND ra.resource_assignment_id = tmp.txn_resource_assignment_id
5490 AND ra.transaction_source_code IS NULL
5491 AND EXISTS
5492 ( SELECT 1
5493 FROM pa_budget_lines bl
5494 WHERE bl.resource_assignment_id = ra.resource_assignment_id
5495 AND bl.start_date >= l_etc_start_date
5496 AND rownum = 1 ));
5497 END IF;
5498 END IF; -- end manual lines logic
5499
5500 --Bug 6163120. Commented out the join on txn_budget_version_id
5501 --as its not populated in this table.
5502 SELECT txn_resource_assignment_id,
5503 min(txn_planning_start_date),
5504 max(txn_planning_end_date)
5505 BULK COLLECT
5506 INTO l_txn_res_asg_id_tab,
5507 l_txn_plan_start_date_tab,
5508 l_txn_plan_end_date_tab
5509 FROM PA_RES_LIST_MAP_TMP4
5510 --WHERE txn_budget_version_id = p_budget_version_id
5511 GROUP BY txn_resource_assignment_id;
5512
5513 FORALL j IN 1..l_txn_res_asg_id_tab.count
5514 UPDATE PA_RESOURCE_ASSIGNMENTS
5515 SET PLANNING_START_DATE = l_txn_plan_start_date_tab(j),
5516 PLANNING_END_DATE = l_txn_plan_end_date_tab(j)
5517 WHERE RESOURCE_ASSIGNMENT_ID = l_txn_res_asg_id_tab(j);
5518
5519 -- Bug 4159172: Moved update of sp_fixed_date from CREATE_RES_ASG to here.
5520
5521 SELECT spread_curve_id
5522 INTO l_spread_curve_id
5523 FROM pa_spread_curves_b
5524 WHERE spread_curve_code = 'FIXED_DATE';
5525
5526 UPDATE PA_RESOURCE_ASSIGNMENTS
5527 SET SP_FIXED_DATE = PLANNING_START_DATE
5528 WHERE SP_FIXED_DATE IS NULL
5529 AND SPREAD_CURVE_ID = l_spread_curve_id
5530 AND budget_version_id = p_budget_version_id
5531 AND EXISTS ( SELECT /*+ INDEX(tmp,PA_RES_LIST_MAP_TMP4_N2)*/ 1
5532 FROM pa_res_list_map_tmp4 tmp
5533 WHERE tmp.txn_resource_assignment_id = resource_assignment_id
5534 AND rownum = 1 );
5535
5536 -- Bug 3973015: Added the NOT EXISTS condition to the WHERE clause
5537 -- to reflect new Retain Manually Added Lines logic. The transaction
5538 -- source code should only be set if it is NULL and there are no
5539 -- budget lines for the resource assignment id.
5540 -- Update 12/1/04: We have changed how the Retain Manually Added
5541 -- Lines logic is handled, so replaced previous update logic.
5542
5543 --Bug 4198901 : Spread curve should be null when generate from source plan where actual exist
5544 -- added update for spread_curve_id /sp_fixed_date
5545 UPDATE PA_RESOURCE_ASSIGNMENTS
5546 SET transaction_source_code = p_gen_src_code,
5547 sp_fixed_date = decode (p_gen_src_code, 'RESOURCE_SCHEDULE', NULL, sp_fixed_date),
5548 spread_curve_id = decode (p_gen_src_code, 'RESOURCE_SCHEDULE', NULL, spread_curve_id)
5549 WHERE budget_version_id = p_budget_version_id
5550 AND EXISTS ( SELECT /*+ INDEX(tmp,PA_RES_LIST_MAP_TMP4_N2)*/ 1
5551 FROM pa_res_list_map_tmp4 tmp
5552 WHERE tmp.txn_resource_assignment_id = resource_assignment_id
5553 AND rownum = 1 );
5554
5555 IF P_PA_DEBUG_MODE = 'Y' THEN
5556 PA_DEBUG.Reset_Curr_Function;
5557 END IF;
5558 RETURN;
5559
5560 EXCEPTION
5561 WHEN OTHERS THEN
5562 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5563 x_msg_data := SUBSTR(SQLERRM,1,240);
5564 FND_MSG_PUB.add_exc_msg
5565 ( p_pkg_name => 'PA_FP_GEN_BUDGET_AMT_PUB'
5566 ,p_procedure_name => 'UPDATE_RES_ASG');
5567 IF P_PA_DEBUG_MODE = 'Y' THEN
5568 PA_DEBUG.Reset_Curr_Function;
5569 END IF;
5570 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5571
5572 END UPDATE_RES_ASG;
5573
5574 /*Procedure to delete the manually entered budget line records
5575 PX_RES_ASG_ID_TAB ->this pl sql table will have res asg id
5576 for which the budget lines has to be deleted.
5577 PX_DELETED_RES_ASG_ID_TAB->this pl sql table will have res asg ids
5578 for which the budget_lines are deleted by this API.
5579
5580 These two pl sql tables are used to make sure that
5581 we are not deleting budget lines records that was generated
5582 by the previous source in the same run.
5583 */
5584 PROCEDURE DEL_MANUAL_BDGT_LINES
5585 ( P_PROJECT_ID IN PA_PROJ_FP_OPTIONS.PROJECT_ID%TYPE,
5586 P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
5587 PX_RES_ASG_ID_TAB IN OUT NOCOPY PA_PLSQL_DATATYPES.IdTabTyp,
5588 PX_DELETED_RES_ASG_ID_TAB IN OUT NOCOPY PA_PLSQL_DATATYPES.IdTabTyp,
5589 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
5590 X_MSG_COUNT OUT NOCOPY NUMBER,
5591 X_MSG_DATA OUT NOCOPY VARCHAR2) IS
5592 l_module_name VARCHAR2(200) := 'pa.plsql.PA_FP_GEN_BUDGET_AMT_PUB.DEL_MANUAL_BDGT_LINES';
5593
5594 l_del_res_asg_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
5595 l_exist_flag VARCHAR2(1) := 'N';
5596 l_count NUMBER;
5597
5598 BEGIN
5599
5600 X_MSG_COUNT := 0;
5601 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
5602
5603 IF p_pa_debug_mode = 'Y' THEN
5604 pa_debug.set_curr_function( p_function => 'DEL_MANUAL_BDGT_LINES'
5605 ,p_debug_mode => p_pa_debug_mode);
5606 END IF;
5607
5608 FOR i IN 1..PX_RES_ASG_ID_TAB.count LOOP
5609 l_del_res_asg_id_tab(i) := PX_RES_ASG_ID_TAB(i);
5610 END LOOP;
5611
5612 IF PX_RES_ASG_ID_TAB.count > 0 THEN
5613 FOR i IN 1..PX_RES_ASG_ID_TAB.count LOOP
5614 l_exist_flag := 'N';
5615 FOR j IN 1..PX_DELETED_RES_ASG_ID_TAB.count LOOP
5616 IF PX_RES_ASG_ID_TAB(i) = PX_DELETED_RES_ASG_ID_TAB(j) THEN
5617 l_exist_flag := 'Y';
5618 EXIT;
5619 END IF;
5620 END LOOP;
5621
5622 IF l_exist_flag = 'N' THEN
5623 l_del_res_asg_id_tab(l_del_res_asg_id_tab.count+1) := PX_RES_ASG_ID_TAB(i);
5624 END IF;
5625 END LOOP;
5626 END IF;
5627
5628 -- Deleting the PL/SQL table
5629 PX_DELETED_RES_ASG_ID_TAB.delete;
5630
5631 FOR k in 1..l_del_res_asg_id_tab.count LOOP
5632 PX_DELETED_RES_ASG_ID_TAB(k) := l_del_res_asg_id_tab(k);
5633 END LOOP;
5634
5635 FORALL i in 1..PX_DELETED_RES_ASG_ID_TAB.count
5636 DELETE FROM PA_BUDGET_LINES
5637 WHERE RESOURCE_ASSIGNMENT_ID = PX_DELETED_RES_ASG_ID_TAB(i);
5638
5639 IF p_pa_debug_mode = 'Y' THEN
5640 pa_fp_gen_amount_utils.fp_debug
5641 (p_msg => 'Before calling
5642 pa_fp_rollup_pkg.rollup_budget_version',
5643 p_module_name => l_module_name,
5644 p_log_level => 5);
5645 END IF;
5646 PA_FP_ROLLUP_PKG.ROLLUP_BUDGET_VERSION
5647 (p_budget_version_id => P_BUDGET_VERSION_ID,
5648 p_entire_version => 'Y',
5649 X_RETURN_STATUS => X_RETURN_STATUS,
5650 X_MSG_COUNT => X_MSG_COUNT,
5651 X_MSG_DATA => X_MSG_DATA);
5652
5653 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
5654 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
5655 END IF;
5656 IF p_pa_debug_mode = 'Y' THEN
5657 pa_fp_gen_amount_utils.fp_debug
5658 (p_msg => 'Status after calling
5659 pa_fp_rollup_pkg.rollup_budget_version: '
5660 ||x_return_status,
5661 p_module_name => l_module_name,
5662 p_log_level => 5);
5663 END IF;
5664
5665 IF P_PA_DEBUG_MODE = 'Y' THEN
5666 PA_DEBUG.Reset_Curr_Function;
5667 END IF;
5668
5669 EXCEPTION
5670 WHEN OTHERS THEN
5671 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5672 x_msg_data := SUBSTR(SQLERRM,1,240);
5673 FND_MSG_PUB.add_exc_msg
5674 ( p_pkg_name => 'PA_FP_GEN_BUDGET_AMT_PUB'
5675 ,p_procedure_name => 'DEL_MANUAL_BDGT_LINES');
5676
5677 IF P_PA_DEBUG_MODE = 'Y' THEN
5678 PA_DEBUG.Reset_Curr_Function;
5679 END IF;
5680
5681 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5682 END DEL_MANUAL_BDGT_LINES;
5683
5684 PROCEDURE UPDATE_INIT_AMOUNTS
5685 (P_PROJECT_ID IN PA_PROJ_FP_OPTIONS.PROJECT_ID%TYPE,
5686 P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
5687 P_RES_ASG_ID_TAB IN PA_PLSQL_DATATYPES.IdTabTyp,
5688 --this pl/sql table will have newly created res_asg_id from the source
5689 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
5690 X_MSG_COUNT OUT NOCOPY NUMBER,
5691 X_MSG_DATA OUT NOCOPY VARCHAR2) IS
5692
5693 l_module_name VARCHAR2(200) := 'pa.plsql.PA_FP_GEN_BUDGET_AMT_PUB.UPDATE_INIT_AMOUNTS';
5694
5695 BEGIN
5696
5697 X_MSG_COUNT := 0;
5698 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
5699
5700 IF p_pa_debug_mode = 'Y' THEN
5701 pa_debug.set_curr_function( p_function => 'UPDATE_INIT_AMOUNTS'
5702 ,p_debug_mode => p_pa_debug_mode);
5703 END IF;
5704
5705 FORALL i IN 1..P_RES_ASG_ID_TAB.count
5706 UPDATE PA_BUDGET_LINES
5707 SET INIT_QUANTITY = QUANTITY,
5708 INIT_QUANTITY_SOURCE = QUANTITY_SOURCE,
5709 INIT_RAW_COST = RAW_COST,
5710 INIT_BURDENED_COST = BURDENED_COST,
5711 INIT_REVENUE = REVENUE,
5712 INIT_RAW_COST_SOURCE = RAW_COST_SOURCE,
5713 INIT_BURDENED_COST_SOURCE = BURDENED_COST_SOURCE,
5714 INIT_REVENUE_SOURCE = REVENUE_SOURCE,
5715 PROJECT_INIT_RAW_COST = PROJECT_RAW_COST,
5716 PROJECT_INIT_BURDENED_COST = PROJECT_BURDENED_COST,
5717 PROJECT_INIT_REVENUE = PROJECT_REVENUE,
5718 TXN_INIT_RAW_COST = TXN_RAW_COST,
5719 TXN_INIT_BURDENED_COST = TXN_BURDENED_COST,
5720 TXN_INIT_REVENUE = TXN_REVENUE
5721 WHERE RESOURCE_ASSIGNMENT_ID = P_RES_ASG_ID_TAB(i);
5722
5723 IF P_PA_DEBUG_MODE = 'Y' THEN
5724 PA_DEBUG.Reset_Curr_Function;
5725 END IF;
5726
5727 EXCEPTION
5728 WHEN OTHERS THEN
5729 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5730 x_msg_data := SUBSTR(SQLERRM,1,240);
5731 FND_MSG_PUB.add_exc_msg
5732 ( p_pkg_name => 'PA_FP_GEN_BUDGET_AMT_PUB'
5733 ,p_procedure_name => 'UPDATE_INIT_AMOUNTS');
5734
5735 IF P_PA_DEBUG_MODE = 'Y' THEN
5736 PA_DEBUG.Reset_Curr_Function;
5737 END IF;
5738
5739 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5740
5741 END UPDATE_INIT_AMOUNTS;
5742
5743 /* Procedure to update the latest amount
5744 generation date in the budget versions table*/
5745 PROCEDURE UPDATE_BV_FOR_GEN_DATE
5746 (P_PROJECT_ID IN PA_PROJ_FP_OPTIONS.PROJECT_ID%TYPE,
5747 P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
5748 P_ETC_START_DATE IN PA_BUDGET_VERSIONS.ETC_START_DATE%TYPE,
5749 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
5750 X_MSG_COUNT OUT NOCOPY NUMBER,
5751 X_MSG_DATA OUT NOCOPY VARCHAR2) IS
5752
5753 l_module_name VARCHAR2(200) := 'pa.plsql.PA_FP_GEN_BUDGET_AMT_PUB.UPDATE_BV_FOR_GEN_DATE';
5754
5755 l_last_updated_by NUMBER := FND_GLOBAL.user_id;
5756 l_last_update_login NUMBER := FND_GLOBAL.login_id;
5757 l_sysdate DATE := SYSDATE;
5758
5759 BEGIN
5760
5761 X_MSG_COUNT := 0;
5762 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
5763
5764 IF p_pa_debug_mode = 'Y' THEN
5765 pa_debug.set_curr_function( p_function => 'UPDATE_BV_FOR_GEN_DATE'
5766 ,p_debug_mode => p_pa_debug_mode);
5767 END IF;
5768
5769 UPDATE PA_BUDGET_VERSIONS
5770 SET LAST_AMT_GEN_DATE = l_sysdate,
5771 LAST_UPDATE_DATE = l_sysdate,
5772 LAST_UPDATED_BY = l_last_updated_by,
5773 CREATION_DATE = l_sysdate,
5774 CREATED_BY = l_last_updated_by,
5775 LAST_UPDATE_LOGIN = l_last_update_login,
5776 record_version_number = nvl(record_version_number,0)+1,
5777 ETC_START_DATE = p_etc_start_date
5778 WHERE BUDGET_VERSION_ID = P_BUDGET_VERSION_ID;
5779
5780 IF P_PA_DEBUG_MODE = 'Y' THEN
5781 PA_DEBUG.Reset_Curr_Function;
5782 END IF;
5783
5784 EXCEPTION
5785 WHEN OTHERS THEN
5786 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5787 x_msg_data := SUBSTR(SQLERRM,1,240);
5788 rollback;
5789 FND_MSG_PUB.add_exc_msg
5790 ( p_pkg_name => 'PA_FP_GEN_BUDGET_AMT_PUB'
5791 ,p_procedure_name => 'UPDATE_BV_FOR_GEN_DATE');
5792
5793 IF P_PA_DEBUG_MODE = 'Y' THEN
5794 PA_DEBUG.Reset_Curr_Function;
5795 END IF;
5796
5797 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5798
5799 END UPDATE_BV_FOR_GEN_DATE;
5800
5801 PROCEDURE GET_GENERATED_RES_ASG
5802 (P_PROJECT_ID IN PA_PROJ_FP_OPTIONS.PROJECT_ID%TYPE,
5803 P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
5804 PX_GEN_RES_ASG_ID_TAB IN OUT NOCOPY PA_PLSQL_DATATYPES.IdTabTyp,
5805 P_CHK_DUPLICATE_FLAG IN VARCHAR2,
5806 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
5807 X_MSG_COUNT OUT NOCOPY NUMBER,
5808 X_MSG_DATA OUT NOCOPY VARCHAR2) IS
5809 l_module_name VARCHAR2(200) := 'pa.plsql.PA_FP_GEN_BUDGET_AMT_PUB.GET_GENERATED_RES_ASG';
5810
5811 l_gen_res_asg_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
5812 l_cmt_res_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
5813 l_exist_flag VARCHAR2(1);
5814
5815 BEGIN
5816 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
5817 X_MSG_COUNT := 0;
5818
5819 IF p_pa_debug_mode = 'Y' THEN
5820 pa_debug.set_curr_function( p_function => 'GET_GENERATED_RES_ASG'
5821 ,p_debug_mode => p_pa_debug_mode);
5822 END IF;
5823
5824 /* For first time call PA_GEN_RES_ASG_ID_TAB will
5825 be empty so it is bulk collected from tmp4 table*/
5826 IF P_CHK_DUPLICATE_FLAG = 'N' THEN
5827 SELECT DISTINCT TXN_RESOURCE_ASSIGNMENT_ID
5828 BULK COLLECT
5829 INTO PX_GEN_RES_ASG_ID_TAB
5830 FROM PA_RES_LIST_MAP_TMP4;
5831 END IF;
5832
5833 /*Code checking for duplicate res_asg_id */
5834 FOR i IN 1..PX_GEN_RES_ASG_ID_TAB.count LOOP
5835 l_gen_res_asg_id_tab(i) := PX_GEN_RES_ASG_ID_TAB(i);
5836 END LOOP;
5837
5838 SELECT DISTINCT TXN_RESOURCE_ASSIGNMENT_ID
5839 BULK COLLECT
5840 INTO l_cmt_res_id_tab
5841 FROM PA_RES_LIST_MAP_TMP4;
5842
5843 IF l_cmt_res_id_tab.count > 0 THEN
5844 FOR k IN 1..l_cmt_res_id_tab.count LOOP
5845 l_exist_flag := 'N';
5846 FOR kk IN 1..l_gen_res_asg_id_tab.count LOOP
5847 IF l_gen_res_asg_id_tab(kk) = l_cmt_res_id_tab(k) THEN
5848 l_exist_flag := 'Y';
5849 EXIT;
5850 END IF;
5851 END LOOP;
5852 IF l_exist_flag = 'N' THEN
5853 PX_GEN_RES_ASG_ID_TAB(PX_GEN_RES_ASG_ID_TAB.count+1) := l_cmt_res_id_tab(k);
5854 END IF;
5855 END LOOP;
5856 END IF;
5857
5858 IF P_PA_DEBUG_MODE = 'Y' THEN
5859 PA_DEBUG.Reset_Curr_Function;
5860 END IF;
5861
5862 EXCEPTION
5863 WHEN OTHERS THEN
5864 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5865 x_msg_data := SUBSTR(SQLERRM,1,240);
5866 FND_MSG_PUB.add_exc_msg
5867 ( p_pkg_name => 'PA_FP_GEN_BUDGET_AMT_PUB'
5868 ,p_procedure_name => 'GET_GENERATED_RES_ASG');
5869
5870 IF P_PA_DEBUG_MODE = 'Y' THEN
5871 PA_DEBUG.Reset_Curr_Function;
5872 END IF;
5873
5874 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5875 END GET_GENERATED_RES_ASG;
5876
5877
5878 /******************************************************************************
5879 This api is called in calculate flow to add the currencies in budget lines
5880 table for a budget version as txn currencies in pa_fp_txn_currencies table
5881
5882 AUG 10 2004 Raja Bug 3815266
5883 Re-written the entire code to take care of both finplan
5884 and workplan contexts. Previously refresh_wp_settings
5885 was being called for workplan context. This has been
5886 removed and re-structured the code such that there is
5887 no code duplication
5888 OCT 10 2004 Raja Bug 3919127
5889 In copy projet flow first published version is being
5890 created and later its copy as working version. Add the
5891 missing currencies to all the workplan versions
5892 ******************************************************************************/
5893 PROCEDURE INSERT_TXN_CURRENCY
5894 (P_PROJECT_ID IN PA_PROJ_FP_OPTIONS.PROJECT_ID%TYPE,
5895 P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
5896 P_FP_COLS_REC IN PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
5897 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
5898 X_MSG_COUNT OUT NOCOPY NUMBER,
5899 X_MSG_DATA OUT NOCOPY VARCHAR2) IS
5900 l_module_name VARCHAR2(200) := 'pa.plsql.PA_FP_GEN_BUDGET_AMT_PUB.INSERT_TXN_CURRENCY';
5901
5902 l_txn_curr_code_tab PA_PLSQL_DATATYPES.Char30TabTyp;
5903 l_budget_version_id_tbl PA_PLSQL_DATATYPES.NumTabTyp;
5904 l_proj_fp_options_id_tbl PA_PLSQL_DATATYPES.NumTabTyp;
5905
5906 l_fp_cols_rec PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
5907 l_pc pa_budget_lines.txn_currency_code%type;
5908 l_pfc pa_budget_lines.txn_currency_code%type;
5909
5910 l_last_updated_by NUMBER := FND_GLOBAL.user_id;
5911 l_last_update_login NUMBER := FND_GLOBAL.login_id;
5912 l_sysdate DATE := SYSDATE;
5913
5914 l_wp_version_flag pa_budget_versions.wp_version_flag%type;
5915
5916 BEGIN
5917 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
5918 X_MSG_COUNT := 0;
5919
5920 IF p_pa_debug_mode = 'Y' THEN
5921 pa_debug.set_curr_function( p_function => 'INSERT_TXN_CURRENCY'
5922 ,p_debug_mode => p_pa_debug_mode);
5923 END IF;
5924
5925 l_fp_cols_rec := P_FP_COLS_REC;
5926
5927 /* get the plan version dtls if
5928 the record does have the version dtls */
5929 IF ( l_fp_cols_rec.x_proj_fp_options_id is null
5930 OR l_fp_cols_rec.x_fin_plan_type_id is null
5931 OR p_project_id is null) THEN
5932
5933 IF p_pa_debug_mode = 'Y' THEN
5934 pa_fp_gen_amount_utils.fp_debug
5935 (p_msg => 'Before calling
5936 pa_fp_gen_amount_utils.get_plan_version_dtls',
5937 p_module_name => l_module_name,
5938 p_log_level => 5);
5939 END IF;
5940
5941 PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS
5942 (P_PROJECT_ID => P_PROJECT_ID,
5943 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
5944 X_FP_COLS_REC => l_fp_cols_rec,
5945 X_RETURN_STATUS => X_RETURN_STATUS,
5946 X_MSG_COUNT => X_MSG_COUNT,
5947 X_MSG_DATA => X_MSG_DATA);
5948
5949 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
5950 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
5951 END IF;
5952 IF p_pa_debug_mode = 'Y' THEN
5953 pa_fp_gen_amount_utils.fp_debug
5954 (p_msg => 'Status after calling
5955 pa_fp_gen_amount_utils.get_plan_version_dtls: '
5956 ||x_return_status,
5957 p_module_name => l_module_name,
5958 p_log_level => 5);
5959 END IF;
5960 END IF;
5961
5962 l_pc := l_FP_COLS_REC.X_PROJECT_CURRENCY_CODE;
5963 l_pfc := l_FP_COLS_REC.X_PROJFUNC_CURRENCY_CODE;
5964
5965 /* If the version is a workplan version, then the missing
5966 currencies should first be added to the workplan plan
5967 type and then all the working workplan versions*/
5968
5969 SELECT nvl(wp_version_flag,'N')
5970 INTO l_wp_version_flag
5971 FROM pa_budget_versions
5972 WHERE budget_version_id = p_budget_version_id;
5973
5974 IF l_wp_version_flag = 'N' THEN
5975
5976 -- if the version is finplan version its sufficient to add the
5977 -- currencies for this version alone
5978 l_proj_fp_options_id_tbl(1) := l_fp_cols_rec.X_PROJ_FP_OPTIONS_ID;
5979 l_budget_version_id_tbl(1) := P_BUDGET_VERSION_ID;
5980 ELSE
5981 -- New Currencies should be added to both workplan plan type and
5982 -- all the working workplan versions
5983
5984 -- fetch all the working workplan versions
5985 -- bug 3919127 do not restrict workplan versions based on the
5986 -- structure version status
5987 SELECT bv.budget_version_id
5988 ,pfo.proj_fp_options_id
5989 BULK COLLECT INTO
5990 l_budget_version_id_tbl,
5991 l_proj_fp_options_id_tbl
5992 FROM pa_budget_versions bv,
5993 --bug 3919127 pa_proj_elem_ver_structure ver,
5994 pa_proj_fp_options pfo
5995 WHERE bv.project_id = p_project_id
5996 AND bv.wp_version_flag = 'Y'
5997 /* bug 3919127
5998 AND bv.project_id = ver.project_id
5999 AND bv.project_structure_version_id = ver.element_version_id
6000 AND (PA_WORKPLAN_ATTR_UTILS.Check_Wp_Versioning_Enabled(p_project_id) = 'N' OR
6001 ver.status_code IN('STRUCTURE_WORKING'))
6002 */
6003 AND pfo.project_id = p_project_id
6004 AND pfo.fin_plan_version_id = bv.budget_version_id;
6005
6006 -- Add plan type record to the plsql tables
6007 SELECT proj_fp_options_id,
6008 null
6009 INTO l_proj_fp_options_id_tbl(nvl(l_proj_fp_options_id_tbl.count,0) + 1),
6010 l_budget_version_id_tbl(nvl(l_proj_fp_options_id_tbl.count,0) + 1)
6011 FROM pa_proj_fp_options
6012 WHERE project_id = p_project_id AND
6013 fin_plan_type_id = l_fp_cols_rec.X_FIN_PLAN_TYPE_ID AND
6014 fin_plan_option_level_code = 'PLAN_TYPE';
6015 END IF;
6016
6017 -- For each of the fp option in the pl sql tables enter all the missing currencies
6018
6019 -- Add the currency for each of the workplan versions
6020 FOR i IN l_proj_fp_options_id_tbl.first .. l_proj_fp_options_id_tbl.last
6021 LOOP
6022
6023 l_txn_curr_code_tab.DELETE; -- this is really not necessary but kept here for clarity
6024
6025 -- Bulk collect all the txn currencies that should be added
6026 SELECT DISTINCT BL.TXN_CURRENCY_CODE
6027 BULK COLLECT
6028 INTO l_txn_curr_code_tab
6029 FROM PA_BUDGET_LINES BL
6030 WHERE BL.BUDGET_VERSION_ID = P_BUDGET_VERSION_ID
6031 AND NOT EXISTS
6032 (SELECT 1
6033 FROM PA_FP_TXN_CURRENCIES TC
6034 WHERE TC.proj_fp_options_id = l_proj_fp_options_id_tbl(i) AND
6035 TC.txn_currency_code = BL.txn_currency_code);
6036
6037 FORALL j IN 1..l_txn_curr_code_tab.count
6038 INSERT INTO PA_FP_TXN_CURRENCIES
6039 (
6040 FP_TXN_CURRENCY_ID,
6041 PROJ_FP_OPTIONS_ID,
6042 PROJECT_ID,
6043 FIN_PLAN_TYPE_ID,
6044 FIN_PLAN_VERSION_ID,
6045 TXN_CURRENCY_CODE,
6046 DEFAULT_REV_CURR_FLAG,
6047 DEFAULT_COST_CURR_FLAG,
6048 DEFAULT_ALL_CURR_FLAG,
6049 PROJECT_CURRENCY_FLAG,
6050 PROJFUNC_CURRENCY_FLAG,
6051 CREATION_DATE ,
6052 CREATED_BY ,
6053 LAST_UPDATE_LOGIN ,
6054 LAST_UPDATED_BY ,
6055 LAST_UPDATE_DATE
6056 )
6057 VALUES
6058 (
6059 PA_FP_TXN_CURRENCIES_S.NEXTVAL,
6060 l_proj_fp_options_id_tbl(i),
6061 l_fp_cols_rec.X_PROJECT_ID,
6062 l_fp_cols_rec.X_FIN_PLAN_TYPE_ID,
6063 l_budget_version_id_tbl(i),
6064 l_txn_curr_code_tab(j),
6065 'N',
6066 'N',
6067 'N',
6068 Decode(l_txn_curr_code_tab(j),l_pc,'Y','N'),
6069 Decode(l_txn_curr_code_tab(j),l_pfc,'Y','N'),
6070 l_sysdate,
6071 l_last_updated_by,
6072 l_last_update_login,
6073 l_last_updated_by,
6074 l_sysdate );
6075
6076 END LOOP; -- FOR j IN l_proj_fp_options_id_tbl.first .. l_proj_fp_options_id_tbl.last
6077
6078 IF P_PA_DEBUG_MODE = 'Y' THEN
6079 PA_DEBUG.Reset_Curr_Function;
6080 END IF;
6081
6082 EXCEPTION
6083 WHEN OTHERS THEN
6084 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6085 x_msg_data := SUBSTR(SQLERRM,1,240);
6086 FND_MSG_PUB.add_exc_msg
6087 ( p_pkg_name => 'PA_FP_GEN_BUDGET_AMT_PUB'
6088 ,p_procedure_name => 'INSERT_TXN_CURRENCY');
6089
6090 IF P_PA_DEBUG_MODE = 'Y' THEN
6091 PA_DEBUG.Reset_Curr_Function;
6092 END IF;
6093
6094 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6095 END INSERT_TXN_CURRENCY;
6096
6097 PROCEDURE RESET_COST_AMOUNTS
6098 (P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
6099 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
6100 X_MSG_COUNT OUT NOCOPY NUMBER,
6101 X_MSG_DATA OUT NOCOPY VARCHAR2) IS
6102 l_module_name VARCHAR2(200) := 'pa.plsql.PA_FP_GEN_BUDGET_AMT_PUB.RESET_COST_AMOUNTS';
6103 BEGIN
6104
6105 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
6106 X_MSG_COUNT := 0;
6107
6108 IF p_pa_debug_mode = 'Y' THEN
6109 pa_debug.set_curr_function( p_function => 'RESET_COST_AMOUNTS'
6110 ,p_debug_mode => p_pa_debug_mode);
6111 END IF;
6112
6113 UPDATE PA_BUDGET_LINES
6114 SET RAW_COST = null,
6115 BURDENED_COST = null,
6116 PROJECT_RAW_COST = null,
6117 PROJECT_BURDENED_COST = null,
6118 TXN_RAW_COST = null,
6119 TXN_BURDENED_COST = null,
6120 PROJFUNC_COST_RATE_TYPE = null,
6121 PROJFUNC_COST_EXCHANGE_RATE = null,
6122 PROJFUNC_COST_RATE_DATE_TYPE= null,
6123 PROJFUNC_COST_RATE_DATE = null,
6124 PROJECT_COST_RATE_TYPE = null,
6125 PROJECT_COST_EXCHANGE_RATE = null,
6126 PROJECT_COST_RATE_DATE_TYPE = null,
6127 PROJECT_COST_RATE_DATE = null
6128 WHERE BUDGET_VERSION_ID = P_BUDGET_VERSION_ID;
6129
6130 IF P_PA_DEBUG_MODE = 'Y' THEN
6131 PA_DEBUG.Reset_Curr_Function;
6132 END IF;
6133
6134 EXCEPTION
6135 WHEN OTHERS THEN
6136 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6137 x_msg_data := SUBSTR(SQLERRM,1,240);
6138 FND_MSG_PUB.add_exc_msg
6139 ( p_pkg_name => 'PA_FP_GEN_BUDGET_AMT_PUB'
6140 ,p_procedure_name => 'RESET_COST_AMOUNTS');
6141
6142 IF P_PA_DEBUG_MODE = 'Y' THEN
6143 PA_DEBUG.Reset_Curr_Function;
6144 END IF;
6145
6146 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6147
6148 END RESET_COST_AMOUNTS;
6149
6150 PROCEDURE GEN_REV_BDGT_AMT_RES_SCH_WRP
6151 (P_PROJECT_ID IN pa_projects_all.PROJECT_ID%TYPE,
6152 P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
6153 P_FP_COLS_REC IN PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
6154 P_PLAN_CLASS_CODE IN PA_FIN_PLAN_TYPES_B.PLAN_CLASS_CODE%TYPE,
6155 P_GEN_SRC_CODE IN PA_PROJ_FP_OPTIONS.GEN_ALL_SRC_CODE%TYPE,
6156 P_COST_PLAN_TYPE_ID IN PA_PROJ_FP_OPTIONS.GEN_SRC_COST_PLAN_TYPE_ID%TYPE,
6157 P_COST_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
6158 P_RETAIN_MANUAL_FLAG IN PA_PROJ_FP_OPTIONS.GEN_COST_RET_MANUAL_LINE_FLAG%TYPE,
6159 P_CALLED_MODE IN VARCHAR2,
6160 P_INC_CHG_DOC_FLAG IN PA_PROJ_FP_OPTIONS.GEN_COST_INCL_CHANGE_DOC_FLAG%TYPE,
6161 P_INC_BILL_EVENT_FLAG IN PA_PROJ_FP_OPTIONS.GEN_REV_INCL_BILL_EVENT_FLAG%TYPE,
6162 P_INC_OPEN_COMMIT_FLAG IN PA_PROJ_FP_OPTIONS.GEN_COST_INCL_OPEN_COMM_FLAG%TYPE,
6163 P_ACTUALS_THRU_DATE IN PA_PERIODS_ALL.END_DATE%TYPE,
6164 P_CI_ID_TAB IN PA_PLSQL_DATATYPES.IdTabTyp,
6165 PX_GEN_RES_ASG_ID_TAB IN OUT NOCOPY PA_PLSQL_DATATYPES.IdTabTyp,
6166 PX_DELETED_RES_ASG_ID_TAB IN OUT NOCOPY PA_PLSQL_DATATYPES.IdTabTyp,
6167 P_COMMIT_FLAG IN VARCHAR2,
6168 P_INIT_MSG_FLAG IN VARCHAR2,
6169 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
6170 X_MSG_COUNT OUT NOCOPY NUMBER,
6171 X_MSG_DATA OUT NOCOPY VARCHAR2) IS
6172
6173 l_module_name VARCHAR2(200) := 'pa.plsql.PA_FP_GEN_BUDGET_AMT_PUB.GEN_REV_BDGT_AMT_RES_SCH_WRP';
6174
6175 /*local variable for calling get planning rates*/
6176 l_res_asg_id_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6177 l_ra_quantity_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6178 l_task_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6179 l_res_list_member_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6180 l_txn_currency_code_tab SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
6181 l_ra_start_date_tab PA_PLSQL_DATATYPES.DateTabTyp;
6182 l_uom_tab pa_plsql_datatypes.Char30TabTyp;
6183 l_rate_based_flag_tab pa_plsql_datatypes.Char30TabTyp;
6184 l_resource_class_code_tab pa_plsql_datatypes.Char30TabTyp;
6185 l_organization_id_tab pa_plsql_datatypes.Char30TabTyp;
6186 l_job_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6187 l_person_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6188 l_expenditure_type_tab pa_plsql_datatypes.Char30TabTyp;
6189 l_non_labor_resource_tab pa_plsql_datatypes.Char30TabTyp;
6190 l_bom_resource_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6191 l_inventory_item_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6192 l_item_category_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6193 l_mfc_cost_type_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6194 l_rate_incur_by_organz_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6195 l_rate_ovrd_to_organz_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6196 l_rate_expenditure_org_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6197 l_rate_expenditure_type_tab pa_plsql_datatypes.Char30TabTyp;
6198 l_rate_organization_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6199 l_project_assignment_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6200
6201 l_assign_precedes_task_tab pa_plsql_datatypes.Char30TabTyp;
6202 l_bill_job_group_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6203 l_carry_out_organiz_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6204 l_multi_currency_bill_flag_tab pa_plsql_datatypes.Char30TabTyp;
6205 l_org_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6206 l_non_lab_bill_rate_org_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6207 l_non_lab_sch_discount_tab PA_PLSQL_DATATYPES.NumTabTyp;
6208 l_non_lab_sch_fixed_date_tab PA_PLSQL_DATATYPES.DateTabTyp;
6209 l_project_type_tab pa_plsql_datatypes.Char30TabTyp;
6210 l_lab_bill_rate_org_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6211
6212 l_lab_sch_FIXED_DATE_tab PA_PLSQL_DATATYPES.DateTabTyp;
6213 l_top_task_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6214 l_scheduled_start_date_tab PA_PLSQL_DATATYPES.DateTabTyp;
6215 l_labor_scheduled_discount_tab PA_PLSQL_DATATYPES.NumTabTyp;
6216 l_labor_sch_type_tab pa_plsql_datatypes.Char30TabTyp;
6217 l_non_labor_sch_type_tab pa_plsql_datatypes.Char30TabTyp;
6218
6219 l_rev_res_class_rt_sch_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6220 l_cost_res_class_rt_sch_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6221
6222 l_res_format_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6223
6224 l_bill_rate number;
6225 l_cost_rate number;
6226 l_burden_cost_rate number;
6227 l_burden_multiplier number;
6228 l_raw_cost number;
6229 l_burden_cost number;
6230 l_raw_revenue number;
6231 l_bill_markup_percentage number;
6232 l_cost_txn_curr_code varchar2(30);
6233 l_rev_txn_curr_code varchar2(30);
6234 l_raw_cost_rejection_code varchar2(30);
6235 l_burden_cost_rejection_code varchar2(30);
6236 l_revenue_rejection_code varchar2(30);
6237 l_cost_ind_compiled_set_id number;
6238
6239 /*Local PL/SQL table used for calling Calculate API*/
6240 l_calling_module VARCHAR2(30) := 'BUDGET_GENERATION';
6241 l_refresh_rates_flag VARCHAR2(1) := 'Y';
6242 l_refresh_conv_rates_flag VARCHAR2(1) := 'N';
6243 l_spread_required_flag VARCHAR2(1) := 'N';
6244 l_conv_rates_required_flag VARCHAR2(1) := 'N';
6245 l_rollup_required_flag VARCHAR2(1) := 'N';
6246 l_mass_adjust_flag VARCHAR2(1) := 'N';
6247 l_quantity_adj_pct NUMBER := NULL;
6248 l_cost_rate_adj_pct NUMBER := NULL;
6249 l_burdened_rate_adj_pct NUMBER := NULL;
6250 l_bill_rate_adj_pct NUMBER := NULL;
6251 l_source_context pa_fp_res_assignments_tmp.source_context%TYPE := 'RESOURCE_ASSIGNMENT';
6252
6253 l_delete_budget_lines_tab SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
6254 l_spread_amts_flag_tab SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
6255 l_txn_currency_override_tab SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
6256 l_addl_qty_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6257 l_total_raw_cost_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6258 l_addl_raw_cost_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6259 l_total_burdened_cost_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6260 l_addl_burdened_cost_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6261 l_total_revenue_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6262 l_addl_revenue_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6263 l_raw_cost_rate_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6264 l_rw_cost_rate_override_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6265 l_b_cost_rate_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6266 l_b_cost_rate_override_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6267 l_bill_rate_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6268 l_bill_rate_override_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6269 l_line_start_date_tab SYSTEM.pa_date_tbl_type:=SYSTEM.pa_date_tbl_type();
6270 l_line_end_date_tab SYSTEM.pa_date_tbl_type:=SYSTEM.pa_date_tbl_type();
6271 /*end variable for calculate*/
6272
6273 l_msg_count NUMBER;
6274 l_msg_data VARCHAR2(2000);
6275 l_data VARCHAR2(2000);
6276 l_msg_index_out NUMBER:=0;
6277 BEGIN
6278 IF p_init_msg_flag = 'Y' THEN
6279 FND_MSG_PUB.initialize;
6280 END IF;
6281 X_MSG_COUNT := 0;
6282 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
6283
6284 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
6285 PA_DEBUG.init_err_stack('PA_FP_GEN_BUDGET_AMT_PUB.GEN_REV_BDGT_AMT_RES_SCH_WRP');
6286 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
6287 pa_debug.set_curr_function( p_function => 'GEN_REV_BDGT_AMT_RES_SCH_WRP',
6288 p_debug_mode => p_pa_debug_mode);
6289 END IF;
6290
6291
6292 IF p_pa_debug_mode = 'Y' THEN
6293 pa_fp_gen_amount_utils.fp_debug
6294 (p_msg => 'Before calling
6295 pa_fp_gen_budget_amt_pub.generate_budget_amt_res_sch',
6296 p_module_name => l_module_name,
6297 p_log_level => 5);
6298 END IF;
6299 PA_FP_GEN_BUDGET_AMT_PUB.GENERATE_BUDGET_AMT_RES_SCH
6300 (P_PROJECT_ID => P_PROJECT_ID,
6301 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
6302 P_FP_COLS_REC => P_FP_COLS_REC,
6303 P_PLAN_CLASS_CODE => P_PLAN_CLASS_CODE,
6304 P_GEN_SRC_CODE => P_GEN_SRC_CODE,
6305 P_COST_PLAN_TYPE_ID => P_COST_PLAN_TYPE_ID,
6306 P_COST_VERSION_ID => P_COST_VERSION_ID,
6307 P_RETAIN_MANUAL_FLAG => P_RETAIN_MANUAL_FLAG,
6308 P_CALLED_MODE => P_CALLED_MODE,
6309 P_INC_CHG_DOC_FLAG => P_INC_CHG_DOC_FLAG,
6310 P_INC_BILL_EVENT_FLAG => P_INC_BILL_EVENT_FLAG,
6311 P_INC_OPEN_COMMIT_FLAG => P_INC_OPEN_COMMIT_FLAG,
6312 P_ACTUALS_THRU_DATE => P_ACTUALS_THRU_DATE,
6313 P_CI_ID_TAB => P_CI_ID_TAB,
6314 PX_GEN_RES_ASG_ID_TAB => PX_GEN_RES_ASG_ID_TAB,
6315 PX_DELETED_RES_ASG_ID_TAB => PX_DELETED_RES_ASG_ID_TAB,
6316 P_COMMIT_FLAG => P_COMMIT_FLAG,
6317 P_INIT_MSG_FLAG => P_INIT_MSG_FLAG,
6318 X_RETURN_STATUS => X_RETURN_STATUS,
6319 X_MSG_COUNT => X_MSG_COUNT,
6320 X_MSG_DATA => X_MSG_DATA);
6321 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
6322 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
6323 END IF;
6324 IF p_pa_debug_mode = 'Y' THEN
6325 pa_fp_gen_amount_utils.fp_debug
6326 (p_msg => 'Status after calling
6327 pa_fp_gen_budget_amt_pub.generate_budget_amt_res_sch: '
6328 ||x_return_status,
6329 p_module_name => l_module_name,
6330 p_log_level => 5);
6331 END IF;
6332
6333 SELECT /*+ INDEX(tmp,PA_FP_CALC_AMT_TMP2_N2)*/
6334 tmp.RESOURCE_ASSIGNMENT_ID,
6335 tmp.total_plan_quantity,
6336 ra.task_id,
6337 ra.resource_list_member_id,
6338 P_FP_COLS_REC.x_project_currency_code,
6339 ra.planning_start_date,
6340 ra.unit_of_measure,
6341 ra.rate_based_flag,
6342 ra.resource_class_code,
6343 ra.organization_id,
6344 ra.job_id,
6345 ra.person_id,
6346 ra.expenditure_type,
6347 ra.non_labor_resource,
6348 ra.bom_resource_id,
6349 ra.inventory_item_id,
6350 ra.item_category_id,
6351 ra.mfc_cost_type_id,
6352 ra.organization_id,
6353 null,
6354 ra.rate_expenditure_org_id,
6355 ra.rate_expenditure_type,
6356 ra.organization_id,
6357 ra.project_assignment_id,
6358
6359 proj.assign_precedes_task,
6360 proj.bill_job_group_id,
6361 proj.carrying_out_organization_id,
6362 proj.multi_currency_billing_flag,
6363 proj.org_id,
6364 proj.non_labor_bill_rate_org_id,
6365 proj.non_labor_schedule_discount,
6366 proj.non_labor_schedule_fixed_date,
6367 proj.project_type,
6368 proj.labor_bill_rate_org_id,
6369
6370 t.LABOR_SCHEDULE_FIXED_DATE,
6371 t.top_task_id,
6372 t.scheduled_start_date,
6373 t.labor_schedule_discount,
6374 t.labor_sch_type,
6375 t.non_labor_sch_type,
6376
6377 decode(fp.use_planning_rates_flag,'N',fp.res_class_bill_rate_sch_id,
6378 fp.rev_res_class_rate_sch_id),
6379 decode(fp.use_planning_rates_flag,'N',fp.res_class_raw_cost_sch_id,
6380 NULL),
6381
6382 res_format_id
6383 BULK COLLECT INTO
6384 l_res_asg_id_tab,
6385 l_ra_quantity_tab,
6386 l_task_id_tab,
6387 l_res_list_member_id_tab,
6388 l_txn_currency_code_tab,
6389 l_ra_start_date_tab,
6390 l_uom_tab,
6391 l_rate_based_flag_tab,
6392 l_resource_class_code_tab,
6393 l_organization_id_tab,
6394 l_job_id_tab,
6395 l_person_id_tab,
6396 l_expenditure_type_tab,
6397 l_non_labor_resource_tab,
6398 l_bom_resource_id_tab,
6399 l_inventory_item_id_tab,
6400 l_item_category_id_tab,
6401 l_mfc_cost_type_id_tab,
6402 l_rate_incur_by_organz_id_tab,
6403 l_rate_ovrd_to_organz_id_tab,
6404 l_rate_expenditure_org_id_tab,
6405 l_rate_expenditure_type_tab,
6406 l_rate_organization_id_tab,
6407 l_project_assignment_id_tab,
6408
6409 l_assign_precedes_task_tab,
6410 l_bill_job_group_id_tab,
6411 l_carry_out_organiz_id_tab,
6412 l_multi_currency_bill_flag_tab,
6413 l_org_id_tab,
6414 l_non_lab_bill_rate_org_id_tab,
6415 l_non_lab_sch_discount_tab,
6416 l_non_lab_sch_fixed_date_tab,
6417 l_project_type_tab,
6418
6419 l_lab_bill_rate_org_id_tab,
6420 l_lab_sch_FIXED_DATE_tab,
6421 l_top_task_id_tab,
6422 l_scheduled_start_date_tab,
6423 l_labor_scheduled_discount_tab,
6424 l_labor_sch_type_tab,
6425 l_non_labor_sch_type_tab,
6426
6427 l_rev_res_class_rt_sch_id_tab,
6428 l_cost_res_class_rt_sch_id_tab,
6429
6430 l_res_format_id_tab
6431 FROM pa_fp_calc_amt_tmp2 tmp, pa_resource_assignments ra,
6432 pa_projects_all proj, pa_tasks t,
6433 pa_proj_fp_options fp,
6434 pa_resource_list_members rlm
6435 WHERE tmp.resource_assignment_id = ra.resource_assignment_id
6436 AND ra.project_id = proj.project_id
6437 AND ra.task_id = t.task_id(+)
6438 AND fp.fin_plan_version_id = ra.budget_version_id
6439 AND ra.resource_list_member_id = rlm.resource_list_member_id;
6440
6441 FOR i IN 1..l_res_asg_id_tab.count LOOP
6442 IF p_pa_debug_mode = 'Y' THEN
6443 pa_fp_gen_amount_utils.fp_debug
6444 (p_msg => 'Before calling pa_plan_revenue.Get_planning_Rates',
6445 p_module_name => l_module_name,
6446 p_log_level => 5);
6447 END IF;
6448 PA_PLAN_REVENUE.GET_PLANNING_RATES(
6449 p_project_id => p_project_id,
6450 p_task_id => l_task_id_tab(i),
6451 p_top_task_id => l_top_task_id_tab(i),
6452 p_person_id => l_person_id_tab(i),
6453 p_job_id => l_job_id_tab(i),
6454 p_bill_job_grp_id => l_bill_job_group_id_tab(i),
6455 p_resource_class => l_resource_class_code_tab(i),
6456 p_planning_resource_format => l_res_format_id_tab(i),
6457 p_use_planning_rates_flag => 'N',
6458 p_rate_based_flag => l_rate_based_flag_tab(i),
6459 p_uom => l_uom_tab(i),
6460 p_system_linkage => NULL,
6461 p_project_organz_id => l_carry_out_organiz_id_tab(i),
6462 p_rev_res_class_rate_sch_id => l_rev_res_class_rt_sch_id_tab(i),
6463 p_cost_res_class_rate_sch_id => l_cost_res_class_rt_sch_id_tab(i),
6464 p_calculate_mode => 'REVENUE',
6465 p_mcb_flag => l_multi_currency_bill_flag_tab(i),
6466 p_quantity => l_ra_quantity_tab(i),
6467 p_item_date => l_ra_start_date_tab(i),
6468 p_cost_sch_type => 'COST',
6469 p_labor_sch_type => l_labor_sch_type_tab(i),
6470 p_non_labor_sch_type => l_non_labor_sch_type_tab(i),
6471 --p_labor_schdl_discnt => NULL,
6472 p_labor_bill_rate_org_id => l_lab_bill_rate_org_id_tab(i),
6473 --p_labor_std_bill_rate_schdl => NULL,
6474 p_labor_schdl_fixed_date => l_LAb_SCH_FIXED_DATE_tab(i),
6475 p_assignment_id => l_project_assignment_id_tab(i),
6476 p_project_org_id => l_org_id_tab(i),
6477 p_project_type => l_project_type_tab(i),
6478 p_expenditure_type => nvl(l_expenditure_type_tab(i),l_rate_expenditure_type_tab(i)),
6479 p_non_labor_resource => l_non_labor_resource_tab(i),
6480 p_incurred_by_organz_id => nvl(l_rate_incur_by_organz_id_tab(i),l_organization_id_tab(i)),
6481 p_override_to_organz_id => l_rate_ovrd_to_organz_id_tab(i),
6482 p_expenditure_org_id => nvl(l_rate_expenditure_org_id_tab(i),l_org_id_tab(i)),
6483 p_assignment_precedes_task => l_assign_precedes_task_tab(i),
6484 p_planning_transaction_id => l_res_asg_id_tab(i),
6485 --,p_task_bill_rate_org_id => l_task_bill_rate_org_id,
6486 p_project_bill_rate_org_id => l_non_lab_bill_rate_org_id_tab(i),
6487 p_nlr_organization_id => nvl(l_organization_id_tab(i),l_carry_out_organiz_id_tab(i)),
6488 p_project_sch_date => l_non_lab_sch_fixed_date_tab(i),
6489 p_task_sch_date => l_scheduled_start_date_tab(i),
6490 p_project_sch_discount => l_non_lab_sch_discount_tab(i),
6491 p_task_sch_discount => l_labor_scheduled_discount_tab(i),
6492 p_inventory_item_id => l_inventory_item_id_tab(i),
6493 p_BOM_resource_Id => l_bom_resource_id_tab(i),
6494 p_mfc_cost_type_id => l_mfc_cost_type_id_tab(i),
6495 p_item_category_id => l_item_category_id_tab(i),
6496 --,p_mfc_cost_source => l_mfc_cost_source,
6497 --,p_cost_override_rate => l_rw_cost_rate_override,
6498 --,p_revenue_override_rate => l_bill_rate_override,
6499 --,p_override_burden_cost_rate => l_burden_cost_rate_override,
6500 --,p_override_currency_code => l_txn_currency_code_override,
6501 p_txn_currency_code => l_txn_currency_code_tab(i),
6502 p_raw_cost => NULL,
6503 p_burden_cost => NULL,
6504 p_raw_revenue => NULL,
6505 x_bill_rate => l_bill_rate,
6506 x_cost_rate => l_cost_rate,
6507 x_burden_cost_rate => l_burden_cost_rate,
6508 x_burden_multiplier => l_burden_multiplier,
6509 x_raw_cost => l_raw_cost,
6510 x_burden_cost => l_burden_cost,
6511 x_raw_revenue => l_raw_revenue,
6512 x_bill_markup_percentage => l_bill_markup_percentage,
6513 x_cost_txn_curr_code => l_cost_txn_curr_code,
6514 x_rev_txn_curr_code => l_rev_txn_curr_code,
6515 x_raw_cost_rejection_code => l_raw_cost_rejection_code,
6516 x_burden_cost_rejection_code => l_burden_cost_rejection_code,
6517 x_revenue_rejection_code => l_revenue_rejection_code,
6518 x_cost_ind_compiled_set_id => l_cost_ind_compiled_set_id,
6519 x_return_status => x_return_status,
6520 x_msg_data => x_msg_data,
6521 x_msg_count => x_msg_count);
6522 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
6523 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
6524 END IF;
6525 IF p_pa_debug_mode = 'Y' THEN
6526 pa_fp_gen_amount_utils.fp_debug
6527 (p_msg => 'Status after calling pa_plan_revenue.Get_planning_Rates'
6528 ||x_return_status,
6529 p_module_name => l_module_name,
6530 p_log_level => 5);
6531 END IF;
6532
6533 l_total_revenue_tab.extend;
6534 l_total_revenue_tab(i) := l_burden_cost;
6535
6536 END LOOP;
6537
6538 FOR i IN 1..l_res_asg_id_tab.count LOOP
6539 l_delete_budget_lines_tab.extend;
6540 l_spread_amts_flag_tab.extend;
6541 --l_txn_currency_code_tab.extend;
6542 l_txn_currency_override_tab.extend;
6543 --l_total_qty_tab.extend;
6544 l_addl_qty_tab.extend;
6545 l_total_raw_cost_tab.extend;
6546 l_addl_raw_cost_tab.extend;
6547 l_total_burdened_cost_tab.extend;
6548 l_addl_burdened_cost_tab.extend;
6549 l_addl_revenue_tab.extend;
6550 l_raw_cost_rate_tab.extend;
6551 l_rw_cost_rate_override_tab.extend;
6552 l_b_cost_rate_tab.extend;
6553 l_b_cost_rate_override_tab.extend;
6554 l_bill_rate_tab.extend;
6555 l_bill_rate_override_tab.extend;
6556 l_line_start_date_tab.extend;
6557 l_line_end_date_tab.extend;
6558
6559 l_delete_budget_lines_tab(i) := Null;
6560 l_spread_amts_flag_tab(i) := Null;
6561 --l_txn_currency_code_tab(i) := l_txn_currency_code_tab(i)
6562 l_txn_currency_override_tab(i) := Null;
6563 --l_total_qty_tab(i) := Null;
6564 l_addl_qty_tab(i) := Null;
6565 l_total_raw_cost_tab(i) := Null;
6566 l_addl_raw_cost_tab(i) := Null;
6567 l_total_burdened_cost_tab(i) := Null;
6568 l_addl_burdened_cost_tab(i) := Null;
6569 l_addl_revenue_tab(i) := Null;
6570 l_raw_cost_rate_tab(i) := Null;
6571 l_rw_cost_rate_override_tab(i) := Null;
6572 l_b_cost_rate_tab(i) := Null;
6573 l_b_cost_rate_override_tab(i) := Null;
6574 l_bill_rate_tab(i) := Null;
6575 l_bill_rate_override_tab(i) := Null;
6576 l_line_start_date_tab(i) := Null;
6577 l_line_end_date_tab(i) := Null;
6578 END LOOP;
6579
6580 -- Bug 4149684: Added p_calling_module and p_rollup_required_flag to parameter list of
6581 -- Calculate API with values 'BUDGET_GENERATION' and 'N', respectively, so that calling
6582 -- PJI rollup api is bypassed for increased performance.
6583
6584 /* Calling the calculate API */
6585 IF p_pa_debug_mode = 'Y' THEN
6586 pa_fp_gen_amount_utils.fp_debug
6587 (p_called_mode => p_called_mode,
6588 p_msg => 'Before calling
6589 pa_fp_calc_plan_pkg.calculate',
6590 p_module_name => l_module_name,
6591 p_log_level => 5);
6592 END IF;
6593 PA_FP_CALC_PLAN_PKG.calculate
6594 (p_calling_module => l_calling_module
6595 ,p_project_id => p_project_id
6596 ,p_budget_version_id => p_budget_version_id
6597 ,p_refresh_rates_flag => l_refresh_rates_flag
6598 ,p_refresh_conv_rates_flag => l_refresh_conv_rates_flag
6599 ,p_spread_required_flag => l_spread_required_flag
6600 ,p_conv_rates_required_flag => l_conv_rates_required_flag
6601 ,p_rollup_required_flag => l_rollup_required_flag
6602 ,p_mass_adjust_flag => l_mass_adjust_flag
6603 ,p_quantity_adj_pct => l_quantity_adj_pct
6604 ,p_cost_rate_adj_pct => l_cost_rate_adj_pct
6605 ,p_burdened_rate_adj_pct => l_burdened_rate_adj_pct
6606 ,p_bill_rate_adj_pct => l_bill_rate_adj_pct
6607 ,p_source_context => l_source_context
6608 ,p_resource_assignment_tab => l_res_asg_id_tab
6609 ,p_delete_budget_lines_tab => l_delete_budget_lines_tab
6610 ,p_spread_amts_flag_tab => l_spread_amts_flag_tab
6611 ,p_txn_currency_code_tab => l_txn_currency_code_tab
6612 ,p_txn_currency_override_tab => l_txn_currency_override_tab
6613 ,p_total_qty_tab => l_ra_quantity_tab --l_total_qty_tab
6614 ,p_addl_qty_tab => l_addl_qty_tab
6615 ,p_total_raw_cost_tab => l_total_raw_cost_tab
6616 ,p_addl_raw_cost_tab => l_addl_raw_cost_tab
6617 ,p_total_burdened_cost_tab => l_total_burdened_cost_tab
6618 ,p_addl_burdened_cost_tab => l_addl_burdened_cost_tab
6619 ,p_total_revenue_tab => l_total_revenue_tab
6620 ,p_addl_revenue_tab => l_addl_revenue_tab
6621 ,p_raw_cost_rate_tab => l_raw_cost_rate_tab
6622 ,p_rw_cost_rate_override_tab => l_rw_cost_rate_override_tab
6623 ,p_b_cost_rate_tab => l_b_cost_rate_tab
6624 ,p_b_cost_rate_override_tab => l_b_cost_rate_override_tab
6625 ,p_bill_rate_tab => l_bill_rate_tab
6626 ,p_bill_rate_override_tab => l_bill_rate_override_tab
6627 ,p_line_start_date_tab => l_line_start_date_tab
6628 ,p_line_end_date_tab => l_line_end_date_tab
6629 ,X_RETURN_STATUS => X_RETURN_STATUS
6630 ,X_MSG_COUNT => X_MSG_COUNT
6631 ,X_MSG_DATA => X_MSG_DATA);
6632 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
6633 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
6634 END IF;
6635 IF p_pa_debug_mode = 'Y' THEN
6636 pa_fp_gen_amount_utils.fp_debug
6637 (p_called_mode => p_called_mode,
6638 p_msg => 'Status after calling
6639 pa_fp_calc_plan_pkg.calculate: '
6640 ||x_return_status,
6641 p_module_name => l_module_name,
6642 p_log_level => 5);
6643 END IF;
6644
6645 IF P_COMMIT_FLAG = 'Y' THEN
6646 COMMIT;
6647 END IF;
6648
6649 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
6650 PA_DEBUG.reset_err_stack;
6651 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
6652 PA_DEBUG.Reset_Curr_Function;
6653 END IF;
6654
6655 EXCEPTION
6656 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
6657 -- Bug Fix: 4569365. Removed MRC code.
6658 -- PA_MRC_FINPLAN.G_CALLING_MODULE := Null;
6659 l_msg_count := FND_MSG_PUB.count_msg;
6660 IF l_msg_count = 1 THEN
6661 PA_INTERFACE_UTILS_PUB.get_messages
6662 (p_encoded => FND_API.G_TRUE
6663 ,p_msg_index => 1
6664 ,p_msg_count => l_msg_count
6665 ,p_msg_data => l_msg_data
6666 ,p_data => l_data
6667 ,p_msg_index_out => l_msg_index_out);
6668 x_msg_data := l_data;
6669 x_msg_count := l_msg_count;
6670 ELSE
6671 x_msg_count := l_msg_count;
6672 END IF;
6673 ROLLBACK;
6674 x_return_status := FND_API.G_RET_STS_ERROR;
6675
6676 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
6677 PA_DEBUG.reset_err_stack;
6678 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
6679 PA_DEBUG.Reset_Curr_Function;
6680 END IF;
6681
6682 WHEN OTHERS THEN
6683 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6684 x_msg_data := SUBSTR(SQLERRM,1,240);
6685 FND_MSG_PUB.add_exc_msg
6686 ( p_pkg_name => 'PA_FP_GEN_BUDGET_AMT_PUB'
6687 ,p_procedure_name => 'GEN_REV_BDGT_AMT_RES_SCH_WRP');
6688
6689 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
6690 PA_DEBUG.reset_err_stack;
6691 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
6692 PA_DEBUG.Reset_Curr_Function;
6693 END IF;
6694
6695 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6696
6697 END GEN_REV_BDGT_AMT_RES_SCH_WRP;
6698
6699 PROCEDURE GEN_WP_REV_BDGT_AMT_WRP
6700 (P_PROJECT_ID IN PA_PROJ_FP_OPTIONS.PROJECT_ID%TYPE,
6701 P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
6702 P_PLAN_CLASS_CODE IN PA_FIN_PLAN_TYPES_B.PLAN_CLASS_CODE%TYPE,
6703 P_GEN_SRC_CODE IN PA_PROJ_FP_OPTIONS.GEN_ALL_SRC_CODE%TYPE,
6704 P_COST_PLAN_TYPE_ID IN PA_PROJ_FP_OPTIONS.GEN_SRC_COST_PLAN_TYPE_ID%TYPE,
6705 P_COST_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
6706 P_RETAIN_MANUAL_FLAG IN VARCHAR2,
6707 P_CALLED_MODE IN VARCHAR2,
6708 P_INC_CHG_DOC_FLAG IN VARCHAR2,
6709 P_INC_BILL_EVENT_FLAG IN VARCHAR2,
6710 P_INC_OPEN_COMMIT_FLAG IN VARCHAR2,
6711 P_CI_ID_TAB IN PA_PLSQL_DATATYPES.IdTabTyp,
6712 P_INIT_MSG_FLAG IN VARCHAR2,
6713 P_COMMIT_FLAG IN VARCHAR2,
6714 PX_DELETED_RES_ASG_ID_TAB IN OUT NOCOPY PA_PLSQL_DATATYPES.IdTabTyp,
6715 PX_GEN_RES_ASG_ID_TAB IN OUT NOCOPY PA_PLSQL_DATATYPES.IdTabTyp,
6716 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
6717 X_MSG_COUNT OUT NOCOPY NUMBER,
6718 X_MSG_DATA OUT NOCOPY VARCHAR2) IS
6719 l_module_name VARCHAR2(200) := 'pa.plsql.PA_FP_GEN_BUDGET_AMT_PUB.GEN_WP_REV_BDGT_AMT_WRP';
6720
6721 /*local variable for calling get planning rates*/
6722 l_res_asg_id_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6723 l_ra_quantity_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6724 l_task_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6725 l_res_list_member_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6726 l_txn_currency_code_tab SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
6727 l_ra_start_date_tab PA_PLSQL_DATATYPES.DateTabTyp;
6728 l_uom_tab pa_plsql_datatypes.Char30TabTyp;
6729 l_rate_based_flag_tab pa_plsql_datatypes.Char30TabTyp;
6730 l_resource_class_code_tab pa_plsql_datatypes.Char30TabTyp;
6731 l_organization_id_tab pa_plsql_datatypes.Char30TabTyp;
6732 l_job_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6733 l_person_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6734 l_expenditure_type_tab pa_plsql_datatypes.Char30TabTyp;
6735 l_non_labor_resource_tab pa_plsql_datatypes.Char30TabTyp;
6736 l_bom_resource_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6737 l_inventory_item_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6738 l_item_category_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6739 l_mfc_cost_type_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6740 l_rate_incur_by_organz_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6741 l_rate_ovrd_to_organz_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6742 l_rate_expenditure_org_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6743 l_rate_expenditure_type_tab pa_plsql_datatypes.Char30TabTyp;
6744 l_rate_organization_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6745 l_project_assignment_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6746
6747 l_assign_precedes_task_tab pa_plsql_datatypes.Char30TabTyp;
6748 l_bill_job_group_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6749 l_carry_out_organiz_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6750 l_multi_currency_bill_flag_tab pa_plsql_datatypes.Char30TabTyp;
6751 l_org_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6752 l_non_lab_bill_rate_org_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6753 l_non_lab_sch_discount_tab PA_PLSQL_DATATYPES.NumTabTyp;
6754 l_non_lab_sch_fixed_date_tab PA_PLSQL_DATATYPES.DateTabTyp;
6755 l_project_type_tab pa_plsql_datatypes.Char30TabTyp;
6756 l_lab_bill_rate_org_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6757
6758 l_lab_sch_FIXED_DATE_tab PA_PLSQL_DATATYPES.DateTabTyp;
6759 l_top_task_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6760 l_scheduled_start_date_tab PA_PLSQL_DATATYPES.DateTabTyp;
6761 l_labor_scheduled_discount_tab PA_PLSQL_DATATYPES.NumTabTyp;
6762 l_labor_sch_type_tab pa_plsql_datatypes.Char30TabTyp;
6763 l_non_labor_sch_type_tab pa_plsql_datatypes.Char30TabTyp;
6764
6765 l_rev_res_class_rt_sch_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6766 l_cost_res_class_rt_sch_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6767
6768 l_res_format_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
6769
6770 l_bill_rate number;
6771 l_cost_rate number;
6772 l_burden_cost_rate number;
6773 l_burden_multiplier number;
6774 l_raw_cost number;
6775 l_burden_cost number;
6776 l_raw_revenue number;
6777 l_bill_markup_percentage number;
6778 l_cost_txn_curr_code varchar2(30);
6779 l_rev_txn_curr_code varchar2(30);
6780 l_raw_cost_rejection_code varchar2(30);
6781 l_burden_cost_rejection_code varchar2(30);
6782 l_revenue_rejection_code varchar2(30);
6783 l_cost_ind_compiled_set_id number;
6784
6785 /*Local PL/SQL table used for calling Calculate API*/
6786 l_calling_module VARCHAR2(30) := 'BUDGET_GENERATION';
6787 l_refresh_rates_flag VARCHAR2(1) := 'Y';
6788 l_refresh_conv_rates_flag VARCHAR2(1) := 'N';
6789 l_spread_required_flag VARCHAR2(1) := 'N';
6790 l_conv_rates_required_flag VARCHAR2(1) := 'N';
6791 l_rollup_required_flag VARCHAR2(1) := 'N';
6792 l_mass_adjust_flag VARCHAR2(1) := 'N';
6793 l_quantity_adj_pct NUMBER := NULL;
6794 l_cost_rate_adj_pct NUMBER := NULL;
6795 l_burdened_rate_adj_pct NUMBER := NULL;
6796 l_bill_rate_adj_pct NUMBER := NULL;
6797 l_source_context pa_fp_res_assignments_tmp.source_context%TYPE := 'RESOURCE_ASSIGNMENT';
6798
6799 l_delete_budget_lines_tab SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
6800 l_spread_amts_flag_tab SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
6801 l_txn_currency_override_tab SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
6802 l_addl_qty_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6803 l_total_raw_cost_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6804 l_addl_raw_cost_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6805 l_total_burdened_cost_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6806 l_addl_burdened_cost_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6807 l_total_revenue_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6808 l_addl_revenue_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6809 l_raw_cost_rate_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6810 l_rw_cost_rate_override_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6811 l_b_cost_rate_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6812 l_b_cost_rate_override_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6813 l_bill_rate_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6814 l_bill_rate_override_tab SYSTEM.pa_num_tbl_type:= SYSTEM.pa_num_tbl_type();
6815 l_line_start_date_tab SYSTEM.pa_date_tbl_type:=SYSTEM.pa_date_tbl_type();
6816 l_line_end_date_tab SYSTEM.pa_date_tbl_type:=SYSTEM.pa_date_tbl_type();
6817 /*end variable for calculate*/
6818
6819 l_msg_count NUMBER;
6820 l_msg_data VARCHAR2(2000);
6821 l_data VARCHAR2(2000);
6822 l_msg_index_out NUMBER:=0;
6823 BEGIN
6824 IF p_init_msg_flag = 'Y' THEN
6825 FND_MSG_PUB.initialize;
6826 END IF;
6827 X_MSG_COUNT := 0;
6828 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
6829
6830 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
6831 PA_DEBUG.init_err_stack('PA_FP_GEN_BUDGET_AMT_PUB.GEN_REV_BDGT_AMT_RES_SCH_WRP');
6832 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
6833 pa_debug.set_curr_function(p_function => 'GEN_WP_REV_BDGT_AMT_WRP',
6834 p_debug_mode => p_pa_debug_mode);
6835 END IF;
6836
6837 IF p_pa_debug_mode = 'Y' THEN
6838 pa_fp_gen_amount_utils.fp_debug
6839 (p_called_mode => p_called_mode,
6840 p_msg => 'Before calling
6841 pa_fp_wp_gen_budget_amt_pub.generate_wp_budget_amt',
6842 p_module_name => l_module_name,
6843 p_log_level => 5);
6844 END IF;
6845 PA_FP_WP_GEN_BUDGET_AMT_PUB.GENERATE_WP_BUDGET_AMT
6846 (P_PROJECT_ID => P_PROJECT_ID,
6847 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
6848 P_PLAN_CLASS_CODE => P_PLAN_CLASS_CODE,
6849 P_GEN_SRC_CODE => P_GEN_SRC_CODE,
6850 P_COST_PLAN_TYPE_ID => P_COST_PLAN_TYPE_ID,
6851 P_COST_VERSION_ID => P_COST_VERSION_ID,
6852 P_RETAIN_MANUAL_FLAG => P_RETAIN_MANUAL_FLAG,
6853 P_CALLED_MODE => P_CALLED_MODE,
6854 P_INC_CHG_DOC_FLAG => P_INC_CHG_DOC_FLAG,
6855 P_INC_BILL_EVENT_FLAG => P_INC_BILL_EVENT_FLAG,
6856 P_INC_OPEN_COMMIT_FLAG => P_INC_OPEN_COMMIT_FLAG,
6857 P_CI_ID_TAB => P_CI_ID_TAB,
6858 PX_GEN_RES_ASG_ID_TAB => PX_GEN_RES_ASG_ID_TAB,
6859 PX_DELETED_RES_ASG_ID_TAB => PX_DELETED_RES_ASG_ID_TAB,
6860 P_INIT_MSG_FLAG => P_INIT_MSG_FLAG,
6861 P_COMMIT_FLAG => P_COMMIT_FLAG,
6862 X_RETURN_STATUS => X_RETURN_STATUS,
6863 X_MSG_COUNT => X_MSG_COUNT,
6864 X_MSG_DATA => X_MSG_DATA);
6865 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
6866 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
6867 END IF;
6868 IF p_pa_debug_mode = 'Y' THEN
6869 pa_fp_gen_amount_utils.fp_debug
6870 (p_called_mode => p_called_mode,
6871 p_msg => 'Status after calling pa_fp_wp_gen_budget_amt_pub.generate_wp_budget_amt:'
6872 ||x_return_status,
6873 p_module_name => l_module_name,
6874 p_log_level => 5);
6875 END IF;
6876
6877 SELECT
6878 tmp.RESOURCE_ASSIGNMENT_ID,
6879 tmp.total_plan_quantity,
6880 ra.task_id,
6881 ra.resource_list_member_id,
6882 tmp.txn_currency_code,
6883 ra.planning_start_date,
6884 ra.unit_of_measure,
6885 ra.rate_based_flag,
6886 ra.resource_class_code,
6887 ra.organization_id,
6888 ra.job_id,
6889 ra.person_id,
6890 ra.expenditure_type,
6891 ra.non_labor_resource,
6892 ra.bom_resource_id,
6893 ra.inventory_item_id,
6894 ra.item_category_id,
6895 ra.mfc_cost_type_id,
6896 ra.organization_id,
6897 null,
6898 ra.rate_expenditure_org_id,
6899 ra.rate_expenditure_type,
6900 ra.organization_id,
6901 ra.project_assignment_id,
6902
6903 proj.assign_precedes_task,
6904 proj.bill_job_group_id,
6905 proj.carrying_out_organization_id,
6906 proj.multi_currency_billing_flag,
6907 proj.org_id,
6908 proj.non_labor_bill_rate_org_id,
6909 proj.non_labor_schedule_discount,
6910 proj.non_labor_schedule_fixed_date,
6911 proj.project_type,
6912 proj.labor_bill_rate_org_id,
6913
6914 t.LABOR_SCHEDULE_FIXED_DATE,
6915 t.top_task_id,
6916 t.scheduled_start_date,
6917 t.labor_schedule_discount,
6918 t.labor_sch_type,
6919 t.non_labor_sch_type,
6920
6921 decode(fp.use_planning_rates_flag,'N',fp.res_class_bill_rate_sch_id,
6922 fp.rev_res_class_rate_sch_id),
6923 decode(fp.use_planning_rates_flag,'N',fp.res_class_raw_cost_sch_id,
6924 NULL),
6925
6926 res_format_id
6927 BULK COLLECT INTO
6928 l_res_asg_id_tab,
6929 l_ra_quantity_tab,
6930 l_task_id_tab,
6931 l_res_list_member_id_tab,
6932 l_txn_currency_code_tab,
6933 l_ra_start_date_tab,
6934 l_uom_tab,
6935 l_rate_based_flag_tab,
6936 l_resource_class_code_tab,
6937 l_organization_id_tab,
6938 l_job_id_tab,
6939 l_person_id_tab,
6940 l_expenditure_type_tab,
6941 l_non_labor_resource_tab,
6942 l_bom_resource_id_tab,
6943 l_inventory_item_id_tab,
6944 l_item_category_id_tab,
6945 l_mfc_cost_type_id_tab,
6946 l_rate_incur_by_organz_id_tab,
6947 l_rate_ovrd_to_organz_id_tab,
6948 l_rate_expenditure_org_id_tab,
6949 l_rate_expenditure_type_tab,
6950 l_rate_organization_id_tab,
6951 l_project_assignment_id_tab,
6952
6953 l_assign_precedes_task_tab,
6954 l_bill_job_group_id_tab,
6955 l_carry_out_organiz_id_tab,
6956 l_multi_currency_bill_flag_tab,
6957 l_org_id_tab,
6958 l_non_lab_bill_rate_org_id_tab,
6959 l_non_lab_sch_discount_tab,
6960 l_non_lab_sch_fixed_date_tab,
6961 l_project_type_tab,
6962
6963 l_lab_bill_rate_org_id_tab,
6964 l_lab_sch_FIXED_DATE_tab,
6965 l_top_task_id_tab,
6966 l_scheduled_start_date_tab,
6967 l_labor_scheduled_discount_tab,
6968 l_labor_sch_type_tab,
6969 l_non_labor_sch_type_tab,
6970
6971 l_rev_res_class_rt_sch_id_tab,
6972 l_cost_res_class_rt_sch_id_tab,
6973
6974 l_res_format_id_tab
6975 FROM pa_fp_calc_amt_tmp2 tmp, pa_resource_assignments ra,
6976 pa_projects_all proj, pa_tasks t,
6977 pa_proj_fp_options fp,
6978 pa_resource_list_members rlm
6979 WHERE tmp.resource_assignment_id = ra.resource_assignment_id
6980 AND ra.project_id = proj.project_id
6981 AND ra.task_id = t.task_id(+)
6982 AND fp.fin_plan_version_id = ra.budget_version_id
6983 AND ra.resource_list_member_id = rlm.resource_list_member_id;
6984
6985 FOR i IN 1..l_res_asg_id_tab.count LOOP
6986 IF p_pa_debug_mode = 'Y' THEN
6987 pa_fp_gen_amount_utils.fp_debug
6988 (p_msg => 'Before calling pa_plan_revenue.Get_planning_Rates',
6989 p_module_name => l_module_name,
6990 p_log_level => 5);
6991 END IF;
6992 PA_PLAN_REVENUE.GET_PLANNING_RATES(
6993 p_project_id => p_project_id,
6994 p_task_id => l_task_id_tab(i),
6995 p_top_task_id => l_top_task_id_tab(i),
6996 p_person_id => l_person_id_tab(i),
6997 p_job_id => l_job_id_tab(i),
6998 p_bill_job_grp_id => l_bill_job_group_id_tab(i),
6999 p_resource_class => l_resource_class_code_tab(i),
7000 p_planning_resource_format => l_res_format_id_tab(i),
7001 p_use_planning_rates_flag => 'N',
7002 p_rate_based_flag => l_rate_based_flag_tab(i),
7003 p_uom => l_uom_tab(i),
7004 p_system_linkage => NULL,
7005 p_project_organz_id => l_carry_out_organiz_id_tab(i),
7006 p_rev_res_class_rate_sch_id => l_rev_res_class_rt_sch_id_tab(i),
7007 p_cost_res_class_rate_sch_id => l_cost_res_class_rt_sch_id_tab(i),
7008 p_calculate_mode => 'REVENUE',
7009 p_mcb_flag => l_multi_currency_bill_flag_tab(i),
7010 p_quantity => l_ra_quantity_tab(i),
7011 p_item_date => l_ra_start_date_tab(i),
7012 p_cost_sch_type => 'COST',
7013 p_labor_sch_type => l_labor_sch_type_tab(i),
7014 p_non_labor_sch_type => l_non_labor_sch_type_tab(i),
7015 --p_labor_schdl_discnt => NULL,
7016 p_labor_bill_rate_org_id => l_lab_bill_rate_org_id_tab(i),
7017 --p_labor_std_bill_rate_schdl => NULL,
7018 p_labor_schdl_fixed_date => l_LAb_SCH_FIXED_DATE_tab(i),
7019 p_assignment_id => l_project_assignment_id_tab(i),
7020 p_project_org_id => l_org_id_tab(i),
7021 p_project_type => l_project_type_tab(i),
7022 p_expenditure_type => nvl(l_expenditure_type_tab(i),l_rate_expenditure_type_tab(i)),
7023 p_non_labor_resource => l_non_labor_resource_tab(i),
7024 p_incurred_by_organz_id => nvl(l_rate_incur_by_organz_id_tab(i),l_organization_id_tab(i)),
7025 p_override_to_organz_id => l_rate_ovrd_to_organz_id_tab(i),
7026 p_expenditure_org_id => nvl(l_rate_expenditure_org_id_tab(i),l_org_id_tab(i)),
7027 p_assignment_precedes_task => l_assign_precedes_task_tab(i),
7028 p_planning_transaction_id => l_res_asg_id_tab(i),
7029 --,p_task_bill_rate_org_id => l_task_bill_rate_org_id,
7030 p_project_bill_rate_org_id => l_non_lab_bill_rate_org_id_tab(i),
7031 p_nlr_organization_id => nvl(l_organization_id_tab(i),l_carry_out_organiz_id_tab(i)),
7032 p_project_sch_date => l_non_lab_sch_fixed_date_tab(i),
7033 p_task_sch_date => l_scheduled_start_date_tab(i),
7034 p_project_sch_discount => l_non_lab_sch_discount_tab(i),
7035 p_task_sch_discount => l_labor_scheduled_discount_tab(i),
7036 p_inventory_item_id => l_inventory_item_id_tab(i),
7037 p_BOM_resource_Id => l_bom_resource_id_tab(i),
7038 p_mfc_cost_type_id => l_mfc_cost_type_id_tab(i),
7039 p_item_category_id => l_item_category_id_tab(i),
7040 --,p_mfc_cost_source => l_mfc_cost_source,
7041 --,p_cost_override_rate => l_rw_cost_rate_override,
7042 --,p_revenue_override_rate => l_bill_rate_override,
7043 --,p_override_burden_cost_rate => l_burden_cost_rate_override,
7044 --,p_override_currency_code => l_txn_currency_code_override,
7045 p_txn_currency_code => l_txn_currency_code_tab(i),
7046 p_raw_cost => NULL,
7047 p_burden_cost => NULL,
7048 p_raw_revenue => NULL,
7049 x_bill_rate => l_bill_rate,
7050 x_cost_rate => l_cost_rate,
7051 x_burden_cost_rate => l_burden_cost_rate,
7052 x_burden_multiplier => l_burden_multiplier,
7053 x_raw_cost => l_raw_cost,
7054 x_burden_cost => l_burden_cost,
7055 x_raw_revenue => l_raw_revenue,
7056 x_bill_markup_percentage => l_bill_markup_percentage,
7057 x_cost_txn_curr_code => l_cost_txn_curr_code,
7058 x_rev_txn_curr_code => l_rev_txn_curr_code,
7059 x_raw_cost_rejection_code => l_raw_cost_rejection_code,
7060 x_burden_cost_rejection_code => l_burden_cost_rejection_code,
7061 x_revenue_rejection_code => l_revenue_rejection_code,
7062 x_cost_ind_compiled_set_id => l_cost_ind_compiled_set_id,
7063 x_return_status => x_return_status,
7064 x_msg_data => x_msg_data,
7065 x_msg_count => x_msg_count);
7066 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
7067 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
7068 END IF;
7069 IF p_pa_debug_mode = 'Y' THEN
7070 pa_fp_gen_amount_utils.fp_debug
7071 (p_msg => 'Status after calling pa_plan_revenue.Get_planning_Rates'
7072 ||x_return_status,
7073 p_module_name => l_module_name,
7074 p_log_level => 5);
7075 END IF;
7076
7077 l_total_revenue_tab.extend;
7078 l_total_revenue_tab(i) := l_burden_cost;
7079
7080 END LOOP;
7081
7082 FOR i IN 1..l_res_asg_id_tab.count LOOP
7083 l_delete_budget_lines_tab.extend;
7084 l_spread_amts_flag_tab.extend;
7085 --l_txn_currency_code_tab.extend;
7086 l_txn_currency_override_tab.extend;
7087 --l_total_qty_tab.extend;
7088 l_addl_qty_tab.extend;
7089 l_total_raw_cost_tab.extend;
7090 l_addl_raw_cost_tab.extend;
7091 l_total_burdened_cost_tab.extend;
7092 l_addl_burdened_cost_tab.extend;
7093 l_addl_revenue_tab.extend;
7094 l_raw_cost_rate_tab.extend;
7095 l_rw_cost_rate_override_tab.extend;
7096 l_b_cost_rate_tab.extend;
7097 l_b_cost_rate_override_tab.extend;
7098 l_bill_rate_tab.extend;
7099 l_bill_rate_override_tab.extend;
7100 l_line_start_date_tab.extend;
7101 l_line_end_date_tab.extend;
7102
7103 l_delete_budget_lines_tab(i) := Null;
7104 l_spread_amts_flag_tab(i) := Null;
7105 --l_txn_currency_code_tab(i) := l_txn_currency_code_tab(i)
7106 l_txn_currency_override_tab(i) := Null;
7107 --l_total_qty_tab(i) := Null;
7108 l_addl_qty_tab(i) := Null;
7109 l_total_raw_cost_tab(i) := Null;
7110 l_addl_raw_cost_tab(i) := Null;
7111 l_total_burdened_cost_tab(i) := Null;
7112 l_addl_burdened_cost_tab(i) := Null;
7113 l_addl_revenue_tab(i) := Null;
7114 l_raw_cost_rate_tab(i) := Null;
7115 l_rw_cost_rate_override_tab(i) := Null;
7116 l_b_cost_rate_tab(i) := Null;
7117 l_b_cost_rate_override_tab(i) := Null;
7118 l_bill_rate_tab(i) := Null;
7119 l_bill_rate_override_tab(i) := Null;
7120 l_line_start_date_tab(i) := Null;
7121 l_line_end_date_tab(i) := Null;
7122 END LOOP;
7123
7124 -- Bug 4149684: Added p_calling_module and p_rollup_required_flag to parameter list of
7125 -- Calculate API with values 'BUDGET_GENERATION' and 'N', respectively, so that calling
7126 -- PJI rollup api is bypassed for increased performance.
7127
7128 /* Calling the calculate API */
7129 IF p_pa_debug_mode = 'Y' THEN
7130 pa_fp_gen_amount_utils.fp_debug
7131 (p_called_mode => p_called_mode,
7132 p_msg => 'Before calling pa_fp_calc_plan_pkg.calculate',
7133 p_module_name => l_module_name,
7134 p_log_level => 5);
7135 END IF;
7136 PA_FP_CALC_PLAN_PKG.calculate
7137 (p_calling_module => l_calling_module
7138 ,p_project_id => p_project_id
7139 ,p_budget_version_id => p_budget_version_id
7140 ,p_refresh_rates_flag => l_refresh_rates_flag
7141 ,p_refresh_conv_rates_flag => l_refresh_conv_rates_flag
7142 ,p_spread_required_flag => l_spread_required_flag
7143 ,p_conv_rates_required_flag => l_conv_rates_required_flag
7144 ,p_rollup_required_flag => l_rollup_required_flag
7145 ,p_mass_adjust_flag => l_mass_adjust_flag
7146 ,p_quantity_adj_pct => l_quantity_adj_pct
7147 ,p_cost_rate_adj_pct => l_cost_rate_adj_pct
7148 ,p_burdened_rate_adj_pct => l_burdened_rate_adj_pct
7149 ,p_bill_rate_adj_pct => l_bill_rate_adj_pct
7150 ,p_source_context => l_source_context
7151 ,p_resource_assignment_tab => l_res_asg_id_tab
7152 ,p_delete_budget_lines_tab => l_delete_budget_lines_tab
7153 ,p_spread_amts_flag_tab => l_spread_amts_flag_tab
7154 ,p_txn_currency_code_tab => l_txn_currency_code_tab
7155 ,p_txn_currency_override_tab => l_txn_currency_override_tab
7156 ,p_total_qty_tab => l_ra_quantity_tab --l_total_qty_tab
7157 ,p_addl_qty_tab => l_addl_qty_tab
7158 ,p_total_raw_cost_tab => l_total_raw_cost_tab
7159 ,p_addl_raw_cost_tab => l_addl_raw_cost_tab
7160 ,p_total_burdened_cost_tab => l_total_burdened_cost_tab
7161 ,p_addl_burdened_cost_tab => l_addl_burdened_cost_tab
7162 ,p_total_revenue_tab => l_total_revenue_tab
7163 ,p_addl_revenue_tab => l_addl_revenue_tab
7164 ,p_raw_cost_rate_tab => l_raw_cost_rate_tab
7165 ,p_rw_cost_rate_override_tab => l_rw_cost_rate_override_tab
7166 ,p_b_cost_rate_tab => l_b_cost_rate_tab
7167 ,p_b_cost_rate_override_tab => l_b_cost_rate_override_tab
7168 ,p_bill_rate_tab => l_bill_rate_tab
7169 ,p_bill_rate_override_tab => l_bill_rate_override_tab
7170 ,p_line_start_date_tab => l_line_start_date_tab
7171 ,p_line_end_date_tab => l_line_end_date_tab
7172 ,X_RETURN_STATUS => X_RETURN_STATUS
7173 ,X_MSG_COUNT => X_MSG_COUNT
7174 ,X_MSG_DATA => X_MSG_DATA);
7175 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
7176 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
7177 END IF;
7178 IF p_pa_debug_mode = 'Y' THEN
7179 pa_fp_gen_amount_utils.fp_debug
7180 (p_called_mode => p_called_mode,
7181 p_msg => 'Status after calling
7182 pa_fp_calc_plan_pkg.calculate: '
7183 ||x_return_status,
7184 p_module_name => l_module_name,
7185 p_log_level => 5);
7186 END IF;
7187
7188 IF P_COMMIT_FLAG = 'Y' THEN
7189 COMMIT;
7190 END IF;
7191
7192 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
7193 PA_DEBUG.reset_err_stack;
7194 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
7195 PA_DEBUG.Reset_Curr_Function;
7196 END IF;
7197
7198 EXCEPTION
7199 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
7200 -- Bug Fix: 4569365. Removed MRC code.
7201 -- PA_MRC_FINPLAN.G_CALLING_MODULE := Null;
7202 l_msg_count := FND_MSG_PUB.count_msg;
7203 IF l_msg_count = 1 THEN
7204 PA_INTERFACE_UTILS_PUB.get_messages
7205 (p_encoded => FND_API.G_TRUE
7206 ,p_msg_index => 1
7207 ,p_msg_count => l_msg_count
7208 ,p_msg_data => l_msg_data
7209 ,p_data => l_data
7210 ,p_msg_index_out => l_msg_index_out);
7211 x_msg_data := l_data;
7212 x_msg_count := l_msg_count;
7213 ELSE
7214 x_msg_count := l_msg_count;
7215 END IF;
7216 ROLLBACK;
7217 x_return_status := FND_API.G_RET_STS_ERROR;
7218
7219 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
7220 PA_DEBUG.reset_err_stack;
7221 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
7222 PA_DEBUG.Reset_Curr_Function;
7223 END IF;
7224 WHEN OTHERS THEN
7225 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7226 x_msg_data := SUBSTR(SQLERRM,1,240);
7227 FND_MSG_PUB.add_exc_msg
7228 ( p_pkg_name => 'PA_FP_GEN_BUDGET_AMT_PUB'
7229 ,p_procedure_name => 'GEN_WP_REV_BDGT_AMT_WRP');
7230
7231 IF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'Y' THEN
7232 PA_DEBUG.reset_err_stack;
7233 ELSIF p_pa_debug_mode = 'Y' AND p_init_msg_flag = 'N' THEN
7234 PA_DEBUG.Reset_Curr_Function;
7235 END IF;
7236
7237 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7238
7239 END GEN_WP_REV_BDGT_AMT_WRP;
7240
7241 END PA_FP_GEN_BUDGET_AMT_PUB;